[
  {
    "path": ".gitattributes",
    "content": "*\\[generated\\].go linguist-language=txt\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: antonmedv\n"
  },
  {
    "path": ".github/images/demo.tape",
    "content": "Set Shell zsh\nSleep 500ms\nType \"repl\"\nEnter\nSleep 500ms\nType \"1..9 | filter(\"\nSleep 500ms\nType \"# \"\nSleep 500ms\nType \"% 2 == 0) | map(\"\nSleep 500ms\nType \"# ^ 2\"\nSleep 500ms\nType \")\"\nEnter\nSleep 1s\nType \"de\"\nSleep 500ms\nType \"bug\"\nEnter\nSleep 1.5s\nEnter 50\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEnter\nSleep 1.5s\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nEnter\nSleep 2s\nEscape\nType \"OB\"\nEscape\nType \"OB\"\nCtrl+C\nSleep 1s\nCtrl+D\nCtrl+D\n\n"
  },
  {
    "path": ".github/scripts/coverage.mjs",
    "content": "#!/usr/bin/env zx\n\nconst expected = 90\nconst exclude = [\n  'expr/test', // We do not need to test the test package.\n  'checker/mock', // Mocks only used for testing.\n  'vm/func_types', // Generated files.\n  'vm/runtime/helpers', // Generated files.\n  'internal/difflib', // Test dependency. This is vendored dependency, and ideally we also have good tests for it.\n  'internal/spew', // Test dependency.\n  'internal/testify', // Test dependency.\n  'patcher/value', // Contains a lot of repeating code. Ideally we should have a test for it.\n  'pro', // Expr Pro is not a part of the main codebase.\n]\n\ncd(path.resolve(__dirname, '..', '..'))\n\nawait spinner('Running tests', async () => {\n  await $`go test -coverprofile=coverage.out -coverpkg=github.com/expr-lang/expr/... ./...`\n  const coverage = fs.readFileSync('coverage.out').toString()\n    .split('\\n')\n    .filter(line => {\n      for (const ex of exclude)\n        if (line.includes(ex)) return false\n      return true\n    })\n    .join('\\n')\n  fs.writeFileSync('coverage.out', coverage)\n  await $`go tool cover -html=coverage.out -o coverage.html`\n})\n\nconst cover = await $({verbose: true})`go tool cover -func=coverage.out`\nconst total = +cover.stdout.match(/total:\\s+\\(statements\\)\\s+(\\d+\\.\\d+)%/)[1]\nif (total < expected) {\n  echo(chalk.red(`Coverage is too low: ${total}% < ${expected}% (expected)`))\n  process.exit(1)\n} else {\n  echo(`Coverage is good: ${chalk.green(total + '%')} >= ${expected}% (expected)`)\n}\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: build\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        go-versions: [ '1.18', '1.22', '1.24', '1.25', '1.26' ]\n        go-arch: [ '386' ]\n    steps:\n      - uses: actions/checkout@v3\n      - name: Setup Go ${{ matrix.go-version }}\n        uses: actions/setup-go@v4\n        with:\n          go-version: ${{ matrix.go-version }}\n      - name: Build\n        run: GOARCH=${{ matrix.go-arch }} go build\n"
  },
  {
    "path": ".github/workflows/check.yml",
    "content": "name: check\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\njobs:\n  coverage:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - name: Setup Go 1.18\n        uses: actions/setup-go@v4\n        with:\n          go-version: 1.18\n      - name: Test\n        run: npx zx .github/scripts/coverage.mjs\n"
  },
  {
    "path": ".github/workflows/diff.yml",
    "content": "name: diff\n\non:\n  pull_request:\n    branches: [ master ]\n\njobs:\n  bench:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Setup Go 1.18\n        uses: actions/setup-go@v4\n        with:\n          go-version: 1.18\n      - name: Install benchstat\n        # NOTE: benchstat@latest requires go 1.23 since 2025-02-14 - this is the last go 1.18 ref\n        # https://cs.opensource.google/go/x/perf/+/c95ad7d5b636f67d322a7e4832e83103d0fdd292\n        run: go install golang.org/x/perf/cmd/benchstat@884df5810d2850d775c2cb4885a7ea339128a17d\n\n      - uses: actions/checkout@v3\n      - name: Benchmark new code\n        run: go test -bench=. -benchmem -run=^$ -count=10 -timeout=30m | tee /tmp/new.txt\n\n      - name: Checkout master\n        uses: actions/checkout@v3\n        with:\n          ref: master\n      - name: Benchmark master\n        run: go test -bench=. -benchmem -run=^$ -count=10 -timeout=30m | tee /tmp/old.txt\n\n      - name: Diff\n        run: benchstat /tmp/old.txt /tmp/new.txt\n"
  },
  {
    "path": ".github/workflows/fuzz.yml",
    "content": "name: fuzz\non: [pull_request]\npermissions: {}\njobs:\n  fuzzing:\n    runs-on: ubuntu-latest\n    permissions:\n      security-events: write\n    steps:\n      - name: Build Fuzzers\n        id: build\n        uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master\n        with:\n          oss-fuzz-project-name: 'expr'\n          language: 'go'\n      - name: Run Fuzzers\n        uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master\n        with:\n          oss-fuzz-project-name: 'expr'\n          language: 'go'\n          fuzz-seconds: 600\n          output-sarif: true\n      - name: Upload Crash\n        uses: actions/upload-artifact@v4\n        if: failure() && steps.build.outcome == 'success'\n        with:\n          name: artifacts\n          path: ./out/artifacts\n      - name: Upload Sarif\n        if: always() && steps.build.outcome == 'success'\n        uses: github/codeql-action/upload-sarif@v3\n        with:\n          # Path to SARIF file relative to the root of the repository\n          sarif_file: cifuzz-sarif/results.sarif\n          checkout_path: cifuzz-sarif\n"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: test\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        go-versions: [ '1.18', '1.19', '1.20', '1.21', '1.22', '1.23', '1.24', '1.25', '1.26' ]\n    steps:\n      - uses: actions/checkout@v3\n      - name: Setup Go ${{ matrix.go-version }}\n        uses: actions/setup-go@v4\n        with:\n          go-version: ${{ matrix.go-version }}\n      - name: Test\n        run: go test ./...\n\n  debug:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - name: Setup Go 1.18\n        uses: actions/setup-go@v4\n        with:\n          go-version: 1.18\n      - name: Test\n        run: go test -tags=expr_debug -run=TestDebugger -v ./vm\n\n  race:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - name: Setup Go 1.21\n        uses: actions/setup-go@v4\n        with:\n          go-version: 1.21\n      - name: Test\n        run: go test -race .\n"
  },
  {
    "path": ".gitignore",
    "content": "*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n*.test\n*.out\n*.html\ncustom_tests.json\npro/\ntest/avs/\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Anton Medvedev\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<h1><a href=\"https://expr-lang.org\"><img src=\"https://expr-lang.org/img/logo.png\" alt=\"Zx logo\" height=\"48\"align=\"right\"></a> Expr</h1>\n\n[![test](https://github.com/expr-lang/expr/actions/workflows/test.yml/badge.svg)](https://github.com/expr-lang/expr/actions/workflows/test.yml) \n[![Go Report Card](https://goreportcard.com/badge/github.com/expr-lang/expr)](https://goreportcard.com/report/github.com/expr-lang/expr) \n[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/expr.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:expr)\n[![GoDoc](https://godoc.org/github.com/expr-lang/expr?status.svg)](https://godoc.org/github.com/expr-lang/expr)\n\n**Expr** is a Go-centric expression language designed to deliver dynamic configurations with unparalleled accuracy, safety, and speed. \n**Expr** combines simple [syntax](https://expr-lang.org/docs/language-definition) with powerful features for ease of use:\n\n```js\n// Allow only admins and moderators to moderate comments.\nuser.Group in [\"admin\", \"moderator\"] || user.Id == comment.UserId\n```\n\n```js\n// Determine whether the request is in the permitted time window.\nrequest.Time - resource.Age < duration(\"24h\")\n```\n\n```js\n// Ensure all tweets are less than 240 characters.\nall(tweets, len(.Content) <= 240)\n```\n\n## Features\n\n**Expr** is a safe, fast, and intuitive expression evaluator optimized for the Go language. \nHere are its standout features:\n\n### Safety and Isolation\n* **Memory-Safe**: Expr is designed with a focus on safety, ensuring that programs do not access unrelated memory or introduce memory vulnerabilities.\n* **Side-Effect-Free**: Expressions evaluated in Expr only compute outputs from their inputs, ensuring no side-effects that can change state or produce unintended results.\n* **Always Terminating**: Expr is designed to prevent infinite loops, ensuring that every program will conclude in a reasonable amount of time.\n\n### Go Integration\n* **Seamless with Go**: Integrate Expr into your Go projects without the need to redefine types.\n\n### Static Typing\n* Ensures type correctness and prevents runtime type errors.\n  ```go\n  out, err := expr.Compile(`name + age`)\n  // err: invalid operation + (mismatched types string and int)\n  // | name + age\n  // | .....^\n  ```\n\n### User-Friendly\n* Provides user-friendly error messages to assist with debugging and development.\n\n### Flexibility and Utility\n* **Rich Operators**: Offers a reasonable set of basic operators for a variety of applications.\n* **Built-in Functions**: Functions like `all`, `none`, `any`, `one`, `filter`, and `map` are provided out-of-the-box.\n\n### Performance\n* **Optimized for Speed**: Expr stands out in its performance, utilizing an optimizing compiler and a bytecode virtual machine. Check out these [benchmarks](https://github.com/antonmedv/golang-expression-evaluation-comparison#readme) for more details.\n\n## Install\n\n```\ngo get github.com/expr-lang/expr\n```\n\n## Documentation\n\n* See [Getting Started](https://expr-lang.org/docs/Getting-Started) page for developer documentation.\n* See [Language Definition](https://expr-lang.org/docs/language-definition) page to learn the syntax.\n\n## Examples\n\n[Play Online](https://go.dev/play/p/XCoNXEjm3TS)\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/expr-lang/expr\"\n)\n\nfunc main() {\n\tenv := map[string]interface{}{\n\t\t\"greet\":   \"Hello, %v!\",\n\t\t\"names\":   []string{\"world\", \"you\"},\n\t\t\"sprintf\": fmt.Sprintf,\n\t}\n\n\tcode := `sprintf(greet, names[0])`\n\n\tprogram, err := expr.Compile(code, expr.Env(env))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(output)\n}\n```\n\n[Play Online](https://go.dev/play/p/tz-ZneBfSuw)\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/expr-lang/expr\"\n)\n\ntype Tweet struct {\n\tLen int\n}\n\ntype Env struct {\n\tTweets []Tweet\n}\n\nfunc main() {\n\tcode := `all(Tweets, {.Len <= 240})`\n\n\tprogram, err := expr.Compile(code, expr.Env(Env{}))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tenv := Env{\n\t\tTweets: []Tweet{{42}, {98}, {69}},\n\t}\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(output)\n}\n```\n\n## Who uses Expr?\n\n* [Google](https://google.com) uses Expr as one of its expression languages on the [Google Cloud Platform](https://cloud.google.com).\n* [Uber](https://uber.com) uses Expr to allow customization of its Uber Eats marketplace.\n* [GoDaddy](https://godaddy.com) employs Expr for the customization of its GoDaddy Pro product.\n* [ByteDance](https://bytedance.com) incorporates Expr into its internal business rule engine.\n* [Aviasales](https://aviasales.ru) utilizes Expr as a business rule engine for its flight search engine.\n* [Alibaba](https://alibaba.com) uses Expr in a web framework for building recommendation services.\n* [Argo](https://argoproj.github.io) integrates Expr into Argo Rollouts and Argo Workflows for Kubernetes.\n* [Wish.com](https://www.wish.com) employs Expr in its decision-making rule engine for the Wish Assistant.\n* [OpenTelemetry](https://opentelemetry.io) integrates Expr into the OpenTelemetry Collector.\n* [Philips Labs](https://github.com/philips-labs/tabia) employs Expr in Tabia, a tool designed to collect insights on their code bases.\n* [CrowdSec](https://crowdsec.net) incorporates Expr into its security automation tool.\n* [CoreDNS](https://coredns.io) uses Expr in CoreDNS, which is a DNS server.\n* [qiniu](https://www.qiniu.com) implements Expr in its trade systems.\n* [Junglee Games](https://www.jungleegames.com/) uses Expr for its in-house marketing retention tool, Project Audience.\n* [Faceit](https://www.faceit.com) uses Expr to enhance customization of its eSports matchmaking algorithm.\n* [Chaos Mesh](https://chaos-mesh.org) incorporates Expr into Chaos Mesh, a cloud-native Chaos Engineering platform.\n* [Visually.io](https://visually.io) employs Expr as a business rule engine for its personalization targeting algorithm.\n* [Akvorado](https://github.com/akvorado/akvorado) utilizes Expr to classify exporters and interfaces in network flows.\n* [keda.sh](https://keda.sh) uses Expr to allow customization of its Kubernetes-based event-driven autoscaling.\n* [Span Digital](https://spandigital.com/) uses Expr in its Knowledge Management products.\n* [Xiaohongshu](https://www.xiaohongshu.com/) combining yaml with Expr for dynamically policies delivery.\n* [Melrōse](https://melrōse.org) uses Expr to implement its music programming language.\n* [Tork](https://www.tork.run/) integrates Expr into its workflow execution.\n* [Critical Moments](https://criticalmoments.io) uses Expr for its mobile realtime conditional targeting system.\n* [WoodpeckerCI](https://woodpecker-ci.org) uses Expr for [filtering workflows/steps](https://woodpecker-ci.org/docs/usage/workflow-syntax#evaluate).\n* [FastSchema](https://github.com/fastschema/fastschema) - A BaaS leveraging Expr for its customizable and dynamic Access Control system.\n* [WunderGraph Cosmo](https://github.com/wundergraph/cosmo) - GraphQL Federeration Router uses Expr to customize Middleware behaviour\n* [SOLO](https://solo.one) uses Expr interally to allow dynamic code execution with custom defined functions.\n* [Naoma.AI](https://www.naoma.ai) uses Expr as a part of its call scoring engine.\n* [GlassFlow.dev](https://github.com/glassflow/clickhouse-etl) uses Expr to do realtime data transformation in ETL pipelines\n* [Kargo](https://kargo.io/) uses Expr to evaluate and manipulate variables dynamically during [promotion steps](https://docs.kargo.io/user-guide/reference-docs/expressions/)\n\n[Add your company too](https://github.com/expr-lang/expr/edit/master/README.md)\n\n## License\n\n[MIT](https://github.com/expr-lang/expr/blob/master/LICENSE)\n\n<p align=\"center\"><img src=\"https://expr-lang.org/img/gopher-small.png\" width=\"150\" /></p>\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\nExpr is generally backwards compatible with very few exceptions, so we\nrecommend users to always use the latest version to experience stability,\nperformance and security.\n\nWe generally backport security issues to a single previous minor version,\nunless this is not possible or feasible with a reasonable effort.\n\n| Version | Supported          |\n|---------|--------------------|\n| 1.x     | :white_check_mark: |\n| 0.x     | :x:                |\n\n## Reporting a Vulnerability\n\nIf you believe you've discovered a serious vulnerability, please contact the\nExpr core team at anton+security@medv.io. We will evaluate your report and if\nnecessary issue a fix and an advisory. If the issue was previously undisclosed,\nwe'll also mention your name in the credits.\n"
  },
  {
    "path": "ast/dump.go",
    "content": "package ast\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"regexp\"\n)\n\nfunc Dump(node Node) string {\n\treturn dump(reflect.ValueOf(node), \"\")\n}\n\nfunc dump(v reflect.Value, ident string) string {\n\tif !v.IsValid() {\n\t\treturn \"nil\"\n\t}\n\tt := v.Type()\n\tswitch t.Kind() {\n\tcase reflect.Struct:\n\t\tout := t.Name() + \"{\\n\"\n\t\tfor i := 0; i < t.NumField(); i++ {\n\t\t\tf := t.Field(i)\n\t\t\tif isPrivate(f.Name) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ts := v.Field(i)\n\t\t\tout += fmt.Sprintf(\"%v%v: %v,\\n\", ident+\"\\t\", f.Name, dump(s, ident+\"\\t\"))\n\t\t}\n\t\treturn out + ident + \"}\"\n\tcase reflect.Slice:\n\t\tif v.Len() == 0 {\n\t\t\treturn t.String() + \"{}\"\n\t\t}\n\t\tout := t.String() + \"{\\n\"\n\t\tfor i := 0; i < v.Len(); i++ {\n\t\t\ts := v.Index(i)\n\t\t\tout += fmt.Sprintf(\"%v%v,\", ident+\"\\t\", dump(s, ident+\"\\t\"))\n\t\t\tif i+1 < v.Len() {\n\t\t\t\tout += \"\\n\"\n\t\t\t}\n\t\t}\n\t\treturn out + \"\\n\" + ident + \"}\"\n\tcase reflect.Ptr:\n\t\treturn dump(v.Elem(), ident)\n\tcase reflect.Interface:\n\t\treturn dump(reflect.ValueOf(v.Interface()), ident)\n\n\tcase reflect.String:\n\t\treturn fmt.Sprintf(\"%q\", v)\n\tdefault:\n\t\treturn fmt.Sprintf(\"%v\", v)\n\t}\n}\n\nvar isCapital = regexp.MustCompile(\"^[A-Z]\")\n\nfunc isPrivate(s string) bool {\n\treturn !isCapital.Match([]byte(s))\n}\n"
  },
  {
    "path": "ast/find.go",
    "content": "package ast\n\nfunc Find(node Node, fn func(node Node) bool) Node {\n\tv := &finder{fn: fn}\n\tWalk(&node, v)\n\treturn v.node\n}\n\ntype finder struct {\n\tnode Node\n\tfn   func(node Node) bool\n}\n\nfunc (f *finder) Visit(node *Node) {\n\tif f.fn(*node) {\n\t\tf.node = *node\n\t}\n}\n"
  },
  {
    "path": "ast/find_test.go",
    "content": "package ast_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr/ast\"\n)\n\nfunc TestFind(t *testing.T) {\n\tleft := &ast.IdentifierNode{\n\t\tValue: \"a\",\n\t}\n\tvar root ast.Node = &ast.BinaryNode{\n\t\tOperator: \"+\",\n\t\tLeft:     left,\n\t\tRight: &ast.IdentifierNode{\n\t\t\tValue: \"b\",\n\t\t},\n\t}\n\n\tx := ast.Find(root, func(node ast.Node) bool {\n\t\tif n, ok := node.(*ast.IdentifierNode); ok {\n\t\t\treturn n.Value == \"a\"\n\t\t}\n\t\treturn false\n\t})\n\n\trequire.Equal(t, left, x)\n}\n"
  },
  {
    "path": "ast/node.go",
    "content": "package ast\n\nimport (\n\t\"reflect\"\n\n\t\"github.com/expr-lang/expr/checker/nature\"\n\t\"github.com/expr-lang/expr/file\"\n)\n\nvar (\n\tanyType = reflect.TypeOf(new(any)).Elem()\n)\n\n// Node represents items of abstract syntax tree.\ntype Node interface {\n\tLocation() file.Location\n\tSetLocation(file.Location)\n\tNature() *nature.Nature\n\tSetNature(nature.Nature)\n\tType() reflect.Type\n\tSetType(reflect.Type)\n\tString() string\n}\n\n// Patch replaces the node with a new one.\n// Location information is preserved.\n// Type information is lost.\nfunc Patch(node *Node, newNode Node) {\n\tnewNode.SetLocation((*node).Location())\n\t*node = newNode\n}\n\n// base is a base struct for all nodes.\ntype base struct {\n\tloc    file.Location\n\tnature nature.Nature\n}\n\n// Location returns the location of the node in the source code.\nfunc (n *base) Location() file.Location {\n\treturn n.loc\n}\n\n// SetLocation sets the location of the node in the source code.\nfunc (n *base) SetLocation(loc file.Location) {\n\tn.loc = loc\n}\n\n// Nature returns the nature of the node.\nfunc (n *base) Nature() *nature.Nature {\n\treturn &n.nature\n}\n\n// SetNature sets the nature of the node.\nfunc (n *base) SetNature(nature nature.Nature) {\n\tn.nature = nature\n}\n\n// Type returns the type of the node.\nfunc (n *base) Type() reflect.Type {\n\tif n.nature.Type == nil {\n\t\treturn anyType\n\t}\n\treturn n.nature.Type\n}\n\n// SetType sets the type of the node.\nfunc (n *base) SetType(t reflect.Type) {\n\tn.nature = nature.FromType(t)\n}\n\n// NilNode represents nil.\ntype NilNode struct {\n\tbase\n}\n\n// IdentifierNode represents an identifier.\ntype IdentifierNode struct {\n\tbase\n\tValue string // Name of the identifier. Like \"foo\" in \"foo.bar\".\n}\n\n// IntegerNode represents an integer.\ntype IntegerNode struct {\n\tbase\n\tValue int // Value of the integer.\n}\n\n// FloatNode represents a float.\ntype FloatNode struct {\n\tbase\n\tValue float64 // Value of the float.\n}\n\n// BoolNode represents a boolean.\ntype BoolNode struct {\n\tbase\n\tValue bool // Value of the boolean.\n}\n\n// StringNode represents a string.\ntype StringNode struct {\n\tbase\n\tValue string // Value of the string.\n}\n\n// BytesNode represents a byte slice.\ntype BytesNode struct {\n\tbase\n\tValue []byte // Value of the byte slice.\n}\n\n// ConstantNode represents a constant.\n// Constants are predefined values like nil, true, false, array, map, etc.\n// The parser.Parse will never generate ConstantNode, it is only generated\n// by the optimizer.\ntype ConstantNode struct {\n\tbase\n\tValue any // Value of the constant.\n}\n\n// UnaryNode represents a unary operator.\ntype UnaryNode struct {\n\tbase\n\tOperator string // Operator of the unary operator. Like \"!\" in \"!foo\" or \"not\" in \"not foo\".\n\tNode     Node   // Node of the unary operator. Like \"foo\" in \"!foo\".\n}\n\n// BinaryNode represents a binary operator.\ntype BinaryNode struct {\n\tbase\n\tOperator string // Operator of the binary operator. Like \"+\" in \"foo + bar\" or \"matches\" in \"foo matches bar\".\n\tLeft     Node   // Left node of the binary operator.\n\tRight    Node   // Right node of the binary operator.\n}\n\n// ChainNode represents an optional chaining group.\n// A few MemberNode nodes can be chained together,\n// and will be wrapped in a ChainNode. Example:\n//\n//\tfoo.bar?.baz?.qux\n//\n// The whole chain will be wrapped in a ChainNode.\ntype ChainNode struct {\n\tbase\n\tNode Node // Node of the chain.\n}\n\n// MemberNode represents a member access.\n// It can be a field access, a method call,\n// or an array element access.\n// Example:\n//\n//\tfoo.bar or foo[\"bar\"]\n//\tfoo.bar()\n//\tarray[0]\ntype MemberNode struct {\n\tbase\n\tNode     Node // Node of the member access. Like \"foo\" in \"foo.bar\".\n\tProperty Node // Property of the member access. For property access it is a StringNode.\n\tOptional bool // If true then the member access is optional. Like \"foo?.bar\".\n\tMethod   bool\n}\n\n// SliceNode represents access to a slice of an array.\n// Example:\n//\n//\tarray[1:4]\ntype SliceNode struct {\n\tbase\n\tNode Node // Node of the slice. Like \"array\" in \"array[1:4]\".\n\tFrom Node // From an index of the array. Like \"1\" in \"array[1:4]\".\n\tTo   Node // To an index of the array. Like \"4\" in \"array[1:4]\".\n}\n\n// CallNode represents a function or a method call.\ntype CallNode struct {\n\tbase\n\tCallee    Node   // Node of the call. Like \"foo\" in \"foo()\".\n\tArguments []Node // Arguments of the call.\n}\n\n// BuiltinNode represents a builtin function call.\ntype BuiltinNode struct {\n\tbase\n\tName      string // Name of the builtin function. Like \"len\" in \"len(foo)\".\n\tArguments []Node // Arguments of the builtin function.\n\tThrows    bool   // If true then accessing a field or array index can throw an error. Used by optimizer.\n\tMap       Node   // Used by optimizer to fold filter() and map() builtins.\n\tThreshold *int   // Used by optimizer for count() early termination.\n}\n\n// PredicateNode represents a predicate.\n// Example:\n//\n//\tfilter(foo, .bar == 1)\n//\n// The predicate is \".bar == 1\".\ntype PredicateNode struct {\n\tbase\n\tNode Node // Node of the predicate body.\n}\n\n// PointerNode represents a pointer to a current value in predicate.\ntype PointerNode struct {\n\tbase\n\tName string // Name of the pointer. Like \"index\" in \"#index\".\n}\n\n// ConditionalNode represents a ternary operator or if/else operator.\ntype ConditionalNode struct {\n\tbase\n\tTernary bool // Is it ternary or if/else operator?\n\tCond    Node // Condition\n\tExp1    Node // Expression 1\n\tExp2    Node // Expression 2\n}\n\n// VariableDeclaratorNode represents a variable declaration.\ntype VariableDeclaratorNode struct {\n\tbase\n\tName  string // Name of the variable. Like \"foo\" in \"let foo = 1; foo + 1\".\n\tValue Node   // Value of the variable. Like \"1\" in \"let foo = 1; foo + 1\".\n\tExpr  Node   // Expression of the variable. Like \"foo + 1\" in \"let foo = 1; foo + 1\".\n}\n\n// SequenceNode represents a sequence of nodes separated by semicolons.\n// All nodes are executed, only the last node will be returned.\ntype SequenceNode struct {\n\tbase\n\tNodes []Node\n}\n\n// ArrayNode represents an array.\ntype ArrayNode struct {\n\tbase\n\tNodes []Node // Nodes of the array.\n}\n\n// MapNode represents a map.\ntype MapNode struct {\n\tbase\n\tPairs []Node // PairNode nodes.\n}\n\n// PairNode represents a key-value pair of a map.\ntype PairNode struct {\n\tbase\n\tKey   Node // Key of the pair.\n\tValue Node // Value of the pair.\n}\n"
  },
  {
    "path": "ast/print.go",
    "content": "package ast\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/expr-lang/expr/parser/operator\"\n\t\"github.com/expr-lang/expr/parser/utils\"\n)\n\nfunc (n *NilNode) String() string {\n\treturn \"nil\"\n}\n\nfunc (n *IdentifierNode) String() string {\n\treturn n.Value\n}\n\nfunc (n *IntegerNode) String() string {\n\treturn fmt.Sprintf(\"%d\", n.Value)\n}\n\nfunc (n *FloatNode) String() string {\n\treturn fmt.Sprintf(\"%v\", n.Value)\n}\n\nfunc (n *BoolNode) String() string {\n\treturn fmt.Sprintf(\"%t\", n.Value)\n}\n\nfunc (n *StringNode) String() string {\n\treturn fmt.Sprintf(\"%q\", n.Value)\n}\n\nfunc (n *BytesNode) String() string {\n\treturn fmt.Sprintf(\"b%q\", n.Value)\n}\n\nfunc (n *ConstantNode) String() string {\n\tif n.Value == nil {\n\t\treturn \"nil\"\n\t}\n\tb, err := json.Marshal(n.Value)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn string(b)\n}\n\nfunc (n *UnaryNode) String() string {\n\top := n.Operator\n\tif n.Operator == \"not\" {\n\t\top = fmt.Sprintf(\"%s \", n.Operator)\n\t}\n\twrap := false\n\tswitch b := n.Node.(type) {\n\tcase *BinaryNode:\n\t\tif operator.Binary[b.Operator].Precedence <\n\t\t\toperator.Unary[n.Operator].Precedence {\n\t\t\twrap = true\n\t\t}\n\tcase *ConditionalNode:\n\t\twrap = true\n\t}\n\tif wrap {\n\t\treturn fmt.Sprintf(\"%s(%s)\", op, n.Node.String())\n\t}\n\treturn fmt.Sprintf(\"%s%s\", op, n.Node.String())\n}\n\nfunc (n *BinaryNode) String() string {\n\tif n.Operator == \"..\" {\n\t\treturn fmt.Sprintf(\"%s..%s\", n.Left, n.Right)\n\t}\n\n\tvar lhs, rhs string\n\tvar lwrap, rwrap bool\n\n\tif l, ok := n.Left.(*UnaryNode); ok {\n\t\tif operator.Unary[l.Operator].Precedence <\n\t\t\toperator.Binary[n.Operator].Precedence {\n\t\t\tlwrap = true\n\t\t}\n\t}\n\tif lb, ok := n.Left.(*BinaryNode); ok {\n\t\tif operator.Less(lb.Operator, n.Operator) {\n\t\t\tlwrap = true\n\t\t}\n\t\tif operator.Binary[lb.Operator].Precedence ==\n\t\t\toperator.Binary[n.Operator].Precedence &&\n\t\t\toperator.Binary[n.Operator].Associativity == operator.Right {\n\t\t\tlwrap = true\n\t\t}\n\t\tif lb.Operator == \"??\" {\n\t\t\tlwrap = true\n\t\t}\n\t\tif operator.IsBoolean(lb.Operator) && n.Operator != lb.Operator {\n\t\t\tlwrap = true\n\t\t}\n\t}\n\tif rb, ok := n.Right.(*BinaryNode); ok {\n\t\tif operator.Less(rb.Operator, n.Operator) {\n\t\t\trwrap = true\n\t\t}\n\t\tif operator.Binary[rb.Operator].Precedence ==\n\t\t\toperator.Binary[n.Operator].Precedence &&\n\t\t\toperator.Binary[n.Operator].Associativity == operator.Left {\n\t\t\trwrap = true\n\t\t}\n\t\tif operator.IsBoolean(rb.Operator) && n.Operator != rb.Operator {\n\t\t\trwrap = true\n\t\t}\n\t}\n\n\tif _, ok := n.Left.(*ConditionalNode); ok {\n\t\tlwrap = true\n\t}\n\tif _, ok := n.Right.(*ConditionalNode); ok {\n\t\trwrap = true\n\t}\n\n\tif lwrap {\n\t\tlhs = fmt.Sprintf(\"(%s)\", n.Left.String())\n\t} else {\n\t\tlhs = n.Left.String()\n\t}\n\n\tif rwrap {\n\t\trhs = fmt.Sprintf(\"(%s)\", n.Right.String())\n\t} else {\n\t\trhs = n.Right.String()\n\t}\n\n\treturn fmt.Sprintf(\"%s %s %s\", lhs, n.Operator, rhs)\n}\n\nfunc (n *ChainNode) String() string {\n\treturn n.Node.String()\n}\n\nfunc (n *MemberNode) String() string {\n\tnode := n.Node.String()\n\tif _, ok := n.Node.(*BinaryNode); ok {\n\t\tnode = fmt.Sprintf(\"(%s)\", node)\n\t}\n\n\tif n.Optional {\n\t\tif str, ok := n.Property.(*StringNode); ok && utils.IsValidIdentifier(str.Value) {\n\t\t\treturn fmt.Sprintf(\"%s?.%s\", node, str.Value)\n\t\t} else {\n\t\t\treturn fmt.Sprintf(\"%s?.[%s]\", node, n.Property.String())\n\t\t}\n\t}\n\tif str, ok := n.Property.(*StringNode); ok && utils.IsValidIdentifier(str.Value) {\n\t\tif _, ok := n.Node.(*PointerNode); ok {\n\t\t\treturn fmt.Sprintf(\".%s\", str.Value)\n\t\t}\n\t\treturn fmt.Sprintf(\"%s.%s\", node, str.Value)\n\t}\n\treturn fmt.Sprintf(\"%s[%s]\", node, n.Property.String())\n}\n\nfunc (n *SliceNode) String() string {\n\tif n.From == nil && n.To == nil {\n\t\treturn fmt.Sprintf(\"%s[:]\", n.Node.String())\n\t}\n\tif n.From == nil {\n\t\treturn fmt.Sprintf(\"%s[:%s]\", n.Node.String(), n.To.String())\n\t}\n\tif n.To == nil {\n\t\treturn fmt.Sprintf(\"%s[%s:]\", n.Node.String(), n.From.String())\n\t}\n\treturn fmt.Sprintf(\"%s[%s:%s]\", n.Node.String(), n.From.String(), n.To.String())\n}\n\nfunc (n *CallNode) String() string {\n\targuments := make([]string, len(n.Arguments))\n\tfor i, arg := range n.Arguments {\n\t\targuments[i] = arg.String()\n\t}\n\treturn fmt.Sprintf(\"%s(%s)\", n.Callee.String(), strings.Join(arguments, \", \"))\n}\n\nfunc (n *BuiltinNode) String() string {\n\targuments := make([]string, len(n.Arguments))\n\tfor i, arg := range n.Arguments {\n\t\targuments[i] = arg.String()\n\t}\n\treturn fmt.Sprintf(\"%s(%s)\", n.Name, strings.Join(arguments, \", \"))\n}\n\nfunc (n *PredicateNode) String() string {\n\treturn n.Node.String()\n}\n\nfunc (n *PointerNode) String() string {\n\treturn fmt.Sprintf(\"#%s\", n.Name)\n}\n\nfunc (n *VariableDeclaratorNode) String() string {\n\treturn fmt.Sprintf(\"let %s = %s; %s\", n.Name, n.Value.String(), n.Expr.String())\n}\n\nfunc (n *SequenceNode) String() string {\n\tnodes := make([]string, len(n.Nodes))\n\tfor i, node := range n.Nodes {\n\t\tnodes[i] = node.String()\n\t}\n\treturn strings.Join(nodes, \"; \")\n}\n\nfunc (n *ConditionalNode) String() string {\n\tif !n.Ternary {\n\t\tcond := n.Cond.String()\n\t\texp1 := n.Exp1.String()\n\t\tif c2, ok := n.Exp2.(*ConditionalNode); ok && !c2.Ternary {\n\t\t\treturn fmt.Sprintf(\"if %s { %s } else %s\", cond, exp1, c2.String())\n\t\t}\n\t\texp2 := n.Exp2.String()\n\t\treturn fmt.Sprintf(\"if %s { %s } else { %s }\", cond, exp1, exp2)\n\t}\n\n\tvar cond, exp1, exp2 string\n\tif _, ok := n.Cond.(*ConditionalNode); ok {\n\t\tcond = fmt.Sprintf(\"(%s)\", n.Cond.String())\n\t} else {\n\t\tcond = n.Cond.String()\n\t}\n\tif _, ok := n.Exp1.(*ConditionalNode); ok {\n\t\texp1 = fmt.Sprintf(\"(%s)\", n.Exp1.String())\n\t} else {\n\t\texp1 = n.Exp1.String()\n\t}\n\tif _, ok := n.Exp2.(*ConditionalNode); ok {\n\t\texp2 = fmt.Sprintf(\"(%s)\", n.Exp2.String())\n\t} else {\n\t\texp2 = n.Exp2.String()\n\t}\n\treturn fmt.Sprintf(\"%s ? %s : %s\", cond, exp1, exp2)\n}\n\nfunc (n *ArrayNode) String() string {\n\tnodes := make([]string, len(n.Nodes))\n\tfor i, node := range n.Nodes {\n\t\tnodes[i] = node.String()\n\t}\n\treturn fmt.Sprintf(\"[%s]\", strings.Join(nodes, \", \"))\n}\n\nfunc (n *MapNode) String() string {\n\tpairs := make([]string, len(n.Pairs))\n\tfor i, pair := range n.Pairs {\n\t\tpairs[i] = pair.String()\n\t}\n\treturn fmt.Sprintf(\"{%s}\", strings.Join(pairs, \", \"))\n}\n\nfunc (n *PairNode) String() string {\n\tif str, ok := n.Key.(*StringNode); ok {\n\t\tif utils.IsValidIdentifier(str.Value) {\n\t\t\treturn fmt.Sprintf(\"%s: %s\", str.Value, n.Value.String())\n\t\t}\n\t\treturn fmt.Sprintf(\"%s: %s\", str.String(), n.Value.String())\n\t}\n\treturn fmt.Sprintf(\"(%s): %s\", n.Key.String(), n.Value.String())\n}\n"
  },
  {
    "path": "ast/print_test.go",
    "content": "package ast_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/parser\"\n)\n\nfunc TestPrint(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\twant  string\n\t}{\n\t\t{`nil`, `nil`},\n\t\t{`true`, `true`},\n\t\t{`false`, `false`},\n\t\t{`1`, `1`},\n\t\t{`1.1`, `1.1`},\n\t\t{`\"a\"`, `\"a\"`},\n\t\t{`'a'`, `\"a\"`},\n\t\t{`a`, `a`},\n\t\t{`a.b`, `a.b`},\n\t\t{`a[0]`, `a[0]`},\n\t\t{`a[\"the b\"]`, `a[\"the b\"]`},\n\t\t{`a.b[0]`, `a.b[0]`},\n\t\t{`a?.b`, `a?.b`},\n\t\t{`x[0][1]`, `x[0][1]`},\n\t\t{`x?.[0]?.[1]`, `x?.[0]?.[1]`},\n\t\t{`-a`, `-a`},\n\t\t{`!a`, `!a`},\n\t\t{`not a`, `not a`},\n\t\t{`a + b`, `a + b`},\n\t\t{`a + b * c`, `a + b * c`},\n\t\t{`(a + b) * c`, `(a + b) * c`},\n\t\t{`a * (b + c)`, `a * (b + c)`},\n\t\t{`-(a + b) * c`, `-(a + b) * c`},\n\t\t{`a == b`, `a == b`},\n\t\t{`a matches b`, `a matches b`},\n\t\t{`a in b`, `a in b`},\n\t\t{`a not in b`, `not (a in b)`},\n\t\t{`a and b`, `a and b`},\n\t\t{`a or b`, `a or b`},\n\t\t{`a or b and c`, `a or (b and c)`},\n\t\t{`a or (b and c)`, `a or (b and c)`},\n\t\t{`(a or b) and c`, `(a or b) and c`},\n\t\t{`a ? b : c`, `a ? b : c`},\n\t\t{`a ? b : c ? d : e`, `a ? b : (c ? d : e)`},\n\t\t{`(a ? b : c) ? d : e`, `(a ? b : c) ? d : e`},\n\t\t{`a ? (b ? c : d) : e`, `a ? (b ? c : d) : e`},\n\t\t{`func()`, `func()`},\n\t\t{`func(a)`, `func(a)`},\n\t\t{`func(a, b)`, `func(a, b)`},\n\t\t{`{}`, `{}`},\n\t\t{`{a: b}`, `{a: b}`},\n\t\t{`{a: b, c: d}`, `{a: b, c: d}`},\n\t\t{`{\"a\": b, 'c': d}`, `{a: b, c: d}`},\n\t\t{`{\"a\": b, c: d}`, `{a: b, c: d}`},\n\t\t{`{\"a\": b, 8: 8}`, `{a: b, \"8\": 8}`},\n\t\t{`{\"9\": 9, '8': 8, \"foo\": d}`, `{\"9\": 9, \"8\": 8, foo: d}`},\n\t\t{`[]`, `[]`},\n\t\t{`[a]`, `[a]`},\n\t\t{`[a, b]`, `[a, b]`},\n\t\t{`len(a)`, `len(a)`},\n\t\t{`map(a, # > 0)`, `map(a, # > 0)`},\n\t\t{`map(a, {# > 0})`, `map(a, # > 0)`},\n\t\t{`map(a, .b)`, `map(a, .b)`},\n\t\t{`a.b()`, `a.b()`},\n\t\t{`a.b(c)`, `a.b(c)`},\n\t\t{`a[1:-1]`, `a[1:-1]`},\n\t\t{`a[1:]`, `a[1:]`},\n\t\t{`a[1:]`, `a[1:]`},\n\t\t{`a[:]`, `a[:]`},\n\t\t{`(nil ?? 1) > 0`, `(nil ?? 1) > 0`},\n\t\t{`{(\"a\" + \"b\"): 42}`, `{(\"a\" + \"b\"): 42}`},\n\t\t{`(One == 1 ? true : false) && Two == 2`, `(One == 1 ? true : false) && Two == 2`},\n\t\t{`not (a == 1 ? b > 1 : b < 2)`, `not (a == 1 ? b > 1 : b < 2)`},\n\t\t{`(-(1+1)) ** 2`, `(-(1 + 1)) ** 2`},\n\t\t{`2 ** (-(1+1))`, `2 ** -(1 + 1)`},\n\t\t{`(2 ** 2) ** 3`, `(2 ** 2) ** 3`},\n\t\t{`(3 + 5) / (5 % 3)`, `(3 + 5) / (5 % 3)`},\n\t\t{`(-(1+1)) == 2`, `-(1 + 1) == 2`},\n\t\t{`if true { 1 } else { 2 }`, `if true { 1 } else { 2 }`},\n\t\t{`if true { 1 } else if false { 2 } else { 3 }`, `if true { 1 } else if false { 2 } else { 3 }`},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.input, func(t *testing.T) {\n\t\t\ttree, err := parser.Parse(tt.input)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tt.want, tree.Node.String())\n\t\t})\n\t}\n}\n\nfunc TestPrint_MemberNode(t *testing.T) {\n\tnode := &ast.MemberNode{\n\t\tNode: &ast.IdentifierNode{\n\t\t\tValue: \"a\",\n\t\t},\n\t\tProperty: &ast.StringNode{Value: \"b c\"},\n\t\tOptional: true,\n\t}\n\trequire.Equal(t, `a?.[\"b c\"]`, node.String())\n}\n\nfunc TestPrint_ConstantNode(t *testing.T) {\n\ttests := []struct {\n\t\tinput any\n\t\twant  string\n\t}{\n\t\t{nil, `nil`},\n\t\t{true, `true`},\n\t\t{false, `false`},\n\t\t{1, `1`},\n\t\t{1.1, `1.1`},\n\t\t{\"a\", `\"a\"`},\n\t\t{[]int{1, 2, 3}, `[1,2,3]`},\n\t\t{map[string]int{\"a\": 1}, `{\"a\":1}`},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.want, func(t *testing.T) {\n\t\t\tnode := &ast.ConstantNode{\n\t\t\t\tValue: tt.input,\n\t\t\t}\n\t\t\trequire.Equal(t, tt.want, node.String())\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "ast/visitor.go",
    "content": "package ast\n\nimport \"fmt\"\n\ntype Visitor interface {\n\tVisit(node *Node)\n}\n\nfunc Walk(node *Node, v Visitor) {\n\tif *node == nil {\n\t\treturn\n\t}\n\tswitch n := (*node).(type) {\n\tcase *NilNode:\n\tcase *IdentifierNode:\n\tcase *IntegerNode:\n\tcase *FloatNode:\n\tcase *BoolNode:\n\tcase *StringNode:\n\tcase *BytesNode:\n\tcase *ConstantNode:\n\tcase *UnaryNode:\n\t\tWalk(&n.Node, v)\n\tcase *BinaryNode:\n\t\tWalk(&n.Left, v)\n\t\tWalk(&n.Right, v)\n\tcase *ChainNode:\n\t\tWalk(&n.Node, v)\n\tcase *MemberNode:\n\t\tWalk(&n.Node, v)\n\t\tWalk(&n.Property, v)\n\tcase *SliceNode:\n\t\tWalk(&n.Node, v)\n\t\tif n.From != nil {\n\t\t\tWalk(&n.From, v)\n\t\t}\n\t\tif n.To != nil {\n\t\t\tWalk(&n.To, v)\n\t\t}\n\tcase *CallNode:\n\t\tWalk(&n.Callee, v)\n\t\tfor i := range n.Arguments {\n\t\t\tWalk(&n.Arguments[i], v)\n\t\t}\n\tcase *BuiltinNode:\n\t\tfor i := range n.Arguments {\n\t\t\tWalk(&n.Arguments[i], v)\n\t\t}\n\tcase *PredicateNode:\n\t\tWalk(&n.Node, v)\n\tcase *PointerNode:\n\tcase *VariableDeclaratorNode:\n\t\tWalk(&n.Value, v)\n\t\tWalk(&n.Expr, v)\n\tcase *SequenceNode:\n\t\tfor i := range n.Nodes {\n\t\t\tWalk(&n.Nodes[i], v)\n\t\t}\n\tcase *ConditionalNode:\n\t\tWalk(&n.Cond, v)\n\t\tWalk(&n.Exp1, v)\n\t\tWalk(&n.Exp2, v)\n\tcase *ArrayNode:\n\t\tfor i := range n.Nodes {\n\t\t\tWalk(&n.Nodes[i], v)\n\t\t}\n\tcase *MapNode:\n\t\tfor i := range n.Pairs {\n\t\t\tWalk(&n.Pairs[i], v)\n\t\t}\n\tcase *PairNode:\n\t\tWalk(&n.Key, v)\n\t\tWalk(&n.Value, v)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"undefined node type (%T)\", node))\n\t}\n\n\tv.Visit(node)\n}\n"
  },
  {
    "path": "ast/visitor_test.go",
    "content": "package ast_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\n\t\"github.com/expr-lang/expr/ast\"\n)\n\ntype visitor struct {\n\tidentifiers []string\n}\n\nfunc (v *visitor) Visit(node *ast.Node) {\n\tif n, ok := (*node).(*ast.IdentifierNode); ok {\n\t\tv.identifiers = append(v.identifiers, n.Value)\n\t}\n}\n\nfunc TestWalk(t *testing.T) {\n\tvar node ast.Node\n\tnode = &ast.BinaryNode{\n\t\tOperator: \"+\",\n\t\tLeft:     &ast.IdentifierNode{Value: \"foo\"},\n\t\tRight:    &ast.IdentifierNode{Value: \"bar\"},\n\t}\n\n\tvisitor := &visitor{}\n\tast.Walk(&node, visitor)\n\tassert.Equal(t, []string{\"foo\", \"bar\"}, visitor.identifiers)\n}\n\ntype patcher struct{}\n\nfunc (p *patcher) Visit(node *ast.Node) {\n\tif _, ok := (*node).(*ast.IdentifierNode); ok {\n\t\t*node = &ast.NilNode{}\n\t}\n}\n\nfunc TestWalk_patch(t *testing.T) {\n\tvar node ast.Node\n\tnode = &ast.BinaryNode{\n\t\tOperator: \"+\",\n\t\tLeft:     &ast.IdentifierNode{Value: \"foo\"},\n\t\tRight:    &ast.IdentifierNode{Value: \"bar\"},\n\t}\n\n\tpatcher := &patcher{}\n\tast.Walk(&node, patcher)\n\tassert.IsType(t, &ast.NilNode{}, node.(*ast.BinaryNode).Left)\n\tassert.IsType(t, &ast.NilNode{}, node.(*ast.BinaryNode).Right)\n}\n"
  },
  {
    "path": "bench_test.go",
    "content": "package expr_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\nfunc Benchmark_expr(b *testing.B) {\n\tparams := make(map[string]any)\n\tparams[\"Origin\"] = \"MOW\"\n\tparams[\"Country\"] = \"RU\"\n\tparams[\"Adults\"] = 1\n\tparams[\"Value\"] = 100\n\n\tprogram, err := expr.Compile(`(Origin == \"MOW\" || Country == \"RU\") && (Value >= 100 || Adults == 1)`, expr.Env(params))\n\trequire.NoError(b, err)\n\n\tvar out any\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, params)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.True(b, out.(bool))\n}\n\nfunc Benchmark_expr_eval(b *testing.B) {\n\tparams := make(map[string]any)\n\tparams[\"Origin\"] = \"MOW\"\n\tparams[\"Country\"] = \"RU\"\n\tparams[\"Adults\"] = 1\n\tparams[\"Value\"] = 100\n\n\tvar out any\n\tvar err error\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = expr.Eval(`(Origin == \"MOW\" || Country == \"RU\") && (Value >= 100 || Adults == 1)`, params)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.True(b, out.(bool))\n}\n\nfunc Benchmark_expr_reuseVm(b *testing.B) {\n\tparams := make(map[string]any)\n\tparams[\"Origin\"] = \"MOW\"\n\tparams[\"Country\"] = \"RU\"\n\tparams[\"Adults\"] = 1\n\tparams[\"Value\"] = 100\n\n\tprogram, err := expr.Compile(`(Origin == \"MOW\" || Country == \"RU\") && (Value >= 100 || Adults == 1)`, expr.Env(params))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tv := vm.VM{}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = v.Run(program, params)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.True(b, out.(bool))\n}\n\nfunc Benchmark_len(b *testing.B) {\n\tenv := map[string]any{\n\t\t\"arr\": make([]int, 100),\n\t}\n\n\tprogram, err := expr.Compile(`len(arr)`, expr.Env(env))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Equal(b, 100, out)\n}\n\nfunc Benchmark_filter(b *testing.B) {\n\ttype Env struct {\n\t\tInts []int\n\t}\n\tenv := Env{\n\t\tInts: make([]int, 1000),\n\t}\n\tfor i := 1; i <= len(env.Ints); i++ {\n\t\tenv.Ints[i-1] = i\n\t}\n\n\tprogram, err := expr.Compile(`filter(Ints, # % 7 == 0)`, expr.Env(Env{}))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Len(b, out.([]any), 142)\n}\n\nfunc Benchmark_filterLen(b *testing.B) {\n\ttype Env struct {\n\t\tInts []int\n\t}\n\tenv := Env{\n\t\tInts: make([]int, 1000),\n\t}\n\tfor i := 1; i <= len(env.Ints); i++ {\n\t\tenv.Ints[i-1] = i\n\t}\n\n\tprogram, err := expr.Compile(`len(filter(Ints, # % 7 == 0))`, expr.Env(Env{}))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Equal(b, 142, out)\n}\n\nfunc Benchmark_filterFirst(b *testing.B) {\n\ttype Env struct {\n\t\tInts []int\n\t}\n\tenv := Env{\n\t\tInts: make([]int, 1000),\n\t}\n\tfor i := 1; i <= len(env.Ints); i++ {\n\t\tenv.Ints[i-1] = i\n\t}\n\n\tprogram, err := expr.Compile(`filter(Ints, # % 7 == 0)[0]`, expr.Env(Env{}))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Equal(b, 7, out)\n}\n\nfunc Benchmark_filterLast(b *testing.B) {\n\ttype Env struct {\n\t\tInts []int\n\t}\n\tenv := Env{\n\t\tInts: make([]int, 1000),\n\t}\n\tfor i := 1; i <= len(env.Ints); i++ {\n\t\tenv.Ints[i-1] = i\n\t}\n\n\tprogram, err := expr.Compile(`filter(Ints, # % 7 == 0)[-1]`, expr.Env(Env{}))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Equal(b, 994, out)\n}\n\nfunc Benchmark_filterMap(b *testing.B) {\n\ttype Env struct {\n\t\tInts []int\n\t}\n\tenv := Env{\n\t\tInts: make([]int, 100),\n\t}\n\tfor i := 1; i <= len(env.Ints); i++ {\n\t\tenv.Ints[i-1] = i\n\t}\n\n\tprogram, err := expr.Compile(`map(filter(Ints, # % 7 == 0), # * 2)`, expr.Env(Env{}))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Len(b, out.([]any), 14)\n\trequire.Equal(b, 14, out.([]any)[0])\n}\n\nfunc Benchmark_arrayIndex(b *testing.B) {\n\tenv := map[string]any{\n\t\t\"arr\": make([]int, 100),\n\t}\n\tfor i := 0; i < 100; i++ {\n\t\tenv[\"arr\"].([]int)[i] = i\n\t}\n\n\tprogram, err := expr.Compile(`arr[50]`, expr.Env(env))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Equal(b, 50, out)\n}\n\nfunc Benchmark_envStruct(b *testing.B) {\n\ttype Price struct {\n\t\tValue int\n\t}\n\ttype Env struct {\n\t\tPrice Price\n\t}\n\n\tprogram, err := expr.Compile(`Price.Value > 0`, expr.Env(Env{}))\n\trequire.NoError(b, err)\n\n\tenv := Env{Price: Price{Value: 1}}\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.True(b, out.(bool))\n}\n\nfunc Benchmark_envStruct_noEnv(b *testing.B) {\n\ttype Price struct {\n\t\tValue int\n\t}\n\ttype Env struct {\n\t\tPrice Price\n\t}\n\n\tprogram, err := expr.Compile(`Price.Value > 0`)\n\trequire.NoError(b, err)\n\n\tenv := Env{Price: Price{Value: 1}}\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.True(b, out.(bool))\n}\n\nfunc Benchmark_envMap(b *testing.B) {\n\ttype Price struct {\n\t\tValue int\n\t}\n\tenv := map[string]any{\n\t\t\"price\": Price{Value: 1},\n\t}\n\n\tprogram, err := expr.Compile(`price.Value > 0`, expr.Env(env))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.True(b, out.(bool))\n}\n\ntype CallEnv struct {\n\tA      int\n\tB      int\n\tC      int\n\tFn     func() bool\n\tFnFast func(...any) any\n\tFoo    CallFoo\n}\n\nfunc (CallEnv) Func() string {\n\treturn \"func\"\n}\n\ntype CallFoo struct {\n\tD int\n\tE int\n\tF int\n}\n\nfunc (CallFoo) Method() string {\n\treturn \"method\"\n}\n\nfunc Benchmark_callFunc(b *testing.B) {\n\tprogram, err := expr.Compile(`Func()`, expr.Env(CallEnv{}))\n\trequire.NoError(b, err)\n\n\tenv := CallEnv{}\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Equal(b, \"func\", out)\n}\n\nfunc Benchmark_callMethod(b *testing.B) {\n\tprogram, err := expr.Compile(`Foo.Method()`, expr.Env(CallEnv{}))\n\trequire.NoError(b, err)\n\n\tenv := CallEnv{}\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Equal(b, \"method\", out)\n}\n\nfunc Benchmark_callField(b *testing.B) {\n\tprogram, err := expr.Compile(`Fn()`, expr.Env(CallEnv{}))\n\trequire.NoError(b, err)\n\n\tenv := CallEnv{\n\t\tFn: func() bool {\n\t\t\treturn true\n\t\t},\n\t}\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.True(b, out.(bool))\n}\n\nfunc Benchmark_callFast(b *testing.B) {\n\tprogram, err := expr.Compile(`FnFast()`, expr.Env(CallEnv{}))\n\tif err != nil {\n\t\tb.Fatal(err)\n\t}\n\n\tenv := CallEnv{\n\t\tFnFast: func(s ...any) any {\n\t\t\treturn \"fn_fast\"\n\t\t},\n\t}\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Equal(b, \"fn_fast\", out)\n}\n\nfunc Benchmark_callConstExpr(b *testing.B) {\n\tprogram, err := expr.Compile(`Func()`, expr.Env(CallEnv{}), expr.ConstExpr(\"Func\"))\n\trequire.NoError(b, err)\n\n\tenv := CallEnv{}\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Equal(b, \"func\", out)\n}\n\nfunc Benchmark_largeStructAccess(b *testing.B) {\n\ttype Env struct {\n\t\tData  [1024 * 1024 * 10]byte\n\t\tField int\n\t}\n\n\tprogram, err := expr.Compile(`Field > 0 && Field > 1 && Field < 99`, expr.Env(Env{}))\n\trequire.NoError(b, err)\n\n\tenv := Env{Field: 21}\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, &env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.True(b, out.(bool))\n}\n\nfunc Benchmark_largeNestedStructAccess(b *testing.B) {\n\ttype Env struct {\n\t\tInner struct {\n\t\t\tData  [1024 * 1024 * 10]byte\n\t\t\tField int\n\t\t}\n\t}\n\n\tprogram, err := expr.Compile(`Inner.Field > 0 && Inner.Field > 1 && Inner.Field < 99`, expr.Env(Env{}))\n\trequire.NoError(b, err)\n\n\tenv := Env{}\n\tenv.Inner.Field = 21\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, &env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.True(b, out.(bool))\n}\n\nfunc Benchmark_largeNestedArrayAccess(b *testing.B) {\n\ttype Env struct {\n\t\tData [1][1024 * 1024 * 10]byte\n\t}\n\n\tprogram, err := expr.Compile(`Data[0][0] > 0`, expr.Env(Env{}))\n\trequire.NoError(b, err)\n\n\tenv := Env{}\n\tenv.Data[0][0] = 1\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, &env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.True(b, out.(bool))\n}\n\nfunc Benchmark_sort(b *testing.B) {\n\tenv := map[string]any{\n\t\t\"arr\": []any{55, 58, 42, 61, 75, 52, 64, 62, 16, 79, 40, 14, 50, 76, 23, 2, 5, 80, 89, 51, 21, 96, 91, 13, 71, 82, 65, 63, 11, 17, 94, 81, 74, 4, 97, 1, 39, 3, 28, 8, 84, 90, 47, 85, 7, 56, 49, 93, 33, 12, 19, 60, 86, 100, 44, 45, 36, 72, 95, 77, 34, 92, 24, 73, 18, 38, 43, 26, 41, 69, 67, 57, 9, 27, 66, 87, 46, 35, 59, 70, 10, 20, 53, 15, 32, 98, 68, 31, 54, 25, 83, 88, 22, 48, 29, 37, 6, 78, 99, 30},\n\t}\n\n\tprogram, err := expr.Compile(`sort(arr)`, expr.Env(env))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.Equal(b, 1, out.([]any)[0])\n\trequire.Equal(b, 100, out.([]any)[99])\n}\n\nfunc Benchmark_sortBy(b *testing.B) {\n\ttype Foo struct {\n\t\tValue int\n\t}\n\tarr := []any{55, 58, 42, 61, 75, 52, 64, 62, 16, 79, 40, 14, 50, 76, 23, 2, 5, 80, 89, 51, 21, 96, 91, 13, 71, 82, 65, 63, 11, 17, 94, 81, 74, 4, 97, 1, 39, 3, 28, 8, 84, 90, 47, 85, 7, 56, 49, 93, 33, 12, 19, 60, 86, 100, 44, 45, 36, 72, 95, 77, 34, 92, 24, 73, 18, 38, 43, 26, 41, 69, 67, 57, 9, 27, 66, 87, 46, 35, 59, 70, 10, 20, 53, 15, 32, 98, 68, 31, 54, 25, 83, 88, 22, 48, 29, 37, 6, 78, 99, 30}\n\tenv := map[string]any{\n\t\t\"arr\": make([]Foo, len(arr)),\n\t}\n\tfor i, v := range arr {\n\t\tenv[\"arr\"].([]Foo)[i] = Foo{Value: v.(int)}\n\t}\n\n\tprogram, err := expr.Compile(`sortBy(arr, .Value)`, expr.Env(env))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.Equal(b, 1, out.([]any)[0].(Foo).Value)\n\trequire.Equal(b, 100, out.([]any)[99].(Foo).Value)\n}\n\nfunc Benchmark_groupBy(b *testing.B) {\n\tprogram, err := expr.Compile(`groupBy(1..100, # % 7)[6]`)\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\tb.StopTimer()\n\n\trequire.Equal(b, 6, out.([]any)[0])\n}\n\nfunc Benchmark_reduce(b *testing.B) {\n\tprogram, err := expr.Compile(`reduce(1..100, # + #acc)`)\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\tb.StopTimer()\n\n\trequire.Equal(b, 5050, out.(int))\n}\n\nfunc Benchmark_min(b *testing.B) {\n\tarr := []any{55, 58, 42, 61, 75, 52, 64, 62, 16, 79, 40, 14, 50, 76, 23, 2, 5, 80, 89, 51, 21, 96, 91, 13, 71, 82, 65, 63, 11, 17, 94, 81, 74, 4, 97, 1, 39, 3, 28, 8, 84, 90, 47, 85, 7, 56, 49, 93, 33, 12, 19, 60, 86, 100, 44, 45, 36, 72, 95, 77, 34, 92, 24, 73, 18, 38, 43, 26, 41, 69, 67, 57, 9, 27, 66, 87, 46, 35, 59, 70, 10, 20, 53, 15, 32, 98, 68, 31, 54, 25, 83, 88, 22, 48, 29, 37, 6, 78, 99, 30}\n\tenv := map[string]any{\"arr\": arr}\n\n\tprogram, err := expr.Compile(`min(arr)`, expr.Env(env))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.Equal(b, 1, out)\n}\n\nfunc Benchmark_max(b *testing.B) {\n\tarr := []any{55, 58, 42, 61, 75, 52, 64, 62, 16, 79, 40, 14, 50, 76, 23, 2, 5, 80, 89, 51, 21, 96, 91, 13, 71, 82, 65, 63, 11, 17, 94, 81, 74, 4, 97, 1, 39, 3, 28, 8, 84, 90, 47, 85, 7, 56, 49, 93, 33, 12, 19, 60, 86, 100, 44, 45, 36, 72, 95, 77, 34, 92, 24, 73, 18, 38, 43, 26, 41, 69, 67, 57, 9, 27, 66, 87, 46, 35, 59, 70, 10, 20, 53, 15, 32, 98, 68, 31, 54, 25, 83, 88, 22, 48, 29, 37, 6, 78, 99, 30}\n\tenv := map[string]any{\"arr\": arr}\n\n\tprogram, err := expr.Compile(`max(arr)`, expr.Env(env))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.Equal(b, 100, out)\n}\n\nfunc Benchmark_mean(b *testing.B) {\n\tarr := []any{55, 58, 42, 61, 75, 52, 64, 62, 16, 79, 40, 14, 50, 76, 23, 2, 5, 80, 89, 51, 21, 96, 91, 13, 71, 82, 65, 63, 11, 17, 94, 81, 74, 4, 97, 1, 39, 3, 28, 8, 84, 90, 47, 85, 7, 56, 49, 93, 33, 12, 19, 60, 86, 100, 44, 45, 36, 72, 95, 77, 34, 92, 24, 73, 18, 38, 43, 26, 41, 69, 67, 57, 9, 27, 66, 87, 46, 35, 59, 70, 10, 20, 53, 15, 32, 98, 68, 31, 54, 25, 83, 88, 22, 48, 29, 37, 6, 78, 99, 30}\n\tenv := map[string]any{\"arr\": arr}\n\n\tprogram, err := expr.Compile(`mean(arr)`, expr.Env(env))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.Equal(b, 50.5, out)\n}\n\nfunc Benchmark_median(b *testing.B) {\n\tarr := []any{55, 58, 42, 61, 75, 52, 64, 62, 16, 79, 40, 14, 50, 76, 23, 2, 5, 80, 89, 51, 21, 96, 91, 13, 71, 82, 65, 63, 11, 17, 94, 81, 74, 4, 97, 1, 39, 3, 28, 8, 84, 90, 47, 85, 7, 56, 49, 93, 33, 12, 19, 60, 86, 100, 44, 45, 36, 72, 95, 77, 34, 92, 24, 73, 18, 38, 43, 26, 41, 69, 67, 57, 9, 27, 66, 87, 46, 35, 59, 70, 10, 20, 53, 15, 32, 98, 68, 31, 54, 25, 83, 88, 22, 48, 29, 37, 6, 78, 99, 30}\n\tenv := map[string]any{\"arr\": arr}\n\n\tprogram, err := expr.Compile(`median(arr)`, expr.Env(env))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.Equal(b, 50.5, out)\n}\n"
  },
  {
    "path": "builtin/builtin.go",
    "content": "package builtin\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/internal/deref\"\n\t\"github.com/expr-lang/expr/vm/runtime\"\n)\n\nvar (\n\tIndex map[string]int\n\tNames []string\n\n\t// MaxDepth limits the recursion depth for nested structures.\n\tMaxDepth      = 10000\n\tErrorMaxDepth = errors.New(\"recursion depth exceeded\")\n)\n\nfunc init() {\n\tIndex = make(map[string]int)\n\tNames = make([]string, len(Builtins))\n\tfor i, fn := range Builtins {\n\t\tIndex[fn.Name] = i\n\t\tNames[i] = fn.Name\n\t}\n}\n\nvar Builtins = []*Function{\n\t{\n\t\tName:      \"all\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) bool) bool)),\n\t},\n\t{\n\t\tName:      \"none\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) bool) bool)),\n\t},\n\t{\n\t\tName:      \"any\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) bool) bool)),\n\t},\n\t{\n\t\tName:      \"one\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) bool) bool)),\n\t},\n\t{\n\t\tName:      \"filter\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) bool) []any)),\n\t},\n\t{\n\t\tName:      \"map\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) any) []any)),\n\t},\n\t{\n\t\tName:      \"find\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) bool) any)),\n\t},\n\t{\n\t\tName:      \"findIndex\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) bool) int)),\n\t},\n\t{\n\t\tName:      \"findLast\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) bool) any)),\n\t},\n\t{\n\t\tName:      \"findLastIndex\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) bool) int)),\n\t},\n\t{\n\t\tName:      \"count\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) bool) int)),\n\t},\n\t{\n\t\tName:      \"sum\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) bool) int)),\n\t},\n\t{\n\t\tName:      \"groupBy\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) any) map[any][]any)),\n\t},\n\t{\n\t\tName:      \"sortBy\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any) bool, string) []any)),\n\t},\n\t{\n\t\tName:      \"reduce\",\n\t\tPredicate: true,\n\t\tTypes:     types(new(func([]any, func(any, any) any, any) any)),\n\t},\n\t{\n\t\tName: \"len\",\n\t\tFast: Len,\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tswitch kind(args[0]) {\n\t\t\tcase reflect.Array, reflect.Map, reflect.Slice, reflect.String, reflect.Interface:\n\t\t\t\treturn integerType, nil\n\t\t\t}\n\t\t\treturn anyType, fmt.Errorf(\"invalid argument for len (type %s)\", args[0])\n\t\t},\n\t},\n\t{\n\t\tName:  \"type\",\n\t\tFast:  Type,\n\t\tTypes: types(new(func(any) string)),\n\t},\n\t{\n\t\tName: \"abs\",\n\t\tFast: Abs,\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tswitch kind(args[0]) {\n\t\t\tcase reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface:\n\t\t\t\treturn args[0], nil\n\t\t\t}\n\t\t\treturn anyType, fmt.Errorf(\"invalid argument for abs (type %s)\", args[0])\n\t\t},\n\t},\n\t{\n\t\tName: \"ceil\",\n\t\tFast: Ceil,\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\treturn validateRoundFunc(\"ceil\", args)\n\t\t},\n\t},\n\t{\n\t\tName: \"floor\",\n\t\tFast: Floor,\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\treturn validateRoundFunc(\"floor\", args)\n\t\t},\n\t},\n\t{\n\t\tName: \"round\",\n\t\tFast: Round,\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\treturn validateRoundFunc(\"round\", args)\n\t\t},\n\t},\n\t{\n\t\tName: \"int\",\n\t\tFast: Int,\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tswitch kind(args[0]) {\n\t\t\tcase reflect.Interface:\n\t\t\t\treturn integerType, nil\n\t\t\tcase reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\t\t\treturn integerType, nil\n\t\t\tcase reflect.String:\n\t\t\t\treturn integerType, nil\n\t\t\t}\n\t\t\treturn anyType, fmt.Errorf(\"invalid argument for int (type %s)\", args[0])\n\t\t},\n\t},\n\t{\n\t\tName: \"float\",\n\t\tFast: Float,\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tswitch kind(args[0]) {\n\t\t\tcase reflect.Interface:\n\t\t\t\treturn floatType, nil\n\t\t\tcase reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\t\t\treturn floatType, nil\n\t\t\tcase reflect.String:\n\t\t\t\treturn floatType, nil\n\t\t\t}\n\t\t\treturn anyType, fmt.Errorf(\"invalid argument for float (type %s)\", args[0])\n\t\t},\n\t},\n\t{\n\t\tName:  \"string\",\n\t\tFast:  String,\n\t\tTypes: types(new(func(any any) string)),\n\t},\n\t{\n\t\tName: \"trim\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tif len(args) == 1 {\n\t\t\t\treturn strings.TrimSpace(args[0].(string)), nil\n\t\t\t} else if len(args) == 2 {\n\t\t\t\treturn strings.Trim(args[0].(string), args[1].(string)), nil\n\t\t\t} else {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid number of arguments for trim (expected 1 or 2, got %d)\", len(args))\n\t\t\t}\n\t\t},\n\t\tTypes: types(\n\t\t\tstrings.TrimSpace,\n\t\t\tstrings.Trim,\n\t\t),\n\t},\n\t{\n\t\tName: \"trimPrefix\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\ts := \" \"\n\t\t\tif len(args) == 2 {\n\t\t\t\ts = args[1].(string)\n\t\t\t}\n\t\t\treturn strings.TrimPrefix(args[0].(string), s), nil\n\t\t},\n\t\tTypes: types(\n\t\t\tstrings.TrimPrefix,\n\t\t\tnew(func(string) string),\n\t\t),\n\t},\n\t{\n\t\tName: \"trimSuffix\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\ts := \" \"\n\t\t\tif len(args) == 2 {\n\t\t\t\ts = args[1].(string)\n\t\t\t}\n\t\t\treturn strings.TrimSuffix(args[0].(string), s), nil\n\t\t},\n\t\tTypes: types(\n\t\t\tstrings.TrimSuffix,\n\t\t\tnew(func(string) string),\n\t\t),\n\t},\n\t{\n\t\tName: \"upper\",\n\t\tFast: func(arg any) any {\n\t\t\treturn strings.ToUpper(arg.(string))\n\t\t},\n\t\tTypes: types(strings.ToUpper),\n\t},\n\t{\n\t\tName: \"lower\",\n\t\tFast: func(arg any) any {\n\t\t\treturn strings.ToLower(arg.(string))\n\t\t},\n\t\tTypes: types(strings.ToLower),\n\t},\n\t{\n\t\tName: \"split\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tif len(args) == 2 {\n\t\t\t\treturn strings.Split(args[0].(string), args[1].(string)), nil\n\t\t\t} else if len(args) == 3 {\n\t\t\t\treturn strings.SplitN(args[0].(string), args[1].(string), runtime.ToInt(args[2])), nil\n\t\t\t} else {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid number of arguments for split (expected 2 or 3, got %d)\", len(args))\n\t\t\t}\n\t\t},\n\t\tTypes: types(\n\t\t\tstrings.Split,\n\t\t\tstrings.SplitN,\n\t\t),\n\t},\n\t{\n\t\tName: \"splitAfter\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tif len(args) == 2 {\n\t\t\t\treturn strings.SplitAfter(args[0].(string), args[1].(string)), nil\n\t\t\t} else if len(args) == 3 {\n\t\t\t\treturn strings.SplitAfterN(args[0].(string), args[1].(string), runtime.ToInt(args[2])), nil\n\t\t\t} else {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid number of arguments for splitAfter (expected 2 or 3, got %d)\", len(args))\n\t\t\t}\n\t\t},\n\t\tTypes: types(\n\t\t\tstrings.SplitAfter,\n\t\t\tstrings.SplitAfterN,\n\t\t),\n\t},\n\t{\n\t\tName: \"replace\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tif len(args) == 4 {\n\t\t\t\treturn strings.Replace(args[0].(string), args[1].(string), args[2].(string), runtime.ToInt(args[3])), nil\n\t\t\t} else if len(args) == 3 {\n\t\t\t\treturn strings.ReplaceAll(args[0].(string), args[1].(string), args[2].(string)), nil\n\t\t\t} else {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid number of arguments for replace (expected 3 or 4, got %d)\", len(args))\n\t\t\t}\n\t\t},\n\t\tTypes: types(\n\t\t\tstrings.Replace,\n\t\t\tstrings.ReplaceAll,\n\t\t),\n\t},\n\t{\n\t\tName: \"repeat\",\n\t\tSafe: func(args ...any) (any, uint, error) {\n\t\t\ts := args[0].(string)\n\t\t\tn := runtime.ToInt(args[1])\n\t\t\tif n < 0 {\n\t\t\t\treturn nil, 0, fmt.Errorf(\"invalid argument for repeat (expected positive integer, got %d)\", n)\n\t\t\t}\n\t\t\tif n > 1e6 {\n\t\t\t\treturn nil, 0, fmt.Errorf(\"memory budget exceeded\")\n\t\t\t}\n\t\t\treturn strings.Repeat(s, n), uint(len(s) * n), nil\n\t\t},\n\t\tTypes: types(strings.Repeat),\n\t},\n\t{\n\t\tName: \"join\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tglue := \"\"\n\t\t\tif len(args) == 2 {\n\t\t\t\tglue = args[1].(string)\n\t\t\t}\n\t\t\tswitch args[0].(type) {\n\t\t\tcase []string:\n\t\t\t\treturn strings.Join(args[0].([]string), glue), nil\n\t\t\tcase []any:\n\t\t\t\tvar s []string\n\t\t\t\tfor _, arg := range args[0].([]any) {\n\t\t\t\t\ts = append(s, arg.(string))\n\t\t\t\t}\n\t\t\t\treturn strings.Join(s, glue), nil\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"invalid argument for join (type %s)\", reflect.TypeOf(args[0]))\n\t\t},\n\t\tTypes: types(\n\t\t\tstrings.Join,\n\t\t\tnew(func([]any, string) string),\n\t\t\tnew(func([]any) string),\n\t\t\tnew(func([]string, string) string),\n\t\t\tnew(func([]string) string),\n\t\t),\n\t},\n\t{\n\t\tName: \"indexOf\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\treturn strings.Index(args[0].(string), args[1].(string)), nil\n\t\t},\n\t\tTypes: types(strings.Index),\n\t},\n\t{\n\t\tName: \"lastIndexOf\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\treturn strings.LastIndex(args[0].(string), args[1].(string)), nil\n\t\t},\n\t\tTypes: types(strings.LastIndex),\n\t},\n\t{\n\t\tName: \"hasPrefix\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\treturn strings.HasPrefix(args[0].(string), args[1].(string)), nil\n\t\t},\n\t\tTypes: types(strings.HasPrefix),\n\t},\n\t{\n\t\tName: \"hasSuffix\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\treturn strings.HasSuffix(args[0].(string), args[1].(string)), nil\n\t\t},\n\t\tTypes: types(strings.HasSuffix),\n\t},\n\t{\n\t\tName: \"max\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\treturn minMax(\"max\", runtime.Less, 0, args...)\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\treturn validateAggregateFunc(\"max\", args)\n\t\t},\n\t},\n\t{\n\t\tName: \"min\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\treturn minMax(\"min\", runtime.More, 0, args...)\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\treturn validateAggregateFunc(\"min\", args)\n\t\t},\n\t},\n\t{\n\t\tName: \"mean\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tcount, sum, err := mean(0, args...)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif count == 0 {\n\t\t\t\treturn 0.0, nil\n\t\t\t}\n\t\t\treturn sum / float64(count), nil\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\treturn validateAggregateFunc(\"mean\", args)\n\t\t},\n\t},\n\t{\n\t\tName: \"median\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tvalues, err := median(0, args...)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif n := len(values); n > 0 {\n\t\t\t\tsort.Float64s(values)\n\t\t\t\tif n%2 == 1 {\n\t\t\t\t\treturn values[n/2], nil\n\t\t\t\t}\n\t\t\t\treturn (values[n/2-1] + values[n/2]) / 2, nil\n\t\t\t}\n\t\t\treturn 0.0, nil\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\treturn validateAggregateFunc(\"median\", args)\n\t\t},\n\t},\n\t{\n\t\tName: \"toJSON\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tb, err := json.MarshalIndent(args[0], \"\", \"  \")\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn string(b), nil\n\t\t},\n\t\tTypes: types(new(func(any) string)),\n\t},\n\t{\n\t\tName: \"fromJSON\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tvar v any\n\t\t\terr := json.Unmarshal([]byte(args[0].(string)), &v)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn v, nil\n\t\t},\n\t\tTypes: types(new(func(string) any)),\n\t},\n\t{\n\t\tName: \"toBase64\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\treturn base64.StdEncoding.EncodeToString([]byte(args[0].(string))), nil\n\t\t},\n\t\tTypes: types(new(func(string) string)),\n\t},\n\t{\n\t\tName: \"fromBase64\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tb, err := base64.StdEncoding.DecodeString(args[0].(string))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn string(b), nil\n\t\t},\n\t\tTypes: types(new(func(string) string)),\n\t},\n\t{\n\t\tName: \"now\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tif len(args) == 0 {\n\t\t\t\treturn time.Now(), nil\n\t\t\t}\n\t\t\tif len(args) == 1 {\n\t\t\t\tif tz, ok := args[0].(*time.Location); ok {\n\t\t\t\t\treturn time.Now().In(tz), nil\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"invalid number of arguments (expected 0, got %d)\", len(args))\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) == 0 {\n\t\t\t\treturn timeType, nil\n\t\t\t}\n\t\t\tif len(args) == 1 {\n\t\t\t\tif args[0] != nil && args[0].AssignableTo(locationType) {\n\t\t\t\t\treturn timeType, nil\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 0, got %d)\", len(args))\n\t\t},\n\t\tDeref: func(i int, arg reflect.Type) bool {\n\t\t\treturn false\n\t\t},\n\t},\n\t{\n\t\tName: \"duration\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\treturn time.ParseDuration(args[0].(string))\n\t\t},\n\t\tTypes: types(time.ParseDuration),\n\t},\n\t{\n\t\tName: \"date\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\ttz, ok := args[0].(*time.Location)\n\t\t\tif ok {\n\t\t\t\targs = args[1:]\n\t\t\t}\n\n\t\t\tdate := args[0].(string)\n\t\t\tif len(args) == 2 {\n\t\t\t\tlayout := args[1].(string)\n\t\t\t\tif tz != nil {\n\t\t\t\t\treturn time.ParseInLocation(layout, date, tz)\n\t\t\t\t}\n\t\t\t\treturn time.Parse(layout, date)\n\t\t\t}\n\t\t\tif len(args) == 3 {\n\t\t\t\tlayout := args[1].(string)\n\t\t\t\ttimeZone := args[2].(string)\n\t\t\t\ttz, err := time.LoadLocation(timeZone)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"unknown time zone %s\", timeZone)\n\t\t\t\t}\n\t\t\t\tt, err := time.ParseInLocation(layout, date, tz)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn t, nil\n\t\t\t}\n\n\t\t\tlayouts := []string{\n\t\t\t\t\"2006-01-02\",\n\t\t\t\t\"15:04:05\",\n\t\t\t\t\"2006-01-02 15:04:05\",\n\t\t\t\ttime.RFC3339,\n\t\t\t\ttime.RFC822,\n\t\t\t\ttime.RFC850,\n\t\t\t\ttime.RFC1123,\n\t\t\t}\n\t\t\tfor _, layout := range layouts {\n\t\t\t\tif tz == nil {\n\t\t\t\t\tt, err := time.Parse(layout, date)\n\t\t\t\t\tif err == nil {\n\t\t\t\t\t\treturn t, nil\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tt, err := time.ParseInLocation(layout, date, tz)\n\t\t\t\t\tif err == nil {\n\t\t\t\t\t\treturn t, nil\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"invalid date %s\", date)\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) < 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected at least 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tif args[0] != nil && args[0].AssignableTo(locationType) {\n\t\t\t\targs = args[1:]\n\t\t\t}\n\t\t\tif len(args) > 3 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected at most 3, got %d)\", len(args))\n\t\t\t}\n\t\t\treturn timeType, nil\n\t\t},\n\t\tDeref: func(i int, arg reflect.Type) bool {\n\t\t\tif arg.AssignableTo(locationType) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\t},\n\t{\n\t\tName: \"timezone\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\ttz, err := time.LoadLocation(args[0].(string))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn tz, nil\n\t\t},\n\t\tTypes: types(time.LoadLocation),\n\t},\n\t{\n\t\tName: \"first\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tdefer func() {\n\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}()\n\t\t\treturn runtime.Fetch(args[0], 0), nil\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tswitch kind(args[0]) {\n\t\t\tcase reflect.Interface:\n\t\t\t\treturn anyType, nil\n\t\t\tcase reflect.Slice, reflect.Array:\n\t\t\t\treturn args[0].Elem(), nil\n\t\t\t}\n\t\t\treturn anyType, fmt.Errorf(\"cannot get first element from %s\", args[0])\n\t\t},\n\t},\n\t{\n\t\tName: \"last\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tdefer func() {\n\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}()\n\t\t\treturn runtime.Fetch(args[0], -1), nil\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tswitch kind(args[0]) {\n\t\t\tcase reflect.Interface:\n\t\t\t\treturn anyType, nil\n\t\t\tcase reflect.Slice, reflect.Array:\n\t\t\t\treturn args[0].Elem(), nil\n\t\t\t}\n\t\t\treturn anyType, fmt.Errorf(\"cannot get last element from %s\", args[0])\n\t\t},\n\t},\n\t{\n\t\tName: \"get\",\n\t\tFunc: get,\n\t},\n\t{\n\t\tName: \"take\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tif len(args) != 2 {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid number of arguments (expected 2, got %d)\", len(args))\n\t\t\t}\n\t\t\tv := reflect.ValueOf(args[0])\n\t\t\tif v.Kind() != reflect.Slice && v.Kind() != reflect.Array {\n\t\t\t\treturn nil, fmt.Errorf(\"cannot take from %s\", v.Kind())\n\t\t\t}\n\t\t\tn := reflect.ValueOf(args[1])\n\t\t\tif !n.CanInt() {\n\t\t\t\treturn nil, fmt.Errorf(\"cannot take %s elements\", n.Kind())\n\t\t\t}\n\t\t\tto := 0\n\t\t\tif n.Int() > int64(v.Len()) {\n\t\t\t\tto = v.Len()\n\t\t\t} else {\n\t\t\t\tto = int(n.Int())\n\t\t\t}\n\t\t\treturn v.Slice(0, to).Interface(), nil\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 2 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 2, got %d)\", len(args))\n\t\t\t}\n\t\t\tswitch kind(args[0]) {\n\t\t\tcase reflect.Interface, reflect.Slice, reflect.Array:\n\t\t\tdefault:\n\t\t\t\treturn anyType, fmt.Errorf(\"cannot take from %s\", args[0])\n\t\t\t}\n\t\t\tswitch kind(args[1]) {\n\t\t\tcase reflect.Interface, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\t\tdefault:\n\t\t\t\treturn anyType, fmt.Errorf(\"cannot take %s elements\", args[1])\n\t\t\t}\n\t\t\treturn args[0], nil\n\t\t},\n\t},\n\t{\n\t\tName: \"keys\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tv := reflect.ValueOf(args[0])\n\t\t\tif v.Kind() != reflect.Map {\n\t\t\t\treturn nil, fmt.Errorf(\"cannot get keys from %s\", v.Kind())\n\t\t\t}\n\t\t\tkeys := v.MapKeys()\n\t\t\tout := make([]any, len(keys))\n\t\t\tfor i, key := range keys {\n\t\t\t\tout[i] = key.Interface()\n\t\t\t}\n\t\t\treturn out, nil\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tswitch kind(args[0]) {\n\t\t\tcase reflect.Interface:\n\t\t\t\treturn arrayType, nil\n\t\t\tcase reflect.Map:\n\t\t\t\treturn arrayType, nil\n\t\t\t}\n\t\t\treturn anyType, fmt.Errorf(\"cannot get keys from %s\", args[0])\n\t\t},\n\t},\n\t{\n\t\tName: \"values\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tv := reflect.ValueOf(args[0])\n\t\t\tif v.Kind() != reflect.Map {\n\t\t\t\treturn nil, fmt.Errorf(\"cannot get values from %s\", v.Kind())\n\t\t\t}\n\t\t\tkeys := v.MapKeys()\n\t\t\tout := make([]any, len(keys))\n\t\t\tfor i, key := range keys {\n\t\t\t\tout[i] = v.MapIndex(key).Interface()\n\t\t\t}\n\t\t\treturn out, nil\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tswitch kind(args[0]) {\n\t\t\tcase reflect.Interface:\n\t\t\t\treturn arrayType, nil\n\t\t\tcase reflect.Map:\n\t\t\t\treturn arrayType, nil\n\t\t\t}\n\t\t\treturn anyType, fmt.Errorf(\"cannot get values from %s\", args[0])\n\t\t},\n\t},\n\t{\n\t\tName: \"toPairs\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tv := reflect.ValueOf(args[0])\n\t\t\tif v.Kind() != reflect.Map {\n\t\t\t\treturn nil, fmt.Errorf(\"cannot transform %s to pairs\", v.Kind())\n\t\t\t}\n\t\t\tkeys := v.MapKeys()\n\t\t\tout := make([][2]any, len(keys))\n\t\t\tfor i, key := range keys {\n\t\t\t\tout[i] = [2]any{key.Interface(), v.MapIndex(key).Interface()}\n\t\t\t}\n\t\t\treturn out, nil\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tswitch kind(args[0]) {\n\t\t\tcase reflect.Interface, reflect.Map:\n\t\t\t\treturn arrayType, nil\n\t\t\t}\n\t\t\treturn anyType, fmt.Errorf(\"cannot transform %s to pairs\", args[0])\n\t\t},\n\t},\n\t{\n\t\tName: \"fromPairs\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tv := reflect.ValueOf(args[0])\n\t\t\tif v.Kind() != reflect.Slice && v.Kind() != reflect.Array {\n\t\t\t\treturn nil, fmt.Errorf(\"cannot transform %s from pairs\", v)\n\t\t\t}\n\t\t\tout := reflect.MakeMap(mapType)\n\t\t\tfor i := 0; i < v.Len(); i++ {\n\t\t\t\tpair := deref.Value(v.Index(i))\n\t\t\t\tif pair.Kind() != reflect.Array && pair.Kind() != reflect.Slice {\n\t\t\t\t\treturn nil, fmt.Errorf(\"invalid pair %v\", pair)\n\t\t\t\t}\n\t\t\t\tif pair.Len() != 2 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"invalid pair length %v\", pair)\n\t\t\t\t}\n\t\t\t\tkey := pair.Index(0)\n\t\t\t\tvalue := pair.Index(1)\n\t\t\t\tout.SetMapIndex(key, value)\n\t\t\t}\n\t\t\treturn out.Interface(), nil\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tswitch kind(args[0]) {\n\t\t\tcase reflect.Interface, reflect.Slice, reflect.Array:\n\t\t\t\treturn mapType, nil\n\t\t\t}\n\t\t\treturn anyType, fmt.Errorf(\"cannot transform %s from pairs\", args[0])\n\t\t},\n\t},\n\t{\n\t\tName: \"reverse\",\n\t\tSafe: func(args ...any) (any, uint, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn nil, 0, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\n\t\t\tv := reflect.ValueOf(args[0])\n\t\t\tif v.Kind() != reflect.Slice && v.Kind() != reflect.Array {\n\t\t\t\treturn nil, 0, fmt.Errorf(\"cannot reverse %s\", v.Kind())\n\t\t\t}\n\n\t\t\tsize := v.Len()\n\t\t\tarr := make([]any, size)\n\n\t\t\tfor i := 0; i < size; i++ {\n\t\t\t\tarr[i] = v.Index(size - i - 1).Interface()\n\t\t\t}\n\n\t\t\treturn arr, uint(size), nil\n\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tswitch kind(args[0]) {\n\t\t\tcase reflect.Interface, reflect.Slice, reflect.Array:\n\t\t\t\treturn arrayType, nil\n\t\t\tdefault:\n\t\t\t\treturn anyType, fmt.Errorf(\"cannot reverse %s\", args[0])\n\t\t\t}\n\t\t},\n\t},\n\n\t{\n\t\tName: \"uniq\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\n\t\t\tv := reflect.ValueOf(args[0])\n\t\t\tif v.Kind() != reflect.Array && v.Kind() != reflect.Slice {\n\t\t\t\treturn nil, fmt.Errorf(\"cannot uniq %s\", v.Kind())\n\t\t\t}\n\n\t\t\tsize := v.Len()\n\t\t\tret := []any{}\n\n\t\t\teq := func(i int) bool {\n\t\t\t\tfor _, r := range ret {\n\t\t\t\t\tif runtime.Equal(v.Index(i).Interface(), r) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tfor i := 0; i < size; i += 1 {\n\t\t\t\tif eq(i) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tret = append(ret, v.Index(i).Interface())\n\t\t\t}\n\n\t\t\treturn ret, nil\n\t\t},\n\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\n\t\t\tswitch kind(args[0]) {\n\t\t\tcase reflect.Interface, reflect.Slice, reflect.Array:\n\t\t\t\treturn arrayType, nil\n\t\t\tdefault:\n\t\t\t\treturn anyType, fmt.Errorf(\"cannot uniq %s\", args[0])\n\t\t\t}\n\t\t},\n\t},\n\n\t{\n\t\tName: \"concat\",\n\t\tSafe: func(args ...any) (any, uint, error) {\n\t\t\tif len(args) == 0 {\n\t\t\t\treturn nil, 0, fmt.Errorf(\"invalid number of arguments (expected at least 1, got 0)\")\n\t\t\t}\n\n\t\t\tvar size uint\n\t\t\tvar arr []any\n\n\t\t\tfor _, arg := range args {\n\t\t\t\tv := reflect.ValueOf(arg)\n\n\t\t\t\tif v.Kind() != reflect.Slice && v.Kind() != reflect.Array {\n\t\t\t\t\treturn nil, 0, fmt.Errorf(\"cannot concat %s\", v.Kind())\n\t\t\t\t}\n\n\t\t\t\tsize += uint(v.Len())\n\n\t\t\t\tfor i := 0; i < v.Len(); i++ {\n\t\t\t\t\titem := v.Index(i)\n\t\t\t\t\tarr = append(arr, item.Interface())\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn arr, size, nil\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) == 0 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected at least 1, got 0)\")\n\t\t\t}\n\n\t\t\tfor _, arg := range args {\n\t\t\t\tswitch kind(arg) {\n\t\t\t\tcase reflect.Interface, reflect.Slice, reflect.Array:\n\t\t\t\tdefault:\n\t\t\t\t\treturn anyType, fmt.Errorf(\"cannot concat %s\", arg)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn arrayType, nil\n\t\t},\n\t},\n\t{\n\t\tName: \"flatten\",\n\t\tSafe: func(args ...any) (any, uint, error) {\n\t\t\tvar size uint\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn nil, 0, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tv := reflect.ValueOf(args[0])\n\t\t\tif v.Kind() != reflect.Array && v.Kind() != reflect.Slice {\n\t\t\t\treturn nil, size, fmt.Errorf(\"cannot flatten %s\", v.Kind())\n\t\t\t}\n\t\t\tret, err := flatten(v, 0)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, 0, err\n\t\t\t}\n\t\t\tsize = uint(len(ret))\n\t\t\treturn ret, size, nil\n\t\t},\n\t\tValidate: func(args []reflect.Type) (reflect.Type, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t\t\t}\n\n\t\t\tfor _, arg := range args {\n\t\t\t\tswitch kind(arg) {\n\t\t\t\tcase reflect.Interface, reflect.Slice, reflect.Array:\n\t\t\t\tdefault:\n\t\t\t\t\treturn anyType, fmt.Errorf(\"cannot flatten %s\", arg)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn arrayType, nil\n\t\t},\n\t},\n\t{\n\t\tName: \"sort\",\n\t\tSafe: func(args ...any) (any, uint, error) {\n\t\t\tif len(args) != 1 && len(args) != 2 {\n\t\t\t\treturn nil, 0, fmt.Errorf(\"invalid number of arguments (expected 1 or 2, got %d)\", len(args))\n\t\t\t}\n\n\t\t\tvar array []any\n\n\t\t\tswitch in := args[0].(type) {\n\t\t\tcase []any:\n\t\t\t\tarray = make([]any, len(in))\n\t\t\t\tcopy(array, in)\n\t\t\tcase []int:\n\t\t\t\tarray = make([]any, len(in))\n\t\t\t\tfor i, v := range in {\n\t\t\t\t\tarray[i] = v\n\t\t\t\t}\n\t\t\tcase []float64:\n\t\t\t\tarray = make([]any, len(in))\n\t\t\t\tfor i, v := range in {\n\t\t\t\t\tarray[i] = v\n\t\t\t\t}\n\t\t\tcase []string:\n\t\t\t\tarray = make([]any, len(in))\n\t\t\t\tfor i, v := range in {\n\t\t\t\t\tarray[i] = v\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar desc bool\n\t\t\tif len(args) == 2 {\n\t\t\t\torder, ok := args[1].(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn nil, 0, fmt.Errorf(\"sort order argument must be a string (got %T)\", args[1])\n\t\t\t\t}\n\t\t\t\tswitch order {\n\t\t\t\tcase \"asc\":\n\t\t\t\t\tdesc = false\n\t\t\t\tcase \"desc\":\n\t\t\t\t\tdesc = true\n\t\t\t\tdefault:\n\t\t\t\t\treturn nil, 0, fmt.Errorf(\"invalid order %s, expected asc or desc\", order)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsortable := &runtime.Sort{\n\t\t\t\tDesc:  desc,\n\t\t\t\tArray: array,\n\t\t\t}\n\t\t\tsort.Sort(sortable)\n\n\t\t\treturn sortable.Array, uint(len(array)), nil\n\t\t},\n\t\tTypes: types(\n\t\t\tnew(func([]any, string) []any),\n\t\t\tnew(func([]int, string) []any),\n\t\t\tnew(func([]float64, string) []any),\n\t\t\tnew(func([]string, string) []any),\n\n\t\t\tnew(func([]any) []any),\n\t\t\tnew(func([]float64) []any),\n\t\t\tnew(func([]string) []any),\n\t\t\tnew(func([]int) []any),\n\t\t),\n\t},\n\tbitFunc(\"bitand\", func(x, y int) (any, error) {\n\t\treturn x & y, nil\n\t}),\n\tbitFunc(\"bitor\", func(x, y int) (any, error) {\n\t\treturn x | y, nil\n\t}),\n\tbitFunc(\"bitxor\", func(x, y int) (any, error) {\n\t\treturn x ^ y, nil\n\t}),\n\tbitFunc(\"bitnand\", func(x, y int) (any, error) {\n\t\treturn x &^ y, nil\n\t}),\n\tbitFunc(\"bitshl\", func(x, y int) (any, error) {\n\t\tif y < 0 {\n\t\t\treturn nil, fmt.Errorf(\"invalid operation: negative shift count %d (type int)\", y)\n\t\t}\n\t\treturn x << y, nil\n\t}),\n\tbitFunc(\"bitshr\", func(x, y int) (any, error) {\n\t\tif y < 0 {\n\t\t\treturn nil, fmt.Errorf(\"invalid operation: negative shift count %d (type int)\", y)\n\t\t}\n\t\treturn x >> y, nil\n\t}),\n\tbitFunc(\"bitushr\", func(x, y int) (any, error) {\n\t\tif y < 0 {\n\t\t\treturn nil, fmt.Errorf(\"invalid operation: negative shift count %d (type int)\", y)\n\t\t}\n\t\treturn int(uint(x) >> y), nil\n\t}),\n\t{\n\t\tName: \"bitnot\",\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tif len(args) != 1 {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid number of arguments for bitnot (expected 1, got %d)\", len(args))\n\t\t\t}\n\t\t\tx, err := toInt(args[0])\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"%v to call bitnot\", err)\n\t\t\t}\n\t\t\treturn ^x, nil\n\t\t},\n\t\tTypes: types(new(func(int) int)),\n\t},\n}\n"
  },
  {
    "path": "builtin/builtin_test.go",
    "content": "package builtin_test\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/builtin\"\n\t\"github.com/expr-lang/expr/checker\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/parser\"\n\t\"github.com/expr-lang/expr/test/mock\"\n)\n\nfunc TestBuiltin(t *testing.T) {\n\tArrayWithNil := []any{42}\n\tenv := map[string]any{\n\t\t\"ArrayOfString\":    []string{\"foo\", \"bar\", \"baz\"},\n\t\t\"ArrayOfInt\":       []int{1, 2, 3},\n\t\t\"ArrayOfFloat\":     []float64{1.5, 2.5, 3.5},\n\t\t\"ArrayOfInt32\":     []int32{1, 2, 3},\n\t\t\"ArrayOfAny\":       []any{1, \"2\", true},\n\t\t\"ArrayOfFoo\":       []mock.Foo{{Value: \"a\"}, {Value: \"b\"}, {Value: \"c\"}},\n\t\t\"PtrArrayWithNil\":  &ArrayWithNil,\n\t\t\"EmptyIntArray\":    []int{},\n\t\t\"EmptyFloatArray\":  []float64{},\n\t\t\"NestedIntArrays\":  []any{[]int{1, 2}, []int{3, 4}},\n\t\t\"NestedAnyArrays\":  []any{[]any{1, 2}, []any{3, 4}},\n\t\t\"MixedNestedArray\": []any{1, []int{2, 3}, []float64{4.0, 5.0}},\n\t\t\"NestedInt32Array\": []any{[]int32{1, 2}, []int32{3, 4}},\n\t}\n\n\tvar tests = []struct {\n\t\tinput string\n\t\twant  any\n\t}{\n\t\t{`len(1..10)`, 10},\n\t\t{`len({foo: 1, bar: 2})`, 2},\n\t\t{`len(\"hello\")`, 5},\n\t\t{`abs(-5)`, 5},\n\t\t{`abs(.5)`, .5},\n\t\t{`abs(-.5)`, .5},\n\t\t{`ceil(5.5)`, 6.0},\n\t\t{`ceil(5)`, 5.0},\n\t\t{`floor(5.5)`, 5.0},\n\t\t{`floor(5)`, 5.0},\n\t\t{`round(5.5)`, 6.0},\n\t\t{`round(5)`, 5.0},\n\t\t{`round(5.49)`, 5.0},\n\t\t{`int(5.5)`, 5},\n\t\t{`int(5)`, 5},\n\t\t{`int(\"5\")`, 5},\n\t\t{`float(5)`, 5.0},\n\t\t{`float(5.5)`, 5.5},\n\t\t{`float(\"5.5\")`, 5.5},\n\t\t{`string(5)`, \"5\"},\n\t\t{`string(5.5)`, \"5.5\"},\n\t\t{`string(\"5.5\")`, \"5.5\"},\n\t\t{`trim(\"  foo  \")`, \"foo\"},\n\t\t{`trim(\"__foo___\", \"_\")`, \"foo\"},\n\t\t{`trimPrefix(\"prefix_foo\", \"prefix_\")`, \"foo\"},\n\t\t{`trimSuffix(\"foo_suffix\", \"_suffix\")`, \"foo\"},\n\t\t{`upper(\"foo\")`, \"FOO\"},\n\t\t{`lower(\"FOO\")`, \"foo\"},\n\t\t{`split(\"foo,bar,baz\", \",\")`, []string{\"foo\", \"bar\", \"baz\"}},\n\t\t{`split(\"foo,bar,baz\", \",\", 2)`, []string{\"foo\", \"bar,baz\"}},\n\t\t{`splitAfter(\"foo,bar,baz\", \",\")`, []string{\"foo,\", \"bar,\", \"baz\"}},\n\t\t{`splitAfter(\"foo,bar,baz\", \",\", 2)`, []string{\"foo,\", \"bar,baz\"}},\n\t\t{`replace(\"foo,bar,baz\", \",\", \";\")`, \"foo;bar;baz\"},\n\t\t{`replace(\"foo,bar,baz,goo\", \",\", \";\", 2)`, \"foo;bar;baz,goo\"},\n\t\t{`repeat(\"foo\", 3)`, \"foofoofoo\"},\n\t\t{`join(ArrayOfString, \",\")`, \"foo,bar,baz\"},\n\t\t{`join(ArrayOfString)`, \"foobarbaz\"},\n\t\t{`join([\"foo\", \"bar\", \"baz\"], \",\")`, \"foo,bar,baz\"},\n\t\t{`join([\"foo\", \"bar\", \"baz\"])`, \"foobarbaz\"},\n\t\t{`indexOf(\"foo,bar,baz\", \",\")`, 3},\n\t\t{`lastIndexOf(\"foo,bar,baz\", \",\")`, 7},\n\t\t{`hasPrefix(\"foo,bar,baz\", \"foo\")`, true},\n\t\t{`hasSuffix(\"foo,bar,baz\", \"baz\")`, true},\n\t\t{`max(1, 2, 3)`, 3},\n\t\t{`max(1.5, 2.5, 3.5)`, 3.5},\n\t\t{`max([1, 2, 3])`, 3},\n\t\t{`max([1.5, 2.5, 3.5])`, 3.5},\n\t\t{`max([1, 2, 4, 10], 20, [29, 23, -19])`, 29},\n\t\t{`min([1, 2, 4, 10], 20, [29, 23, -19])`, -19},\n\t\t{`min(1, 2, 3)`, 1},\n\t\t{`min(1.5, 2.5, 3.5)`, 1.5},\n\t\t{`min([1, 2, 3])`, 1},\n\t\t{`min([1.5, 2.5, 3.5])`, 1.5},\n\t\t{`min(-1, [1.5, 2.5, 3.5])`, -1},\n\t\t{`max(ArrayOfInt)`, 3},\n\t\t{`min(ArrayOfInt)`, 1},\n\t\t{`max(ArrayOfFloat)`, 3.5},\n\t\t{`min(ArrayOfFloat)`, 1.5},\n\t\t{`max(EmptyIntArray, 5)`, 5},\n\t\t{`min(EmptyFloatArray, 5)`, 5},\n\t\t{`max(NestedIntArrays)`, 4},\n\t\t{`min(NestedIntArrays)`, 1},\n\t\t{`max(NestedAnyArrays)`, 4},\n\t\t{`min(NestedAnyArrays)`, 1},\n\t\t{`max(MixedNestedArray)`, 5.0},\n\t\t{`min(MixedNestedArray)`, 1},\n\t\t{`max(ArrayOfInt32)`, int32(3)},\n\t\t{`min(ArrayOfInt32)`, int32(1)},\n\t\t{`max(NestedInt32Array)`, int32(4)},\n\t\t{`min(NestedInt32Array)`, int32(1)},\n\t\t{`sum(1..9)`, 45},\n\t\t{`sum([.5, 1.5, 2.5])`, 4.5},\n\t\t{`sum([])`, 0},\n\t\t{`sum([1, 2, 3.0, 4])`, 10.0},\n\t\t{`mean(1..9)`, 5.0},\n\t\t{`mean([.5, 1.5, 2.5])`, 1.5},\n\t\t{`mean([])`, 0.0},\n\t\t{`mean([1, 2, 3.0, 4])`, 2.5},\n\t\t{`mean(10, [1, 2, 3], 1..9)`, 4.6923076923076925},\n\t\t{`mean(-10, [1, 2, 3, 4])`, 0.0},\n\t\t{`mean(10.9, 1..9)`, 5.59},\n\t\t{`mean(ArrayOfInt)`, 2.0},\n\t\t{`mean(ArrayOfFloat)`, 2.5},\n\t\t{`mean(NestedIntArrays)`, 2.5},\n\t\t{`mean(NestedAnyArrays)`, 2.5},\n\t\t{`mean(MixedNestedArray)`, 3.0},\n\t\t{`mean(ArrayOfInt32)`, 2.0},\n\t\t{`mean(NestedInt32Array)`, 2.5},\n\t\t{`median(1..9)`, 5.0},\n\t\t{`median([.5, 1.5, 2.5])`, 1.5},\n\t\t{`median([])`, 0.0},\n\t\t{`median([1, 2, 3])`, 2.0},\n\t\t{`median([1, 2, 3, 4])`, 2.5},\n\t\t{`median(10, [1, 2, 3], 1..9)`, 4.0},\n\t\t{`median(-10, [1, 2, 3, 4])`, 2.0},\n\t\t{`median(1..5, 4.9)`, 3.5},\n\t\t{`median(ArrayOfInt)`, 2.0},\n\t\t{`median(ArrayOfFloat)`, 2.5},\n\t\t{`median(NestedIntArrays)`, 2.5},\n\t\t{`median(NestedAnyArrays)`, 2.5},\n\t\t{`median(MixedNestedArray)`, 3.0},\n\t\t{`median(ArrayOfInt32)`, 2.0},\n\t\t{`median(NestedInt32Array)`, 2.5},\n\t\t{`toJSON({foo: 1, bar: 2})`, \"{\\n  \\\"bar\\\": 2,\\n  \\\"foo\\\": 1\\n}\"},\n\t\t{`fromJSON(\"[1, 2, 3]\")`, []any{1.0, 2.0, 3.0}},\n\t\t{`toBase64(\"hello\")`, \"aGVsbG8=\"},\n\t\t{`fromBase64(\"aGVsbG8=\")`, \"hello\"},\n\t\t{`now().Format(\"2006-01-02T15:04Z\")`, time.Now().Format(\"2006-01-02T15:04Z\")},\n\t\t{`duration(\"1h\")`, time.Hour},\n\t\t{`date(\"2006-01-02T15:04:05Z\")`, time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC)},\n\t\t{`date(\"2006.01.02\", \"2006.01.02\")`, time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC)},\n\t\t{`date(\"2023-04-23T00:30:00.000+0100\", \"2006-01-02T15:04:05-0700\", \"America/Chicago\").Format(\"2006-01-02\")`, \"2023-04-23\"},\n\t\t{`date(\"2023-04-23T00:30:00\", \"2006-01-02T15:04:05\", \"America/Chicago\").Format(\"2006-01-02\")`, \"2023-04-23\"},\n\t\t{`date(\"2023-04-23\", \"2006-01-02\", \"America/Chicago\").Format(\"2006-01-02\")`, \"2023-04-23\"},\n\t\t{`timezone(\"UTC\").String()`, \"UTC\"},\n\t\t{`timezone(\"Europe/Moscow\").String()`, \"Europe/Moscow\"},\n\t\t{`first(ArrayOfString)`, \"foo\"},\n\t\t{`first(ArrayOfInt)`, 1},\n\t\t{`first(ArrayOfAny)`, 1},\n\t\t{`first([])`, nil},\n\t\t{`last(ArrayOfString)`, \"baz\"},\n\t\t{`last(ArrayOfInt)`, 3},\n\t\t{`last(ArrayOfAny)`, true},\n\t\t{`last([])`, nil},\n\t\t{`get(ArrayOfString, 1)`, \"bar\"},\n\t\t{`get(ArrayOfString, 99)`, nil},\n\t\t{`get(ArrayOfInt, 1)`, 2},\n\t\t{`get(ArrayOfInt, -1)`, 3},\n\t\t{`get(ArrayOfAny, 1)`, \"2\"},\n\t\t{`get({foo: 1, bar: 2}, \"foo\")`, 1},\n\t\t{`get({foo: 1, bar: 2}, \"unknown\")`, nil},\n\t\t{`take(ArrayOfString, 2)`, []string{\"foo\", \"bar\"}},\n\t\t{`take(ArrayOfString, 99)`, []string{\"foo\", \"bar\", \"baz\"}},\n\t\t{`\"foo\" in keys({foo: 1, bar: 2})`, true},\n\t\t{`1 in values({foo: 1, bar: 2})`, true},\n\t\t{`len(toPairs({foo: 1, bar: 2}))`, 2},\n\t\t{`len(toPairs({}))`, 0},\n\t\t{`fromPairs([[\"foo\", 1], [\"bar\", 2]])`, map[any]any{\"foo\": 1, \"bar\": 2}},\n\t\t{`fromPairs(toPairs({foo: 1, bar: 2}))`, map[any]any{\"foo\": 1, \"bar\": 2}},\n\t\t{`groupBy(1..9, # % 2)`, map[any][]any{0: {2, 4, 6, 8}, 1: {1, 3, 5, 7, 9}}},\n\t\t{`groupBy(1..9, # % 2)[0]`, []any{2, 4, 6, 8}},\n\t\t{`groupBy(1..3, # > 1)[true]`, []any{2, 3}},\n\t\t{`groupBy(1..3, # > 1 ? nil : \"\")[nil]`, []any{2, 3}},\n\t\t{`groupBy(ArrayOfFoo, .Value).a`, []any{mock.Foo{Value: \"a\"}}},\n\t\t{`reduce(1..9, # + #acc, 0)`, 45},\n\t\t{`reduce(1..9, # + #acc)`, 45},\n\t\t{`reduce([.5, 1.5, 2.5], # + #acc, 0)`, 4.5},\n\t\t{`reduce([], 5, 0)`, 0},\n\t\t{`reduce(10..1, # + #acc, 100)`, 100},\n\t\t{`reduce([], # + #acc, 42)`, 42},\n\t\t{`concat(ArrayOfString, ArrayOfInt)`, []any{\"foo\", \"bar\", \"baz\", 1, 2, 3}},\n\t\t{`concat(PtrArrayWithNil, [nil])`, []any{42, nil}},\n\t\t{`flatten([[\"a\", \"b\"], [1, 2]])`, []any{\"a\", \"b\", 1, 2}},\n\t\t{`flatten([[\"a\", \"b\"], [1, 2, [3, 4]]])`, []any{\"a\", \"b\", 1, 2, 3, 4}},\n\t\t{`flatten([[\"a\", \"b\"], [1, 2, [3, [[[[\"c\", \"d\"], \"e\"]]], 4]]])`, []any{\"a\", \"b\", 1, 2, 3, \"c\", \"d\", \"e\", 4}},\n\t\t{`uniq([1, 15, \"a\", 2, 3, 5, 2, \"a\", 2, \"b\"])`, []any{1, 15, \"a\", 2, 3, 5, \"b\"}},\n\t\t{`uniq([[1, 2], \"a\", 2, 3, [1, 2], [1, 3]])`, []any{[]any{1, 2}, \"a\", 2, 3, []any{1, 3}}},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(test.input, expr.Env(env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tout, err := expr.Run(program, env)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, test.want, out)\n\t\t})\n\t}\n}\n\nfunc TestBuiltin_works_with_any(t *testing.T) {\n\tconfig := map[string]struct {\n\t\tarity int\n\t}{\n\t\t\"now\":    {0},\n\t\t\"get\":    {2},\n\t\t\"take\":   {2},\n\t\t\"sortBy\": {2},\n\t}\n\n\tfor _, b := range builtin.Builtins {\n\t\tif b.Predicate {\n\t\t\tcontinue\n\t\t}\n\t\tt.Run(b.Name, func(t *testing.T) {\n\t\t\tarity := 1\n\t\t\tif c, ok := config[b.Name]; ok {\n\t\t\t\tarity = c.arity\n\t\t\t}\n\t\t\tif len(b.Types) > 0 {\n\t\t\t\tarity = b.Types[0].NumIn()\n\t\t\t}\n\t\t\targs := make([]string, arity)\n\t\t\tfor i := 1; i <= arity; i++ {\n\t\t\t\targs[i-1] = fmt.Sprintf(\"arg%d\", i)\n\t\t\t}\n\t\t\t_, err := expr.Compile(fmt.Sprintf(`%s(%s)`, b.Name, strings.Join(args, \", \"))) // expr.Env(env) is not needed\n\t\t\tassert.NoError(t, err)\n\t\t})\n\t}\n}\n\nfunc TestBuiltin_errors(t *testing.T) {\n\tvar errorTests = []struct {\n\t\tinput string\n\t\terr   string\n\t}{\n\t\t{`len()`, `invalid number of arguments (expected 1, got 0)`},\n\t\t{`len(1)`, `invalid argument for len (type int)`},\n\t\t{`abs()`, `invalid number of arguments (expected 1, got 0)`},\n\t\t{`abs(1, 2)`, `invalid number of arguments (expected 1, got 2)`},\n\t\t{`abs(\"foo\")`, `invalid argument for abs (type string)`},\n\t\t{`int()`, `invalid number of arguments (expected 1, got 0)`},\n\t\t{`int(1, 2)`, `invalid number of arguments (expected 1, got 2)`},\n\t\t{`float()`, `invalid number of arguments (expected 1, got 0)`},\n\t\t{`float(1, 2)`, `invalid number of arguments (expected 1, got 2)`},\n\t\t{`string(1, 2)`, `too many arguments to call string`},\n\t\t{`trim()`, `not enough arguments to call trim`},\n\t\t{`max()`, `not enough arguments to call max`},\n\t\t{`max(1, \"2\")`, `invalid argument for max (type string)`},\n\t\t{`max([1, \"2\"])`, `invalid argument for max (type string)`},\n\t\t{`min()`, `not enough arguments to call min`},\n\t\t{`min(1, \"2\")`, `invalid argument for min (type string)`},\n\t\t{`min([1, \"2\"])`, `invalid argument for min (type string)`},\n\t\t{`median(1..9, \"t\")`, \"invalid argument for median (type string)\"},\n\t\t{`mean(\"s\", 1..9)`, \"invalid argument for mean (type string)\"},\n\t\t{`duration(\"error\")`, `invalid duration`},\n\t\t{`date(\"error\")`, `invalid date`},\n\t\t{`get()`, `invalid number of arguments (expected 2, got 0)`},\n\t\t{`get(1, 2)`, `type int does not support indexing`},\n\t\t{`bitnot(\"1\")`, \"cannot use string as argument (type int) to call bitnot  (1:8)\"},\n\t\t{`bitand(\"1\", 1)`, \"cannot use string as argument (type int) to call bitand  (1:8)\"},\n\t\t{`\"10\" | bitor(1)`, \"cannot use string as argument (type int) to call bitor  (1:1)\"},\n\t\t{`bitshr(\"5\", 1)`, \"cannot use string as argument (type int) to call bitshr  (1:8)\"},\n\t\t{`bitshr(-5, -2)`, \"invalid operation: negative shift count -2 (type int) (1:1)\"},\n\t\t{`bitshl(1, -1)`, \"invalid operation: negative shift count -1 (type int) (1:1)\"},\n\t\t{`bitushr(-5, -2)`, \"invalid operation: negative shift count -2 (type int) (1:1)\"},\n\t\t{`now(nil)`, \"invalid number of arguments (expected 0, got 1)\"},\n\t\t{`date(nil)`, \"interface {} is nil, not string (1:1)\"},\n\t\t{`timezone(nil)`, \"cannot use nil as argument (type string) to call timezone (1:10)\"},\n\t\t{`flatten([1, 2], [3, 4])`, \"invalid number of arguments (expected 1, got 2)\"},\n\t\t{`flatten(1)`, \"cannot flatten int\"},\n\t\t{`fromJSON(\"5e2482\")`, \"cannot unmarshal number\"},\n\t}\n\tfor _, test := range errorTests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(test.input)\n\t\t\tif err != nil {\n\t\t\t\tassert.Error(t, err)\n\t\t\t\tassert.Contains(t, err.Error(), test.err)\n\t\t\t} else {\n\t\t\t\t_, err = expr.Run(program, nil)\n\t\t\t\tassert.Error(t, err)\n\t\t\t\tassert.Contains(t, err.Error(), test.err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBuiltin_env_not_callable(t *testing.T) {\n\tcode := `$env(''matches'i'?t:get().UTC())`\n\tenv := map[string]any{\"t\": 1}\n\n\t_, err := expr.Compile(code, expr.Env(env))\n\trequire.Error(t, err)\n\tassert.Contains(t, err.Error(), \"is not callable\")\n}\n\nfunc TestBuiltin_types(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"num\":           42,\n\t\t\"str\":           \"foo\",\n\t\t\"ArrayOfString\": []string{\"foo\", \"bar\", \"baz\"},\n\t\t\"ArrayOfInt\":    []int{1, 2, 3},\n\t}\n\n\ttests := []struct {\n\t\tinput string\n\t\twant  reflect.Kind\n\t}{\n\t\t{`get(ArrayOfString, 0)`, reflect.String},\n\t\t{`get(ArrayOfInt, 0)`, reflect.Int},\n\t\t{`first(ArrayOfString)`, reflect.String},\n\t\t{`first(ArrayOfInt)`, reflect.Int},\n\t\t{`last(ArrayOfString)`, reflect.String},\n\t\t{`last(ArrayOfInt)`, reflect.Int},\n\t\t{`get($env, 'str')`, reflect.String},\n\t\t{`get($env, 'num')`, reflect.Int},\n\t\t{`get($env, 'ArrayOfString')`, reflect.Slice},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\ttree, err := parser.Parse(test.input)\n\t\t\trequire.NoError(t, err)\n\n\t\t\trtype, err := checker.Check(tree, conf.New(env))\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.True(t, rtype.Kind() == test.want, fmt.Sprintf(\"expected %s, got %s\", test.want, rtype.Kind()))\n\t\t})\n\t}\n}\n\nfunc TestBuiltin_memory_limits(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t}{\n\t\t{`repeat(\"\\xc4<\\xc4\\xc4\\xc4\",10009999990)`},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\ttimeout := make(chan bool, 1)\n\t\t\tgo func() {\n\t\t\t\ttime.Sleep(time.Second)\n\t\t\t\ttimeout <- true\n\t\t\t}()\n\n\t\t\tdone := make(chan bool, 1)\n\t\t\tgo func() {\n\t\t\t\t_, err := expr.Eval(test.input, nil)\n\t\t\t\tassert.Error(t, err)\n\t\t\t\tassert.Contains(t, err.Error(), \"memory budget exceeded\")\n\t\t\t\tdone <- true\n\t\t\t}()\n\n\t\t\tselect {\n\t\t\tcase <-done:\n\t\t\t\t// Success.\n\t\t\tcase <-timeout:\n\t\t\t\tt.Fatal(\"timeout\")\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBuiltin_allow_builtins_override(t *testing.T) {\n\tt.Run(\"via env var\", func(t *testing.T) {\n\t\tfor _, name := range builtin.Names {\n\t\t\tt.Run(name, func(t *testing.T) {\n\t\t\t\tenv := map[string]any{\n\t\t\t\t\tname: \"hello world\",\n\t\t\t\t}\n\t\t\t\tprogram, err := expr.Compile(name, expr.Env(env))\n\t\t\t\trequire.NoError(t, err)\n\n\t\t\t\tout, err := expr.Run(program, env)\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, \"hello world\", out)\n\t\t\t})\n\t\t}\n\t})\n\tt.Run(\"via env func\", func(t *testing.T) {\n\t\tfor _, name := range builtin.Names {\n\t\t\tt.Run(name, func(t *testing.T) {\n\t\t\t\tenv := map[string]any{\n\t\t\t\t\tname: func() int { return 1 },\n\t\t\t\t}\n\t\t\t\tprogram, err := expr.Compile(fmt.Sprintf(\"%s()\", name), expr.Env(env))\n\t\t\t\trequire.NoError(t, err)\n\n\t\t\t\tout, err := expr.Run(program, env)\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, 1, out)\n\t\t\t})\n\t\t}\n\t})\n\tt.Run(\"via expr.Function\", func(t *testing.T) {\n\t\tfor _, name := range builtin.Names {\n\t\t\tt.Run(name, func(t *testing.T) {\n\t\t\t\tfn := expr.Function(name,\n\t\t\t\t\tfunc(params ...any) (any, error) {\n\t\t\t\t\t\treturn 42, nil\n\t\t\t\t\t},\n\t\t\t\t\tnew(func() int),\n\t\t\t\t)\n\t\t\t\tprogram, err := expr.Compile(fmt.Sprintf(\"%s()\", name), fn)\n\t\t\t\trequire.NoError(t, err)\n\n\t\t\t\tout, err := expr.Run(program, nil)\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, 42, out)\n\t\t\t})\n\t\t}\n\t})\n\tt.Run(\"via expr.Function as pipe\", func(t *testing.T) {\n\t\tfor _, name := range builtin.Names {\n\t\t\tt.Run(name, func(t *testing.T) {\n\t\t\t\tfn := expr.Function(name,\n\t\t\t\t\tfunc(params ...any) (any, error) {\n\t\t\t\t\t\treturn 42, nil\n\t\t\t\t\t},\n\t\t\t\t\tnew(func(s string) int),\n\t\t\t\t)\n\t\t\t\tprogram, err := expr.Compile(fmt.Sprintf(\"'str' | %s()\", name), fn)\n\t\t\t\trequire.NoError(t, err)\n\n\t\t\t\tout, err := expr.Run(program, nil)\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, 42, out)\n\t\t\t})\n\t\t}\n\t})\n}\n\nfunc TestBuiltin_override_and_still_accessible(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"len\": func() int { return 42 },\n\t\t\"all\": []int{1, 2, 3},\n\t}\n\n\tprogram, err := expr.Compile(`::all(all, #>0) && len() == 42 && ::len(all) == 3`, expr.Env(env))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\tassert.Equal(t, true, out)\n}\n\nfunc TestBuiltin_DisableBuiltin(t *testing.T) {\n\tt.Run(\"via env\", func(t *testing.T) {\n\t\tfor _, b := range builtin.Builtins {\n\t\t\tif b.Predicate {\n\t\t\t\tcontinue // TODO: allow to disable predicates\n\t\t\t}\n\t\t\tt.Run(b.Name, func(t *testing.T) {\n\t\t\t\tenv := map[string]any{\n\t\t\t\t\tb.Name: func() int { return 42 },\n\t\t\t\t}\n\t\t\t\tprogram, err := expr.Compile(b.Name+\"()\", expr.Env(env), expr.DisableBuiltin(b.Name))\n\t\t\t\trequire.NoError(t, err)\n\n\t\t\t\tout, err := expr.Run(program, env)\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, 42, out)\n\t\t\t})\n\t\t}\n\t})\n\tt.Run(\"via expr.Function\", func(t *testing.T) {\n\t\tfor _, b := range builtin.Builtins {\n\t\t\tif b.Predicate {\n\t\t\t\tcontinue // TODO: allow to disable predicates\n\t\t\t}\n\t\t\tt.Run(b.Name, func(t *testing.T) {\n\t\t\t\tfn := expr.Function(b.Name,\n\t\t\t\t\tfunc(params ...any) (any, error) {\n\t\t\t\t\t\treturn 42, nil\n\t\t\t\t\t},\n\t\t\t\t\tnew(func() int),\n\t\t\t\t)\n\t\t\t\tprogram, err := expr.Compile(b.Name+\"()\", fn, expr.DisableBuiltin(b.Name))\n\t\t\t\trequire.NoError(t, err)\n\n\t\t\t\tout, err := expr.Run(program, nil)\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, 42, out)\n\t\t\t})\n\t\t}\n\t})\n}\n\nfunc TestBuiltin_DisableAllBuiltins(t *testing.T) {\n\t_, err := expr.Compile(`len(\"foo\")`, expr.Env(nil), expr.DisableAllBuiltins())\n\trequire.Error(t, err)\n\tassert.Contains(t, err.Error(), \"unknown name len\")\n}\n\nfunc TestBuiltin_EnableBuiltin(t *testing.T) {\n\tt.Run(\"via env\", func(t *testing.T) {\n\t\tenv := map[string]any{\n\t\t\t\"repeat\": func() string { return \"repeat\" },\n\t\t}\n\t\tprogram, err := expr.Compile(`len(repeat())`, expr.Env(env), expr.DisableAllBuiltins(), expr.EnableBuiltin(\"len\"))\n\t\trequire.NoError(t, err)\n\n\t\tout, err := expr.Run(program, env)\n\t\trequire.NoError(t, err)\n\t\tassert.Equal(t, 6, out)\n\t})\n\tt.Run(\"via expr.Function\", func(t *testing.T) {\n\t\tfn := expr.Function(\"repeat\",\n\t\t\tfunc(params ...any) (any, error) {\n\t\t\t\treturn \"repeat\", nil\n\t\t\t},\n\t\t\tnew(func() string),\n\t\t)\n\t\tprogram, err := expr.Compile(`len(repeat())`, fn, expr.DisableAllBuiltins(), expr.EnableBuiltin(\"len\"))\n\t\trequire.NoError(t, err)\n\n\t\tout, err := expr.Run(program, nil)\n\t\trequire.NoError(t, err)\n\t\tassert.Equal(t, 6, out)\n\t})\n}\n\nfunc TestBuiltin_type(t *testing.T) {\n\ttype Foo struct{}\n\tvar b any = 1\n\tvar a any = &b\n\ttests := []struct {\n\t\tobj  any\n\t\twant string\n\t}{\n\t\t{nil, \"nil\"},\n\t\t{true, \"bool\"},\n\t\t{1, \"int\"},\n\t\t{int8(1), \"int\"},\n\t\t{uint(1), \"uint\"},\n\t\t{1.0, \"float\"},\n\t\t{float32(1.0), \"float\"},\n\t\t{\"string\", \"string\"},\n\t\t{[]string{\"foo\", \"bar\"}, \"array\"},\n\t\t{map[string]any{\"foo\": \"bar\"}, \"map\"},\n\t\t{func() {}, \"func\"},\n\t\t{time.Now(), \"time.Time\"},\n\t\t{time.Second, \"time.Duration\"},\n\t\t{Foo{}, \"github.com/expr-lang/expr/builtin_test.Foo\"},\n\t\t{struct{}{}, \"struct\"},\n\t\t{a, \"int\"},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.want, func(t *testing.T) {\n\t\t\tenv := map[string]any{\n\t\t\t\t\"obj\": test.obj,\n\t\t\t}\n\t\t\tprogram, err := expr.Compile(`type(obj)`, expr.Env(env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tout, err := expr.Run(program, env)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, test.want, out)\n\t\t})\n\t}\n}\n\nfunc TestBuiltin_reverse(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"ArrayOfString\": []string{\"foo\", \"bar\", \"baz\"},\n\t\t\"ArrayOfInt\":    []int{2, 1, 3},\n\t\t\"ArrayOfFloat\":  []float64{3.0, 2.0, 1.0},\n\t\t\"ArrayOfFoo\":    []mock.Foo{{Value: \"c\"}, {Value: \"a\"}, {Value: \"b\"}},\n\t}\n\ttests := []struct {\n\t\tinput string\n\t\twant  any\n\t}{\n\t\t{`reverse([])`, []any{}},\n\t\t{`reverse(ArrayOfInt)`, []any{3, 1, 2}},\n\t\t{`reverse(ArrayOfFloat)`, []any{1.0, 2.0, 3.0}},\n\t\t{`reverse(ArrayOfFoo)`, []any{mock.Foo{Value: \"b\"}, mock.Foo{Value: \"a\"}, mock.Foo{Value: \"c\"}}},\n\t\t{`reverse([[1,2], [2,2]])`, []any{[]any{2, 2}, []any{1, 2}}},\n\t\t{`reverse(reverse([[1,2], [2,2]]))`, []any{[]any{1, 2}, []any{2, 2}}},\n\t\t{`reverse([{\"test\": true}, {id:4}, {name: \"value\"}])`, []any{map[string]any{\"name\": \"value\"}, map[string]any{\"id\": 4}, map[string]any{\"test\": true}}},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(test.input, expr.Env(env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tout, err := expr.Run(program, env)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, test.want, out)\n\t\t})\n\t}\n}\n\nfunc TestBuiltin_sort(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"ArrayOfString\": []string{\"foo\", \"bar\", \"baz\"},\n\t\t\"ArrayOfInt\":    []int{3, 2, 1},\n\t\t\"ArrayOfFloat\":  []float64{3.0, 2.0, 1.0},\n\t\t\"ArrayOfFoo\":    []mock.Foo{{Value: \"c\"}, {Value: \"a\"}, {Value: \"b\"}},\n\t}\n\ttests := []struct {\n\t\tinput string\n\t\twant  any\n\t}{\n\t\t{`sort([])`, []any{}},\n\t\t{`sort(ArrayOfInt)`, []any{1, 2, 3}},\n\t\t{`sort(ArrayOfFloat)`, []any{1.0, 2.0, 3.0}},\n\t\t{`sort(ArrayOfInt, 'desc')`, []any{3, 2, 1}},\n\t\t{`sortBy(ArrayOfFoo, .Value)`, []any{mock.Foo{Value: \"a\"}, mock.Foo{Value: \"b\"}, mock.Foo{Value: \"c\"}}},\n\t\t{`sortBy([{id: \"a\"}, {id: \"b\"}], .id, \"desc\")`, []any{map[string]any{\"id\": \"b\"}, map[string]any{\"id\": \"a\"}}},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(test.input, expr.Env(env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tout, err := expr.Run(program, env)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, test.want, out)\n\t\t})\n\t}\n}\n\nfunc TestBuiltin_sort_i64(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"array\": []int{1, 2, 3},\n\t\t\"i64\":   int64(1),\n\t}\n\n\tprogram, err := expr.Compile(`sort(map(array, i64))`, expr.Env(env))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []any{int64(1), int64(1), int64(1)}, out)\n}\n\nfunc TestBuiltin_bitOpsFunc(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\twant  int\n\t}{\n\t\t{`bitnot(156)`, -157},\n\t\t{`bitand(bitnot(156), 255)`, 99},\n\t\t{`bitor(987, -123)`, -33},\n\t\t{`bitxor(15, 32)`, 47},\n\t\t{`bitshl(39, 3)`, 312},\n\t\t{`bitshr(5, 1)`, 2},\n\t\t{`bitushr(-5, 2)`, 4611686018427387902},\n\t\t{`bitnand(35, 9)`, 34},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(test.input, expr.Env(nil))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tout, err := expr.Run(program, nil)\n\t\t\tfmt.Printf(\"%v : %v\", test.input, out)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, test.want, out)\n\t\t})\n\t}\n}\n\ntype customInt int\n\nfunc Test_int_unwraps_underlying_value(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"customInt\": customInt(42),\n\t}\n\tprogram, err := expr.Compile(`int(customInt) == 42`, expr.Env(env))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\tassert.Equal(t, true, out)\n}\n\nfunc TestBuiltin_with_deref(t *testing.T) {\n\tx := 42\n\tarr := []int{1, 2, 3}\n\tarrStr := []string{\"1\", \"2\", \"3\"}\n\tm := map[string]any{\"a\": 1, \"b\": 2}\n\tjsonString := `[\"1\"]`\n\tstr := \"1,2,3\"\n\tenv := map[string]any{\n\t\t\"x\":      &x,\n\t\t\"arr\":    &arr,\n\t\t\"arrStr\": &arrStr,\n\t\t\"m\":      &m,\n\t\t\"json\":   &jsonString,\n\t\t\"str\":    &str,\n\t}\n\n\ttests := []struct {\n\t\tinput string\n\t\twant  any\n\t}{\n\t\t{`all(arr, # > 0)`, true},\n\t\t{`none(arr, # < 0)`, true},\n\t\t{`any(arr, # > 0)`, true},\n\t\t{`one(arr, # > 2)`, true},\n\t\t{`filter(arr, # > 0)`, []any{1, 2, 3}},\n\t\t{`map(arr, # * #)`, []any{1, 4, 9}},\n\t\t{`count(arr, # > 0)`, 3},\n\t\t{`sum(arr)`, 6},\n\t\t{`find(arr, # > 0)`, 1},\n\t\t{`findIndex(arr, # > 1)`, 1},\n\t\t{`findLast(arr, # > 0)`, 3},\n\t\t{`findLastIndex(arr, # > 0)`, 2},\n\t\t{`groupBy(arr, # % 2 == 0)`, map[any][]any{false: {1, 3}, true: {2}}},\n\t\t{`sortBy(arr, -#)`, []any{3, 2, 1}},\n\t\t{`reduce(arr, # + #acc, x)`, 6 + 42},\n\t\t{`ceil(x)`, 42.0},\n\t\t{`floor(x)`, 42.0},\n\t\t{`round(x)`, 42.0},\n\t\t{`int(x)`, 42},\n\t\t{`float(x)`, 42.0},\n\t\t{`abs(x)`, 42},\n\t\t{`first(arr)`, 1},\n\t\t{`last(arr)`, 3},\n\t\t{`take(arr, 1)`, []int{1}},\n\t\t{`take(arr, x)`, []int{1, 2, 3}},\n\t\t{`'a' in keys(m)`, true},\n\t\t{`1 in values(m)`, true},\n\t\t{`len(arr)`, 3},\n\t\t{`type(arr)`, \"array\"},\n\t\t{`type(m)`, \"map\"},\n\t\t{`reverse(arr)`, []any{3, 2, 1}},\n\t\t{`uniq(arr)`, []any{1, 2, 3}},\n\t\t{`concat(arr, arr)`, []any{1, 2, 3, 1, 2, 3}},\n\t\t{`flatten([arr, [arr]])`, []any{1, 2, 3, 1, 2, 3}},\n\t\t{`flatten(arr)`, []any{1, 2, 3}},\n\t\t{`toJSON(arr)`, \"[\\n  1,\\n  2,\\n  3\\n]\"},\n\t\t{`fromJSON(json)`, []any{\"1\"}},\n\t\t{`split(str, \",\")`, []string{\"1\", \"2\", \"3\"}},\n\t\t{`join(arrStr, \",\")`, \"1,2,3\"},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(test.input, expr.Env(env))\n\t\t\trequire.NoError(t, err)\n\t\t\tprintln(program.Disassemble())\n\n\t\t\tout, err := expr.Run(program, env)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, test.want, out)\n\n\t\t\tout, err = expr.Eval(test.input, env)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, test.want, out)\n\t\t})\n\t}\n}\n\nfunc TestBuiltin_flatten_recursion(t *testing.T) {\n\tvar s []any\n\ts = append(s, &s) // s contains a pointer to itself\n\n\tenv := map[string]any{\n\t\t\"arr\": s,\n\t}\n\n\tprogram, err := expr.Compile(\"flatten(arr)\", expr.Env(env))\n\trequire.NoError(t, err)\n\n\t_, err = expr.Run(program, env)\n\trequire.Error(t, err)\n\tassert.Contains(t, err.Error(), builtin.ErrorMaxDepth.Error())\n}\n\nfunc TestBuiltin_flatten_recursion_slice(t *testing.T) {\n\ts := make([]any, 1)\n\ts[0] = s\n\n\tenv := map[string]any{\n\t\t\"arr\": s,\n\t}\n\n\tprogram, err := expr.Compile(\"flatten(arr)\", expr.Env(env))\n\trequire.NoError(t, err)\n\n\t_, err = expr.Run(program, env)\n\trequire.Error(t, err)\n\tassert.Contains(t, err.Error(), builtin.ErrorMaxDepth.Error())\n}\n\nfunc TestBuiltin_numerical_recursion(t *testing.T) {\n\ts := make([]any, 1)\n\ts[0] = s\n\n\tenv := map[string]any{\n\t\t\"arr\": s,\n\t}\n\n\ttests := []string{\n\t\t\"max(arr)\",\n\t\t\"min(arr)\",\n\t\t\"mean(arr)\",\n\t\t\"median(arr)\",\n\t}\n\n\tfor _, input := range tests {\n\t\tt.Run(input, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(input, expr.Env(env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\t_, err = expr.Run(program, env)\n\t\t\trequire.Error(t, err)\n\t\t\tassert.Contains(t, err.Error(), builtin.ErrorMaxDepth.Error())\n\t\t})\n\t}\n}\n\nfunc TestBuiltin_recursion_custom_max_depth(t *testing.T) {\n\toriginalMaxDepth := builtin.MaxDepth\n\tdefer func() {\n\t\tbuiltin.MaxDepth = originalMaxDepth\n\t}()\n\n\t// Set a small depth limit\n\tbuiltin.MaxDepth = 2\n\n\t// Create a deeply nested array (depth 5)\n\t// [1, [2, [3, [4, [5]]]]]\n\tarr := []any{1, []any{2, []any{3, []any{4, []any{5}}}}}\n\n\tenv := map[string]any{\n\t\t\"arr\": arr,\n\t}\n\n\tt.Run(\"flatten exceeds max depth\", func(t *testing.T) {\n\t\tprogram, err := expr.Compile(\"flatten(arr)\", expr.Env(env))\n\t\trequire.NoError(t, err)\n\n\t\t_, err = expr.Run(program, env)\n\t\trequire.Error(t, err)\n\t\tassert.Contains(t, err.Error(), builtin.ErrorMaxDepth.Error())\n\t})\n\n\tt.Run(\"flatten within max depth\", func(t *testing.T) {\n\t\t// Depth 2: [1, [2]]\n\t\tshallowArr := []any{1, []any{2}}\n\t\tenvShallow := map[string]any{\"arr\": shallowArr}\n\t\tprogram, err := expr.Compile(\"flatten(arr)\", expr.Env(envShallow))\n\t\trequire.NoError(t, err)\n\n\t\t_, err = expr.Run(program, envShallow)\n\t\trequire.NoError(t, err)\n\t})\n}\n\nfunc TestAbs_UnsignedIntegers(t *testing.T) {\n\t// Test that abs() correctly handles unsigned integers\n\t// Unsigned integers are always non-negative, so abs() should return them unchanged\n\ttests := []struct {\n\t\tname  string\n\t\tenv   map[string]any\n\t\texpr  string\n\t\twant  any\n\t}{\n\t\t{\"uint\", map[string]any{\"x\": uint(42)}, \"abs(x)\", uint(42)},\n\t\t{\"uint8\", map[string]any{\"x\": uint8(42)}, \"abs(x)\", uint8(42)},\n\t\t{\"uint16\", map[string]any{\"x\": uint16(42)}, \"abs(x)\", uint16(42)},\n\t\t{\"uint32\", map[string]any{\"x\": uint32(42)}, \"abs(x)\", uint32(42)},\n\t\t{\"uint64\", map[string]any{\"x\": uint64(42)}, \"abs(x)\", uint64(42)},\n\t\t{\"uint zero\", map[string]any{\"x\": uint(0)}, \"abs(x)\", uint(0)},\n\t\t{\"uint8 zero\", map[string]any{\"x\": uint8(0)}, \"abs(x)\", uint8(0)},\n\t\t{\"uint16 zero\", map[string]any{\"x\": uint16(0)}, \"abs(x)\", uint16(0)},\n\t\t{\"uint32 zero\", map[string]any{\"x\": uint32(0)}, \"abs(x)\", uint32(0)},\n\t\t{\"uint64 zero\", map[string]any{\"x\": uint64(0)}, \"abs(x)\", uint64(0)},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.expr, expr.Env(tt.env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tresult, err := expr.Run(program, tt.env)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tt.want, result)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "builtin/function.go",
    "content": "package builtin\n\nimport (\n\t\"reflect\"\n)\n\ntype Function struct {\n\tName      string\n\tFast      func(arg any) any\n\tFunc      func(args ...any) (any, error)\n\tSafe      func(args ...any) (any, uint, error)\n\tTypes     []reflect.Type\n\tValidate  func(args []reflect.Type) (reflect.Type, error)\n\tDeref     func(i int, arg reflect.Type) bool\n\tPredicate bool\n}\n\nfunc (f *Function) Type() reflect.Type {\n\tif len(f.Types) > 0 {\n\t\treturn f.Types[0]\n\t}\n\treturn reflect.TypeOf(f.Func)\n}\n"
  },
  {
    "path": "builtin/lib.go",
    "content": "package builtin\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"unicode/utf8\"\n\n\t\"github.com/expr-lang/expr/internal/deref\"\n\t\"github.com/expr-lang/expr/vm/runtime\"\n)\n\nfunc Len(x any) any {\n\tv := reflect.ValueOf(x)\n\tswitch v.Kind() {\n\tcase reflect.Array, reflect.Slice, reflect.Map:\n\t\treturn v.Len()\n\tcase reflect.String:\n\t\treturn utf8.RuneCountInString(v.String())\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"invalid argument for len (type %T)\", x))\n\t}\n}\n\nfunc Type(arg any) any {\n\tif arg == nil {\n\t\treturn \"nil\"\n\t}\n\tv := reflect.ValueOf(arg)\n\tif v.Type().Name() != \"\" && v.Type().PkgPath() != \"\" {\n\t\treturn fmt.Sprintf(\"%s.%s\", v.Type().PkgPath(), v.Type().Name())\n\t}\n\tswitch v.Type().Kind() {\n\tcase reflect.Invalid:\n\t\treturn \"invalid\"\n\tcase reflect.Bool:\n\t\treturn \"bool\"\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn \"int\"\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\treturn \"uint\"\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn \"float\"\n\tcase reflect.String:\n\t\treturn \"string\"\n\tcase reflect.Array, reflect.Slice:\n\t\treturn \"array\"\n\tcase reflect.Map:\n\t\treturn \"map\"\n\tcase reflect.Func:\n\t\treturn \"func\"\n\tcase reflect.Struct:\n\t\treturn \"struct\"\n\tdefault:\n\t\treturn \"unknown\"\n\t}\n}\n\nfunc Abs(x any) any {\n\tswitch x := x.(type) {\n\tcase float32:\n\t\tif x < 0 {\n\t\t\treturn -x\n\t\t} else {\n\t\t\treturn x\n\t\t}\n\tcase float64:\n\t\tif x < 0 {\n\t\t\treturn -x\n\t\t} else {\n\t\t\treturn x\n\t\t}\n\tcase int:\n\t\tif x < 0 {\n\t\t\treturn -x\n\t\t} else {\n\t\t\treturn x\n\t\t}\n\tcase int8:\n\t\tif x < 0 {\n\t\t\treturn -x\n\t\t} else {\n\t\t\treturn x\n\t\t}\n\tcase int16:\n\t\tif x < 0 {\n\t\t\treturn -x\n\t\t} else {\n\t\t\treturn x\n\t\t}\n\tcase int32:\n\t\tif x < 0 {\n\t\t\treturn -x\n\t\t} else {\n\t\t\treturn x\n\t\t}\n\tcase int64:\n\t\tif x < 0 {\n\t\t\treturn -x\n\t\t} else {\n\t\t\treturn x\n\t\t}\n\tcase uint:\n\t\treturn x\n\tcase uint8:\n\t\treturn x\n\tcase uint16:\n\t\treturn x\n\tcase uint32:\n\t\treturn x\n\tcase uint64:\n\t\treturn x\n\t}\n\tpanic(fmt.Sprintf(\"invalid argument for abs (type %T)\", x))\n}\n\nfunc Ceil(x any) any {\n\tswitch x := x.(type) {\n\tcase float32:\n\t\treturn math.Ceil(float64(x))\n\tcase float64:\n\t\treturn math.Ceil(x)\n\tcase int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:\n\t\treturn Float(x)\n\t}\n\tpanic(fmt.Sprintf(\"invalid argument for ceil (type %T)\", x))\n}\n\nfunc Floor(x any) any {\n\tswitch x := x.(type) {\n\tcase float32:\n\t\treturn math.Floor(float64(x))\n\tcase float64:\n\t\treturn math.Floor(x)\n\tcase int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:\n\t\treturn Float(x)\n\t}\n\tpanic(fmt.Sprintf(\"invalid argument for floor (type %T)\", x))\n}\n\nfunc Round(x any) any {\n\tswitch x := x.(type) {\n\tcase float32:\n\t\treturn math.Round(float64(x))\n\tcase float64:\n\t\treturn math.Round(x)\n\tcase int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:\n\t\treturn Float(x)\n\t}\n\tpanic(fmt.Sprintf(\"invalid argument for round (type %T)\", x))\n}\n\nfunc Int(x any) any {\n\tswitch x := x.(type) {\n\tcase float32:\n\t\treturn int(x)\n\tcase float64:\n\t\treturn int(x)\n\tcase int:\n\t\treturn x\n\tcase int8:\n\t\treturn int(x)\n\tcase int16:\n\t\treturn int(x)\n\tcase int32:\n\t\treturn int(x)\n\tcase int64:\n\t\treturn int(x)\n\tcase uint:\n\t\treturn int(x)\n\tcase uint8:\n\t\treturn int(x)\n\tcase uint16:\n\t\treturn int(x)\n\tcase uint32:\n\t\treturn int(x)\n\tcase uint64:\n\t\treturn int(x)\n\tcase string:\n\t\ti, err := strconv.Atoi(x)\n\t\tif err != nil {\n\t\t\tpanic(fmt.Sprintf(\"invalid operation: int(%s)\", x))\n\t\t}\n\t\treturn i\n\tdefault:\n\t\tval := reflect.ValueOf(x)\n\t\tif val.CanConvert(integerType) {\n\t\t\treturn val.Convert(integerType).Interface()\n\t\t}\n\t\tpanic(fmt.Sprintf(\"invalid operation: int(%T)\", x))\n\t}\n}\n\nfunc Float(x any) any {\n\tswitch x := x.(type) {\n\tcase float32:\n\t\treturn float64(x)\n\tcase float64:\n\t\treturn x\n\tcase int:\n\t\treturn float64(x)\n\tcase int8:\n\t\treturn float64(x)\n\tcase int16:\n\t\treturn float64(x)\n\tcase int32:\n\t\treturn float64(x)\n\tcase int64:\n\t\treturn float64(x)\n\tcase uint:\n\t\treturn float64(x)\n\tcase uint8:\n\t\treturn float64(x)\n\tcase uint16:\n\t\treturn float64(x)\n\tcase uint32:\n\t\treturn float64(x)\n\tcase uint64:\n\t\treturn float64(x)\n\tcase string:\n\t\tf, err := strconv.ParseFloat(x, 64)\n\t\tif err != nil {\n\t\t\tpanic(fmt.Sprintf(\"invalid operation: float(%s)\", x))\n\t\t}\n\t\treturn f\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"invalid operation: float(%T)\", x))\n\t}\n}\n\nfunc String(arg any) any {\n\treturn fmt.Sprintf(\"%v\", arg)\n}\n\nfunc minMax(name string, fn func(any, any) bool, depth int, args ...any) (any, error) {\n\tif depth > MaxDepth {\n\t\treturn nil, ErrorMaxDepth\n\t}\n\tvar val any\n\tfor _, arg := range args {\n\t\t// Fast paths for common typed slices - avoid reflection and allocations\n\t\tswitch arr := arg.(type) {\n\t\tcase []int:\n\t\t\tif len(arr) == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tm := arr[0]\n\t\t\tfor i := 1; i < len(arr); i++ {\n\t\t\t\tif fn(m, arr[i]) {\n\t\t\t\t\tm = arr[i]\n\t\t\t\t}\n\t\t\t}\n\t\t\tif val == nil || fn(val, m) {\n\t\t\t\tval = m\n\t\t\t}\n\t\t\tcontinue\n\t\tcase []float64:\n\t\t\tif len(arr) == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tm := arr[0]\n\t\t\tfor i := 1; i < len(arr); i++ {\n\t\t\t\tif fn(m, arr[i]) {\n\t\t\t\t\tm = arr[i]\n\t\t\t\t}\n\t\t\t}\n\t\t\tif val == nil || fn(val, m) {\n\t\t\t\tval = m\n\t\t\t}\n\t\t\tcontinue\n\t\tcase []any:\n\t\t\t// Fast path for []any with simple numeric types\n\t\t\tfor _, elem := range arr {\n\t\t\t\tswitch e := elem.(type) {\n\t\t\t\tcase int, int8, int16, int32, int64,\n\t\t\t\t\tuint, uint8, uint16, uint32, uint64,\n\t\t\t\t\tfloat32, float64:\n\t\t\t\t\tif val == nil || fn(val, e) {\n\t\t\t\t\t\tval = e\n\t\t\t\t\t}\n\t\t\t\tcase []int, []float64, []any:\n\t\t\t\t\t// Nested array - recurse\n\t\t\t\t\tnested, err := minMax(name, fn, depth+1, e)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tif nested != nil && (val == nil || fn(val, nested)) {\n\t\t\t\t\t\tval = nested\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\t// Could be another slice type, use reflection\n\t\t\t\t\trv := reflect.ValueOf(e)\n\t\t\t\t\tif rv.Kind() == reflect.Slice || rv.Kind() == reflect.Array {\n\t\t\t\t\t\tnested, err := minMax(name, fn, depth+1, e)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif nested != nil && (val == nil || fn(val, nested)) {\n\t\t\t\t\t\t\tval = nested\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn nil, fmt.Errorf(\"invalid argument for %s (type %T)\", name, e)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Slow path: use reflection for other types\n\t\trv := reflect.ValueOf(arg)\n\t\tswitch rv.Kind() {\n\t\tcase reflect.Array, reflect.Slice:\n\t\t\tsize := rv.Len()\n\t\t\tfor i := 0; i < size; i++ {\n\t\t\t\telemVal, err := minMax(name, fn, depth+1, rv.Index(i).Interface())\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tswitch elemVal.(type) {\n\t\t\t\tcase int, int8, int16, int32, int64,\n\t\t\t\t\tuint, uint8, uint16, uint32, uint64,\n\t\t\t\t\tfloat32, float64:\n\t\t\t\t\tif elemVal != nil && (val == nil || fn(val, elemVal)) {\n\t\t\t\t\t\tval = elemVal\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\treturn nil, fmt.Errorf(\"invalid argument for %s (type %T)\", name, elemVal)\n\t\t\t\t}\n\t\t\t}\n\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,\n\t\t\treflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,\n\t\t\treflect.Float32, reflect.Float64:\n\t\t\telemVal := rv.Interface()\n\t\t\tif val == nil || fn(val, elemVal) {\n\t\t\t\tval = elemVal\n\t\t\t}\n\t\tdefault:\n\t\t\tif len(args) == 1 {\n\t\t\t\treturn args[0], nil\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"invalid argument for %s (type %T)\", name, arg)\n\t\t}\n\t}\n\treturn val, nil\n}\n\nfunc mean(depth int, args ...any) (int, float64, error) {\n\tif depth > MaxDepth {\n\t\treturn 0, 0, ErrorMaxDepth\n\t}\n\tvar total float64\n\tvar count int\n\n\tfor _, arg := range args {\n\t\t// Fast paths for common typed slices - avoid reflection and allocations\n\t\tswitch arr := arg.(type) {\n\t\tcase []int:\n\t\t\tfor _, v := range arr {\n\t\t\t\ttotal += float64(v)\n\t\t\t}\n\t\t\tcount += len(arr)\n\t\t\tcontinue\n\t\tcase []float64:\n\t\t\tfor _, v := range arr {\n\t\t\t\ttotal += v\n\t\t\t}\n\t\t\tcount += len(arr)\n\t\t\tcontinue\n\t\tcase []any:\n\t\t\t// Fast path for []any - single pass without recursive calls for flat arrays\n\t\t\tfor _, elem := range arr {\n\t\t\t\tswitch e := elem.(type) {\n\t\t\t\tcase int:\n\t\t\t\t\ttotal += float64(e)\n\t\t\t\t\tcount++\n\t\t\t\tcase float64:\n\t\t\t\t\ttotal += e\n\t\t\t\t\tcount++\n\t\t\t\tcase []int, []float64, []any:\n\t\t\t\t\t// Nested array - recurse\n\t\t\t\t\tnestedCount, nestedSum, err := mean(depth+1, e)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn 0, 0, err\n\t\t\t\t\t}\n\t\t\t\t\ttotal += nestedSum\n\t\t\t\t\tcount += nestedCount\n\t\t\t\tdefault:\n\t\t\t\t\t// Other numeric types or slices - use reflection\n\t\t\t\t\trv := reflect.ValueOf(e)\n\t\t\t\t\tswitch rv.Kind() {\n\t\t\t\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\t\t\t\t\ttotal += float64(rv.Int())\n\t\t\t\t\t\tcount++\n\t\t\t\t\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\t\t\t\t\ttotal += float64(rv.Uint())\n\t\t\t\t\t\tcount++\n\t\t\t\t\tcase reflect.Float32, reflect.Float64:\n\t\t\t\t\t\ttotal += rv.Float()\n\t\t\t\t\t\tcount++\n\t\t\t\t\tcase reflect.Slice, reflect.Array:\n\t\t\t\t\t\tnestedCount, nestedSum, err := mean(depth+1, e)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn 0, 0, err\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttotal += nestedSum\n\t\t\t\t\t\tcount += nestedCount\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn 0, 0, fmt.Errorf(\"invalid argument for mean (type %T)\", e)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Slow path: use reflection for other types\n\t\trv := reflect.ValueOf(arg)\n\t\tswitch rv.Kind() {\n\t\tcase reflect.Array, reflect.Slice:\n\t\t\tsize := rv.Len()\n\t\t\tfor i := 0; i < size; i++ {\n\t\t\t\telemCount, elemSum, err := mean(depth+1, rv.Index(i).Interface())\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, 0, err\n\t\t\t\t}\n\t\t\t\ttotal += elemSum\n\t\t\t\tcount += elemCount\n\t\t\t}\n\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\t\ttotal += float64(rv.Int())\n\t\t\tcount++\n\t\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\t\ttotal += float64(rv.Uint())\n\t\t\tcount++\n\t\tcase reflect.Float32, reflect.Float64:\n\t\t\ttotal += rv.Float()\n\t\t\tcount++\n\t\tdefault:\n\t\t\treturn 0, 0, fmt.Errorf(\"invalid argument for mean (type %T)\", arg)\n\t\t}\n\t}\n\treturn count, total, nil\n}\n\nfunc median(depth int, args ...any) ([]float64, error) {\n\tif depth > MaxDepth {\n\t\treturn nil, ErrorMaxDepth\n\t}\n\tvar values []float64\n\n\tfor _, arg := range args {\n\t\t// Fast paths for common typed slices - avoid reflection and allocations\n\t\tswitch arr := arg.(type) {\n\t\tcase []int:\n\t\t\tfor _, v := range arr {\n\t\t\t\tvalues = append(values, float64(v))\n\t\t\t}\n\t\t\tcontinue\n\t\tcase []float64:\n\t\t\tvalues = append(values, arr...)\n\t\t\tcontinue\n\t\tcase []any:\n\t\t\t// Fast path for []any - single pass without recursive calls for flat arrays\n\t\t\tfor _, elem := range arr {\n\t\t\t\tswitch e := elem.(type) {\n\t\t\t\tcase int:\n\t\t\t\t\tvalues = append(values, float64(e))\n\t\t\t\tcase float64:\n\t\t\t\t\tvalues = append(values, e)\n\t\t\t\tcase []int, []float64, []any:\n\t\t\t\t\t// Nested array - recurse\n\t\t\t\t\telems, err := median(depth+1, e)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tvalues = append(values, elems...)\n\t\t\t\tdefault:\n\t\t\t\t\t// Other numeric types or slices - use reflection\n\t\t\t\t\trv := reflect.ValueOf(e)\n\t\t\t\t\tswitch rv.Kind() {\n\t\t\t\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\t\t\t\t\tvalues = append(values, float64(rv.Int()))\n\t\t\t\t\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\t\t\t\t\tvalues = append(values, float64(rv.Uint()))\n\t\t\t\t\tcase reflect.Float32, reflect.Float64:\n\t\t\t\t\t\tvalues = append(values, rv.Float())\n\t\t\t\t\tcase reflect.Slice, reflect.Array:\n\t\t\t\t\t\telems, err := median(depth+1, e)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalues = append(values, elems...)\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn nil, fmt.Errorf(\"invalid argument for median (type %T)\", e)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Slow path: use reflection for other types\n\t\trv := reflect.ValueOf(arg)\n\t\tswitch rv.Kind() {\n\t\tcase reflect.Array, reflect.Slice:\n\t\t\tsize := rv.Len()\n\t\t\tfor i := 0; i < size; i++ {\n\t\t\t\telems, err := median(depth+1, rv.Index(i).Interface())\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tvalues = append(values, elems...)\n\t\t\t}\n\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\t\tvalues = append(values, float64(rv.Int()))\n\t\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\t\tvalues = append(values, float64(rv.Uint()))\n\t\tcase reflect.Float32, reflect.Float64:\n\t\t\tvalues = append(values, rv.Float())\n\t\tdefault:\n\t\t\treturn nil, fmt.Errorf(\"invalid argument for median (type %T)\", arg)\n\t\t}\n\t}\n\treturn values, nil\n}\n\nfunc flatten(arg reflect.Value, depth int) ([]any, error) {\n\tif depth > MaxDepth {\n\t\treturn nil, ErrorMaxDepth\n\t}\n\tret := []any{}\n\tfor i := 0; i < arg.Len(); i++ {\n\t\tv := deref.Value(arg.Index(i))\n\t\tif v.Kind() == reflect.Array || v.Kind() == reflect.Slice {\n\t\t\tx, err := flatten(v, depth+1)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tret = append(ret, x...)\n\t\t} else {\n\t\t\tret = append(ret, v.Interface())\n\t\t}\n\t}\n\treturn ret, nil\n}\n\nfunc get(params ...any) (out any, err error) {\n\tif len(params) < 2 {\n\t\treturn nil, fmt.Errorf(\"invalid number of arguments (expected 2, got %d)\", len(params))\n\t}\n\tfrom := params[0]\n\ti := params[1]\n\tv := reflect.ValueOf(from)\n\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\tif v.Kind() == reflect.Invalid {\n\t\tpanic(fmt.Sprintf(\"cannot fetch %v from %T\", i, from))\n\t}\n\n\t// Methods can be defined on any type.\n\tif v.NumMethod() > 0 {\n\t\tif methodName, ok := i.(string); ok {\n\t\t\tmethod := v.MethodByName(methodName)\n\t\t\tif method.IsValid() {\n\t\t\t\treturn method.Interface(), nil\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch v.Kind() {\n\tcase reflect.Array, reflect.Slice, reflect.String:\n\t\tindex := runtime.ToInt(i)\n\t\tl := v.Len()\n\t\tif index < 0 {\n\t\t\tindex = l + index\n\t\t}\n\t\tif 0 <= index && index < l {\n\t\t\tvalue := v.Index(index)\n\t\t\tif value.IsValid() {\n\t\t\t\treturn value.Interface(), nil\n\t\t\t}\n\t\t}\n\n\tcase reflect.Map:\n\t\tvar value reflect.Value\n\t\tif i == nil {\n\t\t\tvalue = v.MapIndex(reflect.Zero(v.Type().Key()))\n\t\t} else {\n\t\t\tvalue = v.MapIndex(reflect.ValueOf(i))\n\t\t}\n\t\tif value.IsValid() {\n\t\t\treturn value.Interface(), nil\n\t\t}\n\n\tcase reflect.Struct:\n\t\tfieldName := i.(string)\n\t\tt := v.Type()\n\t\tfield, ok := t.FieldByNameFunc(func(name string) bool {\n\t\t\tf, _ := t.FieldByName(name)\n\t\t\tswitch f.Tag.Get(\"expr\") {\n\t\t\tcase \"-\":\n\t\t\t\treturn false\n\t\t\tcase fieldName:\n\t\t\t\treturn true\n\t\t\tdefault:\n\t\t\t\treturn name == fieldName\n\t\t\t}\n\t\t})\n\t\tif ok && field.IsExported() {\n\t\t\tvalue := v.FieldByIndex(field.Index)\n\t\t\tif value.IsValid() {\n\t\t\t\treturn value.Interface(), nil\n\t\t\t}\n\t\t}\n\t}\n\n\t// Main difference from runtime.Fetch\n\t// is that we return `nil` instead of panic.\n\treturn nil, nil\n}\n"
  },
  {
    "path": "builtin/utils.go",
    "content": "package builtin\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/internal/deref\"\n)\n\nvar (\n\tanyType      = reflect.TypeOf(new(any)).Elem()\n\tintegerType  = reflect.TypeOf(0)\n\tfloatType    = reflect.TypeOf(float64(0))\n\tarrayType    = reflect.TypeOf([]any{})\n\tmapType      = reflect.TypeOf(map[any]any{})\n\ttimeType     = reflect.TypeOf(new(time.Time)).Elem()\n\tlocationType = reflect.TypeOf(new(time.Location))\n)\n\nfunc kind(t reflect.Type) reflect.Kind {\n\tif t == nil {\n\t\treturn reflect.Invalid\n\t}\n\tt = deref.Type(t)\n\treturn t.Kind()\n}\n\nfunc types(types ...any) []reflect.Type {\n\tts := make([]reflect.Type, len(types))\n\tfor i, t := range types {\n\t\tt := reflect.TypeOf(t)\n\t\tif t.Kind() == reflect.Ptr {\n\t\t\tt = t.Elem()\n\t\t}\n\t\tif t.Kind() != reflect.Func {\n\t\t\tpanic(\"not a function\")\n\t\t}\n\t\tts[i] = t\n\t}\n\treturn ts\n}\n\nfunc toInt(val any) (int, error) {\n\tswitch v := val.(type) {\n\tcase int:\n\t\treturn v, nil\n\tcase int8:\n\t\treturn int(v), nil\n\tcase int16:\n\t\treturn int(v), nil\n\tcase int32:\n\t\treturn int(v), nil\n\tcase int64:\n\t\treturn int(v), nil\n\tcase uint:\n\t\treturn int(v), nil\n\tcase uint8:\n\t\treturn int(v), nil\n\tcase uint16:\n\t\treturn int(v), nil\n\tcase uint32:\n\t\treturn int(v), nil\n\tcase uint64:\n\t\treturn int(v), nil\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"cannot use %T as argument (type int)\", val)\n\t}\n}\n\nfunc bitFunc(name string, fn func(x, y int) (any, error)) *Function {\n\treturn &Function{\n\t\tName: name,\n\t\tFunc: func(args ...any) (any, error) {\n\t\t\tif len(args) != 2 {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid number of arguments for %s (expected 2, got %d)\", name, len(args))\n\t\t\t}\n\t\t\tx, err := toInt(args[0])\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"%v to call %s\", err, name)\n\t\t\t}\n\t\t\ty, err := toInt(args[1])\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"%v to call %s\", err, name)\n\t\t\t}\n\t\t\treturn fn(x, y)\n\t\t},\n\t\tTypes: types(new(func(int, int) int)),\n\t}\n}\n"
  },
  {
    "path": "builtin/validation.go",
    "content": "package builtin\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\n\t\"github.com/expr-lang/expr/internal/deref\"\n)\n\nfunc validateAggregateFunc(name string, args []reflect.Type) (reflect.Type, error) {\n\tswitch len(args) {\n\tcase 0:\n\t\treturn anyType, fmt.Errorf(\"not enough arguments to call %s\", name)\n\tdefault:\n\t\tfor _, arg := range args {\n\t\t\tswitch kind(deref.Type(arg)) {\n\t\t\tcase reflect.Interface, reflect.Array, reflect.Slice:\n\t\t\t\treturn anyType, nil\n\t\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64:\n\t\t\tdefault:\n\t\t\t\treturn anyType, fmt.Errorf(\"invalid argument for %s (type %s)\", name, arg)\n\t\t\t}\n\t\t}\n\t\treturn args[0], nil\n\t}\n}\n\nfunc validateRoundFunc(name string, args []reflect.Type) (reflect.Type, error) {\n\tif len(args) != 1 {\n\t\treturn anyType, fmt.Errorf(\"invalid number of arguments (expected 1, got %d)\", len(args))\n\t}\n\tswitch kind(args[0]) {\n\tcase reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface:\n\t\treturn floatType, nil\n\tdefault:\n\t\treturn anyType, fmt.Errorf(\"invalid argument for %s (type %s)\", name, args[0])\n\t}\n}\n"
  },
  {
    "path": "checker/checker.go",
    "content": "package checker\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/builtin\"\n\t. \"github.com/expr-lang/expr/checker/nature\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/file\"\n\t\"github.com/expr-lang/expr/parser\"\n)\n\nvar (\n\tanyType       = reflect.TypeOf(new(any)).Elem()\n\tboolType      = reflect.TypeOf(true)\n\tintType       = reflect.TypeOf(0)\n\tfloatType     = reflect.TypeOf(float64(0))\n\tstringType    = reflect.TypeOf(\"\")\n\tarrayType     = reflect.TypeOf([]any{})\n\tmapType       = reflect.TypeOf(map[string]any{})\n\ttimeType      = reflect.TypeOf(time.Time{})\n\tdurationType  = reflect.TypeOf(time.Duration(0))\n\tbyteSliceType = reflect.TypeOf([]byte(nil))\n\n\tanyTypeSlice = []reflect.Type{anyType}\n)\n\n// ParseCheck parses input expression and checks its types. Also, it applies\n// all provided patchers. In case of error, it returns error with a tree.\nfunc ParseCheck(input string, config *conf.Config) (*parser.Tree, error) {\n\ttree, err := parser.ParseWithConfig(input, config)\n\tif err != nil {\n\t\treturn tree, err\n\t}\n\n\t_, err = new(Checker).PatchAndCheck(tree, config)\n\tif err != nil {\n\t\treturn tree, err\n\t}\n\n\treturn tree, nil\n}\n\n// Check calls Check on a disposable Checker.\nfunc Check(tree *parser.Tree, config *conf.Config) (reflect.Type, error) {\n\treturn new(Checker).Check(tree, config)\n}\n\ntype Checker struct {\n\tconfig          *conf.Config\n\tpredicateScopes []predicateScope\n\tvarScopes       []varScope\n\terr             *file.Error\n\tneedsReset      bool\n}\n\ntype predicateScope struct {\n\tcollection Nature\n\tvars       []varScope\n}\n\ntype varScope struct {\n\tname   string\n\tnature Nature\n}\n\n// PatchAndCheck applies all patchers and checks the tree.\nfunc (v *Checker) PatchAndCheck(tree *parser.Tree, config *conf.Config) (reflect.Type, error) {\n\tv.reset(config)\n\tif len(config.Visitors) > 0 {\n\t\t// Run all patchers that dont support being run repeatedly first\n\t\tv.runVisitors(tree, false)\n\n\t\t// Run patchers that require multiple passes next (currently only Operator patching)\n\t\tv.runVisitors(tree, true)\n\t}\n\treturn v.Check(tree, config)\n}\n\n// Check checks types of the expression tree. It returns type of the expression\n// and error if any. If config is nil, then default configuration will be used.\nfunc (v *Checker) Check(tree *parser.Tree, config *conf.Config) (reflect.Type, error) {\n\tv.reset(config)\n\treturn v.check(tree)\n}\n\n// Run visitors in a given config over the given tree\n// runRepeatable controls whether to filter for only vistors that require multiple passes or not\nfunc (v *Checker) runVisitors(tree *parser.Tree, runRepeatable bool) {\n\tfor {\n\t\tmore := false\n\t\tfor _, visitor := range v.config.Visitors {\n\t\t\t// We need to perform types check, because some visitors may rely on\n\t\t\t// types information available in the tree.\n\t\t\t_, _ = v.Check(tree, v.config)\n\n\t\t\tr, repeatable := visitor.(interface {\n\t\t\t\tReset()\n\t\t\t\tShouldRepeat() bool\n\t\t\t})\n\n\t\t\tif repeatable {\n\t\t\t\tif runRepeatable {\n\t\t\t\t\tr.Reset()\n\t\t\t\t\tast.Walk(&tree.Node, visitor)\n\t\t\t\t\tmore = more || r.ShouldRepeat()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif !runRepeatable {\n\t\t\t\t\tast.Walk(&tree.Node, visitor)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif !more {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunc (v *Checker) check(tree *parser.Tree) (reflect.Type, error) {\n\tnt := v.visit(tree.Node)\n\n\t// To keep compatibility with previous versions, we should return any, if nature is unknown.\n\tt := nt.Type\n\tif t == nil {\n\t\tt = anyType\n\t}\n\n\tif v.err != nil {\n\t\treturn t, v.err.Bind(tree.Source)\n\t}\n\n\tif v.config.Expect != reflect.Invalid {\n\t\tif v.config.ExpectAny {\n\t\t\tif nt.IsUnknown(&v.config.NtCache) {\n\t\t\t\treturn t, nil\n\t\t\t}\n\t\t}\n\n\t\tswitch v.config.Expect {\n\t\tcase reflect.Int, reflect.Int64, reflect.Float64:\n\t\t\tif !nt.IsNumber() {\n\t\t\t\treturn nil, fmt.Errorf(\"expected %v, but got %s\", v.config.Expect, nt.String())\n\t\t\t}\n\t\tdefault:\n\t\t\tif nt.Kind != v.config.Expect {\n\t\t\t\treturn nil, fmt.Errorf(\"expected %v, but got %s\", v.config.Expect, nt.String())\n\t\t\t}\n\t\t}\n\t}\n\n\treturn t, nil\n}\n\nfunc (v *Checker) reset(config *conf.Config) {\n\tif v.needsReset {\n\t\tclearSlice(v.predicateScopes)\n\t\tclearSlice(v.varScopes)\n\t\tv.predicateScopes = v.predicateScopes[:0]\n\t\tv.varScopes = v.varScopes[:0]\n\t\tv.err = nil\n\t}\n\tv.needsReset = true\n\n\tif config == nil {\n\t\tconfig = conf.New(nil)\n\t}\n\tv.config = config\n}\n\nfunc clearSlice[S ~[]E, E any](s S) {\n\tvar zero E\n\tfor i := range s {\n\t\ts[i] = zero\n\t}\n}\n\nfunc (v *Checker) visit(node ast.Node) Nature {\n\tvar nt Nature\n\tswitch n := node.(type) {\n\tcase *ast.NilNode:\n\t\tnt = v.config.NtCache.NatureOf(nil)\n\tcase *ast.IdentifierNode:\n\t\tnt = v.identifierNode(n)\n\tcase *ast.IntegerNode:\n\t\tnt = v.config.NtCache.FromType(intType)\n\tcase *ast.FloatNode:\n\t\tnt = v.config.NtCache.FromType(floatType)\n\tcase *ast.BoolNode:\n\t\tnt = v.config.NtCache.FromType(boolType)\n\tcase *ast.StringNode:\n\t\tnt = v.config.NtCache.FromType(stringType)\n\tcase *ast.BytesNode:\n\t\tnt = v.config.NtCache.FromType(byteSliceType)\n\tcase *ast.ConstantNode:\n\t\tnt = v.config.NtCache.FromType(reflect.TypeOf(n.Value))\n\tcase *ast.UnaryNode:\n\t\tnt = v.unaryNode(n)\n\tcase *ast.BinaryNode:\n\t\tnt = v.binaryNode(n)\n\tcase *ast.ChainNode:\n\t\tnt = v.chainNode(n)\n\tcase *ast.MemberNode:\n\t\tnt = v.memberNode(n)\n\tcase *ast.SliceNode:\n\t\tnt = v.sliceNode(n)\n\tcase *ast.CallNode:\n\t\tnt = v.callNode(n)\n\tcase *ast.BuiltinNode:\n\t\tnt = v.builtinNode(n)\n\tcase *ast.PredicateNode:\n\t\tnt = v.predicateNode(n)\n\tcase *ast.PointerNode:\n\t\tnt = v.pointerNode(n)\n\tcase *ast.VariableDeclaratorNode:\n\t\tnt = v.variableDeclaratorNode(n)\n\tcase *ast.SequenceNode:\n\t\tnt = v.sequenceNode(n)\n\tcase *ast.ConditionalNode:\n\t\tnt = v.conditionalNode(n)\n\tcase *ast.ArrayNode:\n\t\tnt = v.arrayNode(n)\n\tcase *ast.MapNode:\n\t\tnt = v.mapNode(n)\n\tcase *ast.PairNode:\n\t\tnt = v.pairNode(n)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"undefined node type (%T)\", node))\n\t}\n\tnode.SetNature(nt)\n\treturn nt\n}\n\nfunc (v *Checker) error(node ast.Node, format string, args ...any) Nature {\n\tif v.err == nil { // show first error\n\t\tv.err = &file.Error{\n\t\t\tLocation: node.Location(),\n\t\t\tMessage:  fmt.Sprintf(format, args...),\n\t\t}\n\t}\n\treturn Nature{}\n}\n\nfunc (v *Checker) identifierNode(node *ast.IdentifierNode) Nature {\n\tfor i := len(v.varScopes) - 1; i >= 0; i-- {\n\t\tif v.varScopes[i].name == node.Value {\n\t\t\treturn v.varScopes[i].nature\n\t\t}\n\t}\n\tif node.Value == \"$env\" {\n\t\treturn Nature{}\n\t}\n\n\treturn v.ident(node, node.Value, v.config.Strict, true)\n}\n\n// ident method returns type of environment variable, builtin or function.\nfunc (v *Checker) ident(node ast.Node, name string, strict, builtins bool) Nature {\n\tif nt, ok := v.config.Env.Get(&v.config.NtCache, name); ok {\n\t\treturn nt\n\t}\n\tif builtins {\n\t\tif fn, ok := v.config.Functions[name]; ok {\n\t\t\tnt := v.config.NtCache.FromType(fn.Type())\n\t\t\tif nt.TypeData == nil {\n\t\t\t\tnt.TypeData = new(TypeData)\n\t\t\t}\n\t\t\tnt.TypeData.Func = fn\n\t\t\treturn nt\n\t\t}\n\t\tif fn, ok := v.config.Builtins[name]; ok {\n\t\t\tnt := v.config.NtCache.FromType(fn.Type())\n\t\t\tif nt.TypeData == nil {\n\t\t\t\tnt.TypeData = new(TypeData)\n\t\t\t}\n\t\t\tnt.TypeData.Func = fn\n\t\t\treturn nt\n\t\t}\n\t}\n\tif v.config.Strict && strict {\n\t\treturn v.error(node, \"unknown name %s\", name)\n\t}\n\treturn Nature{}\n}\n\nfunc (v *Checker) unaryNode(node *ast.UnaryNode) Nature {\n\tnt := v.visit(node.Node)\n\tnt = nt.Deref(&v.config.NtCache)\n\n\tswitch node.Operator {\n\n\tcase \"!\", \"not\":\n\t\tif nt.IsBool() {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\t\tif nt.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\n\tcase \"+\", \"-\":\n\t\tif nt.IsNumber() {\n\t\t\treturn nt\n\t\t}\n\t\tif nt.IsUnknown(&v.config.NtCache) {\n\t\t\treturn Nature{}\n\t\t}\n\n\tdefault:\n\t\treturn v.error(node, \"unknown operator (%s)\", node.Operator)\n\t}\n\n\treturn v.error(node, `invalid operation: %s (mismatched type %s)`, node.Operator, nt.String())\n}\n\nfunc (v *Checker) binaryNode(node *ast.BinaryNode) Nature {\n\tl := v.visit(node.Left)\n\tr := v.visit(node.Right)\n\n\tl = l.Deref(&v.config.NtCache)\n\tr = r.Deref(&v.config.NtCache)\n\n\tswitch node.Operator {\n\tcase \"==\", \"!=\":\n\t\tif l.ComparableTo(&v.config.NtCache, r) {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\n\tcase \"or\", \"||\", \"and\", \"&&\":\n\t\tif l.IsBool() && r.IsBool() {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\t\tif l.MaybeCompatible(&v.config.NtCache, r, BoolCheck) {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\n\tcase \"<\", \">\", \">=\", \"<=\":\n\t\tif l.IsNumber() && r.IsNumber() {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\t\tif l.IsString() && r.IsString() {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\t\tif l.IsTime() && r.IsTime() {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\t\tif l.IsDuration() && r.IsDuration() {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\t\tif l.MaybeCompatible(&v.config.NtCache, r, NumberCheck, StringCheck, TimeCheck, DurationCheck) {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\n\tcase \"-\":\n\t\tif l.IsNumber() && r.IsNumber() {\n\t\t\treturn l.PromoteNumericNature(&v.config.NtCache, r)\n\t\t}\n\t\tif l.IsTime() && r.IsTime() {\n\t\t\treturn v.config.NtCache.FromType(durationType)\n\t\t}\n\t\tif l.IsTime() && r.IsDuration() {\n\t\t\treturn v.config.NtCache.FromType(timeType)\n\t\t}\n\t\tif l.IsDuration() && r.IsDuration() {\n\t\t\treturn v.config.NtCache.FromType(durationType)\n\t\t}\n\t\tif l.MaybeCompatible(&v.config.NtCache, r, NumberCheck, TimeCheck, DurationCheck) {\n\t\t\treturn Nature{}\n\t\t}\n\n\tcase \"*\":\n\t\tif l.IsNumber() && r.IsNumber() {\n\t\t\treturn l.PromoteNumericNature(&v.config.NtCache, r)\n\t\t}\n\t\tif l.IsNumber() && r.IsDuration() {\n\t\t\treturn v.config.NtCache.FromType(durationType)\n\t\t}\n\t\tif l.IsDuration() && r.IsNumber() {\n\t\t\treturn v.config.NtCache.FromType(durationType)\n\t\t}\n\t\tif l.IsDuration() && r.IsDuration() {\n\t\t\treturn v.config.NtCache.FromType(durationType)\n\t\t}\n\t\tif l.MaybeCompatible(&v.config.NtCache, r, NumberCheck, DurationCheck) {\n\t\t\treturn Nature{}\n\t\t}\n\n\tcase \"/\":\n\t\tif l.IsNumber() && r.IsNumber() {\n\t\t\treturn v.config.NtCache.FromType(floatType)\n\t\t}\n\t\tif l.MaybeCompatible(&v.config.NtCache, r, NumberCheck) {\n\t\t\treturn v.config.NtCache.FromType(floatType)\n\t\t}\n\n\tcase \"**\", \"^\":\n\t\tif l.IsNumber() && r.IsNumber() {\n\t\t\treturn v.config.NtCache.FromType(floatType)\n\t\t}\n\t\tif l.MaybeCompatible(&v.config.NtCache, r, NumberCheck) {\n\t\t\treturn v.config.NtCache.FromType(floatType)\n\t\t}\n\n\tcase \"%\":\n\t\tif l.IsInteger && r.IsInteger {\n\t\t\treturn v.config.NtCache.FromType(intType)\n\t\t}\n\t\tif l.MaybeCompatible(&v.config.NtCache, r, IntegerCheck) {\n\t\t\treturn v.config.NtCache.FromType(intType)\n\t\t}\n\n\tcase \"+\":\n\t\tif l.IsNumber() && r.IsNumber() {\n\t\t\treturn l.PromoteNumericNature(&v.config.NtCache, r)\n\t\t}\n\t\tif l.IsString() && r.IsString() {\n\t\t\treturn v.config.NtCache.FromType(stringType)\n\t\t}\n\t\tif l.IsTime() && r.IsDuration() {\n\t\t\treturn v.config.NtCache.FromType(timeType)\n\t\t}\n\t\tif l.IsDuration() && r.IsTime() {\n\t\t\treturn v.config.NtCache.FromType(timeType)\n\t\t}\n\t\tif l.IsDuration() && r.IsDuration() {\n\t\t\treturn v.config.NtCache.FromType(durationType)\n\t\t}\n\t\tif l.MaybeCompatible(&v.config.NtCache, r, NumberCheck, StringCheck, TimeCheck, DurationCheck) {\n\t\t\treturn Nature{}\n\t\t}\n\n\tcase \"in\":\n\t\tif (l.IsString() || l.IsUnknown(&v.config.NtCache)) && r.IsStruct() {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\t\tif r.IsMap() {\n\t\t\trKey := r.Key(&v.config.NtCache)\n\t\t\tif !l.IsUnknown(&v.config.NtCache) && !l.AssignableTo(rKey) {\n\t\t\t\treturn v.error(node, \"cannot use %s as type %s in map key\", l.String(), rKey.String())\n\t\t\t}\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\t\tif r.IsArray() {\n\t\t\trElem := r.Elem(&v.config.NtCache)\n\t\t\tif !l.ComparableTo(&v.config.NtCache, rElem) {\n\t\t\t\treturn v.error(node, \"cannot use %s as type %s in array\", l.String(), rElem.String())\n\t\t\t}\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\t\tif l.IsUnknown(&v.config.NtCache) && r.IsAnyOf(StringCheck, ArrayCheck, MapCheck) {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\t\tif r.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\n\tcase \"matches\":\n\t\tif s, ok := node.Right.(*ast.StringNode); ok {\n\t\t\t_, err := regexp.Compile(s.Value)\n\t\t\tif err != nil {\n\t\t\t\treturn v.error(node, err.Error())\n\t\t\t}\n\t\t}\n\t\tif (l.IsString() || l.IsByteSlice()) && r.IsString() {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\t\tif l.MaybeCompatible(&v.config.NtCache, r, StringCheck) {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\n\tcase \"contains\", \"startsWith\", \"endsWith\":\n\t\tif l.IsString() && r.IsString() {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\t\tif l.MaybeCompatible(&v.config.NtCache, r, StringCheck) {\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\n\tcase \"..\":\n\t\tif l.IsInteger && r.IsInteger || l.MaybeCompatible(&v.config.NtCache, r, IntegerCheck) {\n\t\t\treturn ArrayFromType(&v.config.NtCache, intType)\n\t\t}\n\n\tcase \"??\":\n\t\tif l.Nil && !r.Nil {\n\t\t\treturn r\n\t\t}\n\t\tif !l.Nil && r.Nil {\n\t\t\treturn l\n\t\t}\n\t\tif l.Nil && r.Nil {\n\t\t\treturn v.config.NtCache.NatureOf(nil)\n\t\t}\n\t\tif r.AssignableTo(l) {\n\t\t\treturn l\n\t\t}\n\t\treturn Nature{}\n\n\tdefault:\n\t\treturn v.error(node, \"unknown operator (%s)\", node.Operator)\n\n\t}\n\n\treturn v.error(node, `invalid operation: %s (mismatched types %s and %s)`, node.Operator, l.String(), r.String())\n}\n\nfunc (v *Checker) chainNode(node *ast.ChainNode) Nature {\n\treturn v.visit(node.Node)\n}\n\nfunc (v *Checker) memberNode(node *ast.MemberNode) Nature {\n\t// $env variable\n\tif an, ok := node.Node.(*ast.IdentifierNode); ok && an.Value == \"$env\" {\n\t\tif name, ok := node.Property.(*ast.StringNode); ok {\n\t\t\tstrict := v.config.Strict\n\t\t\tif node.Optional {\n\t\t\t\t// If user explicitly set optional flag, then we should not\n\t\t\t\t// throw error if field is not found (as user trying to handle\n\t\t\t\t// this case). But if user did not set optional flag, then we\n\t\t\t\t// should throw error if field is not found & v.config.Strict.\n\t\t\t\tstrict = false\n\t\t\t}\n\t\t\treturn v.ident(node, name.Value, strict, false /* no builtins and no functions */)\n\t\t}\n\t\treturn Nature{}\n\t}\n\n\tbase := v.visit(node.Node)\n\tprop := v.visit(node.Property)\n\n\tif base.IsUnknown(&v.config.NtCache) {\n\t\treturn Nature{}\n\t}\n\n\tif name, ok := node.Property.(*ast.StringNode); ok {\n\t\tif base.Nil {\n\t\t\treturn v.error(node, \"type nil has no field %s\", name.Value)\n\t\t}\n\n\t\t// First, check methods defined on base type itself,\n\t\t// independent of which type it is. Without dereferencing.\n\t\tif m, ok := base.MethodByName(&v.config.NtCache, name.Value); ok {\n\t\t\treturn m\n\t\t}\n\t}\n\n\tbase = base.Deref(&v.config.NtCache)\n\n\tswitch base.Kind {\n\tcase reflect.Map:\n\t\t// If the map key is a pointer, we should not dereference the property.\n\t\tif !prop.AssignableTo(base.Key(&v.config.NtCache)) {\n\t\t\tpropDeref := prop.Deref(&v.config.NtCache)\n\t\t\tif propDeref.AssignableTo(base.Key(&v.config.NtCache)) {\n\t\t\t\tprop = propDeref\n\t\t\t}\n\t\t}\n\t\tif !prop.AssignableTo(base.Key(&v.config.NtCache)) && !prop.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Property, \"cannot use %s to get an element from %s\", prop.String(), base.String())\n\t\t}\n\t\tif prop, ok := node.Property.(*ast.StringNode); ok && base.TypeData != nil {\n\t\t\tif field, ok := base.Fields[prop.Value]; ok {\n\t\t\t\treturn field\n\t\t\t} else if base.Strict {\n\t\t\t\treturn v.error(node.Property, \"unknown field %s\", prop.Value)\n\t\t\t}\n\t\t}\n\t\treturn base.Elem(&v.config.NtCache)\n\n\tcase reflect.Array, reflect.Slice:\n\t\tprop = prop.Deref(&v.config.NtCache)\n\t\tif !prop.IsInteger && !prop.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Property, \"array elements can only be selected using an integer (got %s)\", prop.String())\n\t\t}\n\t\treturn base.Elem(&v.config.NtCache)\n\n\tcase reflect.Struct:\n\t\tif name, ok := node.Property.(*ast.StringNode); ok {\n\t\t\tpropertyName := name.Value\n\t\t\tif field, ok := base.FieldByName(&v.config.NtCache, propertyName); ok {\n\t\t\t\treturn v.config.NtCache.FromType(field.Type)\n\t\t\t}\n\t\t\tif node.Method {\n\t\t\t\treturn v.error(node, \"type %v has no method %v\", base.String(), propertyName)\n\t\t\t}\n\t\t\treturn v.error(node, \"type %v has no field %v\", base.String(), propertyName)\n\t\t}\n\t}\n\n\t// Not found.\n\n\tif name, ok := node.Property.(*ast.StringNode); ok {\n\t\tif node.Method {\n\t\t\treturn v.error(node, \"type %v has no method %v\", base.String(), name.Value)\n\t\t}\n\t\treturn v.error(node, \"type %v has no field %v\", base.String(), name.Value)\n\t}\n\treturn v.error(node, \"type %v[%v] is undefined\", base.String(), prop.String())\n}\n\nfunc (v *Checker) sliceNode(node *ast.SliceNode) Nature {\n\tnt := v.visit(node.Node)\n\n\tif nt.IsUnknown(&v.config.NtCache) {\n\t\treturn Nature{}\n\t}\n\n\tswitch nt.Kind {\n\tcase reflect.String, reflect.Array, reflect.Slice:\n\t\t// ok\n\tdefault:\n\t\treturn v.error(node, \"cannot slice %s\", nt.String())\n\t}\n\n\tif node.From != nil {\n\t\tfrom := v.visit(node.From)\n\t\tfrom = from.Deref(&v.config.NtCache)\n\t\tif !from.IsInteger && !from.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.From, \"non-integer slice index %v\", from.String())\n\t\t}\n\t}\n\n\tif node.To != nil {\n\t\tto := v.visit(node.To)\n\t\tto = to.Deref(&v.config.NtCache)\n\t\tif !to.IsInteger && !to.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.To, \"non-integer slice index %v\", to.String())\n\t\t}\n\t}\n\n\treturn nt\n}\n\nfunc (v *Checker) callNode(node *ast.CallNode) Nature {\n\t// Check if type was set on node (for example, by patcher)\n\t// and use node type instead of function return type.\n\t//\n\t// If node type is anyType, then we should use function\n\t// return type. For example, on error we return anyType\n\t// for a call `errCall().Method()` and method will be\n\t// evaluated on `anyType.Method()`, so return type will\n\t// be anyType `anyType.Method(): anyType`. Patcher can\n\t// fix `errCall()` to return proper type, so on second\n\t// checker pass we should replace anyType on method node\n\t// with new correct function return type.\n\tif typ := node.Type(); typ != nil && typ != anyType {\n\t\treturn *node.Nature()\n\t}\n\n\t// $env is not callable.\n\tif id, ok := node.Callee.(*ast.IdentifierNode); ok && id.Value == \"$env\" {\n\t\treturn v.error(node, \"%s is not callable\", v.config.Env.String())\n\t}\n\n\tnt := v.visit(node.Callee)\n\tif nt.IsUnknown(&v.config.NtCache) {\n\t\treturn Nature{}\n\t}\n\n\tif nt.TypeData != nil && nt.TypeData.Func != nil {\n\t\treturn v.checkFunction(nt.TypeData.Func, node, node.Arguments)\n\t}\n\n\tfnName := \"function\"\n\tif identifier, ok := node.Callee.(*ast.IdentifierNode); ok {\n\t\tfnName = identifier.Value\n\t}\n\tif member, ok := node.Callee.(*ast.MemberNode); ok {\n\t\tif name, ok := member.Property.(*ast.StringNode); ok {\n\t\t\tfnName = name.Value\n\t\t}\n\t}\n\n\tif nt.Nil {\n\t\treturn v.error(node, \"%v is nil; cannot call nil as function\", fnName)\n\t}\n\n\tif nt.Kind == reflect.Func {\n\t\toutType, err := v.checkArguments(fnName, nt, node.Arguments, node)\n\t\tif err != nil {\n\t\t\tif v.err == nil {\n\t\t\t\tv.err = err\n\t\t\t}\n\t\t\treturn Nature{}\n\t\t}\n\t\treturn outType\n\t}\n\treturn v.error(node, \"%s is not callable\", nt.String())\n}\n\nfunc (v *Checker) builtinNode(node *ast.BuiltinNode) Nature {\n\tswitch node.Name {\n\tcase \"all\", \"none\", \"any\", \"one\":\n\t\tcollection := v.visit(node.Arguments[0])\n\t\tcollection = collection.Deref(&v.config.NtCache)\n\t\tif !collection.IsArray() && !collection.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Arguments[0], \"builtin %v takes only array (got %v)\", node.Name, collection.String())\n\t\t}\n\n\t\tv.begin(collection)\n\t\tpredicate := v.visit(node.Arguments[1])\n\t\tv.end()\n\n\t\tif predicate.IsFunc() &&\n\t\t\tpredicate.NumOut() == 1 &&\n\t\t\tpredicate.NumIn() == 1 && predicate.IsFirstArgUnknown(&v.config.NtCache) {\n\n\t\t\tpredicateOut := predicate.Out(&v.config.NtCache, 0)\n\t\t\tif !predicateOut.IsBool() && !predicateOut.IsUnknown(&v.config.NtCache) {\n\t\t\t\treturn v.error(node.Arguments[1], \"predicate should return boolean (got %s)\", predicateOut.String())\n\t\t\t}\n\t\t\treturn v.config.NtCache.FromType(boolType)\n\t\t}\n\t\treturn v.error(node.Arguments[1], \"predicate should has one input and one output param\")\n\n\tcase \"filter\":\n\t\tcollection := v.visit(node.Arguments[0])\n\t\tcollection = collection.Deref(&v.config.NtCache)\n\t\tif !collection.IsArray() && !collection.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Arguments[0], \"builtin %v takes only array (got %v)\", node.Name, collection.String())\n\t\t}\n\n\t\tv.begin(collection)\n\t\tpredicate := v.visit(node.Arguments[1])\n\t\tv.end()\n\n\t\tif predicate.IsFunc() &&\n\t\t\tpredicate.NumOut() == 1 &&\n\t\t\tpredicate.NumIn() == 1 && predicate.IsFirstArgUnknown(&v.config.NtCache) {\n\n\t\t\tpredicateOut := predicate.Out(&v.config.NtCache, 0)\n\t\t\tif !predicateOut.IsBool() && !predicateOut.IsUnknown(&v.config.NtCache) {\n\t\t\t\treturn v.error(node.Arguments[1], \"predicate should return boolean (got %s)\", predicateOut.String())\n\t\t\t}\n\t\t\tif collection.IsUnknown(&v.config.NtCache) {\n\t\t\t\treturn v.config.NtCache.FromType(arrayType)\n\t\t\t}\n\t\t\tcollection = collection.Elem(&v.config.NtCache)\n\t\t\treturn collection.MakeArrayOf(&v.config.NtCache)\n\t\t}\n\t\treturn v.error(node.Arguments[1], \"predicate should has one input and one output param\")\n\n\tcase \"map\":\n\t\tcollection := v.visit(node.Arguments[0])\n\t\tcollection = collection.Deref(&v.config.NtCache)\n\t\tif !collection.IsArray() && !collection.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Arguments[0], \"builtin %v takes only array (got %v)\", node.Name, collection.String())\n\t\t}\n\n\t\tv.begin(collection, varScope{\"index\", v.config.NtCache.FromType(intType)})\n\t\tpredicate := v.visit(node.Arguments[1])\n\t\tv.end()\n\n\t\tif predicate.IsFunc() &&\n\t\t\tpredicate.NumOut() == 1 &&\n\t\t\tpredicate.NumIn() == 1 && predicate.IsFirstArgUnknown(&v.config.NtCache) {\n\n\t\t\treturn predicate.Ref.MakeArrayOf(&v.config.NtCache)\n\t\t}\n\t\treturn v.error(node.Arguments[1], \"predicate should has one input and one output param\")\n\n\tcase \"count\":\n\t\tcollection := v.visit(node.Arguments[0])\n\t\tcollection = collection.Deref(&v.config.NtCache)\n\t\tif !collection.IsArray() && !collection.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Arguments[0], \"builtin %v takes only array (got %v)\", node.Name, collection.String())\n\t\t}\n\n\t\tif len(node.Arguments) == 1 {\n\t\t\treturn v.config.NtCache.FromType(intType)\n\t\t}\n\n\t\tv.begin(collection)\n\t\tpredicate := v.visit(node.Arguments[1])\n\t\tv.end()\n\n\t\tif predicate.IsFunc() &&\n\t\t\tpredicate.NumOut() == 1 &&\n\t\t\tpredicate.NumIn() == 1 && predicate.IsFirstArgUnknown(&v.config.NtCache) {\n\t\t\tpredicateOut := predicate.Out(&v.config.NtCache, 0)\n\t\t\tif !predicateOut.IsBool() && !predicateOut.IsUnknown(&v.config.NtCache) {\n\t\t\t\treturn v.error(node.Arguments[1], \"predicate should return boolean (got %s)\", predicateOut.String())\n\t\t\t}\n\n\t\t\treturn v.config.NtCache.FromType(intType)\n\t\t}\n\t\treturn v.error(node.Arguments[1], \"predicate should has one input and one output param\")\n\n\tcase \"sum\":\n\t\tcollection := v.visit(node.Arguments[0])\n\t\tcollection = collection.Deref(&v.config.NtCache)\n\t\tif !collection.IsArray() && !collection.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Arguments[0], \"builtin %v takes only array (got %v)\", node.Name, collection.String())\n\t\t}\n\n\t\tif len(node.Arguments) == 2 {\n\t\t\tv.begin(collection)\n\t\t\tpredicate := v.visit(node.Arguments[1])\n\t\t\tv.end()\n\n\t\t\tif predicate.IsFunc() &&\n\t\t\t\tpredicate.NumOut() == 1 &&\n\t\t\t\tpredicate.NumIn() == 1 && predicate.IsFirstArgUnknown(&v.config.NtCache) {\n\t\t\t\treturn predicate.Out(&v.config.NtCache, 0)\n\t\t\t}\n\t\t} else {\n\t\t\tif collection.IsUnknown(&v.config.NtCache) {\n\t\t\t\treturn Nature{}\n\t\t\t}\n\t\t\treturn collection.Elem(&v.config.NtCache)\n\t\t}\n\n\tcase \"find\", \"findLast\":\n\t\tcollection := v.visit(node.Arguments[0])\n\t\tcollection = collection.Deref(&v.config.NtCache)\n\t\tif !collection.IsArray() && !collection.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Arguments[0], \"builtin %v takes only array (got %v)\", node.Name, collection.String())\n\t\t}\n\n\t\tv.begin(collection)\n\t\tpredicate := v.visit(node.Arguments[1])\n\t\tv.end()\n\n\t\tif predicate.IsFunc() &&\n\t\t\tpredicate.NumOut() == 1 &&\n\t\t\tpredicate.NumIn() == 1 && predicate.IsFirstArgUnknown(&v.config.NtCache) {\n\n\t\t\tpredicateOut := predicate.Out(&v.config.NtCache, 0)\n\t\t\tif !predicateOut.IsBool() && !predicateOut.IsUnknown(&v.config.NtCache) {\n\t\t\t\treturn v.error(node.Arguments[1], \"predicate should return boolean (got %s)\", predicateOut.String())\n\t\t\t}\n\t\t\tif collection.IsUnknown(&v.config.NtCache) {\n\t\t\t\treturn Nature{}\n\t\t\t}\n\t\t\treturn collection.Elem(&v.config.NtCache)\n\t\t}\n\t\treturn v.error(node.Arguments[1], \"predicate should has one input and one output param\")\n\n\tcase \"findIndex\", \"findLastIndex\":\n\t\tcollection := v.visit(node.Arguments[0])\n\t\tcollection = collection.Deref(&v.config.NtCache)\n\t\tif !collection.IsArray() && !collection.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Arguments[0], \"builtin %v takes only array (got %v)\", node.Name, collection.String())\n\t\t}\n\n\t\tv.begin(collection)\n\t\tpredicate := v.visit(node.Arguments[1])\n\t\tv.end()\n\n\t\tif predicate.IsFunc() &&\n\t\t\tpredicate.NumOut() == 1 &&\n\t\t\tpredicate.NumIn() == 1 && predicate.IsFirstArgUnknown(&v.config.NtCache) {\n\n\t\t\tpredicateOut := predicate.Out(&v.config.NtCache, 0)\n\t\t\tif !predicateOut.IsBool() && !predicateOut.IsUnknown(&v.config.NtCache) {\n\t\t\t\treturn v.error(node.Arguments[1], \"predicate should return boolean (got %s)\", predicateOut.String())\n\t\t\t}\n\t\t\treturn v.config.NtCache.FromType(intType)\n\t\t}\n\t\treturn v.error(node.Arguments[1], \"predicate should has one input and one output param\")\n\n\tcase \"groupBy\":\n\t\tcollection := v.visit(node.Arguments[0])\n\t\tcollection = collection.Deref(&v.config.NtCache)\n\t\tif !collection.IsArray() && !collection.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Arguments[0], \"builtin %v takes only array (got %v)\", node.Name, collection.String())\n\t\t}\n\n\t\tv.begin(collection)\n\t\tpredicate := v.visit(node.Arguments[1])\n\t\tv.end()\n\n\t\tif predicate.IsFunc() &&\n\t\t\tpredicate.NumOut() == 1 &&\n\t\t\tpredicate.NumIn() == 1 && predicate.IsFirstArgUnknown(&v.config.NtCache) {\n\n\t\t\tcollection = collection.Elem(&v.config.NtCache)\n\t\t\tcollection = collection.MakeArrayOf(&v.config.NtCache)\n\t\t\tnt := v.config.NtCache.NatureOf(map[any][]any{})\n\t\t\tnt.Ref = &collection\n\t\t\treturn nt\n\t\t}\n\t\treturn v.error(node.Arguments[1], \"predicate should has one input and one output param\")\n\n\tcase \"sortBy\":\n\t\tcollection := v.visit(node.Arguments[0])\n\t\tcollection = collection.Deref(&v.config.NtCache)\n\t\tif !collection.IsArray() && !collection.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Arguments[0], \"builtin %v takes only array (got %v)\", node.Name, collection.String())\n\t\t}\n\n\t\tv.begin(collection)\n\t\tpredicate := v.visit(node.Arguments[1])\n\t\tv.end()\n\n\t\tif len(node.Arguments) == 3 {\n\t\t\torder := v.visit(node.Arguments[2])\n\t\t\tif !order.IsString() && !order.IsUnknown(&v.config.NtCache) {\n\t\t\t\treturn v.error(node.Arguments[2], \"sortBy order argument must be a string (got %v)\", order.String())\n\t\t\t}\n\t\t}\n\n\t\tif predicate.IsFunc() &&\n\t\t\tpredicate.NumOut() == 1 &&\n\t\t\tpredicate.NumIn() == 1 && predicate.IsFirstArgUnknown(&v.config.NtCache) {\n\n\t\t\treturn collection\n\t\t}\n\t\treturn v.error(node.Arguments[1], \"predicate should has one input and one output param\")\n\n\tcase \"reduce\":\n\t\tcollection := v.visit(node.Arguments[0])\n\t\tcollection = collection.Deref(&v.config.NtCache)\n\t\tif !collection.IsArray() && !collection.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Arguments[0], \"builtin %v takes only array (got %v)\", node.Name, collection.String())\n\t\t}\n\n\t\tv.begin(collection, varScope{\"index\", v.config.NtCache.FromType(intType)}, varScope{\"acc\", Nature{}})\n\t\tpredicate := v.visit(node.Arguments[1])\n\t\tv.end()\n\n\t\tif len(node.Arguments) == 3 {\n\t\t\t_ = v.visit(node.Arguments[2])\n\t\t}\n\n\t\tif predicate.IsFunc() && predicate.NumOut() == 1 {\n\t\t\treturn *predicate.Ref\n\t\t}\n\t\treturn v.error(node.Arguments[1], \"predicate should has two input and one output param\")\n\n\t}\n\n\tif id, ok := builtin.Index[node.Name]; ok {\n\t\tswitch node.Name {\n\t\tcase \"get\":\n\t\t\treturn v.checkBuiltinGet(node)\n\t\t}\n\t\treturn v.checkFunction(builtin.Builtins[id], node, node.Arguments)\n\t}\n\n\treturn v.error(node, \"unknown builtin %v\", node.Name)\n}\n\nfunc (v *Checker) begin(collectionNature Nature, vars ...varScope) {\n\tv.predicateScopes = append(v.predicateScopes, predicateScope{\n\t\tcollection: collectionNature,\n\t\tvars:       vars,\n\t})\n}\n\nfunc (v *Checker) end() {\n\tv.predicateScopes = v.predicateScopes[:len(v.predicateScopes)-1]\n}\n\nfunc (v *Checker) checkBuiltinGet(node *ast.BuiltinNode) Nature {\n\tif len(node.Arguments) != 2 {\n\t\treturn v.error(node, \"invalid number of arguments (expected 2, got %d)\", len(node.Arguments))\n\t}\n\n\tbase := v.visit(node.Arguments[0])\n\tprop := v.visit(node.Arguments[1])\n\tprop = prop.Deref(&v.config.NtCache)\n\n\tif id, ok := node.Arguments[0].(*ast.IdentifierNode); ok && id.Value == \"$env\" {\n\t\tif s, ok := node.Arguments[1].(*ast.StringNode); ok {\n\t\t\tif nt, ok := v.config.Env.Get(&v.config.NtCache, s.Value); ok {\n\t\t\t\treturn nt\n\t\t\t}\n\t\t}\n\t\treturn Nature{}\n\t}\n\n\tif base.IsUnknown(&v.config.NtCache) {\n\t\treturn Nature{}\n\t}\n\n\tswitch base.Kind {\n\tcase reflect.Slice, reflect.Array:\n\t\tif !prop.IsInteger && !prop.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Arguments[1], \"non-integer slice index %s\", prop.String())\n\t\t}\n\t\treturn base.Elem(&v.config.NtCache)\n\tcase reflect.Map:\n\t\tif !prop.AssignableTo(base.Key(&v.config.NtCache)) && !prop.IsUnknown(&v.config.NtCache) {\n\t\t\treturn v.error(node.Arguments[1], \"cannot use %s to get an element from %s\", prop.String(), base.String())\n\t\t}\n\t\treturn base.Elem(&v.config.NtCache)\n\t}\n\treturn v.error(node.Arguments[0], \"type %v does not support indexing\", base.String())\n}\n\nfunc (v *Checker) checkFunction(f *builtin.Function, node ast.Node, arguments []ast.Node) Nature {\n\tif f.Validate != nil {\n\t\targs := make([]reflect.Type, len(arguments))\n\t\tfor i, arg := range arguments {\n\t\t\targNature := v.visit(arg)\n\t\t\tif argNature.IsUnknown(&v.config.NtCache) {\n\t\t\t\targs[i] = anyType\n\t\t\t} else {\n\t\t\t\targs[i] = argNature.Type\n\t\t\t}\n\t\t}\n\t\tt, err := f.Validate(args)\n\t\tif err != nil {\n\t\t\treturn v.error(node, \"%v\", err)\n\t\t}\n\t\treturn v.config.NtCache.FromType(t)\n\t} else if len(f.Types) == 0 {\n\t\tnt, err := v.checkArguments(f.Name, v.config.NtCache.FromType(f.Type()), arguments, node)\n\t\tif err != nil {\n\t\t\tif v.err == nil {\n\t\t\t\tv.err = err\n\t\t\t}\n\t\t\treturn Nature{}\n\t\t}\n\t\t// No type was specified, so we assume the function returns any.\n\t\treturn nt\n\t}\n\tvar lastErr *file.Error\n\tfor _, t := range f.Types {\n\t\toutNature, err := v.checkArguments(f.Name, v.config.NtCache.FromType(t), arguments, node)\n\t\tif err != nil {\n\t\t\tlastErr = err\n\t\t\tcontinue\n\t\t}\n\n\t\t// As we found the correct function overload, we can stop the loop.\n\t\t// Also, we need to set the correct nature of the callee so compiler,\n\t\t// can correctly handle OpDeref opcode.\n\t\tif callNode, ok := node.(*ast.CallNode); ok {\n\t\t\tcallNode.Callee.SetType(t)\n\t\t}\n\n\t\treturn outNature\n\t}\n\tif lastErr != nil {\n\t\tif v.err == nil {\n\t\t\tv.err = lastErr\n\t\t}\n\t\treturn Nature{}\n\t}\n\n\treturn v.error(node, \"no matching overload for %v\", f.Name)\n}\n\nfunc (v *Checker) checkArguments(\n\tname string,\n\tfn Nature,\n\targuments []ast.Node,\n\tnode ast.Node,\n) (Nature, *file.Error) {\n\tif fn.IsUnknown(&v.config.NtCache) {\n\t\treturn Nature{}, nil\n\t}\n\n\tnumOut := fn.NumOut()\n\tif numOut == 0 {\n\t\treturn Nature{}, &file.Error{\n\t\t\tLocation: node.Location(),\n\t\t\tMessage:  fmt.Sprintf(\"func %v doesn't return value\", name),\n\t\t}\n\t}\n\tif numOut > 2 {\n\t\treturn Nature{}, &file.Error{\n\t\t\tLocation: node.Location(),\n\t\t\tMessage:  fmt.Sprintf(\"func %v returns more then two values\", name),\n\t\t}\n\t}\n\n\t// If func is method on an env, first argument should be a receiver,\n\t// and actual arguments less than fnNumIn by one.\n\tfnNumIn := fn.NumIn()\n\tif fn.Method { // TODO: Move subtraction to the Nature.NumIn() and Nature.In() methods.\n\t\tfnNumIn--\n\t}\n\t// Skip first argument in case of the receiver.\n\tfnInOffset := 0\n\tif fn.Method {\n\t\tfnInOffset = 1\n\t}\n\n\tvar err *file.Error\n\tisVariadic := fn.IsVariadic()\n\tif isVariadic {\n\t\tif len(arguments) < fnNumIn-1 {\n\t\t\terr = &file.Error{\n\t\t\t\tLocation: node.Location(),\n\t\t\t\tMessage:  fmt.Sprintf(\"not enough arguments to call %v\", name),\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif len(arguments) > fnNumIn {\n\t\t\terr = &file.Error{\n\t\t\t\tLocation: node.Location(),\n\t\t\t\tMessage:  fmt.Sprintf(\"too many arguments to call %v\", name),\n\t\t\t}\n\t\t}\n\t\tif len(arguments) < fnNumIn {\n\t\t\terr = &file.Error{\n\t\t\t\tLocation: node.Location(),\n\t\t\t\tMessage:  fmt.Sprintf(\"not enough arguments to call %v\", name),\n\t\t\t}\n\t\t}\n\t}\n\n\tif err != nil {\n\t\t// If we have an error, we should still visit all arguments to\n\t\t// type check them, as a patch can fix the error later.\n\t\tfor _, arg := range arguments {\n\t\t\t_ = v.visit(arg)\n\t\t}\n\t\treturn fn.Out(&v.config.NtCache, 0), err\n\t}\n\n\tfor i, arg := range arguments {\n\t\targNature := v.visit(arg)\n\n\t\tvar in Nature\n\t\tif isVariadic && i >= fnNumIn-1 {\n\t\t\t// For variadic arguments fn(xs ...int), go replaces type of xs (int) with ([]int).\n\t\t\t// As we compare arguments one by one, we need underling type.\n\t\t\tin = fn.InElem(&v.config.NtCache, fnNumIn-1+fnInOffset)\n\t\t} else {\n\t\t\tin = fn.In(&v.config.NtCache, i+fnInOffset)\n\t\t}\n\n\t\tif in.IsFloat && argNature.IsInteger {\n\t\t\ttraverseAndReplaceIntegerNodesWithFloatNodes(&arguments[i], in)\n\t\t\tcontinue\n\t\t}\n\n\t\tif in.IsInteger && argNature.IsInteger && argNature.Kind != in.Kind {\n\t\t\ttraverseAndReplaceIntegerNodesWithIntegerNodes(&arguments[i], in)\n\t\t\tcontinue\n\t\t}\n\n\t\tif argNature.Nil {\n\t\t\tif in.Kind == reflect.Ptr || in.Kind == reflect.Interface {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn Nature{}, &file.Error{\n\t\t\t\tLocation: arg.Location(),\n\t\t\t\tMessage:  fmt.Sprintf(\"cannot use nil as argument (type %s) to call %v\", in.String(), name),\n\t\t\t}\n\t\t}\n\n\t\t// Check if argument is assignable to the function input type.\n\t\t// We check original type (like *time.Time), not dereferenced type,\n\t\t// as function input type can be pointer to a struct.\n\t\tassignable := argNature.AssignableTo(in)\n\n\t\t// We also need to check if dereference arg type is assignable to the function input type.\n\t\t// For example, func(int) and argument *int. In this case we will add OpDeref to the argument,\n\t\t// so we can call the function with *int argument.\n\t\tif !assignable && argNature.IsPointer() {\n\t\t\tnt := argNature.Deref(&v.config.NtCache)\n\t\t\tassignable = nt.AssignableTo(in)\n\t\t}\n\n\t\tif !assignable && !argNature.IsUnknown(&v.config.NtCache) {\n\t\t\treturn Nature{}, &file.Error{\n\t\t\t\tLocation: arg.Location(),\n\t\t\t\tMessage:  fmt.Sprintf(\"cannot use %s as argument (type %s) to call %v \", argNature.String(), in.String(), name),\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fn.Out(&v.config.NtCache, 0), nil\n}\n\nfunc traverseAndReplaceIntegerNodesWithFloatNodes(node *ast.Node, newNature Nature) {\n\tswitch (*node).(type) {\n\tcase *ast.IntegerNode:\n\t\t*node = &ast.FloatNode{Value: float64((*node).(*ast.IntegerNode).Value)}\n\t\t(*node).SetType(newNature.Type)\n\tcase *ast.UnaryNode:\n\t\tunaryNode := (*node).(*ast.UnaryNode)\n\t\ttraverseAndReplaceIntegerNodesWithFloatNodes(&unaryNode.Node, newNature)\n\tcase *ast.BinaryNode:\n\t\tbinaryNode := (*node).(*ast.BinaryNode)\n\t\tswitch binaryNode.Operator {\n\t\tcase \"+\", \"-\", \"*\":\n\t\t\ttraverseAndReplaceIntegerNodesWithFloatNodes(&binaryNode.Left, newNature)\n\t\t\ttraverseAndReplaceIntegerNodesWithFloatNodes(&binaryNode.Right, newNature)\n\t\t}\n\t}\n}\n\nfunc traverseAndReplaceIntegerNodesWithIntegerNodes(node *ast.Node, newNature Nature) {\n\tswitch (*node).(type) {\n\tcase *ast.IntegerNode:\n\t\t(*node).SetType(newNature.Type)\n\tcase *ast.UnaryNode:\n\t\t(*node).SetType(newNature.Type)\n\t\tunaryNode := (*node).(*ast.UnaryNode)\n\t\ttraverseAndReplaceIntegerNodesWithIntegerNodes(&unaryNode.Node, newNature)\n\tcase *ast.BinaryNode:\n\t\t// TODO: Binary node return type is dependent on the type of the operands. We can't just change the type of the node.\n\t\tbinaryNode := (*node).(*ast.BinaryNode)\n\t\tswitch binaryNode.Operator {\n\t\tcase \"+\", \"-\", \"*\":\n\t\t\ttraverseAndReplaceIntegerNodesWithIntegerNodes(&binaryNode.Left, newNature)\n\t\t\ttraverseAndReplaceIntegerNodesWithIntegerNodes(&binaryNode.Right, newNature)\n\t\t}\n\t}\n}\n\nfunc (v *Checker) predicateNode(node *ast.PredicateNode) Nature {\n\tnt := v.visit(node.Node)\n\tvar out []reflect.Type\n\tif nt.IsUnknown(&v.config.NtCache) {\n\t\tout = append(out, anyType)\n\t} else if !nt.Nil {\n\t\tout = append(out, nt.Type)\n\t}\n\tn := v.config.NtCache.FromType(reflect.FuncOf(anyTypeSlice, out, false))\n\tn.Ref = &nt\n\treturn n\n}\n\nfunc (v *Checker) pointerNode(node *ast.PointerNode) Nature {\n\tif len(v.predicateScopes) == 0 {\n\t\treturn v.error(node, \"cannot use pointer accessor outside predicate\")\n\t}\n\tscope := v.predicateScopes[len(v.predicateScopes)-1]\n\tif node.Name == \"\" {\n\t\tif scope.collection.IsUnknown(&v.config.NtCache) {\n\t\t\treturn Nature{}\n\t\t}\n\t\tswitch scope.collection.Kind {\n\t\tcase reflect.Array, reflect.Slice:\n\t\t\treturn scope.collection.Elem(&v.config.NtCache)\n\t\t}\n\t\treturn v.error(node, \"cannot use %v as array\", scope)\n\t}\n\tif scope.vars != nil {\n\t\tfor i := range scope.vars {\n\t\t\tif node.Name == scope.vars[i].name {\n\t\t\t\treturn scope.vars[i].nature\n\t\t\t}\n\t\t}\n\t}\n\treturn v.error(node, \"unknown pointer #%v\", node.Name)\n}\n\nfunc (v *Checker) variableDeclaratorNode(node *ast.VariableDeclaratorNode) Nature {\n\tif _, ok := v.config.Env.Get(&v.config.NtCache, node.Name); ok {\n\t\treturn v.error(node, \"cannot redeclare %v\", node.Name)\n\t}\n\tif _, ok := v.config.Functions[node.Name]; ok {\n\t\treturn v.error(node, \"cannot redeclare function %v\", node.Name)\n\t}\n\tif _, ok := v.config.Builtins[node.Name]; ok {\n\t\treturn v.error(node, \"cannot redeclare builtin %v\", node.Name)\n\t}\n\tfor i := len(v.varScopes) - 1; i >= 0; i-- {\n\t\tif v.varScopes[i].name == node.Name {\n\t\t\treturn v.error(node, \"cannot redeclare variable %v\", node.Name)\n\t\t}\n\t}\n\tvarNature := v.visit(node.Value)\n\tv.varScopes = append(v.varScopes, varScope{node.Name, varNature})\n\texprNature := v.visit(node.Expr)\n\tv.varScopes = v.varScopes[:len(v.varScopes)-1]\n\treturn exprNature\n}\n\nfunc (v *Checker) sequenceNode(node *ast.SequenceNode) Nature {\n\tif len(node.Nodes) == 0 {\n\t\treturn v.error(node, \"empty sequence expression\")\n\t}\n\tvar last Nature\n\tfor _, node := range node.Nodes {\n\t\tlast = v.visit(node)\n\t}\n\treturn last\n}\n\nfunc (v *Checker) conditionalNode(node *ast.ConditionalNode) Nature {\n\tc := v.visit(node.Cond)\n\tc = c.Deref(&v.config.NtCache)\n\tif !c.IsBool() && !c.IsUnknown(&v.config.NtCache) {\n\t\treturn v.error(node.Cond, \"non-bool expression (type %v) used as condition\", c.String())\n\t}\n\n\tt1 := v.visit(node.Exp1)\n\tt2 := v.visit(node.Exp2)\n\n\tif t1.Nil && !t2.Nil {\n\t\treturn t2\n\t}\n\tif !t1.Nil && t2.Nil {\n\t\treturn t1\n\t}\n\tif t1.Nil && t2.Nil {\n\t\treturn v.config.NtCache.NatureOf(nil)\n\t}\n\tif t1.AssignableTo(t2) {\n\t\tif t1.IsArray() && t2.IsArray() {\n\t\t\te1 := t1.Elem(&v.config.NtCache)\n\t\t\te2 := t2.Elem(&v.config.NtCache)\n\t\t\tif !e1.AssignableTo(e2) || !e2.AssignableTo(e1) {\n\t\t\t\treturn v.config.NtCache.FromType(arrayType)\n\t\t\t}\n\t\t}\n\t\treturn t1\n\t}\n\treturn Nature{}\n}\n\nfunc (v *Checker) arrayNode(node *ast.ArrayNode) Nature {\n\tvar prev Nature\n\tallElementsAreSameType := true\n\tfor i, node := range node.Nodes {\n\t\tcurr := v.visit(node)\n\t\tif i > 0 {\n\t\t\tif curr.Kind != prev.Kind {\n\t\t\t\tallElementsAreSameType = false\n\t\t\t}\n\t\t}\n\t\tprev = curr\n\t}\n\tif allElementsAreSameType {\n\t\treturn prev.MakeArrayOf(&v.config.NtCache)\n\t}\n\treturn v.config.NtCache.FromType(arrayType)\n}\n\nfunc (v *Checker) mapNode(node *ast.MapNode) Nature {\n\tfor _, pair := range node.Pairs {\n\t\tv.visit(pair)\n\t}\n\treturn v.config.NtCache.FromType(mapType)\n}\n\nfunc (v *Checker) pairNode(node *ast.PairNode) Nature {\n\tv.visit(node.Key)\n\tv.visit(node.Value)\n\treturn v.config.NtCache.NatureOf(nil)\n}\n"
  },
  {
    "path": "checker/checker_bench_test.go",
    "content": "package checker_test\n\nimport (\n\t\"runtime\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/checker\"\n\t\"github.com/expr-lang/expr/checker/nature\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/parser\"\n)\n\nfunc BenchmarkChecker(b *testing.B) {\n\tcases := []struct {\n\t\tname, input string\n\t}{\n\t\t{\"function calls\", `\nfunc(\n\tfunc(\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t),\n\tfunc(\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t),\n\tfunc(\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t)\n)\n\t\t`},\n\t\t{\"unary and binary operations\", `\n!b && !b || !b == !b && !b != !b || 1 < 1.0 && 0.1 > 1 || 0 <= 1.0 && 0.1 >= 1 &&\n!b && !b || !b == !b && !b != !b || 1 < 1.0 && 0.1 > 1 || 0 <= 1.0 && 0.1 >= 1 &&\n!b && !b || !b == !b && !b != !b || 1 < 1.0 && 0.1 > 1 || 0 <= 1.0 && 0.1 >= 1 &&\n!b && !b || !b == !b && !b != !b || 1 < 1.0 && 0.1 > 1 || 0 <= 1.0 && 0.1 >= 1 &&\n!b && !b || !b == !b && !b != !b || 1 < 1.0 && 0.1 > 1 || 0 <= 1.0 && 0.1 >= 1 &&\n!b && !b || !b == !b && !b != !b || 1 < 1.0 && 0.1 > 1 || 0 <= 1.0 && 0.1 >= 1\n\t\t`},\n\t\t{\"deep struct access\", `\na.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.\na.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.\na.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.\na.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a\n\t\t`},\n\t}\n\n\tf := func(params ...any) (any, error) { return nil, nil }\n\tenv := map[string]any{\n\t\t\"a\":    new(recursive),\n\t\t\"b\":    true,\n\t\t\"func\": f,\n\t}\n\tconfig := conf.New(env)\n\texpr.Function(\"func\", f, f)(config)\n\texpr.ConstExpr(\"func\")(config)\n\n\tfor _, c := range cases {\n\t\tbatchSize := 100_000\n\t\tif batchSize > b.N {\n\t\t\tbatchSize = b.N\n\t\t}\n\t\ttrees := make([]*parser.Tree, 0, batchSize)\n\t\tfor i := 0; i < batchSize; i++ {\n\t\t\ttree, err := parser.ParseWithConfig(c.input, config)\n\t\t\tif err != nil {\n\t\t\t\tb.Fatal(err)\n\t\t\t}\n\t\t\ttrees = append(trees, tree)\n\t\t}\n\t\truntime.GC() // try to cleanup the mess from the initialization\n\n\t\tb.Run(\"name=\"+c.name, func(b *testing.B) {\n\t\t\tvar err error\n\t\t\tfor i := 0; i < b.N; i++ {\n\t\t\t\tj := i\n\t\t\t\tif j < 0 || j >= len(trees) {\n\t\t\t\t\tb.StopTimer()\n\t\t\t\t\tinvalidateTrees(trees...)\n\t\t\t\t\tj = 0\n\t\t\t\t\tb.StartTimer()\n\t\t\t\t}\n\n\t\t\t\t_, err = checker.Check(trees[j], config)\n\t\t\t}\n\t\t\tb.StopTimer()\n\t\t\tif err != nil {\n\t\t\t\tb.Fatal(err)\n\t\t\t}\n\t\t})\n\t}\n}\n\ntype visitorFunc func(*ast.Node)\n\nfunc (f visitorFunc) Visit(node *ast.Node) { f(node) }\n\nfunc invalidateTrees(trees ...*parser.Tree) {\n\tfor _, tree := range trees {\n\t\tast.Walk(&tree.Node, visitorFunc(func(node *ast.Node) {\n\t\t\t(*node).SetNature(nature.Nature{})\n\t\t}))\n\t}\n}\n\ntype recursive struct {\n\tInner *recursive `expr:\"a\"`\n}\n"
  },
  {
    "path": "checker/checker_test.go",
    "content": "package checker_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\t\"github.com/expr-lang/expr/types\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/checker\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/parser\"\n\t\"github.com/expr-lang/expr/test/mock\"\n)\n\nfunc TestCheck(t *testing.T) {\n\tvar tests = []struct {\n\t\tinput string\n\t}{\n\t\t{\"nil == nil\"},\n\t\t{\"nil == IntPtr\"},\n\t\t{\"nil == nil\"},\n\t\t{\"nil in ArrayOfFoo\"},\n\t\t{\"!Bool\"},\n\t\t{\"!BoolPtr == Bool\"},\n\t\t{\"'a' == 'b' + 'c'\"},\n\t\t{\"'foo' contains 'bar'\"},\n\t\t{\"'foo' endsWith 'bar'\"},\n\t\t{\"'foo' startsWith 'bar'\"},\n\t\t{\"(1 == 1) || (String matches Any)\"},\n\t\t{\"Int % Int > 1\"},\n\t\t{\"Int + Int + Int > 0\"},\n\t\t{\"Int == Any\"},\n\t\t{\"Int in Int..Int\"},\n\t\t{\"IntPtrPtr + 1 > 0\"},\n\t\t{\"1 + 2 + Int64 > 0\"},\n\t\t{\"Int64 % 1 > 0\"},\n\t\t{\"IntPtr == Int\"},\n\t\t{\"FloatPtr == 1 + 2.\"},\n\t\t{\"1 + 2 + Float + 3 + 4 < 0\"},\n\t\t{\"1 + Int + Float == 0.5\"},\n\t\t{\"-1 + +1 == 0\"},\n\t\t{\"1 / 2 == 0\"},\n\t\t{\"2**3 + 1 != 0\"},\n\t\t{\"2^3 + 1 != 0\"},\n\t\t{\"Float == 1\"},\n\t\t{\"Float < 1.0\"},\n\t\t{\"Float <= 1.0\"},\n\t\t{\"Float > 1.0\"},\n\t\t{\"Float >= 1.0\"},\n\t\t{`\"a\" < \"b\"`},\n\t\t{\"String + (true ? String : String) == ''\"},\n\t\t{\"(Any ? nil : '') == ''\"},\n\t\t{\"(Any ? 0 : nil) == 0\"},\n\t\t{\"(Any ? nil : nil) == nil\"},\n\t\t{\"!(Any ? Foo : Foo.Bar).Anything\"},\n\t\t{\"Int in ArrayOfInt\"},\n\t\t{\"Int not in ArrayOfAny\"},\n\t\t{\"String in ArrayOfAny\"},\n\t\t{\"String in ArrayOfString\"},\n\t\t{\"String in Foo\"},\n\t\t{\"String in MapOfFoo\"},\n\t\t{\"String matches 'ok'\"},\n\t\t{\"String matches Any\"},\n\t\t{\"String not matches Any\"},\n\t\t{\"StringPtr == nil\"},\n\t\t{\"[1, 2, 3] == []\"},\n\t\t{\"len([]) > 0\"},\n\t\t{\"Any matches Any\"},\n\t\t{\"!Any.Things.Contains.Any\"},\n\t\t{\"!ArrayOfAny[0].next.goes['any thing']\"},\n\t\t{\"ArrayOfFoo[0].Bar.Baz == ''\"},\n\t\t{\"ArrayOfFoo[0:10][0].Bar.Baz == ''\"},\n\t\t{\"!ArrayOfAny[Any]\"},\n\t\t{\"Bool && Any\"},\n\t\t{\"FuncParam(true, 1, 'str')\"},\n\t\t{\"FuncParamAny(nil)\"},\n\t\t{\"!Fast(Any, String)\"},\n\t\t{\"Foo.Method().Baz == ''\"},\n\t\t{\"Foo.Bar == MapOfAny.id.Bar\"},\n\t\t{\"Foo.Bar.Baz == ''\"},\n\t\t{\"MapOfFoo['any'].Bar.Baz == ''\"},\n\t\t{\"Func() == 0\"},\n\t\t{\"FuncFoo(Foo) > 1\"},\n\t\t{\"Any() > 0\"},\n\t\t{\"Embed.EmbedString == ''\"},\n\t\t{\"EmbedString == ''\"},\n\t\t{\"EmbedMethod(0) == ''\"},\n\t\t{\"Embed.EmbedMethod(0) == ''\"},\n\t\t{\"Embed.EmbedString == ''\"},\n\t\t{\"EmbedString == ''\"},\n\t\t{\"{id: Foo.Bar.Baz, 'str': String} == {}\"},\n\t\t{\"Variadic(0, 1, 2) || Variadic(0)\"},\n\t\t{\"count(1..30, {# % 3 == 0}) > 0\"},\n\t\t{\"map(1..3, {#}) == [1,2,3]\"},\n\t\t{\"map(1..3, #index) == [0,1,2]\"},\n\t\t{\"map(filter(ArrayOfFoo, {.Bar.Baz != ''}), {.Bar}) == []\"},\n\t\t{\"filter(Any, {.AnyMethod()})[0] == ''\"},\n\t\t{\"Time == Time\"},\n\t\t{\"Any == Time\"},\n\t\t{\"Any != Time\"},\n\t\t{\"Any > Time\"},\n\t\t{\"Any >= Time\"},\n\t\t{\"Any < Time\"},\n\t\t{\"Any <= Time\"},\n\t\t{\"Any - Time > Duration\"},\n\t\t{\"Any == Any\"},\n\t\t{\"Any != Any\"},\n\t\t{\"Any > Any\"},\n\t\t{\"Any >= Any\"},\n\t\t{\"Any < Any\"},\n\t\t{\"Any <= Any\"},\n\t\t{\"Any - Any < Duration\"},\n\t\t{\"Time == Any\"},\n\t\t{\"Time != Any\"},\n\t\t{\"Time > Any\"},\n\t\t{\"Time >= Any\"},\n\t\t{\"Time < Any\"},\n\t\t{\"Time <= Any\"},\n\t\t{\"Time - Any == Duration\"},\n\t\t{\"Time + Duration == Time\"},\n\t\t{\"Duration + Time == Time\"},\n\t\t{\"Duration + Any == Time\"},\n\t\t{\"Any + Duration == Time\"},\n\t\t{\"Any.A?.B == nil\"},\n\t\t{\"(Any.Bool ?? Bool) > 0\"},\n\t\t{\"Bool ?? Bool\"},\n\t\t{\"let foo = 1; foo == 1\"},\n\t\t{\"(Embed).EmbedPointerEmbedInt > 0\"},\n\t\t{\"(true ? [1] : [[1]])[0][0] == 1\"},\n\t\t{\"Foo.VariadicMethod('a', 'b', 'c')\"},\n\t}\n\n\tc := new(checker.Checker)\n\tfor _, tt := range tests {\n\t\tt.Run(tt.input, func(t *testing.T) {\n\t\t\tvar err error\n\t\t\ttree, err := parser.Parse(tt.input)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tconfig := conf.New(mock.Env{})\n\t\t\texpr.AsBool()(config)\n\n\t\t\t_, err = c.Check(tree, config)\n\t\t\tassert.NoError(t, err)\n\t\t})\n\t}\n}\n\nfunc TestCheck_error(t *testing.T) {\n\terrorTests := []struct{ code, err string }{\n\t\t{\n\t\t\t`Foo.Bar.Not`,\n\t\t\t`\ntype mock.Bar has no field Not (1:9)\n | Foo.Bar.Not\n | ........^\n`,\n\t\t},\n\t\t{\n\t\t\t`Noo`,\n\t\t\t`\nunknown name Noo (1:1)\n | Noo\n | ^\n`,\n\t\t},\n\t\t{\n\t\t\t`Foo()`, `\nmock.Foo is not callable (1:1)\n | Foo()\n | ^\n`,\n\t\t},\n\t\t{\n\t\t\t`Foo['bar']`, `\ntype mock.Foo has no field bar (1:4)\n | Foo['bar']\n | ...^\n`,\n\t\t},\n\t\t{\n\t\t\t`Foo.Method(42)`,\n\t\t\t`\ntoo many arguments to call Method (1:5)\n | Foo.Method(42)\n | ....^\n`,\n\t\t},\n\t\t{`Foo.Bar()`, `\nmock.Bar is not callable (1:5)\n | Foo.Bar()\n | ....^\n`,\n\t\t},\n\t\t{`Foo.Bar.Not()`, `\ntype mock.Bar has no method Not (1:9)\n | Foo.Bar.Not()\n | ........^\n`,\n\t\t},\n\t\t{`ArrayOfFoo[0].Not`, `\ntype mock.Foo has no field Not (1:15)\n | ArrayOfFoo[0].Not\n | ..............^\n`,\n\t\t},\n\t\t{`ArrayOfFoo[Not]`, `\nunknown name Not (1:12)\n | ArrayOfFoo[Not]\n | ...........^\n`,\n\t\t},\n\t\t{`Not[0]`, `\nunknown name Not (1:1)\n | Not[0]\n | ^\n`,\n\t\t},\n\t\t{`Not.Bar`, `\nunknown name Not (1:1)\n | Not.Bar\n | ^\n`,\n\t\t},\n\t\t{`ArrayOfFoo.Not`, `\narray elements can only be selected using an integer (got string) (1:12)\n | ArrayOfFoo.Not\n | ...........^\n`,\n\t\t},\n\t\t{`FuncParam(true)`, `\nnot enough arguments to call FuncParam (1:1)\n | FuncParam(true)\n | ^\n`,\n\t\t},\n\t\t{`MapOfFoo['str'].Not`, `\ntype mock.Foo has no field Not (1:17)\n | MapOfFoo['str'].Not\n | ................^\n`,\n\t\t},\n\t\t{`Bool && IntPtr`, `\ninvalid operation: && (mismatched types bool and int) (1:6)\n | Bool && IntPtr\n | .....^\n`,\n\t\t},\n\t\t{`No ? Any.Bool : Any.Not`, `\nunknown name No (1:1)\n | No ? Any.Bool : Any.Not\n | ^\n`,\n\t\t},\n\t\t{`Any.Cond ? No : Any.Not`, `\nunknown name No (1:12)\n | Any.Cond ? No : Any.Not\n | ...........^\n`,\n\t\t},\n\t\t{`Any.Cond ? Any.Bool : No`, `\nunknown name No (1:23)\n | Any.Cond ? Any.Bool : No\n | ......................^\n`,\n\t\t},\n\t\t{`MapOfAny ? Any : Any`, `\nnon-bool expression (type map[string]interface {}) used as condition (1:1)\n | MapOfAny ? Any : Any\n | ^\n`,\n\t\t},\n\t\t{`String matches Int`, `\ninvalid operation: matches (mismatched types string and int) (1:8)\n | String matches Int\n | .......^\n`,\n\t\t},\n\t\t{`Int matches String`, `\ninvalid operation: matches (mismatched types int and string) (1:5)\n | Int matches String\n | ....^\n`,\n\t\t},\n\t\t{`String contains Int`, `\ninvalid operation: contains (mismatched types string and int) (1:8)\n | String contains Int\n | .......^\n`,\n\t\t},\n\t\t{`Int contains String`, `\ninvalid operation: contains (mismatched types int and string) (1:5)\n | Int contains String\n | ....^\n`,\n\t\t},\n\t\t{`!Not`, `\nunknown name Not (1:2)\n | !Not\n | .^\n`,\n\t\t},\n\t\t{`Not == Any`, `\nunknown name Not (1:1)\n | Not == Any\n | ^\n`,\n\t\t},\n\t\t{`[Not]`, `\nunknown name Not (1:2)\n | [Not]\n | .^\n`,\n\t\t},\n\t\t{`{id: Not}`, `\nunknown name Not (1:6)\n | {id: Not}\n | .....^\n`,\n\t\t},\n\t\t{`(nil).Foo`, `\ntype nil has no field Foo (1:7)\n | (nil).Foo\n | ......^\n`,\n\t\t},\n\t\t{`(nil)['Foo']`, `\ntype nil has no field Foo (1:6)\n | (nil)['Foo']\n | .....^\n`,\n\t\t},\n\t\t{`1 and false`, `\ninvalid operation: and (mismatched types int and bool) (1:3)\n | 1 and false\n | ..^\n`,\n\t\t},\n\t\t{`true or 0`, `\ninvalid operation: or (mismatched types bool and int) (1:6)\n | true or 0\n | .....^\n`,\n\t\t},\n\t\t{`not IntPtr`, `\ninvalid operation: not (mismatched type int) (1:1)\n | not IntPtr\n | ^\n`,\n\t\t},\n\t\t{`len(Not)`, `\nunknown name Not (1:5)\n | len(Not)\n | ....^\n`,\n\t\t},\n\t\t{`Int < Bool`, `\ninvalid operation: < (mismatched types int and bool) (1:5)\n | Int < Bool\n | ....^\n`,\n\t\t},\n\t\t{`Int > Bool`, `\ninvalid operation: > (mismatched types int and bool) (1:5)\n | Int > Bool\n | ....^\n`,\n\t\t},\n\t\t{`Int >= Bool`, `\ninvalid operation: >= (mismatched types int and bool) (1:5)\n | Int >= Bool\n | ....^\n`,\n\t\t},\n\t\t{`Int <= Bool`, `\ninvalid operation: <= (mismatched types int and bool) (1:5)\n | Int <= Bool\n | ....^\n`,\n\t\t},\n\t\t{`Int + Bool`, `\ninvalid operation: + (mismatched types int and bool) (1:5)\n | Int + Bool\n | ....^\n`,\n\t\t},\n\t\t{`Int - Bool`, `\ninvalid operation: - (mismatched types int and bool) (1:5)\n | Int - Bool\n | ....^\n`,\n\t\t},\n\t\t{`Int * Bool`, `\ninvalid operation: * (mismatched types int and bool) (1:5)\n | Int * Bool\n | ....^\n`,\n\t\t},\n\t\t{`Int / Bool`, `\ninvalid operation: / (mismatched types int and bool) (1:5)\n | Int / Bool\n | ....^\n`,\n\t\t},\n\t\t{`Int % Bool`, `\ninvalid operation: % (mismatched types int and bool) (1:5)\n | Int % Bool\n | ....^\n`,\n\t\t},\n\t\t{`Int ** Bool`, `\ninvalid operation: ** (mismatched types int and bool) (1:5)\n | Int ** Bool\n | ....^\n`,\n\t\t},\n\t\t{`Int .. Bool`, `\ninvalid operation: .. (mismatched types int and bool) (1:5)\n | Int .. Bool\n | ....^\n`,\n\t\t},\n\t\t{`Any > Foo`, `\ninvalid operation: > (mismatched types interface {} and mock.Foo) (1:5)\n | Any > Foo\n | ....^\n`,\n\t\t},\n\t\t{`NilFn() and BoolFn()`, `\nfunc NilFn doesn't return value (1:1)\n | NilFn() and BoolFn()\n | ^\n`,\n\t\t},\n\t\t{`'str' in String`, `\ninvalid operation: in (mismatched types string and string) (1:7)\n | 'str' in String\n | ......^\n`,\n\t\t},\n\t\t{`1 in Foo`, `\ninvalid operation: in (mismatched types int and mock.Foo) (1:3)\n | 1 in Foo\n | ..^\n`,\n\t\t},\n\t\t{`1 + ''`, `\ninvalid operation: + (mismatched types int and string) (1:3)\n | 1 + ''\n | ..^\n`,\n\t\t},\n\t\t{`all(ArrayOfFoo, {#.Method() < 0})`, `\ninvalid operation: < (mismatched types mock.Bar and int) (1:29)\n | all(ArrayOfFoo, {#.Method() < 0})\n | ............................^\n`,\n\t\t},\n\t\t{`Variadic()`, `\nnot enough arguments to call Variadic (1:1)\n | Variadic()\n | ^\n`,\n\t\t},\n\t\t{`Variadic(0, '')`, `\ncannot use string as argument (type int) to call Variadic  (1:13)\n | Variadic(0, '')\n | ............^\n`,\n\t\t},\n\t\t{`count(1, {#})`, `\nbuiltin count takes only array (got int) (1:7)\n | count(1, {#})\n | ......^\n`,\n\t\t},\n\t\t{`count(ArrayOfInt, {#})`, `\npredicate should return boolean (got int) (1:19)\n | count(ArrayOfInt, {#})\n | ..................^\n`,\n\t\t},\n\t\t{`all(ArrayOfInt, {# + 1})`, `\npredicate should return boolean (got int) (1:17)\n | all(ArrayOfInt, {# + 1})\n | ................^\n`,\n\t\t},\n\t\t{`filter(ArrayOfFoo, {.Bar.Baz})`, `\npredicate should return boolean (got string) (1:20)\n | filter(ArrayOfFoo, {.Bar.Baz})\n | ...................^\n`,\n\t\t},\n\t\t{`find(ArrayOfFoo, {.Bar.Baz})`, `\npredicate should return boolean (got string) (1:18)\n | find(ArrayOfFoo, {.Bar.Baz})\n | .................^\n`,\n\t\t},\n\t\t{`map(1, {2})`, `\nbuiltin map takes only array (got int) (1:5)\n | map(1, {2})\n | ....^\n`,\n\t\t},\n\t\t{`ArrayOfFoo[Foo]`, `\narray elements can only be selected using an integer (got mock.Foo) (1:12)\n | ArrayOfFoo[Foo]\n | ...........^\n`,\n\t\t},\n\t\t{`ArrayOfFoo[Bool:]`, `\nnon-integer slice index bool (1:12)\n | ArrayOfFoo[Bool:]\n | ...........^\n`,\n\t\t},\n\t\t{`ArrayOfFoo[1:Bool]`, `\nnon-integer slice index bool (1:14)\n | ArrayOfFoo[1:Bool]\n | .............^\n`,\n\t\t},\n\t\t{`Bool[:]`, `\ncannot slice bool (1:5)\n | Bool[:]\n | ....^\n`,\n\t\t},\n\t\t{`FuncTooManyReturns()`, `\nfunc FuncTooManyReturns returns more then two values (1:1)\n | FuncTooManyReturns()\n | ^\n`,\n\t\t},\n\t\t{`len(42)`, `\ninvalid argument for len (type int) (1:1)\n | len(42)\n | ^\n`,\n\t\t},\n\t\t{`any(42, {#})`, `\nbuiltin any takes only array (got int) (1:5)\n | any(42, {#})\n | ....^\n`,\n\t\t},\n\t\t{`filter(42, {#})`, `\nbuiltin filter takes only array (got int) (1:8)\n | filter(42, {#})\n | .......^\n`,\n\t\t},\n\t\t{`MapOfAny[0]`, `\ncannot use int to get an element from map[string]interface {} (1:10)\n | MapOfAny[0]\n | .........^\n`,\n\t\t},\n\t\t{`1 /* one */ + \"2\"`, `\ninvalid operation: + (mismatched types int and string) (1:13)\n | 1 /* one */ + \"2\"\n | ............^\n`,\n\t\t},\n\t\t{`FuncTyped(42)`, `\ncannot use int as argument (type string) to call FuncTyped  (1:11)\n | FuncTyped(42)\n | ..........^\n`,\n\t\t},\n\t\t{`.0 in MapOfFoo`, `\ncannot use float64 as type string in map key (1:4)\n | .0 in MapOfFoo\n | ...^\n`,\n\t\t},\n\t\t{`1/2 in MapIntAny`, `\ncannot use float64 as type int in map key (1:5)\n | 1/2 in MapIntAny\n | ....^\n`,\n\t\t},\n\t\t{`0.5 in ArrayOfFoo`, `\ncannot use float64 as type *mock.Foo in array (1:5)\n | 0.5 in ArrayOfFoo\n | ....^\n`,\n\t\t},\n\t\t{`repeat(\"0\", 1/0)`, `\ncannot use float64 as argument (type int) to call repeat  (1:14)\n | repeat(\"0\", 1/0)\n | .............^\n`,\n\t\t},\n\t\t{`let map = 42; map`, `\ncannot redeclare builtin map (1:5)\n | let map = 42; map\n | ....^\n`,\n\t\t},\n\t\t{`let len = 42; len`, `\ncannot redeclare builtin len (1:5)\n | let len = 42; len\n | ....^\n`,\n\t\t},\n\t\t{`let Float = 42; Float`, `\ncannot redeclare Float (1:5)\n | let Float = 42; Float\n | ....^\n`,\n\t\t},\n\t\t{`let foo = 1; let foo = 2; foo`, `\ncannot redeclare variable foo (1:18)\n | let foo = 1; let foo = 2; foo\n | .................^\n`,\n\t\t},\n\t\t{`map(1..9, #unknown)`, `\nunknown pointer #unknown (1:11)\n | map(1..9, #unknown)\n | ..........^\n`,\n\t\t},\n\t\t{`42 in [\"a\", \"b\", \"c\"]`, `\ncannot use int as type string in array (1:4)\n | 42 in [\"a\", \"b\", \"c\"]\n | ...^\n`,\n\t\t},\n\t\t{`\"foo\" matches \"[+\"`, `\nerror parsing regexp: missing closing ]: ` + \"`[+`\" + ` (1:7)\n | \"foo\" matches \"[+\"\n | ......^\n`,\n\t\t},\n\t\t{`get(false, 2)`, `\ntype bool does not support indexing (1:5)\n | get(false, 2)\n | ....^\n`,\n\t\t},\n\t\t{`get(1..2, 0.5)`, `\nnon-integer slice index float64 (1:11)\n | get(1..2, 0.5)\n | ..........^`,\n\t\t},\n\t\t{`trimPrefix(nil)`, `\ncannot use nil as argument (type string) to call trimPrefix (1:12)\n | trimPrefix(nil)\n | ...........^\n`,\n\t\t},\n\t\t{`1..3 | filter(# > 1) | filter(# == \"str\")`,\n\t\t\t`\ninvalid operation: == (mismatched types int and string) (1:33)\n | 1..3 | filter(# > 1) | filter(# == \"str\")\n | ................................^\n`,\n\t\t},\n\t\t{`1..3 | map(\"str\") | filter(# > 1)`,\n\t\t\t`\ninvalid operation: > (mismatched types string and int) (1:30)\n | 1..3 | map(\"str\") | filter(# > 1)\n | .............................^\n`,\n\t\t},\n\t\t{\n\t\t\t`1; 2 + true; 3`,\n\t\t\t`\ninvalid operation: + (mismatched types int and bool) (1:6)\n | 1; 2 + true; 3\n | .....^\n`,\n\t\t},\n\t\t{\n\t\t\t`$env()`,\n\t\t\t`\nmock.Env is not callable (1:1)\n | $env()\n | ^\n`,\n\t\t},\n\t\t{\n\t\t\t`$env(1)`,\n\t\t\t`\nmock.Env is not callable (1:1)\n | $env(1)\n | ^\n`,\n\t\t},\n\t\t{\n\t\t\t`$env(abs())`,\n\t\t\t`\nmock.Env is not callable (1:1)\n | $env(abs())\n | ^\n`,\n\t\t},\n\t}\n\n\tc := new(checker.Checker)\n\tfor _, tt := range errorTests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\ttree, err := parser.Parse(tt.code)\n\t\t\trequire.NoError(t, err)\n\n\t\t\t_, err = c.Check(tree, conf.New(mock.Env{}))\n\t\t\tif err == nil {\n\t\t\t\terr = fmt.Errorf(\"<nil>\")\n\t\t\t}\n\n\t\t\tassert.Equal(t, strings.Trim(tt.err, \"\\n\"), err.Error())\n\t\t})\n\t}\n}\n\nfunc TestCheck_FloatVsInt(t *testing.T) {\n\ttree, err := parser.Parse(`Int + Float`)\n\trequire.NoError(t, err)\n\n\ttyp, err := checker.Check(tree, conf.New(mock.Env{}))\n\tassert.NoError(t, err)\n\tassert.Equal(t, typ.Kind(), reflect.Float64)\n}\n\nfunc TestCheck_IntSums(t *testing.T) {\n\ttree, err := parser.Parse(`Uint32 + Int32`)\n\trequire.NoError(t, err)\n\n\ttyp, err := checker.Check(tree, conf.New(mock.Env{}))\n\tassert.NoError(t, err)\n\tassert.Equal(t, typ.Kind(), reflect.Int)\n}\n\nfunc TestVisitor_ConstantNode(t *testing.T) {\n\ttree, err := parser.Parse(`re(\"[a-z]\")`)\n\trequire.NoError(t, err)\n\n\tregexValue := regexp.MustCompile(\"[a-z]\")\n\tconstNode := &ast.ConstantNode{Value: regexValue}\n\tast.Patch(&tree.Node, constNode)\n\n\t_, err = checker.Check(tree, nil)\n\tassert.NoError(t, err)\n\tassert.Equal(t, reflect.TypeOf(regexValue), tree.Node.Type())\n}\n\nfunc TestCheck_AsBool(t *testing.T) {\n\ttree, err := parser.Parse(`1+2`)\n\trequire.NoError(t, err)\n\n\tconfig := &conf.Config{}\n\texpr.AsBool()(config)\n\n\t_, err = checker.Check(tree, config)\n\tassert.Error(t, err)\n\tassert.Equal(t, \"expected bool, but got int\", err.Error())\n}\n\nfunc TestCheck_AsInt64(t *testing.T) {\n\ttree, err := parser.Parse(`true`)\n\trequire.NoError(t, err)\n\n\tconfig := &conf.Config{}\n\texpr.AsInt64()(config)\n\n\t_, err = checker.Check(tree, config)\n\tassert.Error(t, err)\n\tassert.Equal(t, \"expected int64, but got bool\", err.Error())\n}\n\nfunc TestCheck_TaggedFieldName(t *testing.T) {\n\ttree, err := parser.Parse(`foo.bar`)\n\trequire.NoError(t, err)\n\n\tconfig := conf.CreateNew()\n\texpr.Env(struct {\n\t\tX struct {\n\t\t\tY bool `expr:\"bar\"`\n\t\t} `expr:\"foo\"`\n\t}{})(config)\n\texpr.AsBool()(config)\n\n\t_, err = checker.Check(tree, config)\n\tassert.NoError(t, err)\n}\n\nfunc TestCheck_NoConfig(t *testing.T) {\n\ttree, err := parser.Parse(`any`)\n\trequire.NoError(t, err)\n\n\t_, err = checker.Check(tree, conf.CreateNew())\n\tassert.NoError(t, err)\n}\n\nfunc TestCheck_AllowUndefinedVariables(t *testing.T) {\n\ttype Env struct {\n\t\tA int\n\t}\n\n\ttree, err := parser.Parse(`Any + fn()`)\n\trequire.NoError(t, err)\n\n\tconfig := conf.New(Env{})\n\texpr.AllowUndefinedVariables()(config)\n\n\t_, err = checker.Check(tree, config)\n\tassert.NoError(t, err)\n}\n\nfunc TestCheck_AllowUndefinedVariables_DefaultType(t *testing.T) {\n\tenv := map[string]bool{}\n\n\ttree, err := parser.Parse(`Any`)\n\trequire.NoError(t, err)\n\n\tconfig := conf.New(env)\n\texpr.AllowUndefinedVariables()(config)\n\texpr.AsBool()(config)\n\n\t_, err = checker.Check(tree, config)\n\tassert.NoError(t, err)\n}\n\nfunc TestCheck_AllowUndefinedVariables_OptionalChaining(t *testing.T) {\n\ttype Env struct{}\n\n\ttree, err := parser.Parse(\"Not?.A.B == nil\")\n\trequire.NoError(t, err)\n\n\tconfig := conf.New(Env{})\n\texpr.AllowUndefinedVariables()(config)\n\n\t_, err = checker.Check(tree, config)\n\tassert.NoError(t, err)\n}\n\nfunc TestCheck_PointerNode(t *testing.T) {\n\t_, err := checker.Check(&parser.Tree{Node: &ast.PointerNode{}}, nil)\n\tassert.Error(t, err)\n\tassert.Contains(t, err.Error(), \"cannot use pointer accessor outside predicate\")\n}\n\nfunc TestCheck_TypeWeights(t *testing.T) {\n\ttypes := map[string]any{\n\t\t\"Uint\":    uint(1),\n\t\t\"Uint8\":   uint8(2),\n\t\t\"Uint16\":  uint16(3),\n\t\t\"Uint32\":  uint32(4),\n\t\t\"Uint64\":  uint64(5),\n\t\t\"Int\":     6,\n\t\t\"Int8\":    int8(7),\n\t\t\"Int16\":   int16(8),\n\t\t\"Int32\":   int32(9),\n\t\t\"Int64\":   int64(10),\n\t\t\"Float32\": float32(11),\n\t\t\"Float64\": float64(12),\n\t}\n\tc := new(checker.Checker)\n\tfor a := range types {\n\t\tfor b := range types {\n\t\t\ttree, err := parser.Parse(fmt.Sprintf(\"%s + %s\", a, b))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tconfig := conf.New(types)\n\n\t\t\t_, err = c.Check(tree, config)\n\t\t\trequire.NoError(t, err)\n\t\t}\n\t}\n}\n\nfunc TestCheck_works_with_nil_types(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"null\": nil,\n\t}\n\n\ttree, err := parser.Parse(\"null\")\n\trequire.NoError(t, err)\n\n\t_, err = checker.Check(tree, conf.New(env))\n\trequire.NoError(t, err)\n}\n\nfunc TestCheck_cast_to_expected_works_with_interface(t *testing.T) {\n\tt.Run(\"float64\", func(t *testing.T) {\n\t\ttype Env struct {\n\t\t\tAny any\n\t\t}\n\n\t\ttree, err := parser.Parse(\"Any\")\n\t\trequire.NoError(t, err)\n\n\t\tconfig := conf.New(Env{})\n\t\texpr.AsFloat64()(config)\n\t\texpr.AsAny()(config)\n\n\t\t_, err = checker.Check(tree, config)\n\t\trequire.NoError(t, err)\n\t})\n\n\tt.Run(\"kind\", func(t *testing.T) {\n\t\tenv := map[string]any{\n\t\t\t\"Any\": any(\"foo\"),\n\t\t}\n\n\t\ttree, err := parser.Parse(\"Any\")\n\t\trequire.NoError(t, err)\n\n\t\tconfig := conf.New(env)\n\t\texpr.AsKind(reflect.String)(config)\n\n\t\t_, err = checker.Check(tree, config)\n\t\trequire.NoError(t, err)\n\t})\n}\n\nfunc TestCheck_operator_in_works_with_interfaces(t *testing.T) {\n\ttree, err := parser.Parse(`'Tom' in names`)\n\trequire.NoError(t, err)\n\n\tconfig := conf.New(nil)\n\texpr.AllowUndefinedVariables()(config)\n\n\t_, err = checker.Check(tree, config)\n\trequire.NoError(t, err)\n}\n\nfunc TestCheck_Function_types_are_checked(t *testing.T) {\n\tadd := expr.Function(\n\t\t\"add\",\n\t\tfunc(p ...any) (any, error) {\n\t\t\tout := 0\n\t\t\tfor _, each := range p {\n\t\t\t\tout += each.(int)\n\t\t\t}\n\t\t\treturn out, nil\n\t\t},\n\t\tnew(func(int) int),\n\t\tnew(func(int, int) int),\n\t\tnew(func(int, int, int) int),\n\t\tnew(func(...int) int),\n\t)\n\n\tconfig := conf.CreateNew()\n\tadd(config)\n\tc := new(checker.Checker)\n\n\ttests := []string{\n\t\t\"add(1)\",\n\t\t\"add(1, 2)\",\n\t\t\"add(1, 2, 3)\",\n\t\t\"add(1, 2, 3, 4)\",\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test, func(t *testing.T) {\n\t\t\ttree, err := parser.Parse(test)\n\t\t\trequire.NoError(t, err)\n\n\t\t\t_, err = c.Check(tree, config)\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.Equal(t, reflect.Int, tree.Node.Type().Kind())\n\t\t})\n\t}\n\n\tt.Run(\"errors\", func(t *testing.T) {\n\t\ttree, err := parser.Parse(\"add(1, '2')\")\n\t\trequire.NoError(t, err)\n\n\t\t_, err = c.Check(tree, config)\n\t\trequire.Error(t, err)\n\t\trequire.Equal(t, \"cannot use string as argument (type int) to call add  (1:8)\\n | add(1, '2')\\n | .......^\", err.Error())\n\t})\n}\n\nfunc TestCheck_Function_without_types(t *testing.T) {\n\tadd := expr.Function(\n\t\t\"add\",\n\t\tfunc(p ...any) (any, error) {\n\t\t\tout := 0\n\t\t\tfor _, each := range p {\n\t\t\t\tout += each.(int)\n\t\t\t}\n\t\t\treturn out, nil\n\t\t},\n\t)\n\n\ttree, err := parser.Parse(\"add(1, 2, 3)\")\n\trequire.NoError(t, err)\n\n\tconfig := conf.CreateNew()\n\tadd(config)\n\n\t_, err = checker.Check(tree, config)\n\trequire.NoError(t, err)\n\trequire.Equal(t, reflect.Interface, tree.Node.Type().Kind())\n}\n\nfunc TestCheck_dont_panic_on_nil_arguments_for_builtins(t *testing.T) {\n\ttests := []string{\n\t\t\"len(nil)\",\n\t\t\"abs(nil)\",\n\t\t\"int(nil)\",\n\t\t\"float(nil)\",\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test, func(t *testing.T) {\n\t\t\ttree, err := parser.Parse(test)\n\t\t\trequire.NoError(t, err)\n\n\t\t\t_, err = checker.Check(tree, conf.New(nil))\n\t\t\trequire.Error(t, err)\n\t\t})\n\t}\n}\n\nfunc TestCheck_do_not_override_params_for_functions(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"foo\": func(p string) string {\n\t\t\treturn \"foo\"\n\t\t},\n\t}\n\tconfig := conf.New(env)\n\texpr.Function(\n\t\t\"bar\",\n\t\tfunc(p ...any) (any, error) {\n\t\t\treturn p[0].(string), nil\n\t\t},\n\t\tnew(func(string) string),\n\t)(config)\n\tconfig.Check()\n\n\tt.Run(\"func from env\", func(t *testing.T) {\n\t\ttree, err := parser.Parse(\"foo(1)\")\n\t\trequire.NoError(t, err)\n\n\t\t_, err = checker.Check(tree, config)\n\t\trequire.Error(t, err)\n\t\trequire.Contains(t, err.Error(), \"cannot use int as argument\")\n\t})\n\n\tt.Run(\"func from function\", func(t *testing.T) {\n\t\ttree, err := parser.Parse(\"bar(1)\")\n\t\trequire.NoError(t, err)\n\n\t\t_, err = checker.Check(tree, config)\n\t\trequire.Error(t, err)\n\t\trequire.Contains(t, err.Error(), \"cannot use int as argument\")\n\t})\n}\n\nfunc TestCheck_env_keyword(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"num\":  42,\n\t\t\"str\":  \"foo\",\n\t\t\"name\": \"str\",\n\t}\n\n\ttests := []struct {\n\t\tinput string\n\t\twant  reflect.Kind\n\t}{\n\t\t{`$env['str']`, reflect.String},\n\t\t{`$env['num']`, reflect.Int},\n\t\t{`$env[name]`, reflect.Interface},\n\t}\n\n\tc := new(checker.Checker)\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\ttree, err := parser.Parse(test.input)\n\t\t\trequire.NoError(t, err)\n\n\t\t\trtype, err := c.Check(tree, conf.New(env))\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.True(t, rtype.Kind() == test.want, fmt.Sprintf(\"expected %s, got %s\", test.want, rtype.Kind()))\n\t\t})\n\t}\n}\n\nfunc TestCheck_builtin_without_call(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\terr   string\n\t}{\n\t\t{`len + 1`, \"invalid operation: + (mismatched types func(...interface {}) (interface {}, error) and int) (1:5)\\n | len + 1\\n | ....^\"},\n\t\t{`string.A`, \"type func(interface {}) string has no field A (1:8)\\n | string.A\\n | .......^\"},\n\t}\n\n\tc := new(checker.Checker)\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\ttree, err := parser.Parse(test.input)\n\t\t\trequire.NoError(t, err)\n\n\t\t\t_, err = c.Check(tree, conf.New(nil))\n\t\t\trequire.Error(t, err)\n\t\t\trequire.Equal(t, test.err, err.Error())\n\t\t})\n\t}\n}\n\nfunc TestCheck_EmbeddedInterface(t *testing.T) {\n\tt.Run(\"embedded interface lookup returns compile-error not panic\", func(t *testing.T) {\n\t\ttype Env struct {\n\t\t\tcontext.Context\n\t\t\tCountry string\n\t\t}\n\t\ttype Wrapper struct {\n\t\t\tCtx Env\n\t\t}\n\n\t\tconfig := conf.New(Wrapper{\n\t\t\tCtx: Env{\n\t\t\t\tContext: context.Background(),\n\t\t\t\tCountry: \"TR\",\n\t\t\t},\n\t\t})\n\t\texpr.WithContext(\"Ctx\")(config)\n\n\t\t_, err := checker.ParseCheck(\"Ctx.C\", config)\n\t\trequire.Error(t, err)\n\t\trequire.Contains(t, err.Error(), \"has no field C\")\n\t})\n}\n\nfunc TestCheck_types(t *testing.T) {\n\tenv := types.Map{\n\t\t\"foo\": types.Map{\n\t\t\t\"bar\": types.Map{\n\t\t\t\t\"baz\":       types.String,\n\t\t\t\ttypes.Extra: types.String,\n\t\t\t},\n\t\t},\n\t\t\"arr\": types.Array(types.Map{\n\t\t\t\"value\": types.String,\n\t\t}),\n\t\ttypes.Extra: types.Any,\n\t}\n\n\tnoerr := \"no error\"\n\ttests := []struct {\n\t\tcode string\n\t\terr  string\n\t}{\n\t\t{`unknown`, noerr},\n\t\t{`[unknown + 42, another_unknown + \"foo\"]`, noerr},\n\t\t{`foo.bar.baz > 0`, `invalid operation: > (mismatched types string and int)`},\n\t\t{`foo.unknown.baz`, `unknown field unknown (1:5)`},\n\t\t{`foo.bar.unknown`, noerr},\n\t\t{`foo.bar.unknown + 42`, `invalid operation: + (mismatched types string and int)`},\n\t\t{`[foo] | map(.unknown)`, `unknown field unknown`},\n\t\t{`[foo] | map(.bar) | filter(.baz)`, `predicate should return boolean (got string)`},\n\t\t{`arr | filter(.value > 0)`, `invalid operation: > (mismatched types string and int)`},\n\t\t{`arr | filter(.value contains \"a\") | filter(.value == 0)`, `invalid operation: == (mismatched types string and int)`},\n\t}\n\n\tc := new(checker.Checker)\n\tfor _, test := range tests {\n\t\tt.Run(test.code, func(t *testing.T) {\n\t\t\ttree, err := parser.Parse(test.code)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tconfig := conf.New(env)\n\t\t\t_, err = c.Check(tree, config)\n\t\t\tif test.err == noerr {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t} else {\n\t\t\t\trequire.Error(t, err)\n\t\t\t\trequire.Contains(t, err.Error(), test.err)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "checker/info.go",
    "content": "package checker\n\nimport (\n\t\"reflect\"\n\n\t\"github.com/expr-lang/expr/ast\"\n\t. \"github.com/expr-lang/expr/checker/nature\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\nfunc FieldIndex(c *Cache, env Nature, node ast.Node) (bool, []int, string) {\n\tswitch n := node.(type) {\n\tcase *ast.IdentifierNode:\n\t\tif idx, ok := env.FieldIndex(c, n.Value); ok {\n\t\t\treturn true, idx, n.Value\n\t\t}\n\tcase *ast.MemberNode:\n\t\tbase := n.Node.Nature().Deref(c)\n\t\tif base.Kind == reflect.Struct {\n\t\t\tif prop, ok := n.Property.(*ast.StringNode); ok {\n\t\t\t\tif idx, ok := base.FieldIndex(c, prop.Value); ok {\n\t\t\t\t\treturn true, idx, prop.Value\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn false, nil, \"\"\n}\n\nfunc MethodIndex(c *Cache, env Nature, node ast.Node) (bool, int, string) {\n\tswitch n := node.(type) {\n\tcase *ast.IdentifierNode:\n\t\tif env.Kind == reflect.Struct {\n\t\t\tif m, ok := env.Get(c, n.Value); ok && m.TypeData != nil {\n\t\t\t\treturn m.Method, m.MethodIndex, n.Value\n\t\t\t}\n\t\t}\n\tcase *ast.MemberNode:\n\t\tif name, ok := n.Property.(*ast.StringNode); ok {\n\t\t\tbase := n.Node.Type()\n\t\t\tif base != nil && base.Kind() != reflect.Interface {\n\t\t\t\tif m, ok := base.MethodByName(name.Value); ok {\n\t\t\t\t\treturn true, m.Index, name.Value\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn false, 0, \"\"\n}\n\nfunc TypedFuncIndex(fn reflect.Type, method bool) (int, bool) {\n\tif fn == nil {\n\t\treturn 0, false\n\t}\n\tif fn.Kind() != reflect.Func {\n\t\treturn 0, false\n\t}\n\t// OnCallTyped doesn't work for functions with variadic arguments.\n\tif fn.IsVariadic() {\n\t\treturn 0, false\n\t}\n\t// OnCallTyped doesn't work named function, like `type MyFunc func() int`.\n\tif fn.PkgPath() != \"\" { // If PkgPath() is not empty, it means that function is named.\n\t\treturn 0, false\n\t}\n\n\tfnNumIn := fn.NumIn()\n\tfnInOffset := 0\n\tif method {\n\t\tfnNumIn--\n\t\tfnInOffset = 1\n\t}\n\nfuncTypes:\n\tfor i := range vm.FuncTypes {\n\t\tif i == 0 {\n\t\t\tcontinue\n\t\t}\n\t\ttyped := reflect.ValueOf(vm.FuncTypes[i]).Elem().Type()\n\t\tif typed.Kind() != reflect.Func {\n\t\t\tcontinue\n\t\t}\n\t\tif typed.NumOut() != fn.NumOut() {\n\t\t\tcontinue\n\t\t}\n\t\tfor j := 0; j < typed.NumOut(); j++ {\n\t\t\tif typed.Out(j) != fn.Out(j) {\n\t\t\t\tcontinue funcTypes\n\t\t\t}\n\t\t}\n\t\tif typed.NumIn() != fnNumIn {\n\t\t\tcontinue\n\t\t}\n\t\tfor j := 0; j < typed.NumIn(); j++ {\n\t\t\tif typed.In(j) != fn.In(j+fnInOffset) {\n\t\t\t\tcontinue funcTypes\n\t\t\t}\n\t\t}\n\t\treturn i, true\n\t}\n\treturn 0, false\n}\n\nfunc IsFastFunc(fn reflect.Type, method bool) bool {\n\tif fn == nil {\n\t\treturn false\n\t}\n\tif fn.Kind() != reflect.Func {\n\t\treturn false\n\t}\n\tnumIn := 1\n\tif method {\n\t\tnumIn = 2\n\t}\n\tif fn.IsVariadic() &&\n\t\tfn.NumIn() == numIn &&\n\t\tfn.NumOut() == 1 &&\n\t\tfn.Out(0).Kind() == reflect.Interface {\n\t\trest := fn.In(fn.NumIn() - 1) // function has only one param for functions and two for methods\n\t\tif rest != nil && rest.Kind() == reflect.Slice && rest.Elem().Kind() == reflect.Interface {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "checker/info_test.go",
    "content": "package checker_test\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr/checker\"\n\t\"github.com/expr-lang/expr/test/mock\"\n)\n\nfunc TestTypedFuncIndex(t *testing.T) {\n\tfn := func() time.Duration {\n\t\treturn 1 * time.Second\n\t}\n\tindex, ok := checker.TypedFuncIndex(reflect.TypeOf(fn), false)\n\trequire.True(t, ok)\n\trequire.Equal(t, 1, index)\n}\n\nfunc TestTypedFuncIndex_excludes_named_functions(t *testing.T) {\n\tvar fn mock.MyFunc\n\n\t_, ok := checker.TypedFuncIndex(reflect.TypeOf(fn), false)\n\trequire.False(t, ok)\n}\n"
  },
  {
    "path": "checker/nature/nature.go",
    "content": "package nature\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/builtin\"\n\t\"github.com/expr-lang/expr/internal/deref\"\n)\n\nvar (\n\tintType       = reflect.TypeOf(0)\n\tfloatType     = reflect.TypeOf(float64(0))\n\tarrayType     = reflect.TypeOf([]any{})\n\tbyteSliceType = reflect.TypeOf([]byte{})\n\ttimeType      = reflect.TypeOf(time.Time{})\n\tdurationType  = reflect.TypeOf(time.Duration(0))\n\n\tbuiltinInt = map[reflect.Type]struct{}{\n\t\treflect.TypeOf(int(0)):     {},\n\t\treflect.TypeOf(int8(0)):    {},\n\t\treflect.TypeOf(int16(0)):   {},\n\t\treflect.TypeOf(int32(0)):   {},\n\t\treflect.TypeOf(int64(0)):   {},\n\t\treflect.TypeOf(uintptr(0)): {},\n\t\treflect.TypeOf(uint(0)):    {},\n\t\treflect.TypeOf(uint8(0)):   {},\n\t\treflect.TypeOf(uint16(0)):  {},\n\t\treflect.TypeOf(uint32(0)):  {},\n\t\treflect.TypeOf(uint64(0)):  {},\n\t}\n\tbuiltinFloat = map[reflect.Type]struct{}{\n\t\treflect.TypeOf(float32(0)): {},\n\t\treflect.TypeOf(float64(0)): {},\n\t}\n)\n\ntype NatureCheck int\n\nconst (\n\t_ NatureCheck = iota\n\tBoolCheck\n\tStringCheck\n\tIntegerCheck\n\tNumberCheck\n\tMapCheck\n\tArrayCheck\n\tTimeCheck\n\tDurationCheck\n)\n\ntype Nature struct {\n\t// The order of the fields matter, check alignment before making changes.\n\n\tType reflect.Type // Type of the value. If nil, then value is unknown.\n\tKind reflect.Kind // Kind of the value.\n\n\t*TypeData\n\n\t// Ref is a reference used for multiple, disjoint purposes. When the Nature\n\t// is for a:\n\t//\t- Predicate: then Ref is the nature of the Out of the predicate.\n\t//\t- Array-like types: then Ref is the Elem nature of array type (usually Type is []any, but ArrayOf can be any nature).\n\tRef *Nature\n\n\tNil       bool // If value is nil.\n\tStrict    bool // If map is types.StrictMap.\n\tMethod    bool // If value retrieved from method. Usually used to determine amount of in arguments.\n\tIsInteger bool // If it's a builtin integer or unsigned integer type.\n\tIsFloat   bool // If it's a builtin float type.\n}\n\ntype TypeData struct {\n\tmethodset *methodset // optional to avoid the map in *Cache\n\n\t*structData\n\n\t// map-only data\n\tFields          map[string]Nature // Fields of map type.\n\tDefaultMapValue *Nature           // Default value of map type.\n\n\t// callable-only data\n\tFunc            *builtin.Function // Used to pass function type from callee to CallNode.\n\tMethodIndex     int               // Index of method in type.\n\tinElem, outZero *Nature\n\tnumIn, numOut   int\n\n\tisVariadic    bool\n\tisVariadicSet bool\n\tnumInSet      bool\n\tnumOutSet     bool\n}\n\n// Cache is a shared cache of type information. It is only used in the stages\n// where type information becomes relevant, so packages like ast, parser, types,\n// and lexer do not need to use the cache because they don't need any service\n// from the Nature type, they only describe. However, when receiving a Nature\n// from one of those packages, the cache must be set immediately.\ntype Cache struct {\n\tmethods map[reflect.Type]*methodset\n\tstructs map[reflect.Type]Nature\n}\n\n// NatureOf returns a Nature describing \"i\". If \"i\" is nil then it returns a\n// Nature describing the value \"nil\".\nfunc (c *Cache) NatureOf(i any) Nature {\n\t// reflect.TypeOf(nil) returns nil, but in FromType we want to differentiate\n\t// what nil means for us\n\tif i == nil {\n\t\treturn Nature{Nil: true}\n\t}\n\treturn c.FromType(reflect.TypeOf(i))\n}\n\n// FromType returns a Nature describing a value of type \"t\". If \"t\" is nil then\n// it returns a Nature describing an unknown value.\nfunc (c *Cache) FromType(t reflect.Type) Nature {\n\tif t == nil {\n\t\treturn Nature{}\n\t}\n\tvar td *TypeData\n\tvar isInteger, isFloat bool\n\tk := t.Kind()\n\tswitch k {\n\tcase reflect.Struct:\n\t\t// c can be nil when we call the package function FromType, which uses a\n\t\t// nil *Cache to call this method.\n\t\tif c != nil {\n\t\t\treturn c.getStruct(t)\n\t\t}\n\t\tfallthrough\n\tcase reflect.Func:\n\t\ttd = new(TypeData)\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,\n\t\treflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\t_, isInteger = builtinInt[t]\n\tcase reflect.Float32, reflect.Float64:\n\t\t_, isFloat = builtinFloat[t]\n\t}\n\treturn Nature{\n\t\tType:      t,\n\t\tKind:      k,\n\t\tTypeData:  td,\n\t\tIsInteger: isInteger,\n\t\tIsFloat:   isFloat,\n\t}\n}\n\nfunc (c *Cache) getStruct(t reflect.Type) Nature {\n\tif c.structs == nil {\n\t\tc.structs = map[reflect.Type]Nature{}\n\t} else if nt, ok := c.structs[t]; ok {\n\t\treturn nt\n\t}\n\tnt := Nature{\n\t\tType: t,\n\t\tKind: reflect.Struct,\n\t\tTypeData: &TypeData{\n\t\t\tstructData: &structData{\n\t\t\t\trType:    t,\n\t\t\t\tnumField: t.NumField(),\n\t\t\t\tanonIdx:  -1, // do not lookup embedded fields yet\n\t\t\t},\n\t\t},\n\t}\n\tc.structs[t] = nt\n\treturn nt\n}\n\nfunc (c *Cache) getMethodset(t reflect.Type, k reflect.Kind) *methodset {\n\tif t == nil || c == nil {\n\t\treturn nil\n\t}\n\tif c.methods == nil {\n\t\tc.methods = map[reflect.Type]*methodset{\n\t\t\tt: nil,\n\t\t}\n\t} else if s, ok := c.methods[t]; ok {\n\t\treturn s\n\t}\n\tnumMethod := t.NumMethod()\n\tif numMethod < 1 {\n\t\tc.methods[t] = nil // negative cache\n\t\treturn nil\n\t}\n\ts := &methodset{\n\t\trType:     t,\n\t\tkind:      k,\n\t\tnumMethod: numMethod,\n\t}\n\tc.methods[t] = s\n\treturn s\n}\n\n// NatureOf calls NatureOf on a nil *Cache. See the comment on Cache.\nfunc NatureOf(i any) Nature {\n\tvar c *Cache\n\treturn c.NatureOf(i)\n}\n\n// FromType calls FromType on a nil *Cache. See the comment on Cache.\nfunc FromType(t reflect.Type) Nature {\n\tvar c *Cache\n\treturn c.FromType(t)\n}\n\nfunc ArrayFromType(c *Cache, t reflect.Type) Nature {\n\telem := c.FromType(t)\n\tnt := c.FromType(arrayType)\n\tnt.Ref = &elem\n\treturn nt\n}\n\nfunc (n *Nature) IsAny(c *Cache) bool {\n\treturn n.Type != nil && n.Kind == reflect.Interface && n.NumMethods(c) == 0\n}\n\nfunc (n *Nature) IsUnknown(c *Cache) bool {\n\treturn n.Type == nil && !n.Nil || n.IsAny(c)\n}\n\nfunc (n *Nature) String() string {\n\tif n.Type != nil {\n\t\treturn n.Type.String()\n\t}\n\treturn \"unknown\"\n}\n\nfunc (n *Nature) Deref(c *Cache) Nature {\n\tt, _, changed := deref.TypeKind(n.Type, n.Kind)\n\tif !changed {\n\t\treturn *n\n\t}\n\treturn c.FromType(t)\n}\n\nfunc (n *Nature) Key(c *Cache) Nature {\n\tif n.Kind == reflect.Map {\n\t\treturn c.FromType(n.Type.Key())\n\t}\n\treturn Nature{}\n}\n\nfunc (n *Nature) Elem(c *Cache) Nature {\n\tswitch n.Kind {\n\tcase reflect.Ptr:\n\t\treturn c.FromType(n.Type.Elem())\n\tcase reflect.Map:\n\t\tif n.TypeData != nil && n.DefaultMapValue != nil {\n\t\t\treturn *n.DefaultMapValue\n\t\t}\n\t\treturn c.FromType(n.Type.Elem())\n\tcase reflect.Slice, reflect.Array:\n\t\tif n.Ref != nil {\n\t\t\treturn *n.Ref\n\t\t}\n\t\treturn c.FromType(n.Type.Elem())\n\t}\n\treturn Nature{}\n}\n\nfunc (n *Nature) AssignableTo(nt Nature) bool {\n\tif n.Nil {\n\t\tswitch nt.Kind {\n\t\tcase reflect.Pointer, reflect.Interface, reflect.Chan, reflect.Func,\n\t\t\treflect.Map, reflect.Slice:\n\t\t\t// nil can be assigned to these kinds\n\t\t\treturn true\n\t\t}\n\t}\n\tif n.Type == nil || nt.Type == nil ||\n\t\tn.Kind != nt.Kind && nt.Kind != reflect.Interface {\n\t\treturn false\n\t}\n\treturn n.Type.AssignableTo(nt.Type)\n}\n\nfunc (n *Nature) getMethodset(c *Cache) *methodset {\n\tif n.TypeData != nil && n.TypeData.methodset != nil {\n\t\treturn n.TypeData.methodset\n\t}\n\ts := c.getMethodset(n.Type, n.Kind)\n\tif n.TypeData != nil {\n\t\tn.TypeData.methodset = s // cache locally if possible\n\t}\n\treturn s\n}\n\nfunc (n *Nature) NumMethods(c *Cache) int {\n\tif s := n.getMethodset(c); s != nil {\n\t\treturn s.numMethod\n\t}\n\treturn 0\n}\n\nfunc (n *Nature) MethodByName(c *Cache, name string) (Nature, bool) {\n\tif s := n.getMethodset(c); s != nil {\n\t\tif m := s.method(c, name); m != nil {\n\t\t\treturn m.nature, true\n\t\t}\n\t}\n\treturn Nature{}, false\n}\n\nfunc (n *Nature) NumIn() int {\n\tif n.numInSet {\n\t\treturn n.numIn\n\t}\n\tn.numInSet = true\n\tn.numIn = n.Type.NumIn()\n\treturn n.numIn\n}\n\nfunc (n *Nature) InElem(c *Cache, i int) Nature {\n\tif n.inElem == nil {\n\t\tn2 := c.FromType(n.Type.In(i))\n\t\tn2 = n2.Elem(c)\n\t\tn.inElem = &n2\n\t}\n\treturn *n.inElem\n}\n\nfunc (n *Nature) In(c *Cache, i int) Nature {\n\treturn c.FromType(n.Type.In(i))\n}\n\nfunc (n *Nature) IsFirstArgUnknown(c *Cache) bool {\n\tif n.Type != nil {\n\t\tn2 := c.FromType(n.Type.In(0))\n\t\treturn n2.IsUnknown(c)\n\t}\n\treturn false\n}\n\nfunc (n *Nature) NumOut() int {\n\tif n.numOutSet {\n\t\treturn n.numOut\n\t}\n\tn.numOutSet = true\n\tn.numOut = n.Type.NumOut()\n\treturn n.numOut\n}\n\nfunc (n *Nature) Out(c *Cache, i int) Nature {\n\tif i != 0 {\n\t\treturn n.out(c, i)\n\t}\n\tif n.outZero != nil {\n\t\treturn *n.outZero\n\t}\n\tnt := n.out(c, 0)\n\tn.outZero = &nt\n\treturn nt\n}\n\nfunc (n *Nature) out(c *Cache, i int) Nature {\n\tif n.Type == nil {\n\t\treturn Nature{}\n\t}\n\treturn c.FromType(n.Type.Out(i))\n}\n\nfunc (n *Nature) IsVariadic() bool {\n\tif n.isVariadicSet {\n\t\treturn n.isVariadic\n\t}\n\tn.isVariadicSet = true\n\tn.isVariadic = n.Type.IsVariadic()\n\treturn n.isVariadic\n}\n\nfunc (n *Nature) FieldByName(c *Cache, name string) (Nature, bool) {\n\tif n.Kind != reflect.Struct {\n\t\treturn Nature{}, false\n\t}\n\tvar sd *structData\n\tif n.TypeData != nil && n.structData != nil {\n\t\tsd = n.structData\n\t} else {\n\t\tsd = c.getStruct(n.Type).structData\n\t}\n\tif sf := sd.structField(c, nil, name); sf != nil {\n\t\treturn sf.Nature, true\n\t}\n\treturn Nature{}, false\n}\n\nfunc (n *Nature) IsFastMap() bool {\n\treturn n.Type != nil &&\n\t\tn.Type.Kind() == reflect.Map &&\n\t\tn.Type.Key().Kind() == reflect.String &&\n\t\tn.Type.Elem().Kind() == reflect.Interface\n}\n\nfunc (n *Nature) Get(c *Cache, name string) (Nature, bool) {\n\tif n.Kind == reflect.Map && n.TypeData != nil {\n\t\tf, ok := n.Fields[name]\n\t\treturn f, ok\n\t}\n\treturn n.getSlow(c, name)\n}\n\nfunc (n *Nature) getSlow(c *Cache, name string) (Nature, bool) {\n\tif nt, ok := n.MethodByName(c, name); ok {\n\t\treturn nt, true\n\t}\n\tt, k, changed := deref.TypeKind(n.Type, n.Kind)\n\tif k == reflect.Struct {\n\t\tvar sd *structData\n\t\tif changed {\n\t\t\tsd = c.getStruct(t).structData\n\t\t} else {\n\t\t\tsd = n.structData\n\t\t}\n\t\tif sf := sd.structField(c, nil, name); sf != nil {\n\t\t\treturn sf.Nature, true\n\t\t}\n\t}\n\treturn Nature{}, false\n}\n\nfunc (n *Nature) FieldIndex(c *Cache, name string) ([]int, bool) {\n\tif n.Kind != reflect.Struct {\n\t\treturn nil, false\n\t}\n\tif sf := n.structField(c, nil, name); sf != nil {\n\t\treturn sf.Index, true\n\t}\n\treturn nil, false\n}\n\nfunc (n *Nature) All(c *Cache) map[string]Nature {\n\ttable := make(map[string]Nature)\n\n\tif n.Type == nil {\n\t\treturn table\n\t}\n\n\tfor i := 0; i < n.NumMethods(c); i++ {\n\t\tmethod := n.Type.Method(i)\n\t\tnt := c.FromType(method.Type)\n\t\tif nt.TypeData == nil {\n\t\t\tnt.TypeData = new(TypeData)\n\t\t}\n\t\tnt.Method = true\n\t\tnt.MethodIndex = method.Index\n\t\ttable[method.Name] = nt\n\t}\n\n\tt := deref.Type(n.Type)\n\n\tswitch t.Kind() {\n\tcase reflect.Struct:\n\t\tfor name, nt := range StructFields(c, t) {\n\t\t\tif _, ok := table[name]; ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ttable[name] = nt\n\t\t}\n\n\tcase reflect.Map:\n\t\tif n.TypeData != nil {\n\t\t\tfor key, nt := range n.Fields {\n\t\t\t\tif _, ok := table[key]; ok {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\ttable[key] = nt\n\t\t\t}\n\t\t}\n\t}\n\n\treturn table\n}\n\nfunc (n *Nature) IsNumber() bool {\n\treturn n.IsInteger || n.IsFloat\n}\n\nfunc (n *Nature) PromoteNumericNature(c *Cache, rhs Nature) Nature {\n\tif n.IsUnknown(c) || rhs.IsUnknown(c) {\n\t\treturn Nature{}\n\t}\n\tif n.IsFloat || rhs.IsFloat {\n\t\treturn c.FromType(floatType)\n\t}\n\treturn c.FromType(intType)\n}\n\nfunc (n *Nature) IsTime() bool {\n\treturn n.Type == timeType\n}\n\nfunc (n *Nature) IsDuration() bool {\n\treturn n.Type == durationType\n}\n\nfunc (n *Nature) IsBool() bool {\n\treturn n.Kind == reflect.Bool\n}\n\nfunc (n *Nature) IsString() bool {\n\treturn n.Kind == reflect.String\n}\n\nfunc (n *Nature) IsByteSlice() bool {\n\treturn n.Type == byteSliceType\n}\n\nfunc (n *Nature) IsArray() bool {\n\treturn n.Kind == reflect.Slice || n.Kind == reflect.Array\n}\n\nfunc (n *Nature) IsMap() bool {\n\treturn n.Kind == reflect.Map\n}\n\nfunc (n *Nature) IsStruct() bool {\n\treturn n.Kind == reflect.Struct\n}\n\nfunc (n *Nature) IsFunc() bool {\n\treturn n.Kind == reflect.Func\n}\n\nfunc (n *Nature) IsPointer() bool {\n\treturn n.Kind == reflect.Ptr\n}\n\nfunc (n *Nature) IsAnyOf(cs ...NatureCheck) bool {\n\tvar result bool\n\tfor i := 0; i < len(cs) && !result; i++ {\n\t\tswitch cs[i] {\n\t\tcase BoolCheck:\n\t\t\tresult = n.IsBool()\n\t\tcase StringCheck:\n\t\t\tresult = n.IsString()\n\t\tcase IntegerCheck:\n\t\t\tresult = n.IsInteger\n\t\tcase NumberCheck:\n\t\t\tresult = n.IsNumber()\n\t\tcase MapCheck:\n\t\t\tresult = n.IsMap()\n\t\tcase ArrayCheck:\n\t\t\tresult = n.IsArray()\n\t\tcase TimeCheck:\n\t\t\tresult = n.IsTime()\n\t\tcase DurationCheck:\n\t\t\tresult = n.IsDuration()\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"unknown check value %d\", cs[i]))\n\t\t}\n\t}\n\treturn result\n}\n\nfunc (n *Nature) ComparableTo(c *Cache, rhs Nature) bool {\n\treturn n.IsUnknown(c) || rhs.IsUnknown(c) ||\n\t\tn.Nil || rhs.Nil ||\n\t\tn.IsNumber() && rhs.IsNumber() ||\n\t\tn.IsDuration() && rhs.IsDuration() ||\n\t\tn.IsTime() && rhs.IsTime() ||\n\t\tn.IsArray() && rhs.IsArray() ||\n\t\tn.AssignableTo(rhs)\n}\n\nfunc (n *Nature) MaybeCompatible(c *Cache, rhs Nature, cs ...NatureCheck) bool {\n\tnIsUnknown := n.IsUnknown(c)\n\trshIsUnknown := rhs.IsUnknown(c)\n\treturn nIsUnknown && rshIsUnknown ||\n\t\tnIsUnknown && rhs.IsAnyOf(cs...) ||\n\t\trshIsUnknown && n.IsAnyOf(cs...)\n}\n\nfunc (n *Nature) MakeArrayOf(c *Cache) Nature {\n\tnt := c.FromType(arrayType)\n\tnt.Ref = n\n\treturn nt\n}\n"
  },
  {
    "path": "checker/nature/utils.go",
    "content": "package nature\n\nimport (\n\t\"reflect\"\n\n\t\"github.com/expr-lang/expr/internal/deref\"\n)\n\nfunc fieldName(fieldName string, tag reflect.StructTag) (string, bool) {\n\tswitch taggedName := tag.Get(\"expr\"); taggedName {\n\tcase \"-\":\n\t\treturn \"\", false\n\tcase \"\":\n\t\treturn fieldName, true\n\tdefault:\n\t\treturn taggedName, true\n\t}\n}\n\ntype structData struct {\n\trType                     reflect.Type\n\tfields                    map[string]*structField\n\tnumField, ownIdx, anonIdx int\n\n\tcurParent, curChild *structData\n\tcurChildIndex       []int\n}\n\ntype structField struct {\n\tNature\n\tIndex []int\n}\n\nfunc (s *structData) finished() bool {\n\treturn s.ownIdx >= s.numField && // no own fields left to visit\n\t\ts.anonIdx >= s.numField && // no embedded fields to visit\n\t\ts.curChild == nil // no child in process of visiting\n}\n\nfunc (s *structData) structField(c *Cache, parentEmbed *structData, name string) *structField {\n\tif s.fields == nil {\n\t\tif s.numField > 0 {\n\t\t\ts.fields = make(map[string]*structField, s.numField)\n\t\t}\n\t} else if f := s.fields[name]; f != nil {\n\t\treturn f\n\t}\n\tif s.finished() {\n\t\treturn nil\n\t}\n\n\t// Lookup own fields first.\n\tfor ; s.ownIdx < s.numField; s.ownIdx++ {\n\t\tfield := s.rType.Field(s.ownIdx)\n\t\tif field.Anonymous && s.anonIdx < 0 {\n\t\t\t// start iterating anon fields on the first instead of zero\n\t\t\ts.anonIdx = s.ownIdx\n\t\t}\n\t\tif !field.IsExported() {\n\t\t\tcontinue\n\t\t}\n\t\tfName, ok := fieldName(field.Name, field.Tag)\n\t\tif !ok || fName == \"\" {\n\t\t\t// name can still be empty for a type created at runtime with\n\t\t\t// reflect\n\t\t\tcontinue\n\t\t}\n\t\tnt := c.FromType(field.Type)\n\t\tsf := &structField{\n\t\t\tNature: nt,\n\t\t\tIndex:  field.Index,\n\t\t}\n\t\ts.fields[fName] = sf\n\t\tif parentEmbed != nil {\n\t\t\tparentEmbed.trySet(fName, sf)\n\t\t}\n\t\tif fName == name {\n\t\t\treturn sf\n\t\t}\n\t}\n\n\tif s.curChild != nil {\n\t\tsf := s.findInEmbedded(c, parentEmbed, s.curChild, s.curChildIndex, name)\n\t\tif sf != nil {\n\t\t\treturn sf\n\t\t}\n\t}\n\n\t// Lookup embedded fields through anon own fields\n\tfor ; s.anonIdx >= 0 && s.anonIdx < s.numField; s.anonIdx++ {\n\t\tfield := s.rType.Field(s.anonIdx)\n\t\t// we do enter embedded non-exported types because they could contain\n\t\t// exported fields\n\t\tif !field.Anonymous {\n\t\t\tcontinue\n\t\t}\n\t\tt, k, _ := deref.TypeKind(field.Type, field.Type.Kind())\n\t\tif k != reflect.Struct {\n\t\t\tcontinue\n\t\t}\n\n\t\tchildEmbed := c.getStruct(t).structData\n\t\tsf := s.findInEmbedded(c, parentEmbed, childEmbed, field.Index, name)\n\t\tif sf != nil {\n\t\t\treturn sf\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (s *structData) findInEmbedded(\n\tc *Cache,\n\tparentEmbed, childEmbed *structData,\n\tchildIndex []int,\n\tname string,\n) *structField {\n\t// Set current parent/child data. This allows trySet to handle child fields\n\t// and add them to our struct and to the parent as well if needed\n\ts.curParent = parentEmbed\n\ts.curChild = childEmbed\n\ts.curChildIndex = childIndex\n\tdefer func() {\n\t\t// Ensure to cleanup references\n\t\ts.curParent = nil\n\t\tif childEmbed.finished() {\n\t\t\t// If the child can still have more fields to explore then keep it\n\t\t\t// referened to look it up again if we need to\n\t\t\ts.curChild = nil\n\t\t\ts.curChildIndex = nil\n\t\t}\n\t}()\n\n\t// See if the child has already cached its fields. This is still important\n\t// to check even if it's the s.unfinishedEmbedded because it may have\n\t// explored new fields since the last time we visited it\n\tfor name, sf := range childEmbed.fields {\n\t\ts.trySet(name, sf)\n\t}\n\n\t// Recheck if we have what we needed from the above sync\n\tif sf := s.fields[name]; sf != nil {\n\t\treturn sf\n\t}\n\n\t// Try finding in the child again in case it hasn't finished\n\tif !childEmbed.finished() {\n\t\tif childEmbed.structField(c, s, name) != nil {\n\t\t\treturn s.fields[name]\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (s *structData) trySet(name string, sf *structField) {\n\tif _, ok := s.fields[name]; ok {\n\t\treturn\n\t}\n\tsf = &structField{\n\t\tNature: sf.Nature,\n\t\tIndex:  append(s.curChildIndex, sf.Index...),\n\t}\n\ts.fields[name] = sf\n\tif s.curParent != nil {\n\t\ts.curParent.trySet(name, sf)\n\t}\n}\n\nfunc StructFields(c *Cache, t reflect.Type) map[string]Nature {\n\ttable := make(map[string]Nature)\n\tif t == nil {\n\t\treturn table\n\t}\n\tt, k, _ := deref.TypeKind(t, t.Kind())\n\tif k == reflect.Struct {\n\t\t// lookup for a field with an empty name, which will cause to never find a\n\t\t// match, meaning everything will have been cached.\n\t\tsd := c.getStruct(t).structData\n\t\tsd.structField(c, nil, \"\")\n\t\tfor name, sf := range sd.fields {\n\t\t\ttable[name] = sf.Nature\n\t\t}\n\t}\n\treturn table\n}\n\ntype methodset struct {\n\trType          reflect.Type\n\tkind           reflect.Kind\n\tmethods        map[string]*method\n\tnumMethod, idx int\n}\n\ntype method struct {\n\treflect.Method\n\tnature Nature\n}\n\nfunc (s *methodset) method(c *Cache, name string) *method {\n\tif s.methods == nil {\n\t\ts.methods = make(map[string]*method, s.numMethod)\n\t} else if m := s.methods[name]; m != nil {\n\t\treturn m\n\t}\n\tfor ; s.idx < s.numMethod; s.idx++ {\n\t\trm := s.rType.Method(s.idx)\n\t\tif !rm.IsExported() {\n\t\t\tcontinue\n\t\t}\n\t\tnt := c.FromType(rm.Type)\n\t\tif s.rType.Kind() != reflect.Interface {\n\t\t\tnt.Method = true\n\t\t\tnt.MethodIndex = rm.Index\n\t\t\t// In case of interface type method will not have a receiver,\n\t\t\t// and to prevent checker decreasing numbers of in arguments\n\t\t\t// return method type as not method (second argument is false).\n\n\t\t\t// Also, we can not use m.Index here, because it will be\n\t\t\t// different indexes for different types which implement\n\t\t\t// the same interface.\n\t\t}\n\t\tm := &method{\n\t\t\tMethod: rm,\n\t\t\tnature: nt,\n\t\t}\n\t\ts.methods[rm.Name] = m\n\t\tif rm.Name == name {\n\t\t\treturn m\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "compiler/compiler.go",
    "content": "package compiler\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"runtime/debug\"\n\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/builtin\"\n\t\"github.com/expr-lang/expr/checker\"\n\t. \"github.com/expr-lang/expr/checker/nature\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/file\"\n\t\"github.com/expr-lang/expr/parser\"\n\t. \"github.com/expr-lang/expr/vm\"\n\t\"github.com/expr-lang/expr/vm/runtime\"\n)\n\nconst (\n\tplaceholder = 12345\n)\n\nfunc Compile(tree *parser.Tree, config *conf.Config) (program *Program, err error) {\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = fmt.Errorf(\"%v\\n%s\", r, debug.Stack())\n\t\t}\n\t}()\n\n\tc := &compiler{\n\t\tconfig:         config,\n\t\tlocations:      make([]file.Location, 0),\n\t\tconstantsIndex: make(map[any]int),\n\t\tfunctionsIndex: make(map[string]int),\n\t\tdebugInfo:      make(map[string]string),\n\t}\n\n\tif config != nil {\n\t\tc.ntCache = &c.config.NtCache\n\t} else {\n\t\tc.ntCache = new(Cache)\n\t}\n\n\tc.compile(tree.Node)\n\n\tif c.config != nil {\n\t\tswitch c.config.Expect {\n\t\tcase reflect.Int:\n\t\t\tc.emit(OpCast, 0)\n\t\tcase reflect.Int64:\n\t\t\tc.emit(OpCast, 1)\n\t\tcase reflect.Float64:\n\t\t\tc.emit(OpCast, 2)\n\t\tcase reflect.Bool:\n\t\t\tc.emit(OpCast, 3)\n\t\t}\n\t\tif c.config.Optimize {\n\t\t\tc.optimize()\n\t\t}\n\t}\n\n\tvar span *Span\n\tif len(c.spans) > 0 {\n\t\tspan = c.spans[0]\n\t}\n\n\tprogram = NewProgram(\n\t\ttree.Source,\n\t\ttree.Node,\n\t\tc.locations,\n\t\tc.variables,\n\t\tc.constants,\n\t\tc.bytecode,\n\t\tc.arguments,\n\t\tc.functions,\n\t\tc.debugInfo,\n\t\tspan,\n\t)\n\treturn\n}\n\ntype compiler struct {\n\tconfig         *conf.Config\n\tntCache        *Cache\n\tlocations      []file.Location\n\tbytecode       []Opcode\n\tvariables      int\n\tscopes         []scope\n\tconstants      []any\n\tconstantsIndex map[any]int\n\tfunctions      []Function\n\tfunctionsIndex map[string]int\n\tdebugInfo      map[string]string\n\tnodes          []ast.Node\n\tspans          []*Span\n\tchains         [][]int\n\targuments      []int\n}\n\ntype scope struct {\n\tvariableName string\n\tindex        int\n}\n\nfunc (c *compiler) nodeParent() ast.Node {\n\tif len(c.nodes) > 1 {\n\t\treturn c.nodes[len(c.nodes)-2]\n\t}\n\treturn nil\n}\n\nfunc (c *compiler) emitLocation(loc file.Location, op Opcode, arg int) int {\n\tc.bytecode = append(c.bytecode, op)\n\tcurrent := len(c.bytecode)\n\tc.arguments = append(c.arguments, arg)\n\tc.locations = append(c.locations, loc)\n\treturn current\n}\n\nfunc (c *compiler) emit(op Opcode, args ...int) int {\n\targ := 0\n\tif len(args) > 1 {\n\t\tpanic(\"too many arguments\")\n\t}\n\tif len(args) == 1 {\n\t\targ = args[0]\n\t}\n\tvar loc file.Location\n\tif len(c.nodes) > 0 {\n\t\tloc = c.nodes[len(c.nodes)-1].Location()\n\t}\n\treturn c.emitLocation(loc, op, arg)\n}\n\nfunc (c *compiler) emitPush(value any) int {\n\treturn c.emit(OpPush, c.addConstant(value))\n}\n\nfunc (c *compiler) addConstant(constant any) int {\n\tindexable := true\n\thash := constant\n\tswitch reflect.TypeOf(constant).Kind() {\n\tcase reflect.Slice, reflect.Map, reflect.Struct, reflect.Func:\n\t\tindexable = false\n\t}\n\tif field, ok := constant.(*runtime.Field); ok {\n\t\tindexable = true\n\t\thash = fmt.Sprintf(\"%v\", field)\n\t}\n\tif method, ok := constant.(*runtime.Method); ok {\n\t\tindexable = true\n\t\thash = fmt.Sprintf(\"%v\", method)\n\t}\n\tif indexable {\n\t\tif p, ok := c.constantsIndex[hash]; ok {\n\t\t\treturn p\n\t\t}\n\t}\n\tc.constants = append(c.constants, constant)\n\tp := len(c.constants) - 1\n\tif indexable {\n\t\tc.constantsIndex[hash] = p\n\t}\n\treturn p\n}\n\nfunc (c *compiler) addVariable(name string) int {\n\tc.variables++\n\tc.debugInfo[fmt.Sprintf(\"var_%d\", c.variables-1)] = name\n\treturn c.variables - 1\n}\n\n// emitFunction adds builtin.Function.Func to the program.functions and emits call opcode.\nfunc (c *compiler) emitFunction(fn *builtin.Function, argsLen int) {\n\tswitch argsLen {\n\tcase 0:\n\t\tc.emit(OpCall0, c.addFunction(fn.Name, fn.Func))\n\tcase 1:\n\t\tc.emit(OpCall1, c.addFunction(fn.Name, fn.Func))\n\tcase 2:\n\t\tc.emit(OpCall2, c.addFunction(fn.Name, fn.Func))\n\tcase 3:\n\t\tc.emit(OpCall3, c.addFunction(fn.Name, fn.Func))\n\tdefault:\n\t\tc.emit(OpLoadFunc, c.addFunction(fn.Name, fn.Func))\n\t\tc.emit(OpCallN, argsLen)\n\t}\n}\n\n// addFunction adds builtin.Function.Func to the program.functions and returns its index.\nfunc (c *compiler) addFunction(name string, fn Function) int {\n\tif fn == nil {\n\t\tpanic(\"function is nil\")\n\t}\n\tif p, ok := c.functionsIndex[name]; ok {\n\t\treturn p\n\t}\n\tp := len(c.functions)\n\tc.functions = append(c.functions, fn)\n\tc.functionsIndex[name] = p\n\tc.debugInfo[fmt.Sprintf(\"func_%d\", p)] = name\n\treturn p\n}\n\nfunc (c *compiler) patchJump(placeholder int) {\n\toffset := len(c.bytecode) - placeholder\n\tc.arguments[placeholder-1] = offset\n}\n\nfunc (c *compiler) calcBackwardJump(to int) int {\n\treturn len(c.bytecode) + 1 - to\n}\n\nfunc (c *compiler) compile(node ast.Node) {\n\tc.nodes = append(c.nodes, node)\n\tdefer func() {\n\t\tc.nodes = c.nodes[:len(c.nodes)-1]\n\t}()\n\n\tif c.config != nil && c.config.Profile {\n\t\tspan := &Span{\n\t\t\tName:       reflect.TypeOf(node).String(),\n\t\t\tExpression: node.String(),\n\t\t}\n\t\tif len(c.spans) > 0 {\n\t\t\tprev := c.spans[len(c.spans)-1]\n\t\t\tprev.Children = append(prev.Children, span)\n\t\t}\n\t\tc.spans = append(c.spans, span)\n\t\tdefer func() {\n\t\t\tif len(c.spans) > 1 {\n\t\t\t\tc.spans = c.spans[:len(c.spans)-1]\n\t\t\t}\n\t\t}()\n\n\t\tc.emit(OpProfileStart, c.addConstant(span))\n\t\tdefer func() {\n\t\t\tc.emit(OpProfileEnd, c.addConstant(span))\n\t\t}()\n\t}\n\n\tswitch n := node.(type) {\n\tcase *ast.NilNode:\n\t\tc.NilNode(n)\n\tcase *ast.IdentifierNode:\n\t\tc.IdentifierNode(n)\n\tcase *ast.IntegerNode:\n\t\tc.IntegerNode(n)\n\tcase *ast.FloatNode:\n\t\tc.FloatNode(n)\n\tcase *ast.BoolNode:\n\t\tc.BoolNode(n)\n\tcase *ast.StringNode:\n\t\tc.StringNode(n)\n\tcase *ast.BytesNode:\n\t\tc.BytesNode(n)\n\tcase *ast.ConstantNode:\n\t\tc.ConstantNode(n)\n\tcase *ast.UnaryNode:\n\t\tc.UnaryNode(n)\n\tcase *ast.BinaryNode:\n\t\tc.BinaryNode(n)\n\tcase *ast.ChainNode:\n\t\tc.ChainNode(n)\n\tcase *ast.MemberNode:\n\t\tc.MemberNode(n)\n\tcase *ast.SliceNode:\n\t\tc.SliceNode(n)\n\tcase *ast.CallNode:\n\t\tc.CallNode(n)\n\tcase *ast.BuiltinNode:\n\t\tc.BuiltinNode(n)\n\tcase *ast.PredicateNode:\n\t\tc.PredicateNode(n)\n\tcase *ast.PointerNode:\n\t\tc.PointerNode(n)\n\tcase *ast.VariableDeclaratorNode:\n\t\tc.VariableDeclaratorNode(n)\n\tcase *ast.SequenceNode:\n\t\tc.SequenceNode(n)\n\tcase *ast.ConditionalNode:\n\t\tc.ConditionalNode(n)\n\tcase *ast.ArrayNode:\n\t\tc.ArrayNode(n)\n\tcase *ast.MapNode:\n\t\tc.MapNode(n)\n\tcase *ast.PairNode:\n\t\tc.PairNode(n)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"undefined node type (%T)\", node))\n\t}\n}\n\nfunc (c *compiler) NilNode(_ *ast.NilNode) {\n\tc.emit(OpNil)\n}\n\nfunc (c *compiler) IdentifierNode(node *ast.IdentifierNode) {\n\tif index, ok := c.lookupVariable(node.Value); ok {\n\t\tc.emit(OpLoadVar, index)\n\t\treturn\n\t}\n\tif node.Value == \"$env\" {\n\t\tc.emit(OpLoadEnv)\n\t\treturn\n\t}\n\n\tvar env Nature\n\tif c.config != nil {\n\t\tenv = c.config.Env\n\t}\n\n\tif env.IsFastMap() {\n\t\tc.emit(OpLoadFast, c.addConstant(node.Value))\n\t} else if ok, index, name := checker.FieldIndex(c.ntCache, env, node); ok {\n\t\tc.emit(OpLoadField, c.addConstant(&runtime.Field{\n\t\t\tIndex: index,\n\t\t\tPath:  []string{name},\n\t\t}))\n\t} else if ok, index, name := checker.MethodIndex(c.ntCache, env, node); ok {\n\t\tc.emit(OpLoadMethod, c.addConstant(&runtime.Method{\n\t\t\tName:  name,\n\t\t\tIndex: index,\n\t\t}))\n\t} else {\n\t\tc.emit(OpLoadConst, c.addConstant(node.Value))\n\t}\n}\n\nfunc (c *compiler) IntegerNode(node *ast.IntegerNode) {\n\tt := node.Type()\n\tif t == nil {\n\t\tc.emitPush(node.Value)\n\t\treturn\n\t}\n\tswitch t.Kind() {\n\tcase reflect.Float32:\n\t\tc.emitPush(float32(node.Value))\n\tcase reflect.Float64:\n\t\tc.emitPush(float64(node.Value))\n\tcase reflect.Int:\n\t\tc.emitPush(node.Value)\n\tcase reflect.Int8:\n\t\tif node.Value > math.MaxInt8 || node.Value < math.MinInt8 {\n\t\t\tpanic(fmt.Sprintf(\"constant %d overflows int8\", node.Value))\n\t\t}\n\t\tc.emitPush(int8(node.Value))\n\tcase reflect.Int16:\n\t\tif node.Value > math.MaxInt16 || node.Value < math.MinInt16 {\n\t\t\tpanic(fmt.Sprintf(\"constant %d overflows int16\", node.Value))\n\t\t}\n\t\tc.emitPush(int16(node.Value))\n\tcase reflect.Int32:\n\t\tif node.Value > math.MaxInt32 || node.Value < math.MinInt32 {\n\t\t\tpanic(fmt.Sprintf(\"constant %d overflows int32\", node.Value))\n\t\t}\n\t\tc.emitPush(int32(node.Value))\n\tcase reflect.Int64:\n\t\tc.emitPush(int64(node.Value))\n\tcase reflect.Uint:\n\t\tif node.Value < 0 {\n\t\t\tpanic(fmt.Sprintf(\"constant %d overflows uint\", node.Value))\n\t\t}\n\t\tc.emitPush(uint(node.Value))\n\tcase reflect.Uint8:\n\t\tif node.Value > math.MaxUint8 || node.Value < 0 {\n\t\t\tpanic(fmt.Sprintf(\"constant %d overflows uint8\", node.Value))\n\t\t}\n\t\tc.emitPush(uint8(node.Value))\n\tcase reflect.Uint16:\n\t\tif node.Value > math.MaxUint16 || node.Value < 0 {\n\t\t\tpanic(fmt.Sprintf(\"constant %d overflows uint16\", node.Value))\n\t\t}\n\t\tc.emitPush(uint16(node.Value))\n\tcase reflect.Uint32:\n\t\tif node.Value < 0 {\n\t\t\tpanic(fmt.Sprintf(\"constant %d overflows uint32\", node.Value))\n\t\t}\n\t\tc.emitPush(uint32(node.Value))\n\tcase reflect.Uint64:\n\t\tif node.Value < 0 {\n\t\t\tpanic(fmt.Sprintf(\"constant %d overflows uint64\", node.Value))\n\t\t}\n\t\tc.emitPush(uint64(node.Value))\n\tdefault:\n\t\tc.emitPush(node.Value)\n\t}\n}\n\nfunc (c *compiler) FloatNode(node *ast.FloatNode) {\n\tswitch node.Type().Kind() {\n\tcase reflect.Float32:\n\t\tc.emitPush(float32(node.Value))\n\tcase reflect.Float64:\n\t\tc.emitPush(node.Value)\n\tdefault:\n\t\tc.emitPush(node.Value)\n\t}\n}\n\nfunc (c *compiler) BoolNode(node *ast.BoolNode) {\n\tif node.Value {\n\t\tc.emit(OpTrue)\n\t} else {\n\t\tc.emit(OpFalse)\n\t}\n}\n\nfunc (c *compiler) StringNode(node *ast.StringNode) {\n\tc.emitPush(node.Value)\n}\n\nfunc (c *compiler) BytesNode(node *ast.BytesNode) {\n\tc.emitPush(node.Value)\n}\n\nfunc (c *compiler) ConstantNode(node *ast.ConstantNode) {\n\tif node.Value == nil {\n\t\tc.emit(OpNil)\n\t\treturn\n\t}\n\tc.emitPush(node.Value)\n}\n\nfunc (c *compiler) UnaryNode(node *ast.UnaryNode) {\n\tc.compile(node.Node)\n\tc.derefInNeeded(node.Node)\n\n\tswitch node.Operator {\n\n\tcase \"!\", \"not\":\n\t\tc.emit(OpNot)\n\n\tcase \"+\":\n\t\t// Do nothing\n\n\tcase \"-\":\n\t\tc.emit(OpNegate)\n\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"unknown operator (%v)\", node.Operator))\n\t}\n}\n\nfunc (c *compiler) BinaryNode(node *ast.BinaryNode) {\n\tswitch node.Operator {\n\tcase \"==\":\n\t\tc.equalBinaryNode(node)\n\n\tcase \"!=\":\n\t\tc.equalBinaryNode(node)\n\t\tc.emit(OpNot)\n\n\tcase \"or\", \"||\":\n\t\tif c.config != nil && !c.config.ShortCircuit {\n\t\t\tc.compile(node.Left)\n\t\t\tc.derefInNeeded(node.Left)\n\t\t\tc.compile(node.Right)\n\t\t\tc.derefInNeeded(node.Right)\n\t\t\tc.emit(OpOr)\n\t\t\tbreak\n\t\t}\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tend := c.emit(OpJumpIfTrue, placeholder)\n\t\tc.emit(OpPop)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.patchJump(end)\n\n\tcase \"and\", \"&&\":\n\t\tif c.config != nil && !c.config.ShortCircuit {\n\t\t\tc.compile(node.Left)\n\t\t\tc.derefInNeeded(node.Left)\n\t\t\tc.compile(node.Right)\n\t\t\tc.derefInNeeded(node.Right)\n\t\t\tc.emit(OpAnd)\n\t\t\tbreak\n\t\t}\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tend := c.emit(OpJumpIfFalse, placeholder)\n\t\tc.emit(OpPop)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.patchJump(end)\n\n\tcase \"<\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpLess)\n\n\tcase \">\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpMore)\n\n\tcase \"<=\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpLessOrEqual)\n\n\tcase \">=\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpMoreOrEqual)\n\n\tcase \"+\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpAdd)\n\n\tcase \"-\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpSubtract)\n\n\tcase \"*\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpMultiply)\n\n\tcase \"/\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpDivide)\n\n\tcase \"%\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpModulo)\n\n\tcase \"**\", \"^\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpExponent)\n\n\tcase \"in\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpIn)\n\n\tcase \"matches\":\n\t\tif str, ok := node.Right.(*ast.StringNode); ok {\n\t\t\tre, err := regexp.Compile(str.Value)\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tc.compile(node.Left)\n\t\t\tc.derefInNeeded(node.Left)\n\t\t\tc.emit(OpMatchesConst, c.addConstant(re))\n\t\t} else {\n\t\t\tc.compile(node.Left)\n\t\t\tc.derefInNeeded(node.Left)\n\t\t\tc.compile(node.Right)\n\t\t\tc.derefInNeeded(node.Right)\n\t\t\tc.emit(OpMatches)\n\t\t}\n\n\tcase \"contains\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpContains)\n\n\tcase \"startsWith\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpStartsWith)\n\n\tcase \"endsWith\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpEndsWith)\n\n\tcase \"..\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.emit(OpRange)\n\n\tcase \"??\":\n\t\tc.compile(node.Left)\n\t\tc.derefInNeeded(node.Left)\n\t\tend := c.emit(OpJumpIfNotNil, placeholder)\n\t\tc.emit(OpPop)\n\t\tc.compile(node.Right)\n\t\tc.derefInNeeded(node.Right)\n\t\tc.patchJump(end)\n\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"unknown operator (%v)\", node.Operator))\n\n\t}\n}\n\nfunc (c *compiler) equalBinaryNode(node *ast.BinaryNode) {\n\tl := kind(node.Left.Type())\n\tr := kind(node.Right.Type())\n\n\tleftIsSimple := isSimpleType(node.Left)\n\trightIsSimple := isSimpleType(node.Right)\n\tleftAndRightAreSimple := leftIsSimple && rightIsSimple\n\n\tc.compile(node.Left)\n\tc.derefInNeeded(node.Left)\n\tc.compile(node.Right)\n\tc.derefInNeeded(node.Right)\n\n\tif l == r && l == reflect.Int && leftAndRightAreSimple {\n\t\tc.emit(OpEqualInt)\n\t} else if l == r && l == reflect.String && leftAndRightAreSimple {\n\t\tc.emit(OpEqualString)\n\t} else {\n\t\tc.emit(OpEqual)\n\t}\n}\n\nfunc isSimpleType(node ast.Node) bool {\n\tif node == nil {\n\t\treturn false\n\t}\n\tt := node.Type()\n\tif t == nil {\n\t\treturn false\n\t}\n\treturn t.PkgPath() == \"\"\n}\n\nfunc (c *compiler) ChainNode(node *ast.ChainNode) {\n\tc.chains = append(c.chains, []int{})\n\tc.compile(node.Node)\n\tfor _, ph := range c.chains[len(c.chains)-1] {\n\t\tc.patchJump(ph) // If chain activated jump here (got nit somewhere).\n\t}\n\tparent := c.nodeParent()\n\tif binary, ok := parent.(*ast.BinaryNode); ok && binary.Operator == \"??\" {\n\t\t// If chain is used in nil coalescing operator, we can omit\n\t\t// nil push at the end of the chain. The ?? operator will\n\t\t// handle it.\n\t} else {\n\t\t// We need to put the nil on the stack, otherwise \"typed\"\n\t\t// nil will be used as a result of the chain.\n\t\tj := c.emit(OpJumpIfNotNil, placeholder)\n\t\tc.emit(OpPop)\n\t\tc.emit(OpNil)\n\t\tc.patchJump(j)\n\t}\n\tc.chains = c.chains[:len(c.chains)-1]\n}\n\nfunc (c *compiler) MemberNode(node *ast.MemberNode) {\n\tvar env Nature\n\tif c.config != nil {\n\t\tenv = c.config.Env\n\t}\n\n\tif ok, index, name := checker.MethodIndex(c.ntCache, env, node); ok {\n\t\tc.compile(node.Node)\n\t\tc.emit(OpMethod, c.addConstant(&runtime.Method{\n\t\t\tName:  name,\n\t\t\tIndex: index,\n\t\t}))\n\t\treturn\n\t}\n\top := OpFetch\n\tbase := node.Node\n\n\tok, index, nodeName := checker.FieldIndex(c.ntCache, env, node)\n\tpath := []string{nodeName}\n\n\tif ok {\n\t\top = OpFetchField\n\t\tfor !node.Optional {\n\t\t\tif ident, isIdent := base.(*ast.IdentifierNode); isIdent {\n\t\t\t\tif ok, identIndex, name := checker.FieldIndex(c.ntCache, env, ident); ok {\n\t\t\t\t\tindex = append(identIndex, index...)\n\t\t\t\t\tpath = append([]string{name}, path...)\n\t\t\t\t\tc.emitLocation(ident.Location(), OpLoadField, c.addConstant(\n\t\t\t\t\t\t&runtime.Field{Index: index, Path: path},\n\t\t\t\t\t))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif member, isMember := base.(*ast.MemberNode); isMember {\n\t\t\t\tif ok, memberIndex, name := checker.FieldIndex(c.ntCache, env, member); ok {\n\t\t\t\t\tindex = append(memberIndex, index...)\n\t\t\t\t\tpath = append([]string{name}, path...)\n\t\t\t\t\tnode = member\n\t\t\t\t\tbase = member.Node\n\t\t\t\t} else {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tc.compile(base)\n\t// If the field is optional, we need to jump over the fetch operation.\n\t// If no ChainNode (none c.chains) is used, do not compile the optional fetch.\n\tif node.Optional && len(c.chains) > 0 {\n\t\tph := c.emit(OpJumpIfNil, placeholder)\n\t\tc.chains[len(c.chains)-1] = append(c.chains[len(c.chains)-1], ph)\n\t}\n\n\tif op == OpFetch {\n\t\tc.compile(node.Property)\n\t\tderef := true\n\t\t// If the map key is a pointer, we should not dereference the property.\n\t\tif node.Node.Type() != nil && node.Node.Type().Kind() == reflect.Map {\n\t\t\tkeyType := node.Node.Type().Key()\n\t\t\tpropType := node.Property.Type()\n\t\t\tif propType != nil && propType.AssignableTo(keyType) {\n\t\t\t\tderef = false\n\t\t\t}\n\t\t}\n\t\tif deref {\n\t\t\tc.derefInNeeded(node.Property)\n\t\t}\n\t\tc.emit(OpFetch)\n\t} else {\n\t\tc.emitLocation(node.Location(), op, c.addConstant(\n\t\t\t&runtime.Field{Index: index, Path: path},\n\t\t))\n\t}\n}\n\nfunc (c *compiler) SliceNode(node *ast.SliceNode) {\n\tc.compile(node.Node)\n\tif node.To != nil {\n\t\tc.compile(node.To)\n\t\tc.derefInNeeded(node.To)\n\t} else {\n\t\tc.emit(OpLen)\n\t}\n\tif node.From != nil {\n\t\tc.compile(node.From)\n\t\tc.derefInNeeded(node.From)\n\t} else {\n\t\tc.emitPush(0)\n\t}\n\tc.emit(OpSlice)\n}\n\nfunc (c *compiler) CallNode(node *ast.CallNode) {\n\tfn := node.Callee.Type()\n\tif fn.Kind() == reflect.Func {\n\t\tfnInOffset := 0\n\t\tfnNumIn := fn.NumIn()\n\t\tswitch callee := node.Callee.(type) {\n\t\tcase *ast.MemberNode:\n\t\t\tif prop, ok := callee.Property.(*ast.StringNode); ok {\n\t\t\t\tif _, ok = callee.Node.Type().MethodByName(prop.Value); ok && callee.Node.Type().Kind() != reflect.Interface {\n\t\t\t\t\tfnInOffset = 1\n\t\t\t\t\tfnNumIn--\n\t\t\t\t}\n\t\t\t}\n\t\tcase *ast.IdentifierNode:\n\t\t\tif t, ok := c.config.Env.MethodByName(c.ntCache, callee.Value); ok && t.Method {\n\t\t\t\tfnInOffset = 1\n\t\t\t\tfnNumIn--\n\t\t\t}\n\t\t}\n\t\tfor i, arg := range node.Arguments {\n\t\t\tc.compile(arg)\n\n\t\t\tvar in reflect.Type\n\t\t\tif fn.IsVariadic() && i >= fnNumIn-1 {\n\t\t\t\tin = fn.In(fn.NumIn() - 1).Elem()\n\t\t\t} else {\n\t\t\t\tin = fn.In(i + fnInOffset)\n\t\t\t}\n\n\t\t\tc.derefParam(in, arg)\n\t\t}\n\t} else {\n\t\tfor _, arg := range node.Arguments {\n\t\t\tc.compile(arg)\n\t\t}\n\t}\n\n\tif ident, ok := node.Callee.(*ast.IdentifierNode); ok {\n\t\tif c.config != nil {\n\t\t\tif fn, ok := c.config.Functions[ident.Value]; ok {\n\t\t\t\tc.emitFunction(fn, len(node.Arguments))\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\tc.compile(node.Callee)\n\n\tif c.config != nil {\n\t\tisMethod, _, _ := checker.MethodIndex(c.ntCache, c.config.Env, node.Callee)\n\t\tif index, ok := checker.TypedFuncIndex(node.Callee.Type(), isMethod); ok {\n\t\t\tc.emit(OpCallTyped, index)\n\t\t\treturn\n\t\t} else if checker.IsFastFunc(node.Callee.Type(), isMethod) {\n\t\t\tc.emit(OpCallFast, len(node.Arguments))\n\t\t} else {\n\t\t\tc.emit(OpCall, len(node.Arguments))\n\t\t}\n\t} else {\n\t\tc.emit(OpCall, len(node.Arguments))\n\t}\n}\n\nfunc (c *compiler) BuiltinNode(node *ast.BuiltinNode) {\n\tswitch node.Name {\n\tcase \"all\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tvar loopBreak int\n\t\tc.emitLoop(func() {\n\t\t\tc.compile(node.Arguments[1])\n\t\t\tloopBreak = c.emit(OpJumpIfFalse, placeholder)\n\t\t\tc.emit(OpPop)\n\t\t})\n\t\tc.emit(OpTrue)\n\t\tc.patchJump(loopBreak)\n\t\tc.emit(OpEnd)\n\t\treturn\n\n\tcase \"none\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tvar loopBreak int\n\t\tc.emitLoop(func() {\n\t\t\tc.compile(node.Arguments[1])\n\t\t\tc.emit(OpNot)\n\t\t\tloopBreak = c.emit(OpJumpIfFalse, placeholder)\n\t\t\tc.emit(OpPop)\n\t\t})\n\t\tc.emit(OpTrue)\n\t\tc.patchJump(loopBreak)\n\t\tc.emit(OpEnd)\n\t\treturn\n\n\tcase \"any\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tvar loopBreak int\n\t\tc.emitLoop(func() {\n\t\t\tc.compile(node.Arguments[1])\n\t\t\tloopBreak = c.emit(OpJumpIfTrue, placeholder)\n\t\t\tc.emit(OpPop)\n\t\t})\n\t\tc.emit(OpFalse)\n\t\tc.patchJump(loopBreak)\n\t\tc.emit(OpEnd)\n\t\treturn\n\n\tcase \"one\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tc.emitLoop(func() {\n\t\t\tc.compile(node.Arguments[1])\n\t\t\tc.emitCond(func() {\n\t\t\t\tc.emit(OpIncrementCount)\n\t\t\t})\n\t\t})\n\t\tc.emit(OpGetCount)\n\t\tc.emitPush(1)\n\t\tc.emit(OpEqual)\n\t\tc.emit(OpEnd)\n\t\treturn\n\n\tcase \"filter\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tc.emitLoop(func() {\n\t\t\tc.compile(node.Arguments[1])\n\t\t\tc.emitCond(func() {\n\t\t\t\tc.emit(OpIncrementCount)\n\t\t\t\tif node.Map != nil {\n\t\t\t\t\tc.compile(node.Map)\n\t\t\t\t} else {\n\t\t\t\t\tc.emit(OpPointer)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t\tc.emit(OpGetCount)\n\t\tc.emit(OpEnd)\n\t\tc.emit(OpArray)\n\t\treturn\n\n\tcase \"map\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tc.emitLoop(func() {\n\t\t\tc.compile(node.Arguments[1])\n\t\t})\n\t\tc.emit(OpGetLen)\n\t\tc.emit(OpEnd)\n\t\tc.emit(OpArray)\n\t\treturn\n\n\tcase \"count\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tvar loopBreak int\n\t\tc.emitLoop(func() {\n\t\t\tif len(node.Arguments) == 2 {\n\t\t\t\tc.compile(node.Arguments[1])\n\t\t\t} else {\n\t\t\t\tc.emit(OpPointer)\n\t\t\t}\n\t\t\tc.emitCond(func() {\n\t\t\t\tc.emit(OpIncrementCount)\n\t\t\t\t// Early termination if threshold is set\n\t\t\t\tif node.Threshold != nil {\n\t\t\t\t\tc.emit(OpGetCount)\n\t\t\t\t\tc.emit(OpInt, *node.Threshold)\n\t\t\t\t\tc.emit(OpMoreOrEqual)\n\t\t\t\t\tloopBreak = c.emit(OpJumpIfTrue, placeholder)\n\t\t\t\t\tc.emit(OpPop)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t\tc.emit(OpGetCount)\n\t\tif node.Threshold != nil {\n\t\t\tend := c.emit(OpJump, placeholder)\n\t\t\tc.patchJump(loopBreak)\n\t\t\t// Early exit path: pop the bool comparison result, push count\n\t\t\tc.emit(OpPop)\n\t\t\tc.emit(OpGetCount)\n\t\t\tc.patchJump(end)\n\t\t}\n\t\tc.emit(OpEnd)\n\t\treturn\n\n\tcase \"sum\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tc.emit(OpInt, 0)\n\t\tc.emit(OpSetAcc)\n\t\tc.emitLoop(func() {\n\t\t\tif len(node.Arguments) == 2 {\n\t\t\t\tc.compile(node.Arguments[1])\n\t\t\t} else {\n\t\t\t\tc.emit(OpPointer)\n\t\t\t}\n\t\t\tc.emit(OpGetAcc)\n\t\t\tc.emit(OpAdd)\n\t\t\tc.emit(OpSetAcc)\n\t\t})\n\t\tc.emit(OpGetAcc)\n\t\tc.emit(OpEnd)\n\t\treturn\n\n\tcase \"find\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tvar loopBreak int\n\t\tc.emitLoop(func() {\n\t\t\tc.compile(node.Arguments[1])\n\t\t\tnoop := c.emit(OpJumpIfFalse, placeholder)\n\t\t\tc.emit(OpPop)\n\t\t\tif node.Map != nil {\n\t\t\t\tc.compile(node.Map)\n\t\t\t} else {\n\t\t\t\tc.emit(OpPointer)\n\t\t\t}\n\t\t\tloopBreak = c.emit(OpJump, placeholder)\n\t\t\tc.patchJump(noop)\n\t\t\tc.emit(OpPop)\n\t\t})\n\t\tif node.Throws {\n\t\t\tc.emit(OpPush, c.addConstant(fmt.Errorf(\"reflect: slice index out of range\")))\n\t\t\tc.emit(OpThrow)\n\t\t} else {\n\t\t\tc.emit(OpNil)\n\t\t}\n\t\tc.patchJump(loopBreak)\n\t\tc.emit(OpEnd)\n\t\treturn\n\n\tcase \"findIndex\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tvar loopBreak int\n\t\tc.emitLoop(func() {\n\t\t\tc.compile(node.Arguments[1])\n\t\t\tnoop := c.emit(OpJumpIfFalse, placeholder)\n\t\t\tc.emit(OpPop)\n\t\t\tc.emit(OpGetIndex)\n\t\t\tloopBreak = c.emit(OpJump, placeholder)\n\t\t\tc.patchJump(noop)\n\t\t\tc.emit(OpPop)\n\t\t})\n\t\tc.emit(OpNil)\n\t\tc.patchJump(loopBreak)\n\t\tc.emit(OpEnd)\n\t\treturn\n\n\tcase \"findLast\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tvar loopBreak int\n\t\tc.emitLoopBackwards(func() {\n\t\t\tc.compile(node.Arguments[1])\n\t\t\tnoop := c.emit(OpJumpIfFalse, placeholder)\n\t\t\tc.emit(OpPop)\n\t\t\tif node.Map != nil {\n\t\t\t\tc.compile(node.Map)\n\t\t\t} else {\n\t\t\t\tc.emit(OpPointer)\n\t\t\t}\n\t\t\tloopBreak = c.emit(OpJump, placeholder)\n\t\t\tc.patchJump(noop)\n\t\t\tc.emit(OpPop)\n\t\t})\n\t\tif node.Throws {\n\t\t\tc.emit(OpPush, c.addConstant(fmt.Errorf(\"reflect: slice index out of range\")))\n\t\t\tc.emit(OpThrow)\n\t\t} else {\n\t\t\tc.emit(OpNil)\n\t\t}\n\t\tc.patchJump(loopBreak)\n\t\tc.emit(OpEnd)\n\t\treturn\n\n\tcase \"findLastIndex\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tvar loopBreak int\n\t\tc.emitLoopBackwards(func() {\n\t\t\tc.compile(node.Arguments[1])\n\t\t\tnoop := c.emit(OpJumpIfFalse, placeholder)\n\t\t\tc.emit(OpPop)\n\t\t\tc.emit(OpGetIndex)\n\t\t\tloopBreak = c.emit(OpJump, placeholder)\n\t\t\tc.patchJump(noop)\n\t\t\tc.emit(OpPop)\n\t\t})\n\t\tc.emit(OpNil)\n\t\tc.patchJump(loopBreak)\n\t\tc.emit(OpEnd)\n\t\treturn\n\n\tcase \"groupBy\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tc.emit(OpCreate, 1)\n\t\tc.emit(OpSetAcc)\n\t\tc.emitLoop(func() {\n\t\t\tc.compile(node.Arguments[1])\n\t\t\tc.emit(OpGroupBy)\n\t\t})\n\t\tc.emit(OpGetAcc)\n\t\tc.emit(OpEnd)\n\t\treturn\n\n\tcase \"sortBy\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tif len(node.Arguments) == 3 {\n\t\t\tc.compile(node.Arguments[2])\n\t\t} else {\n\t\t\tc.emit(OpPush, c.addConstant(\"asc\"))\n\t\t}\n\t\tc.emit(OpCreate, 2)\n\t\tc.emit(OpSetAcc)\n\t\tc.emitLoop(func() {\n\t\t\tc.compile(node.Arguments[1])\n\t\t\tc.emit(OpSortBy)\n\t\t})\n\t\tc.emit(OpSort)\n\t\tc.emit(OpEnd)\n\t\treturn\n\n\tcase \"reduce\":\n\t\tc.compile(node.Arguments[0])\n\t\tc.derefInNeeded(node.Arguments[0])\n\t\tc.emit(OpBegin)\n\t\tif len(node.Arguments) == 3 {\n\t\t\tc.compile(node.Arguments[2])\n\t\t\tc.derefInNeeded(node.Arguments[2])\n\t\t\tc.emit(OpSetAcc)\n\t\t} else {\n\t\t\t// When no initial value is provided, we use the first element as the\n\t\t\t// accumulator. But first we must check if the array is empty to avoid\n\t\t\t// an index out of range panic.\n\t\t\tempty := c.emit(OpJumpIfEnd, placeholder)\n\t\t\tc.emit(OpPointer)\n\t\t\tc.emit(OpIncrementIndex)\n\t\t\tc.emit(OpSetAcc)\n\t\t\tjumpPastError := c.emit(OpJump, placeholder)\n\t\t\tc.patchJump(empty)\n\t\t\tc.emit(OpPush, c.addConstant(fmt.Errorf(\"reduce of empty array with no initial value\")))\n\t\t\tc.emit(OpThrow)\n\t\t\tc.patchJump(jumpPastError)\n\t\t}\n\t\tc.emitLoop(func() {\n\t\t\tc.compile(node.Arguments[1])\n\t\t\tc.emit(OpSetAcc)\n\t\t})\n\t\tc.emit(OpGetAcc)\n\t\tc.emit(OpEnd)\n\t\treturn\n\n\t}\n\n\tif id, ok := builtin.Index[node.Name]; ok {\n\t\tf := builtin.Builtins[id]\n\t\tfor i, arg := range node.Arguments {\n\t\t\tc.compile(arg)\n\t\t\targType := arg.Type()\n\t\t\tif argType.Kind() == reflect.Ptr || arg.Nature().IsUnknown(c.ntCache) {\n\t\t\t\tif f.Deref == nil {\n\t\t\t\t\t// By default, builtins expect arguments to be dereferenced.\n\t\t\t\t\tc.emit(OpDeref)\n\t\t\t\t} else {\n\t\t\t\t\tif f.Deref(i, argType) {\n\t\t\t\t\t\tc.emit(OpDeref)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif f.Fast != nil {\n\t\t\tc.emit(OpCallBuiltin1, id)\n\t\t} else if f.Safe != nil {\n\t\t\tid := c.addConstant(f.Safe)\n\t\t\tc.emit(OpPush, id)\n\t\t\tc.debugInfo[fmt.Sprintf(\"const_%d\", id)] = node.Name\n\t\t\tc.emit(OpCallSafe, len(node.Arguments))\n\t\t} else if f.Func != nil {\n\t\t\tc.emitFunction(f, len(node.Arguments))\n\t\t}\n\t\treturn\n\t}\n\n\tpanic(fmt.Sprintf(\"unknown builtin %v\", node.Name))\n}\n\nfunc (c *compiler) emitCond(body func()) {\n\tnoop := c.emit(OpJumpIfFalse, placeholder)\n\tc.emit(OpPop)\n\n\tbody()\n\n\tjmp := c.emit(OpJump, placeholder)\n\tc.patchJump(noop)\n\tc.emit(OpPop)\n\tc.patchJump(jmp)\n}\n\nfunc (c *compiler) emitLoop(body func()) {\n\tbegin := len(c.bytecode)\n\tend := c.emit(OpJumpIfEnd, placeholder)\n\n\tbody()\n\n\tc.emit(OpIncrementIndex)\n\tc.emit(OpJumpBackward, c.calcBackwardJump(begin))\n\tc.patchJump(end)\n}\n\nfunc (c *compiler) emitLoopBackwards(body func()) {\n\tc.emit(OpGetLen)\n\tc.emit(OpInt, 1)\n\tc.emit(OpSubtract)\n\tc.emit(OpSetIndex)\n\tbegin := len(c.bytecode)\n\tc.emit(OpGetIndex)\n\tc.emit(OpInt, 0)\n\tc.emit(OpMoreOrEqual)\n\tend := c.emit(OpJumpIfFalse, placeholder)\n\n\tbody()\n\n\tc.emit(OpDecrementIndex)\n\tc.emit(OpJumpBackward, c.calcBackwardJump(begin))\n\tc.patchJump(end)\n}\n\nfunc (c *compiler) PredicateNode(node *ast.PredicateNode) {\n\tc.compile(node.Node)\n}\n\nfunc (c *compiler) PointerNode(node *ast.PointerNode) {\n\tswitch node.Name {\n\tcase \"index\":\n\t\tc.emit(OpGetIndex)\n\tcase \"acc\":\n\t\tc.emit(OpGetAcc)\n\tcase \"\":\n\t\tc.emit(OpPointer)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"unknown pointer %v\", node.Name))\n\t}\n}\n\nfunc (c *compiler) VariableDeclaratorNode(node *ast.VariableDeclaratorNode) {\n\tc.compile(node.Value)\n\tindex := c.addVariable(node.Name)\n\tc.emit(OpStore, index)\n\tc.beginScope(node.Name, index)\n\tc.compile(node.Expr)\n\tc.endScope()\n}\n\nfunc (c *compiler) SequenceNode(node *ast.SequenceNode) {\n\tfor i, n := range node.Nodes {\n\t\tc.compile(n)\n\t\tif i < len(node.Nodes)-1 {\n\t\t\tc.emit(OpPop)\n\t\t}\n\t}\n}\n\nfunc (c *compiler) beginScope(name string, index int) {\n\tc.scopes = append(c.scopes, scope{name, index})\n}\n\nfunc (c *compiler) endScope() {\n\tc.scopes = c.scopes[:len(c.scopes)-1]\n}\n\nfunc (c *compiler) lookupVariable(name string) (int, bool) {\n\tfor i := len(c.scopes) - 1; i >= 0; i-- {\n\t\tif c.scopes[i].variableName == name {\n\t\t\treturn c.scopes[i].index, true\n\t\t}\n\t}\n\treturn 0, false\n}\n\nfunc (c *compiler) ConditionalNode(node *ast.ConditionalNode) {\n\tc.compile(node.Cond)\n\tc.derefInNeeded(node.Cond)\n\totherwise := c.emit(OpJumpIfFalse, placeholder)\n\n\tc.emit(OpPop)\n\tc.compile(node.Exp1)\n\tend := c.emit(OpJump, placeholder)\n\n\tc.patchJump(otherwise)\n\tc.emit(OpPop)\n\tc.compile(node.Exp2)\n\n\tc.patchJump(end)\n}\n\nfunc (c *compiler) ArrayNode(node *ast.ArrayNode) {\n\tfor _, node := range node.Nodes {\n\t\tc.compile(node)\n\t}\n\n\tc.emitPush(len(node.Nodes))\n\tc.emit(OpArray)\n}\n\nfunc (c *compiler) MapNode(node *ast.MapNode) {\n\tfor _, pair := range node.Pairs {\n\t\tc.compile(pair)\n\t}\n\n\tc.emitPush(len(node.Pairs))\n\tc.emit(OpMap)\n}\n\nfunc (c *compiler) PairNode(node *ast.PairNode) {\n\tc.compile(node.Key)\n\tc.compile(node.Value)\n}\n\nfunc (c *compiler) derefInNeeded(node ast.Node) {\n\tif node.Nature().Nil {\n\t\treturn\n\t}\n\tswitch node.Type().Kind() {\n\tcase reflect.Ptr, reflect.Interface:\n\t\tc.emit(OpDeref)\n\t}\n}\n\nfunc (c *compiler) derefParam(in reflect.Type, param ast.Node) {\n\tif param.Nature().Nil {\n\t\treturn\n\t}\n\tif param.Type().AssignableTo(in) {\n\t\treturn\n\t}\n\tif in.Kind() != reflect.Ptr && param.Type().Kind() == reflect.Ptr {\n\t\tc.emit(OpDeref)\n\t}\n}\n\nfunc (c *compiler) optimize() {\n\tfor i, op := range c.bytecode {\n\t\tswitch op {\n\t\tcase OpJumpIfTrue, OpJumpIfFalse, OpJumpIfNil, OpJumpIfNotNil:\n\t\t\ttarget := i + c.arguments[i] + 1\n\t\t\tfor target < len(c.bytecode) && c.bytecode[target] == op {\n\t\t\t\ttarget += c.arguments[target] + 1\n\t\t\t}\n\t\t\tc.arguments[i] = target - i - 1\n\t\t}\n\t}\n}\n\nfunc kind(t reflect.Type) reflect.Kind {\n\tif t == nil {\n\t\treturn reflect.Invalid\n\t}\n\treturn t.Kind()\n}\n"
  },
  {
    "path": "compiler/compiler_test.go",
    "content": "package compiler_test\n\nimport (\n\t\"math\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/test/mock\"\n\t\"github.com/expr-lang/expr/test/playground\"\n\t\"github.com/expr-lang/expr/vm\"\n\t\"github.com/expr-lang/expr/vm/runtime\"\n)\n\ntype B struct {\n\t_ byte\n\t_ byte\n\tC struct {\n\t\t_ byte\n\t\t_ byte\n\t\t_ byte\n\t\tD int\n\t}\n}\n\nfunc (B) FuncInB() int {\n\treturn 0\n}\n\ntype Env struct {\n\tA struct {\n\t\t_   byte\n\t\tB   B\n\t\tMap map[string]B\n\t\tPtr *int\n\t}\n}\n\n// AFunc is a method what goes before Func in the alphabet.\nfunc (e Env) AFunc() int {\n\treturn 0\n}\n\nfunc (e Env) Func() B {\n\treturn B{}\n}\n\nfunc TestCompile(t *testing.T) {\n\tvar tests = []struct {\n\t\tcode string\n\t\twant vm.Program\n\t}{\n\t\t{\n\t\t\t`65535`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\tmath.MaxUint16,\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`.5`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t.5,\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`true`,\n\t\t\tvm.Program{\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpTrue,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`\"string\"`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t\"string\",\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`\"string\" == \"string\"`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t\"string\",\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t\tvm.OpEqualString,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 0, 0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`1000000 == 1000000`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\tint64(1000000),\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t\tvm.OpEqualInt,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 0, 0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`-1`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{1},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t\tvm.OpNegate,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`true && true || true`,\n\t\t\tvm.Program{\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpTrue,\n\t\t\t\t\tvm.OpJumpIfFalse,\n\t\t\t\t\tvm.OpPop,\n\t\t\t\t\tvm.OpTrue,\n\t\t\t\t\tvm.OpJumpIfTrue,\n\t\t\t\t\tvm.OpPop,\n\t\t\t\t\tvm.OpTrue,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 2, 0, 0, 2, 0, 0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`true && (true || true)`,\n\t\t\tvm.Program{\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpTrue,\n\t\t\t\t\tvm.OpJumpIfFalse,\n\t\t\t\t\tvm.OpPop,\n\t\t\t\t\tvm.OpTrue,\n\t\t\t\t\tvm.OpJumpIfTrue,\n\t\t\t\t\tvm.OpPop,\n\t\t\t\t\tvm.OpTrue,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 5, 0, 0, 2, 0, 0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`A.B.C.D`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t&runtime.Field{\n\t\t\t\t\t\tIndex: []int{0, 1, 2, 3},\n\t\t\t\t\t\tPath:  []string{\"A\", \"B\", \"C\", \"D\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpLoadField,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`A?.B.C.D`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t&runtime.Field{\n\t\t\t\t\t\tIndex: []int{0},\n\t\t\t\t\t\tPath:  []string{\"A\"},\n\t\t\t\t\t},\n\t\t\t\t\t&runtime.Field{\n\t\t\t\t\t\tIndex: []int{1, 2, 3},\n\t\t\t\t\t\tPath:  []string{\"B\", \"C\", \"D\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpLoadField,\n\t\t\t\t\tvm.OpJumpIfNil,\n\t\t\t\t\tvm.OpFetchField,\n\t\t\t\t\tvm.OpJumpIfNotNil,\n\t\t\t\t\tvm.OpPop,\n\t\t\t\t\tvm.OpNil,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 1, 1, 2, 0, 0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`A.B?.C.D`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t&runtime.Field{\n\t\t\t\t\t\tIndex: []int{0, 1},\n\t\t\t\t\t\tPath:  []string{\"A\", \"B\"},\n\t\t\t\t\t},\n\t\t\t\t\t&runtime.Field{\n\t\t\t\t\t\tIndex: []int{2, 3},\n\t\t\t\t\t\tPath:  []string{\"C\", \"D\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpLoadField,\n\t\t\t\t\tvm.OpJumpIfNil,\n\t\t\t\t\tvm.OpFetchField,\n\t\t\t\t\tvm.OpJumpIfNotNil,\n\t\t\t\t\tvm.OpPop,\n\t\t\t\t\tvm.OpNil,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 1, 1, 2, 0, 0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`A?.B`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t&runtime.Field{\n\t\t\t\t\t\tIndex: []int{0},\n\t\t\t\t\t\tPath:  []string{\"A\"},\n\t\t\t\t\t},\n\t\t\t\t\t&runtime.Field{\n\t\t\t\t\t\tIndex: []int{1},\n\t\t\t\t\t\tPath:  []string{\"B\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpLoadField,\n\t\t\t\t\tvm.OpJumpIfNil,\n\t\t\t\t\tvm.OpFetchField,\n\t\t\t\t\tvm.OpJumpIfNotNil,\n\t\t\t\t\tvm.OpPop,\n\t\t\t\t\tvm.OpNil,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 1, 1, 2, 0, 0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`A?.B ?? 42`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t&runtime.Field{\n\t\t\t\t\t\tIndex: []int{0},\n\t\t\t\t\t\tPath:  []string{\"A\"},\n\t\t\t\t\t},\n\t\t\t\t\t&runtime.Field{\n\t\t\t\t\t\tIndex: []int{1},\n\t\t\t\t\t\tPath:  []string{\"B\"},\n\t\t\t\t\t},\n\t\t\t\t\t42,\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpLoadField,\n\t\t\t\t\tvm.OpJumpIfNil,\n\t\t\t\t\tvm.OpFetchField,\n\t\t\t\t\tvm.OpJumpIfNotNil,\n\t\t\t\t\tvm.OpPop,\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 1, 1, 2, 0, 2},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`A.Map[\"B\"].C.D`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t&runtime.Field{\n\t\t\t\t\t\tIndex: []int{0, 2},\n\t\t\t\t\t\tPath:  []string{\"A\", \"Map\"},\n\t\t\t\t\t},\n\t\t\t\t\t\"B\",\n\t\t\t\t\t&runtime.Field{\n\t\t\t\t\t\tIndex: []int{2, 3},\n\t\t\t\t\t\tPath:  []string{\"C\", \"D\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpLoadField,\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t\tvm.OpFetch,\n\t\t\t\t\tvm.OpFetchField,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 1, 0, 2},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`A ?? 1`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t&runtime.Field{\n\t\t\t\t\t\tIndex: []int{0},\n\t\t\t\t\t\tPath:  []string{\"A\"},\n\t\t\t\t\t},\n\t\t\t\t\t1,\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpLoadField,\n\t\t\t\t\tvm.OpJumpIfNotNil,\n\t\t\t\t\tvm.OpPop,\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 2, 0, 1},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`A.Ptr + 1`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t&runtime.Field{\n\t\t\t\t\t\tIndex: []int{0, 3},\n\t\t\t\t\t\tPath:  []string{\"A\", \"Ptr\"},\n\t\t\t\t\t},\n\t\t\t\t\t1,\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpLoadField,\n\t\t\t\t\tvm.OpDeref,\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t\tvm.OpAdd,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 0, 1, 0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`Func()`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t&runtime.Method{\n\t\t\t\t\t\tIndex: 1,\n\t\t\t\t\t\tName:  \"Func\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpLoadMethod,\n\t\t\t\t\tvm.OpCall,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`Func().FuncInB()`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t&runtime.Method{\n\t\t\t\t\t\tIndex: 1,\n\t\t\t\t\t\tName:  \"Func\",\n\t\t\t\t\t},\n\t\t\t\t\t&runtime.Method{\n\t\t\t\t\t\tIndex: 0,\n\t\t\t\t\t\tName:  \"FuncInB\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpLoadMethod,\n\t\t\t\t\tvm.OpCall,\n\t\t\t\t\tvm.OpMethod,\n\t\t\t\t\tvm.OpCallTyped,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 0, 1, 12},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`1; 2; 3`,\n\t\t\tvm.Program{\n\t\t\t\tConstants: []any{\n\t\t\t\t\t1,\n\t\t\t\t\t2,\n\t\t\t\t\t3,\n\t\t\t\t},\n\t\t\t\tBytecode: []vm.Opcode{\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t\tvm.OpPop,\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t\tvm.OpPop,\n\t\t\t\t\tvm.OpPush,\n\t\t\t\t},\n\t\t\t\tArguments: []int{0, 0, 1, 0, 2},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.code, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(test.code, expr.Env(Env{}), expr.Optimize(false))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tassert.Equal(t, test.want.Disassemble(), program.Disassemble())\n\t\t})\n\t}\n}\n\nfunc TestCompile_panic(t *testing.T) {\n\ttests := []string{\n\t\t`(TotalPosts.Profile[Authors > TotalPosts == get(nil, TotalLikes)] > Authors) ^ (TotalLikes / (Posts?.PublishDate[TotalPosts] < Posts))`,\n\t\t`one(Posts, nil)`,\n\t\t`trim(TotalViews, Posts) <= get(Authors, nil)`,\n\t\t`Authors.IsZero(nil * Authors) - (TotalViews && Posts ? nil : nil)[TotalViews.IsZero(false, \" \").IsZero(Authors)]`,\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test, func(t *testing.T) {\n\t\t\t_, err := expr.Compile(test, expr.Env(playground.Blog{}))\n\t\t\trequire.Error(t, err)\n\t\t})\n\t}\n}\n\nfunc TestCompile_FuncTypes(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"fn\": func([]any, string) string {\n\t\t\treturn \"foo\"\n\t\t},\n\t}\n\tprogram, err := expr.Compile(\"fn([1, 2], 'bar')\", expr.Env(env))\n\trequire.NoError(t, err)\n\trequire.Equal(t, vm.OpCallTyped, program.Bytecode[3])\n\trequire.Equal(t, 32, program.Arguments[3])\n}\n\nfunc TestCompile_FuncTypes_with_Method(t *testing.T) {\n\tenv := mock.Env{}\n\tprogram, err := expr.Compile(\"FuncTyped('bar')\", expr.Env(env))\n\trequire.NoError(t, err)\n\trequire.Equal(t, vm.OpCallTyped, program.Bytecode[2])\n\trequire.Equal(t, 76, program.Arguments[2])\n}\n\nfunc TestCompile_FuncTypes_excludes_named_functions(t *testing.T) {\n\tenv := mock.Env{}\n\tprogram, err := expr.Compile(\"FuncNamed('bar')\", expr.Env(env))\n\trequire.NoError(t, err)\n\trequire.Equal(t, vm.OpCall, program.Bytecode[2])\n\trequire.Equal(t, 1, program.Arguments[2])\n}\n\nfunc TestCompile_OpCallFast(t *testing.T) {\n\tenv := mock.Env{}\n\tprogram, err := expr.Compile(\"Fast(3, 2, 1)\", expr.Env(env))\n\trequire.NoError(t, err)\n\trequire.Equal(t, vm.OpCallFast, program.Bytecode[4])\n\trequire.Equal(t, 3, program.Arguments[4])\n}\n\nfunc TestCompile_optimizes_jumps(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"a\":   true,\n\t\t\"b\":   true,\n\t\t\"c\":   true,\n\t\t\"d\":   true,\n\t\t\"i64\": int64(1),\n\t}\n\ttests := []struct {\n\t\tcode string\n\t\twant string\n\t}{\n\t\t{\n\t\t\t`let foo = true; let bar = false; let baz = true; foo || bar || baz`,\n\t\t\t`0   OpTrue\n1   OpStore  <0>  foo\n2   OpFalse\n3   OpStore  <1>  bar\n4   OpTrue\n5   OpStore       <2>  baz\n6   OpLoadVar     <0>  foo\n7   OpJumpIfTrue  <5>  (13)\n8   OpPop\n9   OpLoadVar     <1>  bar\n10  OpJumpIfTrue  <2>  (13)\n11  OpPop\n12  OpLoadVar  <2>  baz\n`,\n\t\t},\n\t\t{\n\t\t\t`a && b && c`,\n\t\t\t`0  OpLoadFast     <0>  a\n1  OpJumpIfFalse  <5>  (7)\n2  OpPop\n3  OpLoadFast     <1>  b\n4  OpJumpIfFalse  <2>  (7)\n5  OpPop\n6  OpLoadFast  <2>  c\n`,\n\t\t},\n\t\t{\n\t\t\t`a && b || c && d`,\n\t\t\t`0  OpLoadFast     <0>  a\n1  OpJumpIfFalse  <2>  (4)\n2  OpPop\n3  OpLoadFast    <1>  b\n4  OpJumpIfTrue  <5>  (10)\n5  OpPop\n6  OpLoadFast     <2>  c\n7  OpJumpIfFalse  <2>  (10)\n8  OpPop\n9  OpLoadFast  <3>  d\n`,\n\t\t},\n\t\t{\n\t\t\t`filter([1, 2, 3, 4, 5], # > 3 && # != 4 && # != 5)`,\n\t\t\t`0   OpPush  <0>  [1 2 3 4 5]\n1   OpBegin\n2   OpJumpIfEnd  <23>  (26)\n3   OpPointer\n4   OpPush  <1>  3\n5   OpMore\n6   OpJumpIfFalse  <16>  (23)\n7   OpPop\n8   OpPointer\n9   OpPush  <2>  4\n10  OpEqualInt\n11  OpNot\n12  OpJumpIfFalse  <10>  (23)\n13  OpPop\n14  OpPointer\n15  OpPush  <3>  5\n16  OpEqualInt\n17  OpNot\n18  OpJumpIfFalse  <4>  (23)\n19  OpPop\n20  OpIncrementCount\n21  OpPointer\n22  OpJump  <1>  (24)\n23  OpPop\n24  OpIncrementIndex\n25  OpJumpBackward  <24>  (2)\n26  OpGetCount\n27  OpEnd\n28  OpArray\n`,\n\t\t},\n\t\t{\n\t\t\t`let foo = true; let bar = false; let baz = true; foo && bar || baz`,\n\t\t\t`0   OpTrue\n1   OpStore  <0>  foo\n2   OpFalse\n3   OpStore  <1>  bar\n4   OpTrue\n5   OpStore        <2>  baz\n6   OpLoadVar      <0>  foo\n7   OpJumpIfFalse  <2>  (10)\n8   OpPop\n9   OpLoadVar     <1>  bar\n10  OpJumpIfTrue  <2>  (13)\n11  OpPop\n12  OpLoadVar  <2>  baz\n`,\n\t\t},\n\t\t{\n\t\t\t`true ?? nil ?? nil ?? nil`,\n\t\t\t`0  OpTrue\n1  OpJumpIfNotNil  <8>  (10)\n2  OpPop\n3  OpNil\n4  OpJumpIfNotNil  <5>  (10)\n5  OpPop\n6  OpNil\n7  OpJumpIfNotNil  <2>  (10)\n8  OpPop\n9  OpNil\n`,\n\t\t},\n\t\t{\n\t\t\t`let m = {\"a\": {\"b\": {\"c\": 1}}}; m?.a?.b?.c`,\n\t\t\t`0   OpPush  <0>  a\n1   OpPush  <1>  b\n2   OpPush  <2>  c\n3   OpPush  <3>  1\n4   OpPush  <3>  1\n5   OpMap\n6   OpPush  <3>  1\n7   OpMap\n8   OpPush  <3>  1\n9   OpMap\n10  OpStore      <0>  m\n11  OpLoadVar    <0>  m\n12  OpJumpIfNil  <8>  (21)\n13  OpPush       <0>  a\n14  OpFetch\n15  OpJumpIfNil  <5>  (21)\n16  OpPush       <1>  b\n17  OpFetch\n18  OpJumpIfNil  <2>  (21)\n19  OpPush       <2>  c\n20  OpFetch\n21  OpJumpIfNotNil  <2>  (24)\n22  OpPop\n23  OpNil\n`,\n\t\t},\n\t\t{\n\t\t\t`-1 not in [1, 2, 5]`,\n\t\t\t`0  OpPush  <0>  -1\n1  OpPush  <1>  map[1:{} 2:{} 5:{}]\n2  OpIn\n3  OpNot\n`,\n\t\t},\n\t\t{\n\t\t\t`1 + 8 not in [1, 2, 5]`,\n\t\t\t`0  OpPush  <0>  9\n1  OpPush  <1>  map[1:{} 2:{} 5:{}]\n2  OpIn\n3  OpNot\n`,\n\t\t},\n\t\t{\n\t\t\t`true ? false : 8 not in [1, 2, 5]`,\n\t\t\t`0  OpTrue\n1  OpJumpIfFalse  <3>  (5)\n2  OpPop\n3  OpFalse\n4  OpJump  <5>  (10)\n5  OpPop\n6  OpPush  <0>  8\n7  OpPush  <1>  map[1:{} 2:{} 5:{}]\n8  OpIn\n9  OpNot\n`,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.code, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(test.code, expr.Env(env))\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.Equal(t, test.want, program.Disassemble())\n\t\t})\n\t}\n}\n\nfunc TestCompile_IntegerArgsFunc(t *testing.T) {\n\tenv := mock.Env{}\n\ttests := []struct{ code string }{\n\t\t{\"FuncInt(0)\"},\n\t\t{\"FuncInt8(0)\"},\n\t\t{\"FuncInt16(0)\"},\n\t\t{\"FuncInt32(0)\"},\n\t\t{\"FuncInt64(0)\"},\n\t\t{\"FuncUint(0)\"},\n\t\t{\"FuncUint8(0)\"},\n\t\t{\"FuncUint16(0)\"},\n\t\t{\"FuncUint32(0)\"},\n\t\t{\"FuncUint64(0)\"},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\t_, err := expr.Compile(tt.code, expr.Env(env))\n\t\t\trequire.NoError(t, err)\n\t\t})\n\t}\n}\n\nfunc TestCompile_call_on_nil(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"foo\": nil,\n\t}\n\t_, err := expr.Compile(`foo()`, expr.Env(env))\n\trequire.Error(t, err)\n\trequire.Contains(t, err.Error(), \"foo is nil; cannot call nil as function\")\n}\n\nfunc TestCompile_Expect(t *testing.T) {\n\ttests := []struct {\n\t\tinput  string\n\t\toption expr.Option\n\t\top     vm.Opcode\n\t\targ    int\n\t}{\n\t\t{\n\t\t\tinput:  \"1\",\n\t\t\toption: expr.AsKind(reflect.Int),\n\t\t\top:     vm.OpCast,\n\t\t\targ:    0,\n\t\t},\n\t\t{\n\t\t\tinput:  \"1\",\n\t\t\toption: expr.AsInt64(),\n\t\t\top:     vm.OpCast,\n\t\t\targ:    1,\n\t\t},\n\t\t{\n\t\t\tinput:  \"1\",\n\t\t\toption: expr.AsFloat64(),\n\t\t\top:     vm.OpCast,\n\t\t\targ:    2,\n\t\t},\n\t\t{\n\t\t\tinput:  \"true\",\n\t\t\toption: expr.AsBool(),\n\t\t\top:     vm.OpCast,\n\t\t\targ:    3,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.input, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.input, tt.option)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tlastOp := program.Bytecode[len(program.Bytecode)-1]\n\t\t\tlastArg := program.Arguments[len(program.Arguments)-1]\n\n\t\t\tassert.Equal(t, tt.op, lastOp)\n\t\t\tassert.Equal(t, tt.arg, lastArg)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "conf/config.go",
    "content": "package conf\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/builtin\"\n\t\"github.com/expr-lang/expr/checker/nature\"\n\t\"github.com/expr-lang/expr/vm/runtime\"\n)\n\nvar (\n\t// DefaultMemoryBudget represents default maximum allowed memory usage by the vm.VM.\n\tDefaultMemoryBudget uint = 1e6\n\n\t// DefaultMaxNodes represents default maximum allowed AST nodes by the compiler.\n\tDefaultMaxNodes uint = 1e4\n)\n\ntype FunctionsTable map[string]*builtin.Function\n\ntype Config struct {\n\tEnvObject    any\n\tEnv          nature.Nature\n\tExpect       reflect.Kind\n\tExpectAny    bool\n\tOptimize     bool\n\tStrict       bool\n\tShortCircuit bool\n\tProfile      bool\n\tMaxNodes     uint\n\tConstFns     map[string]reflect.Value\n\tVisitors     []ast.Visitor\n\tFunctions    FunctionsTable\n\tBuiltins     FunctionsTable\n\tDisabled     map[string]bool // disabled builtins\n\tNtCache      nature.Cache\n\t// DisableIfOperator disables the built-in `if ... { } else { }` operator syntax\n\t// so that users can use a custom function named `if(...)` without conflicts.\n\t// When enabled, the lexer treats `if`/`else` as identifiers and the parser\n\t// will not parse `if` statements.\n\tDisableIfOperator bool\n}\n\n// CreateNew creates new config with default values.\nfunc CreateNew() *Config {\n\tc := &Config{\n\t\tOptimize:     true,\n\t\tShortCircuit: true,\n\t\tMaxNodes:     DefaultMaxNodes,\n\t\tConstFns:     make(map[string]reflect.Value),\n\t\tFunctions:    make(map[string]*builtin.Function),\n\t\tBuiltins:     make(map[string]*builtin.Function),\n\t\tDisabled:     make(map[string]bool),\n\t}\n\tfor _, f := range builtin.Builtins {\n\t\tc.Builtins[f.Name] = f\n\t}\n\treturn c\n}\n\n// New creates new config with environment.\nfunc New(env any) *Config {\n\tc := CreateNew()\n\tc.WithEnv(env)\n\treturn c\n}\n\nfunc (c *Config) WithEnv(env any) {\n\tc.EnvObject = env\n\tc.Env = EnvWithCache(&c.NtCache, env)\n\tc.Strict = c.Env.Strict\n}\n\nfunc (c *Config) ConstExpr(name string) {\n\tif c.EnvObject == nil {\n\t\tpanic(\"no environment is specified for ConstExpr()\")\n\t}\n\tfn := reflect.ValueOf(runtime.Fetch(c.EnvObject, name))\n\tif fn.Kind() != reflect.Func {\n\t\tpanic(fmt.Errorf(\"const expression %q must be a function\", name))\n\t}\n\tc.ConstFns[name] = fn\n}\n\ntype Checker interface {\n\tCheck()\n}\n\nfunc (c *Config) Check() {\n\tfor _, v := range c.Visitors {\n\t\tif c, ok := v.(Checker); ok {\n\t\t\tc.Check()\n\t\t}\n\t}\n}\n\nfunc (c *Config) IsOverridden(name string) bool {\n\tif _, ok := c.Functions[name]; ok {\n\t\treturn true\n\t}\n\tif _, ok := c.Env.Get(&c.NtCache, name); ok {\n\t\treturn true\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "conf/env.go",
    "content": "package conf\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\n\t. \"github.com/expr-lang/expr/checker/nature\"\n\t\"github.com/expr-lang/expr/internal/deref\"\n\t\"github.com/expr-lang/expr/types\"\n)\n\n// Env returns the Nature of the given environment.\n//\n// Deprecated: use EnvWithCache instead.\nfunc Env(env any) Nature {\n\treturn EnvWithCache(new(Cache), env)\n}\n\nfunc EnvWithCache(c *Cache, env any) Nature {\n\tif env == nil {\n\t\tn := c.NatureOf(map[string]any{})\n\t\tn.Strict = true\n\t\treturn n\n\t}\n\n\tswitch env := env.(type) {\n\tcase types.Map:\n\t\tnt := env.Nature()\n\t\treturn nt\n\t}\n\n\tv := reflect.ValueOf(env)\n\tt := v.Type()\n\n\tswitch deref.Value(v).Kind() {\n\tcase reflect.Struct:\n\t\tn := c.FromType(t)\n\t\tn.Strict = true\n\t\treturn n\n\n\tcase reflect.Map:\n\t\tn := c.FromType(v.Type())\n\t\tif n.TypeData == nil {\n\t\t\tn.TypeData = new(TypeData)\n\t\t}\n\t\tn.Strict = true\n\t\tn.Fields = make(map[string]Nature, v.Len())\n\n\t\tfor _, key := range v.MapKeys() {\n\t\t\telem := v.MapIndex(key)\n\t\t\tif !elem.IsValid() || !elem.CanInterface() {\n\t\t\t\tpanic(fmt.Sprintf(\"invalid map value: %s\", key))\n\t\t\t}\n\n\t\t\tface := elem.Interface()\n\n\t\t\tswitch face := face.(type) {\n\t\t\tcase types.Map:\n\t\t\t\tnt := face.Nature()\n\t\t\t\tn.Fields[key.String()] = nt\n\n\t\t\tdefault:\n\t\t\t\tif face == nil {\n\t\t\t\t\tn.Fields[key.String()] = c.NatureOf(nil)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tn.Fields[key.String()] = c.NatureOf(face)\n\t\t\t}\n\n\t\t}\n\n\t\treturn n\n\t}\n\n\tpanic(fmt.Sprintf(\"unknown type %T\", env))\n}\n"
  },
  {
    "path": "debug/debugger.go",
    "content": "package debug\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gdamore/tcell/v2\"\n\t\"github.com/rivo/tview\"\n\n\t. \"github.com/expr-lang/expr/vm\"\n)\n\nfunc StartDebugger(program *Program, env any) {\n\tvm := Debug()\n\tapp := tview.NewApplication()\n\ttable := tview.NewTable()\n\tstack := tview.NewTable()\n\tstack.\n\t\tSetBorder(true).\n\t\tSetTitle(\"Stack\")\n\tscope := tview.NewTable()\n\tscope.\n\t\tSetBorder(true).\n\t\tSetTitle(\"Scope\")\n\tsub := tview.NewFlex().\n\t\tSetDirection(tview.FlexRow).\n\t\tAddItem(stack, 0, 3, false).\n\t\tAddItem(scope, 0, 1, false)\n\tflex := tview.NewFlex().\n\t\tAddItem(table, 0, 1, true).\n\t\tAddItem(sub, 0, 1, false)\n\tapp.SetRoot(flex, true)\n\n\tdone := false\n\tgo func() {\n\t\tout, err := vm.Run(program, env)\n\t\tdone = true\n\t\tapp.QueueUpdateDraw(func() {\n\t\t\tsub.RemoveItem(stack)\n\t\t\tsub.RemoveItem(scope)\n\t\t\tresult := tview.NewTextView()\n\t\t\tresult.\n\t\t\t\tSetBorder(true).\n\t\t\t\tSetTitle(\"Output\")\n\t\t\tresult.SetText(fmt.Sprintf(\"%#v\", out))\n\t\t\tsub.AddItem(result, 0, 1, false)\n\t\t\tif err != nil {\n\t\t\t\terrorView := tview.NewTextView()\n\t\t\t\terrorView.\n\t\t\t\t\tSetBorder(true).\n\t\t\t\t\tSetTitle(\"Error\")\n\t\t\t\terrorView.SetText(err.Error())\n\t\t\t\tsub.AddItem(errorView, 0, 1, false)\n\t\t\t}\n\t\t})\n\t}()\n\n\tindex := make(map[int]int)\n\tvar buf strings.Builder\n\tprogram.DisassembleWriter(&buf)\n\n\tfor row, line := range strings.Split(buf.String(), \"\\n\") {\n\t\tif line == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tparts := strings.Split(line, \"\\t\")\n\n\t\tip, err := strconv.Atoi(parts[0])\n\t\tcheck(err)\n\t\tindex[ip] = row\n\t\ttable.SetCellSimple(row, 0, fmt.Sprintf(\"% *d\", 5, ip))\n\n\t\tfor col := 1; col < len(parts); col++ {\n\t\t\ttable.SetCellSimple(row, col, parts[col])\n\t\t}\n\t\tfor col := len(parts); col < 4; col++ {\n\t\t\ttable.SetCellSimple(row, col, \"\")\n\t\t}\n\t\ttable.SetCell(row, 4, tview.NewTableCell(\"\").SetExpansion(1))\n\t}\n\n\tdraw := func(ip int) {\n\t\tapp.QueueUpdateDraw(func() {\n\t\t\tfor row := 0; row < table.GetRowCount(); row++ {\n\t\t\t\tfor col := 0; col < table.GetColumnCount(); col++ {\n\t\t\t\t\ttable.GetCell(row, col).SetBackgroundColor(tcell.ColorBlack)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif row, ok := index[ip]; ok {\n\t\t\t\ttable.Select(row, 0)\n\t\t\t\tfor col := 0; col < 5; col++ {\n\t\t\t\t\ttable.GetCell(row, col).SetBackgroundColor(tcell.ColorMediumBlue)\n\t\t\t\t}\n\t\t\t\ttable.SetOffset(row-10, 0)\n\n\t\t\t\topcode := table.GetCell(row, 1).Text\n\t\t\t\tif strings.HasPrefix(opcode, \"OpJump\") {\n\t\t\t\t\tjump := table.GetCell(row, 3).Text\n\t\t\t\t\tjump = strings.Trim(jump, \"()\")\n\t\t\t\t\tip, err := strconv.Atoi(jump)\n\t\t\t\t\tif err == nil {\n\t\t\t\t\t\tif row, ok := index[ip]; ok {\n\t\t\t\t\t\t\tfor col := 0; col < 5; col++ {\n\t\t\t\t\t\t\t\ttable.GetCell(row, col).SetBackgroundColor(tcell.ColorDimGrey)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstack.Clear()\n\t\t\tfor i, value := range vm.Stack {\n\t\t\t\tstack.SetCellSimple(i, 0, fmt.Sprintf(\"% *d: \", 2, i))\n\t\t\t\tstack.SetCellSimple(i, 1, fmt.Sprintf(\"%#v\", value))\n\t\t\t}\n\t\t\tstack.ScrollToEnd()\n\n\t\t\tscope.Clear()\n\t\t\tvar s *Scope\n\t\t\tif len(vm.Scopes) > 0 {\n\t\t\t\ts = vm.Scopes[len(vm.Scopes)-1]\n\t\t\t}\n\t\t\tif s != nil {\n\t\t\t\ttype pair struct {\n\t\t\t\t\tkey   string\n\t\t\t\t\tvalue any\n\t\t\t\t}\n\t\t\t\tvar keys []pair\n\t\t\t\tkeys = append(keys, pair{\"Array\", s.Array})\n\t\t\t\tkeys = append(keys, pair{\"Index\", s.Index})\n\t\t\t\tkeys = append(keys, pair{\"Len\", s.Len})\n\t\t\t\tkeys = append(keys, pair{\"Count\", s.Count})\n\t\t\t\tif s.Acc != nil {\n\t\t\t\t\tkeys = append(keys, pair{\"Acc\", s.Acc})\n\t\t\t\t}\n\t\t\t\trow := 0\n\t\t\t\tfor _, pair := range keys {\n\t\t\t\t\tscope.SetCellSimple(row, 0, fmt.Sprintf(\"%v: \", pair.key))\n\t\t\t\t\tscope.SetCellSimple(row, 1, fmt.Sprintf(\"%v\", pair.value))\n\t\t\t\t\trow++\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tgetSelectedPosition := func() int {\n\t\trow, _ := table.GetSelection()\n\t\tip, err := strconv.Atoi(strings.TrimSpace(table.GetCell(row, 0).Text))\n\t\tcheck(err)\n\t\treturn ip\n\t}\n\n\tautostep := false\n\tvar breakpoint int\n\n\tgo func() {\n\t\tdraw(0)\n\t\tfor ip := range vm.Position() {\n\t\t\tdraw(ip)\n\n\t\t\tif autostep {\n\t\t\t\tif breakpoint != ip {\n\t\t\t\t\ttime.Sleep(20 * time.Millisecond)\n\t\t\t\t\tif !done {\n\t\t\t\t\t\tvm.Step()\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tautostep = false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}()\n\n\tapp.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {\n\t\tif event.Key() == tcell.KeyDown || event.Key() == tcell.KeyUp {\n\t\t\ttable.SetSelectable(true, false)\n\t\t}\n\t\tif event.Key() == tcell.KeyEnter {\n\t\t\tselectable, _ := table.GetSelectable()\n\t\t\tif selectable {\n\t\t\t\ttable.SetSelectable(false, false)\n\t\t\t\tbreakpoint = getSelectedPosition()\n\t\t\t\tautostep = true\n\t\t\t}\n\t\t\tif !done {\n\t\t\t\tvm.Step()\n\t\t\t}\n\t\t}\n\t\treturn event\n\t})\n\n\terr := app.Run()\n\tcheck(err)\n}\n\nfunc check(err error) {\n\tif err != nil {\n\t\t_, _ = fmt.Fprintf(os.Stderr, \"%v\\n\", err)\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "debug/go.mod",
    "content": "module github.com/expr-lang/expr/debug\n\ngo 1.18\n\nrequire (\n\tgithub.com/expr-lang/expr v0.0.0\n\tgithub.com/gdamore/tcell/v2 v2.6.0\n\tgithub.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703\n)\n\nrequire (\n\tgithub.com/gdamore/encoding v1.0.0 // indirect\n\tgithub.com/lucasb-eyer/go-colorful v1.2.0 // indirect\n\tgithub.com/mattn/go-runewidth v0.0.15 // indirect\n\tgithub.com/rivo/uniseg v0.4.4 // indirect\n\tgolang.org/x/sys v0.11.0 // indirect\n\tgolang.org/x/term v0.11.0 // indirect\n\tgolang.org/x/text v0.12.0 // indirect\n)\n\nreplace github.com/expr-lang/expr => ../\n"
  },
  {
    "path": "debug/go.sum",
    "content": "github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko=\ngithub.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=\ngithub.com/gdamore/tcell/v2 v2.6.0 h1:OKbluoP9VYmJwZwq/iLb4BxwKcwGthaa1YNBJIyCySg=\ngithub.com/gdamore/tcell/v2 v2.6.0/go.mod h1:be9omFATkdr0D9qewWW3d+MEvl5dha+Etb5y65J2H8Y=\ngithub.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=\ngithub.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=\ngithub.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=\ngithub.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=\ngithub.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=\ngithub.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703 h1:ZyM/+FYnpbZsFWuCohniM56kRoHRB4r5EuIzXEYkpxo=\ngithub.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE=\ngithub.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=\ngithub.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=\ngithub.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=\ngithub.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=\ngolang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=\ngolang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=\ngolang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n"
  },
  {
    "path": "docgen/README.md",
    "content": "# DocGen\n\nThis package provides documentation generator with JSON or Markdown output.\n\n## Usage\n\nCreate a file and put next code into it. \n\n```go\npackage main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n  \n\t\"github.com/expr-lang/expr/docgen\"\n)\n\nfunc main() {\n\t// TODO: Replace env with your own types.\n\tdoc := docgen.CreateDoc(env)\n  \n\tbuf, err := json.MarshalIndent(doc, \"\", \"  \")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(string(buf))\n}\n```\n\nRun `go run your_file.go`. Documentation will be printed in JSON format.\n\n## Markdown\n\nTo generate markdown documentation: \n\n```go\npackage main\n\nimport \"github.com/expr-lang/expr/docgen\"\n\nfunc main() {\n\t// TODO: Replace env with your own types.\n\tdoc := docgen.CreateDoc(env)\n\n\tprint(doc.Markdown())\n}\n```\n"
  },
  {
    "path": "docgen/docgen.go",
    "content": "package docgen\n\nimport (\n\t\"reflect\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/expr-lang/expr/checker/nature\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/internal/deref\"\n)\n\n// Kind can be any of array, map, struct, func, string, int, float, bool or any.\ntype Kind string\n\n// Identifier represents variable names and field names.\ntype Identifier string\n\n// TypeName is a name of type in types map.\ntype TypeName string\n\ntype Context struct {\n\tVariables map[Identifier]*Type `json:\"variables\"`\n\tTypes     map[TypeName]*Type   `json:\"types\"`\n\tPkgPath   string\n}\n\ntype Type struct {\n\tName      TypeName             `json:\"name,omitempty\"`\n\tKind      Kind                 `json:\"kind,omitempty\"`\n\tType      *Type                `json:\"type,omitempty\"`\n\tKey       *Type                `json:\"key_type,omitempty\"`\n\tFields    map[Identifier]*Type `json:\"fields,omitempty\"`\n\tArguments []*Type              `json:\"arguments,omitempty\"`\n\tReturn    *Type                `json:\"return,omitempty\"`\n}\n\nvar (\n\tOperators = []string{\"matches\", \"contains\", \"startsWith\", \"endsWith\"}\n\tBuiltins  = map[Identifier]*Type{\n\t\t\"true\":   {Kind: \"bool\"},\n\t\t\"false\":  {Kind: \"bool\"},\n\t\t\"len\":    {Kind: \"func\", Arguments: []*Type{{Kind: \"array\", Type: &Type{Kind: \"any\"}}}, Return: &Type{Kind: \"int\"}},\n\t\t\"all\":    {Kind: \"func\", Arguments: []*Type{{Kind: \"array\", Type: &Type{Kind: \"any\"}}, {Kind: \"func\"}}, Return: &Type{Kind: \"bool\"}},\n\t\t\"none\":   {Kind: \"func\", Arguments: []*Type{{Kind: \"array\", Type: &Type{Kind: \"any\"}}, {Kind: \"func\"}}, Return: &Type{Kind: \"bool\"}},\n\t\t\"any\":    {Kind: \"func\", Arguments: []*Type{{Kind: \"array\", Type: &Type{Kind: \"any\"}}, {Kind: \"func\"}}, Return: &Type{Kind: \"bool\"}},\n\t\t\"one\":    {Kind: \"func\", Arguments: []*Type{{Kind: \"array\", Type: &Type{Kind: \"any\"}}, {Kind: \"func\"}}, Return: &Type{Kind: \"bool\"}},\n\t\t\"filter\": {Kind: \"func\", Arguments: []*Type{{Kind: \"array\", Type: &Type{Kind: \"any\"}}, {Kind: \"func\"}}, Return: &Type{Kind: \"array\", Type: &Type{Kind: \"any\"}}},\n\t\t\"map\":    {Kind: \"func\", Arguments: []*Type{{Kind: \"array\", Type: &Type{Kind: \"any\"}}, {Kind: \"func\"}}, Return: &Type{Kind: \"array\", Type: &Type{Kind: \"any\"}}},\n\t\t\"count\":  {Kind: \"func\", Arguments: []*Type{{Kind: \"array\", Type: &Type{Kind: \"any\"}}, {Kind: \"func\"}}, Return: &Type{Kind: \"int\"}},\n\n\t\t\"trim\":       {Kind: \"func\", Arguments: []*Type{{Name: \"string\", Kind: \"string\"}, {Name: \"cutstr\", Kind: \"string\"}}, Return: &Type{Name: \"string\", Kind: \"string\"}},\n\t\t\"trimPrefix\": {Kind: \"func\", Arguments: []*Type{{Name: \"string\", Kind: \"string\"}, {Name: \"cutstr\", Kind: \"string\"}}, Return: &Type{Name: \"string\", Kind: \"string\"}},\n\t\t\"trimSuffix\": {Kind: \"func\", Arguments: []*Type{{Name: \"string\", Kind: \"string\"}, {Name: \"cutstr\", Kind: \"string\"}}, Return: &Type{Name: \"string\", Kind: \"string\"}},\n\n\t\t\"upper\":  {Kind: \"func\", Arguments: []*Type{{Name: \"string\", Kind: \"string\"}}, Return: &Type{Name: \"string\", Kind: \"string\"}},\n\t\t\"lower\":  {Kind: \"func\", Arguments: []*Type{{Name: \"string\", Kind: \"string\"}}, Return: &Type{Name: \"string\", Kind: \"string\"}},\n\t\t\"repeat\": {Kind: \"func\", Arguments: []*Type{{Name: \"n\", Kind: \"int\"}}, Return: &Type{Name: \"string\", Kind: \"string\"}},\n\n\t\t\"join\":        {Kind: \"func\", Arguments: []*Type{{Kind: \"array\", Type: &Type{Kind: \"any\"}}, {Name: \"glue\", Kind: \"string\"}}, Return: &Type{Name: \"string\", Kind: \"string\"}},\n\t\t\"indexOf\":     {Kind: \"func\", Arguments: []*Type{{Name: \"string\", Kind: \"string\"}, {Name: \"substr\", Kind: \"string\"}}, Return: &Type{Name: \"index\", Kind: \"int\"}},\n\t\t\"lastIndexOf\": {Kind: \"func\", Arguments: []*Type{{Name: \"string\", Kind: \"string\"}, {Name: \"substr\", Kind: \"string\"}}, Return: &Type{Name: \"index\", Kind: \"int\"}},\n\n\t\t\"hasPrefix\": {Kind: \"func\", Arguments: []*Type{{Name: \"string\", Kind: \"string\"}, {Name: \"prefix\", Kind: \"string\"}}, Return: &Type{Kind: \"bool\"}},\n\t\t\"hasSuffix\": {Kind: \"func\", Arguments: []*Type{{Name: \"string\", Kind: \"string\"}, {Name: \"prefix\", Kind: \"string\"}}, Return: &Type{Kind: \"bool\"}},\n\n\t\t\"toJSON\":   {Kind: \"func\", Arguments: []*Type{{Kind: \"any\"}}, Return: &Type{Kind: \"string\"}},\n\t\t\"fromJSON\": {Kind: \"func\", Arguments: []*Type{{Kind: \"string\"}}, Return: &Type{Kind: \"any\"}},\n\n\t\t\"toBase64\":   {Kind: \"func\", Arguments: []*Type{{Kind: \"string\"}}, Return: &Type{Kind: \"string\"}},\n\t\t\"fromBase64\": {Kind: \"func\", Arguments: []*Type{{Kind: \"string\"}}, Return: &Type{Kind: \"string\"}},\n\n\t\t\"first\": {Kind: \"func\", Arguments: []*Type{{Kind: \"array\", Type: &Type{Kind: \"any\"}}}, Return: &Type{Kind: \"any\"}},\n\t\t\"last\":  {Kind: \"func\", Arguments: []*Type{{Kind: \"array\", Type: &Type{Kind: \"any\"}}}, Return: &Type{Kind: \"any\"}},\n\n\t\t\"now\":      {Kind: \"func\", Return: &Type{Name: \"time.Time\", Kind: \"struct\"}},\n\t\t\"duration\": {Kind: \"func\", Arguments: []*Type{{Kind: \"string\"}}, Return: &Type{Kind: \"time.Duration\"}},\n\t}\n)\n\nfunc CreateDoc(i any) *Context {\n\tc := &Context{\n\t\tVariables: make(map[Identifier]*Type),\n\t\tTypes:     make(map[TypeName]*Type),\n\t\tPkgPath:   deref.Type(reflect.TypeOf(i)).PkgPath(),\n\t}\n\n\tcache := new(nature.Cache)\n\tenv := conf.EnvWithCache(cache, i)\n\tfor name, t := range env.All(cache) {\n\t\tif _, ok := c.Variables[Identifier(name)]; ok {\n\t\t\tcontinue\n\t\t}\n\t\tc.Variables[Identifier(name)] = c.use(t.Type, fromMethod(t.Method))\n\t}\n\n\tfor _, op := range Operators {\n\t\tc.Variables[Identifier(op)] = &Type{\n\t\t\tKind: \"operator\",\n\t\t}\n\t}\n\n\tfor builtin, t := range Builtins {\n\t\tc.Variables[builtin] = t\n\t}\n\n\treturn c\n}\n\ntype config struct {\n\tmethod bool\n}\n\ntype option func(c *config)\n\nfunc fromMethod(b bool) option {\n\treturn func(c *config) {\n\t\tc.method = b\n\t}\n}\n\nfunc (c *Context) use(t reflect.Type, ops ...option) *Type {\n\tconfig := &config{}\n\tfor _, op := range ops {\n\t\top(config)\n\t}\n\n\tmethods := make([]reflect.Method, 0)\n\n\t// Methods of struct should be gathered from original struct with pointer,\n\t// as methods maybe declared on pointer receiver. Also this method retrieves\n\t// all embedded structs methods as well, no need to recursion.\n\tfor i := 0; i < t.NumMethod(); i++ {\n\t\tm := t.Method(i)\n\t\tif isPrivate(m.Name) || isProtobuf(m.Name) {\n\t\t\tcontinue\n\t\t}\n\t\tmethods = append(methods, m)\n\t}\n\n\tt = deref.Type(t)\n\n\t// Only named types will have methods defined on them.\n\t// It maybe not even struct, but we gonna call then\n\t// structs in appendix anyway.\n\tif len(methods) > 0 {\n\t\tgoto appendix\n\t}\n\n\t// This switch only for \"simple\" types.\n\tswitch t.Kind() {\n\tcase reflect.Bool:\n\t\treturn &Type{Kind: \"bool\"}\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\tfallthrough\n\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn &Type{Kind: \"int\"}\n\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn &Type{Kind: \"float\"}\n\n\tcase reflect.String:\n\t\treturn &Type{Kind: \"string\"}\n\n\tcase reflect.Interface:\n\t\treturn &Type{Kind: \"any\"}\n\n\tcase reflect.Array, reflect.Slice:\n\t\treturn &Type{\n\t\t\tKind: \"array\",\n\t\t\tType: c.use(t.Elem()),\n\t\t}\n\n\tcase reflect.Map:\n\t\treturn &Type{\n\t\t\tKind: \"map\",\n\t\t\tKey:  c.use(t.Key()),\n\t\t\tType: c.use(t.Elem()),\n\t\t}\n\n\tcase reflect.Struct:\n\t\tgoto appendix\n\n\tcase reflect.Func:\n\t\targuments := make([]*Type, 0)\n\t\tstart := 0\n\t\tif config.method {\n\t\t\tstart = 1\n\t\t}\n\t\tfor i := start; i < t.NumIn(); i++ {\n\t\t\targuments = append(arguments, c.use(t.In(i)))\n\t\t}\n\t\tf := &Type{\n\t\t\tKind:      \"func\",\n\t\t\tArguments: arguments,\n\t\t}\n\t\tif t.NumOut() > 0 {\n\t\t\tf.Return = c.use(t.Out(0))\n\t\t}\n\t\treturn f\n\t}\n\nappendix:\n\n\tname := TypeName(t.String())\n\tif c.PkgPath == t.PkgPath() {\n\t\tname = TypeName(t.Name())\n\t}\n\tanonymous := t.Name() == \"\"\n\n\ta, ok := c.Types[name]\n\n\tif !ok {\n\t\ta = &Type{\n\t\t\tKind:   \"struct\",\n\t\t\tFields: make(map[Identifier]*Type),\n\t\t}\n\n\t\t// baseNode a should be saved before starting recursion, or it will never end.\n\t\tif !anonymous {\n\t\t\tc.Types[name] = a\n\t\t}\n\n\t\tntCache := new(nature.Cache)\n\t\tfor name, field := range nature.StructFields(ntCache, t) {\n\t\t\tif isPrivate(name) || isProtobuf(name) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif _, ok := a.Fields[Identifier(name)]; ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ta.Fields[Identifier(name)] = c.use(field.Type)\n\t\t}\n\n\t\tfor _, m := range methods {\n\t\t\tif isPrivate(m.Name) || isProtobuf(m.Name) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ta.Fields[Identifier(m.Name)] = c.use(m.Type, fromMethod(true))\n\t\t}\n\t}\n\n\tif anonymous {\n\t\treturn a\n\t}\n\n\treturn &Type{\n\t\tKind: \"struct\",\n\t\tName: name,\n\t}\n}\n\nvar isCapital = regexp.MustCompile(\"^[A-Z]\")\n\nfunc isPrivate(s string) bool {\n\treturn !isCapital.Match([]byte(s))\n}\n\nfunc isProtobuf(s string) bool {\n\treturn strings.HasPrefix(s, \"XXX_\")\n}\n"
  },
  {
    "path": "docgen/docgen_test.go",
    "content": "package docgen_test\n\nimport (\n\t\"math\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t. \"github.com/expr-lang/expr/docgen\"\n)\n\ntype Tweet struct {\n\tSize    int\n\tMessage string\n}\n\ntype Env struct {\n\tTweets []Tweet\n\tConfig struct {\n\t\tMaxSize int32\n\t}\n\tEnv map[string]any\n\t// NOTE: conflicting type name\n\tTimeWeekday time.Weekday\n\tWeekday     Weekday\n}\n\ntype Weekday int\n\nfunc (Weekday) String() string {\n\treturn \"\"\n}\n\ntype Duration int\n\nfunc (Duration) String() string {\n\treturn \"\"\n}\n\nfunc (*Env) Duration(s string) Duration {\n\treturn Duration(0)\n}\n\nfunc TestCreateDoc(t *testing.T) {\n\tOperators = nil\n\tBuiltins = nil\n\tdoc := CreateDoc(&Env{})\n\texpected := &Context{\n\t\tVariables: map[Identifier]*Type{\n\t\t\t\"Tweets\": {\n\t\t\t\tKind: \"array\",\n\t\t\t\tType: &Type{\n\t\t\t\t\tKind: \"struct\",\n\t\t\t\t\tName: \"Tweet\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Config\": {\n\t\t\t\tKind: \"struct\",\n\t\t\t\tFields: map[Identifier]*Type{\n\t\t\t\t\t\"MaxSize\": {Kind: \"int\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Env\": {\n\t\t\t\tKind: \"map\",\n\t\t\t\tKey:  &Type{Kind: \"string\"},\n\t\t\t\tType: &Type{Kind: \"any\"},\n\t\t\t},\n\t\t\t\"Duration\": {\n\t\t\t\tKind: \"func\",\n\t\t\t\tArguments: []*Type{\n\t\t\t\t\t{Kind: \"string\"},\n\t\t\t\t},\n\t\t\t\tReturn: &Type{Kind: \"struct\", Name: \"Duration\"},\n\t\t\t},\n\t\t\t\"TimeWeekday\": {\n\t\t\t\tName: \"time.Weekday\",\n\t\t\t\tKind: \"struct\",\n\t\t\t},\n\t\t\t\"Weekday\": {\n\t\t\t\tName: \"Weekday\",\n\t\t\t\tKind: \"struct\",\n\t\t\t},\n\t\t},\n\t\tTypes: map[TypeName]*Type{\n\t\t\t\"Tweet\": {\n\t\t\t\tKind: \"struct\",\n\t\t\t\tFields: map[Identifier]*Type{\n\t\t\t\t\t\"Size\":    {Kind: \"int\"},\n\t\t\t\t\t\"Message\": {Kind: \"string\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Duration\": {\n\t\t\t\tKind: \"struct\",\n\t\t\t\tFields: map[Identifier]*Type{\n\t\t\t\t\t\"String\": {\n\t\t\t\t\t\tKind:      \"func\",\n\t\t\t\t\t\tArguments: []*Type{},\n\t\t\t\t\t\tReturn: &Type{\n\t\t\t\t\t\t\tKind: \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"time.Weekday\": {\n\t\t\t\tKind: \"struct\",\n\t\t\t\tFields: map[Identifier]*Type{\n\t\t\t\t\t\"String\": {\n\t\t\t\t\t\tKind:      \"func\",\n\t\t\t\t\t\tArguments: []*Type{},\n\t\t\t\t\t\tReturn: &Type{\n\t\t\t\t\t\t\tKind: \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Weekday\": {\n\t\t\t\tKind: \"struct\",\n\t\t\t\tFields: map[Identifier]*Type{\n\t\t\t\t\t\"String\": {\n\t\t\t\t\t\tKind:      \"func\",\n\t\t\t\t\t\tArguments: []*Type{},\n\t\t\t\t\t\tReturn: &Type{\n\t\t\t\t\t\t\tKind: \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tPkgPath: \"github.com/expr-lang/expr/docgen_test\",\n\t}\n\n\tassert.Equal(t, expected.Markdown(), doc.Markdown())\n}\n\ntype A struct {\n\tAmbiguousField int\n\tOkField        int\n}\ntype B struct {\n\tAmbiguousField string\n}\n\ntype C struct {\n\tA\n\tB\n}\ntype EnvAmbiguous struct {\n\tA\n\tB\n\tC C\n}\n\nfunc TestCreateDoc_Ambiguous(t *testing.T) {\n\tdoc := CreateDoc(&EnvAmbiguous{})\n\texpected := &Context{\n\t\tVariables: map[Identifier]*Type{\n\t\t\t\"A\": {\n\t\t\t\tKind: \"struct\",\n\t\t\t\tName: \"A\",\n\t\t\t},\n\t\t\t\"AmbiguousField\": {\n\t\t\t\tKind: \"int\",\n\t\t\t},\n\t\t\t\"B\": {\n\t\t\t\tKind: \"struct\",\n\t\t\t\tName: \"B\",\n\t\t\t},\n\t\t\t\"OkField\": {\n\t\t\t\tKind: \"int\",\n\t\t\t},\n\t\t\t\"C\": {\n\t\t\t\tKind: \"struct\",\n\t\t\t\tName: \"C\",\n\t\t\t},\n\t\t},\n\t\tTypes: map[TypeName]*Type{\n\t\t\t\"A\": {\n\t\t\t\tKind: \"struct\",\n\t\t\t\tFields: map[Identifier]*Type{\n\t\t\t\t\t\"AmbiguousField\": {Kind: \"int\"},\n\t\t\t\t\t\"OkField\":        {Kind: \"int\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"B\": {\n\t\t\t\tKind: \"struct\",\n\t\t\t\tFields: map[Identifier]*Type{\n\t\t\t\t\t\"AmbiguousField\": {Kind: \"string\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"C\": {\n\t\t\t\tKind: \"struct\",\n\t\t\t\tFields: map[Identifier]*Type{\n\t\t\t\t\t\"A\":              {Kind: \"struct\", Name: \"A\"},\n\t\t\t\t\t\"AmbiguousField\": {Kind: \"int\"},\n\t\t\t\t\t\"B\":              {Kind: \"struct\", Name: \"B\"},\n\t\t\t\t\t\"OkField\":        {Kind: \"int\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tPkgPath: \"github.com/expr-lang/expr/docgen_test\",\n\t}\n\n\tassert.Equal(t, expected.Markdown(), doc.Markdown())\n}\n\nfunc TestCreateDoc_FromMap(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"Tweets\": []*Tweet{},\n\t\t\"Config\": struct {\n\t\t\tMaxSize int\n\t\t}{},\n\t\t\"Max\": math.Max,\n\t}\n\tOperators = nil\n\tBuiltins = nil\n\tdoc := CreateDoc(env)\n\texpected := &Context{\n\t\tVariables: map[Identifier]*Type{\n\t\t\t\"Tweets\": {\n\t\t\t\tKind: \"array\",\n\t\t\t\tType: &Type{\n\t\t\t\t\tKind: \"struct\",\n\t\t\t\t\tName: \"docgen_test.Tweet\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Config\": {\n\t\t\t\tKind: \"struct\",\n\t\t\t\tFields: map[Identifier]*Type{\n\t\t\t\t\t\"MaxSize\": {Kind: \"int\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Max\": {\n\t\t\t\tKind: \"func\",\n\t\t\t\tArguments: []*Type{\n\t\t\t\t\t{Kind: \"float\"},\n\t\t\t\t\t{Kind: \"float\"},\n\t\t\t\t},\n\t\t\t\tReturn: &Type{Kind: \"float\"},\n\t\t\t},\n\t\t},\n\t\tTypes: map[TypeName]*Type{\n\t\t\t\"docgen_test.Tweet\": {\n\t\t\t\tKind: \"struct\",\n\t\t\t\tFields: map[Identifier]*Type{\n\t\t\t\t\t\"Size\":    {Kind: \"int\"},\n\t\t\t\t\t\"Message\": {Kind: \"string\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\trequire.EqualValues(t, expected.Markdown(), doc.Markdown())\n}\n\nfunc TestContext_Markdown(t *testing.T) {\n\tdoc := CreateDoc(&Env{})\n\tmd := doc.Markdown()\n\trequire.True(t, len(md) > 0)\n}\n"
  },
  {
    "path": "docgen/markdown.go",
    "content": "package docgen\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"strings\"\n)\n\nfunc (c *Context) Markdown() string {\n\tvar variables []string\n\tfor name := range c.Variables {\n\t\tvariables = append(variables, string(name))\n\t}\n\n\tvar types []string\n\tfor name := range c.Types {\n\t\ttypes = append(types, string(name))\n\t}\n\n\tsort.Strings(variables)\n\tsort.Strings(types)\n\n\tout := `### Variables\n| Name | Type |\n|------|------|\n`\n\tfor _, name := range variables {\n\t\tv := c.Variables[Identifier(name)]\n\t\tif v.Kind == \"func\" {\n\t\t\tcontinue\n\t\t}\n\t\tif v.Kind == \"operator\" {\n\t\t\tcontinue\n\t\t}\n\t\tout += fmt.Sprintf(\"| %v | %v |\\n\", name, link(v))\n\t}\n\n\tout += `\n### Functions\n| Name | Return type |\n|------|-------------|\n`\n\tfor _, name := range variables {\n\t\tv := c.Variables[Identifier(name)]\n\t\tif v.Kind == \"func\" {\n\t\t\targs := make([]string, len(v.Arguments))\n\t\t\tfor i, arg := range v.Arguments {\n\t\t\t\targs[i] = link(arg)\n\t\t\t}\n\t\t\tout += fmt.Sprintf(\"| %v(%v) | %v |\\n\", name, strings.Join(args, \", \"), link(v.Return))\n\t\t}\n\t}\n\n\tout += \"\\n### Types\\n\"\n\tfor _, name := range types {\n\t\tt := c.Types[TypeName(name)]\n\t\tout += fmt.Sprintf(\"#### %v\\n\", name)\n\t\tout += fields(t)\n\t\tout += \"\\n\"\n\t}\n\n\treturn out\n}\n\nfunc link(t *Type) string {\n\tif t == nil {\n\t\treturn \"nil\"\n\t}\n\tif t.Name != \"\" {\n\t\treturn fmt.Sprintf(\"[%v](#%v)\", t.Name, t.Name)\n\t}\n\tif t.Kind == \"array\" {\n\t\treturn fmt.Sprintf(\"array(%v)\", link(t.Type))\n\t}\n\tif t.Kind == \"map\" {\n\t\treturn fmt.Sprintf(\"map(%v => %v)\", link(t.Key), link(t.Type))\n\t}\n\treturn fmt.Sprintf(\"`%v`\", t.Kind)\n}\n\nfunc fields(t *Type) string {\n\tvar fields []string\n\tfor field := range t.Fields {\n\t\tfields = append(fields, string(field))\n\t}\n\tsort.Strings(fields)\n\n\tout := \"\"\n\tfoundFields := false\n\tfor _, name := range fields {\n\t\tv := t.Fields[Identifier(name)]\n\t\tif v.Kind != \"func\" {\n\t\t\tif !foundFields {\n\t\t\t\tout += \"| Field | Type |\\n|---|---|\\n\"\n\t\t\t}\n\t\t\tfoundFields = true\n\n\t\t\tout += fmt.Sprintf(\"| %v | %v |\\n\", name, link(v))\n\t\t}\n\t}\n\tfoundMethod := false\n\tfor _, name := range fields {\n\t\tv := t.Fields[Identifier(name)]\n\t\tif v.Kind == \"func\" {\n\t\t\tif !foundMethod {\n\t\t\t\tout += \"\\n| Method | Returns |\\n|---|---|\\n\"\n\t\t\t}\n\t\t\tfoundMethod = true\n\n\t\t\targs := make([]string, len(v.Arguments))\n\t\t\tfor i, arg := range v.Arguments {\n\t\t\t\targs[i] = link(arg)\n\t\t\t}\n\t\t\tout += fmt.Sprintf(\"| %v(%v) | %v |\\n\", name, strings.Join(args, \", \"), link(v.Return))\n\t\t}\n\t}\n\treturn out\n}\n"
  },
  {
    "path": "docs/configuration.md",
    "content": "# Configuration\n\n## Return type\n\nUsually, the return type of expression is anything. But we can instruct type checker to verify the return type of the\nexpression.\nFor example, in filter expressions, we expect the return type to be a boolean.\n\n```go\nprogram, err := expr.Compile(code, expr.AsBool())\nif err != nil {\n    panic(err)\n}\n\noutput, err := expr.Run(program, env)\nif err != nil {\n    panic(err)\n}\n\nok := output.(bool) // It is safe to assert the output to bool, if the expression is type checked as bool.\n```\n\nIf `code` variable for example returns a string, the compiler will return an error.\n\nExpr has a few options to specify the return type:\n\n- [expr.AsBool()](https://pkg.go.dev/github.com/expr-lang/expr#AsBool) - expects the return type to be a bool.\n- [expr.AsInt()](https://pkg.go.dev/github.com/expr-lang/expr#AsInt) - expects the return type to be an int (float64,\n  uint, int32, and other will be cast to int).\n- [expr.AsInt64()](https://pkg.go.dev/github.com/expr-lang/expr#AsInt64) - expects the return type to be an int64 (\n  float64, uint, int32, and other will be cast to int64).\n- [expr.AsFloat64()](https://pkg.go.dev/github.com/expr-lang/expr#AsFloat64) - expects the return type to be a float64 (\n  float32 will be cast to float64).\n- [expr.AsAny()](https://pkg.go.dev/github.com/expr-lang/expr#AsAny) - expects the return type to be anything.\n- [expr.AsKind(reflect.Kind)](https://pkg.go.dev/github.com/expr-lang/expr#AsKind) - expects the return type to be a\n  specific kind.\n\n:::tip Warn on any\nBy default, type checker will accept any type, even if the return type is specified. Consider following examples:\n\n```expr\nlet arr = [1, 2, 3]; arr[0]\n```\n\nThe return type of the expression is `any`. Arrays created in Expr are of type `[]any`. The type checker will not return\nan error if the return type is specified as `expr.AsInt()`. The output of the expression is `1`, which is an int, but the\ntype checker will not return an error.\n\nBut we can instruct the type checker to warn us if the return type is `any`. Use [`expr.WarnOnAny()`](https://pkg.go.dev/github.com/expr-lang/expr#WarnOnAny) to enable this behavior.\n\n```go\nprogram, err := expr.Compile(code, expr.AsInt(), expr.WarnOnAny())\n```\n\nThe type checker will return an error if the return type is `any`. We need to modify the expression to return a specific\ntype.\n\n```expr\nlet arr = [1, 2, 3]; int(arr[0])\n```\n:::\n\n\n## WithContext\n\nAlthough the compiled program is guaranteed to be terminated, some user defined functions may not be. For example, if a\nuser defined function calls a remote service, we may want to pass a context to the function.\n\nThis is possible via the [`WithContext`](https://pkg.go.dev/github.com/expr-lang/expr#WithContext) option.\n\nThis option will modify function calls to include the context as the first argument (only if the function signature\naccepts a context).\n\n```expr\ncustomFunc(42)\n// will be transformed to\ncustomFunc(ctx, 42)\n```\n\nFunction `expr.WithContext()` takes the name of context variable. The context variable must be defined in the environment.\n\n```go\nenv := map[string]any{\n    \"ctx\": context.Background(),\n    \"customFunc\": func(ctx context.Context, a int) int {\n        return a\n    },\n}\n\nprogram, err := expr.Compile(code, expr.Env(env), expr.WithContext(\"ctx\"))\n```\n\n## ConstExpr\n\nFor some user defined functions, we may want to evaluate the expression at compile time. This is possible via the\n[`ConstExpr`](https://pkg.go.dev/github.com/expr-lang/expr#ConstExpr) option. \n\n```go\nfunc fib(n int) int {\n    if n <= 1 {\n        return n\n    }\n    return fib(n-1) + fib(n-2)\n}\n\nenv := map[string]any{\n    \"fib\": fib,\n}\n\nprogram, err := expr.Compile(`fib(10)`, expr.Env(env), expr.ConstExpr(\"fib\"))\n```\n\nIf all arguments of the function are constants, the function will be evaluated at compile time. The result of the function\nwill be used as a constant in the expression.\n\n```expr\nfib(10)    // will be transformed to 55 during the compilation\nfib(12+12) // will be transformed to 267914296 during the compilation\nfib(x)     // will **not** be transformed and will be evaluated at runtime\n```\n\n## Timezone\n\nBy default, the timezone is set to `time.Local`. We can change the timezone via the [`Timezone`](https://pkg.go.dev/github.com/expr-lang/expr#Timezone) option.\n\n```go\nprogram, err := expr.Compile(code, expr.Timezone(time.UTC))\n```\n\nThe timezone is used for the following functions:\n```expr\ndate(\"2024-11-23 12:00:00\") // parses the date in the specified timezone\nnow() // returns the current time in the specified timezone\n```\n"
  },
  {
    "path": "docs/environment.md",
    "content": "# Environment\n\nThe environment is a map or a struct that contains the variables and functions that the expression can access.\n\n## Struct as Environment\n\nLet's consider the following example:\n\n```go\ntype Env struct {\n    UpdatedAt time.Time\n    Posts     []Post\n    Map       map[string]string `expr:\"tags\"`\n}\n```\n\nThe `Env` struct contains 3 variables that the expression can access: `UpdatedAt`, `Posts`, and `tags`.\n\n:::info\nThe `expr` tag is used to rename the `Map` field to `tags` variable in the expression.\n:::\n\nThe `Env` struct can also contain methods. The methods defined on the struct become functions that the expression can\ncall.\n\n```go\nfunc (Env) Format(t time.Time) string {\n    return t.Format(time.RFC822)\n}\n```\n\n:::tip\nMethods defined on embedded structs are also accessible.\n```go\ntype Env struct {\n    Helpers\n}\n\ntype Helpers struct{}\n\nfunc (Helpers) Format(t time.Time) string {\n    return t.Format(time.RFC822)\n}\n```\n:::\n\nWe can use an empty struct `Env{}` to with [expr.Env](https://pkg.go.dev/github.com/expr-lang/expr#Env) to create an environment. Expr will use reflection to find \nthe fields and methods of the struct.\n\n```go\nprogram, err := expr.Compile(code, expr.Env(Env{}))\n```\n\nCompiler will type check the expression against the environment. After the compilation, we can run the program with the environment.\nYou should use the same type of environment that you passed to the `expr.Env` function.\n\n```go\noutput, err := expr.Run(program, Env{\n    UpdatedAt: time.Now(),\n    Posts:     []Post{{Title: \"Hello, World!\"}},\n    Map:       map[string]string{\"tag1\": \"value1\"},\n})\n```\n\n## Map as Environment\n\nYou can also use a map as an environment.\n\n```go\nenv := map[string]any{\n    \"UpdatedAt\": time.Time{},\n    \"Posts\":     []Post{},\n    \"tags\":      map[string]string{},\n    \"sprintf\":   fmt.Sprintf,\n}\n\nprogram, err := expr.Compile(code, expr.Env(env))\n```\n\nA map defines variables and functions that the expression can access. The key is the variable name, and the type\nis the value's type.\n\n```go\nenv := map[string]any{\n    \"object\": map[string]any{\n        \"field\": 42,\n    },\n    \"struct\": struct {\n        Field int `expr:\"field\"`\n    }{42},\n}\n```\n\nExpr will infer the type of the `object` variable as `map[string]any`.\nAccessing fields of the `object` and `struct` variables will return the following results.\n\n```expr\nobject.field   // 42\nobject.unknown // nil (no error)\n\nstruct.field   // 42\nstruct.unknown // error (unknown field)\n\nfoobar         // error (unknown variable)\n```\n\n:::note\nThe `foobar` variable is not defined in the environment.\nBy default, Expr will return an error if unknown variables are used in the expression.\nYou can disable this behavior by passing [`AllowUndefinedVariables`](https://pkg.go.dev/github.com/expr-lang/expr#AllowUndefinedVariables) option to the compiler.\n:::\n"
  },
  {
    "path": "docs/functions.md",
    "content": "# Functions\n\nExpr comes with a set of [builtin](language-definition.md) functions, but you can also define your own functions.\n\nThe easiest way to define a custom function is to add it to the environment.\n\n```go\nenv := map[string]any{\n    \"add\": func(a, b int) int {\n        return a + b\n    },\n}\n```\n\nOr you can use functions defined on a struct:\n\n```go\ntype Env struct{}\n\nfunc (Env) Add(a, b int) int {\n    return a + b\n}\n```\n\n:::info\nIf functions are marked with [`ConstExpr`](./configuration.md#constexpr) option, they will be evaluated at compile time.\n:::\n\nThe best way to define a function from a performance perspective is to use a [`Function`](https://pkg.go.dev/github.com/expr-lang/expr#Function) option.\n\n```go\natoi := expr.Function(\n    \"atoi\",\n    func(params ...any) (any, error) {\n        return strconv.Atoi(params[0].(string))\n    },\n)\n\nprogram, err := expr.Compile(`atoi(\"42\")`, atoi)\n```\n\nType checker sees the `atoi` function as a function with a variadic number of arguments of type `any`, and returns \na value of type `any`. But, we can specify the types of arguments and the return value by adding the correct function \nsignature or multiple signatures.\n\n```go\natoi := expr.Function(\n    \"atoi\",\n    func(params ...any) (any, error) {\n        return strconv.Atoi(params[0].(string))\n    },\n    // highlight-next-line\n    new(func(string) int),\n)\n```\n\nOr we can simply reuse the strconv.Atoi function as a type:\n\n```go\natoi := expr.Function(\n    \"atoi\",\n    func(params ...any) (any, error) {\n        return strconv.Atoi(params[0].(string))\n    },\n    // highlight-next-line\n    strconv.Atoi,\n)\n```\n\nIt is possible to define multiple signatures for a function:\n\n```go\ntoInt := expr.Function(\n    \"toInt\",\n    func(params ...any) (any, error) {\n        switch params[0].(type) {\n        case float64:\n            return int(params[0].(float64)), nil\n        case string:\n            return strconv.Atoi(params[0].(string))\n        }\n        return nil, fmt.Errorf(\"invalid type\")\n    },\n    // highlight-start\n    new(func(float64) int),\n    new(func(string) int),\n    // highlight-end\n)\n```\n"
  },
  {
    "path": "docs/getting-started.md",
    "content": "# Getting Started\n\n**Expr** is a simple, fast and extensible expression language for Go. It is\ndesigned to be easy to use and integrate into your Go application. Let's delve\ndeeper into its core features:\n\n- **Memory safe** - Designed to prevent vulnerabilities like buffer overflows and memory leaks.\n- **Type safe** - Enforces strict type rules, aligning with Go's type system.\n- **Terminating** - Ensures every expression evaluation cannot loop indefinitely.\n- **Side effects free** - Evaluations won't modify global states or variables.\n\nLet's start with a simple example:\n\n```go\nprogram, err := expr.Compile(`2 + 2`)\nif err != nil {\n    panic(err)\n}\n\noutput, err := expr.Run(program, nil)\nif err != nil {\n    panic(err)\n}\n\nfmt.Print(output) // 4\n```\n\nExpr compiles the expression `2 + 2` into a bytecode program. Then we run\nthe program and get the output.\n\n:::tip\nIn performance-critical applications, you can reuse the compiled program. Compiled programs are safe for concurrent use.\n**Compile once** and run **multiple** times.\n:::\n\nThe `expr.Compile` function returns a `*vm.Program` and an error. The `expr.Run` function takes a program and an\nenvironment. The environment is a map of variables that can be used in the expression. In this example, we use `nil` as\nan environment because we don't need any variables.\n\n\nNow let's pass some variables to the expression:\n\n```go\nenv := map[string]any{\n    \"foo\": 100,\n    \"bar\": 200,\n}\n\nprogram, err := expr.Compile(`foo + bar`, expr.Env(env))\nif err != nil {\n    panic(err)\n}\n\noutput, err := expr.Run(program, env)\nif err != nil {\n    panic(err)\n}\n\nfmt.Print(output) // 300\n```\n\nWhy do we need to pass the environment to the `expr.Compile` function? Expr can be used as a type-safe language. \nExpr can infer the type of the expression and check it against the environment. \n\nHere is an example:\n\n```go\nenv := map[string]any{\n    \"name\": \"Anton\",\n    \"age\": 35,\n}\n\nprogram, err := expr.Compile(`name + age`, expr.Env(env))\nif err != nil {\n    // highlight-next-line\n    panic(err) // Will panic with \"invalid operation: string + int\"\n}\n```\n\nExpr can work with any Go types:\n\n```go\nenv := map[string]any{\n    \"greet\":   \"Hello, %v!\",\n    \"names\":   []string{\"world\", \"you\"},\n    \"sprintf\": fmt.Sprintf,\n}\n\nprogram, err := expr.Compile(`sprintf(greet, names[0])`, expr.Env(env))\nif err != nil {\n    panic(err)\n}\n\noutput, err := expr.Run(program, env)\nif err != nil {\n    panic(err)\n}\n\nfmt.Print(output) // Hello, world!\n```\n\nAlso, Expr can use a struct as an environment. Here is an example:\n\n```go\ntype Env struct {\n    Posts []Post `expr:\"posts\"`\n}\n\nfunc (Env) Format(t time.Time) string { // Methods defined on the struct become functions. \n    return t.Format(time.RFC822) \n}\n\ntype Post struct {\n    Body string\n    Date time.Time\n}\n\nfunc main() {\n    code := `map(posts, Format(.Date) + \": \" + .Body)`\n    \n    program, err := expr.Compile(code, expr.Env(Env{})) // Pass the struct as an environment.\n    if err != nil {\n        panic(err)\n    }\n\n    env := Env{\n        Posts: []Post{\n            {\"Oh My God!\", time.Now()}, \n            {\"How you doin?\", time.Now()}, \n            {\"Could I be wearing any more clothes?\", time.Now()},\n        },\n    }\n\n    output, err := expr.Run(program, env)\n    if err != nil {\n        panic(err)\n    }\n\n    fmt.Print(output)\n}\n```\n\nThe compiled program can be reused between runs.\n\n```go\ntype Env struct {\n    X int\n    Y int\n}\n\nprogram, err := expr.Compile(`X + Y`, expr.Env(Env{}))\nif err != nil {\n    panic(err)\n}\n\noutput, err := expr.Run(program, Env{1, 2})\nif err != nil {\n    panic(err)\n}\n\nfmt.Print(output) // 3\n\noutput, err = expr.Run(program, Env{3, 4})\nif err != nil {\n    panic(err)\n}\n\nfmt.Print(output) // 7\n```\n\n:::info Eval = Compile + Run\nFor one-off expressions, you can use the `expr.Eval` function. It compiles and runs the expression in one step.\n```go\noutput, err := expr.Eval(`2 + 2`, env)\n```\n:::\n"
  },
  {
    "path": "docs/language-definition.md",
    "content": "# Language Definition\n\n**Expr** is a simple expression language that can be used to evaluate expressions.\n\n## Literals\n\n<table>\n    <tr>\n        <td><strong>Comment</strong></td>\n        <td>\n             <code>/* */</code> or <code>//</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Boolean</strong></td>\n        <td>\n            <code>true</code>, <code>false</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Integer</strong></td>\n        <td>\n            <code>42</code>, <code>0x2A</code>, <code>0o52</code>, <code>0b101010</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Float</strong></td>\n        <td>\n            <code>0.5</code>, <code>.5</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>String</strong></td>\n        <td>\n            <code>\"foo\"</code>, <code>'bar'</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Array</strong></td>\n        <td>\n            <code>[1, 2, 3]</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Map</strong></td>\n        <td>\n            <code>&#123;a: 1, b: 2, c: 3&#125;</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Nil</strong></td>\n        <td>\n            <code>nil</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Bytes</strong></td>\n        <td>\n            <code>b\"hello\"</code>, <code>b'\\xff\\x00'</code>\n        </td>\n    </tr>\n</table>\n\n### Strings\n\nStrings can be enclosed in single quotes or double quotes. Strings can contain escape sequences, like `\\n` for newline,\n`\\t` for tab, `\\uXXXX` for Unicode code points.\n\n```expr\n\"Hello\\nWorld\"\n```\n\nFor multiline strings, use backticks:\n\n```expr\n`Hello\nWorld`\n```\n\nBackticks strings are raw strings, they do not support escape sequences.\n\n### Bytes\n\nBytes literals are represented by string literals preceded by a `b` or `B` character.\nThe bytes literal returns a `[]byte` value.\n\n```expr\nb\"abc\" // []byte{97, 98, 99}\n```\n\nNon-ASCII characters are UTF-8 encoded:\n\n```expr\nb\"ÿ\" // []byte{195, 191} - UTF-8 encoding of ÿ\n```\n\nBytes literals support escape sequences for specifying arbitrary byte values:\n\n- `\\xNN` - hexadecimal escape (2 hex digits, value 0-255)\n- `\\NNN` - octal escape (3 octal digits, value 0-377)\n- `\\n`, `\\t`, `\\r`, etc. - standard escape sequences\n\n```expr\nb\"\\xff\"     // []byte{255}\nb\"\\x00\\x01\" // []byte{0, 1}\nb\"\\101\"     // []byte{65} - octal for 'A'\n```\n\n:::note\nUnlike string literals, bytes literals do not support `\\u` or `\\U` Unicode escapes.\nUse `\\x` escapes for arbitrary byte values.\n:::\n\n## Operators\n\n<table>\n    <tr>\n        <td><strong>Arithmetic</strong></td>\n        <td>\n            <code>+</code>, <code>-</code>, <code>*</code>, <code>/</code>, <code>%</code> (modulus), <code>^</code> or <code>**</code> (exponent)\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Comparison</strong></td>\n        <td>\n            <code>==</code>, <code>!=</code>, <code>&lt;</code>, <code>&gt;</code>, <code>&lt;=</code>, <code>&gt;=</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Logical</strong></td>\n        <td>\n            <code>not</code> or <code>!</code>, <code>and</code> or <code>&amp;&amp;</code>, <code>or</code> or <code>||</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Conditional</strong></td>\n        <td>\n            <code>?:</code> (ternary), <code>??</code> (nil coalescing), <code>if {} else {}</code> (multiline)\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Membership</strong></td>\n        <td>\n            <code>[]</code>, <code>.</code>, <code>?.</code>, <code>in</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>String</strong></td>\n        <td>\n            <code>+</code> (concatenation), <code>contains</code>, <code>startsWith</code>, <code>endsWith</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Regex</strong></td>\n        <td>\n            <code>matches</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Range</strong></td>\n        <td>\n            <code>..</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Slice</strong></td>\n        <td>\n            <code>[:]</code>\n        </td>\n    </tr>\n    <tr>\n        <td><strong>Pipe</strong></td>\n        <td>\n            <code>|</code>\n        </td>\n    </tr>\n</table>\n\n### Membership Operator\n\nFields of structs and items of maps can be accessed with `.` operator\nor `[]` operator. Next two expressions are equivalent:\n\n```expr\nuser.Name\nuser[\"Name\"]\n``` \n\nElements of arrays and slices can be accessed with\n`[]` operator. Negative indices are supported with `-1` being\nthe last element.\n\n```expr\narray[0] // first element\narray[-1] // last element\n```\n\nThe `in` operator can be used to check if an item is in an array or a map.\n\n```expr\n\"John\" in [\"John\", \"Jane\"]\n\"name\" in {\"name\": \"John\", \"age\": 30}\n```\n\n#### Optional chaining\n\nThe `?.` operator can be used to access a field of a struct or an item of a map\nwithout checking if the struct or the map is `nil`. If the struct or the map is\n`nil`, the result of the expression is `nil`.\n\n```expr\nauthor.User?.Name\n```\n\nIs equivalent to:\n\n```expr\nauthor.User != nil ? author.User.Name : nil\n```\n\n#### Nil coalescing\n\nThe `??` operator can be used to return the left-hand side if it is not `nil`,\notherwise the right-hand side is returned.\n\n```expr\nauthor.User?.Name ?? \"Anonymous\"\n```\n\nIs equivalent to:\n\n```expr\nauthor.User != nil ? author.User.Name : \"Anonymous\"\n```\n\n### Slice Operator\n\nThe slice operator `[:]` can be used to access a slice of an array.\n\nFor example, variable **array** is `[1, 2, 3, 4, 5]`:\n\n```expr\narray[1:4] == [2, 3, 4]\narray[1:-1] == [2, 3, 4]\narray[:3] == [1, 2, 3]\narray[3:] == [4, 5]\narray[:] == array\n```\n\n### Pipe Operator\n\nThe pipe operator `|` can be used to pass the result of the left-hand side\nexpression as the first argument of the right-hand side expression.\n\n```expr\nuser.Name | lower() | split(\" \")\n```\n\nIs equivalent to:\n\n```expr\nsplit(lower(user.Name), \" \")\n```\n\n### Range Operator\n\nThe range operator `..` can be used to create a range of integers.\n\n```expr\n1..3 == [1, 2, 3]\n```\n\n## Variables\n\nVariables can be declared with the `let` keyword. The variable name must start with a letter or an underscore.\nThe variable name can contain letters, digits and underscores. After the variable is declared, it can be used in the\nexpression.\n\n```expr\nlet x = 42; x * 2\n```\n\nA few variables can be declared by a few `let` statements separated by a semicolon.\n\n```expr\nlet x = 42; \nlet y = 2; \nx * y\n```\n\nHere is an example of variable with pipe operator:\n\n```expr\nlet name = user.Name | lower() | split(\" \"); \n\"Hello, \" + name[0] + \"!\"\n```\n\n### $env\n\nThe `$env` variable is a map of all variables passed to the expression.\n\n```expr\nfoo.Name == $env[\"foo\"].Name\n$env[\"var with spaces\"]\n```\n\nThink of `$env` as a global variable that contains all variables.\n\nThe `$env` can be used to check if a variable is defined:\n\n```expr\n'foo' in $env\n```\n\n## Predicate\n\nThe predicate is an expression. Predicates can be used in functions like `filter`, `all`, `any`, `one`, `none`, etc.\nFor example, next expression creates a new array from 0 to 9 and then filters it by even numbers:\n\n```expr\nfilter(0..9, {# % 2 == 0})\n```\n\nIf items of the array is a struct or a map, it is possible to access fields with\nomitted `#` symbol (`#.Value` becomes `.Value`).\n\n```expr\nfilter(tweets, {len(.Content) > 240})\n```\n\nBraces `{` `}` can be omitted:\n\n```expr\nfilter(tweets, len(.Content) > 240)\n```\n\n:::tip\nIn nested predicates, to access the outer variable, use [variables](#variables).\n\n```expr\nfilter(posts, {\n    let post = #; \n    any(.Comments, .Author == post.Author)\n}) \n```\n\n:::\n\n## String Functions\n\n### trim(str[, chars]) {#trim}\n\nRemoves white spaces from both ends of a string `str`.\nIf the optional `chars` argument is given, it is a string specifying the set of characters to be removed.\n\n```expr\ntrim(\"  Hello  \") == \"Hello\"\ntrim(\"__Hello__\", \"_\") == \"Hello\"\n```\n\n### trimPrefix(str, prefix) {#trimPrefix}\n\nRemoves the specified prefix from the string `str` if it starts with that prefix.\n\n```expr\ntrimPrefix(\"HelloWorld\", \"Hello\") == \"World\"\n```\n\n### trimSuffix(str, suffix) {#trimSuffix}\n\nRemoves the specified suffix from the string `str` if it ends with that suffix.\n\n```expr\ntrimSuffix(\"HelloWorld\", \"World\") == \"Hello\"\n```\n\n### upper(str) {#upper}\n\nConverts all the characters in string `str` to uppercase.\n\n```expr\nupper(\"hello\") == \"HELLO\"\n```\n\n### lower(str) {#lower}\n\nConverts all the characters in string `str` to lowercase.\n\n```expr\nlower(\"HELLO\") == \"hello\"\n```\n\n### split(str, delimiter[, n]) {#split}\n\nSplits the string `str` at each instance of the delimiter and returns an array of substrings.\n\n```expr\nsplit(\"apple,orange,grape\", \",\") == [\"apple\", \"orange\", \"grape\"]\nsplit(\"apple,orange,grape\", \",\", 2) == [\"apple\", \"orange,grape\"]\n```\n\n### splitAfter(str, delimiter[, n]) {#splitAfter}\n\nSplits the string `str` after each instance of the delimiter.\n\n```expr\nsplitAfter(\"apple,orange,grape\", \",\") == [\"apple,\", \"orange,\", \"grape\"]\nsplitAfter(\"apple,orange,grape\", \",\", 2) == [\"apple,\", \"orange,grape\"]\n```\n\n### replace(str, old, new) {#replace}\n\nReplaces all occurrences of `old` in string `str` with `new`.\n\n```expr\nreplace(\"Hello World\", \"World\", \"Universe\") == \"Hello Universe\"\n```\n\n### repeat(str, n) {#repeat}\n\nRepeats the string `str` `n` times.\n\n```expr\nrepeat(\"Hi\", 3) == \"HiHiHi\"\n```\n\n### indexOf(str, substring) {#indexOf}\n\nReturns the index of the first occurrence of the substring in string `str` or -1 if not found.\n\n```expr\nindexOf(\"apple pie\", \"pie\") == 6\n```\n\n### lastIndexOf(str, substring) {#lastIndexOf}\n\nReturns the index of the last occurrence of the substring in string `str` or -1 if not found.\n\n```expr\nlastIndexOf(\"apple pie apple\", \"apple\") == 10\n```\n\n### hasPrefix(str, prefix) {#hasPrefix}\n\nReturns `true` if string `str` starts with the given prefix.\n\n```expr\nhasPrefix(\"HelloWorld\", \"Hello\") == true\n```\n\n### hasSuffix(str, suffix) {#hasSuffix}\n\nReturns `true` if string `str` ends with the given suffix.\n\n```expr\nhasSuffix(\"HelloWorld\", \"World\") == true\n```\n\n## Date Functions\n\nExpr has a built-in support for Go's [time package](https://pkg.go.dev/time).\nIt is possible to subtract two dates and get the duration between them:\n\n```expr\ncreatedAt - now()\n```\n\nIt is possible to add a duration to a date:\n\n```expr\ncreatedAt + duration(\"1h\")\n```\n\nAnd it is possible to compare dates:\n\n```expr\ncreatedAt > now() - duration(\"1h\")\n```\n\n### now() {#now}\n\nReturns the current date as a [time.Time](https://pkg.go.dev/time#Time) value.\n\n```expr\nnow().Year() == 2024\n```\n\n### duration(str) {#duration}\n\nReturns [time.Duration](https://pkg.go.dev/time#Duration) value of the given string `str`.\n\nValid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".\n\n```expr\nduration(\"1h\").Seconds() == 3600\n```\n\n### date(str[, format[, timezone]]) {#date}\n\nConverts the given string `str` into a date representation.\n\nIf the optional `format` argument is given, it is a string specifying the format of the date.\nThe format string uses the same formatting rules as the standard\nGo [time package](https://pkg.go.dev/time#pkg-constants).\n\nIf the optional `timezone` argument is given, it is a string specifying the timezone of the date.\n\nIf the `format` argument is not given, the `v` argument must be in one of the following formats:\n\n- 2006-01-02\n- 15:04:05\n- 2006-01-02 15:04:05\n- RFC3339\n- RFC822,\n- RFC850,\n- RFC1123,\n\n```expr\ndate(\"2023-08-14\")\ndate(\"15:04:05\")\ndate(\"2023-08-14T00:00:00Z\")\ndate(\"2023-08-14 00:00:00\", \"2006-01-02 15:04:05\", \"Europe/Zurich\")\n```\n\nAvailable methods on the date:\n\n- `Year()` - returns the year \n- `Month()` - returns the month (starting from 1)\n- `Day()` - returns the day of the month\n- `Hour()` - returns the hour\n- `Minute()` - returns the minute\n- `Second()` - returns the second\n- `Weekday()` - returns the day of the week\n- `YearDay()` - returns the day of the year\n- and [more](https://pkg.go.dev/time#Time).\n\n```expr\ndate(\"2023-08-14\").Year() == 2023\n```\n\n### timezone(str) {#timezone}\n\nReturns the timezone of the given string `str`. List of available timezones can be\nfound [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).\n\n```expr\ntimezone(\"Europe/Zurich\")\ntimezone(\"UTC\")\n```\n\nTo convert a date to a different timezone, use the [`In()`](https://pkg.go.dev/time#Time.In) method:\n\n```expr\ndate(\"2023-08-14 00:00:00\").In(timezone(\"Europe/Zurich\"))\n```\n\n## Number Functions\n\n### max(n1, n2) {#max}\n\nReturns the maximum of the two numbers `n1` and `n2`.\n\n```expr\nmax(5, 7) == 7\n```\n\n### min(n1, n2) {#min}\n\nReturns the minimum of the two numbers `n1` and `n2`.\n\n```expr\nmin(5, 7) == 5\n```\n\n### abs(n) {#abs}\n\nReturns the absolute value of a number.\n\n```expr\nabs(-5) == 5\n```\n\n### ceil(n) {#ceil}\n\nReturns the least integer value greater than or equal to x.\n\n```expr\nceil(1.5) == 2.0\n```\n\n### floor(n) {#floor}\n\nReturns the greatest integer value less than or equal to x.\n\n```expr\nfloor(1.5) == 1.0\n```\n\n### round(n) {#round}\n\nReturns the nearest integer, rounding half away from zero.\n\n```expr\nround(1.5) == 2.0\n```\n\n## Array Functions\n\n### all(array, predicate) {#all}\n\nReturns **true** if all elements satisfies the [predicate](#predicate).\nIf the array is empty, returns **true**.\n\n```expr\nall(tweets, {.Size < 280})\n```\n\n### any(array, predicate) {#any}\n\nReturns **true** if any elements satisfies the [predicate](#predicate).\nIf the array is empty, returns **false**.\n\n```expr\nany(tweets, {.Size > 280})\n```\n\n### one(array, predicate) {#one}\n\nReturns **true** if _exactly one_ element satisfies the [predicate](#predicate).\nIf the array is empty, returns **false**.\n\n```expr\none(participants, {.Winner})\n```\n\n### none(array, predicate) {#none}\n\nReturns **true** if _all elements does not_ satisfy the [predicate](#predicate).\nIf the array is empty, returns **true**.\n\n```expr\nnone(tweets, {.Size > 280})\n```\n\n### map(array, predicate) {#map}\n\nReturns new array by applying the [predicate](#predicate) to each element of\nthe array.\n\n```expr\nmap(tweets, {.Size})\n```\n\n### filter(array, predicate) {#filter}\n\nReturns new array by filtering elements of the array by [predicate](#predicate).\n\n```expr\nfilter(users, .Name startsWith \"J\")\n```\n\n### find(array, predicate) {#find}\n\nFinds the first element in an array that satisfies the [predicate](#predicate).\n\n```expr\nfind([1, 2, 3, 4], # > 2) == 3\n```\n\n### findIndex(array, predicate) {#findIndex}\n\nFinds the index of the first element in an array that satisfies the [predicate](#predicate).\n\n```expr\nfindIndex([1, 2, 3, 4], # > 2) == 2\n```\n\n### findLast(array, predicate) {#findLast}\n\nFinds the last element in an array that satisfies the [predicate](#predicate).\n\n```expr\nfindLast([1, 2, 3, 4], # > 2) == 4\n```\n\n### findLastIndex(array, predicate) {#findLastIndex}\n\nFinds the index of the last element in an array that satisfies the [predicate](#predicate).\n\n```expr\nfindLastIndex([1, 2, 3, 4], # > 2) == 3\n```\n\n### groupBy(array, predicate) {#groupBy}\n\nGroups the elements of an array by the result of the [predicate](#predicate).\n\n```expr\ngroupBy(users, .Age)\n```\n\n### count(array[, predicate]) {#count}\n\nReturns the number of elements what satisfies the [predicate](#predicate).\n\n```expr\ncount(users, .Age > 18)\n```\n\nEquivalent to:\n\n```expr\nlen(filter(users, .Age > 18))\n```\n\nIf the predicate is not given, returns the number of `true` elements in the array.\n\n```expr\ncount([true, false, true]) == 2\n```\n\n### concat(array1, array2[, ...]) {#concat}\n\nConcatenates two or more arrays.\n\n```expr\nconcat([1, 2], [3, 4]) == [1, 2, 3, 4]\n```\n\n### flatten(array) {#flatten}\n\nFlattens given array into one-dimensional array.\n\n```expr\nflatten([1, 2, [3, 4]]) == [1, 2, 3, 4]\n```\n\n### uniq(array) {#uniq}\n\nRemoves duplicates from an array.\n\n```expr\nuniq([1, 2, 3, 2, 1]) == [1, 2, 3]\n```\n\n### join(array[, delimiter]) {#join}\n\nJoins an array of strings into a single string with the given delimiter.\nIf no delimiter is given, an empty string is used.\n\n```expr\njoin([\"apple\", \"orange\", \"grape\"], \",\") == \"apple,orange,grape\"\njoin([\"apple\", \"orange\", \"grape\"]) == \"appleorangegrape\"\n```\n\n### reduce(array, predicate[, initialValue]) {#reduce}\n\nApplies a predicate to each element in the array, reducing the array to a single value.\nOptional `initialValue` argument can be used to specify the initial value of the accumulator.\nIf `initialValue` is not given, the first element of the array is used as the initial value.\n\nFollowing variables are available in the predicate:\n\n- `#` - the current element\n- `#acc` - the accumulator\n- `#index` - the index of the current element\n\n```expr\nreduce(1..9, #acc + #)\nreduce(1..9, #acc + #, 0)\n```\n\n### sum(array[, predicate]) {#sum}\n\nReturns the sum of all numbers in the array.\n\n```expr\nsum([1, 2, 3]) == 6\n```\n\nIf the optional `predicate` argument is given, it is a predicate that is applied on each element\nof the array before summing.\n\n```expr\nsum(accounts, .Balance)\n```\n\nEquivalent to:\n\n```expr\nreduce(accounts, #acc + .Balance, 0)\n// or\nsum(map(accounts, .Balance))\n```\n\n### mean(array) {#mean}\n\nReturns the average of all numbers in the array.\n\n```expr\nmean([1, 2, 3]) == 2.0\n```\n\n### median(array) {#median}\n\nReturns the median of all numbers in the array.\n\n```expr\nmedian([1, 2, 3]) == 2.0\n```\n\n### first(array) {#first}\n\nReturns the first element from an array. If the array is empty, returns `nil`.\n\n```expr\nfirst([1, 2, 3]) == 1\n```\n\n### last(array) {#last}\n\nReturns the last element from an array. If the array is empty, returns `nil`.\n\n```expr\nlast([1, 2, 3]) == 3\n```\n\n### take(array, n) {#take}\n\nReturns the first `n` elements from an array. If the array has fewer than `n` elements, returns the whole array.\n\n```expr\ntake([1, 2, 3, 4], 2) == [1, 2]\n```\n\n### reverse(array) {#reverse}\n\nReturn new reversed copy of the array.\n\n```expr\nreverse([3, 1, 4]) == [4, 1, 3]\nreverse(reverse([3, 1, 4])) == [3, 1, 4]\n```\n\n### sort(array[, order]) {#sort}\n\nSorts an array in ascending order. Optional `order` argument can be used to specify the order of sorting: `asc`\nor `desc`.\n\n```expr\nsort([3, 1, 4]) == [1, 3, 4]\nsort([3, 1, 4], \"desc\") == [4, 3, 1]\n```\n\n### sortBy(array[, predicate, order]) {#sortBy}\n\nSorts an array by the result of the [predicate](#predicate). Optional `order` argument can be used to specify the order\nof sorting: `asc` or `desc`.\n\n```expr\nsortBy(users, .Age)\nsortBy(users, .Age, \"desc\")\n```\n\n## Map Functions\n\n### keys(map) {#keys}\n\nReturns an array containing the keys of the map.\n\n```expr\nkeys({\"name\": \"John\", \"age\": 30}) == [\"name\", \"age\"]\n```\n\n### values(map) {#values}\n\nReturns an array containing the values of the map.\n\n```expr\nvalues({\"name\": \"John\", \"age\": 30}) == [\"John\", 30]\n```\n\n## Type Conversion Functions\n\n### type(v) {#type}\n\nReturns the type of the given value `v`.\n\nReturns on of the following types:\n\n- `nil`\n- `bool`\n- `int`\n- `uint`\n- `float`\n- `string`\n- `array`\n- `map`.\n\nFor named types and structs, the type name is returned.\n\n```expr\ntype(42) == \"int\"\ntype(\"hello\") == \"string\"\ntype(now()) == \"time.Time\"\n```\n\n### int(v) {#int}\n\nReturns the integer value of a number or a string.\n\n```expr\nint(\"123\") == 123\n```\n\n### float(v) {#float}\n\nReturns the float value of a number or a string.\n\n```expr\nfloat(\"123.45\") == 123.45\n```\n\n### string(v) {#string}\n\nConverts the given value `v` into a string representation.\n\n```expr\nstring(123) == \"123\"\n```\n\n### toJSON(v) {#toJSON}\n\nConverts the given value `v` to its JSON string representation.\n\n```expr\ntoJSON({\"name\": \"John\", \"age\": 30})\n```\n\n### fromJSON(v) {#fromJSON}\n\nParses the given JSON string `v` and returns the corresponding value.\n\n```expr\nfromJSON('{\"name\": \"John\", \"age\": 30}')\n```\n\n### toBase64(v) {#toBase64}\n\nEncodes the string `v` into Base64 format.\n\n```expr\ntoBase64(\"Hello World\") == \"SGVsbG8gV29ybGQ=\"\n```\n\n### fromBase64(v) {#fromBase64}\n\nDecodes the Base64 encoded string `v` back to its original form.\n\n```expr\nfromBase64(\"SGVsbG8gV29ybGQ=\") == \"Hello World\"\n```\n\n### toPairs(map) {#toPairs}\n\nConverts a map to an array of key-value pairs.\n\n```expr\ntoPairs({\"name\": \"John\", \"age\": 30}) == [[\"name\", \"John\"], [\"age\", 30]]\n```\n\n### fromPairs(array) {#fromPairs}\n\nConverts an array of key-value pairs to a map.\n\n```expr\nfromPairs([[\"name\", \"John\"], [\"age\", 30]]) == {\"name\": \"John\", \"age\": 30}\n```\n\n## Miscellaneous Functions\n\n### len(v) {#len}\n\nReturns the length of an array, a map or a string.\n\n```expr\nlen([1, 2, 3]) == 3\nlen({\"name\": \"John\", \"age\": 30}) == 2\nlen(\"Hello\") == 5\n```\n\n### get(v, index) {#get}\n\nRetrieves the element at the specified index from an array or map `v`. If the index is out of range, returns `nil`.\nOr the key does not exist, returns `nil`.\n\n```expr\nget([1, 2, 3], 1) == 2\nget({\"name\": \"John\", \"age\": 30}, \"name\") == \"John\"\n```\n\n## Bitwise Functions\n\n### bitand(int, int) {#bitand}\n\nReturns the values resulting from the bitwise AND operation.\n\n```expr\nbitand(0b1010, 0b1100) == 0b1000\n```\n\n### bitor(int, int) {#bitor}\n\nReturns the values resulting from the bitwise OR operation.\n\n```expr\nbitor(0b1010, 0b1100) == 0b1110\n```\n\n### bitxor(int, int) {#bitxor}\n\nReturns the values resulting from the bitwise XOR operation.\n\n```expr\nbitxor(0b1010, 0b1100) == 0b110\n```\n\n### bitnand(int, int) {#bitnand}\n\nReturns the values resulting from the bitwise AND NOT operation.\n\n```expr\nbitnand(0b1010, 0b1100) == 0b10\n```\n\n### bitnot(int) {#bitnot}\n\nReturns the values resulting from the bitwise NOT operation.\n\n```expr\nbitnot(0b1010) == -0b1011\n```\n\n### bitshl(int, int) {#bitshl}\n\nReturns the values resulting from the Left Shift operation.\n\n```expr\nbitshl(0b101101, 2) == 0b10110100\n```\n\n### bitshr(int, int) {#bitshr}\n\nReturns the values resulting from the Right Shift operation.\n\n```expr\nbitshr(0b101101, 2) == 0b1011\n```\n\n### bitushr(int, int) {#bitushr}\n\nReturns the values resulting from the unsigned Right Shift operation.\n\n```expr\nbitushr(-0b101, 2) == 4611686018427387902\n```\n"
  },
  {
    "path": "docs/patch.md",
    "content": "# Patch\n\nSometimes it may be necessary to modify an expression before the compilation.\nFor example, you may want to replace a variable with a constant, transform an expression into a function call, \nor even modify the expression to use a different operator.\n\n## Simple example\n\nLet's start with a simple example. We have an expression that uses a variable `foo`:\n\n```go\nprogram, err := expr.Compile(`foo + bar`)\n```\n\nWe want to replace the `foo` variable with a constant `42`. First, we need to implement a [visitor](./visitor.md):\n\n```go\ntype FooPatcher struct{}\n\nfunc (FooPatcher) Visit(node *ast.Node) {\n    if n, ok := (*node).(*ast.IdentifierNode); ok && n.Value == \"foo\" {\n        // highlight-next-line\n        ast.Patch(node, &ast.IntegerNode{Value: 42})\n    }\n}\n```\n\nWe used the [ast.Patch](https://pkg.go.dev/github.com/expr-lang/expr/ast#Patch) function to replace the `foo` variable with an integer node.\n\nNow we can use the `FooPatcher` to modify the expression on compilation via the [expr.Patch](https://pkg.go.dev/github.com/expr-lang/expr#Patch) option:\n\n```go\nprogram, err := expr.Compile(`foo + bar`, expr.Patch(FooPatcher{}))\n```\n\n## Advanced example\n\nLet's consider a more complex example. We have an expression that uses variables `foo` and `bar` of type `Decimal`:\n\n```go\ntype Decimal struct {\n    Value int\n}\n```\n\nAnd we want to transform the following expression:\n\n```expr\na + b + c\n```\n\nInto functions calls that accept `Decimal` arguments:\n\n```expr\nadd(add(a, b), c)\n```\n\nFirst, we need to implement a visitor that will transform the expression:\n\n```go\ntype DecimalPatcher struct{}\n\nvar decimalType = reflect.TypeOf(Decimal{})\n\nfunc (DecimalPatcher) Visit(node *ast.Node) {\n    if n, ok := (*node).(*ast.BinaryNode); ok && n.Operator == \"+\" {\n        \n        if !n.Left.Type().AssignableTo(decimalType) {\n            return // skip, left side is not a Decimal\n        }\n\t\t\n        if !n.Right.Type().AssignableTo(decimalType) {\n            return // skip, right side is not a Decimal\n        }\n\t\t\n        // highlight-start\n        callNode := &ast.CallNode{\n            Callee:    &ast.IdentifierNode{Value: \"add\"},\n            Arguments: []ast.Node{n.Left, n.Right},\n        }\n        ast.Patch(node, callNode)\n        // highlight-end\n\t\t\n        (*node).SetType(decimalType) // set the type, so the patcher can be applied recursively\n    }\n}\n```\n\nWe used [Type()](https://pkg.go.dev/github.com/expr-lang/expr/ast#Node.Type) method to get the type of the expression node.\nThe `AssignableTo` method is used to check if the type is `Decimal`. If both sides are `Decimal`, we replace the expression with a function call.\n\nThe important part of this patcher is to set correct types for the nodes. As we constructed a new `CallNode`, it lacks the type information.\nSo after the first patcher run, if we want the patcher to be applied recursively, we need to set the type of the node.\n\n\nNow we can use the `DecimalPatcher` to modify the expression:\n\n```go\nenv := map[string]interface{}{\n    \"a\": Decimal{1},\n    \"b\": Decimal{2},\n    \"c\": Decimal{3},\n    \"add\": func(x, y Decimal) Decimal {\n        return Decimal{x.Value + y.Value}\n    },\n}\n\ncode := `a + b + c`\n\n// highlight-next-line\nprogram, err := expr.Compile(code, expr.Env(env), expr.Patch(DecimalPatcher{}))\nif err != nil {\n    panic(err)\n}\n\noutput, err := expr.Run(program, env)\nif err != nil {\n    panic(err)\n}\n\nfmt.Println(output) // Decimal{6}\n```\n\n\n:::info\nExpr comes with already implemented patcher that simplifies operator overloading.\n\nThe `DecimalPatcher` can be replaced with the [Operator](https://pkg.go.dev/github.com/expr-lang/expr#Operator) option.\n\n```go\nprogram, err := expr.Compile(code, expr.Env(env), expr.Operator(\"+\", \"add\"))\n```\n\nOperator overloading patcher will check if provided functions (`\"add\"`) satisfy the operator (`\"+\"`), and\nreplace the operator with the function call.\n:::\n"
  },
  {
    "path": "docs/visitor.md",
    "content": "# Visitor\n\nExpr provides an interface to traverse the <span title=\"Abstract Syntax Tree\" style={{borderBottom: \"1px dotted currentColor\"}}>AST</span> of the expression before the compilation.\nThe `Visitor` interface allows you to collect information about the expression, modify the expression, or even generate\na new expression.\n\nLet's start with an [ast.Visitor](https://pkg.go.dev/github.com/expr-lang/expr/ast#Visitor) implementation which will \ncollect all variables used in the expression.\n\nVisitor must implement a single method `Visit(*ast.Node)`, which will be called for each node in the AST.\n\n```go\ntype Visitor struct {\n    Identifiers []string\n}\n\nfunc (v *Visitor) Visit(node *ast.Node) {\n    if n, ok := (*node).(*ast.IdentifierNode); ok {\n        v.Identifiers = append(v.Identifiers, n.Value)\n    }\n}\n```\n\nFull list of available AST nodes can be found in the [ast](https://pkg.go.dev/github.com/expr-lang/expr/ast) documentation.\n\nLet's parse the expression and use [ast.Walk](https://pkg.go.dev/github.com/expr-lang/expr/ast#Walk) to traverse the AST:\n\n```go\ntree, err := parser.Parse(`foo + bar`)\nif err != nil {\n    panic(err)\n}\n\nv := &Visitor{}\n// highlight-next-line\nast.Walk(&tree.Node, v)\n\nfmt.Println(v.Identifiers) // [foo, bar]\n```\n\n:::note\n\nAlthough it is possible to access the AST of compiled program, it may be already be modified by patchers, optimizers, etc.\n\n```go\nprogram, err := expr.Compile(`foo + bar`)\nif err != nil {\n    panic(err)\n}\n\n// highlight-next-line\nnode := program.Node()\n\nv := &Visitor{}\nast.Walk(&node, v)\n```\n\n:::\n"
  },
  {
    "path": "expr.go",
    "content": "package expr\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/builtin\"\n\t\"github.com/expr-lang/expr/checker\"\n\t\"github.com/expr-lang/expr/compiler\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/file\"\n\t\"github.com/expr-lang/expr/optimizer\"\n\t\"github.com/expr-lang/expr/parser\"\n\t\"github.com/expr-lang/expr/patcher\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\n// Option for configuring config.\ntype Option func(c *conf.Config)\n\n// Env specifies expected input of env for type checks.\n// If struct is passed, all fields will be treated as variables,\n// as well as all fields of embedded structs and struct itself.\n// If map is passed, all items will be treated as variables.\n// Methods defined on this type will be available as functions.\nfunc Env(env any) Option {\n\treturn func(c *conf.Config) {\n\t\tc.WithEnv(env)\n\t}\n}\n\n// AllowUndefinedVariables allows to use undefined variables inside expressions.\n// This can be used with expr.Env option to partially define a few variables.\nfunc AllowUndefinedVariables() Option {\n\treturn func(c *conf.Config) {\n\t\tc.Strict = false\n\t}\n}\n\n// Operator allows to replace a binary operator with a function.\nfunc Operator(operator string, fn ...string) Option {\n\treturn func(c *conf.Config) {\n\t\tp := &patcher.OperatorOverloading{\n\t\t\tOperator:  operator,\n\t\t\tOverloads: fn,\n\t\t\tEnv:       &c.Env,\n\t\t\tFunctions: c.Functions,\n\t\t\tNtCache:   &c.NtCache,\n\t\t}\n\t\tc.Visitors = append(c.Visitors, p)\n\t}\n}\n\n// ConstExpr defines func expression as constant. If all argument to this function is constants,\n// then it can be replaced by result of this func call on compile step.\nfunc ConstExpr(fn string) Option {\n\treturn func(c *conf.Config) {\n\t\tc.ConstExpr(fn)\n\t}\n}\n\n// AsAny tells the compiler to expect any result.\nfunc AsAny() Option {\n\treturn func(c *conf.Config) {\n\t\tc.ExpectAny = true\n\t}\n}\n\n// AsKind tells the compiler to expect kind of the result.\nfunc AsKind(kind reflect.Kind) Option {\n\treturn func(c *conf.Config) {\n\t\tc.Expect = kind\n\t\tc.ExpectAny = true\n\t}\n}\n\n// AsBool tells the compiler to expect a boolean result.\nfunc AsBool() Option {\n\treturn func(c *conf.Config) {\n\t\tc.Expect = reflect.Bool\n\t\tc.ExpectAny = true\n\t}\n}\n\n// AsInt tells the compiler to expect an int result.\nfunc AsInt() Option {\n\treturn func(c *conf.Config) {\n\t\tc.Expect = reflect.Int\n\t\tc.ExpectAny = true\n\t}\n}\n\n// AsInt64 tells the compiler to expect an int64 result.\nfunc AsInt64() Option {\n\treturn func(c *conf.Config) {\n\t\tc.Expect = reflect.Int64\n\t\tc.ExpectAny = true\n\t}\n}\n\n// AsFloat64 tells the compiler to expect a float64 result.\nfunc AsFloat64() Option {\n\treturn func(c *conf.Config) {\n\t\tc.Expect = reflect.Float64\n\t\tc.ExpectAny = true\n\t}\n}\n\n// DisableIfOperator disables the `if ... else ...` operator syntax so a custom\n// function named `if(...)` can be used without conflicts.\nfunc DisableIfOperator() Option {\n\treturn func(c *conf.Config) {\n\t\tc.DisableIfOperator = true\n\t}\n}\n\n// WarnOnAny tells the compiler to warn if expression return any type.\nfunc WarnOnAny() Option {\n\treturn func(c *conf.Config) {\n\t\tif c.Expect == reflect.Invalid {\n\t\t\tpanic(\"WarnOnAny() works only with combination with AsInt(), AsBool(), etc. options\")\n\t\t}\n\t\tc.ExpectAny = false\n\t}\n}\n\n// Optimize turns optimizations on or off.\nfunc Optimize(b bool) Option {\n\treturn func(c *conf.Config) {\n\t\tc.Optimize = b\n\t}\n}\n\n// DisableShortCircuit turns short circuit off.\nfunc DisableShortCircuit() Option {\n\treturn func(c *conf.Config) {\n\t\tc.ShortCircuit = false\n\t}\n}\n\n// Patch adds visitor to list of visitors what will be applied before compiling AST to bytecode.\nfunc Patch(visitor ast.Visitor) Option {\n\treturn func(c *conf.Config) {\n\t\tc.Visitors = append(c.Visitors, visitor)\n\t}\n}\n\n// Function adds function to list of functions what will be available in expressions.\nfunc Function(name string, fn func(params ...any) (any, error), types ...any) Option {\n\treturn func(c *conf.Config) {\n\t\tts := make([]reflect.Type, len(types))\n\t\tfor i, t := range types {\n\t\t\tt := reflect.TypeOf(t)\n\t\t\tif t.Kind() == reflect.Ptr {\n\t\t\t\tt = t.Elem()\n\t\t\t}\n\t\t\tif t.Kind() != reflect.Func {\n\t\t\t\tpanic(fmt.Sprintf(\"expr: type of %s is not a function\", name))\n\t\t\t}\n\t\t\tts[i] = t\n\t\t}\n\t\tc.Functions[name] = &builtin.Function{\n\t\t\tName:  name,\n\t\t\tFunc:  fn,\n\t\t\tTypes: ts,\n\t\t}\n\t}\n}\n\n// DisableAllBuiltins disables all builtins.\nfunc DisableAllBuiltins() Option {\n\treturn func(c *conf.Config) {\n\t\tfor name := range c.Builtins {\n\t\t\tc.Disabled[name] = true\n\t\t}\n\t}\n}\n\n// DisableBuiltin disables builtin function.\nfunc DisableBuiltin(name string) Option {\n\treturn func(c *conf.Config) {\n\t\tc.Disabled[name] = true\n\t}\n}\n\n// EnableBuiltin enables builtin function.\nfunc EnableBuiltin(name string) Option {\n\treturn func(c *conf.Config) {\n\t\tdelete(c.Disabled, name)\n\t}\n}\n\n// WithContext passes context to all functions calls with a context.Context argument.\nfunc WithContext(name string) Option {\n\treturn func(c *conf.Config) {\n\t\tc.Visitors = append(c.Visitors, patcher.WithContext{\n\t\t\tName:      name,\n\t\t\tFunctions: c.Functions,\n\t\t\tEnv:       &c.Env,\n\t\t\tNtCache:   &c.NtCache,\n\t\t})\n\t}\n}\n\n// Timezone sets default timezone for date() and now() builtin functions.\nfunc Timezone(name string) Option {\n\ttz, err := time.LoadLocation(name)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn Patch(patcher.WithTimezone{\n\t\tLocation: tz,\n\t})\n}\n\n// MaxNodes sets the maximum number of nodes allowed in the expression.\n// By default, the maximum number of nodes is conf.DefaultMaxNodes.\n// If MaxNodes is set to 0, the node budget check is disabled.\nfunc MaxNodes(n uint) Option {\n\treturn func(c *conf.Config) {\n\t\tc.MaxNodes = n\n\t}\n}\n\n// Compile parses and compiles given input expression to bytecode program.\nfunc Compile(input string, ops ...Option) (*vm.Program, error) {\n\tconfig := conf.CreateNew()\n\tfor _, op := range ops {\n\t\top(config)\n\t}\n\tfor name := range config.Disabled {\n\t\tdelete(config.Builtins, name)\n\t}\n\tconfig.Check()\n\n\ttree, err := checker.ParseCheck(input, config)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif config.Optimize {\n\t\terr = optimizer.Optimize(&tree.Node, config)\n\t\tif err != nil {\n\t\t\tvar fileError *file.Error\n\t\t\tif errors.As(err, &fileError) {\n\t\t\t\treturn nil, fileError.Bind(tree.Source)\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tprogram, err := compiler.Compile(tree, config)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn program, nil\n}\n\n// Run evaluates given bytecode program.\nfunc Run(program *vm.Program, env any) (any, error) {\n\treturn vm.Run(program, env)\n}\n\n// Eval parses, compiles and runs given input.\nfunc Eval(input string, env any) (any, error) {\n\tif _, ok := env.(Option); ok {\n\t\treturn nil, fmt.Errorf(\"misused expr.Eval: second argument (env) should be passed without expr.Env\")\n\t}\n\n\ttree, err := parser.Parse(input)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tprogram, err := compiler.Compile(tree, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\toutput, err := Run(program, env)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn output, nil\n}\n"
  },
  {
    "path": "expr_test.go",
    "content": "package expr_test\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\t\"github.com/expr-lang/expr/types\"\n\t\"github.com/expr-lang/expr/vm\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/file\"\n\t\"github.com/expr-lang/expr/test/mock\"\n)\n\nfunc ExampleEval() {\n\toutput, err := expr.Eval(\"greet + name\", map[string]any{\n\t\t\"greet\": \"Hello, \",\n\t\t\"name\":  \"world!\",\n\t})\n\tif err != nil {\n\t\tfmt.Printf(\"err: %v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\", output)\n\n\t// Output: Hello, world!\n}\n\nfunc ExampleEval_runtime_error() {\n\t_, err := expr.Eval(`map(1..3, {1 % (# - 3)})`, nil)\n\tfmt.Print(err)\n\n\t// Output: runtime error: integer divide by zero (1:14)\n\t//  | map(1..3, {1 % (# - 3)})\n\t//  | .............^\n}\n\nfunc ExampleCompile() {\n\tenv := map[string]any{\n\t\t\"foo\": 1,\n\t\t\"bar\": 99,\n\t}\n\n\tprogram, err := expr.Compile(\"foo in 1..99 and bar in 1..99\", expr.Env(env))\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\", output)\n\n\t// Output: true\n}\n\nfunc ExampleEval_bytes_literal() {\n\t// Bytes literal returns []byte.\n\toutput, err := expr.Eval(`b\"abc\"`, nil)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\", output)\n\n\t// Output: [97 98 99]\n}\n\nfunc TestDisableIfOperator_AllowsIfFunction(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"if\": func(x int) int { return x + 1 },\n\t}\n\tprogram, err := expr.Compile(\"if(41)\", expr.Env(env), expr.DisableIfOperator())\n\trequire.NoError(t, err)\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\tassert.Equal(t, 42, out)\n}\n\nfunc ExampleEnv() {\n\ttype Segment struct {\n\t\tOrigin string\n\t}\n\ttype Passengers struct {\n\t\tAdults int\n\t}\n\ttype Meta struct {\n\t\tTags map[string]string\n\t}\n\ttype Env struct {\n\t\tMeta\n\t\tSegments   []*Segment\n\t\tPassengers *Passengers\n\t\tMarker     string\n\t}\n\n\tcode := `all(Segments, {.Origin == \"MOW\"}) && Passengers.Adults > 0 && Tags[\"foo\"] startsWith \"bar\"`\n\n\tprogram, err := expr.Compile(code, expr.Env(Env{}))\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tenv := Env{\n\t\tMeta: Meta{\n\t\t\tTags: map[string]string{\n\t\t\t\t\"foo\": \"bar\",\n\t\t\t},\n\t\t},\n\t\tSegments: []*Segment{\n\t\t\t{Origin: \"MOW\"},\n\t\t},\n\t\tPassengers: &Passengers{\n\t\t\tAdults: 2,\n\t\t},\n\t\tMarker: \"test\",\n\t}\n\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\", output)\n\n\t// Output: true\n}\n\nfunc ExampleEnv_tagged_field_names() {\n\tenv := struct {\n\t\tFirstWord  string\n\t\tSeparator  string `expr:\"Space\"`\n\t\tSecondWord string `expr:\"second_word\"`\n\t}{\n\t\tFirstWord:  \"Hello\",\n\t\tSeparator:  \" \",\n\t\tSecondWord: \"World\",\n\t}\n\n\toutput, err := expr.Eval(`FirstWord + Space + second_word`, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\", output)\n\n\t// Output: Hello World\n}\n\nfunc ExampleEnv_hidden_tagged_field_names() {\n\ttype Internal struct {\n\t\tVisible string\n\t\tHidden  string `expr:\"-\"`\n\t}\n\ttype environment struct {\n\t\tVisible         string\n\t\tHidden          string   `expr:\"-\"`\n\t\tHiddenInternal  Internal `expr:\"-\"`\n\t\tVisibleInternal Internal\n\t}\n\n\tenv := environment{\n\t\tHidden: \"First level secret\",\n\t\tHiddenInternal: Internal{\n\t\t\tVisible: \"Second level secret\",\n\t\t\tHidden:  \"Also hidden\",\n\t\t},\n\t\tVisibleInternal: Internal{\n\t\t\tVisible: \"Not a secret\",\n\t\t\tHidden:  \"Hidden too\",\n\t\t},\n\t}\n\n\thiddenValues := []string{\n\t\t`Hidden`,\n\t\t`HiddenInternal`,\n\t\t`HiddenInternal.Visible`,\n\t\t`HiddenInternal.Hidden`,\n\t\t`VisibleInternal[\"Hidden\"]`,\n\t}\n\tfor _, expression := range hiddenValues {\n\t\toutput, err := expr.Eval(expression, env)\n\t\tif err == nil || !strings.Contains(err.Error(), \"cannot fetch\") {\n\t\t\tfmt.Printf(\"unexpected output: %v; err: %v\\n\", output, err)\n\t\t\treturn\n\t\t}\n\t\tfmt.Printf(\"%q is hidden as expected\\n\", expression)\n\t}\n\n\tvisibleValues := []string{\n\t\t`Visible`,\n\t\t`VisibleInternal`,\n\t\t`VisibleInternal[\"Visible\"]`,\n\t}\n\tfor _, expression := range visibleValues {\n\t\t_, err := expr.Eval(expression, env)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"unexpected error: %v\\n\", err)\n\t\t\treturn\n\t\t}\n\t\tfmt.Printf(\"%q is visible as expected\\n\", expression)\n\t}\n\n\ttestWithIn := []string{\n\t\t`not (\"Hidden\" in $env)`,\n\t\t`\"Visible\" in $env`,\n\t\t`not (\"Hidden\" in VisibleInternal)`,\n\t\t`\"Visible\" in VisibleInternal`,\n\t}\n\tfor _, expression := range testWithIn {\n\t\tval, err := expr.Eval(expression, env)\n\t\tshouldBeTrue, ok := val.(bool)\n\t\tif err != nil || !ok || !shouldBeTrue {\n\t\t\tfmt.Printf(\"unexpected result; value: %v; error: %v\\n\", val, err)\n\t\t\treturn\n\t\t}\n\t}\n\n\t// Output: \"Hidden\" is hidden as expected\n\t// \"HiddenInternal\" is hidden as expected\n\t// \"HiddenInternal.Visible\" is hidden as expected\n\t// \"HiddenInternal.Hidden\" is hidden as expected\n\t// \"VisibleInternal[\\\"Hidden\\\"]\" is hidden as expected\n\t// \"Visible\" is visible as expected\n\t// \"VisibleInternal\" is visible as expected\n\t// \"VisibleInternal[\\\"Visible\\\"]\" is visible as expected\n}\n\nfunc ExampleAsKind() {\n\tprogram, err := expr.Compile(\"{a: 1, b: 2}\", expr.AsKind(reflect.Map))\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\toutput, err := expr.Run(program, nil)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\", output)\n\n\t// Output: map[a:1 b:2]\n}\n\nfunc ExampleAsBool() {\n\tenv := map[string]int{\n\t\t\"foo\": 0,\n\t}\n\n\tprogram, err := expr.Compile(\"foo >= 0\", expr.Env(env), expr.AsBool())\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\", output.(bool))\n\n\t// Output: true\n}\n\nfunc ExampleAsBool_error() {\n\tenv := map[string]any{\n\t\t\"foo\": 0,\n\t}\n\n\t_, err := expr.Compile(\"foo + 42\", expr.Env(env), expr.AsBool())\n\n\tfmt.Printf(\"%v\", err)\n\n\t// Output: expected bool, but got int\n}\n\nfunc ExampleAsInt() {\n\tprogram, err := expr.Compile(\"42\", expr.AsInt())\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\toutput, err := expr.Run(program, nil)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%T(%v)\", output, output)\n\n\t// Output: int(42)\n}\n\nfunc ExampleAsInt64() {\n\tenv := map[string]any{\n\t\t\"rating\": 5.5,\n\t}\n\n\tprogram, err := expr.Compile(\"rating\", expr.Env(env), expr.AsInt64())\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\", output.(int64))\n\n\t// Output: 5\n}\n\nfunc ExampleAsFloat64() {\n\tprogram, err := expr.Compile(\"42\", expr.AsFloat64())\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\toutput, err := expr.Run(program, nil)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\", output.(float64))\n\n\t// Output: 42\n}\n\nfunc ExampleAsFloat64_error() {\n\t_, err := expr.Compile(`!!true`, expr.AsFloat64())\n\n\tfmt.Printf(\"%v\", err)\n\n\t// Output: expected float64, but got bool\n}\n\nfunc ExampleWarnOnAny() {\n\t// Arrays always have []any type. The expression return type is any.\n\t// AsInt() instructs compiler to expect int or any, and cast to int,\n\t// if possible. WarnOnAny() instructs to return an error on any type.\n\t_, err := expr.Compile(`[42, true, \"yes\"][0]`, expr.AsInt(), expr.WarnOnAny())\n\n\tfmt.Printf(\"%v\", err)\n\n\t// Output: expected int, but got interface {}\n}\n\nfunc ExampleOperator() {\n\tcode := `\n\t\tNow() > CreatedAt &&\n\t\t(Now() - CreatedAt).Hours() > 24\n\t`\n\n\ttype Env struct {\n\t\tCreatedAt time.Time\n\t\tNow       func() time.Time\n\t\tSub       func(a, b time.Time) time.Duration\n\t\tAfter     func(a, b time.Time) bool\n\t}\n\n\toptions := []expr.Option{\n\t\texpr.Env(Env{}),\n\t\texpr.Operator(\">\", \"After\"),\n\t\texpr.Operator(\"-\", \"Sub\"),\n\t}\n\n\tprogram, err := expr.Compile(code, options...)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tenv := Env{\n\t\tCreatedAt: time.Date(2018, 7, 14, 0, 0, 0, 0, time.UTC),\n\t\tNow:       func() time.Time { return time.Now() },\n\t\tSub:       func(a, b time.Time) time.Duration { return a.Sub(b) },\n\t\tAfter:     func(a, b time.Time) bool { return a.After(b) },\n\t}\n\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\", output)\n\n\t// Output: true\n}\n\nfunc ExampleOperator_with_decimal() {\n\ttype Decimal struct{ N float64 }\n\tcode := `A + B - C`\n\n\ttype Env struct {\n\t\tA, B, C Decimal\n\t\tSub     func(a, b Decimal) Decimal\n\t\tAdd     func(a, b Decimal) Decimal\n\t}\n\n\toptions := []expr.Option{\n\t\texpr.Env(Env{}),\n\t\texpr.Operator(\"+\", \"Add\"),\n\t\texpr.Operator(\"-\", \"Sub\"),\n\t}\n\n\tprogram, err := expr.Compile(code, options...)\n\tif err != nil {\n\t\tfmt.Printf(\"Compile error: %v\", err)\n\t\treturn\n\t}\n\n\tenv := Env{\n\t\tA:   Decimal{3},\n\t\tB:   Decimal{2},\n\t\tC:   Decimal{1},\n\t\tSub: func(a, b Decimal) Decimal { return Decimal{a.N - b.N} },\n\t\tAdd: func(a, b Decimal) Decimal { return Decimal{a.N + b.N} },\n\t}\n\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\", output)\n\n\t// Output: {4}\n}\n\nfunc fib(n int) int {\n\tif n <= 1 {\n\t\treturn n\n\t}\n\treturn fib(n-1) + fib(n-2)\n}\n\nfunc ExampleConstExpr() {\n\tcode := `[fib(5), fib(3+3), fib(dyn)]`\n\n\tenv := map[string]any{\n\t\t\"fib\": fib,\n\t\t\"dyn\": 0,\n\t}\n\n\toptions := []expr.Option{\n\t\texpr.Env(env),\n\t\texpr.ConstExpr(\"fib\"), // Mark fib func as constant expression.\n\t}\n\n\tprogram, err := expr.Compile(code, options...)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\t// Only fib(5) and fib(6) calculated on Compile, fib(dyn) can be called at runtime.\n\tenv[\"dyn\"] = 7\n\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\\n\", output)\n\n\t// Output: [5 8 13]\n}\n\nfunc ExampleAllowUndefinedVariables() {\n\tcode := `name == nil ? \"Hello, world!\" : sprintf(\"Hello, %v!\", name)`\n\n\tenv := map[string]any{\n\t\t\"sprintf\": fmt.Sprintf,\n\t}\n\n\toptions := []expr.Option{\n\t\texpr.Env(env),\n\t\texpr.AllowUndefinedVariables(), // Allow to use undefined variables.\n\t}\n\n\tprogram, err := expr.Compile(code, options...)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"%v\\n\", output)\n\n\tenv[\"name\"] = \"you\" // Define variables later on.\n\n\toutput, err = expr.Run(program, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"%v\\n\", output)\n\n\t// Output: Hello, world!\n\t// Hello, you!\n}\n\nfunc ExampleAllowUndefinedVariables_zero_value() {\n\tcode := `name == \"\" ? foo + bar : foo + name`\n\n\t// If environment has different zero values, then undefined variables\n\t// will have it as default value.\n\tenv := map[string]string{}\n\n\toptions := []expr.Option{\n\t\texpr.Env(env),\n\t\texpr.AllowUndefinedVariables(), // Allow to use undefined variables.\n\t}\n\n\tprogram, err := expr.Compile(code, options...)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tenv = map[string]string{\n\t\t\"foo\": \"Hello, \",\n\t\t\"bar\": \"world!\",\n\t}\n\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"%v\", output)\n\n\t// Output: Hello, world!\n}\n\nfunc ExampleAllowUndefinedVariables_zero_value_functions() {\n\tcode := `words == \"\" ? Split(\"foo,bar\", \",\") : Split(words, \",\")`\n\n\t// Env is map[string]string type on which methods are defined.\n\tenv := mock.MapStringStringEnv{}\n\n\toptions := []expr.Option{\n\t\texpr.Env(env),\n\t\texpr.AllowUndefinedVariables(), // Allow to use undefined variables.\n\t}\n\n\tprogram, err := expr.Compile(code, options...)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"%v\", output)\n\n\t// Output: [foo bar]\n}\n\ntype patcher struct{}\n\nfunc (p *patcher) Visit(node *ast.Node) {\n\tswitch n := (*node).(type) {\n\tcase *ast.MemberNode:\n\t\tast.Patch(node, &ast.CallNode{\n\t\t\tCallee:    &ast.IdentifierNode{Value: \"get\"},\n\t\t\tArguments: []ast.Node{n.Node, n.Property},\n\t\t})\n\t}\n}\n\nfunc ExamplePatch() {\n\tprogram, err := expr.Compile(\n\t\t`greet.you.world + \"!\"`,\n\t\texpr.Patch(&patcher{}),\n\t)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tenv := map[string]any{\n\t\t\"greet\": \"Hello\",\n\t\t\"get\": func(a, b string) string {\n\t\t\treturn a + \", \" + b\n\t\t},\n\t}\n\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"%v\", output)\n\n\t// Output: Hello, you, world!\n}\n\nfunc ExampleWithContext() {\n\tenv := map[string]any{\n\t\t\"fn\": func(ctx context.Context, _, _ int) int {\n\t\t\t// An infinite loop that can be canceled by context.\n\t\t\tfor {\n\t\t\t\tselect {\n\t\t\t\tcase <-ctx.Done():\n\t\t\t\t\treturn 42\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"ctx\": context.TODO(), // Context should be passed as a variable.\n\t}\n\n\tprogram, err := expr.Compile(`fn(1, 2)`,\n\t\texpr.Env(env),\n\t\texpr.WithContext(\"ctx\"), // Pass context variable name.\n\t)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\t// Cancel context after 100 milliseconds.\n\tctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*100)\n\tdefer cancel()\n\n\t// After program is compiled, context can be passed to Run.\n\tenv[\"ctx\"] = ctx\n\n\t// Run will return 42 after 100 milliseconds.\n\toutput, err := expr.Run(program, env)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\", output)\n\t// Output: 42\n}\n\nfunc ExampleTimezone() {\n\tprogram, err := expr.Compile(`now().Location().String()`, expr.Timezone(\"Asia/Kamchatka\"))\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\toutput, err := expr.Run(program, nil)\n\tif err != nil {\n\t\tfmt.Printf(\"%v\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"%v\", output)\n\t// Output: Asia/Kamchatka\n}\n\nfunc TestExpr_readme_example(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"greet\":   \"Hello, %v!\",\n\t\t\"names\":   []string{\"world\", \"you\"},\n\t\t\"sprintf\": fmt.Sprintf,\n\t}\n\n\tcode := `sprintf(greet, names[0])`\n\n\tprogram, err := expr.Compile(code, expr.Env(env))\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\n\trequire.Equal(t, \"Hello, world!\", output)\n}\n\nfunc TestExpr(t *testing.T) {\n\tdate := time.Date(2017, time.October, 23, 18, 30, 0, 0, time.UTC)\n\toneDay, _ := time.ParseDuration(\"24h\")\n\ttimeNowPlusOneDay := date.Add(oneDay)\n\n\tenv := mock.Env{\n\t\tEmbed:     mock.Embed{},\n\t\tAmbiguous: \"\",\n\t\tAny:       nil,\n\t\tBool:      true,\n\t\tFloat:     0,\n\t\tInt64:     0,\n\t\tInt32:     0,\n\t\tInt:       0,\n\t\tOne:       1,\n\t\tTwo:       2,\n\t\tUint32:    0,\n\t\tString:    \"string\",\n\t\tBoolPtr:   nil,\n\t\tFloatPtr:  nil,\n\t\tIntPtr:    nil,\n\t\tIntPtrPtr: nil,\n\t\tStringPtr: nil,\n\t\tFoo: mock.Foo{\n\t\t\tValue: \"foo\",\n\t\t\tBar: mock.Bar{\n\t\t\t\tBaz: \"baz\",\n\t\t\t},\n\t\t},\n\t\tAbstract:           nil,\n\t\tArrayOfAny:         nil,\n\t\tArrayOfInt:         []int{1, 2, 3, 4, 5},\n\t\tArrayOfFoo:         []*mock.Foo{{Value: \"foo\"}, {Value: \"bar\"}, {Value: \"baz\"}},\n\t\tMapOfFoo:           nil,\n\t\tMapOfAny:           nil,\n\t\tFuncParam:          nil,\n\t\tFuncParamAny:       nil,\n\t\tFuncTooManyReturns: nil,\n\t\tFuncNamed:          nil,\n\t\tNilAny:             nil,\n\t\tNilFn:              nil,\n\t\tNilStruct:          nil,\n\t\tVariadic: func(head int, xs ...int) bool {\n\t\t\tsum := 0\n\t\t\tfor _, x := range xs {\n\t\t\t\tsum += x\n\t\t\t}\n\t\t\treturn head == sum\n\t\t},\n\t\tFast:        nil,\n\t\tTime:        date,\n\t\tTimePlusDay: timeNowPlusOneDay,\n\t\tDuration:    oneDay,\n\t}\n\n\ttests := []struct {\n\t\tcode string\n\t\twant any\n\t}{\n\t\t{\n\t\t\t`1`,\n\t\t\t1,\n\t\t},\n\t\t{\n\t\t\t`-.5`,\n\t\t\t-.5,\n\t\t},\n\t\t{\n\t\t\t`true && false || false`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`Int == 0 && Int32 == 0 && Int64 == 0 && Float64 == 0 && Bool && String == \"string\"`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`-Int64 == 0`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`\"a\" != \"b\"`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`\"a\" != \"b\" || 1 == 2`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Int + 0`,\n\t\t\t0,\n\t\t},\n\t\t{\n\t\t\t`Uint64 + 0`,\n\t\t\t0,\n\t\t},\n\t\t{\n\t\t\t`Uint64 + Int64`,\n\t\t\t0,\n\t\t},\n\t\t{\n\t\t\t`Int32 + Int64`,\n\t\t\t0,\n\t\t},\n\t\t{\n\t\t\t`Float64 + 0`,\n\t\t\tfloat64(0),\n\t\t},\n\t\t{\n\t\t\t`0 + Float64`,\n\t\t\tfloat64(0),\n\t\t},\n\t\t{\n\t\t\t`0 <= Float64`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Float64 < 1`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Int < 1`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`2 + 2 == 4`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`8 % 3`,\n\t\t\t2,\n\t\t},\n\t\t{\n\t\t\t`2 ** 8`,\n\t\t\tfloat64(256),\n\t\t},\n\t\t{\n\t\t\t`2 ^ 8`,\n\t\t\tfloat64(256),\n\t\t},\n\t\t{\n\t\t\t`-(2-5)**3-2/(+4-3)+-2`,\n\t\t\tfloat64(23),\n\t\t},\n\t\t{\n\t\t\t`\"hello\" + \" \" + \"world\"`,\n\t\t\t\"hello world\",\n\t\t},\n\t\t{\n\t\t\t`0 in -1..1 and 1 in 1..1`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Int in 0..1`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Int32 in 0..1`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Int64 in 0..1`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`1 in [1, 2, 3] && \"foo\" in {foo: 0, bar: 1} && \"Bar\" in Foo`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`1 in [1.5] || 1 not in [1]`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`One in 0..1 && Two not in 0..1`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Two not in 0..1`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Two not    in 0..1`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`-1 not in [1]`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Int32 in [10, 20]`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`String matches \"s.+\"`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`String matches (\"^\" + String + \"$\")`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`'foo' + 'bar' not matches 'foobar'`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`\"foobar\" contains \"bar\"`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`\"foobar\" startsWith \"foo\"`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`\"foobar\" endsWith \"bar\"`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`(0..10)[5]`,\n\t\t\t5,\n\t\t},\n\t\t{\n\t\t\t`Foo.Bar.Baz`,\n\t\t\t\"baz\",\n\t\t},\n\t\t{\n\t\t\t`Add(10, 5) + GetInt()`,\n\t\t\t15,\n\t\t},\n\t\t{\n\t\t\t`Foo.Method().Baz`,\n\t\t\t`baz (from Foo.Method)`,\n\t\t},\n\t\t{\n\t\t\t`Foo.MethodWithArgs(\"prefix \")`,\n\t\t\t\"prefix foo\",\n\t\t},\n\t\t{\n\t\t\t`len([1, 2, 3])`,\n\t\t\t3,\n\t\t},\n\t\t{\n\t\t\t`len([1, Two, 3])`,\n\t\t\t3,\n\t\t},\n\t\t{\n\t\t\t`len([\"hello\", \"world\"])`,\n\t\t\t2,\n\t\t},\n\t\t{\n\t\t\t`len(\"hello, world\")`,\n\t\t\t12,\n\t\t},\n\t\t{\n\t\t\t`len('北京')`,\n\t\t\t2,\n\t\t},\n\t\t{\n\t\t\t`len('👍🏻')`, // one grapheme cluster, two code points\n\t\t\t2,\n\t\t},\n\t\t{\n\t\t\t`len('👍')`, // one grapheme cluster, one code point\n\t\t\t1,\n\t\t},\n\t\t{\n\t\t\t`len(ArrayOfInt)`,\n\t\t\t5,\n\t\t},\n\t\t{\n\t\t\t`len({a: 1, b: 2, c: 2})`,\n\t\t\t3,\n\t\t},\n\t\t{\n\t\t\t`max([1, 2, 3])`,\n\t\t\t3,\n\t\t},\n\t\t{\n\t\t\t`max(1, 2, 3)`,\n\t\t\t3,\n\t\t},\n\t\t{\n\t\t\t`min([1, 2, 3])`,\n\t\t\t1,\n\t\t},\n\t\t{\n\t\t\t`min(1, 2, 3)`,\n\t\t\t1,\n\t\t},\n\t\t{\n\t\t\t`{foo: 0, bar: 1}`,\n\t\t\tmap[string]any{\"foo\": 0, \"bar\": 1},\n\t\t},\n\t\t{\n\t\t\t`{foo: 0, bar: 1}`,\n\t\t\tmap[string]any{\"foo\": 0, \"bar\": 1},\n\t\t},\n\t\t{\n\t\t\t`(true ? 0+1 : 2+3) + (false ? -1 : -2)`,\n\t\t\t-1,\n\t\t},\n\t\t{\n\t\t\t`filter(1..9, {# > 7})`,\n\t\t\t[]any{8, 9},\n\t\t},\n\t\t{\n\t\t\t`map(1..3, {# * #})`,\n\t\t\t[]any{1, 4, 9},\n\t\t},\n\t\t{\n\t\t\t`all(1..3, {# > 0})`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`count(1..30, {# % 3 == 0})`,\n\t\t\t10,\n\t\t},\n\t\t{\n\t\t\t`count([true, true, false])`,\n\t\t\t2,\n\t\t},\n\t\t{\n\t\t\t`\"a\" < \"b\"`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Time.Sub(Time).String() == \"0s\"`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`1 + 1`,\n\t\t\t2,\n\t\t},\n\t\t{\n\t\t\t`(One * Two) * 3 == One * (Two * 3)`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`ArrayOfInt[1]`,\n\t\t\t2,\n\t\t},\n\t\t{\n\t\t\t`ArrayOfInt[0] < ArrayOfInt[1]`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`ArrayOfInt[-1]`,\n\t\t\t5,\n\t\t},\n\t\t{\n\t\t\t`ArrayOfInt[1:2]`,\n\t\t\t[]int{2},\n\t\t},\n\t\t{\n\t\t\t`ArrayOfInt[1:4]`,\n\t\t\t[]int{2, 3, 4},\n\t\t},\n\t\t{\n\t\t\t`ArrayOfInt[-4:-1]`,\n\t\t\t[]int{2, 3, 4},\n\t\t},\n\t\t{\n\t\t\t`ArrayOfInt[:3]`,\n\t\t\t[]int{1, 2, 3},\n\t\t},\n\t\t{\n\t\t\t`ArrayOfInt[3:]`,\n\t\t\t[]int{4, 5},\n\t\t},\n\t\t{\n\t\t\t`ArrayOfInt[0:5] == ArrayOfInt`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`ArrayOfInt[0:] == ArrayOfInt`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`ArrayOfInt[:5] == ArrayOfInt`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`ArrayOfInt[:] == ArrayOfInt`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`4 in 5..1`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`4..0`,\n\t\t\t[]int{},\n\t\t},\n\t\t{\n\t\t\t`NilStruct`,\n\t\t\t(*mock.Foo)(nil),\n\t\t},\n\t\t{\n\t\t\t`NilAny == nil && nil == NilAny && nil == nil && NilAny == NilAny && NilInt == nil && NilSlice == nil && NilStruct == nil`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`0 == nil || \"str\" == nil || true == nil`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`Variadic(6, 1, 2, 3)`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Variadic(0)`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`String[:]`,\n\t\t\t\"string\",\n\t\t},\n\t\t{\n\t\t\t`String[:3]`,\n\t\t\t\"str\",\n\t\t},\n\t\t{\n\t\t\t`String[:9]`,\n\t\t\t\"string\",\n\t\t},\n\t\t{\n\t\t\t`String[3:9]`,\n\t\t\t\"ing\",\n\t\t},\n\t\t{\n\t\t\t`String[7:9]`,\n\t\t\t\"\",\n\t\t},\n\t\t{\n\t\t\t`map(filter(ArrayOfInt, # >= 3), # + 1)`,\n\t\t\t[]any{4, 5, 6},\n\t\t},\n\t\t{\n\t\t\t`Time < Time + Duration`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Time + Duration > Time`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Time == Time`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Time >= Time`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Time <= Time`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`Time == Time + Duration`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`Time != Time`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`TimePlusDay - Duration`,\n\t\t\tdate,\n\t\t},\n\t\t{\n\t\t\t`duration(\"1h\") == duration(\"1h\")`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`TimePlusDay - Time >= duration(\"24h\")`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`duration(\"1h\") > duration(\"1m\")`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`duration(\"1h\") < duration(\"1m\")`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`duration(\"1h\") >= duration(\"1m\")`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`duration(\"1h\") <= duration(\"1m\")`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`duration(\"1h\") > duration(\"1m\")`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`duration(\"1h\") + duration(\"1m\")`,\n\t\t\ttime.Hour + time.Minute,\n\t\t},\n\t\t{\n\t\t\t`duration(\"1h\") - duration(\"1m\")`,\n\t\t\ttime.Hour - time.Minute,\n\t\t},\n\t\t{\n\t\t\t`7 * duration(\"1h\")`,\n\t\t\t7 * time.Hour,\n\t\t},\n\t\t{\n\t\t\t`duration(\"1h\") * 7`,\n\t\t\t7 * time.Hour,\n\t\t},\n\t\t{\n\t\t\t`duration(\"1s\") * .5`,\n\t\t\t5e8,\n\t\t},\n\t\t{\n\t\t\t`1 /* one */ + 2 // two`,\n\t\t\t3,\n\t\t},\n\t\t{\n\t\t\t`let x = 1; x + 2`,\n\t\t\t3,\n\t\t},\n\t\t{\n\t\t\t`map(1..3, let x = #; let y = x * x; y * y)`,\n\t\t\t[]any{1, 16, 81},\n\t\t},\n\t\t{\n\t\t\t`map(1..2, let x = #; map(2..3, let y = #; x + y))`,\n\t\t\t[]any{[]any{3, 4}, []any{4, 5}},\n\t\t},\n\t\t{\n\t\t\t`len(filter(1..99, # % 7 == 0))`,\n\t\t\t14,\n\t\t},\n\t\t{\n\t\t\t`find(ArrayOfFoo, .Value == \"baz\")`,\n\t\t\tenv.ArrayOfFoo[2],\n\t\t},\n\t\t{\n\t\t\t`findIndex(ArrayOfFoo, .Value == \"baz\")`,\n\t\t\t2,\n\t\t},\n\t\t{\n\t\t\t`filter(ArrayOfFoo, .Value == \"baz\")[0]`,\n\t\t\tenv.ArrayOfFoo[2],\n\t\t},\n\t\t{\n\t\t\t`first(filter(ArrayOfFoo, .Value == \"baz\"))`,\n\t\t\tenv.ArrayOfFoo[2],\n\t\t},\n\t\t{\n\t\t\t`first(filter(ArrayOfFoo, false))`,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t`findLast(1..9, # % 2 == 0)`,\n\t\t\t8,\n\t\t},\n\t\t{\n\t\t\t`findLastIndex(1..9, # % 2 == 0)`,\n\t\t\t7,\n\t\t},\n\t\t{\n\t\t\t`filter(1..9, # % 2 == 0)[-1]`,\n\t\t\t8,\n\t\t},\n\t\t{\n\t\t\t`last(filter(1..9, # % 2 == 0))`,\n\t\t\t8,\n\t\t},\n\t\t{\n\t\t\t`map(filter(1..9, # % 2 == 0), # * 2)`,\n\t\t\t[]any{4, 8, 12, 16},\n\t\t},\n\t\t{\n\t\t\t`map(map(filter(1..9, # % 2 == 0), # * 2), # * 2)`,\n\t\t\t[]any{8, 16, 24, 32},\n\t\t},\n\t\t{\n\t\t\t`first(map(filter(1..9, # % 2 == 0), # * 2))`,\n\t\t\t4,\n\t\t},\n\t\t{\n\t\t\t`map(filter(1..9, # % 2 == 0), # * 2)[-1]`,\n\t\t\t16,\n\t\t},\n\t\t{\n\t\t\t`len(map(filter(1..9, # % 2 == 0), # * 2))`,\n\t\t\t4,\n\t\t},\n\t\t{\n\t\t\t`len(filter(map(1..9, # * 2), # % 2 == 0))`,\n\t\t\t9,\n\t\t},\n\t\t{\n\t\t\t`first(filter(map(1..9, # * 2), # % 2 == 0))`,\n\t\t\t2,\n\t\t},\n\t\t{\n\t\t\t`first(map(filter(1..9, # % 2 == 0), # * 2))`,\n\t\t\t4,\n\t\t},\n\t\t{\n\t\t\t`2^3 == 8`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`4/2 == 2`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`.5 in 0..1`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`.5 in ArrayOfInt`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`bitnot(10)`,\n\t\t\t-11,\n\t\t},\n\t\t{\n\t\t\t`bitxor(15, 32)`,\n\t\t\t47,\n\t\t},\n\t\t{\n\t\t\t`bitand(90, 34)`,\n\t\t\t2,\n\t\t},\n\t\t{\n\t\t\t`bitnand(35, 9)`,\n\t\t\t34,\n\t\t},\n\t\t{\n\t\t\t`bitor(10, 5)`,\n\t\t\t15,\n\t\t},\n\t\t{\n\t\t\t`bitshr(7, 2)`,\n\t\t\t1,\n\t\t},\n\t\t{\n\t\t\t`bitshl(7, 2)`,\n\t\t\t28,\n\t\t},\n\t\t{\n\t\t\t`bitushr(-100, 5)`,\n\t\t\t576460752303423484,\n\t\t},\n\t\t{\n\t\t\t`\"hello\"[1:3]`,\n\t\t\t\"el\",\n\t\t},\n\t\t{\n\t\t\t`[1, 2, 3]?.[0]`,\n\t\t\t1,\n\t\t},\n\t\t{\n\t\t\t`[[1, 2], 3, 4]?.[0]?.[1]`,\n\t\t\t2,\n\t\t},\n\t\t{\n\t\t\t`[nil, 3, 4]?.[0]?.[1]`,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t`1 > 2 < 3`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`1 < 2 < 3`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`1 < 2 < 3 > 4`,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t`1 < 2 < 3 > 2`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`1 < 2 < 3 == true`,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t`if 1 > 2 { 333 * 2 + 1 } else { 444 }`,\n\t\t\t444,\n\t\t},\n\t\t{\n\t\t\t`let a = 3;\n\t\t\tlet b = 2;\n\t\t\tif a>b {let c = Add(a, b); c+1} else {Add(10, b)}\n\t\t\t`,\n\t\t\t6,\n\t\t},\n\t\t{\n\t\t\t`if \"a\" < \"b\" {let x = \"a\"; x} else {\"abc\"}`,\n\t\t\t\"a\",\n\t\t},\n\t\t{\n\t\t\t`if 1 == 2 { \"no\" } else if 1 == 1 { \"yes\" } else { \"maybe\" }`,\n\t\t\t\"yes\",\n\t\t},\n\t\t{\n\t\t\t`1; 2; 3`,\n\t\t\t3,\n\t\t},\n\t\t{\n\t\t\t`let a = 1; Add(2, 2); let b = 2; a + b`,\n\t\t\t3,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\t{\n\t\t\t\tprogram, err := expr.Compile(tt.code, expr.Env(mock.Env{}))\n\t\t\t\trequire.NoError(t, err, \"compile error\")\n\n\t\t\t\tgot, err := expr.Run(program, env)\n\t\t\t\trequire.NoError(t, err, \"run error\")\n\t\t\t\tassert.Equal(t, tt.want, got)\n\t\t\t}\n\t\t\t{\n\t\t\t\tprogram, err := expr.Compile(tt.code, expr.Optimize(false))\n\t\t\t\trequire.NoError(t, err, \"unoptimized\")\n\n\t\t\t\tgot, err := expr.Run(program, env)\n\t\t\t\trequire.NoError(t, err, \"unoptimized\")\n\t\t\t\tassert.Equal(t, tt.want, got, \"unoptimized\")\n\t\t\t}\n\t\t\t{\n\t\t\t\tgot, err := expr.Eval(tt.code, env)\n\t\t\t\trequire.NoError(t, err, \"eval\")\n\t\t\t\tassert.Equal(t, tt.want, got, \"eval\")\n\t\t\t}\n\t\t\t{\n\t\t\t\tprogram, err := expr.Compile(tt.code, expr.Env(mock.Env{}), expr.Optimize(false))\n\t\t\t\trequire.NoError(t, err)\n\n\t\t\t\tcode := program.Node().String()\n\t\t\t\tgot, err := expr.Eval(code, env)\n\t\t\t\trequire.NoError(t, err, code)\n\t\t\t\tassert.Equal(t, tt.want, got, code)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestExpr_error(t *testing.T) {\n\tenv := mock.Env{\n\t\tArrayOfAny: []any{1, \"2\", 3, true},\n\t}\n\n\ttests := []struct {\n\t\tcode string\n\t\twant string\n\t}{\n\t\t{\n\t\t\t`filter(1..9, # > 9)[0]`,\n\t\t\t`reflect: slice index out of range (1:20)\n | filter(1..9, # > 9)[0]\n | ...................^`,\n\t\t},\n\t\t{\n\t\t\t`ArrayOfAny[-7]`,\n\t\t\t`index out of range: -3 (array length is 4) (1:11)\n | ArrayOfAny[-7]\n | ..........^`,\n\t\t},\n\t\t{\n\t\t\t`reduce(10..1, # + #acc)`,\n\t\t\t`reduce of empty array with no initial value (1:1)\n | reduce(10..1, # + #acc)\n | ^`,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.code, expr.Env(mock.Env{}))\n\t\t\trequire.NoError(t, err)\n\n\t\t\t_, err = expr.Run(program, env)\n\t\t\trequire.Error(t, err)\n\t\t\tassert.Equal(t, tt.want, err.Error())\n\t\t})\n\t}\n}\n\nfunc TestExpr_optional_chaining(t *testing.T) {\n\tenv := map[string]any{}\n\tprogram, err := expr.Compile(\"foo?.bar.baz\", expr.Env(env), expr.AllowUndefinedVariables())\n\trequire.NoError(t, err)\n\n\tgot, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\tassert.Equal(t, nil, got)\n}\n\nfunc TestExpr_optional_chaining_property(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"foo\": map[string]any{},\n\t}\n\tprogram, err := expr.Compile(\"foo.bar?.baz\", expr.Env(env))\n\trequire.NoError(t, err)\n\n\tgot, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\tassert.Equal(t, nil, got)\n}\n\nfunc TestExpr_optional_chaining_nested_chains(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"foo\": map[string]any{\n\t\t\t\"id\": 1,\n\t\t\t\"bar\": []map[string]any{\n\t\t\t\t1: {\n\t\t\t\t\t\"baz\": \"baz\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tprogram, err := expr.Compile(\"foo?.bar[foo?.id]?.baz\", expr.Env(env))\n\trequire.NoError(t, err)\n\n\tgot, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"baz\", got)\n}\n\nfunc TestExpr_optional_chaining_array(t *testing.T) {\n\tenv := map[string]any{}\n\tprogram, err := expr.Compile(\"foo?.[1]?.[2]?.[3]\", expr.Env(env), expr.AllowUndefinedVariables())\n\trequire.NoError(t, err)\n\n\tgot, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\tassert.Equal(t, nil, got)\n}\n\nfunc TestExpr_eval_with_env(t *testing.T) {\n\t_, err := expr.Eval(\"true\", expr.Env(map[string]any{}))\n\tassert.Error(t, err)\n\tassert.Contains(t, err.Error(), \"misused\")\n}\n\nfunc TestExpr_fetch_from_func(t *testing.T) {\n\t_, err := expr.Eval(\"foo.Value\", map[string]any{\n\t\t\"foo\": func() {},\n\t})\n\tassert.Error(t, err)\n\tassert.Contains(t, err.Error(), \"cannot fetch Value from func()\")\n}\n\nfunc TestExpr_map_default_values(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"foo\": map[string]string{},\n\t\t\"bar\": map[string]*string{},\n\t}\n\n\tinput := `foo['missing'] == '' && bar['missing'] == nil`\n\n\tprogram, err := expr.Compile(input, expr.Env(env))\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, true, output)\n}\n\nfunc TestExpr_map_default_values_compile_check(t *testing.T) {\n\ttests := []struct {\n\t\tenv   any\n\t\tinput string\n\t}{\n\t\t{\n\t\t\tmock.MapStringStringEnv{\"foo\": \"bar\"},\n\t\t\t`Split(foo, sep)`,\n\t\t},\n\t\t{\n\t\t\tmock.MapStringIntEnv{\"foo\": 1},\n\t\t\t`foo / bar`,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\t_, err := expr.Compile(tt.input, expr.Env(tt.env), expr.AllowUndefinedVariables())\n\t\trequire.NoError(t, err)\n\t}\n}\n\nfunc TestExpr_calls_with_nil(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"equals\": func(a, b any) any {\n\t\t\tassert.Nil(t, a, \"a is not nil\")\n\t\t\tassert.Nil(t, b, \"b is not nil\")\n\t\t\treturn a == b\n\t\t},\n\t\t\"is\": mock.Is{},\n\t}\n\n\tp, err := expr.Compile(\n\t\t\"a == nil && equals(b, nil) && is.Nil(c)\",\n\t\texpr.Env(env),\n\t\texpr.Operator(\"==\", \"equals\"),\n\t\texpr.AllowUndefinedVariables(),\n\t)\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(p, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, true, out)\n}\n\nfunc TestExpr_call_float_arg_func_with_int(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"cnv\": func(f float64) any {\n\t\t\treturn f\n\t\t},\n\t}\n\ttests := []struct {\n\t\tinput    string\n\t\texpected float64\n\t}{\n\t\t{\"-1\", -1.0},\n\t\t{\"1+1\", 2.0},\n\t\t{\"+1\", 1.0},\n\t\t{\"1-1\", 0.0},\n\t\t{\"1/1\", 1.0},\n\t\t{\"1*1\", 1.0},\n\t\t{\"1^1\", 1.0},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.input, func(t *testing.T) {\n\t\t\tp, err := expr.Compile(fmt.Sprintf(\"cnv(%s)\", tt.input), expr.Env(env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tout, err := expr.Run(p, env)\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.Equal(t, tt.expected, out)\n\t\t})\n\t}\n}\n\nfunc TestConstExpr_error_panic(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"divide\": func(a, b int) int { return a / b },\n\t}\n\n\t_, err := expr.Compile(\n\t\t`1 + divide(1, 0)`,\n\t\texpr.Env(env),\n\t\texpr.ConstExpr(\"divide\"),\n\t)\n\trequire.Error(t, err)\n\trequire.Equal(t, \"compile error: integer divide by zero (1:5)\\n | 1 + divide(1, 0)\\n | ....^\", err.Error())\n}\n\ntype divideError struct{ Message string }\n\nfunc (e divideError) Error() string {\n\treturn e.Message\n}\n\nfunc TestConstExpr_error_as_error(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"divide\": func(a, b int) (int, error) {\n\t\t\tif b == 0 {\n\t\t\t\treturn 0, divideError{\"integer divide by zero\"}\n\t\t\t}\n\t\t\treturn a / b, nil\n\t\t},\n\t}\n\n\t_, err := expr.Compile(\n\t\t`1 + divide(1, 0)`,\n\t\texpr.Env(env),\n\t\texpr.ConstExpr(\"divide\"),\n\t)\n\trequire.Error(t, err)\n\trequire.Equal(t, \"integer divide by zero\", err.Error())\n\trequire.IsType(t, divideError{}, err)\n}\n\nfunc TestConstExpr_error_wrong_type(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"divide\": 0,\n\t}\n\tassert.Panics(t, func() {\n\t\t_, _ = expr.Compile(\n\t\t\t`1 + divide(1, 0)`,\n\t\t\texpr.Env(env),\n\t\t\texpr.ConstExpr(\"divide\"),\n\t\t)\n\t})\n}\n\nfunc TestConstExpr_error_no_env(t *testing.T) {\n\tassert.Panics(t, func() {\n\t\t_, _ = expr.Compile(\n\t\t\t`1 + divide(1, 0)`,\n\t\t\texpr.ConstExpr(\"divide\"),\n\t\t)\n\t})\n}\n\nvar stringer = reflect.TypeOf((*fmt.Stringer)(nil)).Elem()\n\ntype stringerPatcher struct{}\n\nfunc (p *stringerPatcher) Visit(node *ast.Node) {\n\tt := (*node).Type()\n\tif t == nil {\n\t\treturn\n\t}\n\tif t.Implements(stringer) {\n\t\tast.Patch(node, &ast.CallNode{\n\t\t\tCallee: &ast.MemberNode{\n\t\t\t\tNode:     *node,\n\t\t\t\tProperty: &ast.StringNode{Value: \"String\"},\n\t\t\t},\n\t\t})\n\t}\n}\n\nfunc TestPatch(t *testing.T) {\n\tprogram, err := expr.Compile(\n\t\t`Foo == \"Foo.String\"`,\n\t\texpr.Env(mock.Env{}),\n\t\texpr.Patch(&mock.StringerPatcher{}),\n\t)\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, mock.Env{})\n\trequire.NoError(t, err)\n\trequire.Equal(t, true, output)\n}\n\nfunc TestCompile_exposed_error(t *testing.T) {\n\t_, err := expr.Compile(`1 == true`)\n\trequire.Error(t, err)\n\n\tfileError, ok := err.(*file.Error)\n\trequire.True(t, ok, \"error should be of type *file.Error\")\n\trequire.Equal(t, \"invalid operation: == (mismatched types int and bool) (1:3)\\n | 1 == true\\n | ..^\", fileError.Error())\n\trequire.Equal(t, 2, fileError.Column)\n\trequire.Equal(t, 1, fileError.Line)\n\n\tb, err := json.Marshal(err)\n\trequire.NoError(t, err)\n\trequire.Equal(t,\n\t\t`{\"from\":2,\"to\":4,\"line\":1,\"column\":2,\"message\":\"invalid operation: == (mismatched types int and bool)\",\"snippet\":\"\\n | 1 == true\\n | ..^\",\"prev\":null}`,\n\t\tstring(b),\n\t)\n}\n\nfunc TestAsBool_exposed_error(t *testing.T) {\n\t_, err := expr.Compile(`42`, expr.AsBool())\n\trequire.Error(t, err)\n\n\t_, ok := err.(*file.Error)\n\trequire.False(t, ok, \"error must not be of type *file.Error\")\n\trequire.Equal(t, \"expected bool, but got int\", err.Error())\n}\n\nfunc TestEval_exposed_error(t *testing.T) {\n\t_, err := expr.Eval(`1 % 0`, nil)\n\trequire.Error(t, err)\n\n\tfileError, ok := err.(*file.Error)\n\trequire.True(t, ok, \"error should be of type *file.Error\")\n\trequire.Equal(t, \"runtime error: integer divide by zero (1:3)\\n | 1 % 0\\n | ..^\", fileError.Error())\n\trequire.Equal(t, 2, fileError.Column)\n\trequire.Equal(t, 1, fileError.Line)\n}\n\nfunc TestCompile_exposed_error_with_multiline_script(t *testing.T) {\n\t_, err := expr.Compile(\"{\\n\\ta: 1,\\n\\tb: #,\\n\\tc: 3,\\n}\")\n\trequire.Error(t, err)\n\n\tfileError, ok := err.(*file.Error)\n\trequire.True(t, ok, \"error should be of type *file.Error\")\n\trequire.Equal(t, \"unexpected token Operator(\\\"#\\\") (3:5)\\n |  b: #,\\n | ....^\", fileError.Error())\n\trequire.Equal(t, 4, fileError.Column)\n\trequire.Equal(t, 3, fileError.Line)\n}\n\nfunc TestIssue105(t *testing.T) {\n\ttype A struct {\n\t\tField string\n\t}\n\ttype B struct {\n\t\tField int\n\t}\n\ttype C struct {\n\t\tA\n\t\tB\n\t}\n\ttype Env struct {\n\t\tC\n\t}\n\n\tcode := `\n\t\tA.Field == '' &&\n\t\tC.A.Field == '' &&\n\t\tB.Field == 0 &&\n\t\tC.B.Field == 0\n\t`\n\n\t_, err := expr.Compile(code, expr.Env(Env{}))\n\trequire.NoError(t, err)\n}\n\nfunc TestIssue_nested_closures(t *testing.T) {\n\tcode := `all(1..3, { all(1..3, { # > 0 }) and # > 0 })`\n\n\tprogram, err := expr.Compile(code)\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, nil)\n\trequire.NoError(t, err)\n\trequire.True(t, output.(bool))\n}\n\nfunc TestIssue138(t *testing.T) {\n\tenv := map[string]any{}\n\n\t_, err := expr.Compile(`1 / (1 - 1)`, expr.Env(env))\n\trequire.NoError(t, err)\n\n\t_, err = expr.Compile(`1 % 0`, expr.Env(env))\n\trequire.Error(t, err)\n\trequire.Equal(t, \"integer divide by zero (1:3)\\n | 1 % 0\\n | ..^\", err.Error())\n}\n\nfunc TestIssue154(t *testing.T) {\n\ttype Data struct {\n\t\tArray  *[2]any\n\t\tSlice  *[]any\n\t\tMap    *map[string]any\n\t\tString *string\n\t}\n\n\ttype Env struct {\n\t\tData *Data\n\t}\n\n\tb := true\n\ti := 10\n\ts := \"value\"\n\n\tArray := [2]any{\n\t\t&b,\n\t\t&i,\n\t}\n\n\tSlice := []any{\n\t\t&b,\n\t\t&i,\n\t}\n\n\tMap := map[string]any{\n\t\t\"Bool\": &b,\n\t\t\"Int\":  &i,\n\t}\n\n\tenv := Env{\n\t\tData: &Data{\n\t\t\tArray:  &Array,\n\t\t\tSlice:  &Slice,\n\t\t\tMap:    &Map,\n\t\t\tString: &s,\n\t\t},\n\t}\n\n\ttests := []string{\n\t\t`Data.Array[0] == true`,\n\t\t`Data.Array[1] == 10`,\n\t\t`Data.Slice[0] == true`,\n\t\t`Data.Slice[1] == 10`,\n\t\t`Data.Map[\"Bool\"] == true`,\n\t\t`Data.Map[\"Int\"] == 10`,\n\t\t`Data.String == \"value\"`,\n\t}\n\n\tfor _, input := range tests {\n\t\tprogram, err := expr.Compile(input, expr.Env(env))\n\t\trequire.NoError(t, err, input)\n\n\t\toutput, err := expr.Run(program, env)\n\t\trequire.NoError(t, err)\n\t\tassert.True(t, output.(bool), input)\n\t}\n}\n\nfunc TestIssue270(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"int8\":     int8(1),\n\t\t\"int16\":    int16(3),\n\t\t\"int32\":    int32(5),\n\t\t\"int64\":    int64(7),\n\t\t\"uint8\":    uint8(11),\n\t\t\"uint16\":   uint16(13),\n\t\t\"uint32\":   uint32(17),\n\t\t\"uint64\":   uint64(19),\n\t\t\"int8a\":    uint(23),\n\t\t\"int8b\":    uint(29),\n\t\t\"int16a\":   uint(31),\n\t\t\"int16b\":   uint(37),\n\t\t\"int32a\":   uint(41),\n\t\t\"int32b\":   uint(43),\n\t\t\"int64a\":   uint(47),\n\t\t\"int64b\":   uint(53),\n\t\t\"uint8a\":   uint(59),\n\t\t\"uint8b\":   uint(61),\n\t\t\"uint16a\":  uint(67),\n\t\t\"uint16b\":  uint(71),\n\t\t\"uint32a\":  uint(73),\n\t\t\"uint32b\":  uint(79),\n\t\t\"uint64a\":  uint(83),\n\t\t\"uint64b\":  uint(89),\n\t\t\"float32a\": float32(97),\n\t\t\"float32b\": float32(101),\n\t\t\"float64a\": float64(103),\n\t\t\"float64b\": float64(107),\n\t}\n\tfor _, each := range []struct {\n\t\tinput string\n\t}{\n\t\t{\"int8 / int16\"},\n\t\t{\"int32 / int64\"},\n\t\t{\"uint8 / uint16\"},\n\t\t{\"uint32 / uint64\"},\n\t\t{\"int8 / uint64\"},\n\t\t{\"int64 / uint8\"},\n\t\t{\"int8a / int8b\"},\n\t\t{\"int16a / int16b\"},\n\t\t{\"int32a / int32b\"},\n\t\t{\"int64a / int64b\"},\n\t\t{\"uint8a / uint8b\"},\n\t\t{\"uint16a / uint16b\"},\n\t\t{\"uint32a / uint32b\"},\n\t\t{\"uint64a / uint64b\"},\n\t\t{\"float32a / float32b\"},\n\t\t{\"float64a / float64b\"},\n\t} {\n\t\tp, err := expr.Compile(each.input, expr.Env(env))\n\t\trequire.NoError(t, err)\n\n\t\tout, err := expr.Run(p, env)\n\t\trequire.NoError(t, err)\n\t\trequire.IsType(t, float64(0), out)\n\t}\n}\n\nfunc TestIssue271(t *testing.T) {\n\ttype BarArray []float64\n\n\ttype Foo struct {\n\t\tBar BarArray\n\t\tBaz int\n\t}\n\n\ttype Env struct {\n\t\tFoo Foo\n\t}\n\n\tcode := `Foo.Bar[0]`\n\n\tprogram, err := expr.Compile(code, expr.Env(Env{}))\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, Env{\n\t\tFoo: Foo{\n\t\t\tBar: BarArray{1.0, 2.0, 3.0},\n\t\t},\n\t})\n\trequire.NoError(t, err)\n\trequire.Equal(t, 1.0, output)\n}\n\ntype Issue346Array []Issue346Type\n\ntype Issue346Type struct {\n\tBar string\n}\n\nfunc (i Issue346Array) Len() int {\n\treturn len(i)\n}\n\nfunc TestIssue346(t *testing.T) {\n\tcode := `Foo[0].Bar`\n\n\tenv := map[string]any{\n\t\t\"Foo\": Issue346Array{\n\t\t\t{Bar: \"bar\"},\n\t\t},\n\t}\n\tprogram, err := expr.Compile(code, expr.Env(env))\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, \"bar\", output)\n}\n\nfunc TestCompile_allow_to_use_interface_to_get_an_element_from_map(t *testing.T) {\n\tcode := `{\"value\": \"ok\"}[vars.key]`\n\tenv := map[string]any{\n\t\t\"vars\": map[string]any{\n\t\t\t\"key\": \"value\",\n\t\t},\n\t}\n\n\tprogram, err := expr.Compile(code, expr.Env(env))\n\tassert.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\tassert.NoError(t, err)\n\tassert.Equal(t, \"ok\", out)\n\n\tt.Run(\"with allow undefined variables\", func(t *testing.T) {\n\t\tcode := `{'key': 'value'}[Key]`\n\t\tenv := mock.MapStringStringEnv{}\n\t\toptions := []expr.Option{\n\t\t\texpr.AllowUndefinedVariables(),\n\t\t}\n\n\t\tprogram, err := expr.Compile(code, options...)\n\t\tassert.NoError(t, err)\n\n\t\tout, err := expr.Run(program, env)\n\t\tassert.NoError(t, err)\n\t\tassert.Equal(t, nil, out)\n\t})\n}\n\nfunc TestFastCall(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"func\": func(in any) float64 {\n\t\t\treturn 8\n\t\t},\n\t}\n\tcode := `func(\"8\")`\n\n\tprogram, err := expr.Compile(code, expr.Env(env))\n\tassert.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\tassert.NoError(t, err)\n\tassert.Equal(t, float64(8), out)\n}\n\nfunc TestFastCall_OpCallFastErr(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"func\": func(...any) (any, error) {\n\t\t\treturn 8, nil\n\t\t},\n\t}\n\tcode := `func(\"8\")`\n\n\tprogram, err := expr.Compile(code, expr.Env(env))\n\tassert.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\tassert.NoError(t, err)\n\tassert.Equal(t, 8, out)\n}\n\nfunc TestRun_custom_func_returns_an_error_as_second_arg(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"semver\": func(value string, cmp string) (bool, error) { return true, nil },\n\t}\n\n\tp, err := expr.Compile(`semver(\"1.2.3\", \"= 1.2.3\")`, expr.Env(env))\n\tassert.NoError(t, err)\n\n\tout, err := expr.Run(p, env)\n\tassert.NoError(t, err)\n\tassert.Equal(t, true, out)\n}\n\nfunc TestFunction(t *testing.T) {\n\tadd := expr.Function(\n\t\t\"add\",\n\t\tfunc(p ...any) (any, error) {\n\t\t\tout := 0\n\t\t\tfor _, each := range p {\n\t\t\t\tout += each.(int)\n\t\t\t}\n\t\t\treturn out, nil\n\t\t},\n\t\tnew(func(...int) int),\n\t)\n\n\tp, err := expr.Compile(`add() + add(1) + add(1, 2) + add(1, 2, 3) + add(1, 2, 3, 4)`, add)\n\tassert.NoError(t, err)\n\n\tout, err := expr.Run(p, nil)\n\tassert.NoError(t, err)\n\tassert.Equal(t, 20, out)\n}\n\n// Nil coalescing operator\nfunc TestRun_NilCoalescingOperator(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"foo\": map[string]any{\n\t\t\t\"bar\": \"value\",\n\t\t},\n\t}\n\n\tt.Run(\"value\", func(t *testing.T) {\n\t\tp, err := expr.Compile(`foo.bar ?? \"default\"`, expr.Env(env))\n\t\tassert.NoError(t, err)\n\n\t\tout, err := expr.Run(p, env)\n\t\tassert.NoError(t, err)\n\t\tassert.Equal(t, \"value\", out)\n\t})\n\n\tt.Run(\"default\", func(t *testing.T) {\n\t\tp, err := expr.Compile(`foo.baz ?? \"default\"`, expr.Env(env))\n\t\tassert.NoError(t, err)\n\n\t\tout, err := expr.Run(p, env)\n\t\tassert.NoError(t, err)\n\t\tassert.Equal(t, \"default\", out)\n\t})\n\n\tt.Run(\"default with chain\", func(t *testing.T) {\n\t\tp, err := expr.Compile(`foo?.bar ?? \"default\"`, expr.Env(env))\n\t\tassert.NoError(t, err)\n\n\t\tout, err := expr.Run(p, map[string]any{})\n\t\tassert.NoError(t, err)\n\t\tassert.Equal(t, \"default\", out)\n\t})\n}\n\nfunc TestEval_nil_in_maps(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"m\":     map[any]any{nil: \"bar\"},\n\t\t\"empty\": map[any]any{},\n\t}\n\tt.Run(\"nil key exists\", func(t *testing.T) {\n\t\tp, err := expr.Compile(`m[nil]`, expr.Env(env))\n\t\tassert.NoError(t, err)\n\n\t\tout, err := expr.Run(p, env)\n\t\tassert.NoError(t, err)\n\t\tassert.Equal(t, \"bar\", out)\n\t})\n\tt.Run(\"no nil key\", func(t *testing.T) {\n\t\tp, err := expr.Compile(`empty[nil]`, expr.Env(env))\n\t\tassert.NoError(t, err)\n\n\t\tout, err := expr.Run(p, env)\n\t\tassert.NoError(t, err)\n\t\tassert.Equal(t, nil, out)\n\t})\n\tt.Run(\"nil in m\", func(t *testing.T) {\n\t\tp, err := expr.Compile(`nil in m`, expr.Env(env))\n\t\tassert.NoError(t, err)\n\n\t\tout, err := expr.Run(p, env)\n\t\tassert.NoError(t, err)\n\t\tassert.Equal(t, true, out)\n\t})\n\tt.Run(\"nil in empty\", func(t *testing.T) {\n\t\tp, err := expr.Compile(`nil in empty`, expr.Env(env))\n\t\tassert.NoError(t, err)\n\n\t\tout, err := expr.Run(p, env)\n\t\tassert.NoError(t, err)\n\t\tassert.Equal(t, false, out)\n\t})\n}\n\n// Test the use of env keyword.  Forms env[] and env[”] are valid.\n// The enclosed identifier must be in the expression env.\nfunc TestEnv_keyword(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"space test\":                       \"ok\",\n\t\t\"space_test\":                       \"not ok\", // Seems to be some underscore substituting happening, check that.\n\t\t\"Section 1-2a\":                     \"ok\",\n\t\t`c:\\ndrive\\2015 Information Table`: \"ok\",\n\t\t\"%*worst function name ever!!\": func() string {\n\t\t\treturn \"ok\"\n\t\t}(),\n\t\t\"1\":      \"o\",\n\t\t\"2\":      \"k\",\n\t\t\"num\":    10,\n\t\t\"mylist\": []int{1, 2, 3, 4, 5},\n\t\t\"MIN\": func(a, b int) int {\n\t\t\tif a < b {\n\t\t\t\treturn a\n\t\t\t} else {\n\t\t\t\treturn b\n\t\t\t}\n\t\t},\n\t\t\"red\":   \"n\",\n\t\t\"irect\": \"um\",\n\t\t\"String Map\": map[string]string{\n\t\t\t\"one\":   \"two\",\n\t\t\t\"three\": \"four\",\n\t\t},\n\t\t\"OtherMap\": map[string]string{\n\t\t\t\"a\": \"b\",\n\t\t\t\"c\": \"d\",\n\t\t},\n\t}\n\n\t// No error cases\n\tvar tests = []struct {\n\t\tcode string\n\t\twant any\n\t}{\n\t\t{\"$env['space test']\", \"ok\"},\n\t\t{\"$env['Section 1-2a']\", \"ok\"},\n\t\t{`$env[\"c:\\\\ndrive\\\\2015 Information Table\"]`, \"ok\"},\n\t\t{\"$env['%*worst function name ever!!']\", \"ok\"},\n\t\t{\"$env['String Map'].one\", \"two\"},\n\t\t{\"$env['1'] + $env['2']\", \"ok\"},\n\t\t{\"1 + $env['num'] + $env['num']\", 21},\n\t\t{\"MIN($env['num'],0)\", 0},\n\t\t{\"$env['nu' + 'm']\", 10},\n\t\t{\"$env[red + irect]\", 10},\n\t\t{\"$env['String Map']?.five\", \"\"},\n\t\t{\"$env.red\", \"n\"},\n\t\t{\"$env?.unknown\", nil},\n\t\t{\"$env.mylist[1]\", 2},\n\t\t{\"$env?.OtherMap?.a\", \"b\"},\n\t\t{\"$env?.OtherMap?.d\", \"\"},\n\t\t{\"'num' in $env\", true},\n\t\t{\"get($env, 'num')\", 10},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\n\t\t\tprogram, err := expr.Compile(tt.code, expr.Env(env))\n\t\t\trequire.NoError(t, err, \"compile error\")\n\n\t\t\tgot, err := expr.Run(program, env)\n\t\t\trequire.NoError(t, err, \"execution error\")\n\n\t\t\tassert.Equal(t, tt.want, got, tt.code)\n\t\t})\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\tgot, err := expr.Eval(tt.code, env)\n\t\t\trequire.NoError(t, err, \"eval error: \"+tt.code)\n\n\t\t\tassert.Equal(t, tt.want, got, \"eval: \"+tt.code)\n\t\t})\n\t}\n\n\t// error cases\n\ttests = []struct {\n\t\tcode string\n\t\twant any\n\t}{\n\t\t{\"env()\", \"bad\"},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\t_, err := expr.Eval(tt.code, expr.Env(env))\n\t\t\trequire.Error(t, err, \"compile error\")\n\n\t\t})\n\t}\n}\n\nfunc TestEnv_keyword_with_custom_functions(t *testing.T) {\n\tfn := expr.Function(\"fn\", func(params ...any) (any, error) {\n\t\treturn \"ok\", nil\n\t})\n\n\tvar tests = []struct {\n\t\tcode  string\n\t\terror bool\n\t}{\n\t\t{`fn()`, false},\n\t\t{`$env.fn()`, true},\n\t\t{`$env[\"fn\"]`, true},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\t_, err := expr.Compile(tt.code, expr.Env(mock.Env{}), fn)\n\t\t\tif tt.error {\n\t\t\t\trequire.Error(t, err)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestIssue401(t *testing.T) {\n\tprogram, err := expr.Compile(\"(a - b + c) / d\", expr.AllowUndefinedVariables())\n\trequire.NoError(t, err, \"compile error\")\n\n\toutput, err := expr.Run(program, map[string]any{\n\t\t\"a\": 1,\n\t\t\"b\": 2,\n\t\t\"c\": 3,\n\t\t\"d\": 4,\n\t})\n\trequire.NoError(t, err, \"run error\")\n\trequire.Equal(t, 0.5, output)\n}\n\nfunc TestEval_slices_out_of_bound(t *testing.T) {\n\ttests := []struct {\n\t\tcode string\n\t\twant any\n\t}{\n\t\t{\"[1, 2, 3][:99]\", []any{1, 2, 3}},\n\t\t{\"[1, 2, 3][99:]\", []any{}},\n\t\t{\"[1, 2, 3][:-99]\", []any{}},\n\t\t{\"[1, 2, 3][-99:]\", []any{1, 2, 3}},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\tgot, err := expr.Eval(tt.code, nil)\n\t\t\trequire.NoError(t, err, \"eval error: \"+tt.code)\n\t\t\tassert.Equal(t, tt.want, got, \"eval: \"+tt.code)\n\t\t})\n\t}\n}\n\nfunc TestExpr_timeout(t *testing.T) {\n\ttests := []struct{ code string }{\n\t\t{`-999999..999999`},\n\t\t{`map(1..999999, 1..999999)`},\n\t\t{`map(1..999999, repeat('a', #))`},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.code)\n\t\t\trequire.NoError(t, err)\n\n\t\t\ttimeout := make(chan bool, 1)\n\t\t\tgo func() {\n\t\t\t\ttime.Sleep(time.Second)\n\t\t\t\ttimeout <- true\n\t\t\t}()\n\n\t\t\tdone := make(chan bool, 1)\n\t\t\tgo func() {\n\t\t\t\tout, err := expr.Run(program, nil)\n\t\t\t\t// Make sure out is used.\n\t\t\t\t_ = fmt.Sprintf(\"%v\", out)\n\t\t\t\tassert.Error(t, err)\n\t\t\t\tdone <- true\n\t\t\t}()\n\n\t\t\tselect {\n\t\t\tcase <-done:\n\t\t\t\t// Success.\n\t\t\tcase <-timeout:\n\t\t\t\tt.Fatal(\"timeout\")\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestIssue432(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"func\": func(\n\t\t\tparamUint32 uint32,\n\t\t\tparamUint16 uint16,\n\t\t\tparamUint8 uint8,\n\t\t\tparamUint uint,\n\t\t\tparamInt32 int32,\n\t\t\tparamInt16 int16,\n\t\t\tparamInt8 int8,\n\t\t\tparamInt int,\n\t\t\tparamFloat64 float64,\n\t\t\tparamFloat32 float32,\n\t\t) float64 {\n\t\t\treturn float64(paramUint32) + float64(paramUint16) + float64(paramUint8) + float64(paramUint) +\n\t\t\t\tfloat64(paramInt32) + float64(paramInt16) + float64(paramInt8) + float64(paramInt) +\n\t\t\t\tfloat64(paramFloat64) + float64(paramFloat32)\n\t\t},\n\t}\n\tcode := `func(1,1,1,1,1,1,1,1,1,1)`\n\n\tprogram, err := expr.Compile(code, expr.Env(env))\n\tassert.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\tassert.NoError(t, err)\n\tassert.Equal(t, float64(10), out)\n}\n\nfunc TestIssue462(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"foo\": func() (string, error) {\n\t\t\treturn \"bar\", nil\n\t\t},\n\t}\n\t_, err := expr.Compile(`$env.unknown(int())`, expr.Env(env))\n\trequire.Error(t, err)\n}\n\nfunc TestIssue_embedded_pointer_struct(t *testing.T) {\n\tvar tests = []struct {\n\t\tinput string\n\t\tenv   mock.Env\n\t\twant  any\n\t}{\n\t\t{\n\t\t\tinput: \"EmbedPointerEmbedInt > 0\",\n\t\t\tenv: mock.Env{\n\t\t\t\tEmbed: mock.Embed{\n\t\t\t\t\tEmbedPointerEmbed: &mock.EmbedPointerEmbed{\n\t\t\t\t\t\tEmbedPointerEmbedInt: 123,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tinput: \"(Embed).EmbedPointerEmbedInt > 0\",\n\t\t\tenv: mock.Env{\n\t\t\t\tEmbed: mock.Embed{\n\t\t\t\t\tEmbedPointerEmbed: &mock.EmbedPointerEmbed{\n\t\t\t\t\t\tEmbedPointerEmbedInt: 123,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tinput: \"(Embed).EmbedPointerEmbedInt > 0\",\n\t\t\tenv: mock.Env{\n\t\t\t\tEmbed: mock.Embed{\n\t\t\t\t\tEmbedPointerEmbed: &mock.EmbedPointerEmbed{\n\t\t\t\t\t\tEmbedPointerEmbedInt: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tinput: \"(Embed).EmbedPointerEmbedMethod(0)\",\n\t\t\tenv: mock.Env{\n\t\t\t\tEmbed: mock.Embed{\n\t\t\t\t\tEmbedPointerEmbed: &mock.EmbedPointerEmbed{\n\t\t\t\t\t\tEmbedPointerEmbedInt: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: \"\",\n\t\t},\n\t\t{\n\t\t\tinput: \"(Embed).EmbedPointerEmbedPointerReceiverMethod(0)\",\n\t\t\tenv: mock.Env{\n\t\t\t\tEmbed: mock.Embed{\n\t\t\t\t\tEmbedPointerEmbed: nil,\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: \"\",\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.input, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.input, expr.Env(tt.env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tout, err := expr.Run(program, tt.env)\n\t\t\trequire.NoError(t, err)\n\n\t\t\trequire.Equal(t, tt.want, out)\n\t\t})\n\t}\n}\n\nfunc TestIssue474(t *testing.T) {\n\ttestCases := []struct {\n\t\tcode string\n\t\tfail bool\n\t}{\n\t\t{\n\t\t\tcode: `func(\"invalid\")`,\n\t\t\tfail: true,\n\t\t},\n\t\t{\n\t\t\tcode: `func(true)`,\n\t\t\tfail: true,\n\t\t},\n\t\t{\n\t\t\tcode: `func([])`,\n\t\t\tfail: true,\n\t\t},\n\t\t{\n\t\t\tcode: `func({})`,\n\t\t\tfail: true,\n\t\t},\n\t\t{\n\t\t\tcode: `func(1)`,\n\t\t\tfail: false,\n\t\t},\n\t\t{\n\t\t\tcode: `func(1.5)`,\n\t\t\tfail: false,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tltc := tc\n\t\tt.Run(ltc.code, func(t *testing.T) {\n\t\t\tt.Parallel()\n\t\t\tfunction := expr.Function(\"func\", func(params ...any) (any, error) {\n\t\t\t\treturn true, nil\n\t\t\t}, new(func(float64) bool))\n\t\t\t_, err := expr.Compile(ltc.code, function)\n\t\t\tif ltc.fail {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Error(\"expected an error, but it was nil\")\n\t\t\t\t\tt.FailNow()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"expected nil, but it was %v\", err)\n\t\t\t\t\tt.FailNow()\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestRaceCondition_variables(t *testing.T) {\n\tprogram, err := expr.Compile(`let foo = 1; foo + 1`, expr.Env(mock.Env{}))\n\trequire.NoError(t, err)\n\n\tvar wg sync.WaitGroup\n\n\tfor i := 0; i < 10; i++ {\n\t\twg.Add(1)\n\t\tgo func() {\n\t\t\tdefer wg.Done()\n\t\t\tout, err := expr.Run(program, mock.Env{})\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.Equal(t, 2, out)\n\t\t}()\n\t}\n\n\twg.Wait()\n}\n\nfunc TestOperatorDependsOnEnv(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"plus\": func(a, b int) int {\n\t\t\treturn 42\n\t\t},\n\t}\n\tprogram, err := expr.Compile(`1 + 2`, expr.Operator(\"+\", \"plus\"), expr.Env(env))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\tassert.Equal(t, 42, out)\n}\n\nfunc TestIssue624(t *testing.T) {\n\ttype tag struct {\n\t\tName string\n\t}\n\n\ttype item struct {\n\t\tTags []tag\n\t}\n\n\ti := item{\n\t\tTags: []tag{\n\t\t\t{Name: \"one\"},\n\t\t\t{Name: \"two\"},\n\t\t},\n\t}\n\n\trule := `[\ntrue && true, \none(Tags, .Name in [\"one\"]), \none(Tags, .Name in [\"two\"]), \none(Tags, .Name in [\"one\"]) && one(Tags, .Name in [\"two\"])\n]`\n\tresp, err := expr.Eval(rule, i)\n\trequire.NoError(t, err)\n\trequire.Equal(t, []interface{}{true, true, true, true}, resp)\n}\n\nfunc TestPredicateCombination(t *testing.T) {\n\ttests := []struct {\n\t\tcode1 string\n\t\tcode2 string\n\t}{\n\t\t{\"all(1..3, {# > 0}) && all(1..3, {# < 4})\", \"all(1..3, {# > 0 && # < 4})\"},\n\t\t{\"all(1..3, {# > 1}) && all(1..3, {# < 4})\", \"all(1..3, {# > 1 && # < 4})\"},\n\t\t{\"all(1..3, {# > 0}) && all(1..3, {# < 2})\", \"all(1..3, {# > 0 && # < 2})\"},\n\t\t{\"all(1..3, {# > 1}) && all(1..3, {# < 2})\", \"all(1..3, {# > 1 && # < 2})\"},\n\n\t\t{\"any(1..3, {# > 0}) || any(1..3, {# < 4})\", \"any(1..3, {# > 0 || # < 4})\"},\n\t\t{\"any(1..3, {# > 1}) || any(1..3, {# < 4})\", \"any(1..3, {# > 1 || # < 4})\"},\n\t\t{\"any(1..3, {# > 0}) || any(1..3, {# < 2})\", \"any(1..3, {# > 0 || # < 2})\"},\n\t\t{\"any(1..3, {# > 1}) || any(1..3, {# < 2})\", \"any(1..3, {# > 1 || # < 2})\"},\n\n\t\t{\"none(1..3, {# > 0}) && none(1..3, {# < 4})\", \"none(1..3, {# > 0 || # < 4})\"},\n\t\t{\"none(1..3, {# > 1}) && none(1..3, {# < 4})\", \"none(1..3, {# > 1 || # < 4})\"},\n\t\t{\"none(1..3, {# > 0}) && none(1..3, {# < 2})\", \"none(1..3, {# > 0 || # < 2})\"},\n\t\t{\"none(1..3, {# > 1}) && none(1..3, {# < 2})\", \"none(1..3, {# > 1 || # < 2})\"},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code1, func(t *testing.T) {\n\t\t\tout1, err := expr.Eval(tt.code1, nil)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tout2, err := expr.Eval(tt.code2, nil)\n\t\t\trequire.NoError(t, err)\n\n\t\t\trequire.Equal(t, out1, out2)\n\t\t})\n\t}\n}\n\nfunc TestArrayComparison(t *testing.T) {\n\ttests := []struct {\n\t\tenv  any\n\t\tcode string\n\t}{\n\t\t{[]string{\"A\", \"B\"}, \"foo == ['A', 'B']\"},\n\t\t{[]int{1, 2}, \"foo == [1, 2]\"},\n\t\t{[]uint8{1, 2}, \"foo == [1, 2]\"},\n\t\t{[]float64{1.1, 2.2}, \"foo == [1.1, 2.2]\"},\n\t\t{[]any{\"A\", 1, 1.1, true}, \"foo == ['A', 1, 1.1, true]\"},\n\t\t{[]string{\"A\", \"B\"}, \"foo != [1, 2]\"},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\tenv := map[string]any{\"foo\": tt.env}\n\t\t\tprogram, err := expr.Compile(tt.code, expr.Env(env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tout, err := expr.Run(program, env)\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.Equal(t, true, out)\n\t\t})\n\t}\n}\n\nfunc TestIssue_570(t *testing.T) {\n\ttype Student struct {\n\t\tName string\n\t}\n\n\tenv := map[string]any{\n\t\t\"student\": (*Student)(nil),\n\t}\n\n\tprogram, err := expr.Compile(\"student?.Name\", expr.Env(env))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.IsType(t, nil, out)\n}\n\nfunc TestIssue_integer_truncated_by_compiler(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"fn\": func(x byte) byte {\n\t\t\treturn x\n\t\t},\n\t}\n\n\t_, err := expr.Compile(\"fn(255)\", expr.Env(env))\n\trequire.NoError(t, err)\n\n\t_, err = expr.Compile(\"fn(256)\", expr.Env(env))\n\trequire.Error(t, err)\n}\n\nfunc TestExpr_crash(t *testing.T) {\n\tcontent, err := os.ReadFile(\"testdata/crash.txt\")\n\trequire.NoError(t, err)\n\n\t_, err = expr.Compile(string(content))\n\trequire.Error(t, err)\n}\n\nfunc TestExpr_crash_with_zero(t *testing.T) {\n\tcode := \"if\\x00\"\n\t_, err := expr.Compile(code)\n\trequire.Error(t, err)\n}\n\nfunc TestExpr_nil_op_str(t *testing.T) {\n\t// Let's test operators, which do `.(string)` in VM, also check for nil.\n\n\tvar str *string = nil\n\tenv := map[string]any{\n\t\t\"nilString\": str,\n\t}\n\n\ttests := []struct{ code string }{\n\t\t{`nilString == \"str\"`},\n\t\t{`nilString contains \"str\"`},\n\t\t{`nilString matches \"str\"`},\n\t\t{`nilString startsWith \"str\"`},\n\t\t{`nilString endsWith \"str\"`},\n\n\t\t{`\"str\" == nilString`},\n\t\t{`\"str\" contains nilString`},\n\t\t{`\"str\" matches nilString`},\n\t\t{`\"str\" startsWith nilString`},\n\t\t{`\"str\" endsWith nilString`},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.code)\n\t\t\trequire.NoError(t, err)\n\n\t\t\toutput, err := expr.Run(program, env)\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.Equal(t, false, output)\n\t\t})\n\t}\n}\n\nfunc TestExpr_env_types_map(t *testing.T) {\n\tenvTypes := types.Map{\n\t\t\"foo\": types.Map{\n\t\t\t\"bar\": types.String,\n\t\t},\n\t}\n\n\tprogram, err := expr.Compile(`foo.bar`, expr.Env(envTypes))\n\trequire.NoError(t, err)\n\n\tenv := map[string]any{\n\t\t\"foo\": map[string]any{\n\t\t\t\"bar\": \"value\",\n\t\t},\n\t}\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, \"value\", output)\n}\n\nfunc TestExpr_env_types_map_error(t *testing.T) {\n\tenvTypes := types.Map{\n\t\t\"foo\": types.Map{\n\t\t\t\"bar\": types.String,\n\t\t},\n\t}\n\n\tprogram, err := expr.Compile(`foo.bar`, expr.Env(envTypes))\n\trequire.NoError(t, err)\n\n\t_, err = expr.Run(program, envTypes)\n\trequire.Error(t, err)\n}\n\nfunc TestIssue758_filter_map_index(t *testing.T) {\n\tenv := map[string]interface{}{}\n\n\texprStr := `\n        let a_map = 0..5 | filter(# % 2 == 0) | map(#index);\n        let b_filter = 0..5 | filter(# % 2 == 0);\n        let b_map = b_filter | map(#index);\n        [a_map, b_map]\n    `\n\n\tresult, err := expr.Eval(exprStr, env)\n\trequire.NoError(t, err)\n\n\texpected := []interface{}{\n\t\t[]interface{}{0, 1, 2},\n\t\t[]interface{}{0, 1, 2},\n\t}\n\n\trequire.Equal(t, expected, result)\n}\n\nfunc TestExpr_wierd_cases(t *testing.T) {\n\tenv := map[string]any{}\n\n\t_, err := expr.Compile(`A(A)`, expr.Env(env))\n\trequire.Error(t, err)\n\trequire.Contains(t, err.Error(), \"unknown name A\")\n}\n\nfunc TestIssue785_get_nil(t *testing.T) {\n\texprStrs := []string{\n\t\t`get(nil, \"a\")`,\n\t\t`get({}, \"a\")`,\n\t\t`get(nil, \"a\")`,\n\t\t`get({}, \"a\")`,\n\t\t`({} | get(\"a\") | get(\"b\"))`,\n\t}\n\n\tfor _, exprStr := range exprStrs {\n\t\tt.Run(\"get returns nil\", func(t *testing.T) {\n\t\t\tenv := map[string]interface{}{}\n\n\t\t\tresult, err := expr.Eval(exprStr, env)\n\t\t\trequire.NoError(t, err)\n\n\t\t\trequire.Equal(t, nil, result)\n\t\t})\n\t}\n}\n\nfunc TestMaxNodes(t *testing.T) {\n\tmaxNodes := uint(100)\n\n\tcode := \"\"\n\tfor i := 0; i < int(maxNodes); i++ {\n\t\tcode += \"1; \"\n\t}\n\n\t_, err := expr.Compile(code, expr.MaxNodes(maxNodes))\n\trequire.Error(t, err)\n\tassert.Contains(t, err.Error(), \"exceeds maximum allowed nodes\")\n\n\t_, err = expr.Compile(code, expr.MaxNodes(maxNodes+1))\n\trequire.NoError(t, err)\n}\n\nfunc TestMaxNodesDisabled(t *testing.T) {\n\tcode := \"\"\n\tfor i := 0; i < 2*int(conf.DefaultMaxNodes); i++ {\n\t\tcode += \"1; \"\n\t}\n\n\t_, err := expr.Compile(code, expr.MaxNodes(0))\n\trequire.NoError(t, err)\n}\n\nfunc TestMemoryBudget(t *testing.T) {\n\ttests := []struct {\n\t\tcode string\n\t\tmax  int\n\t}{\n\t\t{`map(1..100, {map(1..100, {map(1..100, {0})})})`, -1},\n\t\t{`len(1..10000000)`, -1},\n\t\t{`1..100`, 100},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.code)\n\t\t\trequire.NoError(t, err, \"compile error\")\n\n\t\t\tvm := vm.VM{}\n\t\t\tif tt.max > 0 {\n\t\t\t\tvm.MemoryBudget = uint(tt.max)\n\t\t\t}\n\t\t\t_, err = vm.Run(program, nil)\n\t\t\trequire.Error(t, err, \"run error\")\n\t\t\tassert.Contains(t, err.Error(), \"memory budget exceeded\")\n\t\t})\n\t}\n}\n\nfunc TestIssue802(t *testing.T) {\n\tprog, err := expr.Compile(`arr[1:2][0]`)\n\tif err != nil {\n\t\tt.Fatalf(\"error compiling program: %v\", err)\n\t}\n\tval, err := expr.Run(prog, map[string]any{\n\t\t\"arr\": [5]int{0, 1, 2, 3, 4},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"error running program: %v\", err)\n\t}\n\tvalInt, ok := val.(int)\n\tif !ok || valInt != 1 {\n\t\tt.Fatalf(\"invalid result, expected 1, got %v\", val)\n\t}\n}\n\nfunc TestIssue807(t *testing.T) {\n\ttype MyStruct struct {\n\t\tnonExported string\n\t}\n\tout, err := expr.Eval(` \"nonExported\" in $env `, MyStruct{})\n\tif err != nil {\n\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t}\n\tb, ok := out.(bool)\n\tif !ok {\n\t\tt.Fatalf(\"expected boolean type, got %T: %v\", b, b)\n\t}\n\tif b {\n\t\tt.Fatalf(\"expected 'in' operator to return false for unexported field\")\n\t}\n}\n\nfunc TestDisableShortCircuit(t *testing.T) {\n\tcount := 0\n\texprStr := \"foo() or bar()\"\n\tenv := map[string]any{\n\t\t\"foo\": func() bool {\n\t\t\tcount++\n\t\t\treturn true\n\t\t},\n\t\t\"bar\": func() bool {\n\t\t\tcount++\n\t\t\treturn true\n\t\t},\n\t}\n\n\tprogram, _ := expr.Compile(exprStr, expr.DisableShortCircuit())\n\tgot, _ := expr.Run(program, env)\n\tassert.Equal(t, 2, count)\n\tassert.True(t, got.(bool))\n\n\tprogram, _ = expr.Compile(exprStr)\n\tgot, _ = expr.Run(program, env)\n\tassert.Equal(t, 3, count)\n\tassert.True(t, got.(bool))\n}\n\nfunc TestBytesLiteral(t *testing.T) {\n\ttests := []struct {\n\t\tcode string\n\t\twant []byte\n\t}{\n\t\t{`b\"hello\"`, []byte(\"hello\")},\n\t\t{`b'world'`, []byte(\"world\")},\n\t\t{`b\"\"`, []byte{}},\n\t\t{`b'\\x00\\xff'`, []byte{0, 255}},\n\t\t{`b\"\\x41\\x42\\x43\"`, []byte(\"ABC\")},\n\t\t{`b'\\101\\102\\103'`, []byte(\"ABC\")},\n\t\t{`b'\\n\\t\\r'`, []byte{'\\n', '\\t', '\\r'}},\n\t\t{`b'hello\\x00world'`, []byte(\"hello\\x00world\")},\n\t\t{`b\"ÿ\"`, []byte{0xc3, 0xbf}}, // UTF-8 encoding of ÿ\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.code)\n\t\t\trequire.NoError(t, err)\n\n\t\t\toutput, err := expr.Run(program, nil)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tt.want, output)\n\t\t})\n\t}\n}\n\nfunc TestBytesLiteral_type(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"data\": []byte(\"test\"),\n\t}\n\n\t// Verify bytes literal has []byte type and can be compared with []byte\n\tprogram, err := expr.Compile(`data == b\"test\"`, expr.Env(env))\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\tassert.Equal(t, true, output)\n}\n\nfunc TestBytesLiteral_errors(t *testing.T) {\n\t// \\u and \\U escapes should not be allowed in bytes literals\n\terrorCases := []string{\n\t\t`b'\\u0041'`,\n\t\t`b\"\\U00000041\"`,\n\t}\n\n\tfor _, code := range errorCases {\n\t\tt.Run(code, func(t *testing.T) {\n\t\t\t_, err := expr.Compile(code)\n\t\t\trequire.Error(t, err)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "file/error.go",
    "content": "package file\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype Error struct {\n\tLocation\n\tLine    int    `json:\"line\"`\n\tColumn  int    `json:\"column\"`\n\tMessage string `json:\"message\"`\n\tSnippet string `json:\"snippet\"`\n\tPrev    error  `json:\"prev\"`\n}\n\nfunc (e *Error) Error() string {\n\treturn e.format()\n}\n\nvar tabReplacer = strings.NewReplacer(\"\\t\", \" \")\n\nfunc (e *Error) Bind(source Source) *Error {\n\tsrc := source.String()\n\n\tvar runeCount, lineStart int\n\te.Line = 1\n\te.Column = 0\n\tfor i, r := range src {\n\t\tif runeCount == e.From {\n\t\t\tbreak\n\t\t}\n\t\tif r == '\\n' {\n\t\t\tlineStart = i + 1\n\t\t\te.Line++\n\t\t\te.Column = 0\n\t\t} else {\n\t\t\te.Column++\n\t\t}\n\t\truneCount++\n\t}\n\n\tlineEnd := lineStart + strings.IndexByte(src[lineStart:], '\\n')\n\tif lineEnd < lineStart {\n\t\tlineEnd = len(src)\n\t}\n\tif lineStart == lineEnd {\n\t\treturn e\n\t}\n\n\tconst prefix = \"\\n | \"\n\tline := src[lineStart:lineEnd]\n\tsnippet := new(strings.Builder)\n\tsnippet.Grow(2*len(prefix) + len(line) + e.Column + 1)\n\tsnippet.WriteString(prefix)\n\ttabReplacer.WriteString(snippet, line)\n\tsnippet.WriteString(prefix)\n\tfor i := 0; i < e.Column; i++ {\n\t\tsnippet.WriteByte('.')\n\t}\n\tsnippet.WriteByte('^')\n\te.Snippet = snippet.String()\n\treturn e\n}\n\nfunc (e *Error) Unwrap() error {\n\treturn e.Prev\n}\n\nfunc (e *Error) Wrap(err error) {\n\te.Prev = err\n}\n\nfunc (e *Error) format() string {\n\tif e.Snippet == \"\" {\n\t\treturn e.Message\n\t}\n\treturn fmt.Sprintf(\n\t\t\"%s (%d:%d)%s\",\n\t\te.Message,\n\t\te.Line,\n\t\te.Column+1, // add one to the 0-based column for display\n\t\te.Snippet,\n\t)\n}\n"
  },
  {
    "path": "file/location.go",
    "content": "package file\n\ntype Location struct {\n\tFrom int `json:\"from\"`\n\tTo   int `json:\"to\"`\n}\n"
  },
  {
    "path": "file/source.go",
    "content": "package file\n\nimport \"strings\"\n\ntype Source struct {\n\traw string\n}\n\nfunc NewSource(contents string) Source {\n\treturn Source{\n\t\traw: contents,\n\t}\n}\n\nfunc (s Source) String() string {\n\treturn s.raw\n}\n\nfunc (s Source) Snippet(line int) (string, bool) {\n\tif s.raw == \"\" {\n\t\treturn \"\", false\n\t}\n\tvar start int\n\tfor i := 1; i < line; i++ {\n\t\tpos := strings.IndexByte(s.raw[start:], '\\n')\n\t\tif pos < 0 {\n\t\t\treturn \"\", false\n\t\t}\n\t\tstart += pos + 1\n\t}\n\tend := start + strings.IndexByte(s.raw[start:], '\\n')\n\tif end < start {\n\t\tend = len(s.raw)\n\t}\n\treturn s.raw[start:end], true\n}\n"
  },
  {
    "path": "file/source_test.go",
    "content": "package file\n\nimport (\n\t\"testing\"\n)\n\nconst (\n\tunexpectedSnippet = \"%s got snippet '%s', want '%v'\"\n\tsnippetNotFound   = \"%s snippet not found, wanted '%v'\"\n\tsnippetFound      = \"%s snippet found at Line %d, wanted none\"\n)\n\nfunc TestStringSource_SnippetMultiLine(t *testing.T) {\n\tsource := NewSource(\"hello\\nworld\\nmy\\nbub\\n\")\n\tif str, found := source.Snippet(1); !found {\n\t\tt.Errorf(snippetNotFound, t.Name(), 1)\n\t} else if str != \"hello\" {\n\t\tt.Errorf(unexpectedSnippet, t.Name(), str, \"hello\")\n\t}\n\tif str2, found := source.Snippet(2); !found {\n\t\tt.Errorf(snippetNotFound, t.Name(), 2)\n\t} else if str2 != \"world\" {\n\t\tt.Errorf(unexpectedSnippet, t.Name(), str2, \"world\")\n\t}\n\tif str3, found := source.Snippet(3); !found {\n\t\tt.Errorf(snippetNotFound, t.Name(), 3)\n\t} else if str3 != \"my\" {\n\t\tt.Errorf(unexpectedSnippet, t.Name(), str3, \"my\")\n\t}\n\tif str4, found := source.Snippet(4); !found {\n\t\tt.Errorf(snippetNotFound, t.Name(), 4)\n\t} else if str4 != \"bub\" {\n\t\tt.Errorf(unexpectedSnippet, t.Name(), str4, \"bub\")\n\t}\n\tif str5, found := source.Snippet(5); !found {\n\t\tt.Errorf(snippetNotFound, t.Name(), 5)\n\t} else if str5 != \"\" {\n\t\tt.Errorf(unexpectedSnippet, t.Name(), str5, \"\")\n\t}\n}\n\nfunc TestStringSource_SnippetSingleLine(t *testing.T) {\n\tsource := NewSource(\"hello, world\")\n\tif str, found := source.Snippet(1); !found {\n\t\tt.Errorf(snippetNotFound, t.Name(), 1)\n\t} else if str != \"hello, world\" {\n\t\tt.Errorf(unexpectedSnippet, t.Name(), str, \"hello, world\")\n\t}\n\tif str2, found := source.Snippet(2); found {\n\t\tt.Errorf(snippetFound, t.Name(), 2)\n\t} else if str2 != \"\" {\n\t\tt.Errorf(unexpectedSnippet, t.Name(), str2, \"\")\n\t}\n}\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/expr-lang/expr\n\ngo 1.18\n"
  },
  {
    "path": "internal/deref/deref.go",
    "content": "package deref\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n)\n\nfunc Interface(p any) any {\n\tif p == nil {\n\t\treturn nil\n\t}\n\n\tv := reflect.ValueOf(p)\n\n\tfor v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface {\n\t\tif v.IsNil() {\n\t\t\treturn nil\n\t\t}\n\t\tv = v.Elem()\n\t}\n\n\tif v.IsValid() {\n\t\treturn v.Interface()\n\t}\n\n\tpanic(fmt.Sprintf(\"cannot dereference %v\", p))\n}\n\nfunc Type(t reflect.Type) reflect.Type {\n\tif t == nil {\n\t\treturn nil\n\t}\n\tfor t.Kind() == reflect.Ptr {\n\t\tt = t.Elem()\n\t}\n\treturn t\n}\n\nfunc Value(v reflect.Value) reflect.Value {\n\tfor v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface {\n\t\tif v.IsNil() {\n\t\t\treturn v\n\t\t}\n\t\tv = v.Elem()\n\t}\n\treturn v\n}\n\nfunc TypeKind(t reflect.Type, k reflect.Kind) (_ reflect.Type, _ reflect.Kind, changed bool) {\n\tfor k == reflect.Pointer {\n\t\tchanged = true\n\t\tt = t.Elem()\n\t\tk = t.Kind()\n\t}\n\treturn t, k, changed\n}\n"
  },
  {
    "path": "internal/deref/deref_test.go",
    "content": "package deref_test\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\n\t\"github.com/expr-lang/expr/internal/deref\"\n)\n\nfunc TestDeref(t *testing.T) {\n\ta := uint(42)\n\tb := &a\n\tc := &b\n\td := &c\n\n\tgot := deref.Interface(d)\n\tassert.Equal(t, uint(42), got)\n}\n\nfunc TestDeref_mix_ptr_with_interface(t *testing.T) {\n\ta := uint(42)\n\tvar b any = &a\n\tvar c any = &b\n\td := &c\n\n\tgot := deref.Interface(d)\n\tassert.Equal(t, uint(42), got)\n}\n\nfunc TestDeref_nil(t *testing.T) {\n\tvar a *int\n\tassert.Nil(t, deref.Interface(a))\n\tassert.Nil(t, deref.Interface(nil))\n}\n\nfunc TestType(t *testing.T) {\n\ta := uint(42)\n\tb := &a\n\tc := &b\n\td := &c\n\n\tdt := deref.Type(reflect.TypeOf(d))\n\tassert.Equal(t, reflect.Uint, dt.Kind())\n}\n\nfunc TestType_two_ptr_with_interface(t *testing.T) {\n\ta := uint(42)\n\tvar b any = &a\n\n\tdt := deref.Type(reflect.TypeOf(b))\n\tassert.Equal(t, reflect.Uint, dt.Kind())\n\n}\n\nfunc TestType_three_ptr_with_interface(t *testing.T) {\n\ta := uint(42)\n\tvar b any = &a\n\tvar c any = &b\n\n\tdt := deref.Type(reflect.TypeOf(c))\n\tassert.Equal(t, reflect.Interface, dt.Kind())\n}\n\nfunc TestType_nil(t *testing.T) {\n\tassert.Nil(t, deref.Type(nil))\n}\n\nfunc TestValue(t *testing.T) {\n\ta := uint(42)\n\tb := &a\n\tc := &b\n\td := &c\n\n\tgot := deref.Value(reflect.ValueOf(d))\n\tassert.Equal(t, uint(42), got.Interface())\n}\n\nfunc TestValue_two_ptr_with_interface(t *testing.T) {\n\ta := uint(42)\n\tvar b any = &a\n\n\tgot := deref.Value(reflect.ValueOf(b))\n\tassert.Equal(t, uint(42), got.Interface())\n}\n\nfunc TestValue_three_ptr_with_interface(t *testing.T) {\n\ta := uint(42)\n\tvar b any = &a\n\tc := &b\n\n\tgot := deref.Value(reflect.ValueOf(c))\n\tassert.Equal(t, uint(42), got.Interface())\n}\n\nfunc TestValue_nil(t *testing.T) {\n\tgot := deref.Value(reflect.ValueOf(nil))\n\tassert.False(t, got.IsValid())\n}\n\nfunc TestValue_nil_in_chain(t *testing.T) {\n\tvar a any = nil\n\tvar b any = &a\n\tc := &b\n\n\tgot := deref.Value(reflect.ValueOf(c))\n\tassert.True(t, got.IsValid())\n\tassert.True(t, got.IsNil())\n\tassert.Nil(t, got.Interface())\n}\n"
  },
  {
    "path": "internal/difflib/difflib.go",
    "content": "// Package difflib is a partial port of Python difflib module.\n//\n// It provides tools to compare sequences of strings and generate textual diffs.\n//\n// The following class and functions have been ported:\n//\n// - SequenceMatcher\n//\n// - unified_diff\n//\n// - context_diff\n//\n// Getting unified diffs was the main goal of the port. Keep in mind this code\n// is mostly suitable to output text differences in a human friendly way, there\n// are no guarantees generated diffs are consumable by patch(1).\npackage difflib\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n)\n\nfunc min(a, b int) int {\n\tif a < b {\n\t\treturn a\n\t}\n\treturn b\n}\n\nfunc max(a, b int) int {\n\tif a > b {\n\t\treturn a\n\t}\n\treturn b\n}\n\nfunc calculateRatio(matches, length int) float64 {\n\tif length > 0 {\n\t\treturn 2.0 * float64(matches) / float64(length)\n\t}\n\treturn 1.0\n}\n\ntype Match struct {\n\tA    int\n\tB    int\n\tSize int\n}\n\ntype OpCode struct {\n\tTag byte\n\tI1  int\n\tI2  int\n\tJ1  int\n\tJ2  int\n}\n\n// SequenceMatcher compares sequence of strings. The basic\n// algorithm predates, and is a little fancier than, an algorithm\n// published in the late 1980's by Ratcliff and Obershelp under the\n// hyperbolic name \"gestalt pattern matching\".  The basic idea is to find\n// the longest contiguous matching subsequence that contains no \"junk\"\n// elements (R-O doesn't address junk).  The same idea is then applied\n// recursively to the pieces of the sequences to the left and to the right\n// of the matching subsequence.  This does not yield minimal edit\n// sequences, but does tend to yield matches that \"look right\" to people.\n//\n// SequenceMatcher tries to compute a \"human-friendly diff\" between two\n// sequences.  Unlike e.g. UNIX(tm) diff, the fundamental notion is the\n// longest *contiguous* & junk-free matching subsequence.  That's what\n// catches peoples' eyes.  The Windows(tm) windiff has another interesting\n// notion, pairing up elements that appear uniquely in each sequence.\n// That, and the method here, appear to yield more intuitive difference\n// reports than does diff.  This method appears to be the least vulnerable\n// to synching up on blocks of \"junk lines\", though (like blank lines in\n// ordinary text files, or maybe \"<P>\" lines in HTML files).  That may be\n// because this is the only method of the 3 that has a *concept* of\n// \"junk\" <wink>.\n//\n// Timing:  Basic R-O is cubic time worst case and quadratic time expected\n// case.  SequenceMatcher is quadratic time for the worst case and has\n// expected-case behavior dependent in a complicated way on how many\n// elements the sequences have in common; best case time is linear.\ntype SequenceMatcher struct {\n\ta              []string\n\tb              []string\n\tb2j            map[string][]int\n\tIsJunk         func(string) bool\n\tautoJunk       bool\n\tbJunk          map[string]struct{}\n\tmatchingBlocks []Match\n\tfullBCount     map[string]int\n\tbPopular       map[string]struct{}\n\topCodes        []OpCode\n}\n\nfunc NewMatcher(a, b []string) *SequenceMatcher {\n\tm := SequenceMatcher{autoJunk: true}\n\tm.SetSeqs(a, b)\n\treturn &m\n}\n\nfunc NewMatcherWithJunk(a, b []string, autoJunk bool,\n\tisJunk func(string) bool) *SequenceMatcher {\n\n\tm := SequenceMatcher{IsJunk: isJunk, autoJunk: autoJunk}\n\tm.SetSeqs(a, b)\n\treturn &m\n}\n\n// Set two sequences to be compared.\nfunc (m *SequenceMatcher) SetSeqs(a, b []string) {\n\tm.SetSeq1(a)\n\tm.SetSeq2(b)\n}\n\n// Set the first sequence to be compared. The second sequence to be compared is\n// not changed.\n//\n// SequenceMatcher computes and caches detailed information about the second\n// sequence, so if you want to compare one sequence S against many sequences,\n// use .SetSeq2(s) once and call .SetSeq1(x) repeatedly for each of the other\n// sequences.\n//\n// See also SetSeqs() and SetSeq2().\nfunc (m *SequenceMatcher) SetSeq1(a []string) {\n\tif &a == &m.a {\n\t\treturn\n\t}\n\tm.a = a\n\tm.matchingBlocks = nil\n\tm.opCodes = nil\n}\n\n// Set the second sequence to be compared. The first sequence to be compared is\n// not changed.\nfunc (m *SequenceMatcher) SetSeq2(b []string) {\n\tif &b == &m.b {\n\t\treturn\n\t}\n\tm.b = b\n\tm.matchingBlocks = nil\n\tm.opCodes = nil\n\tm.fullBCount = nil\n\tm.chainB()\n}\n\nfunc (m *SequenceMatcher) chainB() {\n\t// Populate line -> index mapping\n\tb2j := map[string][]int{}\n\tfor i, s := range m.b {\n\t\tindices := b2j[s]\n\t\tindices = append(indices, i)\n\t\tb2j[s] = indices\n\t}\n\n\t// Purge junk elements\n\tm.bJunk = map[string]struct{}{}\n\tif m.IsJunk != nil {\n\t\tjunk := m.bJunk\n\t\tfor s, _ := range b2j {\n\t\t\tif m.IsJunk(s) {\n\t\t\t\tjunk[s] = struct{}{}\n\t\t\t}\n\t\t}\n\t\tfor s, _ := range junk {\n\t\t\tdelete(b2j, s)\n\t\t}\n\t}\n\n\t// Purge remaining popular elements\n\tpopular := map[string]struct{}{}\n\tn := len(m.b)\n\tif m.autoJunk && n >= 200 {\n\t\tntest := n/100 + 1\n\t\tfor s, indices := range b2j {\n\t\t\tif len(indices) > ntest {\n\t\t\t\tpopular[s] = struct{}{}\n\t\t\t}\n\t\t}\n\t\tfor s, _ := range popular {\n\t\t\tdelete(b2j, s)\n\t\t}\n\t}\n\tm.bPopular = popular\n\tm.b2j = b2j\n}\n\nfunc (m *SequenceMatcher) isBJunk(s string) bool {\n\t_, ok := m.bJunk[s]\n\treturn ok\n}\n\n// Find longest matching block in a[alo:ahi] and b[blo:bhi].\n//\n// If IsJunk is not defined:\n//\n// Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where\n//\n//\talo <= i <= i+k <= ahi\n//\tblo <= j <= j+k <= bhi\n//\n// and for all (i',j',k') meeting those conditions,\n//\n//\tk >= k'\n//\ti <= i'\n//\tand if i == i', j <= j'\n//\n// In other words, of all maximal matching blocks, return one that\n// starts earliest in a, and of all those maximal matching blocks that\n// start earliest in a, return the one that starts earliest in b.\n//\n// If IsJunk is defined, first the longest matching block is\n// determined as above, but with the additional restriction that no\n// junk element appears in the block.  Then that block is extended as\n// far as possible by matching (only) junk elements on both sides.  So\n// the resulting block never matches on junk except as identical junk\n// happens to be adjacent to an \"interesting\" match.\n//\n// If no blocks match, return (alo, blo, 0).\nfunc (m *SequenceMatcher) findLongestMatch(alo, ahi, blo, bhi int) Match {\n\t// CAUTION:  stripping common prefix or suffix would be incorrect.\n\t// E.g.,\n\t//    ab\n\t//    acab\n\t// Longest matching block is \"ab\", but if common prefix is\n\t// stripped, it's \"a\" (tied with \"b\").  UNIX(tm) diff does so\n\t// strip, so ends up claiming that ab is changed to acab by\n\t// inserting \"ca\" in the middle.  That's minimal but unintuitive:\n\t// \"it's obvious\" that someone inserted \"ac\" at the front.\n\t// Windiff ends up at the same place as diff, but by pairing up\n\t// the unique 'b's and then matching the first two 'a's.\n\tbesti, bestj, bestsize := alo, blo, 0\n\n\t// find longest junk-free match\n\t// during an iteration of the loop, j2len[j] = length of longest\n\t// junk-free match ending with a[i-1] and b[j]\n\tj2len := map[int]int{}\n\tfor i := alo; i != ahi; i++ {\n\t\t// look at all instances of a[i] in b; note that because\n\t\t// b2j has no junk keys, the loop is skipped if a[i] is junk\n\t\tnewj2len := map[int]int{}\n\t\tfor _, j := range m.b2j[m.a[i]] {\n\t\t\t// a[i] matches b[j]\n\t\t\tif j < blo {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif j >= bhi {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tk := j2len[j-1] + 1\n\t\t\tnewj2len[j] = k\n\t\t\tif k > bestsize {\n\t\t\t\tbesti, bestj, bestsize = i-k+1, j-k+1, k\n\t\t\t}\n\t\t}\n\t\tj2len = newj2len\n\t}\n\n\t// Extend the best by non-junk elements on each end.  In particular,\n\t// \"popular\" non-junk elements aren't in b2j, which greatly speeds\n\t// the inner loop above, but also means \"the best\" match so far\n\t// doesn't contain any junk *or* popular non-junk elements.\n\tfor besti > alo && bestj > blo && !m.isBJunk(m.b[bestj-1]) &&\n\t\tm.a[besti-1] == m.b[bestj-1] {\n\t\tbesti, bestj, bestsize = besti-1, bestj-1, bestsize+1\n\t}\n\tfor besti+bestsize < ahi && bestj+bestsize < bhi &&\n\t\t!m.isBJunk(m.b[bestj+bestsize]) &&\n\t\tm.a[besti+bestsize] == m.b[bestj+bestsize] {\n\t\tbestsize += 1\n\t}\n\n\t// Now that we have a wholly interesting match (albeit possibly\n\t// empty!), we may as well suck up the matching junk on each\n\t// side of it too.  Can't think of a good reason not to, and it\n\t// saves post-processing the (possibly considerable) expense of\n\t// figuring out what to do with it.  In the case of an empty\n\t// interesting match, this is clearly the right thing to do,\n\t// because no other kind of match is possible in the regions.\n\tfor besti > alo && bestj > blo && m.isBJunk(m.b[bestj-1]) &&\n\t\tm.a[besti-1] == m.b[bestj-1] {\n\t\tbesti, bestj, bestsize = besti-1, bestj-1, bestsize+1\n\t}\n\tfor besti+bestsize < ahi && bestj+bestsize < bhi &&\n\t\tm.isBJunk(m.b[bestj+bestsize]) &&\n\t\tm.a[besti+bestsize] == m.b[bestj+bestsize] {\n\t\tbestsize += 1\n\t}\n\n\treturn Match{A: besti, B: bestj, Size: bestsize}\n}\n\n// Return list of triples describing matching subsequences.\n//\n// Each triple is of the form (i, j, n), and means that\n// a[i:i+n] == b[j:j+n].  The triples are monotonically increasing in\n// i and in j. It's also guaranteed that if (i, j, n) and (i', j', n') are\n// adjacent triples in the list, and the second is not the last triple in the\n// list, then i+n != i' or j+n != j'. IOW, adjacent triples never describe\n// adjacent equal blocks.\n//\n// The last triple is a dummy, (len(a), len(b), 0), and is the only\n// triple with n==0.\nfunc (m *SequenceMatcher) GetMatchingBlocks() []Match {\n\tif m.matchingBlocks != nil {\n\t\treturn m.matchingBlocks\n\t}\n\n\tvar matchBlocks func(alo, ahi, blo, bhi int, matched []Match) []Match\n\tmatchBlocks = func(alo, ahi, blo, bhi int, matched []Match) []Match {\n\t\tmatch := m.findLongestMatch(alo, ahi, blo, bhi)\n\t\ti, j, k := match.A, match.B, match.Size\n\t\tif match.Size > 0 {\n\t\t\tif alo < i && blo < j {\n\t\t\t\tmatched = matchBlocks(alo, i, blo, j, matched)\n\t\t\t}\n\t\t\tmatched = append(matched, match)\n\t\t\tif i+k < ahi && j+k < bhi {\n\t\t\t\tmatched = matchBlocks(i+k, ahi, j+k, bhi, matched)\n\t\t\t}\n\t\t}\n\t\treturn matched\n\t}\n\tmatched := matchBlocks(0, len(m.a), 0, len(m.b), nil)\n\n\t// It's possible that we have adjacent equal blocks in the\n\t// matching_blocks list now.\n\tnonAdjacent := []Match{}\n\ti1, j1, k1 := 0, 0, 0\n\tfor _, b := range matched {\n\t\t// Is this block adjacent to i1, j1, k1?\n\t\ti2, j2, k2 := b.A, b.B, b.Size\n\t\tif i1+k1 == i2 && j1+k1 == j2 {\n\t\t\t// Yes, so collapse them -- this just increases the length of\n\t\t\t// the first block by the length of the second, and the first\n\t\t\t// block so lengthened remains the block to compare against.\n\t\t\tk1 += k2\n\t\t} else {\n\t\t\t// Not adjacent.  Remember the first block (k1==0 means it's\n\t\t\t// the dummy we started with), and make the second block the\n\t\t\t// new block to compare against.\n\t\t\tif k1 > 0 {\n\t\t\t\tnonAdjacent = append(nonAdjacent, Match{i1, j1, k1})\n\t\t\t}\n\t\t\ti1, j1, k1 = i2, j2, k2\n\t\t}\n\t}\n\tif k1 > 0 {\n\t\tnonAdjacent = append(nonAdjacent, Match{i1, j1, k1})\n\t}\n\n\tnonAdjacent = append(nonAdjacent, Match{len(m.a), len(m.b), 0})\n\tm.matchingBlocks = nonAdjacent\n\treturn m.matchingBlocks\n}\n\n// Return list of 5-tuples describing how to turn a into b.\n//\n// Each tuple is of the form (tag, i1, i2, j1, j2).  The first tuple\n// has i1 == j1 == 0, and remaining tuples have i1 == the i2 from the\n// tuple preceding it, and likewise for j1 == the previous j2.\n//\n// The tags are characters, with these meanings:\n//\n// 'r' (replace):  a[i1:i2] should be replaced by b[j1:j2]\n//\n// 'd' (delete):   a[i1:i2] should be deleted, j1==j2 in this case.\n//\n// 'i' (insert):   b[j1:j2] should be inserted at a[i1:i1], i1==i2 in this case.\n//\n// 'e' (equal):    a[i1:i2] == b[j1:j2]\nfunc (m *SequenceMatcher) GetOpCodes() []OpCode {\n\tif m.opCodes != nil {\n\t\treturn m.opCodes\n\t}\n\ti, j := 0, 0\n\tmatching := m.GetMatchingBlocks()\n\topCodes := make([]OpCode, 0, len(matching))\n\tfor _, m := range matching {\n\t\t//  invariant:  we've pumped out correct diffs to change\n\t\t//  a[:i] into b[:j], and the next matching block is\n\t\t//  a[ai:ai+size] == b[bj:bj+size]. So we need to pump\n\t\t//  out a diff to change a[i:ai] into b[j:bj], pump out\n\t\t//  the matching block, and move (i,j) beyond the match\n\t\tai, bj, size := m.A, m.B, m.Size\n\t\ttag := byte(0)\n\t\tif i < ai && j < bj {\n\t\t\ttag = 'r'\n\t\t} else if i < ai {\n\t\t\ttag = 'd'\n\t\t} else if j < bj {\n\t\t\ttag = 'i'\n\t\t}\n\t\tif tag > 0 {\n\t\t\topCodes = append(opCodes, OpCode{tag, i, ai, j, bj})\n\t\t}\n\t\ti, j = ai+size, bj+size\n\t\t// the list of matching blocks is terminated by a\n\t\t// sentinel with size 0\n\t\tif size > 0 {\n\t\t\topCodes = append(opCodes, OpCode{'e', ai, i, bj, j})\n\t\t}\n\t}\n\tm.opCodes = opCodes\n\treturn m.opCodes\n}\n\n// Isolate change clusters by eliminating ranges with no changes.\n//\n// Return a generator of groups with up to n lines of context.\n// Each group is in the same format as returned by GetOpCodes().\nfunc (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode {\n\tif n < 0 {\n\t\tn = 3\n\t}\n\tcodes := m.GetOpCodes()\n\tif len(codes) == 0 {\n\t\tcodes = []OpCode{OpCode{'e', 0, 1, 0, 1}}\n\t}\n\t// Fixup leading and trailing groups if they show no changes.\n\tif codes[0].Tag == 'e' {\n\t\tc := codes[0]\n\t\ti1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2\n\t\tcodes[0] = OpCode{c.Tag, max(i1, i2-n), i2, max(j1, j2-n), j2}\n\t}\n\tif codes[len(codes)-1].Tag == 'e' {\n\t\tc := codes[len(codes)-1]\n\t\ti1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2\n\t\tcodes[len(codes)-1] = OpCode{c.Tag, i1, min(i2, i1+n), j1, min(j2, j1+n)}\n\t}\n\tnn := n + n\n\tgroups := [][]OpCode{}\n\tgroup := []OpCode{}\n\tfor _, c := range codes {\n\t\ti1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2\n\t\t// End the current group and start a new one whenever\n\t\t// there is a large range with no changes.\n\t\tif c.Tag == 'e' && i2-i1 > nn {\n\t\t\tgroup = append(group, OpCode{c.Tag, i1, min(i2, i1+n),\n\t\t\t\tj1, min(j2, j1+n)})\n\t\t\tgroups = append(groups, group)\n\t\t\tgroup = []OpCode{}\n\t\t\ti1, j1 = max(i1, i2-n), max(j1, j2-n)\n\t\t}\n\t\tgroup = append(group, OpCode{c.Tag, i1, i2, j1, j2})\n\t}\n\tif len(group) > 0 && !(len(group) == 1 && group[0].Tag == 'e') {\n\t\tgroups = append(groups, group)\n\t}\n\treturn groups\n}\n\n// Return a measure of the sequences' similarity (float in [0,1]).\n//\n// Where T is the total number of elements in both sequences, and\n// M is the number of matches, this is 2.0*M / T.\n// Note that this is 1 if the sequences are identical, and 0 if\n// they have nothing in common.\n//\n// .Ratio() is expensive to compute if you haven't already computed\n// .GetMatchingBlocks() or .GetOpCodes(), in which case you may\n// want to try .QuickRatio() or .RealQuickRation() first to get an\n// upper bound.\nfunc (m *SequenceMatcher) Ratio() float64 {\n\tmatches := 0\n\tfor _, m := range m.GetMatchingBlocks() {\n\t\tmatches += m.Size\n\t}\n\treturn calculateRatio(matches, len(m.a)+len(m.b))\n}\n\n// Return an upper bound on ratio() relatively quickly.\n//\n// This isn't defined beyond that it is an upper bound on .Ratio(), and\n// is faster to compute.\nfunc (m *SequenceMatcher) QuickRatio() float64 {\n\t// viewing a and b as multisets, set matches to the cardinality\n\t// of their intersection; this counts the number of matches\n\t// without regard to order, so is clearly an upper bound\n\tif m.fullBCount == nil {\n\t\tm.fullBCount = map[string]int{}\n\t\tfor _, s := range m.b {\n\t\t\tm.fullBCount[s] = m.fullBCount[s] + 1\n\t\t}\n\t}\n\n\t// avail[x] is the number of times x appears in 'b' less the\n\t// number of times we've seen it in 'a' so far ... kinda\n\tavail := map[string]int{}\n\tmatches := 0\n\tfor _, s := range m.a {\n\t\tn, ok := avail[s]\n\t\tif !ok {\n\t\t\tn = m.fullBCount[s]\n\t\t}\n\t\tavail[s] = n - 1\n\t\tif n > 0 {\n\t\t\tmatches += 1\n\t\t}\n\t}\n\treturn calculateRatio(matches, len(m.a)+len(m.b))\n}\n\n// Return an upper bound on ratio() very quickly.\n//\n// This isn't defined beyond that it is an upper bound on .Ratio(), and\n// is faster to compute than either .Ratio() or .QuickRatio().\nfunc (m *SequenceMatcher) RealQuickRatio() float64 {\n\tla, lb := len(m.a), len(m.b)\n\treturn calculateRatio(min(la, lb), la+lb)\n}\n\n// Convert range to the \"ed\" format\nfunc formatRangeUnified(start, stop int) string {\n\t// Per the diff spec at http://www.unix.org/single_unix_specification/\n\tbeginning := start + 1 // lines start numbering with one\n\tlength := stop - start\n\tif length == 1 {\n\t\treturn fmt.Sprintf(\"%d\", beginning)\n\t}\n\tif length == 0 {\n\t\tbeginning -= 1 // empty ranges begin at line just before the range\n\t}\n\treturn fmt.Sprintf(\"%d,%d\", beginning, length)\n}\n\n// Unified diff parameters\ntype UnifiedDiff struct {\n\tA        []string // First sequence lines\n\tFromFile string   // First file name\n\tFromDate string   // First file time\n\tB        []string // Second sequence lines\n\tToFile   string   // Second file name\n\tToDate   string   // Second file time\n\tEol      string   // Headers end of line, defaults to LF\n\tContext  int      // Number of context lines\n}\n\n// Compare two sequences of lines; generate the delta as a unified diff.\n//\n// Unified diffs are a compact way of showing line changes and a few\n// lines of context.  The number of context lines is set by 'n' which\n// defaults to three.\n//\n// By default, the diff control lines (those with ---, +++, or @@) are\n// created with a trailing newline.  This is helpful so that inputs\n// created from file.readlines() result in diffs that are suitable for\n// file.writelines() since both the inputs and outputs have trailing\n// newlines.\n//\n// For inputs that do not have trailing newlines, set the lineterm\n// argument to \"\" so that the output will be uniformly newline free.\n//\n// The unidiff format normally has a header for filenames and modification\n// times.  Any or all of these may be specified using strings for\n// 'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'.\n// The modification times are normally expressed in the ISO 8601 format.\nfunc WriteUnifiedDiff(writer io.Writer, diff UnifiedDiff) error {\n\tbuf := bufio.NewWriter(writer)\n\tdefer buf.Flush()\n\twf := func(format string, args ...interface{}) error {\n\t\t_, err := buf.WriteString(fmt.Sprintf(format, args...))\n\t\treturn err\n\t}\n\tws := func(s string) error {\n\t\t_, err := buf.WriteString(s)\n\t\treturn err\n\t}\n\n\tif len(diff.Eol) == 0 {\n\t\tdiff.Eol = \"\\n\"\n\t}\n\n\tstarted := false\n\tm := NewMatcher(diff.A, diff.B)\n\tfor _, g := range m.GetGroupedOpCodes(diff.Context) {\n\t\tif !started {\n\t\t\tstarted = true\n\t\t\tfromDate := \"\"\n\t\t\tif len(diff.FromDate) > 0 {\n\t\t\t\tfromDate = \"\\t\" + diff.FromDate\n\t\t\t}\n\t\t\ttoDate := \"\"\n\t\t\tif len(diff.ToDate) > 0 {\n\t\t\t\ttoDate = \"\\t\" + diff.ToDate\n\t\t\t}\n\t\t\tif diff.FromFile != \"\" || diff.ToFile != \"\" {\n\t\t\t\terr := wf(\"--- %s%s%s\", diff.FromFile, fromDate, diff.Eol)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\terr = wf(\"+++ %s%s%s\", diff.ToFile, toDate, diff.Eol)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfirst, last := g[0], g[len(g)-1]\n\t\trange1 := formatRangeUnified(first.I1, last.I2)\n\t\trange2 := formatRangeUnified(first.J1, last.J2)\n\t\tif err := wf(\"@@ -%s +%s @@%s\", range1, range2, diff.Eol); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor _, c := range g {\n\t\t\ti1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2\n\t\t\tif c.Tag == 'e' {\n\t\t\t\tfor _, line := range diff.A[i1:i2] {\n\t\t\t\t\tif err := ws(\" \" + line); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif c.Tag == 'r' || c.Tag == 'd' {\n\t\t\t\tfor _, line := range diff.A[i1:i2] {\n\t\t\t\t\tif err := ws(\"-\" + line); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif c.Tag == 'r' || c.Tag == 'i' {\n\t\t\t\tfor _, line := range diff.B[j1:j2] {\n\t\t\t\t\tif err := ws(\"+\" + line); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// Like WriteUnifiedDiff but returns the diff a string.\nfunc GetUnifiedDiffString(diff UnifiedDiff) (string, error) {\n\tw := &bytes.Buffer{}\n\terr := WriteUnifiedDiff(w, diff)\n\treturn string(w.Bytes()), err\n}\n\n// Convert range to the \"ed\" format.\nfunc formatRangeContext(start, stop int) string {\n\t// Per the diff spec at http://www.unix.org/single_unix_specification/\n\tbeginning := start + 1 // lines start numbering with one\n\tlength := stop - start\n\tif length == 0 {\n\t\tbeginning -= 1 // empty ranges begin at line just before the range\n\t}\n\tif length <= 1 {\n\t\treturn fmt.Sprintf(\"%d\", beginning)\n\t}\n\treturn fmt.Sprintf(\"%d,%d\", beginning, beginning+length-1)\n}\n\ntype ContextDiff UnifiedDiff\n\n// Compare two sequences of lines; generate the delta as a context diff.\n//\n// Context diffs are a compact way of showing line changes and a few\n// lines of context. The number of context lines is set by diff.Context\n// which defaults to three.\n//\n// By default, the diff control lines (those with *** or ---) are\n// created with a trailing newline.\n//\n// For inputs that do not have trailing newlines, set the diff.Eol\n// argument to \"\" so that the output will be uniformly newline free.\n//\n// The context diff format normally has a header for filenames and\n// modification times.  Any or all of these may be specified using\n// strings for diff.FromFile, diff.ToFile, diff.FromDate, diff.ToDate.\n// The modification times are normally expressed in the ISO 8601 format.\n// If not specified, the strings default to blanks.\nfunc WriteContextDiff(writer io.Writer, diff ContextDiff) error {\n\tbuf := bufio.NewWriter(writer)\n\tdefer buf.Flush()\n\tvar diffErr error\n\twf := func(format string, args ...interface{}) {\n\t\t_, err := buf.WriteString(fmt.Sprintf(format, args...))\n\t\tif diffErr == nil && err != nil {\n\t\t\tdiffErr = err\n\t\t}\n\t}\n\tws := func(s string) {\n\t\t_, err := buf.WriteString(s)\n\t\tif diffErr == nil && err != nil {\n\t\t\tdiffErr = err\n\t\t}\n\t}\n\n\tif len(diff.Eol) == 0 {\n\t\tdiff.Eol = \"\\n\"\n\t}\n\n\tprefix := map[byte]string{\n\t\t'i': \"+ \",\n\t\t'd': \"- \",\n\t\t'r': \"! \",\n\t\t'e': \"  \",\n\t}\n\n\tstarted := false\n\tm := NewMatcher(diff.A, diff.B)\n\tfor _, g := range m.GetGroupedOpCodes(diff.Context) {\n\t\tif !started {\n\t\t\tstarted = true\n\t\t\tfromDate := \"\"\n\t\t\tif len(diff.FromDate) > 0 {\n\t\t\t\tfromDate = \"\\t\" + diff.FromDate\n\t\t\t}\n\t\t\ttoDate := \"\"\n\t\t\tif len(diff.ToDate) > 0 {\n\t\t\t\ttoDate = \"\\t\" + diff.ToDate\n\t\t\t}\n\t\t\tif diff.FromFile != \"\" || diff.ToFile != \"\" {\n\t\t\t\twf(\"*** %s%s%s\", diff.FromFile, fromDate, diff.Eol)\n\t\t\t\twf(\"--- %s%s%s\", diff.ToFile, toDate, diff.Eol)\n\t\t\t}\n\t\t}\n\n\t\tfirst, last := g[0], g[len(g)-1]\n\t\tws(\"***************\" + diff.Eol)\n\n\t\trange1 := formatRangeContext(first.I1, last.I2)\n\t\twf(\"*** %s ****%s\", range1, diff.Eol)\n\t\tfor _, c := range g {\n\t\t\tif c.Tag == 'r' || c.Tag == 'd' {\n\t\t\t\tfor _, cc := range g {\n\t\t\t\t\tif cc.Tag == 'i' {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tfor _, line := range diff.A[cc.I1:cc.I2] {\n\t\t\t\t\t\tws(prefix[cc.Tag] + line)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\trange2 := formatRangeContext(first.J1, last.J2)\n\t\twf(\"--- %s ----%s\", range2, diff.Eol)\n\t\tfor _, c := range g {\n\t\t\tif c.Tag == 'r' || c.Tag == 'i' {\n\t\t\t\tfor _, cc := range g {\n\t\t\t\t\tif cc.Tag == 'd' {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tfor _, line := range diff.B[cc.J1:cc.J2] {\n\t\t\t\t\t\tws(prefix[cc.Tag] + line)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn diffErr\n}\n\n// Like WriteContextDiff but returns the diff a string.\nfunc GetContextDiffString(diff ContextDiff) (string, error) {\n\tw := &bytes.Buffer{}\n\terr := WriteContextDiff(w, diff)\n\treturn string(w.Bytes()), err\n}\n\n// Split a string on \"\\n\" while preserving them. The output can be used\n// as input for UnifiedDiff and ContextDiff structures.\nfunc SplitLines(s string) []string {\n\tlines := strings.SplitAfter(s, \"\\n\")\n\tlines[len(lines)-1] += \"\\n\"\n\treturn lines\n}\n"
  },
  {
    "path": "internal/difflib/difflib_test.go",
    "content": "package difflib\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"math\"\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc assertAlmostEqual(t *testing.T, a, b float64, places int) {\n\tif math.Abs(a-b) > math.Pow10(-places) {\n\t\tt.Errorf(\"%.7f != %.7f\", a, b)\n\t}\n}\n\nfunc assertEqual(t *testing.T, a, b interface{}) {\n\tif !reflect.DeepEqual(a, b) {\n\t\tt.Errorf(\"%v != %v\", a, b)\n\t}\n}\n\nfunc splitChars(s string) []string {\n\tchars := make([]string, 0, len(s))\n\t// Assume ASCII inputs\n\tfor i := 0; i != len(s); i++ {\n\t\tchars = append(chars, string(s[i]))\n\t}\n\treturn chars\n}\n\nfunc TestSequenceMatcherRatio(t *testing.T) {\n\ts := NewMatcher(splitChars(\"abcd\"), splitChars(\"bcde\"))\n\tassertEqual(t, s.Ratio(), 0.75)\n\tassertEqual(t, s.QuickRatio(), 0.75)\n\tassertEqual(t, s.RealQuickRatio(), 1.0)\n}\n\nfunc TestGetOptCodes(t *testing.T) {\n\ta := \"qabxcd\"\n\tb := \"abycdf\"\n\ts := NewMatcher(splitChars(a), splitChars(b))\n\tw := &bytes.Buffer{}\n\tfor _, op := range s.GetOpCodes() {\n\t\tfmt.Fprintf(w, \"%s a[%d:%d], (%s) b[%d:%d] (%s)\\n\", string(op.Tag),\n\t\t\top.I1, op.I2, a[op.I1:op.I2], op.J1, op.J2, b[op.J1:op.J2])\n\t}\n\tresult := string(w.Bytes())\n\texpected := `d a[0:1], (q) b[0:0] ()\ne a[1:3], (ab) b[0:2] (ab)\nr a[3:4], (x) b[2:3] (y)\ne a[4:6], (cd) b[3:5] (cd)\ni a[6:6], () b[5:6] (f)\n`\n\tif expected != result {\n\t\tt.Errorf(\"unexpected op codes: \\n%s\", result)\n\t}\n}\n\nfunc TestGroupedOpCodes(t *testing.T) {\n\ta := []string{}\n\tfor i := 0; i != 39; i++ {\n\t\ta = append(a, fmt.Sprintf(\"%02d\", i))\n\t}\n\tb := []string{}\n\tb = append(b, a[:8]...)\n\tb = append(b, \" i\")\n\tb = append(b, a[8:19]...)\n\tb = append(b, \" x\")\n\tb = append(b, a[20:22]...)\n\tb = append(b, a[27:34]...)\n\tb = append(b, \" y\")\n\tb = append(b, a[35:]...)\n\ts := NewMatcher(a, b)\n\tw := &bytes.Buffer{}\n\tfor _, g := range s.GetGroupedOpCodes(-1) {\n\t\tfmt.Fprintf(w, \"group\\n\")\n\t\tfor _, op := range g {\n\t\t\tfmt.Fprintf(w, \"  %s, %d, %d, %d, %d\\n\", string(op.Tag),\n\t\t\t\top.I1, op.I2, op.J1, op.J2)\n\t\t}\n\t}\n\tresult := string(w.Bytes())\n\texpected := `group\n  e, 5, 8, 5, 8\n  i, 8, 8, 8, 9\n  e, 8, 11, 9, 12\ngroup\n  e, 16, 19, 17, 20\n  r, 19, 20, 20, 21\n  e, 20, 22, 21, 23\n  d, 22, 27, 23, 23\n  e, 27, 30, 23, 26\ngroup\n  e, 31, 34, 27, 30\n  r, 34, 35, 30, 31\n  e, 35, 38, 31, 34\n`\n\tif expected != result {\n\t\tt.Errorf(\"unexpected op codes: \\n%s\", result)\n\t}\n}\n\nfunc ExampleGetUnifiedDiffString() {\n\ta := `one\ntwo\nthree\nfour\nfmt.Printf(\"%s,%T\",a,b)`\n\tb := `zero\none\nthree\nfour`\n\tdiff := UnifiedDiff{\n\t\tA:        SplitLines(a),\n\t\tB:        SplitLines(b),\n\t\tFromFile: \"Original\",\n\t\tFromDate: \"2005-01-26 23:30:50\",\n\t\tToFile:   \"Current\",\n\t\tToDate:   \"2010-04-02 10:20:52\",\n\t\tContext:  3,\n\t}\n\tresult, _ := GetUnifiedDiffString(diff)\n\tfmt.Println(strings.Replace(result, \"\\t\", \" \", -1))\n\t// Output:\n\t// --- Original 2005-01-26 23:30:50\n\t// +++ Current 2010-04-02 10:20:52\n\t// @@ -1,5 +1,4 @@\n\t// +zero\n\t//  one\n\t// -two\n\t//  three\n\t//  four\n\t// -fmt.Printf(\"%s,%T\",a,b)\n}\n\nfunc ExampleGetContextDiffString() {\n\ta := `one\ntwo\nthree\nfour\nfmt.Printf(\"%s,%T\",a,b)`\n\tb := `zero\none\ntree\nfour`\n\tdiff := ContextDiff{\n\t\tA:        SplitLines(a),\n\t\tB:        SplitLines(b),\n\t\tFromFile: \"Original\",\n\t\tToFile:   \"Current\",\n\t\tContext:  3,\n\t\tEol:      \"\\n\",\n\t}\n\tresult, _ := GetContextDiffString(diff)\n\tfmt.Print(strings.Replace(result, \"\\t\", \" \", -1))\n\t// Output:\n\t// *** Original\n\t// --- Current\n\t// ***************\n\t// *** 1,5 ****\n\t//   one\n\t// ! two\n\t// ! three\n\t//   four\n\t// - fmt.Printf(\"%s,%T\",a,b)\n\t// --- 1,4 ----\n\t// + zero\n\t//   one\n\t// ! tree\n\t//   four\n}\n\nfunc ExampleGetContextDiffString_second() {\n\ta := `one\ntwo\nthree\nfour`\n\tb := `zero\none\ntree\nfour`\n\tdiff := ContextDiff{\n\t\tA:        SplitLines(a),\n\t\tB:        SplitLines(b),\n\t\tFromFile: \"Original\",\n\t\tToFile:   \"Current\",\n\t\tContext:  3,\n\t\tEol:      \"\\n\",\n\t}\n\tresult, _ := GetContextDiffString(diff)\n\tfmt.Printf(strings.Replace(result, \"\\t\", \" \", -1))\n\t// Output:\n\t// *** Original\n\t// --- Current\n\t// ***************\n\t// *** 1,4 ****\n\t//   one\n\t// ! two\n\t// ! three\n\t//   four\n\t// --- 1,4 ----\n\t// + zero\n\t//   one\n\t// ! tree\n\t//   four\n}\n\nfunc rep(s string, count int) string {\n\treturn strings.Repeat(s, count)\n}\n\nfunc TestWithAsciiOneInsert(t *testing.T) {\n\tsm := NewMatcher(splitChars(rep(\"b\", 100)),\n\t\tsplitChars(\"a\"+rep(\"b\", 100)))\n\tassertAlmostEqual(t, sm.Ratio(), 0.995, 3)\n\tassertEqual(t, sm.GetOpCodes(),\n\t\t[]OpCode{{'i', 0, 0, 0, 1}, {'e', 0, 100, 1, 101}})\n\tassertEqual(t, len(sm.bPopular), 0)\n\n\tsm = NewMatcher(splitChars(rep(\"b\", 100)),\n\t\tsplitChars(rep(\"b\", 50)+\"a\"+rep(\"b\", 50)))\n\tassertAlmostEqual(t, sm.Ratio(), 0.995, 3)\n\tassertEqual(t, sm.GetOpCodes(),\n\t\t[]OpCode{{'e', 0, 50, 0, 50}, {'i', 50, 50, 50, 51}, {'e', 50, 100, 51, 101}})\n\tassertEqual(t, len(sm.bPopular), 0)\n}\n\nfunc TestWithAsciiOnDelete(t *testing.T) {\n\tsm := NewMatcher(splitChars(rep(\"a\", 40)+\"c\"+rep(\"b\", 40)),\n\t\tsplitChars(rep(\"a\", 40)+rep(\"b\", 40)))\n\tassertAlmostEqual(t, sm.Ratio(), 0.994, 3)\n\tassertEqual(t, sm.GetOpCodes(),\n\t\t[]OpCode{{'e', 0, 40, 0, 40}, {'d', 40, 41, 40, 40}, {'e', 41, 81, 40, 80}})\n}\n\nfunc TestWithAsciiBJunk(t *testing.T) {\n\tisJunk := func(s string) bool {\n\t\treturn s == \" \"\n\t}\n\tsm := NewMatcherWithJunk(splitChars(rep(\"a\", 40)+rep(\"b\", 40)),\n\t\tsplitChars(rep(\"a\", 44)+rep(\"b\", 40)), true, isJunk)\n\tassertEqual(t, sm.bJunk, map[string]struct{}{})\n\n\tsm = NewMatcherWithJunk(splitChars(rep(\"a\", 40)+rep(\"b\", 40)),\n\t\tsplitChars(rep(\"a\", 44)+rep(\"b\", 40)+rep(\" \", 20)), false, isJunk)\n\tassertEqual(t, sm.bJunk, map[string]struct{}{\" \": struct{}{}})\n\n\tisJunk = func(s string) bool {\n\t\treturn s == \" \" || s == \"b\"\n\t}\n\tsm = NewMatcherWithJunk(splitChars(rep(\"a\", 40)+rep(\"b\", 40)),\n\t\tsplitChars(rep(\"a\", 44)+rep(\"b\", 40)+rep(\" \", 20)), false, isJunk)\n\tassertEqual(t, sm.bJunk, map[string]struct{}{\" \": struct{}{}, \"b\": struct{}{}})\n}\n\nfunc TestSFBugsRatioForNullSeqn(t *testing.T) {\n\tsm := NewMatcher(nil, nil)\n\tassertEqual(t, sm.Ratio(), 1.0)\n\tassertEqual(t, sm.QuickRatio(), 1.0)\n\tassertEqual(t, sm.RealQuickRatio(), 1.0)\n}\n\nfunc TestSFBugsComparingEmptyLists(t *testing.T) {\n\tgroups := NewMatcher(nil, nil).GetGroupedOpCodes(-1)\n\tassertEqual(t, len(groups), 0)\n\tdiff := UnifiedDiff{\n\t\tFromFile: \"Original\",\n\t\tToFile:   \"Current\",\n\t\tContext:  3,\n\t}\n\tresult, err := GetUnifiedDiffString(diff)\n\tassertEqual(t, err, nil)\n\tassertEqual(t, result, \"\")\n}\n\nfunc TestOutputFormatRangeFormatUnified(t *testing.T) {\n\t// Per the diff spec at http://www.unix.org/single_unix_specification/\n\t//\n\t// Each <range> field shall be of the form:\n\t//   %1d\", <beginning line number>  if the range contains exactly one line,\n\t// and:\n\t//  \"%1d,%1d\", <beginning line number>, <number of lines> otherwise.\n\t// If a range is empty, its beginning line number shall be the number of\n\t// the line just before the range, or 0 if the empty range starts the file.\n\tfm := formatRangeUnified\n\tassertEqual(t, fm(3, 3), \"3,0\")\n\tassertEqual(t, fm(3, 4), \"4\")\n\tassertEqual(t, fm(3, 5), \"4,2\")\n\tassertEqual(t, fm(3, 6), \"4,3\")\n\tassertEqual(t, fm(0, 0), \"0,0\")\n}\n\nfunc TestOutputFormatRangeFormatContext(t *testing.T) {\n\t// Per the diff spec at http://www.unix.org/single_unix_specification/\n\t//\n\t// The range of lines in file1 shall be written in the following format\n\t// if the range contains two or more lines:\n\t//     \"*** %d,%d ****\\n\", <beginning line number>, <ending line number>\n\t// and the following format otherwise:\n\t//     \"*** %d ****\\n\", <ending line number>\n\t// The ending line number of an empty range shall be the number of the preceding line,\n\t// or 0 if the range is at the start of the file.\n\t//\n\t// Next, the range of lines in file2 shall be written in the following format\n\t// if the range contains two or more lines:\n\t//     \"--- %d,%d ----\\n\", <beginning line number>, <ending line number>\n\t// and the following format otherwise:\n\t//     \"--- %d ----\\n\", <ending line number>\n\tfm := formatRangeContext\n\tassertEqual(t, fm(3, 3), \"3\")\n\tassertEqual(t, fm(3, 4), \"4\")\n\tassertEqual(t, fm(3, 5), \"4,5\")\n\tassertEqual(t, fm(3, 6), \"4,6\")\n\tassertEqual(t, fm(0, 0), \"0\")\n}\n\nfunc TestOutputFormatTabDelimiter(t *testing.T) {\n\tdiff := UnifiedDiff{\n\t\tA:        splitChars(\"one\"),\n\t\tB:        splitChars(\"two\"),\n\t\tFromFile: \"Original\",\n\t\tFromDate: \"2005-01-26 23:30:50\",\n\t\tToFile:   \"Current\",\n\t\tToDate:   \"2010-04-12 10:20:52\",\n\t\tEol:      \"\\n\",\n\t}\n\tud, err := GetUnifiedDiffString(diff)\n\tassertEqual(t, err, nil)\n\tassertEqual(t, SplitLines(ud)[:2], []string{\n\t\t\"--- Original\\t2005-01-26 23:30:50\\n\",\n\t\t\"+++ Current\\t2010-04-12 10:20:52\\n\",\n\t})\n\tcd, err := GetContextDiffString(ContextDiff(diff))\n\tassertEqual(t, err, nil)\n\tassertEqual(t, SplitLines(cd)[:2], []string{\n\t\t\"*** Original\\t2005-01-26 23:30:50\\n\",\n\t\t\"--- Current\\t2010-04-12 10:20:52\\n\",\n\t})\n}\n\nfunc TestOutputFormatNoTrailingTabOnEmptyFiledate(t *testing.T) {\n\tdiff := UnifiedDiff{\n\t\tA:        splitChars(\"one\"),\n\t\tB:        splitChars(\"two\"),\n\t\tFromFile: \"Original\",\n\t\tToFile:   \"Current\",\n\t\tEol:      \"\\n\",\n\t}\n\tud, err := GetUnifiedDiffString(diff)\n\tassertEqual(t, err, nil)\n\tassertEqual(t, SplitLines(ud)[:2], []string{\"--- Original\\n\", \"+++ Current\\n\"})\n\n\tcd, err := GetContextDiffString(ContextDiff(diff))\n\tassertEqual(t, err, nil)\n\tassertEqual(t, SplitLines(cd)[:2], []string{\"*** Original\\n\", \"--- Current\\n\"})\n}\n\nfunc TestOmitFilenames(t *testing.T) {\n\tdiff := UnifiedDiff{\n\t\tA:   SplitLines(\"o\\nn\\ne\\n\"),\n\t\tB:   SplitLines(\"t\\nw\\no\\n\"),\n\t\tEol: \"\\n\",\n\t}\n\tud, err := GetUnifiedDiffString(diff)\n\tassertEqual(t, err, nil)\n\tassertEqual(t, SplitLines(ud), []string{\n\t\t\"@@ -0,0 +1,2 @@\\n\",\n\t\t\"+t\\n\",\n\t\t\"+w\\n\",\n\t\t\"@@ -2,2 +3,0 @@\\n\",\n\t\t\"-n\\n\",\n\t\t\"-e\\n\",\n\t\t\"\\n\",\n\t})\n\n\tcd, err := GetContextDiffString(ContextDiff(diff))\n\tassertEqual(t, err, nil)\n\tassertEqual(t, SplitLines(cd), []string{\n\t\t\"***************\\n\",\n\t\t\"*** 0 ****\\n\",\n\t\t\"--- 1,2 ----\\n\",\n\t\t\"+ t\\n\",\n\t\t\"+ w\\n\",\n\t\t\"***************\\n\",\n\t\t\"*** 2,3 ****\\n\",\n\t\t\"- n\\n\",\n\t\t\"- e\\n\",\n\t\t\"--- 3 ----\\n\",\n\t\t\"\\n\",\n\t})\n}\n\nfunc TestSplitLines(t *testing.T) {\n\tallTests := []struct {\n\t\tinput string\n\t\twant  []string\n\t}{\n\t\t{\"foo\", []string{\"foo\\n\"}},\n\t\t{\"foo\\nbar\", []string{\"foo\\n\", \"bar\\n\"}},\n\t\t{\"foo\\nbar\\n\", []string{\"foo\\n\", \"bar\\n\", \"\\n\"}},\n\t}\n\tfor _, test := range allTests {\n\t\tassertEqual(t, SplitLines(test.input), test.want)\n\t}\n}\n\nfunc benchmarkSplitLines(b *testing.B, count int) {\n\tstr := strings.Repeat(\"foo\\n\", count)\n\n\tb.ResetTimer()\n\n\tn := 0\n\tfor i := 0; i < b.N; i++ {\n\t\tn += len(SplitLines(str))\n\t}\n}\n\nfunc BenchmarkSplitLines100(b *testing.B) {\n\tbenchmarkSplitLines(b, 100)\n}\n\nfunc BenchmarkSplitLines10000(b *testing.B) {\n\tbenchmarkSplitLines(b, 10000)\n}\n"
  },
  {
    "path": "internal/ring/ring.go",
    "content": "package ring\n\n// Ring is a very simple ring buffer implementation that uses a slice. The\n// internal slice will only grow, never shrink. When it grows, it grows in\n// chunks of \"chunkSize\" (given as argument in the [New] function). Pointer and\n// reference types can be safely used because memory is cleared.\ntype Ring[T any] struct {\n\tdata                 []T\n\tback, len, chunkSize int\n}\n\nfunc New[T any](chunkSize int) *Ring[T] {\n\tif chunkSize < 1 {\n\t\tpanic(\"chunkSize must be greater than zero\")\n\t}\n\treturn &Ring[T]{\n\t\tchunkSize: chunkSize,\n\t}\n}\n\nfunc (r *Ring[T]) Len() int {\n\treturn r.len\n}\n\nfunc (r *Ring[T]) Cap() int {\n\treturn len(r.data)\n}\n\nfunc (r *Ring[T]) Reset() {\n\tvar zero T\n\tfor i := range r.data {\n\t\tr.data[i] = zero // clear mem, optimized by the compiler, in Go 1.21 the \"clear\" builtin can be used\n\t}\n\tr.back = 0\n\tr.len = 0\n}\n\n// Nth returns the n-th oldest value (zero-based) in the ring without making\n// any change.\nfunc (r *Ring[T]) Nth(n int) (v T, ok bool) {\n\tif n < 0 || n >= r.len || len(r.data) == 0 {\n\t\treturn v, false\n\t}\n\tn = (n + r.back) % len(r.data)\n\treturn r.data[n], true\n}\n\n// Dequeue returns the oldest value.\nfunc (r *Ring[T]) Dequeue() (v T, ok bool) {\n\tif r.len == 0 {\n\t\treturn v, false\n\t}\n\tv, r.data[r.back] = r.data[r.back], v // retrieve and clear mem\n\tr.len--\n\tr.back = (r.back + 1) % len(r.data)\n\treturn v, true\n}\n\n// Enqueue adds an item to the ring.\nfunc (r *Ring[T]) Enqueue(v T) {\n\tif r.len == len(r.data) {\n\t\tr.grow()\n\t}\n\twritePos := (r.back + r.len) % len(r.data)\n\tr.data[writePos] = v\n\tr.len++\n}\n\nfunc (r *Ring[T]) grow() {\n\ts := make([]T, len(r.data)+r.chunkSize)\n\tif r.len > 0 {\n\t\tchunk1 := r.back + r.len\n\t\tif chunk1 > len(r.data) {\n\t\t\tchunk1 = len(r.data)\n\t\t}\n\t\tcopied := copy(s, r.data[r.back:chunk1])\n\n\t\tif copied < r.len { // wrapped slice\n\t\t\tchunk2 := r.len - copied\n\t\t\tcopy(s[copied:], r.data[:chunk2])\n\t\t}\n\t}\n\tr.back = 0\n\tr.data = s\n}\n"
  },
  {
    "path": "internal/ring/ring_test.go",
    "content": "package ring\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\nfunc TestRing(t *testing.T) {\n\ttype op = ringOp[int]\n\ttestRing(t, New[int](3),\n\t\t// noops on empty ring\n\t\top{cap: 0, opType: opRst, value: 0, items: []int{}},\n\t\top{cap: 0, opType: opDeq, value: 0, items: []int{}},\n\n\t\t// basic\n\t\top{cap: 3, opType: opEnq, value: 1, items: []int{1}},\n\t\top{cap: 3, opType: opDeq, value: 1, items: []int{}},\n\n\t\t// wrapping\n\t\top{cap: 3, opType: opEnq, value: 2, items: []int{2}},\n\t\top{cap: 3, opType: opEnq, value: 3, items: []int{2, 3}},\n\t\top{cap: 3, opType: opEnq, value: 4, items: []int{2, 3, 4}},\n\t\top{cap: 3, opType: opDeq, value: 2, items: []int{3, 4}},\n\t\top{cap: 3, opType: opDeq, value: 3, items: []int{4}},\n\t\top{cap: 3, opType: opDeq, value: 4, items: []int{}},\n\n\t\t// resetting\n\t\top{cap: 3, opType: opEnq, value: 2, items: []int{2}},\n\t\top{cap: 3, opType: opRst, value: 0, items: []int{}},\n\t\top{cap: 3, opType: opDeq, value: 0, items: []int{}},\n\n\t\t// growing without wrapping\n\t\top{cap: 3, opType: opEnq, value: 5, items: []int{5}},\n\t\top{cap: 3, opType: opEnq, value: 6, items: []int{5, 6}},\n\t\top{cap: 3, opType: opEnq, value: 7, items: []int{5, 6, 7}},\n\t\top{cap: 6, opType: opEnq, value: 8, items: []int{5, 6, 7, 8}},\n\t\top{cap: 6, opType: opRst, value: 0, items: []int{}},\n\t\top{cap: 6, opType: opDeq, value: 0, items: []int{}},\n\n\t\t// growing and wrapping\n\t\top{cap: 6, opType: opEnq, value: 9, items: []int{9}},\n\t\top{cap: 6, opType: opEnq, value: 10, items: []int{9, 10}},\n\t\top{cap: 6, opType: opEnq, value: 11, items: []int{9, 10, 11}},\n\t\top{cap: 6, opType: opEnq, value: 12, items: []int{9, 10, 11, 12}},\n\t\top{cap: 6, opType: opEnq, value: 13, items: []int{9, 10, 11, 12, 13}},\n\t\top{cap: 6, opType: opEnq, value: 14, items: []int{9, 10, 11, 12, 13, 14}},\n\t\top{cap: 6, opType: opDeq, value: 9, items: []int{10, 11, 12, 13, 14}},\n\t\top{cap: 6, opType: opDeq, value: 10, items: []int{11, 12, 13, 14}},\n\t\top{cap: 6, opType: opEnq, value: 15, items: []int{11, 12, 13, 14, 15}},\n\t\top{cap: 6, opType: opEnq, value: 16, items: []int{11, 12, 13, 14, 15, 16}},\n\t\top{cap: 9, opType: opEnq, value: 17, items: []int{11, 12, 13, 14, 15, 16, 17}}, // grows wrapped\n\t\top{cap: 9, opType: opDeq, value: 11, items: []int{12, 13, 14, 15, 16, 17}},\n\t\top{cap: 9, opType: opDeq, value: 12, items: []int{13, 14, 15, 16, 17}},\n\t\top{cap: 9, opType: opDeq, value: 13, items: []int{14, 15, 16, 17}},\n\t\top{cap: 9, opType: opDeq, value: 14, items: []int{15, 16, 17}},\n\t\top{cap: 9, opType: opDeq, value: 15, items: []int{16, 17}},\n\t\top{cap: 9, opType: opDeq, value: 16, items: []int{17}},\n\t\top{cap: 9, opType: opDeq, value: 17, items: []int{}},\n\t\top{cap: 9, opType: opDeq, value: 0, items: []int{}},\n\t)\n\n\tt.Run(\"should panic on invalid chunkSize\", func(t *testing.T) {\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"should have panicked\")\n\t\t\t}\n\t\t}()\n\t\tNew[int](0)\n\t})\n}\n\nconst (\n\topEnq = iota // enqueue an item\n\topDeq        // dequeue an item and an item was available\n\topRst        // reset\n)\n\ntype ringOp[T comparable] struct {\n\tcap    int // expected values\n\topType int // opEnq or opDeq\n\tvalue  T   // value to enqueue or value expected for dequeue; ignored for opRst\n\titems  []T // items left\n}\n\nfunc testRing[T comparable](t *testing.T, r *Ring[T], ops ...ringOp[T]) {\n\tfor i, op := range ops {\n\t\ttestOK := t.Run(fmt.Sprintf(\"opIndex=%v\", i), func(t *testing.T) {\n\t\t\ttestRingOp(t, r, op)\n\t\t})\n\t\tif !testOK {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc testRingOp[T comparable](t *testing.T, r *Ring[T], op ringOp[T]) {\n\tvar zero T\n\tswitch op.opType {\n\tcase opEnq:\n\t\tr.Enqueue(op.value)\n\tcase opDeq:\n\t\tshouldSucceed := r.Len() > 0\n\t\tv, ok := r.Dequeue()\n\t\tswitch {\n\t\tcase ok != shouldSucceed:\n\t\t\tt.Fatalf(\"should have succeeded: %v\", shouldSucceed)\n\t\tcase ok && v != op.value:\n\t\t\tt.Fatalf(\"expected value: %v; got: %v\", op.value, v)\n\t\tcase !ok && v != zero:\n\t\t\tt.Fatalf(\"expected zero value; got: %v\", v)\n\t\t}\n\tcase opRst:\n\t\tr.Reset()\n\t}\n\tif c := r.Cap(); c != op.cap {\n\t\tt.Fatalf(\"expected cap: %v; got: %v\", op.cap, c)\n\t}\n\tif l := r.Len(); l != len(op.items) {\n\t\tt.Errorf(\"expected Len(): %v; got: %v\", len(op.items), l)\n\t}\n\tvar got []T\n\tfor i := 0; ; i++ {\n\t\tv, ok := r.Nth(i)\n\t\tif !ok {\n\t\t\tbreak\n\t\t}\n\t\tgot = append(got, v)\n\t}\n\tif l := len(got); l != len(op.items) {\n\t\tt.Errorf(\"expected items: %v\\ngot items: %v\", op.items, got)\n\t}\n\tfor i := range op.items {\n\t\tif op.items[i] != got[i] {\n\t\t\tt.Fatalf(\"expected items: %v\\ngot items: %v\", op.items, got)\n\t\t}\n\t}\n\tif v, ok := r.Nth(len(op.items)); ok || v != zero {\n\t\tt.Fatalf(\"expected no more items, got: v=%v; ok=%v\", v, ok)\n\t}\n}\n"
  },
  {
    "path": "internal/spew/bypass.go",
    "content": "// Copyright (c) 2015-2016 Dave Collins <dave@davec.name>\n//\n// Permission to use, copy, modify, and distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n// NOTE: Due to the following build constraints, this file will only be compiled\n// when the code is not running on Google App Engine, compiled by GopherJS, and\n// \"-tags safe\" is not added to the go build command line.  The \"disableunsafe\"\n// tag is deprecated and thus should not be used.\n// Go versions prior to 1.4 are disabled because they use a different layout\n// for interfaces which make the implementation of unsafeReflectValue more complex.\n//go:build !js && !appengine && !safe && !disableunsafe && go1.4\n// +build !js,!appengine,!safe,!disableunsafe,go1.4\n\npackage spew\n\nimport (\n\t\"reflect\"\n\t\"unsafe\"\n)\n\nconst (\n\t// UnsafeDisabled is a build-time constant which specifies whether or\n\t// not access to the unsafe package is available.\n\tUnsafeDisabled = false\n\n\t// ptrSize is the size of a pointer on the current arch.\n\tptrSize = unsafe.Sizeof((*byte)(nil))\n)\n\ntype flag uintptr\n\nvar (\n\t// flagRO indicates whether the value field of a reflect.Value\n\t// is read-only.\n\tflagRO flag\n\n\t// flagAddr indicates whether the address of the reflect.Value's\n\t// value may be taken.\n\tflagAddr flag\n)\n\n// flagKindMask holds the bits that make up the kind\n// part of the flags field. In all the supported versions,\n// it is in the lower 5 bits.\nconst flagKindMask = flag(0x1f)\n\n// Different versions of Go have used different\n// bit layouts for the flags type. This table\n// records the known combinations.\nvar okFlags = []struct {\n\tro, addr flag\n}{{\n\t// From Go 1.4 to 1.5\n\tro:   1 << 5,\n\taddr: 1 << 7,\n}, {\n\t// Up to Go tip.\n\tro:   1<<5 | 1<<6,\n\taddr: 1 << 8,\n}}\n\nvar flagValOffset = func() uintptr {\n\tfield, ok := reflect.TypeOf(reflect.Value{}).FieldByName(\"flag\")\n\tif !ok {\n\t\tpanic(\"reflect.Value has no flag field\")\n\t}\n\treturn field.Offset\n}()\n\n// flagField returns a pointer to the flag field of a reflect.Value.\nfunc flagField(v *reflect.Value) *flag {\n\treturn (*flag)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + flagValOffset))\n}\n\n// unsafeReflectValue converts the passed reflect.Value into a one that bypasses\n// the typical safety restrictions preventing access to unaddressable and\n// unexported data.  It works by digging the raw pointer to the underlying\n// value out of the protected value and generating a new unprotected (unsafe)\n// reflect.Value to it.\n//\n// This allows us to check for implementations of the Stringer and error\n// interfaces to be used for pretty printing ordinarily unaddressable and\n// inaccessible values such as unexported struct fields.\nfunc unsafeReflectValue(v reflect.Value) reflect.Value {\n\tif !v.IsValid() || (v.CanInterface() && v.CanAddr()) {\n\t\treturn v\n\t}\n\tflagFieldPtr := flagField(&v)\n\t*flagFieldPtr &^= flagRO\n\t*flagFieldPtr |= flagAddr\n\treturn v\n}\n\n// Sanity checks against future reflect package changes\n// to the type or semantics of the Value.flag field.\nfunc init() {\n\tfield, ok := reflect.TypeOf(reflect.Value{}).FieldByName(\"flag\")\n\tif !ok {\n\t\tpanic(\"reflect.Value has no flag field\")\n\t}\n\tif field.Type.Kind() != reflect.TypeOf(flag(0)).Kind() {\n\t\tpanic(\"reflect.Value flag field has changed kind\")\n\t}\n\ttype t0 int\n\tvar t struct {\n\t\tA t0\n\t\t// t0 will have flagEmbedRO set.\n\t\tt0\n\t\t// a will have flagStickyRO set\n\t\ta t0\n\t}\n\tvA := reflect.ValueOf(t).FieldByName(\"A\")\n\tva := reflect.ValueOf(t).FieldByName(\"a\")\n\tvt0 := reflect.ValueOf(t).FieldByName(\"t0\")\n\n\t// Infer flagRO from the difference between the flags\n\t// for the (otherwise identical) fields in t.\n\tflagPublic := *flagField(&vA)\n\tflagWithRO := *flagField(&va) | *flagField(&vt0)\n\tflagRO = flagPublic ^ flagWithRO\n\n\t// Infer flagAddr from the difference between a value\n\t// taken from a pointer and not.\n\tvPtrA := reflect.ValueOf(&t).Elem().FieldByName(\"A\")\n\tflagNoPtr := *flagField(&vA)\n\tflagPtr := *flagField(&vPtrA)\n\tflagAddr = flagNoPtr ^ flagPtr\n\n\t// Check that the inferred flags tally with one of the known versions.\n\tfor _, f := range okFlags {\n\t\tif flagRO == f.ro && flagAddr == f.addr {\n\t\t\treturn\n\t\t}\n\t}\n\tpanic(\"reflect.Value read-only flag has changed semantics\")\n}\n"
  },
  {
    "path": "internal/spew/bypasssafe.go",
    "content": "// Copyright (c) 2015-2016 Dave Collins <dave@davec.name>\n//\n// Permission to use, copy, modify, and distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n// NOTE: Due to the following build constraints, this file will only be compiled\n// when the code is running on Google App Engine, compiled by GopherJS, or\n// \"-tags safe\" is added to the go build command line.  The \"disableunsafe\"\n// tag is deprecated and thus should not be used.\n//go:build js || appengine || safe || disableunsafe || !go1.4\n// +build js appengine safe disableunsafe !go1.4\n\npackage spew\n\nimport \"reflect\"\n\nconst (\n\t// UnsafeDisabled is a build-time constant which specifies whether or\n\t// not access to the unsafe package is available.\n\tUnsafeDisabled = true\n)\n\n// unsafeReflectValue typically converts the passed reflect.Value into a one\n// that bypasses the typical safety restrictions preventing access to\n// unaddressable and unexported data.  However, doing this relies on access to\n// the unsafe package.  This is a stub version which simply returns the passed\n// reflect.Value when the unsafe package is not available.\nfunc unsafeReflectValue(v reflect.Value) reflect.Value {\n\treturn v\n}\n"
  },
  {
    "path": "internal/spew/common.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\npackage spew\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strconv\"\n)\n\n// Some constants in the form of bytes to avoid string overhead.  This mirrors\n// the technique used in the fmt package.\nvar (\n\tpanicBytes            = []byte(\"(PANIC=\")\n\tplusBytes             = []byte(\"+\")\n\tiBytes                = []byte(\"i\")\n\ttrueBytes             = []byte(\"true\")\n\tfalseBytes            = []byte(\"false\")\n\tinterfaceBytes        = []byte(\"(interface {})\")\n\tcommaNewlineBytes     = []byte(\",\\n\")\n\tnewlineBytes          = []byte(\"\\n\")\n\topenBraceBytes        = []byte(\"{\")\n\topenBraceNewlineBytes = []byte(\"{\\n\")\n\tcloseBraceBytes       = []byte(\"}\")\n\tasteriskBytes         = []byte(\"*\")\n\tcolonBytes            = []byte(\":\")\n\tcolonSpaceBytes       = []byte(\": \")\n\topenParenBytes        = []byte(\"(\")\n\tcloseParenBytes       = []byte(\")\")\n\tspaceBytes            = []byte(\" \")\n\tpointerChainBytes     = []byte(\"->\")\n\tnilAngleBytes         = []byte(\"<nil>\")\n\tmaxNewlineBytes       = []byte(\"<max depth reached>\\n\")\n\tmaxShortBytes         = []byte(\"<max>\")\n\tcircularBytes         = []byte(\"<already shown>\")\n\tcircularShortBytes    = []byte(\"<shown>\")\n\tinvalidAngleBytes     = []byte(\"<invalid>\")\n\topenBracketBytes      = []byte(\"[\")\n\tcloseBracketBytes     = []byte(\"]\")\n\tpercentBytes          = []byte(\"%\")\n\tprecisionBytes        = []byte(\".\")\n\topenAngleBytes        = []byte(\"<\")\n\tcloseAngleBytes       = []byte(\">\")\n\topenMapBytes          = []byte(\"map[\")\n\tcloseMapBytes         = []byte(\"]\")\n\tlenEqualsBytes        = []byte(\"len=\")\n\tcapEqualsBytes        = []byte(\"cap=\")\n)\n\n// hexDigits is used to map a decimal value to a hex digit.\nvar hexDigits = \"0123456789abcdef\"\n\n// catchPanic handles any panics that might occur during the handleMethods\n// calls.\nfunc catchPanic(w io.Writer, v reflect.Value) {\n\tif err := recover(); err != nil {\n\t\tw.Write(panicBytes)\n\t\tfmt.Fprintf(w, \"%v\", err)\n\t\tw.Write(closeParenBytes)\n\t}\n}\n\n// handleMethods attempts to call the Error and String methods on the underlying\n// type the passed reflect.Value represents and outputs the result to Writer w.\n//\n// It handles panics in any called methods by catching and displaying the error\n// as the formatted value.\nfunc handleMethods(cs *ConfigState, w io.Writer, v reflect.Value) (handled bool) {\n\t// We need an interface to check if the type implements the error or\n\t// Stringer interface.  However, the reflect package won't give us an\n\t// interface on certain things like unexported struct fields in order\n\t// to enforce visibility rules.  We use unsafe, when it's available,\n\t// to bypass these restrictions since this package does not mutate the\n\t// values.\n\tif !v.CanInterface() {\n\t\tif UnsafeDisabled {\n\t\t\treturn false\n\t\t}\n\n\t\tv = unsafeReflectValue(v)\n\t}\n\n\t// Choose whether or not to do error and Stringer interface lookups against\n\t// the base type or a pointer to the base type depending on settings.\n\t// Technically calling one of these methods with a pointer receiver can\n\t// mutate the value, however, types which choose to satisfy an error or\n\t// Stringer interface with a pointer receiver should not be mutating their\n\t// state inside these interface methods.\n\tif !cs.DisablePointerMethods && !UnsafeDisabled && !v.CanAddr() {\n\t\tv = unsafeReflectValue(v)\n\t}\n\tif v.CanAddr() {\n\t\tv = v.Addr()\n\t}\n\n\t// Is it an error or Stringer?\n\tswitch iface := v.Interface().(type) {\n\tcase error:\n\t\tdefer catchPanic(w, v)\n\t\tif cs.ContinueOnMethod {\n\t\t\tw.Write(openParenBytes)\n\t\t\tw.Write([]byte(iface.Error()))\n\t\t\tw.Write(closeParenBytes)\n\t\t\tw.Write(spaceBytes)\n\t\t\treturn false\n\t\t}\n\n\t\tw.Write([]byte(iface.Error()))\n\t\treturn true\n\n\tcase fmt.Stringer:\n\t\tdefer catchPanic(w, v)\n\t\tif cs.ContinueOnMethod {\n\t\t\tw.Write(openParenBytes)\n\t\t\tw.Write([]byte(iface.String()))\n\t\t\tw.Write(closeParenBytes)\n\t\t\tw.Write(spaceBytes)\n\t\t\treturn false\n\t\t}\n\t\tw.Write([]byte(iface.String()))\n\t\treturn true\n\t}\n\treturn false\n}\n\n// printBool outputs a boolean value as true or false to Writer w.\nfunc printBool(w io.Writer, val bool) {\n\tif val {\n\t\tw.Write(trueBytes)\n\t} else {\n\t\tw.Write(falseBytes)\n\t}\n}\n\n// printInt outputs a signed integer value to Writer w.\nfunc printInt(w io.Writer, val int64, base int) {\n\tw.Write([]byte(strconv.FormatInt(val, base)))\n}\n\n// printUint outputs an unsigned integer value to Writer w.\nfunc printUint(w io.Writer, val uint64, base int) {\n\tw.Write([]byte(strconv.FormatUint(val, base)))\n}\n\n// printFloat outputs a floating point value using the specified precision,\n// which is expected to be 32 or 64bit, to Writer w.\nfunc printFloat(w io.Writer, val float64, precision int) {\n\tw.Write([]byte(strconv.FormatFloat(val, 'g', -1, precision)))\n}\n\n// printComplex outputs a complex value using the specified float precision\n// for the real and imaginary parts to Writer w.\nfunc printComplex(w io.Writer, c complex128, floatPrecision int) {\n\tr := real(c)\n\tw.Write(openParenBytes)\n\tw.Write([]byte(strconv.FormatFloat(r, 'g', -1, floatPrecision)))\n\ti := imag(c)\n\tif i >= 0 {\n\t\tw.Write(plusBytes)\n\t}\n\tw.Write([]byte(strconv.FormatFloat(i, 'g', -1, floatPrecision)))\n\tw.Write(iBytes)\n\tw.Write(closeParenBytes)\n}\n\n// printHexPtr outputs a uintptr formatted as hexadecimal with a leading '0x'\n// prefix to Writer w.\nfunc printHexPtr(w io.Writer, p uintptr) {\n\t// Null pointer.\n\tnum := uint64(p)\n\tif num == 0 {\n\t\tw.Write(nilAngleBytes)\n\t\treturn\n\t}\n\n\t// Max uint64 is 16 bytes in hex + 2 bytes for '0x' prefix\n\tbuf := make([]byte, 18)\n\n\t// It's simpler to construct the hex string right to left.\n\tbase := uint64(16)\n\ti := len(buf) - 1\n\tfor num >= base {\n\t\tbuf[i] = hexDigits[num%base]\n\t\tnum /= base\n\t\ti--\n\t}\n\tbuf[i] = hexDigits[num]\n\n\t// Add '0x' prefix.\n\ti--\n\tbuf[i] = 'x'\n\ti--\n\tbuf[i] = '0'\n\n\t// Strip unused leading bytes.\n\tbuf = buf[i:]\n\tw.Write(buf)\n}\n\n// valuesSorter implements sort.Interface to allow a slice of reflect.Value\n// elements to be sorted.\ntype valuesSorter struct {\n\tvalues  []reflect.Value\n\tstrings []string // either nil or same len and values\n\tcs      *ConfigState\n}\n\n// newValuesSorter initializes a valuesSorter instance, which holds a set of\n// surrogate keys on which the data should be sorted.  It uses flags in\n// ConfigState to decide if and how to populate those surrogate keys.\nfunc newValuesSorter(values []reflect.Value, cs *ConfigState) sort.Interface {\n\tvs := &valuesSorter{values: values, cs: cs}\n\tif canSortSimply(vs.values[0].Kind()) {\n\t\treturn vs\n\t}\n\tif !cs.DisableMethods {\n\t\tvs.strings = make([]string, len(values))\n\t\tfor i := range vs.values {\n\t\t\tb := bytes.Buffer{}\n\t\t\tif !handleMethods(cs, &b, vs.values[i]) {\n\t\t\t\tvs.strings = nil\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tvs.strings[i] = b.String()\n\t\t}\n\t}\n\tif vs.strings == nil && cs.SpewKeys {\n\t\tvs.strings = make([]string, len(values))\n\t\tfor i := range vs.values {\n\t\t\tvs.strings[i] = Sprintf(\"%#v\", vs.values[i].Interface())\n\t\t}\n\t}\n\treturn vs\n}\n\n// canSortSimply tests whether a reflect.Kind is a primitive that can be sorted\n// directly, or whether it should be considered for sorting by surrogate keys\n// (if the ConfigState allows it).\nfunc canSortSimply(kind reflect.Kind) bool {\n\t// This switch parallels valueSortLess, except for the default case.\n\tswitch kind {\n\tcase reflect.Bool:\n\t\treturn true\n\tcase reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:\n\t\treturn true\n\tcase reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:\n\t\treturn true\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn true\n\tcase reflect.String:\n\t\treturn true\n\tcase reflect.Uintptr:\n\t\treturn true\n\tcase reflect.Array:\n\t\treturn true\n\t}\n\treturn false\n}\n\n// Len returns the number of values in the slice.  It is part of the\n// sort.Interface implementation.\nfunc (s *valuesSorter) Len() int {\n\treturn len(s.values)\n}\n\n// Swap swaps the values at the passed indices.  It is part of the\n// sort.Interface implementation.\nfunc (s *valuesSorter) Swap(i, j int) {\n\ts.values[i], s.values[j] = s.values[j], s.values[i]\n\tif s.strings != nil {\n\t\ts.strings[i], s.strings[j] = s.strings[j], s.strings[i]\n\t}\n}\n\n// valueSortLess returns whether the first value should sort before the second\n// value.  It is used by valueSorter.Less as part of the sort.Interface\n// implementation.\nfunc valueSortLess(a, b reflect.Value) bool {\n\tswitch a.Kind() {\n\tcase reflect.Bool:\n\t\treturn !a.Bool() && b.Bool()\n\tcase reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:\n\t\treturn a.Int() < b.Int()\n\tcase reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:\n\t\treturn a.Uint() < b.Uint()\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn a.Float() < b.Float()\n\tcase reflect.String:\n\t\treturn a.String() < b.String()\n\tcase reflect.Uintptr:\n\t\treturn a.Uint() < b.Uint()\n\tcase reflect.Array:\n\t\t// Compare the contents of both arrays.\n\t\tl := a.Len()\n\t\tfor i := 0; i < l; i++ {\n\t\t\tav := a.Index(i)\n\t\t\tbv := b.Index(i)\n\t\t\tif av.Interface() == bv.Interface() {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn valueSortLess(av, bv)\n\t\t}\n\t}\n\treturn a.String() < b.String()\n}\n\n// Less returns whether the value at index i should sort before the\n// value at index j.  It is part of the sort.Interface implementation.\nfunc (s *valuesSorter) Less(i, j int) bool {\n\tif s.strings == nil {\n\t\treturn valueSortLess(s.values[i], s.values[j])\n\t}\n\treturn s.strings[i] < s.strings[j]\n}\n\n// sortValues is a sort function that handles both native types and any type that\n// can be converted to error or Stringer.  Other inputs are sorted according to\n// their Value.String() value to ensure display stability.\nfunc sortValues(values []reflect.Value, cs *ConfigState) {\n\tif len(values) == 0 {\n\t\treturn\n\t}\n\tsort.Sort(newValuesSorter(values, cs))\n}\n"
  },
  {
    "path": "internal/spew/common_test.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\npackage spew_test\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/spew\"\n)\n\n// custom type to test Stinger interface on non-pointer receiver.\ntype stringer string\n\n// String implements the Stringer interface for testing invocation of custom\n// stringers on types with non-pointer receivers.\nfunc (s stringer) String() string {\n\treturn \"stringer \" + string(s)\n}\n\n// custom type to test Stinger interface on pointer receiver.\ntype pstringer string\n\n// String implements the Stringer interface for testing invocation of custom\n// stringers on types with only pointer receivers.\nfunc (s *pstringer) String() string {\n\treturn \"stringer \" + string(*s)\n}\n\n// xref1 and xref2 are cross referencing structs for testing circular reference\n// detection.\ntype xref1 struct {\n\tps2 *xref2\n}\ntype xref2 struct {\n\tps1 *xref1\n}\n\n// indirCir1, indirCir2, and indirCir3 are used to generate an indirect circular\n// reference for testing detection.\ntype indirCir1 struct {\n\tps2 *indirCir2\n}\ntype indirCir2 struct {\n\tps3 *indirCir3\n}\ntype indirCir3 struct {\n\tps1 *indirCir1\n}\n\n// embed is used to test embedded structures.\ntype embed struct {\n\ta string\n}\n\n// embedwrap is used to test embedded structures.\ntype embedwrap struct {\n\t*embed\n\te *embed\n}\n\n// panicer is used to intentionally cause a panic for testing spew properly\n// handles them\ntype panicer int\n\nfunc (p panicer) String() string {\n\tpanic(\"test panic\")\n}\n\n// customError is used to test custom error interface invocation.\ntype customError int\n\nfunc (e customError) Error() string {\n\treturn fmt.Sprintf(\"error: %d\", int(e))\n}\n\n// stringizeWants converts a slice of wanted test output into a format suitable\n// for a test error message.\nfunc stringizeWants(wants []string) string {\n\ts := \"\"\n\tfor i, want := range wants {\n\t\tif i > 0 {\n\t\t\ts += fmt.Sprintf(\"want%d: %s\", i+1, want)\n\t\t} else {\n\t\t\ts += \"want: \" + want\n\t\t}\n\t}\n\treturn s\n}\n\n// testFailed returns whether or not a test failed by checking if the result\n// of the test is in the slice of wanted strings.\nfunc testFailed(result string, wants []string) bool {\n\tfor _, want := range wants {\n\t\tif result == want {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\ntype sortableStruct struct {\n\tx int\n}\n\nfunc (ss sortableStruct) String() string {\n\treturn fmt.Sprintf(\"ss.%d\", ss.x)\n}\n\ntype unsortableStruct struct {\n\tx int\n}\n\ntype sortTestCase struct {\n\tinput    []reflect.Value\n\texpected []reflect.Value\n}\n\nfunc helpTestSortValues(tests []sortTestCase, cs *spew.ConfigState, t *testing.T) {\n\tgetInterfaces := func(values []reflect.Value) []interface{} {\n\t\tinterfaces := []interface{}{}\n\t\tfor _, v := range values {\n\t\t\tinterfaces = append(interfaces, v.Interface())\n\t\t}\n\t\treturn interfaces\n\t}\n\n\tfor _, test := range tests {\n\t\tspew.SortValues(test.input, cs)\n\t\t// reflect.DeepEqual cannot really make sense of reflect.Value,\n\t\t// probably because of all the pointer tricks. For instance,\n\t\t// v(2.0) != v(2.0) on a 32-bits system. Turn them into interface{}\n\t\t// instead.\n\t\tinput := getInterfaces(test.input)\n\t\texpected := getInterfaces(test.expected)\n\t\tif !reflect.DeepEqual(input, expected) {\n\t\t\tt.Errorf(\"Sort mismatch:\\n %v != %v\", input, expected)\n\t\t}\n\t}\n}\n\n// TestSortValues ensures the sort functionality for reflect.Value based sorting\n// works as intended.\nfunc TestSortValues(t *testing.T) {\n\tv := reflect.ValueOf\n\n\ta := v(\"a\")\n\tb := v(\"b\")\n\tc := v(\"c\")\n\tembedA := v(embed{\"a\"})\n\tembedB := v(embed{\"b\"})\n\tembedC := v(embed{\"c\"})\n\ttests := []sortTestCase{\n\t\t// No values.\n\t\t{\n\t\t\t[]reflect.Value{},\n\t\t\t[]reflect.Value{},\n\t\t},\n\t\t// Bools.\n\t\t{\n\t\t\t[]reflect.Value{v(false), v(true), v(false)},\n\t\t\t[]reflect.Value{v(false), v(false), v(true)},\n\t\t},\n\t\t// Ints.\n\t\t{\n\t\t\t[]reflect.Value{v(2), v(1), v(3)},\n\t\t\t[]reflect.Value{v(1), v(2), v(3)},\n\t\t},\n\t\t// Uints.\n\t\t{\n\t\t\t[]reflect.Value{v(uint8(2)), v(uint8(1)), v(uint8(3))},\n\t\t\t[]reflect.Value{v(uint8(1)), v(uint8(2)), v(uint8(3))},\n\t\t},\n\t\t// Floats.\n\t\t{\n\t\t\t[]reflect.Value{v(2.0), v(1.0), v(3.0)},\n\t\t\t[]reflect.Value{v(1.0), v(2.0), v(3.0)},\n\t\t},\n\t\t// Strings.\n\t\t{\n\t\t\t[]reflect.Value{b, a, c},\n\t\t\t[]reflect.Value{a, b, c},\n\t\t},\n\t\t// Array\n\t\t{\n\t\t\t[]reflect.Value{v([3]int{3, 2, 1}), v([3]int{1, 3, 2}), v([3]int{1, 2, 3})},\n\t\t\t[]reflect.Value{v([3]int{1, 2, 3}), v([3]int{1, 3, 2}), v([3]int{3, 2, 1})},\n\t\t},\n\t\t// Uintptrs.\n\t\t{\n\t\t\t[]reflect.Value{v(uintptr(2)), v(uintptr(1)), v(uintptr(3))},\n\t\t\t[]reflect.Value{v(uintptr(1)), v(uintptr(2)), v(uintptr(3))},\n\t\t},\n\t\t// SortableStructs.\n\t\t{\n\t\t\t// Note: not sorted - DisableMethods is set.\n\t\t\t[]reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})},\n\t\t\t[]reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})},\n\t\t},\n\t\t// UnsortableStructs.\n\t\t{\n\t\t\t// Note: not sorted - SpewKeys is false.\n\t\t\t[]reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})},\n\t\t\t[]reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})},\n\t\t},\n\t\t// Invalid.\n\t\t{\n\t\t\t[]reflect.Value{embedB, embedA, embedC},\n\t\t\t[]reflect.Value{embedB, embedA, embedC},\n\t\t},\n\t}\n\tcs := spew.ConfigState{DisableMethods: true, SpewKeys: false}\n\thelpTestSortValues(tests, &cs, t)\n}\n\n// TestSortValuesWithMethods ensures the sort functionality for reflect.Value\n// based sorting works as intended when using string methods.\nfunc TestSortValuesWithMethods(t *testing.T) {\n\tv := reflect.ValueOf\n\n\ta := v(\"a\")\n\tb := v(\"b\")\n\tc := v(\"c\")\n\ttests := []sortTestCase{\n\t\t// Ints.\n\t\t{\n\t\t\t[]reflect.Value{v(2), v(1), v(3)},\n\t\t\t[]reflect.Value{v(1), v(2), v(3)},\n\t\t},\n\t\t// Strings.\n\t\t{\n\t\t\t[]reflect.Value{b, a, c},\n\t\t\t[]reflect.Value{a, b, c},\n\t\t},\n\t\t// SortableStructs.\n\t\t{\n\t\t\t[]reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})},\n\t\t\t[]reflect.Value{v(sortableStruct{1}), v(sortableStruct{2}), v(sortableStruct{3})},\n\t\t},\n\t\t// UnsortableStructs.\n\t\t{\n\t\t\t// Note: not sorted - SpewKeys is false.\n\t\t\t[]reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})},\n\t\t\t[]reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})},\n\t\t},\n\t}\n\tcs := spew.ConfigState{DisableMethods: false, SpewKeys: false}\n\thelpTestSortValues(tests, &cs, t)\n}\n\n// TestSortValuesWithSpew ensures the sort functionality for reflect.Value\n// based sorting works as intended when using spew to stringify keys.\nfunc TestSortValuesWithSpew(t *testing.T) {\n\tv := reflect.ValueOf\n\n\ta := v(\"a\")\n\tb := v(\"b\")\n\tc := v(\"c\")\n\ttests := []sortTestCase{\n\t\t// Ints.\n\t\t{\n\t\t\t[]reflect.Value{v(2), v(1), v(3)},\n\t\t\t[]reflect.Value{v(1), v(2), v(3)},\n\t\t},\n\t\t// Strings.\n\t\t{\n\t\t\t[]reflect.Value{b, a, c},\n\t\t\t[]reflect.Value{a, b, c},\n\t\t},\n\t\t// SortableStructs.\n\t\t{\n\t\t\t[]reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})},\n\t\t\t[]reflect.Value{v(sortableStruct{1}), v(sortableStruct{2}), v(sortableStruct{3})},\n\t\t},\n\t\t// UnsortableStructs.\n\t\t{\n\t\t\t[]reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})},\n\t\t\t[]reflect.Value{v(unsortableStruct{1}), v(unsortableStruct{2}), v(unsortableStruct{3})},\n\t\t},\n\t}\n\tcs := spew.ConfigState{DisableMethods: true, SpewKeys: true}\n\thelpTestSortValues(tests, &cs, t)\n}\n"
  },
  {
    "path": "internal/spew/config.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\npackage spew\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n)\n\n// ConfigState houses the configuration options used by spew to format and\n// display values.  There is a global instance, Config, that is used to control\n// all top-level Formatter and Dump functionality.  Each ConfigState instance\n// provides methods equivalent to the top-level functions.\n//\n// The zero value for ConfigState provides no indentation.  You would typically\n// want to set it to a space or a tab.\n//\n// Alternatively, you can use NewDefaultConfig to get a ConfigState instance\n// with default settings.  See the documentation of NewDefaultConfig for default\n// values.\ntype ConfigState struct {\n\t// Indent specifies the string to use for each indentation level.  The\n\t// global config instance that all top-level functions use set this to a\n\t// single space by default.  If you would like more indentation, you might\n\t// set this to a tab with \"\\t\" or perhaps two spaces with \"  \".\n\tIndent string\n\n\t// MaxDepth controls the maximum number of levels to descend into nested\n\t// data structures.  The default, 0, means there is no limit.\n\t//\n\t// NOTE: Circular data structures are properly detected, so it is not\n\t// necessary to set this value unless you specifically want to limit deeply\n\t// nested data structures.\n\tMaxDepth int\n\n\t// DisableMethods specifies whether or not error and Stringer interfaces are\n\t// invoked for types that implement them.\n\tDisableMethods bool\n\n\t// DisablePointerMethods specifies whether or not to check for and invoke\n\t// error and Stringer interfaces on types which only accept a pointer\n\t// receiver when the current type is not a pointer.\n\t//\n\t// NOTE: This might be an unsafe action since calling one of these methods\n\t// with a pointer receiver could technically mutate the value, however,\n\t// in practice, types which choose to satisfy an error or Stringer\n\t// interface with a pointer receiver should not be mutating their state\n\t// inside these interface methods.  As a result, this option relies on\n\t// access to the unsafe package, so it will not have any effect when\n\t// running in environments without access to the unsafe package such as\n\t// Google App Engine or with the \"safe\" build tag specified.\n\tDisablePointerMethods bool\n\n\t// DisablePointerAddresses specifies whether to disable the printing of\n\t// pointer addresses. This is useful when diffing data structures in tests.\n\tDisablePointerAddresses bool\n\n\t// DisableCapacities specifies whether to disable the printing of capacities\n\t// for arrays, slices, maps and channels. This is useful when diffing\n\t// data structures in tests.\n\tDisableCapacities bool\n\n\t// ContinueOnMethod specifies whether or not recursion should continue once\n\t// a custom error or Stringer interface is invoked.  The default, false,\n\t// means it will print the results of invoking the custom error or Stringer\n\t// interface and return immediately instead of continuing to recurse into\n\t// the internals of the data type.\n\t//\n\t// NOTE: This flag does not have any effect if method invocation is disabled\n\t// via the DisableMethods or DisablePointerMethods options.\n\tContinueOnMethod bool\n\n\t// SortKeys specifies map keys should be sorted before being printed. Use\n\t// this to have a more deterministic, diffable output.  Note that only\n\t// native types (bool, int, uint, floats, uintptr and string) and types\n\t// that support the error or Stringer interfaces (if methods are\n\t// enabled) are supported, with other types sorted according to the\n\t// reflect.Value.String() output which guarantees display stability.\n\tSortKeys bool\n\n\t// SpewKeys specifies that, as a last resort attempt, map keys should\n\t// be spewed to strings and sorted by those strings.  This is only\n\t// considered if SortKeys is true.\n\tSpewKeys bool\n}\n\n// Config is the active configuration of the top-level functions.\n// The configuration can be changed by modifying the contents of spew.Config.\nvar Config = ConfigState{Indent: \" \"}\n\n// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the formatted string as a value that satisfies error.  See NewFormatter\n// for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Errorf(format, c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Errorf(format string, a ...interface{}) (err error) {\n\treturn fmt.Errorf(format, c.convertArgs(a)...)\n}\n\n// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Fprint(w, c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Fprint(w io.Writer, a ...interface{}) (n int, err error) {\n\treturn fmt.Fprint(w, c.convertArgs(a)...)\n}\n\n// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Fprintf(w, format, c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {\n\treturn fmt.Fprintf(w, format, c.convertArgs(a)...)\n}\n\n// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it\n// passed with a Formatter interface returned by c.NewFormatter.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Fprintln(w, c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Fprintln(w io.Writer, a ...interface{}) (n int, err error) {\n\treturn fmt.Fprintln(w, c.convertArgs(a)...)\n}\n\n// Print is a wrapper for fmt.Print that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Print(c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Print(a ...interface{}) (n int, err error) {\n\treturn fmt.Print(c.convertArgs(a)...)\n}\n\n// Printf is a wrapper for fmt.Printf that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Printf(format, c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Printf(format string, a ...interface{}) (n int, err error) {\n\treturn fmt.Printf(format, c.convertArgs(a)...)\n}\n\n// Println is a wrapper for fmt.Println that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Println(c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Println(a ...interface{}) (n int, err error) {\n\treturn fmt.Println(c.convertArgs(a)...)\n}\n\n// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the resulting string.  See NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Sprint(c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Sprint(a ...interface{}) string {\n\treturn fmt.Sprint(c.convertArgs(a)...)\n}\n\n// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the resulting string.  See NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Sprintf(format, c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Sprintf(format string, a ...interface{}) string {\n\treturn fmt.Sprintf(format, c.convertArgs(a)...)\n}\n\n// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it\n// were passed with a Formatter interface returned by c.NewFormatter.  It\n// returns the resulting string.  See NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Sprintln(c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Sprintln(a ...interface{}) string {\n\treturn fmt.Sprintln(c.convertArgs(a)...)\n}\n\n/*\nNewFormatter returns a custom formatter that satisfies the fmt.Formatter\ninterface.  As a result, it integrates cleanly with standard fmt package\nprinting functions.  The formatter is useful for inline printing of smaller data\ntypes similar to the standard %v format specifier.\n\nThe custom formatter only responds to the %v (most compact), %+v (adds pointer\naddresses), %#v (adds types), and %#+v (adds types and pointer addresses) verb\ncombinations.  Any other verbs such as %x and %q will be sent to the\nstandard fmt package for formatting.  In addition, the custom formatter ignores\nthe width and precision arguments (however they will still work on the format\nspecifiers not handled by the custom formatter).\n\nTypically this function shouldn't be called directly.  It is much easier to make\nuse of the custom formatter by calling one of the convenience functions such as\nc.Printf, c.Println, or c.Printf.\n*/\nfunc (c *ConfigState) NewFormatter(v interface{}) fmt.Formatter {\n\treturn newFormatter(c, v)\n}\n\n// Fdump formats and displays the passed arguments to io.Writer w.  It formats\n// exactly the same as Dump.\nfunc (c *ConfigState) Fdump(w io.Writer, a ...interface{}) {\n\tfdump(c, w, a...)\n}\n\n/*\nDump displays the passed parameters to standard out with newlines, customizable\nindentation, and additional debug information such as complete types and all\npointer addresses used to indirect to the final value.  It provides the\nfollowing features over the built-in printing facilities provided by the fmt\npackage:\n\n  - Pointers are dereferenced and followed\n  - Circular data structures are detected and handled properly\n  - Custom Stringer/error interfaces are optionally invoked, including\n    on unexported types\n  - Custom types which only implement the Stringer/error interfaces via\n    a pointer receiver are optionally invoked when passing non-pointer\n    variables\n  - Byte arrays and slices are dumped like the hexdump -C command which\n    includes offsets, byte values in hex, and ASCII output\n\nThe configuration options are controlled by modifying the public members\nof c.  See ConfigState for options documentation.\n\nSee Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to\nget the formatted result as a string.\n*/\nfunc (c *ConfigState) Dump(a ...interface{}) {\n\tfdump(c, os.Stdout, a...)\n}\n\n// Sdump returns a string with the passed arguments formatted exactly the same\n// as Dump.\nfunc (c *ConfigState) Sdump(a ...interface{}) string {\n\tvar buf bytes.Buffer\n\tfdump(c, &buf, a...)\n\treturn buf.String()\n}\n\n// convertArgs accepts a slice of arguments and returns a slice of the same\n// length with each argument converted to a spew Formatter interface using\n// the ConfigState associated with s.\nfunc (c *ConfigState) convertArgs(args []interface{}) (formatters []interface{}) {\n\tformatters = make([]interface{}, len(args))\n\tfor index, arg := range args {\n\t\tformatters[index] = newFormatter(c, arg)\n\t}\n\treturn formatters\n}\n\n// NewDefaultConfig returns a ConfigState with the following default settings.\n//\n//\tIndent: \" \"\n//\tMaxDepth: 0\n//\tDisableMethods: false\n//\tDisablePointerMethods: false\n//\tContinueOnMethod: false\n//\tSortKeys: false\nfunc NewDefaultConfig() *ConfigState {\n\treturn &ConfigState{Indent: \" \"}\n}\n"
  },
  {
    "path": "internal/spew/doc.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n/*\nPackage spew implements a deep pretty printer for Go data structures to aid in\ndebugging.\n\nA quick overview of the additional features spew provides over the built-in\nprinting facilities for Go data types are as follows:\n\n  - Pointers are dereferenced and followed\n  - Circular data structures are detected and handled properly\n  - Custom Stringer/error interfaces are optionally invoked, including\n    on unexported types\n  - Custom types which only implement the Stringer/error interfaces via\n    a pointer receiver are optionally invoked when passing non-pointer\n    variables\n  - Byte arrays and slices are dumped like the hexdump -C command which\n    includes offsets, byte values in hex, and ASCII output (only when using\n    Dump style)\n\nThere are two different approaches spew allows for dumping Go data structures:\n\n  - Dump style which prints with newlines, customizable indentation,\n    and additional debug information such as types and all pointer addresses\n    used to indirect to the final value\n  - A custom Formatter interface that integrates cleanly with the standard fmt\n    package and replaces %v, %+v, %#v, and %#+v to provide inline printing\n    similar to the default %v while providing the additional functionality\n    outlined above and passing unsupported format verbs such as %x and %q\n    along to fmt\n\n# Quick Start\n\nThis section demonstrates how to quickly get started with spew.  See the\nsections below for further details on formatting and configuration options.\n\nTo dump a variable with full newlines, indentation, type, and pointer\ninformation use Dump, Fdump, or Sdump:\n\n\tspew.Dump(myVar1, myVar2, ...)\n\tspew.Fdump(someWriter, myVar1, myVar2, ...)\n\tstr := spew.Sdump(myVar1, myVar2, ...)\n\nAlternatively, if you would prefer to use format strings with a compacted inline\nprinting style, use the convenience wrappers Printf, Fprintf, etc with\n%v (most compact), %+v (adds pointer addresses), %#v (adds types), or\n%#+v (adds types and pointer addresses):\n\n\tspew.Printf(\"myVar1: %v -- myVar2: %+v\", myVar1, myVar2)\n\tspew.Printf(\"myVar3: %#v -- myVar4: %#+v\", myVar3, myVar4)\n\tspew.Fprintf(someWriter, \"myVar1: %v -- myVar2: %+v\", myVar1, myVar2)\n\tspew.Fprintf(someWriter, \"myVar3: %#v -- myVar4: %#+v\", myVar3, myVar4)\n\n# Configuration Options\n\nConfiguration of spew is handled by fields in the ConfigState type.  For\nconvenience, all of the top-level functions use a global state available\nvia the spew.Config global.\n\nIt is also possible to create a ConfigState instance that provides methods\nequivalent to the top-level functions.  This allows concurrent configuration\noptions.  See the ConfigState documentation for more details.\n\nThe following configuration options are available:\n\n  - Indent\n    String to use for each indentation level for Dump functions.\n    It is a single space by default.  A popular alternative is \"\\t\".\n\n  - MaxDepth\n    Maximum number of levels to descend into nested data structures.\n    There is no limit by default.\n\n  - DisableMethods\n    Disables invocation of error and Stringer interface methods.\n    Method invocation is enabled by default.\n\n  - DisablePointerMethods\n    Disables invocation of error and Stringer interface methods on types\n    which only accept pointer receivers from non-pointer variables.\n    Pointer method invocation is enabled by default.\n\n  - DisablePointerAddresses\n    DisablePointerAddresses specifies whether to disable the printing of\n    pointer addresses. This is useful when diffing data structures in tests.\n\n  - DisableCapacities\n    DisableCapacities specifies whether to disable the printing of\n    capacities for arrays, slices, maps and channels. This is useful when\n    diffing data structures in tests.\n\n  - ContinueOnMethod\n    Enables recursion into types after invoking error and Stringer interface\n    methods. Recursion after method invocation is disabled by default.\n\n  - SortKeys\n    Specifies map keys should be sorted before being printed. Use\n    this to have a more deterministic, diffable output.  Note that\n    only native types (bool, int, uint, floats, uintptr and string)\n    and types which implement error or Stringer interfaces are\n    supported with other types sorted according to the\n    reflect.Value.String() output which guarantees display\n    stability.  Natural map order is used by default.\n\n  - SpewKeys\n    Specifies that, as a last resort attempt, map keys should be\n    spewed to strings and sorted by those strings.  This is only\n    considered if SortKeys is true.\n\n# Dump Usage\n\nSimply call spew.Dump with a list of variables you want to dump:\n\n\tspew.Dump(myVar1, myVar2, ...)\n\nYou may also call spew.Fdump if you would prefer to output to an arbitrary\nio.Writer.  For example, to dump to standard error:\n\n\tspew.Fdump(os.Stderr, myVar1, myVar2, ...)\n\nA third option is to call spew.Sdump to get the formatted output as a string:\n\n\tstr := spew.Sdump(myVar1, myVar2, ...)\n\n# Sample Dump Output\n\nSee the Dump example for details on the setup of the types and variables being\nshown here.\n\n\t(main.Foo) {\n\t unexportedField: (*main.Bar)(0xf84002e210)({\n\t  flag: (main.Flag) flagTwo,\n\t  data: (uintptr) <nil>\n\t }),\n\t ExportedField: (map[interface {}]interface {}) (len=1) {\n\t  (string) (len=3) \"one\": (bool) true\n\t }\n\t}\n\nByte (and uint8) arrays and slices are displayed uniquely like the hexdump -C\ncommand as shown.\n\n\t([]uint8) (len=32 cap=32) {\n\t 00000000  11 12 13 14 15 16 17 18  19 1a 1b 1c 1d 1e 1f 20  |............... |\n\t 00000010  21 22 23 24 25 26 27 28  29 2a 2b 2c 2d 2e 2f 30  |!\"#$%&'()*+,-./0|\n\t 00000020  31 32                                             |12|\n\t}\n\n# Custom Formatter\n\nSpew provides a custom formatter that implements the fmt.Formatter interface\nso that it integrates cleanly with standard fmt package printing functions. The\nformatter is useful for inline printing of smaller data types similar to the\nstandard %v format specifier.\n\nThe custom formatter only responds to the %v (most compact), %+v (adds pointer\naddresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb\ncombinations.  Any other verbs such as %x and %q will be sent to the\nstandard fmt package for formatting.  In addition, the custom formatter ignores\nthe width and precision arguments (however they will still work on the format\nspecifiers not handled by the custom formatter).\n\n# Custom Formatter Usage\n\nThe simplest way to make use of the spew custom formatter is to call one of the\nconvenience functions such as spew.Printf, spew.Println, or spew.Printf.  The\nfunctions have syntax you are most likely already familiar with:\n\n\tspew.Printf(\"myVar1: %v -- myVar2: %+v\", myVar1, myVar2)\n\tspew.Printf(\"myVar3: %#v -- myVar4: %#+v\", myVar3, myVar4)\n\tspew.Println(myVar, myVar2)\n\tspew.Fprintf(os.Stderr, \"myVar1: %v -- myVar2: %+v\", myVar1, myVar2)\n\tspew.Fprintf(os.Stderr, \"myVar3: %#v -- myVar4: %#+v\", myVar3, myVar4)\n\nSee the Index for the full list convenience functions.\n\n# Sample Formatter Output\n\nDouble pointer to a uint8:\n\n\t  %v: <**>5\n\t %+v: <**>(0xf8400420d0->0xf8400420c8)5\n\t %#v: (**uint8)5\n\t%#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5\n\nPointer to circular struct with a uint8 field and a pointer to itself:\n\n\t  %v: <*>{1 <*><shown>}\n\t %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)<shown>}\n\t %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)<shown>}\n\t%#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)<shown>}\n\nSee the Printf example for details on the setup of variables being shown\nhere.\n\n# Errors\n\nSince it is possible for custom Stringer/error interfaces to panic, spew\ndetects them and handles them internally by printing the panic information\ninline with the output.  Since spew is intended to provide deep pretty printing\ncapabilities on structures, it intentionally does not return any errors.\n*/\npackage spew\n"
  },
  {
    "path": "internal/spew/dump.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\npackage spew\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n)\n\nvar (\n\t// uint8Type is a reflect.Type representing a uint8.  It is used to\n\t// convert cgo types to uint8 slices for hexdumping.\n\tuint8Type = reflect.TypeOf(uint8(0))\n\n\t// cCharRE is a regular expression that matches a cgo char.\n\t// It is used to detect character arrays to hexdump them.\n\tcCharRE = regexp.MustCompile(`^.*\\._Ctype_char$`)\n\n\t// cUnsignedCharRE is a regular expression that matches a cgo unsigned\n\t// char.  It is used to detect unsigned character arrays to hexdump\n\t// them.\n\tcUnsignedCharRE = regexp.MustCompile(`^.*\\._Ctype_unsignedchar$`)\n\n\t// cUint8tCharRE is a regular expression that matches a cgo uint8_t.\n\t// It is used to detect uint8_t arrays to hexdump them.\n\tcUint8tCharRE = regexp.MustCompile(`^.*\\._Ctype_uint8_t$`)\n)\n\n// dumpState contains information about the state of a dump operation.\ntype dumpState struct {\n\tw                io.Writer\n\tdepth            int\n\tpointers         map[uintptr]int\n\tignoreNextType   bool\n\tignoreNextIndent bool\n\tcs               *ConfigState\n}\n\n// indent performs indentation according to the depth level and cs.Indent\n// option.\nfunc (d *dumpState) indent() {\n\tif d.ignoreNextIndent {\n\t\td.ignoreNextIndent = false\n\t\treturn\n\t}\n\td.w.Write(bytes.Repeat([]byte(d.cs.Indent), d.depth))\n}\n\n// unpackValue returns values inside of non-nil interfaces when possible.\n// This is useful for data types like structs, arrays, slices, and maps which\n// can contain varying types packed inside an interface.\nfunc (d *dumpState) unpackValue(v reflect.Value) reflect.Value {\n\tif v.Kind() == reflect.Interface && !v.IsNil() {\n\t\tv = v.Elem()\n\t}\n\treturn v\n}\n\n// dumpPtr handles formatting of pointers by indirecting them as necessary.\nfunc (d *dumpState) dumpPtr(v reflect.Value) {\n\t// Remove pointers at or below the current depth from map used to detect\n\t// circular refs.\n\tfor k, depth := range d.pointers {\n\t\tif depth >= d.depth {\n\t\t\tdelete(d.pointers, k)\n\t\t}\n\t}\n\n\t// Keep list of all dereferenced pointers to show later.\n\tpointerChain := make([]uintptr, 0)\n\n\t// Figure out how many levels of indirection there are by dereferencing\n\t// pointers and unpacking interfaces down the chain while detecting circular\n\t// references.\n\tnilFound := false\n\tcycleFound := false\n\tindirects := 0\n\tve := v\n\tfor ve.Kind() == reflect.Ptr {\n\t\tif ve.IsNil() {\n\t\t\tnilFound = true\n\t\t\tbreak\n\t\t}\n\t\tindirects++\n\t\taddr := ve.Pointer()\n\t\tpointerChain = append(pointerChain, addr)\n\t\tif pd, ok := d.pointers[addr]; ok && pd < d.depth {\n\t\t\tcycleFound = true\n\t\t\tindirects--\n\t\t\tbreak\n\t\t}\n\t\td.pointers[addr] = d.depth\n\n\t\tve = ve.Elem()\n\t\tif ve.Kind() == reflect.Interface {\n\t\t\tif ve.IsNil() {\n\t\t\t\tnilFound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tve = ve.Elem()\n\t\t}\n\t}\n\n\t// Display type information.\n\td.w.Write(openParenBytes)\n\td.w.Write(bytes.Repeat(asteriskBytes, indirects))\n\td.w.Write([]byte(ve.Type().String()))\n\td.w.Write(closeParenBytes)\n\n\t// Display pointer information.\n\tif !d.cs.DisablePointerAddresses && len(pointerChain) > 0 {\n\t\td.w.Write(openParenBytes)\n\t\tfor i, addr := range pointerChain {\n\t\t\tif i > 0 {\n\t\t\t\td.w.Write(pointerChainBytes)\n\t\t\t}\n\t\t\tprintHexPtr(d.w, addr)\n\t\t}\n\t\td.w.Write(closeParenBytes)\n\t}\n\n\t// Display dereferenced value.\n\td.w.Write(openParenBytes)\n\tswitch {\n\tcase nilFound:\n\t\td.w.Write(nilAngleBytes)\n\n\tcase cycleFound:\n\t\td.w.Write(circularBytes)\n\n\tdefault:\n\t\td.ignoreNextType = true\n\t\td.dump(ve)\n\t}\n\td.w.Write(closeParenBytes)\n}\n\n// dumpSlice handles formatting of arrays and slices.  Byte (uint8 under\n// reflection) arrays and slices are dumped in hexdump -C fashion.\nfunc (d *dumpState) dumpSlice(v reflect.Value) {\n\t// Determine whether this type should be hex dumped or not.  Also,\n\t// for types which should be hexdumped, try to use the underlying data\n\t// first, then fall back to trying to convert them to a uint8 slice.\n\tvar buf []uint8\n\tdoConvert := false\n\tdoHexDump := false\n\tnumEntries := v.Len()\n\tif numEntries > 0 {\n\t\tvt := v.Index(0).Type()\n\t\tvts := vt.String()\n\t\tswitch {\n\t\t// C types that need to be converted.\n\t\tcase cCharRE.MatchString(vts):\n\t\t\tfallthrough\n\t\tcase cUnsignedCharRE.MatchString(vts):\n\t\t\tfallthrough\n\t\tcase cUint8tCharRE.MatchString(vts):\n\t\t\tdoConvert = true\n\n\t\t// Try to use existing uint8 slices and fall back to converting\n\t\t// and copying if that fails.\n\t\tcase vt.Kind() == reflect.Uint8:\n\t\t\t// We need an addressable interface to convert the type\n\t\t\t// to a byte slice.  However, the reflect package won't\n\t\t\t// give us an interface on certain things like\n\t\t\t// unexported struct fields in order to enforce\n\t\t\t// visibility rules.  We use unsafe, when available, to\n\t\t\t// bypass these restrictions since this package does not\n\t\t\t// mutate the values.\n\t\t\tvs := v\n\t\t\tif !vs.CanInterface() || !vs.CanAddr() {\n\t\t\t\tvs = unsafeReflectValue(vs)\n\t\t\t}\n\t\t\tif !UnsafeDisabled {\n\t\t\t\tvs = vs.Slice(0, numEntries)\n\n\t\t\t\t// Use the existing uint8 slice if it can be\n\t\t\t\t// type asserted.\n\t\t\t\tiface := vs.Interface()\n\t\t\t\tif slice, ok := iface.([]uint8); ok {\n\t\t\t\t\tbuf = slice\n\t\t\t\t\tdoHexDump = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// The underlying data needs to be converted if it can't\n\t\t\t// be type asserted to a uint8 slice.\n\t\t\tdoConvert = true\n\t\t}\n\n\t\t// Copy and convert the underlying type if needed.\n\t\tif doConvert && vt.ConvertibleTo(uint8Type) {\n\t\t\t// Convert and copy each element into a uint8 byte\n\t\t\t// slice.\n\t\t\tbuf = make([]uint8, numEntries)\n\t\t\tfor i := 0; i < numEntries; i++ {\n\t\t\t\tvv := v.Index(i)\n\t\t\t\tbuf[i] = uint8(vv.Convert(uint8Type).Uint())\n\t\t\t}\n\t\t\tdoHexDump = true\n\t\t}\n\t}\n\n\t// Hexdump the entire slice as needed.\n\tif doHexDump {\n\t\tindent := strings.Repeat(d.cs.Indent, d.depth)\n\t\tstr := indent + hex.Dump(buf)\n\t\tstr = strings.Replace(str, \"\\n\", \"\\n\"+indent, -1)\n\t\tstr = strings.TrimRight(str, d.cs.Indent)\n\t\td.w.Write([]byte(str))\n\t\treturn\n\t}\n\n\t// Recursively call dump for each item.\n\tfor i := 0; i < numEntries; i++ {\n\t\td.dump(d.unpackValue(v.Index(i)))\n\t\tif i < (numEntries - 1) {\n\t\t\td.w.Write(commaNewlineBytes)\n\t\t} else {\n\t\t\td.w.Write(newlineBytes)\n\t\t}\n\t}\n}\n\n// dump is the main workhorse for dumping a value.  It uses the passed reflect\n// value to figure out what kind of object we are dealing with and formats it\n// appropriately.  It is a recursive function, however circular data structures\n// are detected and handled properly.\nfunc (d *dumpState) dump(v reflect.Value) {\n\t// Handle invalid reflect values immediately.\n\tkind := v.Kind()\n\tif kind == reflect.Invalid {\n\t\td.w.Write(invalidAngleBytes)\n\t\treturn\n\t}\n\n\t// Handle pointers specially.\n\tif kind == reflect.Ptr {\n\t\td.indent()\n\t\td.dumpPtr(v)\n\t\treturn\n\t}\n\n\t// Print type information unless already handled elsewhere.\n\tif !d.ignoreNextType {\n\t\td.indent()\n\t\td.w.Write(openParenBytes)\n\t\td.w.Write([]byte(v.Type().String()))\n\t\td.w.Write(closeParenBytes)\n\t\td.w.Write(spaceBytes)\n\t}\n\td.ignoreNextType = false\n\n\t// Display length and capacity if the built-in len and cap functions\n\t// work with the value's kind and the len/cap itself is non-zero.\n\tvalueLen, valueCap := 0, 0\n\tswitch v.Kind() {\n\tcase reflect.Array, reflect.Slice, reflect.Chan:\n\t\tvalueLen, valueCap = v.Len(), v.Cap()\n\tcase reflect.Map, reflect.String:\n\t\tvalueLen = v.Len()\n\t}\n\tif valueLen != 0 || !d.cs.DisableCapacities && valueCap != 0 {\n\t\td.w.Write(openParenBytes)\n\t\tif valueLen != 0 {\n\t\t\td.w.Write(lenEqualsBytes)\n\t\t\tprintInt(d.w, int64(valueLen), 10)\n\t\t}\n\t\tif !d.cs.DisableCapacities && valueCap != 0 {\n\t\t\tif valueLen != 0 {\n\t\t\t\td.w.Write(spaceBytes)\n\t\t\t}\n\t\t\td.w.Write(capEqualsBytes)\n\t\t\tprintInt(d.w, int64(valueCap), 10)\n\t\t}\n\t\td.w.Write(closeParenBytes)\n\t\td.w.Write(spaceBytes)\n\t}\n\n\t// Call Stringer/error interfaces if they exist and the handle methods flag\n\t// is enabled\n\tif !d.cs.DisableMethods {\n\t\tif (kind != reflect.Invalid) && (kind != reflect.Interface) {\n\t\t\tif handled := handleMethods(d.cs, d.w, v); handled {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch kind {\n\tcase reflect.Invalid:\n\t\t// Do nothing.  We should never get here since invalid has already\n\t\t// been handled above.\n\n\tcase reflect.Bool:\n\t\tprintBool(d.w, v.Bool())\n\n\tcase reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:\n\t\tprintInt(d.w, v.Int(), 10)\n\n\tcase reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:\n\t\tprintUint(d.w, v.Uint(), 10)\n\n\tcase reflect.Float32:\n\t\tprintFloat(d.w, v.Float(), 32)\n\n\tcase reflect.Float64:\n\t\tprintFloat(d.w, v.Float(), 64)\n\n\tcase reflect.Complex64:\n\t\tprintComplex(d.w, v.Complex(), 32)\n\n\tcase reflect.Complex128:\n\t\tprintComplex(d.w, v.Complex(), 64)\n\n\tcase reflect.Slice:\n\t\tif v.IsNil() {\n\t\t\td.w.Write(nilAngleBytes)\n\t\t\tbreak\n\t\t}\n\t\tfallthrough\n\n\tcase reflect.Array:\n\t\td.w.Write(openBraceNewlineBytes)\n\t\td.depth++\n\t\tif (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) {\n\t\t\td.indent()\n\t\t\td.w.Write(maxNewlineBytes)\n\t\t} else {\n\t\t\td.dumpSlice(v)\n\t\t}\n\t\td.depth--\n\t\td.indent()\n\t\td.w.Write(closeBraceBytes)\n\n\tcase reflect.String:\n\t\td.w.Write([]byte(strconv.Quote(v.String())))\n\n\tcase reflect.Interface:\n\t\t// The only time we should get here is for nil interfaces due to\n\t\t// unpackValue calls.\n\t\tif v.IsNil() {\n\t\t\td.w.Write(nilAngleBytes)\n\t\t}\n\n\tcase reflect.Ptr:\n\t\t// Do nothing.  We should never get here since pointers have already\n\t\t// been handled above.\n\n\tcase reflect.Map:\n\t\t// nil maps should be indicated as different than empty maps\n\t\tif v.IsNil() {\n\t\t\td.w.Write(nilAngleBytes)\n\t\t\tbreak\n\t\t}\n\n\t\td.w.Write(openBraceNewlineBytes)\n\t\td.depth++\n\t\tif (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) {\n\t\t\td.indent()\n\t\t\td.w.Write(maxNewlineBytes)\n\t\t} else {\n\t\t\tnumEntries := v.Len()\n\t\t\tkeys := v.MapKeys()\n\t\t\tif d.cs.SortKeys {\n\t\t\t\tsortValues(keys, d.cs)\n\t\t\t}\n\t\t\tfor i, key := range keys {\n\t\t\t\td.dump(d.unpackValue(key))\n\t\t\t\td.w.Write(colonSpaceBytes)\n\t\t\t\td.ignoreNextIndent = true\n\t\t\t\td.dump(d.unpackValue(v.MapIndex(key)))\n\t\t\t\tif i < (numEntries - 1) {\n\t\t\t\t\td.w.Write(commaNewlineBytes)\n\t\t\t\t} else {\n\t\t\t\t\td.w.Write(newlineBytes)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\td.depth--\n\t\td.indent()\n\t\td.w.Write(closeBraceBytes)\n\n\tcase reflect.Struct:\n\t\td.w.Write(openBraceNewlineBytes)\n\t\td.depth++\n\t\tif (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) {\n\t\t\td.indent()\n\t\t\td.w.Write(maxNewlineBytes)\n\t\t} else {\n\t\t\tvt := v.Type()\n\t\t\tnumFields := v.NumField()\n\t\t\tfor i := 0; i < numFields; i++ {\n\t\t\t\td.indent()\n\t\t\t\tvtf := vt.Field(i)\n\t\t\t\td.w.Write([]byte(vtf.Name))\n\t\t\t\td.w.Write(colonSpaceBytes)\n\t\t\t\td.ignoreNextIndent = true\n\t\t\t\td.dump(d.unpackValue(v.Field(i)))\n\t\t\t\tif i < (numFields - 1) {\n\t\t\t\t\td.w.Write(commaNewlineBytes)\n\t\t\t\t} else {\n\t\t\t\t\td.w.Write(newlineBytes)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\td.depth--\n\t\td.indent()\n\t\td.w.Write(closeBraceBytes)\n\n\tcase reflect.Uintptr:\n\t\tprintHexPtr(d.w, uintptr(v.Uint()))\n\n\tcase reflect.UnsafePointer, reflect.Chan, reflect.Func:\n\t\tprintHexPtr(d.w, v.Pointer())\n\n\t// There were not any other types at the time this code was written, but\n\t// fall back to letting the default fmt package handle it in case any new\n\t// types are added.\n\tdefault:\n\t\tif v.CanInterface() {\n\t\t\tfmt.Fprintf(d.w, \"%v\", v.Interface())\n\t\t} else {\n\t\t\tfmt.Fprintf(d.w, \"%v\", v.String())\n\t\t}\n\t}\n}\n\n// fdump is a helper function to consolidate the logic from the various public\n// methods which take varying writers and config states.\nfunc fdump(cs *ConfigState, w io.Writer, a ...interface{}) {\n\tfor _, arg := range a {\n\t\tif arg == nil {\n\t\t\tw.Write(interfaceBytes)\n\t\t\tw.Write(spaceBytes)\n\t\t\tw.Write(nilAngleBytes)\n\t\t\tw.Write(newlineBytes)\n\t\t\tcontinue\n\t\t}\n\n\t\td := dumpState{w: w, cs: cs}\n\t\td.pointers = make(map[uintptr]int)\n\t\td.dump(reflect.ValueOf(arg))\n\t\td.w.Write(newlineBytes)\n\t}\n}\n\n// Fdump formats and displays the passed arguments to io.Writer w.  It formats\n// exactly the same as Dump.\nfunc Fdump(w io.Writer, a ...interface{}) {\n\tfdump(&Config, w, a...)\n}\n\n// Sdump returns a string with the passed arguments formatted exactly the same\n// as Dump.\nfunc Sdump(a ...interface{}) string {\n\tvar buf bytes.Buffer\n\tfdump(&Config, &buf, a...)\n\treturn buf.String()\n}\n\n/*\nDump displays the passed parameters to standard out with newlines, customizable\nindentation, and additional debug information such as complete types and all\npointer addresses used to indirect to the final value.  It provides the\nfollowing features over the built-in printing facilities provided by the fmt\npackage:\n\n  - Pointers are dereferenced and followed\n  - Circular data structures are detected and handled properly\n  - Custom Stringer/error interfaces are optionally invoked, including\n    on unexported types\n  - Custom types which only implement the Stringer/error interfaces via\n    a pointer receiver are optionally invoked when passing non-pointer\n    variables\n  - Byte arrays and slices are dumped like the hexdump -C command which\n    includes offsets, byte values in hex, and ASCII output\n\nThe configuration options are controlled by an exported package global,\nspew.Config.  See ConfigState for options documentation.\n\nSee Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to\nget the formatted result as a string.\n*/\nfunc Dump(a ...interface{}) {\n\tfdump(&Config, os.Stdout, a...)\n}\n"
  },
  {
    "path": "internal/spew/dump_test.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n/*\nTest Summary:\nNOTE: For each test, a nil pointer, a single pointer and double pointer to the\nbase test element are also tested to ensure proper indirection across all types.\n\n- Max int8, int16, int32, int64, int\n- Max uint8, uint16, uint32, uint64, uint\n- Boolean true and false\n- Standard complex64 and complex128\n- Array containing standard ints\n- Array containing type with custom formatter on pointer receiver only\n- Array containing interfaces\n- Array containing bytes\n- Slice containing standard float32 values\n- Slice containing type with custom formatter on pointer receiver only\n- Slice containing interfaces\n- Slice containing bytes\n- Nil slice\n- Standard string\n- Nil interface\n- Sub-interface\n- Map with string keys and int vals\n- Map with custom formatter type on pointer receiver only keys and vals\n- Map with interface keys and values\n- Map with nil interface value\n- Struct with primitives\n- Struct that contains another struct\n- Struct that contains custom type with Stringer pointer interface via both\n  exported and unexported fields\n- Struct that contains embedded struct and field to same struct\n- Uintptr to 0 (null pointer)\n- Uintptr address of real variable\n- Unsafe.Pointer to 0 (null pointer)\n- Unsafe.Pointer to address of real variable\n- Nil channel\n- Standard int channel\n- Function with no params and no returns\n- Function with param and no returns\n- Function with multiple params and multiple returns\n- Struct that is circular through self referencing\n- Structs that are circular through cross referencing\n- Structs that are indirectly circular\n- Type that panics in its Stringer interface\n*/\n\npackage spew_test\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"testing\"\n\t\"unsafe\"\n\n\t\"github.com/expr-lang/expr/internal/spew\"\n)\n\n// dumpTest is used to describe a test to be performed against the Dump method.\ntype dumpTest struct {\n\tin    interface{}\n\twants []string\n}\n\n// dumpTests houses all of the tests to be performed against the Dump method.\nvar dumpTests = make([]dumpTest, 0)\n\n// addDumpTest is a helper method to append the passed input and desired result\n// to dumpTests\nfunc addDumpTest(in interface{}, wants ...string) {\n\ttest := dumpTest{in, wants}\n\tdumpTests = append(dumpTests, test)\n}\n\nfunc addIntDumpTests() {\n\t// Max int8.\n\tv := int8(127)\n\tnv := (*int8)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"int8\"\n\tvs := \"127\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n\n\t// Max int16.\n\tv2 := int16(32767)\n\tnv2 := (*int16)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"int16\"\n\tv2s := \"32767\"\n\taddDumpTest(v2, \"(\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*\"+v2t+\")(\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(&pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(nv2, \"(*\"+v2t+\")(<nil>)\\n\")\n\n\t// Max int32.\n\tv3 := int32(2147483647)\n\tnv3 := (*int32)(nil)\n\tpv3 := &v3\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"int32\"\n\tv3s := \"2147483647\"\n\taddDumpTest(v3, \"(\"+v3t+\") \"+v3s+\"\\n\")\n\taddDumpTest(pv3, \"(*\"+v3t+\")(\"+v3Addr+\")(\"+v3s+\")\\n\")\n\taddDumpTest(&pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")(\"+v3s+\")\\n\")\n\taddDumpTest(nv3, \"(*\"+v3t+\")(<nil>)\\n\")\n\n\t// Max int64.\n\tv4 := int64(9223372036854775807)\n\tnv4 := (*int64)(nil)\n\tpv4 := &v4\n\tv4Addr := fmt.Sprintf(\"%p\", pv4)\n\tpv4Addr := fmt.Sprintf(\"%p\", &pv4)\n\tv4t := \"int64\"\n\tv4s := \"9223372036854775807\"\n\taddDumpTest(v4, \"(\"+v4t+\") \"+v4s+\"\\n\")\n\taddDumpTest(pv4, \"(*\"+v4t+\")(\"+v4Addr+\")(\"+v4s+\")\\n\")\n\taddDumpTest(&pv4, \"(**\"+v4t+\")(\"+pv4Addr+\"->\"+v4Addr+\")(\"+v4s+\")\\n\")\n\taddDumpTest(nv4, \"(*\"+v4t+\")(<nil>)\\n\")\n\n\t// Max int.\n\tv5 := int(2147483647)\n\tnv5 := (*int)(nil)\n\tpv5 := &v5\n\tv5Addr := fmt.Sprintf(\"%p\", pv5)\n\tpv5Addr := fmt.Sprintf(\"%p\", &pv5)\n\tv5t := \"int\"\n\tv5s := \"2147483647\"\n\taddDumpTest(v5, \"(\"+v5t+\") \"+v5s+\"\\n\")\n\taddDumpTest(pv5, \"(*\"+v5t+\")(\"+v5Addr+\")(\"+v5s+\")\\n\")\n\taddDumpTest(&pv5, \"(**\"+v5t+\")(\"+pv5Addr+\"->\"+v5Addr+\")(\"+v5s+\")\\n\")\n\taddDumpTest(nv5, \"(*\"+v5t+\")(<nil>)\\n\")\n}\n\nfunc addUintDumpTests() {\n\t// Max uint8.\n\tv := uint8(255)\n\tnv := (*uint8)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"uint8\"\n\tvs := \"255\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n\n\t// Max uint16.\n\tv2 := uint16(65535)\n\tnv2 := (*uint16)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"uint16\"\n\tv2s := \"65535\"\n\taddDumpTest(v2, \"(\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*\"+v2t+\")(\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(&pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(nv2, \"(*\"+v2t+\")(<nil>)\\n\")\n\n\t// Max uint32.\n\tv3 := uint32(4294967295)\n\tnv3 := (*uint32)(nil)\n\tpv3 := &v3\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"uint32\"\n\tv3s := \"4294967295\"\n\taddDumpTest(v3, \"(\"+v3t+\") \"+v3s+\"\\n\")\n\taddDumpTest(pv3, \"(*\"+v3t+\")(\"+v3Addr+\")(\"+v3s+\")\\n\")\n\taddDumpTest(&pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")(\"+v3s+\")\\n\")\n\taddDumpTest(nv3, \"(*\"+v3t+\")(<nil>)\\n\")\n\n\t// Max uint64.\n\tv4 := uint64(18446744073709551615)\n\tnv4 := (*uint64)(nil)\n\tpv4 := &v4\n\tv4Addr := fmt.Sprintf(\"%p\", pv4)\n\tpv4Addr := fmt.Sprintf(\"%p\", &pv4)\n\tv4t := \"uint64\"\n\tv4s := \"18446744073709551615\"\n\taddDumpTest(v4, \"(\"+v4t+\") \"+v4s+\"\\n\")\n\taddDumpTest(pv4, \"(*\"+v4t+\")(\"+v4Addr+\")(\"+v4s+\")\\n\")\n\taddDumpTest(&pv4, \"(**\"+v4t+\")(\"+pv4Addr+\"->\"+v4Addr+\")(\"+v4s+\")\\n\")\n\taddDumpTest(nv4, \"(*\"+v4t+\")(<nil>)\\n\")\n\n\t// Max uint.\n\tv5 := uint(4294967295)\n\tnv5 := (*uint)(nil)\n\tpv5 := &v5\n\tv5Addr := fmt.Sprintf(\"%p\", pv5)\n\tpv5Addr := fmt.Sprintf(\"%p\", &pv5)\n\tv5t := \"uint\"\n\tv5s := \"4294967295\"\n\taddDumpTest(v5, \"(\"+v5t+\") \"+v5s+\"\\n\")\n\taddDumpTest(pv5, \"(*\"+v5t+\")(\"+v5Addr+\")(\"+v5s+\")\\n\")\n\taddDumpTest(&pv5, \"(**\"+v5t+\")(\"+pv5Addr+\"->\"+v5Addr+\")(\"+v5s+\")\\n\")\n\taddDumpTest(nv5, \"(*\"+v5t+\")(<nil>)\\n\")\n}\n\nfunc addBoolDumpTests() {\n\t// Boolean true.\n\tv := bool(true)\n\tnv := (*bool)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"bool\"\n\tvs := \"true\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n\n\t// Boolean false.\n\tv2 := bool(false)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"bool\"\n\tv2s := \"false\"\n\taddDumpTest(v2, \"(\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*\"+v2t+\")(\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(&pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2s+\")\\n\")\n}\n\nfunc addFloatDumpTests() {\n\t// Standard float32.\n\tv := float32(3.1415)\n\tnv := (*float32)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"float32\"\n\tvs := \"3.1415\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n\n\t// Standard float64.\n\tv2 := float64(3.1415926)\n\tnv2 := (*float64)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"float64\"\n\tv2s := \"3.1415926\"\n\taddDumpTest(v2, \"(\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*\"+v2t+\")(\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(&pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(nv2, \"(*\"+v2t+\")(<nil>)\\n\")\n}\n\nfunc addComplexDumpTests() {\n\t// Standard complex64.\n\tv := complex(float32(6), -2)\n\tnv := (*complex64)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"complex64\"\n\tvs := \"(6-2i)\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n\n\t// Standard complex128.\n\tv2 := complex(float64(-6), 2)\n\tnv2 := (*complex128)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"complex128\"\n\tv2s := \"(-6+2i)\"\n\taddDumpTest(v2, \"(\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*\"+v2t+\")(\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(&pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(nv2, \"(*\"+v2t+\")(<nil>)\\n\")\n}\n\nfunc addArrayDumpTests() {\n\t// Array containing standard ints.\n\tv := [3]int{1, 2, 3}\n\tvLen := fmt.Sprintf(\"%d\", len(v))\n\tvCap := fmt.Sprintf(\"%d\", cap(v))\n\tnv := (*[3]int)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"int\"\n\tvs := \"(len=\" + vLen + \" cap=\" + vCap + \") {\\n (\" + vt + \") 1,\\n (\" +\n\t\tvt + \") 2,\\n (\" + vt + \") 3\\n}\"\n\taddDumpTest(v, \"([3]\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*[3]\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**[3]\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*[3]\"+vt+\")(<nil>)\\n\")\n\n\t// Array containing type with custom formatter on pointer receiver only.\n\tv2i0 := pstringer(\"1\")\n\tv2i1 := pstringer(\"2\")\n\tv2i2 := pstringer(\"3\")\n\tv2 := [3]pstringer{v2i0, v2i1, v2i2}\n\tv2i0Len := fmt.Sprintf(\"%d\", len(v2i0))\n\tv2i1Len := fmt.Sprintf(\"%d\", len(v2i1))\n\tv2i2Len := fmt.Sprintf(\"%d\", len(v2i2))\n\tv2Len := fmt.Sprintf(\"%d\", len(v2))\n\tv2Cap := fmt.Sprintf(\"%d\", cap(v2))\n\tnv2 := (*[3]pstringer)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"spew_test.pstringer\"\n\tv2sp := \"(len=\" + v2Len + \" cap=\" + v2Cap + \") {\\n (\" + v2t +\n\t\t\") (len=\" + v2i0Len + \") stringer 1,\\n (\" + v2t +\n\t\t\") (len=\" + v2i1Len + \") stringer 2,\\n (\" + v2t +\n\t\t\") (len=\" + v2i2Len + \") \" + \"stringer 3\\n}\"\n\tv2s := v2sp\n\tif spew.UnsafeDisabled {\n\t\tv2s = \"(len=\" + v2Len + \" cap=\" + v2Cap + \") {\\n (\" + v2t +\n\t\t\t\") (len=\" + v2i0Len + \") \\\"1\\\",\\n (\" + v2t + \") (len=\" +\n\t\t\tv2i1Len + \") \\\"2\\\",\\n (\" + v2t + \") (len=\" + v2i2Len +\n\t\t\t\") \" + \"\\\"3\\\"\\n}\"\n\t}\n\taddDumpTest(v2, \"([3]\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*[3]\"+v2t+\")(\"+v2Addr+\")(\"+v2sp+\")\\n\")\n\taddDumpTest(&pv2, \"(**[3]\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2sp+\")\\n\")\n\taddDumpTest(nv2, \"(*[3]\"+v2t+\")(<nil>)\\n\")\n\n\t// Array containing interfaces.\n\tv3i0 := \"one\"\n\tv3 := [3]interface{}{v3i0, int(2), uint(3)}\n\tv3i0Len := fmt.Sprintf(\"%d\", len(v3i0))\n\tv3Len := fmt.Sprintf(\"%d\", len(v3))\n\tv3Cap := fmt.Sprintf(\"%d\", cap(v3))\n\tnv3 := (*[3]interface{})(nil)\n\tpv3 := &v3\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"[3]interface {}\"\n\tv3t2 := \"string\"\n\tv3t3 := \"int\"\n\tv3t4 := \"uint\"\n\tv3s := \"(len=\" + v3Len + \" cap=\" + v3Cap + \") {\\n (\" + v3t2 + \") \" +\n\t\t\"(len=\" + v3i0Len + \") \\\"one\\\",\\n (\" + v3t3 + \") 2,\\n (\" +\n\t\tv3t4 + \") 3\\n}\"\n\taddDumpTest(v3, \"(\"+v3t+\") \"+v3s+\"\\n\")\n\taddDumpTest(pv3, \"(*\"+v3t+\")(\"+v3Addr+\")(\"+v3s+\")\\n\")\n\taddDumpTest(&pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")(\"+v3s+\")\\n\")\n\taddDumpTest(nv3, \"(*\"+v3t+\")(<nil>)\\n\")\n\n\t// Array containing bytes.\n\tv4 := [34]byte{\n\t\t0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,\n\t\t0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,\n\t\t0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,\n\t\t0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,\n\t\t0x31, 0x32,\n\t}\n\tv4Len := fmt.Sprintf(\"%d\", len(v4))\n\tv4Cap := fmt.Sprintf(\"%d\", cap(v4))\n\tnv4 := (*[34]byte)(nil)\n\tpv4 := &v4\n\tv4Addr := fmt.Sprintf(\"%p\", pv4)\n\tpv4Addr := fmt.Sprintf(\"%p\", &pv4)\n\tv4t := \"[34]uint8\"\n\tv4s := \"(len=\" + v4Len + \" cap=\" + v4Cap + \") \" +\n\t\t\"{\\n 00000000  11 12 13 14 15 16 17 18  19 1a 1b 1c 1d 1e 1f 20\" +\n\t\t\"  |............... |\\n\" +\n\t\t\" 00000010  21 22 23 24 25 26 27 28  29 2a 2b 2c 2d 2e 2f 30\" +\n\t\t\"  |!\\\"#$%&'()*+,-./0|\\n\" +\n\t\t\" 00000020  31 32                                           \" +\n\t\t\"  |12|\\n}\"\n\taddDumpTest(v4, \"(\"+v4t+\") \"+v4s+\"\\n\")\n\taddDumpTest(pv4, \"(*\"+v4t+\")(\"+v4Addr+\")(\"+v4s+\")\\n\")\n\taddDumpTest(&pv4, \"(**\"+v4t+\")(\"+pv4Addr+\"->\"+v4Addr+\")(\"+v4s+\")\\n\")\n\taddDumpTest(nv4, \"(*\"+v4t+\")(<nil>)\\n\")\n}\n\nfunc addSliceDumpTests() {\n\t// Slice containing standard float32 values.\n\tv := []float32{3.14, 6.28, 12.56}\n\tvLen := fmt.Sprintf(\"%d\", len(v))\n\tvCap := fmt.Sprintf(\"%d\", cap(v))\n\tnv := (*[]float32)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"float32\"\n\tvs := \"(len=\" + vLen + \" cap=\" + vCap + \") {\\n (\" + vt + \") 3.14,\\n (\" +\n\t\tvt + \") 6.28,\\n (\" + vt + \") 12.56\\n}\"\n\taddDumpTest(v, \"([]\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*[]\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**[]\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*[]\"+vt+\")(<nil>)\\n\")\n\n\t// Slice containing type with custom formatter on pointer receiver only.\n\tv2i0 := pstringer(\"1\")\n\tv2i1 := pstringer(\"2\")\n\tv2i2 := pstringer(\"3\")\n\tv2 := []pstringer{v2i0, v2i1, v2i2}\n\tv2i0Len := fmt.Sprintf(\"%d\", len(v2i0))\n\tv2i1Len := fmt.Sprintf(\"%d\", len(v2i1))\n\tv2i2Len := fmt.Sprintf(\"%d\", len(v2i2))\n\tv2Len := fmt.Sprintf(\"%d\", len(v2))\n\tv2Cap := fmt.Sprintf(\"%d\", cap(v2))\n\tnv2 := (*[]pstringer)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"spew_test.pstringer\"\n\tv2s := \"(len=\" + v2Len + \" cap=\" + v2Cap + \") {\\n (\" + v2t + \") (len=\" +\n\t\tv2i0Len + \") stringer 1,\\n (\" + v2t + \") (len=\" + v2i1Len +\n\t\t\") stringer 2,\\n (\" + v2t + \") (len=\" + v2i2Len + \") \" +\n\t\t\"stringer 3\\n}\"\n\taddDumpTest(v2, \"([]\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*[]\"+v2t+\")(\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(&pv2, \"(**[]\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(nv2, \"(*[]\"+v2t+\")(<nil>)\\n\")\n\n\t// Slice containing interfaces.\n\tv3i0 := \"one\"\n\tv3 := []interface{}{v3i0, int(2), uint(3), nil}\n\tv3i0Len := fmt.Sprintf(\"%d\", len(v3i0))\n\tv3Len := fmt.Sprintf(\"%d\", len(v3))\n\tv3Cap := fmt.Sprintf(\"%d\", cap(v3))\n\tnv3 := (*[]interface{})(nil)\n\tpv3 := &v3\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"[]interface {}\"\n\tv3t2 := \"string\"\n\tv3t3 := \"int\"\n\tv3t4 := \"uint\"\n\tv3t5 := \"interface {}\"\n\tv3s := \"(len=\" + v3Len + \" cap=\" + v3Cap + \") {\\n (\" + v3t2 + \") \" +\n\t\t\"(len=\" + v3i0Len + \") \\\"one\\\",\\n (\" + v3t3 + \") 2,\\n (\" +\n\t\tv3t4 + \") 3,\\n (\" + v3t5 + \") <nil>\\n}\"\n\taddDumpTest(v3, \"(\"+v3t+\") \"+v3s+\"\\n\")\n\taddDumpTest(pv3, \"(*\"+v3t+\")(\"+v3Addr+\")(\"+v3s+\")\\n\")\n\taddDumpTest(&pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")(\"+v3s+\")\\n\")\n\taddDumpTest(nv3, \"(*\"+v3t+\")(<nil>)\\n\")\n\n\t// Slice containing bytes.\n\tv4 := []byte{\n\t\t0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,\n\t\t0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,\n\t\t0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,\n\t\t0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,\n\t\t0x31, 0x32,\n\t}\n\tv4Len := fmt.Sprintf(\"%d\", len(v4))\n\tv4Cap := fmt.Sprintf(\"%d\", cap(v4))\n\tnv4 := (*[]byte)(nil)\n\tpv4 := &v4\n\tv4Addr := fmt.Sprintf(\"%p\", pv4)\n\tpv4Addr := fmt.Sprintf(\"%p\", &pv4)\n\tv4t := \"[]uint8\"\n\tv4s := \"(len=\" + v4Len + \" cap=\" + v4Cap + \") \" +\n\t\t\"{\\n 00000000  11 12 13 14 15 16 17 18  19 1a 1b 1c 1d 1e 1f 20\" +\n\t\t\"  |............... |\\n\" +\n\t\t\" 00000010  21 22 23 24 25 26 27 28  29 2a 2b 2c 2d 2e 2f 30\" +\n\t\t\"  |!\\\"#$%&'()*+,-./0|\\n\" +\n\t\t\" 00000020  31 32                                           \" +\n\t\t\"  |12|\\n}\"\n\taddDumpTest(v4, \"(\"+v4t+\") \"+v4s+\"\\n\")\n\taddDumpTest(pv4, \"(*\"+v4t+\")(\"+v4Addr+\")(\"+v4s+\")\\n\")\n\taddDumpTest(&pv4, \"(**\"+v4t+\")(\"+pv4Addr+\"->\"+v4Addr+\")(\"+v4s+\")\\n\")\n\taddDumpTest(nv4, \"(*\"+v4t+\")(<nil>)\\n\")\n\n\t// Nil slice.\n\tv5 := []int(nil)\n\tnv5 := (*[]int)(nil)\n\tpv5 := &v5\n\tv5Addr := fmt.Sprintf(\"%p\", pv5)\n\tpv5Addr := fmt.Sprintf(\"%p\", &pv5)\n\tv5t := \"[]int\"\n\tv5s := \"<nil>\"\n\taddDumpTest(v5, \"(\"+v5t+\") \"+v5s+\"\\n\")\n\taddDumpTest(pv5, \"(*\"+v5t+\")(\"+v5Addr+\")(\"+v5s+\")\\n\")\n\taddDumpTest(&pv5, \"(**\"+v5t+\")(\"+pv5Addr+\"->\"+v5Addr+\")(\"+v5s+\")\\n\")\n\taddDumpTest(nv5, \"(*\"+v5t+\")(<nil>)\\n\")\n}\n\nfunc addStringDumpTests() {\n\t// Standard string.\n\tv := \"test\"\n\tvLen := fmt.Sprintf(\"%d\", len(v))\n\tnv := (*string)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"string\"\n\tvs := \"(len=\" + vLen + \") \\\"test\\\"\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n}\n\nfunc addInterfaceDumpTests() {\n\t// Nil interface.\n\tvar v interface{}\n\tnv := (*interface{})(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"interface {}\"\n\tvs := \"<nil>\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n\n\t// Sub-interface.\n\tv2 := interface{}(uint16(65535))\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"uint16\"\n\tv2s := \"65535\"\n\taddDumpTest(v2, \"(\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*\"+v2t+\")(\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(&pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2s+\")\\n\")\n}\n\nfunc addMapDumpTests() {\n\t// Map with string keys and int vals.\n\tk := \"one\"\n\tkk := \"two\"\n\tm := map[string]int{k: 1, kk: 2}\n\tklen := fmt.Sprintf(\"%d\", len(k)) // not kLen to shut golint up\n\tkkLen := fmt.Sprintf(\"%d\", len(kk))\n\tmLen := fmt.Sprintf(\"%d\", len(m))\n\tnilMap := map[string]int(nil)\n\tnm := (*map[string]int)(nil)\n\tpm := &m\n\tmAddr := fmt.Sprintf(\"%p\", pm)\n\tpmAddr := fmt.Sprintf(\"%p\", &pm)\n\tmt := \"map[string]int\"\n\tmt1 := \"string\"\n\tmt2 := \"int\"\n\tms := \"(len=\" + mLen + \") {\\n (\" + mt1 + \") (len=\" + klen + \") \" +\n\t\t\"\\\"one\\\": (\" + mt2 + \") 1,\\n (\" + mt1 + \") (len=\" + kkLen +\n\t\t\") \\\"two\\\": (\" + mt2 + \") 2\\n}\"\n\tms2 := \"(len=\" + mLen + \") {\\n (\" + mt1 + \") (len=\" + kkLen + \") \" +\n\t\t\"\\\"two\\\": (\" + mt2 + \") 2,\\n (\" + mt1 + \") (len=\" + klen +\n\t\t\") \\\"one\\\": (\" + mt2 + \") 1\\n}\"\n\taddDumpTest(m, \"(\"+mt+\") \"+ms+\"\\n\", \"(\"+mt+\") \"+ms2+\"\\n\")\n\taddDumpTest(pm, \"(*\"+mt+\")(\"+mAddr+\")(\"+ms+\")\\n\",\n\t\t\"(*\"+mt+\")(\"+mAddr+\")(\"+ms2+\")\\n\")\n\taddDumpTest(&pm, \"(**\"+mt+\")(\"+pmAddr+\"->\"+mAddr+\")(\"+ms+\")\\n\",\n\t\t\"(**\"+mt+\")(\"+pmAddr+\"->\"+mAddr+\")(\"+ms2+\")\\n\")\n\taddDumpTest(nm, \"(*\"+mt+\")(<nil>)\\n\")\n\taddDumpTest(nilMap, \"(\"+mt+\") <nil>\\n\")\n\n\t// Map with custom formatter type on pointer receiver only keys and vals.\n\tk2 := pstringer(\"one\")\n\tv2 := pstringer(\"1\")\n\tm2 := map[pstringer]pstringer{k2: v2}\n\tk2Len := fmt.Sprintf(\"%d\", len(k2))\n\tv2Len := fmt.Sprintf(\"%d\", len(v2))\n\tm2Len := fmt.Sprintf(\"%d\", len(m2))\n\tnilMap2 := map[pstringer]pstringer(nil)\n\tnm2 := (*map[pstringer]pstringer)(nil)\n\tpm2 := &m2\n\tm2Addr := fmt.Sprintf(\"%p\", pm2)\n\tpm2Addr := fmt.Sprintf(\"%p\", &pm2)\n\tm2t := \"map[spew_test.pstringer]spew_test.pstringer\"\n\tm2t1 := \"spew_test.pstringer\"\n\tm2t2 := \"spew_test.pstringer\"\n\tm2s := \"(len=\" + m2Len + \") {\\n (\" + m2t1 + \") (len=\" + k2Len + \") \" +\n\t\t\"stringer one: (\" + m2t2 + \") (len=\" + v2Len + \") stringer 1\\n}\"\n\tif spew.UnsafeDisabled {\n\t\tm2s = \"(len=\" + m2Len + \") {\\n (\" + m2t1 + \") (len=\" + k2Len +\n\t\t\t\") \" + \"\\\"one\\\": (\" + m2t2 + \") (len=\" + v2Len +\n\t\t\t\") \\\"1\\\"\\n}\"\n\t}\n\taddDumpTest(m2, \"(\"+m2t+\") \"+m2s+\"\\n\")\n\taddDumpTest(pm2, \"(*\"+m2t+\")(\"+m2Addr+\")(\"+m2s+\")\\n\")\n\taddDumpTest(&pm2, \"(**\"+m2t+\")(\"+pm2Addr+\"->\"+m2Addr+\")(\"+m2s+\")\\n\")\n\taddDumpTest(nm2, \"(*\"+m2t+\")(<nil>)\\n\")\n\taddDumpTest(nilMap2, \"(\"+m2t+\") <nil>\\n\")\n\n\t// Map with interface keys and values.\n\tk3 := \"one\"\n\tk3Len := fmt.Sprintf(\"%d\", len(k3))\n\tm3 := map[interface{}]interface{}{k3: 1}\n\tm3Len := fmt.Sprintf(\"%d\", len(m3))\n\tnilMap3 := map[interface{}]interface{}(nil)\n\tnm3 := (*map[interface{}]interface{})(nil)\n\tpm3 := &m3\n\tm3Addr := fmt.Sprintf(\"%p\", pm3)\n\tpm3Addr := fmt.Sprintf(\"%p\", &pm3)\n\tm3t := \"map[interface {}]interface {}\"\n\tm3t1 := \"string\"\n\tm3t2 := \"int\"\n\tm3s := \"(len=\" + m3Len + \") {\\n (\" + m3t1 + \") (len=\" + k3Len + \") \" +\n\t\t\"\\\"one\\\": (\" + m3t2 + \") 1\\n}\"\n\taddDumpTest(m3, \"(\"+m3t+\") \"+m3s+\"\\n\")\n\taddDumpTest(pm3, \"(*\"+m3t+\")(\"+m3Addr+\")(\"+m3s+\")\\n\")\n\taddDumpTest(&pm3, \"(**\"+m3t+\")(\"+pm3Addr+\"->\"+m3Addr+\")(\"+m3s+\")\\n\")\n\taddDumpTest(nm3, \"(*\"+m3t+\")(<nil>)\\n\")\n\taddDumpTest(nilMap3, \"(\"+m3t+\") <nil>\\n\")\n\n\t// Map with nil interface value.\n\tk4 := \"nil\"\n\tk4Len := fmt.Sprintf(\"%d\", len(k4))\n\tm4 := map[string]interface{}{k4: nil}\n\tm4Len := fmt.Sprintf(\"%d\", len(m4))\n\tnilMap4 := map[string]interface{}(nil)\n\tnm4 := (*map[string]interface{})(nil)\n\tpm4 := &m4\n\tm4Addr := fmt.Sprintf(\"%p\", pm4)\n\tpm4Addr := fmt.Sprintf(\"%p\", &pm4)\n\tm4t := \"map[string]interface {}\"\n\tm4t1 := \"string\"\n\tm4t2 := \"interface {}\"\n\tm4s := \"(len=\" + m4Len + \") {\\n (\" + m4t1 + \") (len=\" + k4Len + \")\" +\n\t\t\" \\\"nil\\\": (\" + m4t2 + \") <nil>\\n}\"\n\taddDumpTest(m4, \"(\"+m4t+\") \"+m4s+\"\\n\")\n\taddDumpTest(pm4, \"(*\"+m4t+\")(\"+m4Addr+\")(\"+m4s+\")\\n\")\n\taddDumpTest(&pm4, \"(**\"+m4t+\")(\"+pm4Addr+\"->\"+m4Addr+\")(\"+m4s+\")\\n\")\n\taddDumpTest(nm4, \"(*\"+m4t+\")(<nil>)\\n\")\n\taddDumpTest(nilMap4, \"(\"+m4t+\") <nil>\\n\")\n}\n\nfunc addStructDumpTests() {\n\t// Struct with primitives.\n\ttype s1 struct {\n\t\ta int8\n\t\tb uint8\n\t}\n\tv := s1{127, 255}\n\tnv := (*s1)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"spew_test.s1\"\n\tvt2 := \"int8\"\n\tvt3 := \"uint8\"\n\tvs := \"{\\n a: (\" + vt2 + \") 127,\\n b: (\" + vt3 + \") 255\\n}\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n\n\t// Struct that contains another struct.\n\ttype s2 struct {\n\t\ts1 s1\n\t\tb  bool\n\t}\n\tv2 := s2{s1{127, 255}, true}\n\tnv2 := (*s2)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"spew_test.s2\"\n\tv2t2 := \"spew_test.s1\"\n\tv2t3 := \"int8\"\n\tv2t4 := \"uint8\"\n\tv2t5 := \"bool\"\n\tv2s := \"{\\n s1: (\" + v2t2 + \") {\\n  a: (\" + v2t3 + \") 127,\\n  b: (\" +\n\t\tv2t4 + \") 255\\n },\\n b: (\" + v2t5 + \") true\\n}\"\n\taddDumpTest(v2, \"(\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*\"+v2t+\")(\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(&pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(nv2, \"(*\"+v2t+\")(<nil>)\\n\")\n\n\t// Struct that contains custom type with Stringer pointer interface via both\n\t// exported and unexported fields.\n\ttype s3 struct {\n\t\ts pstringer\n\t\tS pstringer\n\t}\n\tv3 := s3{\"test\", \"test2\"}\n\tnv3 := (*s3)(nil)\n\tpv3 := &v3\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"spew_test.s3\"\n\tv3t2 := \"spew_test.pstringer\"\n\tv3s := \"{\\n s: (\" + v3t2 + \") (len=4) stringer test,\\n S: (\" + v3t2 +\n\t\t\") (len=5) stringer test2\\n}\"\n\tv3sp := v3s\n\tif spew.UnsafeDisabled {\n\t\tv3s = \"{\\n s: (\" + v3t2 + \") (len=4) \\\"test\\\",\\n S: (\" +\n\t\t\tv3t2 + \") (len=5) \\\"test2\\\"\\n}\"\n\t\tv3sp = \"{\\n s: (\" + v3t2 + \") (len=4) \\\"test\\\",\\n S: (\" +\n\t\t\tv3t2 + \") (len=5) stringer test2\\n}\"\n\t}\n\taddDumpTest(v3, \"(\"+v3t+\") \"+v3s+\"\\n\")\n\taddDumpTest(pv3, \"(*\"+v3t+\")(\"+v3Addr+\")(\"+v3sp+\")\\n\")\n\taddDumpTest(&pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")(\"+v3sp+\")\\n\")\n\taddDumpTest(nv3, \"(*\"+v3t+\")(<nil>)\\n\")\n\n\t// Struct that contains embedded struct and field to same struct.\n\te := embed{\"embedstr\"}\n\teLen := fmt.Sprintf(\"%d\", len(\"embedstr\"))\n\tv4 := embedwrap{embed: &e, e: &e}\n\tnv4 := (*embedwrap)(nil)\n\tpv4 := &v4\n\teAddr := fmt.Sprintf(\"%p\", &e)\n\tv4Addr := fmt.Sprintf(\"%p\", pv4)\n\tpv4Addr := fmt.Sprintf(\"%p\", &pv4)\n\tv4t := \"spew_test.embedwrap\"\n\tv4t2 := \"spew_test.embed\"\n\tv4t3 := \"string\"\n\tv4s := \"{\\n embed: (*\" + v4t2 + \")(\" + eAddr + \")({\\n  a: (\" + v4t3 +\n\t\t\") (len=\" + eLen + \") \\\"embedstr\\\"\\n }),\\n e: (*\" + v4t2 +\n\t\t\")(\" + eAddr + \")({\\n  a: (\" + v4t3 + \") (len=\" + eLen + \")\" +\n\t\t\" \\\"embedstr\\\"\\n })\\n}\"\n\taddDumpTest(v4, \"(\"+v4t+\") \"+v4s+\"\\n\")\n\taddDumpTest(pv4, \"(*\"+v4t+\")(\"+v4Addr+\")(\"+v4s+\")\\n\")\n\taddDumpTest(&pv4, \"(**\"+v4t+\")(\"+pv4Addr+\"->\"+v4Addr+\")(\"+v4s+\")\\n\")\n\taddDumpTest(nv4, \"(*\"+v4t+\")(<nil>)\\n\")\n}\n\nfunc addUintptrDumpTests() {\n\t// Null pointer.\n\tv := uintptr(0)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"uintptr\"\n\tvs := \"<nil>\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\n\t// Address of real variable.\n\ti := 1\n\tv2 := uintptr(unsafe.Pointer(&i))\n\tnv2 := (*uintptr)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"uintptr\"\n\tv2s := fmt.Sprintf(\"%p\", &i)\n\taddDumpTest(v2, \"(\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*\"+v2t+\")(\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(&pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(nv2, \"(*\"+v2t+\")(<nil>)\\n\")\n}\n\nfunc addUnsafePointerDumpTests() {\n\t// Null pointer.\n\tv := unsafe.Pointer(nil)\n\tnv := (*unsafe.Pointer)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"unsafe.Pointer\"\n\tvs := \"<nil>\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n\n\t// Address of real variable.\n\ti := 1\n\tv2 := unsafe.Pointer(&i)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"unsafe.Pointer\"\n\tv2s := fmt.Sprintf(\"%p\", &i)\n\taddDumpTest(v2, \"(\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*\"+v2t+\")(\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(&pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n}\n\nfunc addChanDumpTests() {\n\t// Nil channel.\n\tvar v chan int\n\tpv := &v\n\tnv := (*chan int)(nil)\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"chan int\"\n\tvs := \"<nil>\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n\n\t// Real channel.\n\tv2 := make(chan int)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"chan int\"\n\tv2s := fmt.Sprintf(\"%p\", v2)\n\taddDumpTest(v2, \"(\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*\"+v2t+\")(\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(&pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2s+\")\\n\")\n}\n\nfunc addFuncDumpTests() {\n\t// Function with no params and no returns.\n\tv := addIntDumpTests\n\tnv := (*func())(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"func()\"\n\tvs := fmt.Sprintf(\"%p\", v)\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n\n\t// Function with param and no returns.\n\tv2 := TestDump\n\tnv2 := (*func(*testing.T))(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"func(*testing.T)\"\n\tv2s := fmt.Sprintf(\"%p\", v2)\n\taddDumpTest(v2, \"(\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*\"+v2t+\")(\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(&pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2s+\")\\n\")\n\taddDumpTest(nv2, \"(*\"+v2t+\")(<nil>)\\n\")\n\n\t// Function with multiple params and multiple returns.\n\tvar v3 = func(i int, s string) (b bool, err error) {\n\t\treturn true, nil\n\t}\n\tnv3 := (*func(int, string) (bool, error))(nil)\n\tpv3 := &v3\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"func(int, string) (bool, error)\"\n\tv3s := fmt.Sprintf(\"%p\", v3)\n\taddDumpTest(v3, \"(\"+v3t+\") \"+v3s+\"\\n\")\n\taddDumpTest(pv3, \"(*\"+v3t+\")(\"+v3Addr+\")(\"+v3s+\")\\n\")\n\taddDumpTest(&pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")(\"+v3s+\")\\n\")\n\taddDumpTest(nv3, \"(*\"+v3t+\")(<nil>)\\n\")\n}\n\nfunc addCircularDumpTests() {\n\t// Struct that is circular through self referencing.\n\ttype circular struct {\n\t\tc *circular\n\t}\n\tv := circular{nil}\n\tv.c = &v\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"spew_test.circular\"\n\tvs := \"{\\n c: (*\" + vt + \")(\" + vAddr + \")({\\n  c: (*\" + vt + \")(\" +\n\t\tvAddr + \")(<already shown>)\\n })\\n}\"\n\tvs2 := \"{\\n c: (*\" + vt + \")(\" + vAddr + \")(<already shown>)\\n}\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs2+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs2+\")\\n\")\n\n\t// Structs that are circular through cross referencing.\n\tv2 := xref1{nil}\n\tts2 := xref2{&v2}\n\tv2.ps2 = &ts2\n\tpv2 := &v2\n\tts2Addr := fmt.Sprintf(\"%p\", &ts2)\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"spew_test.xref1\"\n\tv2t2 := \"spew_test.xref2\"\n\tv2s := \"{\\n ps2: (*\" + v2t2 + \")(\" + ts2Addr + \")({\\n  ps1: (*\" + v2t +\n\t\t\")(\" + v2Addr + \")({\\n   ps2: (*\" + v2t2 + \")(\" + ts2Addr +\n\t\t\")(<already shown>)\\n  })\\n })\\n}\"\n\tv2s2 := \"{\\n ps2: (*\" + v2t2 + \")(\" + ts2Addr + \")({\\n  ps1: (*\" + v2t +\n\t\t\")(\" + v2Addr + \")(<already shown>)\\n })\\n}\"\n\taddDumpTest(v2, \"(\"+v2t+\") \"+v2s+\"\\n\")\n\taddDumpTest(pv2, \"(*\"+v2t+\")(\"+v2Addr+\")(\"+v2s2+\")\\n\")\n\taddDumpTest(&pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")(\"+v2s2+\")\\n\")\n\n\t// Structs that are indirectly circular.\n\tv3 := indirCir1{nil}\n\ttic2 := indirCir2{nil}\n\ttic3 := indirCir3{&v3}\n\ttic2.ps3 = &tic3\n\tv3.ps2 = &tic2\n\tpv3 := &v3\n\ttic2Addr := fmt.Sprintf(\"%p\", &tic2)\n\ttic3Addr := fmt.Sprintf(\"%p\", &tic3)\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"spew_test.indirCir1\"\n\tv3t2 := \"spew_test.indirCir2\"\n\tv3t3 := \"spew_test.indirCir3\"\n\tv3s := \"{\\n ps2: (*\" + v3t2 + \")(\" + tic2Addr + \")({\\n  ps3: (*\" + v3t3 +\n\t\t\")(\" + tic3Addr + \")({\\n   ps1: (*\" + v3t + \")(\" + v3Addr +\n\t\t\")({\\n    ps2: (*\" + v3t2 + \")(\" + tic2Addr +\n\t\t\")(<already shown>)\\n   })\\n  })\\n })\\n}\"\n\tv3s2 := \"{\\n ps2: (*\" + v3t2 + \")(\" + tic2Addr + \")({\\n  ps3: (*\" + v3t3 +\n\t\t\")(\" + tic3Addr + \")({\\n   ps1: (*\" + v3t + \")(\" + v3Addr +\n\t\t\")(<already shown>)\\n  })\\n })\\n}\"\n\taddDumpTest(v3, \"(\"+v3t+\") \"+v3s+\"\\n\")\n\taddDumpTest(pv3, \"(*\"+v3t+\")(\"+v3Addr+\")(\"+v3s2+\")\\n\")\n\taddDumpTest(&pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")(\"+v3s2+\")\\n\")\n}\n\nfunc addPanicDumpTests() {\n\t// Type that panics in its Stringer interface.\n\tv := panicer(127)\n\tnv := (*panicer)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"spew_test.panicer\"\n\tvs := \"(PANIC=test panic)127\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n}\n\nfunc addErrorDumpTests() {\n\t// Type that has a custom Error interface.\n\tv := customError(127)\n\tnv := (*customError)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"spew_test.customError\"\n\tvs := \"error: 127\"\n\taddDumpTest(v, \"(\"+vt+\") \"+vs+\"\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(*\"+vt+\")(<nil>)\\n\")\n}\n\n// TestDump executes all of the tests described by dumpTests.\nfunc TestDump(t *testing.T) {\n\t// Setup tests.\n\taddIntDumpTests()\n\taddUintDumpTests()\n\taddBoolDumpTests()\n\taddFloatDumpTests()\n\taddComplexDumpTests()\n\taddArrayDumpTests()\n\taddSliceDumpTests()\n\taddStringDumpTests()\n\taddInterfaceDumpTests()\n\taddMapDumpTests()\n\taddStructDumpTests()\n\taddUintptrDumpTests()\n\taddUnsafePointerDumpTests()\n\taddChanDumpTests()\n\taddFuncDumpTests()\n\taddCircularDumpTests()\n\taddPanicDumpTests()\n\taddErrorDumpTests()\n\taddCgoDumpTests()\n\n\tt.Logf(\"Running %d tests\", len(dumpTests))\n\tfor i, test := range dumpTests {\n\t\tbuf := new(bytes.Buffer)\n\t\tspew.Fdump(buf, test.in)\n\t\ts := buf.String()\n\t\tif testFailed(s, test.wants) {\n\t\t\tt.Errorf(\"Dump #%d\\n got: %s %s\", i, s, stringizeWants(test.wants))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc TestDumpSortedKeys(t *testing.T) {\n\tcfg := spew.ConfigState{SortKeys: true}\n\ts := cfg.Sdump(map[int]string{1: \"1\", 3: \"3\", 2: \"2\"})\n\texpected := \"(map[int]string) (len=3) {\\n(int) 1: (string) (len=1) \" +\n\t\t\"\\\"1\\\",\\n(int) 2: (string) (len=1) \\\"2\\\",\\n(int) 3: (string) \" +\n\t\t\"(len=1) \\\"3\\\"\\n\" +\n\t\t\"}\\n\"\n\tif s != expected {\n\t\tt.Errorf(\"Sorted keys mismatch:\\n  %v %v\", s, expected)\n\t}\n\n\ts = cfg.Sdump(map[stringer]int{\"1\": 1, \"3\": 3, \"2\": 2})\n\texpected = \"(map[spew_test.stringer]int) (len=3) {\\n\" +\n\t\t\"(spew_test.stringer) (len=1) stringer 1: (int) 1,\\n\" +\n\t\t\"(spew_test.stringer) (len=1) stringer 2: (int) 2,\\n\" +\n\t\t\"(spew_test.stringer) (len=1) stringer 3: (int) 3\\n\" +\n\t\t\"}\\n\"\n\tif s != expected {\n\t\tt.Errorf(\"Sorted keys mismatch:\\n  %v %v\", s, expected)\n\t}\n\n\ts = cfg.Sdump(map[pstringer]int{pstringer(\"1\"): 1, pstringer(\"3\"): 3, pstringer(\"2\"): 2})\n\texpected = \"(map[spew_test.pstringer]int) (len=3) {\\n\" +\n\t\t\"(spew_test.pstringer) (len=1) stringer 1: (int) 1,\\n\" +\n\t\t\"(spew_test.pstringer) (len=1) stringer 2: (int) 2,\\n\" +\n\t\t\"(spew_test.pstringer) (len=1) stringer 3: (int) 3\\n\" +\n\t\t\"}\\n\"\n\tif spew.UnsafeDisabled {\n\t\texpected = \"(map[spew_test.pstringer]int) (len=3) {\\n\" +\n\t\t\t\"(spew_test.pstringer) (len=1) \\\"1\\\": (int) 1,\\n\" +\n\t\t\t\"(spew_test.pstringer) (len=1) \\\"2\\\": (int) 2,\\n\" +\n\t\t\t\"(spew_test.pstringer) (len=1) \\\"3\\\": (int) 3\\n\" +\n\t\t\t\"}\\n\"\n\t}\n\tif s != expected {\n\t\tt.Errorf(\"Sorted keys mismatch:\\n  %v %v\", s, expected)\n\t}\n\n\ts = cfg.Sdump(map[customError]int{customError(1): 1, customError(3): 3, customError(2): 2})\n\texpected = \"(map[spew_test.customError]int) (len=3) {\\n\" +\n\t\t\"(spew_test.customError) error: 1: (int) 1,\\n\" +\n\t\t\"(spew_test.customError) error: 2: (int) 2,\\n\" +\n\t\t\"(spew_test.customError) error: 3: (int) 3\\n\" +\n\t\t\"}\\n\"\n\tif s != expected {\n\t\tt.Errorf(\"Sorted keys mismatch:\\n  %v %v\", s, expected)\n\t}\n\n}\n"
  },
  {
    "path": "internal/spew/dumpcgo_test.go",
    "content": "// Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n//\n// Permission to use, copy, modify, and distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n// NOTE: Due to the following build constraints, this file will only be compiled\n// when both cgo is supported and \"-tags testcgo\" is added to the go test\n// command line.  This means the cgo tests are only added (and hence run) when\n// specifically requested.  This configuration is used because spew itself\n// does not require cgo to run even though it does handle certain cgo types\n// specially.  Rather than forcing all clients to require cgo and an external\n// C compiler just to run the tests, this scheme makes them optional.\n//go:build cgo && testcgo\n// +build cgo,testcgo\n\npackage spew_test\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/expr-lang/expr/internal/spew/testdata\"\n)\n\nfunc addCgoDumpTests() {\n\t// C char pointer.\n\tv := testdata.GetCgoCharPointer()\n\tnv := testdata.GetCgoNullCharPointer()\n\tpv := &v\n\tvcAddr := fmt.Sprintf(\"%p\", v)\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"*testdata._Ctype_char\"\n\tvs := \"116\"\n\taddDumpTest(v, \"(\"+vt+\")(\"+vcAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(pv, \"(*\"+vt+\")(\"+vAddr+\"->\"+vcAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(&pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\"->\"+vcAddr+\")(\"+vs+\")\\n\")\n\taddDumpTest(nv, \"(\"+vt+\")(<nil>)\\n\")\n\n\t// C char array.\n\tv2, v2l, v2c := testdata.GetCgoCharArray()\n\tv2Len := fmt.Sprintf(\"%d\", v2l)\n\tv2Cap := fmt.Sprintf(\"%d\", v2c)\n\tv2t := \"[6]testdata._Ctype_char\"\n\tv2s := \"(len=\" + v2Len + \" cap=\" + v2Cap + \") \" +\n\t\t\"{\\n 00000000  74 65 73 74 32 00                               \" +\n\t\t\"  |test2.|\\n}\"\n\taddDumpTest(v2, \"(\"+v2t+\") \"+v2s+\"\\n\")\n\n\t// C unsigned char array.\n\tv3, v3l, v3c := testdata.GetCgoUnsignedCharArray()\n\tv3Len := fmt.Sprintf(\"%d\", v3l)\n\tv3Cap := fmt.Sprintf(\"%d\", v3c)\n\tv3t := \"[6]testdata._Ctype_unsignedchar\"\n\tv3t2 := \"[6]testdata._Ctype_uchar\"\n\tv3s := \"(len=\" + v3Len + \" cap=\" + v3Cap + \") \" +\n\t\t\"{\\n 00000000  74 65 73 74 33 00                               \" +\n\t\t\"  |test3.|\\n}\"\n\taddDumpTest(v3, \"(\"+v3t+\") \"+v3s+\"\\n\", \"(\"+v3t2+\") \"+v3s+\"\\n\")\n\n\t// C signed char array.\n\tv4, v4l, v4c := testdata.GetCgoSignedCharArray()\n\tv4Len := fmt.Sprintf(\"%d\", v4l)\n\tv4Cap := fmt.Sprintf(\"%d\", v4c)\n\tv4t := \"[6]testdata._Ctype_schar\"\n\tv4t2 := \"testdata._Ctype_schar\"\n\tv4s := \"(len=\" + v4Len + \" cap=\" + v4Cap + \") \" +\n\t\t\"{\\n (\" + v4t2 + \") 116,\\n (\" + v4t2 + \") 101,\\n (\" + v4t2 +\n\t\t\") 115,\\n (\" + v4t2 + \") 116,\\n (\" + v4t2 + \") 52,\\n (\" + v4t2 +\n\t\t\") 0\\n}\"\n\taddDumpTest(v4, \"(\"+v4t+\") \"+v4s+\"\\n\")\n\n\t// C uint8_t array.\n\tv5, v5l, v5c := testdata.GetCgoUint8tArray()\n\tv5Len := fmt.Sprintf(\"%d\", v5l)\n\tv5Cap := fmt.Sprintf(\"%d\", v5c)\n\tv5t := \"[6]testdata._Ctype_uint8_t\"\n\tv5t2 := \"[6]testdata._Ctype_uchar\"\n\tv5s := \"(len=\" + v5Len + \" cap=\" + v5Cap + \") \" +\n\t\t\"{\\n 00000000  74 65 73 74 35 00                               \" +\n\t\t\"  |test5.|\\n}\"\n\taddDumpTest(v5, \"(\"+v5t+\") \"+v5s+\"\\n\", \"(\"+v5t2+\") \"+v5s+\"\\n\")\n\n\t// C typedefed unsigned char array.\n\tv6, v6l, v6c := testdata.GetCgoTypedefedUnsignedCharArray()\n\tv6Len := fmt.Sprintf(\"%d\", v6l)\n\tv6Cap := fmt.Sprintf(\"%d\", v6c)\n\tv6t := \"[6]testdata._Ctype_custom_uchar_t\"\n\tv6t2 := \"[6]testdata._Ctype_uchar\"\n\tv6s := \"(len=\" + v6Len + \" cap=\" + v6Cap + \") \" +\n\t\t\"{\\n 00000000  74 65 73 74 36 00                               \" +\n\t\t\"  |test6.|\\n}\"\n\taddDumpTest(v6, \"(\"+v6t+\") \"+v6s+\"\\n\", \"(\"+v6t2+\") \"+v6s+\"\\n\")\n}\n"
  },
  {
    "path": "internal/spew/dumpnocgo_test.go",
    "content": "// Copyright (c) 2013 Dave Collins <dave@davec.name>\n//\n// Permission to use, copy, modify, and distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n// NOTE: Due to the following build constraints, this file will only be compiled\n// when either cgo is not supported or \"-tags testcgo\" is not added to the go\n// test command line.  This file intentionally does not setup any cgo tests in\n// this scenario.\n//go:build !cgo || !testcgo\n// +build !cgo !testcgo\n\npackage spew_test\n\nfunc addCgoDumpTests() {\n\t// Don't add any tests for cgo since this file is only compiled when\n\t// there should not be any cgo tests.\n}\n"
  },
  {
    "path": "internal/spew/example_test.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\npackage spew_test\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/expr-lang/expr/internal/spew\"\n)\n\ntype Flag int\n\nconst (\n\tflagOne Flag = iota\n\tflagTwo\n)\n\nvar flagStrings = map[Flag]string{\n\tflagOne: \"flagOne\",\n\tflagTwo: \"flagTwo\",\n}\n\nfunc (f Flag) String() string {\n\tif s, ok := flagStrings[f]; ok {\n\t\treturn s\n\t}\n\treturn fmt.Sprintf(\"Unknown flag (%d)\", int(f))\n}\n\ntype Bar struct {\n\tdata uintptr\n}\n\ntype Foo struct {\n\tunexportedField Bar\n\tExportedField   map[interface{}]interface{}\n}\n\n// This example demonstrates how to use Dump to dump variables to stdout.\nfunc ExampleDump() {\n\t// The following package level declarations are assumed for this example:\n\t/*\n\t\ttype Flag int\n\n\t\tconst (\n\t\t\tflagOne Flag = iota\n\t\t\tflagTwo\n\t\t)\n\n\t\tvar flagStrings = map[Flag]string{\n\t\t\tflagOne: \"flagOne\",\n\t\t\tflagTwo: \"flagTwo\",\n\t\t}\n\n\t\tfunc (f Flag) String() string {\n\t\t\tif s, ok := flagStrings[f]; ok {\n\t\t\t\treturn s\n\t\t\t}\n\t\t\treturn fmt.Sprintf(\"Unknown flag (%d)\", int(f))\n\t\t}\n\n\t\ttype Bar struct {\n\t\t\tdata uintptr\n\t\t}\n\n\t\ttype Foo struct {\n\t\t\tunexportedField Bar\n\t\t\tExportedField   map[interface{}]interface{}\n\t\t}\n\t*/\n\n\t// Setup some sample data structures for the example.\n\tbar := Bar{uintptr(0)}\n\ts1 := Foo{bar, map[interface{}]interface{}{\"one\": true}}\n\tf := Flag(5)\n\tb := []byte{\n\t\t0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,\n\t\t0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,\n\t\t0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,\n\t\t0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,\n\t\t0x31, 0x32,\n\t}\n\n\t// Dump!\n\tspew.Dump(s1, f, b)\n\n\t// Output:\n\t// (spew_test.Foo) {\n\t//  unexportedField: (spew_test.Bar) {\n\t//   data: (uintptr) <nil>\n\t//  },\n\t//  ExportedField: (map[interface {}]interface {}) (len=1) {\n\t//   (string) (len=3) \"one\": (bool) true\n\t//  }\n\t// }\n\t// (spew_test.Flag) Unknown flag (5)\n\t// ([]uint8) (len=34 cap=34) {\n\t//  00000000  11 12 13 14 15 16 17 18  19 1a 1b 1c 1d 1e 1f 20  |............... |\n\t//  00000010  21 22 23 24 25 26 27 28  29 2a 2b 2c 2d 2e 2f 30  |!\"#$%&'()*+,-./0|\n\t//  00000020  31 32                                             |12|\n\t// }\n\t//\n}\n\n// This example demonstrates how to use Printf to display a variable with a\n// format string and inline formatting.\nfunc ExamplePrintf() {\n\t// Create a double pointer to a uint 8.\n\tui8 := uint8(5)\n\tpui8 := &ui8\n\tppui8 := &pui8\n\n\t// Create a circular data type.\n\ttype circular struct {\n\t\tui8 uint8\n\t\tc   *circular\n\t}\n\tc := circular{ui8: 1}\n\tc.c = &c\n\n\t// Print!\n\tspew.Printf(\"ppui8: %v\\n\", ppui8)\n\tspew.Printf(\"circular: %v\\n\", c)\n\n\t// Output:\n\t// ppui8: <**>5\n\t// circular: {1 <*>{1 <*><shown>}}\n}\n\n// This example demonstrates how to use a ConfigState.\nfunc ExampleConfigState() {\n\t// Modify the indent level of the ConfigState only.  The global\n\t// configuration is not modified.\n\tscs := spew.ConfigState{Indent: \"\\t\"}\n\n\t// Output using the ConfigState instance.\n\tv := map[string]int{\"one\": 1}\n\tscs.Printf(\"v: %v\\n\", v)\n\tscs.Dump(v)\n\n\t// Output:\n\t// v: map[one:1]\n\t// (map[string]int) (len=1) {\n\t// \t(string) (len=3) \"one\": (int) 1\n\t// }\n}\n\n// This example demonstrates how to use ConfigState.Dump to dump variables to\n// stdout\nfunc ExampleConfigState_Dump() {\n\t// See the top-level Dump example for details on the types used in this\n\t// example.\n\n\t// Create two ConfigState instances with different indentation.\n\tscs := spew.ConfigState{Indent: \"\\t\"}\n\tscs2 := spew.ConfigState{Indent: \" \"}\n\n\t// Setup some sample data structures for the example.\n\tbar := Bar{uintptr(0)}\n\ts1 := Foo{bar, map[interface{}]interface{}{\"one\": true}}\n\n\t// Dump using the ConfigState instances.\n\tscs.Dump(s1)\n\tscs2.Dump(s1)\n\n\t// Output:\n\t// (spew_test.Foo) {\n\t// \tunexportedField: (spew_test.Bar) {\n\t// \t\tdata: (uintptr) <nil>\n\t// \t},\n\t// \tExportedField: (map[interface {}]interface {}) (len=1) {\n\t//\t\t(string) (len=3) \"one\": (bool) true\n\t// \t}\n\t// }\n\t// (spew_test.Foo) {\n\t//  unexportedField: (spew_test.Bar) {\n\t//   data: (uintptr) <nil>\n\t//  },\n\t//  ExportedField: (map[interface {}]interface {}) (len=1) {\n\t//   (string) (len=3) \"one\": (bool) true\n\t//  }\n\t// }\n\t//\n}\n\n// This example demonstrates how to use ConfigState.Printf to display a variable\n// with a format string and inline formatting.\nfunc ExampleConfigState_Printf() {\n\t// See the top-level Dump example for details on the types used in this\n\t// example.\n\n\t// Create two ConfigState instances and modify the method handling of the\n\t// first ConfigState only.\n\tscs := spew.NewDefaultConfig()\n\tscs2 := spew.NewDefaultConfig()\n\tscs.DisableMethods = true\n\n\t// Alternatively\n\t// scs := spew.ConfigState{Indent: \" \", DisableMethods: true}\n\t// scs2 := spew.ConfigState{Indent: \" \"}\n\n\t// This is of type Flag which implements a Stringer and has raw value 1.\n\tf := flagTwo\n\n\t// Dump using the ConfigState instances.\n\tscs.Printf(\"f: %v\\n\", f)\n\tscs2.Printf(\"f: %v\\n\", f)\n\n\t// Output:\n\t// f: 1\n\t// f: flagTwo\n}\n"
  },
  {
    "path": "internal/spew/format.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\npackage spew\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// supportedFlags is a list of all the character flags supported by fmt package.\nconst supportedFlags = \"0-+# \"\n\n// formatState implements the fmt.Formatter interface and contains information\n// about the state of a formatting operation.  The NewFormatter function can\n// be used to get a new Formatter which can be used directly as arguments\n// in standard fmt package printing calls.\ntype formatState struct {\n\tvalue          interface{}\n\tfs             fmt.State\n\tdepth          int\n\tpointers       map[uintptr]int\n\tignoreNextType bool\n\tcs             *ConfigState\n}\n\n// buildDefaultFormat recreates the original format string without precision\n// and width information to pass in to fmt.Sprintf in the case of an\n// unrecognized type.  Unless new types are added to the language, this\n// function won't ever be called.\nfunc (f *formatState) buildDefaultFormat() (format string) {\n\tbuf := bytes.NewBuffer(percentBytes)\n\n\tfor _, flag := range supportedFlags {\n\t\tif f.fs.Flag(int(flag)) {\n\t\t\tbuf.WriteRune(flag)\n\t\t}\n\t}\n\n\tbuf.WriteRune('v')\n\n\tformat = buf.String()\n\treturn format\n}\n\n// constructOrigFormat recreates the original format string including precision\n// and width information to pass along to the standard fmt package.  This allows\n// automatic deferral of all format strings this package doesn't support.\nfunc (f *formatState) constructOrigFormat(verb rune) (format string) {\n\tbuf := bytes.NewBuffer(percentBytes)\n\n\tfor _, flag := range supportedFlags {\n\t\tif f.fs.Flag(int(flag)) {\n\t\t\tbuf.WriteRune(flag)\n\t\t}\n\t}\n\n\tif width, ok := f.fs.Width(); ok {\n\t\tbuf.WriteString(strconv.Itoa(width))\n\t}\n\n\tif precision, ok := f.fs.Precision(); ok {\n\t\tbuf.Write(precisionBytes)\n\t\tbuf.WriteString(strconv.Itoa(precision))\n\t}\n\n\tbuf.WriteRune(verb)\n\n\tformat = buf.String()\n\treturn format\n}\n\n// unpackValue returns values inside of non-nil interfaces when possible and\n// ensures that types for values which have been unpacked from an interface\n// are displayed when the show types flag is also set.\n// This is useful for data types like structs, arrays, slices, and maps which\n// can contain varying types packed inside an interface.\nfunc (f *formatState) unpackValue(v reflect.Value) reflect.Value {\n\tif v.Kind() == reflect.Interface {\n\t\tf.ignoreNextType = false\n\t\tif !v.IsNil() {\n\t\t\tv = v.Elem()\n\t\t}\n\t}\n\treturn v\n}\n\n// formatPtr handles formatting of pointers by indirecting them as necessary.\nfunc (f *formatState) formatPtr(v reflect.Value) {\n\t// Display nil if top level pointer is nil.\n\tshowTypes := f.fs.Flag('#')\n\tif v.IsNil() && (!showTypes || f.ignoreNextType) {\n\t\tf.fs.Write(nilAngleBytes)\n\t\treturn\n\t}\n\n\t// Remove pointers at or below the current depth from map used to detect\n\t// circular refs.\n\tfor k, depth := range f.pointers {\n\t\tif depth >= f.depth {\n\t\t\tdelete(f.pointers, k)\n\t\t}\n\t}\n\n\t// Keep list of all dereferenced pointers to possibly show later.\n\tpointerChain := make([]uintptr, 0)\n\n\t// Figure out how many levels of indirection there are by dereferencing\n\t// pointers and unpacking interfaces down the chain while detecting circular\n\t// references.\n\tnilFound := false\n\tcycleFound := false\n\tindirects := 0\n\tve := v\n\tfor ve.Kind() == reflect.Ptr {\n\t\tif ve.IsNil() {\n\t\t\tnilFound = true\n\t\t\tbreak\n\t\t}\n\t\tindirects++\n\t\taddr := ve.Pointer()\n\t\tpointerChain = append(pointerChain, addr)\n\t\tif pd, ok := f.pointers[addr]; ok && pd < f.depth {\n\t\t\tcycleFound = true\n\t\t\tindirects--\n\t\t\tbreak\n\t\t}\n\t\tf.pointers[addr] = f.depth\n\n\t\tve = ve.Elem()\n\t\tif ve.Kind() == reflect.Interface {\n\t\t\tif ve.IsNil() {\n\t\t\t\tnilFound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tve = ve.Elem()\n\t\t}\n\t}\n\n\t// Display type or indirection level depending on flags.\n\tif showTypes && !f.ignoreNextType {\n\t\tf.fs.Write(openParenBytes)\n\t\tf.fs.Write(bytes.Repeat(asteriskBytes, indirects))\n\t\tf.fs.Write([]byte(ve.Type().String()))\n\t\tf.fs.Write(closeParenBytes)\n\t} else {\n\t\tif nilFound || cycleFound {\n\t\t\tindirects += strings.Count(ve.Type().String(), \"*\")\n\t\t}\n\t\tf.fs.Write(openAngleBytes)\n\t\tf.fs.Write([]byte(strings.Repeat(\"*\", indirects)))\n\t\tf.fs.Write(closeAngleBytes)\n\t}\n\n\t// Display pointer information depending on flags.\n\tif f.fs.Flag('+') && (len(pointerChain) > 0) {\n\t\tf.fs.Write(openParenBytes)\n\t\tfor i, addr := range pointerChain {\n\t\t\tif i > 0 {\n\t\t\t\tf.fs.Write(pointerChainBytes)\n\t\t\t}\n\t\t\tprintHexPtr(f.fs, addr)\n\t\t}\n\t\tf.fs.Write(closeParenBytes)\n\t}\n\n\t// Display dereferenced value.\n\tswitch {\n\tcase nilFound:\n\t\tf.fs.Write(nilAngleBytes)\n\n\tcase cycleFound:\n\t\tf.fs.Write(circularShortBytes)\n\n\tdefault:\n\t\tf.ignoreNextType = true\n\t\tf.format(ve)\n\t}\n}\n\n// format is the main workhorse for providing the Formatter interface.  It\n// uses the passed reflect value to figure out what kind of object we are\n// dealing with and formats it appropriately.  It is a recursive function,\n// however circular data structures are detected and handled properly.\nfunc (f *formatState) format(v reflect.Value) {\n\t// Handle invalid reflect values immediately.\n\tkind := v.Kind()\n\tif kind == reflect.Invalid {\n\t\tf.fs.Write(invalidAngleBytes)\n\t\treturn\n\t}\n\n\t// Handle pointers specially.\n\tif kind == reflect.Ptr {\n\t\tf.formatPtr(v)\n\t\treturn\n\t}\n\n\t// Print type information unless already handled elsewhere.\n\tif !f.ignoreNextType && f.fs.Flag('#') {\n\t\tf.fs.Write(openParenBytes)\n\t\tf.fs.Write([]byte(v.Type().String()))\n\t\tf.fs.Write(closeParenBytes)\n\t}\n\tf.ignoreNextType = false\n\n\t// Call Stringer/error interfaces if they exist and the handle methods\n\t// flag is enabled.\n\tif !f.cs.DisableMethods {\n\t\tif (kind != reflect.Invalid) && (kind != reflect.Interface) {\n\t\t\tif handled := handleMethods(f.cs, f.fs, v); handled {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch kind {\n\tcase reflect.Invalid:\n\t\t// Do nothing.  We should never get here since invalid has already\n\t\t// been handled above.\n\n\tcase reflect.Bool:\n\t\tprintBool(f.fs, v.Bool())\n\n\tcase reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:\n\t\tprintInt(f.fs, v.Int(), 10)\n\n\tcase reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:\n\t\tprintUint(f.fs, v.Uint(), 10)\n\n\tcase reflect.Float32:\n\t\tprintFloat(f.fs, v.Float(), 32)\n\n\tcase reflect.Float64:\n\t\tprintFloat(f.fs, v.Float(), 64)\n\n\tcase reflect.Complex64:\n\t\tprintComplex(f.fs, v.Complex(), 32)\n\n\tcase reflect.Complex128:\n\t\tprintComplex(f.fs, v.Complex(), 64)\n\n\tcase reflect.Slice:\n\t\tif v.IsNil() {\n\t\t\tf.fs.Write(nilAngleBytes)\n\t\t\tbreak\n\t\t}\n\t\tfallthrough\n\n\tcase reflect.Array:\n\t\tf.fs.Write(openBracketBytes)\n\t\tf.depth++\n\t\tif (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) {\n\t\t\tf.fs.Write(maxShortBytes)\n\t\t} else {\n\t\t\tnumEntries := v.Len()\n\t\t\tfor i := 0; i < numEntries; i++ {\n\t\t\t\tif i > 0 {\n\t\t\t\t\tf.fs.Write(spaceBytes)\n\t\t\t\t}\n\t\t\t\tf.ignoreNextType = true\n\t\t\t\tf.format(f.unpackValue(v.Index(i)))\n\t\t\t}\n\t\t}\n\t\tf.depth--\n\t\tf.fs.Write(closeBracketBytes)\n\n\tcase reflect.String:\n\t\tf.fs.Write([]byte(v.String()))\n\n\tcase reflect.Interface:\n\t\t// The only time we should get here is for nil interfaces due to\n\t\t// unpackValue calls.\n\t\tif v.IsNil() {\n\t\t\tf.fs.Write(nilAngleBytes)\n\t\t}\n\n\tcase reflect.Ptr:\n\t\t// Do nothing.  We should never get here since pointers have already\n\t\t// been handled above.\n\n\tcase reflect.Map:\n\t\t// nil maps should be indicated as different than empty maps\n\t\tif v.IsNil() {\n\t\t\tf.fs.Write(nilAngleBytes)\n\t\t\tbreak\n\t\t}\n\n\t\tf.fs.Write(openMapBytes)\n\t\tf.depth++\n\t\tif (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) {\n\t\t\tf.fs.Write(maxShortBytes)\n\t\t} else {\n\t\t\tkeys := v.MapKeys()\n\t\t\tif f.cs.SortKeys {\n\t\t\t\tsortValues(keys, f.cs)\n\t\t\t}\n\t\t\tfor i, key := range keys {\n\t\t\t\tif i > 0 {\n\t\t\t\t\tf.fs.Write(spaceBytes)\n\t\t\t\t}\n\t\t\t\tf.ignoreNextType = true\n\t\t\t\tf.format(f.unpackValue(key))\n\t\t\t\tf.fs.Write(colonBytes)\n\t\t\t\tf.ignoreNextType = true\n\t\t\t\tf.format(f.unpackValue(v.MapIndex(key)))\n\t\t\t}\n\t\t}\n\t\tf.depth--\n\t\tf.fs.Write(closeMapBytes)\n\n\tcase reflect.Struct:\n\t\tnumFields := v.NumField()\n\t\tf.fs.Write(openBraceBytes)\n\t\tf.depth++\n\t\tif (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) {\n\t\t\tf.fs.Write(maxShortBytes)\n\t\t} else {\n\t\t\tvt := v.Type()\n\t\t\tfor i := 0; i < numFields; i++ {\n\t\t\t\tif i > 0 {\n\t\t\t\t\tf.fs.Write(spaceBytes)\n\t\t\t\t}\n\t\t\t\tvtf := vt.Field(i)\n\t\t\t\tif f.fs.Flag('+') || f.fs.Flag('#') {\n\t\t\t\t\tf.fs.Write([]byte(vtf.Name))\n\t\t\t\t\tf.fs.Write(colonBytes)\n\t\t\t\t}\n\t\t\t\tf.format(f.unpackValue(v.Field(i)))\n\t\t\t}\n\t\t}\n\t\tf.depth--\n\t\tf.fs.Write(closeBraceBytes)\n\n\tcase reflect.Uintptr:\n\t\tprintHexPtr(f.fs, uintptr(v.Uint()))\n\n\tcase reflect.UnsafePointer, reflect.Chan, reflect.Func:\n\t\tprintHexPtr(f.fs, v.Pointer())\n\n\t// There were not any other types at the time this code was written, but\n\t// fall back to letting the default fmt package handle it if any get added.\n\tdefault:\n\t\tformat := f.buildDefaultFormat()\n\t\tif v.CanInterface() {\n\t\t\tfmt.Fprintf(f.fs, format, v.Interface())\n\t\t} else {\n\t\t\tfmt.Fprintf(f.fs, format, v.String())\n\t\t}\n\t}\n}\n\n// Format satisfies the fmt.Formatter interface. See NewFormatter for usage\n// details.\nfunc (f *formatState) Format(fs fmt.State, verb rune) {\n\tf.fs = fs\n\n\t// Use standard formatting for verbs that are not v.\n\tif verb != 'v' {\n\t\tformat := f.constructOrigFormat(verb)\n\t\tfmt.Fprintf(fs, format, f.value)\n\t\treturn\n\t}\n\n\tif f.value == nil {\n\t\tif fs.Flag('#') {\n\t\t\tfs.Write(interfaceBytes)\n\t\t}\n\t\tfs.Write(nilAngleBytes)\n\t\treturn\n\t}\n\n\tf.format(reflect.ValueOf(f.value))\n}\n\n// newFormatter is a helper function to consolidate the logic from the various\n// public methods which take varying config states.\nfunc newFormatter(cs *ConfigState, v interface{}) fmt.Formatter {\n\tfs := &formatState{value: v, cs: cs}\n\tfs.pointers = make(map[uintptr]int)\n\treturn fs\n}\n\n/*\nNewFormatter returns a custom formatter that satisfies the fmt.Formatter\ninterface.  As a result, it integrates cleanly with standard fmt package\nprinting functions.  The formatter is useful for inline printing of smaller data\ntypes similar to the standard %v format specifier.\n\nThe custom formatter only responds to the %v (most compact), %+v (adds pointer\naddresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb\ncombinations.  Any other verbs such as %x and %q will be sent to the\nstandard fmt package for formatting.  In addition, the custom formatter ignores\nthe width and precision arguments (however they will still work on the format\nspecifiers not handled by the custom formatter).\n\nTypically this function shouldn't be called directly.  It is much easier to make\nuse of the custom formatter by calling one of the convenience functions such as\nPrintf, Println, or Fprintf.\n*/\nfunc NewFormatter(v interface{}) fmt.Formatter {\n\treturn newFormatter(&Config, v)\n}\n"
  },
  {
    "path": "internal/spew/format_test.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n/*\nTest Summary:\nNOTE: For each test, a nil pointer, a single pointer and double pointer to the\nbase test element are also tested to ensure proper indirection across all types.\n\n- Max int8, int16, int32, int64, int\n- Max uint8, uint16, uint32, uint64, uint\n- Boolean true and false\n- Standard complex64 and complex128\n- Array containing standard ints\n- Array containing type with custom formatter on pointer receiver only\n- Array containing interfaces\n- Slice containing standard float32 values\n- Slice containing type with custom formatter on pointer receiver only\n- Slice containing interfaces\n- Nil slice\n- Standard string\n- Nil interface\n- Sub-interface\n- Map with string keys and int vals\n- Map with custom formatter type on pointer receiver only keys and vals\n- Map with interface keys and values\n- Map with nil interface value\n- Struct with primitives\n- Struct that contains another struct\n- Struct that contains custom type with Stringer pointer interface via both\n  exported and unexported fields\n- Struct that contains embedded struct and field to same struct\n- Uintptr to 0 (null pointer)\n- Uintptr address of real variable\n- Unsafe.Pointer to 0 (null pointer)\n- Unsafe.Pointer to address of real variable\n- Nil channel\n- Standard int channel\n- Function with no params and no returns\n- Function with param and no returns\n- Function with multiple params and multiple returns\n- Struct that is circular through self referencing\n- Structs that are circular through cross referencing\n- Structs that are indirectly circular\n- Type that panics in its Stringer interface\n- Type that has a custom Error interface\n- %x passthrough with uint\n- %#x passthrough with uint\n- %f passthrough with precision\n- %f passthrough with width and precision\n- %d passthrough with width\n- %q passthrough with string\n*/\n\npackage spew_test\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"testing\"\n\t\"unsafe\"\n\n\t\"github.com/expr-lang/expr/internal/spew\"\n)\n\n// formatterTest is used to describe a test to be performed against NewFormatter.\ntype formatterTest struct {\n\tformat string\n\tin     interface{}\n\twants  []string\n}\n\n// formatterTests houses all of the tests to be performed against NewFormatter.\nvar formatterTests = make([]formatterTest, 0)\n\n// addFormatterTest is a helper method to append the passed input and desired\n// result to formatterTests.\nfunc addFormatterTest(format string, in interface{}, wants ...string) {\n\ttest := formatterTest{format, in, wants}\n\tformatterTests = append(formatterTests, test)\n}\n\nfunc addIntFormatterTests() {\n\t// Max int8.\n\tv := int8(127)\n\tnv := (*int8)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"int8\"\n\tvs := \"127\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Max int16.\n\tv2 := int16(32767)\n\tnv2 := (*int16)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"int16\"\n\tv2s := \"32767\"\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s)\n\taddFormatterTest(\"%v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%+v\", v2, v2s)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\n\t// Max int32.\n\tv3 := int32(2147483647)\n\tnv3 := (*int32)(nil)\n\tpv3 := &v3\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"int32\"\n\tv3s := \"2147483647\"\n\taddFormatterTest(\"%v\", v3, v3s)\n\taddFormatterTest(\"%v\", pv3, \"<*>\"+v3s)\n\taddFormatterTest(\"%v\", &pv3, \"<**>\"+v3s)\n\taddFormatterTest(\"%v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%+v\", v3, v3s)\n\taddFormatterTest(\"%+v\", pv3, \"<*>(\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%+v\", &pv3, \"<**>(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%+v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%#v\", v3, \"(\"+v3t+\")\"+v3s)\n\taddFormatterTest(\"%#v\", pv3, \"(*\"+v3t+\")\"+v3s)\n\taddFormatterTest(\"%#v\", &pv3, \"(**\"+v3t+\")\"+v3s)\n\taddFormatterTest(\"%#v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v3, \"(\"+v3t+\")\"+v3s)\n\taddFormatterTest(\"%#+v\", pv3, \"(*\"+v3t+\")(\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%#+v\", &pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%#v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n\n\t// Max int64.\n\tv4 := int64(9223372036854775807)\n\tnv4 := (*int64)(nil)\n\tpv4 := &v4\n\tv4Addr := fmt.Sprintf(\"%p\", pv4)\n\tpv4Addr := fmt.Sprintf(\"%p\", &pv4)\n\tv4t := \"int64\"\n\tv4s := \"9223372036854775807\"\n\taddFormatterTest(\"%v\", v4, v4s)\n\taddFormatterTest(\"%v\", pv4, \"<*>\"+v4s)\n\taddFormatterTest(\"%v\", &pv4, \"<**>\"+v4s)\n\taddFormatterTest(\"%v\", nv4, \"<nil>\")\n\taddFormatterTest(\"%+v\", v4, v4s)\n\taddFormatterTest(\"%+v\", pv4, \"<*>(\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%+v\", &pv4, \"<**>(\"+pv4Addr+\"->\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%+v\", nv4, \"<nil>\")\n\taddFormatterTest(\"%#v\", v4, \"(\"+v4t+\")\"+v4s)\n\taddFormatterTest(\"%#v\", pv4, \"(*\"+v4t+\")\"+v4s)\n\taddFormatterTest(\"%#v\", &pv4, \"(**\"+v4t+\")\"+v4s)\n\taddFormatterTest(\"%#v\", nv4, \"(*\"+v4t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v4, \"(\"+v4t+\")\"+v4s)\n\taddFormatterTest(\"%#+v\", pv4, \"(*\"+v4t+\")(\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%#+v\", &pv4, \"(**\"+v4t+\")(\"+pv4Addr+\"->\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%#+v\", nv4, \"(*\"+v4t+\")\"+\"<nil>\")\n\n\t// Max int.\n\tv5 := int(2147483647)\n\tnv5 := (*int)(nil)\n\tpv5 := &v5\n\tv5Addr := fmt.Sprintf(\"%p\", pv5)\n\tpv5Addr := fmt.Sprintf(\"%p\", &pv5)\n\tv5t := \"int\"\n\tv5s := \"2147483647\"\n\taddFormatterTest(\"%v\", v5, v5s)\n\taddFormatterTest(\"%v\", pv5, \"<*>\"+v5s)\n\taddFormatterTest(\"%v\", &pv5, \"<**>\"+v5s)\n\taddFormatterTest(\"%v\", nv5, \"<nil>\")\n\taddFormatterTest(\"%+v\", v5, v5s)\n\taddFormatterTest(\"%+v\", pv5, \"<*>(\"+v5Addr+\")\"+v5s)\n\taddFormatterTest(\"%+v\", &pv5, \"<**>(\"+pv5Addr+\"->\"+v5Addr+\")\"+v5s)\n\taddFormatterTest(\"%+v\", nv5, \"<nil>\")\n\taddFormatterTest(\"%#v\", v5, \"(\"+v5t+\")\"+v5s)\n\taddFormatterTest(\"%#v\", pv5, \"(*\"+v5t+\")\"+v5s)\n\taddFormatterTest(\"%#v\", &pv5, \"(**\"+v5t+\")\"+v5s)\n\taddFormatterTest(\"%#v\", nv5, \"(*\"+v5t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v5, \"(\"+v5t+\")\"+v5s)\n\taddFormatterTest(\"%#+v\", pv5, \"(*\"+v5t+\")(\"+v5Addr+\")\"+v5s)\n\taddFormatterTest(\"%#+v\", &pv5, \"(**\"+v5t+\")(\"+pv5Addr+\"->\"+v5Addr+\")\"+v5s)\n\taddFormatterTest(\"%#+v\", nv5, \"(*\"+v5t+\")\"+\"<nil>\")\n}\n\nfunc addUintFormatterTests() {\n\t// Max uint8.\n\tv := uint8(255)\n\tnv := (*uint8)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"uint8\"\n\tvs := \"255\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Max uint16.\n\tv2 := uint16(65535)\n\tnv2 := (*uint16)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"uint16\"\n\tv2s := \"65535\"\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s)\n\taddFormatterTest(\"%v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%+v\", v2, v2s)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\n\t// Max uint32.\n\tv3 := uint32(4294967295)\n\tnv3 := (*uint32)(nil)\n\tpv3 := &v3\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"uint32\"\n\tv3s := \"4294967295\"\n\taddFormatterTest(\"%v\", v3, v3s)\n\taddFormatterTest(\"%v\", pv3, \"<*>\"+v3s)\n\taddFormatterTest(\"%v\", &pv3, \"<**>\"+v3s)\n\taddFormatterTest(\"%v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%+v\", v3, v3s)\n\taddFormatterTest(\"%+v\", pv3, \"<*>(\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%+v\", &pv3, \"<**>(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%+v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%#v\", v3, \"(\"+v3t+\")\"+v3s)\n\taddFormatterTest(\"%#v\", pv3, \"(*\"+v3t+\")\"+v3s)\n\taddFormatterTest(\"%#v\", &pv3, \"(**\"+v3t+\")\"+v3s)\n\taddFormatterTest(\"%#v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v3, \"(\"+v3t+\")\"+v3s)\n\taddFormatterTest(\"%#+v\", pv3, \"(*\"+v3t+\")(\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%#+v\", &pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%#v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n\n\t// Max uint64.\n\tv4 := uint64(18446744073709551615)\n\tnv4 := (*uint64)(nil)\n\tpv4 := &v4\n\tv4Addr := fmt.Sprintf(\"%p\", pv4)\n\tpv4Addr := fmt.Sprintf(\"%p\", &pv4)\n\tv4t := \"uint64\"\n\tv4s := \"18446744073709551615\"\n\taddFormatterTest(\"%v\", v4, v4s)\n\taddFormatterTest(\"%v\", pv4, \"<*>\"+v4s)\n\taddFormatterTest(\"%v\", &pv4, \"<**>\"+v4s)\n\taddFormatterTest(\"%v\", nv4, \"<nil>\")\n\taddFormatterTest(\"%+v\", v4, v4s)\n\taddFormatterTest(\"%+v\", pv4, \"<*>(\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%+v\", &pv4, \"<**>(\"+pv4Addr+\"->\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%+v\", nv4, \"<nil>\")\n\taddFormatterTest(\"%#v\", v4, \"(\"+v4t+\")\"+v4s)\n\taddFormatterTest(\"%#v\", pv4, \"(*\"+v4t+\")\"+v4s)\n\taddFormatterTest(\"%#v\", &pv4, \"(**\"+v4t+\")\"+v4s)\n\taddFormatterTest(\"%#v\", nv4, \"(*\"+v4t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v4, \"(\"+v4t+\")\"+v4s)\n\taddFormatterTest(\"%#+v\", pv4, \"(*\"+v4t+\")(\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%#+v\", &pv4, \"(**\"+v4t+\")(\"+pv4Addr+\"->\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%#+v\", nv4, \"(*\"+v4t+\")\"+\"<nil>\")\n\n\t// Max uint.\n\tv5 := uint(4294967295)\n\tnv5 := (*uint)(nil)\n\tpv5 := &v5\n\tv5Addr := fmt.Sprintf(\"%p\", pv5)\n\tpv5Addr := fmt.Sprintf(\"%p\", &pv5)\n\tv5t := \"uint\"\n\tv5s := \"4294967295\"\n\taddFormatterTest(\"%v\", v5, v5s)\n\taddFormatterTest(\"%v\", pv5, \"<*>\"+v5s)\n\taddFormatterTest(\"%v\", &pv5, \"<**>\"+v5s)\n\taddFormatterTest(\"%v\", nv5, \"<nil>\")\n\taddFormatterTest(\"%+v\", v5, v5s)\n\taddFormatterTest(\"%+v\", pv5, \"<*>(\"+v5Addr+\")\"+v5s)\n\taddFormatterTest(\"%+v\", &pv5, \"<**>(\"+pv5Addr+\"->\"+v5Addr+\")\"+v5s)\n\taddFormatterTest(\"%+v\", nv5, \"<nil>\")\n\taddFormatterTest(\"%#v\", v5, \"(\"+v5t+\")\"+v5s)\n\taddFormatterTest(\"%#v\", pv5, \"(*\"+v5t+\")\"+v5s)\n\taddFormatterTest(\"%#v\", &pv5, \"(**\"+v5t+\")\"+v5s)\n\taddFormatterTest(\"%#v\", nv5, \"(*\"+v5t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v5, \"(\"+v5t+\")\"+v5s)\n\taddFormatterTest(\"%#+v\", pv5, \"(*\"+v5t+\")(\"+v5Addr+\")\"+v5s)\n\taddFormatterTest(\"%#+v\", &pv5, \"(**\"+v5t+\")(\"+pv5Addr+\"->\"+v5Addr+\")\"+v5s)\n\taddFormatterTest(\"%#v\", nv5, \"(*\"+v5t+\")\"+\"<nil>\")\n}\n\nfunc addBoolFormatterTests() {\n\t// Boolean true.\n\tv := bool(true)\n\tnv := (*bool)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"bool\"\n\tvs := \"true\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Boolean false.\n\tv2 := bool(false)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"bool\"\n\tv2s := \"false\"\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s)\n\taddFormatterTest(\"%+v\", v2, v2s)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n}\n\nfunc addFloatFormatterTests() {\n\t// Standard float32.\n\tv := float32(3.1415)\n\tnv := (*float32)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"float32\"\n\tvs := \"3.1415\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Standard float64.\n\tv2 := float64(3.1415926)\n\tnv2 := (*float64)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"float64\"\n\tv2s := \"3.1415926\"\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%+v\", v2, v2s)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n}\n\nfunc addComplexFormatterTests() {\n\t// Standard complex64.\n\tv := complex(float32(6), -2)\n\tnv := (*complex64)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"complex64\"\n\tvs := \"(6-2i)\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Standard complex128.\n\tv2 := complex(float64(-6), 2)\n\tnv2 := (*complex128)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"complex128\"\n\tv2s := \"(-6+2i)\"\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%+v\", v2, v2s)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n}\n\nfunc addArrayFormatterTests() {\n\t// Array containing standard ints.\n\tv := [3]int{1, 2, 3}\n\tnv := (*[3]int)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"[3]int\"\n\tvs := \"[1 2 3]\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Array containing type with custom formatter on pointer receiver only.\n\tv2 := [3]pstringer{\"1\", \"2\", \"3\"}\n\tnv2 := (*[3]pstringer)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"[3]spew_test.pstringer\"\n\tv2sp := \"[stringer 1 stringer 2 stringer 3]\"\n\tv2s := v2sp\n\tif spew.UnsafeDisabled {\n\t\tv2s = \"[1 2 3]\"\n\t}\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2sp)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2sp)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%+v\", v2, v2s)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2sp)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2sp)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2sp)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2sp)\n\taddFormatterTest(\"%#v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2sp)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2sp)\n\taddFormatterTest(\"%#+v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\n\t// Array containing interfaces.\n\tv3 := [3]interface{}{\"one\", int(2), uint(3)}\n\tnv3 := (*[3]interface{})(nil)\n\tpv3 := &v3\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"[3]interface {}\"\n\tv3t2 := \"string\"\n\tv3t3 := \"int\"\n\tv3t4 := \"uint\"\n\tv3s := \"[one 2 3]\"\n\tv3s2 := \"[(\" + v3t2 + \")one (\" + v3t3 + \")2 (\" + v3t4 + \")3]\"\n\taddFormatterTest(\"%v\", v3, v3s)\n\taddFormatterTest(\"%v\", pv3, \"<*>\"+v3s)\n\taddFormatterTest(\"%v\", &pv3, \"<**>\"+v3s)\n\taddFormatterTest(\"%+v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%+v\", v3, v3s)\n\taddFormatterTest(\"%+v\", pv3, \"<*>(\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%+v\", &pv3, \"<**>(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%+v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%#v\", v3, \"(\"+v3t+\")\"+v3s2)\n\taddFormatterTest(\"%#v\", pv3, \"(*\"+v3t+\")\"+v3s2)\n\taddFormatterTest(\"%#v\", &pv3, \"(**\"+v3t+\")\"+v3s2)\n\taddFormatterTest(\"%#v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v3, \"(\"+v3t+\")\"+v3s2)\n\taddFormatterTest(\"%#+v\", pv3, \"(*\"+v3t+\")(\"+v3Addr+\")\"+v3s2)\n\taddFormatterTest(\"%#+v\", &pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s2)\n\taddFormatterTest(\"%#+v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n}\n\nfunc addSliceFormatterTests() {\n\t// Slice containing standard float32 values.\n\tv := []float32{3.14, 6.28, 12.56}\n\tnv := (*[]float32)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"[]float32\"\n\tvs := \"[3.14 6.28 12.56]\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Slice containing type with custom formatter on pointer receiver only.\n\tv2 := []pstringer{\"1\", \"2\", \"3\"}\n\tnv2 := (*[]pstringer)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"[]spew_test.pstringer\"\n\tv2s := \"[stringer 1 stringer 2 stringer 3]\"\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%+v\", v2, v2s)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\n\t// Slice containing interfaces.\n\tv3 := []interface{}{\"one\", int(2), uint(3), nil}\n\tnv3 := (*[]interface{})(nil)\n\tpv3 := &v3\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"[]interface {}\"\n\tv3t2 := \"string\"\n\tv3t3 := \"int\"\n\tv3t4 := \"uint\"\n\tv3t5 := \"interface {}\"\n\tv3s := \"[one 2 3 <nil>]\"\n\tv3s2 := \"[(\" + v3t2 + \")one (\" + v3t3 + \")2 (\" + v3t4 + \")3 (\" + v3t5 +\n\t\t\")<nil>]\"\n\taddFormatterTest(\"%v\", v3, v3s)\n\taddFormatterTest(\"%v\", pv3, \"<*>\"+v3s)\n\taddFormatterTest(\"%v\", &pv3, \"<**>\"+v3s)\n\taddFormatterTest(\"%+v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%+v\", v3, v3s)\n\taddFormatterTest(\"%+v\", pv3, \"<*>(\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%+v\", &pv3, \"<**>(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%+v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%#v\", v3, \"(\"+v3t+\")\"+v3s2)\n\taddFormatterTest(\"%#v\", pv3, \"(*\"+v3t+\")\"+v3s2)\n\taddFormatterTest(\"%#v\", &pv3, \"(**\"+v3t+\")\"+v3s2)\n\taddFormatterTest(\"%#v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v3, \"(\"+v3t+\")\"+v3s2)\n\taddFormatterTest(\"%#+v\", pv3, \"(*\"+v3t+\")(\"+v3Addr+\")\"+v3s2)\n\taddFormatterTest(\"%#+v\", &pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s2)\n\taddFormatterTest(\"%#+v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n\n\t// Nil slice.\n\tvar v4 []int\n\tnv4 := (*[]int)(nil)\n\tpv4 := &v4\n\tv4Addr := fmt.Sprintf(\"%p\", pv4)\n\tpv4Addr := fmt.Sprintf(\"%p\", &pv4)\n\tv4t := \"[]int\"\n\tv4s := \"<nil>\"\n\taddFormatterTest(\"%v\", v4, v4s)\n\taddFormatterTest(\"%v\", pv4, \"<*>\"+v4s)\n\taddFormatterTest(\"%v\", &pv4, \"<**>\"+v4s)\n\taddFormatterTest(\"%+v\", nv4, \"<nil>\")\n\taddFormatterTest(\"%+v\", v4, v4s)\n\taddFormatterTest(\"%+v\", pv4, \"<*>(\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%+v\", &pv4, \"<**>(\"+pv4Addr+\"->\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%+v\", nv4, \"<nil>\")\n\taddFormatterTest(\"%#v\", v4, \"(\"+v4t+\")\"+v4s)\n\taddFormatterTest(\"%#v\", pv4, \"(*\"+v4t+\")\"+v4s)\n\taddFormatterTest(\"%#v\", &pv4, \"(**\"+v4t+\")\"+v4s)\n\taddFormatterTest(\"%#v\", nv4, \"(*\"+v4t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v4, \"(\"+v4t+\")\"+v4s)\n\taddFormatterTest(\"%#+v\", pv4, \"(*\"+v4t+\")(\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%#+v\", &pv4, \"(**\"+v4t+\")(\"+pv4Addr+\"->\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%#+v\", nv4, \"(*\"+v4t+\")\"+\"<nil>\")\n}\n\nfunc addStringFormatterTests() {\n\t// Standard string.\n\tv := \"test\"\n\tnv := (*string)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"string\"\n\tvs := \"test\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n}\n\nfunc addInterfaceFormatterTests() {\n\t// Nil interface.\n\tvar v interface{}\n\tnv := (*interface{})(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"interface {}\"\n\tvs := \"<nil>\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Sub-interface.\n\tv2 := interface{}(uint16(65535))\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"uint16\"\n\tv2s := \"65535\"\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s)\n\taddFormatterTest(\"%+v\", v2, v2s)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n}\n\nfunc addMapFormatterTests() {\n\t// Map with string keys and int vals.\n\tv := map[string]int{\"one\": 1, \"two\": 2}\n\tnilMap := map[string]int(nil)\n\tnv := (*map[string]int)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"map[string]int\"\n\tvs := \"map[one:1 two:2]\"\n\tvs2 := \"map[two:2 one:1]\"\n\taddFormatterTest(\"%v\", v, vs, vs2)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs, \"<*>\"+vs2)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs, \"<**>\"+vs2)\n\taddFormatterTest(\"%+v\", nilMap, \"<nil>\")\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs, vs2)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs, \"<*>(\"+vAddr+\")\"+vs2)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs,\n\t\t\"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs2)\n\taddFormatterTest(\"%+v\", nilMap, \"<nil>\")\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs, \"(\"+vt+\")\"+vs2)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs, \"(*\"+vt+\")\"+vs2)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs, \"(**\"+vt+\")\"+vs2)\n\taddFormatterTest(\"%#v\", nilMap, \"(\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs, \"(\"+vt+\")\"+vs2)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs,\n\t\t\"(*\"+vt+\")(\"+vAddr+\")\"+vs2)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs,\n\t\t\"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs2)\n\taddFormatterTest(\"%#+v\", nilMap, \"(\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Map with custom formatter type on pointer receiver only keys and vals.\n\tv2 := map[pstringer]pstringer{\"one\": \"1\"}\n\tnv2 := (*map[pstringer]pstringer)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"map[spew_test.pstringer]spew_test.pstringer\"\n\tv2s := \"map[stringer one:stringer 1]\"\n\tif spew.UnsafeDisabled {\n\t\tv2s = \"map[one:1]\"\n\t}\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%+v\", v2, v2s)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\n\t// Map with interface keys and values.\n\tv3 := map[interface{}]interface{}{\"one\": 1}\n\tnv3 := (*map[interface{}]interface{})(nil)\n\tpv3 := &v3\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"map[interface {}]interface {}\"\n\tv3t1 := \"string\"\n\tv3t2 := \"int\"\n\tv3s := \"map[one:1]\"\n\tv3s2 := \"map[(\" + v3t1 + \")one:(\" + v3t2 + \")1]\"\n\taddFormatterTest(\"%v\", v3, v3s)\n\taddFormatterTest(\"%v\", pv3, \"<*>\"+v3s)\n\taddFormatterTest(\"%v\", &pv3, \"<**>\"+v3s)\n\taddFormatterTest(\"%+v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%+v\", v3, v3s)\n\taddFormatterTest(\"%+v\", pv3, \"<*>(\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%+v\", &pv3, \"<**>(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%+v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%#v\", v3, \"(\"+v3t+\")\"+v3s2)\n\taddFormatterTest(\"%#v\", pv3, \"(*\"+v3t+\")\"+v3s2)\n\taddFormatterTest(\"%#v\", &pv3, \"(**\"+v3t+\")\"+v3s2)\n\taddFormatterTest(\"%#v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v3, \"(\"+v3t+\")\"+v3s2)\n\taddFormatterTest(\"%#+v\", pv3, \"(*\"+v3t+\")(\"+v3Addr+\")\"+v3s2)\n\taddFormatterTest(\"%#+v\", &pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s2)\n\taddFormatterTest(\"%#+v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n\n\t// Map with nil interface value\n\tv4 := map[string]interface{}{\"nil\": nil}\n\tnv4 := (*map[string]interface{})(nil)\n\tpv4 := &v4\n\tv4Addr := fmt.Sprintf(\"%p\", pv4)\n\tpv4Addr := fmt.Sprintf(\"%p\", &pv4)\n\tv4t := \"map[string]interface {}\"\n\tv4t1 := \"interface {}\"\n\tv4s := \"map[nil:<nil>]\"\n\tv4s2 := \"map[nil:(\" + v4t1 + \")<nil>]\"\n\taddFormatterTest(\"%v\", v4, v4s)\n\taddFormatterTest(\"%v\", pv4, \"<*>\"+v4s)\n\taddFormatterTest(\"%v\", &pv4, \"<**>\"+v4s)\n\taddFormatterTest(\"%+v\", nv4, \"<nil>\")\n\taddFormatterTest(\"%+v\", v4, v4s)\n\taddFormatterTest(\"%+v\", pv4, \"<*>(\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%+v\", &pv4, \"<**>(\"+pv4Addr+\"->\"+v4Addr+\")\"+v4s)\n\taddFormatterTest(\"%+v\", nv4, \"<nil>\")\n\taddFormatterTest(\"%#v\", v4, \"(\"+v4t+\")\"+v4s2)\n\taddFormatterTest(\"%#v\", pv4, \"(*\"+v4t+\")\"+v4s2)\n\taddFormatterTest(\"%#v\", &pv4, \"(**\"+v4t+\")\"+v4s2)\n\taddFormatterTest(\"%#v\", nv4, \"(*\"+v4t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v4, \"(\"+v4t+\")\"+v4s2)\n\taddFormatterTest(\"%#+v\", pv4, \"(*\"+v4t+\")(\"+v4Addr+\")\"+v4s2)\n\taddFormatterTest(\"%#+v\", &pv4, \"(**\"+v4t+\")(\"+pv4Addr+\"->\"+v4Addr+\")\"+v4s2)\n\taddFormatterTest(\"%#+v\", nv4, \"(*\"+v4t+\")\"+\"<nil>\")\n}\n\nfunc addStructFormatterTests() {\n\t// Struct with primitives.\n\ttype s1 struct {\n\t\ta int8\n\t\tb uint8\n\t}\n\tv := s1{127, 255}\n\tnv := (*s1)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"spew_test.s1\"\n\tvt2 := \"int8\"\n\tvt3 := \"uint8\"\n\tvs := \"{127 255}\"\n\tvs2 := \"{a:127 b:255}\"\n\tvs3 := \"{a:(\" + vt2 + \")127 b:(\" + vt3 + \")255}\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs2)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs2)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs2)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs3)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs3)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs3)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs3)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs3)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs3)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Struct that contains another struct.\n\ttype s2 struct {\n\t\ts1 s1\n\t\tb  bool\n\t}\n\tv2 := s2{s1{127, 255}, true}\n\tnv2 := (*s2)(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"spew_test.s2\"\n\tv2t2 := \"spew_test.s1\"\n\tv2t3 := \"int8\"\n\tv2t4 := \"uint8\"\n\tv2t5 := \"bool\"\n\tv2s := \"{{127 255} true}\"\n\tv2s2 := \"{s1:{a:127 b:255} b:true}\"\n\tv2s3 := \"{s1:(\" + v2t2 + \"){a:(\" + v2t3 + \")127 b:(\" + v2t4 + \")255} b:(\" +\n\t\tv2t5 + \")true}\"\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%+v\", v2, v2s2)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s2)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s2)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s3)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s3)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s3)\n\taddFormatterTest(\"%#v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s3)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s3)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s3)\n\taddFormatterTest(\"%#+v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\n\t// Struct that contains custom type with Stringer pointer interface via both\n\t// exported and unexported fields.\n\ttype s3 struct {\n\t\ts pstringer\n\t\tS pstringer\n\t}\n\tv3 := s3{\"test\", \"test2\"}\n\tnv3 := (*s3)(nil)\n\tpv3 := &v3\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"spew_test.s3\"\n\tv3t2 := \"spew_test.pstringer\"\n\tv3s := \"{stringer test stringer test2}\"\n\tv3sp := v3s\n\tv3s2 := \"{s:stringer test S:stringer test2}\"\n\tv3s2p := v3s2\n\tv3s3 := \"{s:(\" + v3t2 + \")stringer test S:(\" + v3t2 + \")stringer test2}\"\n\tv3s3p := v3s3\n\tif spew.UnsafeDisabled {\n\t\tv3s = \"{test test2}\"\n\t\tv3sp = \"{test stringer test2}\"\n\t\tv3s2 = \"{s:test S:test2}\"\n\t\tv3s2p = \"{s:test S:stringer test2}\"\n\t\tv3s3 = \"{s:(\" + v3t2 + \")test S:(\" + v3t2 + \")test2}\"\n\t\tv3s3p = \"{s:(\" + v3t2 + \")test S:(\" + v3t2 + \")stringer test2}\"\n\t}\n\taddFormatterTest(\"%v\", v3, v3s)\n\taddFormatterTest(\"%v\", pv3, \"<*>\"+v3sp)\n\taddFormatterTest(\"%v\", &pv3, \"<**>\"+v3sp)\n\taddFormatterTest(\"%+v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%+v\", v3, v3s2)\n\taddFormatterTest(\"%+v\", pv3, \"<*>(\"+v3Addr+\")\"+v3s2p)\n\taddFormatterTest(\"%+v\", &pv3, \"<**>(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s2p)\n\taddFormatterTest(\"%+v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%#v\", v3, \"(\"+v3t+\")\"+v3s3)\n\taddFormatterTest(\"%#v\", pv3, \"(*\"+v3t+\")\"+v3s3p)\n\taddFormatterTest(\"%#v\", &pv3, \"(**\"+v3t+\")\"+v3s3p)\n\taddFormatterTest(\"%#v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v3, \"(\"+v3t+\")\"+v3s3)\n\taddFormatterTest(\"%#+v\", pv3, \"(*\"+v3t+\")(\"+v3Addr+\")\"+v3s3p)\n\taddFormatterTest(\"%#+v\", &pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s3p)\n\taddFormatterTest(\"%#+v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n\n\t// Struct that contains embedded struct and field to same struct.\n\te := embed{\"embedstr\"}\n\tv4 := embedwrap{embed: &e, e: &e}\n\tnv4 := (*embedwrap)(nil)\n\tpv4 := &v4\n\teAddr := fmt.Sprintf(\"%p\", &e)\n\tv4Addr := fmt.Sprintf(\"%p\", pv4)\n\tpv4Addr := fmt.Sprintf(\"%p\", &pv4)\n\tv4t := \"spew_test.embedwrap\"\n\tv4t2 := \"spew_test.embed\"\n\tv4t3 := \"string\"\n\tv4s := \"{<*>{embedstr} <*>{embedstr}}\"\n\tv4s2 := \"{embed:<*>(\" + eAddr + \"){a:embedstr} e:<*>(\" + eAddr +\n\t\t\"){a:embedstr}}\"\n\tv4s3 := \"{embed:(*\" + v4t2 + \"){a:(\" + v4t3 + \")embedstr} e:(*\" + v4t2 +\n\t\t\"){a:(\" + v4t3 + \")embedstr}}\"\n\tv4s4 := \"{embed:(*\" + v4t2 + \")(\" + eAddr + \"){a:(\" + v4t3 +\n\t\t\")embedstr} e:(*\" + v4t2 + \")(\" + eAddr + \"){a:(\" + v4t3 + \")embedstr}}\"\n\taddFormatterTest(\"%v\", v4, v4s)\n\taddFormatterTest(\"%v\", pv4, \"<*>\"+v4s)\n\taddFormatterTest(\"%v\", &pv4, \"<**>\"+v4s)\n\taddFormatterTest(\"%+v\", nv4, \"<nil>\")\n\taddFormatterTest(\"%+v\", v4, v4s2)\n\taddFormatterTest(\"%+v\", pv4, \"<*>(\"+v4Addr+\")\"+v4s2)\n\taddFormatterTest(\"%+v\", &pv4, \"<**>(\"+pv4Addr+\"->\"+v4Addr+\")\"+v4s2)\n\taddFormatterTest(\"%+v\", nv4, \"<nil>\")\n\taddFormatterTest(\"%#v\", v4, \"(\"+v4t+\")\"+v4s3)\n\taddFormatterTest(\"%#v\", pv4, \"(*\"+v4t+\")\"+v4s3)\n\taddFormatterTest(\"%#v\", &pv4, \"(**\"+v4t+\")\"+v4s3)\n\taddFormatterTest(\"%#v\", nv4, \"(*\"+v4t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v4, \"(\"+v4t+\")\"+v4s4)\n\taddFormatterTest(\"%#+v\", pv4, \"(*\"+v4t+\")(\"+v4Addr+\")\"+v4s4)\n\taddFormatterTest(\"%#+v\", &pv4, \"(**\"+v4t+\")(\"+pv4Addr+\"->\"+v4Addr+\")\"+v4s4)\n\taddFormatterTest(\"%#+v\", nv4, \"(*\"+v4t+\")\"+\"<nil>\")\n}\n\nfunc addUintptrFormatterTests() {\n\t// Null pointer.\n\tv := uintptr(0)\n\tnv := (*uintptr)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"uintptr\"\n\tvs := \"<nil>\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Address of real variable.\n\ti := 1\n\tv2 := uintptr(unsafe.Pointer(&i))\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"uintptr\"\n\tv2s := fmt.Sprintf(\"%p\", &i)\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s)\n\taddFormatterTest(\"%+v\", v2, v2s)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n}\n\nfunc addUnsafePointerFormatterTests() {\n\t// Null pointer.\n\tv := unsafe.Pointer(nil)\n\tnv := (*unsafe.Pointer)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"unsafe.Pointer\"\n\tvs := \"<nil>\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Address of real variable.\n\ti := 1\n\tv2 := unsafe.Pointer(&i)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"unsafe.Pointer\"\n\tv2s := fmt.Sprintf(\"%p\", &i)\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s)\n\taddFormatterTest(\"%+v\", v2, v2s)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n}\n\nfunc addChanFormatterTests() {\n\t// Nil channel.\n\tvar v chan int\n\tpv := &v\n\tnv := (*chan int)(nil)\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"chan int\"\n\tvs := \"<nil>\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Real channel.\n\tv2 := make(chan int)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"chan int\"\n\tv2s := fmt.Sprintf(\"%p\", v2)\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s)\n\taddFormatterTest(\"%+v\", v2, v2s)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n}\n\nfunc addFuncFormatterTests() {\n\t// Function with no params and no returns.\n\tv := addIntFormatterTests\n\tnv := (*func())(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"func()\"\n\tvs := fmt.Sprintf(\"%p\", v)\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\n\t// Function with param and no returns.\n\tv2 := TestFormatter\n\tnv2 := (*func(*testing.T))(nil)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"func(*testing.T)\"\n\tv2s := fmt.Sprintf(\"%p\", v2)\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%+v\", v2, v2s)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%+v\", nv2, \"<nil>\")\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s)\n\taddFormatterTest(\"%#+v\", nv2, \"(*\"+v2t+\")\"+\"<nil>\")\n\n\t// Function with multiple params and multiple returns.\n\tvar v3 = func(i int, s string) (b bool, err error) {\n\t\treturn true, nil\n\t}\n\tnv3 := (*func(int, string) (bool, error))(nil)\n\tpv3 := &v3\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"func(int, string) (bool, error)\"\n\tv3s := fmt.Sprintf(\"%p\", v3)\n\taddFormatterTest(\"%v\", v3, v3s)\n\taddFormatterTest(\"%v\", pv3, \"<*>\"+v3s)\n\taddFormatterTest(\"%v\", &pv3, \"<**>\"+v3s)\n\taddFormatterTest(\"%+v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%+v\", v3, v3s)\n\taddFormatterTest(\"%+v\", pv3, \"<*>(\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%+v\", &pv3, \"<**>(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%+v\", nv3, \"<nil>\")\n\taddFormatterTest(\"%#v\", v3, \"(\"+v3t+\")\"+v3s)\n\taddFormatterTest(\"%#v\", pv3, \"(*\"+v3t+\")\"+v3s)\n\taddFormatterTest(\"%#v\", &pv3, \"(**\"+v3t+\")\"+v3s)\n\taddFormatterTest(\"%#v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v3, \"(\"+v3t+\")\"+v3s)\n\taddFormatterTest(\"%#+v\", pv3, \"(*\"+v3t+\")(\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%#+v\", &pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s)\n\taddFormatterTest(\"%#+v\", nv3, \"(*\"+v3t+\")\"+\"<nil>\")\n}\n\nfunc addCircularFormatterTests() {\n\t// Struct that is circular through self referencing.\n\ttype circular struct {\n\t\tc *circular\n\t}\n\tv := circular{nil}\n\tv.c = &v\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"spew_test.circular\"\n\tvs := \"{<*>{<*><shown>}}\"\n\tvs2 := \"{<*><shown>}\"\n\tvs3 := \"{c:<*>(\" + vAddr + \"){c:<*>(\" + vAddr + \")<shown>}}\"\n\tvs4 := \"{c:<*>(\" + vAddr + \")<shown>}\"\n\tvs5 := \"{c:(*\" + vt + \"){c:(*\" + vt + \")<shown>}}\"\n\tvs6 := \"{c:(*\" + vt + \")<shown>}\"\n\tvs7 := \"{c:(*\" + vt + \")(\" + vAddr + \"){c:(*\" + vt + \")(\" + vAddr +\n\t\t\")<shown>}}\"\n\tvs8 := \"{c:(*\" + vt + \")(\" + vAddr + \")<shown>}\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs2)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs2)\n\taddFormatterTest(\"%+v\", v, vs3)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs4)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs4)\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs5)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs6)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs6)\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs7)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs8)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs8)\n\n\t// Structs that are circular through cross referencing.\n\tv2 := xref1{nil}\n\tts2 := xref2{&v2}\n\tv2.ps2 = &ts2\n\tpv2 := &v2\n\tts2Addr := fmt.Sprintf(\"%p\", &ts2)\n\tv2Addr := fmt.Sprintf(\"%p\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%p\", &pv2)\n\tv2t := \"spew_test.xref1\"\n\tv2t2 := \"spew_test.xref2\"\n\tv2s := \"{<*>{<*>{<*><shown>}}}\"\n\tv2s2 := \"{<*>{<*><shown>}}\"\n\tv2s3 := \"{ps2:<*>(\" + ts2Addr + \"){ps1:<*>(\" + v2Addr + \"){ps2:<*>(\" +\n\t\tts2Addr + \")<shown>}}}\"\n\tv2s4 := \"{ps2:<*>(\" + ts2Addr + \"){ps1:<*>(\" + v2Addr + \")<shown>}}\"\n\tv2s5 := \"{ps2:(*\" + v2t2 + \"){ps1:(*\" + v2t + \"){ps2:(*\" + v2t2 +\n\t\t\")<shown>}}}\"\n\tv2s6 := \"{ps2:(*\" + v2t2 + \"){ps1:(*\" + v2t + \")<shown>}}\"\n\tv2s7 := \"{ps2:(*\" + v2t2 + \")(\" + ts2Addr + \"){ps1:(*\" + v2t +\n\t\t\")(\" + v2Addr + \"){ps2:(*\" + v2t2 + \")(\" + ts2Addr +\n\t\t\")<shown>}}}\"\n\tv2s8 := \"{ps2:(*\" + v2t2 + \")(\" + ts2Addr + \"){ps1:(*\" + v2t +\n\t\t\")(\" + v2Addr + \")<shown>}}\"\n\taddFormatterTest(\"%v\", v2, v2s)\n\taddFormatterTest(\"%v\", pv2, \"<*>\"+v2s2)\n\taddFormatterTest(\"%v\", &pv2, \"<**>\"+v2s2)\n\taddFormatterTest(\"%+v\", v2, v2s3)\n\taddFormatterTest(\"%+v\", pv2, \"<*>(\"+v2Addr+\")\"+v2s4)\n\taddFormatterTest(\"%+v\", &pv2, \"<**>(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s4)\n\taddFormatterTest(\"%#v\", v2, \"(\"+v2t+\")\"+v2s5)\n\taddFormatterTest(\"%#v\", pv2, \"(*\"+v2t+\")\"+v2s6)\n\taddFormatterTest(\"%#v\", &pv2, \"(**\"+v2t+\")\"+v2s6)\n\taddFormatterTest(\"%#+v\", v2, \"(\"+v2t+\")\"+v2s7)\n\taddFormatterTest(\"%#+v\", pv2, \"(*\"+v2t+\")(\"+v2Addr+\")\"+v2s8)\n\taddFormatterTest(\"%#+v\", &pv2, \"(**\"+v2t+\")(\"+pv2Addr+\"->\"+v2Addr+\")\"+v2s8)\n\n\t// Structs that are indirectly circular.\n\tv3 := indirCir1{nil}\n\ttic2 := indirCir2{nil}\n\ttic3 := indirCir3{&v3}\n\ttic2.ps3 = &tic3\n\tv3.ps2 = &tic2\n\tpv3 := &v3\n\ttic2Addr := fmt.Sprintf(\"%p\", &tic2)\n\ttic3Addr := fmt.Sprintf(\"%p\", &tic3)\n\tv3Addr := fmt.Sprintf(\"%p\", pv3)\n\tpv3Addr := fmt.Sprintf(\"%p\", &pv3)\n\tv3t := \"spew_test.indirCir1\"\n\tv3t2 := \"spew_test.indirCir2\"\n\tv3t3 := \"spew_test.indirCir3\"\n\tv3s := \"{<*>{<*>{<*>{<*><shown>}}}}\"\n\tv3s2 := \"{<*>{<*>{<*><shown>}}}\"\n\tv3s3 := \"{ps2:<*>(\" + tic2Addr + \"){ps3:<*>(\" + tic3Addr + \"){ps1:<*>(\" +\n\t\tv3Addr + \"){ps2:<*>(\" + tic2Addr + \")<shown>}}}}\"\n\tv3s4 := \"{ps2:<*>(\" + tic2Addr + \"){ps3:<*>(\" + tic3Addr + \"){ps1:<*>(\" +\n\t\tv3Addr + \")<shown>}}}\"\n\tv3s5 := \"{ps2:(*\" + v3t2 + \"){ps3:(*\" + v3t3 + \"){ps1:(*\" + v3t +\n\t\t\"){ps2:(*\" + v3t2 + \")<shown>}}}}\"\n\tv3s6 := \"{ps2:(*\" + v3t2 + \"){ps3:(*\" + v3t3 + \"){ps1:(*\" + v3t +\n\t\t\")<shown>}}}\"\n\tv3s7 := \"{ps2:(*\" + v3t2 + \")(\" + tic2Addr + \"){ps3:(*\" + v3t3 + \")(\" +\n\t\ttic3Addr + \"){ps1:(*\" + v3t + \")(\" + v3Addr + \"){ps2:(*\" + v3t2 +\n\t\t\")(\" + tic2Addr + \")<shown>}}}}\"\n\tv3s8 := \"{ps2:(*\" + v3t2 + \")(\" + tic2Addr + \"){ps3:(*\" + v3t3 + \")(\" +\n\t\ttic3Addr + \"){ps1:(*\" + v3t + \")(\" + v3Addr + \")<shown>}}}\"\n\taddFormatterTest(\"%v\", v3, v3s)\n\taddFormatterTest(\"%v\", pv3, \"<*>\"+v3s2)\n\taddFormatterTest(\"%v\", &pv3, \"<**>\"+v3s2)\n\taddFormatterTest(\"%+v\", v3, v3s3)\n\taddFormatterTest(\"%+v\", pv3, \"<*>(\"+v3Addr+\")\"+v3s4)\n\taddFormatterTest(\"%+v\", &pv3, \"<**>(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s4)\n\taddFormatterTest(\"%#v\", v3, \"(\"+v3t+\")\"+v3s5)\n\taddFormatterTest(\"%#v\", pv3, \"(*\"+v3t+\")\"+v3s6)\n\taddFormatterTest(\"%#v\", &pv3, \"(**\"+v3t+\")\"+v3s6)\n\taddFormatterTest(\"%#+v\", v3, \"(\"+v3t+\")\"+v3s7)\n\taddFormatterTest(\"%#+v\", pv3, \"(*\"+v3t+\")(\"+v3Addr+\")\"+v3s8)\n\taddFormatterTest(\"%#+v\", &pv3, \"(**\"+v3t+\")(\"+pv3Addr+\"->\"+v3Addr+\")\"+v3s8)\n}\n\nfunc addPanicFormatterTests() {\n\t// Type that panics in its Stringer interface.\n\tv := panicer(127)\n\tnv := (*panicer)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"spew_test.panicer\"\n\tvs := \"(PANIC=test panic)127\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n}\n\nfunc addErrorFormatterTests() {\n\t// Type that has a custom Error interface.\n\tv := customError(127)\n\tnv := (*customError)(nil)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%p\", pv)\n\tpvAddr := fmt.Sprintf(\"%p\", &pv)\n\tvt := \"spew_test.customError\"\n\tvs := \"error: 127\"\n\taddFormatterTest(\"%v\", v, vs)\n\taddFormatterTest(\"%v\", pv, \"<*>\"+vs)\n\taddFormatterTest(\"%v\", &pv, \"<**>\"+vs)\n\taddFormatterTest(\"%v\", nv, \"<nil>\")\n\taddFormatterTest(\"%+v\", v, vs)\n\taddFormatterTest(\"%+v\", pv, \"<*>(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", &pv, \"<**>(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%+v\", nv, \"<nil>\")\n\taddFormatterTest(\"%#v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", pv, \"(*\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", &pv, \"(**\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n\taddFormatterTest(\"%#+v\", v, \"(\"+vt+\")\"+vs)\n\taddFormatterTest(\"%#+v\", pv, \"(*\"+vt+\")(\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", &pv, \"(**\"+vt+\")(\"+pvAddr+\"->\"+vAddr+\")\"+vs)\n\taddFormatterTest(\"%#+v\", nv, \"(*\"+vt+\")\"+\"<nil>\")\n}\n\nfunc addPassthroughFormatterTests() {\n\t// %x passthrough with uint.\n\tv := uint(4294967295)\n\tpv := &v\n\tvAddr := fmt.Sprintf(\"%x\", pv)\n\tpvAddr := fmt.Sprintf(\"%x\", &pv)\n\tvs := \"ffffffff\"\n\taddFormatterTest(\"%x\", v, vs)\n\taddFormatterTest(\"%x\", pv, vAddr)\n\taddFormatterTest(\"%x\", &pv, pvAddr)\n\n\t// %#x passthrough with uint.\n\tv2 := int(2147483647)\n\tpv2 := &v2\n\tv2Addr := fmt.Sprintf(\"%#x\", pv2)\n\tpv2Addr := fmt.Sprintf(\"%#x\", &pv2)\n\tv2s := \"0x7fffffff\"\n\taddFormatterTest(\"%#x\", v2, v2s)\n\taddFormatterTest(\"%#x\", pv2, v2Addr)\n\taddFormatterTest(\"%#x\", &pv2, pv2Addr)\n\n\t// %f passthrough with precision.\n\taddFormatterTest(\"%.2f\", 3.1415, \"3.14\")\n\taddFormatterTest(\"%.3f\", 3.1415, \"3.142\")\n\taddFormatterTest(\"%.4f\", 3.1415, \"3.1415\")\n\n\t// %f passthrough with width and precision.\n\taddFormatterTest(\"%5.2f\", 3.1415, \" 3.14\")\n\taddFormatterTest(\"%6.3f\", 3.1415, \" 3.142\")\n\taddFormatterTest(\"%7.4f\", 3.1415, \" 3.1415\")\n\n\t// %d passthrough with width.\n\taddFormatterTest(\"%3d\", 127, \"127\")\n\taddFormatterTest(\"%4d\", 127, \" 127\")\n\taddFormatterTest(\"%5d\", 127, \"  127\")\n\n\t// %q passthrough with string.\n\taddFormatterTest(\"%q\", \"test\", \"\\\"test\\\"\")\n}\n\n// TestFormatter executes all of the tests described by formatterTests.\nfunc TestFormatter(t *testing.T) {\n\t// Setup tests.\n\taddIntFormatterTests()\n\taddUintFormatterTests()\n\taddBoolFormatterTests()\n\taddFloatFormatterTests()\n\taddComplexFormatterTests()\n\taddArrayFormatterTests()\n\taddSliceFormatterTests()\n\taddStringFormatterTests()\n\taddInterfaceFormatterTests()\n\taddMapFormatterTests()\n\taddStructFormatterTests()\n\taddUintptrFormatterTests()\n\taddUnsafePointerFormatterTests()\n\taddChanFormatterTests()\n\taddFuncFormatterTests()\n\taddCircularFormatterTests()\n\taddPanicFormatterTests()\n\taddErrorFormatterTests()\n\taddPassthroughFormatterTests()\n\n\tt.Logf(\"Running %d tests\", len(formatterTests))\n\tfor i, test := range formatterTests {\n\t\tbuf := new(bytes.Buffer)\n\t\tspew.Fprintf(buf, test.format, test.in)\n\t\ts := buf.String()\n\t\tif testFailed(s, test.wants) {\n\t\t\tt.Errorf(\"Formatter #%d format: %s got: %s %s\", i, test.format, s,\n\t\t\t\tstringizeWants(test.wants))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\ntype testStruct struct {\n\tx int\n}\n\nfunc (ts testStruct) String() string {\n\treturn fmt.Sprintf(\"ts.%d\", ts.x)\n}\n\ntype testStructP struct {\n\tx int\n}\n\nfunc (ts *testStructP) String() string {\n\treturn fmt.Sprintf(\"ts.%d\", ts.x)\n}\n\nfunc TestPrintSortedKeys(t *testing.T) {\n\tcfg := spew.ConfigState{SortKeys: true}\n\ts := cfg.Sprint(map[int]string{1: \"1\", 3: \"3\", 2: \"2\"})\n\texpected := \"map[1:1 2:2 3:3]\"\n\tif s != expected {\n\t\tt.Errorf(\"Sorted keys mismatch 1:\\n  %v %v\", s, expected)\n\t}\n\n\ts = cfg.Sprint(map[stringer]int{\"1\": 1, \"3\": 3, \"2\": 2})\n\texpected = \"map[stringer 1:1 stringer 2:2 stringer 3:3]\"\n\tif s != expected {\n\t\tt.Errorf(\"Sorted keys mismatch 2:\\n  %v %v\", s, expected)\n\t}\n\n\ts = cfg.Sprint(map[pstringer]int{pstringer(\"1\"): 1, pstringer(\"3\"): 3, pstringer(\"2\"): 2})\n\texpected = \"map[stringer 1:1 stringer 2:2 stringer 3:3]\"\n\tif spew.UnsafeDisabled {\n\t\texpected = \"map[1:1 2:2 3:3]\"\n\t}\n\tif s != expected {\n\t\tt.Errorf(\"Sorted keys mismatch 3:\\n  %v %v\", s, expected)\n\t}\n\n\ts = cfg.Sprint(map[testStruct]int{{1}: 1, {3}: 3, {2}: 2})\n\texpected = \"map[ts.1:1 ts.2:2 ts.3:3]\"\n\tif s != expected {\n\t\tt.Errorf(\"Sorted keys mismatch 4:\\n  %v %v\", s, expected)\n\t}\n\n\tif !spew.UnsafeDisabled {\n\t\ts = cfg.Sprint(map[testStructP]int{{1}: 1, {3}: 3, {2}: 2})\n\t\texpected = \"map[ts.1:1 ts.2:2 ts.3:3]\"\n\t\tif s != expected {\n\t\t\tt.Errorf(\"Sorted keys mismatch 5:\\n  %v %v\", s, expected)\n\t\t}\n\t}\n\n\ts = cfg.Sprint(map[customError]int{customError(1): 1, customError(3): 3, customError(2): 2})\n\texpected = \"map[error: 1:1 error: 2:2 error: 3:3]\"\n\tif s != expected {\n\t\tt.Errorf(\"Sorted keys mismatch 6:\\n  %v %v\", s, expected)\n\t}\n}\n"
  },
  {
    "path": "internal/spew/internal_test.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n/*\nThis test file is part of the spew package rather than the spew_test\npackage because it needs access to internals to properly test certain cases\nwhich are not possible via the public interface since they should never happen.\n*/\n\npackage spew\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"testing\"\n)\n\n// dummyFmtState implements a fake fmt.State to use for testing invalid\n// reflect.Value handling.  This is necessary because the fmt package catches\n// invalid values before invoking the formatter on them.\ntype dummyFmtState struct {\n\tbytes.Buffer\n}\n\nfunc (dfs *dummyFmtState) Flag(f int) bool {\n\treturn f == int('+')\n}\n\nfunc (dfs *dummyFmtState) Precision() (int, bool) {\n\treturn 0, false\n}\n\nfunc (dfs *dummyFmtState) Width() (int, bool) {\n\treturn 0, false\n}\n\n// TestInvalidReflectValue ensures the dump and formatter code handles an\n// invalid reflect value properly.  This needs access to internal state since it\n// should never happen in real code and therefore can't be tested via the public\n// API.\nfunc TestInvalidReflectValue(t *testing.T) {\n\ti := 1\n\n\t// Dump invalid reflect value.\n\tv := new(reflect.Value)\n\tbuf := new(bytes.Buffer)\n\td := dumpState{w: buf, cs: &Config}\n\td.dump(*v)\n\ts := buf.String()\n\twant := \"<invalid>\"\n\tif s != want {\n\t\tt.Errorf(\"InvalidReflectValue #%d\\n got: %s want: %s\", i, s, want)\n\t}\n\ti++\n\n\t// Formatter invalid reflect value.\n\tbuf2 := new(dummyFmtState)\n\tf := formatState{value: *v, cs: &Config, fs: buf2}\n\tf.format(*v)\n\ts = buf2.String()\n\twant = \"<invalid>\"\n\tif s != want {\n\t\tt.Errorf(\"InvalidReflectValue #%d got: %s want: %s\", i, s, want)\n\t}\n}\n\n// SortValues makes the internal sortValues function available to the test\n// package.\nfunc SortValues(values []reflect.Value, cs *ConfigState) {\n\tsortValues(values, cs)\n}\n"
  },
  {
    "path": "internal/spew/internalunsafe_test.go",
    "content": "// Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n\n// Permission to use, copy, modify, and distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n// NOTE: Due to the following build constraints, this file will only be compiled\n// when the code is not running on Google App Engine, compiled by GopherJS, and\n// \"-tags safe\" is not added to the go build command line.  The \"disableunsafe\"\n// tag is deprecated and thus should not be used.\n//go:build !js && !appengine && !safe && !disableunsafe && go1.4\n// +build !js,!appengine,!safe,!disableunsafe,go1.4\n\n/*\nThis test file is part of the spew package rather than the spew_test\npackage because it needs access to internals to properly test certain cases\nwhich are not possible via the public interface since they should never happen.\n*/\n\npackage spew\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"testing\"\n)\n\n// changeKind uses unsafe to intentionally change the kind of a reflect.Value to\n// the maximum kind value which does not exist.  This is needed to test the\n// fallback code which punts to the standard fmt library for new types that\n// might get added to the language.\nfunc changeKind(v *reflect.Value, readOnly bool) {\n\tflags := flagField(v)\n\tif readOnly {\n\t\t*flags |= flagRO\n\t} else {\n\t\t*flags &^= flagRO\n\t}\n\t*flags |= flagKindMask\n}\n\n// TestAddedReflectValue tests functionality of the dump and formatter code which\n// falls back to the standard fmt library for new types that might get added to\n// the language.\nfunc TestAddedReflectValue(t *testing.T) {\n\ti := 1\n\n\t// Dump using a reflect.Value that is exported.\n\tv := reflect.ValueOf(int8(5))\n\tchangeKind(&v, false)\n\tbuf := new(bytes.Buffer)\n\td := dumpState{w: buf, cs: &Config}\n\td.dump(v)\n\ts := buf.String()\n\twant := \"(int8) 5\"\n\tif s != want {\n\t\tt.Errorf(\"TestAddedReflectValue #%d\\n got: %s want: %s\", i, s, want)\n\t}\n\ti++\n\n\t// Dump using a reflect.Value that is not exported.\n\tchangeKind(&v, true)\n\tbuf.Reset()\n\td.dump(v)\n\ts = buf.String()\n\twant = \"(int8) <int8 Value>\"\n\tif s != want {\n\t\tt.Errorf(\"TestAddedReflectValue #%d\\n got: %s want: %s\", i, s, want)\n\t}\n\ti++\n\n\t// Formatter using a reflect.Value that is exported.\n\tchangeKind(&v, false)\n\tbuf2 := new(dummyFmtState)\n\tf := formatState{value: v, cs: &Config, fs: buf2}\n\tf.format(v)\n\ts = buf2.String()\n\twant = \"5\"\n\tif s != want {\n\t\tt.Errorf(\"TestAddedReflectValue #%d got: %s want: %s\", i, s, want)\n\t}\n\ti++\n\n\t// Formatter using a reflect.Value that is not exported.\n\tchangeKind(&v, true)\n\tbuf2.Reset()\n\tf = formatState{value: v, cs: &Config, fs: buf2}\n\tf.format(v)\n\ts = buf2.String()\n\twant = \"<int8 Value>\"\n\tif s != want {\n\t\tt.Errorf(\"TestAddedReflectValue #%d got: %s want: %s\", i, s, want)\n\t}\n}\n"
  },
  {
    "path": "internal/spew/spew.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\npackage spew\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the formatted string as a value that satisfies error.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Errorf(format, spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Errorf(format string, a ...interface{}) (err error) {\n\treturn fmt.Errorf(format, convertArgs(a)...)\n}\n\n// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Fprint(w, spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Fprint(w io.Writer, a ...interface{}) (n int, err error) {\n\treturn fmt.Fprint(w, convertArgs(a)...)\n}\n\n// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Fprintf(w, format, spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {\n\treturn fmt.Fprintf(w, format, convertArgs(a)...)\n}\n\n// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it\n// passed with a default Formatter interface returned by NewFormatter.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Fprintln(w, spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Fprintln(w io.Writer, a ...interface{}) (n int, err error) {\n\treturn fmt.Fprintln(w, convertArgs(a)...)\n}\n\n// Print is a wrapper for fmt.Print that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Print(spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Print(a ...interface{}) (n int, err error) {\n\treturn fmt.Print(convertArgs(a)...)\n}\n\n// Printf is a wrapper for fmt.Printf that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Printf(format, spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Printf(format string, a ...interface{}) (n int, err error) {\n\treturn fmt.Printf(format, convertArgs(a)...)\n}\n\n// Println is a wrapper for fmt.Println that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Println(spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Println(a ...interface{}) (n int, err error) {\n\treturn fmt.Println(convertArgs(a)...)\n}\n\n// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the resulting string.  See NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Sprint(spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Sprint(a ...interface{}) string {\n\treturn fmt.Sprint(convertArgs(a)...)\n}\n\n// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the resulting string.  See NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Sprintf(format, spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Sprintf(format string, a ...interface{}) string {\n\treturn fmt.Sprintf(format, convertArgs(a)...)\n}\n\n// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it\n// were passed with a default Formatter interface returned by NewFormatter.  It\n// returns the resulting string.  See NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Sprintln(spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Sprintln(a ...interface{}) string {\n\treturn fmt.Sprintln(convertArgs(a)...)\n}\n\n// convertArgs accepts a slice of arguments and returns a slice of the same\n// length with each argument converted to a default spew Formatter interface.\nfunc convertArgs(args []interface{}) (formatters []interface{}) {\n\tformatters = make([]interface{}, len(args))\n\tfor index, arg := range args {\n\t\tformatters[index] = NewFormatter(arg)\n\t}\n\treturn formatters\n}\n"
  },
  {
    "path": "internal/spew/spew_test.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\npackage spew_test\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/spew\"\n)\n\n// spewFunc is used to identify which public function of the spew package or\n// ConfigState a test applies to.\ntype spewFunc int\n\nconst (\n\tfCSFdump spewFunc = iota\n\tfCSFprint\n\tfCSFprintf\n\tfCSFprintln\n\tfCSPrint\n\tfCSPrintln\n\tfCSSdump\n\tfCSSprint\n\tfCSSprintf\n\tfCSSprintln\n\tfCSErrorf\n\tfCSNewFormatter\n\tfErrorf\n\tfFprint\n\tfFprintln\n\tfPrint\n\tfPrintln\n\tfSdump\n\tfSprint\n\tfSprintf\n\tfSprintln\n)\n\n// Map of spewFunc values to names for pretty printing.\nvar spewFuncStrings = map[spewFunc]string{\n\tfCSFdump:        \"ConfigState.Fdump\",\n\tfCSFprint:       \"ConfigState.Fprint\",\n\tfCSFprintf:      \"ConfigState.Fprintf\",\n\tfCSFprintln:     \"ConfigState.Fprintln\",\n\tfCSSdump:        \"ConfigState.Sdump\",\n\tfCSPrint:        \"ConfigState.Print\",\n\tfCSPrintln:      \"ConfigState.Println\",\n\tfCSSprint:       \"ConfigState.Sprint\",\n\tfCSSprintf:      \"ConfigState.Sprintf\",\n\tfCSSprintln:     \"ConfigState.Sprintln\",\n\tfCSErrorf:       \"ConfigState.Errorf\",\n\tfCSNewFormatter: \"ConfigState.NewFormatter\",\n\tfErrorf:         \"spew.Errorf\",\n\tfFprint:         \"spew.Fprint\",\n\tfFprintln:       \"spew.Fprintln\",\n\tfPrint:          \"spew.Print\",\n\tfPrintln:        \"spew.Println\",\n\tfSdump:          \"spew.Sdump\",\n\tfSprint:         \"spew.Sprint\",\n\tfSprintf:        \"spew.Sprintf\",\n\tfSprintln:       \"spew.Sprintln\",\n}\n\nfunc (f spewFunc) String() string {\n\tif s, ok := spewFuncStrings[f]; ok {\n\t\treturn s\n\t}\n\treturn fmt.Sprintf(\"Unknown spewFunc (%d)\", int(f))\n}\n\n// spewTest is used to describe a test to be performed against the public\n// functions of the spew package or ConfigState.\ntype spewTest struct {\n\tcs     *spew.ConfigState\n\tf      spewFunc\n\tformat string\n\tin     interface{}\n\twant   string\n}\n\n// spewTests houses the tests to be performed against the public functions of\n// the spew package and ConfigState.\n//\n// These tests are only intended to ensure the public functions are exercised\n// and are intentionally not exhaustive of types.  The exhaustive type\n// tests are handled in the dump and format tests.\nvar spewTests []spewTest\n\n// redirStdout is a helper function to return the standard output from f as a\n// byte slice.\nfunc redirStdout(f func()) ([]byte, error) {\n\ttempFile, err := ioutil.TempFile(\"\", \"ss-test\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfileName := tempFile.Name()\n\tdefer os.Remove(fileName) // Ignore error\n\n\torigStdout := os.Stdout\n\tos.Stdout = tempFile\n\tf()\n\tos.Stdout = origStdout\n\ttempFile.Close()\n\n\treturn ioutil.ReadFile(fileName)\n}\n\nfunc initSpewTests() {\n\t// Config states with various settings.\n\tscsDefault := spew.NewDefaultConfig()\n\tscsNoMethods := &spew.ConfigState{Indent: \" \", DisableMethods: true}\n\tscsNoPmethods := &spew.ConfigState{Indent: \" \", DisablePointerMethods: true}\n\tscsMaxDepth := &spew.ConfigState{Indent: \" \", MaxDepth: 1}\n\tscsContinue := &spew.ConfigState{Indent: \" \", ContinueOnMethod: true}\n\tscsNoPtrAddr := &spew.ConfigState{DisablePointerAddresses: true}\n\tscsNoCap := &spew.ConfigState{DisableCapacities: true}\n\n\t// Variables for tests on types which implement Stringer interface with and\n\t// without a pointer receiver.\n\tts := stringer(\"test\")\n\ttps := pstringer(\"test\")\n\n\ttype ptrTester struct {\n\t\ts *struct{}\n\t}\n\ttptr := &ptrTester{s: &struct{}{}}\n\n\t// depthTester is used to test max depth handling for structs, array, slices\n\t// and maps.\n\ttype depthTester struct {\n\t\tic    indirCir1\n\t\tarr   [1]string\n\t\tslice []string\n\t\tm     map[string]int\n\t}\n\tdt := depthTester{indirCir1{nil}, [1]string{\"arr\"}, []string{\"slice\"},\n\t\tmap[string]int{\"one\": 1}}\n\n\t// Variable for tests on types which implement error interface.\n\tte := customError(10)\n\n\tspewTests = []spewTest{\n\t\t{scsDefault, fCSFdump, \"\", int8(127), \"(int8) 127\\n\"},\n\t\t{scsDefault, fCSFprint, \"\", int16(32767), \"32767\"},\n\t\t{scsDefault, fCSFprintf, \"%v\", int32(2147483647), \"2147483647\"},\n\t\t{scsDefault, fCSFprintln, \"\", int(2147483647), \"2147483647\\n\"},\n\t\t{scsDefault, fCSPrint, \"\", int64(9223372036854775807), \"9223372036854775807\"},\n\t\t{scsDefault, fCSPrintln, \"\", uint8(255), \"255\\n\"},\n\t\t{scsDefault, fCSSdump, \"\", uint8(64), \"(uint8) 64\\n\"},\n\t\t{scsDefault, fCSSprint, \"\", complex(1, 2), \"(1+2i)\"},\n\t\t{scsDefault, fCSSprintf, \"%v\", complex(float32(3), 4), \"(3+4i)\"},\n\t\t{scsDefault, fCSSprintln, \"\", complex(float64(5), 6), \"(5+6i)\\n\"},\n\t\t{scsDefault, fCSErrorf, \"%#v\", uint16(65535), \"(uint16)65535\"},\n\t\t{scsDefault, fCSNewFormatter, \"%v\", uint32(4294967295), \"4294967295\"},\n\t\t{scsDefault, fErrorf, \"%v\", uint64(18446744073709551615), \"18446744073709551615\"},\n\t\t{scsDefault, fFprint, \"\", float32(3.14), \"3.14\"},\n\t\t{scsDefault, fFprintln, \"\", float64(6.28), \"6.28\\n\"},\n\t\t{scsDefault, fPrint, \"\", true, \"true\"},\n\t\t{scsDefault, fPrintln, \"\", false, \"false\\n\"},\n\t\t{scsDefault, fSdump, \"\", complex(-10, -20), \"(complex128) (-10-20i)\\n\"},\n\t\t{scsDefault, fSprint, \"\", complex(-1, -2), \"(-1-2i)\"},\n\t\t{scsDefault, fSprintf, \"%v\", complex(float32(-3), -4), \"(-3-4i)\"},\n\t\t{scsDefault, fSprintln, \"\", complex(float64(-5), -6), \"(-5-6i)\\n\"},\n\t\t{scsNoMethods, fCSFprint, \"\", ts, \"test\"},\n\t\t{scsNoMethods, fCSFprint, \"\", &ts, \"<*>test\"},\n\t\t{scsNoMethods, fCSFprint, \"\", tps, \"test\"},\n\t\t{scsNoMethods, fCSFprint, \"\", &tps, \"<*>test\"},\n\t\t{scsNoPmethods, fCSFprint, \"\", ts, \"stringer test\"},\n\t\t{scsNoPmethods, fCSFprint, \"\", &ts, \"<*>stringer test\"},\n\t\t{scsNoPmethods, fCSFprint, \"\", tps, \"test\"},\n\t\t{scsNoPmethods, fCSFprint, \"\", &tps, \"<*>stringer test\"},\n\t\t{scsMaxDepth, fCSFprint, \"\", dt, \"{{<max>} [<max>] [<max>] map[<max>]}\"},\n\t\t{scsMaxDepth, fCSFdump, \"\", dt, \"(spew_test.depthTester) {\\n\" +\n\t\t\t\" ic: (spew_test.indirCir1) {\\n  <max depth reached>\\n },\\n\" +\n\t\t\t\" arr: ([1]string) (len=1 cap=1) {\\n  <max depth reached>\\n },\\n\" +\n\t\t\t\" slice: ([]string) (len=1 cap=1) {\\n  <max depth reached>\\n },\\n\" +\n\t\t\t\" m: (map[string]int) (len=1) {\\n  <max depth reached>\\n }\\n}\\n\"},\n\t\t{scsContinue, fCSFprint, \"\", ts, \"(stringer test) test\"},\n\t\t{scsContinue, fCSFdump, \"\", ts, \"(spew_test.stringer) \" +\n\t\t\t\"(len=4) (stringer test) \\\"test\\\"\\n\"},\n\t\t{scsContinue, fCSFprint, \"\", te, \"(error: 10) 10\"},\n\t\t{scsContinue, fCSFdump, \"\", te, \"(spew_test.customError) \" +\n\t\t\t\"(error: 10) 10\\n\"},\n\t\t{scsNoPtrAddr, fCSFprint, \"\", tptr, \"<*>{<*>{}}\"},\n\t\t{scsNoPtrAddr, fCSSdump, \"\", tptr, \"(*spew_test.ptrTester)({\\ns: (*struct {})({\\n})\\n})\\n\"},\n\t\t{scsNoCap, fCSSdump, \"\", make([]string, 0, 10), \"([]string) {\\n}\\n\"},\n\t\t{scsNoCap, fCSSdump, \"\", make([]string, 1, 10), \"([]string) (len=1) {\\n(string) \\\"\\\"\\n}\\n\"},\n\t}\n}\n\n// TestSpew executes all of the tests described by spewTests.\nfunc TestSpew(t *testing.T) {\n\tinitSpewTests()\n\n\tt.Logf(\"Running %d tests\", len(spewTests))\n\tfor i, test := range spewTests {\n\t\tbuf := new(bytes.Buffer)\n\t\tswitch test.f {\n\t\tcase fCSFdump:\n\t\t\ttest.cs.Fdump(buf, test.in)\n\n\t\tcase fCSFprint:\n\t\t\ttest.cs.Fprint(buf, test.in)\n\n\t\tcase fCSFprintf:\n\t\t\ttest.cs.Fprintf(buf, test.format, test.in)\n\n\t\tcase fCSFprintln:\n\t\t\ttest.cs.Fprintln(buf, test.in)\n\n\t\tcase fCSPrint:\n\t\t\tb, err := redirStdout(func() { test.cs.Print(test.in) })\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"%v #%d %v\", test.f, i, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tbuf.Write(b)\n\n\t\tcase fCSPrintln:\n\t\t\tb, err := redirStdout(func() { test.cs.Println(test.in) })\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"%v #%d %v\", test.f, i, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tbuf.Write(b)\n\n\t\tcase fCSSdump:\n\t\t\tstr := test.cs.Sdump(test.in)\n\t\t\tbuf.WriteString(str)\n\n\t\tcase fCSSprint:\n\t\t\tstr := test.cs.Sprint(test.in)\n\t\t\tbuf.WriteString(str)\n\n\t\tcase fCSSprintf:\n\t\t\tstr := test.cs.Sprintf(test.format, test.in)\n\t\t\tbuf.WriteString(str)\n\n\t\tcase fCSSprintln:\n\t\t\tstr := test.cs.Sprintln(test.in)\n\t\t\tbuf.WriteString(str)\n\n\t\tcase fCSErrorf:\n\t\t\terr := test.cs.Errorf(test.format, test.in)\n\t\t\tbuf.WriteString(err.Error())\n\n\t\tcase fCSNewFormatter:\n\t\t\tfmt.Fprintf(buf, test.format, test.cs.NewFormatter(test.in))\n\n\t\tcase fErrorf:\n\t\t\terr := spew.Errorf(test.format, test.in)\n\t\t\tbuf.WriteString(err.Error())\n\n\t\tcase fFprint:\n\t\t\tspew.Fprint(buf, test.in)\n\n\t\tcase fFprintln:\n\t\t\tspew.Fprintln(buf, test.in)\n\n\t\tcase fPrint:\n\t\t\tb, err := redirStdout(func() { spew.Print(test.in) })\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"%v #%d %v\", test.f, i, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tbuf.Write(b)\n\n\t\tcase fPrintln:\n\t\t\tb, err := redirStdout(func() { spew.Println(test.in) })\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"%v #%d %v\", test.f, i, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tbuf.Write(b)\n\n\t\tcase fSdump:\n\t\t\tstr := spew.Sdump(test.in)\n\t\t\tbuf.WriteString(str)\n\n\t\tcase fSprint:\n\t\t\tstr := spew.Sprint(test.in)\n\t\t\tbuf.WriteString(str)\n\n\t\tcase fSprintf:\n\t\t\tstr := spew.Sprintf(test.format, test.in)\n\t\t\tbuf.WriteString(str)\n\n\t\tcase fSprintln:\n\t\t\tstr := spew.Sprintln(test.in)\n\t\t\tbuf.WriteString(str)\n\n\t\tdefault:\n\t\t\tt.Errorf(\"%v #%d unrecognized function\", test.f, i)\n\t\t\tcontinue\n\t\t}\n\t\ts := buf.String()\n\t\tif test.want != s {\n\t\t\tt.Errorf(\"ConfigState #%d\\n got: %s want: %s\", i, s, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "internal/spew/testdata/dumpcgo.go",
    "content": "// Copyright (c) 2013 Dave Collins <dave@davec.name>\n//\n// Permission to use, copy, modify, and distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n// NOTE: Due to the following build constraints, this file will only be compiled\n// when both cgo is supported and \"-tags testcgo\" is added to the go test\n// command line.  This code should really only be in the dumpcgo_test.go file,\n// but unfortunately Go will not allow cgo in test files, so this is a\n// workaround to allow cgo types to be tested.  This configuration is used\n// because spew itself does not require cgo to run even though it does handle\n// certain cgo types specially.  Rather than forcing all clients to require cgo\n// and an external C compiler just to run the tests, this scheme makes them\n// optional.\n//go:build cgo && testcgo\n// +build cgo,testcgo\n\npackage testdata\n\n/*\n#include <stdint.h>\ntypedef unsigned char custom_uchar_t;\n\nchar            *ncp = 0;\nchar            *cp = \"test\";\nchar             ca[6] = {'t', 'e', 's', 't', '2', '\\0'};\nunsigned char    uca[6] = {'t', 'e', 's', 't', '3', '\\0'};\nsigned char      sca[6] = {'t', 'e', 's', 't', '4', '\\0'};\nuint8_t          ui8ta[6] = {'t', 'e', 's', 't', '5', '\\0'};\ncustom_uchar_t   tuca[6] = {'t', 'e', 's', 't', '6', '\\0'};\n*/\nimport \"C\"\n\n// GetCgoNullCharPointer returns a null char pointer via cgo.  This is only\n// used for tests.\nfunc GetCgoNullCharPointer() interface{} {\n\treturn C.ncp\n}\n\n// GetCgoCharPointer returns a char pointer via cgo.  This is only used for\n// tests.\nfunc GetCgoCharPointer() interface{} {\n\treturn C.cp\n}\n\n// GetCgoCharArray returns a char array via cgo and the array's len and cap.\n// This is only used for tests.\nfunc GetCgoCharArray() (interface{}, int, int) {\n\treturn C.ca, len(C.ca), cap(C.ca)\n}\n\n// GetCgoUnsignedCharArray returns an unsigned char array via cgo and the\n// array's len and cap.  This is only used for tests.\nfunc GetCgoUnsignedCharArray() (interface{}, int, int) {\n\treturn C.uca, len(C.uca), cap(C.uca)\n}\n\n// GetCgoSignedCharArray returns a signed char array via cgo and the array's len\n// and cap.  This is only used for tests.\nfunc GetCgoSignedCharArray() (interface{}, int, int) {\n\treturn C.sca, len(C.sca), cap(C.sca)\n}\n\n// GetCgoUint8tArray returns a uint8_t array via cgo and the array's len and\n// cap.  This is only used for tests.\nfunc GetCgoUint8tArray() (interface{}, int, int) {\n\treturn C.ui8ta, len(C.ui8ta), cap(C.ui8ta)\n}\n\n// GetCgoTypedefedUnsignedCharArray returns a typedefed unsigned char array via\n// cgo and the array's len and cap.  This is only used for tests.\nfunc GetCgoTypedefedUnsignedCharArray() (interface{}, int, int) {\n\treturn C.tuca, len(C.tuca), cap(C.tuca)\n}\n"
  },
  {
    "path": "internal/testify/assert/assertion_compare.go",
    "content": "package assert\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"time\"\n)\n\n// Deprecated: CompareType has only ever been for internal use and has accidentally been published since v1.6.0. Do not use it.\ntype CompareType = compareResult\n\ntype compareResult int\n\nconst (\n\tcompareLess compareResult = iota - 1\n\tcompareEqual\n\tcompareGreater\n)\n\nvar (\n\tintType   = reflect.TypeOf(int(1))\n\tint8Type  = reflect.TypeOf(int8(1))\n\tint16Type = reflect.TypeOf(int16(1))\n\tint32Type = reflect.TypeOf(int32(1))\n\tint64Type = reflect.TypeOf(int64(1))\n\n\tuintType   = reflect.TypeOf(uint(1))\n\tuint8Type  = reflect.TypeOf(uint8(1))\n\tuint16Type = reflect.TypeOf(uint16(1))\n\tuint32Type = reflect.TypeOf(uint32(1))\n\tuint64Type = reflect.TypeOf(uint64(1))\n\n\tuintptrType = reflect.TypeOf(uintptr(1))\n\n\tfloat32Type = reflect.TypeOf(float32(1))\n\tfloat64Type = reflect.TypeOf(float64(1))\n\n\tstringType = reflect.TypeOf(\"\")\n\n\ttimeType  = reflect.TypeOf(time.Time{})\n\tbytesType = reflect.TypeOf([]byte{})\n)\n\nfunc compare(obj1, obj2 interface{}, kind reflect.Kind) (compareResult, bool) {\n\tobj1Value := reflect.ValueOf(obj1)\n\tobj2Value := reflect.ValueOf(obj2)\n\n\t// throughout this switch we try and avoid calling .Convert() if possible,\n\t// as this has a pretty big performance impact\n\tswitch kind {\n\tcase reflect.Int:\n\t\t{\n\t\t\tintobj1, ok := obj1.(int)\n\t\t\tif !ok {\n\t\t\t\tintobj1 = obj1Value.Convert(intType).Interface().(int)\n\t\t\t}\n\t\t\tintobj2, ok := obj2.(int)\n\t\t\tif !ok {\n\t\t\t\tintobj2 = obj2Value.Convert(intType).Interface().(int)\n\t\t\t}\n\t\t\tif intobj1 > intobj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif intobj1 == intobj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif intobj1 < intobj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\tcase reflect.Int8:\n\t\t{\n\t\t\tint8obj1, ok := obj1.(int8)\n\t\t\tif !ok {\n\t\t\t\tint8obj1 = obj1Value.Convert(int8Type).Interface().(int8)\n\t\t\t}\n\t\t\tint8obj2, ok := obj2.(int8)\n\t\t\tif !ok {\n\t\t\t\tint8obj2 = obj2Value.Convert(int8Type).Interface().(int8)\n\t\t\t}\n\t\t\tif int8obj1 > int8obj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif int8obj1 == int8obj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif int8obj1 < int8obj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\tcase reflect.Int16:\n\t\t{\n\t\t\tint16obj1, ok := obj1.(int16)\n\t\t\tif !ok {\n\t\t\t\tint16obj1 = obj1Value.Convert(int16Type).Interface().(int16)\n\t\t\t}\n\t\t\tint16obj2, ok := obj2.(int16)\n\t\t\tif !ok {\n\t\t\t\tint16obj2 = obj2Value.Convert(int16Type).Interface().(int16)\n\t\t\t}\n\t\t\tif int16obj1 > int16obj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif int16obj1 == int16obj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif int16obj1 < int16obj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\tcase reflect.Int32:\n\t\t{\n\t\t\tint32obj1, ok := obj1.(int32)\n\t\t\tif !ok {\n\t\t\t\tint32obj1 = obj1Value.Convert(int32Type).Interface().(int32)\n\t\t\t}\n\t\t\tint32obj2, ok := obj2.(int32)\n\t\t\tif !ok {\n\t\t\t\tint32obj2 = obj2Value.Convert(int32Type).Interface().(int32)\n\t\t\t}\n\t\t\tif int32obj1 > int32obj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif int32obj1 == int32obj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif int32obj1 < int32obj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\tcase reflect.Int64:\n\t\t{\n\t\t\tint64obj1, ok := obj1.(int64)\n\t\t\tif !ok {\n\t\t\t\tint64obj1 = obj1Value.Convert(int64Type).Interface().(int64)\n\t\t\t}\n\t\t\tint64obj2, ok := obj2.(int64)\n\t\t\tif !ok {\n\t\t\t\tint64obj2 = obj2Value.Convert(int64Type).Interface().(int64)\n\t\t\t}\n\t\t\tif int64obj1 > int64obj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif int64obj1 == int64obj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif int64obj1 < int64obj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\tcase reflect.Uint:\n\t\t{\n\t\t\tuintobj1, ok := obj1.(uint)\n\t\t\tif !ok {\n\t\t\t\tuintobj1 = obj1Value.Convert(uintType).Interface().(uint)\n\t\t\t}\n\t\t\tuintobj2, ok := obj2.(uint)\n\t\t\tif !ok {\n\t\t\t\tuintobj2 = obj2Value.Convert(uintType).Interface().(uint)\n\t\t\t}\n\t\t\tif uintobj1 > uintobj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif uintobj1 == uintobj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif uintobj1 < uintobj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\tcase reflect.Uint8:\n\t\t{\n\t\t\tuint8obj1, ok := obj1.(uint8)\n\t\t\tif !ok {\n\t\t\t\tuint8obj1 = obj1Value.Convert(uint8Type).Interface().(uint8)\n\t\t\t}\n\t\t\tuint8obj2, ok := obj2.(uint8)\n\t\t\tif !ok {\n\t\t\t\tuint8obj2 = obj2Value.Convert(uint8Type).Interface().(uint8)\n\t\t\t}\n\t\t\tif uint8obj1 > uint8obj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif uint8obj1 == uint8obj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif uint8obj1 < uint8obj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\tcase reflect.Uint16:\n\t\t{\n\t\t\tuint16obj1, ok := obj1.(uint16)\n\t\t\tif !ok {\n\t\t\t\tuint16obj1 = obj1Value.Convert(uint16Type).Interface().(uint16)\n\t\t\t}\n\t\t\tuint16obj2, ok := obj2.(uint16)\n\t\t\tif !ok {\n\t\t\t\tuint16obj2 = obj2Value.Convert(uint16Type).Interface().(uint16)\n\t\t\t}\n\t\t\tif uint16obj1 > uint16obj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif uint16obj1 == uint16obj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif uint16obj1 < uint16obj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\tcase reflect.Uint32:\n\t\t{\n\t\t\tuint32obj1, ok := obj1.(uint32)\n\t\t\tif !ok {\n\t\t\t\tuint32obj1 = obj1Value.Convert(uint32Type).Interface().(uint32)\n\t\t\t}\n\t\t\tuint32obj2, ok := obj2.(uint32)\n\t\t\tif !ok {\n\t\t\t\tuint32obj2 = obj2Value.Convert(uint32Type).Interface().(uint32)\n\t\t\t}\n\t\t\tif uint32obj1 > uint32obj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif uint32obj1 == uint32obj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif uint32obj1 < uint32obj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\tcase reflect.Uint64:\n\t\t{\n\t\t\tuint64obj1, ok := obj1.(uint64)\n\t\t\tif !ok {\n\t\t\t\tuint64obj1 = obj1Value.Convert(uint64Type).Interface().(uint64)\n\t\t\t}\n\t\t\tuint64obj2, ok := obj2.(uint64)\n\t\t\tif !ok {\n\t\t\t\tuint64obj2 = obj2Value.Convert(uint64Type).Interface().(uint64)\n\t\t\t}\n\t\t\tif uint64obj1 > uint64obj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif uint64obj1 == uint64obj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif uint64obj1 < uint64obj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\tcase reflect.Float32:\n\t\t{\n\t\t\tfloat32obj1, ok := obj1.(float32)\n\t\t\tif !ok {\n\t\t\t\tfloat32obj1 = obj1Value.Convert(float32Type).Interface().(float32)\n\t\t\t}\n\t\t\tfloat32obj2, ok := obj2.(float32)\n\t\t\tif !ok {\n\t\t\t\tfloat32obj2 = obj2Value.Convert(float32Type).Interface().(float32)\n\t\t\t}\n\t\t\tif float32obj1 > float32obj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif float32obj1 == float32obj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif float32obj1 < float32obj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\tcase reflect.Float64:\n\t\t{\n\t\t\tfloat64obj1, ok := obj1.(float64)\n\t\t\tif !ok {\n\t\t\t\tfloat64obj1 = obj1Value.Convert(float64Type).Interface().(float64)\n\t\t\t}\n\t\t\tfloat64obj2, ok := obj2.(float64)\n\t\t\tif !ok {\n\t\t\t\tfloat64obj2 = obj2Value.Convert(float64Type).Interface().(float64)\n\t\t\t}\n\t\t\tif float64obj1 > float64obj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif float64obj1 == float64obj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif float64obj1 < float64obj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\tcase reflect.String:\n\t\t{\n\t\t\tstringobj1, ok := obj1.(string)\n\t\t\tif !ok {\n\t\t\t\tstringobj1 = obj1Value.Convert(stringType).Interface().(string)\n\t\t\t}\n\t\t\tstringobj2, ok := obj2.(string)\n\t\t\tif !ok {\n\t\t\t\tstringobj2 = obj2Value.Convert(stringType).Interface().(string)\n\t\t\t}\n\t\t\tif stringobj1 > stringobj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif stringobj1 == stringobj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif stringobj1 < stringobj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\t// Check for known struct types we can check for compare results.\n\tcase reflect.Struct:\n\t\t{\n\t\t\t// All structs enter here. We're not interested in most types.\n\t\t\tif !obj1Value.CanConvert(timeType) {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// time.Time can be compared!\n\t\t\ttimeObj1, ok := obj1.(time.Time)\n\t\t\tif !ok {\n\t\t\t\ttimeObj1 = obj1Value.Convert(timeType).Interface().(time.Time)\n\t\t\t}\n\n\t\t\ttimeObj2, ok := obj2.(time.Time)\n\t\t\tif !ok {\n\t\t\t\ttimeObj2 = obj2Value.Convert(timeType).Interface().(time.Time)\n\t\t\t}\n\n\t\t\tif timeObj1.Before(timeObj2) {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t\tif timeObj1.Equal(timeObj2) {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\treturn compareGreater, true\n\t\t}\n\tcase reflect.Slice:\n\t\t{\n\t\t\t// We only care about the []byte type.\n\t\t\tif !obj1Value.CanConvert(bytesType) {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// []byte can be compared!\n\t\t\tbytesObj1, ok := obj1.([]byte)\n\t\t\tif !ok {\n\t\t\t\tbytesObj1 = obj1Value.Convert(bytesType).Interface().([]byte)\n\n\t\t\t}\n\t\t\tbytesObj2, ok := obj2.([]byte)\n\t\t\tif !ok {\n\t\t\t\tbytesObj2 = obj2Value.Convert(bytesType).Interface().([]byte)\n\t\t\t}\n\n\t\t\treturn compareResult(bytes.Compare(bytesObj1, bytesObj2)), true\n\t\t}\n\tcase reflect.Uintptr:\n\t\t{\n\t\t\tuintptrObj1, ok := obj1.(uintptr)\n\t\t\tif !ok {\n\t\t\t\tuintptrObj1 = obj1Value.Convert(uintptrType).Interface().(uintptr)\n\t\t\t}\n\t\t\tuintptrObj2, ok := obj2.(uintptr)\n\t\t\tif !ok {\n\t\t\t\tuintptrObj2 = obj2Value.Convert(uintptrType).Interface().(uintptr)\n\t\t\t}\n\t\t\tif uintptrObj1 > uintptrObj2 {\n\t\t\t\treturn compareGreater, true\n\t\t\t}\n\t\t\tif uintptrObj1 == uintptrObj2 {\n\t\t\t\treturn compareEqual, true\n\t\t\t}\n\t\t\tif uintptrObj1 < uintptrObj2 {\n\t\t\t\treturn compareLess, true\n\t\t\t}\n\t\t}\n\t}\n\n\treturn compareEqual, false\n}\n\n// Greater asserts that the first element is greater than the second\n//\n//\tassert.Greater(t, 2, 1)\n//\tassert.Greater(t, float64(2), float64(1))\n//\tassert.Greater(t, \"b\", \"a\")\nfunc Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn compareTwoValues(t, e1, e2, []compareResult{compareGreater}, \"\\\"%v\\\" is not greater than \\\"%v\\\"\", msgAndArgs...)\n}\n\n// GreaterOrEqual asserts that the first element is greater than or equal to the second\n//\n//\tassert.GreaterOrEqual(t, 2, 1)\n//\tassert.GreaterOrEqual(t, 2, 2)\n//\tassert.GreaterOrEqual(t, \"b\", \"a\")\n//\tassert.GreaterOrEqual(t, \"b\", \"b\")\nfunc GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn compareTwoValues(t, e1, e2, []compareResult{compareGreater, compareEqual}, \"\\\"%v\\\" is not greater than or equal to \\\"%v\\\"\", msgAndArgs...)\n}\n\n// Less asserts that the first element is less than the second\n//\n//\tassert.Less(t, 1, 2)\n//\tassert.Less(t, float64(1), float64(2))\n//\tassert.Less(t, \"a\", \"b\")\nfunc Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn compareTwoValues(t, e1, e2, []compareResult{compareLess}, \"\\\"%v\\\" is not less than \\\"%v\\\"\", msgAndArgs...)\n}\n\n// LessOrEqual asserts that the first element is less than or equal to the second\n//\n//\tassert.LessOrEqual(t, 1, 2)\n//\tassert.LessOrEqual(t, 2, 2)\n//\tassert.LessOrEqual(t, \"a\", \"b\")\n//\tassert.LessOrEqual(t, \"b\", \"b\")\nfunc LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn compareTwoValues(t, e1, e2, []compareResult{compareLess, compareEqual}, \"\\\"%v\\\" is not less than or equal to \\\"%v\\\"\", msgAndArgs...)\n}\n\n// Positive asserts that the specified element is positive\n//\n//\tassert.Positive(t, 1)\n//\tassert.Positive(t, 1.23)\nfunc Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tzero := reflect.Zero(reflect.TypeOf(e))\n\treturn compareTwoValues(t, e, zero.Interface(), []compareResult{compareGreater}, \"\\\"%v\\\" is not positive\", msgAndArgs...)\n}\n\n// Negative asserts that the specified element is negative\n//\n//\tassert.Negative(t, -1)\n//\tassert.Negative(t, -1.23)\nfunc Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tzero := reflect.Zero(reflect.TypeOf(e))\n\treturn compareTwoValues(t, e, zero.Interface(), []compareResult{compareLess}, \"\\\"%v\\\" is not negative\", msgAndArgs...)\n}\n\nfunc compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\te1Kind := reflect.ValueOf(e1).Kind()\n\te2Kind := reflect.ValueOf(e2).Kind()\n\tif e1Kind != e2Kind {\n\t\treturn Fail(t, \"Elements should be the same type\", msgAndArgs...)\n\t}\n\n\tcompareResult, isComparable := compare(e1, e2, e1Kind)\n\tif !isComparable {\n\t\treturn Fail(t, fmt.Sprintf(\"Can not compare type \\\"%s\\\"\", reflect.TypeOf(e1)), msgAndArgs...)\n\t}\n\n\tif !containsValue(allowedComparesResults, compareResult) {\n\t\treturn Fail(t, fmt.Sprintf(failMessage, e1, e2), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\nfunc containsValue(values []compareResult, value compareResult) bool {\n\tfor _, v := range values {\n\t\tif v == value {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "internal/testify/assert/assertion_compare_test.go",
    "content": "package assert\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"testing\"\n\t\"time\"\n)\n\nfunc TestCompare(t *testing.T) {\n\ttype customString string\n\ttype customInt int\n\ttype customInt8 int8\n\ttype customInt16 int16\n\ttype customInt32 int32\n\ttype customInt64 int64\n\ttype customUInt uint\n\ttype customUInt8 uint8\n\ttype customUInt16 uint16\n\ttype customUInt32 uint32\n\ttype customUInt64 uint64\n\ttype customFloat32 float32\n\ttype customFloat64 float64\n\ttype customUintptr uintptr\n\ttype customTime time.Time\n\ttype customBytes []byte\n\tfor _, currCase := range []struct {\n\t\tless    interface{}\n\t\tgreater interface{}\n\t\tcType   string\n\t}{\n\t\t{less: customString(\"a\"), greater: customString(\"b\"), cType: \"string\"},\n\t\t{less: \"a\", greater: \"b\", cType: \"string\"},\n\t\t{less: customInt(1), greater: customInt(2), cType: \"int\"},\n\t\t{less: int(1), greater: int(2), cType: \"int\"},\n\t\t{less: customInt8(1), greater: customInt8(2), cType: \"int8\"},\n\t\t{less: int8(1), greater: int8(2), cType: \"int8\"},\n\t\t{less: customInt16(1), greater: customInt16(2), cType: \"int16\"},\n\t\t{less: int16(1), greater: int16(2), cType: \"int16\"},\n\t\t{less: customInt32(1), greater: customInt32(2), cType: \"int32\"},\n\t\t{less: int32(1), greater: int32(2), cType: \"int32\"},\n\t\t{less: customInt64(1), greater: customInt64(2), cType: \"int64\"},\n\t\t{less: int64(1), greater: int64(2), cType: \"int64\"},\n\t\t{less: customUInt(1), greater: customUInt(2), cType: \"uint\"},\n\t\t{less: uint8(1), greater: uint8(2), cType: \"uint8\"},\n\t\t{less: customUInt8(1), greater: customUInt8(2), cType: \"uint8\"},\n\t\t{less: uint16(1), greater: uint16(2), cType: \"uint16\"},\n\t\t{less: customUInt16(1), greater: customUInt16(2), cType: \"uint16\"},\n\t\t{less: uint32(1), greater: uint32(2), cType: \"uint32\"},\n\t\t{less: customUInt32(1), greater: customUInt32(2), cType: \"uint32\"},\n\t\t{less: uint64(1), greater: uint64(2), cType: \"uint64\"},\n\t\t{less: customUInt64(1), greater: customUInt64(2), cType: \"uint64\"},\n\t\t{less: float32(1.23), greater: float32(2.34), cType: \"float32\"},\n\t\t{less: customFloat32(1.23), greater: customFloat32(2.23), cType: \"float32\"},\n\t\t{less: float64(1.23), greater: float64(2.34), cType: \"float64\"},\n\t\t{less: customFloat64(1.23), greater: customFloat64(2.34), cType: \"float64\"},\n\t\t{less: uintptr(1), greater: uintptr(2), cType: \"uintptr\"},\n\t\t{less: customUintptr(1), greater: customUintptr(2), cType: \"uint64\"},\n\t\t{less: time.Now(), greater: time.Now().Add(time.Hour), cType: \"time.Time\"},\n\t\t{less: time.Date(2024, 0, 0, 0, 0, 0, 0, time.Local), greater: time.Date(2263, 0, 0, 0, 0, 0, 0, time.Local), cType: \"time.Time\"},\n\t\t{less: customTime(time.Now()), greater: customTime(time.Now().Add(time.Hour)), cType: \"time.Time\"},\n\t\t{less: []byte{1, 1}, greater: []byte{1, 2}, cType: \"[]byte\"},\n\t\t{less: customBytes([]byte{1, 1}), greater: customBytes([]byte{1, 2}), cType: \"[]byte\"},\n\t} {\n\t\tresLess, isComparable := compare(currCase.less, currCase.greater, reflect.ValueOf(currCase.less).Kind())\n\t\tif !isComparable {\n\t\t\tt.Error(\"object should be comparable for type \" + currCase.cType)\n\t\t}\n\n\t\tif resLess != compareLess {\n\t\t\tt.Errorf(\"object less (%v) should be less than greater (%v) for type \"+currCase.cType,\n\t\t\t\tcurrCase.less, currCase.greater)\n\t\t}\n\n\t\tresGreater, isComparable := compare(currCase.greater, currCase.less, reflect.ValueOf(currCase.less).Kind())\n\t\tif !isComparable {\n\t\t\tt.Error(\"object are comparable for type \" + currCase.cType)\n\t\t}\n\n\t\tif resGreater != compareGreater {\n\t\t\tt.Errorf(\"object greater should be greater than less for type \" + currCase.cType)\n\t\t}\n\n\t\tresEqual, isComparable := compare(currCase.less, currCase.less, reflect.ValueOf(currCase.less).Kind())\n\t\tif !isComparable {\n\t\t\tt.Error(\"object are comparable for type \" + currCase.cType)\n\t\t}\n\n\t\tif resEqual != 0 {\n\t\t\tt.Errorf(\"objects should be equal for type \" + currCase.cType)\n\t\t}\n\t}\n}\n\ntype outputT struct {\n\tbuf     *bytes.Buffer\n\thelpers map[string]struct{}\n}\n\n// Implements TestingT\nfunc (t *outputT) Errorf(format string, args ...interface{}) {\n\ts := fmt.Sprintf(format, args...)\n\tt.buf.WriteString(s)\n}\n\nfunc (t *outputT) Helper() {\n\tif t.helpers == nil {\n\t\tt.helpers = make(map[string]struct{})\n\t}\n\tt.helpers[callerName(1)] = struct{}{}\n}\n\n// callerName gives the function name (qualified with a package path)\n// for the caller after skip frames (where 0 means the current function).\nfunc callerName(skip int) string {\n\t// Make room for the skip PC.\n\tvar pc [1]uintptr\n\tn := runtime.Callers(skip+2, pc[:]) // skip + runtime.Callers + callerName\n\tif n == 0 {\n\t\tpanic(\"testing: zero callers found\")\n\t}\n\tframes := runtime.CallersFrames(pc[:n])\n\tframe, _ := frames.Next()\n\treturn frame.Function\n}\n\nfunc TestGreater(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tif !Greater(mockT, 2, 1) {\n\t\tt.Error(\"Greater should return true\")\n\t}\n\n\tif Greater(mockT, 1, 1) {\n\t\tt.Error(\"Greater should return false\")\n\t}\n\n\tif Greater(mockT, 1, 2) {\n\t\tt.Error(\"Greater should return false\")\n\t}\n\n\t// Check error report\n\tfor _, currCase := range []struct {\n\t\tless    interface{}\n\t\tgreater interface{}\n\t\tmsg     string\n\t}{\n\t\t{less: \"a\", greater: \"b\", msg: `\"a\" is not greater than \"b\"`},\n\t\t{less: int(1), greater: int(2), msg: `\"1\" is not greater than \"2\"`},\n\t\t{less: int8(1), greater: int8(2), msg: `\"1\" is not greater than \"2\"`},\n\t\t{less: int16(1), greater: int16(2), msg: `\"1\" is not greater than \"2\"`},\n\t\t{less: int32(1), greater: int32(2), msg: `\"1\" is not greater than \"2\"`},\n\t\t{less: int64(1), greater: int64(2), msg: `\"1\" is not greater than \"2\"`},\n\t\t{less: uint8(1), greater: uint8(2), msg: `\"1\" is not greater than \"2\"`},\n\t\t{less: uint16(1), greater: uint16(2), msg: `\"1\" is not greater than \"2\"`},\n\t\t{less: uint32(1), greater: uint32(2), msg: `\"1\" is not greater than \"2\"`},\n\t\t{less: uint64(1), greater: uint64(2), msg: `\"1\" is not greater than \"2\"`},\n\t\t{less: float32(1.23), greater: float32(2.34), msg: `\"1.23\" is not greater than \"2.34\"`},\n\t\t{less: float64(1.23), greater: float64(2.34), msg: `\"1.23\" is not greater than \"2.34\"`},\n\t\t{less: uintptr(1), greater: uintptr(2), msg: `\"1\" is not greater than \"2\"`},\n\t\t{less: time.Time{}, greater: time.Time{}.Add(time.Hour), msg: `\"0001-01-01 00:00:00 +0000 UTC\" is not greater than \"0001-01-01 01:00:00 +0000 UTC\"`},\n\t\t{less: []byte{1, 1}, greater: []byte{1, 2}, msg: `\"[1 1]\" is not greater than \"[1 2]\"`},\n\t} {\n\t\tout := &outputT{buf: bytes.NewBuffer(nil)}\n\t\tFalse(t, Greater(out, currCase.less, currCase.greater))\n\t\tContains(t, out.buf.String(), currCase.msg)\n\t\tContains(t, out.helpers, \"github.com/expr-lang/expr/internal/testify/assert.Greater\")\n\t}\n}\n\nfunc TestGreaterOrEqual(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tif !GreaterOrEqual(mockT, 2, 1) {\n\t\tt.Error(\"GreaterOrEqual should return true\")\n\t}\n\n\tif !GreaterOrEqual(mockT, 1, 1) {\n\t\tt.Error(\"GreaterOrEqual should return true\")\n\t}\n\n\tif GreaterOrEqual(mockT, 1, 2) {\n\t\tt.Error(\"GreaterOrEqual should return false\")\n\t}\n\n\t// Check error report\n\tfor _, currCase := range []struct {\n\t\tless    interface{}\n\t\tgreater interface{}\n\t\tmsg     string\n\t}{\n\t\t{less: \"a\", greater: \"b\", msg: `\"a\" is not greater than or equal to \"b\"`},\n\t\t{less: int(1), greater: int(2), msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{less: int8(1), greater: int8(2), msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{less: int16(1), greater: int16(2), msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{less: int32(1), greater: int32(2), msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{less: int64(1), greater: int64(2), msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{less: uint8(1), greater: uint8(2), msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{less: uint16(1), greater: uint16(2), msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{less: uint32(1), greater: uint32(2), msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{less: uint64(1), greater: uint64(2), msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{less: float32(1.23), greater: float32(2.34), msg: `\"1.23\" is not greater than or equal to \"2.34\"`},\n\t\t{less: float64(1.23), greater: float64(2.34), msg: `\"1.23\" is not greater than or equal to \"2.34\"`},\n\t\t{less: uintptr(1), greater: uintptr(2), msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{less: time.Time{}, greater: time.Time{}.Add(time.Hour), msg: `\"0001-01-01 00:00:00 +0000 UTC\" is not greater than or equal to \"0001-01-01 01:00:00 +0000 UTC\"`},\n\t\t{less: []byte{1, 1}, greater: []byte{1, 2}, msg: `\"[1 1]\" is not greater than or equal to \"[1 2]\"`},\n\t} {\n\t\tout := &outputT{buf: bytes.NewBuffer(nil)}\n\t\tFalse(t, GreaterOrEqual(out, currCase.less, currCase.greater))\n\t\tContains(t, out.buf.String(), currCase.msg)\n\t\tContains(t, out.helpers, \"github.com/expr-lang/expr/internal/testify/assert.GreaterOrEqual\")\n\t}\n}\n\nfunc TestLess(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tif !Less(mockT, 1, 2) {\n\t\tt.Error(\"Less should return true\")\n\t}\n\n\tif Less(mockT, 1, 1) {\n\t\tt.Error(\"Less should return false\")\n\t}\n\n\tif Less(mockT, 2, 1) {\n\t\tt.Error(\"Less should return false\")\n\t}\n\n\t// Check error report\n\tfor _, currCase := range []struct {\n\t\tless    interface{}\n\t\tgreater interface{}\n\t\tmsg     string\n\t}{\n\t\t{less: \"a\", greater: \"b\", msg: `\"b\" is not less than \"a\"`},\n\t\t{less: int(1), greater: int(2), msg: `\"2\" is not less than \"1\"`},\n\t\t{less: int8(1), greater: int8(2), msg: `\"2\" is not less than \"1\"`},\n\t\t{less: int16(1), greater: int16(2), msg: `\"2\" is not less than \"1\"`},\n\t\t{less: int32(1), greater: int32(2), msg: `\"2\" is not less than \"1\"`},\n\t\t{less: int64(1), greater: int64(2), msg: `\"2\" is not less than \"1\"`},\n\t\t{less: uint8(1), greater: uint8(2), msg: `\"2\" is not less than \"1\"`},\n\t\t{less: uint16(1), greater: uint16(2), msg: `\"2\" is not less than \"1\"`},\n\t\t{less: uint32(1), greater: uint32(2), msg: `\"2\" is not less than \"1\"`},\n\t\t{less: uint64(1), greater: uint64(2), msg: `\"2\" is not less than \"1\"`},\n\t\t{less: float32(1.23), greater: float32(2.34), msg: `\"2.34\" is not less than \"1.23\"`},\n\t\t{less: float64(1.23), greater: float64(2.34), msg: `\"2.34\" is not less than \"1.23\"`},\n\t\t{less: uintptr(1), greater: uintptr(2), msg: `\"2\" is not less than \"1\"`},\n\t\t{less: time.Time{}, greater: time.Time{}.Add(time.Hour), msg: `\"0001-01-01 01:00:00 +0000 UTC\" is not less than \"0001-01-01 00:00:00 +0000 UTC\"`},\n\t\t{less: []byte{1, 1}, greater: []byte{1, 2}, msg: `\"[1 2]\" is not less than \"[1 1]\"`},\n\t} {\n\t\tout := &outputT{buf: bytes.NewBuffer(nil)}\n\t\tFalse(t, Less(out, currCase.greater, currCase.less))\n\t\tContains(t, out.buf.String(), currCase.msg)\n\t\tContains(t, out.helpers, \"github.com/expr-lang/expr/internal/testify/assert.Less\")\n\t}\n}\n\nfunc TestLessOrEqual(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tif !LessOrEqual(mockT, 1, 2) {\n\t\tt.Error(\"LessOrEqual should return true\")\n\t}\n\n\tif !LessOrEqual(mockT, 1, 1) {\n\t\tt.Error(\"LessOrEqual should return true\")\n\t}\n\n\tif LessOrEqual(mockT, 2, 1) {\n\t\tt.Error(\"LessOrEqual should return false\")\n\t}\n\n\t// Check error report\n\tfor _, currCase := range []struct {\n\t\tless    interface{}\n\t\tgreater interface{}\n\t\tmsg     string\n\t}{\n\t\t{less: \"a\", greater: \"b\", msg: `\"b\" is not less than or equal to \"a\"`},\n\t\t{less: int(1), greater: int(2), msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{less: int8(1), greater: int8(2), msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{less: int16(1), greater: int16(2), msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{less: int32(1), greater: int32(2), msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{less: int64(1), greater: int64(2), msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{less: uint8(1), greater: uint8(2), msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{less: uint16(1), greater: uint16(2), msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{less: uint32(1), greater: uint32(2), msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{less: uint64(1), greater: uint64(2), msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{less: float32(1.23), greater: float32(2.34), msg: `\"2.34\" is not less than or equal to \"1.23\"`},\n\t\t{less: float64(1.23), greater: float64(2.34), msg: `\"2.34\" is not less than or equal to \"1.23\"`},\n\t\t{less: uintptr(1), greater: uintptr(2), msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{less: time.Time{}, greater: time.Time{}.Add(time.Hour), msg: `\"0001-01-01 01:00:00 +0000 UTC\" is not less than or equal to \"0001-01-01 00:00:00 +0000 UTC\"`},\n\t\t{less: []byte{1, 1}, greater: []byte{1, 2}, msg: `\"[1 2]\" is not less than or equal to \"[1 1]\"`},\n\t} {\n\t\tout := &outputT{buf: bytes.NewBuffer(nil)}\n\t\tFalse(t, LessOrEqual(out, currCase.greater, currCase.less))\n\t\tContains(t, out.buf.String(), currCase.msg)\n\t\tContains(t, out.helpers, \"github.com/expr-lang/expr/internal/testify/assert.LessOrEqual\")\n\t}\n}\n\nfunc TestPositive(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tif !Positive(mockT, 1) {\n\t\tt.Error(\"Positive should return true\")\n\t}\n\n\tif !Positive(mockT, 1.23) {\n\t\tt.Error(\"Positive should return true\")\n\t}\n\n\tif Positive(mockT, -1) {\n\t\tt.Error(\"Positive should return false\")\n\t}\n\n\tif Positive(mockT, -1.23) {\n\t\tt.Error(\"Positive should return false\")\n\t}\n\n\t// Check error report\n\tfor _, currCase := range []struct {\n\t\te   interface{}\n\t\tmsg string\n\t}{\n\t\t{e: int(-1), msg: `\"-1\" is not positive`},\n\t\t{e: int8(-1), msg: `\"-1\" is not positive`},\n\t\t{e: int16(-1), msg: `\"-1\" is not positive`},\n\t\t{e: int32(-1), msg: `\"-1\" is not positive`},\n\t\t{e: int64(-1), msg: `\"-1\" is not positive`},\n\t\t{e: float32(-1.23), msg: `\"-1.23\" is not positive`},\n\t\t{e: float64(-1.23), msg: `\"-1.23\" is not positive`},\n\t} {\n\t\tout := &outputT{buf: bytes.NewBuffer(nil)}\n\t\tFalse(t, Positive(out, currCase.e))\n\t\tContains(t, out.buf.String(), currCase.msg)\n\t\tContains(t, out.helpers, \"github.com/expr-lang/expr/internal/testify/assert.Positive\")\n\t}\n}\n\nfunc TestNegative(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tif !Negative(mockT, -1) {\n\t\tt.Error(\"Negative should return true\")\n\t}\n\n\tif !Negative(mockT, -1.23) {\n\t\tt.Error(\"Negative should return true\")\n\t}\n\n\tif Negative(mockT, 1) {\n\t\tt.Error(\"Negative should return false\")\n\t}\n\n\tif Negative(mockT, 1.23) {\n\t\tt.Error(\"Negative should return false\")\n\t}\n\n\t// Check error report\n\tfor _, currCase := range []struct {\n\t\te   interface{}\n\t\tmsg string\n\t}{\n\t\t{e: int(1), msg: `\"1\" is not negative`},\n\t\t{e: int8(1), msg: `\"1\" is not negative`},\n\t\t{e: int16(1), msg: `\"1\" is not negative`},\n\t\t{e: int32(1), msg: `\"1\" is not negative`},\n\t\t{e: int64(1), msg: `\"1\" is not negative`},\n\t\t{e: float32(1.23), msg: `\"1.23\" is not negative`},\n\t\t{e: float64(1.23), msg: `\"1.23\" is not negative`},\n\t} {\n\t\tout := &outputT{buf: bytes.NewBuffer(nil)}\n\t\tFalse(t, Negative(out, currCase.e))\n\t\tContains(t, out.buf.String(), currCase.msg)\n\t\tContains(t, out.helpers, \"github.com/expr-lang/expr/internal/testify/assert.Negative\")\n\t}\n}\n\nfunc Test_compareTwoValuesDifferentValuesTypes(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tfor _, currCase := range []struct {\n\t\tv1            interface{}\n\t\tv2            interface{}\n\t\tcompareResult bool\n\t}{\n\t\t{v1: 123, v2: \"abc\"},\n\t\t{v1: \"abc\", v2: 123456},\n\t\t{v1: float64(12), v2: \"123\"},\n\t\t{v1: \"float(12)\", v2: float64(1)},\n\t} {\n\t\tresult := compareTwoValues(mockT, currCase.v1, currCase.v2, []compareResult{compareLess, compareEqual, compareGreater}, \"testFailMessage\")\n\t\tFalse(t, result)\n\t}\n}\n\nfunc Test_compareTwoValuesNotComparableValues(t *testing.T) {\n\tmockT := new(testing.T)\n\n\ttype CompareStruct struct {\n\t}\n\n\tfor _, currCase := range []struct {\n\t\tv1 interface{}\n\t\tv2 interface{}\n\t}{\n\t\t{v1: CompareStruct{}, v2: CompareStruct{}},\n\t\t{v1: map[string]int{}, v2: map[string]int{}},\n\t\t{v1: make([]int, 5), v2: make([]int, 5)},\n\t} {\n\t\tresult := compareTwoValues(mockT, currCase.v1, currCase.v2, []compareResult{compareLess, compareEqual, compareGreater}, \"testFailMessage\")\n\t\tFalse(t, result)\n\t}\n}\n\nfunc Test_compareTwoValuesCorrectCompareResult(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tfor _, currCase := range []struct {\n\t\tv1             interface{}\n\t\tv2             interface{}\n\t\tallowedResults []compareResult\n\t}{\n\t\t{v1: 1, v2: 2, allowedResults: []compareResult{compareLess}},\n\t\t{v1: 1, v2: 2, allowedResults: []compareResult{compareLess, compareEqual}},\n\t\t{v1: 2, v2: 2, allowedResults: []compareResult{compareGreater, compareEqual}},\n\t\t{v1: 2, v2: 2, allowedResults: []compareResult{compareEqual}},\n\t\t{v1: 2, v2: 1, allowedResults: []compareResult{compareEqual, compareGreater}},\n\t\t{v1: 2, v2: 1, allowedResults: []compareResult{compareGreater}},\n\t} {\n\t\tresult := compareTwoValues(mockT, currCase.v1, currCase.v2, currCase.allowedResults, \"testFailMessage\")\n\t\tTrue(t, result)\n\t}\n}\n\nfunc Test_containsValue(t *testing.T) {\n\tfor _, currCase := range []struct {\n\t\tvalues []compareResult\n\t\tvalue  compareResult\n\t\tresult bool\n\t}{\n\t\t{values: []compareResult{compareGreater}, value: compareGreater, result: true},\n\t\t{values: []compareResult{compareGreater, compareLess}, value: compareGreater, result: true},\n\t\t{values: []compareResult{compareGreater, compareLess}, value: compareLess, result: true},\n\t\t{values: []compareResult{compareGreater, compareLess}, value: compareEqual, result: false},\n\t} {\n\t\tresult := containsValue(currCase.values, currCase.value)\n\t\tEqual(t, currCase.result, result)\n\t}\n}\n\nfunc TestComparingMsgAndArgsForwarding(t *testing.T) {\n\tmsgAndArgs := []interface{}{\"format %s %x\", \"this\", 0xc001}\n\texpectedOutput := \"format this c001\\n\"\n\tfuncs := []func(t TestingT){\n\t\tfunc(t TestingT) { Greater(t, 1, 2, msgAndArgs...) },\n\t\tfunc(t TestingT) { GreaterOrEqual(t, 1, 2, msgAndArgs...) },\n\t\tfunc(t TestingT) { Less(t, 2, 1, msgAndArgs...) },\n\t\tfunc(t TestingT) { LessOrEqual(t, 2, 1, msgAndArgs...) },\n\t\tfunc(t TestingT) { Positive(t, 0, msgAndArgs...) },\n\t\tfunc(t TestingT) { Negative(t, 0, msgAndArgs...) },\n\t}\n\tfor _, f := range funcs {\n\t\tout := &outputT{buf: bytes.NewBuffer(nil)}\n\t\tf(out)\n\t\tContains(t, out.buf.String(), expectedOutput)\n\t}\n}\n"
  },
  {
    "path": "internal/testify/assert/assertion_format.go",
    "content": "// Code generated with github.com/expr-lang/expr/internal/_codegen; DO NOT EDIT.\n\npackage assert\n\nimport (\n\thttp \"net/http\"\n\turl \"net/url\"\n\ttime \"time\"\n)\n\n// Conditionf uses a Comparison to assert a complex condition.\nfunc Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Condition(t, comp, append([]interface{}{msg}, args...)...)\n}\n\n// Containsf asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//\tassert.Containsf(t, \"Hello World\", \"World\", \"error message %s\", \"formatted\")\n//\tassert.Containsf(t, [\"Hello\", \"World\"], \"World\", \"error message %s\", \"formatted\")\n//\tassert.Containsf(t, {\"Hello\": \"World\"}, \"Hello\", \"error message %s\", \"formatted\")\nfunc Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Contains(t, s, contains, append([]interface{}{msg}, args...)...)\n}\n\n// DirExistsf checks whether a directory exists in the given path. It also fails\n// if the path is a file rather a directory or there is an error checking whether it exists.\nfunc DirExistsf(t TestingT, path string, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn DirExists(t, path, append([]interface{}{msg}, args...)...)\n}\n\n// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified\n// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,\n// the number of appearances of each of them in both lists should match.\n//\n// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], \"error message %s\", \"formatted\")\nfunc ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn ElementsMatch(t, listA, listB, append([]interface{}{msg}, args...)...)\n}\n\n// Emptyf asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\tassert.Emptyf(t, obj, \"error message %s\", \"formatted\")\nfunc Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Empty(t, object, append([]interface{}{msg}, args...)...)\n}\n\n// Equalf asserts that two objects are equal.\n//\n//\tassert.Equalf(t, 123, 123, \"error message %s\", \"formatted\")\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Equal(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// EqualErrorf asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//\tactualObj, err := SomeFunction()\n//\tassert.EqualErrorf(t, err,  expectedErrorString, \"error message %s\", \"formatted\")\nfunc EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn EqualError(t, theError, errString, append([]interface{}{msg}, args...)...)\n}\n\n// EqualExportedValuesf asserts that the types of two objects are equal and their public\n// fields are also equal. This is useful for comparing structs that have private fields\n// that could potentially differ.\n//\n//\t type S struct {\n//\t\tExported     \tint\n//\t\tnotExported   \tint\n//\t }\n//\t assert.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, \"error message %s\", \"formatted\") => true\n//\t assert.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, \"error message %s\", \"formatted\") => false\nfunc EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn EqualExportedValues(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// EqualValuesf asserts that two objects are equal or convertible to the same types\n// and equal.\n//\n//\tassert.EqualValuesf(t, uint32(123), int32(123), \"error message %s\", \"formatted\")\nfunc EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn EqualValues(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// Errorf asserts that a function returned an error (i.e. not `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if assert.Errorf(t, err, \"error message %s\", \"formatted\") {\n//\t\t   assert.Equal(t, expectedErrorf, err)\n//\t  }\nfunc Errorf(t TestingT, err error, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Error(t, err, append([]interface{}{msg}, args...)...)\n}\n\n// ErrorAsf asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value.\n// This is a wrapper for errors.As.\nfunc ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn ErrorAs(t, err, target, append([]interface{}{msg}, args...)...)\n}\n\n// ErrorContainsf asserts that a function returned an error (i.e. not `nil`)\n// and that the error contains the specified substring.\n//\n//\tactualObj, err := SomeFunction()\n//\tassert.ErrorContainsf(t, err,  expectedErrorSubString, \"error message %s\", \"formatted\")\nfunc ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn ErrorContains(t, theError, contains, append([]interface{}{msg}, args...)...)\n}\n\n// ErrorIsf asserts that at least one of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc ErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn ErrorIs(t, err, target, append([]interface{}{msg}, args...)...)\n}\n\n// Eventuallyf asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick.\n//\n//\tassert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, \"error message %s\", \"formatted\")\nfunc Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Eventually(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...)\n}\n\n// EventuallyWithTf asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick. In contrast to Eventually,\n// it supplies a CollectT to the condition function, so that the condition\n// function can use the CollectT to call other assertions.\n// The condition is considered \"met\" if no errors are raised in a tick.\n// The supplied CollectT collects all errors from one tick (if there are any).\n// If the condition is not met before waitFor, the collected errors of\n// the last tick are copied to t.\n//\n//\texternalValue := false\n//\tgo func() {\n//\t\ttime.Sleep(8*time.Second)\n//\t\texternalValue = true\n//\t}()\n//\tassert.EventuallyWithTf(t, func(c *assert.CollectT, \"error message %s\", \"formatted\") {\n//\t\t// add assertions as needed; any assertion failure will fail the current tick\n//\t\tassert.True(c, externalValue, \"expected 'externalValue' to be true\")\n//\t}, 10*time.Second, 1*time.Second, \"external state has not changed to 'true'; still false\")\nfunc EventuallyWithTf(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn EventuallyWithT(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...)\n}\n\n// Exactlyf asserts that two objects are equal in value and type.\n//\n//\tassert.Exactlyf(t, int32(123), int64(123), \"error message %s\", \"formatted\")\nfunc Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Exactly(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// Failf reports a failure through\nfunc Failf(t TestingT, failureMessage string, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Fail(t, failureMessage, append([]interface{}{msg}, args...)...)\n}\n\n// FailNowf fails test\nfunc FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn FailNow(t, failureMessage, append([]interface{}{msg}, args...)...)\n}\n\n// Falsef asserts that the specified value is false.\n//\n//\tassert.Falsef(t, myBool, \"error message %s\", \"formatted\")\nfunc Falsef(t TestingT, value bool, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn False(t, value, append([]interface{}{msg}, args...)...)\n}\n\n// FileExistsf checks whether a file exists in the given path. It also fails if\n// the path points to a directory or there is an error when trying to check the file.\nfunc FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn FileExists(t, path, append([]interface{}{msg}, args...)...)\n}\n\n// Greaterf asserts that the first element is greater than the second\n//\n//\tassert.Greaterf(t, 2, 1, \"error message %s\", \"formatted\")\n//\tassert.Greaterf(t, float64(2), float64(1), \"error message %s\", \"formatted\")\n//\tassert.Greaterf(t, \"b\", \"a\", \"error message %s\", \"formatted\")\nfunc Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Greater(t, e1, e2, append([]interface{}{msg}, args...)...)\n}\n\n// GreaterOrEqualf asserts that the first element is greater than or equal to the second\n//\n//\tassert.GreaterOrEqualf(t, 2, 1, \"error message %s\", \"formatted\")\n//\tassert.GreaterOrEqualf(t, 2, 2, \"error message %s\", \"formatted\")\n//\tassert.GreaterOrEqualf(t, \"b\", \"a\", \"error message %s\", \"formatted\")\n//\tassert.GreaterOrEqualf(t, \"b\", \"b\", \"error message %s\", \"formatted\")\nfunc GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn GreaterOrEqual(t, e1, e2, append([]interface{}{msg}, args...)...)\n}\n\n// HTTPBodyContainsf asserts that a specified handler returns a\n// body that contains a string.\n//\n//\tassert.HTTPBodyContainsf(t, myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPBodyContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...)\n}\n\n// HTTPBodyNotContainsf asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//\tassert.HTTPBodyNotContainsf(t, myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPBodyNotContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...)\n}\n\n// HTTPErrorf asserts that a specified handler returns an error status code.\n//\n//\tassert.HTTPErrorf(t, myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPError(t, handler, method, url, values, append([]interface{}{msg}, args...)...)\n}\n\n// HTTPRedirectf asserts that a specified handler returns a redirect status code.\n//\n//\tassert.HTTPRedirectf(t, myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPRedirect(t, handler, method, url, values, append([]interface{}{msg}, args...)...)\n}\n\n// HTTPStatusCodef asserts that a specified handler returns a specified status code.\n//\n//\tassert.HTTPStatusCodef(t, myHandler, \"GET\", \"/notImplemented\", nil, 501, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPStatusCode(t, handler, method, url, values, statuscode, append([]interface{}{msg}, args...)...)\n}\n\n// HTTPSuccessf asserts that a specified handler returns a success status code.\n//\n//\tassert.HTTPSuccessf(t, myHandler, \"POST\", \"http://www.google.com\", nil, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPSuccess(t, handler, method, url, values, append([]interface{}{msg}, args...)...)\n}\n\n// Implementsf asserts that an object is implemented by the specified interface.\n//\n//\tassert.Implementsf(t, (*MyInterface)(nil), new(MyObject), \"error message %s\", \"formatted\")\nfunc Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Implements(t, interfaceObject, object, append([]interface{}{msg}, args...)...)\n}\n\n// InDeltaf asserts that the two numerals are within delta of each other.\n//\n//\tassert.InDeltaf(t, math.Pi, 22/7.0, 0.01, \"error message %s\", \"formatted\")\nfunc InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InDelta(t, expected, actual, delta, append([]interface{}{msg}, args...)...)\n}\n\n// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.\nfunc InDeltaMapValuesf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InDeltaMapValues(t, expected, actual, delta, append([]interface{}{msg}, args...)...)\n}\n\n// InDeltaSlicef is the same as InDelta, except it compares two slices.\nfunc InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InDeltaSlice(t, expected, actual, delta, append([]interface{}{msg}, args...)...)\n}\n\n// InEpsilonf asserts that expected and actual have a relative error less than epsilon\nfunc InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InEpsilon(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...)\n}\n\n// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices.\nfunc InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InEpsilonSlice(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...)\n}\n\n// IsDecreasingf asserts that the collection is decreasing\n//\n//\tassert.IsDecreasingf(t, []int{2, 1, 0}, \"error message %s\", \"formatted\")\n//\tassert.IsDecreasingf(t, []float{2, 1}, \"error message %s\", \"formatted\")\n//\tassert.IsDecreasingf(t, []string{\"b\", \"a\"}, \"error message %s\", \"formatted\")\nfunc IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsDecreasing(t, object, append([]interface{}{msg}, args...)...)\n}\n\n// IsIncreasingf asserts that the collection is increasing\n//\n//\tassert.IsIncreasingf(t, []int{1, 2, 3}, \"error message %s\", \"formatted\")\n//\tassert.IsIncreasingf(t, []float{1, 2}, \"error message %s\", \"formatted\")\n//\tassert.IsIncreasingf(t, []string{\"a\", \"b\"}, \"error message %s\", \"formatted\")\nfunc IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsIncreasing(t, object, append([]interface{}{msg}, args...)...)\n}\n\n// IsNonDecreasingf asserts that the collection is not decreasing\n//\n//\tassert.IsNonDecreasingf(t, []int{1, 1, 2}, \"error message %s\", \"formatted\")\n//\tassert.IsNonDecreasingf(t, []float{1, 2}, \"error message %s\", \"formatted\")\n//\tassert.IsNonDecreasingf(t, []string{\"a\", \"b\"}, \"error message %s\", \"formatted\")\nfunc IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsNonDecreasing(t, object, append([]interface{}{msg}, args...)...)\n}\n\n// IsNonIncreasingf asserts that the collection is not increasing\n//\n//\tassert.IsNonIncreasingf(t, []int{2, 1, 1}, \"error message %s\", \"formatted\")\n//\tassert.IsNonIncreasingf(t, []float{2, 1}, \"error message %s\", \"formatted\")\n//\tassert.IsNonIncreasingf(t, []string{\"b\", \"a\"}, \"error message %s\", \"formatted\")\nfunc IsNonIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsNonIncreasing(t, object, append([]interface{}{msg}, args...)...)\n}\n\n// IsTypef asserts that the specified objects are of the same type.\nfunc IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsType(t, expectedType, object, append([]interface{}{msg}, args...)...)\n}\n\n// JSONEqf asserts that two JSON strings are equivalent.\n//\n//\tassert.JSONEqf(t, `{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`, \"error message %s\", \"formatted\")\nfunc JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// Lenf asserts that the specified object has specific length.\n// Lenf also fails if the object has a type that len() not accept.\n//\n//\tassert.Lenf(t, mySlice, 3, \"error message %s\", \"formatted\")\nfunc Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Len(t, object, length, append([]interface{}{msg}, args...)...)\n}\n\n// Lessf asserts that the first element is less than the second\n//\n//\tassert.Lessf(t, 1, 2, \"error message %s\", \"formatted\")\n//\tassert.Lessf(t, float64(1), float64(2), \"error message %s\", \"formatted\")\n//\tassert.Lessf(t, \"a\", \"b\", \"error message %s\", \"formatted\")\nfunc Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Less(t, e1, e2, append([]interface{}{msg}, args...)...)\n}\n\n// LessOrEqualf asserts that the first element is less than or equal to the second\n//\n//\tassert.LessOrEqualf(t, 1, 2, \"error message %s\", \"formatted\")\n//\tassert.LessOrEqualf(t, 2, 2, \"error message %s\", \"formatted\")\n//\tassert.LessOrEqualf(t, \"a\", \"b\", \"error message %s\", \"formatted\")\n//\tassert.LessOrEqualf(t, \"b\", \"b\", \"error message %s\", \"formatted\")\nfunc LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn LessOrEqual(t, e1, e2, append([]interface{}{msg}, args...)...)\n}\n\n// Negativef asserts that the specified element is negative\n//\n//\tassert.Negativef(t, -1, \"error message %s\", \"formatted\")\n//\tassert.Negativef(t, -1.23, \"error message %s\", \"formatted\")\nfunc Negativef(t TestingT, e interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Negative(t, e, append([]interface{}{msg}, args...)...)\n}\n\n// Neverf asserts that the given condition doesn't satisfy in waitFor time,\n// periodically checking the target function each tick.\n//\n//\tassert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, \"error message %s\", \"formatted\")\nfunc Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Never(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...)\n}\n\n// Nilf asserts that the specified object is nil.\n//\n//\tassert.Nilf(t, err, \"error message %s\", \"formatted\")\nfunc Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Nil(t, object, append([]interface{}{msg}, args...)...)\n}\n\n// NoDirExistsf checks whether a directory does not exist in the given path.\n// It fails if the path points to an existing _directory_ only.\nfunc NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NoDirExists(t, path, append([]interface{}{msg}, args...)...)\n}\n\n// NoErrorf asserts that a function returned no error (i.e. `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if assert.NoErrorf(t, err, \"error message %s\", \"formatted\") {\n//\t\t   assert.Equal(t, expectedObj, actualObj)\n//\t  }\nfunc NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NoError(t, err, append([]interface{}{msg}, args...)...)\n}\n\n// NoFileExistsf checks whether a file does not exist in a given path. It fails\n// if the path points to an existing _file_ only.\nfunc NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NoFileExists(t, path, append([]interface{}{msg}, args...)...)\n}\n\n// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//\tassert.NotContainsf(t, \"Hello World\", \"Earth\", \"error message %s\", \"formatted\")\n//\tassert.NotContainsf(t, [\"Hello\", \"World\"], \"Earth\", \"error message %s\", \"formatted\")\n//\tassert.NotContainsf(t, {\"Hello\": \"World\"}, \"Earth\", \"error message %s\", \"formatted\")\nfunc NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotContains(t, s, contains, append([]interface{}{msg}, args...)...)\n}\n\n// NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\tif assert.NotEmptyf(t, obj, \"error message %s\", \"formatted\") {\n//\t  assert.Equal(t, \"two\", obj[1])\n//\t}\nfunc NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotEmpty(t, object, append([]interface{}{msg}, args...)...)\n}\n\n// NotEqualf asserts that the specified values are NOT equal.\n//\n//\tassert.NotEqualf(t, obj1, obj2, \"error message %s\", \"formatted\")\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// NotEqualValuesf asserts that two objects are not equal even when converted to the same type\n//\n//\tassert.NotEqualValuesf(t, obj1, obj2, \"error message %s\", \"formatted\")\nfunc NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotEqualValues(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// NotErrorIsf asserts that at none of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotErrorIs(t, err, target, append([]interface{}{msg}, args...)...)\n}\n\n// NotImplementsf asserts that an object does not implement the specified interface.\n//\n//\tassert.NotImplementsf(t, (*MyInterface)(nil), new(MyObject), \"error message %s\", \"formatted\")\nfunc NotImplementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotImplements(t, interfaceObject, object, append([]interface{}{msg}, args...)...)\n}\n\n// NotNilf asserts that the specified object is not nil.\n//\n//\tassert.NotNilf(t, err, \"error message %s\", \"formatted\")\nfunc NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotNil(t, object, append([]interface{}{msg}, args...)...)\n}\n\n// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//\tassert.NotPanicsf(t, func(){ RemainCalm() }, \"error message %s\", \"formatted\")\nfunc NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotPanics(t, f, append([]interface{}{msg}, args...)...)\n}\n\n// NotRegexpf asserts that a specified regexp does not match a string.\n//\n//\tassert.NotRegexpf(t, regexp.MustCompile(\"starts\"), \"it's starting\", \"error message %s\", \"formatted\")\n//\tassert.NotRegexpf(t, \"^start\", \"it's not starting\", \"error message %s\", \"formatted\")\nfunc NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...)\n}\n\n// NotSamef asserts that two pointers do not reference the same object.\n//\n//\tassert.NotSamef(t, ptr1, ptr2, \"error message %s\", \"formatted\")\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc NotSamef(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotSame(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// NotSubsetf asserts that the specified list(array, slice...) or map does NOT\n// contain all elements given in the specified subset list(array, slice...) or\n// map.\n//\n//\tassert.NotSubsetf(t, [1, 3, 4], [1, 2], \"error message %s\", \"formatted\")\n//\tassert.NotSubsetf(t, {\"x\": 1, \"y\": 2}, {\"z\": 3}, \"error message %s\", \"formatted\")\nfunc NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotSubset(t, list, subset, append([]interface{}{msg}, args...)...)\n}\n\n// NotZerof asserts that i is not the zero value for its type.\nfunc NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotZero(t, i, append([]interface{}{msg}, args...)...)\n}\n\n// Panicsf asserts that the code inside the specified PanicTestFunc panics.\n//\n//\tassert.Panicsf(t, func(){ GoCrazy() }, \"error message %s\", \"formatted\")\nfunc Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Panics(t, f, append([]interface{}{msg}, args...)...)\n}\n\n// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc\n// panics, and that the recovered panic value is an error that satisfies the\n// EqualError comparison.\n//\n//\tassert.PanicsWithErrorf(t, \"crazy error\", func(){ GoCrazy() }, \"error message %s\", \"formatted\")\nfunc PanicsWithErrorf(t TestingT, errString string, f PanicTestFunc, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn PanicsWithError(t, errString, f, append([]interface{}{msg}, args...)...)\n}\n\n// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//\tassert.PanicsWithValuef(t, \"crazy error\", func(){ GoCrazy() }, \"error message %s\", \"formatted\")\nfunc PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...)\n}\n\n// Positivef asserts that the specified element is positive\n//\n//\tassert.Positivef(t, 1, \"error message %s\", \"formatted\")\n//\tassert.Positivef(t, 1.23, \"error message %s\", \"formatted\")\nfunc Positivef(t TestingT, e interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Positive(t, e, append([]interface{}{msg}, args...)...)\n}\n\n// Regexpf asserts that a specified regexp matches a string.\n//\n//\tassert.Regexpf(t, regexp.MustCompile(\"start\"), \"it's starting\", \"error message %s\", \"formatted\")\n//\tassert.Regexpf(t, \"start...$\", \"it's not starting\", \"error message %s\", \"formatted\")\nfunc Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Regexp(t, rx, str, append([]interface{}{msg}, args...)...)\n}\n\n// Samef asserts that two pointers reference the same object.\n//\n//\tassert.Samef(t, ptr1, ptr2, \"error message %s\", \"formatted\")\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc Samef(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Same(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// Subsetf asserts that the specified list(array, slice...) or map contains all\n// elements given in the specified subset list(array, slice...) or map.\n//\n//\tassert.Subsetf(t, [1, 2, 3], [1, 2], \"error message %s\", \"formatted\")\n//\tassert.Subsetf(t, {\"x\": 1, \"y\": 2}, {\"x\": 1}, \"error message %s\", \"formatted\")\nfunc Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Subset(t, list, subset, append([]interface{}{msg}, args...)...)\n}\n\n// Truef asserts that the specified value is true.\n//\n//\tassert.Truef(t, myBool, \"error message %s\", \"formatted\")\nfunc Truef(t TestingT, value bool, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn True(t, value, append([]interface{}{msg}, args...)...)\n}\n\n// WithinDurationf asserts that the two times are within duration delta of each other.\n//\n//\tassert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, \"error message %s\", \"formatted\")\nfunc WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...)\n}\n\n// WithinRangef asserts that a time is within a time range (inclusive).\n//\n//\tassert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), \"error message %s\", \"formatted\")\nfunc WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn WithinRange(t, actual, start, end, append([]interface{}{msg}, args...)...)\n}\n\n// Zerof asserts that i is the zero value for its type.\nfunc Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Zero(t, i, append([]interface{}{msg}, args...)...)\n}\n"
  },
  {
    "path": "internal/testify/assert/assertion_format.go.tmpl",
    "content": "{{.CommentFormat}}\nfunc {{.DocInfo.Name}}f(t TestingT, {{.ParamsFormat}}) bool {\n\tif h, ok := t.(tHelper); ok { h.Helper() }\n\treturn {{.DocInfo.Name}}(t, {{.ForwardedParamsFormat}})\n}\n"
  },
  {
    "path": "internal/testify/assert/assertion_forward.go",
    "content": "// Code generated with github.com/expr-lang/expr/internal/_codegen; DO NOT EDIT.\n\npackage assert\n\nimport (\n\thttp \"net/http\"\n\turl \"net/url\"\n\ttime \"time\"\n)\n\n// Condition uses a Comparison to assert a complex condition.\nfunc (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Condition(a.t, comp, msgAndArgs...)\n}\n\n// Conditionf uses a Comparison to assert a complex condition.\nfunc (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Conditionf(a.t, comp, msg, args...)\n}\n\n// Contains asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//\ta.Contains(\"Hello World\", \"World\")\n//\ta.Contains([\"Hello\", \"World\"], \"World\")\n//\ta.Contains({\"Hello\": \"World\"}, \"Hello\")\nfunc (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Contains(a.t, s, contains, msgAndArgs...)\n}\n\n// Containsf asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//\ta.Containsf(\"Hello World\", \"World\", \"error message %s\", \"formatted\")\n//\ta.Containsf([\"Hello\", \"World\"], \"World\", \"error message %s\", \"formatted\")\n//\ta.Containsf({\"Hello\": \"World\"}, \"Hello\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Containsf(a.t, s, contains, msg, args...)\n}\n\n// DirExists checks whether a directory exists in the given path. It also fails\n// if the path is a file rather a directory or there is an error checking whether it exists.\nfunc (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn DirExists(a.t, path, msgAndArgs...)\n}\n\n// DirExistsf checks whether a directory exists in the given path. It also fails\n// if the path is a file rather a directory or there is an error checking whether it exists.\nfunc (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn DirExistsf(a.t, path, msg, args...)\n}\n\n// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified\n// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,\n// the number of appearances of each of them in both lists should match.\n//\n// a.ElementsMatch([1, 3, 2, 3], [1, 3, 3, 2])\nfunc (a *Assertions) ElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn ElementsMatch(a.t, listA, listB, msgAndArgs...)\n}\n\n// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified\n// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,\n// the number of appearances of each of them in both lists should match.\n//\n// a.ElementsMatchf([1, 3, 2, 3], [1, 3, 3, 2], \"error message %s\", \"formatted\")\nfunc (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn ElementsMatchf(a.t, listA, listB, msg, args...)\n}\n\n// Empty asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\ta.Empty(obj)\nfunc (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Empty(a.t, object, msgAndArgs...)\n}\n\n// Emptyf asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\ta.Emptyf(obj, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Emptyf(a.t, object, msg, args...)\n}\n\n// Equal asserts that two objects are equal.\n//\n//\ta.Equal(123, 123)\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Equal(a.t, expected, actual, msgAndArgs...)\n}\n\n// EqualError asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//\tactualObj, err := SomeFunction()\n//\ta.EqualError(err,  expectedErrorString)\nfunc (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn EqualError(a.t, theError, errString, msgAndArgs...)\n}\n\n// EqualErrorf asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//\tactualObj, err := SomeFunction()\n//\ta.EqualErrorf(err,  expectedErrorString, \"error message %s\", \"formatted\")\nfunc (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn EqualErrorf(a.t, theError, errString, msg, args...)\n}\n\n// EqualExportedValues asserts that the types of two objects are equal and their public\n// fields are also equal. This is useful for comparing structs that have private fields\n// that could potentially differ.\n//\n//\t type S struct {\n//\t\tExported     \tint\n//\t\tnotExported   \tint\n//\t }\n//\t a.EqualExportedValues(S{1, 2}, S{1, 3}) => true\n//\t a.EqualExportedValues(S{1, 2}, S{2, 3}) => false\nfunc (a *Assertions) EqualExportedValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn EqualExportedValues(a.t, expected, actual, msgAndArgs...)\n}\n\n// EqualExportedValuesf asserts that the types of two objects are equal and their public\n// fields are also equal. This is useful for comparing structs that have private fields\n// that could potentially differ.\n//\n//\t type S struct {\n//\t\tExported     \tint\n//\t\tnotExported   \tint\n//\t }\n//\t a.EqualExportedValuesf(S{1, 2}, S{1, 3}, \"error message %s\", \"formatted\") => true\n//\t a.EqualExportedValuesf(S{1, 2}, S{2, 3}, \"error message %s\", \"formatted\") => false\nfunc (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn EqualExportedValuesf(a.t, expected, actual, msg, args...)\n}\n\n// EqualValues asserts that two objects are equal or convertible to the same types\n// and equal.\n//\n//\ta.EqualValues(uint32(123), int32(123))\nfunc (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn EqualValues(a.t, expected, actual, msgAndArgs...)\n}\n\n// EqualValuesf asserts that two objects are equal or convertible to the same types\n// and equal.\n//\n//\ta.EqualValuesf(uint32(123), int32(123), \"error message %s\", \"formatted\")\nfunc (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn EqualValuesf(a.t, expected, actual, msg, args...)\n}\n\n// Equalf asserts that two objects are equal.\n//\n//\ta.Equalf(123, 123, \"error message %s\", \"formatted\")\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Equalf(a.t, expected, actual, msg, args...)\n}\n\n// Error asserts that a function returned an error (i.e. not `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if a.Error(err) {\n//\t\t   assert.Equal(t, expectedError, err)\n//\t  }\nfunc (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Error(a.t, err, msgAndArgs...)\n}\n\n// ErrorAs asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value.\n// This is a wrapper for errors.As.\nfunc (a *Assertions) ErrorAs(err error, target interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn ErrorAs(a.t, err, target, msgAndArgs...)\n}\n\n// ErrorAsf asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value.\n// This is a wrapper for errors.As.\nfunc (a *Assertions) ErrorAsf(err error, target interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn ErrorAsf(a.t, err, target, msg, args...)\n}\n\n// ErrorContains asserts that a function returned an error (i.e. not `nil`)\n// and that the error contains the specified substring.\n//\n//\tactualObj, err := SomeFunction()\n//\ta.ErrorContains(err,  expectedErrorSubString)\nfunc (a *Assertions) ErrorContains(theError error, contains string, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn ErrorContains(a.t, theError, contains, msgAndArgs...)\n}\n\n// ErrorContainsf asserts that a function returned an error (i.e. not `nil`)\n// and that the error contains the specified substring.\n//\n//\tactualObj, err := SomeFunction()\n//\ta.ErrorContainsf(err,  expectedErrorSubString, \"error message %s\", \"formatted\")\nfunc (a *Assertions) ErrorContainsf(theError error, contains string, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn ErrorContainsf(a.t, theError, contains, msg, args...)\n}\n\n// ErrorIs asserts that at least one of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn ErrorIs(a.t, err, target, msgAndArgs...)\n}\n\n// ErrorIsf asserts that at least one of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc (a *Assertions) ErrorIsf(err error, target error, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn ErrorIsf(a.t, err, target, msg, args...)\n}\n\n// Errorf asserts that a function returned an error (i.e. not `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if a.Errorf(err, \"error message %s\", \"formatted\") {\n//\t\t   assert.Equal(t, expectedErrorf, err)\n//\t  }\nfunc (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Errorf(a.t, err, msg, args...)\n}\n\n// Eventually asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick.\n//\n//\ta.Eventually(func() bool { return true; }, time.Second, 10*time.Millisecond)\nfunc (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Eventually(a.t, condition, waitFor, tick, msgAndArgs...)\n}\n\n// EventuallyWithT asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick. In contrast to Eventually,\n// it supplies a CollectT to the condition function, so that the condition\n// function can use the CollectT to call other assertions.\n// The condition is considered \"met\" if no errors are raised in a tick.\n// The supplied CollectT collects all errors from one tick (if there are any).\n// If the condition is not met before waitFor, the collected errors of\n// the last tick are copied to t.\n//\n//\texternalValue := false\n//\tgo func() {\n//\t\ttime.Sleep(8*time.Second)\n//\t\texternalValue = true\n//\t}()\n//\ta.EventuallyWithT(func(c *assert.CollectT) {\n//\t\t// add assertions as needed; any assertion failure will fail the current tick\n//\t\tassert.True(c, externalValue, \"expected 'externalValue' to be true\")\n//\t}, 10*time.Second, 1*time.Second, \"external state has not changed to 'true'; still false\")\nfunc (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn EventuallyWithT(a.t, condition, waitFor, tick, msgAndArgs...)\n}\n\n// EventuallyWithTf asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick. In contrast to Eventually,\n// it supplies a CollectT to the condition function, so that the condition\n// function can use the CollectT to call other assertions.\n// The condition is considered \"met\" if no errors are raised in a tick.\n// The supplied CollectT collects all errors from one tick (if there are any).\n// If the condition is not met before waitFor, the collected errors of\n// the last tick are copied to t.\n//\n//\texternalValue := false\n//\tgo func() {\n//\t\ttime.Sleep(8*time.Second)\n//\t\texternalValue = true\n//\t}()\n//\ta.EventuallyWithTf(func(c *assert.CollectT, \"error message %s\", \"formatted\") {\n//\t\t// add assertions as needed; any assertion failure will fail the current tick\n//\t\tassert.True(c, externalValue, \"expected 'externalValue' to be true\")\n//\t}, 10*time.Second, 1*time.Second, \"external state has not changed to 'true'; still false\")\nfunc (a *Assertions) EventuallyWithTf(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn EventuallyWithTf(a.t, condition, waitFor, tick, msg, args...)\n}\n\n// Eventuallyf asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick.\n//\n//\ta.Eventuallyf(func() bool { return true; }, time.Second, 10*time.Millisecond, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Eventuallyf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Eventuallyf(a.t, condition, waitFor, tick, msg, args...)\n}\n\n// Exactly asserts that two objects are equal in value and type.\n//\n//\ta.Exactly(int32(123), int64(123))\nfunc (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Exactly(a.t, expected, actual, msgAndArgs...)\n}\n\n// Exactlyf asserts that two objects are equal in value and type.\n//\n//\ta.Exactlyf(int32(123), int64(123), \"error message %s\", \"formatted\")\nfunc (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Exactlyf(a.t, expected, actual, msg, args...)\n}\n\n// Fail reports a failure through\nfunc (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Fail(a.t, failureMessage, msgAndArgs...)\n}\n\n// FailNow fails test\nfunc (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn FailNow(a.t, failureMessage, msgAndArgs...)\n}\n\n// FailNowf fails test\nfunc (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn FailNowf(a.t, failureMessage, msg, args...)\n}\n\n// Failf reports a failure through\nfunc (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Failf(a.t, failureMessage, msg, args...)\n}\n\n// False asserts that the specified value is false.\n//\n//\ta.False(myBool)\nfunc (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn False(a.t, value, msgAndArgs...)\n}\n\n// Falsef asserts that the specified value is false.\n//\n//\ta.Falsef(myBool, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Falsef(a.t, value, msg, args...)\n}\n\n// FileExists checks whether a file exists in the given path. It also fails if\n// the path points to a directory or there is an error when trying to check the file.\nfunc (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn FileExists(a.t, path, msgAndArgs...)\n}\n\n// FileExistsf checks whether a file exists in the given path. It also fails if\n// the path points to a directory or there is an error when trying to check the file.\nfunc (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn FileExistsf(a.t, path, msg, args...)\n}\n\n// Greater asserts that the first element is greater than the second\n//\n//\ta.Greater(2, 1)\n//\ta.Greater(float64(2), float64(1))\n//\ta.Greater(\"b\", \"a\")\nfunc (a *Assertions) Greater(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Greater(a.t, e1, e2, msgAndArgs...)\n}\n\n// GreaterOrEqual asserts that the first element is greater than or equal to the second\n//\n//\ta.GreaterOrEqual(2, 1)\n//\ta.GreaterOrEqual(2, 2)\n//\ta.GreaterOrEqual(\"b\", \"a\")\n//\ta.GreaterOrEqual(\"b\", \"b\")\nfunc (a *Assertions) GreaterOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn GreaterOrEqual(a.t, e1, e2, msgAndArgs...)\n}\n\n// GreaterOrEqualf asserts that the first element is greater than or equal to the second\n//\n//\ta.GreaterOrEqualf(2, 1, \"error message %s\", \"formatted\")\n//\ta.GreaterOrEqualf(2, 2, \"error message %s\", \"formatted\")\n//\ta.GreaterOrEqualf(\"b\", \"a\", \"error message %s\", \"formatted\")\n//\ta.GreaterOrEqualf(\"b\", \"b\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn GreaterOrEqualf(a.t, e1, e2, msg, args...)\n}\n\n// Greaterf asserts that the first element is greater than the second\n//\n//\ta.Greaterf(2, 1, \"error message %s\", \"formatted\")\n//\ta.Greaterf(float64(2), float64(1), \"error message %s\", \"formatted\")\n//\ta.Greaterf(\"b\", \"a\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Greaterf(a.t, e1, e2, msg, args...)\n}\n\n// HTTPBodyContains asserts that a specified handler returns a\n// body that contains a string.\n//\n//\ta.HTTPBodyContains(myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPBodyContains(a.t, handler, method, url, values, str, msgAndArgs...)\n}\n\n// HTTPBodyContainsf asserts that a specified handler returns a\n// body that contains a string.\n//\n//\ta.HTTPBodyContainsf(myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPBodyContainsf(a.t, handler, method, url, values, str, msg, args...)\n}\n\n// HTTPBodyNotContains asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//\ta.HTTPBodyNotContains(myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPBodyNotContains(a.t, handler, method, url, values, str, msgAndArgs...)\n}\n\n// HTTPBodyNotContainsf asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//\ta.HTTPBodyNotContainsf(myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPBodyNotContainsf(a.t, handler, method, url, values, str, msg, args...)\n}\n\n// HTTPError asserts that a specified handler returns an error status code.\n//\n//\ta.HTTPError(myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPError(a.t, handler, method, url, values, msgAndArgs...)\n}\n\n// HTTPErrorf asserts that a specified handler returns an error status code.\n//\n//\ta.HTTPErrorf(myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPErrorf(a.t, handler, method, url, values, msg, args...)\n}\n\n// HTTPRedirect asserts that a specified handler returns a redirect status code.\n//\n//\ta.HTTPRedirect(myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPRedirect(a.t, handler, method, url, values, msgAndArgs...)\n}\n\n// HTTPRedirectf asserts that a specified handler returns a redirect status code.\n//\n//\ta.HTTPRedirectf(myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPRedirectf(a.t, handler, method, url, values, msg, args...)\n}\n\n// HTTPStatusCode asserts that a specified handler returns a specified status code.\n//\n//\ta.HTTPStatusCode(myHandler, \"GET\", \"/notImplemented\", nil, 501)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPStatusCode(a.t, handler, method, url, values, statuscode, msgAndArgs...)\n}\n\n// HTTPStatusCodef asserts that a specified handler returns a specified status code.\n//\n//\ta.HTTPStatusCodef(myHandler, \"GET\", \"/notImplemented\", nil, 501, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPStatusCodef(a.t, handler, method, url, values, statuscode, msg, args...)\n}\n\n// HTTPSuccess asserts that a specified handler returns a success status code.\n//\n//\ta.HTTPSuccess(myHandler, \"POST\", \"http://www.google.com\", nil)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPSuccess(a.t, handler, method, url, values, msgAndArgs...)\n}\n\n// HTTPSuccessf asserts that a specified handler returns a success status code.\n//\n//\ta.HTTPSuccessf(myHandler, \"POST\", \"http://www.google.com\", nil, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn HTTPSuccessf(a.t, handler, method, url, values, msg, args...)\n}\n\n// Implements asserts that an object is implemented by the specified interface.\n//\n//\ta.Implements((*MyInterface)(nil), new(MyObject))\nfunc (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Implements(a.t, interfaceObject, object, msgAndArgs...)\n}\n\n// Implementsf asserts that an object is implemented by the specified interface.\n//\n//\ta.Implementsf((*MyInterface)(nil), new(MyObject), \"error message %s\", \"formatted\")\nfunc (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Implementsf(a.t, interfaceObject, object, msg, args...)\n}\n\n// InDelta asserts that the two numerals are within delta of each other.\n//\n//\ta.InDelta(math.Pi, 22/7.0, 0.01)\nfunc (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InDelta(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.\nfunc (a *Assertions) InDeltaMapValues(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InDeltaMapValues(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.\nfunc (a *Assertions) InDeltaMapValuesf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InDeltaMapValuesf(a.t, expected, actual, delta, msg, args...)\n}\n\n// InDeltaSlice is the same as InDelta, except it compares two slices.\nfunc (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// InDeltaSlicef is the same as InDelta, except it compares two slices.\nfunc (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InDeltaSlicef(a.t, expected, actual, delta, msg, args...)\n}\n\n// InDeltaf asserts that the two numerals are within delta of each other.\n//\n//\ta.InDeltaf(math.Pi, 22/7.0, 0.01, \"error message %s\", \"formatted\")\nfunc (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InDeltaf(a.t, expected, actual, delta, msg, args...)\n}\n\n// InEpsilon asserts that expected and actual have a relative error less than epsilon\nfunc (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...)\n}\n\n// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.\nfunc (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...)\n}\n\n// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices.\nfunc (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...)\n}\n\n// InEpsilonf asserts that expected and actual have a relative error less than epsilon\nfunc (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn InEpsilonf(a.t, expected, actual, epsilon, msg, args...)\n}\n\n// IsDecreasing asserts that the collection is decreasing\n//\n//\ta.IsDecreasing([]int{2, 1, 0})\n//\ta.IsDecreasing([]float{2, 1})\n//\ta.IsDecreasing([]string{\"b\", \"a\"})\nfunc (a *Assertions) IsDecreasing(object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsDecreasing(a.t, object, msgAndArgs...)\n}\n\n// IsDecreasingf asserts that the collection is decreasing\n//\n//\ta.IsDecreasingf([]int{2, 1, 0}, \"error message %s\", \"formatted\")\n//\ta.IsDecreasingf([]float{2, 1}, \"error message %s\", \"formatted\")\n//\ta.IsDecreasingf([]string{\"b\", \"a\"}, \"error message %s\", \"formatted\")\nfunc (a *Assertions) IsDecreasingf(object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsDecreasingf(a.t, object, msg, args...)\n}\n\n// IsIncreasing asserts that the collection is increasing\n//\n//\ta.IsIncreasing([]int{1, 2, 3})\n//\ta.IsIncreasing([]float{1, 2})\n//\ta.IsIncreasing([]string{\"a\", \"b\"})\nfunc (a *Assertions) IsIncreasing(object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsIncreasing(a.t, object, msgAndArgs...)\n}\n\n// IsIncreasingf asserts that the collection is increasing\n//\n//\ta.IsIncreasingf([]int{1, 2, 3}, \"error message %s\", \"formatted\")\n//\ta.IsIncreasingf([]float{1, 2}, \"error message %s\", \"formatted\")\n//\ta.IsIncreasingf([]string{\"a\", \"b\"}, \"error message %s\", \"formatted\")\nfunc (a *Assertions) IsIncreasingf(object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsIncreasingf(a.t, object, msg, args...)\n}\n\n// IsNonDecreasing asserts that the collection is not decreasing\n//\n//\ta.IsNonDecreasing([]int{1, 1, 2})\n//\ta.IsNonDecreasing([]float{1, 2})\n//\ta.IsNonDecreasing([]string{\"a\", \"b\"})\nfunc (a *Assertions) IsNonDecreasing(object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsNonDecreasing(a.t, object, msgAndArgs...)\n}\n\n// IsNonDecreasingf asserts that the collection is not decreasing\n//\n//\ta.IsNonDecreasingf([]int{1, 1, 2}, \"error message %s\", \"formatted\")\n//\ta.IsNonDecreasingf([]float{1, 2}, \"error message %s\", \"formatted\")\n//\ta.IsNonDecreasingf([]string{\"a\", \"b\"}, \"error message %s\", \"formatted\")\nfunc (a *Assertions) IsNonDecreasingf(object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsNonDecreasingf(a.t, object, msg, args...)\n}\n\n// IsNonIncreasing asserts that the collection is not increasing\n//\n//\ta.IsNonIncreasing([]int{2, 1, 1})\n//\ta.IsNonIncreasing([]float{2, 1})\n//\ta.IsNonIncreasing([]string{\"b\", \"a\"})\nfunc (a *Assertions) IsNonIncreasing(object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsNonIncreasing(a.t, object, msgAndArgs...)\n}\n\n// IsNonIncreasingf asserts that the collection is not increasing\n//\n//\ta.IsNonIncreasingf([]int{2, 1, 1}, \"error message %s\", \"formatted\")\n//\ta.IsNonIncreasingf([]float{2, 1}, \"error message %s\", \"formatted\")\n//\ta.IsNonIncreasingf([]string{\"b\", \"a\"}, \"error message %s\", \"formatted\")\nfunc (a *Assertions) IsNonIncreasingf(object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsNonIncreasingf(a.t, object, msg, args...)\n}\n\n// IsType asserts that the specified objects are of the same type.\nfunc (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsType(a.t, expectedType, object, msgAndArgs...)\n}\n\n// IsTypef asserts that the specified objects are of the same type.\nfunc (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn IsTypef(a.t, expectedType, object, msg, args...)\n}\n\n// JSONEq asserts that two JSON strings are equivalent.\n//\n//\ta.JSONEq(`{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`)\nfunc (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn JSONEq(a.t, expected, actual, msgAndArgs...)\n}\n\n// JSONEqf asserts that two JSON strings are equivalent.\n//\n//\ta.JSONEqf(`{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`, \"error message %s\", \"formatted\")\nfunc (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn JSONEqf(a.t, expected, actual, msg, args...)\n}\n\n// Len asserts that the specified object has specific length.\n// Len also fails if the object has a type that len() not accept.\n//\n//\ta.Len(mySlice, 3)\nfunc (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Len(a.t, object, length, msgAndArgs...)\n}\n\n// Lenf asserts that the specified object has specific length.\n// Lenf also fails if the object has a type that len() not accept.\n//\n//\ta.Lenf(mySlice, 3, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Lenf(a.t, object, length, msg, args...)\n}\n\n// Less asserts that the first element is less than the second\n//\n//\ta.Less(1, 2)\n//\ta.Less(float64(1), float64(2))\n//\ta.Less(\"a\", \"b\")\nfunc (a *Assertions) Less(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Less(a.t, e1, e2, msgAndArgs...)\n}\n\n// LessOrEqual asserts that the first element is less than or equal to the second\n//\n//\ta.LessOrEqual(1, 2)\n//\ta.LessOrEqual(2, 2)\n//\ta.LessOrEqual(\"a\", \"b\")\n//\ta.LessOrEqual(\"b\", \"b\")\nfunc (a *Assertions) LessOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn LessOrEqual(a.t, e1, e2, msgAndArgs...)\n}\n\n// LessOrEqualf asserts that the first element is less than or equal to the second\n//\n//\ta.LessOrEqualf(1, 2, \"error message %s\", \"formatted\")\n//\ta.LessOrEqualf(2, 2, \"error message %s\", \"formatted\")\n//\ta.LessOrEqualf(\"a\", \"b\", \"error message %s\", \"formatted\")\n//\ta.LessOrEqualf(\"b\", \"b\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn LessOrEqualf(a.t, e1, e2, msg, args...)\n}\n\n// Lessf asserts that the first element is less than the second\n//\n//\ta.Lessf(1, 2, \"error message %s\", \"formatted\")\n//\ta.Lessf(float64(1), float64(2), \"error message %s\", \"formatted\")\n//\ta.Lessf(\"a\", \"b\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Lessf(a.t, e1, e2, msg, args...)\n}\n\n// Negative asserts that the specified element is negative\n//\n//\ta.Negative(-1)\n//\ta.Negative(-1.23)\nfunc (a *Assertions) Negative(e interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Negative(a.t, e, msgAndArgs...)\n}\n\n// Negativef asserts that the specified element is negative\n//\n//\ta.Negativef(-1, \"error message %s\", \"formatted\")\n//\ta.Negativef(-1.23, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Negativef(e interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Negativef(a.t, e, msg, args...)\n}\n\n// Never asserts that the given condition doesn't satisfy in waitFor time,\n// periodically checking the target function each tick.\n//\n//\ta.Never(func() bool { return false; }, time.Second, 10*time.Millisecond)\nfunc (a *Assertions) Never(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Never(a.t, condition, waitFor, tick, msgAndArgs...)\n}\n\n// Neverf asserts that the given condition doesn't satisfy in waitFor time,\n// periodically checking the target function each tick.\n//\n//\ta.Neverf(func() bool { return false; }, time.Second, 10*time.Millisecond, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Neverf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Neverf(a.t, condition, waitFor, tick, msg, args...)\n}\n\n// Nil asserts that the specified object is nil.\n//\n//\ta.Nil(err)\nfunc (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Nil(a.t, object, msgAndArgs...)\n}\n\n// Nilf asserts that the specified object is nil.\n//\n//\ta.Nilf(err, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Nilf(a.t, object, msg, args...)\n}\n\n// NoDirExists checks whether a directory does not exist in the given path.\n// It fails if the path points to an existing _directory_ only.\nfunc (a *Assertions) NoDirExists(path string, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NoDirExists(a.t, path, msgAndArgs...)\n}\n\n// NoDirExistsf checks whether a directory does not exist in the given path.\n// It fails if the path points to an existing _directory_ only.\nfunc (a *Assertions) NoDirExistsf(path string, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NoDirExistsf(a.t, path, msg, args...)\n}\n\n// NoError asserts that a function returned no error (i.e. `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if a.NoError(err) {\n//\t\t   assert.Equal(t, expectedObj, actualObj)\n//\t  }\nfunc (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NoError(a.t, err, msgAndArgs...)\n}\n\n// NoErrorf asserts that a function returned no error (i.e. `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if a.NoErrorf(err, \"error message %s\", \"formatted\") {\n//\t\t   assert.Equal(t, expectedObj, actualObj)\n//\t  }\nfunc (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NoErrorf(a.t, err, msg, args...)\n}\n\n// NoFileExists checks whether a file does not exist in a given path. It fails\n// if the path points to an existing _file_ only.\nfunc (a *Assertions) NoFileExists(path string, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NoFileExists(a.t, path, msgAndArgs...)\n}\n\n// NoFileExistsf checks whether a file does not exist in a given path. It fails\n// if the path points to an existing _file_ only.\nfunc (a *Assertions) NoFileExistsf(path string, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NoFileExistsf(a.t, path, msg, args...)\n}\n\n// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//\ta.NotContains(\"Hello World\", \"Earth\")\n//\ta.NotContains([\"Hello\", \"World\"], \"Earth\")\n//\ta.NotContains({\"Hello\": \"World\"}, \"Earth\")\nfunc (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotContains(a.t, s, contains, msgAndArgs...)\n}\n\n// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//\ta.NotContainsf(\"Hello World\", \"Earth\", \"error message %s\", \"formatted\")\n//\ta.NotContainsf([\"Hello\", \"World\"], \"Earth\", \"error message %s\", \"formatted\")\n//\ta.NotContainsf({\"Hello\": \"World\"}, \"Earth\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotContainsf(a.t, s, contains, msg, args...)\n}\n\n// NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\tif a.NotEmpty(obj) {\n//\t  assert.Equal(t, \"two\", obj[1])\n//\t}\nfunc (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotEmpty(a.t, object, msgAndArgs...)\n}\n\n// NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\tif a.NotEmptyf(obj, \"error message %s\", \"formatted\") {\n//\t  assert.Equal(t, \"two\", obj[1])\n//\t}\nfunc (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotEmptyf(a.t, object, msg, args...)\n}\n\n// NotEqual asserts that the specified values are NOT equal.\n//\n//\ta.NotEqual(obj1, obj2)\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotEqual(a.t, expected, actual, msgAndArgs...)\n}\n\n// NotEqualValues asserts that two objects are not equal even when converted to the same type\n//\n//\ta.NotEqualValues(obj1, obj2)\nfunc (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotEqualValues(a.t, expected, actual, msgAndArgs...)\n}\n\n// NotEqualValuesf asserts that two objects are not equal even when converted to the same type\n//\n//\ta.NotEqualValuesf(obj1, obj2, \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotEqualValuesf(a.t, expected, actual, msg, args...)\n}\n\n// NotEqualf asserts that the specified values are NOT equal.\n//\n//\ta.NotEqualf(obj1, obj2, \"error message %s\", \"formatted\")\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotEqualf(a.t, expected, actual, msg, args...)\n}\n\n// NotErrorIs asserts that at none of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotErrorIs(a.t, err, target, msgAndArgs...)\n}\n\n// NotErrorIsf asserts that at none of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotErrorIsf(a.t, err, target, msg, args...)\n}\n\n// NotImplements asserts that an object does not implement the specified interface.\n//\n//\ta.NotImplements((*MyInterface)(nil), new(MyObject))\nfunc (a *Assertions) NotImplements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotImplements(a.t, interfaceObject, object, msgAndArgs...)\n}\n\n// NotImplementsf asserts that an object does not implement the specified interface.\n//\n//\ta.NotImplementsf((*MyInterface)(nil), new(MyObject), \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotImplementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotImplementsf(a.t, interfaceObject, object, msg, args...)\n}\n\n// NotNil asserts that the specified object is not nil.\n//\n//\ta.NotNil(err)\nfunc (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotNil(a.t, object, msgAndArgs...)\n}\n\n// NotNilf asserts that the specified object is not nil.\n//\n//\ta.NotNilf(err, \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotNilf(a.t, object, msg, args...)\n}\n\n// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//\ta.NotPanics(func(){ RemainCalm() })\nfunc (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotPanics(a.t, f, msgAndArgs...)\n}\n\n// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//\ta.NotPanicsf(func(){ RemainCalm() }, \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotPanicsf(a.t, f, msg, args...)\n}\n\n// NotRegexp asserts that a specified regexp does not match a string.\n//\n//\ta.NotRegexp(regexp.MustCompile(\"starts\"), \"it's starting\")\n//\ta.NotRegexp(\"^start\", \"it's not starting\")\nfunc (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotRegexp(a.t, rx, str, msgAndArgs...)\n}\n\n// NotRegexpf asserts that a specified regexp does not match a string.\n//\n//\ta.NotRegexpf(regexp.MustCompile(\"starts\"), \"it's starting\", \"error message %s\", \"formatted\")\n//\ta.NotRegexpf(\"^start\", \"it's not starting\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotRegexpf(a.t, rx, str, msg, args...)\n}\n\n// NotSame asserts that two pointers do not reference the same object.\n//\n//\ta.NotSame(ptr1, ptr2)\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc (a *Assertions) NotSame(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotSame(a.t, expected, actual, msgAndArgs...)\n}\n\n// NotSamef asserts that two pointers do not reference the same object.\n//\n//\ta.NotSamef(ptr1, ptr2, \"error message %s\", \"formatted\")\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc (a *Assertions) NotSamef(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotSamef(a.t, expected, actual, msg, args...)\n}\n\n// NotSubset asserts that the specified list(array, slice...) or map does NOT\n// contain all elements given in the specified subset list(array, slice...) or\n// map.\n//\n//\ta.NotSubset([1, 3, 4], [1, 2])\n//\ta.NotSubset({\"x\": 1, \"y\": 2}, {\"z\": 3})\nfunc (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotSubset(a.t, list, subset, msgAndArgs...)\n}\n\n// NotSubsetf asserts that the specified list(array, slice...) or map does NOT\n// contain all elements given in the specified subset list(array, slice...) or\n// map.\n//\n//\ta.NotSubsetf([1, 3, 4], [1, 2], \"error message %s\", \"formatted\")\n//\ta.NotSubsetf({\"x\": 1, \"y\": 2}, {\"z\": 3}, \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotSubsetf(a.t, list, subset, msg, args...)\n}\n\n// NotZero asserts that i is not the zero value for its type.\nfunc (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotZero(a.t, i, msgAndArgs...)\n}\n\n// NotZerof asserts that i is not the zero value for its type.\nfunc (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn NotZerof(a.t, i, msg, args...)\n}\n\n// Panics asserts that the code inside the specified PanicTestFunc panics.\n//\n//\ta.Panics(func(){ GoCrazy() })\nfunc (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Panics(a.t, f, msgAndArgs...)\n}\n\n// PanicsWithError asserts that the code inside the specified PanicTestFunc\n// panics, and that the recovered panic value is an error that satisfies the\n// EqualError comparison.\n//\n//\ta.PanicsWithError(\"crazy error\", func(){ GoCrazy() })\nfunc (a *Assertions) PanicsWithError(errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn PanicsWithError(a.t, errString, f, msgAndArgs...)\n}\n\n// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc\n// panics, and that the recovered panic value is an error that satisfies the\n// EqualError comparison.\n//\n//\ta.PanicsWithErrorf(\"crazy error\", func(){ GoCrazy() }, \"error message %s\", \"formatted\")\nfunc (a *Assertions) PanicsWithErrorf(errString string, f PanicTestFunc, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn PanicsWithErrorf(a.t, errString, f, msg, args...)\n}\n\n// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//\ta.PanicsWithValue(\"crazy error\", func(){ GoCrazy() })\nfunc (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn PanicsWithValue(a.t, expected, f, msgAndArgs...)\n}\n\n// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//\ta.PanicsWithValuef(\"crazy error\", func(){ GoCrazy() }, \"error message %s\", \"formatted\")\nfunc (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn PanicsWithValuef(a.t, expected, f, msg, args...)\n}\n\n// Panicsf asserts that the code inside the specified PanicTestFunc panics.\n//\n//\ta.Panicsf(func(){ GoCrazy() }, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Panicsf(a.t, f, msg, args...)\n}\n\n// Positive asserts that the specified element is positive\n//\n//\ta.Positive(1)\n//\ta.Positive(1.23)\nfunc (a *Assertions) Positive(e interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Positive(a.t, e, msgAndArgs...)\n}\n\n// Positivef asserts that the specified element is positive\n//\n//\ta.Positivef(1, \"error message %s\", \"formatted\")\n//\ta.Positivef(1.23, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Positivef(e interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Positivef(a.t, e, msg, args...)\n}\n\n// Regexp asserts that a specified regexp matches a string.\n//\n//\ta.Regexp(regexp.MustCompile(\"start\"), \"it's starting\")\n//\ta.Regexp(\"start...$\", \"it's not starting\")\nfunc (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Regexp(a.t, rx, str, msgAndArgs...)\n}\n\n// Regexpf asserts that a specified regexp matches a string.\n//\n//\ta.Regexpf(regexp.MustCompile(\"start\"), \"it's starting\", \"error message %s\", \"formatted\")\n//\ta.Regexpf(\"start...$\", \"it's not starting\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Regexpf(a.t, rx, str, msg, args...)\n}\n\n// Same asserts that two pointers reference the same object.\n//\n//\ta.Same(ptr1, ptr2)\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc (a *Assertions) Same(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Same(a.t, expected, actual, msgAndArgs...)\n}\n\n// Samef asserts that two pointers reference the same object.\n//\n//\ta.Samef(ptr1, ptr2, \"error message %s\", \"formatted\")\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc (a *Assertions) Samef(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Samef(a.t, expected, actual, msg, args...)\n}\n\n// Subset asserts that the specified list(array, slice...) or map contains all\n// elements given in the specified subset list(array, slice...) or map.\n//\n//\ta.Subset([1, 2, 3], [1, 2])\n//\ta.Subset({\"x\": 1, \"y\": 2}, {\"x\": 1})\nfunc (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Subset(a.t, list, subset, msgAndArgs...)\n}\n\n// Subsetf asserts that the specified list(array, slice...) or map contains all\n// elements given in the specified subset list(array, slice...) or map.\n//\n//\ta.Subsetf([1, 2, 3], [1, 2], \"error message %s\", \"formatted\")\n//\ta.Subsetf({\"x\": 1, \"y\": 2}, {\"x\": 1}, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Subsetf(a.t, list, subset, msg, args...)\n}\n\n// True asserts that the specified value is true.\n//\n//\ta.True(myBool)\nfunc (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn True(a.t, value, msgAndArgs...)\n}\n\n// Truef asserts that the specified value is true.\n//\n//\ta.Truef(myBool, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Truef(a.t, value, msg, args...)\n}\n\n// WithinDuration asserts that the two times are within duration delta of each other.\n//\n//\ta.WithinDuration(time.Now(), time.Now(), 10*time.Second)\nfunc (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn WithinDuration(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// WithinDurationf asserts that the two times are within duration delta of each other.\n//\n//\ta.WithinDurationf(time.Now(), time.Now(), 10*time.Second, \"error message %s\", \"formatted\")\nfunc (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn WithinDurationf(a.t, expected, actual, delta, msg, args...)\n}\n\n// WithinRange asserts that a time is within a time range (inclusive).\n//\n//\ta.WithinRange(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second))\nfunc (a *Assertions) WithinRange(actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn WithinRange(a.t, actual, start, end, msgAndArgs...)\n}\n\n// WithinRangef asserts that a time is within a time range (inclusive).\n//\n//\ta.WithinRangef(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), \"error message %s\", \"formatted\")\nfunc (a *Assertions) WithinRangef(actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn WithinRangef(a.t, actual, start, end, msg, args...)\n}\n\n// Zero asserts that i is the zero value for its type.\nfunc (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Zero(a.t, i, msgAndArgs...)\n}\n\n// Zerof asserts that i is the zero value for its type.\nfunc (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) bool {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Zerof(a.t, i, msg, args...)\n}\n"
  },
  {
    "path": "internal/testify/assert/assertion_forward.go.tmpl",
    "content": "{{.CommentWithoutT \"a\"}}\nfunc (a *Assertions) {{.DocInfo.Name}}({{.Params}}) bool {\n\tif h, ok := a.t.(tHelper); ok { h.Helper() }\n\treturn {{.DocInfo.Name}}(a.t, {{.ForwardedParams}})\n}\n"
  },
  {
    "path": "internal/testify/assert/assertion_order.go",
    "content": "package assert\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n)\n\n// isOrdered checks that collection contains orderable elements.\nfunc isOrdered(t TestingT, object interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool {\n\tobjKind := reflect.TypeOf(object).Kind()\n\tif objKind != reflect.Slice && objKind != reflect.Array {\n\t\treturn false\n\t}\n\n\tobjValue := reflect.ValueOf(object)\n\tobjLen := objValue.Len()\n\n\tif objLen <= 1 {\n\t\treturn true\n\t}\n\n\tvalue := objValue.Index(0)\n\tvalueInterface := value.Interface()\n\tfirstValueKind := value.Kind()\n\n\tfor i := 1; i < objLen; i++ {\n\t\tprevValue := value\n\t\tprevValueInterface := valueInterface\n\n\t\tvalue = objValue.Index(i)\n\t\tvalueInterface = value.Interface()\n\n\t\tcompareResult, isComparable := compare(prevValueInterface, valueInterface, firstValueKind)\n\n\t\tif !isComparable {\n\t\t\treturn Fail(t, fmt.Sprintf(\"Can not compare type \\\"%s\\\" and \\\"%s\\\"\", reflect.TypeOf(value), reflect.TypeOf(prevValue)), msgAndArgs...)\n\t\t}\n\n\t\tif !containsValue(allowedComparesResults, compareResult) {\n\t\t\treturn Fail(t, fmt.Sprintf(failMessage, prevValue, value), msgAndArgs...)\n\t\t}\n\t}\n\n\treturn true\n}\n\n// IsIncreasing asserts that the collection is increasing\n//\n//\tassert.IsIncreasing(t, []int{1, 2, 3})\n//\tassert.IsIncreasing(t, []float{1, 2})\n//\tassert.IsIncreasing(t, []string{\"a\", \"b\"})\nfunc IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {\n\treturn isOrdered(t, object, []compareResult{compareLess}, \"\\\"%v\\\" is not less than \\\"%v\\\"\", msgAndArgs...)\n}\n\n// IsNonIncreasing asserts that the collection is not increasing\n//\n//\tassert.IsNonIncreasing(t, []int{2, 1, 1})\n//\tassert.IsNonIncreasing(t, []float{2, 1})\n//\tassert.IsNonIncreasing(t, []string{\"b\", \"a\"})\nfunc IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {\n\treturn isOrdered(t, object, []compareResult{compareEqual, compareGreater}, \"\\\"%v\\\" is not greater than or equal to \\\"%v\\\"\", msgAndArgs...)\n}\n\n// IsDecreasing asserts that the collection is decreasing\n//\n//\tassert.IsDecreasing(t, []int{2, 1, 0})\n//\tassert.IsDecreasing(t, []float{2, 1})\n//\tassert.IsDecreasing(t, []string{\"b\", \"a\"})\nfunc IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {\n\treturn isOrdered(t, object, []compareResult{compareGreater}, \"\\\"%v\\\" is not greater than \\\"%v\\\"\", msgAndArgs...)\n}\n\n// IsNonDecreasing asserts that the collection is not decreasing\n//\n//\tassert.IsNonDecreasing(t, []int{1, 1, 2})\n//\tassert.IsNonDecreasing(t, []float{1, 2})\n//\tassert.IsNonDecreasing(t, []string{\"a\", \"b\"})\nfunc IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {\n\treturn isOrdered(t, object, []compareResult{compareLess, compareEqual}, \"\\\"%v\\\" is not less than or equal to \\\"%v\\\"\", msgAndArgs...)\n}\n"
  },
  {
    "path": "internal/testify/assert/assertion_order_test.go",
    "content": "package assert\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n)\n\nfunc TestIsIncreasing(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tif !IsIncreasing(mockT, []int{1, 2}) {\n\t\tt.Error(\"IsIncreasing should return true\")\n\t}\n\n\tif !IsIncreasing(mockT, []int{1, 2, 3, 4, 5}) {\n\t\tt.Error(\"IsIncreasing should return true\")\n\t}\n\n\tif IsIncreasing(mockT, []int{1, 1}) {\n\t\tt.Error(\"IsIncreasing should return false\")\n\t}\n\n\tif IsIncreasing(mockT, []int{2, 1}) {\n\t\tt.Error(\"IsIncreasing should return false\")\n\t}\n\n\t// Check error report\n\tfor _, currCase := range []struct {\n\t\tcollection interface{}\n\t\tmsg        string\n\t}{\n\t\t{collection: []string{\"b\", \"a\"}, msg: `\"b\" is not less than \"a\"`},\n\t\t{collection: []int{2, 1}, msg: `\"2\" is not less than \"1\"`},\n\t\t{collection: []int{2, 1, 3, 4, 5, 6, 7}, msg: `\"2\" is not less than \"1\"`},\n\t\t{collection: []int{-1, 0, 2, 1}, msg: `\"2\" is not less than \"1\"`},\n\t\t{collection: []int8{2, 1}, msg: `\"2\" is not less than \"1\"`},\n\t\t{collection: []int16{2, 1}, msg: `\"2\" is not less than \"1\"`},\n\t\t{collection: []int32{2, 1}, msg: `\"2\" is not less than \"1\"`},\n\t\t{collection: []int64{2, 1}, msg: `\"2\" is not less than \"1\"`},\n\t\t{collection: []uint8{2, 1}, msg: `\"2\" is not less than \"1\"`},\n\t\t{collection: []uint16{2, 1}, msg: `\"2\" is not less than \"1\"`},\n\t\t{collection: []uint32{2, 1}, msg: `\"2\" is not less than \"1\"`},\n\t\t{collection: []uint64{2, 1}, msg: `\"2\" is not less than \"1\"`},\n\t\t{collection: []float32{2.34, 1.23}, msg: `\"2.34\" is not less than \"1.23\"`},\n\t\t{collection: []float64{2.34, 1.23}, msg: `\"2.34\" is not less than \"1.23\"`},\n\t} {\n\t\tout := &outputT{buf: bytes.NewBuffer(nil)}\n\t\tFalse(t, IsIncreasing(out, currCase.collection))\n\t\tContains(t, out.buf.String(), currCase.msg)\n\t}\n}\n\nfunc TestIsNonIncreasing(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tif !IsNonIncreasing(mockT, []int{2, 1}) {\n\t\tt.Error(\"IsNonIncreasing should return true\")\n\t}\n\n\tif !IsNonIncreasing(mockT, []int{5, 4, 4, 3, 2, 1}) {\n\t\tt.Error(\"IsNonIncreasing should return true\")\n\t}\n\n\tif !IsNonIncreasing(mockT, []int{1, 1}) {\n\t\tt.Error(\"IsNonIncreasing should return true\")\n\t}\n\n\tif IsNonIncreasing(mockT, []int{1, 2}) {\n\t\tt.Error(\"IsNonIncreasing should return false\")\n\t}\n\n\t// Check error report\n\tfor _, currCase := range []struct {\n\t\tcollection interface{}\n\t\tmsg        string\n\t}{\n\t\t{collection: []string{\"a\", \"b\"}, msg: `\"a\" is not greater than or equal to \"b\"`},\n\t\t{collection: []int{1, 2}, msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{collection: []int{1, 2, 7, 6, 5, 4, 3}, msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{collection: []int{5, 4, 3, 1, 2}, msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{collection: []int8{1, 2}, msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{collection: []int16{1, 2}, msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{collection: []int32{1, 2}, msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{collection: []int64{1, 2}, msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{collection: []uint8{1, 2}, msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{collection: []uint16{1, 2}, msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{collection: []uint32{1, 2}, msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{collection: []uint64{1, 2}, msg: `\"1\" is not greater than or equal to \"2\"`},\n\t\t{collection: []float32{1.23, 2.34}, msg: `\"1.23\" is not greater than or equal to \"2.34\"`},\n\t\t{collection: []float64{1.23, 2.34}, msg: `\"1.23\" is not greater than or equal to \"2.34\"`},\n\t} {\n\t\tout := &outputT{buf: bytes.NewBuffer(nil)}\n\t\tFalse(t, IsNonIncreasing(out, currCase.collection))\n\t\tContains(t, out.buf.String(), currCase.msg)\n\t}\n}\n\nfunc TestIsDecreasing(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tif !IsDecreasing(mockT, []int{2, 1}) {\n\t\tt.Error(\"IsDecreasing should return true\")\n\t}\n\n\tif !IsDecreasing(mockT, []int{5, 4, 3, 2, 1}) {\n\t\tt.Error(\"IsDecreasing should return true\")\n\t}\n\n\tif IsDecreasing(mockT, []int{1, 1}) {\n\t\tt.Error(\"IsDecreasing should return false\")\n\t}\n\n\tif IsDecreasing(mockT, []int{1, 2}) {\n\t\tt.Error(\"IsDecreasing should return false\")\n\t}\n\n\t// Check error report\n\tfor _, currCase := range []struct {\n\t\tcollection interface{}\n\t\tmsg        string\n\t}{\n\t\t{collection: []string{\"a\", \"b\"}, msg: `\"a\" is not greater than \"b\"`},\n\t\t{collection: []int{1, 2}, msg: `\"1\" is not greater than \"2\"`},\n\t\t{collection: []int{1, 2, 7, 6, 5, 4, 3}, msg: `\"1\" is not greater than \"2\"`},\n\t\t{collection: []int{5, 4, 3, 1, 2}, msg: `\"1\" is not greater than \"2\"`},\n\t\t{collection: []int8{1, 2}, msg: `\"1\" is not greater than \"2\"`},\n\t\t{collection: []int16{1, 2}, msg: `\"1\" is not greater than \"2\"`},\n\t\t{collection: []int32{1, 2}, msg: `\"1\" is not greater than \"2\"`},\n\t\t{collection: []int64{1, 2}, msg: `\"1\" is not greater than \"2\"`},\n\t\t{collection: []uint8{1, 2}, msg: `\"1\" is not greater than \"2\"`},\n\t\t{collection: []uint16{1, 2}, msg: `\"1\" is not greater than \"2\"`},\n\t\t{collection: []uint32{1, 2}, msg: `\"1\" is not greater than \"2\"`},\n\t\t{collection: []uint64{1, 2}, msg: `\"1\" is not greater than \"2\"`},\n\t\t{collection: []float32{1.23, 2.34}, msg: `\"1.23\" is not greater than \"2.34\"`},\n\t\t{collection: []float64{1.23, 2.34}, msg: `\"1.23\" is not greater than \"2.34\"`},\n\t} {\n\t\tout := &outputT{buf: bytes.NewBuffer(nil)}\n\t\tFalse(t, IsDecreasing(out, currCase.collection))\n\t\tContains(t, out.buf.String(), currCase.msg)\n\t}\n}\n\nfunc TestIsNonDecreasing(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tif !IsNonDecreasing(mockT, []int{1, 2}) {\n\t\tt.Error(\"IsNonDecreasing should return true\")\n\t}\n\n\tif !IsNonDecreasing(mockT, []int{1, 1, 2, 3, 4, 5}) {\n\t\tt.Error(\"IsNonDecreasing should return true\")\n\t}\n\n\tif !IsNonDecreasing(mockT, []int{1, 1}) {\n\t\tt.Error(\"IsNonDecreasing should return false\")\n\t}\n\n\tif IsNonDecreasing(mockT, []int{2, 1}) {\n\t\tt.Error(\"IsNonDecreasing should return false\")\n\t}\n\n\t// Check error report\n\tfor _, currCase := range []struct {\n\t\tcollection interface{}\n\t\tmsg        string\n\t}{\n\t\t{collection: []string{\"b\", \"a\"}, msg: `\"b\" is not less than or equal to \"a\"`},\n\t\t{collection: []int{2, 1}, msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{collection: []int{2, 1, 3, 4, 5, 6, 7}, msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{collection: []int{-1, 0, 2, 1}, msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{collection: []int8{2, 1}, msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{collection: []int16{2, 1}, msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{collection: []int32{2, 1}, msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{collection: []int64{2, 1}, msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{collection: []uint8{2, 1}, msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{collection: []uint16{2, 1}, msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{collection: []uint32{2, 1}, msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{collection: []uint64{2, 1}, msg: `\"2\" is not less than or equal to \"1\"`},\n\t\t{collection: []float32{2.34, 1.23}, msg: `\"2.34\" is not less than or equal to \"1.23\"`},\n\t\t{collection: []float64{2.34, 1.23}, msg: `\"2.34\" is not less than or equal to \"1.23\"`},\n\t} {\n\t\tout := &outputT{buf: bytes.NewBuffer(nil)}\n\t\tFalse(t, IsNonDecreasing(out, currCase.collection))\n\t\tContains(t, out.buf.String(), currCase.msg)\n\t}\n}\n\nfunc TestOrderingMsgAndArgsForwarding(t *testing.T) {\n\tmsgAndArgs := []interface{}{\"format %s %x\", \"this\", 0xc001}\n\texpectedOutput := \"format this c001\\n\"\n\tcollection := []int{1, 2, 1}\n\tfuncs := []func(t TestingT){\n\t\tfunc(t TestingT) { IsIncreasing(t, collection, msgAndArgs...) },\n\t\tfunc(t TestingT) { IsNonIncreasing(t, collection, msgAndArgs...) },\n\t\tfunc(t TestingT) { IsDecreasing(t, collection, msgAndArgs...) },\n\t\tfunc(t TestingT) { IsNonDecreasing(t, collection, msgAndArgs...) },\n\t}\n\tfor _, f := range funcs {\n\t\tout := &outputT{buf: bytes.NewBuffer(nil)}\n\t\tf(out)\n\t\tContains(t, out.buf.String(), expectedOutput)\n\t}\n}\n"
  },
  {
    "path": "internal/testify/assert/assertions.go",
    "content": "package assert\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n\t\"os\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"runtime/debug\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode\"\n\t\"unicode/utf8\"\n\n\t\"github.com/expr-lang/expr/internal/spew\"\n\n\t\"github.com/expr-lang/expr/internal/difflib\"\n)\n\n//go:generate sh -c \"cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl\"\n\n// TestingT is an interface wrapper around *testing.T\ntype TestingT interface {\n\tErrorf(format string, args ...interface{})\n}\n\n// ComparisonAssertionFunc is a common function prototype when comparing two values.  Can be useful\n// for table driven tests.\ntype ComparisonAssertionFunc func(TestingT, interface{}, interface{}, ...interface{}) bool\n\n// ValueAssertionFunc is a common function prototype when validating a single value.  Can be useful\n// for table driven tests.\ntype ValueAssertionFunc func(TestingT, interface{}, ...interface{}) bool\n\n// BoolAssertionFunc is a common function prototype when validating a bool value.  Can be useful\n// for table driven tests.\ntype BoolAssertionFunc func(TestingT, bool, ...interface{}) bool\n\n// ErrorAssertionFunc is a common function prototype when validating an error value.  Can be useful\n// for table driven tests.\ntype ErrorAssertionFunc func(TestingT, error, ...interface{}) bool\n\n// PanicAssertionFunc is a common function prototype when validating a panic value.  Can be useful\n// for table driven tests.\ntype PanicAssertionFunc = func(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool\n\n// Comparison is a custom function that returns true on success and false on failure\ntype Comparison func() (success bool)\n\n/*\n\tHelper functions\n*/\n\n// ObjectsAreEqual determines if two objects are considered equal.\n//\n// This function does no assertion of any kind.\nfunc ObjectsAreEqual(expected, actual interface{}) bool {\n\tif expected == nil || actual == nil {\n\t\treturn expected == actual\n\t}\n\n\texp, ok := expected.([]byte)\n\tif !ok {\n\t\treturn reflect.DeepEqual(expected, actual)\n\t}\n\n\tact, ok := actual.([]byte)\n\tif !ok {\n\t\treturn false\n\t}\n\tif exp == nil || act == nil {\n\t\treturn exp == nil && act == nil\n\t}\n\treturn bytes.Equal(exp, act)\n}\n\n// copyExportedFields iterates downward through nested data structures and creates a copy\n// that only contains the exported struct fields.\nfunc copyExportedFields(expected interface{}) interface{} {\n\tif isNil(expected) {\n\t\treturn expected\n\t}\n\n\texpectedType := reflect.TypeOf(expected)\n\texpectedKind := expectedType.Kind()\n\texpectedValue := reflect.ValueOf(expected)\n\n\tswitch expectedKind {\n\tcase reflect.Struct:\n\t\tresult := reflect.New(expectedType).Elem()\n\t\tfor i := 0; i < expectedType.NumField(); i++ {\n\t\t\tfield := expectedType.Field(i)\n\t\t\tisExported := field.IsExported()\n\t\t\tif isExported {\n\t\t\t\tfieldValue := expectedValue.Field(i)\n\t\t\t\tif isNil(fieldValue) || isNil(fieldValue.Interface()) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tnewValue := copyExportedFields(fieldValue.Interface())\n\t\t\t\tresult.Field(i).Set(reflect.ValueOf(newValue))\n\t\t\t}\n\t\t}\n\t\treturn result.Interface()\n\n\tcase reflect.Ptr:\n\t\tresult := reflect.New(expectedType.Elem())\n\t\tunexportedRemoved := copyExportedFields(expectedValue.Elem().Interface())\n\t\tresult.Elem().Set(reflect.ValueOf(unexportedRemoved))\n\t\treturn result.Interface()\n\n\tcase reflect.Array, reflect.Slice:\n\t\tvar result reflect.Value\n\t\tif expectedKind == reflect.Array {\n\t\t\tresult = reflect.New(reflect.ArrayOf(expectedValue.Len(), expectedType.Elem())).Elem()\n\t\t} else {\n\t\t\tresult = reflect.MakeSlice(expectedType, expectedValue.Len(), expectedValue.Len())\n\t\t}\n\t\tfor i := 0; i < expectedValue.Len(); i++ {\n\t\t\tindex := expectedValue.Index(i)\n\t\t\tif isNil(index) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tunexportedRemoved := copyExportedFields(index.Interface())\n\t\t\tresult.Index(i).Set(reflect.ValueOf(unexportedRemoved))\n\t\t}\n\t\treturn result.Interface()\n\n\tcase reflect.Map:\n\t\tresult := reflect.MakeMap(expectedType)\n\t\tfor _, k := range expectedValue.MapKeys() {\n\t\t\tindex := expectedValue.MapIndex(k)\n\t\t\tunexportedRemoved := copyExportedFields(index.Interface())\n\t\t\tresult.SetMapIndex(k, reflect.ValueOf(unexportedRemoved))\n\t\t}\n\t\treturn result.Interface()\n\n\tdefault:\n\t\treturn expected\n\t}\n}\n\n// ObjectsExportedFieldsAreEqual determines if the exported (public) fields of two objects are\n// considered equal. This comparison of only exported fields is applied recursively to nested data\n// structures.\n//\n// This function does no assertion of any kind.\n//\n// Deprecated: Use [EqualExportedValues] instead.\nfunc ObjectsExportedFieldsAreEqual(expected, actual interface{}) bool {\n\texpectedCleaned := copyExportedFields(expected)\n\tactualCleaned := copyExportedFields(actual)\n\treturn ObjectsAreEqualValues(expectedCleaned, actualCleaned)\n}\n\n// ObjectsAreEqualValues gets whether two objects are equal, or if their\n// values are equal.\nfunc ObjectsAreEqualValues(expected, actual interface{}) bool {\n\tif ObjectsAreEqual(expected, actual) {\n\t\treturn true\n\t}\n\n\texpectedValue := reflect.ValueOf(expected)\n\tactualValue := reflect.ValueOf(actual)\n\tif !expectedValue.IsValid() || !actualValue.IsValid() {\n\t\treturn false\n\t}\n\n\texpectedType := expectedValue.Type()\n\tactualType := actualValue.Type()\n\tif !expectedType.ConvertibleTo(actualType) {\n\t\treturn false\n\t}\n\n\tif !isNumericType(expectedType) || !isNumericType(actualType) {\n\t\t// Attempt comparison after type conversion\n\t\treturn reflect.DeepEqual(\n\t\t\texpectedValue.Convert(actualType).Interface(), actual,\n\t\t)\n\t}\n\n\t// If BOTH values are numeric, there are chances of false positives due\n\t// to overflow or underflow. So, we need to make sure to always convert\n\t// the smaller type to a larger type before comparing.\n\tif expectedType.Size() >= actualType.Size() {\n\t\treturn actualValue.Convert(expectedType).Interface() == expected\n\t}\n\n\treturn expectedValue.Convert(actualType).Interface() == actual\n}\n\n// isNumericType returns true if the type is one of:\n// int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64,\n// float32, float64, complex64, complex128\nfunc isNumericType(t reflect.Type) bool {\n\treturn t.Kind() >= reflect.Int && t.Kind() <= reflect.Complex128\n}\n\n/* CallerInfo is necessary because the assert functions use the testing object\ninternally, causing it to print the file:line of the assert method, rather than where\nthe problem actually occurred in calling code.*/\n\n// CallerInfo returns an array of strings containing the file and line number\n// of each stack frame leading from the current test to the assert call that\n// failed.\nfunc CallerInfo() []string {\n\n\tvar pc uintptr\n\tvar ok bool\n\tvar file string\n\tvar line int\n\tvar name string\n\n\tcallers := []string{}\n\tfor i := 0; ; i++ {\n\t\tpc, file, line, ok = runtime.Caller(i)\n\t\tif !ok {\n\t\t\t// The breaks below failed to terminate the loop, and we ran off the\n\t\t\t// end of the call stack.\n\t\t\tbreak\n\t\t}\n\n\t\t// This is a huge edge case, but it will panic if this is the case, see #180\n\t\tif file == \"<autogenerated>\" {\n\t\t\tbreak\n\t\t}\n\n\t\tf := runtime.FuncForPC(pc)\n\t\tif f == nil {\n\t\t\tbreak\n\t\t}\n\t\tname = f.Name()\n\n\t\t// testing.tRunner is the standard library function that calls\n\t\t// tests. Subtests are called directly by tRunner, without going through\n\t\t// the Test/Benchmark/Example function that contains the t.Run calls, so\n\t\t// with subtests we should break when we hit tRunner, without adding it\n\t\t// to the list of callers.\n\t\tif name == \"testing.tRunner\" {\n\t\t\tbreak\n\t\t}\n\n\t\tparts := strings.Split(file, \"/\")\n\t\tif len(parts) > 1 {\n\t\t\tfilename := parts[len(parts)-1]\n\t\t\tdir := parts[len(parts)-2]\n\t\t\tif (dir != \"assert\" && dir != \"mock\" && dir != \"require\") || filename == \"mock_test.go\" {\n\t\t\t\tcallers = append(callers, fmt.Sprintf(\"%s:%d\", file, line))\n\t\t\t}\n\t\t}\n\n\t\t// Drop the package\n\t\tsegments := strings.Split(name, \".\")\n\t\tname = segments[len(segments)-1]\n\t\tif isTest(name, \"Test\") ||\n\t\t\tisTest(name, \"Benchmark\") ||\n\t\t\tisTest(name, \"Example\") {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn callers\n}\n\n// Stolen from the `go test` tool.\n// isTest tells whether name looks like a test (or benchmark, according to prefix).\n// It is a Test (say) if there is a character after Test that is not a lower-case letter.\n// We don't want TesticularCancer.\nfunc isTest(name, prefix string) bool {\n\tif !strings.HasPrefix(name, prefix) {\n\t\treturn false\n\t}\n\tif len(name) == len(prefix) { // \"Test\" is ok\n\t\treturn true\n\t}\n\tr, _ := utf8.DecodeRuneInString(name[len(prefix):])\n\treturn !unicode.IsLower(r)\n}\n\nfunc messageFromMsgAndArgs(msgAndArgs ...interface{}) string {\n\tif len(msgAndArgs) == 0 || msgAndArgs == nil {\n\t\treturn \"\"\n\t}\n\tif len(msgAndArgs) == 1 {\n\t\tmsg := msgAndArgs[0]\n\t\tif msgAsStr, ok := msg.(string); ok {\n\t\t\treturn msgAsStr\n\t\t}\n\t\treturn fmt.Sprintf(\"%+v\", msg)\n\t}\n\tif len(msgAndArgs) > 1 {\n\t\treturn fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...)\n\t}\n\treturn \"\"\n}\n\n// Aligns the provided message so that all lines after the first line start at the same location as the first line.\n// Assumes that the first line starts at the correct location (after carriage return, tab, label, spacer and tab).\n// The longestLabelLen parameter specifies the length of the longest label in the output (required because this is the\n// basis on which the alignment occurs).\nfunc indentMessageLines(message string, longestLabelLen int) string {\n\toutBuf := new(bytes.Buffer)\n\n\tfor i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ {\n\t\t// no need to align first line because it starts at the correct location (after the label)\n\t\tif i != 0 {\n\t\t\t// append alignLen+1 spaces to align with \"{{longestLabel}}:\" before adding tab\n\t\t\toutBuf.WriteString(\"\\n\\t\" + strings.Repeat(\" \", longestLabelLen+1) + \"\\t\")\n\t\t}\n\t\toutBuf.WriteString(scanner.Text())\n\t}\n\n\treturn outBuf.String()\n}\n\ntype failNower interface {\n\tFailNow()\n}\n\n// FailNow fails test\nfunc FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tFail(t, failureMessage, msgAndArgs...)\n\n\t// We cannot extend TestingT with FailNow() and\n\t// maintain backwards compatibility, so we fallback\n\t// to panicking when FailNow is not available in\n\t// TestingT.\n\t// See issue #263\n\n\tif t, ok := t.(failNower); ok {\n\t\tt.FailNow()\n\t} else {\n\t\tpanic(\"test failed and t is missing `FailNow()`\")\n\t}\n\treturn false\n}\n\n// Fail reports a failure through\nfunc Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tcontent := []labeledContent{\n\t\t{\"Error Trace\", strings.Join(CallerInfo(), \"\\n\\t\\t\\t\")},\n\t\t{\"Error\", failureMessage},\n\t}\n\n\t// Add test name if the Go version supports it\n\tif n, ok := t.(interface {\n\t\tName() string\n\t}); ok {\n\t\tcontent = append(content, labeledContent{\"Test\", n.Name()})\n\t}\n\n\tmessage := messageFromMsgAndArgs(msgAndArgs...)\n\tif len(message) > 0 {\n\t\tcontent = append(content, labeledContent{\"Messages\", message})\n\t}\n\n\tt.Errorf(\"\\n%s\", \"\"+labeledOutput(content...))\n\n\treturn false\n}\n\ntype labeledContent struct {\n\tlabel   string\n\tcontent string\n}\n\n// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner:\n//\n//\t\\t{{label}}:{{align_spaces}}\\t{{content}}\\n\n//\n// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The \"\\t{{label}}:\" is for the label.\n// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this\n// alignment is achieved, \"\\t{{content}}\\n\" is added for the output.\n//\n// If the content of the labeledOutput contains line breaks, the subsequent lines are aligned so that they start at the same location as the first line.\nfunc labeledOutput(content ...labeledContent) string {\n\tlongestLabel := 0\n\tfor _, v := range content {\n\t\tif len(v.label) > longestLabel {\n\t\t\tlongestLabel = len(v.label)\n\t\t}\n\t}\n\tvar output string\n\tfor _, v := range content {\n\t\toutput += \"\\t\" + v.label + \":\" + strings.Repeat(\" \", longestLabel-len(v.label)) + \"\\t\" + indentMessageLines(v.content, longestLabel) + \"\\n\"\n\t}\n\treturn output\n}\n\n// Implements asserts that an object is implemented by the specified interface.\n//\n//\tassert.Implements(t, (*MyInterface)(nil), new(MyObject))\nfunc Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tinterfaceType := reflect.TypeOf(interfaceObject).Elem()\n\n\tif object == nil {\n\t\treturn Fail(t, fmt.Sprintf(\"Cannot check if nil implements %v\", interfaceType), msgAndArgs...)\n\t}\n\tif !reflect.TypeOf(object).Implements(interfaceType) {\n\t\treturn Fail(t, fmt.Sprintf(\"%T must implement %v\", object, interfaceType), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// NotImplements asserts that an object does not implement the specified interface.\n//\n//\tassert.NotImplements(t, (*MyInterface)(nil), new(MyObject))\nfunc NotImplements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tinterfaceType := reflect.TypeOf(interfaceObject).Elem()\n\n\tif object == nil {\n\t\treturn Fail(t, fmt.Sprintf(\"Cannot check if nil does not implement %v\", interfaceType), msgAndArgs...)\n\t}\n\tif reflect.TypeOf(object).Implements(interfaceType) {\n\t\treturn Fail(t, fmt.Sprintf(\"%T implements %v\", object, interfaceType), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// IsType asserts that the specified objects are of the same type.\nfunc IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tif !ObjectsAreEqual(reflect.TypeOf(object), reflect.TypeOf(expectedType)) {\n\t\treturn Fail(t, fmt.Sprintf(\"Object expected to be of type %v, but was %v\", reflect.TypeOf(expectedType), reflect.TypeOf(object)), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// Equal asserts that two objects are equal.\n//\n//\tassert.Equal(t, 123, 123)\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif err := validateEqualArgs(expected, actual); err != nil {\n\t\treturn Fail(t, fmt.Sprintf(\"Invalid operation: %#v == %#v (%s)\",\n\t\t\texpected, actual, err), msgAndArgs...)\n\t}\n\n\tif !ObjectsAreEqual(expected, actual) {\n\t\tdiff := diff(expected, actual)\n\t\texpected, actual = formatUnequalValues(expected, actual)\n\t\treturn Fail(t, fmt.Sprintf(\"Not equal: \\n\"+\n\t\t\t\"expected: %s\\n\"+\n\t\t\t\"actual  : %s%s\", expected, actual, diff), msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// validateEqualArgs checks whether provided arguments can be safely used in the\n// Equal/NotEqual functions.\nfunc validateEqualArgs(expected, actual interface{}) error {\n\tif expected == nil && actual == nil {\n\t\treturn nil\n\t}\n\n\tif isFunction(expected) || isFunction(actual) {\n\t\treturn errors.New(\"cannot take func type as argument\")\n\t}\n\treturn nil\n}\n\n// Same asserts that two pointers reference the same object.\n//\n//\tassert.Same(t, ptr1, ptr2)\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tif !samePointers(expected, actual) {\n\t\treturn Fail(t, fmt.Sprintf(\"Not same: \\n\"+\n\t\t\t\"expected: %p %#v\\n\"+\n\t\t\t\"actual  : %p %#v\", expected, expected, actual, actual), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// NotSame asserts that two pointers do not reference the same object.\n//\n//\tassert.NotSame(t, ptr1, ptr2)\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tif samePointers(expected, actual) {\n\t\treturn Fail(t, fmt.Sprintf(\n\t\t\t\"Expected and actual point to the same object: %p %#v\",\n\t\t\texpected, expected), msgAndArgs...)\n\t}\n\treturn true\n}\n\n// samePointers compares two generic interface objects and returns whether\n// they point to the same object\nfunc samePointers(first, second interface{}) bool {\n\tfirstPtr, secondPtr := reflect.ValueOf(first), reflect.ValueOf(second)\n\tif firstPtr.Kind() != reflect.Ptr || secondPtr.Kind() != reflect.Ptr {\n\t\treturn false\n\t}\n\n\tfirstType, secondType := reflect.TypeOf(first), reflect.TypeOf(second)\n\tif firstType != secondType {\n\t\treturn false\n\t}\n\n\t// compare pointer addresses\n\treturn first == second\n}\n\n// formatUnequalValues takes two values of arbitrary types and returns string\n// representations appropriate to be presented to the user.\n//\n// If the values are not of like type, the returned strings will be prefixed\n// with the type name, and the value will be enclosed in parentheses similar\n// to a type conversion in the Go grammar.\nfunc formatUnequalValues(expected, actual interface{}) (e string, a string) {\n\tif reflect.TypeOf(expected) != reflect.TypeOf(actual) {\n\t\treturn fmt.Sprintf(\"%T(%s)\", expected, truncatingFormat(expected)),\n\t\t\tfmt.Sprintf(\"%T(%s)\", actual, truncatingFormat(actual))\n\t}\n\tswitch expected.(type) {\n\tcase time.Duration:\n\t\treturn fmt.Sprintf(\"%v\", expected), fmt.Sprintf(\"%v\", actual)\n\t}\n\treturn truncatingFormat(expected), truncatingFormat(actual)\n}\n\n// truncatingFormat formats the data and truncates it if it's too long.\n//\n// This helps keep formatted error messages lines from exceeding the\n// bufio.MaxScanTokenSize max line length that the go testing framework imposes.\nfunc truncatingFormat(data interface{}) string {\n\tvalue := fmt.Sprintf(\"%#v\", data)\n\tmax := bufio.MaxScanTokenSize - 100 // Give us some space the type info too if needed.\n\tif len(value) > max {\n\t\tvalue = value[0:max] + \"<... truncated>\"\n\t}\n\treturn value\n}\n\n// EqualValues asserts that two objects are equal or convertible to the same types\n// and equal.\n//\n//\tassert.EqualValues(t, uint32(123), int32(123))\nfunc EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tif !ObjectsAreEqualValues(expected, actual) {\n\t\tdiff := diff(expected, actual)\n\t\texpected, actual = formatUnequalValues(expected, actual)\n\t\treturn Fail(t, fmt.Sprintf(\"Not equal: \\n\"+\n\t\t\t\"expected: %s\\n\"+\n\t\t\t\"actual  : %s%s\", expected, actual, diff), msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// EqualExportedValues asserts that the types of two objects are equal and their public\n// fields are also equal. This is useful for comparing structs that have private fields\n// that could potentially differ.\n//\n//\t type S struct {\n//\t\tExported     \tint\n//\t\tnotExported   \tint\n//\t }\n//\t assert.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true\n//\t assert.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false\nfunc EqualExportedValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\taType := reflect.TypeOf(expected)\n\tbType := reflect.TypeOf(actual)\n\n\tif aType != bType {\n\t\treturn Fail(t, fmt.Sprintf(\"Types expected to match exactly\\n\\t%v != %v\", aType, bType), msgAndArgs...)\n\t}\n\n\tif aType.Kind() == reflect.Ptr {\n\t\taType = aType.Elem()\n\t}\n\tif bType.Kind() == reflect.Ptr {\n\t\tbType = bType.Elem()\n\t}\n\n\tif aType.Kind() != reflect.Struct {\n\t\treturn Fail(t, fmt.Sprintf(\"Types expected to both be struct or pointer to struct \\n\\t%v != %v\", aType.Kind(), reflect.Struct), msgAndArgs...)\n\t}\n\n\tif bType.Kind() != reflect.Struct {\n\t\treturn Fail(t, fmt.Sprintf(\"Types expected to both be struct or pointer to struct \\n\\t%v != %v\", bType.Kind(), reflect.Struct), msgAndArgs...)\n\t}\n\n\texpected = copyExportedFields(expected)\n\tactual = copyExportedFields(actual)\n\n\tif !ObjectsAreEqualValues(expected, actual) {\n\t\tdiff := diff(expected, actual)\n\t\texpected, actual = formatUnequalValues(expected, actual)\n\t\treturn Fail(t, fmt.Sprintf(\"Not equal (comparing only exported fields): \\n\"+\n\t\t\t\"expected: %s\\n\"+\n\t\t\t\"actual  : %s%s\", expected, actual, diff), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// Exactly asserts that two objects are equal in value and type.\n//\n//\tassert.Exactly(t, int32(123), int64(123))\nfunc Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\taType := reflect.TypeOf(expected)\n\tbType := reflect.TypeOf(actual)\n\n\tif aType != bType {\n\t\treturn Fail(t, fmt.Sprintf(\"Types expected to match exactly\\n\\t%v != %v\", aType, bType), msgAndArgs...)\n\t}\n\n\treturn Equal(t, expected, actual, msgAndArgs...)\n\n}\n\n// NotNil asserts that the specified object is not nil.\n//\n//\tassert.NotNil(t, err)\nfunc NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {\n\tif !isNil(object) {\n\t\treturn true\n\t}\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Fail(t, \"Expected value not to be nil.\", msgAndArgs...)\n}\n\n// isNil checks if a specified object is nil or not, without Failing.\nfunc isNil(object interface{}) bool {\n\tif object == nil {\n\t\treturn true\n\t}\n\n\tvalue := reflect.ValueOf(object)\n\tswitch value.Kind() {\n\tcase\n\t\treflect.Chan, reflect.Func,\n\t\treflect.Interface, reflect.Map,\n\t\treflect.Ptr, reflect.Slice, reflect.UnsafePointer:\n\n\t\treturn value.IsNil()\n\t}\n\n\treturn false\n}\n\n// Nil asserts that the specified object is nil.\n//\n//\tassert.Nil(t, err)\nfunc Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {\n\tif isNil(object) {\n\t\treturn true\n\t}\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\treturn Fail(t, fmt.Sprintf(\"Expected nil, but got: %#v\", object), msgAndArgs...)\n}\n\n// isEmpty gets whether the specified object is considered empty or not.\nfunc isEmpty(object interface{}) bool {\n\n\t// get nil case out of the way\n\tif object == nil {\n\t\treturn true\n\t}\n\n\tobjValue := reflect.ValueOf(object)\n\n\tswitch objValue.Kind() {\n\t// collection types are empty when they have no element\n\tcase reflect.Chan, reflect.Map, reflect.Slice:\n\t\treturn objValue.Len() == 0\n\t// pointers are empty if nil or if the value they point to is empty\n\tcase reflect.Ptr:\n\t\tif objValue.IsNil() {\n\t\t\treturn true\n\t\t}\n\t\tderef := objValue.Elem().Interface()\n\t\treturn isEmpty(deref)\n\t// for all other types, compare against the zero value\n\t// array types are empty when they match their zero-initialized state\n\tdefault:\n\t\tzero := reflect.Zero(objValue.Type())\n\t\treturn reflect.DeepEqual(object, zero.Interface())\n\t}\n}\n\n// Empty asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\tassert.Empty(t, obj)\nfunc Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {\n\tpass := isEmpty(object)\n\tif !pass {\n\t\tif h, ok := t.(tHelper); ok {\n\t\t\th.Helper()\n\t\t}\n\t\tFail(t, fmt.Sprintf(\"Should be empty, but was %v\", object), msgAndArgs...)\n\t}\n\n\treturn pass\n\n}\n\n// NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\tif assert.NotEmpty(t, obj) {\n//\t  assert.Equal(t, \"two\", obj[1])\n//\t}\nfunc NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {\n\tpass := !isEmpty(object)\n\tif !pass {\n\t\tif h, ok := t.(tHelper); ok {\n\t\t\th.Helper()\n\t\t}\n\t\tFail(t, fmt.Sprintf(\"Should NOT be empty, but was %v\", object), msgAndArgs...)\n\t}\n\n\treturn pass\n\n}\n\n// getLen tries to get the length of an object.\n// It returns (0, false) if impossible.\nfunc getLen(x interface{}) (length int, ok bool) {\n\tv := reflect.ValueOf(x)\n\tdefer func() {\n\t\tok = recover() == nil\n\t}()\n\treturn v.Len(), true\n}\n\n// Len asserts that the specified object has specific length.\n// Len also fails if the object has a type that len() not accept.\n//\n//\tassert.Len(t, mySlice, 3)\nfunc Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tl, ok := getLen(object)\n\tif !ok {\n\t\treturn Fail(t, fmt.Sprintf(\"\\\"%v\\\" could not be applied builtin len()\", object), msgAndArgs...)\n\t}\n\n\tif l != length {\n\t\treturn Fail(t, fmt.Sprintf(\"\\\"%v\\\" should have %d item(s), but has %d\", object, length, l), msgAndArgs...)\n\t}\n\treturn true\n}\n\n// True asserts that the specified value is true.\n//\n//\tassert.True(t, myBool)\nfunc True(t TestingT, value bool, msgAndArgs ...interface{}) bool {\n\tif !value {\n\t\tif h, ok := t.(tHelper); ok {\n\t\t\th.Helper()\n\t\t}\n\t\treturn Fail(t, \"Should be true\", msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// False asserts that the specified value is false.\n//\n//\tassert.False(t, myBool)\nfunc False(t TestingT, value bool, msgAndArgs ...interface{}) bool {\n\tif value {\n\t\tif h, ok := t.(tHelper); ok {\n\t\t\th.Helper()\n\t\t}\n\t\treturn Fail(t, \"Should be false\", msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// NotEqual asserts that the specified values are NOT equal.\n//\n//\tassert.NotEqual(t, obj1, obj2)\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif err := validateEqualArgs(expected, actual); err != nil {\n\t\treturn Fail(t, fmt.Sprintf(\"Invalid operation: %#v != %#v (%s)\",\n\t\t\texpected, actual, err), msgAndArgs...)\n\t}\n\n\tif ObjectsAreEqual(expected, actual) {\n\t\treturn Fail(t, fmt.Sprintf(\"Should not be: %#v\\n\", actual), msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// NotEqualValues asserts that two objects are not equal even when converted to the same type\n//\n//\tassert.NotEqualValues(t, obj1, obj2)\nfunc NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tif ObjectsAreEqualValues(expected, actual) {\n\t\treturn Fail(t, fmt.Sprintf(\"Should not be: %#v\\n\", actual), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// containsElement try loop over the list check if the list includes the element.\n// return (false, false) if impossible.\n// return (true, false) if element was not found.\n// return (true, true) if element was found.\nfunc containsElement(list interface{}, element interface{}) (ok, found bool) {\n\n\tlistValue := reflect.ValueOf(list)\n\tlistType := reflect.TypeOf(list)\n\tif listType == nil {\n\t\treturn false, false\n\t}\n\tlistKind := listType.Kind()\n\tdefer func() {\n\t\tif e := recover(); e != nil {\n\t\t\tok = false\n\t\t\tfound = false\n\t\t}\n\t}()\n\n\tif listKind == reflect.String {\n\t\telementValue := reflect.ValueOf(element)\n\t\treturn true, strings.Contains(listValue.String(), elementValue.String())\n\t}\n\n\tif listKind == reflect.Map {\n\t\tmapKeys := listValue.MapKeys()\n\t\tfor i := 0; i < len(mapKeys); i++ {\n\t\t\tif ObjectsAreEqual(mapKeys[i].Interface(), element) {\n\t\t\t\treturn true, true\n\t\t\t}\n\t\t}\n\t\treturn true, false\n\t}\n\n\tfor i := 0; i < listValue.Len(); i++ {\n\t\tif ObjectsAreEqual(listValue.Index(i).Interface(), element) {\n\t\t\treturn true, true\n\t\t}\n\t}\n\treturn true, false\n\n}\n\n// Contains asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//\tassert.Contains(t, \"Hello World\", \"World\")\n//\tassert.Contains(t, [\"Hello\", \"World\"], \"World\")\n//\tassert.Contains(t, {\"Hello\": \"World\"}, \"Hello\")\nfunc Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tok, found := containsElement(s, contains)\n\tif !ok {\n\t\treturn Fail(t, fmt.Sprintf(\"%#v could not be applied builtin len()\", s), msgAndArgs...)\n\t}\n\tif !found {\n\t\treturn Fail(t, fmt.Sprintf(\"%#v does not contain %#v\", s, contains), msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//\tassert.NotContains(t, \"Hello World\", \"Earth\")\n//\tassert.NotContains(t, [\"Hello\", \"World\"], \"Earth\")\n//\tassert.NotContains(t, {\"Hello\": \"World\"}, \"Earth\")\nfunc NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tok, found := containsElement(s, contains)\n\tif !ok {\n\t\treturn Fail(t, fmt.Sprintf(\"%#v could not be applied builtin len()\", s), msgAndArgs...)\n\t}\n\tif found {\n\t\treturn Fail(t, fmt.Sprintf(\"%#v should not contain %#v\", s, contains), msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// Subset asserts that the specified list(array, slice...) or map contains all\n// elements given in the specified subset list(array, slice...) or map.\n//\n//\tassert.Subset(t, [1, 2, 3], [1, 2])\n//\tassert.Subset(t, {\"x\": 1, \"y\": 2}, {\"x\": 1})\nfunc Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif subset == nil {\n\t\treturn true // we consider nil to be equal to the nil set\n\t}\n\n\tlistKind := reflect.TypeOf(list).Kind()\n\tif listKind != reflect.Array && listKind != reflect.Slice && listKind != reflect.Map {\n\t\treturn Fail(t, fmt.Sprintf(\"%q has an unsupported type %s\", list, listKind), msgAndArgs...)\n\t}\n\n\tsubsetKind := reflect.TypeOf(subset).Kind()\n\tif subsetKind != reflect.Array && subsetKind != reflect.Slice && listKind != reflect.Map {\n\t\treturn Fail(t, fmt.Sprintf(\"%q has an unsupported type %s\", subset, subsetKind), msgAndArgs...)\n\t}\n\n\tif subsetKind == reflect.Map && listKind == reflect.Map {\n\t\tsubsetMap := reflect.ValueOf(subset)\n\t\tactualMap := reflect.ValueOf(list)\n\n\t\tfor _, k := range subsetMap.MapKeys() {\n\t\t\tev := subsetMap.MapIndex(k)\n\t\t\tav := actualMap.MapIndex(k)\n\n\t\t\tif !av.IsValid() {\n\t\t\t\treturn Fail(t, fmt.Sprintf(\"%#v does not contain %#v\", list, subset), msgAndArgs...)\n\t\t\t}\n\t\t\tif !ObjectsAreEqual(ev.Interface(), av.Interface()) {\n\t\t\t\treturn Fail(t, fmt.Sprintf(\"%#v does not contain %#v\", list, subset), msgAndArgs...)\n\t\t\t}\n\t\t}\n\n\t\treturn true\n\t}\n\n\tsubsetList := reflect.ValueOf(subset)\n\tfor i := 0; i < subsetList.Len(); i++ {\n\t\telement := subsetList.Index(i).Interface()\n\t\tok, found := containsElement(list, element)\n\t\tif !ok {\n\t\t\treturn Fail(t, fmt.Sprintf(\"%#v could not be applied builtin len()\", list), msgAndArgs...)\n\t\t}\n\t\tif !found {\n\t\t\treturn Fail(t, fmt.Sprintf(\"%#v does not contain %#v\", list, element), msgAndArgs...)\n\t\t}\n\t}\n\n\treturn true\n}\n\n// NotSubset asserts that the specified list(array, slice...) or map does NOT\n// contain all elements given in the specified subset list(array, slice...) or\n// map.\n//\n//\tassert.NotSubset(t, [1, 3, 4], [1, 2])\n//\tassert.NotSubset(t, {\"x\": 1, \"y\": 2}, {\"z\": 3})\nfunc NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif subset == nil {\n\t\treturn Fail(t, \"nil is the empty set which is a subset of every set\", msgAndArgs...)\n\t}\n\n\tlistKind := reflect.TypeOf(list).Kind()\n\tif listKind != reflect.Array && listKind != reflect.Slice && listKind != reflect.Map {\n\t\treturn Fail(t, fmt.Sprintf(\"%q has an unsupported type %s\", list, listKind), msgAndArgs...)\n\t}\n\n\tsubsetKind := reflect.TypeOf(subset).Kind()\n\tif subsetKind != reflect.Array && subsetKind != reflect.Slice && listKind != reflect.Map {\n\t\treturn Fail(t, fmt.Sprintf(\"%q has an unsupported type %s\", subset, subsetKind), msgAndArgs...)\n\t}\n\n\tif subsetKind == reflect.Map && listKind == reflect.Map {\n\t\tsubsetMap := reflect.ValueOf(subset)\n\t\tactualMap := reflect.ValueOf(list)\n\n\t\tfor _, k := range subsetMap.MapKeys() {\n\t\t\tev := subsetMap.MapIndex(k)\n\t\t\tav := actualMap.MapIndex(k)\n\n\t\t\tif !av.IsValid() {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif !ObjectsAreEqual(ev.Interface(), av.Interface()) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn Fail(t, fmt.Sprintf(\"%q is a subset of %q\", subset, list), msgAndArgs...)\n\t}\n\n\tsubsetList := reflect.ValueOf(subset)\n\tfor i := 0; i < subsetList.Len(); i++ {\n\t\telement := subsetList.Index(i).Interface()\n\t\tok, found := containsElement(list, element)\n\t\tif !ok {\n\t\t\treturn Fail(t, fmt.Sprintf(\"\\\"%s\\\" could not be applied builtin len()\", list), msgAndArgs...)\n\t\t}\n\t\tif !found {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn Fail(t, fmt.Sprintf(\"%q is a subset of %q\", subset, list), msgAndArgs...)\n}\n\n// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified\n// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,\n// the number of appearances of each of them in both lists should match.\n//\n// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2])\nfunc ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif isEmpty(listA) && isEmpty(listB) {\n\t\treturn true\n\t}\n\n\tif !isList(t, listA, msgAndArgs...) || !isList(t, listB, msgAndArgs...) {\n\t\treturn false\n\t}\n\n\textraA, extraB := diffLists(listA, listB)\n\n\tif len(extraA) == 0 && len(extraB) == 0 {\n\t\treturn true\n\t}\n\n\treturn Fail(t, formatListDiff(listA, listB, extraA, extraB), msgAndArgs...)\n}\n\n// isList checks that the provided value is array or slice.\nfunc isList(t TestingT, list interface{}, msgAndArgs ...interface{}) (ok bool) {\n\tkind := reflect.TypeOf(list).Kind()\n\tif kind != reflect.Array && kind != reflect.Slice {\n\t\treturn Fail(t, fmt.Sprintf(\"%q has an unsupported type %s, expecting array or slice\", list, kind),\n\t\t\tmsgAndArgs...)\n\t}\n\treturn true\n}\n\n// diffLists diffs two arrays/slices and returns slices of elements that are only in A and only in B.\n// If some element is present multiple times, each instance is counted separately (e.g. if something is 2x in A and\n// 5x in B, it will be 0x in extraA and 3x in extraB). The order of items in both lists is ignored.\nfunc diffLists(listA, listB interface{}) (extraA, extraB []interface{}) {\n\taValue := reflect.ValueOf(listA)\n\tbValue := reflect.ValueOf(listB)\n\n\taLen := aValue.Len()\n\tbLen := bValue.Len()\n\n\t// Mark indexes in bValue that we already used\n\tvisited := make([]bool, bLen)\n\tfor i := 0; i < aLen; i++ {\n\t\telement := aValue.Index(i).Interface()\n\t\tfound := false\n\t\tfor j := 0; j < bLen; j++ {\n\t\t\tif visited[j] {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif ObjectsAreEqual(bValue.Index(j).Interface(), element) {\n\t\t\t\tvisited[j] = true\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\textraA = append(extraA, element)\n\t\t}\n\t}\n\n\tfor j := 0; j < bLen; j++ {\n\t\tif visited[j] {\n\t\t\tcontinue\n\t\t}\n\t\textraB = append(extraB, bValue.Index(j).Interface())\n\t}\n\n\treturn\n}\n\nfunc formatListDiff(listA, listB interface{}, extraA, extraB []interface{}) string {\n\tvar msg bytes.Buffer\n\n\tmsg.WriteString(\"elements differ\")\n\tif len(extraA) > 0 {\n\t\tmsg.WriteString(\"\\n\\nextra elements in list A:\\n\")\n\t\tmsg.WriteString(spewConfig.Sdump(extraA))\n\t}\n\tif len(extraB) > 0 {\n\t\tmsg.WriteString(\"\\n\\nextra elements in list B:\\n\")\n\t\tmsg.WriteString(spewConfig.Sdump(extraB))\n\t}\n\tmsg.WriteString(\"\\n\\nlistA:\\n\")\n\tmsg.WriteString(spewConfig.Sdump(listA))\n\tmsg.WriteString(\"\\n\\nlistB:\\n\")\n\tmsg.WriteString(spewConfig.Sdump(listB))\n\n\treturn msg.String()\n}\n\n// Condition uses a Comparison to assert a complex condition.\nfunc Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tresult := comp()\n\tif !result {\n\t\tFail(t, \"Condition failed!\", msgAndArgs...)\n\t}\n\treturn result\n}\n\n// PanicTestFunc defines a func that should be passed to the assert.Panics and assert.NotPanics\n// methods, and represents a simple func that takes no arguments, and returns nothing.\ntype PanicTestFunc func()\n\n// didPanic returns true if the function passed to it panics. Otherwise, it returns false.\nfunc didPanic(f PanicTestFunc) (didPanic bool, message interface{}, stack string) {\n\tdidPanic = true\n\n\tdefer func() {\n\t\tmessage = recover()\n\t\tif didPanic {\n\t\t\tstack = string(debug.Stack())\n\t\t}\n\t}()\n\n\t// call the target function\n\tf()\n\tdidPanic = false\n\n\treturn\n}\n\n// Panics asserts that the code inside the specified PanicTestFunc panics.\n//\n//\tassert.Panics(t, func(){ GoCrazy() })\nfunc Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tif funcDidPanic, panicValue, _ := didPanic(f); !funcDidPanic {\n\t\treturn Fail(t, fmt.Sprintf(\"func %#v should panic\\n\\tPanic value:\\t%#v\", f, panicValue), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//\tassert.PanicsWithValue(t, \"crazy error\", func(){ GoCrazy() })\nfunc PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tfuncDidPanic, panicValue, panickedStack := didPanic(f)\n\tif !funcDidPanic {\n\t\treturn Fail(t, fmt.Sprintf(\"func %#v should panic\\n\\tPanic value:\\t%#v\", f, panicValue), msgAndArgs...)\n\t}\n\tif panicValue != expected {\n\t\treturn Fail(t, fmt.Sprintf(\"func %#v should panic with value:\\t%#v\\n\\tPanic value:\\t%#v\\n\\tPanic stack:\\t%s\", f, expected, panicValue, panickedStack), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// PanicsWithError asserts that the code inside the specified PanicTestFunc\n// panics, and that the recovered panic value is an error that satisfies the\n// EqualError comparison.\n//\n//\tassert.PanicsWithError(t, \"crazy error\", func(){ GoCrazy() })\nfunc PanicsWithError(t TestingT, errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tfuncDidPanic, panicValue, panickedStack := didPanic(f)\n\tif !funcDidPanic {\n\t\treturn Fail(t, fmt.Sprintf(\"func %#v should panic\\n\\tPanic value:\\t%#v\", f, panicValue), msgAndArgs...)\n\t}\n\tpanicErr, ok := panicValue.(error)\n\tif !ok || panicErr.Error() != errString {\n\t\treturn Fail(t, fmt.Sprintf(\"func %#v should panic with error message:\\t%#v\\n\\tPanic value:\\t%#v\\n\\tPanic stack:\\t%s\", f, errString, panicValue, panickedStack), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//\tassert.NotPanics(t, func(){ RemainCalm() })\nfunc NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tif funcDidPanic, panicValue, panickedStack := didPanic(f); funcDidPanic {\n\t\treturn Fail(t, fmt.Sprintf(\"func %#v should not panic\\n\\tPanic value:\\t%v\\n\\tPanic stack:\\t%s\", f, panicValue, panickedStack), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// WithinDuration asserts that the two times are within duration delta of each other.\n//\n//\tassert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)\nfunc WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tdt := expected.Sub(actual)\n\tif dt < -delta || dt > delta {\n\t\treturn Fail(t, fmt.Sprintf(\"Max difference between %v and %v allowed is %v, but difference was %v\", expected, actual, delta, dt), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// WithinRange asserts that a time is within a time range (inclusive).\n//\n//\tassert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second))\nfunc WithinRange(t TestingT, actual, start, end time.Time, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tif end.Before(start) {\n\t\treturn Fail(t, \"Start should be before end\", msgAndArgs...)\n\t}\n\n\tif actual.Before(start) {\n\t\treturn Fail(t, fmt.Sprintf(\"Time %v expected to be in time range %v to %v, but is before the range\", actual, start, end), msgAndArgs...)\n\t} else if actual.After(end) {\n\t\treturn Fail(t, fmt.Sprintf(\"Time %v expected to be in time range %v to %v, but is after the range\", actual, start, end), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\nfunc toFloat(x interface{}) (float64, bool) {\n\tvar xf float64\n\txok := true\n\n\tswitch xn := x.(type) {\n\tcase uint:\n\t\txf = float64(xn)\n\tcase uint8:\n\t\txf = float64(xn)\n\tcase uint16:\n\t\txf = float64(xn)\n\tcase uint32:\n\t\txf = float64(xn)\n\tcase uint64:\n\t\txf = float64(xn)\n\tcase int:\n\t\txf = float64(xn)\n\tcase int8:\n\t\txf = float64(xn)\n\tcase int16:\n\t\txf = float64(xn)\n\tcase int32:\n\t\txf = float64(xn)\n\tcase int64:\n\t\txf = float64(xn)\n\tcase float32:\n\t\txf = float64(xn)\n\tcase float64:\n\t\txf = xn\n\tcase time.Duration:\n\t\txf = float64(xn)\n\tdefault:\n\t\txok = false\n\t}\n\n\treturn xf, xok\n}\n\n// InDelta asserts that the two numerals are within delta of each other.\n//\n//\tassert.InDelta(t, math.Pi, 22/7.0, 0.01)\nfunc InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\taf, aok := toFloat(expected)\n\tbf, bok := toFloat(actual)\n\n\tif !aok || !bok {\n\t\treturn Fail(t, \"Parameters must be numerical\", msgAndArgs...)\n\t}\n\n\tif math.IsNaN(af) && math.IsNaN(bf) {\n\t\treturn true\n\t}\n\n\tif math.IsNaN(af) {\n\t\treturn Fail(t, \"Expected must not be NaN\", msgAndArgs...)\n\t}\n\n\tif math.IsNaN(bf) {\n\t\treturn Fail(t, fmt.Sprintf(\"Expected %v with delta %v, but was NaN\", expected, delta), msgAndArgs...)\n\t}\n\n\tdt := af - bf\n\tif dt < -delta || dt > delta {\n\t\treturn Fail(t, fmt.Sprintf(\"Max difference between %v and %v allowed is %v, but difference was %v\", expected, actual, delta, dt), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// InDeltaSlice is the same as InDelta, except it compares two slices.\nfunc InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif expected == nil || actual == nil ||\n\t\treflect.TypeOf(actual).Kind() != reflect.Slice ||\n\t\treflect.TypeOf(expected).Kind() != reflect.Slice {\n\t\treturn Fail(t, \"Parameters must be slice\", msgAndArgs...)\n\t}\n\n\tactualSlice := reflect.ValueOf(actual)\n\texpectedSlice := reflect.ValueOf(expected)\n\n\tfor i := 0; i < actualSlice.Len(); i++ {\n\t\tresult := InDelta(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta, msgAndArgs...)\n\t\tif !result {\n\t\t\treturn result\n\t\t}\n\t}\n\n\treturn true\n}\n\n// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.\nfunc InDeltaMapValues(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif expected == nil || actual == nil ||\n\t\treflect.TypeOf(actual).Kind() != reflect.Map ||\n\t\treflect.TypeOf(expected).Kind() != reflect.Map {\n\t\treturn Fail(t, \"Arguments must be maps\", msgAndArgs...)\n\t}\n\n\texpectedMap := reflect.ValueOf(expected)\n\tactualMap := reflect.ValueOf(actual)\n\n\tif expectedMap.Len() != actualMap.Len() {\n\t\treturn Fail(t, \"Arguments must have the same number of keys\", msgAndArgs...)\n\t}\n\n\tfor _, k := range expectedMap.MapKeys() {\n\t\tev := expectedMap.MapIndex(k)\n\t\tav := actualMap.MapIndex(k)\n\n\t\tif !ev.IsValid() {\n\t\t\treturn Fail(t, fmt.Sprintf(\"missing key %q in expected map\", k), msgAndArgs...)\n\t\t}\n\n\t\tif !av.IsValid() {\n\t\t\treturn Fail(t, fmt.Sprintf(\"missing key %q in actual map\", k), msgAndArgs...)\n\t\t}\n\n\t\tif !InDelta(\n\t\t\tt,\n\t\t\tev.Interface(),\n\t\t\tav.Interface(),\n\t\t\tdelta,\n\t\t\tmsgAndArgs...,\n\t\t) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\nfunc calcRelativeError(expected, actual interface{}) (float64, error) {\n\taf, aok := toFloat(expected)\n\tbf, bok := toFloat(actual)\n\tif !aok || !bok {\n\t\treturn 0, fmt.Errorf(\"Parameters must be numerical\")\n\t}\n\tif math.IsNaN(af) && math.IsNaN(bf) {\n\t\treturn 0, nil\n\t}\n\tif math.IsNaN(af) {\n\t\treturn 0, errors.New(\"expected value must not be NaN\")\n\t}\n\tif af == 0 {\n\t\treturn 0, fmt.Errorf(\"expected value must have a value other than zero to calculate the relative error\")\n\t}\n\tif math.IsNaN(bf) {\n\t\treturn 0, errors.New(\"actual value must not be NaN\")\n\t}\n\n\treturn math.Abs(af-bf) / math.Abs(af), nil\n}\n\n// InEpsilon asserts that expected and actual have a relative error less than epsilon\nfunc InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif math.IsNaN(epsilon) {\n\t\treturn Fail(t, \"epsilon must not be NaN\", msgAndArgs...)\n\t}\n\tactualEpsilon, err := calcRelativeError(expected, actual)\n\tif err != nil {\n\t\treturn Fail(t, err.Error(), msgAndArgs...)\n\t}\n\tif actualEpsilon > epsilon {\n\t\treturn Fail(t, fmt.Sprintf(\"Relative error is too high: %#v (expected)\\n\"+\n\t\t\t\"        < %#v (actual)\", epsilon, actualEpsilon), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.\nfunc InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tif expected == nil || actual == nil {\n\t\treturn Fail(t, \"Parameters must be slice\", msgAndArgs...)\n\t}\n\n\texpectedSlice := reflect.ValueOf(expected)\n\tactualSlice := reflect.ValueOf(actual)\n\n\tif expectedSlice.Type().Kind() != reflect.Slice {\n\t\treturn Fail(t, \"Expected value must be slice\", msgAndArgs...)\n\t}\n\n\texpectedLen := expectedSlice.Len()\n\tif !IsType(t, expected, actual) || !Len(t, actual, expectedLen) {\n\t\treturn false\n\t}\n\n\tfor i := 0; i < expectedLen; i++ {\n\t\tif !InEpsilon(t, expectedSlice.Index(i).Interface(), actualSlice.Index(i).Interface(), epsilon, \"at index %d\", i) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n/*\n\tErrors\n*/\n\n// NoError asserts that a function returned no error (i.e. `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if assert.NoError(t, err) {\n//\t\t   assert.Equal(t, expectedObj, actualObj)\n//\t  }\nfunc NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {\n\tif err != nil {\n\t\tif h, ok := t.(tHelper); ok {\n\t\t\th.Helper()\n\t\t}\n\t\treturn Fail(t, fmt.Sprintf(\"Received unexpected error:\\n%+v\", err), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// Error asserts that a function returned an error (i.e. not `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if assert.Error(t, err) {\n//\t\t   assert.Equal(t, expectedError, err)\n//\t  }\nfunc Error(t TestingT, err error, msgAndArgs ...interface{}) bool {\n\tif err == nil {\n\t\tif h, ok := t.(tHelper); ok {\n\t\t\th.Helper()\n\t\t}\n\t\treturn Fail(t, \"An error is expected but got nil.\", msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// EqualError asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//\tactualObj, err := SomeFunction()\n//\tassert.EqualError(t, err,  expectedErrorString)\nfunc EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif !Error(t, theError, msgAndArgs...) {\n\t\treturn false\n\t}\n\texpected := errString\n\tactual := theError.Error()\n\t// don't need to use deep equals here, we know they are both strings\n\tif expected != actual {\n\t\treturn Fail(t, fmt.Sprintf(\"Error message not equal:\\n\"+\n\t\t\t\"expected: %q\\n\"+\n\t\t\t\"actual  : %q\", expected, actual), msgAndArgs...)\n\t}\n\treturn true\n}\n\n// ErrorContains asserts that a function returned an error (i.e. not `nil`)\n// and that the error contains the specified substring.\n//\n//\tactualObj, err := SomeFunction()\n//\tassert.ErrorContains(t, err,  expectedErrorSubString)\nfunc ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif !Error(t, theError, msgAndArgs...) {\n\t\treturn false\n\t}\n\n\tactual := theError.Error()\n\tif !strings.Contains(actual, contains) {\n\t\treturn Fail(t, fmt.Sprintf(\"Error %#v does not contain %#v\", actual, contains), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// matchRegexp return true if a specified regexp matches a string.\nfunc matchRegexp(rx interface{}, str interface{}) bool {\n\n\tvar r *regexp.Regexp\n\tif rr, ok := rx.(*regexp.Regexp); ok {\n\t\tr = rr\n\t} else {\n\t\tr = regexp.MustCompile(fmt.Sprint(rx))\n\t}\n\n\treturn (r.FindStringIndex(fmt.Sprint(str)) != nil)\n\n}\n\n// Regexp asserts that a specified regexp matches a string.\n//\n//\tassert.Regexp(t, regexp.MustCompile(\"start\"), \"it's starting\")\n//\tassert.Regexp(t, \"start...$\", \"it's not starting\")\nfunc Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tmatch := matchRegexp(rx, str)\n\n\tif !match {\n\t\tFail(t, fmt.Sprintf(\"Expect \\\"%v\\\" to match \\\"%v\\\"\", str, rx), msgAndArgs...)\n\t}\n\n\treturn match\n}\n\n// NotRegexp asserts that a specified regexp does not match a string.\n//\n//\tassert.NotRegexp(t, regexp.MustCompile(\"starts\"), \"it's starting\")\n//\tassert.NotRegexp(t, \"^start\", \"it's not starting\")\nfunc NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tmatch := matchRegexp(rx, str)\n\n\tif match {\n\t\tFail(t, fmt.Sprintf(\"Expect \\\"%v\\\" to NOT match \\\"%v\\\"\", str, rx), msgAndArgs...)\n\t}\n\n\treturn !match\n\n}\n\n// Zero asserts that i is the zero value for its type.\nfunc Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif i != nil && !reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) {\n\t\treturn Fail(t, fmt.Sprintf(\"Should be zero, but was %v\", i), msgAndArgs...)\n\t}\n\treturn true\n}\n\n// NotZero asserts that i is not the zero value for its type.\nfunc NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif i == nil || reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) {\n\t\treturn Fail(t, fmt.Sprintf(\"Should not be zero, but was %v\", i), msgAndArgs...)\n\t}\n\treturn true\n}\n\n// FileExists checks whether a file exists in the given path. It also fails if\n// the path points to a directory or there is an error when trying to check the file.\nfunc FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tinfo, err := os.Lstat(path)\n\tif err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn Fail(t, fmt.Sprintf(\"unable to find file %q\", path), msgAndArgs...)\n\t\t}\n\t\treturn Fail(t, fmt.Sprintf(\"error when running os.Lstat(%q): %s\", path, err), msgAndArgs...)\n\t}\n\tif info.IsDir() {\n\t\treturn Fail(t, fmt.Sprintf(\"%q is a directory\", path), msgAndArgs...)\n\t}\n\treturn true\n}\n\n// NoFileExists checks whether a file does not exist in a given path. It fails\n// if the path points to an existing _file_ only.\nfunc NoFileExists(t TestingT, path string, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tinfo, err := os.Lstat(path)\n\tif err != nil {\n\t\treturn true\n\t}\n\tif info.IsDir() {\n\t\treturn true\n\t}\n\treturn Fail(t, fmt.Sprintf(\"file %q exists\", path), msgAndArgs...)\n}\n\n// DirExists checks whether a directory exists in the given path. It also fails\n// if the path is a file rather a directory or there is an error checking whether it exists.\nfunc DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tinfo, err := os.Lstat(path)\n\tif err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn Fail(t, fmt.Sprintf(\"unable to find file %q\", path), msgAndArgs...)\n\t\t}\n\t\treturn Fail(t, fmt.Sprintf(\"error when running os.Lstat(%q): %s\", path, err), msgAndArgs...)\n\t}\n\tif !info.IsDir() {\n\t\treturn Fail(t, fmt.Sprintf(\"%q is a file\", path), msgAndArgs...)\n\t}\n\treturn true\n}\n\n// NoDirExists checks whether a directory does not exist in the given path.\n// It fails if the path points to an existing _directory_ only.\nfunc NoDirExists(t TestingT, path string, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tinfo, err := os.Lstat(path)\n\tif err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn true\n\t\t}\n\t\treturn true\n\t}\n\tif !info.IsDir() {\n\t\treturn true\n\t}\n\treturn Fail(t, fmt.Sprintf(\"directory %q exists\", path), msgAndArgs...)\n}\n\n// JSONEq asserts that two JSON strings are equivalent.\n//\n//\tassert.JSONEq(t, `{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`)\nfunc JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tvar expectedJSONAsInterface, actualJSONAsInterface interface{}\n\n\tif err := json.Unmarshal([]byte(expected), &expectedJSONAsInterface); err != nil {\n\t\treturn Fail(t, fmt.Sprintf(\"Expected value ('%s') is not valid json.\\nJSON parsing error: '%s'\", expected, err.Error()), msgAndArgs...)\n\t}\n\n\tif err := json.Unmarshal([]byte(actual), &actualJSONAsInterface); err != nil {\n\t\treturn Fail(t, fmt.Sprintf(\"Input ('%s') needs to be valid json.\\nJSON parsing error: '%s'\", actual, err.Error()), msgAndArgs...)\n\t}\n\n\treturn Equal(t, expectedJSONAsInterface, actualJSONAsInterface, msgAndArgs...)\n}\n\nfunc typeAndKind(v interface{}) (reflect.Type, reflect.Kind) {\n\tt := reflect.TypeOf(v)\n\tk := t.Kind()\n\n\tif k == reflect.Ptr {\n\t\tt = t.Elem()\n\t\tk = t.Kind()\n\t}\n\treturn t, k\n}\n\n// diff returns a diff of both values as long as both are of the same type and\n// are a struct, map, slice, array or string. Otherwise it returns an empty string.\nfunc diff(expected interface{}, actual interface{}) string {\n\tif expected == nil || actual == nil {\n\t\treturn \"\"\n\t}\n\n\tet, ek := typeAndKind(expected)\n\tat, _ := typeAndKind(actual)\n\n\tif et != at {\n\t\treturn \"\"\n\t}\n\n\tif ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array && ek != reflect.String {\n\t\treturn \"\"\n\t}\n\n\tvar e, a string\n\n\tswitch et {\n\tcase reflect.TypeOf(\"\"):\n\t\te = reflect.ValueOf(expected).String()\n\t\ta = reflect.ValueOf(actual).String()\n\tcase reflect.TypeOf(time.Time{}):\n\t\te = spewConfigStringerEnabled.Sdump(expected)\n\t\ta = spewConfigStringerEnabled.Sdump(actual)\n\tdefault:\n\t\te = spewConfig.Sdump(expected)\n\t\ta = spewConfig.Sdump(actual)\n\t}\n\n\tdiff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{\n\t\tA:        difflib.SplitLines(e),\n\t\tB:        difflib.SplitLines(a),\n\t\tFromFile: \"Expected\",\n\t\tFromDate: \"\",\n\t\tToFile:   \"Actual\",\n\t\tToDate:   \"\",\n\t\tContext:  1,\n\t})\n\n\treturn \"\\n\\nDiff:\\n\" + diff\n}\n\nfunc isFunction(arg interface{}) bool {\n\tif arg == nil {\n\t\treturn false\n\t}\n\treturn reflect.TypeOf(arg).Kind() == reflect.Func\n}\n\nvar spewConfig = spew.ConfigState{\n\tIndent:                  \" \",\n\tDisablePointerAddresses: true,\n\tDisableCapacities:       true,\n\tSortKeys:                true,\n\tDisableMethods:          true,\n\tMaxDepth:                10,\n}\n\nvar spewConfigStringerEnabled = spew.ConfigState{\n\tIndent:                  \" \",\n\tDisablePointerAddresses: true,\n\tDisableCapacities:       true,\n\tSortKeys:                true,\n\tMaxDepth:                10,\n}\n\ntype tHelper = interface {\n\tHelper()\n}\n\n// Eventually asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick.\n//\n//\tassert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond)\nfunc Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tch := make(chan bool, 1)\n\n\ttimer := time.NewTimer(waitFor)\n\tdefer timer.Stop()\n\n\tticker := time.NewTicker(tick)\n\tdefer ticker.Stop()\n\n\tfor tick := ticker.C; ; {\n\t\tselect {\n\t\tcase <-timer.C:\n\t\t\treturn Fail(t, \"Condition never satisfied\", msgAndArgs...)\n\t\tcase <-tick:\n\t\t\ttick = nil\n\t\t\tgo func() { ch <- condition() }()\n\t\tcase v := <-ch:\n\t\t\tif v {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\ttick = ticker.C\n\t\t}\n\t}\n}\n\n// CollectT implements the TestingT interface and collects all errors.\ntype CollectT struct {\n\terrors []error\n}\n\n// Errorf collects the error.\nfunc (c *CollectT) Errorf(format string, args ...interface{}) {\n\tc.errors = append(c.errors, fmt.Errorf(format, args...))\n}\n\n// FailNow panics.\nfunc (*CollectT) FailNow() {\n\tpanic(\"Assertion failed\")\n}\n\n// Deprecated: That was a method for internal usage that should not have been published. Now just panics.\nfunc (*CollectT) Reset() {\n\tpanic(\"Reset() is deprecated\")\n}\n\n// Deprecated: That was a method for internal usage that should not have been published. Now just panics.\nfunc (*CollectT) Copy(TestingT) {\n\tpanic(\"Copy() is deprecated\")\n}\n\n// EventuallyWithT asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick. In contrast to Eventually,\n// it supplies a CollectT to the condition function, so that the condition\n// function can use the CollectT to call other assertions.\n// The condition is considered \"met\" if no errors are raised in a tick.\n// The supplied CollectT collects all errors from one tick (if there are any).\n// If the condition is not met before waitFor, the collected errors of\n// the last tick are copied to t.\n//\n//\texternalValue := false\n//\tgo func() {\n//\t\ttime.Sleep(8*time.Second)\n//\t\texternalValue = true\n//\t}()\n//\tassert.EventuallyWithT(t, func(c *assert.CollectT) {\n//\t\t// add assertions as needed; any assertion failure will fail the current tick\n//\t\tassert.True(c, externalValue, \"expected 'externalValue' to be true\")\n//\t}, 10*time.Second, 1*time.Second, \"external state has not changed to 'true'; still false\")\nfunc EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tvar lastFinishedTickErrs []error\n\tch := make(chan []error, 1)\n\n\ttimer := time.NewTimer(waitFor)\n\tdefer timer.Stop()\n\n\tticker := time.NewTicker(tick)\n\tdefer ticker.Stop()\n\n\tfor tick := ticker.C; ; {\n\t\tselect {\n\t\tcase <-timer.C:\n\t\t\tfor _, err := range lastFinishedTickErrs {\n\t\t\t\tt.Errorf(\"%v\", err)\n\t\t\t}\n\t\t\treturn Fail(t, \"Condition never satisfied\", msgAndArgs...)\n\t\tcase <-tick:\n\t\t\ttick = nil\n\t\t\tgo func() {\n\t\t\t\tcollect := new(CollectT)\n\t\t\t\tdefer func() {\n\t\t\t\t\tch <- collect.errors\n\t\t\t\t}()\n\t\t\t\tcondition(collect)\n\t\t\t}()\n\t\tcase errs := <-ch:\n\t\t\tif len(errs) == 0 {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\t// Keep the errors from the last ended condition, so that they can be copied to t if timeout is reached.\n\t\t\tlastFinishedTickErrs = errs\n\t\t\ttick = ticker.C\n\t\t}\n\t}\n}\n\n// Never asserts that the given condition doesn't satisfy in waitFor time,\n// periodically checking the target function each tick.\n//\n//\tassert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond)\nfunc Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\n\tch := make(chan bool, 1)\n\n\ttimer := time.NewTimer(waitFor)\n\tdefer timer.Stop()\n\n\tticker := time.NewTicker(tick)\n\tdefer ticker.Stop()\n\n\tfor tick := ticker.C; ; {\n\t\tselect {\n\t\tcase <-timer.C:\n\t\t\treturn true\n\t\tcase <-tick:\n\t\t\ttick = nil\n\t\t\tgo func() { ch <- condition() }()\n\t\tcase v := <-ch:\n\t\t\tif v {\n\t\t\t\treturn Fail(t, \"Condition satisfied\", msgAndArgs...)\n\t\t\t}\n\t\t\ttick = ticker.C\n\t\t}\n\t}\n}\n\n// ErrorIs asserts that at least one of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc ErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif errors.Is(err, target) {\n\t\treturn true\n\t}\n\n\tvar expectedText string\n\tif target != nil {\n\t\texpectedText = target.Error()\n\t}\n\n\tchain := buildErrorChainString(err)\n\n\treturn Fail(t, fmt.Sprintf(\"Target error should be in err chain:\\n\"+\n\t\t\"expected: %q\\n\"+\n\t\t\"in chain: %s\", expectedText, chain,\n\t), msgAndArgs...)\n}\n\n// NotErrorIs asserts that at none of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc NotErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif !errors.Is(err, target) {\n\t\treturn true\n\t}\n\n\tvar expectedText string\n\tif target != nil {\n\t\texpectedText = target.Error()\n\t}\n\n\tchain := buildErrorChainString(err)\n\n\treturn Fail(t, fmt.Sprintf(\"Target error should not be in err chain:\\n\"+\n\t\t\"found: %q\\n\"+\n\t\t\"in chain: %s\", expectedText, chain,\n\t), msgAndArgs...)\n}\n\n// ErrorAs asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value.\n// This is a wrapper for errors.As.\nfunc ErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif errors.As(err, target) {\n\t\treturn true\n\t}\n\n\tchain := buildErrorChainString(err)\n\n\treturn Fail(t, fmt.Sprintf(\"Should be in error chain:\\n\"+\n\t\t\"expected: %q\\n\"+\n\t\t\"in chain: %s\", target, chain,\n\t), msgAndArgs...)\n}\n\nfunc buildErrorChainString(err error) string {\n\tif err == nil {\n\t\treturn \"\"\n\t}\n\n\te := errors.Unwrap(err)\n\tchain := fmt.Sprintf(\"%q\", err.Error())\n\tfor e != nil {\n\t\tchain += fmt.Sprintf(\"\\n\\t%q\", e.Error())\n\t\te = errors.Unwrap(e)\n\t}\n\treturn chain\n}\n"
  },
  {
    "path": "internal/testify/assert/assertions_test.go",
    "content": "package assert\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n)\n\nvar (\n\ti     interface{}\n\tzeros = []interface{}{\n\t\tfalse,\n\t\tbyte(0),\n\t\tcomplex64(0),\n\t\tcomplex128(0),\n\t\tfloat32(0),\n\t\tfloat64(0),\n\t\tint(0),\n\t\tint8(0),\n\t\tint16(0),\n\t\tint32(0),\n\t\tint64(0),\n\t\trune(0),\n\t\tuint(0),\n\t\tuint8(0),\n\t\tuint16(0),\n\t\tuint32(0),\n\t\tuint64(0),\n\t\tuintptr(0),\n\t\t\"\",\n\t\t[0]interface{}{},\n\t\t[]interface{}(nil),\n\t\tstruct{ x int }{},\n\t\t(*interface{})(nil),\n\t\t(func())(nil),\n\t\tnil,\n\t\tinterface{}(nil),\n\t\tmap[interface{}]interface{}(nil),\n\t\t(chan interface{})(nil),\n\t\t(<-chan interface{})(nil),\n\t\t(chan<- interface{})(nil),\n\t}\n\tnonZeros = []interface{}{\n\t\ttrue,\n\t\tbyte(1),\n\t\tcomplex64(1),\n\t\tcomplex128(1),\n\t\tfloat32(1),\n\t\tfloat64(1),\n\t\tint(1),\n\t\tint8(1),\n\t\tint16(1),\n\t\tint32(1),\n\t\tint64(1),\n\t\trune(1),\n\t\tuint(1),\n\t\tuint8(1),\n\t\tuint16(1),\n\t\tuint32(1),\n\t\tuint64(1),\n\t\tuintptr(1),\n\t\t\"s\",\n\t\t[1]interface{}{1},\n\t\t[]interface{}{},\n\t\tstruct{ x int }{1},\n\t\t(&i),\n\t\t(func() {}),\n\t\tinterface{}(1),\n\t\tmap[interface{}]interface{}{},\n\t\t(make(chan interface{})),\n\t\t(<-chan interface{})(make(chan interface{})),\n\t\t(chan<- interface{})(make(chan interface{})),\n\t}\n)\n\n// AssertionTesterInterface defines an interface to be used for testing assertion methods\ntype AssertionTesterInterface interface {\n\tTestMethod()\n}\n\n// AssertionTesterConformingObject is an object that conforms to the AssertionTesterInterface interface\ntype AssertionTesterConformingObject struct {\n}\n\nfunc (a *AssertionTesterConformingObject) TestMethod() {\n}\n\n// AssertionTesterNonConformingObject is an object that does not conform to the AssertionTesterInterface interface\ntype AssertionTesterNonConformingObject struct {\n}\n\nfunc TestObjectsAreEqual(t *testing.T) {\n\tcases := []struct {\n\t\texpected interface{}\n\t\tactual   interface{}\n\t\tresult   bool\n\t}{\n\t\t// cases that are expected to be equal\n\t\t{\"Hello World\", \"Hello World\", true},\n\t\t{123, 123, true},\n\t\t{123.5, 123.5, true},\n\t\t{[]byte(\"Hello World\"), []byte(\"Hello World\"), true},\n\t\t{nil, nil, true},\n\n\t\t// cases that are expected not to be equal\n\t\t{map[int]int{5: 10}, map[int]int{10: 20}, false},\n\t\t{'x', \"x\", false},\n\t\t{\"x\", 'x', false},\n\t\t{0, 0.1, false},\n\t\t{0.1, 0, false},\n\t\t{time.Now, time.Now, false},\n\t\t{func() {}, func() {}, false},\n\t\t{uint32(10), int32(10), false},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(fmt.Sprintf(\"ObjectsAreEqual(%#v, %#v)\", c.expected, c.actual), func(t *testing.T) {\n\t\t\tres := ObjectsAreEqual(c.expected, c.actual)\n\n\t\t\tif res != c.result {\n\t\t\t\tt.Errorf(\"ObjectsAreEqual(%#v, %#v) should return %#v\", c.expected, c.actual, c.result)\n\t\t\t}\n\n\t\t})\n\t}\n}\n\nfunc TestObjectsAreEqualValues(t *testing.T) {\n\tnow := time.Now()\n\n\tcases := []struct {\n\t\texpected interface{}\n\t\tactual   interface{}\n\t\tresult   bool\n\t}{\n\t\t{uint32(10), int32(10), true},\n\t\t{0, nil, false},\n\t\t{nil, 0, false},\n\t\t{now, now.In(time.Local), false}, // should not be time zone independent\n\t\t{int(270), int8(14), false},      // should handle overflow/underflow\n\t\t{int8(14), int(270), false},\n\t\t{[]int{270, 270}, []int8{14, 14}, false},\n\t\t{complex128(1e+100 + 1e+100i), complex64(complex(math.Inf(0), math.Inf(0))), false},\n\t\t{complex64(complex(math.Inf(0), math.Inf(0))), complex128(1e+100 + 1e+100i), false},\n\t\t{complex128(1e+100 + 1e+100i), 270, false},\n\t\t{270, complex128(1e+100 + 1e+100i), false},\n\t\t{complex128(1e+100 + 1e+100i), 3.14, false},\n\t\t{3.14, complex128(1e+100 + 1e+100i), false},\n\t\t{complex128(1e+10 + 1e+10i), complex64(1e+10 + 1e+10i), true},\n\t\t{complex64(1e+10 + 1e+10i), complex128(1e+10 + 1e+10i), true},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(fmt.Sprintf(\"ObjectsAreEqualValues(%#v, %#v)\", c.expected, c.actual), func(t *testing.T) {\n\t\t\tres := ObjectsAreEqualValues(c.expected, c.actual)\n\n\t\t\tif res != c.result {\n\t\t\t\tt.Errorf(\"ObjectsAreEqualValues(%#v, %#v) should return %#v\", c.expected, c.actual, c.result)\n\t\t\t}\n\t\t})\n\t}\n}\n\ntype Nested struct {\n\tExported    interface{}\n\tnotExported interface{}\n}\n\ntype S struct {\n\tExported1    interface{}\n\tExported2    Nested\n\tnotExported1 interface{}\n\tnotExported2 Nested\n}\n\ntype S2 struct {\n\tfoo interface{}\n}\n\ntype S3 struct {\n\tExported1 *Nested\n\tExported2 *Nested\n}\n\ntype S4 struct {\n\tExported1 []*Nested\n}\n\ntype S5 struct {\n\tExported Nested\n}\n\ntype S6 struct {\n\tExported   string\n\tunexported string\n}\n\nfunc TestObjectsExportedFieldsAreEqual(t *testing.T) {\n\n\tintValue := 1\n\n\tcases := []struct {\n\t\texpected interface{}\n\t\tactual   interface{}\n\t\tresult   bool\n\t}{\n\t\t{S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{1, Nested{2, 3}, 4, Nested{5, 6}}, true},\n\t\t{S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{1, Nested{2, 3}, \"a\", Nested{5, 6}}, true},\n\t\t{S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{1, Nested{2, 3}, 4, Nested{5, \"a\"}}, true},\n\t\t{S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{1, Nested{2, 3}, 4, Nested{\"a\", \"a\"}}, true},\n\t\t{S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{1, Nested{2, \"a\"}, 4, Nested{5, 6}}, true},\n\t\t{S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{\"a\", Nested{2, 3}, 4, Nested{5, 6}}, false},\n\t\t{S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{1, Nested{\"a\", 3}, 4, Nested{5, 6}}, false},\n\t\t{S{1, Nested{2, 3}, 4, Nested{5, 6}}, S2{1}, false},\n\t\t{1, S{1, Nested{2, 3}, 4, Nested{5, 6}}, false},\n\n\t\t{S3{&Nested{1, 2}, &Nested{3, 4}}, S3{&Nested{1, 2}, &Nested{3, 4}}, true},\n\t\t{S3{nil, &Nested{3, 4}}, S3{nil, &Nested{3, 4}}, true},\n\t\t{S3{&Nested{1, 2}, &Nested{3, 4}}, S3{&Nested{1, 2}, &Nested{3, \"b\"}}, true},\n\t\t{S3{&Nested{1, 2}, &Nested{3, 4}}, S3{&Nested{1, \"a\"}, &Nested{3, \"b\"}}, true},\n\t\t{S3{&Nested{1, 2}, &Nested{3, 4}}, S3{&Nested{\"a\", 2}, &Nested{3, 4}}, false},\n\t\t{S3{&Nested{1, 2}, &Nested{3, 4}}, S3{}, false},\n\t\t{S3{}, S3{}, true},\n\n\t\t{S4{[]*Nested{{1, 2}}}, S4{[]*Nested{{1, 2}}}, true},\n\t\t{S4{[]*Nested{{1, 2}}}, S4{[]*Nested{{1, 3}}}, true},\n\t\t{S4{[]*Nested{{1, 2}, {3, 4}}}, S4{[]*Nested{{1, \"a\"}, {3, \"b\"}}}, true},\n\t\t{S4{[]*Nested{{1, 2}, {3, 4}}}, S4{[]*Nested{{1, \"a\"}, {2, \"b\"}}}, false},\n\n\t\t{Nested{&intValue, 2}, Nested{&intValue, 2}, true},\n\t\t{Nested{&Nested{1, 2}, 3}, Nested{&Nested{1, \"b\"}, 3}, true},\n\t\t{Nested{&Nested{1, 2}, 3}, Nested{nil, 3}, false},\n\n\t\t{\n\t\t\tNested{map[interface{}]*Nested{nil: nil}, 2},\n\t\t\tNested{map[interface{}]*Nested{nil: nil}, 2},\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\tNested{map[interface{}]*Nested{\"a\": nil}, 2},\n\t\t\tNested{map[interface{}]*Nested{\"a\": nil}, 2},\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\tNested{map[interface{}]*Nested{\"a\": nil}, 2},\n\t\t\tNested{map[interface{}]*Nested{\"a\": {1, 2}}, 2},\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\tNested{map[interface{}]Nested{\"a\": {1, 2}, \"b\": {3, 4}}, 2},\n\t\t\tNested{map[interface{}]Nested{\"a\": {1, 5}, \"b\": {3, 7}}, 2},\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\tNested{map[interface{}]Nested{\"a\": {1, 2}, \"b\": {3, 4}}, 2},\n\t\t\tNested{map[interface{}]Nested{\"a\": {2, 2}, \"b\": {3, 4}}, 2},\n\t\t\tfalse,\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(fmt.Sprintf(\"ObjectsExportedFieldsAreEqual(%#v, %#v)\", c.expected, c.actual), func(t *testing.T) {\n\t\t\tres := ObjectsExportedFieldsAreEqual(c.expected, c.actual)\n\n\t\t\tif res != c.result {\n\t\t\t\tt.Errorf(\"ObjectsExportedFieldsAreEqual(%#v, %#v) should return %#v\", c.expected, c.actual, c.result)\n\t\t\t}\n\n\t\t})\n\t}\n}\n\nfunc TestCopyExportedFields(t *testing.T) {\n\tintValue := 1\n\n\tcases := []struct {\n\t\tinput    interface{}\n\t\texpected interface{}\n\t}{\n\t\t{\n\t\t\tinput:    Nested{\"a\", \"b\"},\n\t\t\texpected: Nested{\"a\", nil},\n\t\t},\n\t\t{\n\t\t\tinput:    Nested{&intValue, 2},\n\t\t\texpected: Nested{&intValue, nil},\n\t\t},\n\t\t{\n\t\t\tinput:    Nested{nil, 3},\n\t\t\texpected: Nested{nil, nil},\n\t\t},\n\t\t{\n\t\t\tinput:    S{1, Nested{2, 3}, 4, Nested{5, 6}},\n\t\t\texpected: S{1, Nested{2, nil}, nil, Nested{}},\n\t\t},\n\t\t{\n\t\t\tinput:    S3{},\n\t\t\texpected: S3{},\n\t\t},\n\t\t{\n\t\t\tinput:    S3{&Nested{1, 2}, &Nested{3, 4}},\n\t\t\texpected: S3{&Nested{1, nil}, &Nested{3, nil}},\n\t\t},\n\t\t{\n\t\t\tinput:    S3{Exported1: &Nested{\"a\", \"b\"}},\n\t\t\texpected: S3{Exported1: &Nested{\"a\", nil}},\n\t\t},\n\t\t{\n\t\t\tinput: S4{[]*Nested{\n\t\t\t\tnil,\n\t\t\t\t{1, 2},\n\t\t\t}},\n\t\t\texpected: S4{[]*Nested{\n\t\t\t\tnil,\n\t\t\t\t{1, nil},\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tinput: S4{[]*Nested{\n\t\t\t\t{1, 2}},\n\t\t\t},\n\t\t\texpected: S4{[]*Nested{\n\t\t\t\t{1, nil}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tinput: S4{[]*Nested{\n\t\t\t\t{1, 2},\n\t\t\t\t{3, 4},\n\t\t\t}},\n\t\t\texpected: S4{[]*Nested{\n\t\t\t\t{1, nil},\n\t\t\t\t{3, nil},\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tinput:    S5{Exported: Nested{\"a\", \"b\"}},\n\t\t\texpected: S5{Exported: Nested{\"a\", nil}},\n\t\t},\n\t\t{\n\t\t\tinput:    S6{\"a\", \"b\"},\n\t\t\texpected: S6{\"a\", \"\"},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(\"\", func(t *testing.T) {\n\t\t\toutput := copyExportedFields(c.input)\n\t\t\tif !ObjectsAreEqualValues(c.expected, output) {\n\t\t\t\tt.Errorf(\"%#v, %#v should be equal\", c.expected, output)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestEqualExportedValues(t *testing.T) {\n\tcases := []struct {\n\t\tvalue1        interface{}\n\t\tvalue2        interface{}\n\t\texpectedEqual bool\n\t\texpectedFail  string\n\t}{\n\t\t{\n\t\t\tvalue1:        S{1, Nested{2, 3}, 4, Nested{5, 6}},\n\t\t\tvalue2:        S{1, Nested{2, nil}, nil, Nested{}},\n\t\t\texpectedEqual: true,\n\t\t},\n\t\t{\n\t\t\tvalue1:        S{1, Nested{2, 3}, 4, Nested{5, 6}},\n\t\t\tvalue2:        S{1, Nested{1, nil}, nil, Nested{}},\n\t\t\texpectedEqual: false,\n\t\t\texpectedFail: `\n\t            \tDiff:\n\t            \t--- Expected\n\t            \t+++ Actual\n\t            \t@@ -3,3 +3,3 @@\n\t            \t  Exported2: (assert.Nested) {\n\t            \t-  Exported: (int) 2,\n\t            \t+  Exported: (int) 1,\n\t            \t   notExported: (interface {}) <nil>`,\n\t\t},\n\t\t{\n\t\t\tvalue1:        S3{&Nested{1, 2}, &Nested{3, 4}},\n\t\t\tvalue2:        S3{&Nested{\"a\", 2}, &Nested{3, 4}},\n\t\t\texpectedEqual: false,\n\t\t\texpectedFail: `\n\t            \tDiff:\n\t            \t--- Expected\n\t            \t+++ Actual\n\t            \t@@ -2,3 +2,3 @@\n\t            \t  Exported1: (*assert.Nested)({\n\t            \t-  Exported: (int) 1,\n\t            \t+  Exported: (string) (len=1) \"a\",\n\t            \t   notExported: (interface {}) <nil>`,\n\t\t},\n\t\t{\n\t\t\tvalue1: S4{[]*Nested{\n\t\t\t\t{1, 2},\n\t\t\t\t{3, 4},\n\t\t\t}},\n\t\t\tvalue2: S4{[]*Nested{\n\t\t\t\t{1, \"a\"},\n\t\t\t\t{2, \"b\"},\n\t\t\t}},\n\t\t\texpectedEqual: false,\n\t\t\texpectedFail: `\n\t            \tDiff:\n\t            \t--- Expected\n\t            \t+++ Actual\n\t            \t@@ -7,3 +7,3 @@\n\t            \t   (*assert.Nested)({\n\t            \t-   Exported: (int) 3,\n\t            \t+   Exported: (int) 2,\n\t            \t    notExported: (interface {}) <nil>`,\n\t\t},\n\t\t{\n\t\t\tvalue1:        S{[2]int{1, 2}, Nested{2, 3}, 4, Nested{5, 6}},\n\t\t\tvalue2:        S{[2]int{1, 2}, Nested{2, nil}, nil, Nested{}},\n\t\t\texpectedEqual: true,\n\t\t},\n\t\t{\n\t\t\tvalue1:        &S{1, Nested{2, 3}, 4, Nested{5, 6}},\n\t\t\tvalue2:        &S{1, Nested{2, nil}, nil, Nested{}},\n\t\t\texpectedEqual: true,\n\t\t},\n\t\t{\n\t\t\tvalue1:        &S{1, Nested{2, 3}, 4, Nested{5, 6}},\n\t\t\tvalue2:        &S{1, Nested{1, nil}, nil, Nested{}},\n\t\t\texpectedEqual: false,\n\t\t\texpectedFail: `\n\t            \tDiff:\n\t            \t--- Expected\n\t            \t+++ Actual\n\t            \t@@ -3,3 +3,3 @@\n\t            \t  Exported2: (assert.Nested) {\n\t            \t-  Exported: (int) 2,\n\t            \t+  Exported: (int) 1,\n\t            \t   notExported: (interface {}) <nil>`,\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(\"\", func(t *testing.T) {\n\t\t\tmockT := new(mockTestingT)\n\n\t\t\tactual := EqualExportedValues(mockT, c.value1, c.value2)\n\t\t\tif actual != c.expectedEqual {\n\t\t\t\tt.Errorf(\"Expected EqualExportedValues to be %t, but was %t\", c.expectedEqual, actual)\n\t\t\t}\n\n\t\t\tactualFail := mockT.errorString()\n\t\t\tif !strings.Contains(actualFail, c.expectedFail) {\n\t\t\t\tt.Errorf(\"Contains failure should include %q but was %q\", c.expectedFail, actualFail)\n\t\t\t}\n\t\t})\n\t}\n\n}\n\nfunc TestImplements(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tif !Implements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) {\n\t\tt.Error(\"Implements method should return true: AssertionTesterConformingObject implements AssertionTesterInterface\")\n\t}\n\tif Implements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) {\n\t\tt.Error(\"Implements method should return false: AssertionTesterNonConformingObject does not implements AssertionTesterInterface\")\n\t}\n\tif Implements(mockT, (*AssertionTesterInterface)(nil), nil) {\n\t\tt.Error(\"Implements method should return false: nil does not implement AssertionTesterInterface\")\n\t}\n\n}\n\nfunc TestNotImplements(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tif !NotImplements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) {\n\t\tt.Error(\"NotImplements method should return true: AssertionTesterNonConformingObject does not implement AssertionTesterInterface\")\n\t}\n\tif NotImplements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) {\n\t\tt.Error(\"NotImplements method should return false: AssertionTesterConformingObject implements AssertionTesterInterface\")\n\t}\n\tif NotImplements(mockT, (*AssertionTesterInterface)(nil), nil) {\n\t\tt.Error(\"NotImplements method should return false: nil can't be checked to be implementing AssertionTesterInterface or not\")\n\t}\n\n}\n\nfunc TestIsType(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tif !IsType(mockT, new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) {\n\t\tt.Error(\"IsType should return true: AssertionTesterConformingObject is the same type as AssertionTesterConformingObject\")\n\t}\n\tif IsType(mockT, new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) {\n\t\tt.Error(\"IsType should return false: AssertionTesterConformingObject is not the same type as AssertionTesterNonConformingObject\")\n\t}\n\n}\n\nfunc TestEqual(t *testing.T) {\n\ttype myType string\n\n\tmockT := new(testing.T)\n\tvar m map[string]interface{}\n\n\tcases := []struct {\n\t\texpected interface{}\n\t\tactual   interface{}\n\t\tresult   bool\n\t\tremark   string\n\t}{\n\t\t{\"Hello World\", \"Hello World\", true, \"\"},\n\t\t{123, 123, true, \"\"},\n\t\t{123.5, 123.5, true, \"\"},\n\t\t{[]byte(\"Hello World\"), []byte(\"Hello World\"), true, \"\"},\n\t\t{nil, nil, true, \"\"},\n\t\t{int32(123), int32(123), true, \"\"},\n\t\t{uint64(123), uint64(123), true, \"\"},\n\t\t{myType(\"1\"), myType(\"1\"), true, \"\"},\n\t\t{&struct{}{}, &struct{}{}, true, \"pointer equality is based on equality of underlying value\"},\n\n\t\t// Not expected to be equal\n\t\t{m[\"bar\"], \"something\", false, \"\"},\n\t\t{myType(\"1\"), myType(\"2\"), false, \"\"},\n\n\t\t// A case that might be confusing, especially with numeric literals\n\t\t{10, uint(10), false, \"\"},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(fmt.Sprintf(\"Equal(%#v, %#v)\", c.expected, c.actual), func(t *testing.T) {\n\t\t\tres := Equal(mockT, c.expected, c.actual)\n\n\t\t\tif res != c.result {\n\t\t\t\tt.Errorf(\"Equal(%#v, %#v) should return %#v: %s\", c.expected, c.actual, c.result, c.remark)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc ptr(i int) *int {\n\treturn &i\n}\n\nfunc TestSame(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tif Same(mockT, ptr(1), ptr(1)) {\n\t\tt.Error(\"Same should return false\")\n\t}\n\tif Same(mockT, 1, 1) {\n\t\tt.Error(\"Same should return false\")\n\t}\n\tp := ptr(2)\n\tif Same(mockT, p, *p) {\n\t\tt.Error(\"Same should return false\")\n\t}\n\tif !Same(mockT, p, p) {\n\t\tt.Error(\"Same should return true\")\n\t}\n}\n\nfunc TestNotSame(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tif !NotSame(mockT, ptr(1), ptr(1)) {\n\t\tt.Error(\"NotSame should return true; different pointers\")\n\t}\n\tif !NotSame(mockT, 1, 1) {\n\t\tt.Error(\"NotSame should return true; constant inputs\")\n\t}\n\tp := ptr(2)\n\tif !NotSame(mockT, p, *p) {\n\t\tt.Error(\"NotSame should return true; mixed-type inputs\")\n\t}\n\tif NotSame(mockT, p, p) {\n\t\tt.Error(\"NotSame should return false\")\n\t}\n}\n\nfunc Test_samePointers(t *testing.T) {\n\tp := ptr(2)\n\n\ttype args struct {\n\t\tfirst  interface{}\n\t\tsecond interface{}\n\t}\n\ttests := []struct {\n\t\tname      string\n\t\targs      args\n\t\tassertion BoolAssertionFunc\n\t}{\n\t\t{\n\t\t\tname:      \"1 != 2\",\n\t\t\targs:      args{first: 1, second: 2},\n\t\t\tassertion: False,\n\t\t},\n\t\t{\n\t\t\tname:      \"1 != 1 (not same ptr)\",\n\t\t\targs:      args{first: 1, second: 1},\n\t\t\tassertion: False,\n\t\t},\n\t\t{\n\t\t\tname:      \"ptr(1) == ptr(1)\",\n\t\t\targs:      args{first: p, second: p},\n\t\t\tassertion: True,\n\t\t},\n\t\t{\n\t\t\tname:      \"int(1) != float32(1)\",\n\t\t\targs:      args{first: int(1), second: float32(1)},\n\t\t\tassertion: False,\n\t\t},\n\t\t{\n\t\t\tname:      \"array != slice\",\n\t\t\targs:      args{first: [2]int{1, 2}, second: []int{1, 2}},\n\t\t\tassertion: False,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, samePointers(tt.args.first, tt.args.second))\n\t\t})\n\t}\n}\n\n// bufferT implements TestingT. Its implementation of Errorf writes the output that would be produced by\n// testing.T.Errorf to an internal bytes.Buffer.\ntype bufferT struct {\n\tbuf bytes.Buffer\n}\n\nfunc (t *bufferT) Errorf(format string, args ...interface{}) {\n\t// implementation of decorate is copied from testing.T\n\tdecorate := func(s string) string {\n\t\t_, file, line, ok := runtime.Caller(3) // decorate + log + public function.\n\t\tif ok {\n\t\t\t// Truncate file name at last file name separator.\n\t\t\tif index := strings.LastIndex(file, \"/\"); index >= 0 {\n\t\t\t\tfile = file[index+1:]\n\t\t\t} else if index = strings.LastIndex(file, \"\\\\\"); index >= 0 {\n\t\t\t\tfile = file[index+1:]\n\t\t\t}\n\t\t} else {\n\t\t\tfile = \"???\"\n\t\t\tline = 1\n\t\t}\n\t\tbuf := new(bytes.Buffer)\n\t\t// Every line is indented at least one tab.\n\t\tbuf.WriteByte('\\t')\n\t\tfmt.Fprintf(buf, \"%s:%d: \", file, line)\n\t\tlines := strings.Split(s, \"\\n\")\n\t\tif l := len(lines); l > 1 && lines[l-1] == \"\" {\n\t\t\tlines = lines[:l-1]\n\t\t}\n\t\tfor i, line := range lines {\n\t\t\tif i > 0 {\n\t\t\t\t// Second and subsequent lines are indented an extra tab.\n\t\t\t\tbuf.WriteString(\"\\n\\t\\t\")\n\t\t\t}\n\t\t\tbuf.WriteString(line)\n\t\t}\n\t\tbuf.WriteByte('\\n')\n\t\treturn buf.String()\n\t}\n\tt.buf.WriteString(decorate(fmt.Sprintf(format, args...)))\n}\n\nfunc TestStringEqual(t *testing.T) {\n\tfor i, currCase := range []struct {\n\t\tequalWant  string\n\t\tequalGot   string\n\t\tmsgAndArgs []interface{}\n\t\twant       string\n\t}{\n\t\t{equalWant: \"hi, \\nmy name is\", equalGot: \"what,\\nmy name is\", want: \"\\tassertions.go:\\\\d+: \\n\\t+Error Trace:\\t\\n\\t+Error:\\\\s+Not equal:\\\\s+\\n\\\\s+expected: \\\"hi, \\\\\\\\nmy name is\\\"\\n\\\\s+actual\\\\s+: \\\"what,\\\\\\\\nmy name is\\\"\\n\\\\s+Diff:\\n\\\\s+-+ Expected\\n\\\\s+\\\\++ Actual\\n\\\\s+@@ -1,2 \\\\+1,2 @@\\n\\\\s+-hi, \\n\\\\s+\\\\+what,\\n\\\\s+my name is\"},\n\t} {\n\t\tmockT := &bufferT{}\n\t\tEqual(mockT, currCase.equalWant, currCase.equalGot, currCase.msgAndArgs...)\n\t\tRegexp(t, regexp.MustCompile(currCase.want), mockT.buf.String(), \"Case %d\", i)\n\t}\n}\n\nfunc TestEqualFormatting(t *testing.T) {\n\tfor i, currCase := range []struct {\n\t\tequalWant  string\n\t\tequalGot   string\n\t\tmsgAndArgs []interface{}\n\t\twant       string\n\t}{\n\t\t{equalWant: \"want\", equalGot: \"got\", want: \"\\tassertions.go:\\\\d+: \\n\\t+Error Trace:\\t\\n\\t+Error:\\\\s+Not equal:\\\\s+\\n\\\\s+expected: \\\"want\\\"\\n\\\\s+actual\\\\s+: \\\"got\\\"\\n\\\\s+Diff:\\n\\\\s+-+ Expected\\n\\\\s+\\\\++ Actual\\n\\\\s+@@ -1 \\\\+1 @@\\n\\\\s+-want\\n\\\\s+\\\\+got\\n\"},\n\t\t{equalWant: \"want\", equalGot: \"got\", msgAndArgs: []interface{}{\"hello, %v!\", \"world\"}, want: \"\\tassertions.go:[0-9]+: \\n\\t+Error Trace:\\t\\n\\t+Error:\\\\s+Not equal:\\\\s+\\n\\\\s+expected: \\\"want\\\"\\n\\\\s+actual\\\\s+: \\\"got\\\"\\n\\\\s+Diff:\\n\\\\s+-+ Expected\\n\\\\s+\\\\++ Actual\\n\\\\s+@@ -1 \\\\+1 @@\\n\\\\s+-want\\n\\\\s+\\\\+got\\n\\\\s+Messages:\\\\s+hello, world!\\n\"},\n\t\t{equalWant: \"want\", equalGot: \"got\", msgAndArgs: []interface{}{123}, want: \"\\tassertions.go:[0-9]+: \\n\\t+Error Trace:\\t\\n\\t+Error:\\\\s+Not equal:\\\\s+\\n\\\\s+expected: \\\"want\\\"\\n\\\\s+actual\\\\s+: \\\"got\\\"\\n\\\\s+Diff:\\n\\\\s+-+ Expected\\n\\\\s+\\\\++ Actual\\n\\\\s+@@ -1 \\\\+1 @@\\n\\\\s+-want\\n\\\\s+\\\\+got\\n\\\\s+Messages:\\\\s+123\\n\"},\n\t\t{equalWant: \"want\", equalGot: \"got\", msgAndArgs: []interface{}{struct{ a string }{\"hello\"}}, want: \"\\tassertions.go:[0-9]+: \\n\\t+Error Trace:\\t\\n\\t+Error:\\\\s+Not equal:\\\\s+\\n\\\\s+expected: \\\"want\\\"\\n\\\\s+actual\\\\s+: \\\"got\\\"\\n\\\\s+Diff:\\n\\\\s+-+ Expected\\n\\\\s+\\\\++ Actual\\n\\\\s+@@ -1 \\\\+1 @@\\n\\\\s+-want\\n\\\\s+\\\\+got\\n\\\\s+Messages:\\\\s+{a:hello}\\n\"},\n\t} {\n\t\tmockT := &bufferT{}\n\t\tEqual(mockT, currCase.equalWant, currCase.equalGot, currCase.msgAndArgs...)\n\t\tRegexp(t, regexp.MustCompile(currCase.want), mockT.buf.String(), \"Case %d\", i)\n\t}\n}\n\nfunc TestFormatUnequalValues(t *testing.T) {\n\texpected, actual := formatUnequalValues(\"foo\", \"bar\")\n\tEqual(t, `\"foo\"`, expected, \"value should not include type\")\n\tEqual(t, `\"bar\"`, actual, \"value should not include type\")\n\n\texpected, actual = formatUnequalValues(123, 123)\n\tEqual(t, `123`, expected, \"value should not include type\")\n\tEqual(t, `123`, actual, \"value should not include type\")\n\n\texpected, actual = formatUnequalValues(int64(123), int32(123))\n\tEqual(t, `int64(123)`, expected, \"value should include type\")\n\tEqual(t, `int32(123)`, actual, \"value should include type\")\n\n\texpected, actual = formatUnequalValues(int64(123), nil)\n\tEqual(t, `int64(123)`, expected, \"value should include type\")\n\tEqual(t, `<nil>(<nil>)`, actual, \"value should include type\")\n\n\ttype testStructType struct {\n\t\tVal string\n\t}\n\n\texpected, actual = formatUnequalValues(&testStructType{Val: \"test\"}, &testStructType{Val: \"test\"})\n\tEqual(t, `&assert.testStructType{Val:\"test\"}`, expected, \"value should not include type annotation\")\n\tEqual(t, `&assert.testStructType{Val:\"test\"}`, actual, \"value should not include type annotation\")\n}\n\nfunc TestNotNil(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tif !NotNil(mockT, new(AssertionTesterConformingObject)) {\n\t\tt.Error(\"NotNil should return true: object is not nil\")\n\t}\n\tif NotNil(mockT, nil) {\n\t\tt.Error(\"NotNil should return false: object is nil\")\n\t}\n\tif NotNil(mockT, (*struct{})(nil)) {\n\t\tt.Error(\"NotNil should return false: object is (*struct{})(nil)\")\n\t}\n\n}\n\nfunc TestNil(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tif !Nil(mockT, nil) {\n\t\tt.Error(\"Nil should return true: object is nil\")\n\t}\n\tif !Nil(mockT, (*struct{})(nil)) {\n\t\tt.Error(\"Nil should return true: object is (*struct{})(nil)\")\n\t}\n\tif Nil(mockT, new(AssertionTesterConformingObject)) {\n\t\tt.Error(\"Nil should return false: object is not nil\")\n\t}\n\n}\n\nfunc TestTrue(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tif !True(mockT, true) {\n\t\tt.Error(\"True should return true\")\n\t}\n\tif True(mockT, false) {\n\t\tt.Error(\"True should return false\")\n\t}\n\n}\n\nfunc TestFalse(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tif !False(mockT, false) {\n\t\tt.Error(\"False should return true\")\n\t}\n\tif False(mockT, true) {\n\t\tt.Error(\"False should return false\")\n\t}\n\n}\n\nfunc TestExactly(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\ta := float32(1)\n\tb := float64(1)\n\tc := float32(1)\n\td := float32(2)\n\tcases := []struct {\n\t\texpected interface{}\n\t\tactual   interface{}\n\t\tresult   bool\n\t}{\n\t\t{a, b, false},\n\t\t{a, d, false},\n\t\t{a, c, true},\n\t\t{nil, a, false},\n\t\t{a, nil, false},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(fmt.Sprintf(\"Exactly(%#v, %#v)\", c.expected, c.actual), func(t *testing.T) {\n\t\t\tres := Exactly(mockT, c.expected, c.actual)\n\n\t\t\tif res != c.result {\n\t\t\t\tt.Errorf(\"Exactly(%#v, %#v) should return %#v\", c.expected, c.actual, c.result)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNotEqual(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tcases := []struct {\n\t\texpected interface{}\n\t\tactual   interface{}\n\t\tresult   bool\n\t}{\n\t\t// cases that are expected not to match\n\t\t{\"Hello World\", \"Hello World!\", true},\n\t\t{123, 1234, true},\n\t\t{123.5, 123.55, true},\n\t\t{[]byte(\"Hello World\"), []byte(\"Hello World!\"), true},\n\t\t{nil, new(AssertionTesterConformingObject), true},\n\n\t\t// cases that are expected to match\n\t\t{nil, nil, false},\n\t\t{\"Hello World\", \"Hello World\", false},\n\t\t{123, 123, false},\n\t\t{123.5, 123.5, false},\n\t\t{[]byte(\"Hello World\"), []byte(\"Hello World\"), false},\n\t\t{new(AssertionTesterConformingObject), new(AssertionTesterConformingObject), false},\n\t\t{&struct{}{}, &struct{}{}, false},\n\t\t{func() int { return 23 }, func() int { return 24 }, false},\n\t\t// A case that might be confusing, especially with numeric literals\n\t\t{int(10), uint(10), true},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(fmt.Sprintf(\"NotEqual(%#v, %#v)\", c.expected, c.actual), func(t *testing.T) {\n\t\t\tres := NotEqual(mockT, c.expected, c.actual)\n\n\t\t\tif res != c.result {\n\t\t\t\tt.Errorf(\"NotEqual(%#v, %#v) should return %#v\", c.expected, c.actual, c.result)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNotEqualValues(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tcases := []struct {\n\t\texpected interface{}\n\t\tactual   interface{}\n\t\tresult   bool\n\t}{\n\t\t// cases that are expected not to match\n\t\t{\"Hello World\", \"Hello World!\", true},\n\t\t{123, 1234, true},\n\t\t{123.5, 123.55, true},\n\t\t{[]byte(\"Hello World\"), []byte(\"Hello World!\"), true},\n\t\t{nil, new(AssertionTesterConformingObject), true},\n\n\t\t// cases that are expected to match\n\t\t{nil, nil, false},\n\t\t{\"Hello World\", \"Hello World\", false},\n\t\t{123, 123, false},\n\t\t{123.5, 123.5, false},\n\t\t{[]byte(\"Hello World\"), []byte(\"Hello World\"), false},\n\t\t{new(AssertionTesterConformingObject), new(AssertionTesterConformingObject), false},\n\t\t{&struct{}{}, &struct{}{}, false},\n\n\t\t// Different behavior from NotEqual()\n\t\t{func() int { return 23 }, func() int { return 24 }, true},\n\t\t{int(10), int(11), true},\n\t\t{int(10), uint(10), false},\n\n\t\t{struct{}{}, struct{}{}, false},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(fmt.Sprintf(\"NotEqualValues(%#v, %#v)\", c.expected, c.actual), func(t *testing.T) {\n\t\t\tres := NotEqualValues(mockT, c.expected, c.actual)\n\n\t\t\tif res != c.result {\n\t\t\t\tt.Errorf(\"NotEqualValues(%#v, %#v) should return %#v\", c.expected, c.actual, c.result)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestContainsNotContains(t *testing.T) {\n\n\ttype A struct {\n\t\tName, Value string\n\t}\n\tlist := []string{\"Foo\", \"Bar\"}\n\n\tcomplexList := []*A{\n\t\t{\"b\", \"c\"},\n\t\t{\"d\", \"e\"},\n\t\t{\"g\", \"h\"},\n\t\t{\"j\", \"k\"},\n\t}\n\tsimpleMap := map[interface{}]interface{}{\"Foo\": \"Bar\"}\n\tvar zeroMap map[interface{}]interface{}\n\n\tcases := []struct {\n\t\texpected interface{}\n\t\tactual   interface{}\n\t\tresult   bool\n\t}{\n\t\t{\"Hello World\", \"Hello\", true},\n\t\t{\"Hello World\", \"Salut\", false},\n\t\t{list, \"Bar\", true},\n\t\t{list, \"Salut\", false},\n\t\t{complexList, &A{\"g\", \"h\"}, true},\n\t\t{complexList, &A{\"g\", \"e\"}, false},\n\t\t{simpleMap, \"Foo\", true},\n\t\t{simpleMap, \"Bar\", false},\n\t\t{zeroMap, \"Bar\", false},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(fmt.Sprintf(\"Contains(%#v, %#v)\", c.expected, c.actual), func(t *testing.T) {\n\t\t\tmockT := new(testing.T)\n\t\t\tres := Contains(mockT, c.expected, c.actual)\n\n\t\t\tif res != c.result {\n\t\t\t\tif res {\n\t\t\t\t\tt.Errorf(\"Contains(%#v, %#v) should return true:\\n\\t%#v contains %#v\", c.expected, c.actual, c.expected, c.actual)\n\t\t\t\t} else {\n\t\t\t\t\tt.Errorf(\"Contains(%#v, %#v) should return false:\\n\\t%#v does not contain %#v\", c.expected, c.actual, c.expected, c.actual)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(fmt.Sprintf(\"NotContains(%#v, %#v)\", c.expected, c.actual), func(t *testing.T) {\n\t\t\tmockT := new(testing.T)\n\t\t\tres := NotContains(mockT, c.expected, c.actual)\n\n\t\t\t// NotContains should be inverse of Contains. If it's not, something is wrong\n\t\t\tif res == Contains(mockT, c.expected, c.actual) {\n\t\t\t\tif res {\n\t\t\t\t\tt.Errorf(\"NotContains(%#v, %#v) should return true:\\n\\t%#v does not contains %#v\", c.expected, c.actual, c.expected, c.actual)\n\t\t\t\t} else {\n\t\t\t\t\tt.Errorf(\"NotContains(%#v, %#v) should return false:\\n\\t%#v contains %#v\", c.expected, c.actual, c.expected, c.actual)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestContainsNotContainsFailMessage(t *testing.T) {\n\tmockT := new(mockTestingT)\n\n\ttype nonContainer struct {\n\t\tValue string\n\t}\n\n\tcases := []struct {\n\t\tassertion func(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool\n\t\tcontainer interface{}\n\t\tinstance  interface{}\n\t\texpected  string\n\t}{\n\t\t{\n\t\t\tassertion: Contains,\n\t\t\tcontainer: \"Hello World\",\n\t\t\tinstance:  errors.New(\"Hello\"),\n\t\t\texpected:  \"\\\"Hello World\\\" does not contain &errors.errorString{s:\\\"Hello\\\"}\",\n\t\t},\n\t\t{\n\t\t\tassertion: Contains,\n\t\t\tcontainer: map[string]int{\"one\": 1},\n\t\t\tinstance:  \"two\",\n\t\t\texpected:  \"map[string]int{\\\"one\\\":1} does not contain \\\"two\\\"\\n\",\n\t\t},\n\t\t{\n\t\t\tassertion: NotContains,\n\t\t\tcontainer: map[string]int{\"one\": 1},\n\t\t\tinstance:  \"one\",\n\t\t\texpected:  \"map[string]int{\\\"one\\\":1} should not contain \\\"one\\\"\",\n\t\t},\n\t\t{\n\t\t\tassertion: Contains,\n\t\t\tcontainer: nonContainer{Value: \"Hello\"},\n\t\t\tinstance:  \"Hello\",\n\t\t\texpected:  \"assert.nonContainer{Value:\\\"Hello\\\"} could not be applied builtin len()\\n\",\n\t\t},\n\t\t{\n\t\t\tassertion: NotContains,\n\t\t\tcontainer: nonContainer{Value: \"Hello\"},\n\t\t\tinstance:  \"Hello\",\n\t\t\texpected:  \"assert.nonContainer{Value:\\\"Hello\\\"} could not be applied builtin len()\\n\",\n\t\t},\n\t}\n\tfor _, c := range cases {\n\t\tname := filepath.Base(runtime.FuncForPC(reflect.ValueOf(c.assertion).Pointer()).Name())\n\t\tt.Run(fmt.Sprintf(\"%v(%T, %T)\", name, c.container, c.instance), func(t *testing.T) {\n\t\t\tc.assertion(mockT, c.container, c.instance)\n\t\t\tactualFail := mockT.errorString()\n\t\t\tif !strings.Contains(actualFail, c.expected) {\n\t\t\t\tt.Errorf(\"Contains failure should include %q but was %q\", c.expected, actualFail)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestContainsNotContainsOnNilValue(t *testing.T) {\n\tmockT := new(mockTestingT)\n\n\tContains(mockT, nil, \"key\")\n\texpectedFail := \"<nil> could not be applied builtin len()\"\n\tactualFail := mockT.errorString()\n\tif !strings.Contains(actualFail, expectedFail) {\n\t\tt.Errorf(\"Contains failure should include %q but was %q\", expectedFail, actualFail)\n\t}\n\n\tNotContains(mockT, nil, \"key\")\n\tif !strings.Contains(actualFail, expectedFail) {\n\t\tt.Errorf(\"Contains failure should include %q but was %q\", expectedFail, actualFail)\n\t}\n}\n\nfunc TestSubsetNotSubset(t *testing.T) {\n\tcases := []struct {\n\t\tlist    interface{}\n\t\tsubset  interface{}\n\t\tresult  bool\n\t\tmessage string\n\t}{\n\t\t// cases that are expected to contain\n\t\t{[]int{1, 2, 3}, nil, true, `nil is the empty set which is a subset of every set`},\n\t\t{[]int{1, 2, 3}, []int{}, true, `[] is a subset of ['\\x01' '\\x02' '\\x03']`},\n\t\t{[]int{1, 2, 3}, []int{1, 2}, true, `['\\x01' '\\x02'] is a subset of ['\\x01' '\\x02' '\\x03']`},\n\t\t{[]int{1, 2, 3}, []int{1, 2, 3}, true, `['\\x01' '\\x02' '\\x03'] is a subset of ['\\x01' '\\x02' '\\x03']`},\n\t\t{[]string{\"hello\", \"world\"}, []string{\"hello\"}, true, `[\"hello\"] is a subset of [\"hello\" \"world\"]`},\n\t\t{map[string]string{\n\t\t\t\"a\": \"x\",\n\t\t\t\"c\": \"z\",\n\t\t\t\"b\": \"y\",\n\t\t}, map[string]string{\n\t\t\t\"a\": \"x\",\n\t\t\t\"b\": \"y\",\n\t\t}, true, `map[\"a\":\"x\" \"b\":\"y\"] is a subset of map[\"a\":\"x\" \"b\":\"y\" \"c\":\"z\"]`},\n\n\t\t// cases that are expected not to contain\n\t\t{[]string{\"hello\", \"world\"}, []string{\"hello\", \"testify\"}, false, `[]string{\"hello\", \"world\"} does not contain \"testify\"`},\n\t\t{[]int{1, 2, 3}, []int{4, 5}, false, `[]int{1, 2, 3} does not contain 4`},\n\t\t{[]int{1, 2, 3}, []int{1, 5}, false, `[]int{1, 2, 3} does not contain 5`},\n\t\t{map[string]string{\n\t\t\t\"a\": \"x\",\n\t\t\t\"c\": \"z\",\n\t\t\t\"b\": \"y\",\n\t\t}, map[string]string{\n\t\t\t\"a\": \"x\",\n\t\t\t\"b\": \"z\",\n\t\t}, false, `map[string]string{\"a\":\"x\", \"b\":\"y\", \"c\":\"z\"} does not contain map[string]string{\"a\":\"x\", \"b\":\"z\"}`},\n\t\t{map[string]string{\n\t\t\t\"a\": \"x\",\n\t\t\t\"b\": \"y\",\n\t\t}, map[string]string{\n\t\t\t\"a\": \"x\",\n\t\t\t\"b\": \"y\",\n\t\t\t\"c\": \"z\",\n\t\t}, false, `map[string]string{\"a\":\"x\", \"b\":\"y\"} does not contain map[string]string{\"a\":\"x\", \"b\":\"y\", \"c\":\"z\"}`},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(\"SubSet: \"+c.message, func(t *testing.T) {\n\n\t\t\tmockT := new(mockTestingT)\n\t\t\tres := Subset(mockT, c.list, c.subset)\n\n\t\t\tif res != c.result {\n\t\t\t\tt.Errorf(\"Subset should return %t: %s\", c.result, c.message)\n\t\t\t}\n\t\t\tif !c.result {\n\t\t\t\texpectedFail := c.message\n\t\t\t\tactualFail := mockT.errorString()\n\t\t\t\tif !strings.Contains(actualFail, expectedFail) {\n\t\t\t\t\tt.Log(actualFail)\n\t\t\t\t\tt.Errorf(\"Subset failure should contain %q but was %q\", expectedFail, actualFail)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\tfor _, c := range cases {\n\t\tt.Run(\"NotSubSet: \"+c.message, func(t *testing.T) {\n\t\t\tmockT := new(mockTestingT)\n\t\t\tres := NotSubset(mockT, c.list, c.subset)\n\n\t\t\t// NotSubset should match the inverse of Subset. If it doesn't, something is wrong\n\t\t\tif res == Subset(mockT, c.list, c.subset) {\n\t\t\t\tt.Errorf(\"NotSubset should return %t: %s\", !c.result, c.message)\n\t\t\t}\n\t\t\tif c.result {\n\t\t\t\texpectedFail := c.message\n\t\t\t\tactualFail := mockT.errorString()\n\t\t\t\tif !strings.Contains(actualFail, expectedFail) {\n\t\t\t\t\tt.Log(actualFail)\n\t\t\t\t\tt.Errorf(\"NotSubset failure should contain %q but was %q\", expectedFail, actualFail)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNotSubsetNil(t *testing.T) {\n\tmockT := new(testing.T)\n\tNotSubset(mockT, []string{\"foo\"}, nil)\n\tif !mockT.Failed() {\n\t\tt.Error(\"NotSubset on nil set should have failed the test\")\n\t}\n}\n\nfunc Test_containsElement(t *testing.T) {\n\n\tlist1 := []string{\"Foo\", \"Bar\"}\n\tlist2 := []int{1, 2}\n\tsimpleMap := map[interface{}]interface{}{\"Foo\": \"Bar\"}\n\n\tok, found := containsElement(\"Hello World\", \"World\")\n\tTrue(t, ok)\n\tTrue(t, found)\n\n\tok, found = containsElement(list1, \"Foo\")\n\tTrue(t, ok)\n\tTrue(t, found)\n\n\tok, found = containsElement(list1, \"Bar\")\n\tTrue(t, ok)\n\tTrue(t, found)\n\n\tok, found = containsElement(list2, 1)\n\tTrue(t, ok)\n\tTrue(t, found)\n\n\tok, found = containsElement(list2, 2)\n\tTrue(t, ok)\n\tTrue(t, found)\n\n\tok, found = containsElement(list1, \"Foo!\")\n\tTrue(t, ok)\n\tFalse(t, found)\n\n\tok, found = containsElement(list2, 3)\n\tTrue(t, ok)\n\tFalse(t, found)\n\n\tok, found = containsElement(list2, \"1\")\n\tTrue(t, ok)\n\tFalse(t, found)\n\n\tok, found = containsElement(simpleMap, \"Foo\")\n\tTrue(t, ok)\n\tTrue(t, found)\n\n\tok, found = containsElement(simpleMap, \"Bar\")\n\tTrue(t, ok)\n\tFalse(t, found)\n\n\tok, found = containsElement(1433, \"1\")\n\tFalse(t, ok)\n\tFalse(t, found)\n}\n\nfunc TestElementsMatch(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tcases := []struct {\n\t\texpected interface{}\n\t\tactual   interface{}\n\t\tresult   bool\n\t}{\n\t\t// matching\n\t\t{nil, nil, true},\n\n\t\t{nil, nil, true},\n\t\t{[]int{}, []int{}, true},\n\t\t{[]int{1}, []int{1}, true},\n\t\t{[]int{1, 1}, []int{1, 1}, true},\n\t\t{[]int{1, 2}, []int{1, 2}, true},\n\t\t{[]int{1, 2}, []int{2, 1}, true},\n\t\t{[2]int{1, 2}, [2]int{2, 1}, true},\n\t\t{[]string{\"hello\", \"world\"}, []string{\"world\", \"hello\"}, true},\n\t\t{[]string{\"hello\", \"hello\"}, []string{\"hello\", \"hello\"}, true},\n\t\t{[]string{\"hello\", \"hello\", \"world\"}, []string{\"hello\", \"world\", \"hello\"}, true},\n\t\t{[3]string{\"hello\", \"hello\", \"world\"}, [3]string{\"hello\", \"world\", \"hello\"}, true},\n\t\t{[]int{}, nil, true},\n\n\t\t// not matching\n\t\t{[]int{1}, []int{1, 1}, false},\n\t\t{[]int{1, 2}, []int{2, 2}, false},\n\t\t{[]string{\"hello\", \"hello\"}, []string{\"hello\"}, false},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(fmt.Sprintf(\"ElementsMatch(%#v, %#v)\", c.expected, c.actual), func(t *testing.T) {\n\t\t\tres := ElementsMatch(mockT, c.actual, c.expected)\n\n\t\t\tif res != c.result {\n\t\t\t\tt.Errorf(\"ElementsMatch(%#v, %#v) should return %v\", c.actual, c.expected, c.result)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDiffLists(t *testing.T) {\n\ttests := []struct {\n\t\tname   string\n\t\tlistA  interface{}\n\t\tlistB  interface{}\n\t\textraA []interface{}\n\t\textraB []interface{}\n\t}{\n\t\t{\n\t\t\tname:   \"equal empty\",\n\t\t\tlistA:  []string{},\n\t\t\tlistB:  []string{},\n\t\t\textraA: nil,\n\t\t\textraB: nil,\n\t\t},\n\t\t{\n\t\t\tname:   \"equal same order\",\n\t\t\tlistA:  []string{\"hello\", \"world\"},\n\t\t\tlistB:  []string{\"hello\", \"world\"},\n\t\t\textraA: nil,\n\t\t\textraB: nil,\n\t\t},\n\t\t{\n\t\t\tname:   \"equal different order\",\n\t\t\tlistA:  []string{\"hello\", \"world\"},\n\t\t\tlistB:  []string{\"world\", \"hello\"},\n\t\t\textraA: nil,\n\t\t\textraB: nil,\n\t\t},\n\t\t{\n\t\t\tname:   \"extra A\",\n\t\t\tlistA:  []string{\"hello\", \"hello\", \"world\"},\n\t\t\tlistB:  []string{\"hello\", \"world\"},\n\t\t\textraA: []interface{}{\"hello\"},\n\t\t\textraB: nil,\n\t\t},\n\t\t{\n\t\t\tname:   \"extra A twice\",\n\t\t\tlistA:  []string{\"hello\", \"hello\", \"hello\", \"world\"},\n\t\t\tlistB:  []string{\"hello\", \"world\"},\n\t\t\textraA: []interface{}{\"hello\", \"hello\"},\n\t\t\textraB: nil,\n\t\t},\n\t\t{\n\t\t\tname:   \"extra B\",\n\t\t\tlistA:  []string{\"hello\", \"world\"},\n\t\t\tlistB:  []string{\"hello\", \"hello\", \"world\"},\n\t\t\textraA: nil,\n\t\t\textraB: []interface{}{\"hello\"},\n\t\t},\n\t\t{\n\t\t\tname:   \"extra B twice\",\n\t\t\tlistA:  []string{\"hello\", \"world\"},\n\t\t\tlistB:  []string{\"hello\", \"hello\", \"world\", \"hello\"},\n\t\t\textraA: nil,\n\t\t\textraB: []interface{}{\"hello\", \"hello\"},\n\t\t},\n\t\t{\n\t\t\tname:   \"integers 1\",\n\t\t\tlistA:  []int{1, 2, 3, 4, 5},\n\t\t\tlistB:  []int{5, 4, 3, 2, 1},\n\t\t\textraA: nil,\n\t\t\textraB: nil,\n\t\t},\n\t\t{\n\t\t\tname:   \"integers 2\",\n\t\t\tlistA:  []int{1, 2, 1, 2, 1},\n\t\t\tlistB:  []int{2, 1, 2, 1, 2},\n\t\t\textraA: []interface{}{1},\n\t\t\textraB: []interface{}{2},\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\ttest := test\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tactualExtraA, actualExtraB := diffLists(test.listA, test.listB)\n\t\t\tEqual(t, test.extraA, actualExtraA, \"extra A does not match for listA=%v listB=%v\",\n\t\t\t\ttest.listA, test.listB)\n\t\t\tEqual(t, test.extraB, actualExtraB, \"extra B does not match for listA=%v listB=%v\",\n\t\t\t\ttest.listA, test.listB)\n\t\t})\n\t}\n}\n\nfunc TestCondition(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tif !Condition(mockT, func() bool { return true }, \"Truth\") {\n\t\tt.Error(\"Condition should return true\")\n\t}\n\n\tif Condition(mockT, func() bool { return false }, \"Lie\") {\n\t\tt.Error(\"Condition should return false\")\n\t}\n\n}\n\nfunc TestDidPanic(t *testing.T) {\n\n\tconst panicMsg = \"Panic!\"\n\n\tif funcDidPanic, msg, _ := didPanic(func() {\n\t\tpanic(panicMsg)\n\t}); !funcDidPanic || msg != panicMsg {\n\t\tt.Error(\"didPanic should return true, panicMsg\")\n\t}\n\n\tif funcDidPanic, msg, _ := didPanic(func() {\n\t\tpanic(nil)\n\t}); !funcDidPanic || msg != nil {\n\t\tt.Error(\"didPanic should return true, nil\")\n\t}\n\n\tif funcDidPanic, _, _ := didPanic(func() {\n\t}); funcDidPanic {\n\t\tt.Error(\"didPanic should return false\")\n\t}\n\n}\n\nfunc TestPanics(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tif !Panics(mockT, func() {\n\t\tpanic(\"Panic!\")\n\t}) {\n\t\tt.Error(\"Panics should return true\")\n\t}\n\n\tif Panics(mockT, func() {\n\t}) {\n\t\tt.Error(\"Panics should return false\")\n\t}\n\n}\n\nfunc TestPanicsWithValue(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tif !PanicsWithValue(mockT, \"Panic!\", func() {\n\t\tpanic(\"Panic!\")\n\t}) {\n\t\tt.Error(\"PanicsWithValue should return true\")\n\t}\n\n\tif !PanicsWithValue(mockT, nil, func() {\n\t\tpanic(nil)\n\t}) {\n\t\tt.Error(\"PanicsWithValue should return true\")\n\t}\n\n\tif PanicsWithValue(mockT, \"Panic!\", func() {\n\t}) {\n\t\tt.Error(\"PanicsWithValue should return false\")\n\t}\n\n\tif PanicsWithValue(mockT, \"at the disco\", func() {\n\t\tpanic(\"Panic!\")\n\t}) {\n\t\tt.Error(\"PanicsWithValue should return false\")\n\t}\n}\n\nfunc TestPanicsWithError(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tif !PanicsWithError(mockT, \"panic\", func() {\n\t\tpanic(errors.New(\"panic\"))\n\t}) {\n\t\tt.Error(\"PanicsWithError should return true\")\n\t}\n\n\tif PanicsWithError(mockT, \"Panic!\", func() {\n\t}) {\n\t\tt.Error(\"PanicsWithError should return false\")\n\t}\n\n\tif PanicsWithError(mockT, \"at the disco\", func() {\n\t\tpanic(errors.New(\"panic\"))\n\t}) {\n\t\tt.Error(\"PanicsWithError should return false\")\n\t}\n\n\tif PanicsWithError(mockT, \"Panic!\", func() {\n\t\tpanic(\"panic\")\n\t}) {\n\t\tt.Error(\"PanicsWithError should return false\")\n\t}\n}\n\nfunc TestNotPanics(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\tif !NotPanics(mockT, func() {\n\t}) {\n\t\tt.Error(\"NotPanics should return true\")\n\t}\n\n\tif NotPanics(mockT, func() {\n\t\tpanic(\"Panic!\")\n\t}) {\n\t\tt.Error(\"NotPanics should return false\")\n\t}\n\n}\n\nfunc TestNoError(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\t// start with a nil error\n\tvar err error\n\n\tTrue(t, NoError(mockT, err), \"NoError should return True for nil arg\")\n\n\t// now set an error\n\terr = errors.New(\"some error\")\n\n\tFalse(t, NoError(mockT, err), \"NoError with error should return False\")\n\n\t// returning an empty error interface\n\terr = func() error {\n\t\tvar err *customError\n\t\treturn err\n\t}()\n\n\tif err == nil { // err is not nil here!\n\t\tt.Errorf(\"Error should be nil due to empty interface: %s\", err)\n\t}\n\n\tFalse(t, NoError(mockT, err), \"NoError should fail with empty error interface\")\n}\n\ntype customError struct{}\n\nfunc (*customError) Error() string { return \"fail\" }\n\nfunc TestError(t *testing.T) {\n\n\tmockT := new(testing.T)\n\n\t// start with a nil error\n\tvar err error\n\n\tFalse(t, Error(mockT, err), \"Error should return False for nil arg\")\n\n\t// now set an error\n\terr = errors.New(\"some error\")\n\n\tTrue(t, Error(mockT, err), \"Error with error should return True\")\n\n\t// go vet check\n\tTrue(t, Errorf(mockT, err, \"example with %s\", \"formatted message\"), \"Errorf with error should return True\")\n\n\t// returning an empty error interface\n\terr = func() error {\n\t\tvar err *customError\n\t\treturn err\n\t}()\n\n\tif err == nil { // err is not nil here!\n\t\tt.Errorf(\"Error should be nil due to empty interface: %s\", err)\n\t}\n\n\tTrue(t, Error(mockT, err), \"Error should pass with empty error interface\")\n}\n\nfunc TestEqualError(t *testing.T) {\n\tmockT := new(testing.T)\n\n\t// start with a nil error\n\tvar err error\n\tFalse(t, EqualError(mockT, err, \"\"),\n\t\t\"EqualError should return false for nil arg\")\n\n\t// now set an error\n\terr = errors.New(\"some error\")\n\tFalse(t, EqualError(mockT, err, \"Not some error\"),\n\t\t\"EqualError should return false for different error string\")\n\tTrue(t, EqualError(mockT, err, \"some error\"),\n\t\t\"EqualError should return true\")\n}\n\nfunc TestErrorContains(t *testing.T) {\n\tmockT := new(testing.T)\n\n\t// start with a nil error\n\tvar err error\n\tFalse(t, ErrorContains(mockT, err, \"\"),\n\t\t\"ErrorContains should return false for nil arg\")\n\n\t// now set an error\n\terr = errors.New(\"some error: another error\")\n\tFalse(t, ErrorContains(mockT, err, \"bad error\"),\n\t\t\"ErrorContains should return false for different error string\")\n\tTrue(t, ErrorContains(mockT, err, \"some error\"),\n\t\t\"ErrorContains should return true\")\n\tTrue(t, ErrorContains(mockT, err, \"another error\"),\n\t\t\"ErrorContains should return true\")\n}\n\nfunc Test_isEmpty(t *testing.T) {\n\n\tchWithValue := make(chan struct{}, 1)\n\tchWithValue <- struct{}{}\n\n\tTrue(t, isEmpty(\"\"))\n\tTrue(t, isEmpty(nil))\n\tTrue(t, isEmpty([]string{}))\n\tTrue(t, isEmpty(0))\n\tTrue(t, isEmpty(int32(0)))\n\tTrue(t, isEmpty(int64(0)))\n\tTrue(t, isEmpty(false))\n\tTrue(t, isEmpty(map[string]string{}))\n\tTrue(t, isEmpty(new(time.Time)))\n\tTrue(t, isEmpty(time.Time{}))\n\tTrue(t, isEmpty(make(chan struct{})))\n\tTrue(t, isEmpty([1]int{}))\n\tFalse(t, isEmpty(\"something\"))\n\tFalse(t, isEmpty(errors.New(\"something\")))\n\tFalse(t, isEmpty([]string{\"something\"}))\n\tFalse(t, isEmpty(1))\n\tFalse(t, isEmpty(true))\n\tFalse(t, isEmpty(map[string]string{\"Hello\": \"World\"}))\n\tFalse(t, isEmpty(chWithValue))\n\tFalse(t, isEmpty([1]int{42}))\n}\n\nfunc TestEmpty(t *testing.T) {\n\n\tmockT := new(testing.T)\n\tchWithValue := make(chan struct{}, 1)\n\tchWithValue <- struct{}{}\n\tvar tiP *time.Time\n\tvar tiNP time.Time\n\tvar s *string\n\tvar f *os.File\n\tsP := &s\n\tx := 1\n\txP := &x\n\n\ttype TString string\n\ttype TStruct struct {\n\t\tx int\n\t}\n\n\tTrue(t, Empty(mockT, \"\"), \"Empty string is empty\")\n\tTrue(t, Empty(mockT, nil), \"Nil is empty\")\n\tTrue(t, Empty(mockT, []string{}), \"Empty string array is empty\")\n\tTrue(t, Empty(mockT, 0), \"Zero int value is empty\")\n\tTrue(t, Empty(mockT, false), \"False value is empty\")\n\tTrue(t, Empty(mockT, make(chan struct{})), \"Channel without values is empty\")\n\tTrue(t, Empty(mockT, s), \"Nil string pointer is empty\")\n\tTrue(t, Empty(mockT, f), \"Nil os.File pointer is empty\")\n\tTrue(t, Empty(mockT, tiP), \"Nil time.Time pointer is empty\")\n\tTrue(t, Empty(mockT, tiNP), \"time.Time is empty\")\n\tTrue(t, Empty(mockT, TStruct{}), \"struct with zero values is empty\")\n\tTrue(t, Empty(mockT, TString(\"\")), \"empty aliased string is empty\")\n\tTrue(t, Empty(mockT, sP), \"ptr to nil value is empty\")\n\tTrue(t, Empty(mockT, [1]int{}), \"array is state\")\n\n\tFalse(t, Empty(mockT, \"something\"), \"Non Empty string is not empty\")\n\tFalse(t, Empty(mockT, errors.New(\"something\")), \"Non nil object is not empty\")\n\tFalse(t, Empty(mockT, []string{\"something\"}), \"Non empty string array is not empty\")\n\tFalse(t, Empty(mockT, 1), \"Non-zero int value is not empty\")\n\tFalse(t, Empty(mockT, true), \"True value is not empty\")\n\tFalse(t, Empty(mockT, chWithValue), \"Channel with values is not empty\")\n\tFalse(t, Empty(mockT, TStruct{x: 1}), \"struct with initialized values is empty\")\n\tFalse(t, Empty(mockT, TString(\"abc\")), \"non-empty aliased string is empty\")\n\tFalse(t, Empty(mockT, xP), \"ptr to non-nil value is not empty\")\n\tFalse(t, Empty(mockT, [1]int{42}), \"array is not state\")\n}\n\nfunc TestNotEmpty(t *testing.T) {\n\n\tmockT := new(testing.T)\n\tchWithValue := make(chan struct{}, 1)\n\tchWithValue <- struct{}{}\n\n\tFalse(t, NotEmpty(mockT, \"\"), \"Empty string is empty\")\n\tFalse(t, NotEmpty(mockT, nil), \"Nil is empty\")\n\tFalse(t, NotEmpty(mockT, []string{}), \"Empty string array is empty\")\n\tFalse(t, NotEmpty(mockT, 0), \"Zero int value is empty\")\n\tFalse(t, NotEmpty(mockT, false), \"False value is empty\")\n\tFalse(t, NotEmpty(mockT, make(chan struct{})), \"Channel without values is empty\")\n\tFalse(t, NotEmpty(mockT, [1]int{}), \"array is state\")\n\n\tTrue(t, NotEmpty(mockT, \"something\"), \"Non Empty string is not empty\")\n\tTrue(t, NotEmpty(mockT, errors.New(\"something\")), \"Non nil object is not empty\")\n\tTrue(t, NotEmpty(mockT, []string{\"something\"}), \"Non empty string array is not empty\")\n\tTrue(t, NotEmpty(mockT, 1), \"Non-zero int value is not empty\")\n\tTrue(t, NotEmpty(mockT, true), \"True value is not empty\")\n\tTrue(t, NotEmpty(mockT, chWithValue), \"Channel with values is not empty\")\n\tTrue(t, NotEmpty(mockT, [1]int{42}), \"array is not state\")\n}\n\nfunc Test_getLen(t *testing.T) {\n\tfalseCases := []interface{}{\n\t\tnil,\n\t\t0,\n\t\ttrue,\n\t\tfalse,\n\t\t'A',\n\t\tstruct{}{},\n\t}\n\tfor _, v := range falseCases {\n\t\tl, ok := getLen(v)\n\t\tFalse(t, ok, \"Expected getLen fail to get length of %#v\", v)\n\t\tEqual(t, 0, l, \"getLen should return 0 for %#v\", v)\n\t}\n\n\tch := make(chan int, 5)\n\tch <- 1\n\tch <- 2\n\tch <- 3\n\ttrueCases := []struct {\n\t\tv interface{}\n\t\tl int\n\t}{\n\t\t{[]int{1, 2, 3}, 3},\n\t\t{[...]int{1, 2, 3}, 3},\n\t\t{\"ABC\", 3},\n\t\t{map[int]int{1: 2, 2: 4, 3: 6}, 3},\n\t\t{ch, 3},\n\n\t\t{[]int{}, 0},\n\t\t{map[int]int{}, 0},\n\t\t{make(chan int), 0},\n\n\t\t{[]int(nil), 0},\n\t\t{map[int]int(nil), 0},\n\t\t{(chan int)(nil), 0},\n\t}\n\n\tfor _, c := range trueCases {\n\t\tl, ok := getLen(c.v)\n\t\tTrue(t, ok, \"Expected getLen success to get length of %#v\", c.v)\n\t\tEqual(t, c.l, l)\n\t}\n}\n\nfunc TestLen(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tFalse(t, Len(mockT, nil, 0), \"nil does not have length\")\n\tFalse(t, Len(mockT, 0, 0), \"int does not have length\")\n\tFalse(t, Len(mockT, true, 0), \"true does not have length\")\n\tFalse(t, Len(mockT, false, 0), \"false does not have length\")\n\tFalse(t, Len(mockT, 'A', 0), \"Rune does not have length\")\n\tFalse(t, Len(mockT, struct{}{}, 0), \"Struct does not have length\")\n\n\tch := make(chan int, 5)\n\tch <- 1\n\tch <- 2\n\tch <- 3\n\n\tcases := []struct {\n\t\tv               interface{}\n\t\tl               int\n\t\texpected1234567 string // message when expecting 1234567 items\n\t}{\n\t\t{[]int{1, 2, 3}, 3, `\"[1 2 3]\" should have 1234567 item(s), but has 3`},\n\t\t{[...]int{1, 2, 3}, 3, `\"[1 2 3]\" should have 1234567 item(s), but has 3`},\n\t\t{\"ABC\", 3, `\"ABC\" should have 1234567 item(s), but has 3`},\n\t\t{map[int]int{1: 2, 2: 4, 3: 6}, 3, `\"map[1:2 2:4 3:6]\" should have 1234567 item(s), but has 3`},\n\t\t{ch, 3, \"\"},\n\n\t\t{[]int{}, 0, `\"[]\" should have 1234567 item(s), but has 0`},\n\t\t{map[int]int{}, 0, `\"map[]\" should have 1234567 item(s), but has 0`},\n\t\t{make(chan int), 0, \"\"},\n\n\t\t{[]int(nil), 0, `\"[]\" should have 1234567 item(s), but has 0`},\n\t\t{map[int]int(nil), 0, `\"map[]\" should have 1234567 item(s), but has 0`},\n\t\t{(chan int)(nil), 0, `\"<nil>\" should have 1234567 item(s), but has 0`},\n\t}\n\n\tfor _, c := range cases {\n\t\tTrue(t, Len(mockT, c.v, c.l), \"%#v have %d items\", c.v, c.l)\n\t\tFalse(t, Len(mockT, c.v, c.l+1), \"%#v have %d items\", c.v, c.l)\n\t\tif c.expected1234567 != \"\" {\n\t\t\tmsgMock := new(mockTestingT)\n\t\t\tLen(msgMock, c.v, 1234567)\n\t\t\tContains(t, msgMock.errorString(), c.expected1234567)\n\t\t}\n\t}\n}\n\nfunc TestWithinDuration(t *testing.T) {\n\n\tmockT := new(testing.T)\n\ta := time.Now()\n\tb := a.Add(10 * time.Second)\n\n\tTrue(t, WithinDuration(mockT, a, b, 10*time.Second), \"A 10s difference is within a 10s time difference\")\n\tTrue(t, WithinDuration(mockT, b, a, 10*time.Second), \"A 10s difference is within a 10s time difference\")\n\n\tFalse(t, WithinDuration(mockT, a, b, 9*time.Second), \"A 10s difference is not within a 9s time difference\")\n\tFalse(t, WithinDuration(mockT, b, a, 9*time.Second), \"A 10s difference is not within a 9s time difference\")\n\n\tFalse(t, WithinDuration(mockT, a, b, -9*time.Second), \"A 10s difference is not within a 9s time difference\")\n\tFalse(t, WithinDuration(mockT, b, a, -9*time.Second), \"A 10s difference is not within a 9s time difference\")\n\n\tFalse(t, WithinDuration(mockT, a, b, -11*time.Second), \"A 10s difference is not within a 9s time difference\")\n\tFalse(t, WithinDuration(mockT, b, a, -11*time.Second), \"A 10s difference is not within a 9s time difference\")\n}\n\nfunc TestWithinRange(t *testing.T) {\n\n\tmockT := new(testing.T)\n\tn := time.Now()\n\ts := n.Add(-time.Second)\n\te := n.Add(time.Second)\n\n\tTrue(t, WithinRange(mockT, n, n, n), \"Exact same actual, start, and end values return true\")\n\n\tTrue(t, WithinRange(mockT, n, s, e), \"Time in range is within the time range\")\n\tTrue(t, WithinRange(mockT, s, s, e), \"The start time is within the time range\")\n\tTrue(t, WithinRange(mockT, e, s, e), \"The end time is within the time range\")\n\n\tFalse(t, WithinRange(mockT, s.Add(-time.Nanosecond), s, e, \"Just before the start time is not within the time range\"))\n\tFalse(t, WithinRange(mockT, e.Add(time.Nanosecond), s, e, \"Just after the end time is not within the time range\"))\n\n\tFalse(t, WithinRange(mockT, n, e, s, \"Just after the end time is not within the time range\"))\n}\n\nfunc TestInDelta(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tTrue(t, InDelta(mockT, 1.001, 1, 0.01), \"|1.001 - 1| <= 0.01\")\n\tTrue(t, InDelta(mockT, 1, 1.001, 0.01), \"|1 - 1.001| <= 0.01\")\n\tTrue(t, InDelta(mockT, 1, 2, 1), \"|1 - 2| <= 1\")\n\tFalse(t, InDelta(mockT, 1, 2, 0.5), \"Expected |1 - 2| <= 0.5 to fail\")\n\tFalse(t, InDelta(mockT, 2, 1, 0.5), \"Expected |2 - 1| <= 0.5 to fail\")\n\tFalse(t, InDelta(mockT, \"\", nil, 1), \"Expected non numerals to fail\")\n\tFalse(t, InDelta(mockT, 42, math.NaN(), 0.01), \"Expected NaN for actual to fail\")\n\tFalse(t, InDelta(mockT, math.NaN(), 42, 0.01), \"Expected NaN for expected to fail\")\n\tTrue(t, InDelta(mockT, math.NaN(), math.NaN(), 0.01), \"Expected NaN for both to pass\")\n\n\tcases := []struct {\n\t\ta, b  interface{}\n\t\tdelta float64\n\t}{\n\t\t{uint(2), uint(1), 1},\n\t\t{uint8(2), uint8(1), 1},\n\t\t{uint16(2), uint16(1), 1},\n\t\t{uint32(2), uint32(1), 1},\n\t\t{uint64(2), uint64(1), 1},\n\n\t\t{int(2), int(1), 1},\n\t\t{int8(2), int8(1), 1},\n\t\t{int16(2), int16(1), 1},\n\t\t{int32(2), int32(1), 1},\n\t\t{int64(2), int64(1), 1},\n\n\t\t{float32(2), float32(1), 1},\n\t\t{float64(2), float64(1), 1},\n\t}\n\n\tfor _, tc := range cases {\n\t\tTrue(t, InDelta(mockT, tc.a, tc.b, tc.delta), \"Expected |%V - %V| <= %v\", tc.a, tc.b, tc.delta)\n\t}\n}\n\nfunc TestInDeltaSlice(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tTrue(t, InDeltaSlice(mockT,\n\t\t[]float64{1.001, math.NaN(), 0.999},\n\t\t[]float64{1, math.NaN(), 1},\n\t\t0.1), \"{1.001, NaN, 0.009} is element-wise close to {1, NaN, 1} in delta=0.1\")\n\n\tTrue(t, InDeltaSlice(mockT,\n\t\t[]float64{1, math.NaN(), 2},\n\t\t[]float64{0, math.NaN(), 3},\n\t\t1), \"{1, NaN, 2} is element-wise close to {0, NaN, 3} in delta=1\")\n\n\tFalse(t, InDeltaSlice(mockT,\n\t\t[]float64{1, math.NaN(), 2},\n\t\t[]float64{0, math.NaN(), 3},\n\t\t0.1), \"{1, NaN, 2} is not element-wise close to {0, NaN, 3} in delta=0.1\")\n\n\tFalse(t, InDeltaSlice(mockT, \"\", nil, 1), \"Expected non numeral slices to fail\")\n}\n\nfunc TestInDeltaMapValues(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tfor _, tc := range []struct {\n\t\ttitle  string\n\t\texpect interface{}\n\t\tactual interface{}\n\t\tf      func(TestingT, bool, ...interface{}) bool\n\t\tdelta  float64\n\t}{\n\t\t{\n\t\t\ttitle: \"Within delta\",\n\t\t\texpect: map[string]float64{\n\t\t\t\t\"foo\": 1.0,\n\t\t\t\t\"bar\": 2.0,\n\t\t\t\t\"baz\": math.NaN(),\n\t\t\t},\n\t\t\tactual: map[string]float64{\n\t\t\t\t\"foo\": 1.01,\n\t\t\t\t\"bar\": 1.99,\n\t\t\t\t\"baz\": math.NaN(),\n\t\t\t},\n\t\t\tdelta: 0.1,\n\t\t\tf:     True,\n\t\t},\n\t\t{\n\t\t\ttitle: \"Within delta\",\n\t\t\texpect: map[int]float64{\n\t\t\t\t1: 1.0,\n\t\t\t\t2: 2.0,\n\t\t\t},\n\t\t\tactual: map[int]float64{\n\t\t\t\t1: 1.0,\n\t\t\t\t2: 1.99,\n\t\t\t},\n\t\t\tdelta: 0.1,\n\t\t\tf:     True,\n\t\t},\n\t\t{\n\t\t\ttitle: \"Different number of keys\",\n\t\t\texpect: map[int]float64{\n\t\t\t\t1: 1.0,\n\t\t\t\t2: 2.0,\n\t\t\t},\n\t\t\tactual: map[int]float64{\n\t\t\t\t1: 1.0,\n\t\t\t},\n\t\t\tdelta: 0.1,\n\t\t\tf:     False,\n\t\t},\n\t\t{\n\t\t\ttitle: \"Within delta with zero value\",\n\t\t\texpect: map[string]float64{\n\t\t\t\t\"zero\": 0,\n\t\t\t},\n\t\t\tactual: map[string]float64{\n\t\t\t\t\"zero\": 0,\n\t\t\t},\n\t\t\tdelta: 0.1,\n\t\t\tf:     True,\n\t\t},\n\t\t{\n\t\t\ttitle: \"With missing key with zero value\",\n\t\t\texpect: map[string]float64{\n\t\t\t\t\"zero\": 0,\n\t\t\t\t\"foo\":  0,\n\t\t\t},\n\t\t\tactual: map[string]float64{\n\t\t\t\t\"zero\": 0,\n\t\t\t\t\"bar\":  0,\n\t\t\t},\n\t\t\tf: False,\n\t\t},\n\t} {\n\t\ttc.f(t, InDeltaMapValues(mockT, tc.expect, tc.actual, tc.delta), tc.title+\"\\n\"+diff(tc.expect, tc.actual))\n\t}\n}\n\nfunc TestInEpsilon(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tcases := []struct {\n\t\ta, b    interface{}\n\t\tepsilon float64\n\t}{\n\t\t{uint8(2), uint16(2), .001},\n\t\t{2.1, 2.2, 0.1},\n\t\t{2.2, 2.1, 0.1},\n\t\t{-2.1, -2.2, 0.1},\n\t\t{-2.2, -2.1, 0.1},\n\t\t{uint64(100), uint8(101), 0.01},\n\t\t{0.1, -0.1, 2},\n\t\t{0.1, 0, 2},\n\t\t{math.NaN(), math.NaN(), 1},\n\t\t{time.Second, time.Second + time.Millisecond, 0.002},\n\t}\n\n\tfor _, tc := range cases {\n\t\tTrue(t, InEpsilon(t, tc.a, tc.b, tc.epsilon, \"Expected %V and %V to have a relative difference of %v\", tc.a, tc.b, tc.epsilon), \"test: %q\", tc)\n\t}\n\n\tcases = []struct {\n\t\ta, b    interface{}\n\t\tepsilon float64\n\t}{\n\t\t{uint8(2), int16(-2), .001},\n\t\t{uint64(100), uint8(102), 0.01},\n\t\t{2.1, 2.2, 0.001},\n\t\t{2.2, 2.1, 0.001},\n\t\t{2.1, -2.2, 1},\n\t\t{2.1, \"bla-bla\", 0},\n\t\t{0.1, -0.1, 1.99},\n\t\t{0, 0.1, 2}, // expected must be different to zero\n\t\t{time.Second, time.Second + 10*time.Millisecond, 0.002},\n\t\t{math.NaN(), 0, 1},\n\t\t{0, math.NaN(), 1},\n\t\t{0, 0, math.NaN()},\n\t}\n\n\tfor _, tc := range cases {\n\t\tFalse(t, InEpsilon(mockT, tc.a, tc.b, tc.epsilon, \"Expected %V and %V to have a relative difference of %v\", tc.a, tc.b, tc.epsilon))\n\t}\n\n}\n\nfunc TestInEpsilonSlice(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tTrue(t, InEpsilonSlice(mockT,\n\t\t[]float64{2.2, math.NaN(), 2.0},\n\t\t[]float64{2.1, math.NaN(), 2.1},\n\t\t0.06), \"{2.2, NaN, 2.0} is element-wise close to {2.1, NaN, 2.1} in epsilon=0.06\")\n\n\tFalse(t, InEpsilonSlice(mockT,\n\t\t[]float64{2.2, 2.0},\n\t\t[]float64{2.1, 2.1},\n\t\t0.04), \"{2.2, 2.0} is not element-wise close to {2.1, 2.1} in epsilon=0.04\")\n\n\tFalse(t, InEpsilonSlice(mockT, \"\", nil, 1), \"Expected non numeral slices to fail\")\n}\n\nfunc TestRegexp(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tcases := []struct {\n\t\trx, str string\n\t}{\n\t\t{\"^start\", \"start of the line\"},\n\t\t{\"end$\", \"in the end\"},\n\t\t{\"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}\", \"My phone number is 650.12.34\"},\n\t}\n\n\tfor _, tc := range cases {\n\t\tTrue(t, Regexp(mockT, tc.rx, tc.str))\n\t\tTrue(t, Regexp(mockT, regexp.MustCompile(tc.rx), tc.str))\n\t\tFalse(t, NotRegexp(mockT, tc.rx, tc.str))\n\t\tFalse(t, NotRegexp(mockT, regexp.MustCompile(tc.rx), tc.str))\n\t}\n\n\tcases = []struct {\n\t\trx, str string\n\t}{\n\t\t{\"^asdfastart\", \"Not the start of the line\"},\n\t\t{\"end$\", \"in the end.\"},\n\t\t{\"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}\", \"My phone number is 650.12a.34\"},\n\t}\n\n\tfor _, tc := range cases {\n\t\tFalse(t, Regexp(mockT, tc.rx, tc.str), \"Expected \\\"%s\\\" to not match \\\"%s\\\"\", tc.rx, tc.str)\n\t\tFalse(t, Regexp(mockT, regexp.MustCompile(tc.rx), tc.str))\n\t\tTrue(t, NotRegexp(mockT, tc.rx, tc.str))\n\t\tTrue(t, NotRegexp(mockT, regexp.MustCompile(tc.rx), tc.str))\n\t}\n}\n\nfunc testAutogeneratedFunction() {\n\tdefer func() {\n\t\tif err := recover(); err == nil {\n\t\t\tpanic(\"did not panic\")\n\t\t}\n\t\tCallerInfo()\n\t}()\n\tt := struct {\n\t\tio.Closer\n\t}{}\n\tc := t\n\tc.Close()\n}\n\nfunc TestCallerInfoWithAutogeneratedFunctions(t *testing.T) {\n\tNotPanics(t, func() {\n\t\ttestAutogeneratedFunction()\n\t})\n}\n\nfunc TestZero(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tfor _, test := range zeros {\n\t\tTrue(t, Zero(mockT, test, \"%#v is not the %v zero value\", test, reflect.TypeOf(test)))\n\t}\n\n\tfor _, test := range nonZeros {\n\t\tFalse(t, Zero(mockT, test, \"%#v is not the %v zero value\", test, reflect.TypeOf(test)))\n\t}\n}\n\nfunc TestNotZero(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tfor _, test := range zeros {\n\t\tFalse(t, NotZero(mockT, test, \"%#v is not the %v zero value\", test, reflect.TypeOf(test)))\n\t}\n\n\tfor _, test := range nonZeros {\n\t\tTrue(t, NotZero(mockT, test, \"%#v is not the %v zero value\", test, reflect.TypeOf(test)))\n\t}\n}\n\nfunc TestFileExists(t *testing.T) {\n\tmockT := new(testing.T)\n\tTrue(t, FileExists(mockT, \"assertions.go\"))\n\n\tmockT = new(testing.T)\n\tFalse(t, FileExists(mockT, \"random_file\"))\n\n\tmockT = new(testing.T)\n\tFalse(t, FileExists(mockT, \"../_codegen\"))\n\n\tvar tempFiles []string\n\n\tlink, err := getTempSymlinkPath(\"assertions.go\")\n\tif err != nil {\n\t\tt.Fatal(\"could not create temp symlink, err:\", err)\n\t}\n\ttempFiles = append(tempFiles, link)\n\tmockT = new(testing.T)\n\tTrue(t, FileExists(mockT, link))\n\n\tlink, err = getTempSymlinkPath(\"non_existent_file\")\n\tif err != nil {\n\t\tt.Fatal(\"could not create temp symlink, err:\", err)\n\t}\n\ttempFiles = append(tempFiles, link)\n\tmockT = new(testing.T)\n\tTrue(t, FileExists(mockT, link))\n\n\terrs := cleanUpTempFiles(tempFiles)\n\tif len(errs) > 0 {\n\t\tt.Fatal(\"could not clean up temporary files\")\n\t}\n}\n\nfunc TestNoFileExists(t *testing.T) {\n\tmockT := new(testing.T)\n\tFalse(t, NoFileExists(mockT, \"assertions.go\"))\n\n\tmockT = new(testing.T)\n\tTrue(t, NoFileExists(mockT, \"non_existent_file\"))\n\n\tmockT = new(testing.T)\n\tTrue(t, NoFileExists(mockT, \"../_codegen\"))\n\n\tvar tempFiles []string\n\n\tlink, err := getTempSymlinkPath(\"assertions.go\")\n\tif err != nil {\n\t\tt.Fatal(\"could not create temp symlink, err:\", err)\n\t}\n\ttempFiles = append(tempFiles, link)\n\tmockT = new(testing.T)\n\tFalse(t, NoFileExists(mockT, link))\n\n\tlink, err = getTempSymlinkPath(\"non_existent_file\")\n\tif err != nil {\n\t\tt.Fatal(\"could not create temp symlink, err:\", err)\n\t}\n\ttempFiles = append(tempFiles, link)\n\tmockT = new(testing.T)\n\tFalse(t, NoFileExists(mockT, link))\n\n\terrs := cleanUpTempFiles(tempFiles)\n\tif len(errs) > 0 {\n\t\tt.Fatal(\"could not clean up temporary files\")\n\t}\n}\n\nfunc getTempSymlinkPath(file string) (string, error) {\n\tlink := file + \"_symlink\"\n\terr := os.Symlink(file, link)\n\treturn link, err\n}\n\nfunc cleanUpTempFiles(paths []string) []error {\n\tvar res []error\n\tfor _, path := range paths {\n\t\terr := os.Remove(path)\n\t\tif err != nil {\n\t\t\tres = append(res, err)\n\t\t}\n\t}\n\treturn res\n}\n\nfunc TestDirExists(t *testing.T) {\n\tmockT := new(testing.T)\n\tFalse(t, DirExists(mockT, \"assertions.go\"))\n\n\tmockT = new(testing.T)\n\tFalse(t, DirExists(mockT, \"non_existent_dir\"))\n\n\tmockT = new(testing.T)\n\tTrue(t, DirExists(mockT, \"../assert\"))\n\n\tvar tempFiles []string\n\n\tlink, err := getTempSymlinkPath(\"assertions.go\")\n\tif err != nil {\n\t\tt.Fatal(\"could not create temp symlink, err:\", err)\n\t}\n\ttempFiles = append(tempFiles, link)\n\tmockT = new(testing.T)\n\tFalse(t, DirExists(mockT, link))\n\n\tlink, err = getTempSymlinkPath(\"non_existent_dir\")\n\tif err != nil {\n\t\tt.Fatal(\"could not create temp symlink, err:\", err)\n\t}\n\ttempFiles = append(tempFiles, link)\n\tmockT = new(testing.T)\n\tFalse(t, DirExists(mockT, link))\n\n\terrs := cleanUpTempFiles(tempFiles)\n\tif len(errs) > 0 {\n\t\tt.Fatal(\"could not clean up temporary files\")\n\t}\n}\n\nfunc TestNoDirExists(t *testing.T) {\n\tmockT := new(testing.T)\n\tTrue(t, NoDirExists(mockT, \"assertions.go\"))\n\n\tmockT = new(testing.T)\n\tTrue(t, NoDirExists(mockT, \"non_existent_dir\"))\n\n\tmockT = new(testing.T)\n\tFalse(t, NoDirExists(mockT, \"../assert\"))\n\n\tvar tempFiles []string\n\n\tlink, err := getTempSymlinkPath(\"assertions.go\")\n\tif err != nil {\n\t\tt.Fatal(\"could not create temp symlink, err:\", err)\n\t}\n\ttempFiles = append(tempFiles, link)\n\tmockT = new(testing.T)\n\tTrue(t, NoDirExists(mockT, link))\n\n\tlink, err = getTempSymlinkPath(\"non_existent_dir\")\n\tif err != nil {\n\t\tt.Fatal(\"could not create temp symlink, err:\", err)\n\t}\n\ttempFiles = append(tempFiles, link)\n\tmockT = new(testing.T)\n\tTrue(t, NoDirExists(mockT, link))\n\n\terrs := cleanUpTempFiles(tempFiles)\n\tif len(errs) > 0 {\n\t\tt.Fatal(\"could not clean up temporary files\")\n\t}\n}\n\nfunc TestJSONEq_EqualSONString(t *testing.T) {\n\tmockT := new(testing.T)\n\tTrue(t, JSONEq(mockT, `{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"hello\": \"world\", \"foo\": \"bar\"}`))\n}\n\nfunc TestJSONEq_EquivalentButNotEqual(t *testing.T) {\n\tmockT := new(testing.T)\n\tTrue(t, JSONEq(mockT, `{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`))\n}\n\nfunc TestJSONEq_HashOfArraysAndHashes(t *testing.T) {\n\tmockT := new(testing.T)\n\tTrue(t, JSONEq(mockT, \"{\\r\\n\\t\\\"numeric\\\": 1.5,\\r\\n\\t\\\"array\\\": [{\\\"foo\\\": \\\"bar\\\"}, 1, \\\"string\\\", [\\\"nested\\\", \\\"array\\\", 5.5]],\\r\\n\\t\\\"hash\\\": {\\\"nested\\\": \\\"hash\\\", \\\"nested_slice\\\": [\\\"this\\\", \\\"is\\\", \\\"nested\\\"]},\\r\\n\\t\\\"string\\\": \\\"foo\\\"\\r\\n}\",\n\t\t\"{\\r\\n\\t\\\"numeric\\\": 1.5,\\r\\n\\t\\\"hash\\\": {\\\"nested\\\": \\\"hash\\\", \\\"nested_slice\\\": [\\\"this\\\", \\\"is\\\", \\\"nested\\\"]},\\r\\n\\t\\\"string\\\": \\\"foo\\\",\\r\\n\\t\\\"array\\\": [{\\\"foo\\\": \\\"bar\\\"}, 1, \\\"string\\\", [\\\"nested\\\", \\\"array\\\", 5.5]]\\r\\n}\"))\n}\n\nfunc TestJSONEq_Array(t *testing.T) {\n\tmockT := new(testing.T)\n\tTrue(t, JSONEq(mockT, `[\"foo\", {\"hello\": \"world\", \"nested\": \"hash\"}]`, `[\"foo\", {\"nested\": \"hash\", \"hello\": \"world\"}]`))\n}\n\nfunc TestJSONEq_HashAndArrayNotEquivalent(t *testing.T) {\n\tmockT := new(testing.T)\n\tFalse(t, JSONEq(mockT, `[\"foo\", {\"hello\": \"world\", \"nested\": \"hash\"}]`, `{\"foo\": \"bar\", {\"nested\": \"hash\", \"hello\": \"world\"}}`))\n}\n\nfunc TestJSONEq_HashesNotEquivalent(t *testing.T) {\n\tmockT := new(testing.T)\n\tFalse(t, JSONEq(mockT, `{\"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`))\n}\n\nfunc TestJSONEq_ActualIsNotJSON(t *testing.T) {\n\tmockT := new(testing.T)\n\tFalse(t, JSONEq(mockT, `{\"foo\": \"bar\"}`, \"Not JSON\"))\n}\n\nfunc TestJSONEq_ExpectedIsNotJSON(t *testing.T) {\n\tmockT := new(testing.T)\n\tFalse(t, JSONEq(mockT, \"Not JSON\", `{\"foo\": \"bar\", \"hello\": \"world\"}`))\n}\n\nfunc TestJSONEq_ExpectedAndActualNotJSON(t *testing.T) {\n\tmockT := new(testing.T)\n\tFalse(t, JSONEq(mockT, \"Not JSON\", \"Not JSON\"))\n}\n\nfunc TestJSONEq_ArraysOfDifferentOrder(t *testing.T) {\n\tmockT := new(testing.T)\n\tFalse(t, JSONEq(mockT, `[\"foo\", {\"hello\": \"world\", \"nested\": \"hash\"}]`, `[{ \"hello\": \"world\", \"nested\": \"hash\"}, \"foo\"]`))\n}\n\ntype diffTestingStruct struct {\n\tA string\n\tB int\n}\n\nfunc (d *diffTestingStruct) String() string {\n\treturn d.A\n}\n\nfunc TestDiff(t *testing.T) {\n\texpected := `\n\nDiff:\n--- Expected\n+++ Actual\n@@ -1,3 +1,3 @@\n (struct { foo string }) {\n- foo: (string) (len=5) \"hello\"\n+ foo: (string) (len=3) \"bar\"\n }\n`\n\tactual := diff(\n\t\tstruct{ foo string }{\"hello\"},\n\t\tstruct{ foo string }{\"bar\"},\n\t)\n\tEqual(t, expected, actual)\n\n\texpected = `\n\nDiff:\n--- Expected\n+++ Actual\n@@ -2,5 +2,5 @@\n  (int) 1,\n- (int) 2,\n  (int) 3,\n- (int) 4\n+ (int) 5,\n+ (int) 7\n }\n`\n\tactual = diff(\n\t\t[]int{1, 2, 3, 4},\n\t\t[]int{1, 3, 5, 7},\n\t)\n\tEqual(t, expected, actual)\n\n\texpected = `\n\nDiff:\n--- Expected\n+++ Actual\n@@ -2,4 +2,4 @@\n  (int) 1,\n- (int) 2,\n- (int) 3\n+ (int) 3,\n+ (int) 5\n }\n`\n\tactual = diff(\n\t\t[]int{1, 2, 3, 4}[0:3],\n\t\t[]int{1, 3, 5, 7}[0:3],\n\t)\n\tEqual(t, expected, actual)\n\n\texpected = `\n\nDiff:\n--- Expected\n+++ Actual\n@@ -1,6 +1,6 @@\n (map[string]int) (len=4) {\n- (string) (len=4) \"four\": (int) 4,\n+ (string) (len=4) \"five\": (int) 5,\n  (string) (len=3) \"one\": (int) 1,\n- (string) (len=5) \"three\": (int) 3,\n- (string) (len=3) \"two\": (int) 2\n+ (string) (len=5) \"seven\": (int) 7,\n+ (string) (len=5) \"three\": (int) 3\n }\n`\n\n\tactual = diff(\n\t\tmap[string]int{\"one\": 1, \"two\": 2, \"three\": 3, \"four\": 4},\n\t\tmap[string]int{\"one\": 1, \"three\": 3, \"five\": 5, \"seven\": 7},\n\t)\n\tEqual(t, expected, actual)\n\n\texpected = `\n\nDiff:\n--- Expected\n+++ Actual\n@@ -1,3 +1,3 @@\n (*errors.errorString)({\n- s: (string) (len=19) \"some expected error\"\n+ s: (string) (len=12) \"actual error\"\n })\n`\n\n\tactual = diff(\n\t\terrors.New(\"some expected error\"),\n\t\terrors.New(\"actual error\"),\n\t)\n\tEqual(t, expected, actual)\n\n\texpected = `\n\nDiff:\n--- Expected\n+++ Actual\n@@ -2,3 +2,3 @@\n  A: (string) (len=11) \"some string\",\n- B: (int) 10\n+ B: (int) 15\n }\n`\n\n\tactual = diff(\n\t\tdiffTestingStruct{A: \"some string\", B: 10},\n\t\tdiffTestingStruct{A: \"some string\", B: 15},\n\t)\n\tEqual(t, expected, actual)\n\n\texpected = `\n\nDiff:\n--- Expected\n+++ Actual\n@@ -1,2 +1,2 @@\n-(time.Time) 2020-09-24 00:00:00 +0000 UTC\n+(time.Time) 2020-09-25 00:00:00 +0000 UTC\n \n`\n\n\tactual = diff(\n\t\ttime.Date(2020, 9, 24, 0, 0, 0, 0, time.UTC),\n\t\ttime.Date(2020, 9, 25, 0, 0, 0, 0, time.UTC),\n\t)\n\tEqual(t, expected, actual)\n}\n\nfunc TestTimeEqualityErrorFormatting(t *testing.T) {\n\tmockT := new(mockTestingT)\n\n\tEqual(mockT, time.Second*2, time.Millisecond)\n\n\texpectedErr := \"\\\\s+Error Trace:\\\\s+Error:\\\\s+Not equal:\\\\s+\\n\\\\s+expected: 2s\\n\\\\s+actual\\\\s+: 1ms\\n\"\n\tRegexp(t, regexp.MustCompile(expectedErr), mockT.errorString())\n}\n\nfunc TestDiffEmptyCases(t *testing.T) {\n\tEqual(t, \"\", diff(nil, nil))\n\tEqual(t, \"\", diff(struct{ foo string }{}, nil))\n\tEqual(t, \"\", diff(nil, struct{ foo string }{}))\n\tEqual(t, \"\", diff(1, 2))\n\tEqual(t, \"\", diff(1, 2))\n\tEqual(t, \"\", diff([]int{1}, []bool{true}))\n}\n\n// Ensure there are no data races\nfunc TestDiffRace(t *testing.T) {\n\tt.Parallel()\n\n\texpected := map[string]string{\n\t\t\"a\": \"A\",\n\t\t\"b\": \"B\",\n\t\t\"c\": \"C\",\n\t}\n\n\tactual := map[string]string{\n\t\t\"d\": \"D\",\n\t\t\"e\": \"E\",\n\t\t\"f\": \"F\",\n\t}\n\n\t// run diffs in parallel simulating tests with t.Parallel()\n\tnumRoutines := 10\n\trChans := make([]chan string, numRoutines)\n\tfor idx := range rChans {\n\t\trChans[idx] = make(chan string)\n\t\tgo func(ch chan string) {\n\t\t\tdefer close(ch)\n\t\t\tch <- diff(expected, actual)\n\t\t}(rChans[idx])\n\t}\n\n\tfor _, ch := range rChans {\n\t\tfor msg := range ch {\n\t\t\tNotZero(t, msg) // dummy assert\n\t\t}\n\t}\n}\n\ntype mockTestingT struct {\n\terrorFmt string\n\targs     []interface{}\n}\n\nfunc (m *mockTestingT) errorString() string {\n\treturn fmt.Sprintf(m.errorFmt, m.args...)\n}\n\nfunc (m *mockTestingT) Errorf(format string, args ...interface{}) {\n\tm.errorFmt = format\n\tm.args = args\n}\n\nfunc (m *mockTestingT) Failed() bool {\n\treturn m.errorFmt != \"\"\n}\n\nfunc TestFailNowWithPlainTestingT(t *testing.T) {\n\tmockT := &mockTestingT{}\n\n\tPanics(t, func() {\n\t\tFailNow(mockT, \"failed\")\n\t}, \"should panic since mockT is missing FailNow()\")\n}\n\ntype mockFailNowTestingT struct {\n}\n\nfunc (m *mockFailNowTestingT) Errorf(format string, args ...interface{}) {}\n\nfunc (m *mockFailNowTestingT) FailNow() {}\n\nfunc TestFailNowWithFullTestingT(t *testing.T) {\n\tmockT := &mockFailNowTestingT{}\n\n\tNotPanics(t, func() {\n\t\tFailNow(mockT, \"failed\")\n\t}, \"should call mockT.FailNow() rather than panicking\")\n}\n\nfunc TestBytesEqual(t *testing.T) {\n\tvar cases = []struct {\n\t\ta, b []byte\n\t}{\n\t\t{make([]byte, 2), make([]byte, 2)},\n\t\t{make([]byte, 2), make([]byte, 2, 3)},\n\t\t{nil, make([]byte, 0)},\n\t}\n\tfor i, c := range cases {\n\t\tEqual(t, reflect.DeepEqual(c.a, c.b), ObjectsAreEqual(c.a, c.b), \"case %d failed\", i+1)\n\t}\n}\n\nfunc BenchmarkBytesEqual(b *testing.B) {\n\tconst size = 1024 * 8\n\ts := make([]byte, size)\n\tfor i := range s {\n\t\ts[i] = byte(i % 255)\n\t}\n\ts2 := make([]byte, size)\n\tcopy(s2, s)\n\n\tmockT := &mockFailNowTestingT{}\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tEqual(mockT, s, s2)\n\t}\n}\n\nfunc BenchmarkNotNil(b *testing.B) {\n\tfor i := 0; i < b.N; i++ {\n\t\tNotNil(b, b)\n\t}\n}\n\nfunc ExampleComparisonAssertionFunc() {\n\tt := &testing.T{} // provided by test\n\n\tadder := func(x, y int) int {\n\t\treturn x + y\n\t}\n\n\ttype args struct {\n\t\tx int\n\t\ty int\n\t}\n\n\ttests := []struct {\n\t\tname      string\n\t\targs      args\n\t\texpect    int\n\t\tassertion ComparisonAssertionFunc\n\t}{\n\t\t{\"2+2=4\", args{2, 2}, 4, Equal},\n\t\t{\"2+2!=5\", args{2, 2}, 5, NotEqual},\n\t\t{\"2+3==5\", args{2, 3}, 5, Exactly},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, tt.expect, adder(tt.args.x, tt.args.y))\n\t\t})\n\t}\n}\n\nfunc TestComparisonAssertionFunc(t *testing.T) {\n\ttype iface interface {\n\t\tName() string\n\t}\n\n\ttests := []struct {\n\t\tname      string\n\t\texpect    interface{}\n\t\tgot       interface{}\n\t\tassertion ComparisonAssertionFunc\n\t}{\n\t\t{\"implements\", (*iface)(nil), t, Implements},\n\t\t{\"isType\", (*testing.T)(nil), t, IsType},\n\t\t{\"equal\", t, t, Equal},\n\t\t{\"equalValues\", t, t, EqualValues},\n\t\t{\"notEqualValues\", t, nil, NotEqualValues},\n\t\t{\"exactly\", t, t, Exactly},\n\t\t{\"notEqual\", t, nil, NotEqual},\n\t\t{\"notContains\", []int{1, 2, 3}, 4, NotContains},\n\t\t{\"subset\", []int{1, 2, 3, 4}, []int{2, 3}, Subset},\n\t\t{\"notSubset\", []int{1, 2, 3, 4}, []int{0, 3}, NotSubset},\n\t\t{\"elementsMatch\", []byte(\"abc\"), []byte(\"bac\"), ElementsMatch},\n\t\t{\"regexp\", \"^t.*y$\", \"testify\", Regexp},\n\t\t{\"notRegexp\", \"^t.*y$\", \"Testify\", NotRegexp},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, tt.expect, tt.got)\n\t\t})\n\t}\n}\n\nfunc ExampleValueAssertionFunc() {\n\tt := &testing.T{} // provided by test\n\n\tdumbParse := func(input string) interface{} {\n\t\tvar x interface{}\n\t\t_ = json.Unmarshal([]byte(input), &x)\n\t\treturn x\n\t}\n\n\ttests := []struct {\n\t\tname      string\n\t\targ       string\n\t\tassertion ValueAssertionFunc\n\t}{\n\t\t{\"true is not nil\", \"true\", NotNil},\n\t\t{\"empty string is nil\", \"\", Nil},\n\t\t{\"zero is not nil\", \"0\", NotNil},\n\t\t{\"zero is zero\", \"0\", Zero},\n\t\t{\"false is zero\", \"false\", Zero},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, dumbParse(tt.arg))\n\t\t})\n\t}\n}\n\nfunc TestValueAssertionFunc(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tvalue     interface{}\n\t\tassertion ValueAssertionFunc\n\t}{\n\t\t{\"notNil\", true, NotNil},\n\t\t{\"nil\", nil, Nil},\n\t\t{\"empty\", []int{}, Empty},\n\t\t{\"notEmpty\", []int{1}, NotEmpty},\n\t\t{\"zero\", false, Zero},\n\t\t{\"notZero\", 42, NotZero},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, tt.value)\n\t\t})\n\t}\n}\n\nfunc ExampleBoolAssertionFunc() {\n\tt := &testing.T{} // provided by test\n\n\tisOkay := func(x int) bool {\n\t\treturn x >= 42\n\t}\n\n\ttests := []struct {\n\t\tname      string\n\t\targ       int\n\t\tassertion BoolAssertionFunc\n\t}{\n\t\t{\"-1 is bad\", -1, False},\n\t\t{\"42 is good\", 42, True},\n\t\t{\"41 is bad\", 41, False},\n\t\t{\"45 is cool\", 45, True},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, isOkay(tt.arg))\n\t\t})\n\t}\n}\n\nfunc TestBoolAssertionFunc(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tvalue     bool\n\t\tassertion BoolAssertionFunc\n\t}{\n\t\t{\"true\", true, True},\n\t\t{\"false\", false, False},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, tt.value)\n\t\t})\n\t}\n}\n\nfunc ExampleErrorAssertionFunc() {\n\tt := &testing.T{} // provided by test\n\n\tdumbParseNum := func(input string, v interface{}) error {\n\t\treturn json.Unmarshal([]byte(input), v)\n\t}\n\n\ttests := []struct {\n\t\tname      string\n\t\targ       string\n\t\tassertion ErrorAssertionFunc\n\t}{\n\t\t{\"1.2 is number\", \"1.2\", NoError},\n\t\t{\"1.2.3 not number\", \"1.2.3\", Error},\n\t\t{\"true is not number\", \"true\", Error},\n\t\t{\"3 is number\", \"3\", NoError},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tvar x float64\n\t\t\ttt.assertion(t, dumbParseNum(tt.arg, &x))\n\t\t})\n\t}\n}\n\nfunc TestErrorAssertionFunc(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\terr       error\n\t\tassertion ErrorAssertionFunc\n\t}{\n\t\t{\"noError\", nil, NoError},\n\t\t{\"error\", errors.New(\"whoops\"), Error},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, tt.err)\n\t\t})\n\t}\n}\n\nfunc ExamplePanicAssertionFunc() {\n\tt := &testing.T{} // provided by test\n\n\ttests := []struct {\n\t\tname      string\n\t\tpanicFn   PanicTestFunc\n\t\tassertion PanicAssertionFunc\n\t}{\n\t\t{\"with panic\", func() { panic(nil) }, Panics},\n\t\t{\"without panic\", func() {}, NotPanics},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, tt.panicFn)\n\t\t})\n\t}\n}\n\nfunc TestPanicAssertionFunc(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tpanicFn   PanicTestFunc\n\t\tassertion PanicAssertionFunc\n\t}{\n\t\t{\"not panic\", func() {}, NotPanics},\n\t\t{\"panic\", func() { panic(nil) }, Panics},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, tt.panicFn)\n\t\t})\n\t}\n}\n\nfunc TestEventuallyFalse(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tcondition := func() bool {\n\t\treturn false\n\t}\n\n\tFalse(t, Eventually(mockT, condition, 100*time.Millisecond, 20*time.Millisecond))\n}\n\nfunc TestEventuallyTrue(t *testing.T) {\n\tstate := 0\n\tcondition := func() bool {\n\t\tdefer func() {\n\t\t\tstate += 1\n\t\t}()\n\t\treturn state == 2\n\t}\n\n\tTrue(t, Eventually(t, condition, 100*time.Millisecond, 20*time.Millisecond))\n}\n\n// errorsCapturingT is a mock implementation of TestingT that captures errors reported with Errorf.\ntype errorsCapturingT struct {\n\terrors []error\n}\n\nfunc (t *errorsCapturingT) Errorf(format string, args ...interface{}) {\n\tt.errors = append(t.errors, fmt.Errorf(format, args...))\n}\n\nfunc (t *errorsCapturingT) Helper() {}\n\nfunc TestEventuallyWithTFalse(t *testing.T) {\n\tmockT := new(errorsCapturingT)\n\n\tcondition := func(collect *CollectT) {\n\t\tFail(collect, \"condition fixed failure\")\n\t}\n\n\tFalse(t, EventuallyWithT(mockT, condition, 100*time.Millisecond, 20*time.Millisecond))\n\tLen(t, mockT.errors, 2)\n}\n\nfunc TestEventuallyWithTTrue(t *testing.T) {\n\tmockT := new(errorsCapturingT)\n\n\tstate := 0\n\tcondition := func(collect *CollectT) {\n\t\tdefer func() {\n\t\t\tstate += 1\n\t\t}()\n\t\tTrue(collect, state == 2)\n\t}\n\n\tTrue(t, EventuallyWithT(mockT, condition, 100*time.Millisecond, 20*time.Millisecond))\n\tLen(t, mockT.errors, 0)\n}\n\nfunc TestEventuallyWithT_ConcurrencySafe(t *testing.T) {\n\tmockT := new(errorsCapturingT)\n\n\tcondition := func(collect *CollectT) {\n\t\tFail(collect, \"condition fixed failure\")\n\t}\n\n\t// To trigger race conditions, we run EventuallyWithT with a nanosecond tick.\n\tFalse(t, EventuallyWithT(mockT, condition, 100*time.Millisecond, time.Nanosecond))\n\tLen(t, mockT.errors, 2)\n}\n\nfunc TestEventuallyWithT_ReturnsTheLatestFinishedConditionErrors(t *testing.T) {\n\t// We'll use a channel to control whether a condition should sleep or not.\n\tmustSleep := make(chan bool, 2)\n\tmustSleep <- false\n\tmustSleep <- true\n\tclose(mustSleep)\n\n\tcondition := func(collect *CollectT) {\n\t\tif <-mustSleep {\n\t\t\t// Sleep to ensure that the second condition runs longer than timeout.\n\t\t\ttime.Sleep(time.Second)\n\t\t\treturn\n\t\t}\n\n\t\t// The first condition will fail. We expect to get this error as a result.\n\t\tFail(collect, \"condition fixed failure\")\n\t}\n\n\tmockT := new(errorsCapturingT)\n\tFalse(t, EventuallyWithT(mockT, condition, 100*time.Millisecond, 20*time.Millisecond))\n\tLen(t, mockT.errors, 2)\n}\n\nfunc TestNeverFalse(t *testing.T) {\n\tcondition := func() bool {\n\t\treturn false\n\t}\n\n\tTrue(t, Never(t, condition, 100*time.Millisecond, 20*time.Millisecond))\n}\n\n// TestNeverTrue checks Never with a condition that returns true on second call.\nfunc TestNeverTrue(t *testing.T) {\n\tmockT := new(testing.T)\n\n\t// A list of values returned by condition.\n\t// Channel protects against concurrent access.\n\treturns := make(chan bool, 2)\n\treturns <- false\n\treturns <- true\n\tdefer close(returns)\n\n\t// Will return true on second call.\n\tcondition := func() bool {\n\t\treturn <-returns\n\t}\n\n\tFalse(t, Never(mockT, condition, 100*time.Millisecond, 20*time.Millisecond))\n}\n\n// Check that a long running condition doesn't block Eventually.\n// See issue 805 (and its long tail of following issues)\nfunc TestEventuallyTimeout(t *testing.T) {\n\tmockT := new(testing.T)\n\n\tNotPanics(t, func() {\n\t\tdone, done2 := make(chan struct{}), make(chan struct{})\n\n\t\t// A condition function that returns after the Eventually timeout\n\t\tcondition := func() bool {\n\t\t\t// Wait until Eventually times out and terminates\n\t\t\t<-done\n\t\t\tclose(done2)\n\t\t\treturn true\n\t\t}\n\n\t\tFalse(t, Eventually(mockT, condition, time.Millisecond, time.Microsecond))\n\n\t\tclose(done)\n\t\t<-done2\n\t})\n}\n\nfunc Test_validateEqualArgs(t *testing.T) {\n\tif validateEqualArgs(func() {}, func() {}) == nil {\n\t\tt.Error(\"non-nil functions should error\")\n\t}\n\n\tif validateEqualArgs(func() {}, func() {}) == nil {\n\t\tt.Error(\"non-nil functions should error\")\n\t}\n\n\tif validateEqualArgs(nil, nil) != nil {\n\t\tt.Error(\"nil functions are equal\")\n\t}\n}\n\nfunc Test_truncatingFormat(t *testing.T) {\n\n\toriginal := strings.Repeat(\"a\", bufio.MaxScanTokenSize-102)\n\tresult := truncatingFormat(original)\n\tEqual(t, fmt.Sprintf(\"%#v\", original), result, \"string should not be truncated\")\n\n\toriginal = original + \"x\"\n\tresult = truncatingFormat(original)\n\tNotEqual(t, fmt.Sprintf(\"%#v\", original), result, \"string should have been truncated.\")\n\n\tif !strings.HasSuffix(result, \"<... truncated>\") {\n\t\tt.Error(\"truncated string should have <... truncated> suffix\")\n\t}\n}\n\n// parseLabeledOutput does the inverse of labeledOutput - it takes a formatted\n// output string and turns it back into a slice of labeledContent.\nfunc parseLabeledOutput(output string) []labeledContent {\n\tlabelPattern := regexp.MustCompile(`^\\t([^\\t]*): *\\t(.*)$`)\n\tcontentPattern := regexp.MustCompile(`^\\t *\\t(.*)$`)\n\tvar contents []labeledContent\n\tlines := strings.Split(output, \"\\n\")\n\ti := -1\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\t// skip blank lines\n\t\t\tcontinue\n\t\t}\n\t\tmatches := labelPattern.FindStringSubmatch(line)\n\t\tif len(matches) == 3 {\n\t\t\t// a label\n\t\t\tcontents = append(contents, labeledContent{\n\t\t\t\tlabel:   matches[1],\n\t\t\t\tcontent: matches[2] + \"\\n\",\n\t\t\t})\n\t\t\ti++\n\t\t\tcontinue\n\t\t}\n\t\tmatches = contentPattern.FindStringSubmatch(line)\n\t\tif len(matches) == 2 {\n\t\t\t// just content\n\t\t\tif i >= 0 {\n\t\t\t\tcontents[i].content += matches[1] + \"\\n\"\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\t// Couldn't parse output\n\t\treturn nil\n\t}\n\treturn contents\n}\n\ntype captureTestingT struct {\n\tmsg string\n}\n\nfunc (ctt *captureTestingT) Errorf(format string, args ...interface{}) {\n\tctt.msg = fmt.Sprintf(format, args...)\n}\n\nfunc (ctt *captureTestingT) checkResultAndErrMsg(t *testing.T, expectedRes, res bool, expectedErrMsg string) {\n\tt.Helper()\n\tif res != expectedRes {\n\t\tt.Errorf(\"Should return %t\", expectedRes)\n\t\treturn\n\t}\n\tcontents := parseLabeledOutput(ctt.msg)\n\tif res == true {\n\t\tif contents != nil {\n\t\t\tt.Errorf(\"Should not log an error\")\n\t\t}\n\t\treturn\n\t}\n\tif contents == nil {\n\t\tt.Errorf(\"Should log an error. Log output: %v\", ctt.msg)\n\t\treturn\n\t}\n\tfor _, content := range contents {\n\t\tif content.label == \"Error\" {\n\t\t\tif expectedErrMsg == content.content {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tt.Errorf(\"Logged Error: %v\", content.content)\n\t\t}\n\t}\n\tt.Errorf(\"Should log Error: %v\", expectedErrMsg)\n}\n\nfunc TestErrorIs(t *testing.T) {\n\ttests := []struct {\n\t\terr          error\n\t\ttarget       error\n\t\tresult       bool\n\t\tresultErrMsg string\n\t}{\n\t\t{\n\t\t\terr:    io.EOF,\n\t\t\ttarget: io.EOF,\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\terr:    fmt.Errorf(\"wrap: %w\", io.EOF),\n\t\t\ttarget: io.EOF,\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\terr:    io.EOF,\n\t\t\ttarget: io.ErrClosedPipe,\n\t\t\tresult: false,\n\t\t\tresultErrMsg: \"\" +\n\t\t\t\t\"Target error should be in err chain:\\n\" +\n\t\t\t\t\"expected: \\\"io: read/write on closed pipe\\\"\\n\" +\n\t\t\t\t\"in chain: \\\"EOF\\\"\\n\",\n\t\t},\n\t\t{\n\t\t\terr:    nil,\n\t\t\ttarget: io.EOF,\n\t\t\tresult: false,\n\t\t\tresultErrMsg: \"\" +\n\t\t\t\t\"Target error should be in err chain:\\n\" +\n\t\t\t\t\"expected: \\\"EOF\\\"\\n\" +\n\t\t\t\t\"in chain: \\n\",\n\t\t},\n\t\t{\n\t\t\terr:    io.EOF,\n\t\t\ttarget: nil,\n\t\t\tresult: false,\n\t\t\tresultErrMsg: \"\" +\n\t\t\t\t\"Target error should be in err chain:\\n\" +\n\t\t\t\t\"expected: \\\"\\\"\\n\" +\n\t\t\t\t\"in chain: \\\"EOF\\\"\\n\",\n\t\t},\n\t\t{\n\t\t\terr:    nil,\n\t\t\ttarget: nil,\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\terr:    fmt.Errorf(\"abc: %w\", errors.New(\"def\")),\n\t\t\ttarget: io.EOF,\n\t\t\tresult: false,\n\t\t\tresultErrMsg: \"\" +\n\t\t\t\t\"Target error should be in err chain:\\n\" +\n\t\t\t\t\"expected: \\\"EOF\\\"\\n\" +\n\t\t\t\t\"in chain: \\\"abc: def\\\"\\n\" +\n\t\t\t\t\"\\t\\\"def\\\"\\n\",\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\ttt := tt\n\t\tt.Run(fmt.Sprintf(\"ErrorIs(%#v,%#v)\", tt.err, tt.target), func(t *testing.T) {\n\t\t\tmockT := new(captureTestingT)\n\t\t\tres := ErrorIs(mockT, tt.err, tt.target)\n\t\t\tmockT.checkResultAndErrMsg(t, tt.result, res, tt.resultErrMsg)\n\t\t})\n\t}\n}\n\nfunc TestNotErrorIs(t *testing.T) {\n\ttests := []struct {\n\t\terr          error\n\t\ttarget       error\n\t\tresult       bool\n\t\tresultErrMsg string\n\t}{\n\t\t{\n\t\t\terr:    io.EOF,\n\t\t\ttarget: io.EOF,\n\t\t\tresult: false,\n\t\t\tresultErrMsg: \"\" +\n\t\t\t\t\"Target error should not be in err chain:\\n\" +\n\t\t\t\t\"found: \\\"EOF\\\"\\n\" +\n\t\t\t\t\"in chain: \\\"EOF\\\"\\n\",\n\t\t},\n\t\t{\n\t\t\terr:    fmt.Errorf(\"wrap: %w\", io.EOF),\n\t\t\ttarget: io.EOF,\n\t\t\tresult: false,\n\t\t\tresultErrMsg: \"\" +\n\t\t\t\t\"Target error should not be in err chain:\\n\" +\n\t\t\t\t\"found: \\\"EOF\\\"\\n\" +\n\t\t\t\t\"in chain: \\\"wrap: EOF\\\"\\n\" +\n\t\t\t\t\"\\t\\\"EOF\\\"\\n\",\n\t\t},\n\t\t{\n\t\t\terr:    io.EOF,\n\t\t\ttarget: io.ErrClosedPipe,\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\terr:    nil,\n\t\t\ttarget: io.EOF,\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\terr:    io.EOF,\n\t\t\ttarget: nil,\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\terr:    nil,\n\t\t\ttarget: nil,\n\t\t\tresult: false,\n\t\t\tresultErrMsg: \"\" +\n\t\t\t\t\"Target error should not be in err chain:\\n\" +\n\t\t\t\t\"found: \\\"\\\"\\n\" +\n\t\t\t\t\"in chain: \\n\",\n\t\t},\n\t\t{\n\t\t\terr:    fmt.Errorf(\"abc: %w\", errors.New(\"def\")),\n\t\t\ttarget: io.EOF,\n\t\t\tresult: true,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\ttt := tt\n\t\tt.Run(fmt.Sprintf(\"NotErrorIs(%#v,%#v)\", tt.err, tt.target), func(t *testing.T) {\n\t\t\tmockT := new(captureTestingT)\n\t\t\tres := NotErrorIs(mockT, tt.err, tt.target)\n\t\t\tmockT.checkResultAndErrMsg(t, tt.result, res, tt.resultErrMsg)\n\t\t})\n\t}\n}\n\nfunc TestErrorAs(t *testing.T) {\n\tmockT := new(testing.T)\n\ttests := []struct {\n\t\terr    error\n\t\tresult bool\n\t}{\n\t\t{fmt.Errorf(\"wrap: %w\", &customError{}), true},\n\t\t{io.EOF, false},\n\t\t{nil, false},\n\t}\n\tfor _, tt := range tests {\n\t\ttt := tt\n\t\tvar target *customError\n\t\tt.Run(fmt.Sprintf(\"ErrorAs(%#v,%#v)\", tt.err, target), func(t *testing.T) {\n\t\t\tres := ErrorAs(mockT, tt.err, &target)\n\t\t\tif res != tt.result {\n\t\t\t\tt.Errorf(\"ErrorAs(%#v,%#v) should return %t)\", tt.err, target, tt.result)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "internal/testify/assert/doc.go",
    "content": "// Package assert provides a set of comprehensive testing tools for use with the normal Go testing system.\n//\n// # Example Usage\n//\n// The following is a complete example using assert in a standard test function:\n//\n//\timport (\n//\t  \"testing\"\n//\t  \"github.com/expr-lang/expr/internal/testify/assert\"\n//\t)\n//\n//\tfunc TestSomething(t *testing.T) {\n//\n//\t  var a string = \"Hello\"\n//\t  var b string = \"Hello\"\n//\n//\t  assert.Equal(t, a, b, \"The two words should be the same.\")\n//\n//\t}\n//\n// if you assert many times, use the format below:\n//\n//\timport (\n//\t  \"testing\"\n//\t  \"github.com/expr-lang/expr/internal/testify/assert\"\n//\t)\n//\n//\tfunc TestSomething(t *testing.T) {\n//\t  assert := assert.New(t)\n//\n//\t  var a string = \"Hello\"\n//\t  var b string = \"Hello\"\n//\n//\t  assert.Equal(a, b, \"The two words should be the same.\")\n//\t}\n//\n// # Assertions\n//\n// Assertions allow you to easily write test code, and are global funcs in the `assert` package.\n// All assertion functions take, as the first argument, the `*testing.T` object provided by the\n// testing framework. This allows the assertion funcs to write the failings and other details to\n// the correct place.\n//\n// Every assertion function also takes an optional string message as the final argument,\n// allowing custom error messages to be appended to the message the assertion method outputs.\npackage assert\n"
  },
  {
    "path": "internal/testify/assert/errors.go",
    "content": "package assert\n\nimport (\n\t\"errors\"\n)\n\n// AnError is an error instance useful for testing.  If the code does not care\n// about error specifics, and only needs to return the error for example, this\n// error should be used to make the test code more readable.\nvar AnError = errors.New(\"assert.AnError general error for testing\")\n"
  },
  {
    "path": "internal/testify/assert/forward_assertions.go",
    "content": "package assert\n\n// Assertions provides assertion methods around the\n// TestingT interface.\ntype Assertions struct {\n\tt TestingT\n}\n\n// New makes a new Assertions object for the specified TestingT.\nfunc New(t TestingT) *Assertions {\n\treturn &Assertions{\n\t\tt: t,\n\t}\n}\n\n//go:generate sh -c \"cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs\"\n"
  },
  {
    "path": "internal/testify/assert/forward_assertions_test.go",
    "content": "package assert\n\nimport (\n\t\"errors\"\n\t\"regexp\"\n\t\"testing\"\n\t\"time\"\n)\n\nfunc TestImplementsWrapper(t *testing.T) {\n\tassert := New(new(testing.T))\n\n\tif !assert.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) {\n\t\tt.Error(\"Implements method should return true: AssertionTesterConformingObject implements AssertionTesterInterface\")\n\t}\n\tif assert.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) {\n\t\tt.Error(\"Implements method should return false: AssertionTesterNonConformingObject does not implements AssertionTesterInterface\")\n\t}\n}\n\nfunc TestIsTypeWrapper(t *testing.T) {\n\tassert := New(new(testing.T))\n\n\tif !assert.IsType(new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) {\n\t\tt.Error(\"IsType should return true: AssertionTesterConformingObject is the same type as AssertionTesterConformingObject\")\n\t}\n\tif assert.IsType(new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) {\n\t\tt.Error(\"IsType should return false: AssertionTesterConformingObject is not the same type as AssertionTesterNonConformingObject\")\n\t}\n\n}\n\nfunc TestEqualWrapper(t *testing.T) {\n\tassert := New(new(testing.T))\n\n\tif !assert.Equal(\"Hello World\", \"Hello World\") {\n\t\tt.Error(\"Equal should return true\")\n\t}\n\tif !assert.Equal(123, 123) {\n\t\tt.Error(\"Equal should return true\")\n\t}\n\tif !assert.Equal(123.5, 123.5) {\n\t\tt.Error(\"Equal should return true\")\n\t}\n\tif !assert.Equal([]byte(\"Hello World\"), []byte(\"Hello World\")) {\n\t\tt.Error(\"Equal should return true\")\n\t}\n\tif !assert.Equal(nil, nil) {\n\t\tt.Error(\"Equal should return true\")\n\t}\n}\n\nfunc TestEqualValuesWrapper(t *testing.T) {\n\tassert := New(new(testing.T))\n\n\tif !assert.EqualValues(uint32(10), int32(10)) {\n\t\tt.Error(\"EqualValues should return true\")\n\t}\n}\n\nfunc TestNotNilWrapper(t *testing.T) {\n\tassert := New(new(testing.T))\n\n\tif !assert.NotNil(new(AssertionTesterConformingObject)) {\n\t\tt.Error(\"NotNil should return true: object is not nil\")\n\t}\n\tif assert.NotNil(nil) {\n\t\tt.Error(\"NotNil should return false: object is nil\")\n\t}\n\n}\n\nfunc TestNilWrapper(t *testing.T) {\n\tassert := New(new(testing.T))\n\n\tif !assert.Nil(nil) {\n\t\tt.Error(\"Nil should return true: object is nil\")\n\t}\n\tif assert.Nil(new(AssertionTesterConformingObject)) {\n\t\tt.Error(\"Nil should return false: object is not nil\")\n\t}\n\n}\n\nfunc TestTrueWrapper(t *testing.T) {\n\tassert := New(new(testing.T))\n\n\tif !assert.True(true) {\n\t\tt.Error(\"True should return true\")\n\t}\n\tif assert.True(false) {\n\t\tt.Error(\"True should return false\")\n\t}\n\n}\n\nfunc TestFalseWrapper(t *testing.T) {\n\tassert := New(new(testing.T))\n\n\tif !assert.False(false) {\n\t\tt.Error(\"False should return true\")\n\t}\n\tif assert.False(true) {\n\t\tt.Error(\"False should return false\")\n\t}\n\n}\n\nfunc TestExactlyWrapper(t *testing.T) {\n\tassert := New(new(testing.T))\n\n\ta := float32(1)\n\tb := float64(1)\n\tc := float32(1)\n\td := float32(2)\n\n\tif assert.Exactly(a, b) {\n\t\tt.Error(\"Exactly should return false\")\n\t}\n\tif assert.Exactly(a, d) {\n\t\tt.Error(\"Exactly should return false\")\n\t}\n\tif !assert.Exactly(a, c) {\n\t\tt.Error(\"Exactly should return true\")\n\t}\n\n\tif assert.Exactly(nil, a) {\n\t\tt.Error(\"Exactly should return false\")\n\t}\n\tif assert.Exactly(a, nil) {\n\t\tt.Error(\"Exactly should return false\")\n\t}\n\n}\n\nfunc TestNotEqualWrapper(t *testing.T) {\n\n\tassert := New(new(testing.T))\n\n\tif !assert.NotEqual(\"Hello World\", \"Hello World!\") {\n\t\tt.Error(\"NotEqual should return true\")\n\t}\n\tif !assert.NotEqual(123, 1234) {\n\t\tt.Error(\"NotEqual should return true\")\n\t}\n\tif !assert.NotEqual(123.5, 123.55) {\n\t\tt.Error(\"NotEqual should return true\")\n\t}\n\tif !assert.NotEqual([]byte(\"Hello World\"), []byte(\"Hello World!\")) {\n\t\tt.Error(\"NotEqual should return true\")\n\t}\n\tif !assert.NotEqual(nil, new(AssertionTesterConformingObject)) {\n\t\tt.Error(\"NotEqual should return true\")\n\t}\n}\n\nfunc TestNotEqualValuesWrapper(t *testing.T) {\n\n\tassert := New(new(testing.T))\n\n\tif !assert.NotEqualValues(\"Hello World\", \"Hello World!\") {\n\t\tt.Error(\"NotEqualValues should return true\")\n\t}\n\tif !assert.NotEqualValues(123, 1234) {\n\t\tt.Error(\"NotEqualValues should return true\")\n\t}\n\tif !assert.NotEqualValues(123.5, 123.55) {\n\t\tt.Error(\"NotEqualValues should return true\")\n\t}\n\tif !assert.NotEqualValues([]byte(\"Hello World\"), []byte(\"Hello World!\")) {\n\t\tt.Error(\"NotEqualValues should return true\")\n\t}\n\tif !assert.NotEqualValues(nil, new(AssertionTesterConformingObject)) {\n\t\tt.Error(\"NotEqualValues should return true\")\n\t}\n\tif assert.NotEqualValues(10, uint(10)) {\n\t\tt.Error(\"NotEqualValues should return false\")\n\t}\n}\n\nfunc TestContainsWrapper(t *testing.T) {\n\n\tassert := New(new(testing.T))\n\tlist := []string{\"Foo\", \"Bar\"}\n\n\tif !assert.Contains(\"Hello World\", \"Hello\") {\n\t\tt.Error(\"Contains should return true: \\\"Hello World\\\" contains \\\"Hello\\\"\")\n\t}\n\tif assert.Contains(\"Hello World\", \"Salut\") {\n\t\tt.Error(\"Contains should return false: \\\"Hello World\\\" does not contain \\\"Salut\\\"\")\n\t}\n\n\tif !assert.Contains(list, \"Foo\") {\n\t\tt.Error(\"Contains should return true: \\\"[\\\"Foo\\\", \\\"Bar\\\"]\\\" contains \\\"Foo\\\"\")\n\t}\n\tif assert.Contains(list, \"Salut\") {\n\t\tt.Error(\"Contains should return false: \\\"[\\\"Foo\\\", \\\"Bar\\\"]\\\" does not contain \\\"Salut\\\"\")\n\t}\n\n}\n\nfunc TestNotContainsWrapper(t *testing.T) {\n\n\tassert := New(new(testing.T))\n\tlist := []string{\"Foo\", \"Bar\"}\n\n\tif !assert.NotContains(\"Hello World\", \"Hello!\") {\n\t\tt.Error(\"NotContains should return true: \\\"Hello World\\\" does not contain \\\"Hello!\\\"\")\n\t}\n\tif assert.NotContains(\"Hello World\", \"Hello\") {\n\t\tt.Error(\"NotContains should return false: \\\"Hello World\\\" contains \\\"Hello\\\"\")\n\t}\n\n\tif !assert.NotContains(list, \"Foo!\") {\n\t\tt.Error(\"NotContains should return true: \\\"[\\\"Foo\\\", \\\"Bar\\\"]\\\" does not contain \\\"Foo!\\\"\")\n\t}\n\tif assert.NotContains(list, \"Foo\") {\n\t\tt.Error(\"NotContains should return false: \\\"[\\\"Foo\\\", \\\"Bar\\\"]\\\" contains \\\"Foo\\\"\")\n\t}\n\n}\n\nfunc TestConditionWrapper(t *testing.T) {\n\n\tassert := New(new(testing.T))\n\n\tif !assert.Condition(func() bool { return true }, \"Truth\") {\n\t\tt.Error(\"Condition should return true\")\n\t}\n\n\tif assert.Condition(func() bool { return false }, \"Lie\") {\n\t\tt.Error(\"Condition should return false\")\n\t}\n\n}\n\nfunc TestDidPanicWrapper(t *testing.T) {\n\n\tif funcDidPanic, _, _ := didPanic(func() {\n\t\tpanic(\"Panic!\")\n\t}); !funcDidPanic {\n\t\tt.Error(\"didPanic should return true\")\n\t}\n\n\tif funcDidPanic, _, _ := didPanic(func() {\n\t}); funcDidPanic {\n\t\tt.Error(\"didPanic should return false\")\n\t}\n\n}\n\nfunc TestPanicsWrapper(t *testing.T) {\n\n\tassert := New(new(testing.T))\n\n\tif !assert.Panics(func() {\n\t\tpanic(\"Panic!\")\n\t}) {\n\t\tt.Error(\"Panics should return true\")\n\t}\n\n\tif assert.Panics(func() {\n\t}) {\n\t\tt.Error(\"Panics should return false\")\n\t}\n\n}\n\nfunc TestNotPanicsWrapper(t *testing.T) {\n\n\tassert := New(new(testing.T))\n\n\tif !assert.NotPanics(func() {\n\t}) {\n\t\tt.Error(\"NotPanics should return true\")\n\t}\n\n\tif assert.NotPanics(func() {\n\t\tpanic(\"Panic!\")\n\t}) {\n\t\tt.Error(\"NotPanics should return false\")\n\t}\n\n}\n\nfunc TestNoErrorWrapper(t *testing.T) {\n\tassert := New(t)\n\tmockAssert := New(new(testing.T))\n\n\t// start with a nil error\n\tvar err error\n\n\tassert.True(mockAssert.NoError(err), \"NoError should return True for nil arg\")\n\n\t// now set an error\n\terr = errors.New(\"Some error\")\n\n\tassert.False(mockAssert.NoError(err), \"NoError with error should return False\")\n\n}\n\nfunc TestErrorWrapper(t *testing.T) {\n\tassert := New(t)\n\tmockAssert := New(new(testing.T))\n\n\t// start with a nil error\n\tvar err error\n\n\tassert.False(mockAssert.Error(err), \"Error should return False for nil arg\")\n\n\t// now set an error\n\terr = errors.New(\"Some error\")\n\n\tassert.True(mockAssert.Error(err), \"Error with error should return True\")\n\n}\n\nfunc TestErrorContainsWrapper(t *testing.T) {\n\tassert := New(t)\n\tmockAssert := New(new(testing.T))\n\n\t// start with a nil error\n\tvar err error\n\tassert.False(mockAssert.ErrorContains(err, \"\"),\n\t\t\"ErrorContains should return false for nil arg\")\n\n\t// now set an error\n\terr = errors.New(\"some error: another error\")\n\tassert.False(mockAssert.ErrorContains(err, \"different error\"),\n\t\t\"ErrorContains should return false for different error string\")\n\tassert.True(mockAssert.ErrorContains(err, \"some error\"),\n\t\t\"ErrorContains should return true\")\n\tassert.True(mockAssert.ErrorContains(err, \"another error\"),\n\t\t\"ErrorContains should return true\")\n}\n\nfunc TestEqualErrorWrapper(t *testing.T) {\n\tassert := New(t)\n\tmockAssert := New(new(testing.T))\n\n\t// start with a nil error\n\tvar err error\n\tassert.False(mockAssert.EqualError(err, \"\"),\n\t\t\"EqualError should return false for nil arg\")\n\n\t// now set an error\n\terr = errors.New(\"some error\")\n\tassert.False(mockAssert.EqualError(err, \"Not some error\"),\n\t\t\"EqualError should return false for different error string\")\n\tassert.True(mockAssert.EqualError(err, \"some error\"),\n\t\t\"EqualError should return true\")\n}\n\nfunc TestEmptyWrapper(t *testing.T) {\n\tassert := New(t)\n\tmockAssert := New(new(testing.T))\n\n\tassert.True(mockAssert.Empty(\"\"), \"Empty string is empty\")\n\tassert.True(mockAssert.Empty(nil), \"Nil is empty\")\n\tassert.True(mockAssert.Empty([]string{}), \"Empty string array is empty\")\n\tassert.True(mockAssert.Empty(0), \"Zero int value is empty\")\n\tassert.True(mockAssert.Empty(false), \"False value is empty\")\n\n\tassert.False(mockAssert.Empty(\"something\"), \"Non Empty string is not empty\")\n\tassert.False(mockAssert.Empty(errors.New(\"something\")), \"Non nil object is not empty\")\n\tassert.False(mockAssert.Empty([]string{\"something\"}), \"Non empty string array is not empty\")\n\tassert.False(mockAssert.Empty(1), \"Non-zero int value is not empty\")\n\tassert.False(mockAssert.Empty(true), \"True value is not empty\")\n\n}\n\nfunc TestNotEmptyWrapper(t *testing.T) {\n\tassert := New(t)\n\tmockAssert := New(new(testing.T))\n\n\tassert.False(mockAssert.NotEmpty(\"\"), \"Empty string is empty\")\n\tassert.False(mockAssert.NotEmpty(nil), \"Nil is empty\")\n\tassert.False(mockAssert.NotEmpty([]string{}), \"Empty string array is empty\")\n\tassert.False(mockAssert.NotEmpty(0), \"Zero int value is empty\")\n\tassert.False(mockAssert.NotEmpty(false), \"False value is empty\")\n\n\tassert.True(mockAssert.NotEmpty(\"something\"), \"Non Empty string is not empty\")\n\tassert.True(mockAssert.NotEmpty(errors.New(\"something\")), \"Non nil object is not empty\")\n\tassert.True(mockAssert.NotEmpty([]string{\"something\"}), \"Non empty string array is not empty\")\n\tassert.True(mockAssert.NotEmpty(1), \"Non-zero int value is not empty\")\n\tassert.True(mockAssert.NotEmpty(true), \"True value is not empty\")\n\n}\n\nfunc TestLenWrapper(t *testing.T) {\n\tassert := New(t)\n\tmockAssert := New(new(testing.T))\n\n\tassert.False(mockAssert.Len(nil, 0), \"nil does not have length\")\n\tassert.False(mockAssert.Len(0, 0), \"int does not have length\")\n\tassert.False(mockAssert.Len(true, 0), \"true does not have length\")\n\tassert.False(mockAssert.Len(false, 0), \"false does not have length\")\n\tassert.False(mockAssert.Len('A', 0), \"Rune does not have length\")\n\tassert.False(mockAssert.Len(struct{}{}, 0), \"Struct does not have length\")\n\n\tch := make(chan int, 5)\n\tch <- 1\n\tch <- 2\n\tch <- 3\n\n\tcases := []struct {\n\t\tv interface{}\n\t\tl int\n\t}{\n\t\t{[]int{1, 2, 3}, 3},\n\t\t{[...]int{1, 2, 3}, 3},\n\t\t{\"ABC\", 3},\n\t\t{map[int]int{1: 2, 2: 4, 3: 6}, 3},\n\t\t{ch, 3},\n\n\t\t{[]int{}, 0},\n\t\t{map[int]int{}, 0},\n\t\t{make(chan int), 0},\n\n\t\t{[]int(nil), 0},\n\t\t{map[int]int(nil), 0},\n\t\t{(chan int)(nil), 0},\n\t}\n\n\tfor _, c := range cases {\n\t\tassert.True(mockAssert.Len(c.v, c.l), \"%#v have %d items\", c.v, c.l)\n\t}\n}\n\nfunc TestWithinDurationWrapper(t *testing.T) {\n\tassert := New(t)\n\tmockAssert := New(new(testing.T))\n\ta := time.Now()\n\tb := a.Add(10 * time.Second)\n\n\tassert.True(mockAssert.WithinDuration(a, b, 10*time.Second), \"A 10s difference is within a 10s time difference\")\n\tassert.True(mockAssert.WithinDuration(b, a, 10*time.Second), \"A 10s difference is within a 10s time difference\")\n\n\tassert.False(mockAssert.WithinDuration(a, b, 9*time.Second), \"A 10s difference is not within a 9s time difference\")\n\tassert.False(mockAssert.WithinDuration(b, a, 9*time.Second), \"A 10s difference is not within a 9s time difference\")\n\n\tassert.False(mockAssert.WithinDuration(a, b, -9*time.Second), \"A 10s difference is not within a 9s time difference\")\n\tassert.False(mockAssert.WithinDuration(b, a, -9*time.Second), \"A 10s difference is not within a 9s time difference\")\n\n\tassert.False(mockAssert.WithinDuration(a, b, -11*time.Second), \"A 10s difference is not within a 9s time difference\")\n\tassert.False(mockAssert.WithinDuration(b, a, -11*time.Second), \"A 10s difference is not within a 9s time difference\")\n}\n\nfunc TestInDeltaWrapper(t *testing.T) {\n\tassert := New(new(testing.T))\n\n\tTrue(t, assert.InDelta(1.001, 1, 0.01), \"|1.001 - 1| <= 0.01\")\n\tTrue(t, assert.InDelta(1, 1.001, 0.01), \"|1 - 1.001| <= 0.01\")\n\tTrue(t, assert.InDelta(1, 2, 1), \"|1 - 2| <= 1\")\n\tFalse(t, assert.InDelta(1, 2, 0.5), \"Expected |1 - 2| <= 0.5 to fail\")\n\tFalse(t, assert.InDelta(2, 1, 0.5), \"Expected |2 - 1| <= 0.5 to fail\")\n\tFalse(t, assert.InDelta(\"\", nil, 1), \"Expected non numerals to fail\")\n\n\tcases := []struct {\n\t\ta, b  interface{}\n\t\tdelta float64\n\t}{\n\t\t{uint8(2), uint8(1), 1},\n\t\t{uint16(2), uint16(1), 1},\n\t\t{uint32(2), uint32(1), 1},\n\t\t{uint64(2), uint64(1), 1},\n\n\t\t{int(2), int(1), 1},\n\t\t{int8(2), int8(1), 1},\n\t\t{int16(2), int16(1), 1},\n\t\t{int32(2), int32(1), 1},\n\t\t{int64(2), int64(1), 1},\n\n\t\t{float32(2), float32(1), 1},\n\t\t{float64(2), float64(1), 1},\n\t}\n\n\tfor _, tc := range cases {\n\t\tTrue(t, assert.InDelta(tc.a, tc.b, tc.delta), \"Expected |%V - %V| <= %v\", tc.a, tc.b, tc.delta)\n\t}\n}\n\nfunc TestInEpsilonWrapper(t *testing.T) {\n\tassert := New(new(testing.T))\n\n\tcases := []struct {\n\t\ta, b    interface{}\n\t\tepsilon float64\n\t}{\n\t\t{uint8(2), uint16(2), .001},\n\t\t{2.1, 2.2, 0.1},\n\t\t{2.2, 2.1, 0.1},\n\t\t{-2.1, -2.2, 0.1},\n\t\t{-2.2, -2.1, 0.1},\n\t\t{uint64(100), uint8(101), 0.01},\n\t\t{0.1, -0.1, 2},\n\t}\n\n\tfor _, tc := range cases {\n\t\tTrue(t, assert.InEpsilon(tc.a, tc.b, tc.epsilon, \"Expected %V and %V to have a relative difference of %v\", tc.a, tc.b, tc.epsilon))\n\t}\n\n\tcases = []struct {\n\t\ta, b    interface{}\n\t\tepsilon float64\n\t}{\n\t\t{uint8(2), int16(-2), .001},\n\t\t{uint64(100), uint8(102), 0.01},\n\t\t{2.1, 2.2, 0.001},\n\t\t{2.2, 2.1, 0.001},\n\t\t{2.1, -2.2, 1},\n\t\t{2.1, \"bla-bla\", 0},\n\t\t{0.1, -0.1, 1.99},\n\t}\n\n\tfor _, tc := range cases {\n\t\tFalse(t, assert.InEpsilon(tc.a, tc.b, tc.epsilon, \"Expected %V and %V to have a relative difference of %v\", tc.a, tc.b, tc.epsilon))\n\t}\n}\n\nfunc TestRegexpWrapper(t *testing.T) {\n\n\tassert := New(new(testing.T))\n\n\tcases := []struct {\n\t\trx, str string\n\t}{\n\t\t{\"^start\", \"start of the line\"},\n\t\t{\"end$\", \"in the end\"},\n\t\t{\"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}\", \"My phone number is 650.12.34\"},\n\t}\n\n\tfor _, tc := range cases {\n\t\tTrue(t, assert.Regexp(tc.rx, tc.str))\n\t\tTrue(t, assert.Regexp(regexp.MustCompile(tc.rx), tc.str))\n\t\tFalse(t, assert.NotRegexp(tc.rx, tc.str))\n\t\tFalse(t, assert.NotRegexp(regexp.MustCompile(tc.rx), tc.str))\n\t}\n\n\tcases = []struct {\n\t\trx, str string\n\t}{\n\t\t{\"^asdfastart\", \"Not the start of the line\"},\n\t\t{\"end$\", \"in the end.\"},\n\t\t{\"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}\", \"My phone number is 650.12a.34\"},\n\t}\n\n\tfor _, tc := range cases {\n\t\tFalse(t, assert.Regexp(tc.rx, tc.str), \"Expected \\\"%s\\\" to not match \\\"%s\\\"\", tc.rx, tc.str)\n\t\tFalse(t, assert.Regexp(regexp.MustCompile(tc.rx), tc.str))\n\t\tTrue(t, assert.NotRegexp(tc.rx, tc.str))\n\t\tTrue(t, assert.NotRegexp(regexp.MustCompile(tc.rx), tc.str))\n\t}\n}\n\nfunc TestZeroWrapper(t *testing.T) {\n\tassert := New(t)\n\tmockAssert := New(new(testing.T))\n\n\tfor _, test := range zeros {\n\t\tassert.True(mockAssert.Zero(test), \"Zero should return true for %v\", test)\n\t}\n\n\tfor _, test := range nonZeros {\n\t\tassert.False(mockAssert.Zero(test), \"Zero should return false for %v\", test)\n\t}\n}\n\nfunc TestNotZeroWrapper(t *testing.T) {\n\tassert := New(t)\n\tmockAssert := New(new(testing.T))\n\n\tfor _, test := range zeros {\n\t\tassert.False(mockAssert.NotZero(test), \"Zero should return true for %v\", test)\n\t}\n\n\tfor _, test := range nonZeros {\n\t\tassert.True(mockAssert.NotZero(test), \"Zero should return false for %v\", test)\n\t}\n}\n\nfunc TestJSONEqWrapper_EqualSONString(t *testing.T) {\n\tassert := New(new(testing.T))\n\tif !assert.JSONEq(`{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"hello\": \"world\", \"foo\": \"bar\"}`) {\n\t\tt.Error(\"JSONEq should return true\")\n\t}\n\n}\n\nfunc TestJSONEqWrapper_EquivalentButNotEqual(t *testing.T) {\n\tassert := New(new(testing.T))\n\tif !assert.JSONEq(`{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`) {\n\t\tt.Error(\"JSONEq should return true\")\n\t}\n\n}\n\nfunc TestJSONEqWrapper_HashOfArraysAndHashes(t *testing.T) {\n\tassert := New(new(testing.T))\n\tif !assert.JSONEq(\"{\\r\\n\\t\\\"numeric\\\": 1.5,\\r\\n\\t\\\"array\\\": [{\\\"foo\\\": \\\"bar\\\"}, 1, \\\"string\\\", [\\\"nested\\\", \\\"array\\\", 5.5]],\\r\\n\\t\\\"hash\\\": {\\\"nested\\\": \\\"hash\\\", \\\"nested_slice\\\": [\\\"this\\\", \\\"is\\\", \\\"nested\\\"]},\\r\\n\\t\\\"string\\\": \\\"foo\\\"\\r\\n}\",\n\t\t\"{\\r\\n\\t\\\"numeric\\\": 1.5,\\r\\n\\t\\\"hash\\\": {\\\"nested\\\": \\\"hash\\\", \\\"nested_slice\\\": [\\\"this\\\", \\\"is\\\", \\\"nested\\\"]},\\r\\n\\t\\\"string\\\": \\\"foo\\\",\\r\\n\\t\\\"array\\\": [{\\\"foo\\\": \\\"bar\\\"}, 1, \\\"string\\\", [\\\"nested\\\", \\\"array\\\", 5.5]]\\r\\n}\") {\n\t\tt.Error(\"JSONEq should return true\")\n\t}\n}\n\nfunc TestJSONEqWrapper_Array(t *testing.T) {\n\tassert := New(new(testing.T))\n\tif !assert.JSONEq(`[\"foo\", {\"hello\": \"world\", \"nested\": \"hash\"}]`, `[\"foo\", {\"nested\": \"hash\", \"hello\": \"world\"}]`) {\n\t\tt.Error(\"JSONEq should return true\")\n\t}\n\n}\n\nfunc TestJSONEqWrapper_HashAndArrayNotEquivalent(t *testing.T) {\n\tassert := New(new(testing.T))\n\tif assert.JSONEq(`[\"foo\", {\"hello\": \"world\", \"nested\": \"hash\"}]`, `{\"foo\": \"bar\", {\"nested\": \"hash\", \"hello\": \"world\"}}`) {\n\t\tt.Error(\"JSONEq should return false\")\n\t}\n}\n\nfunc TestJSONEqWrapper_HashesNotEquivalent(t *testing.T) {\n\tassert := New(new(testing.T))\n\tif assert.JSONEq(`{\"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`) {\n\t\tt.Error(\"JSONEq should return false\")\n\t}\n}\n\nfunc TestJSONEqWrapper_ActualIsNotJSON(t *testing.T) {\n\tassert := New(new(testing.T))\n\tif assert.JSONEq(`{\"foo\": \"bar\"}`, \"Not JSON\") {\n\t\tt.Error(\"JSONEq should return false\")\n\t}\n}\n\nfunc TestJSONEqWrapper_ExpectedIsNotJSON(t *testing.T) {\n\tassert := New(new(testing.T))\n\tif assert.JSONEq(\"Not JSON\", `{\"foo\": \"bar\", \"hello\": \"world\"}`) {\n\t\tt.Error(\"JSONEq should return false\")\n\t}\n}\n\nfunc TestJSONEqWrapper_ExpectedAndActualNotJSON(t *testing.T) {\n\tassert := New(new(testing.T))\n\tif assert.JSONEq(\"Not JSON\", \"Not JSON\") {\n\t\tt.Error(\"JSONEq should return false\")\n\t}\n}\n\nfunc TestJSONEqWrapper_ArraysOfDifferentOrder(t *testing.T) {\n\tassert := New(new(testing.T))\n\tif assert.JSONEq(`[\"foo\", {\"hello\": \"world\", \"nested\": \"hash\"}]`, `[{ \"hello\": \"world\", \"nested\": \"hash\"}, \"foo\"]`) {\n\t\tt.Error(\"JSONEq should return false\")\n\t}\n}\n"
  },
  {
    "path": "internal/testify/assert/http_assertions.go",
    "content": "package assert\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"net/url\"\n\t\"strings\"\n)\n\n// httpCode is a helper that returns HTTP code of the response. It returns -1 and\n// an error if building a new request fails.\nfunc httpCode(handler http.HandlerFunc, method, url string, values url.Values) (int, error) {\n\tw := httptest.NewRecorder()\n\treq, err := http.NewRequest(method, url, http.NoBody)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\treq.URL.RawQuery = values.Encode()\n\thandler(w, req)\n\treturn w.Code, nil\n}\n\n// HTTPSuccess asserts that a specified handler returns a success status code.\n//\n//\tassert.HTTPSuccess(t, myHandler, \"POST\", \"http://www.google.com\", nil)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tcode, err := httpCode(handler, method, url, values)\n\tif err != nil {\n\t\tFail(t, fmt.Sprintf(\"Failed to build test request, got error: %s\", err), msgAndArgs...)\n\t}\n\n\tisSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent\n\tif !isSuccessCode {\n\t\tFail(t, fmt.Sprintf(\"Expected HTTP success status code for %q but received %d\", url+\"?\"+values.Encode(), code), msgAndArgs...)\n\t}\n\n\treturn isSuccessCode\n}\n\n// HTTPRedirect asserts that a specified handler returns a redirect status code.\n//\n//\tassert.HTTPRedirect(t, myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tcode, err := httpCode(handler, method, url, values)\n\tif err != nil {\n\t\tFail(t, fmt.Sprintf(\"Failed to build test request, got error: %s\", err), msgAndArgs...)\n\t}\n\n\tisRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect\n\tif !isRedirectCode {\n\t\tFail(t, fmt.Sprintf(\"Expected HTTP redirect status code for %q but received %d\", url+\"?\"+values.Encode(), code), msgAndArgs...)\n\t}\n\n\treturn isRedirectCode\n}\n\n// HTTPError asserts that a specified handler returns an error status code.\n//\n//\tassert.HTTPError(t, myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tcode, err := httpCode(handler, method, url, values)\n\tif err != nil {\n\t\tFail(t, fmt.Sprintf(\"Failed to build test request, got error: %s\", err), msgAndArgs...)\n\t}\n\n\tisErrorCode := code >= http.StatusBadRequest\n\tif !isErrorCode {\n\t\tFail(t, fmt.Sprintf(\"Expected HTTP error status code for %q but received %d\", url+\"?\"+values.Encode(), code), msgAndArgs...)\n\t}\n\n\treturn isErrorCode\n}\n\n// HTTPStatusCode asserts that a specified handler returns a specified status code.\n//\n//\tassert.HTTPStatusCode(t, myHandler, \"GET\", \"/notImplemented\", nil, 501)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPStatusCode(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tcode, err := httpCode(handler, method, url, values)\n\tif err != nil {\n\t\tFail(t, fmt.Sprintf(\"Failed to build test request, got error: %s\", err), msgAndArgs...)\n\t}\n\n\tsuccessful := code == statuscode\n\tif !successful {\n\t\tFail(t, fmt.Sprintf(\"Expected HTTP status code %d for %q but received %d\", statuscode, url+\"?\"+values.Encode(), code), msgAndArgs...)\n\t}\n\n\treturn successful\n}\n\n// HTTPBody is a helper that returns HTTP body of the response. It returns\n// empty string if building a new request fails.\nfunc HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string {\n\tw := httptest.NewRecorder()\n\tif len(values) > 0 {\n\t\turl += \"?\" + values.Encode()\n\t}\n\treq, err := http.NewRequest(method, url, http.NoBody)\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\thandler(w, req)\n\treturn w.Body.String()\n}\n\n// HTTPBodyContains asserts that a specified handler returns a\n// body that contains a string.\n//\n//\tassert.HTTPBodyContains(t, myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tbody := HTTPBody(handler, method, url, values)\n\n\tcontains := strings.Contains(body, fmt.Sprint(str))\n\tif !contains {\n\t\tFail(t, fmt.Sprintf(\"Expected response body for \\\"%s\\\" to contain \\\"%s\\\" but found \\\"%s\\\"\", url+\"?\"+values.Encode(), str, body), msgAndArgs...)\n\t}\n\n\treturn contains\n}\n\n// HTTPBodyNotContains asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//\tassert.HTTPBodyNotContains(t, myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tbody := HTTPBody(handler, method, url, values)\n\n\tcontains := strings.Contains(body, fmt.Sprint(str))\n\tif contains {\n\t\tFail(t, fmt.Sprintf(\"Expected response body for \\\"%s\\\" to NOT contain \\\"%s\\\" but found \\\"%s\\\"\", url+\"?\"+values.Encode(), str, body), msgAndArgs...)\n\t}\n\n\treturn !contains\n}\n"
  },
  {
    "path": "internal/testify/assert/http_assertions_test.go",
    "content": "package assert\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"testing\"\n)\n\nfunc httpOK(w http.ResponseWriter, r *http.Request) {\n\tw.WriteHeader(http.StatusOK)\n}\n\nfunc httpReadBody(w http.ResponseWriter, r *http.Request) {\n\t_, _ = io.Copy(io.Discard, r.Body)\n\tw.WriteHeader(http.StatusOK)\n\t_, _ = w.Write([]byte(\"hello\"))\n}\n\nfunc httpRedirect(w http.ResponseWriter, r *http.Request) {\n\tw.WriteHeader(http.StatusTemporaryRedirect)\n}\n\nfunc httpError(w http.ResponseWriter, r *http.Request) {\n\tw.WriteHeader(http.StatusInternalServerError)\n}\n\nfunc httpStatusCode(w http.ResponseWriter, r *http.Request) {\n\tw.WriteHeader(http.StatusSwitchingProtocols)\n}\n\nfunc TestHTTPSuccess(t *testing.T) {\n\tassert := New(t)\n\n\tmockT1 := new(testing.T)\n\tassert.Equal(HTTPSuccess(mockT1, httpOK, \"GET\", \"/\", nil), true)\n\tassert.False(mockT1.Failed())\n\n\tmockT2 := new(testing.T)\n\tassert.Equal(HTTPSuccess(mockT2, httpRedirect, \"GET\", \"/\", nil), false)\n\tassert.True(mockT2.Failed())\n\n\tmockT3 := new(mockTestingT)\n\tassert.Equal(HTTPSuccess(\n\t\tmockT3, httpError, \"GET\", \"/\", nil,\n\t\t\"was not expecting a failure here\",\n\t), false)\n\tassert.True(mockT3.Failed())\n\tassert.Contains(mockT3.errorString(), \"was not expecting a failure here\")\n\n\tmockT4 := new(testing.T)\n\tassert.Equal(HTTPSuccess(mockT4, httpStatusCode, \"GET\", \"/\", nil), false)\n\tassert.True(mockT4.Failed())\n\n\tmockT5 := new(testing.T)\n\tassert.Equal(HTTPSuccess(mockT5, httpReadBody, \"POST\", \"/\", nil), true)\n\tassert.False(mockT5.Failed())\n}\n\nfunc TestHTTPRedirect(t *testing.T) {\n\tassert := New(t)\n\n\tmockT1 := new(mockTestingT)\n\tassert.Equal(HTTPRedirect(\n\t\tmockT1, httpOK, \"GET\", \"/\", nil,\n\t\t\"was expecting a 3xx status code. Got 200.\",\n\t), false)\n\tassert.True(mockT1.Failed())\n\tassert.Contains(mockT1.errorString(), \"was expecting a 3xx status code. Got 200.\")\n\n\tmockT2 := new(testing.T)\n\tassert.Equal(HTTPRedirect(mockT2, httpRedirect, \"GET\", \"/\", nil), true)\n\tassert.False(mockT2.Failed())\n\n\tmockT3 := new(testing.T)\n\tassert.Equal(HTTPRedirect(mockT3, httpError, \"GET\", \"/\", nil), false)\n\tassert.True(mockT3.Failed())\n\n\tmockT4 := new(testing.T)\n\tassert.Equal(HTTPRedirect(mockT4, httpStatusCode, \"GET\", \"/\", nil), false)\n\tassert.True(mockT4.Failed())\n}\n\nfunc TestHTTPError(t *testing.T) {\n\tassert := New(t)\n\n\tmockT1 := new(testing.T)\n\tassert.Equal(HTTPError(mockT1, httpOK, \"GET\", \"/\", nil), false)\n\tassert.True(mockT1.Failed())\n\n\tmockT2 := new(mockTestingT)\n\tassert.Equal(HTTPError(\n\t\tmockT2, httpRedirect, \"GET\", \"/\", nil,\n\t\t\"Expected this request to error out. But it didn't\",\n\t), false)\n\tassert.True(mockT2.Failed())\n\tassert.Contains(mockT2.errorString(), \"Expected this request to error out. But it didn't\")\n\n\tmockT3 := new(testing.T)\n\tassert.Equal(HTTPError(mockT3, httpError, \"GET\", \"/\", nil), true)\n\tassert.False(mockT3.Failed())\n\n\tmockT4 := new(testing.T)\n\tassert.Equal(HTTPError(mockT4, httpStatusCode, \"GET\", \"/\", nil), false)\n\tassert.True(mockT4.Failed())\n}\n\nfunc TestHTTPStatusCode(t *testing.T) {\n\tassert := New(t)\n\n\tmockT1 := new(testing.T)\n\tassert.Equal(HTTPStatusCode(mockT1, httpOK, \"GET\", \"/\", nil, http.StatusSwitchingProtocols), false)\n\tassert.True(mockT1.Failed())\n\n\tmockT2 := new(testing.T)\n\tassert.Equal(HTTPStatusCode(mockT2, httpRedirect, \"GET\", \"/\", nil, http.StatusSwitchingProtocols), false)\n\tassert.True(mockT2.Failed())\n\n\tmockT3 := new(mockTestingT)\n\tassert.Equal(HTTPStatusCode(\n\t\tmockT3, httpError, \"GET\", \"/\", nil, http.StatusSwitchingProtocols,\n\t\t\"Expected the status code to be %d\", http.StatusSwitchingProtocols,\n\t), false)\n\tassert.True(mockT3.Failed())\n\tassert.Contains(mockT3.errorString(), \"Expected the status code to be 101\")\n\n\tmockT4 := new(testing.T)\n\tassert.Equal(HTTPStatusCode(mockT4, httpStatusCode, \"GET\", \"/\", nil, http.StatusSwitchingProtocols), true)\n\tassert.False(mockT4.Failed())\n}\n\nfunc TestHTTPStatusesWrapper(t *testing.T) {\n\tassert := New(t)\n\tmockAssert := New(new(testing.T))\n\n\tassert.Equal(mockAssert.HTTPSuccess(httpOK, \"GET\", \"/\", nil), true)\n\tassert.Equal(mockAssert.HTTPSuccess(httpRedirect, \"GET\", \"/\", nil), false)\n\tassert.Equal(mockAssert.HTTPSuccess(httpError, \"GET\", \"/\", nil), false)\n\n\tassert.Equal(mockAssert.HTTPRedirect(httpOK, \"GET\", \"/\", nil), false)\n\tassert.Equal(mockAssert.HTTPRedirect(httpRedirect, \"GET\", \"/\", nil), true)\n\tassert.Equal(mockAssert.HTTPRedirect(httpError, \"GET\", \"/\", nil), false)\n\n\tassert.Equal(mockAssert.HTTPError(httpOK, \"GET\", \"/\", nil), false)\n\tassert.Equal(mockAssert.HTTPError(httpRedirect, \"GET\", \"/\", nil), false)\n\tassert.Equal(mockAssert.HTTPError(httpError, \"GET\", \"/\", nil), true)\n}\n\nfunc httpHelloName(w http.ResponseWriter, r *http.Request) {\n\tname := r.FormValue(\"name\")\n\t_, _ = fmt.Fprintf(w, \"Hello, %s!\", name)\n}\n\nfunc TestHTTPRequestWithNoParams(t *testing.T) {\n\tvar got *http.Request\n\thandler := func(w http.ResponseWriter, r *http.Request) {\n\t\tgot = r\n\t\tw.WriteHeader(http.StatusOK)\n\t}\n\n\tTrue(t, HTTPSuccess(t, handler, \"GET\", \"/url\", nil))\n\n\tEmpty(t, got.URL.Query())\n\tEqual(t, \"/url\", got.URL.RequestURI())\n}\n\nfunc TestHTTPRequestWithParams(t *testing.T) {\n\tvar got *http.Request\n\thandler := func(w http.ResponseWriter, r *http.Request) {\n\t\tgot = r\n\t\tw.WriteHeader(http.StatusOK)\n\t}\n\tparams := url.Values{}\n\tparams.Add(\"id\", \"12345\")\n\n\tTrue(t, HTTPSuccess(t, handler, \"GET\", \"/url\", params))\n\n\tEqual(t, url.Values{\"id\": []string{\"12345\"}}, got.URL.Query())\n\tEqual(t, \"/url?id=12345\", got.URL.String())\n\tEqual(t, \"/url?id=12345\", got.URL.RequestURI())\n}\n\nfunc TestHttpBody(t *testing.T) {\n\tassert := New(t)\n\tmockT := new(mockTestingT)\n\n\tassert.True(HTTPBodyContains(mockT, httpHelloName, \"GET\", \"/\", url.Values{\"name\": []string{\"World\"}}, \"Hello, World!\"))\n\tassert.True(HTTPBodyContains(mockT, httpHelloName, \"GET\", \"/\", url.Values{\"name\": []string{\"World\"}}, \"World\"))\n\tassert.False(HTTPBodyContains(mockT, httpHelloName, \"GET\", \"/\", url.Values{\"name\": []string{\"World\"}}, \"world\"))\n\n\tassert.False(HTTPBodyNotContains(mockT, httpHelloName, \"GET\", \"/\", url.Values{\"name\": []string{\"World\"}}, \"Hello, World!\"))\n\tassert.False(HTTPBodyNotContains(\n\t\tmockT, httpHelloName, \"GET\", \"/\", url.Values{\"name\": []string{\"World\"}}, \"World\",\n\t\t\"Expected the request body to not contain 'World'. But it did.\",\n\t))\n\tassert.True(HTTPBodyNotContains(mockT, httpHelloName, \"GET\", \"/\", url.Values{\"name\": []string{\"World\"}}, \"world\"))\n\tassert.Contains(mockT.errorString(), \"Expected the request body to not contain 'World'. But it did.\")\n\n\tassert.True(HTTPBodyContains(mockT, httpReadBody, \"GET\", \"/\", nil, \"hello\"))\n}\n\nfunc TestHttpBodyWrappers(t *testing.T) {\n\tassert := New(t)\n\tmockAssert := New(new(testing.T))\n\n\tassert.True(mockAssert.HTTPBodyContains(httpHelloName, \"GET\", \"/\", url.Values{\"name\": []string{\"World\"}}, \"Hello, World!\"))\n\tassert.True(mockAssert.HTTPBodyContains(httpHelloName, \"GET\", \"/\", url.Values{\"name\": []string{\"World\"}}, \"World\"))\n\tassert.False(mockAssert.HTTPBodyContains(httpHelloName, \"GET\", \"/\", url.Values{\"name\": []string{\"World\"}}, \"world\"))\n\n\tassert.False(mockAssert.HTTPBodyNotContains(httpHelloName, \"GET\", \"/\", url.Values{\"name\": []string{\"World\"}}, \"Hello, World!\"))\n\tassert.False(mockAssert.HTTPBodyNotContains(httpHelloName, \"GET\", \"/\", url.Values{\"name\": []string{\"World\"}}, \"World\"))\n\tassert.True(mockAssert.HTTPBodyNotContains(httpHelloName, \"GET\", \"/\", url.Values{\"name\": []string{\"World\"}}, \"world\"))\n}\n"
  },
  {
    "path": "internal/testify/assert/internal/unsafetests/doc.go",
    "content": "// This package exists just to isolate tests that reference the [unsafe] package.\n//\n// The tests in this package are totally safe.\npackage unsafetests\n"
  },
  {
    "path": "internal/testify/assert/internal/unsafetests/unsafetests_test.go",
    "content": "package unsafetests_test\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"unsafe\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n)\n\ntype ignoreTestingT struct{}\n\nvar _ assert.TestingT = ignoreTestingT{}\n\nfunc (ignoreTestingT) Helper() {}\n\nfunc (ignoreTestingT) Errorf(format string, args ...interface{}) {\n\t// Run the formatting, but ignore the result\n\tmsg := fmt.Sprintf(format, args...)\n\t_ = msg\n}\n\nfunc TestUnsafePointers(t *testing.T) {\n\tvar ignore ignoreTestingT\n\n\tassert.True(t, assert.Nil(t, unsafe.Pointer(nil), \"unsafe.Pointer(nil) is nil\"))\n\tassert.False(t, assert.NotNil(ignore, unsafe.Pointer(nil), \"unsafe.Pointer(nil) is nil\"))\n\n\tassert.True(t, assert.Nil(t, unsafe.Pointer((*int)(nil)), \"unsafe.Pointer((*int)(nil)) is nil\"))\n\tassert.False(t, assert.NotNil(ignore, unsafe.Pointer((*int)(nil)), \"unsafe.Pointer((*int)(nil)) is nil\"))\n\n\tassert.False(t, assert.Nil(ignore, unsafe.Pointer(new(int)), \"unsafe.Pointer(new(int)) is NOT nil\"))\n\tassert.True(t, assert.NotNil(t, unsafe.Pointer(new(int)), \"unsafe.Pointer(new(int)) is NOT nil\"))\n}\n"
  },
  {
    "path": "internal/testify/require/doc.go",
    "content": "// Package require implements the same assertions as the `assert` package but\n// stops test execution when a test fails.\n//\n// # Example Usage\n//\n// The following is a complete example using require in a standard test function:\n//\n//\timport (\n//\t  \"testing\"\n//\t  \"github.com/expr-lang/expr/internal/testify/require\"\n//\t)\n//\n//\tfunc TestSomething(t *testing.T) {\n//\n//\t  var a string = \"Hello\"\n//\t  var b string = \"Hello\"\n//\n//\t  require.Equal(t, a, b, \"The two words should be the same.\")\n//\n//\t}\n//\n// # Assertions\n//\n// The `require` package have same global functions as in the `assert` package,\n// but instead of returning a boolean result they call `t.FailNow()`.\n//\n// Every assertion function also takes an optional string message as the final argument,\n// allowing custom error messages to be appended to the message the assertion method outputs.\npackage require\n"
  },
  {
    "path": "internal/testify/require/forward_requirements.go",
    "content": "package require\n\n// Assertions provides assertion methods around the\n// TestingT interface.\ntype Assertions struct {\n\tt TestingT\n}\n\n// New makes a new Assertions object for the specified TestingT.\nfunc New(t TestingT) *Assertions {\n\treturn &Assertions{\n\t\tt: t,\n\t}\n}\n\n//go:generate sh -c \"cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=require -template=require_forward.go.tmpl -include-format-funcs\"\n"
  },
  {
    "path": "internal/testify/require/forward_requirements_test.go",
    "content": "package require\n\nimport (\n\t\"errors\"\n\t\"testing\"\n\t\"time\"\n)\n\nfunc TestImplementsWrapper(t *testing.T) {\n\trequire := New(t)\n\n\trequire.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject))\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject))\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestIsTypeWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.IsType(new(AssertionTesterConformingObject), new(AssertionTesterConformingObject))\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.IsType(new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject))\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestEqualWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.Equal(1, 1)\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.Equal(1, 2)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNotEqualWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.NotEqual(1, 2)\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.NotEqual(2, 2)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestExactlyWrapper(t *testing.T) {\n\trequire := New(t)\n\n\ta := float32(1)\n\tb := float32(1)\n\tc := float64(1)\n\n\trequire.Exactly(a, b)\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.Exactly(a, c)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNotNilWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.NotNil(t, new(AssertionTesterConformingObject))\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.NotNil(nil)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNilWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.Nil(nil)\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.Nil(new(AssertionTesterConformingObject))\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestTrueWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.True(true)\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.True(false)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestFalseWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.False(false)\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.False(true)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestContainsWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.Contains(\"Hello World\", \"Hello\")\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.Contains(\"Hello World\", \"Salut\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNotContainsWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.NotContains(\"Hello World\", \"Hello!\")\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.NotContains(\"Hello World\", \"Hello\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestPanicsWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.Panics(func() {\n\t\tpanic(\"Panic!\")\n\t})\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.Panics(func() {})\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNotPanicsWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.NotPanics(func() {})\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.NotPanics(func() {\n\t\tpanic(\"Panic!\")\n\t})\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNoErrorWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.NoError(nil)\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.NoError(errors.New(\"some error\"))\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestErrorWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.Error(errors.New(\"some error\"))\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.Error(nil)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestErrorContainsWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.ErrorContains(errors.New(\"some error: another error\"), \"some error\")\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.ErrorContains(errors.New(\"some error: another error\"), \"different error\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestEqualErrorWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.EqualError(errors.New(\"some error\"), \"some error\")\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.EqualError(errors.New(\"some error\"), \"Not some error\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestEmptyWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.Empty(\"\")\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.Empty(\"x\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNotEmptyWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.NotEmpty(\"x\")\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.NotEmpty(\"\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestWithinDurationWrapper(t *testing.T) {\n\trequire := New(t)\n\ta := time.Now()\n\tb := a.Add(10 * time.Second)\n\n\trequire.WithinDuration(a, b, 15*time.Second)\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.WithinDuration(a, b, 5*time.Second)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestInDeltaWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.InDelta(1.001, 1, 0.01)\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.InDelta(1, 2, 0.5)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestZeroWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.Zero(0)\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.Zero(1)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNotZeroWrapper(t *testing.T) {\n\trequire := New(t)\n\trequire.NotZero(1)\n\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\tmockRequire.NotZero(0)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestJSONEqWrapper_EqualSONString(t *testing.T) {\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\n\tmockRequire.JSONEq(`{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"hello\": \"world\", \"foo\": \"bar\"}`)\n\tif mockT.Failed {\n\t\tt.Error(\"Check should pass\")\n\t}\n}\n\nfunc TestJSONEqWrapper_EquivalentButNotEqual(t *testing.T) {\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\n\tmockRequire.JSONEq(`{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`)\n\tif mockT.Failed {\n\t\tt.Error(\"Check should pass\")\n\t}\n}\n\nfunc TestJSONEqWrapper_HashOfArraysAndHashes(t *testing.T) {\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\n\tmockRequire.JSONEq(\"{\\r\\n\\t\\\"numeric\\\": 1.5,\\r\\n\\t\\\"array\\\": [{\\\"foo\\\": \\\"bar\\\"}, 1, \\\"string\\\", [\\\"nested\\\", \\\"array\\\", 5.5]],\\r\\n\\t\\\"hash\\\": {\\\"nested\\\": \\\"hash\\\", \\\"nested_slice\\\": [\\\"this\\\", \\\"is\\\", \\\"nested\\\"]},\\r\\n\\t\\\"string\\\": \\\"foo\\\"\\r\\n}\",\n\t\t\"{\\r\\n\\t\\\"numeric\\\": 1.5,\\r\\n\\t\\\"hash\\\": {\\\"nested\\\": \\\"hash\\\", \\\"nested_slice\\\": [\\\"this\\\", \\\"is\\\", \\\"nested\\\"]},\\r\\n\\t\\\"string\\\": \\\"foo\\\",\\r\\n\\t\\\"array\\\": [{\\\"foo\\\": \\\"bar\\\"}, 1, \\\"string\\\", [\\\"nested\\\", \\\"array\\\", 5.5]]\\r\\n}\")\n\tif mockT.Failed {\n\t\tt.Error(\"Check should pass\")\n\t}\n}\n\nfunc TestJSONEqWrapper_Array(t *testing.T) {\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\n\tmockRequire.JSONEq(`[\"foo\", {\"hello\": \"world\", \"nested\": \"hash\"}]`, `[\"foo\", {\"nested\": \"hash\", \"hello\": \"world\"}]`)\n\tif mockT.Failed {\n\t\tt.Error(\"Check should pass\")\n\t}\n}\n\nfunc TestJSONEqWrapper_HashAndArrayNotEquivalent(t *testing.T) {\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\n\tmockRequire.JSONEq(`[\"foo\", {\"hello\": \"world\", \"nested\": \"hash\"}]`, `{\"foo\": \"bar\", {\"nested\": \"hash\", \"hello\": \"world\"}}`)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestJSONEqWrapper_HashesNotEquivalent(t *testing.T) {\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\n\tmockRequire.JSONEq(`{\"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestJSONEqWrapper_ActualIsNotJSON(t *testing.T) {\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\n\tmockRequire.JSONEq(`{\"foo\": \"bar\"}`, \"Not JSON\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestJSONEqWrapper_ExpectedIsNotJSON(t *testing.T) {\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\n\tmockRequire.JSONEq(\"Not JSON\", `{\"foo\": \"bar\", \"hello\": \"world\"}`)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestJSONEqWrapper_ExpectedAndActualNotJSON(t *testing.T) {\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\n\tmockRequire.JSONEq(\"Not JSON\", \"Not JSON\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestJSONEqWrapper_ArraysOfDifferentOrder(t *testing.T) {\n\tmockT := new(MockT)\n\tmockRequire := New(mockT)\n\n\tmockRequire.JSONEq(`[\"foo\", {\"hello\": \"world\", \"nested\": \"hash\"}]`, `[{ \"hello\": \"world\", \"nested\": \"hash\"}, \"foo\"]`)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n"
  },
  {
    "path": "internal/testify/require/require.go",
    "content": "// Code generated with github.com/expr-lang/expr/internal/_codegen; DO NOT EDIT.\n\npackage require\n\nimport (\n\thttp \"net/http\"\n\turl \"net/url\"\n\ttime \"time\"\n\n\tassert \"github.com/expr-lang/expr/internal/testify/assert\"\n)\n\n// Condition uses a Comparison to assert a complex condition.\nfunc Condition(t TestingT, comp assert.Comparison, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Condition(t, comp, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Conditionf uses a Comparison to assert a complex condition.\nfunc Conditionf(t TestingT, comp assert.Comparison, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Conditionf(t, comp, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Contains asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//\tassert.Contains(t, \"Hello World\", \"World\")\n//\tassert.Contains(t, [\"Hello\", \"World\"], \"World\")\n//\tassert.Contains(t, {\"Hello\": \"World\"}, \"Hello\")\nfunc Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Contains(t, s, contains, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Containsf asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//\tassert.Containsf(t, \"Hello World\", \"World\", \"error message %s\", \"formatted\")\n//\tassert.Containsf(t, [\"Hello\", \"World\"], \"World\", \"error message %s\", \"formatted\")\n//\tassert.Containsf(t, {\"Hello\": \"World\"}, \"Hello\", \"error message %s\", \"formatted\")\nfunc Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Containsf(t, s, contains, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// DirExists checks whether a directory exists in the given path. It also fails\n// if the path is a file rather a directory or there is an error checking whether it exists.\nfunc DirExists(t TestingT, path string, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.DirExists(t, path, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// DirExistsf checks whether a directory exists in the given path. It also fails\n// if the path is a file rather a directory or there is an error checking whether it exists.\nfunc DirExistsf(t TestingT, path string, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.DirExistsf(t, path, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified\n// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,\n// the number of appearances of each of them in both lists should match.\n//\n// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2])\nfunc ElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.ElementsMatch(t, listA, listB, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified\n// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,\n// the number of appearances of each of them in both lists should match.\n//\n// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], \"error message %s\", \"formatted\")\nfunc ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.ElementsMatchf(t, listA, listB, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Empty asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\tassert.Empty(t, obj)\nfunc Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Empty(t, object, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Emptyf asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\tassert.Emptyf(t, obj, \"error message %s\", \"formatted\")\nfunc Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Emptyf(t, object, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Equal asserts that two objects are equal.\n//\n//\tassert.Equal(t, 123, 123)\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Equal(t, expected, actual, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// EqualError asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//\tactualObj, err := SomeFunction()\n//\tassert.EqualError(t, err,  expectedErrorString)\nfunc EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.EqualError(t, theError, errString, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// EqualErrorf asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//\tactualObj, err := SomeFunction()\n//\tassert.EqualErrorf(t, err,  expectedErrorString, \"error message %s\", \"formatted\")\nfunc EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.EqualErrorf(t, theError, errString, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// EqualExportedValues asserts that the types of two objects are equal and their public\n// fields are also equal. This is useful for comparing structs that have private fields\n// that could potentially differ.\n//\n//\t type S struct {\n//\t\tExported     \tint\n//\t\tnotExported   \tint\n//\t }\n//\t assert.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true\n//\t assert.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false\nfunc EqualExportedValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.EqualExportedValues(t, expected, actual, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// EqualExportedValuesf asserts that the types of two objects are equal and their public\n// fields are also equal. This is useful for comparing structs that have private fields\n// that could potentially differ.\n//\n//\t type S struct {\n//\t\tExported     \tint\n//\t\tnotExported   \tint\n//\t }\n//\t assert.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, \"error message %s\", \"formatted\") => true\n//\t assert.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, \"error message %s\", \"formatted\") => false\nfunc EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.EqualExportedValuesf(t, expected, actual, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// EqualValues asserts that two objects are equal or convertible to the same types\n// and equal.\n//\n//\tassert.EqualValues(t, uint32(123), int32(123))\nfunc EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.EqualValues(t, expected, actual, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// EqualValuesf asserts that two objects are equal or convertible to the same types\n// and equal.\n//\n//\tassert.EqualValuesf(t, uint32(123), int32(123), \"error message %s\", \"formatted\")\nfunc EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.EqualValuesf(t, expected, actual, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Equalf asserts that two objects are equal.\n//\n//\tassert.Equalf(t, 123, 123, \"error message %s\", \"formatted\")\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Equalf(t, expected, actual, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Error asserts that a function returned an error (i.e. not `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if assert.Error(t, err) {\n//\t\t   assert.Equal(t, expectedError, err)\n//\t  }\nfunc Error(t TestingT, err error, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Error(t, err, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// ErrorAs asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value.\n// This is a wrapper for errors.As.\nfunc ErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.ErrorAs(t, err, target, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// ErrorAsf asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value.\n// This is a wrapper for errors.As.\nfunc ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.ErrorAsf(t, err, target, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// ErrorContains asserts that a function returned an error (i.e. not `nil`)\n// and that the error contains the specified substring.\n//\n//\tactualObj, err := SomeFunction()\n//\tassert.ErrorContains(t, err,  expectedErrorSubString)\nfunc ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.ErrorContains(t, theError, contains, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// ErrorContainsf asserts that a function returned an error (i.e. not `nil`)\n// and that the error contains the specified substring.\n//\n//\tactualObj, err := SomeFunction()\n//\tassert.ErrorContainsf(t, err,  expectedErrorSubString, \"error message %s\", \"formatted\")\nfunc ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.ErrorContainsf(t, theError, contains, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// ErrorIs asserts that at least one of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc ErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.ErrorIs(t, err, target, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// ErrorIsf asserts that at least one of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc ErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.ErrorIsf(t, err, target, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Errorf asserts that a function returned an error (i.e. not `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if assert.Errorf(t, err, \"error message %s\", \"formatted\") {\n//\t\t   assert.Equal(t, expectedErrorf, err)\n//\t  }\nfunc Errorf(t TestingT, err error, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Errorf(t, err, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Eventually asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick.\n//\n//\tassert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond)\nfunc Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Eventually(t, condition, waitFor, tick, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// EventuallyWithT asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick. In contrast to Eventually,\n// it supplies a CollectT to the condition function, so that the condition\n// function can use the CollectT to call other assertions.\n// The condition is considered \"met\" if no errors are raised in a tick.\n// The supplied CollectT collects all errors from one tick (if there are any).\n// If the condition is not met before waitFor, the collected errors of\n// the last tick are copied to t.\n//\n//\texternalValue := false\n//\tgo func() {\n//\t\ttime.Sleep(8*time.Second)\n//\t\texternalValue = true\n//\t}()\n//\tassert.EventuallyWithT(t, func(c *assert.CollectT) {\n//\t\t// add assertions as needed; any assertion failure will fail the current tick\n//\t\tassert.True(c, externalValue, \"expected 'externalValue' to be true\")\n//\t}, 10*time.Second, 1*time.Second, \"external state has not changed to 'true'; still false\")\nfunc EventuallyWithT(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.EventuallyWithT(t, condition, waitFor, tick, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// EventuallyWithTf asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick. In contrast to Eventually,\n// it supplies a CollectT to the condition function, so that the condition\n// function can use the CollectT to call other assertions.\n// The condition is considered \"met\" if no errors are raised in a tick.\n// The supplied CollectT collects all errors from one tick (if there are any).\n// If the condition is not met before waitFor, the collected errors of\n// the last tick are copied to t.\n//\n//\texternalValue := false\n//\tgo func() {\n//\t\ttime.Sleep(8*time.Second)\n//\t\texternalValue = true\n//\t}()\n//\tassert.EventuallyWithTf(t, func(c *assert.CollectT, \"error message %s\", \"formatted\") {\n//\t\t// add assertions as needed; any assertion failure will fail the current tick\n//\t\tassert.True(c, externalValue, \"expected 'externalValue' to be true\")\n//\t}, 10*time.Second, 1*time.Second, \"external state has not changed to 'true'; still false\")\nfunc EventuallyWithTf(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.EventuallyWithTf(t, condition, waitFor, tick, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Eventuallyf asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick.\n//\n//\tassert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, \"error message %s\", \"formatted\")\nfunc Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Eventuallyf(t, condition, waitFor, tick, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Exactly asserts that two objects are equal in value and type.\n//\n//\tassert.Exactly(t, int32(123), int64(123))\nfunc Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Exactly(t, expected, actual, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Exactlyf asserts that two objects are equal in value and type.\n//\n//\tassert.Exactlyf(t, int32(123), int64(123), \"error message %s\", \"formatted\")\nfunc Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Exactlyf(t, expected, actual, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Fail reports a failure through\nfunc Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Fail(t, failureMessage, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// FailNow fails test\nfunc FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.FailNow(t, failureMessage, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// FailNowf fails test\nfunc FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.FailNowf(t, failureMessage, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Failf reports a failure through\nfunc Failf(t TestingT, failureMessage string, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Failf(t, failureMessage, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// False asserts that the specified value is false.\n//\n//\tassert.False(t, myBool)\nfunc False(t TestingT, value bool, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.False(t, value, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Falsef asserts that the specified value is false.\n//\n//\tassert.Falsef(t, myBool, \"error message %s\", \"formatted\")\nfunc Falsef(t TestingT, value bool, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Falsef(t, value, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// FileExists checks whether a file exists in the given path. It also fails if\n// the path points to a directory or there is an error when trying to check the file.\nfunc FileExists(t TestingT, path string, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.FileExists(t, path, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// FileExistsf checks whether a file exists in the given path. It also fails if\n// the path points to a directory or there is an error when trying to check the file.\nfunc FileExistsf(t TestingT, path string, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.FileExistsf(t, path, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Greater asserts that the first element is greater than the second\n//\n//\tassert.Greater(t, 2, 1)\n//\tassert.Greater(t, float64(2), float64(1))\n//\tassert.Greater(t, \"b\", \"a\")\nfunc Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Greater(t, e1, e2, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// GreaterOrEqual asserts that the first element is greater than or equal to the second\n//\n//\tassert.GreaterOrEqual(t, 2, 1)\n//\tassert.GreaterOrEqual(t, 2, 2)\n//\tassert.GreaterOrEqual(t, \"b\", \"a\")\n//\tassert.GreaterOrEqual(t, \"b\", \"b\")\nfunc GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.GreaterOrEqual(t, e1, e2, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// GreaterOrEqualf asserts that the first element is greater than or equal to the second\n//\n//\tassert.GreaterOrEqualf(t, 2, 1, \"error message %s\", \"formatted\")\n//\tassert.GreaterOrEqualf(t, 2, 2, \"error message %s\", \"formatted\")\n//\tassert.GreaterOrEqualf(t, \"b\", \"a\", \"error message %s\", \"formatted\")\n//\tassert.GreaterOrEqualf(t, \"b\", \"b\", \"error message %s\", \"formatted\")\nfunc GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.GreaterOrEqualf(t, e1, e2, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Greaterf asserts that the first element is greater than the second\n//\n//\tassert.Greaterf(t, 2, 1, \"error message %s\", \"formatted\")\n//\tassert.Greaterf(t, float64(2), float64(1), \"error message %s\", \"formatted\")\n//\tassert.Greaterf(t, \"b\", \"a\", \"error message %s\", \"formatted\")\nfunc Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Greaterf(t, e1, e2, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// HTTPBodyContains asserts that a specified handler returns a\n// body that contains a string.\n//\n//\tassert.HTTPBodyContains(t, myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.HTTPBodyContains(t, handler, method, url, values, str, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// HTTPBodyContainsf asserts that a specified handler returns a\n// body that contains a string.\n//\n//\tassert.HTTPBodyContainsf(t, myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.HTTPBodyContainsf(t, handler, method, url, values, str, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// HTTPBodyNotContains asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//\tassert.HTTPBodyNotContains(t, myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.HTTPBodyNotContains(t, handler, method, url, values, str, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// HTTPBodyNotContainsf asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//\tassert.HTTPBodyNotContainsf(t, myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.HTTPBodyNotContainsf(t, handler, method, url, values, str, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// HTTPError asserts that a specified handler returns an error status code.\n//\n//\tassert.HTTPError(t, myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.HTTPError(t, handler, method, url, values, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// HTTPErrorf asserts that a specified handler returns an error status code.\n//\n//\tassert.HTTPErrorf(t, myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.HTTPErrorf(t, handler, method, url, values, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// HTTPRedirect asserts that a specified handler returns a redirect status code.\n//\n//\tassert.HTTPRedirect(t, myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.HTTPRedirect(t, handler, method, url, values, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// HTTPRedirectf asserts that a specified handler returns a redirect status code.\n//\n//\tassert.HTTPRedirectf(t, myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.HTTPRedirectf(t, handler, method, url, values, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// HTTPStatusCode asserts that a specified handler returns a specified status code.\n//\n//\tassert.HTTPStatusCode(t, myHandler, \"GET\", \"/notImplemented\", nil, 501)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.HTTPStatusCode(t, handler, method, url, values, statuscode, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// HTTPStatusCodef asserts that a specified handler returns a specified status code.\n//\n//\tassert.HTTPStatusCodef(t, myHandler, \"GET\", \"/notImplemented\", nil, 501, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.HTTPStatusCodef(t, handler, method, url, values, statuscode, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// HTTPSuccess asserts that a specified handler returns a success status code.\n//\n//\tassert.HTTPSuccess(t, myHandler, \"POST\", \"http://www.google.com\", nil)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.HTTPSuccess(t, handler, method, url, values, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// HTTPSuccessf asserts that a specified handler returns a success status code.\n//\n//\tassert.HTTPSuccessf(t, myHandler, \"POST\", \"http://www.google.com\", nil, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.HTTPSuccessf(t, handler, method, url, values, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Implements asserts that an object is implemented by the specified interface.\n//\n//\tassert.Implements(t, (*MyInterface)(nil), new(MyObject))\nfunc Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Implements(t, interfaceObject, object, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Implementsf asserts that an object is implemented by the specified interface.\n//\n//\tassert.Implementsf(t, (*MyInterface)(nil), new(MyObject), \"error message %s\", \"formatted\")\nfunc Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Implementsf(t, interfaceObject, object, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// InDelta asserts that the two numerals are within delta of each other.\n//\n//\tassert.InDelta(t, math.Pi, 22/7.0, 0.01)\nfunc InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.InDelta(t, expected, actual, delta, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.\nfunc InDeltaMapValues(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.InDeltaMapValues(t, expected, actual, delta, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.\nfunc InDeltaMapValuesf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.InDeltaMapValuesf(t, expected, actual, delta, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// InDeltaSlice is the same as InDelta, except it compares two slices.\nfunc InDeltaSlice(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.InDeltaSlice(t, expected, actual, delta, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// InDeltaSlicef is the same as InDelta, except it compares two slices.\nfunc InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.InDeltaSlicef(t, expected, actual, delta, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// InDeltaf asserts that the two numerals are within delta of each other.\n//\n//\tassert.InDeltaf(t, math.Pi, 22/7.0, 0.01, \"error message %s\", \"formatted\")\nfunc InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.InDeltaf(t, expected, actual, delta, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// InEpsilon asserts that expected and actual have a relative error less than epsilon\nfunc InEpsilon(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.InEpsilon(t, expected, actual, epsilon, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.\nfunc InEpsilonSlice(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.InEpsilonSlice(t, expected, actual, epsilon, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices.\nfunc InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.InEpsilonSlicef(t, expected, actual, epsilon, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// InEpsilonf asserts that expected and actual have a relative error less than epsilon\nfunc InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.InEpsilonf(t, expected, actual, epsilon, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// IsDecreasing asserts that the collection is decreasing\n//\n//\tassert.IsDecreasing(t, []int{2, 1, 0})\n//\tassert.IsDecreasing(t, []float{2, 1})\n//\tassert.IsDecreasing(t, []string{\"b\", \"a\"})\nfunc IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.IsDecreasing(t, object, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// IsDecreasingf asserts that the collection is decreasing\n//\n//\tassert.IsDecreasingf(t, []int{2, 1, 0}, \"error message %s\", \"formatted\")\n//\tassert.IsDecreasingf(t, []float{2, 1}, \"error message %s\", \"formatted\")\n//\tassert.IsDecreasingf(t, []string{\"b\", \"a\"}, \"error message %s\", \"formatted\")\nfunc IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.IsDecreasingf(t, object, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// IsIncreasing asserts that the collection is increasing\n//\n//\tassert.IsIncreasing(t, []int{1, 2, 3})\n//\tassert.IsIncreasing(t, []float{1, 2})\n//\tassert.IsIncreasing(t, []string{\"a\", \"b\"})\nfunc IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.IsIncreasing(t, object, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// IsIncreasingf asserts that the collection is increasing\n//\n//\tassert.IsIncreasingf(t, []int{1, 2, 3}, \"error message %s\", \"formatted\")\n//\tassert.IsIncreasingf(t, []float{1, 2}, \"error message %s\", \"formatted\")\n//\tassert.IsIncreasingf(t, []string{\"a\", \"b\"}, \"error message %s\", \"formatted\")\nfunc IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.IsIncreasingf(t, object, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// IsNonDecreasing asserts that the collection is not decreasing\n//\n//\tassert.IsNonDecreasing(t, []int{1, 1, 2})\n//\tassert.IsNonDecreasing(t, []float{1, 2})\n//\tassert.IsNonDecreasing(t, []string{\"a\", \"b\"})\nfunc IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.IsNonDecreasing(t, object, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// IsNonDecreasingf asserts that the collection is not decreasing\n//\n//\tassert.IsNonDecreasingf(t, []int{1, 1, 2}, \"error message %s\", \"formatted\")\n//\tassert.IsNonDecreasingf(t, []float{1, 2}, \"error message %s\", \"formatted\")\n//\tassert.IsNonDecreasingf(t, []string{\"a\", \"b\"}, \"error message %s\", \"formatted\")\nfunc IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.IsNonDecreasingf(t, object, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// IsNonIncreasing asserts that the collection is not increasing\n//\n//\tassert.IsNonIncreasing(t, []int{2, 1, 1})\n//\tassert.IsNonIncreasing(t, []float{2, 1})\n//\tassert.IsNonIncreasing(t, []string{\"b\", \"a\"})\nfunc IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.IsNonIncreasing(t, object, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// IsNonIncreasingf asserts that the collection is not increasing\n//\n//\tassert.IsNonIncreasingf(t, []int{2, 1, 1}, \"error message %s\", \"formatted\")\n//\tassert.IsNonIncreasingf(t, []float{2, 1}, \"error message %s\", \"formatted\")\n//\tassert.IsNonIncreasingf(t, []string{\"b\", \"a\"}, \"error message %s\", \"formatted\")\nfunc IsNonIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.IsNonIncreasingf(t, object, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// IsType asserts that the specified objects are of the same type.\nfunc IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.IsType(t, expectedType, object, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// IsTypef asserts that the specified objects are of the same type.\nfunc IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.IsTypef(t, expectedType, object, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// JSONEq asserts that two JSON strings are equivalent.\n//\n//\tassert.JSONEq(t, `{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`)\nfunc JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.JSONEq(t, expected, actual, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// JSONEqf asserts that two JSON strings are equivalent.\n//\n//\tassert.JSONEqf(t, `{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`, \"error message %s\", \"formatted\")\nfunc JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.JSONEqf(t, expected, actual, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Len asserts that the specified object has specific length.\n// Len also fails if the object has a type that len() not accept.\n//\n//\tassert.Len(t, mySlice, 3)\nfunc Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Len(t, object, length, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Lenf asserts that the specified object has specific length.\n// Lenf also fails if the object has a type that len() not accept.\n//\n//\tassert.Lenf(t, mySlice, 3, \"error message %s\", \"formatted\")\nfunc Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Lenf(t, object, length, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Less asserts that the first element is less than the second\n//\n//\tassert.Less(t, 1, 2)\n//\tassert.Less(t, float64(1), float64(2))\n//\tassert.Less(t, \"a\", \"b\")\nfunc Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Less(t, e1, e2, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// LessOrEqual asserts that the first element is less than or equal to the second\n//\n//\tassert.LessOrEqual(t, 1, 2)\n//\tassert.LessOrEqual(t, 2, 2)\n//\tassert.LessOrEqual(t, \"a\", \"b\")\n//\tassert.LessOrEqual(t, \"b\", \"b\")\nfunc LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.LessOrEqual(t, e1, e2, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// LessOrEqualf asserts that the first element is less than or equal to the second\n//\n//\tassert.LessOrEqualf(t, 1, 2, \"error message %s\", \"formatted\")\n//\tassert.LessOrEqualf(t, 2, 2, \"error message %s\", \"formatted\")\n//\tassert.LessOrEqualf(t, \"a\", \"b\", \"error message %s\", \"formatted\")\n//\tassert.LessOrEqualf(t, \"b\", \"b\", \"error message %s\", \"formatted\")\nfunc LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.LessOrEqualf(t, e1, e2, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Lessf asserts that the first element is less than the second\n//\n//\tassert.Lessf(t, 1, 2, \"error message %s\", \"formatted\")\n//\tassert.Lessf(t, float64(1), float64(2), \"error message %s\", \"formatted\")\n//\tassert.Lessf(t, \"a\", \"b\", \"error message %s\", \"formatted\")\nfunc Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Lessf(t, e1, e2, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Negative asserts that the specified element is negative\n//\n//\tassert.Negative(t, -1)\n//\tassert.Negative(t, -1.23)\nfunc Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Negative(t, e, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Negativef asserts that the specified element is negative\n//\n//\tassert.Negativef(t, -1, \"error message %s\", \"formatted\")\n//\tassert.Negativef(t, -1.23, \"error message %s\", \"formatted\")\nfunc Negativef(t TestingT, e interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Negativef(t, e, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Never asserts that the given condition doesn't satisfy in waitFor time,\n// periodically checking the target function each tick.\n//\n//\tassert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond)\nfunc Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Never(t, condition, waitFor, tick, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Neverf asserts that the given condition doesn't satisfy in waitFor time,\n// periodically checking the target function each tick.\n//\n//\tassert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, \"error message %s\", \"formatted\")\nfunc Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Neverf(t, condition, waitFor, tick, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Nil asserts that the specified object is nil.\n//\n//\tassert.Nil(t, err)\nfunc Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Nil(t, object, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Nilf asserts that the specified object is nil.\n//\n//\tassert.Nilf(t, err, \"error message %s\", \"formatted\")\nfunc Nilf(t TestingT, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Nilf(t, object, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NoDirExists checks whether a directory does not exist in the given path.\n// It fails if the path points to an existing _directory_ only.\nfunc NoDirExists(t TestingT, path string, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NoDirExists(t, path, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NoDirExistsf checks whether a directory does not exist in the given path.\n// It fails if the path points to an existing _directory_ only.\nfunc NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NoDirExistsf(t, path, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NoError asserts that a function returned no error (i.e. `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if assert.NoError(t, err) {\n//\t\t   assert.Equal(t, expectedObj, actualObj)\n//\t  }\nfunc NoError(t TestingT, err error, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NoError(t, err, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NoErrorf asserts that a function returned no error (i.e. `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if assert.NoErrorf(t, err, \"error message %s\", \"formatted\") {\n//\t\t   assert.Equal(t, expectedObj, actualObj)\n//\t  }\nfunc NoErrorf(t TestingT, err error, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NoErrorf(t, err, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NoFileExists checks whether a file does not exist in a given path. It fails\n// if the path points to an existing _file_ only.\nfunc NoFileExists(t TestingT, path string, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NoFileExists(t, path, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NoFileExistsf checks whether a file does not exist in a given path. It fails\n// if the path points to an existing _file_ only.\nfunc NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NoFileExistsf(t, path, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//\tassert.NotContains(t, \"Hello World\", \"Earth\")\n//\tassert.NotContains(t, [\"Hello\", \"World\"], \"Earth\")\n//\tassert.NotContains(t, {\"Hello\": \"World\"}, \"Earth\")\nfunc NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotContains(t, s, contains, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//\tassert.NotContainsf(t, \"Hello World\", \"Earth\", \"error message %s\", \"formatted\")\n//\tassert.NotContainsf(t, [\"Hello\", \"World\"], \"Earth\", \"error message %s\", \"formatted\")\n//\tassert.NotContainsf(t, {\"Hello\": \"World\"}, \"Earth\", \"error message %s\", \"formatted\")\nfunc NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotContainsf(t, s, contains, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\tif assert.NotEmpty(t, obj) {\n//\t  assert.Equal(t, \"two\", obj[1])\n//\t}\nfunc NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotEmpty(t, object, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\tif assert.NotEmptyf(t, obj, \"error message %s\", \"formatted\") {\n//\t  assert.Equal(t, \"two\", obj[1])\n//\t}\nfunc NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotEmptyf(t, object, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotEqual asserts that the specified values are NOT equal.\n//\n//\tassert.NotEqual(t, obj1, obj2)\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotEqual(t, expected, actual, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotEqualValues asserts that two objects are not equal even when converted to the same type\n//\n//\tassert.NotEqualValues(t, obj1, obj2)\nfunc NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotEqualValues(t, expected, actual, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotEqualValuesf asserts that two objects are not equal even when converted to the same type\n//\n//\tassert.NotEqualValuesf(t, obj1, obj2, \"error message %s\", \"formatted\")\nfunc NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotEqualValuesf(t, expected, actual, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotEqualf asserts that the specified values are NOT equal.\n//\n//\tassert.NotEqualf(t, obj1, obj2, \"error message %s\", \"formatted\")\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotEqualf(t, expected, actual, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotErrorIs asserts that at none of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc NotErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotErrorIs(t, err, target, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotErrorIsf asserts that at none of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotErrorIsf(t, err, target, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotImplements asserts that an object does not implement the specified interface.\n//\n//\tassert.NotImplements(t, (*MyInterface)(nil), new(MyObject))\nfunc NotImplements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotImplements(t, interfaceObject, object, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotImplementsf asserts that an object does not implement the specified interface.\n//\n//\tassert.NotImplementsf(t, (*MyInterface)(nil), new(MyObject), \"error message %s\", \"formatted\")\nfunc NotImplementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotImplementsf(t, interfaceObject, object, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotNil asserts that the specified object is not nil.\n//\n//\tassert.NotNil(t, err)\nfunc NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotNil(t, object, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotNilf asserts that the specified object is not nil.\n//\n//\tassert.NotNilf(t, err, \"error message %s\", \"formatted\")\nfunc NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotNilf(t, object, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//\tassert.NotPanics(t, func(){ RemainCalm() })\nfunc NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotPanics(t, f, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//\tassert.NotPanicsf(t, func(){ RemainCalm() }, \"error message %s\", \"formatted\")\nfunc NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotPanicsf(t, f, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotRegexp asserts that a specified regexp does not match a string.\n//\n//\tassert.NotRegexp(t, regexp.MustCompile(\"starts\"), \"it's starting\")\n//\tassert.NotRegexp(t, \"^start\", \"it's not starting\")\nfunc NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotRegexp(t, rx, str, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotRegexpf asserts that a specified regexp does not match a string.\n//\n//\tassert.NotRegexpf(t, regexp.MustCompile(\"starts\"), \"it's starting\", \"error message %s\", \"formatted\")\n//\tassert.NotRegexpf(t, \"^start\", \"it's not starting\", \"error message %s\", \"formatted\")\nfunc NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotRegexpf(t, rx, str, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotSame asserts that two pointers do not reference the same object.\n//\n//\tassert.NotSame(t, ptr1, ptr2)\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc NotSame(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotSame(t, expected, actual, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotSamef asserts that two pointers do not reference the same object.\n//\n//\tassert.NotSamef(t, ptr1, ptr2, \"error message %s\", \"formatted\")\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc NotSamef(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotSamef(t, expected, actual, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotSubset asserts that the specified list(array, slice...) or map does NOT\n// contain all elements given in the specified subset list(array, slice...) or\n// map.\n//\n//\tassert.NotSubset(t, [1, 3, 4], [1, 2])\n//\tassert.NotSubset(t, {\"x\": 1, \"y\": 2}, {\"z\": 3})\nfunc NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotSubset(t, list, subset, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotSubsetf asserts that the specified list(array, slice...) or map does NOT\n// contain all elements given in the specified subset list(array, slice...) or\n// map.\n//\n//\tassert.NotSubsetf(t, [1, 3, 4], [1, 2], \"error message %s\", \"formatted\")\n//\tassert.NotSubsetf(t, {\"x\": 1, \"y\": 2}, {\"z\": 3}, \"error message %s\", \"formatted\")\nfunc NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotSubsetf(t, list, subset, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotZero asserts that i is not the zero value for its type.\nfunc NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotZero(t, i, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// NotZerof asserts that i is not the zero value for its type.\nfunc NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.NotZerof(t, i, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Panics asserts that the code inside the specified PanicTestFunc panics.\n//\n//\tassert.Panics(t, func(){ GoCrazy() })\nfunc Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Panics(t, f, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// PanicsWithError asserts that the code inside the specified PanicTestFunc\n// panics, and that the recovered panic value is an error that satisfies the\n// EqualError comparison.\n//\n//\tassert.PanicsWithError(t, \"crazy error\", func(){ GoCrazy() })\nfunc PanicsWithError(t TestingT, errString string, f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.PanicsWithError(t, errString, f, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc\n// panics, and that the recovered panic value is an error that satisfies the\n// EqualError comparison.\n//\n//\tassert.PanicsWithErrorf(t, \"crazy error\", func(){ GoCrazy() }, \"error message %s\", \"formatted\")\nfunc PanicsWithErrorf(t TestingT, errString string, f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.PanicsWithErrorf(t, errString, f, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//\tassert.PanicsWithValue(t, \"crazy error\", func(){ GoCrazy() })\nfunc PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.PanicsWithValue(t, expected, f, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//\tassert.PanicsWithValuef(t, \"crazy error\", func(){ GoCrazy() }, \"error message %s\", \"formatted\")\nfunc PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.PanicsWithValuef(t, expected, f, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Panicsf asserts that the code inside the specified PanicTestFunc panics.\n//\n//\tassert.Panicsf(t, func(){ GoCrazy() }, \"error message %s\", \"formatted\")\nfunc Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Panicsf(t, f, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Positive asserts that the specified element is positive\n//\n//\tassert.Positive(t, 1)\n//\tassert.Positive(t, 1.23)\nfunc Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Positive(t, e, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Positivef asserts that the specified element is positive\n//\n//\tassert.Positivef(t, 1, \"error message %s\", \"formatted\")\n//\tassert.Positivef(t, 1.23, \"error message %s\", \"formatted\")\nfunc Positivef(t TestingT, e interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Positivef(t, e, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Regexp asserts that a specified regexp matches a string.\n//\n//\tassert.Regexp(t, regexp.MustCompile(\"start\"), \"it's starting\")\n//\tassert.Regexp(t, \"start...$\", \"it's not starting\")\nfunc Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Regexp(t, rx, str, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Regexpf asserts that a specified regexp matches a string.\n//\n//\tassert.Regexpf(t, regexp.MustCompile(\"start\"), \"it's starting\", \"error message %s\", \"formatted\")\n//\tassert.Regexpf(t, \"start...$\", \"it's not starting\", \"error message %s\", \"formatted\")\nfunc Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Regexpf(t, rx, str, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Same asserts that two pointers reference the same object.\n//\n//\tassert.Same(t, ptr1, ptr2)\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc Same(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Same(t, expected, actual, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Samef asserts that two pointers reference the same object.\n//\n//\tassert.Samef(t, ptr1, ptr2, \"error message %s\", \"formatted\")\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc Samef(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Samef(t, expected, actual, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Subset asserts that the specified list(array, slice...) or map contains all\n// elements given in the specified subset list(array, slice...) or map.\n//\n//\tassert.Subset(t, [1, 2, 3], [1, 2])\n//\tassert.Subset(t, {\"x\": 1, \"y\": 2}, {\"x\": 1})\nfunc Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Subset(t, list, subset, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Subsetf asserts that the specified list(array, slice...) or map contains all\n// elements given in the specified subset list(array, slice...) or map.\n//\n//\tassert.Subsetf(t, [1, 2, 3], [1, 2], \"error message %s\", \"formatted\")\n//\tassert.Subsetf(t, {\"x\": 1, \"y\": 2}, {\"x\": 1}, \"error message %s\", \"formatted\")\nfunc Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Subsetf(t, list, subset, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// True asserts that the specified value is true.\n//\n//\tassert.True(t, myBool)\nfunc True(t TestingT, value bool, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.True(t, value, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Truef asserts that the specified value is true.\n//\n//\tassert.Truef(t, myBool, \"error message %s\", \"formatted\")\nfunc Truef(t TestingT, value bool, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Truef(t, value, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// WithinDuration asserts that the two times are within duration delta of each other.\n//\n//\tassert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)\nfunc WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.WithinDuration(t, expected, actual, delta, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// WithinDurationf asserts that the two times are within duration delta of each other.\n//\n//\tassert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, \"error message %s\", \"formatted\")\nfunc WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.WithinDurationf(t, expected, actual, delta, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// WithinRange asserts that a time is within a time range (inclusive).\n//\n//\tassert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second))\nfunc WithinRange(t TestingT, actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.WithinRange(t, actual, start, end, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// WithinRangef asserts that a time is within a time range (inclusive).\n//\n//\tassert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), \"error message %s\", \"formatted\")\nfunc WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.WithinRangef(t, actual, start, end, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Zero asserts that i is the zero value for its type.\nfunc Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Zero(t, i, msgAndArgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\n// Zerof asserts that i is the zero value for its type.\nfunc Zerof(t TestingT, i interface{}, msg string, args ...interface{}) {\n\tif h, ok := t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tif assert.Zerof(t, i, msg, args...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n"
  },
  {
    "path": "internal/testify/require/require.go.tmpl",
    "content": "{{.Comment}}\nfunc {{.DocInfo.Name}}(t TestingT, {{.Params}}) {\n\tif h, ok := t.(tHelper); ok { h.Helper() }\n\tif assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { return }\n\tt.FailNow()\n}\n"
  },
  {
    "path": "internal/testify/require/require_forward.go",
    "content": "// Code generated with github.com/expr-lang/expr/internal/_codegen; DO NOT EDIT.\n\npackage require\n\nimport (\n\thttp \"net/http\"\n\turl \"net/url\"\n\ttime \"time\"\n\n\tassert \"github.com/expr-lang/expr/internal/testify/assert\"\n)\n\n// Condition uses a Comparison to assert a complex condition.\nfunc (a *Assertions) Condition(comp assert.Comparison, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tCondition(a.t, comp, msgAndArgs...)\n}\n\n// Conditionf uses a Comparison to assert a complex condition.\nfunc (a *Assertions) Conditionf(comp assert.Comparison, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tConditionf(a.t, comp, msg, args...)\n}\n\n// Contains asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//\ta.Contains(\"Hello World\", \"World\")\n//\ta.Contains([\"Hello\", \"World\"], \"World\")\n//\ta.Contains({\"Hello\": \"World\"}, \"Hello\")\nfunc (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tContains(a.t, s, contains, msgAndArgs...)\n}\n\n// Containsf asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//\ta.Containsf(\"Hello World\", \"World\", \"error message %s\", \"formatted\")\n//\ta.Containsf([\"Hello\", \"World\"], \"World\", \"error message %s\", \"formatted\")\n//\ta.Containsf({\"Hello\": \"World\"}, \"Hello\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tContainsf(a.t, s, contains, msg, args...)\n}\n\n// DirExists checks whether a directory exists in the given path. It also fails\n// if the path is a file rather a directory or there is an error checking whether it exists.\nfunc (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tDirExists(a.t, path, msgAndArgs...)\n}\n\n// DirExistsf checks whether a directory exists in the given path. It also fails\n// if the path is a file rather a directory or there is an error checking whether it exists.\nfunc (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tDirExistsf(a.t, path, msg, args...)\n}\n\n// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified\n// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,\n// the number of appearances of each of them in both lists should match.\n//\n// a.ElementsMatch([1, 3, 2, 3], [1, 3, 3, 2])\nfunc (a *Assertions) ElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tElementsMatch(a.t, listA, listB, msgAndArgs...)\n}\n\n// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified\n// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,\n// the number of appearances of each of them in both lists should match.\n//\n// a.ElementsMatchf([1, 3, 2, 3], [1, 3, 3, 2], \"error message %s\", \"formatted\")\nfunc (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tElementsMatchf(a.t, listA, listB, msg, args...)\n}\n\n// Empty asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\ta.Empty(obj)\nfunc (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEmpty(a.t, object, msgAndArgs...)\n}\n\n// Emptyf asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\ta.Emptyf(obj, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEmptyf(a.t, object, msg, args...)\n}\n\n// Equal asserts that two objects are equal.\n//\n//\ta.Equal(123, 123)\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEqual(a.t, expected, actual, msgAndArgs...)\n}\n\n// EqualError asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//\tactualObj, err := SomeFunction()\n//\ta.EqualError(err,  expectedErrorString)\nfunc (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEqualError(a.t, theError, errString, msgAndArgs...)\n}\n\n// EqualErrorf asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//\tactualObj, err := SomeFunction()\n//\ta.EqualErrorf(err,  expectedErrorString, \"error message %s\", \"formatted\")\nfunc (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEqualErrorf(a.t, theError, errString, msg, args...)\n}\n\n// EqualExportedValues asserts that the types of two objects are equal and their public\n// fields are also equal. This is useful for comparing structs that have private fields\n// that could potentially differ.\n//\n//\t type S struct {\n//\t\tExported     \tint\n//\t\tnotExported   \tint\n//\t }\n//\t a.EqualExportedValues(S{1, 2}, S{1, 3}) => true\n//\t a.EqualExportedValues(S{1, 2}, S{2, 3}) => false\nfunc (a *Assertions) EqualExportedValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEqualExportedValues(a.t, expected, actual, msgAndArgs...)\n}\n\n// EqualExportedValuesf asserts that the types of two objects are equal and their public\n// fields are also equal. This is useful for comparing structs that have private fields\n// that could potentially differ.\n//\n//\t type S struct {\n//\t\tExported     \tint\n//\t\tnotExported   \tint\n//\t }\n//\t a.EqualExportedValuesf(S{1, 2}, S{1, 3}, \"error message %s\", \"formatted\") => true\n//\t a.EqualExportedValuesf(S{1, 2}, S{2, 3}, \"error message %s\", \"formatted\") => false\nfunc (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEqualExportedValuesf(a.t, expected, actual, msg, args...)\n}\n\n// EqualValues asserts that two objects are equal or convertible to the same types\n// and equal.\n//\n//\ta.EqualValues(uint32(123), int32(123))\nfunc (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEqualValues(a.t, expected, actual, msgAndArgs...)\n}\n\n// EqualValuesf asserts that two objects are equal or convertible to the same types\n// and equal.\n//\n//\ta.EqualValuesf(uint32(123), int32(123), \"error message %s\", \"formatted\")\nfunc (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEqualValuesf(a.t, expected, actual, msg, args...)\n}\n\n// Equalf asserts that two objects are equal.\n//\n//\ta.Equalf(123, 123, \"error message %s\", \"formatted\")\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEqualf(a.t, expected, actual, msg, args...)\n}\n\n// Error asserts that a function returned an error (i.e. not `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if a.Error(err) {\n//\t\t   assert.Equal(t, expectedError, err)\n//\t  }\nfunc (a *Assertions) Error(err error, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tError(a.t, err, msgAndArgs...)\n}\n\n// ErrorAs asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value.\n// This is a wrapper for errors.As.\nfunc (a *Assertions) ErrorAs(err error, target interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tErrorAs(a.t, err, target, msgAndArgs...)\n}\n\n// ErrorAsf asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value.\n// This is a wrapper for errors.As.\nfunc (a *Assertions) ErrorAsf(err error, target interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tErrorAsf(a.t, err, target, msg, args...)\n}\n\n// ErrorContains asserts that a function returned an error (i.e. not `nil`)\n// and that the error contains the specified substring.\n//\n//\tactualObj, err := SomeFunction()\n//\ta.ErrorContains(err,  expectedErrorSubString)\nfunc (a *Assertions) ErrorContains(theError error, contains string, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tErrorContains(a.t, theError, contains, msgAndArgs...)\n}\n\n// ErrorContainsf asserts that a function returned an error (i.e. not `nil`)\n// and that the error contains the specified substring.\n//\n//\tactualObj, err := SomeFunction()\n//\ta.ErrorContainsf(err,  expectedErrorSubString, \"error message %s\", \"formatted\")\nfunc (a *Assertions) ErrorContainsf(theError error, contains string, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tErrorContainsf(a.t, theError, contains, msg, args...)\n}\n\n// ErrorIs asserts that at least one of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tErrorIs(a.t, err, target, msgAndArgs...)\n}\n\n// ErrorIsf asserts that at least one of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc (a *Assertions) ErrorIsf(err error, target error, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tErrorIsf(a.t, err, target, msg, args...)\n}\n\n// Errorf asserts that a function returned an error (i.e. not `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if a.Errorf(err, \"error message %s\", \"formatted\") {\n//\t\t   assert.Equal(t, expectedErrorf, err)\n//\t  }\nfunc (a *Assertions) Errorf(err error, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tErrorf(a.t, err, msg, args...)\n}\n\n// Eventually asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick.\n//\n//\ta.Eventually(func() bool { return true; }, time.Second, 10*time.Millisecond)\nfunc (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEventually(a.t, condition, waitFor, tick, msgAndArgs...)\n}\n\n// EventuallyWithT asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick. In contrast to Eventually,\n// it supplies a CollectT to the condition function, so that the condition\n// function can use the CollectT to call other assertions.\n// The condition is considered \"met\" if no errors are raised in a tick.\n// The supplied CollectT collects all errors from one tick (if there are any).\n// If the condition is not met before waitFor, the collected errors of\n// the last tick are copied to t.\n//\n//\texternalValue := false\n//\tgo func() {\n//\t\ttime.Sleep(8*time.Second)\n//\t\texternalValue = true\n//\t}()\n//\ta.EventuallyWithT(func(c *assert.CollectT) {\n//\t\t// add assertions as needed; any assertion failure will fail the current tick\n//\t\tassert.True(c, externalValue, \"expected 'externalValue' to be true\")\n//\t}, 10*time.Second, 1*time.Second, \"external state has not changed to 'true'; still false\")\nfunc (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEventuallyWithT(a.t, condition, waitFor, tick, msgAndArgs...)\n}\n\n// EventuallyWithTf asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick. In contrast to Eventually,\n// it supplies a CollectT to the condition function, so that the condition\n// function can use the CollectT to call other assertions.\n// The condition is considered \"met\" if no errors are raised in a tick.\n// The supplied CollectT collects all errors from one tick (if there are any).\n// If the condition is not met before waitFor, the collected errors of\n// the last tick are copied to t.\n//\n//\texternalValue := false\n//\tgo func() {\n//\t\ttime.Sleep(8*time.Second)\n//\t\texternalValue = true\n//\t}()\n//\ta.EventuallyWithTf(func(c *assert.CollectT, \"error message %s\", \"formatted\") {\n//\t\t// add assertions as needed; any assertion failure will fail the current tick\n//\t\tassert.True(c, externalValue, \"expected 'externalValue' to be true\")\n//\t}, 10*time.Second, 1*time.Second, \"external state has not changed to 'true'; still false\")\nfunc (a *Assertions) EventuallyWithTf(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEventuallyWithTf(a.t, condition, waitFor, tick, msg, args...)\n}\n\n// Eventuallyf asserts that given condition will be met in waitFor time,\n// periodically checking target function each tick.\n//\n//\ta.Eventuallyf(func() bool { return true; }, time.Second, 10*time.Millisecond, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Eventuallyf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tEventuallyf(a.t, condition, waitFor, tick, msg, args...)\n}\n\n// Exactly asserts that two objects are equal in value and type.\n//\n//\ta.Exactly(int32(123), int64(123))\nfunc (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tExactly(a.t, expected, actual, msgAndArgs...)\n}\n\n// Exactlyf asserts that two objects are equal in value and type.\n//\n//\ta.Exactlyf(int32(123), int64(123), \"error message %s\", \"formatted\")\nfunc (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tExactlyf(a.t, expected, actual, msg, args...)\n}\n\n// Fail reports a failure through\nfunc (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tFail(a.t, failureMessage, msgAndArgs...)\n}\n\n// FailNow fails test\nfunc (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tFailNow(a.t, failureMessage, msgAndArgs...)\n}\n\n// FailNowf fails test\nfunc (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tFailNowf(a.t, failureMessage, msg, args...)\n}\n\n// Failf reports a failure through\nfunc (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tFailf(a.t, failureMessage, msg, args...)\n}\n\n// False asserts that the specified value is false.\n//\n//\ta.False(myBool)\nfunc (a *Assertions) False(value bool, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tFalse(a.t, value, msgAndArgs...)\n}\n\n// Falsef asserts that the specified value is false.\n//\n//\ta.Falsef(myBool, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Falsef(value bool, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tFalsef(a.t, value, msg, args...)\n}\n\n// FileExists checks whether a file exists in the given path. It also fails if\n// the path points to a directory or there is an error when trying to check the file.\nfunc (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tFileExists(a.t, path, msgAndArgs...)\n}\n\n// FileExistsf checks whether a file exists in the given path. It also fails if\n// the path points to a directory or there is an error when trying to check the file.\nfunc (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tFileExistsf(a.t, path, msg, args...)\n}\n\n// Greater asserts that the first element is greater than the second\n//\n//\ta.Greater(2, 1)\n//\ta.Greater(float64(2), float64(1))\n//\ta.Greater(\"b\", \"a\")\nfunc (a *Assertions) Greater(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tGreater(a.t, e1, e2, msgAndArgs...)\n}\n\n// GreaterOrEqual asserts that the first element is greater than or equal to the second\n//\n//\ta.GreaterOrEqual(2, 1)\n//\ta.GreaterOrEqual(2, 2)\n//\ta.GreaterOrEqual(\"b\", \"a\")\n//\ta.GreaterOrEqual(\"b\", \"b\")\nfunc (a *Assertions) GreaterOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tGreaterOrEqual(a.t, e1, e2, msgAndArgs...)\n}\n\n// GreaterOrEqualf asserts that the first element is greater than or equal to the second\n//\n//\ta.GreaterOrEqualf(2, 1, \"error message %s\", \"formatted\")\n//\ta.GreaterOrEqualf(2, 2, \"error message %s\", \"formatted\")\n//\ta.GreaterOrEqualf(\"b\", \"a\", \"error message %s\", \"formatted\")\n//\ta.GreaterOrEqualf(\"b\", \"b\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tGreaterOrEqualf(a.t, e1, e2, msg, args...)\n}\n\n// Greaterf asserts that the first element is greater than the second\n//\n//\ta.Greaterf(2, 1, \"error message %s\", \"formatted\")\n//\ta.Greaterf(float64(2), float64(1), \"error message %s\", \"formatted\")\n//\ta.Greaterf(\"b\", \"a\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tGreaterf(a.t, e1, e2, msg, args...)\n}\n\n// HTTPBodyContains asserts that a specified handler returns a\n// body that contains a string.\n//\n//\ta.HTTPBodyContains(myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tHTTPBodyContains(a.t, handler, method, url, values, str, msgAndArgs...)\n}\n\n// HTTPBodyContainsf asserts that a specified handler returns a\n// body that contains a string.\n//\n//\ta.HTTPBodyContainsf(myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tHTTPBodyContainsf(a.t, handler, method, url, values, str, msg, args...)\n}\n\n// HTTPBodyNotContains asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//\ta.HTTPBodyNotContains(myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tHTTPBodyNotContains(a.t, handler, method, url, values, str, msgAndArgs...)\n}\n\n// HTTPBodyNotContainsf asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//\ta.HTTPBodyNotContainsf(myHandler, \"GET\", \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tHTTPBodyNotContainsf(a.t, handler, method, url, values, str, msg, args...)\n}\n\n// HTTPError asserts that a specified handler returns an error status code.\n//\n//\ta.HTTPError(myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tHTTPError(a.t, handler, method, url, values, msgAndArgs...)\n}\n\n// HTTPErrorf asserts that a specified handler returns an error status code.\n//\n//\ta.HTTPErrorf(myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tHTTPErrorf(a.t, handler, method, url, values, msg, args...)\n}\n\n// HTTPRedirect asserts that a specified handler returns a redirect status code.\n//\n//\ta.HTTPRedirect(myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tHTTPRedirect(a.t, handler, method, url, values, msgAndArgs...)\n}\n\n// HTTPRedirectf asserts that a specified handler returns a redirect status code.\n//\n//\ta.HTTPRedirectf(myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tHTTPRedirectf(a.t, handler, method, url, values, msg, args...)\n}\n\n// HTTPStatusCode asserts that a specified handler returns a specified status code.\n//\n//\ta.HTTPStatusCode(myHandler, \"GET\", \"/notImplemented\", nil, 501)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tHTTPStatusCode(a.t, handler, method, url, values, statuscode, msgAndArgs...)\n}\n\n// HTTPStatusCodef asserts that a specified handler returns a specified status code.\n//\n//\ta.HTTPStatusCodef(myHandler, \"GET\", \"/notImplemented\", nil, 501, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tHTTPStatusCodef(a.t, handler, method, url, values, statuscode, msg, args...)\n}\n\n// HTTPSuccess asserts that a specified handler returns a success status code.\n//\n//\ta.HTTPSuccess(myHandler, \"POST\", \"http://www.google.com\", nil)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tHTTPSuccess(a.t, handler, method, url, values, msgAndArgs...)\n}\n\n// HTTPSuccessf asserts that a specified handler returns a success status code.\n//\n//\ta.HTTPSuccessf(myHandler, \"POST\", \"http://www.google.com\", nil, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tHTTPSuccessf(a.t, handler, method, url, values, msg, args...)\n}\n\n// Implements asserts that an object is implemented by the specified interface.\n//\n//\ta.Implements((*MyInterface)(nil), new(MyObject))\nfunc (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tImplements(a.t, interfaceObject, object, msgAndArgs...)\n}\n\n// Implementsf asserts that an object is implemented by the specified interface.\n//\n//\ta.Implementsf((*MyInterface)(nil), new(MyObject), \"error message %s\", \"formatted\")\nfunc (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tImplementsf(a.t, interfaceObject, object, msg, args...)\n}\n\n// InDelta asserts that the two numerals are within delta of each other.\n//\n//\ta.InDelta(math.Pi, 22/7.0, 0.01)\nfunc (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tInDelta(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.\nfunc (a *Assertions) InDeltaMapValues(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tInDeltaMapValues(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.\nfunc (a *Assertions) InDeltaMapValuesf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tInDeltaMapValuesf(a.t, expected, actual, delta, msg, args...)\n}\n\n// InDeltaSlice is the same as InDelta, except it compares two slices.\nfunc (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tInDeltaSlice(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// InDeltaSlicef is the same as InDelta, except it compares two slices.\nfunc (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tInDeltaSlicef(a.t, expected, actual, delta, msg, args...)\n}\n\n// InDeltaf asserts that the two numerals are within delta of each other.\n//\n//\ta.InDeltaf(math.Pi, 22/7.0, 0.01, \"error message %s\", \"formatted\")\nfunc (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tInDeltaf(a.t, expected, actual, delta, msg, args...)\n}\n\n// InEpsilon asserts that expected and actual have a relative error less than epsilon\nfunc (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tInEpsilon(a.t, expected, actual, epsilon, msgAndArgs...)\n}\n\n// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.\nfunc (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tInEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...)\n}\n\n// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices.\nfunc (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tInEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...)\n}\n\n// InEpsilonf asserts that expected and actual have a relative error less than epsilon\nfunc (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tInEpsilonf(a.t, expected, actual, epsilon, msg, args...)\n}\n\n// IsDecreasing asserts that the collection is decreasing\n//\n//\ta.IsDecreasing([]int{2, 1, 0})\n//\ta.IsDecreasing([]float{2, 1})\n//\ta.IsDecreasing([]string{\"b\", \"a\"})\nfunc (a *Assertions) IsDecreasing(object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tIsDecreasing(a.t, object, msgAndArgs...)\n}\n\n// IsDecreasingf asserts that the collection is decreasing\n//\n//\ta.IsDecreasingf([]int{2, 1, 0}, \"error message %s\", \"formatted\")\n//\ta.IsDecreasingf([]float{2, 1}, \"error message %s\", \"formatted\")\n//\ta.IsDecreasingf([]string{\"b\", \"a\"}, \"error message %s\", \"formatted\")\nfunc (a *Assertions) IsDecreasingf(object interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tIsDecreasingf(a.t, object, msg, args...)\n}\n\n// IsIncreasing asserts that the collection is increasing\n//\n//\ta.IsIncreasing([]int{1, 2, 3})\n//\ta.IsIncreasing([]float{1, 2})\n//\ta.IsIncreasing([]string{\"a\", \"b\"})\nfunc (a *Assertions) IsIncreasing(object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tIsIncreasing(a.t, object, msgAndArgs...)\n}\n\n// IsIncreasingf asserts that the collection is increasing\n//\n//\ta.IsIncreasingf([]int{1, 2, 3}, \"error message %s\", \"formatted\")\n//\ta.IsIncreasingf([]float{1, 2}, \"error message %s\", \"formatted\")\n//\ta.IsIncreasingf([]string{\"a\", \"b\"}, \"error message %s\", \"formatted\")\nfunc (a *Assertions) IsIncreasingf(object interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tIsIncreasingf(a.t, object, msg, args...)\n}\n\n// IsNonDecreasing asserts that the collection is not decreasing\n//\n//\ta.IsNonDecreasing([]int{1, 1, 2})\n//\ta.IsNonDecreasing([]float{1, 2})\n//\ta.IsNonDecreasing([]string{\"a\", \"b\"})\nfunc (a *Assertions) IsNonDecreasing(object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tIsNonDecreasing(a.t, object, msgAndArgs...)\n}\n\n// IsNonDecreasingf asserts that the collection is not decreasing\n//\n//\ta.IsNonDecreasingf([]int{1, 1, 2}, \"error message %s\", \"formatted\")\n//\ta.IsNonDecreasingf([]float{1, 2}, \"error message %s\", \"formatted\")\n//\ta.IsNonDecreasingf([]string{\"a\", \"b\"}, \"error message %s\", \"formatted\")\nfunc (a *Assertions) IsNonDecreasingf(object interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tIsNonDecreasingf(a.t, object, msg, args...)\n}\n\n// IsNonIncreasing asserts that the collection is not increasing\n//\n//\ta.IsNonIncreasing([]int{2, 1, 1})\n//\ta.IsNonIncreasing([]float{2, 1})\n//\ta.IsNonIncreasing([]string{\"b\", \"a\"})\nfunc (a *Assertions) IsNonIncreasing(object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tIsNonIncreasing(a.t, object, msgAndArgs...)\n}\n\n// IsNonIncreasingf asserts that the collection is not increasing\n//\n//\ta.IsNonIncreasingf([]int{2, 1, 1}, \"error message %s\", \"formatted\")\n//\ta.IsNonIncreasingf([]float{2, 1}, \"error message %s\", \"formatted\")\n//\ta.IsNonIncreasingf([]string{\"b\", \"a\"}, \"error message %s\", \"formatted\")\nfunc (a *Assertions) IsNonIncreasingf(object interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tIsNonIncreasingf(a.t, object, msg, args...)\n}\n\n// IsType asserts that the specified objects are of the same type.\nfunc (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tIsType(a.t, expectedType, object, msgAndArgs...)\n}\n\n// IsTypef asserts that the specified objects are of the same type.\nfunc (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tIsTypef(a.t, expectedType, object, msg, args...)\n}\n\n// JSONEq asserts that two JSON strings are equivalent.\n//\n//\ta.JSONEq(`{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`)\nfunc (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tJSONEq(a.t, expected, actual, msgAndArgs...)\n}\n\n// JSONEqf asserts that two JSON strings are equivalent.\n//\n//\ta.JSONEqf(`{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`, \"error message %s\", \"formatted\")\nfunc (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tJSONEqf(a.t, expected, actual, msg, args...)\n}\n\n// Len asserts that the specified object has specific length.\n// Len also fails if the object has a type that len() not accept.\n//\n//\ta.Len(mySlice, 3)\nfunc (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tLen(a.t, object, length, msgAndArgs...)\n}\n\n// Lenf asserts that the specified object has specific length.\n// Lenf also fails if the object has a type that len() not accept.\n//\n//\ta.Lenf(mySlice, 3, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tLenf(a.t, object, length, msg, args...)\n}\n\n// Less asserts that the first element is less than the second\n//\n//\ta.Less(1, 2)\n//\ta.Less(float64(1), float64(2))\n//\ta.Less(\"a\", \"b\")\nfunc (a *Assertions) Less(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tLess(a.t, e1, e2, msgAndArgs...)\n}\n\n// LessOrEqual asserts that the first element is less than or equal to the second\n//\n//\ta.LessOrEqual(1, 2)\n//\ta.LessOrEqual(2, 2)\n//\ta.LessOrEqual(\"a\", \"b\")\n//\ta.LessOrEqual(\"b\", \"b\")\nfunc (a *Assertions) LessOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tLessOrEqual(a.t, e1, e2, msgAndArgs...)\n}\n\n// LessOrEqualf asserts that the first element is less than or equal to the second\n//\n//\ta.LessOrEqualf(1, 2, \"error message %s\", \"formatted\")\n//\ta.LessOrEqualf(2, 2, \"error message %s\", \"formatted\")\n//\ta.LessOrEqualf(\"a\", \"b\", \"error message %s\", \"formatted\")\n//\ta.LessOrEqualf(\"b\", \"b\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tLessOrEqualf(a.t, e1, e2, msg, args...)\n}\n\n// Lessf asserts that the first element is less than the second\n//\n//\ta.Lessf(1, 2, \"error message %s\", \"formatted\")\n//\ta.Lessf(float64(1), float64(2), \"error message %s\", \"formatted\")\n//\ta.Lessf(\"a\", \"b\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tLessf(a.t, e1, e2, msg, args...)\n}\n\n// Negative asserts that the specified element is negative\n//\n//\ta.Negative(-1)\n//\ta.Negative(-1.23)\nfunc (a *Assertions) Negative(e interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNegative(a.t, e, msgAndArgs...)\n}\n\n// Negativef asserts that the specified element is negative\n//\n//\ta.Negativef(-1, \"error message %s\", \"formatted\")\n//\ta.Negativef(-1.23, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Negativef(e interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNegativef(a.t, e, msg, args...)\n}\n\n// Never asserts that the given condition doesn't satisfy in waitFor time,\n// periodically checking the target function each tick.\n//\n//\ta.Never(func() bool { return false; }, time.Second, 10*time.Millisecond)\nfunc (a *Assertions) Never(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNever(a.t, condition, waitFor, tick, msgAndArgs...)\n}\n\n// Neverf asserts that the given condition doesn't satisfy in waitFor time,\n// periodically checking the target function each tick.\n//\n//\ta.Neverf(func() bool { return false; }, time.Second, 10*time.Millisecond, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Neverf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNeverf(a.t, condition, waitFor, tick, msg, args...)\n}\n\n// Nil asserts that the specified object is nil.\n//\n//\ta.Nil(err)\nfunc (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNil(a.t, object, msgAndArgs...)\n}\n\n// Nilf asserts that the specified object is nil.\n//\n//\ta.Nilf(err, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNilf(a.t, object, msg, args...)\n}\n\n// NoDirExists checks whether a directory does not exist in the given path.\n// It fails if the path points to an existing _directory_ only.\nfunc (a *Assertions) NoDirExists(path string, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNoDirExists(a.t, path, msgAndArgs...)\n}\n\n// NoDirExistsf checks whether a directory does not exist in the given path.\n// It fails if the path points to an existing _directory_ only.\nfunc (a *Assertions) NoDirExistsf(path string, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNoDirExistsf(a.t, path, msg, args...)\n}\n\n// NoError asserts that a function returned no error (i.e. `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if a.NoError(err) {\n//\t\t   assert.Equal(t, expectedObj, actualObj)\n//\t  }\nfunc (a *Assertions) NoError(err error, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNoError(a.t, err, msgAndArgs...)\n}\n\n// NoErrorf asserts that a function returned no error (i.e. `nil`).\n//\n//\t  actualObj, err := SomeFunction()\n//\t  if a.NoErrorf(err, \"error message %s\", \"formatted\") {\n//\t\t   assert.Equal(t, expectedObj, actualObj)\n//\t  }\nfunc (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNoErrorf(a.t, err, msg, args...)\n}\n\n// NoFileExists checks whether a file does not exist in a given path. It fails\n// if the path points to an existing _file_ only.\nfunc (a *Assertions) NoFileExists(path string, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNoFileExists(a.t, path, msgAndArgs...)\n}\n\n// NoFileExistsf checks whether a file does not exist in a given path. It fails\n// if the path points to an existing _file_ only.\nfunc (a *Assertions) NoFileExistsf(path string, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNoFileExistsf(a.t, path, msg, args...)\n}\n\n// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//\ta.NotContains(\"Hello World\", \"Earth\")\n//\ta.NotContains([\"Hello\", \"World\"], \"Earth\")\n//\ta.NotContains({\"Hello\": \"World\"}, \"Earth\")\nfunc (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotContains(a.t, s, contains, msgAndArgs...)\n}\n\n// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//\ta.NotContainsf(\"Hello World\", \"Earth\", \"error message %s\", \"formatted\")\n//\ta.NotContainsf([\"Hello\", \"World\"], \"Earth\", \"error message %s\", \"formatted\")\n//\ta.NotContainsf({\"Hello\": \"World\"}, \"Earth\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotContainsf(a.t, s, contains, msg, args...)\n}\n\n// NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\tif a.NotEmpty(obj) {\n//\t  assert.Equal(t, \"two\", obj[1])\n//\t}\nfunc (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotEmpty(a.t, object, msgAndArgs...)\n}\n\n// NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//\tif a.NotEmptyf(obj, \"error message %s\", \"formatted\") {\n//\t  assert.Equal(t, \"two\", obj[1])\n//\t}\nfunc (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotEmptyf(a.t, object, msg, args...)\n}\n\n// NotEqual asserts that the specified values are NOT equal.\n//\n//\ta.NotEqual(obj1, obj2)\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotEqual(a.t, expected, actual, msgAndArgs...)\n}\n\n// NotEqualValues asserts that two objects are not equal even when converted to the same type\n//\n//\ta.NotEqualValues(obj1, obj2)\nfunc (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotEqualValues(a.t, expected, actual, msgAndArgs...)\n}\n\n// NotEqualValuesf asserts that two objects are not equal even when converted to the same type\n//\n//\ta.NotEqualValuesf(obj1, obj2, \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotEqualValuesf(a.t, expected, actual, msg, args...)\n}\n\n// NotEqualf asserts that the specified values are NOT equal.\n//\n//\ta.NotEqualf(obj1, obj2, \"error message %s\", \"formatted\")\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotEqualf(a.t, expected, actual, msg, args...)\n}\n\n// NotErrorIs asserts that at none of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotErrorIs(a.t, err, target, msgAndArgs...)\n}\n\n// NotErrorIsf asserts that at none of the errors in err's chain matches target.\n// This is a wrapper for errors.Is.\nfunc (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotErrorIsf(a.t, err, target, msg, args...)\n}\n\n// NotImplements asserts that an object does not implement the specified interface.\n//\n//\ta.NotImplements((*MyInterface)(nil), new(MyObject))\nfunc (a *Assertions) NotImplements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotImplements(a.t, interfaceObject, object, msgAndArgs...)\n}\n\n// NotImplementsf asserts that an object does not implement the specified interface.\n//\n//\ta.NotImplementsf((*MyInterface)(nil), new(MyObject), \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotImplementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotImplementsf(a.t, interfaceObject, object, msg, args...)\n}\n\n// NotNil asserts that the specified object is not nil.\n//\n//\ta.NotNil(err)\nfunc (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotNil(a.t, object, msgAndArgs...)\n}\n\n// NotNilf asserts that the specified object is not nil.\n//\n//\ta.NotNilf(err, \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotNilf(a.t, object, msg, args...)\n}\n\n// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//\ta.NotPanics(func(){ RemainCalm() })\nfunc (a *Assertions) NotPanics(f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotPanics(a.t, f, msgAndArgs...)\n}\n\n// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//\ta.NotPanicsf(func(){ RemainCalm() }, \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotPanicsf(f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotPanicsf(a.t, f, msg, args...)\n}\n\n// NotRegexp asserts that a specified regexp does not match a string.\n//\n//\ta.NotRegexp(regexp.MustCompile(\"starts\"), \"it's starting\")\n//\ta.NotRegexp(\"^start\", \"it's not starting\")\nfunc (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotRegexp(a.t, rx, str, msgAndArgs...)\n}\n\n// NotRegexpf asserts that a specified regexp does not match a string.\n//\n//\ta.NotRegexpf(regexp.MustCompile(\"starts\"), \"it's starting\", \"error message %s\", \"formatted\")\n//\ta.NotRegexpf(\"^start\", \"it's not starting\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotRegexpf(a.t, rx, str, msg, args...)\n}\n\n// NotSame asserts that two pointers do not reference the same object.\n//\n//\ta.NotSame(ptr1, ptr2)\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc (a *Assertions) NotSame(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotSame(a.t, expected, actual, msgAndArgs...)\n}\n\n// NotSamef asserts that two pointers do not reference the same object.\n//\n//\ta.NotSamef(ptr1, ptr2, \"error message %s\", \"formatted\")\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc (a *Assertions) NotSamef(expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotSamef(a.t, expected, actual, msg, args...)\n}\n\n// NotSubset asserts that the specified list(array, slice...) or map does NOT\n// contain all elements given in the specified subset list(array, slice...) or\n// map.\n//\n//\ta.NotSubset([1, 3, 4], [1, 2])\n//\ta.NotSubset({\"x\": 1, \"y\": 2}, {\"z\": 3})\nfunc (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotSubset(a.t, list, subset, msgAndArgs...)\n}\n\n// NotSubsetf asserts that the specified list(array, slice...) or map does NOT\n// contain all elements given in the specified subset list(array, slice...) or\n// map.\n//\n//\ta.NotSubsetf([1, 3, 4], [1, 2], \"error message %s\", \"formatted\")\n//\ta.NotSubsetf({\"x\": 1, \"y\": 2}, {\"z\": 3}, \"error message %s\", \"formatted\")\nfunc (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotSubsetf(a.t, list, subset, msg, args...)\n}\n\n// NotZero asserts that i is not the zero value for its type.\nfunc (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotZero(a.t, i, msgAndArgs...)\n}\n\n// NotZerof asserts that i is not the zero value for its type.\nfunc (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tNotZerof(a.t, i, msg, args...)\n}\n\n// Panics asserts that the code inside the specified PanicTestFunc panics.\n//\n//\ta.Panics(func(){ GoCrazy() })\nfunc (a *Assertions) Panics(f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tPanics(a.t, f, msgAndArgs...)\n}\n\n// PanicsWithError asserts that the code inside the specified PanicTestFunc\n// panics, and that the recovered panic value is an error that satisfies the\n// EqualError comparison.\n//\n//\ta.PanicsWithError(\"crazy error\", func(){ GoCrazy() })\nfunc (a *Assertions) PanicsWithError(errString string, f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tPanicsWithError(a.t, errString, f, msgAndArgs...)\n}\n\n// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc\n// panics, and that the recovered panic value is an error that satisfies the\n// EqualError comparison.\n//\n//\ta.PanicsWithErrorf(\"crazy error\", func(){ GoCrazy() }, \"error message %s\", \"formatted\")\nfunc (a *Assertions) PanicsWithErrorf(errString string, f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tPanicsWithErrorf(a.t, errString, f, msg, args...)\n}\n\n// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//\ta.PanicsWithValue(\"crazy error\", func(){ GoCrazy() })\nfunc (a *Assertions) PanicsWithValue(expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tPanicsWithValue(a.t, expected, f, msgAndArgs...)\n}\n\n// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//\ta.PanicsWithValuef(\"crazy error\", func(){ GoCrazy() }, \"error message %s\", \"formatted\")\nfunc (a *Assertions) PanicsWithValuef(expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tPanicsWithValuef(a.t, expected, f, msg, args...)\n}\n\n// Panicsf asserts that the code inside the specified PanicTestFunc panics.\n//\n//\ta.Panicsf(func(){ GoCrazy() }, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Panicsf(f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tPanicsf(a.t, f, msg, args...)\n}\n\n// Positive asserts that the specified element is positive\n//\n//\ta.Positive(1)\n//\ta.Positive(1.23)\nfunc (a *Assertions) Positive(e interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tPositive(a.t, e, msgAndArgs...)\n}\n\n// Positivef asserts that the specified element is positive\n//\n//\ta.Positivef(1, \"error message %s\", \"formatted\")\n//\ta.Positivef(1.23, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Positivef(e interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tPositivef(a.t, e, msg, args...)\n}\n\n// Regexp asserts that a specified regexp matches a string.\n//\n//\ta.Regexp(regexp.MustCompile(\"start\"), \"it's starting\")\n//\ta.Regexp(\"start...$\", \"it's not starting\")\nfunc (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tRegexp(a.t, rx, str, msgAndArgs...)\n}\n\n// Regexpf asserts that a specified regexp matches a string.\n//\n//\ta.Regexpf(regexp.MustCompile(\"start\"), \"it's starting\", \"error message %s\", \"formatted\")\n//\ta.Regexpf(\"start...$\", \"it's not starting\", \"error message %s\", \"formatted\")\nfunc (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tRegexpf(a.t, rx, str, msg, args...)\n}\n\n// Same asserts that two pointers reference the same object.\n//\n//\ta.Same(ptr1, ptr2)\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc (a *Assertions) Same(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tSame(a.t, expected, actual, msgAndArgs...)\n}\n\n// Samef asserts that two pointers reference the same object.\n//\n//\ta.Samef(ptr1, ptr2, \"error message %s\", \"formatted\")\n//\n// Both arguments must be pointer variables. Pointer variable sameness is\n// determined based on the equality of both type and value.\nfunc (a *Assertions) Samef(expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tSamef(a.t, expected, actual, msg, args...)\n}\n\n// Subset asserts that the specified list(array, slice...) or map contains all\n// elements given in the specified subset list(array, slice...) or map.\n//\n//\ta.Subset([1, 2, 3], [1, 2])\n//\ta.Subset({\"x\": 1, \"y\": 2}, {\"x\": 1})\nfunc (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tSubset(a.t, list, subset, msgAndArgs...)\n}\n\n// Subsetf asserts that the specified list(array, slice...) or map contains all\n// elements given in the specified subset list(array, slice...) or map.\n//\n//\ta.Subsetf([1, 2, 3], [1, 2], \"error message %s\", \"formatted\")\n//\ta.Subsetf({\"x\": 1, \"y\": 2}, {\"x\": 1}, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tSubsetf(a.t, list, subset, msg, args...)\n}\n\n// True asserts that the specified value is true.\n//\n//\ta.True(myBool)\nfunc (a *Assertions) True(value bool, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tTrue(a.t, value, msgAndArgs...)\n}\n\n// Truef asserts that the specified value is true.\n//\n//\ta.Truef(myBool, \"error message %s\", \"formatted\")\nfunc (a *Assertions) Truef(value bool, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tTruef(a.t, value, msg, args...)\n}\n\n// WithinDuration asserts that the two times are within duration delta of each other.\n//\n//\ta.WithinDuration(time.Now(), time.Now(), 10*time.Second)\nfunc (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tWithinDuration(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// WithinDurationf asserts that the two times are within duration delta of each other.\n//\n//\ta.WithinDurationf(time.Now(), time.Now(), 10*time.Second, \"error message %s\", \"formatted\")\nfunc (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tWithinDurationf(a.t, expected, actual, delta, msg, args...)\n}\n\n// WithinRange asserts that a time is within a time range (inclusive).\n//\n//\ta.WithinRange(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second))\nfunc (a *Assertions) WithinRange(actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tWithinRange(a.t, actual, start, end, msgAndArgs...)\n}\n\n// WithinRangef asserts that a time is within a time range (inclusive).\n//\n//\ta.WithinRangef(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), \"error message %s\", \"formatted\")\nfunc (a *Assertions) WithinRangef(actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tWithinRangef(a.t, actual, start, end, msg, args...)\n}\n\n// Zero asserts that i is the zero value for its type.\nfunc (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tZero(a.t, i, msgAndArgs...)\n}\n\n// Zerof asserts that i is the zero value for its type.\nfunc (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) {\n\tif h, ok := a.t.(tHelper); ok {\n\t\th.Helper()\n\t}\n\tZerof(a.t, i, msg, args...)\n}\n"
  },
  {
    "path": "internal/testify/require/require_forward.go.tmpl",
    "content": "{{.CommentWithoutT \"a\"}}\nfunc (a *Assertions) {{.DocInfo.Name}}({{.Params}}) {\n\tif h, ok := a.t.(tHelper); ok { h.Helper() }\n\t{{.DocInfo.Name}}(a.t, {{.ForwardedParams}})\n}\n"
  },
  {
    "path": "internal/testify/require/requirements.go",
    "content": "package require\n\n// TestingT is an interface wrapper around *testing.T\ntype TestingT interface {\n\tErrorf(format string, args ...interface{})\n\tFailNow()\n}\n\ntype tHelper = interface {\n\tHelper()\n}\n\n// ComparisonAssertionFunc is a common function prototype when comparing two values.  Can be useful\n// for table driven tests.\ntype ComparisonAssertionFunc func(TestingT, interface{}, interface{}, ...interface{})\n\n// ValueAssertionFunc is a common function prototype when validating a single value.  Can be useful\n// for table driven tests.\ntype ValueAssertionFunc func(TestingT, interface{}, ...interface{})\n\n// BoolAssertionFunc is a common function prototype when validating a bool value.  Can be useful\n// for table driven tests.\ntype BoolAssertionFunc func(TestingT, bool, ...interface{})\n\n// ErrorAssertionFunc is a common function prototype when validating an error value.  Can be useful\n// for table driven tests.\ntype ErrorAssertionFunc func(TestingT, error, ...interface{})\n\n//go:generate sh -c \"cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=require -template=require.go.tmpl -include-format-funcs\"\n"
  },
  {
    "path": "internal/testify/require/requirements_test.go",
    "content": "package require\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"testing\"\n\t\"time\"\n)\n\n// AssertionTesterInterface defines an interface to be used for testing assertion methods\ntype AssertionTesterInterface interface {\n\tTestMethod()\n}\n\n// AssertionTesterConformingObject is an object that conforms to the AssertionTesterInterface interface\ntype AssertionTesterConformingObject struct {\n}\n\nfunc (a *AssertionTesterConformingObject) TestMethod() {\n}\n\n// AssertionTesterNonConformingObject is an object that does not conform to the AssertionTesterInterface interface\ntype AssertionTesterNonConformingObject struct {\n}\n\ntype MockT struct {\n\tFailed bool\n}\n\nfunc (t *MockT) FailNow() {\n\tt.Failed = true\n}\n\nfunc (t *MockT) Errorf(format string, args ...interface{}) {\n\t_, _ = format, args\n}\n\nfunc TestImplements(t *testing.T) {\n\n\tImplements(t, (*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject))\n\n\tmockT := new(MockT)\n\tImplements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject))\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestIsType(t *testing.T) {\n\n\tIsType(t, new(AssertionTesterConformingObject), new(AssertionTesterConformingObject))\n\n\tmockT := new(MockT)\n\tIsType(mockT, new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject))\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestEqual(t *testing.T) {\n\n\tEqual(t, 1, 1)\n\n\tmockT := new(MockT)\n\tEqual(mockT, 1, 2)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n\n}\n\nfunc TestNotEqual(t *testing.T) {\n\n\tNotEqual(t, 1, 2)\n\tmockT := new(MockT)\n\tNotEqual(mockT, 2, 2)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestExactly(t *testing.T) {\n\n\ta := float32(1)\n\tb := float32(1)\n\tc := float64(1)\n\n\tExactly(t, a, b)\n\n\tmockT := new(MockT)\n\tExactly(mockT, a, c)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNotNil(t *testing.T) {\n\n\tNotNil(t, new(AssertionTesterConformingObject))\n\n\tmockT := new(MockT)\n\tNotNil(mockT, nil)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNil(t *testing.T) {\n\n\tNil(t, nil)\n\n\tmockT := new(MockT)\n\tNil(mockT, new(AssertionTesterConformingObject))\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestTrue(t *testing.T) {\n\n\tTrue(t, true)\n\n\tmockT := new(MockT)\n\tTrue(mockT, false)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestFalse(t *testing.T) {\n\n\tFalse(t, false)\n\n\tmockT := new(MockT)\n\tFalse(mockT, true)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestContains(t *testing.T) {\n\n\tContains(t, \"Hello World\", \"Hello\")\n\n\tmockT := new(MockT)\n\tContains(mockT, \"Hello World\", \"Salut\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNotContains(t *testing.T) {\n\n\tNotContains(t, \"Hello World\", \"Hello!\")\n\n\tmockT := new(MockT)\n\tNotContains(mockT, \"Hello World\", \"Hello\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestPanics(t *testing.T) {\n\n\tPanics(t, func() {\n\t\tpanic(\"Panic!\")\n\t})\n\n\tmockT := new(MockT)\n\tPanics(mockT, func() {})\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNotPanics(t *testing.T) {\n\n\tNotPanics(t, func() {})\n\n\tmockT := new(MockT)\n\tNotPanics(mockT, func() {\n\t\tpanic(\"Panic!\")\n\t})\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNoError(t *testing.T) {\n\n\tNoError(t, nil)\n\n\tmockT := new(MockT)\n\tNoError(mockT, errors.New(\"some error\"))\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestError(t *testing.T) {\n\n\tError(t, errors.New(\"some error\"))\n\n\tmockT := new(MockT)\n\tError(mockT, nil)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestErrorContains(t *testing.T) {\n\n\tErrorContains(t, errors.New(\"some error: another error\"), \"some error\")\n\n\tmockT := new(MockT)\n\tErrorContains(mockT, errors.New(\"some error\"), \"different error\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestEqualError(t *testing.T) {\n\n\tEqualError(t, errors.New(\"some error\"), \"some error\")\n\n\tmockT := new(MockT)\n\tEqualError(mockT, errors.New(\"some error\"), \"Not some error\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestEmpty(t *testing.T) {\n\n\tEmpty(t, \"\")\n\n\tmockT := new(MockT)\n\tEmpty(mockT, \"x\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNotEmpty(t *testing.T) {\n\n\tNotEmpty(t, \"x\")\n\n\tmockT := new(MockT)\n\tNotEmpty(mockT, \"\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestWithinDuration(t *testing.T) {\n\n\ta := time.Now()\n\tb := a.Add(10 * time.Second)\n\n\tWithinDuration(t, a, b, 15*time.Second)\n\n\tmockT := new(MockT)\n\tWithinDuration(mockT, a, b, 5*time.Second)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestInDelta(t *testing.T) {\n\n\tInDelta(t, 1.001, 1, 0.01)\n\n\tmockT := new(MockT)\n\tInDelta(mockT, 1, 2, 0.5)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestZero(t *testing.T) {\n\n\tZero(t, \"\")\n\n\tmockT := new(MockT)\n\tZero(mockT, \"x\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestNotZero(t *testing.T) {\n\n\tNotZero(t, \"x\")\n\n\tmockT := new(MockT)\n\tNotZero(mockT, \"\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestJSONEq_EqualSONString(t *testing.T) {\n\tmockT := new(MockT)\n\tJSONEq(mockT, `{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"hello\": \"world\", \"foo\": \"bar\"}`)\n\tif mockT.Failed {\n\t\tt.Error(\"Check should pass\")\n\t}\n}\n\nfunc TestJSONEq_EquivalentButNotEqual(t *testing.T) {\n\tmockT := new(MockT)\n\tJSONEq(mockT, `{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`)\n\tif mockT.Failed {\n\t\tt.Error(\"Check should pass\")\n\t}\n}\n\nfunc TestJSONEq_HashOfArraysAndHashes(t *testing.T) {\n\tmockT := new(MockT)\n\tJSONEq(mockT, \"{\\r\\n\\t\\\"numeric\\\": 1.5,\\r\\n\\t\\\"array\\\": [{\\\"foo\\\": \\\"bar\\\"}, 1, \\\"string\\\", [\\\"nested\\\", \\\"array\\\", 5.5]],\\r\\n\\t\\\"hash\\\": {\\\"nested\\\": \\\"hash\\\", \\\"nested_slice\\\": [\\\"this\\\", \\\"is\\\", \\\"nested\\\"]},\\r\\n\\t\\\"string\\\": \\\"foo\\\"\\r\\n}\",\n\t\t\"{\\r\\n\\t\\\"numeric\\\": 1.5,\\r\\n\\t\\\"hash\\\": {\\\"nested\\\": \\\"hash\\\", \\\"nested_slice\\\": [\\\"this\\\", \\\"is\\\", \\\"nested\\\"]},\\r\\n\\t\\\"string\\\": \\\"foo\\\",\\r\\n\\t\\\"array\\\": [{\\\"foo\\\": \\\"bar\\\"}, 1, \\\"string\\\", [\\\"nested\\\", \\\"array\\\", 5.5]]\\r\\n}\")\n\tif mockT.Failed {\n\t\tt.Error(\"Check should pass\")\n\t}\n}\n\nfunc TestJSONEq_Array(t *testing.T) {\n\tmockT := new(MockT)\n\tJSONEq(mockT, `[\"foo\", {\"hello\": \"world\", \"nested\": \"hash\"}]`, `[\"foo\", {\"nested\": \"hash\", \"hello\": \"world\"}]`)\n\tif mockT.Failed {\n\t\tt.Error(\"Check should pass\")\n\t}\n}\n\nfunc TestJSONEq_HashAndArrayNotEquivalent(t *testing.T) {\n\tmockT := new(MockT)\n\tJSONEq(mockT, `[\"foo\", {\"hello\": \"world\", \"nested\": \"hash\"}]`, `{\"foo\": \"bar\", {\"nested\": \"hash\", \"hello\": \"world\"}}`)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestJSONEq_HashesNotEquivalent(t *testing.T) {\n\tmockT := new(MockT)\n\tJSONEq(mockT, `{\"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestJSONEq_ActualIsNotJSON(t *testing.T) {\n\tmockT := new(MockT)\n\tJSONEq(mockT, `{\"foo\": \"bar\"}`, \"Not JSON\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestJSONEq_ExpectedIsNotJSON(t *testing.T) {\n\tmockT := new(MockT)\n\tJSONEq(mockT, \"Not JSON\", `{\"foo\": \"bar\", \"hello\": \"world\"}`)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestJSONEq_ExpectedAndActualNotJSON(t *testing.T) {\n\tmockT := new(MockT)\n\tJSONEq(mockT, \"Not JSON\", \"Not JSON\")\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc TestJSONEq_ArraysOfDifferentOrder(t *testing.T) {\n\tmockT := new(MockT)\n\tJSONEq(mockT, `[\"foo\", {\"hello\": \"world\", \"nested\": \"hash\"}]`, `[{ \"hello\": \"world\", \"nested\": \"hash\"}, \"foo\"]`)\n\tif !mockT.Failed {\n\t\tt.Error(\"Check should fail\")\n\t}\n}\n\nfunc ExampleComparisonAssertionFunc() {\n\tt := &testing.T{} // provided by test\n\n\tadder := func(x, y int) int {\n\t\treturn x + y\n\t}\n\n\ttype args struct {\n\t\tx int\n\t\ty int\n\t}\n\n\ttests := []struct {\n\t\tname      string\n\t\targs      args\n\t\texpect    int\n\t\tassertion ComparisonAssertionFunc\n\t}{\n\t\t{\"2+2=4\", args{2, 2}, 4, Equal},\n\t\t{\"2+2!=5\", args{2, 2}, 5, NotEqual},\n\t\t{\"2+3==5\", args{2, 3}, 5, Exactly},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, tt.expect, adder(tt.args.x, tt.args.y))\n\t\t})\n\t}\n}\n\nfunc TestComparisonAssertionFunc(t *testing.T) {\n\ttype iface interface {\n\t\tName() string\n\t}\n\n\ttests := []struct {\n\t\tname      string\n\t\texpect    interface{}\n\t\tgot       interface{}\n\t\tassertion ComparisonAssertionFunc\n\t}{\n\t\t{\"implements\", (*iface)(nil), t, Implements},\n\t\t{\"isType\", (*testing.T)(nil), t, IsType},\n\t\t{\"equal\", t, t, Equal},\n\t\t{\"equalValues\", t, t, EqualValues},\n\t\t{\"exactly\", t, t, Exactly},\n\t\t{\"notEqual\", t, nil, NotEqual},\n\t\t{\"NotEqualValues\", t, nil, NotEqualValues},\n\t\t{\"notContains\", []int{1, 2, 3}, 4, NotContains},\n\t\t{\"subset\", []int{1, 2, 3, 4}, []int{2, 3}, Subset},\n\t\t{\"notSubset\", []int{1, 2, 3, 4}, []int{0, 3}, NotSubset},\n\t\t{\"elementsMatch\", []byte(\"abc\"), []byte(\"bac\"), ElementsMatch},\n\t\t{\"regexp\", \"^t.*y$\", \"testify\", Regexp},\n\t\t{\"notRegexp\", \"^t.*y$\", \"Testify\", NotRegexp},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, tt.expect, tt.got)\n\t\t})\n\t}\n}\n\nfunc ExampleValueAssertionFunc() {\n\tt := &testing.T{} // provided by test\n\n\tdumbParse := func(input string) interface{} {\n\t\tvar x interface{}\n\t\tjson.Unmarshal([]byte(input), &x)\n\t\treturn x\n\t}\n\n\ttests := []struct {\n\t\tname      string\n\t\targ       string\n\t\tassertion ValueAssertionFunc\n\t}{\n\t\t{\"true is not nil\", \"true\", NotNil},\n\t\t{\"empty string is nil\", \"\", Nil},\n\t\t{\"zero is not nil\", \"0\", NotNil},\n\t\t{\"zero is zero\", \"0\", Zero},\n\t\t{\"false is zero\", \"false\", Zero},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, dumbParse(tt.arg))\n\t\t})\n\t}\n}\n\nfunc TestValueAssertionFunc(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tvalue     interface{}\n\t\tassertion ValueAssertionFunc\n\t}{\n\t\t{\"notNil\", true, NotNil},\n\t\t{\"nil\", nil, Nil},\n\t\t{\"empty\", []int{}, Empty},\n\t\t{\"notEmpty\", []int{1}, NotEmpty},\n\t\t{\"zero\", false, Zero},\n\t\t{\"notZero\", 42, NotZero},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, tt.value)\n\t\t})\n\t}\n}\n\nfunc ExampleBoolAssertionFunc() {\n\tt := &testing.T{} // provided by test\n\n\tisOkay := func(x int) bool {\n\t\treturn x >= 42\n\t}\n\n\ttests := []struct {\n\t\tname      string\n\t\targ       int\n\t\tassertion BoolAssertionFunc\n\t}{\n\t\t{\"-1 is bad\", -1, False},\n\t\t{\"42 is good\", 42, True},\n\t\t{\"41 is bad\", 41, False},\n\t\t{\"45 is cool\", 45, True},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, isOkay(tt.arg))\n\t\t})\n\t}\n}\n\nfunc TestBoolAssertionFunc(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tvalue     bool\n\t\tassertion BoolAssertionFunc\n\t}{\n\t\t{\"true\", true, True},\n\t\t{\"false\", false, False},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, tt.value)\n\t\t})\n\t}\n}\n\nfunc ExampleErrorAssertionFunc() {\n\tt := &testing.T{} // provided by test\n\n\tdumbParseNum := func(input string, v interface{}) error {\n\t\treturn json.Unmarshal([]byte(input), v)\n\t}\n\n\ttests := []struct {\n\t\tname      string\n\t\targ       string\n\t\tassertion ErrorAssertionFunc\n\t}{\n\t\t{\"1.2 is number\", \"1.2\", NoError},\n\t\t{\"1.2.3 not number\", \"1.2.3\", Error},\n\t\t{\"true is not number\", \"true\", Error},\n\t\t{\"3 is number\", \"3\", NoError},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tvar x float64\n\t\t\ttt.assertion(t, dumbParseNum(tt.arg, &x))\n\t\t})\n\t}\n}\n\nfunc TestErrorAssertionFunc(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\terr       error\n\t\tassertion ErrorAssertionFunc\n\t}{\n\t\t{\"noError\", nil, NoError},\n\t\t{\"error\", errors.New(\"whoops\"), Error},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttt.assertion(t, tt.err)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "optimizer/const_expr.go",
    "content": "package optimizer\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t. \"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/file\"\n)\n\nvar errorType = reflect.TypeOf((*error)(nil)).Elem()\n\ntype constExpr struct {\n\tapplied bool\n\terr     error\n\tfns     map[string]reflect.Value\n}\n\nfunc (c *constExpr) Visit(node *Node) {\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\tmsg := fmt.Sprintf(\"%v\", r)\n\t\t\t// Make message more actual, it's a runtime error, but at compile step.\n\t\t\tmsg = strings.Replace(msg, \"runtime error:\", \"compile error:\", 1)\n\t\t\tc.err = &file.Error{\n\t\t\t\tLocation: (*node).Location(),\n\t\t\t\tMessage:  msg,\n\t\t\t}\n\t\t}\n\t}()\n\n\tif call, ok := (*node).(*CallNode); ok {\n\t\tif name, ok := call.Callee.(*IdentifierNode); ok {\n\t\t\tfn, ok := c.fns[name.Value]\n\t\t\tif ok {\n\t\t\t\tin := make([]reflect.Value, len(call.Arguments))\n\t\t\t\tfor i := 0; i < len(call.Arguments); i++ {\n\t\t\t\t\targ := call.Arguments[i]\n\t\t\t\t\tvar param any\n\n\t\t\t\t\tswitch a := arg.(type) {\n\t\t\t\t\tcase *NilNode:\n\t\t\t\t\t\tparam = nil\n\t\t\t\t\tcase *IntegerNode:\n\t\t\t\t\t\tparam = a.Value\n\t\t\t\t\tcase *FloatNode:\n\t\t\t\t\t\tparam = a.Value\n\t\t\t\t\tcase *BoolNode:\n\t\t\t\t\t\tparam = a.Value\n\t\t\t\t\tcase *StringNode:\n\t\t\t\t\t\tparam = a.Value\n\t\t\t\t\tcase *ConstantNode:\n\t\t\t\t\t\tparam = a.Value\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn // Const expr optimization not applicable.\n\t\t\t\t\t}\n\n\t\t\t\t\tif param == nil && reflect.TypeOf(param) == nil {\n\t\t\t\t\t\t// In case of nil value and nil type use this hack,\n\t\t\t\t\t\t// otherwise reflect.Call will panic on zero value.\n\t\t\t\t\t\tin[i] = reflect.ValueOf(&param).Elem()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tin[i] = reflect.ValueOf(param)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tout := fn.Call(in)\n\t\t\t\tvalue := out[0].Interface()\n\t\t\t\tif len(out) == 2 && out[1].Type() == errorType && !out[1].IsNil() {\n\t\t\t\t\tc.err = out[1].Interface().(error)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconstNode := &ConstantNode{Value: value}\n\t\t\t\tpatchWithType(node, constNode)\n\t\t\t\tc.applied = true\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "optimizer/count_any.go",
    "content": "package optimizer\n\nimport (\n\t. \"github.com/expr-lang/expr/ast\"\n)\n\n// countAny optimizes count comparisons to use any for early termination.\n// Patterns:\n//   - count(arr, pred) > 0  → any(arr, pred)\n//   - count(arr, pred) >= 1 → any(arr, pred)\ntype countAny struct{}\n\nfunc (*countAny) Visit(node *Node) {\n\tbinary, ok := (*node).(*BinaryNode)\n\tif !ok {\n\t\treturn\n\t}\n\n\tcount, ok := binary.Left.(*BuiltinNode)\n\tif !ok || count.Name != \"count\" || len(count.Arguments) != 2 {\n\t\treturn\n\t}\n\n\tinteger, ok := binary.Right.(*IntegerNode)\n\tif !ok {\n\t\treturn\n\t}\n\n\tif (binary.Operator == \">\" && integer.Value == 0) ||\n\t\t(binary.Operator == \">=\" && integer.Value == 1) {\n\t\tpatchCopyType(node, &BuiltinNode{\n\t\t\tName:      \"any\",\n\t\t\tArguments: count.Arguments,\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "optimizer/count_any_test.go",
    "content": "package optimizer_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t. \"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\t\"github.com/expr-lang/expr/optimizer\"\n\t\"github.com/expr-lang/expr/parser\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\nfunc TestOptimize_count_any(t *testing.T) {\n\ttree, err := parser.Parse(`count(items, .active) > 0`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &BuiltinNode{\n\t\tName: \"any\",\n\t\tArguments: []Node{\n\t\t\t&IdentifierNode{Value: \"items\"},\n\t\t\t&PredicateNode{\n\t\t\t\tNode: &MemberNode{\n\t\t\t\t\tNode:     &PointerNode{},\n\t\t\t\t\tProperty: &StringNode{Value: \"active\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tassert.Equal(t, Dump(expected), Dump(tree.Node))\n}\n\nfunc TestOptimize_count_any_gte_one(t *testing.T) {\n\ttree, err := parser.Parse(`count(items, .valid) >= 1`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &BuiltinNode{\n\t\tName: \"any\",\n\t\tArguments: []Node{\n\t\t\t&IdentifierNode{Value: \"items\"},\n\t\t\t&PredicateNode{\n\t\t\t\tNode: &MemberNode{\n\t\t\t\t\tNode:     &PointerNode{},\n\t\t\t\t\tProperty: &StringNode{Value: \"valid\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tassert.Equal(t, Dump(expected), Dump(tree.Node))\n}\n\nfunc TestOptimize_count_any_correctness(t *testing.T) {\n\ttests := []struct {\n\t\texpr string\n\t\twant bool\n\t}{\n\t\t// count > 0 → any\n\t\t{`count(1..100, # == 1) > 0`, true},\n\t\t{`count(1..100, # == 50) > 0`, true},\n\t\t{`count(1..100, # == 100) > 0`, true},\n\t\t{`count(1..100, # == 0) > 0`, false},\n\n\t\t// count >= 1 → any\n\t\t{`count(1..100, # % 10 == 0) >= 1`, true},\n\t\t{`count(1..100, # > 100) >= 1`, false},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.expr, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.expr)\n\t\t\trequire.NoError(t, err)\n\n\t\t\toutput, err := expr.Run(program, nil)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tt.want, output)\n\t\t})\n\t}\n}\n\nfunc TestOptimize_count_no_optimization(t *testing.T) {\n\t// These should NOT be optimized\n\ttests := []string{\n\t\t`count(items, .active) > 1`,  // not > 0\n\t\t`count(items, .active) >= 2`, // not >= 1\n\t\t`count(items, .active) == 0`, // not optimized (none has overhead)\n\t\t`count(items, .active) == 1`, // not == 0\n\t\t`count(items, .active) < 1`,  // not optimized (none has overhead)\n\t\t`count(items, .active) <= 0`, // not optimized (none has overhead)\n\t\t`count(items, .active) != 0`, // different operator\n\t}\n\n\tfor _, code := range tests {\n\t\tt.Run(code, func(t *testing.T) {\n\t\t\ttree, err := parser.Parse(code)\n\t\t\trequire.NoError(t, err)\n\n\t\t\terr = optimizer.Optimize(&tree.Node, nil)\n\t\t\trequire.NoError(t, err)\n\n\t\t\t// Should still be a BinaryNode (not optimized to any)\n\t\t\t_, ok := tree.Node.(*BinaryNode)\n\t\t\tassert.True(t, ok, \"expected BinaryNode, got %T\", tree.Node)\n\t\t})\n\t}\n}\n\n// Benchmarks for count > 0 → any\nfunc BenchmarkCountGtZero(b *testing.B) {\n\tprogram, _ := expr.Compile(`count(1..1000, # == 1) > 0`)\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\t_ = out\n}\n\nfunc BenchmarkCountGtZeroLargeEarlyMatch(b *testing.B) {\n\tprogram, _ := expr.Compile(`count(1..10000, # == 1) > 0`)\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\t_ = out\n}\n\nfunc BenchmarkCountGtZeroNoMatch(b *testing.B) {\n\tprogram, _ := expr.Compile(`count(1..1000, # == 0) > 0`)\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\t_ = out\n}\n\n// Benchmarks for count >= 1 → any\nfunc BenchmarkCountGteOneEarlyMatch(b *testing.B) {\n\tprogram, _ := expr.Compile(`count(1..1000, # == 1) >= 1`)\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\t_ = out\n}\n\nfunc BenchmarkCountGteOneNoMatch(b *testing.B) {\n\tprogram, _ := expr.Compile(`count(1..1000, # == 0) >= 1`)\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\t_ = out\n}\n"
  },
  {
    "path": "optimizer/count_threshold.go",
    "content": "package optimizer\n\nimport (\n\t. \"github.com/expr-lang/expr/ast\"\n)\n\n// countThreshold optimizes count comparisons by setting a threshold for early termination.\n// The threshold allows the count loop to exit early once enough matches are found.\n// Patterns:\n//   - count(arr, pred) > N  → threshold = N + 1 (exit proves > N is true)\n//   - count(arr, pred) >= N → threshold = N (exit proves >= N is true)\n//   - count(arr, pred) < N  → threshold = N (exit proves < N is false)\n//   - count(arr, pred) <= N → threshold = N + 1 (exit proves <= N is false)\ntype countThreshold struct{}\n\nfunc (*countThreshold) Visit(node *Node) {\n\tbinary, ok := (*node).(*BinaryNode)\n\tif !ok {\n\t\treturn\n\t}\n\n\tcount, ok := binary.Left.(*BuiltinNode)\n\tif !ok || count.Name != \"count\" || len(count.Arguments) != 2 {\n\t\treturn\n\t}\n\n\tinteger, ok := binary.Right.(*IntegerNode)\n\tif !ok || integer.Value < 0 {\n\t\treturn\n\t}\n\n\tvar threshold int\n\tswitch binary.Operator {\n\tcase \">\":\n\t\tthreshold = integer.Value + 1\n\tcase \">=\":\n\t\tthreshold = integer.Value\n\tcase \"<\":\n\t\tthreshold = integer.Value\n\tcase \"<=\":\n\t\tthreshold = integer.Value + 1\n\tdefault:\n\t\treturn\n\t}\n\n\t// Skip if threshold is 0 or 1 (handled by count_any optimizer)\n\tif threshold <= 1 {\n\t\treturn\n\t}\n\n\t// Set threshold on the count node for early termination\n\t// The original comparison remains unchanged\n\tcount.Threshold = &threshold\n}\n"
  },
  {
    "path": "optimizer/count_threshold_test.go",
    "content": "package optimizer_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t. \"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\t\"github.com/expr-lang/expr/optimizer\"\n\t\"github.com/expr-lang/expr/parser\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\nfunc TestOptimize_count_threshold_gt(t *testing.T) {\n\ttree, err := parser.Parse(`count(items, .active) > 100`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\t// Operator should remain >, but count should have threshold set\n\tbinary, ok := tree.Node.(*BinaryNode)\n\trequire.True(t, ok, \"expected BinaryNode, got %T\", tree.Node)\n\tassert.Equal(t, \">\", binary.Operator)\n\n\tcount, ok := binary.Left.(*BuiltinNode)\n\trequire.True(t, ok, \"expected BuiltinNode, got %T\", binary.Left)\n\tassert.Equal(t, \"count\", count.Name)\n\trequire.NotNil(t, count.Threshold)\n\tassert.Equal(t, 101, *count.Threshold) // threshold = N + 1 for > operator\n}\n\nfunc TestOptimize_count_threshold_gte(t *testing.T) {\n\ttree, err := parser.Parse(`count(items, .active) >= 50`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\t// Operator should remain >=, but count should have threshold set\n\tbinary, ok := tree.Node.(*BinaryNode)\n\trequire.True(t, ok, \"expected BinaryNode, got %T\", tree.Node)\n\tassert.Equal(t, \">=\", binary.Operator)\n\n\tcount, ok := binary.Left.(*BuiltinNode)\n\trequire.True(t, ok, \"expected BuiltinNode, got %T\", binary.Left)\n\tassert.Equal(t, \"count\", count.Name)\n\trequire.NotNil(t, count.Threshold)\n\tassert.Equal(t, 50, *count.Threshold) // threshold = N for >= operator\n}\n\nfunc TestOptimize_count_threshold_lt(t *testing.T) {\n\ttree, err := parser.Parse(`count(items, .active) < 100`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\t// Operator should remain <, but count should have threshold set\n\tbinary, ok := tree.Node.(*BinaryNode)\n\trequire.True(t, ok, \"expected BinaryNode, got %T\", tree.Node)\n\tassert.Equal(t, \"<\", binary.Operator)\n\n\tcount, ok := binary.Left.(*BuiltinNode)\n\trequire.True(t, ok, \"expected BuiltinNode, got %T\", binary.Left)\n\tassert.Equal(t, \"count\", count.Name)\n\trequire.NotNil(t, count.Threshold)\n\tassert.Equal(t, 100, *count.Threshold) // threshold = N for < operator\n}\n\nfunc TestOptimize_count_threshold_lte(t *testing.T) {\n\ttree, err := parser.Parse(`count(items, .active) <= 50`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\t// Operator should remain <=, but count should have threshold set\n\tbinary, ok := tree.Node.(*BinaryNode)\n\trequire.True(t, ok, \"expected BinaryNode, got %T\", tree.Node)\n\tassert.Equal(t, \"<=\", binary.Operator)\n\n\tcount, ok := binary.Left.(*BuiltinNode)\n\trequire.True(t, ok, \"expected BuiltinNode, got %T\", binary.Left)\n\tassert.Equal(t, \"count\", count.Name)\n\trequire.NotNil(t, count.Threshold)\n\tassert.Equal(t, 51, *count.Threshold) // threshold = N + 1 for <= operator\n}\n\nfunc TestOptimize_count_threshold_correctness(t *testing.T) {\n\ttests := []struct {\n\t\texpr string\n\t\twant bool\n\t}{\n\t\t// count > N (threshold = N + 1)\n\t\t{`count(1..1000, # <= 100) > 50`, true},   // 100 matches > 50\n\t\t{`count(1..1000, # <= 100) > 100`, false}, // 100 matches not > 100\n\t\t{`count(1..1000, # <= 100) > 99`, true},   // 100 matches > 99\n\t\t{`count(1..100, # > 0) > 50`, true},       // 100 matches > 50\n\t\t{`count(1..100, # > 0) > 100`, false},     // 100 matches not > 100\n\n\t\t// count >= N (threshold = N)\n\t\t{`count(1..1000, # <= 100) >= 100`, true},  // 100 matches >= 100\n\t\t{`count(1..1000, # <= 100) >= 101`, false}, // 100 matches not >= 101\n\t\t{`count(1..100, # > 0) >= 50`, true},       // 100 matches >= 50\n\t\t{`count(1..100, # > 0) >= 100`, true},      // 100 matches >= 100\n\n\t\t// count < N (threshold = N)\n\t\t{`count(1..1000, # <= 100) < 101`, true},  // 100 matches < 101\n\t\t{`count(1..1000, # <= 100) < 100`, false}, // 100 matches not < 100\n\t\t{`count(1..1000, # <= 100) < 50`, false},  // 100 matches not < 50\n\t\t{`count(1..100, # > 0) < 101`, true},      // 100 matches < 101\n\t\t{`count(1..100, # > 0) < 100`, false},     // 100 matches not < 100\n\n\t\t// count <= N (threshold = N + 1)\n\t\t{`count(1..1000, # <= 100) <= 100`, true},  // 100 matches <= 100\n\t\t{`count(1..1000, # <= 100) <= 99`, false},  // 100 matches not <= 99\n\t\t{`count(1..1000, # <= 100) <= 50`, false},  // 100 matches not <= 50\n\t\t{`count(1..100, # > 0) <= 100`, true},      // 100 matches <= 100\n\t\t{`count(1..100, # > 0) <= 99`, false},      // 100 matches not <= 99\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.expr, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.expr)\n\t\t\trequire.NoError(t, err)\n\n\t\t\toutput, err := expr.Run(program, nil)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tt.want, output)\n\t\t})\n\t}\n}\n\nfunc TestOptimize_count_threshold_no_optimization(t *testing.T) {\n\t// These should NOT get a threshold (handled by count_any or not optimizable)\n\ttests := []struct {\n\t\tcode      string\n\t\tthreshold bool\n\t}{\n\t\t{`count(items, .active) > 0`, false},   // handled by count_any\n\t\t{`count(items, .active) >= 1`, false},  // handled by count_any\n\t\t{`count(items, .active) < 1`, false},   // threshold = 1, skipped\n\t\t{`count(items, .active) <= 0`, false},  // threshold = 1, skipped\n\t\t{`count(items, .active) == 10`, false}, // not supported\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.code, func(t *testing.T) {\n\t\t\ttree, err := parser.Parse(tt.code)\n\t\t\trequire.NoError(t, err)\n\n\t\t\terr = optimizer.Optimize(&tree.Node, nil)\n\t\t\trequire.NoError(t, err)\n\n\t\t\t// Check if count has threshold set\n\t\t\tvar count *BuiltinNode\n\t\t\tif binary, ok := tree.Node.(*BinaryNode); ok {\n\t\t\t\tcount, _ = binary.Left.(*BuiltinNode)\n\t\t\t} else if builtin, ok := tree.Node.(*BuiltinNode); ok {\n\t\t\t\tcount = builtin\n\t\t\t}\n\n\t\t\tif count != nil && count.Name == \"count\" {\n\t\t\t\tif tt.threshold {\n\t\t\t\t\tassert.NotNil(t, count.Threshold, \"expected threshold to be set\")\n\t\t\t\t} else {\n\t\t\t\t\tassert.Nil(t, count.Threshold, \"expected threshold to be nil\")\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\n// Benchmark: count > 100 with early match (element 101 matches early)\nfunc BenchmarkCountThresholdEarlyMatch(b *testing.B) {\n\t// Array of 10000 elements, all match predicate, threshold is 101\n\t// Should exit after ~101 iterations\n\tprogram, _ := expr.Compile(`count(1..10000, # > 0) > 100`)\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\t_ = out\n}\n\n// Benchmark: count >= 50 with early match\nfunc BenchmarkCountThresholdGteEarlyMatch(b *testing.B) {\n\t// All elements match, threshold is 50\n\t// Should exit after ~50 iterations\n\tprogram, _ := expr.Compile(`count(1..10000, # > 0) >= 50`)\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\t_ = out\n}\n\n// Benchmark: count > 100 with no early exit (not enough matches)\nfunc BenchmarkCountThresholdNoEarlyExit(b *testing.B) {\n\t// Only 100 elements match (# <= 100), threshold is 101\n\t// Must scan entire array\n\tprogram, _ := expr.Compile(`count(1..10000, # <= 100) > 100`)\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\t_ = out\n}\n\n// Benchmark: Large threshold with early match\nfunc BenchmarkCountThresholdLargeEarlyMatch(b *testing.B) {\n\t// All 10000 match, threshold is 1000\n\t// Should exit after ~1000 iterations\n\tprogram, _ := expr.Compile(`count(1..10000, # > 0) > 999`)\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\t_ = out\n}\n\n// Benchmark: count < N with early exit (result is false)\nfunc BenchmarkCountThresholdLtEarlyExit(b *testing.B) {\n\t// All 10000 match, threshold is 100\n\t// Should exit after ~100 iterations with result = false\n\tprogram, _ := expr.Compile(`count(1..10000, # > 0) < 100`)\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\t_ = out\n}\n\n// Benchmark: count <= N with early exit (result is false)\nfunc BenchmarkCountThresholdLteEarlyExit(b *testing.B) {\n\t// All 10000 match, threshold is 51\n\t// Should exit after ~51 iterations with result = false\n\tprogram, _ := expr.Compile(`count(1..10000, # > 0) <= 50`)\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\t_ = out\n}\n\n// Benchmark: count < N without early exit (result is true)\nfunc BenchmarkCountThresholdLtNoEarlyExit(b *testing.B) {\n\t// Only 100 elements match (# <= 100), threshold is 200\n\t// Must scan entire array, result = true\n\tprogram, _ := expr.Compile(`count(1..10000, # <= 100) < 200`)\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\t_ = out\n}\n\n// Benchmark: count <= N without early exit (result is true)\nfunc BenchmarkCountThresholdLteNoEarlyExit(b *testing.B) {\n\t// Only 100 elements match (# <= 100), threshold is 101\n\t// Must scan entire array, result = true\n\tprogram, _ := expr.Compile(`count(1..10000, # <= 100) <= 100`)\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = vm.Run(program, nil)\n\t}\n\t_ = out\n}\n"
  },
  {
    "path": "optimizer/filter_first.go",
    "content": "package optimizer\n\nimport (\n\t. \"github.com/expr-lang/expr/ast\"\n)\n\ntype filterFirst struct{}\n\nfunc (*filterFirst) Visit(node *Node) {\n\tif member, ok := (*node).(*MemberNode); ok && member.Property != nil && !member.Optional {\n\t\tif prop, ok := member.Property.(*IntegerNode); ok && prop.Value == 0 {\n\t\t\tif filter, ok := member.Node.(*BuiltinNode); ok &&\n\t\t\t\tfilter.Name == \"filter\" &&\n\t\t\t\tlen(filter.Arguments) == 2 {\n\t\t\t\tpatchCopyType(node, &BuiltinNode{\n\t\t\t\t\tName:      \"find\",\n\t\t\t\t\tArguments: filter.Arguments,\n\t\t\t\t\tThrows:    true, // to match the behavior of filter()[0]\n\t\t\t\t\tMap:       filter.Map,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\tif first, ok := (*node).(*BuiltinNode); ok &&\n\t\tfirst.Name == \"first\" &&\n\t\tlen(first.Arguments) == 1 {\n\t\tif filter, ok := first.Arguments[0].(*BuiltinNode); ok &&\n\t\t\tfilter.Name == \"filter\" &&\n\t\t\tlen(filter.Arguments) == 2 {\n\t\t\tpatchCopyType(node, &BuiltinNode{\n\t\t\t\tName:      \"find\",\n\t\t\t\tArguments: filter.Arguments,\n\t\t\t\tThrows:    false, // as first() will return nil if not found\n\t\t\t\tMap:       filter.Map,\n\t\t\t})\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "optimizer/filter_last.go",
    "content": "package optimizer\n\nimport (\n\t. \"github.com/expr-lang/expr/ast\"\n)\n\ntype filterLast struct{}\n\nfunc (*filterLast) Visit(node *Node) {\n\tif member, ok := (*node).(*MemberNode); ok && member.Property != nil && !member.Optional {\n\t\tif prop, ok := member.Property.(*IntegerNode); ok && prop.Value == -1 {\n\t\t\tif filter, ok := member.Node.(*BuiltinNode); ok &&\n\t\t\t\tfilter.Name == \"filter\" &&\n\t\t\t\tlen(filter.Arguments) == 2 {\n\t\t\t\tpatchCopyType(node, &BuiltinNode{\n\t\t\t\t\tName:      \"findLast\",\n\t\t\t\t\tArguments: filter.Arguments,\n\t\t\t\t\tThrows:    true, // to match the behavior of filter()[-1]\n\t\t\t\t\tMap:       filter.Map,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\tif first, ok := (*node).(*BuiltinNode); ok &&\n\t\tfirst.Name == \"last\" &&\n\t\tlen(first.Arguments) == 1 {\n\t\tif filter, ok := first.Arguments[0].(*BuiltinNode); ok &&\n\t\t\tfilter.Name == \"filter\" &&\n\t\t\tlen(filter.Arguments) == 2 {\n\t\t\tpatchCopyType(node, &BuiltinNode{\n\t\t\t\tName:      \"findLast\",\n\t\t\t\tArguments: filter.Arguments,\n\t\t\t\tThrows:    false, // as last() will return nil if not found\n\t\t\t\tMap:       filter.Map,\n\t\t\t})\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "optimizer/filter_len.go",
    "content": "package optimizer\n\nimport (\n\t. \"github.com/expr-lang/expr/ast\"\n)\n\ntype filterLen struct{}\n\nfunc (*filterLen) Visit(node *Node) {\n\tif ln, ok := (*node).(*BuiltinNode); ok &&\n\t\tln.Name == \"len\" &&\n\t\tlen(ln.Arguments) == 1 {\n\t\tif filter, ok := ln.Arguments[0].(*BuiltinNode); ok &&\n\t\t\tfilter.Name == \"filter\" &&\n\t\t\tlen(filter.Arguments) == 2 {\n\t\t\tpatchCopyType(node, &BuiltinNode{\n\t\t\t\tName:      \"count\",\n\t\t\t\tArguments: filter.Arguments,\n\t\t\t})\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "optimizer/filter_map.go",
    "content": "package optimizer\n\nimport (\n\t. \"github.com/expr-lang/expr/ast\"\n)\n\ntype filterMap struct{}\n\nfunc (*filterMap) Visit(node *Node) {\n\tif mapBuiltin, ok := (*node).(*BuiltinNode); ok &&\n\t\tmapBuiltin.Name == \"map\" &&\n\t\tlen(mapBuiltin.Arguments) == 2 &&\n\t\tFind(mapBuiltin.Arguments[1], isIndexPointer) == nil {\n\t\tif predicate, ok := mapBuiltin.Arguments[1].(*PredicateNode); ok {\n\t\t\tif filter, ok := mapBuiltin.Arguments[0].(*BuiltinNode); ok &&\n\t\t\t\tfilter.Name == \"filter\" &&\n\t\t\t\tfilter.Map == nil /* not already optimized */ {\n\t\t\t\tpatchCopyType(node, &BuiltinNode{\n\t\t\t\t\tName:      \"filter\",\n\t\t\t\t\tArguments: filter.Arguments,\n\t\t\t\t\tMap:       predicate.Node,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc isIndexPointer(node Node) bool {\n\tif pointer, ok := node.(*PointerNode); ok && pointer.Name == \"index\" {\n\t\treturn true\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "optimizer/filter_map_test.go",
    "content": "package optimizer_test\n\nimport (\n\t\"testing\"\n\n\t. \"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\t\"github.com/expr-lang/expr/optimizer\"\n\t\"github.com/expr-lang/expr/parser\"\n)\n\nfunc TestOptimize_filter_map(t *testing.T) {\n\ttree, err := parser.Parse(`map(filter(users, .Name == \"Bob\"), .Age)`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &BuiltinNode{\n\t\tName: \"filter\",\n\t\tArguments: []Node{\n\t\t\t&IdentifierNode{Value: \"users\"},\n\t\t\t&PredicateNode{\n\t\t\t\tNode: &BinaryNode{\n\t\t\t\t\tOperator: \"==\",\n\t\t\t\t\tLeft: &MemberNode{\n\t\t\t\t\t\tNode:     &PointerNode{},\n\t\t\t\t\t\tProperty: &StringNode{Value: \"Name\"},\n\t\t\t\t\t},\n\t\t\t\t\tRight: &StringNode{Value: \"Bob\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tMap: &MemberNode{\n\t\t\tNode:     &PointerNode{},\n\t\t\tProperty: &StringNode{Value: \"Age\"},\n\t\t},\n\t}\n\n\tassert.Equal(t, Dump(expected), Dump(tree.Node))\n}\n\nfunc TestOptimize_filter_map_with_index_pointer(t *testing.T) {\n\ttree, err := parser.Parse(`map(filter(users, true), #index)`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &BuiltinNode{\n\t\tName: \"map\",\n\t\tArguments: []Node{\n\t\t\t&BuiltinNode{\n\t\t\t\tName: \"filter\",\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&IdentifierNode{Value: \"users\"},\n\t\t\t\t\t&PredicateNode{\n\t\t\t\t\t\tNode: &BoolNode{Value: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tThrows: false,\n\t\t\t\tMap:    nil,\n\t\t\t},\n\t\t\t&PredicateNode{\n\t\t\t\tNode: &PointerNode{Name: \"index\"},\n\t\t\t},\n\t\t},\n\t\tThrows: false,\n\t\tMap:    nil,\n\t}\n\n\tassert.Equal(t, Dump(expected), Dump(tree.Node))\n}\n\nfunc TestOptimize_filter_map_with_index_pointer_with_index_pointer_in_first_argument(t *testing.T) {\n\ttree, err := parser.Parse(`1..2 | map(map(filter([#index], true), 42))`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &BuiltinNode{\n\t\tName: \"map\",\n\t\tArguments: []Node{\n\t\t\t&BinaryNode{\n\t\t\t\tOperator: \"..\",\n\t\t\t\tLeft:     &IntegerNode{Value: 1},\n\t\t\t\tRight:    &IntegerNode{Value: 2},\n\t\t\t},\n\t\t\t&PredicateNode{\n\t\t\t\tNode: &BuiltinNode{\n\t\t\t\t\tName: \"filter\",\n\t\t\t\t\tArguments: []Node{\n\t\t\t\t\t\t&ArrayNode{\n\t\t\t\t\t\t\tNodes: []Node{\n\t\t\t\t\t\t\t\t&PointerNode{Name: \"index\"},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t&PredicateNode{\n\t\t\t\t\t\t\tNode: &BoolNode{Value: true},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tThrows: false,\n\t\t\t\t\tMap:    &IntegerNode{Value: 42},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tThrows: false,\n\t\tMap:    nil,\n\t}\n\n\tassert.Equal(t, Dump(expected), Dump(tree.Node))\n}\n"
  },
  {
    "path": "optimizer/fold.go",
    "content": "package optimizer\n\nimport (\n\t\"math\"\n\n\t. \"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/file\"\n)\n\ntype fold struct {\n\tapplied bool\n\terr     *file.Error\n}\n\nfunc (fold *fold) Visit(node *Node) {\n\tpatch := func(newNode Node) {\n\t\tfold.applied = true\n\t\tpatchWithType(node, newNode)\n\t}\n\tpatchCopy := func(newNode Node) {\n\t\tfold.applied = true\n\t\tpatchCopyType(node, newNode)\n\t}\n\n\tswitch n := (*node).(type) {\n\tcase *UnaryNode:\n\t\tswitch n.Operator {\n\t\tcase \"-\":\n\t\t\tif i, ok := n.Node.(*IntegerNode); ok {\n\t\t\t\tpatch(&IntegerNode{Value: -i.Value})\n\t\t\t}\n\t\t\tif i, ok := n.Node.(*FloatNode); ok {\n\t\t\t\tpatch(&FloatNode{Value: -i.Value})\n\t\t\t}\n\t\tcase \"+\":\n\t\t\tif i, ok := n.Node.(*IntegerNode); ok {\n\t\t\t\tpatch(&IntegerNode{Value: i.Value})\n\t\t\t}\n\t\t\tif i, ok := n.Node.(*FloatNode); ok {\n\t\t\t\tpatch(&FloatNode{Value: i.Value})\n\t\t\t}\n\t\tcase \"!\", \"not\":\n\t\t\tif a := toBool(n.Node); a != nil {\n\t\t\t\tpatch(&BoolNode{Value: !a.Value})\n\t\t\t}\n\t\t}\n\n\tcase *BinaryNode:\n\t\tswitch n.Operator {\n\t\tcase \"+\":\n\t\t\t{\n\t\t\t\ta := toInteger(n.Left)\n\t\t\t\tb := toInteger(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&IntegerNode{Value: a.Value + b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toInteger(n.Left)\n\t\t\t\tb := toFloat(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: float64(a.Value) + b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toFloat(n.Left)\n\t\t\t\tb := toInteger(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: a.Value + float64(b.Value)})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toFloat(n.Left)\n\t\t\t\tb := toFloat(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: a.Value + b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toString(n.Left)\n\t\t\t\tb := toString(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&StringNode{Value: a.Value + b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\tcase \"-\":\n\t\t\t{\n\t\t\t\ta := toInteger(n.Left)\n\t\t\t\tb := toInteger(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&IntegerNode{Value: a.Value - b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toInteger(n.Left)\n\t\t\t\tb := toFloat(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: float64(a.Value) - b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toFloat(n.Left)\n\t\t\t\tb := toInteger(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: a.Value - float64(b.Value)})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toFloat(n.Left)\n\t\t\t\tb := toFloat(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: a.Value - b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\tcase \"*\":\n\t\t\t{\n\t\t\t\ta := toInteger(n.Left)\n\t\t\t\tb := toInteger(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&IntegerNode{Value: a.Value * b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toInteger(n.Left)\n\t\t\t\tb := toFloat(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: float64(a.Value) * b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toFloat(n.Left)\n\t\t\t\tb := toInteger(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: a.Value * float64(b.Value)})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toFloat(n.Left)\n\t\t\t\tb := toFloat(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: a.Value * b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\tcase \"/\":\n\t\t\t{\n\t\t\t\ta := toInteger(n.Left)\n\t\t\t\tb := toInteger(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: float64(a.Value) / float64(b.Value)})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toInteger(n.Left)\n\t\t\t\tb := toFloat(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: float64(a.Value) / b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toFloat(n.Left)\n\t\t\t\tb := toInteger(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: a.Value / float64(b.Value)})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toFloat(n.Left)\n\t\t\t\tb := toFloat(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: a.Value / b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\tcase \"%\":\n\t\t\tif a, ok := n.Left.(*IntegerNode); ok {\n\t\t\t\tif b, ok := n.Right.(*IntegerNode); ok {\n\t\t\t\t\tif b.Value == 0 {\n\t\t\t\t\t\tfold.err = &file.Error{\n\t\t\t\t\t\t\tLocation: (*node).Location(),\n\t\t\t\t\t\t\tMessage:  \"integer divide by zero\",\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tpatch(&IntegerNode{Value: a.Value % b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\tcase \"**\", \"^\":\n\t\t\t{\n\t\t\t\ta := toInteger(n.Left)\n\t\t\t\tb := toInteger(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: math.Pow(float64(a.Value), float64(b.Value))})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toInteger(n.Left)\n\t\t\t\tb := toFloat(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: math.Pow(float64(a.Value), b.Value)})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toFloat(n.Left)\n\t\t\t\tb := toInteger(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: math.Pow(a.Value, float64(b.Value))})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toFloat(n.Left)\n\t\t\t\tb := toFloat(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&FloatNode{Value: math.Pow(a.Value, b.Value)})\n\t\t\t\t}\n\t\t\t}\n\t\tcase \"and\", \"&&\":\n\t\t\ta := toBool(n.Left)\n\t\t\tb := toBool(n.Right)\n\n\t\t\tif a != nil && a.Value { // true and x\n\t\t\t\tpatchCopy(n.Right)\n\t\t\t} else if b != nil && b.Value { // x and true\n\t\t\t\tpatchCopy(n.Left)\n\t\t\t} else if (a != nil && !a.Value) || (b != nil && !b.Value) { // \"x and false\" or \"false and x\"\n\t\t\t\tpatch(&BoolNode{Value: false})\n\t\t\t}\n\t\tcase \"or\", \"||\":\n\t\t\ta := toBool(n.Left)\n\t\t\tb := toBool(n.Right)\n\n\t\t\tif a != nil && !a.Value { // false or x\n\t\t\t\tpatchCopy(n.Right)\n\t\t\t} else if b != nil && !b.Value { // x or false\n\t\t\t\tpatchCopy(n.Left)\n\t\t\t} else if (a != nil && a.Value) || (b != nil && b.Value) { // \"x or true\" or \"true or x\"\n\t\t\t\tpatch(&BoolNode{Value: true})\n\t\t\t}\n\t\tcase \"==\":\n\t\t\t{\n\t\t\t\ta := toInteger(n.Left)\n\t\t\t\tb := toInteger(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&BoolNode{Value: a.Value == b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toString(n.Left)\n\t\t\t\tb := toString(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&BoolNode{Value: a.Value == b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\ta := toBool(n.Left)\n\t\t\t\tb := toBool(n.Right)\n\t\t\t\tif a != nil && b != nil {\n\t\t\t\t\tpatch(&BoolNode{Value: a.Value == b.Value})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\tcase *ArrayNode:\n\t\tif len(n.Nodes) > 0 {\n\t\t\tfor _, a := range n.Nodes {\n\t\t\t\tswitch a.(type) {\n\t\t\t\tcase *IntegerNode, *FloatNode, *StringNode, *BoolNode:\n\t\t\t\t\tcontinue\n\t\t\t\tdefault:\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tvalue := make([]any, len(n.Nodes))\n\t\t\tfor i, a := range n.Nodes {\n\t\t\t\tswitch b := a.(type) {\n\t\t\t\tcase *IntegerNode:\n\t\t\t\t\tvalue[i] = b.Value\n\t\t\t\tcase *FloatNode:\n\t\t\t\t\tvalue[i] = b.Value\n\t\t\t\tcase *StringNode:\n\t\t\t\t\tvalue[i] = b.Value\n\t\t\t\tcase *BoolNode:\n\t\t\t\t\tvalue[i] = b.Value\n\t\t\t\t}\n\t\t\t}\n\t\t\tpatch(&ConstantNode{Value: value})\n\t\t}\n\n\tcase *BuiltinNode:\n\t\t// TODO: Move this to a separate visitor filter_filter.go\n\t\tswitch n.Name {\n\t\tcase \"filter\":\n\t\t\tif len(n.Arguments) != 2 {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif base, ok := n.Arguments[0].(*BuiltinNode); ok && base.Name == \"filter\" {\n\t\t\t\tpatchCopy(&BuiltinNode{\n\t\t\t\t\tName: \"filter\",\n\t\t\t\t\tArguments: []Node{\n\t\t\t\t\t\tbase.Arguments[0],\n\t\t\t\t\t\t&PredicateNode{\n\t\t\t\t\t\t\tNode: &BinaryNode{\n\t\t\t\t\t\t\t\tOperator: \"&&\",\n\t\t\t\t\t\t\t\tLeft:     base.Arguments[1].(*PredicateNode).Node,\n\t\t\t\t\t\t\t\tRight:    n.Arguments[1].(*PredicateNode).Node,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc toString(n Node) *StringNode {\n\tswitch a := n.(type) {\n\tcase *StringNode:\n\t\treturn a\n\t}\n\treturn nil\n}\n\nfunc toInteger(n Node) *IntegerNode {\n\tswitch a := n.(type) {\n\tcase *IntegerNode:\n\t\treturn a\n\t}\n\treturn nil\n}\n\nfunc toFloat(n Node) *FloatNode {\n\tswitch a := n.(type) {\n\tcase *FloatNode:\n\t\treturn a\n\t}\n\treturn nil\n}\n\nfunc toBool(n Node) *BoolNode {\n\tswitch a := n.(type) {\n\tcase *BoolNode:\n\t\treturn a\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "optimizer/fold_test.go",
    "content": "package optimizer_test\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\t\"github.com/expr-lang/expr/optimizer\"\n\t\"github.com/expr-lang/expr/parser\"\n)\n\nfunc TestOptimize_constant_folding(t *testing.T) {\n\ttree, err := parser.Parse(`[1,2,3][5*5-25]`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.MemberNode{\n\t\tNode:     &ast.ConstantNode{Value: []any{1, 2, 3}},\n\t\tProperty: &ast.IntegerNode{Value: 0},\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_constant_folding_with_floats(t *testing.T) {\n\ttree, err := parser.Parse(`1 + 2.0 * ((1.0 * 2) / 2) - 0`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.FloatNode{Value: 3.0}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n\tassert.Equal(t, reflect.Float64, tree.Node.Type().Kind())\n}\n\nfunc TestOptimize_constant_folding_with_bools(t *testing.T) {\n\ttree, err := parser.Parse(`(true and false) or (true or false) or (false and false) or (true and (true == false))`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.BoolNode{Value: true}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_constant_folding_filter_filter(t *testing.T) {\n\ttree, err := parser.Parse(`filter(filter(1..2, true), true)`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.BuiltinNode{\n\t\tName: \"filter\",\n\t\tArguments: []ast.Node{\n\t\t\t&ast.BinaryNode{\n\t\t\t\tOperator: \"..\",\n\t\t\t\tLeft: &ast.IntegerNode{\n\t\t\t\t\tValue: 1,\n\t\t\t\t},\n\t\t\t\tRight: &ast.IntegerNode{\n\t\t\t\t\tValue: 2,\n\t\t\t\t},\n\t\t\t},\n\t\t\t&ast.PredicateNode{\n\t\t\t\tNode: &ast.BoolNode{\n\t\t\t\t\tValue: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tThrows: false,\n\t\tMap:    nil,\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n"
  },
  {
    "path": "optimizer/in_array.go",
    "content": "package optimizer\n\nimport (\n\t\"reflect\"\n\n\t. \"github.com/expr-lang/expr/ast\"\n)\n\ntype inArray struct{}\n\nfunc (*inArray) Visit(node *Node) {\n\tswitch n := (*node).(type) {\n\tcase *BinaryNode:\n\t\tif n.Operator == \"in\" {\n\t\t\tif array, ok := n.Right.(*ArrayNode); ok {\n\t\t\t\tif len(array.Nodes) > 0 {\n\t\t\t\t\tt := n.Left.Type()\n\t\t\t\t\tif t == nil || t.Kind() != reflect.Int {\n\t\t\t\t\t\t// This optimization can be only performed if left side is int type,\n\t\t\t\t\t\t// as runtime.in func uses reflect.Map.MapIndex and keys of map must,\n\t\t\t\t\t\t// be same as checked value type.\n\t\t\t\t\t\tgoto string\n\t\t\t\t\t}\n\n\t\t\t\t\tfor _, a := range array.Nodes {\n\t\t\t\t\t\tif _, ok := a.(*IntegerNode); !ok {\n\t\t\t\t\t\t\tgoto string\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue := make(map[int]struct{})\n\t\t\t\t\t\tfor _, a := range array.Nodes {\n\t\t\t\t\t\t\tvalue[a.(*IntegerNode).Value] = struct{}{}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tm := &ConstantNode{Value: value}\n\t\t\t\t\t\tm.SetType(reflect.TypeOf(value))\n\t\t\t\t\t\tpatchCopyType(node, &BinaryNode{\n\t\t\t\t\t\t\tOperator: n.Operator,\n\t\t\t\t\t\t\tLeft:     n.Left,\n\t\t\t\t\t\t\tRight:    m,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\n\t\t\t\tstring:\n\t\t\t\t\tfor _, a := range array.Nodes {\n\t\t\t\t\t\tif _, ok := a.(*StringNode); !ok {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue := make(map[string]struct{})\n\t\t\t\t\t\tfor _, a := range array.Nodes {\n\t\t\t\t\t\t\tvalue[a.(*StringNode).Value] = struct{}{}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tm := &ConstantNode{Value: value}\n\t\t\t\t\t\tm.SetType(reflect.TypeOf(value))\n\t\t\t\t\t\tpatchCopyType(node, &BinaryNode{\n\t\t\t\t\t\t\tOperator: n.Operator,\n\t\t\t\t\t\t\tLeft:     n.Left,\n\t\t\t\t\t\t\tRight:    m,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "optimizer/in_range.go",
    "content": "package optimizer\n\nimport (\n\t\"reflect\"\n\n\t. \"github.com/expr-lang/expr/ast\"\n)\n\ntype inRange struct{}\n\nfunc (*inRange) Visit(node *Node) {\n\tswitch n := (*node).(type) {\n\tcase *BinaryNode:\n\t\tif n.Operator == \"in\" {\n\t\t\tt := n.Left.Type()\n\t\t\tif t == nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif t.Kind() != reflect.Int {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif rangeOp, ok := n.Right.(*BinaryNode); ok && rangeOp.Operator == \"..\" {\n\t\t\t\tif from, ok := rangeOp.Left.(*IntegerNode); ok {\n\t\t\t\t\tif to, ok := rangeOp.Right.(*IntegerNode); ok {\n\t\t\t\t\t\tpatchCopyType(node, &BinaryNode{\n\t\t\t\t\t\t\tOperator: \"and\",\n\t\t\t\t\t\t\tLeft: &BinaryNode{\n\t\t\t\t\t\t\t\tOperator: \">=\",\n\t\t\t\t\t\t\t\tLeft:     n.Left,\n\t\t\t\t\t\t\t\tRight:    from,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRight: &BinaryNode{\n\t\t\t\t\t\t\t\tOperator: \"<=\",\n\t\t\t\t\t\t\t\tLeft:     n.Left,\n\t\t\t\t\t\t\t\tRight:    to,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "optimizer/optimizer.go",
    "content": "package optimizer\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\n\t. \"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/conf\"\n)\n\nfunc Optimize(node *Node, config *conf.Config) error {\n\tWalk(node, &inArray{})\n\tfor limit := 1000; limit >= 0; limit-- {\n\t\tfold := &fold{}\n\t\tWalk(node, fold)\n\t\tif fold.err != nil {\n\t\t\treturn fold.err\n\t\t}\n\t\tif !fold.applied {\n\t\t\tbreak\n\t\t}\n\t}\n\tif config != nil && len(config.ConstFns) > 0 {\n\t\tfor limit := 100; limit >= 0; limit-- {\n\t\t\tconstExpr := &constExpr{\n\t\t\t\tfns: config.ConstFns,\n\t\t\t}\n\t\t\tWalk(node, constExpr)\n\t\t\tif constExpr.err != nil {\n\t\t\t\treturn constExpr.err\n\t\t\t}\n\t\t\tif !constExpr.applied {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tWalk(node, &inRange{})\n\tWalk(node, &filterMap{})\n\tWalk(node, &filterLen{})\n\tWalk(node, &filterLast{})\n\tWalk(node, &filterFirst{})\n\tWalk(node, &predicateCombination{})\n\tWalk(node, &sumRange{})\n\tWalk(node, &sumArray{})\n\tWalk(node, &sumMap{})\n\tWalk(node, &countAny{})\n\tWalk(node, &countThreshold{})\n\treturn nil\n}\n\nvar (\n\tboolType    = reflect.TypeOf(true)\n\tintegerType = reflect.TypeOf(0)\n\tfloatType   = reflect.TypeOf(float64(0))\n\tstringType  = reflect.TypeOf(\"\")\n)\n\nfunc patchWithType(node *Node, newNode Node) {\n\tswitch n := newNode.(type) {\n\tcase *BoolNode:\n\t\tnewNode.SetType(boolType)\n\tcase *IntegerNode:\n\t\tnewNode.SetType(integerType)\n\tcase *FloatNode:\n\t\tnewNode.SetType(floatType)\n\tcase *StringNode:\n\t\tnewNode.SetType(stringType)\n\tcase *ConstantNode:\n\t\tnewNode.SetType(reflect.TypeOf(n.Value))\n\tcase *BinaryNode:\n\t\tnewNode.SetType(n.Type())\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"unknown type %T\", newNode))\n\t}\n\tPatch(node, newNode)\n}\n\nfunc patchCopyType(node *Node, newNode Node) {\n\tt := (*node).Type()\n\tnewNode.SetType(t)\n\tPatch(node, newNode)\n}\n"
  },
  {
    "path": "optimizer/optimizer_test.go",
    "content": "package optimizer_test\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/checker\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/optimizer\"\n\t\"github.com/expr-lang/expr/parser\"\n)\n\nfunc TestOptimize(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"a\": 1,\n\t\t\"b\": 2,\n\t\t\"c\": 3,\n\t}\n\n\ttests := []struct {\n\t\texpr string\n\t\twant any\n\t}{\n\t\t{`1 + 2`, 3},\n\t\t{`sum([])`, 0},\n\t\t{`sum([a])`, 1},\n\t\t{`sum([a, b])`, 3},\n\t\t{`sum([a, b, c])`, 6},\n\t\t{`sum([a, b, c, 4])`, 10},\n\t\t{`sum(1..10, # * 1000)`, 55000},\n\t\t{`sum(map(1..10, # * 1000), # / 1000)`, float64(55)},\n\t\t{`all(1..3, {# > 0}) && all(1..3, {# < 4})`, true},\n\t\t{`all(1..3, {# > 2}) && all(1..3, {# < 4})`, false},\n\t\t{`all(1..3, {# > 0}) && all(1..3, {# < 2})`, false},\n\t\t{`all(1..3, {# > 2}) && all(1..3, {# < 2})`, false},\n\t\t{`all(1..3, {# > 0}) || all(1..3, {# < 4})`, true},\n\t\t{`all(1..3, {# > 0}) || all(1..3, {# != 2})`, true},\n\t\t{`all(1..3, {# != 3}) || all(1..3, {# < 4})`, true},\n\t\t{`all(1..3, {# != 3}) || all(1..3, {# != 2})`, false},\n\t\t{`none(1..3, {# == 0})`, true},\n\t\t{`none(1..3, {# == 0}) && none(1..3, {# == 4})`, true},\n\t\t{`none(1..3, {# == 0}) && none(1..3, {# == 3})`, false},\n\t\t{`none(1..3, {# == 1}) && none(1..3, {# == 4})`, false},\n\t\t{`none(1..3, {# == 1}) && none(1..3, {# == 3})`, false},\n\t\t{`none(1..3, {# == 0}) || none(1..3, {# == 4})`, true},\n\t\t{`none(1..3, {# == 0}) || none(1..3, {# == 3})`, true},\n\t\t{`none(1..3, {# == 1}) || none(1..3, {# == 4})`, true},\n\t\t{`none(1..3, {# == 1}) || none(1..3, {# == 3})`, false},\n\t\t{`any([1, 1, 0, 1], {# == 0})`, true},\n\t\t{`any(1..3, {# == 1}) && any(1..3, {# == 2})`, true},\n\t\t{`any(1..3, {# == 0}) && any(1..3, {# == 2})`, false},\n\t\t{`any(1..3, {# == 1}) && any(1..3, {# == 4})`, false},\n\t\t{`any(1..3, {# == 0}) && any(1..3, {# == 4})`, false},\n\t\t{`any(1..3, {# == 1}) || any(1..3, {# == 2})`, true},\n\t\t{`any(1..3, {# == 0}) || any(1..3, {# == 2})`, true},\n\t\t{`any(1..3, {# == 1}) || any(1..3, {# == 4})`, true},\n\t\t{`any(1..3, {# == 0}) || any(1..3, {# == 4})`, false},\n\t\t{`one([1, 1, 0, 1], {# == 0}) and not one([1, 0, 0, 1], {# == 0})`, true},\n\t\t{`one(1..3, {# == 1}) and one(1..3, {# == 2})`, true},\n\t\t{`one(1..3, {# == 1 || # == 2}) and one(1..3, {# == 2})`, false},\n\t\t{`one(1..3, {# == 1}) and one(1..3, {# == 2 || # == 3})`, false},\n\t\t{`one(1..3, {# == 1 || # == 2}) and one(1..3, {# == 2 || # == 3})`, false},\n\t\t{`one(1..3, {# == 1}) or one(1..3, {# == 2})`, true},\n\t\t{`one(1..3, {# == 1 || # == 2}) or one(1..3, {# == 2})`, true},\n\t\t{`one(1..3, {# == 1}) or one(1..3, {# == 2 || # == 3})`, true},\n\t\t{`one(1..3, {# == 1 || # == 2}) or one(1..3, {# == 2 || # == 3})`, false},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.expr, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.expr, expr.Env(env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\toutput, err := expr.Run(program, env)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tt.want, output)\n\n\t\t\tunoptimizedProgram, err := expr.Compile(tt.expr, expr.Env(env), expr.Optimize(false))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tunoptimizedOutput, err := expr.Run(unoptimizedProgram, env)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tt.want, unoptimizedOutput)\n\t\t})\n\t}\n}\n\nfunc TestOptimize_in_array(t *testing.T) {\n\tconfig := conf.New(map[string]int{\"v\": 0})\n\n\ttree, err := parser.Parse(`v in [1,2,3]`)\n\trequire.NoError(t, err)\n\n\t_, err = checker.Check(tree, config)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.BinaryNode{\n\t\tOperator: \"in\",\n\t\tLeft:     &ast.IdentifierNode{Value: \"v\"},\n\t\tRight:    &ast.ConstantNode{Value: map[int]struct{}{1: {}, 2: {}, 3: {}}},\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_in_range(t *testing.T) {\n\ttree, err := parser.Parse(`age in 18..31`)\n\trequire.NoError(t, err)\n\n\tconfig := conf.New(map[string]int{\"age\": 30})\n\t_, err = checker.Check(tree, config)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\tleft := &ast.IdentifierNode{\n\t\tValue: \"age\",\n\t}\n\texpected := &ast.BinaryNode{\n\t\tOperator: \"and\",\n\t\tLeft: &ast.BinaryNode{\n\t\t\tOperator: \">=\",\n\t\t\tLeft:     left,\n\t\t\tRight: &ast.IntegerNode{\n\t\t\t\tValue: 18,\n\t\t\t},\n\t\t},\n\t\tRight: &ast.BinaryNode{\n\t\t\tOperator: \"<=\",\n\t\t\tLeft:     left,\n\t\t\tRight: &ast.IntegerNode{\n\t\t\t\tValue: 31,\n\t\t\t},\n\t\t},\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_in_range_with_floats(t *testing.T) {\n\tout, err := expr.Eval(`f in 1..3`, map[string]any{\"f\": 1.5})\n\trequire.NoError(t, err)\n\tassert.Equal(t, false, out)\n}\n\nfunc TestOptimize_const_expr(t *testing.T) {\n\ttree, err := parser.Parse(`toUpper(\"hello\")`)\n\trequire.NoError(t, err)\n\n\tenv := map[string]any{\n\t\t\"toUpper\": strings.ToUpper,\n\t}\n\n\tconfig := conf.New(env)\n\tconfig.ConstExpr(\"toUpper\")\n\n\terr = optimizer.Optimize(&tree.Node, config)\n\trequire.NoError(t, err)\n\n\texpected := &ast.ConstantNode{\n\t\tValue: \"HELLO\",\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_filter_len(t *testing.T) {\n\ttree, err := parser.Parse(`len(filter(users, .Name == \"Bob\"))`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.BuiltinNode{\n\t\tName: \"count\",\n\t\tArguments: []ast.Node{\n\t\t\t&ast.IdentifierNode{Value: \"users\"},\n\t\t\t&ast.PredicateNode{\n\t\t\t\tNode: &ast.BinaryNode{\n\t\t\t\t\tOperator: \"==\",\n\t\t\t\t\tLeft: &ast.MemberNode{\n\t\t\t\t\t\tNode:     &ast.PointerNode{},\n\t\t\t\t\t\tProperty: &ast.StringNode{Value: \"Name\"},\n\t\t\t\t\t},\n\t\t\t\t\tRight: &ast.StringNode{Value: \"Bob\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_filter_0(t *testing.T) {\n\ttree, err := parser.Parse(`filter(users, .Name == \"Bob\")[0]`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.BuiltinNode{\n\t\tName: \"find\",\n\t\tArguments: []ast.Node{\n\t\t\t&ast.IdentifierNode{Value: \"users\"},\n\t\t\t&ast.PredicateNode{\n\t\t\t\tNode: &ast.BinaryNode{\n\t\t\t\t\tOperator: \"==\",\n\t\t\t\t\tLeft: &ast.MemberNode{\n\t\t\t\t\t\tNode:     &ast.PointerNode{},\n\t\t\t\t\t\tProperty: &ast.StringNode{Value: \"Name\"},\n\t\t\t\t\t},\n\t\t\t\t\tRight: &ast.StringNode{Value: \"Bob\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tThrows: true,\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_filter_first(t *testing.T) {\n\ttree, err := parser.Parse(`first(filter(users, .Name == \"Bob\"))`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.BuiltinNode{\n\t\tName: \"find\",\n\t\tArguments: []ast.Node{\n\t\t\t&ast.IdentifierNode{Value: \"users\"},\n\t\t\t&ast.PredicateNode{\n\t\t\t\tNode: &ast.BinaryNode{\n\t\t\t\t\tOperator: \"==\",\n\t\t\t\t\tLeft: &ast.MemberNode{\n\t\t\t\t\t\tNode:     &ast.PointerNode{},\n\t\t\t\t\t\tProperty: &ast.StringNode{Value: \"Name\"},\n\t\t\t\t\t},\n\t\t\t\t\tRight: &ast.StringNode{Value: \"Bob\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tThrows: false,\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_filter_minus_1(t *testing.T) {\n\ttree, err := parser.Parse(`filter(users, .Name == \"Bob\")[-1]`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.BuiltinNode{\n\t\tName: \"findLast\",\n\t\tArguments: []ast.Node{\n\t\t\t&ast.IdentifierNode{Value: \"users\"},\n\t\t\t&ast.PredicateNode{\n\t\t\t\tNode: &ast.BinaryNode{\n\t\t\t\t\tOperator: \"==\",\n\t\t\t\t\tLeft: &ast.MemberNode{\n\t\t\t\t\t\tNode:     &ast.PointerNode{},\n\t\t\t\t\t\tProperty: &ast.StringNode{Value: \"Name\"},\n\t\t\t\t\t},\n\t\t\t\t\tRight: &ast.StringNode{Value: \"Bob\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tThrows: true,\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_filter_last(t *testing.T) {\n\ttree, err := parser.Parse(`last(filter(users, .Name == \"Bob\"))`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.BuiltinNode{\n\t\tName: \"findLast\",\n\t\tArguments: []ast.Node{\n\t\t\t&ast.IdentifierNode{Value: \"users\"},\n\t\t\t&ast.PredicateNode{\n\t\t\t\tNode: &ast.BinaryNode{\n\t\t\t\t\tOperator: \"==\",\n\t\t\t\t\tLeft: &ast.MemberNode{\n\t\t\t\t\t\tNode:     &ast.PointerNode{},\n\t\t\t\t\t\tProperty: &ast.StringNode{Value: \"Name\"},\n\t\t\t\t\t},\n\t\t\t\t\tRight: &ast.StringNode{Value: \"Bob\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tThrows: false,\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_filter_map_first(t *testing.T) {\n\ttree, err := parser.Parse(`first(map(filter(users, .Name == \"Bob\"), .Age))`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.BuiltinNode{\n\t\tName: \"find\",\n\t\tArguments: []ast.Node{\n\t\t\t&ast.IdentifierNode{Value: \"users\"},\n\t\t\t&ast.PredicateNode{\n\t\t\t\tNode: &ast.BinaryNode{\n\t\t\t\t\tOperator: \"==\",\n\t\t\t\t\tLeft: &ast.MemberNode{\n\t\t\t\t\t\tNode:     &ast.PointerNode{},\n\t\t\t\t\t\tProperty: &ast.StringNode{Value: \"Name\"},\n\t\t\t\t\t},\n\t\t\t\t\tRight: &ast.StringNode{Value: \"Bob\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tMap: &ast.MemberNode{\n\t\t\tNode:     &ast.PointerNode{},\n\t\t\tProperty: &ast.StringNode{Value: \"Age\"},\n\t\t},\n\t\tThrows: false,\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_predicate_combination(t *testing.T) {\n\ttests := []struct {\n\t\top     string\n\t\tfn     string\n\t\twantOp string\n\t}{\n\t\t{\"and\", \"all\", \"and\"},\n\t\t{\"&&\", \"all\", \"&&\"},\n\t\t{\"or\", \"any\", \"or\"},\n\t\t{\"||\", \"any\", \"||\"},\n\t\t{\"and\", \"none\", \"or\"},\n\t\t{\"&&\", \"none\", \"||\"},\n\t}\n\n\tfor _, tt := range tests {\n\t\trule := fmt.Sprintf(`%s(users, .Age > 18 and .Name != \"Bob\") %s %s(users, .Age < 30)`, tt.fn, tt.op, tt.fn)\n\t\tt.Run(rule, func(t *testing.T) {\n\t\t\ttree, err := parser.Parse(rule)\n\t\t\trequire.NoError(t, err)\n\n\t\t\terr = optimizer.Optimize(&tree.Node, nil)\n\t\t\trequire.NoError(t, err)\n\n\t\t\texpected := &ast.BuiltinNode{\n\t\t\t\tName: tt.fn,\n\t\t\t\tArguments: []ast.Node{\n\t\t\t\t\t&ast.IdentifierNode{Value: \"users\"},\n\t\t\t\t\t&ast.PredicateNode{\n\t\t\t\t\t\tNode: &ast.BinaryNode{\n\t\t\t\t\t\t\tOperator: tt.wantOp,\n\t\t\t\t\t\t\tLeft: &ast.BinaryNode{\n\t\t\t\t\t\t\t\tOperator: \"and\",\n\t\t\t\t\t\t\t\tLeft: &ast.BinaryNode{\n\t\t\t\t\t\t\t\t\tOperator: \">\",\n\t\t\t\t\t\t\t\t\tLeft: &ast.MemberNode{\n\t\t\t\t\t\t\t\t\t\tNode:     &ast.PointerNode{},\n\t\t\t\t\t\t\t\t\t\tProperty: &ast.StringNode{Value: \"Age\"},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tRight: &ast.IntegerNode{Value: 18},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tRight: &ast.BinaryNode{\n\t\t\t\t\t\t\t\t\tOperator: \"!=\",\n\t\t\t\t\t\t\t\t\tLeft: &ast.MemberNode{\n\t\t\t\t\t\t\t\t\t\tNode:     &ast.PointerNode{},\n\t\t\t\t\t\t\t\t\t\tProperty: &ast.StringNode{Value: \"Name\"},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tRight: &ast.StringNode{Value: \"Bob\"},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRight: &ast.BinaryNode{\n\t\t\t\t\t\t\t\tOperator: \"<\",\n\t\t\t\t\t\t\t\tLeft: &ast.MemberNode{\n\t\t\t\t\t\t\t\t\tNode:     &ast.PointerNode{},\n\t\t\t\t\t\t\t\t\tProperty: &ast.StringNode{Value: \"Age\"},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tRight: &ast.IntegerNode{Value: 30},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n\t\t})\n\t}\n}\n\nfunc TestOptimize_predicate_combination_nested(t *testing.T) {\n\ttree, err := parser.Parse(`all(users, {all(.Friends, {.Age == 18 })}) && all(users, {all(.Friends, {.Name != \"Bob\" })})`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.BuiltinNode{\n\t\tName: \"all\",\n\t\tArguments: []ast.Node{\n\t\t\t&ast.IdentifierNode{Value: \"users\"},\n\t\t\t&ast.PredicateNode{\n\t\t\t\tNode: &ast.BuiltinNode{\n\t\t\t\t\tName: \"all\",\n\t\t\t\t\tArguments: []ast.Node{\n\t\t\t\t\t\t&ast.MemberNode{\n\t\t\t\t\t\t\tNode:     &ast.PointerNode{},\n\t\t\t\t\t\t\tProperty: &ast.StringNode{Value: \"Friends\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t&ast.PredicateNode{\n\t\t\t\t\t\t\tNode: &ast.BinaryNode{\n\t\t\t\t\t\t\t\tOperator: \"&&\",\n\t\t\t\t\t\t\t\tLeft: &ast.BinaryNode{\n\t\t\t\t\t\t\t\t\tOperator: \"==\",\n\t\t\t\t\t\t\t\t\tLeft: &ast.MemberNode{\n\t\t\t\t\t\t\t\t\t\tNode:     &ast.PointerNode{},\n\t\t\t\t\t\t\t\t\t\tProperty: &ast.StringNode{Value: \"Age\"},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tRight: &ast.IntegerNode{Value: 18},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tRight: &ast.BinaryNode{\n\t\t\t\t\t\t\t\t\tOperator: \"!=\",\n\t\t\t\t\t\t\t\t\tLeft: &ast.MemberNode{\n\t\t\t\t\t\t\t\t\t\tNode:     &ast.PointerNode{},\n\t\t\t\t\t\t\t\t\t\tProperty: &ast.StringNode{Value: \"Name\"},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tRight: &ast.StringNode{Value: \"Bob\"},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n"
  },
  {
    "path": "optimizer/predicate_combination.go",
    "content": "package optimizer\n\nimport (\n\t. \"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/parser/operator\"\n)\n\n/*\npredicateCombination is a visitor that combines multiple predicate calls into a single call.\nFor example, the following expression:\n\n\tall(x, x > 1) && all(x, x < 10) -> all(x, x > 1 && x < 10)\n\tany(x, x > 1) || any(x, x < 10) -> any(x, x > 1 || x < 10)\n\tnone(x, x > 1) && none(x, x < 10) -> none(x, x > 1 || x < 10)\n*/\ntype predicateCombination struct{}\n\nfunc (v *predicateCombination) Visit(node *Node) {\n\tif op, ok := (*node).(*BinaryNode); ok && operator.IsBoolean(op.Operator) {\n\t\tif left, ok := op.Left.(*BuiltinNode); ok {\n\t\t\tif combinedOp, ok := combinedOperator(left.Name, op.Operator); ok {\n\t\t\t\tif right, ok := op.Right.(*BuiltinNode); ok && right.Name == left.Name {\n\t\t\t\t\tif left.Arguments[0].Type() == right.Arguments[0].Type() && left.Arguments[0].String() == right.Arguments[0].String() {\n\t\t\t\t\t\tpredicate := &PredicateNode{\n\t\t\t\t\t\t\tNode: &BinaryNode{\n\t\t\t\t\t\t\t\tOperator: combinedOp,\n\t\t\t\t\t\t\t\tLeft:     left.Arguments[1].(*PredicateNode).Node,\n\t\t\t\t\t\t\t\tRight:    right.Arguments[1].(*PredicateNode).Node,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t\tv.Visit(&predicate.Node)\n\t\t\t\t\t\tpatchCopyType(node, &BuiltinNode{\n\t\t\t\t\t\t\tName: left.Name,\n\t\t\t\t\t\t\tArguments: []Node{\n\t\t\t\t\t\t\t\tleft.Arguments[0],\n\t\t\t\t\t\t\t\tpredicate,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc combinedOperator(fn, op string) (string, bool) {\n\tswitch {\n\tcase fn == \"all\" && (op == \"and\" || op == \"&&\"):\n\t\treturn op, true\n\tcase fn == \"any\" && (op == \"or\" || op == \"||\"):\n\t\treturn op, true\n\tcase fn == \"none\" && (op == \"and\" || op == \"&&\"):\n\t\tswitch op {\n\t\tcase \"and\":\n\t\t\treturn \"or\", true\n\t\tcase \"&&\":\n\t\t\treturn \"||\", true\n\t\t}\n\t}\n\treturn \"\", false\n}\n"
  },
  {
    "path": "optimizer/sum_array.go",
    "content": "package optimizer\n\nimport (\n\t\"fmt\"\n\n\t. \"github.com/expr-lang/expr/ast\"\n)\n\ntype sumArray struct{}\n\nfunc (*sumArray) Visit(node *Node) {\n\tif sumBuiltin, ok := (*node).(*BuiltinNode); ok &&\n\t\tsumBuiltin.Name == \"sum\" &&\n\t\tlen(sumBuiltin.Arguments) == 1 {\n\t\tif array, ok := sumBuiltin.Arguments[0].(*ArrayNode); ok &&\n\t\t\tlen(array.Nodes) >= 2 {\n\t\t\tpatchCopyType(node, sumArrayFold(array))\n\t\t}\n\t}\n}\n\nfunc sumArrayFold(array *ArrayNode) *BinaryNode {\n\tif len(array.Nodes) > 2 {\n\t\treturn &BinaryNode{\n\t\t\tOperator: \"+\",\n\t\t\tLeft:     array.Nodes[0],\n\t\t\tRight:    sumArrayFold(&ArrayNode{Nodes: array.Nodes[1:]}),\n\t\t}\n\t} else if len(array.Nodes) == 2 {\n\t\treturn &BinaryNode{\n\t\t\tOperator: \"+\",\n\t\t\tLeft:     array.Nodes[0],\n\t\t\tRight:    array.Nodes[1],\n\t\t}\n\t}\n\tpanic(fmt.Errorf(\"sumArrayFold: invalid array length %d\", len(array.Nodes)))\n}\n"
  },
  {
    "path": "optimizer/sum_array_test.go",
    "content": "package optimizer_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/optimizer\"\n\t\"github.com/expr-lang/expr/parser\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\nfunc BenchmarkSumArray(b *testing.B) {\n\tenv := map[string]any{\n\t\t\"a\": 1,\n\t\t\"b\": 2,\n\t\t\"c\": 3,\n\t\t\"d\": 4,\n\t}\n\n\tprogram, err := expr.Compile(`sum([a, b, c, d])`, expr.Env(env))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Equal(b, 10, out)\n}\n\nfunc TestOptimize_sum_array(t *testing.T) {\n\ttree, err := parser.Parse(`sum([a, b])`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.BinaryNode{\n\t\tOperator: \"+\",\n\t\tLeft:     &ast.IdentifierNode{Value: \"a\"},\n\t\tRight:    &ast.IdentifierNode{Value: \"b\"},\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_sum_array_3(t *testing.T) {\n\ttree, err := parser.Parse(`sum([a, b, c])`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.BinaryNode{\n\t\tOperator: \"+\",\n\t\tLeft:     &ast.IdentifierNode{Value: \"a\"},\n\t\tRight: &ast.BinaryNode{\n\t\t\tOperator: \"+\",\n\t\t\tLeft:     &ast.IdentifierNode{Value: \"b\"},\n\t\t\tRight:    &ast.IdentifierNode{Value: \"c\"},\n\t\t},\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n"
  },
  {
    "path": "optimizer/sum_map.go",
    "content": "package optimizer\n\nimport (\n\t. \"github.com/expr-lang/expr/ast\"\n)\n\ntype sumMap struct{}\n\nfunc (*sumMap) Visit(node *Node) {\n\tif sumBuiltin, ok := (*node).(*BuiltinNode); ok &&\n\t\tsumBuiltin.Name == \"sum\" &&\n\t\tlen(sumBuiltin.Arguments) == 1 {\n\t\tif mapBuiltin, ok := sumBuiltin.Arguments[0].(*BuiltinNode); ok &&\n\t\t\tmapBuiltin.Name == \"map\" &&\n\t\t\tlen(mapBuiltin.Arguments) == 2 {\n\t\t\tpatchCopyType(node, &BuiltinNode{\n\t\t\t\tName: \"sum\",\n\t\t\t\tArguments: []Node{\n\t\t\t\t\tmapBuiltin.Arguments[0],\n\t\t\t\t\tmapBuiltin.Arguments[1],\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "optimizer/sum_map_test.go",
    "content": "package optimizer_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/optimizer\"\n\t\"github.com/expr-lang/expr/parser\"\n)\n\nfunc TestOptimize_sum_map(t *testing.T) {\n\ttree, err := parser.Parse(`sum(map(users, {.Age}))`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.BuiltinNode{\n\t\tName: \"sum\",\n\t\tArguments: []ast.Node{\n\t\t\t&ast.IdentifierNode{Value: \"users\"},\n\t\t\t&ast.PredicateNode{\n\t\t\t\tNode: &ast.MemberNode{\n\t\t\t\t\tNode:     &ast.PointerNode{},\n\t\t\t\t\tProperty: &ast.StringNode{Value: \"Age\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n"
  },
  {
    "path": "optimizer/sum_range.go",
    "content": "package optimizer\n\nimport (\n\t. \"github.com/expr-lang/expr/ast\"\n)\n\ntype sumRange struct{}\n\nfunc (*sumRange) Visit(node *Node) {\n\t// Pattern 1: sum(m..n) or sum(m..n, predicate) where m and n are constant integers\n\tif sumBuiltin, ok := (*node).(*BuiltinNode); ok &&\n\t\tsumBuiltin.Name == \"sum\" &&\n\t\t(len(sumBuiltin.Arguments) == 1 || len(sumBuiltin.Arguments) == 2) {\n\t\tif rangeOp, ok := sumBuiltin.Arguments[0].(*BinaryNode); ok && rangeOp.Operator == \"..\" {\n\t\t\tif from, ok := rangeOp.Left.(*IntegerNode); ok {\n\t\t\t\tif to, ok := rangeOp.Right.(*IntegerNode); ok {\n\t\t\t\t\tm := from.Value\n\t\t\t\t\tn := to.Value\n\t\t\t\t\tif n >= m {\n\t\t\t\t\t\tcount := n - m + 1\n\t\t\t\t\t\t// Use the arithmetic series formula: (n - m + 1) * (m + n) / 2\n\t\t\t\t\t\tsum := count * (m + n) / 2\n\n\t\t\t\t\t\tif len(sumBuiltin.Arguments) == 1 {\n\t\t\t\t\t\t\t// sum(m..n)\n\t\t\t\t\t\t\tpatchWithType(node, &IntegerNode{Value: sum})\n\t\t\t\t\t\t} else if len(sumBuiltin.Arguments) == 2 {\n\t\t\t\t\t\t\t// sum(m..n, predicate)\n\t\t\t\t\t\t\tif result, ok := applySumPredicate(sum, count, sumBuiltin.Arguments[1]); ok {\n\t\t\t\t\t\t\t\tpatchWithType(node, &IntegerNode{Value: result})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pattern 2: reduce(m..n, # + #acc) where m and n are constant integers\n\tif reduceBuiltin, ok := (*node).(*BuiltinNode); ok &&\n\t\treduceBuiltin.Name == \"reduce\" &&\n\t\t(len(reduceBuiltin.Arguments) == 2 || len(reduceBuiltin.Arguments) == 3) {\n\t\tif rangeOp, ok := reduceBuiltin.Arguments[0].(*BinaryNode); ok && rangeOp.Operator == \"..\" {\n\t\t\tif from, ok := rangeOp.Left.(*IntegerNode); ok {\n\t\t\t\tif to, ok := rangeOp.Right.(*IntegerNode); ok {\n\t\t\t\t\tif isPointerPlusAcc(reduceBuiltin.Arguments[1]) {\n\t\t\t\t\t\tm := from.Value\n\t\t\t\t\t\tn := to.Value\n\t\t\t\t\t\tif n >= m {\n\t\t\t\t\t\t\t// Use the arithmetic series formula: (n - m + 1) * (m + n) / 2\n\t\t\t\t\t\t\tsum := (n - m + 1) * (m + n) / 2\n\n\t\t\t\t\t\t\t// Check for optional initialValue (3rd argument)\n\t\t\t\t\t\t\tif len(reduceBuiltin.Arguments) == 3 {\n\t\t\t\t\t\t\t\tif initialValue, ok := reduceBuiltin.Arguments[2].(*IntegerNode); ok {\n\t\t\t\t\t\t\t\t\tresult := initialValue.Value + sum\n\t\t\t\t\t\t\t\t\tpatchWithType(node, &IntegerNode{Value: result})\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tpatchWithType(node, &IntegerNode{Value: sum})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// isPointerPlusAcc checks if the node represents `# + #acc` pattern\nfunc isPointerPlusAcc(node Node) bool {\n\tpredicate, ok := node.(*PredicateNode)\n\tif !ok {\n\t\treturn false\n\t}\n\n\tbinary, ok := predicate.Node.(*BinaryNode)\n\tif !ok {\n\t\treturn false\n\t}\n\n\tif binary.Operator != \"+\" {\n\t\treturn false\n\t}\n\n\t// Check for # + #acc (pointer + accumulator)\n\tleftPointer, leftIsPointer := binary.Left.(*PointerNode)\n\trightPointer, rightIsPointer := binary.Right.(*PointerNode)\n\n\tif leftIsPointer && rightIsPointer {\n\t\t// # + #acc: Left is pointer (Name=\"\"), Right is acc (Name=\"acc\")\n\t\tif leftPointer.Name == \"\" && rightPointer.Name == \"acc\" {\n\t\t\treturn true\n\t\t}\n\t\t// #acc + #: Left is acc (Name=\"acc\"), Right is pointer (Name=\"\")\n\t\tif leftPointer.Name == \"acc\" && rightPointer.Name == \"\" {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// applySumPredicate tries to compute the result of sum(m..n, predicate) at compile time.\n// Returns (result, true) if optimization is possible, (0, false) otherwise.\n// Supported predicates:\n//   - # (identity): result = sum\n//   - # * k (multiply by constant): result = k * sum\n//   - k * # (multiply by constant): result = k * sum\n//   - # + k (add constant): result = sum + count * k\n//   - k + # (add constant): result = sum + count * k\n//   - # - k (subtract constant): result = sum - count * k\nfunc applySumPredicate(sum, count int, predicateArg Node) (int, bool) {\n\tpredicate, ok := predicateArg.(*PredicateNode)\n\tif !ok {\n\t\treturn 0, false\n\t}\n\n\t// Case 1: # (identity) - just return the sum\n\tif pointer, ok := predicate.Node.(*PointerNode); ok && pointer.Name == \"\" {\n\t\treturn sum, true\n\t}\n\n\t// Case 2: Binary operations with pointer and constant\n\tbinary, ok := predicate.Node.(*BinaryNode)\n\tif !ok {\n\t\treturn 0, false\n\t}\n\n\tpointer, constant, pointerOnLeft := extractPointerAndConstantWithPosition(binary)\n\tif pointer == nil || constant == nil {\n\t\treturn 0, false\n\t}\n\n\tswitch binary.Operator {\n\tcase \"*\":\n\t\t// # * k or k * # => k * sum\n\t\treturn constant.Value * sum, true\n\tcase \"+\":\n\t\t// # + k or k + # => sum + count * k\n\t\treturn sum + count*constant.Value, true\n\tcase \"-\":\n\t\tif pointerOnLeft {\n\t\t\t// # - k => sum - count * k\n\t\t\treturn sum - count*constant.Value, true\n\t\t}\n\t\t// k - # => count * k - sum\n\t\treturn count*constant.Value - sum, true\n\t}\n\n\treturn 0, false\n}\n\n// extractPointerAndConstantWithPosition extracts pointer (#) and integer constant from a binary node.\n// Returns (pointer, constant, pointerOnLeft) or (nil, nil, false) if not matching the expected pattern.\nfunc extractPointerAndConstantWithPosition(binary *BinaryNode) (*PointerNode, *IntegerNode, bool) {\n\t// Try left=pointer, right=constant\n\tif pointer, ok := binary.Left.(*PointerNode); ok && pointer.Name == \"\" {\n\t\tif constant, ok := binary.Right.(*IntegerNode); ok {\n\t\t\treturn pointer, constant, true\n\t\t}\n\t}\n\n\t// Try left=constant, right=pointer\n\tif constant, ok := binary.Left.(*IntegerNode); ok {\n\t\tif pointer, ok := binary.Right.(*PointerNode); ok && pointer.Name == \"\" {\n\t\t\treturn pointer, constant, false\n\t\t}\n\t}\n\n\treturn nil, nil, false\n}\n"
  },
  {
    "path": "optimizer/sum_range_test.go",
    "content": "package optimizer_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\t\"github.com/expr-lang/expr/optimizer\"\n\t\"github.com/expr-lang/expr/parser\"\n)\n\nfunc TestOptimize_sum_range(t *testing.T) {\n\ttree, err := parser.Parse(`sum(1..100)`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.IntegerNode{Value: 5050}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_sum_range_different_values(t *testing.T) {\n\ttests := []struct {\n\t\texpr string\n\t\twant int\n\t}{\n\t\t{`sum(1..10)`, 55},\n\t\t{`sum(1..100)`, 5050},\n\t\t{`sum(5..10)`, 45},\n\t\t{`sum(0..100)`, 5050},\n\t\t{`sum(1..1)`, 1},\n\t\t{`sum(0..0)`, 0},\n\t\t{`sum(10..20)`, 165},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.expr, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.expr)\n\t\t\trequire.NoError(t, err)\n\n\t\t\toutput, err := expr.Run(program, nil)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tt.want, output)\n\t\t})\n\t}\n}\n\nfunc TestOptimize_sum_range_with_predicate(t *testing.T) {\n\ttests := []struct {\n\t\texpr string\n\t\twant int\n\t}{\n\t\t// # (identity) - same as sum(m..n)\n\t\t{`sum(1..10, #)`, 55},\n\t\t{`sum(1..100, #)`, 5050},\n\n\t\t// # * k (multiply by constant)\n\t\t{`sum(1..10, # * 2)`, 110},    // 2 * 55\n\t\t{`sum(1..100, # * 2)`, 10100}, // 2 * 5050\n\t\t{`sum(1..10, # * 0)`, 0},\n\t\t{`sum(1..10, # * 1)`, 55},\n\n\t\t// k * # (multiply by constant, reversed)\n\t\t{`sum(1..10, 2 * #)`, 110},\n\t\t{`sum(1..100, 3 * #)`, 15150}, // 3 * 5050\n\n\t\t// # + k (add constant to each element)\n\t\t{`sum(1..10, # + 1)`, 65},    // 55 + 10*1\n\t\t{`sum(1..100, # + 1)`, 5150}, // 5050 + 100*1\n\t\t{`sum(1..10, # + 0)`, 55},\n\t\t{`sum(1..10, # + 10)`, 155}, // 55 + 10*10\n\n\t\t// k + # (add constant, reversed)\n\t\t{`sum(1..10, 1 + #)`, 65},\n\t\t{`sum(1..100, 5 + #)`, 5550}, // 5050 + 100*5\n\n\t\t// # - k (subtract constant from each element)\n\t\t{`sum(1..10, # - 1)`, 45},    // 55 - 10*1\n\t\t{`sum(1..100, # - 1)`, 4950}, // 5050 - 100*1\n\t\t{`sum(1..10, # - 0)`, 55},\n\n\t\t// k - # (constant minus each element)\n\t\t{`sum(1..10, 10 - #)`, 45}, // 10*10 - 55\n\t\t{`sum(1..10, 0 - #)`, -55}, // 10*0 - 55\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.expr, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.expr)\n\t\t\trequire.NoError(t, err)\n\n\t\t\toutput, err := expr.Run(program, nil)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tt.want, output)\n\t\t})\n\t}\n}\n\nfunc TestOptimize_sum_range_with_predicate_ast(t *testing.T) {\n\t// Verify that sum(1..10, # * 2) is optimized to a constant\n\ttree, err := parser.Parse(`sum(1..10, # * 2)`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.IntegerNode{Value: 110}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_reduce_range_sum(t *testing.T) {\n\ttree, err := parser.Parse(`reduce(1..100, # + #acc)`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.IntegerNode{Value: 5050}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_reduce_range_sum_different_values(t *testing.T) {\n\ttests := []struct {\n\t\texpr string\n\t\twant int\n\t}{\n\t\t{`reduce(1..10, # + #acc)`, 55},\n\t\t{`reduce(1..100, # + #acc)`, 5050},\n\t\t{`reduce(5..10, # + #acc)`, 45},\n\t\t{`reduce(0..100, # + #acc)`, 5050},\n\t\t{`reduce(1..1, # + #acc)`, 1},\n\t\t{`reduce(10..20, # + #acc)`, 165},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.expr, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.expr)\n\t\t\trequire.NoError(t, err)\n\n\t\t\toutput, err := expr.Run(program, nil)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tt.want, output)\n\t\t})\n\t}\n}\n\nfunc TestOptimize_reduce_range_sum_reverse_order(t *testing.T) {\n\t// Test #acc + # (reverse order) - should also be optimized\n\ttree, err := parser.Parse(`reduce(1..100, #acc + #)`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.IntegerNode{Value: 5050}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_reduce_range_sum_with_initial_value(t *testing.T) {\n\t// Test reduce with initialValue: reduce(1..100, # + #acc, 10) => 5050 + 10 = 5060\n\ttree, err := parser.Parse(`reduce(1..100, # + #acc, 10)`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\texpected := &ast.IntegerNode{Value: 5060}\n\n\tassert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))\n}\n\nfunc TestOptimize_reduce_range_sum_with_initial_value_different_values(t *testing.T) {\n\ttests := []struct {\n\t\texpr string\n\t\twant int\n\t}{\n\t\t{`reduce(1..10, # + #acc, 0)`, 55},\n\t\t{`reduce(1..10, # + #acc, 10)`, 65},\n\t\t{`reduce(1..100, # + #acc, 0)`, 5050},\n\t\t{`reduce(1..100, # + #acc, 100)`, 5150},\n\t\t{`reduce(5..10, # + #acc, 5)`, 50},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.expr, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.expr)\n\t\t\trequire.NoError(t, err)\n\n\t\t\toutput, err := expr.Run(program, nil)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tt.want, output)\n\t\t})\n\t}\n}\n\nfunc TestOptimize_sum_range_reversed(t *testing.T) {\n\t// When n < m (e.g., 10..1), the range is empty and sum should return 0.\n\t// The optimization should NOT apply (n >= m check), so runtime handles it.\n\ttests := []struct {\n\t\texpr string\n\t\twant int\n\t}{\n\t\t{`sum(10..1)`, 0},\n\t\t{`sum(5..3)`, 0},\n\t\t{`sum(100..1)`, 0},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.expr, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.expr)\n\t\t\trequire.NoError(t, err)\n\n\t\t\toutput, err := expr.Run(program, nil)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tt.want, output)\n\t\t})\n\t}\n}\n\nfunc TestOptimize_sum_range_reversed_not_optimized(t *testing.T) {\n\t// Verify that reversed ranges are NOT optimized (left as BuiltinNode)\n\ttree, err := parser.Parse(`sum(10..1)`)\n\trequire.NoError(t, err)\n\n\terr = optimizer.Optimize(&tree.Node, nil)\n\trequire.NoError(t, err)\n\n\t// Should still be a BuiltinNode, not an IntegerNode\n\t_, isBuiltin := tree.Node.(*ast.BuiltinNode)\n\tassert.True(t, isBuiltin, \"reversed range should not be optimized\")\n}\n\nfunc TestOptimize_reduce_range_reversed_errors(t *testing.T) {\n\t// reduce on empty range (reversed) should error at runtime\n\tprogram, err := expr.Compile(`reduce(10..1, # + #acc)`)\n\trequire.NoError(t, err)\n\n\t_, err = expr.Run(program, nil)\n\trequire.Error(t, err, \"reduce on empty range should error\")\n}\n\nfunc BenchmarkSumRange_Optimized(b *testing.B) {\n\tprogram, err := expr.Compile(`sum(1..100)`)\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = expr.Run(program, nil)\n\t}\n\tb.StopTimer()\n\n\trequire.Equal(b, 5050, out)\n}\n\nfunc BenchmarkReduceRangeSum_Optimized(b *testing.B) {\n\tprogram, err := expr.Compile(`reduce(1..100, # + #acc)`)\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = expr.Run(program, nil)\n\t}\n\tb.StopTimer()\n\n\trequire.Equal(b, 5050, out)\n}\n\nfunc BenchmarkSumRange_Unoptimized(b *testing.B) {\n\tprogram, err := expr.Compile(`sum(1..100)`, expr.Optimize(false))\n\trequire.NoError(b, err)\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, _ = expr.Run(program, nil)\n\t}\n\tb.StopTimer()\n\n\trequire.Equal(b, 5050, out)\n}\n"
  },
  {
    "path": "parser/bench_test.go",
    "content": "package parser\n\nimport \"testing\"\n\nfunc BenchmarkParser(b *testing.B) {\n\tconst source = `\n\t\t/*\n\t\t\tShowing worst case scenario\n\t\t*/\n\t\tlet value = trim(\"contains escapes \\n\\\"\\\\ \\U0001F600 and non ASCII ñ\"); // inline comment\n\t\tlen(value) == 0x2A\n\t\t// let's introduce an error too\n\t\twhatever\n\t`\n\tb.ReportAllocs()\n\tp := new(Parser)\n\tfor i := 0; i < b.N; i++ {\n\t\tp.Parse(source, nil)\n\t}\n}\n"
  },
  {
    "path": "parser/lexer/lexer.go",
    "content": "package lexer\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"unicode/utf8\"\n\n\t\"github.com/expr-lang/expr/file\"\n\t\"github.com/expr-lang/expr/internal/ring\"\n)\n\nconst ringChunkSize = 10\n\n// Lex will buffer and return the tokens of a disposable *[Lexer].\nfunc Lex(source file.Source) ([]Token, error) {\n\ttokens := make([]Token, 0, ringChunkSize)\n\tl := New()\n\tl.Reset(source)\n\tfor {\n\t\tt, err := l.Next()\n\t\tswitch err {\n\t\tcase nil:\n\t\t\ttokens = append(tokens, t)\n\t\tcase io.EOF:\n\t\t\treturn tokens, nil\n\t\tdefault:\n\t\t\treturn nil, err\n\t\t}\n\t}\n}\n\n// New returns a reusable lexer.\nfunc New() *Lexer {\n\treturn &Lexer{\n\t\ttokens: ring.New[Token](ringChunkSize),\n\t}\n}\n\ntype Lexer struct {\n\tstate      stateFn\n\tsource     file.Source\n\ttokens     *ring.Ring[Token]\n\terr        *file.Error\n\tstart, end struct {\n\t\tbyte, rune int\n\t}\n\teof bool\n\t// When true, keywords `if`/`else` are not treated as operators and\n\t// will be emitted as identifiers instead (for compatibility with custom if()).\n\tDisableIfOperator bool\n}\n\nfunc (l *Lexer) Reset(source file.Source) {\n\tl.source = source\n\tl.tokens.Reset()\n\tl.state = root\n}\n\nfunc (l *Lexer) Next() (Token, error) {\n\tfor l.state != nil && l.err == nil && l.tokens.Len() == 0 {\n\t\tl.state = l.state(l)\n\t}\n\tif l.err != nil {\n\t\treturn Token{}, l.err.Bind(l.source)\n\t}\n\tif t, ok := l.tokens.Dequeue(); ok {\n\t\treturn t, nil\n\t}\n\treturn Token{}, io.EOF\n}\n\nconst eof rune = -1\n\nfunc (l *Lexer) commit() {\n\tl.start = l.end\n}\n\nfunc (l *Lexer) next() rune {\n\tif l.end.byte >= len(l.source.String()) {\n\t\tl.eof = true\n\t\treturn eof\n\t}\n\tr, sz := utf8.DecodeRuneInString(l.source.String()[l.end.byte:])\n\tl.end.rune++\n\tl.end.byte += sz\n\treturn r\n}\n\nfunc (l *Lexer) peek() rune {\n\tif l.end.byte < len(l.source.String()) {\n\t\tr, _ := utf8.DecodeRuneInString(l.source.String()[l.end.byte:])\n\t\treturn r\n\t}\n\treturn eof\n}\n\nfunc (l *Lexer) backup() {\n\tif l.eof {\n\t\tl.eof = false\n\t} else if l.end.rune > 0 {\n\t\t_, sz := utf8.DecodeLastRuneInString(l.source.String()[:l.end.byte])\n\t\tl.end.byte -= sz\n\t\tl.end.rune--\n\t}\n}\n\nfunc (l *Lexer) emit(t Kind) {\n\tl.emitValue(t, l.word())\n}\n\nfunc (l *Lexer) emitValue(t Kind, value string) {\n\tl.tokens.Enqueue(Token{\n\t\tLocation: file.Location{From: l.start.rune, To: l.end.rune},\n\t\tKind:     t,\n\t\tValue:    value,\n\t})\n\tl.commit()\n}\n\nfunc (l *Lexer) emitEOF() {\n\tfrom := l.end.rune - 1\n\tif from < 0 {\n\t\tfrom = 0\n\t}\n\tto := l.end.rune - 0\n\tif to < 0 {\n\t\tto = 0\n\t}\n\tl.tokens.Enqueue(Token{\n\t\tLocation: file.Location{From: from, To: to},\n\t\tKind:     EOF,\n\t})\n\tl.commit()\n}\n\nfunc (l *Lexer) skip() {\n\tl.commit()\n}\n\nfunc (l *Lexer) word() string {\n\treturn l.source.String()[l.start.byte:l.end.byte]\n}\n\nfunc (l *Lexer) accept(valid string) bool {\n\tif strings.ContainsRune(valid, l.peek()) {\n\t\tl.next()\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (l *Lexer) acceptRun(valid string) {\n\tfor l.accept(valid) {\n\t}\n}\n\nfunc (l *Lexer) skipSpaces() {\n\tl.acceptRun(\" \")\n\tl.skip()\n}\n\nfunc (l *Lexer) error(format string, args ...any) stateFn {\n\tif l.err == nil { // show first error\n\t\tend := l.end.rune\n\t\tif l.eof {\n\t\t\tend++\n\t\t}\n\t\tl.err = &file.Error{\n\t\t\tLocation: file.Location{\n\t\t\t\tFrom: end - 1,\n\t\t\t\tTo:   end,\n\t\t\t},\n\t\t\tMessage: fmt.Sprintf(format, args...),\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc digitVal(ch rune) int {\n\tswitch {\n\tcase '0' <= ch && ch <= '9':\n\t\treturn int(ch - '0')\n\tcase 'a' <= lower(ch) && lower(ch) <= 'f':\n\t\treturn int(lower(ch) - 'a' + 10)\n\t}\n\treturn 16 // larger than any legal digit val\n}\n\nfunc lower(ch rune) rune { return ('a' - 'A') | ch } // returns lower-case ch iff ch is ASCII letter\n\nfunc (l *Lexer) scanDigits(ch rune, base, n int) rune {\n\tfor n > 0 && digitVal(ch) < base {\n\t\tch = l.next()\n\t\tn--\n\t}\n\tif n > 0 {\n\t\tl.error(\"invalid char escape\")\n\t}\n\treturn ch\n}\n\nfunc (l *Lexer) scanEscape(quote rune) rune {\n\tch := l.next() // read character after '/'\n\tswitch ch {\n\tcase 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\\\', quote:\n\t\t// nothing to do\n\t\tch = l.next()\n\tcase '0', '1', '2', '3', '4', '5', '6', '7':\n\t\tch = l.scanDigits(ch, 8, 3)\n\tcase 'x':\n\t\tch = l.scanDigits(l.next(), 16, 2)\n\tcase 'u':\n\t\t// Support variable-length form: \\u{XXXXXX}\n\t\tif l.peek() == '{' {\n\t\t\t// consume '{'\n\t\t\tl.next()\n\t\t\t// read 1-6 hex digits\n\t\t\tdigits := 0\n\t\t\tfor {\n\t\t\t\tp := l.peek()\n\t\t\t\tif p == '}' {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif digitVal(p) >= 16 {\n\t\t\t\t\tl.error(\"invalid char escape\")\n\t\t\t\t\treturn eof\n\t\t\t\t}\n\t\t\t\tif digits >= 6 {\n\t\t\t\t\tl.error(\"invalid char escape\")\n\t\t\t\t\treturn eof\n\t\t\t\t}\n\t\t\t\tl.next()\n\t\t\t\tdigits++\n\t\t\t}\n\t\t\tif l.peek() != '}' || digits == 0 {\n\t\t\t\tl.error(\"invalid char escape\")\n\t\t\t\treturn eof\n\t\t\t}\n\t\t\t// consume '}' and continue\n\t\t\tl.next()\n\t\t\tch = l.next()\n\t\t\tbreak\n\t\t}\n\t\tch = l.scanDigits(l.next(), 16, 4)\n\tcase 'U':\n\t\tch = l.scanDigits(l.next(), 16, 8)\n\tdefault:\n\t\tl.error(\"invalid char escape\")\n\t}\n\treturn ch\n}\n\nfunc (l *Lexer) scanString(quote rune) (n int) {\n\tch := l.next() // read character after quote\n\tfor ch != quote {\n\t\tif ch == '\\n' || ch == eof {\n\t\t\tl.error(\"literal not terminated\")\n\t\t\treturn\n\t\t}\n\t\tif ch == '\\\\' {\n\t\t\tch = l.scanEscape(quote)\n\t\t} else {\n\t\t\tch = l.next()\n\t\t}\n\t\tn++\n\t}\n\treturn\n}\n\nfunc (l *Lexer) scanRawString(quote rune) (n int) {\n\tvar escapedQuotes int\nloop:\n\tfor {\n\t\tch := l.next()\n\t\tfor ch == quote && l.peek() == quote {\n\t\t\t// skip current and next char which are the quote escape sequence\n\t\t\tl.next()\n\t\t\tch = l.next()\n\t\t\tescapedQuotes++\n\t\t}\n\t\tswitch ch {\n\t\tcase quote:\n\t\t\tbreak loop\n\t\tcase eof:\n\t\t\tl.error(\"literal not terminated\")\n\t\t\treturn\n\t\t}\n\t\tn++\n\t}\n\tstr := l.source.String()[l.start.byte+1 : l.end.byte-1]\n\n\t// handle simple case where no quoted backtick was found, then no allocation\n\t// is needed for the new string\n\tif escapedQuotes == 0 {\n\t\tl.emitValue(String, str)\n\t\treturn\n\t}\n\n\tvar b strings.Builder\n\tvar skipped bool\n\tb.Grow(len(str) - escapedQuotes)\n\tfor _, r := range str {\n\t\tif r == quote {\n\t\t\tif !skipped {\n\t\t\t\tskipped = true\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tskipped = false\n\t\t}\n\t\tb.WriteRune(r)\n\t}\n\tl.emitValue(String, b.String())\n\treturn\n}\n"
  },
  {
    "path": "parser/lexer/lexer_test.go",
    "content": "package lexer_test\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/file\"\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\t. \"github.com/expr-lang/expr/parser/lexer\"\n)\n\nfunc TestLex(t *testing.T) {\n\ttests := []struct {\n\t\tinput  string\n\t\ttokens []Token\n\t}{\n\t\t{\n\t\t\t\"1\",\n\t\t\t[]Token{\n\t\t\t\t{Kind: Number, Value: \"1\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\".5 0.025 1 02 1e3 0xFF 0b0101 0o600 1.2e-4 1_000_000 _42 -.5\",\n\t\t\t[]Token{\n\t\t\t\t{Kind: Number, Value: \".5\"},\n\t\t\t\t{Kind: Number, Value: \"0.025\"},\n\t\t\t\t{Kind: Number, Value: \"1\"},\n\t\t\t\t{Kind: Number, Value: \"02\"},\n\t\t\t\t{Kind: Number, Value: \"1e3\"},\n\t\t\t\t{Kind: Number, Value: \"0xFF\"},\n\t\t\t\t{Kind: Number, Value: \"0b0101\"},\n\t\t\t\t{Kind: Number, Value: \"0o600\"},\n\t\t\t\t{Kind: Number, Value: \"1.2e-4\"},\n\t\t\t\t{Kind: Number, Value: \"1_000_000\"},\n\t\t\t\t{Kind: Identifier, Value: \"_42\"},\n\t\t\t\t{Kind: Operator, Value: \"-\"},\n\t\t\t\t{Kind: Number, Value: \".5\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`\"double\" 'single' \"abc \\n\\t\\\"\\\\\" '\"\\'' \"'\\\"\" \"\\xC3\\xBF\\u263A\\U000003A8\" '❤️'`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: String, Value: \"double\"},\n\t\t\t\t{Kind: String, Value: \"single\"},\n\t\t\t\t{Kind: String, Value: \"abc \\n\\t\\\"\\\\\"},\n\t\t\t\t{Kind: String, Value: \"\\\"'\"},\n\t\t\t\t{Kind: String, Value: \"'\\\"\"},\n\t\t\t\t{Kind: String, Value: \"Ã¿☺Ψ\"},\n\t\t\t\t{Kind: String, Value: \"❤️\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"`backtick` `hello\\u263Aworld` `hello\\n\\tworld` `hello\\\"world'`  `\\xC3\\xBF\\u263A\\U000003A8` `❤️`\",\n\t\t\t[]Token{\n\t\t\t\t{Kind: String, Value: `backtick`},\n\t\t\t\t{Kind: String, Value: `hello☺world`},\n\t\t\t\t{Kind: String, Value: `hello\n\tworld`},\n\t\t\t\t{Kind: String, Value: `hello\"world'`},\n\t\t\t\t{Kind: String, Value: `ÿ☺Ψ`},\n\t\t\t\t{Kind: String, Value: \"❤️\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"`escaped backticks` `` `a``b` ```` `a``` ```b` ```a````b``` ```````` ```a````` `````b```\",\n\t\t\t[]Token{\n\t\t\t\t{Kind: String, Value: \"escaped backticks\"},\n\t\t\t\t{Kind: String, Value: \"\"},\n\t\t\t\t{Kind: String, Value: \"a`b\"},\n\t\t\t\t{Kind: String, Value: \"`\"},\n\t\t\t\t{Kind: String, Value: \"a`\"},\n\t\t\t\t{Kind: String, Value: \"`b\"},\n\t\t\t\t{Kind: String, Value: \"`a``b`\"},\n\t\t\t\t{Kind: String, Value: \"```\"},\n\t\t\t\t{Kind: String, Value: \"`a``\"},\n\t\t\t\t{Kind: String, Value: \"``b`\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"a and orb().val #.\",\n\t\t\t[]Token{\n\t\t\t\t{Kind: Identifier, Value: \"a\"},\n\t\t\t\t{Kind: Operator, Value: \"and\"},\n\t\t\t\t{Kind: Identifier, Value: \"orb\"},\n\t\t\t\t{Kind: Bracket, Value: \"(\"},\n\t\t\t\t{Kind: Bracket, Value: \")\"},\n\t\t\t\t{Kind: Operator, Value: \".\"},\n\t\t\t\t{Kind: Identifier, Value: \"val\"},\n\t\t\t\t{Kind: Operator, Value: \"#\"},\n\t\t\t\t{Kind: Operator, Value: \".\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"foo?.bar\",\n\t\t\t[]Token{\n\n\t\t\t\t{Kind: Identifier, Value: \"foo\"},\n\t\t\t\t{Kind: Operator, Value: \"?.\"},\n\t\t\t\t{Kind: Identifier, Value: \"bar\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"foo ? .bar : .baz\",\n\t\t\t[]Token{\n\n\t\t\t\t{Kind: Identifier, Value: \"foo\"},\n\t\t\t\t{Kind: Operator, Value: \"?\"},\n\t\t\t\t{Kind: Operator, Value: \".\"},\n\t\t\t\t{Kind: Identifier, Value: \"bar\"},\n\t\t\t\t{Kind: Operator, Value: \":\"},\n\t\t\t\t{Kind: Operator, Value: \".\"},\n\t\t\t\t{Kind: Identifier, Value: \"baz\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"func?()\",\n\t\t\t[]Token{\n\n\t\t\t\t{Kind: Identifier, Value: \"func\"},\n\t\t\t\t{Kind: Operator, Value: \"?\"},\n\t\t\t\t{Kind: Bracket, Value: \"(\"},\n\t\t\t\t{Kind: Bracket, Value: \")\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"array?[]\",\n\t\t\t[]Token{\n\n\t\t\t\t{Kind: Identifier, Value: \"array\"},\n\t\t\t\t{Kind: Operator, Value: \"?\"},\n\t\t\t\t{Kind: Bracket, Value: \"[\"},\n\t\t\t\t{Kind: Bracket, Value: \"]\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`not in not abc not i not(false) not  in not   in`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Operator, Value: \"not\"},\n\t\t\t\t{Kind: Operator, Value: \"in\"},\n\t\t\t\t{Kind: Operator, Value: \"not\"},\n\t\t\t\t{Kind: Identifier, Value: \"abc\"},\n\t\t\t\t{Kind: Operator, Value: \"not\"},\n\t\t\t\t{Kind: Identifier, Value: \"i\"},\n\t\t\t\t{Kind: Operator, Value: \"not\"},\n\t\t\t\t{Kind: Bracket, Value: \"(\"},\n\t\t\t\t{Kind: Identifier, Value: \"false\"},\n\t\t\t\t{Kind: Bracket, Value: \")\"},\n\t\t\t\t{Kind: Operator, Value: \"not\"},\n\t\t\t\t{Kind: Operator, Value: \"in\"},\n\t\t\t\t{Kind: Operator, Value: \"not\"},\n\t\t\t\t{Kind: Operator, Value: \"in\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"not in_var\",\n\t\t\t[]Token{\n\t\t\t\t{Kind: Operator, Value: \"not\"},\n\t\t\t\t{Kind: Identifier, Value: \"in_var\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"not in\",\n\t\t\t[]Token{\n\t\t\t\t{Kind: Operator, Value: \"not\"},\n\t\t\t\t{Kind: Operator, Value: \"in\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`1..5`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Number, Value: \"1\"},\n\t\t\t\t{Kind: Operator, Value: \"..\"},\n\t\t\t\t{Kind: Number, Value: \"5\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`$i _0 früh`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Identifier, Value: \"$i\"},\n\t\t\t\t{Kind: Identifier, Value: \"_0\"},\n\t\t\t\t{Kind: Identifier, Value: \"früh\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`foo // comment\n\t\tbar // comment`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Identifier, Value: \"foo\"},\n\t\t\t\t{Kind: Identifier, Value: \"bar\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`foo /* comment */ bar`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Identifier, Value: \"foo\"},\n\t\t\t\t{Kind: Identifier, Value: \"bar\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`foo ?? bar`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Identifier, Value: \"foo\"},\n\t\t\t\t{Kind: Operator, Value: \"??\"},\n\t\t\t\t{Kind: Identifier, Value: \"bar\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`let foo = bar;`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Operator, Value: \"let\"},\n\t\t\t\t{Kind: Identifier, Value: \"foo\"},\n\t\t\t\t{Kind: Operator, Value: \"=\"},\n\t\t\t\t{Kind: Identifier, Value: \"bar\"},\n\t\t\t\t{Kind: Operator, Value: \";\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`#index #1 #`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Operator, Value: \"#\"},\n\t\t\t\t{Kind: Identifier, Value: \"index\"},\n\t\t\t\t{Kind: Operator, Value: \"#\"},\n\t\t\t\t{Kind: Identifier, Value: \"1\"},\n\t\t\t\t{Kind: Operator, Value: \"#\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`: ::`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Operator, Value: \":\"},\n\t\t\t\t{Kind: Operator, Value: \"::\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`if a>b {x1+x2} else {x2}`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Operator, Value: \"if\"},\n\t\t\t\t{Kind: Identifier, Value: \"a\"},\n\t\t\t\t{Kind: Operator, Value: \">\"},\n\t\t\t\t{Kind: Identifier, Value: \"b\"},\n\t\t\t\t{Kind: Bracket, Value: \"{\"},\n\t\t\t\t{Kind: Identifier, Value: \"x1\"},\n\t\t\t\t{Kind: Operator, Value: \"+\"},\n\t\t\t\t{Kind: Identifier, Value: \"x2\"},\n\t\t\t\t{Kind: Bracket, Value: \"}\"},\n\t\t\t\t{Kind: Operator, Value: \"else\"},\n\t\t\t\t{Kind: Bracket, Value: \"{\"},\n\t\t\t\t{Kind: Identifier, Value: \"x2\"},\n\t\t\t\t{Kind: Bracket, Value: \"}\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`a>b if {x1} else {x2}`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Identifier, Value: \"a\"},\n\t\t\t\t{Kind: Operator, Value: \">\"},\n\t\t\t\t{Kind: Identifier, Value: \"b\"},\n\t\t\t\t{Kind: Operator, Value: \"if\"},\n\t\t\t\t{Kind: Bracket, Value: \"{\"},\n\t\t\t\t{Kind: Identifier, Value: \"x1\"},\n\t\t\t\t{Kind: Bracket, Value: \"}\"},\n\t\t\t\t{Kind: Operator, Value: \"else\"},\n\t\t\t\t{Kind: Bracket, Value: \"{\"},\n\t\t\t\t{Kind: Identifier, Value: \"x2\"},\n\t\t\t\t{Kind: Bracket, Value: \"}\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"\\\"\\\\u{61}\\\\u{1F600}\\\" '\\\\u{61}\\\\u{1F600}'\",\n\t\t\t[]Token{\n\t\t\t\t{Kind: String, Value: \"a😀\"},\n\t\t\t\t{Kind: String, Value: \"a😀\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`b\"hello\" b'world'`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Bytes, Value: \"hello\"},\n\t\t\t\t{Kind: Bytes, Value: \"world\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`b\"\\x00\\xff\" b'\\x41\\x42\\x43'`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Bytes, Value: \"\\x00\\xff\"},\n\t\t\t\t{Kind: Bytes, Value: \"ABC\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`b\"\\101\\102\\103\" b'\\n\\t\\r'`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Bytes, Value: \"ABC\"},\n\t\t\t\t{Kind: Bytes, Value: \"\\n\\t\\r\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`b\"\"`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Bytes, Value: \"\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`B\"hello\" B'world'`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Bytes, Value: \"hello\"},\n\t\t\t\t{Kind: Bytes, Value: \"world\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`b\"ÿ\"`,\n\t\t\t[]Token{\n\t\t\t\t{Kind: Bytes, Value: \"\\xc3\\xbf\"},\n\t\t\t\t{Kind: EOF},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\ttokens, err := Lex(file.NewSource(test.input))\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"%s:\\n%v\", test.input, err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif !compareTokens(tokens, test.tokens) {\n\t\t\t\tt.Errorf(\"%s:\\ngot\\n\\t%+v\\nexpected\\n\\t%v\", test.input, tokens, test.tokens)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc compareTokens(i1, i2 []Token) bool {\n\tif len(i1) != len(i2) {\n\t\treturn false\n\t}\n\tfor k := range i1 {\n\t\tif i1[k].Kind != i2[k].Kind {\n\t\t\treturn false\n\t\t}\n\t\tif i1[k].Value != i2[k].Value {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc TestLex_location(t *testing.T) {\n\tsource := file.NewSource(\"1..2\\n3..4\")\n\ttokens, err := Lex(source)\n\trequire.NoError(t, err)\n\trequire.Equal(t, []Token{\n\t\t{Location: file.Location{From: 0, To: 1}, Kind: Number, Value: \"1\"},\n\t\t{Location: file.Location{From: 1, To: 3}, Kind: Operator, Value: \"..\"},\n\t\t{Location: file.Location{From: 3, To: 4}, Kind: Number, Value: \"2\"},\n\t\t{Location: file.Location{From: 5, To: 6}, Kind: Number, Value: \"3\"},\n\t\t{Location: file.Location{From: 6, To: 8}, Kind: Operator, Value: \"..\"},\n\t\t{Location: file.Location{From: 8, To: 9}, Kind: Number, Value: \"4\"},\n\t\t{Location: file.Location{From: 8, To: 9}, Kind: EOF, Value: \"\"},\n\t}, tokens)\n}\n\nconst errorTests = `\n\"\\xQA\"\ninvalid char escape (1:4)\n | \"\\xQA\"\n | ...^\n\nid \"hello\nliteral not terminated (1:10)\n | id \"hello\n | .........^\n\nid ` + \"`\" + `hello\nliteral not terminated (1:10)\n | id ` + \"`\" + `hello\n | .........^\n\nid ` + \"`\" + `hello` + \"``\" + `\nliteral not terminated (1:12)\n | id ` + \"`\" + `hello` + \"``\" + `\n | ...........^\n\nid ` + \"```\" + `hello\nliteral not terminated (1:12)\n | id ` + \"```\" + `hello\n | ...........^\n\nid ` + \"`\" + `hello` + \"``\" + ` world\nliteral not terminated (1:18)\n | id ` + \"`\" + `hello` + \"``\" + ` world\n | .................^\n\nfrüh ♥︎\nunrecognized character: U+2665 '♥' (1:6)\n | früh ♥︎\n | .....^\n\nb\"\\u0041\"\nunable to unescape string (1:9)\n | b\"\\u0041\"\n | ........^\n\nb'\\U00000041'\nunable to unescape string (1:13)\n | b'\\U00000041'\n | ............^\n`\n\nfunc TestLex_error(t *testing.T) {\n\ttests := strings.Split(strings.Trim(errorTests, \"\\n\"), \"\\n\\n\")\n\n\tfor _, test := range tests {\n\t\tinput := strings.SplitN(test, \"\\n\", 2)\n\t\tif len(input) != 2 {\n\t\t\tt.Errorf(\"syntax error in test: %q\", test)\n\t\t\tbreak\n\t\t}\n\n\t\t_, err := Lex(file.NewSource(input[0]))\n\t\tif err == nil {\n\t\t\terr = fmt.Errorf(\"<nil>\")\n\t\t}\n\n\t\tassert.Equal(t, input[1], err.Error(), input[0])\n\t}\n}\n"
  },
  {
    "path": "parser/lexer/state.go",
    "content": "package lexer\n\nimport (\n\t\"strings\"\n\n\t\"github.com/expr-lang/expr/parser/utils\"\n)\n\ntype stateFn func(*Lexer) stateFn\n\nfunc root(l *Lexer) stateFn {\n\tswitch r := l.next(); {\n\tcase r == eof:\n\t\tl.emitEOF()\n\t\treturn nil\n\tcase utils.IsSpace(r):\n\t\tl.skip()\n\t\treturn root\n\tcase r == '\\'' || r == '\"':\n\t\tl.scanString(r)\n\t\tstr, err := unescape(l.word())\n\t\tif err != nil {\n\t\t\tl.error(\"%v\", err)\n\t\t}\n\t\tl.emitValue(String, str)\n\tcase r == '`':\n\t\tl.scanRawString(r)\n\tcase (r == 'b' || r == 'B') && (l.peek() == '\\'' || l.peek() == '\"'):\n\t\tquote := l.next()\n\t\tl.scanString(quote)\n\t\tstr, err := unescapeBytes(l.word()[1:]) // skip 'b'\n\t\tif err != nil {\n\t\t\tl.error(\"%v\", err)\n\t\t}\n\t\tl.emitValue(Bytes, str)\n\tcase '0' <= r && r <= '9':\n\t\tl.backup()\n\t\treturn number\n\tcase r == '?':\n\t\treturn questionMark\n\tcase r == '/':\n\t\treturn slash\n\tcase r == '#':\n\t\treturn pointer\n\tcase r == '|':\n\t\tl.accept(\"|\")\n\t\tl.emit(Operator)\n\tcase r == ':':\n\t\tl.accept(\":\")\n\t\tl.emit(Operator)\n\tcase strings.ContainsRune(\"([{\", r):\n\t\tl.emit(Bracket)\n\tcase strings.ContainsRune(\")]}\", r):\n\t\tl.emit(Bracket)\n\tcase strings.ContainsRune(\",;%+-^\", r): // single rune operator\n\t\tl.emit(Operator)\n\tcase strings.ContainsRune(\"&!=*<>\", r): // possible double rune operator\n\t\tl.accept(\"&=*\")\n\t\tl.emit(Operator)\n\tcase r == '.':\n\t\tl.backup()\n\t\treturn dot\n\tcase utils.IsAlphaNumeric(r):\n\t\tl.backup()\n\t\treturn identifier\n\tdefault:\n\t\treturn l.error(\"unrecognized character: %#U\", r)\n\t}\n\treturn root\n}\n\nfunc number(l *Lexer) stateFn {\n\tif !l.scanNumber() {\n\t\treturn l.error(\"bad number syntax: %q\", l.word())\n\t}\n\tl.emit(Number)\n\treturn root\n}\n\nfunc (l *Lexer) scanNumber() bool {\n\tdigits := \"0123456789_\"\n\t// Is it hex?\n\tif l.accept(\"0\") {\n\t\t// Note: Leading 0 does not mean octal in floats.\n\t\tif l.accept(\"xX\") {\n\t\t\tdigits = \"0123456789abcdefABCDEF_\"\n\t\t} else if l.accept(\"oO\") {\n\t\t\tdigits = \"01234567_\"\n\t\t} else if l.accept(\"bB\") {\n\t\t\tdigits = \"01_\"\n\t\t}\n\t}\n\tl.acceptRun(digits)\n\tend := l.end\n\tif l.accept(\".\") {\n\t\t// Lookup for .. operator: if after dot there is another dot (1..2), it maybe a range operator.\n\t\tif l.peek() == '.' {\n\t\t\t// We can't backup() here, as it would require two backups,\n\t\t\t// and backup() func supports only one for now. So, save and\n\t\t\t// restore it here.\n\t\t\tl.end = end\n\t\t\treturn true\n\t\t}\n\t\tl.acceptRun(digits)\n\t}\n\tif l.accept(\"eE\") {\n\t\tl.accept(\"+-\")\n\t\tl.acceptRun(digits)\n\t}\n\t// Next thing mustn't be alphanumeric.\n\tif utils.IsAlphaNumeric(l.peek()) {\n\t\tl.next()\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc dot(l *Lexer) stateFn {\n\tl.next()\n\tif l.accept(\"0123456789\") {\n\t\tl.backup()\n\t\treturn number\n\t}\n\tl.accept(\".\")\n\tl.emit(Operator)\n\treturn root\n}\n\nfunc identifier(l *Lexer) stateFn {\nloop:\n\tfor {\n\t\tswitch r := l.next(); {\n\t\tcase utils.IsAlphaNumeric(r):\n\t\t\t// absorb\n\t\tdefault:\n\t\t\tl.backup()\n\t\t\tswitch l.word() {\n\t\t\tcase \"not\":\n\t\t\t\treturn not\n\t\t\tcase \"in\", \"or\", \"and\", \"matches\", \"contains\", \"startsWith\", \"endsWith\", \"let\":\n\t\t\t\tl.emit(Operator)\n\t\t\tcase \"if\", \"else\":\n\t\t\t\tif !l.DisableIfOperator {\n\t\t\t\t\tl.emit(Operator)\n\t\t\t\t} else {\n\t\t\t\t\tl.emit(Identifier)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tl.emit(Identifier)\n\t\t\t}\n\t\t\tbreak loop\n\t\t}\n\t}\n\treturn root\n}\n\nfunc not(l *Lexer) stateFn {\n\tl.emit(Operator)\n\n\tl.skipSpaces()\n\n\tend := l.end\n\n\t// Get the next word.\n\tfor {\n\t\tr := l.next()\n\t\tif utils.IsAlphaNumeric(r) {\n\t\t\t// absorb\n\t\t} else {\n\t\t\tl.backup()\n\t\t\tbreak\n\t\t}\n\t}\n\n\tswitch l.word() {\n\tcase \"in\", \"matches\", \"contains\", \"startsWith\", \"endsWith\":\n\t\tl.emit(Operator)\n\tdefault:\n\t\tl.end = end\n\t}\n\treturn root\n}\n\nfunc questionMark(l *Lexer) stateFn {\n\tl.accept(\".?\")\n\tl.emit(Operator)\n\treturn root\n}\n\nfunc slash(l *Lexer) stateFn {\n\tif l.accept(\"/\") {\n\t\treturn singleLineComment\n\t}\n\tif l.accept(\"*\") {\n\t\treturn multiLineComment\n\t}\n\tl.emit(Operator)\n\treturn root\n}\n\nfunc singleLineComment(l *Lexer) stateFn {\n\tfor {\n\t\tr := l.next()\n\t\tif r == eof || r == '\\n' {\n\t\t\tbreak\n\t\t}\n\t}\n\tl.skip()\n\treturn root\n}\n\nfunc multiLineComment(l *Lexer) stateFn {\n\tfor {\n\t\tr := l.next()\n\t\tif r == eof {\n\t\t\treturn l.error(\"unclosed comment\")\n\t\t}\n\t\tif r == '*' && l.accept(\"/\") {\n\t\t\tbreak\n\t\t}\n\t}\n\tl.skip()\n\treturn root\n}\n\nfunc pointer(l *Lexer) stateFn {\n\tl.accept(\"#\")\n\tl.emit(Operator)\n\tfor {\n\t\tswitch r := l.next(); {\n\t\tcase utils.IsAlphaNumeric(r): // absorb\n\t\tdefault:\n\t\t\tl.backup()\n\t\t\tif l.word() != \"\" {\n\t\t\t\tl.emit(Identifier)\n\t\t\t}\n\t\t\treturn root\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "parser/lexer/token.go",
    "content": "package lexer\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/expr-lang/expr/file\"\n)\n\ntype Kind string\n\nconst (\n\tIdentifier Kind = \"Identifier\"\n\tNumber     Kind = \"Number\"\n\tString     Kind = \"String\"\n\tBytes      Kind = \"Bytes\"\n\tOperator   Kind = \"Operator\"\n\tBracket    Kind = \"Bracket\"\n\tEOF        Kind = \"EOF\"\n)\n\ntype Token struct {\n\tfile.Location\n\tKind  Kind\n\tValue string\n}\n\nfunc (t Token) String() string {\n\tif t.Value == \"\" {\n\t\treturn string(t.Kind)\n\t}\n\treturn fmt.Sprintf(\"%s(%#v)\", t.Kind, t.Value)\n}\n\nfunc (t Token) Is(kind Kind, values ...string) bool {\n\tif kind != t.Kind {\n\t\treturn false\n\t}\n\tfor _, v := range values {\n\t\tif v == t.Value {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn len(values) == 0\n}\n"
  },
  {
    "path": "parser/lexer/utils.go",
    "content": "package lexer\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"strings\"\n\t\"unicode/utf8\"\n)\n\nvar (\n\tnewlineNormalizer = strings.NewReplacer(\"\\r\\n\", \"\\n\", \"\\r\", \"\\n\")\n)\n\n// Unescape takes a quoted string, unquotes, and unescapes it.\nfunc unescape(value string) (string, error) {\n\t// All strings normalize newlines to the \\n representation.\n\tvalue = newlineNormalizer.Replace(value)\n\tn := len(value)\n\n\t// Nothing to unescape / decode.\n\tif n < 2 {\n\t\treturn value, fmt.Errorf(\"unable to unescape string\")\n\t}\n\n\t// Quoted string of some form, must have same first and last char.\n\tif value[0] != value[n-1] || (value[0] != '\"' && value[0] != '\\'') {\n\t\treturn value, fmt.Errorf(\"unable to unescape string\")\n\t}\n\n\tvalue = value[1 : n-1]\n\n\t// The string contains escape characters.\n\t// The following logic is adapted from `strconv/quote.go`\n\tvar runeTmp [utf8.UTFMax]byte\n\tsize := 3 * uint64(n) / 2\n\tif size >= math.MaxInt {\n\t\treturn \"\", fmt.Errorf(\"too large string\")\n\t}\n\tbuf := new(strings.Builder)\n\tbuf.Grow(int(size))\n\tfor len(value) > 0 {\n\t\tc, multibyte, rest, err := unescapeChar(value)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tvalue = rest\n\t\tif c < utf8.RuneSelf || !multibyte {\n\t\t\tbuf.WriteByte(byte(c))\n\t\t} else {\n\t\t\tn := utf8.EncodeRune(runeTmp[:], c)\n\t\t\tbuf.Write(runeTmp[:n])\n\t\t}\n\t}\n\treturn buf.String(), nil\n}\n\n// unescapeBytes takes a quoted string, unquotes, and unescapes it as bytes.\nfunc unescapeBytes(value string) (string, error) {\n\t// All strings normalize newlines to the \\n representation.\n\tvalue = newlineNormalizer.Replace(value)\n\tn := len(value)\n\n\t// Nothing to unescape / decode.\n\tif n < 2 {\n\t\treturn value, fmt.Errorf(\"unable to unescape string\")\n\t}\n\n\t// Quoted string of some form, must have same first and last char.\n\tif value[0] != value[n-1] || (value[0] != '\"' && value[0] != '\\'') {\n\t\treturn value, fmt.Errorf(\"unable to unescape string\")\n\t}\n\n\tvalue = value[1 : n-1]\n\n\t// The string contains escape characters.\n\t// The following logic is adapted from `strconv/quote.go`\n\tvar runeTmp [utf8.UTFMax]byte\n\tsize := 3 * uint64(n) / 2\n\tif size >= math.MaxInt {\n\t\treturn \"\", fmt.Errorf(\"too large string\")\n\t}\n\tbuf := new(strings.Builder)\n\tbuf.Grow(int(size))\n\tfor len(value) > 0 {\n\t\tc, multibyte, rest, err := unescapeByteChar(value)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tvalue = rest\n\t\tif c < utf8.RuneSelf || !multibyte {\n\t\t\tbuf.WriteByte(byte(c))\n\t\t} else {\n\t\t\tn := utf8.EncodeRune(runeTmp[:], c)\n\t\t\tbuf.Write(runeTmp[:n])\n\t\t}\n\t}\n\treturn buf.String(), nil\n}\n\n// unescapeChar takes a string input and returns the following info:\n//\n//\tvalue - the escaped unicode rune at the front of the string.\n//\tmultibyte - whether the rune value might require multiple bytes to represent.\n//\ttail - the remainder of the input string.\n//\terr - error value, if the character could not be unescaped.\n//\n// When multibyte is true the return value may still fit within a single byte,\n// but a multibyte conversion is attempted which is more expensive than when the\n// value is known to fit within one byte.\nfunc unescapeChar(s string) (value rune, multibyte bool, tail string, err error) {\n\t// 1. Character is not an escape sequence.\n\tswitch c := s[0]; {\n\tcase c >= utf8.RuneSelf:\n\t\tr, size := utf8.DecodeRuneInString(s)\n\t\treturn r, true, s[size:], nil\n\tcase c != '\\\\':\n\t\treturn rune(s[0]), false, s[1:], nil\n\t}\n\n\t// 2. Last character is the start of an escape sequence.\n\tif len(s) <= 1 {\n\t\terr = fmt.Errorf(\"unable to unescape string, found '\\\\' as last character\")\n\t\treturn\n\t}\n\n\tc := s[1]\n\ts = s[2:]\n\t// 3. Common escape sequences shared with Google SQL\n\tswitch c {\n\tcase 'a':\n\t\tvalue = '\\a'\n\tcase 'b':\n\t\tvalue = '\\b'\n\tcase 'f':\n\t\tvalue = '\\f'\n\tcase 'n':\n\t\tvalue = '\\n'\n\tcase 'r':\n\t\tvalue = '\\r'\n\tcase 't':\n\t\tvalue = '\\t'\n\tcase 'v':\n\t\tvalue = '\\v'\n\tcase '\\\\':\n\t\tvalue = '\\\\'\n\tcase '\\'':\n\t\tvalue = '\\''\n\tcase '\"':\n\t\tvalue = '\"'\n\tcase '`':\n\t\tvalue = '`'\n\tcase '?':\n\t\tvalue = '?'\n\n\t// 4. Unicode escape sequences, reproduced from `strconv/quote.go`\n\tcase 'x', 'X', 'u', 'U':\n\t\t// Support Go/Rust-style variable-length form: \\u{XXXXXX}\n\t\tif c == 'u' && len(s) > 0 && s[0] == '{' {\n\t\t\t// consume '{'\n\t\t\ts = s[1:]\n\t\t\tvar v rune\n\t\t\tdigits := 0\n\t\t\tfor len(s) > 0 && s[0] != '}' {\n\t\t\t\tx, ok := unhex(s[0])\n\t\t\t\tif !ok {\n\t\t\t\t\terr = fmt.Errorf(\"unable to unescape string\")\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif digits >= 6 { // at most 6 hex digits\n\t\t\t\t\terr = fmt.Errorf(\"unable to unescape string\")\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tv = v<<4 | x\n\t\t\t\ts = s[1:]\n\t\t\t\tdigits++\n\t\t\t}\n\t\t\t// require closing '}' and at least 1 digit\n\t\t\tif len(s) == 0 || s[0] != '}' || digits == 0 {\n\t\t\t\terr = fmt.Errorf(\"unable to unescape string\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// consume '}'\n\t\t\ts = s[1:]\n\t\t\tif v > utf8.MaxRune {\n\t\t\t\terr = fmt.Errorf(\"unable to unescape string\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\tvalue = v\n\t\t\tmultibyte = true\n\t\t\tbreak\n\t\t}\n\t\tn := 0\n\t\tswitch c {\n\t\tcase 'x', 'X':\n\t\t\tn = 2\n\t\tcase 'u':\n\t\t\tn = 4\n\t\tcase 'U':\n\t\t\tn = 8\n\t\t}\n\t\tvar v rune\n\t\tif len(s) < n {\n\t\t\terr = fmt.Errorf(\"unable to unescape string\")\n\t\t\treturn\n\t\t}\n\t\tfor j := 0; j < n; j++ {\n\t\t\tx, ok := unhex(s[j])\n\t\t\tif !ok {\n\t\t\t\terr = fmt.Errorf(\"unable to unescape string\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\tv = v<<4 | x\n\t\t}\n\t\ts = s[n:]\n\t\tif v > utf8.MaxRune {\n\t\t\terr = fmt.Errorf(\"unable to unescape string\")\n\t\t\treturn\n\t\t}\n\t\tvalue = v\n\t\tmultibyte = true\n\n\t// 5. Octal escape sequences, must be three digits \\[0-3][0-7][0-7]\n\tcase '0', '1', '2', '3':\n\t\tif len(s) < 2 {\n\t\t\terr = fmt.Errorf(\"unable to unescape octal sequence in string\")\n\t\t\treturn\n\t\t}\n\t\tv := rune(c - '0')\n\t\tfor j := 0; j < 2; j++ {\n\t\t\tx := s[j]\n\t\t\tif x < '0' || x > '7' {\n\t\t\t\terr = fmt.Errorf(\"unable to unescape octal sequence in string\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\tv = v*8 + rune(x-'0')\n\t\t}\n\t\tif v > utf8.MaxRune {\n\t\t\terr = fmt.Errorf(\"unable to unescape string\")\n\t\t\treturn\n\t\t}\n\t\tvalue = v\n\t\ts = s[2:]\n\t\tmultibyte = true\n\n\t\t// Unknown escape sequence.\n\tdefault:\n\t\terr = fmt.Errorf(\"unable to unescape string\")\n\t}\n\n\ttail = s\n\treturn\n}\n\n// unescapeByteChar unescapes a single character or escape sequence from a bytes literal.\n// Unlike unescapeChar, this only supports byte-level escapes (\\x, octal) and rejects\n// Unicode escapes (\\u, \\U) since bytes literals represent raw byte sequences.\n//\n// Note: We cannot use strconv.UnquoteChar here because it interprets \\x and octal\n// escapes as Unicode codepoints (e.g., \\xff → codepoint 255 → 2 UTF-8 bytes),\n// whereas bytes literals require them as raw byte values (\\xff → single byte 255).\nfunc unescapeByteChar(s string) (value rune, multibyte bool, tail string, err error) {\n\t// Non-escape: return the character as-is.\n\t// For bytes literals, we accept UTF-8 sequences but they get encoded back to bytes.\n\tc := s[0]\n\tif c != '\\\\' {\n\t\tif c >= utf8.RuneSelf {\n\t\t\tr, size := utf8.DecodeRuneInString(s)\n\t\t\treturn r, true, s[size:], nil\n\t\t}\n\t\treturn rune(c), false, s[1:], nil\n\t}\n\n\t// Escape sequence: need at least one more character.\n\tif len(s) <= 1 {\n\t\treturn 0, false, \"\", fmt.Errorf(\"unable to unescape string, found '\\\\' as last character\")\n\t}\n\n\tc = s[1]\n\ts = s[2:]\n\n\tswitch c {\n\t// Simple escape sequences\n\tcase 'a':\n\t\treturn '\\a', false, s, nil\n\tcase 'b':\n\t\treturn '\\b', false, s, nil\n\tcase 'f':\n\t\treturn '\\f', false, s, nil\n\tcase 'n':\n\t\treturn '\\n', false, s, nil\n\tcase 'r':\n\t\treturn '\\r', false, s, nil\n\tcase 't':\n\t\treturn '\\t', false, s, nil\n\tcase 'v':\n\t\treturn '\\v', false, s, nil\n\tcase '\\\\':\n\t\treturn '\\\\', false, s, nil\n\tcase '\\'':\n\t\treturn '\\'', false, s, nil\n\tcase '\"':\n\t\treturn '\"', false, s, nil\n\tcase '`':\n\t\treturn '`', false, s, nil\n\tcase '?':\n\t\treturn '?', false, s, nil\n\n\t// Hex escape: \\xNN (exactly 2 hex digits, value 0-255)\n\tcase 'x', 'X':\n\t\tif len(s) < 2 {\n\t\t\treturn 0, false, \"\", fmt.Errorf(\"unable to unescape string\")\n\t\t}\n\t\thi, ok1 := unhex(s[0])\n\t\tlo, ok2 := unhex(s[1])\n\t\tif !ok1 || !ok2 {\n\t\t\treturn 0, false, \"\", fmt.Errorf(\"unable to unescape string\")\n\t\t}\n\t\treturn hi<<4 | lo, false, s[2:], nil\n\n\t// Octal escape: \\NNN (3 octal digits, value 0-255)\n\tcase '0', '1', '2', '3':\n\t\tif len(s) < 2 {\n\t\t\treturn 0, false, \"\", fmt.Errorf(\"unable to unescape octal sequence in string\")\n\t\t}\n\t\tif s[0] < '0' || s[0] > '7' || s[1] < '0' || s[1] > '7' {\n\t\t\treturn 0, false, \"\", fmt.Errorf(\"unable to unescape octal sequence in string\")\n\t\t}\n\t\tv := rune(c-'0')*64 + rune(s[0]-'0')*8 + rune(s[1]-'0')\n\t\tif v > 255 {\n\t\t\treturn 0, false, \"\", fmt.Errorf(\"unable to unescape string\")\n\t\t}\n\t\treturn v, false, s[2:], nil\n\n\tdefault:\n\t\treturn 0, false, \"\", fmt.Errorf(\"unable to unescape string\")\n\t}\n}\n\nfunc unhex(b byte) (rune, bool) {\n\tc := rune(b)\n\tswitch {\n\tcase '0' <= c && c <= '9':\n\t\treturn c - '0', true\n\tcase 'a' <= c && c <= 'f':\n\t\treturn c - 'a' + 10, true\n\tcase 'A' <= c && c <= 'F':\n\t\treturn c - 'A' + 10, true\n\t}\n\treturn 0, false\n}\n"
  },
  {
    "path": "parser/operator/operator.go",
    "content": "package operator\n\ntype Associativity int\n\nconst (\n\tLeft Associativity = iota + 1\n\tRight\n)\n\ntype Operator struct {\n\tPrecedence    int\n\tAssociativity Associativity\n}\n\nfunc Less(a, b string) bool {\n\treturn Binary[a].Precedence < Binary[b].Precedence\n}\n\nfunc IsBoolean(op string) bool {\n\treturn op == \"and\" || op == \"or\" || op == \"&&\" || op == \"||\"\n}\n\nfunc AllowedNegateSuffix(op string) bool {\n\tswitch op {\n\tcase \"contains\", \"matches\", \"startsWith\", \"endsWith\", \"in\":\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n\nvar Unary = map[string]Operator{\n\t\"not\": {50, Left},\n\t\"!\":   {50, Left},\n\t\"-\":   {90, Left},\n\t\"+\":   {90, Left},\n}\n\nvar Binary = map[string]Operator{\n\t\"|\":          {0, Left},\n\t\"or\":         {10, Left},\n\t\"||\":         {10, Left},\n\t\"and\":        {15, Left},\n\t\"&&\":         {15, Left},\n\t\"==\":         {20, Left},\n\t\"!=\":         {20, Left},\n\t\"<\":          {20, Left},\n\t\">\":          {20, Left},\n\t\">=\":         {20, Left},\n\t\"<=\":         {20, Left},\n\t\"in\":         {20, Left},\n\t\"matches\":    {20, Left},\n\t\"contains\":   {20, Left},\n\t\"startsWith\": {20, Left},\n\t\"endsWith\":   {20, Left},\n\t\"..\":         {25, Left},\n\t\"+\":          {30, Left},\n\t\"-\":          {30, Left},\n\t\"*\":          {60, Left},\n\t\"/\":          {60, Left},\n\t\"%\":          {60, Left},\n\t\"**\":         {100, Right},\n\t\"^\":          {100, Right},\n\t\"??\":         {500, Left},\n}\n\nfunc IsComparison(op string) bool {\n\treturn op == \"<\" || op == \">\" || op == \">=\" || op == \"<=\"\n}\n"
  },
  {
    "path": "parser/parser.go",
    "content": "package parser\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"strconv\"\n\t\"strings\"\n\n\t. \"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/builtin\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/file\"\n\t. \"github.com/expr-lang/expr/parser/lexer\"\n\t\"github.com/expr-lang/expr/parser/operator\"\n\t\"github.com/expr-lang/expr/parser/utils\"\n)\n\ntype arg byte\n\nconst (\n\texpr arg = 1 << iota\n\tpredicate\n)\n\nconst optional arg = 1 << 7\n\nvar predicates = map[string]struct {\n\targs []arg\n}{\n\t\"all\":           {[]arg{expr, predicate}},\n\t\"none\":          {[]arg{expr, predicate}},\n\t\"any\":           {[]arg{expr, predicate}},\n\t\"one\":           {[]arg{expr, predicate}},\n\t\"filter\":        {[]arg{expr, predicate}},\n\t\"map\":           {[]arg{expr, predicate}},\n\t\"count\":         {[]arg{expr, predicate | optional}},\n\t\"sum\":           {[]arg{expr, predicate | optional}},\n\t\"find\":          {[]arg{expr, predicate}},\n\t\"findIndex\":     {[]arg{expr, predicate}},\n\t\"findLast\":      {[]arg{expr, predicate}},\n\t\"findLastIndex\": {[]arg{expr, predicate}},\n\t\"groupBy\":       {[]arg{expr, predicate}},\n\t\"sortBy\":        {[]arg{expr, predicate, expr | optional}},\n\t\"reduce\":        {[]arg{expr, predicate, expr | optional}},\n}\n\n// Parser is a reusable parser. The zero value is ready for use.\ntype Parser struct {\n\tlexer            *Lexer\n\tcurrent, stashed Token\n\thasStash         bool\n\terr              *file.Error\n\tconfig           *conf.Config\n\tdepth            int  // predicate call depth\n\tnodeCount        uint // tracks number of AST nodes created\n}\n\nfunc (p *Parser) Parse(input string, config *conf.Config) (*Tree, error) {\n\tif p.lexer == nil {\n\t\tp.lexer = New()\n\t}\n\tp.config = config\n\t// propagate config flags to lexer\n\tif p.lexer != nil {\n\t\tif config != nil {\n\t\t\tp.lexer.DisableIfOperator = config.DisableIfOperator\n\t\t} else {\n\t\t\tp.lexer.DisableIfOperator = false\n\t\t}\n\t}\n\tsource := file.NewSource(input)\n\tp.lexer.Reset(source)\n\tp.next()\n\tnode := p.parseSequenceExpression()\n\n\tif !p.current.Is(EOF) {\n\t\tp.error(\"unexpected token %v\", p.current)\n\t}\n\n\ttree := &Tree{\n\t\tNode:   node,\n\t\tSource: source,\n\t}\n\terr := p.err\n\n\t// cleanup non-reusable pointer values and reset state\n\tp.err = nil\n\tp.config = nil\n\tp.lexer.Reset(file.Source{})\n\n\tif err != nil {\n\t\treturn tree, err.Bind(source)\n\t}\n\n\treturn tree, nil\n}\n\nfunc (p *Parser) checkNodeLimit() error {\n\tp.nodeCount++\n\tif p.config == nil {\n\t\tif p.nodeCount > conf.DefaultMaxNodes {\n\t\t\tp.error(\"compilation failed: expression exceeds maximum allowed nodes\")\n\t\t\treturn nil\n\t\t}\n\t\treturn nil\n\t}\n\tif p.config.MaxNodes > 0 && p.nodeCount > p.config.MaxNodes {\n\t\tp.error(\"compilation failed: expression exceeds maximum allowed nodes\")\n\t\treturn nil\n\t}\n\treturn nil\n}\n\nfunc (p *Parser) createNode(n Node, loc file.Location) Node {\n\tif err := p.checkNodeLimit(); err != nil {\n\t\treturn nil\n\t}\n\tif n == nil || p.err != nil {\n\t\treturn nil\n\t}\n\tn.SetLocation(loc)\n\treturn n\n}\n\nfunc (p *Parser) createMemberNode(n *MemberNode, loc file.Location) *MemberNode {\n\tif err := p.checkNodeLimit(); err != nil {\n\t\treturn nil\n\t}\n\tif n == nil || p.err != nil {\n\t\treturn nil\n\t}\n\tn.SetLocation(loc)\n\treturn n\n}\n\ntype Tree struct {\n\tNode   Node\n\tSource file.Source\n}\n\nfunc Parse(input string) (*Tree, error) {\n\treturn ParseWithConfig(input, nil)\n}\n\nfunc ParseWithConfig(input string, config *conf.Config) (*Tree, error) {\n\treturn new(Parser).Parse(input, config)\n}\n\nfunc (p *Parser) error(format string, args ...any) {\n\tp.errorAt(p.current, format, args...)\n}\n\nfunc (p *Parser) errorAt(token Token, format string, args ...any) {\n\tif p.err == nil { // show first error\n\t\tp.err = &file.Error{\n\t\t\tLocation: token.Location,\n\t\t\tMessage:  fmt.Sprintf(format, args...),\n\t\t}\n\t}\n}\n\nfunc (p *Parser) next() {\n\tif p.hasStash {\n\t\tp.current = p.stashed\n\t\tp.hasStash = false\n\t\treturn\n\t}\n\n\ttoken, err := p.lexer.Next()\n\tvar e *file.Error\n\tswitch {\n\tcase err == nil:\n\t\tp.current = token\n\tcase errors.Is(err, io.EOF):\n\t\tp.error(\"unexpected end of expression\")\n\tcase errors.As(err, &e):\n\t\tp.err = e\n\tdefault:\n\t\tp.err = &file.Error{\n\t\t\tLocation: p.current.Location,\n\t\t\tMessage:  \"unknown lexing error\",\n\t\t\tPrev:     err,\n\t\t}\n\t}\n}\n\nfunc (p *Parser) expect(kind Kind, values ...string) {\n\tif p.current.Is(kind, values...) {\n\t\tp.next()\n\t\treturn\n\t}\n\tp.error(\"unexpected token %v\", p.current)\n}\n\n// parse functions\n\nfunc (p *Parser) parseSequenceExpression() Node {\n\tnodes := []Node{p.parseExpression(0)}\n\n\tfor p.current.Is(Operator, \";\") && p.err == nil {\n\t\tp.next()\n\t\t// If a trailing semicolon is present, break out.\n\t\tif p.current.Is(EOF) {\n\t\t\tbreak\n\t\t}\n\t\tnodes = append(nodes, p.parseExpression(0))\n\t}\n\n\tif len(nodes) == 1 {\n\t\treturn nodes[0]\n\t}\n\n\treturn p.createNode(&SequenceNode{\n\t\tNodes: nodes,\n\t}, nodes[0].Location())\n}\n\nfunc (p *Parser) parseExpression(precedence int) Node {\n\tif p.err != nil {\n\t\treturn nil\n\t}\n\n\tif precedence == 0 && p.current.Is(Operator, \"let\") {\n\t\treturn p.parseVariableDeclaration()\n\t}\n\n\tif precedence == 0 && (p.config == nil || !p.config.DisableIfOperator) && p.current.Is(Operator, \"if\") {\n\t\treturn p.parseConditionalIf()\n\t}\n\n\tnodeLeft := p.parsePrimary()\n\n\tprevOperator := \"\"\n\topToken := p.current\n\tfor opToken.Is(Operator) && p.err == nil {\n\t\tnegate := opToken.Is(Operator, \"not\")\n\t\tvar notToken Token\n\n\t\t// Handle \"not *\" operator, like \"not in\" or \"not contains\".\n\t\tif negate {\n\t\t\ttokenBackup := p.current\n\t\t\tp.next()\n\t\t\tif operator.AllowedNegateSuffix(p.current.Value) {\n\t\t\t\tif op, ok := operator.Binary[p.current.Value]; ok && op.Precedence >= precedence {\n\t\t\t\t\tnotToken = p.current\n\t\t\t\t\topToken = p.current\n\t\t\t\t} else {\n\t\t\t\t\tp.hasStash = true\n\t\t\t\t\tp.stashed = p.current\n\t\t\t\t\tp.current = tokenBackup\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tp.error(\"unexpected token %v\", p.current)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif op, ok := operator.Binary[opToken.Value]; ok && op.Precedence >= precedence {\n\t\t\tp.next()\n\n\t\t\tif opToken.Value == \"|\" {\n\t\t\t\tidentToken := p.current\n\t\t\t\tp.expect(Identifier)\n\t\t\t\tnodeLeft = p.parseCall(identToken, []Node{nodeLeft}, true)\n\t\t\t\tgoto next\n\t\t\t}\n\n\t\t\tif prevOperator == \"??\" && opToken.Value != \"??\" && !opToken.Is(Bracket, \"(\") {\n\t\t\t\tp.errorAt(opToken, \"Operator (%v) and coalesce expressions (??) cannot be mixed. Wrap either by parentheses.\", opToken.Value)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif operator.IsComparison(opToken.Value) {\n\t\t\t\tnodeLeft = p.parseComparison(nodeLeft, opToken, op.Precedence)\n\t\t\t\tgoto next\n\t\t\t}\n\n\t\t\tvar nodeRight Node\n\t\t\tif op.Associativity == operator.Left {\n\t\t\t\tnodeRight = p.parseExpression(op.Precedence + 1)\n\t\t\t} else {\n\t\t\t\tnodeRight = p.parseExpression(op.Precedence)\n\t\t\t}\n\n\t\t\tnodeLeft = p.createNode(&BinaryNode{\n\t\t\t\tOperator: opToken.Value,\n\t\t\t\tLeft:     nodeLeft,\n\t\t\t\tRight:    nodeRight,\n\t\t\t}, opToken.Location)\n\t\t\tif nodeLeft == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tif negate {\n\t\t\t\tnodeLeft = p.createNode(&UnaryNode{\n\t\t\t\t\tOperator: \"not\",\n\t\t\t\t\tNode:     nodeLeft,\n\t\t\t\t}, notToken.Location)\n\t\t\t\tif nodeLeft == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgoto next\n\t\t}\n\t\tbreak\n\n\tnext:\n\t\tprevOperator = opToken.Value\n\t\topToken = p.current\n\t}\n\n\tif precedence == 0 {\n\t\tnodeLeft = p.parseConditional(nodeLeft)\n\t}\n\n\treturn nodeLeft\n}\n\nfunc (p *Parser) parseVariableDeclaration() Node {\n\tp.expect(Operator, \"let\")\n\tvariableName := p.current\n\tp.expect(Identifier)\n\tp.expect(Operator, \"=\")\n\tvalue := p.parseExpression(0)\n\tp.expect(Operator, \";\")\n\tnode := p.parseSequenceExpression()\n\treturn p.createNode(&VariableDeclaratorNode{\n\t\tName:  variableName.Value,\n\t\tValue: value,\n\t\tExpr:  node,\n\t}, variableName.Location)\n}\n\nfunc (p *Parser) parseConditionalIf() Node {\n\tp.next()\n\tif p.err != nil {\n\t\treturn nil\n\t}\n\tnodeCondition := p.parseExpression(0)\n\tp.expect(Bracket, \"{\")\n\texpr1 := p.parseSequenceExpression()\n\tp.expect(Bracket, \"}\")\n\tp.expect(Operator, \"else\")\n\n\tvar expr2 Node\n\tif p.current.Is(Operator, \"if\") {\n\t\texpr2 = p.parseConditionalIf()\n\t} else {\n\t\tp.expect(Bracket, \"{\")\n\t\texpr2 = p.parseSequenceExpression()\n\t\tp.expect(Bracket, \"}\")\n\t}\n\n\treturn &ConditionalNode{\n\t\tCond: nodeCondition,\n\t\tExp1: expr1,\n\t\tExp2: expr2,\n\t}\n\n}\n\nfunc (p *Parser) parseConditional(node Node) Node {\n\tvar expr1, expr2 Node\n\tfor p.current.Is(Operator, \"?\") && p.err == nil {\n\t\tp.next()\n\n\t\tif !p.current.Is(Operator, \":\") {\n\t\t\texpr1 = p.parseExpression(0)\n\t\t\tp.expect(Operator, \":\")\n\t\t\texpr2 = p.parseExpression(0)\n\t\t} else {\n\t\t\tp.next()\n\t\t\texpr1 = node\n\t\t\texpr2 = p.parseExpression(0)\n\t\t}\n\n\t\tnode = p.createNode(&ConditionalNode{\n\t\t\tTernary: true,\n\t\t\tCond:    node,\n\t\t\tExp1:    expr1,\n\t\t\tExp2:    expr2,\n\t\t}, p.current.Location)\n\t\tif node == nil {\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn node\n}\n\nfunc (p *Parser) parsePrimary() Node {\n\ttoken := p.current\n\n\tif token.Is(Operator) {\n\t\tif op, ok := operator.Unary[token.Value]; ok {\n\t\t\tp.next()\n\t\t\texpr := p.parseExpression(op.Precedence)\n\t\t\tnode := p.createNode(&UnaryNode{\n\t\t\t\tOperator: token.Value,\n\t\t\t\tNode:     expr,\n\t\t\t}, token.Location)\n\t\t\tif node == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn p.parsePostfixExpression(node)\n\t\t}\n\t}\n\n\tif token.Is(Bracket, \"(\") {\n\t\tp.next()\n\t\texpr := p.parseSequenceExpression()\n\t\tp.expect(Bracket, \")\") // \"an opened parenthesis is not properly closed\"\n\t\treturn p.parsePostfixExpression(expr)\n\t}\n\n\tif p.depth > 0 {\n\t\tif token.Is(Operator, \"#\") || token.Is(Operator, \".\") {\n\t\t\tname := \"\"\n\t\t\tif token.Is(Operator, \"#\") {\n\t\t\t\tp.next()\n\t\t\t\tif p.current.Is(Identifier) {\n\t\t\t\t\tname = p.current.Value\n\t\t\t\t\tp.next()\n\t\t\t\t}\n\t\t\t}\n\t\t\tnode := p.createNode(&PointerNode{Name: name}, token.Location)\n\t\t\tif node == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn p.parsePostfixExpression(node)\n\t\t}\n\t}\n\n\tif token.Is(Operator, \"::\") {\n\t\tp.next()\n\t\ttoken = p.current\n\t\tp.expect(Identifier)\n\t\treturn p.parsePostfixExpression(p.parseCall(token, []Node{}, false))\n\t}\n\n\treturn p.parseSecondary()\n}\n\nfunc (p *Parser) parseSecondary() Node {\n\tvar node Node\n\ttoken := p.current\n\n\tswitch token.Kind {\n\n\tcase Identifier:\n\t\tp.next()\n\t\tswitch token.Value {\n\t\tcase \"true\":\n\t\t\tnode = p.createNode(&BoolNode{Value: true}, token.Location)\n\t\t\tif node == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn node\n\t\tcase \"false\":\n\t\t\tnode = p.createNode(&BoolNode{Value: false}, token.Location)\n\t\t\tif node == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn node\n\t\tcase \"nil\":\n\t\t\tnode = p.createNode(&NilNode{}, token.Location)\n\t\t\tif node == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn node\n\t\tdefault:\n\t\t\tif p.current.Is(Bracket, \"(\") {\n\t\t\t\tnode = p.parseCall(token, []Node{}, true)\n\t\t\t} else {\n\t\t\t\tnode = p.createNode(&IdentifierNode{Value: token.Value}, token.Location)\n\t\t\t\tif node == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\tcase Number:\n\t\tp.next()\n\t\tvalue := strings.Replace(token.Value, \"_\", \"\", -1)\n\t\tvar node Node\n\t\tvalueLower := strings.ToLower(value)\n\t\tswitch {\n\t\tcase strings.HasPrefix(valueLower, \"0x\"):\n\t\t\tnumber, err := strconv.ParseInt(value, 0, 64)\n\t\t\tif err != nil {\n\t\t\t\tp.error(\"invalid hex literal: %v\", err)\n\t\t\t}\n\t\t\tnode = p.toIntegerNode(number)\n\t\tcase strings.ContainsAny(valueLower, \".e\"):\n\t\t\tnumber, err := strconv.ParseFloat(value, 64)\n\t\t\tif err != nil {\n\t\t\t\tp.error(\"invalid float literal: %v\", err)\n\t\t\t}\n\t\t\tnode = p.toFloatNode(number)\n\t\tcase strings.HasPrefix(valueLower, \"0b\"):\n\t\t\tnumber, err := strconv.ParseInt(value, 0, 64)\n\t\t\tif err != nil {\n\t\t\t\tp.error(\"invalid binary literal: %v\", err)\n\t\t\t}\n\t\t\tnode = p.toIntegerNode(number)\n\t\tcase strings.HasPrefix(valueLower, \"0o\"):\n\t\t\tnumber, err := strconv.ParseInt(value, 0, 64)\n\t\t\tif err != nil {\n\t\t\t\tp.error(\"invalid octal literal: %v\", err)\n\t\t\t}\n\t\t\tnode = p.toIntegerNode(number)\n\t\tdefault:\n\t\t\tnumber, err := strconv.ParseInt(value, 10, 64)\n\t\t\tif err != nil {\n\t\t\t\tp.error(\"invalid integer literal: %v\", err)\n\t\t\t}\n\t\t\tnode = p.toIntegerNode(number)\n\t\t}\n\t\tif node != nil {\n\t\t\tnode.SetLocation(token.Location)\n\t\t}\n\t\treturn node\n\tcase String:\n\t\tp.next()\n\t\tnode = p.createNode(&StringNode{Value: token.Value}, token.Location)\n\t\tif node == nil {\n\t\t\treturn nil\n\t\t}\n\n\tcase Bytes:\n\t\tp.next()\n\t\tnode = p.createNode(&BytesNode{Value: []byte(token.Value)}, token.Location)\n\t\tif node == nil {\n\t\t\treturn nil\n\t\t}\n\n\tdefault:\n\t\tif token.Is(Bracket, \"[\") {\n\t\t\tnode = p.parseArrayExpression(token)\n\t\t} else if token.Is(Bracket, \"{\") {\n\t\t\tnode = p.parseMapExpression(token)\n\t\t} else {\n\t\t\tp.error(\"unexpected token %v\", token)\n\t\t}\n\t}\n\n\treturn p.parsePostfixExpression(node)\n}\n\nfunc (p *Parser) toIntegerNode(number int64) Node {\n\tif number > math.MaxInt {\n\t\tp.error(\"integer literal is too large\")\n\t\treturn nil\n\t}\n\treturn p.createNode(&IntegerNode{Value: int(number)}, p.current.Location)\n}\n\nfunc (p *Parser) toFloatNode(number float64) Node {\n\tif number > math.MaxFloat64 {\n\t\tp.error(\"float literal is too large\")\n\t\treturn nil\n\t}\n\treturn p.createNode(&FloatNode{Value: number}, p.current.Location)\n}\n\nfunc (p *Parser) parseCall(token Token, arguments []Node, checkOverrides bool) Node {\n\tvar node Node\n\n\tisOverridden := false\n\tif p.config != nil {\n\t\tisOverridden = p.config.IsOverridden(token.Value)\n\t}\n\tisOverridden = isOverridden && checkOverrides\n\n\tif b, ok := predicates[token.Value]; ok && !isOverridden {\n\t\tp.expect(Bracket, \"(\")\n\n\t\t// In case of the pipe operator, the first argument is the left-hand side\n\t\t// of the operator, so we do not parse it as an argument inside brackets.\n\t\targs := b.args[len(arguments):]\n\n\t\tfor i, arg := range args {\n\t\t\tif arg&optional == optional {\n\t\t\t\tif p.current.Is(Bracket, \")\") {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif p.current.Is(Bracket, \")\") {\n\t\t\t\t\tp.error(\"expected at least %d arguments\", len(args))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif i > 0 {\n\t\t\t\tp.expect(Operator, \",\")\n\t\t\t}\n\t\t\tvar node Node\n\t\t\tswitch {\n\t\t\tcase arg&expr == expr:\n\t\t\t\tnode = p.parseExpression(0)\n\t\t\tcase arg&predicate == predicate:\n\t\t\t\tnode = p.parsePredicate()\n\t\t\t}\n\t\t\targuments = append(arguments, node)\n\t\t}\n\n\t\t// skip last comma\n\t\tif p.current.Is(Operator, \",\") {\n\t\t\tp.next()\n\t\t}\n\t\tp.expect(Bracket, \")\")\n\n\t\tnode = p.createNode(&BuiltinNode{\n\t\t\tName:      token.Value,\n\t\t\tArguments: arguments,\n\t\t}, token.Location)\n\t\tif node == nil {\n\t\t\treturn nil\n\t\t}\n\t} else if _, ok := builtin.Index[token.Value]; ok && (p.config == nil || !p.config.Disabled[token.Value]) && !isOverridden {\n\t\tnode = p.createNode(&BuiltinNode{\n\t\t\tName:      token.Value,\n\t\t\tArguments: p.parseArguments(arguments),\n\t\t}, token.Location)\n\t\tif node == nil {\n\t\t\treturn nil\n\t\t}\n\n\t} else {\n\t\tcallee := p.createNode(&IdentifierNode{Value: token.Value}, token.Location)\n\t\tif callee == nil {\n\t\t\treturn nil\n\t\t}\n\t\tnode = p.createNode(&CallNode{\n\t\t\tCallee:    callee,\n\t\t\tArguments: p.parseArguments(arguments),\n\t\t}, token.Location)\n\t\tif node == nil {\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn node\n}\n\nfunc (p *Parser) parseArguments(arguments []Node) []Node {\n\t// If pipe operator is used, the first argument is the left-hand side\n\t// of the operator, so we do not parse it as an argument inside brackets.\n\toffset := len(arguments)\n\n\tp.expect(Bracket, \"(\")\n\tfor !p.current.Is(Bracket, \")\") && p.err == nil {\n\t\tif len(arguments) > offset {\n\t\t\tp.expect(Operator, \",\")\n\t\t}\n\t\tif p.current.Is(Bracket, \")\") {\n\t\t\tbreak\n\t\t}\n\t\tnode := p.parseExpression(0)\n\t\targuments = append(arguments, node)\n\t}\n\tp.expect(Bracket, \")\")\n\n\treturn arguments\n}\n\nfunc (p *Parser) parsePredicate() Node {\n\tstartToken := p.current\n\twithBrackets := false\n\tif p.current.Is(Bracket, \"{\") {\n\t\tp.next()\n\t\twithBrackets = true\n\t}\n\n\tp.depth++\n\tvar node Node\n\tif withBrackets {\n\t\tnode = p.parseSequenceExpression()\n\t} else {\n\t\tnode = p.parseExpression(0)\n\t\tif p.current.Is(Operator, \";\") {\n\t\t\tp.error(\"wrap predicate with brackets { and }\")\n\t\t}\n\t}\n\tp.depth--\n\n\tif withBrackets {\n\t\tp.expect(Bracket, \"}\")\n\t}\n\tpredicateNode := p.createNode(&PredicateNode{\n\t\tNode: node,\n\t}, startToken.Location)\n\tif predicateNode == nil {\n\t\treturn nil\n\t}\n\treturn predicateNode\n}\n\nfunc (p *Parser) parseArrayExpression(token Token) Node {\n\tnodes := make([]Node, 0)\n\n\tp.expect(Bracket, \"[\")\n\tfor !p.current.Is(Bracket, \"]\") && p.err == nil {\n\t\tif len(nodes) > 0 {\n\t\t\tp.expect(Operator, \",\")\n\t\t\tif p.current.Is(Bracket, \"]\") {\n\t\t\t\tgoto end\n\t\t\t}\n\t\t}\n\t\tnode := p.parseExpression(0)\n\t\tnodes = append(nodes, node)\n\t}\nend:\n\tp.expect(Bracket, \"]\")\n\n\tnode := p.createNode(&ArrayNode{Nodes: nodes}, token.Location)\n\tif node == nil {\n\t\treturn nil\n\t}\n\treturn node\n}\n\nfunc (p *Parser) parseMapExpression(token Token) Node {\n\tp.expect(Bracket, \"{\")\n\n\tnodes := make([]Node, 0)\n\tfor !p.current.Is(Bracket, \"}\") && p.err == nil {\n\t\tif len(nodes) > 0 {\n\t\t\tp.expect(Operator, \",\")\n\t\t\tif p.current.Is(Bracket, \"}\") {\n\t\t\t\tgoto end\n\t\t\t}\n\t\t\tif p.current.Is(Operator, \",\") {\n\t\t\t\tp.error(\"unexpected token %v\", p.current)\n\t\t\t}\n\t\t}\n\n\t\tvar key Node\n\t\t// Map key can be one of:\n\t\t//  * number\n\t\t//  * string\n\t\t//  * identifier, which is equivalent to a string\n\t\t//  * expression, which must be enclosed in parentheses -- (1 + 2)\n\t\tif p.current.Is(Number) || p.current.Is(String) || p.current.Is(Identifier) {\n\t\t\tkey = p.createNode(&StringNode{Value: p.current.Value}, p.current.Location)\n\t\t\tif key == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tp.next()\n\t\t} else if p.current.Is(Bracket, \"(\") {\n\t\t\tkey = p.parseExpression(0)\n\t\t} else {\n\t\t\tp.error(\"a map key must be a quoted string, a number, a identifier, or an expression enclosed in parentheses (unexpected token %v)\", p.current)\n\t\t}\n\n\t\tp.expect(Operator, \":\")\n\n\t\tnode := p.parseExpression(0)\n\t\tpair := p.createNode(&PairNode{Key: key, Value: node}, token.Location)\n\t\tif pair == nil {\n\t\t\treturn nil\n\t\t}\n\t\tnodes = append(nodes, pair)\n\t}\n\nend:\n\tp.expect(Bracket, \"}\")\n\n\tnode := p.createNode(&MapNode{Pairs: nodes}, token.Location)\n\tif node == nil {\n\t\treturn nil\n\t}\n\treturn node\n}\n\nfunc (p *Parser) parsePostfixExpression(node Node) Node {\n\tpostfixToken := p.current\n\tfor (postfixToken.Is(Operator) || postfixToken.Is(Bracket)) && p.err == nil {\n\t\toptional := postfixToken.Value == \"?.\"\n\tparseToken:\n\t\tif postfixToken.Value == \".\" || postfixToken.Value == \"?.\" {\n\t\t\tp.next()\n\n\t\t\tpropertyToken := p.current\n\t\t\tif optional && propertyToken.Is(Bracket, \"[\") {\n\t\t\t\tpostfixToken = propertyToken\n\t\t\t\tgoto parseToken\n\t\t\t}\n\t\t\tp.next()\n\n\t\t\tif propertyToken.Kind != Identifier &&\n\t\t\t\t// Operators like \"not\" and \"matches\" are valid methods or property names.\n\t\t\t\t(propertyToken.Kind != Operator || !utils.IsValidIdentifier(propertyToken.Value)) {\n\t\t\t\tp.error(\"expected name\")\n\t\t\t}\n\n\t\t\tproperty := p.createNode(&StringNode{Value: propertyToken.Value}, propertyToken.Location)\n\t\t\tif property == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tchainNode, isChain := node.(*ChainNode)\n\t\t\toptional := postfixToken.Value == \"?.\"\n\n\t\t\tif isChain {\n\t\t\t\tnode = chainNode.Node\n\t\t\t}\n\n\t\t\tmemberNode := p.createMemberNode(&MemberNode{\n\t\t\t\tNode:     node,\n\t\t\t\tProperty: property,\n\t\t\t\tOptional: optional,\n\t\t\t}, propertyToken.Location)\n\t\t\tif memberNode == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tif p.current.Is(Bracket, \"(\") {\n\t\t\t\tmemberNode.Method = true\n\t\t\t\tnode = p.createNode(&CallNode{\n\t\t\t\t\tCallee:    memberNode,\n\t\t\t\t\tArguments: p.parseArguments([]Node{}),\n\t\t\t\t}, propertyToken.Location)\n\t\t\t\tif node == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnode = memberNode\n\t\t\t}\n\n\t\t\tif isChain || optional {\n\t\t\t\tnode = p.createNode(&ChainNode{Node: node}, propertyToken.Location)\n\t\t\t\tif node == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else if postfixToken.Value == \"[\" {\n\t\t\tp.next()\n\t\t\tvar from, to Node\n\n\t\t\tif p.current.Is(Operator, \":\") { // slice without from [:1]\n\t\t\t\tp.next()\n\n\t\t\t\tif !p.current.Is(Bracket, \"]\") { // slice without from and to [:]\n\t\t\t\t\tto = p.parseExpression(0)\n\t\t\t\t}\n\n\t\t\t\tnode = p.createNode(&SliceNode{\n\t\t\t\t\tNode: node,\n\t\t\t\t\tTo:   to,\n\t\t\t\t}, postfixToken.Location)\n\t\t\t\tif node == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tp.expect(Bracket, \"]\")\n\n\t\t\t} else {\n\n\t\t\t\tfrom = p.parseExpression(0)\n\n\t\t\t\tif p.current.Is(Operator, \":\") {\n\t\t\t\t\tp.next()\n\n\t\t\t\t\tif !p.current.Is(Bracket, \"]\") { // slice without to [1:]\n\t\t\t\t\t\tto = p.parseExpression(0)\n\t\t\t\t\t}\n\n\t\t\t\t\tnode = p.createNode(&SliceNode{\n\t\t\t\t\t\tNode: node,\n\t\t\t\t\t\tFrom: from,\n\t\t\t\t\t\tTo:   to,\n\t\t\t\t\t}, postfixToken.Location)\n\t\t\t\t\tif node == nil {\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t}\n\t\t\t\t\tp.expect(Bracket, \"]\")\n\n\t\t\t\t} else {\n\t\t\t\t\t// Slice operator [:] was not found,\n\t\t\t\t\t// it should be just an index node.\n\t\t\t\t\tnode = p.createNode(&MemberNode{\n\t\t\t\t\t\tNode:     node,\n\t\t\t\t\t\tProperty: from,\n\t\t\t\t\t\tOptional: optional,\n\t\t\t\t\t}, postfixToken.Location)\n\t\t\t\t\tif node == nil {\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t}\n\t\t\t\t\tif optional {\n\t\t\t\t\t\tnode = p.createNode(&ChainNode{Node: node}, postfixToken.Location)\n\t\t\t\t\t\tif node == nil {\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tp.expect(Bracket, \"]\")\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t\tpostfixToken = p.current\n\t}\n\treturn node\n}\nfunc (p *Parser) parseComparison(left Node, token Token, precedence int) Node {\n\tvar rootNode Node\n\tfor {\n\t\tcomparator := p.parseExpression(precedence + 1)\n\t\tcmpNode := p.createNode(&BinaryNode{\n\t\t\tOperator: token.Value,\n\t\t\tLeft:     left,\n\t\t\tRight:    comparator,\n\t\t}, token.Location)\n\t\tif cmpNode == nil {\n\t\t\treturn nil\n\t\t}\n\t\tif rootNode == nil {\n\t\t\trootNode = cmpNode\n\t\t} else {\n\t\t\trootNode = p.createNode(&BinaryNode{\n\t\t\t\tOperator: \"&&\",\n\t\t\t\tLeft:     rootNode,\n\t\t\t\tRight:    cmpNode,\n\t\t\t}, token.Location)\n\t\t\tif rootNode == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\n\t\tleft = comparator\n\t\ttoken = p.current\n\t\tif !(token.Is(Operator) && operator.IsComparison(token.Value) && p.err == nil) {\n\t\t\tbreak\n\t\t}\n\t\tp.next()\n\t}\n\treturn rootNode\n}\n"
  },
  {
    "path": "parser/parser_test.go",
    "content": "package parser_test\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t. \"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/parser\"\n)\n\nfunc TestParse(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\twant  Node\n\t}{\n\t\t{\n\t\t\t\"a\",\n\t\t\t&IdentifierNode{Value: \"a\"},\n\t\t},\n\t\t{\n\t\t\t`\"str\"`,\n\t\t\t&StringNode{Value: \"str\"},\n\t\t},\n\t\t{\n\t\t\t\"`hello\\nworld`\",\n\t\t\t&StringNode{Value: `hello\nworld`},\n\t\t},\n\t\t{\n\t\t\t\"3\",\n\t\t\t&IntegerNode{Value: 3},\n\t\t},\n\t\t{\n\t\t\t\"0xFF\",\n\t\t\t&IntegerNode{Value: 255},\n\t\t},\n\t\t{\n\t\t\t\"0x6E\",\n\t\t\t&IntegerNode{Value: 110},\n\t\t},\n\t\t{\n\t\t\t\"0X63\",\n\t\t\t&IntegerNode{Value: 99},\n\t\t},\n\t\t{\n\t\t\t\"0o600\",\n\t\t\t&IntegerNode{Value: 384},\n\t\t},\n\t\t{\n\t\t\t\"0O45\",\n\t\t\t&IntegerNode{Value: 37},\n\t\t},\n\t\t{\n\t\t\t\"0b10\",\n\t\t\t&IntegerNode{Value: 2},\n\t\t},\n\t\t{\n\t\t\t\"0B101011\",\n\t\t\t&IntegerNode{Value: 43},\n\t\t},\n\t\t{\n\t\t\t\"10_000_000\",\n\t\t\t&IntegerNode{Value: 10_000_000},\n\t\t},\n\t\t{\n\t\t\t\"2.5\",\n\t\t\t&FloatNode{Value: 2.5},\n\t\t},\n\t\t{\n\t\t\t\"1e9\",\n\t\t\t&FloatNode{Value: 1e9},\n\t\t},\n\t\t{\n\t\t\t\"true\",\n\t\t\t&BoolNode{Value: true},\n\t\t},\n\t\t{\n\t\t\t\"false\",\n\t\t\t&BoolNode{Value: false},\n\t\t},\n\t\t{\n\t\t\t\"nil\",\n\t\t\t&NilNode{},\n\t\t},\n\t\t{\n\t\t\t`b\"hello\"`,\n\t\t\t&BytesNode{Value: []byte(\"hello\")},\n\t\t},\n\t\t{\n\t\t\t`b'\\xff\\x00'`,\n\t\t\t&BytesNode{Value: []byte{255, 0}},\n\t\t},\n\t\t{\n\t\t\t\"-3\",\n\t\t\t&UnaryNode{Operator: \"-\",\n\t\t\t\tNode: &IntegerNode{Value: 3}},\n\t\t},\n\t\t{\n\t\t\t\"-2^2\",\n\t\t\t&UnaryNode{\n\t\t\t\tOperator: \"-\",\n\t\t\t\tNode: &BinaryNode{\n\t\t\t\t\tOperator: \"^\",\n\t\t\t\t\tLeft:     &IntegerNode{Value: 2},\n\t\t\t\t\tRight:    &IntegerNode{Value: 2},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"1 - 2\",\n\t\t\t&BinaryNode{Operator: \"-\",\n\t\t\t\tLeft:  &IntegerNode{Value: 1},\n\t\t\t\tRight: &IntegerNode{Value: 2}},\n\t\t},\n\t\t{\n\t\t\t\"(1 - 2) * 3\",\n\t\t\t&BinaryNode{\n\t\t\t\tOperator: \"*\",\n\t\t\t\tLeft: &BinaryNode{\n\t\t\t\t\tOperator: \"-\",\n\t\t\t\t\tLeft:     &IntegerNode{Value: 1},\n\t\t\t\t\tRight:    &IntegerNode{Value: 2},\n\t\t\t\t},\n\t\t\t\tRight: &IntegerNode{Value: 3},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"a or b or c\",\n\t\t\t&BinaryNode{Operator: \"or\",\n\t\t\t\tLeft: &BinaryNode{Operator: \"or\",\n\t\t\t\t\tLeft:  &IdentifierNode{Value: \"a\"},\n\t\t\t\t\tRight: &IdentifierNode{Value: \"b\"}},\n\t\t\t\tRight: &IdentifierNode{Value: \"c\"}},\n\t\t},\n\t\t{\n\t\t\t\"a or b and c\",\n\t\t\t&BinaryNode{Operator: \"or\",\n\t\t\t\tLeft: &IdentifierNode{Value: \"a\"},\n\t\t\t\tRight: &BinaryNode{Operator: \"and\",\n\t\t\t\t\tLeft:  &IdentifierNode{Value: \"b\"},\n\t\t\t\t\tRight: &IdentifierNode{Value: \"c\"}}},\n\t\t},\n\t\t{\n\t\t\t\"(a or b) and c\",\n\t\t\t&BinaryNode{Operator: \"and\",\n\t\t\t\tLeft: &BinaryNode{Operator: \"or\",\n\t\t\t\t\tLeft:  &IdentifierNode{Value: \"a\"},\n\t\t\t\t\tRight: &IdentifierNode{Value: \"b\"}},\n\t\t\t\tRight: &IdentifierNode{Value: \"c\"}},\n\t\t},\n\t\t{\n\t\t\t\"2**4-1\",\n\t\t\t&BinaryNode{Operator: \"-\",\n\t\t\t\tLeft: &BinaryNode{Operator: \"**\",\n\t\t\t\t\tLeft:  &IntegerNode{Value: 2},\n\t\t\t\t\tRight: &IntegerNode{Value: 4}},\n\t\t\t\tRight: &IntegerNode{Value: 1}},\n\t\t},\n\t\t{\n\t\t\t\"foo(bar())\",\n\t\t\t&CallNode{Callee: &IdentifierNode{Value: \"foo\"},\n\t\t\t\tArguments: []Node{&CallNode{Callee: &IdentifierNode{Value: \"bar\"},\n\t\t\t\t\tArguments: []Node{}}}},\n\t\t},\n\t\t{\n\t\t\t`foo(\"arg1\", 2, true)`,\n\t\t\t&CallNode{Callee: &IdentifierNode{Value: \"foo\"},\n\t\t\t\tArguments: []Node{&StringNode{Value: \"arg1\"},\n\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t&BoolNode{Value: true}}},\n\t\t},\n\t\t{\n\t\t\t\"foo.bar\",\n\t\t\t&MemberNode{Node: &IdentifierNode{Value: \"foo\"},\n\t\t\t\tProperty: &StringNode{Value: \"bar\"}},\n\t\t},\n\t\t{\n\t\t\t\"foo['all']\",\n\t\t\t&MemberNode{Node: &IdentifierNode{Value: \"foo\"},\n\t\t\t\tProperty: &StringNode{Value: \"all\"}},\n\t\t},\n\t\t{\n\t\t\t\"foo.bar()\",\n\t\t\t&CallNode{Callee: &MemberNode{Node: &IdentifierNode{Value: \"foo\"},\n\t\t\t\tProperty: &StringNode{Value: \"bar\"}, Method: true},\n\t\t\t\tArguments: []Node{}},\n\t\t},\n\t\t{\n\t\t\t`foo.bar(\"arg1\", 2, true)`,\n\t\t\t&CallNode{Callee: &MemberNode{Node: &IdentifierNode{Value: \"foo\"},\n\t\t\t\tProperty: &StringNode{Value: \"bar\"}, Method: true},\n\t\t\t\tArguments: []Node{&StringNode{Value: \"arg1\"},\n\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t&BoolNode{Value: true}}},\n\t\t},\n\t\t{\n\t\t\t\"foo[3]\",\n\t\t\t&MemberNode{Node: &IdentifierNode{Value: \"foo\"},\n\t\t\t\tProperty: &IntegerNode{Value: 3}},\n\t\t},\n\t\t{\n\t\t\t\"true ? true : false\",\n\t\t\t&ConditionalNode{\n\t\t\t\tTernary: true,\n\t\t\t\tCond:    &BoolNode{Value: true},\n\t\t\t\tExp1:    &BoolNode{Value: true},\n\t\t\t\tExp2:    &BoolNode{}},\n\t\t},\n\t\t{\n\t\t\t\"a?[b]:c\",\n\t\t\t&ConditionalNode{\n\t\t\t\tTernary: true,\n\t\t\t\tCond:    &IdentifierNode{Value: \"a\"},\n\t\t\t\tExp1:    &ArrayNode{Nodes: []Node{&IdentifierNode{Value: \"b\"}}},\n\t\t\t\tExp2:    &IdentifierNode{Value: \"c\"}},\n\t\t},\n\t\t{\n\t\t\t\"a.b().c().d[33]\",\n\t\t\t&MemberNode{\n\t\t\t\tNode: &MemberNode{\n\t\t\t\t\tNode: &CallNode{\n\t\t\t\t\t\tCallee: &MemberNode{\n\t\t\t\t\t\t\tNode: &CallNode{\n\t\t\t\t\t\t\t\tCallee: &MemberNode{\n\t\t\t\t\t\t\t\t\tNode: &IdentifierNode{\n\t\t\t\t\t\t\t\t\t\tValue: \"a\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tProperty: &StringNode{\n\t\t\t\t\t\t\t\t\t\tValue: \"b\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tMethod: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tArguments: []Node{},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tProperty: &StringNode{\n\t\t\t\t\t\t\t\tValue: \"c\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tMethod: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tArguments: []Node{},\n\t\t\t\t\t},\n\t\t\t\t\tProperty: &StringNode{\n\t\t\t\t\t\tValue: \"d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tProperty: &IntegerNode{Value: 33}},\n\t\t},\n\t\t{\n\t\t\t\"'a' == 'b'\",\n\t\t\t&BinaryNode{Operator: \"==\",\n\t\t\t\tLeft:  &StringNode{Value: \"a\"},\n\t\t\t\tRight: &StringNode{Value: \"b\"}},\n\t\t},\n\t\t{\n\t\t\t\"+0 != -0\",\n\t\t\t&BinaryNode{Operator: \"!=\",\n\t\t\t\tLeft: &UnaryNode{Operator: \"+\",\n\t\t\t\t\tNode: &IntegerNode{}},\n\t\t\t\tRight: &UnaryNode{Operator: \"-\",\n\t\t\t\t\tNode: &IntegerNode{}}},\n\t\t},\n\t\t{\n\t\t\t\"[a, b, c]\",\n\t\t\t&ArrayNode{Nodes: []Node{&IdentifierNode{Value: \"a\"},\n\t\t\t\t&IdentifierNode{Value: \"b\"},\n\t\t\t\t&IdentifierNode{Value: \"c\"}}},\n\t\t},\n\t\t{\n\t\t\t\"{foo:1, bar:2}\",\n\t\t\t&MapNode{Pairs: []Node{&PairNode{Key: &StringNode{Value: \"foo\"},\n\t\t\t\tValue: &IntegerNode{Value: 1}},\n\t\t\t\t&PairNode{Key: &StringNode{Value: \"bar\"},\n\t\t\t\t\tValue: &IntegerNode{Value: 2}}}},\n\t\t},\n\t\t{\n\t\t\t\"{foo:1, bar:2, }\",\n\t\t\t&MapNode{Pairs: []Node{&PairNode{Key: &StringNode{Value: \"foo\"},\n\t\t\t\tValue: &IntegerNode{Value: 1}},\n\t\t\t\t&PairNode{Key: &StringNode{Value: \"bar\"},\n\t\t\t\t\tValue: &IntegerNode{Value: 2}}}},\n\t\t},\n\t\t{\n\t\t\t`{\"a\": 1, 'b': 2}`,\n\t\t\t&MapNode{Pairs: []Node{&PairNode{Key: &StringNode{Value: \"a\"},\n\t\t\t\tValue: &IntegerNode{Value: 1}},\n\t\t\t\t&PairNode{Key: &StringNode{Value: \"b\"},\n\t\t\t\t\tValue: &IntegerNode{Value: 2}}}},\n\t\t},\n\t\t{\n\t\t\t\"[1].foo\",\n\t\t\t&MemberNode{Node: &ArrayNode{Nodes: []Node{&IntegerNode{Value: 1}}},\n\t\t\t\tProperty: &StringNode{Value: \"foo\"}},\n\t\t},\n\t\t{\n\t\t\t\"{foo:1}.bar\",\n\t\t\t&MemberNode{Node: &MapNode{Pairs: []Node{&PairNode{Key: &StringNode{Value: \"foo\"},\n\t\t\t\tValue: &IntegerNode{Value: 1}}}},\n\t\t\t\tProperty: &StringNode{Value: \"bar\"}},\n\t\t},\n\t\t{\n\t\t\t\"len(foo)\",\n\t\t\t&BuiltinNode{\n\t\t\t\tName: \"len\",\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&IdentifierNode{Value: \"foo\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`foo matches \"foo\"`,\n\t\t\t&BinaryNode{\n\t\t\t\tOperator: \"matches\",\n\t\t\t\tLeft:     &IdentifierNode{Value: \"foo\"},\n\t\t\t\tRight:    &StringNode{Value: \"foo\"}},\n\t\t},\n\t\t{\n\t\t\t`foo not matches \"foo\"`,\n\t\t\t&UnaryNode{\n\t\t\t\tOperator: \"not\",\n\t\t\t\tNode: &BinaryNode{\n\t\t\t\t\tOperator: \"matches\",\n\t\t\t\t\tLeft:     &IdentifierNode{Value: \"foo\"},\n\t\t\t\t\tRight:    &StringNode{Value: \"foo\"}}},\n\t\t},\n\t\t{\n\t\t\t`foo matches regex`,\n\t\t\t&BinaryNode{\n\t\t\t\tOperator: \"matches\",\n\t\t\t\tLeft:     &IdentifierNode{Value: \"foo\"},\n\t\t\t\tRight:    &IdentifierNode{Value: \"regex\"}},\n\t\t},\n\t\t{\n\t\t\t`foo contains \"foo\"`,\n\t\t\t&BinaryNode{\n\t\t\t\tOperator: \"contains\",\n\t\t\t\tLeft:     &IdentifierNode{Value: \"foo\"},\n\t\t\t\tRight:    &StringNode{Value: \"foo\"}},\n\t\t},\n\t\t{\n\t\t\t`foo not contains \"foo\"`,\n\t\t\t&UnaryNode{\n\t\t\t\tOperator: \"not\",\n\t\t\t\tNode: &BinaryNode{Operator: \"contains\",\n\t\t\t\t\tLeft:  &IdentifierNode{Value: \"foo\"},\n\t\t\t\t\tRight: &StringNode{Value: \"foo\"}}},\n\t\t},\n\t\t{\n\t\t\t`foo startsWith \"foo\"`,\n\t\t\t&BinaryNode{Operator: \"startsWith\",\n\t\t\t\tLeft:  &IdentifierNode{Value: \"foo\"},\n\t\t\t\tRight: &StringNode{Value: \"foo\"}},\n\t\t},\n\t\t{\n\t\t\t`foo endsWith \"foo\"`,\n\t\t\t&BinaryNode{Operator: \"endsWith\",\n\t\t\t\tLeft:  &IdentifierNode{Value: \"foo\"},\n\t\t\t\tRight: &StringNode{Value: \"foo\"}},\n\t\t},\n\t\t{\n\t\t\t\"1..9\",\n\t\t\t&BinaryNode{Operator: \"..\",\n\t\t\t\tLeft:  &IntegerNode{Value: 1},\n\t\t\t\tRight: &IntegerNode{Value: 9}},\n\t\t},\n\t\t{\n\t\t\t\"0 in []\",\n\t\t\t&BinaryNode{Operator: \"in\",\n\t\t\t\tLeft:  &IntegerNode{},\n\t\t\t\tRight: &ArrayNode{Nodes: []Node{}}},\n\t\t},\n\t\t{\n\t\t\t\"not in_var\",\n\t\t\t&UnaryNode{Operator: \"not\",\n\t\t\t\tNode: &IdentifierNode{Value: \"in_var\"}},\n\t\t},\n\t\t{\n\t\t\t\"-1 not in [1, 2, 3, 4]\",\n\t\t\t&UnaryNode{Operator: \"not\",\n\t\t\t\tNode: &BinaryNode{Operator: \"in\",\n\t\t\t\t\tLeft: &UnaryNode{Operator: \"-\", Node: &IntegerNode{Value: 1}},\n\t\t\t\t\tRight: &ArrayNode{Nodes: []Node{\n\t\t\t\t\t\t&IntegerNode{Value: 1},\n\t\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t\t&IntegerNode{Value: 3},\n\t\t\t\t\t\t&IntegerNode{Value: 4},\n\t\t\t\t\t}}}},\n\t\t},\n\t\t{\n\t\t\t\"1*8 not in [1, 2, 3, 4]\",\n\t\t\t&UnaryNode{Operator: \"not\",\n\t\t\t\tNode: &BinaryNode{Operator: \"in\",\n\t\t\t\t\tLeft: &BinaryNode{Operator: \"*\",\n\t\t\t\t\t\tLeft:  &IntegerNode{Value: 1},\n\t\t\t\t\t\tRight: &IntegerNode{Value: 8},\n\t\t\t\t\t},\n\t\t\t\t\tRight: &ArrayNode{Nodes: []Node{\n\t\t\t\t\t\t&IntegerNode{Value: 1},\n\t\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t\t&IntegerNode{Value: 3},\n\t\t\t\t\t\t&IntegerNode{Value: 4},\n\t\t\t\t\t}}}},\n\t\t},\n\t\t{\n\t\t\t\"2==2 ? false : 3 not in [1, 2, 5]\",\n\t\t\t&ConditionalNode{\n\t\t\t\tTernary: true,\n\t\t\t\tCond: &BinaryNode{\n\t\t\t\t\tOperator: \"==\",\n\t\t\t\t\tLeft:     &IntegerNode{Value: 2},\n\t\t\t\t\tRight:    &IntegerNode{Value: 2},\n\t\t\t\t},\n\t\t\t\tExp1: &BoolNode{Value: false},\n\t\t\t\tExp2: &UnaryNode{\n\t\t\t\t\tOperator: \"not\",\n\t\t\t\t\tNode: &BinaryNode{\n\t\t\t\t\t\tOperator: \"in\",\n\t\t\t\t\t\tLeft:     &IntegerNode{Value: 3},\n\t\t\t\t\t\tRight: &ArrayNode{Nodes: []Node{\n\t\t\t\t\t\t\t&IntegerNode{Value: 1},\n\t\t\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t\t\t&IntegerNode{Value: 5},\n\t\t\t\t\t\t}}}}},\n\t\t},\n\t\t{\n\t\t\t\"'foo' + 'bar' not matches 'foobar'\",\n\t\t\t&UnaryNode{Operator: \"not\",\n\t\t\t\tNode: &BinaryNode{Operator: \"matches\",\n\t\t\t\t\tLeft: &BinaryNode{Operator: \"+\",\n\t\t\t\t\t\tLeft:  &StringNode{Value: \"foo\"},\n\t\t\t\t\t\tRight: &StringNode{Value: \"bar\"}},\n\t\t\t\t\tRight: &StringNode{Value: \"foobar\"}}},\n\t\t},\n\t\t{\n\t\t\t\"all(Tickets, #)\",\n\t\t\t&BuiltinNode{\n\t\t\t\tName: \"all\",\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&IdentifierNode{Value: \"Tickets\"},\n\t\t\t\t\t&PredicateNode{\n\t\t\t\t\t\tNode: &PointerNode{},\n\t\t\t\t\t}}},\n\t\t},\n\t\t{\n\t\t\t\"all(Tickets, {.Price > 0})\",\n\t\t\t&BuiltinNode{\n\t\t\t\tName: \"all\",\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&IdentifierNode{Value: \"Tickets\"},\n\t\t\t\t\t&PredicateNode{\n\t\t\t\t\t\tNode: &BinaryNode{\n\t\t\t\t\t\t\tOperator: \">\",\n\t\t\t\t\t\t\tLeft: &MemberNode{Node: &PointerNode{},\n\t\t\t\t\t\t\t\tProperty: &StringNode{Value: \"Price\"}},\n\t\t\t\t\t\t\tRight: &IntegerNode{Value: 0}}}}},\n\t\t},\n\t\t{\n\t\t\t\"one(Tickets, {#.Price > 0})\",\n\t\t\t&BuiltinNode{\n\t\t\t\tName: \"one\",\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&IdentifierNode{Value: \"Tickets\"},\n\t\t\t\t\t&PredicateNode{\n\t\t\t\t\t\tNode: &BinaryNode{\n\t\t\t\t\t\t\tOperator: \">\",\n\t\t\t\t\t\t\tLeft: &MemberNode{\n\t\t\t\t\t\t\t\tNode:     &PointerNode{},\n\t\t\t\t\t\t\t\tProperty: &StringNode{Value: \"Price\"},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRight: &IntegerNode{Value: 0}}}}},\n\t\t},\n\t\t{\n\t\t\t\"filter(Prices, {# > 100})\",\n\t\t\t&BuiltinNode{Name: \"filter\",\n\t\t\t\tArguments: []Node{&IdentifierNode{Value: \"Prices\"},\n\t\t\t\t\t&PredicateNode{Node: &BinaryNode{Operator: \">\",\n\t\t\t\t\t\tLeft:  &PointerNode{},\n\t\t\t\t\t\tRight: &IntegerNode{Value: 100}}}}},\n\t\t},\n\t\t{\n\t\t\t\"array[1:2]\",\n\t\t\t&SliceNode{Node: &IdentifierNode{Value: \"array\"},\n\t\t\t\tFrom: &IntegerNode{Value: 1},\n\t\t\t\tTo:   &IntegerNode{Value: 2}},\n\t\t},\n\t\t{\n\t\t\t\"array[:2]\",\n\t\t\t&SliceNode{Node: &IdentifierNode{Value: \"array\"},\n\t\t\t\tTo: &IntegerNode{Value: 2}},\n\t\t},\n\t\t{\n\t\t\t\"array[1:]\",\n\t\t\t&SliceNode{Node: &IdentifierNode{Value: \"array\"},\n\t\t\t\tFrom: &IntegerNode{Value: 1}},\n\t\t},\n\t\t{\n\t\t\t\"array[:]\",\n\t\t\t&SliceNode{Node: &IdentifierNode{Value: \"array\"}},\n\t\t},\n\t\t{\n\t\t\t\"[]\",\n\t\t\t&ArrayNode{},\n\t\t},\n\t\t{\n\t\t\t\"foo ?? bar\",\n\t\t\t&BinaryNode{Operator: \"??\",\n\t\t\t\tLeft:  &IdentifierNode{Value: \"foo\"},\n\t\t\t\tRight: &IdentifierNode{Value: \"bar\"}},\n\t\t},\n\t\t{\n\t\t\t\"foo ?? bar ?? baz\",\n\t\t\t&BinaryNode{Operator: \"??\",\n\t\t\t\tLeft: &BinaryNode{Operator: \"??\",\n\t\t\t\t\tLeft:  &IdentifierNode{Value: \"foo\"},\n\t\t\t\t\tRight: &IdentifierNode{Value: \"bar\"}},\n\t\t\t\tRight: &IdentifierNode{Value: \"baz\"}},\n\t\t},\n\t\t{\n\t\t\t\"foo ?? (bar || baz)\",\n\t\t\t&BinaryNode{Operator: \"??\",\n\t\t\t\tLeft: &IdentifierNode{Value: \"foo\"},\n\t\t\t\tRight: &BinaryNode{Operator: \"||\",\n\t\t\t\t\tLeft:  &IdentifierNode{Value: \"bar\"},\n\t\t\t\t\tRight: &IdentifierNode{Value: \"baz\"}}},\n\t\t},\n\t\t{\n\t\t\t\"foo || bar ?? baz\",\n\t\t\t&BinaryNode{Operator: \"||\",\n\t\t\t\tLeft: &IdentifierNode{Value: \"foo\"},\n\t\t\t\tRight: &BinaryNode{Operator: \"??\",\n\t\t\t\t\tLeft:  &IdentifierNode{Value: \"bar\"},\n\t\t\t\t\tRight: &IdentifierNode{Value: \"baz\"}}},\n\t\t},\n\t\t{\n\t\t\t\"foo ?? bar()\",\n\t\t\t&BinaryNode{Operator: \"??\",\n\t\t\t\tLeft:  &IdentifierNode{Value: \"foo\"},\n\t\t\t\tRight: &CallNode{Callee: &IdentifierNode{Value: \"bar\"}}},\n\t\t},\n\t\t{\n\t\t\t\"true | ok()\",\n\t\t\t&CallNode{\n\t\t\t\tCallee: &IdentifierNode{Value: \"ok\"},\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&BoolNode{Value: true}}}},\n\t\t{\n\t\t\t`let foo = a + b; foo + c`,\n\t\t\t&VariableDeclaratorNode{\n\t\t\t\tName: \"foo\",\n\t\t\t\tValue: &BinaryNode{Operator: \"+\",\n\t\t\t\t\tLeft:  &IdentifierNode{Value: \"a\"},\n\t\t\t\t\tRight: &IdentifierNode{Value: \"b\"}},\n\t\t\t\tExpr: &BinaryNode{Operator: \"+\",\n\t\t\t\t\tLeft:  &IdentifierNode{Value: \"foo\"},\n\t\t\t\t\tRight: &IdentifierNode{Value: \"c\"}}},\n\t\t},\n\t\t{\n\t\t\t`map([], #index)`,\n\t\t\t&BuiltinNode{\n\t\t\t\tName: \"map\",\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&ArrayNode{},\n\t\t\t\t\t&PredicateNode{\n\t\t\t\t\t\tNode: &PointerNode{Name: \"index\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`::split(\"a,b,c\", \",\")`,\n\t\t\t&BuiltinNode{\n\t\t\t\tName: \"split\",\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&StringNode{Value: \"a,b,c\"},\n\t\t\t\t\t&StringNode{Value: \",\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`::split(\"a,b,c\", \",\")[0]`,\n\t\t\t&MemberNode{\n\t\t\t\tNode: &BuiltinNode{\n\t\t\t\t\tName: \"split\",\n\t\t\t\t\tArguments: []Node{\n\t\t\t\t\t\t&StringNode{Value: \"a,b,c\"},\n\t\t\t\t\t\t&StringNode{Value: \",\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tProperty: &IntegerNode{Value: 0},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`\"hello\"[1:3]`,\n\t\t\t&SliceNode{\n\t\t\t\tNode: &StringNode{Value: \"hello\"},\n\t\t\t\tFrom: &IntegerNode{Value: 1},\n\t\t\t\tTo:   &IntegerNode{Value: 3},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`1 < 2 > 3`,\n\t\t\t&BinaryNode{\n\t\t\t\tOperator: \"&&\",\n\t\t\t\tLeft: &BinaryNode{\n\t\t\t\t\tOperator: \"<\",\n\t\t\t\t\tLeft:     &IntegerNode{Value: 1},\n\t\t\t\t\tRight:    &IntegerNode{Value: 2},\n\t\t\t\t},\n\t\t\t\tRight: &BinaryNode{\n\t\t\t\t\tOperator: \">\",\n\t\t\t\t\tLeft:     &IntegerNode{Value: 2},\n\t\t\t\t\tRight:    &IntegerNode{Value: 3},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`1 < 2 < 3 < 4`,\n\t\t\t&BinaryNode{\n\t\t\t\tOperator: \"&&\",\n\t\t\t\tLeft: &BinaryNode{\n\t\t\t\t\tOperator: \"&&\",\n\t\t\t\t\tLeft: &BinaryNode{\n\t\t\t\t\t\tOperator: \"<\",\n\t\t\t\t\t\tLeft:     &IntegerNode{Value: 1},\n\t\t\t\t\t\tRight:    &IntegerNode{Value: 2},\n\t\t\t\t\t},\n\t\t\t\t\tRight: &BinaryNode{\n\t\t\t\t\t\tOperator: \"<\",\n\t\t\t\t\t\tLeft:     &IntegerNode{Value: 2},\n\t\t\t\t\t\tRight:    &IntegerNode{Value: 3},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tRight: &BinaryNode{\n\t\t\t\t\tOperator: \"<\",\n\t\t\t\t\tLeft:     &IntegerNode{Value: 3},\n\t\t\t\t\tRight:    &IntegerNode{Value: 4},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`1 < 2 < 3 == true`,\n\t\t\t&BinaryNode{\n\t\t\t\tOperator: \"==\",\n\t\t\t\tLeft: &BinaryNode{\n\t\t\t\t\tOperator: \"&&\",\n\t\t\t\t\tLeft: &BinaryNode{\n\t\t\t\t\t\tOperator: \"<\",\n\t\t\t\t\t\tLeft:     &IntegerNode{Value: 1},\n\t\t\t\t\t\tRight:    &IntegerNode{Value: 2},\n\t\t\t\t\t},\n\t\t\t\t\tRight: &BinaryNode{\n\t\t\t\t\t\tOperator: \"<\",\n\t\t\t\t\t\tLeft:     &IntegerNode{Value: 2},\n\t\t\t\t\t\tRight:    &IntegerNode{Value: 3},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tRight: &BoolNode{Value: true},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"if a>b {true} else {x}\",\n\t\t\t&ConditionalNode{\n\t\t\t\tCond: &BinaryNode{\n\t\t\t\t\tOperator: \">\",\n\t\t\t\t\tLeft:     &IdentifierNode{Value: \"a\"},\n\t\t\t\t\tRight:    &IdentifierNode{Value: \"b\"},\n\t\t\t\t},\n\t\t\t\tExp1: &BoolNode{Value: true},\n\t\t\t\tExp2: &IdentifierNode{Value: \"x\"}},\n\t\t},\n\t\t{\n\t\t\t\"if a { 1 } else if b { 2 } else { 3 }\",\n\t\t\t&ConditionalNode{\n\t\t\t\tCond: &IdentifierNode{Value: \"a\"},\n\t\t\t\tExp1: &IntegerNode{Value: 1},\n\t\t\t\tExp2: &ConditionalNode{\n\t\t\t\t\tCond: &IdentifierNode{Value: \"b\"},\n\t\t\t\t\tExp1: &IntegerNode{Value: 2},\n\t\t\t\t\tExp2: &IntegerNode{Value: 3}}},\n\t\t},\n\t\t{\n\t\t\t\"if a { 1 } else if b { 2 } else if c { 3 } else { 4 }\",\n\t\t\t&ConditionalNode{\n\t\t\t\tCond: &IdentifierNode{Value: \"a\"},\n\t\t\t\tExp1: &IntegerNode{Value: 1},\n\t\t\t\tExp2: &ConditionalNode{\n\t\t\t\t\tCond: &IdentifierNode{Value: \"b\"},\n\t\t\t\t\tExp1: &IntegerNode{Value: 2},\n\t\t\t\t\tExp2: &ConditionalNode{\n\t\t\t\t\t\tCond: &IdentifierNode{Value: \"c\"},\n\t\t\t\t\t\tExp1: &IntegerNode{Value: 3},\n\t\t\t\t\t\tExp2: &IntegerNode{Value: 4}}}},\n\t\t},\n\t\t{\n\t\t\t\"1; 2; 3\",\n\t\t\t&SequenceNode{\n\t\t\t\tNodes: []Node{\n\t\t\t\t\t&IntegerNode{Value: 1},\n\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t&IntegerNode{Value: 3},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"1; (2; 3)\",\n\t\t\t&SequenceNode{\n\t\t\t\tNodes: []Node{\n\t\t\t\t\t&IntegerNode{Value: 1},\n\t\t\t\t\t&SequenceNode{\n\t\t\t\t\t\tNodes: []Node{\n\t\t\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t\t\t&IntegerNode{Value: 3}},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"true ? 1 : 2; 3 ; 4\",\n\t\t\t&SequenceNode{\n\t\t\t\tNodes: []Node{\n\t\t\t\t\t&ConditionalNode{\n\t\t\t\t\t\tTernary: true,\n\t\t\t\t\t\tCond:    &BoolNode{Value: true},\n\t\t\t\t\t\tExp1:    &IntegerNode{Value: 1},\n\t\t\t\t\t\tExp2:    &IntegerNode{Value: 2}},\n\t\t\t\t\t&IntegerNode{Value: 3},\n\t\t\t\t\t&IntegerNode{Value: 4},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"true ? 1 : ( 2; 3; 4 )\",\n\t\t\t&ConditionalNode{\n\t\t\t\tTernary: true,\n\t\t\t\tCond:    &BoolNode{Value: true},\n\t\t\t\tExp1:    &IntegerNode{Value: 1},\n\t\t\t\tExp2: &SequenceNode{\n\t\t\t\t\tNodes: []Node{\n\t\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t\t&IntegerNode{Value: 3},\n\t\t\t\t\t\t&IntegerNode{Value: 4},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"true ?: 1; 2; 3\",\n\t\t\t&SequenceNode{\n\t\t\t\tNodes: []Node{\n\t\t\t\t\t&ConditionalNode{\n\t\t\t\t\t\tTernary: true,\n\t\t\t\t\t\tCond:    &BoolNode{Value: true},\n\t\t\t\t\t\tExp1:    &BoolNode{Value: true},\n\t\t\t\t\t\tExp2:    &IntegerNode{Value: 1}},\n\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t&IntegerNode{Value: 3},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`let x = true ? 1 : 2; x`,\n\t\t\t&VariableDeclaratorNode{\n\t\t\t\tName: \"x\",\n\t\t\t\tValue: &ConditionalNode{\n\t\t\t\t\tTernary: true,\n\t\t\t\t\tCond:    &BoolNode{Value: true},\n\t\t\t\t\tExp1:    &IntegerNode{Value: 1},\n\t\t\t\t\tExp2:    &IntegerNode{Value: 2}},\n\t\t\t\tExpr: &IdentifierNode{Value: \"x\"}},\n\t\t},\n\t\t{\n\t\t\t\"let x = true ? 1 : ( 2; 3; 4 ); x\",\n\t\t\t&VariableDeclaratorNode{\n\t\t\t\tName: \"x\",\n\t\t\t\tValue: &ConditionalNode{\n\t\t\t\t\tTernary: true,\n\t\t\t\t\tCond:    &BoolNode{Value: true},\n\t\t\t\t\tExp1:    &IntegerNode{Value: 1},\n\t\t\t\t\tExp2: &SequenceNode{\n\t\t\t\t\t\tNodes: []Node{\n\t\t\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t\t\t&IntegerNode{Value: 3},\n\t\t\t\t\t\t\t&IntegerNode{Value: 4},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tExpr: &IdentifierNode{Value: \"x\"}},\n\t\t},\n\t\t{\n\t\t\t\"if true { 1; 2; 3 } else { 4; 5; 6 }\",\n\t\t\t&ConditionalNode{\n\t\t\t\tCond: &BoolNode{Value: true},\n\t\t\t\tExp1: &SequenceNode{\n\t\t\t\t\tNodes: []Node{\n\t\t\t\t\t\t&IntegerNode{Value: 1},\n\t\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t\t&IntegerNode{Value: 3}}},\n\t\t\t\tExp2: &SequenceNode{\n\t\t\t\t\tNodes: []Node{\n\t\t\t\t\t\t&IntegerNode{Value: 4},\n\t\t\t\t\t\t&IntegerNode{Value: 5},\n\t\t\t\t\t\t&IntegerNode{Value: 6}}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`all(ls, if true { 1 } else { 2 })`,\n\t\t\t&BuiltinNode{\n\t\t\t\tName: \"all\",\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&IdentifierNode{Value: \"ls\"},\n\t\t\t\t\t&PredicateNode{\n\t\t\t\t\t\tNode: &ConditionalNode{\n\t\t\t\t\t\t\tCond: &BoolNode{Value: true},\n\t\t\t\t\t\t\tExp1: &IntegerNode{Value: 1},\n\t\t\t\t\t\t\tExp2: &IntegerNode{Value: 2},\n\t\t\t\t\t\t}}}},\n\t\t},\n\t\t{\n\t\t\t`let x = if true { 1 } else { 2 }; x`,\n\t\t\t&VariableDeclaratorNode{\n\t\t\t\tName: \"x\",\n\t\t\t\tValue: &ConditionalNode{\n\t\t\t\t\tCond: &BoolNode{Value: true},\n\t\t\t\t\tExp1: &IntegerNode{Value: 1},\n\t\t\t\t\tExp2: &IntegerNode{Value: 2},\n\t\t\t\t},\n\t\t\t\tExpr: &IdentifierNode{Value: \"x\"}},\n\t\t},\n\t\t{\n\t\t\t`call(if true { 1 } else { 2 })`,\n\t\t\t&CallNode{\n\t\t\t\tCallee: &IdentifierNode{Value: \"call\"},\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&ConditionalNode{\n\t\t\t\t\t\tCond: &BoolNode{Value: true},\n\t\t\t\t\t\tExp1: &IntegerNode{Value: 1},\n\t\t\t\t\t\tExp2: &IntegerNode{Value: 2},\n\t\t\t\t\t}}},\n\t\t},\n\t\t{\n\t\t\t`[if true { 1 } else { 2 }]`,\n\t\t\t&ArrayNode{\n\t\t\t\tNodes: []Node{\n\t\t\t\t\t&ConditionalNode{\n\t\t\t\t\t\tCond: &BoolNode{Value: true},\n\t\t\t\t\t\tExp1: &IntegerNode{Value: 1},\n\t\t\t\t\t\tExp2: &IntegerNode{Value: 2},\n\t\t\t\t\t}}},\n\t\t},\n\t\t{\n\t\t\t`map(ls, { 1; 2; 3 })`,\n\t\t\t&BuiltinNode{\n\t\t\t\tName: \"map\",\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&IdentifierNode{Value: \"ls\"},\n\t\t\t\t\t&PredicateNode{\n\t\t\t\t\t\tNode: &SequenceNode{\n\t\t\t\t\t\t\tNodes: []Node{\n\t\t\t\t\t\t\t\t&IntegerNode{Value: 1},\n\t\t\t\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t\t\t\t&IntegerNode{Value: 3},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}},\n\t\t},\n\t\t{\n\t\t\t`let x = 1; 2; 3 + x`,\n\t\t\t&VariableDeclaratorNode{\n\t\t\t\tName:  \"x\",\n\t\t\t\tValue: &IntegerNode{Value: 1},\n\t\t\t\tExpr: &SequenceNode{\n\t\t\t\t\tNodes: []Node{\n\t\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t\t&BinaryNode{\n\t\t\t\t\t\t\tOperator: \"+\",\n\t\t\t\t\t\t\tLeft:     &IntegerNode{Value: 3},\n\t\t\t\t\t\t\tRight:    &IdentifierNode{Value: \"x\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`let x = 1; let y = 2; 3; 4; x + y`,\n\t\t\t&VariableDeclaratorNode{\n\t\t\t\tName:  \"x\",\n\t\t\t\tValue: &IntegerNode{Value: 1},\n\t\t\t\tExpr: &VariableDeclaratorNode{\n\t\t\t\t\tName:  \"y\",\n\t\t\t\t\tValue: &IntegerNode{Value: 2},\n\t\t\t\t\tExpr: &SequenceNode{\n\t\t\t\t\t\tNodes: []Node{\n\t\t\t\t\t\t\t&IntegerNode{Value: 3},\n\t\t\t\t\t\t\t&IntegerNode{Value: 4},\n\t\t\t\t\t\t\t&BinaryNode{\n\t\t\t\t\t\t\t\tOperator: \"+\",\n\t\t\t\t\t\t\t\tLeft:     &IdentifierNode{Value: \"x\"},\n\t\t\t\t\t\t\t\tRight:    &IdentifierNode{Value: \"y\"},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}}},\n\t\t},\n\t\t{\n\t\t\t`let x = (1; 2; 3); x`,\n\t\t\t&VariableDeclaratorNode{\n\t\t\t\tName: \"x\",\n\t\t\t\tValue: &SequenceNode{\n\t\t\t\t\tNodes: []Node{\n\t\t\t\t\t\t&IntegerNode{Value: 1},\n\t\t\t\t\t\t&IntegerNode{Value: 2},\n\t\t\t\t\t\t&IntegerNode{Value: 3},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tExpr: &IdentifierNode{Value: \"x\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`all(\n\t\t\t\t[\n\t\t\t\t  true,\n\t\t\t\t  false,\n\t\t\t\t],\n\t\t\t\t#,\n\t\t\t)`,\n\t\t\t&BuiltinNode{\n\t\t\t\tName: \"all\",\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&ArrayNode{\n\t\t\t\t\t\tNodes: []Node{\n\t\t\t\t\t\t\t&BoolNode{Value: true},\n\t\t\t\t\t\t\t&BoolNode{Value: false},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t&PredicateNode{\n\t\t\t\t\t\tNode: &PointerNode{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`list | all(#,)`,\n\t\t\t&BuiltinNode{\n\t\t\t\tName: \"all\",\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&IdentifierNode{Value: \"list\"},\n\t\t\t\t\t&PredicateNode{\n\t\t\t\t\t\tNode: &PointerNode{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t`func(\n\t\t\t\tparameter1,\n\t\t\t\tparameter2,\n\t\t\t)`,\n\t\t\t&CallNode{\n\t\t\t\tCallee: &IdentifierNode{Value: \"func\"},\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&IdentifierNode{Value: \"parameter1\"},\n\t\t\t\t\t&IdentifierNode{Value: \"parameter2\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\tactual, err := parser.Parse(test.input)\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, Dump(test.want), Dump(actual.Node))\n\t\t})\n\t}\n}\n\nfunc TestParse_error(t *testing.T) {\n\tvar tests = []struct {\n\t\tinput string\n\t\terr   string\n\t}{\n\t\t{`foo.`, `unexpected end of expression (1:4)\n | foo.\n | ...^`},\n\t\t{`a+`, `unexpected token EOF (1:2)\n | a+\n | .^`},\n\t\t{`a ? (1+2) c`, `unexpected token Identifier(\"c\") (1:11)\n | a ? (1+2) c\n | ..........^`},\n\t\t{`[a b]`, `unexpected token Identifier(\"b\") (1:4)\n | [a b]\n | ...^`},\n\t\t{`foo.bar(a b)`, `unexpected token Identifier(\"b\") (1:11)\n | foo.bar(a b)\n | ..........^`},\n\t\t{`{-}`, `a map key must be a quoted string, a number, a identifier, or an expression enclosed in parentheses (unexpected token Operator(\"-\")) (1:2)\n | {-}\n | .^`},\n\t\t{`foo({.bar})`, `a map key must be a quoted string, a number, a identifier, or an expression enclosed in parentheses (unexpected token Operator(\".\")) (1:6)\n | foo({.bar})\n | .....^`},\n\t\t{`[1, 2, 3,,]`, `unexpected token Operator(\",\") (1:10)\n | [1, 2, 3,,]\n | .........^`},\n\t\t{`[,]`, `unexpected token Operator(\",\") (1:2)\n | [,]\n | .^`},\n\t\t{`{,}`, `a map key must be a quoted string, a number, a identifier, or an expression enclosed in parentheses (unexpected token Operator(\",\")) (1:2)\n | {,}\n | .^`},\n\t\t{`{foo:1, bar:2, ,}`, `unexpected token Operator(\",\") (1:16)\n | {foo:1, bar:2, ,}\n | ...............^`},\n\t\t{`foo ?? bar || baz`, `Operator (||) and coalesce expressions (??) cannot be mixed. Wrap either by parentheses. (1:12)\n | foo ?? bar || baz\n | ...........^`},\n\t\t{`0b15`, `bad number syntax: \"0b15\" (1:4)\n | 0b15\n | ...^`},\n\t\t{`0X10G`, `bad number syntax: \"0X10G\" (1:5)\n | 0X10G\n | ....^`},\n\t\t{`0o1E`, `invalid float literal: strconv.ParseFloat: parsing \"0o1E\": invalid syntax (1:4)\n | 0o1E\n | ...^`},\n\t\t{`0b1E`, `invalid float literal: strconv.ParseFloat: parsing \"0b1E\": invalid syntax (1:4)\n | 0b1E\n | ...^`},\n\t\t{`0b1E+6`, `bad number syntax: \"0b1E+6\" (1:6)\n | 0b1E+6\n | .....^`},\n\t\t{`0b1E+1`, `invalid float literal: strconv.ParseFloat: parsing \"0b1E+1\": invalid syntax (1:6)\n | 0b1E+1\n | .....^`},\n\t\t{`0o1E+1`, `invalid float literal: strconv.ParseFloat: parsing \"0o1E+1\": invalid syntax (1:6)\n | 0o1E+1\n | .....^`},\n\t\t{`1E`, `invalid float literal: strconv.ParseFloat: parsing \"1E\": invalid syntax (1:2)\n | 1E\n | .^`},\n\t\t{`1 not == [1, 2, 5]`, `unexpected token Operator(\"==\") (1:7)\n | 1 not == [1, 2, 5]\n | ......^`},\n\t\t{`foo(1; 2; 3)`, `unexpected token Operator(\";\") (1:6)\n | foo(1; 2; 3)\n | .....^`},\n\t\t{\n\t\t\t`map(ls, 1; 2; 3)`,\n\t\t\t`wrap predicate with brackets { and } (1:10)\n | map(ls, 1; 2; 3)\n | .........^`,\n\t\t},\n\t\t{\n\t\t\t`[1; 2; 3]`,\n\t\t\t`unexpected token Operator(\";\") (1:3)\n | [1; 2; 3]\n | ..^`,\n\t\t},\n\t\t{\n\t\t\t`1 + if true { 2 } else { 3 }`,\n\t\t\t`unexpected token Operator(\"if\") (1:5)\n | 1 + if true { 2 } else { 3 }\n | ....^`,\n\t\t},\n\t\t{\n\t\t\t`if a { 1 } else b`,\n\t\t\t`unexpected token Identifier(\"b\") (1:17)\n | if a { 1 } else b\n | ................^`,\n\t\t},\n\t\t{\n\t\t\t`list | all(#,,)`,\n\t\t\t`unexpected token Operator(\",\") (1:14)\n | list | all(#,,)\n | .............^`,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\t_, err := parser.Parse(test.input)\n\t\t\tif err == nil {\n\t\t\t\terr = fmt.Errorf(\"<nil>\")\n\t\t\t}\n\t\t\tassert.Equal(t, test.err, err.Error(), test.input)\n\t\t})\n\t}\n}\n\nfunc TestParse_optional_chaining(t *testing.T) {\n\tparseTests := []struct {\n\t\tinput    string\n\t\texpected Node\n\t}{\n\t\t{\n\t\t\t\"foo?.bar.baz\",\n\t\t\t&ChainNode{\n\t\t\t\tNode: &MemberNode{\n\t\t\t\t\tNode: &MemberNode{\n\t\t\t\t\t\tNode:     &IdentifierNode{Value: \"foo\"},\n\t\t\t\t\t\tProperty: &StringNode{Value: \"bar\"},\n\t\t\t\t\t\tOptional: true,\n\t\t\t\t\t},\n\t\t\t\t\tProperty: &StringNode{Value: \"baz\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"foo.bar?.baz\",\n\t\t\t&ChainNode{\n\t\t\t\tNode: &MemberNode{\n\t\t\t\t\tNode: &MemberNode{\n\t\t\t\t\t\tNode:     &IdentifierNode{Value: \"foo\"},\n\t\t\t\t\t\tProperty: &StringNode{Value: \"bar\"},\n\t\t\t\t\t},\n\t\t\t\t\tProperty: &StringNode{Value: \"baz\"},\n\t\t\t\t\tOptional: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"foo?.bar?.baz\",\n\t\t\t&ChainNode{\n\t\t\t\tNode: &MemberNode{\n\t\t\t\t\tNode: &MemberNode{\n\t\t\t\t\t\tNode:     &IdentifierNode{Value: \"foo\"},\n\t\t\t\t\t\tProperty: &StringNode{Value: \"bar\"},\n\t\t\t\t\t\tOptional: true,\n\t\t\t\t\t},\n\t\t\t\t\tProperty: &StringNode{Value: \"baz\"},\n\t\t\t\t\tOptional: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"!foo?.bar.baz\",\n\t\t\t&UnaryNode{\n\t\t\t\tOperator: \"!\",\n\t\t\t\tNode: &ChainNode{\n\t\t\t\t\tNode: &MemberNode{\n\t\t\t\t\t\tNode: &MemberNode{\n\t\t\t\t\t\t\tNode:     &IdentifierNode{Value: \"foo\"},\n\t\t\t\t\t\t\tProperty: &StringNode{Value: \"bar\"},\n\t\t\t\t\t\t\tOptional: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tProperty: &StringNode{Value: \"baz\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"foo.bar[a?.b]?.baz\",\n\t\t\t&ChainNode{\n\t\t\t\tNode: &MemberNode{\n\t\t\t\t\tNode: &MemberNode{\n\t\t\t\t\t\tNode: &MemberNode{\n\t\t\t\t\t\t\tNode:     &IdentifierNode{Value: \"foo\"},\n\t\t\t\t\t\t\tProperty: &StringNode{Value: \"bar\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tProperty: &ChainNode{\n\t\t\t\t\t\t\tNode: &MemberNode{\n\t\t\t\t\t\t\t\tNode:     &IdentifierNode{Value: \"a\"},\n\t\t\t\t\t\t\t\tProperty: &StringNode{Value: \"b\"},\n\t\t\t\t\t\t\t\tOptional: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tProperty: &StringNode{Value: \"baz\"},\n\t\t\t\t\tOptional: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"foo.bar?.[0]\",\n\t\t\t&ChainNode{\n\t\t\t\tNode: &MemberNode{\n\t\t\t\t\tNode: &MemberNode{\n\t\t\t\t\t\tNode:     &IdentifierNode{Value: \"foo\"},\n\t\t\t\t\t\tProperty: &StringNode{Value: \"bar\"},\n\t\t\t\t\t},\n\t\t\t\t\tProperty: &IntegerNode{Value: 0},\n\t\t\t\t\tOptional: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, test := range parseTests {\n\t\tactual, err := parser.Parse(test.input)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%s:\\n%v\", test.input, err)\n\t\t\tcontinue\n\t\t}\n\t\tassert.Equal(t, Dump(test.expected), Dump(actual.Node), test.input)\n\t}\n}\n\nfunc TestParse_pipe_operator(t *testing.T) {\n\tinput := \"arr | map(.foo) | len() | Foo()\"\n\texpect := &CallNode{\n\t\tCallee: &IdentifierNode{Value: \"Foo\"},\n\t\tArguments: []Node{\n\t\t\t&BuiltinNode{\n\t\t\t\tName: \"len\",\n\t\t\t\tArguments: []Node{\n\t\t\t\t\t&BuiltinNode{\n\t\t\t\t\t\tName: \"map\",\n\t\t\t\t\t\tArguments: []Node{\n\t\t\t\t\t\t\t&IdentifierNode{Value: \"arr\"},\n\t\t\t\t\t\t\t&PredicateNode{\n\t\t\t\t\t\t\t\tNode: &MemberNode{\n\t\t\t\t\t\t\t\t\tNode:     &PointerNode{},\n\t\t\t\t\t\t\t\t\tProperty: &StringNode{Value: \"foo\"},\n\t\t\t\t\t\t\t\t}}}}}}}}\n\n\tactual, err := parser.Parse(input)\n\trequire.NoError(t, err)\n\tassert.Equal(t, Dump(expect), Dump(actual.Node))\n}\n\nfunc TestNodeBudget(t *testing.T) {\n\ttests := []struct {\n\t\tname        string\n\t\texpr        string\n\t\tmaxNodes    uint\n\t\tshouldError bool\n\t}{\n\t\t{\n\t\t\tname:        \"simple expression equal to limit\",\n\t\t\texpr:        \"a + b\",\n\t\t\tmaxNodes:    3,\n\t\t\tshouldError: false,\n\t\t},\n\t\t{\n\t\t\tname:        \"medium expression under limit\",\n\t\t\texpr:        \"a + b * c / d\",\n\t\t\tmaxNodes:    20,\n\t\t\tshouldError: false,\n\t\t},\n\t\t{\n\t\t\tname:        \"deeply nested expression over limit\",\n\t\t\texpr:        \"1 + (2 + (3 + (4 + (5 + (6 + (7 + 8))))))\",\n\t\t\tmaxNodes:    10,\n\t\t\tshouldError: true,\n\t\t},\n\t\t{\n\t\t\tname:        \"array expression over limit\",\n\t\t\texpr:        \"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\",\n\t\t\tmaxNodes:    5,\n\t\t\tshouldError: true,\n\t\t},\n\t\t{\n\t\t\tname:        \"disabled node budget\",\n\t\t\texpr:        \"1 + (2 + (3 + (4 + (5 + (6 + (7 + 8))))))\",\n\t\t\tmaxNodes:    0,\n\t\t\tshouldError: false,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tconfig := conf.CreateNew()\n\t\t\tconfig.MaxNodes = tt.maxNodes\n\t\t\tconfig.Disabled = make(map[string]bool, 0)\n\n\t\t\t_, err := parser.ParseWithConfig(tt.expr, config)\n\t\t\thasError := err != nil && strings.Contains(err.Error(), \"exceeds maximum allowed nodes\")\n\n\t\t\tif hasError != tt.shouldError {\n\t\t\t\tt.Errorf(\"ParseWithConfig(%q) error = %v, shouldError %v\", tt.expr, err, tt.shouldError)\n\t\t\t}\n\n\t\t\t// Verify error message format when expected\n\t\t\tif tt.shouldError && err != nil {\n\t\t\t\texpected := \"compilation failed: expression exceeds maximum allowed nodes\"\n\t\t\t\tif !strings.Contains(err.Error(), expected) {\n\t\t\t\t\tt.Errorf(\"Expected error message to contain %q, got %q\", expected, err.Error())\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNodeBudgetDisabled(t *testing.T) {\n\tconfig := conf.CreateNew()\n\tconfig.MaxNodes = 0 // Disable node budget\n\n\texpr := strings.Repeat(\"a + \", 1000) + \"b\"\n\t_, err := parser.ParseWithConfig(expr, config)\n\n\tif err != nil && strings.Contains(err.Error(), \"exceeds maximum allowed nodes\") {\n\t\tt.Error(\"Node budget check should be disabled when MaxNodes is 0\")\n\t}\n}\n"
  },
  {
    "path": "parser/utils/utils.go",
    "content": "package utils\n\nimport (\n\t\"unicode\"\n\t\"unicode/utf8\"\n)\n\nfunc IsValidIdentifier(str string) bool {\n\tif len(str) == 0 {\n\t\treturn false\n\t}\n\th, w := utf8.DecodeRuneInString(str)\n\tif !IsAlphabetic(h) {\n\t\treturn false\n\t}\n\tfor _, r := range str[w:] {\n\t\tif !IsAlphaNumeric(r) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc IsSpace(r rune) bool {\n\treturn unicode.IsSpace(r)\n}\n\nfunc IsAlphaNumeric(r rune) bool {\n\treturn IsAlphabetic(r) || unicode.IsDigit(r)\n}\n\nfunc IsAlphabetic(r rune) bool {\n\treturn r == '_' || r == '$' || unicode.IsLetter(r)\n}\n"
  },
  {
    "path": "patcher/operator_override.go",
    "content": "package patcher\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/builtin\"\n\t\"github.com/expr-lang/expr/checker/nature\"\n\t\"github.com/expr-lang/expr/conf\"\n)\n\ntype OperatorOverloading struct {\n\tOperator  string              // Operator token to overload.\n\tOverloads []string            // List of function names to replace operator with.\n\tEnv       *nature.Nature      // Env type.\n\tFunctions conf.FunctionsTable // Env functions.\n\tapplied   bool                // Flag to indicate if any changes were made to the tree.\n\tNtCache   *nature.Cache\n}\n\nfunc (p *OperatorOverloading) Visit(node *ast.Node) {\n\tbinaryNode, ok := (*node).(*ast.BinaryNode)\n\tif !ok {\n\t\treturn\n\t}\n\n\tif binaryNode.Operator != p.Operator {\n\t\treturn\n\t}\n\n\tleftType := binaryNode.Left.Type()\n\trightType := binaryNode.Right.Type()\n\n\tret, fn, ok := p.FindSuitableOperatorOverload(leftType, rightType)\n\tif ok {\n\t\tnewNode := &ast.CallNode{\n\t\t\tCallee:    &ast.IdentifierNode{Value: fn},\n\t\t\tArguments: []ast.Node{binaryNode.Left, binaryNode.Right},\n\t\t}\n\t\tnewNode.SetType(ret)\n\t\tast.Patch(node, newNode)\n\t\tp.applied = true\n\t}\n}\n\n// Tracking must be reset before every walk over the AST tree\nfunc (p *OperatorOverloading) Reset() {\n\tp.applied = false\n}\n\nfunc (p *OperatorOverloading) ShouldRepeat() bool {\n\treturn p.applied\n}\n\nfunc (p *OperatorOverloading) FindSuitableOperatorOverload(l, r reflect.Type) (reflect.Type, string, bool) {\n\tt, fn, ok := p.findSuitableOperatorOverloadInFunctions(l, r)\n\tif !ok {\n\t\tt, fn, ok = p.findSuitableOperatorOverloadInTypes(l, r)\n\t}\n\treturn t, fn, ok\n}\n\nfunc (p *OperatorOverloading) findSuitableOperatorOverloadInTypes(l, r reflect.Type) (reflect.Type, string, bool) {\n\tfor _, fn := range p.Overloads {\n\t\tfnType, ok := p.Env.Get(p.NtCache, fn)\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tfirstInIndex := 0\n\t\tif fnType.Method {\n\t\t\tfirstInIndex = 1 // As first argument to method is receiver.\n\t\t}\n\t\tret, done := checkTypeSuits(fnType.Type, l, r, firstInIndex)\n\t\tif done {\n\t\t\treturn ret, fn, true\n\t\t}\n\t}\n\treturn nil, \"\", false\n}\n\nfunc (p *OperatorOverloading) findSuitableOperatorOverloadInFunctions(l, r reflect.Type) (reflect.Type, string, bool) {\n\tfor _, fn := range p.Overloads {\n\t\tfnType, ok := p.Functions[fn]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tfirstInIndex := 0\n\t\tfor _, overload := range fnType.Types {\n\t\t\tret, done := checkTypeSuits(overload, l, r, firstInIndex)\n\t\t\tif done {\n\t\t\t\treturn ret, fn, true\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, \"\", false\n}\n\nfunc checkTypeSuits(t reflect.Type, l reflect.Type, r reflect.Type, firstInIndex int) (reflect.Type, bool) {\n\tfirstArgType := t.In(firstInIndex)\n\tsecondArgType := t.In(firstInIndex + 1)\n\n\tfirstArgumentFit := l == firstArgType || (firstArgType.Kind() == reflect.Interface && (l == nil || l.Implements(firstArgType)))\n\tsecondArgumentFit := r == secondArgType || (secondArgType.Kind() == reflect.Interface && (r == nil || r.Implements(secondArgType)))\n\tif firstArgumentFit && secondArgumentFit {\n\t\treturn t.Out(0), true\n\t}\n\treturn nil, false\n}\n\nfunc (p *OperatorOverloading) Check() {\n\tfor _, fn := range p.Overloads {\n\t\tfnType, foundType := p.Env.Get(p.NtCache, fn)\n\t\tfnFunc, foundFunc := p.Functions[fn]\n\t\tif !foundFunc && (!foundType || fnType.Type.Kind() != reflect.Func) {\n\t\t\tpanic(fmt.Errorf(\"function %s for %s operator does not exist in the environment\", fn, p.Operator))\n\t\t}\n\n\t\tif foundType {\n\t\t\tcheckType(fnType, fn, p.Operator)\n\t\t}\n\n\t\tif foundFunc {\n\t\t\tcheckFunc(fnFunc, fn, p.Operator)\n\t\t}\n\t}\n}\n\nfunc checkType(fnType nature.Nature, fn string, operator string) {\n\trequiredNumIn := 2\n\tif fnType.Method {\n\t\trequiredNumIn = 3 // As first argument of method is receiver.\n\t}\n\tif fnType.Type.NumIn() != requiredNumIn || fnType.Type.NumOut() != 1 {\n\t\tpanic(fmt.Errorf(\"function %s for %s operator does not have a correct signature\", fn, operator))\n\t}\n}\n\nfunc checkFunc(fn *builtin.Function, name string, operator string) {\n\tif len(fn.Types) == 0 {\n\t\tpanic(fmt.Errorf(\"function %q for %q operator misses types\", name, operator))\n\t}\n\tfor _, t := range fn.Types {\n\t\tif t.NumIn() != 2 || t.NumOut() != 1 {\n\t\t\tpanic(fmt.Errorf(\"function %q for %q operator does not have a correct signature\", name, operator))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "patcher/value/bench_test.go",
    "content": "package value\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\nfunc Benchmark_valueAdd(b *testing.B) {\n\tenv := make(map[string]any)\n\tenv[\"ValueOne\"] = &customInt{1}\n\tenv[\"ValueTwo\"] = &customInt{2}\n\n\tprogram, err := expr.Compile(\"ValueOne + ValueTwo\", expr.Env(env), ValueGetter)\n\trequire.NoError(b, err)\n\n\tvar out any\n\tv := vm.VM{}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = v.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Equal(b, 3, out.(int))\n}\n\nfunc Benchmark_valueUntypedAdd(b *testing.B) {\n\tenv := make(map[string]any)\n\tenv[\"ValueOne\"] = &customUntypedInt{1}\n\tenv[\"ValueTwo\"] = &customUntypedInt{2}\n\n\tprogram, err := expr.Compile(\"ValueOne + ValueTwo\", expr.Env(env), ValueGetter)\n\trequire.NoError(b, err)\n\n\tvar out any\n\tv := vm.VM{}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = v.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Equal(b, 3, out.(int))\n}\n\nfunc Benchmark_valueTypedAdd(b *testing.B) {\n\tenv := make(map[string]any)\n\tenv[\"ValueOne\"] = &customTypedInt{1}\n\tenv[\"ValueTwo\"] = &customTypedInt{2}\n\n\tprogram, err := expr.Compile(\"ValueOne + ValueTwo\", expr.Env(env), ValueGetter)\n\trequire.NoError(b, err)\n\n\tvar out any\n\tv := vm.VM{}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = v.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.Equal(b, 3, out.(int))\n}\n"
  },
  {
    "path": "patcher/value/value.go",
    "content": "// Package value provides a Patcher that uses interfaces to allow custom types that can be represented as standard go values to be used more easily in expressions.\npackage value\n\nimport (\n\t\"reflect\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/conf\"\n)\n\n// ValueGetter is a Patcher that allows custom types to be represented as standard go values for use with expr.\n// It also adds the `$patcher_value_getter` function to the program for efficiently calling matching interfaces.\n//\n// The purpose of this Patcher is to make it seamless to use custom types in expressions without the need to\n// first convert them to standard go values. It may also facilitate using already existing structs or maps as\n// environments when they contain compatible types.\n//\n// An example usage may be modeling a database record with columns that have varying data types and constraints.\n// In such an example you may have custom types that, beyond storing a simple value, such as an integer, may\n// contain metadata such as column type and if a value is specifically a NULL value.\n//\n// Use it directly as an Option to expr.Compile()\nvar ValueGetter = expr.Option(func(c *conf.Config) {\n\tc.Visitors = append(c.Visitors, patcher{})\n\tgetValueFunc(c)\n})\n\n// A AnyValuer provides a generic function for a custom type to return standard go values.\n// It allows for returning a `nil` value but does not provide any type checking at expression compile.\n//\n// A custom type may implement both AnyValuer and a type specific interface to enable both\n// compile time checking and the ability to return a `nil` value.\ntype AnyValuer interface {\n\tAsAny() any\n}\n\ntype IntValuer interface {\n\tAsInt() int\n}\n\ntype BoolValuer interface {\n\tAsBool() bool\n}\n\ntype Int8Valuer interface {\n\tAsInt8() int8\n}\n\ntype Int16Valuer interface {\n\tAsInt16() int16\n}\n\ntype Int32Valuer interface {\n\tAsInt32() int32\n}\n\ntype Int64Valuer interface {\n\tAsInt64() int64\n}\n\ntype UintValuer interface {\n\tAsUint() uint\n}\n\ntype Uint8Valuer interface {\n\tAsUint8() uint8\n}\n\ntype Uint16Valuer interface {\n\tAsUint16() uint16\n}\n\ntype Uint32Valuer interface {\n\tAsUint32() uint32\n}\n\ntype Uint64Valuer interface {\n\tAsUint64() uint64\n}\n\ntype Float32Valuer interface {\n\tAsFloat32() float32\n}\n\ntype Float64Valuer interface {\n\tAsFloat64() float64\n}\n\ntype StringValuer interface {\n\tAsString() string\n}\n\ntype TimeValuer interface {\n\tAsTime() time.Time\n}\n\ntype DurationValuer interface {\n\tAsDuration() time.Duration\n}\n\ntype ArrayValuer interface {\n\tAsArray() []any\n}\n\ntype MapValuer interface {\n\tAsMap() map[string]any\n}\n\nvar supportedInterfaces = []reflect.Type{\n\treflect.TypeOf((*AnyValuer)(nil)).Elem(),\n\treflect.TypeOf((*BoolValuer)(nil)).Elem(),\n\treflect.TypeOf((*IntValuer)(nil)).Elem(),\n\treflect.TypeOf((*Int8Valuer)(nil)).Elem(),\n\treflect.TypeOf((*Int16Valuer)(nil)).Elem(),\n\treflect.TypeOf((*Int32Valuer)(nil)).Elem(),\n\treflect.TypeOf((*Int64Valuer)(nil)).Elem(),\n\treflect.TypeOf((*UintValuer)(nil)).Elem(),\n\treflect.TypeOf((*Uint8Valuer)(nil)).Elem(),\n\treflect.TypeOf((*Uint16Valuer)(nil)).Elem(),\n\treflect.TypeOf((*Uint32Valuer)(nil)).Elem(),\n\treflect.TypeOf((*Uint64Valuer)(nil)).Elem(),\n\treflect.TypeOf((*Float32Valuer)(nil)).Elem(),\n\treflect.TypeOf((*Float64Valuer)(nil)).Elem(),\n\treflect.TypeOf((*StringValuer)(nil)).Elem(),\n\treflect.TypeOf((*TimeValuer)(nil)).Elem(),\n\treflect.TypeOf((*DurationValuer)(nil)).Elem(),\n\treflect.TypeOf((*ArrayValuer)(nil)).Elem(),\n\treflect.TypeOf((*MapValuer)(nil)).Elem(),\n}\n\ntype patcher struct{}\n\nfunc (patcher) Visit(node *ast.Node) {\n\tswitch id := (*node).(type) {\n\tcase *ast.IdentifierNode, *ast.MemberNode:\n\t\tnodeType := id.Type()\n\t\tfor _, t := range supportedInterfaces {\n\t\t\tif nodeType.Implements(t) {\n\t\t\t\tast.Patch(node, &ast.CallNode{\n\t\t\t\t\tCallee:    &ast.IdentifierNode{Value: \"$patcher_value_getter\"},\n\t\t\t\t\tArguments: []ast.Node{id},\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc getValue(params ...any) (any, error) {\n\tswitch v := params[0].(type) {\n\tcase AnyValuer:\n\t\treturn v.AsAny(), nil\n\tcase BoolValuer:\n\t\treturn v.AsBool(), nil\n\tcase IntValuer:\n\t\treturn v.AsInt(), nil\n\tcase Int8Valuer:\n\t\treturn v.AsInt8(), nil\n\tcase Int16Valuer:\n\t\treturn v.AsInt16(), nil\n\tcase Int32Valuer:\n\t\treturn v.AsInt32(), nil\n\tcase Int64Valuer:\n\t\treturn v.AsInt64(), nil\n\tcase UintValuer:\n\t\treturn v.AsUint(), nil\n\tcase Uint8Valuer:\n\t\treturn v.AsUint8(), nil\n\tcase Uint16Valuer:\n\t\treturn v.AsUint16(), nil\n\tcase Uint32Valuer:\n\t\treturn v.AsUint32(), nil\n\tcase Uint64Valuer:\n\t\treturn v.AsUint64(), nil\n\tcase Float32Valuer:\n\t\treturn v.AsFloat32(), nil\n\tcase Float64Valuer:\n\t\treturn v.AsFloat64(), nil\n\tcase StringValuer:\n\t\treturn v.AsString(), nil\n\tcase TimeValuer:\n\t\treturn v.AsTime(), nil\n\tcase DurationValuer:\n\t\treturn v.AsDuration(), nil\n\tcase ArrayValuer:\n\t\treturn v.AsArray(), nil\n\tcase MapValuer:\n\t\treturn v.AsMap(), nil\n\t}\n\n\treturn params[0], nil\n}\n\nvar getValueFunc = expr.Function(\"$patcher_value_getter\", getValue,\n\tnew(func(BoolValuer) bool),\n\tnew(func(IntValuer) int),\n\tnew(func(Int8Valuer) int8),\n\tnew(func(Int16Valuer) int16),\n\tnew(func(Int32Valuer) int32),\n\tnew(func(Int64Valuer) int64),\n\tnew(func(UintValuer) uint),\n\tnew(func(Uint8Valuer) uint8),\n\tnew(func(Uint16Valuer) uint16),\n\tnew(func(Uint32Valuer) uint32),\n\tnew(func(Uint64Valuer) uint64),\n\tnew(func(Float32Valuer) float32),\n\tnew(func(Float64Valuer) float64),\n\tnew(func(StringValuer) string),\n\tnew(func(TimeValuer) time.Time),\n\tnew(func(DurationValuer) time.Duration),\n\tnew(func(ArrayValuer) []any),\n\tnew(func(MapValuer) map[string]any),\n\tnew(func(any) any),\n)\n"
  },
  {
    "path": "patcher/value/value_example_test.go",
    "content": "package value_test\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/patcher/value\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\ntype myInt struct {\n\tInt int\n}\n\nfunc (v *myInt) AsInt() int {\n\treturn v.Int\n}\n\nfunc (v *myInt) AsAny() any {\n\treturn v.Int\n}\n\nfunc ExampleAnyValuer() {\n\tenv := make(map[string]any)\n\tenv[\"ValueOne\"] = &myInt{1}\n\tenv[\"ValueTwo\"] = &myInt{2}\n\n\tprogram, err := expr.Compile(\"ValueOne + ValueTwo\", expr.Env(env), value.ValueGetter)\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tout, err := vm.Run(program, env)\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(out)\n\t// Output: 3\n}\n"
  },
  {
    "path": "patcher/value/value_test.go",
    "content": "package value\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\ntype customInt struct {\n\tInt int\n}\n\nfunc (v *customInt) AsInt() int {\n\treturn v.Int\n}\n\nfunc (v *customInt) AsAny() any {\n\treturn v.Int\n}\n\ntype customTypedInt struct {\n\tInt int\n}\n\nfunc (v *customTypedInt) AsInt() int {\n\treturn v.Int\n}\n\ntype customUntypedInt struct {\n\tInt int\n}\n\nfunc (v *customUntypedInt) AsAny() any {\n\treturn v.Int\n}\n\ntype customString struct {\n\tString string\n}\n\nfunc (v *customString) AsString() string {\n\treturn v.String\n}\n\nfunc (v *customString) AsAny() any {\n\treturn v.String\n}\n\ntype customTypedString struct {\n\tString string\n}\n\nfunc (v *customTypedString) AsString() string {\n\treturn v.String\n}\n\ntype customUntypedString struct {\n\tString string\n}\n\nfunc (v *customUntypedString) AsAny() any {\n\treturn v.String\n}\n\ntype customTypedArray struct {\n\tArray []any\n}\n\nfunc (v *customTypedArray) AsArray() []any {\n\treturn v.Array\n}\n\ntype customTypedMap struct {\n\tMap map[string]any\n}\n\nfunc (v *customTypedMap) AsMap() map[string]any {\n\treturn v.Map\n}\n\nfunc Test_valueAddInt(t *testing.T) {\n\tenv := make(map[string]any)\n\tenv[\"ValueOne\"] = &customInt{1}\n\tenv[\"ValueTwo\"] = &customInt{2}\n\n\tprogram, err := expr.Compile(\"ValueOne + ValueTwo\", expr.Env(env), ValueGetter)\n\trequire.NoError(t, err)\n\tout, err := vm.Run(program, env)\n\n\trequire.NoError(t, err)\n\trequire.Equal(t, 3, out.(int))\n}\n\nfunc Test_valueUntypedAddInt(t *testing.T) {\n\tenv := make(map[string]any)\n\tenv[\"ValueOne\"] = &customUntypedInt{1}\n\tenv[\"ValueTwo\"] = &customUntypedInt{2}\n\n\tprogram, err := expr.Compile(\"ValueOne + ValueTwo\", expr.Env(env), ValueGetter)\n\trequire.NoError(t, err)\n\n\tout, err := vm.Run(program, env)\n\n\trequire.NoError(t, err)\n\trequire.Equal(t, 3, out.(int))\n}\n\nfunc Test_valueTypedAddInt(t *testing.T) {\n\tenv := make(map[string]any)\n\tenv[\"ValueOne\"] = &customTypedInt{1}\n\tenv[\"ValueTwo\"] = &customTypedInt{2}\n\n\tprogram, err := expr.Compile(\"ValueOne + ValueTwo\", expr.Env(env), ValueGetter)\n\trequire.NoError(t, err)\n\n\tout, err := vm.Run(program, env)\n\n\trequire.NoError(t, err)\n\trequire.Equal(t, 3, out.(int))\n}\n\nfunc Test_valueTypedAddMismatch(t *testing.T) {\n\tenv := make(map[string]any)\n\tenv[\"ValueOne\"] = &customTypedInt{1}\n\tenv[\"ValueTwo\"] = &customTypedString{\"test\"}\n\n\t_, err := expr.Compile(\"ValueOne + ValueTwo\", expr.Env(env), ValueGetter)\n\trequire.Error(t, err)\n}\n\nfunc Test_valueUntypedAddMismatch(t *testing.T) {\n\tenv := make(map[string]any)\n\tenv[\"ValueOne\"] = &customUntypedInt{1}\n\tenv[\"ValueTwo\"] = &customUntypedString{\"test\"}\n\n\tprogram, err := expr.Compile(\"ValueOne + ValueTwo\", expr.Env(env), ValueGetter)\n\trequire.NoError(t, err)\n\n\t_, err = vm.Run(program, env)\n\n\trequire.Error(t, err)\n}\n\nfunc Test_valueTypedArray(t *testing.T) {\n\tenv := make(map[string]any)\n\tenv[\"ValueOne\"] = &customTypedArray{[]any{1, 2}}\n\n\tprogram, err := expr.Compile(\"ValueOne[0] + ValueOne[1]\", expr.Env(env), ValueGetter)\n\trequire.NoError(t, err)\n\n\tout, err := vm.Run(program, env)\n\n\trequire.NoError(t, err)\n\trequire.Equal(t, 3, out.(int))\n}\n\nfunc Test_valueTypedMap(t *testing.T) {\n\tenv := make(map[string]any)\n\tenv[\"ValueOne\"] = &customTypedMap{map[string]any{\"one\": 1, \"two\": 2}}\n\n\tprogram, err := expr.Compile(\"ValueOne.one + ValueOne.two\", expr.Env(env), ValueGetter)\n\trequire.NoError(t, err)\n\n\tout, err := vm.Run(program, env)\n\n\trequire.NoError(t, err)\n\trequire.Equal(t, 3, out.(int))\n}\n"
  },
  {
    "path": "patcher/with_context.go",
    "content": "package patcher\n\nimport (\n\t\"reflect\"\n\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/checker/nature\"\n\t\"github.com/expr-lang/expr/conf\"\n)\n\n// WithContext adds WithContext.Name argument to all functions calls with a context.Context argument.\ntype WithContext struct {\n\tName      string\n\tFunctions conf.FunctionsTable // Optional: used to look up function types when callee type is unknown.\n\tEnv       *nature.Nature      // Optional: used to look up method types when callee type is unknown.\n\tNtCache   *nature.Cache       // Optional: cache for nature lookups.\n}\n\n// Visit adds WithContext.Name argument to all functions calls with a context.Context argument.\nfunc (w WithContext) Visit(node *ast.Node) {\n\tswitch call := (*node).(type) {\n\tcase *ast.CallNode:\n\t\tfn := call.Callee.Type()\n\t\tif fn == nil {\n\t\t\treturn\n\t\t}\n\t\t// If callee type is interface{} (unknown), look up the function type from\n\t\t// the Functions table or Env. This handles cases where the checker returns early\n\t\t// without visiting nested call arguments (e.g., Date2() in Now2().After(Date2()))\n\t\t// because the outer call's type is unknown due to missing context arguments.\n\t\tif fn.Kind() == reflect.Interface {\n\t\t\tif ident, ok := call.Callee.(*ast.IdentifierNode); ok {\n\t\t\t\tif w.Functions != nil {\n\t\t\t\t\tif f, ok := w.Functions[ident.Value]; ok {\n\t\t\t\t\t\tfn = f.Type()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif fn.Kind() == reflect.Interface && w.Env != nil {\n\t\t\t\t\tif m, ok := w.Env.MethodByName(w.NtCache, ident.Value); ok {\n\t\t\t\t\t\tfn = m.Type\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif fn.Kind() != reflect.Func {\n\t\t\treturn\n\t\t}\n\t\tswitch fn.NumIn() {\n\t\tcase 0:\n\t\t\treturn\n\t\tcase 1:\n\t\t\tif fn.In(0).String() != \"context.Context\" {\n\t\t\t\treturn\n\t\t\t}\n\t\tdefault:\n\t\t\tif fn.In(0).String() != \"context.Context\" &&\n\t\t\t\tfn.In(1).String() != \"context.Context\" {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tast.Patch(node, &ast.CallNode{\n\t\t\tCallee: call.Callee,\n\t\t\tArguments: append([]ast.Node{\n\t\t\t\t&ast.IdentifierNode{Value: w.Name},\n\t\t\t}, call.Arguments...),\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "patcher/with_context_test.go",
    "content": "package patcher_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/patcher\"\n)\n\nfunc TestWithContext(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"fn\": func(ctx context.Context, a int) int {\n\t\t\treturn ctx.Value(\"value\").(int) + a\n\t\t},\n\t\t\"ctx\": context.TODO(),\n\t}\n\n\twithContext := patcher.WithContext{Name: \"ctx\"}\n\n\tprogram, err := expr.Compile(`fn(40)`, expr.Env(env), expr.Patch(withContext))\n\trequire.NoError(t, err)\n\n\tctx := context.WithValue(context.Background(), \"value\", 2)\n\tenv[\"ctx\"] = ctx\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 42, output)\n}\n\nfunc TestWithContext_with_env_Function(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"ctx\": context.TODO(),\n\t}\n\n\tfn := expr.Function(\"fn\",\n\t\tfunc(params ...any) (any, error) {\n\t\t\tctx := params[0].(context.Context)\n\t\t\ta := params[1].(int)\n\n\t\t\treturn ctx.Value(\"value\").(int) + a, nil\n\t\t},\n\t\tnew(func(context.Context, int) int),\n\t)\n\n\tprogram, err := expr.Compile(\n\t\t`fn(40)`,\n\t\texpr.Env(env),\n\t\texpr.WithContext(\"ctx\"),\n\t\tfn,\n\t)\n\trequire.NoError(t, err)\n\n\tctx := context.WithValue(context.Background(), \"value\", 2)\n\tenv[\"ctx\"] = ctx\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 42, output)\n}\n\ntype testEnvContext struct {\n\tContext context.Context `expr:\"ctx\"`\n}\n\nfunc (testEnvContext) Fn(ctx context.Context, a int) int {\n\treturn ctx.Value(\"value\").(int) + a\n}\n\nfunc TestWithContext_env_struct(t *testing.T) {\n\twithContext := patcher.WithContext{Name: \"ctx\"}\n\n\tprogram, err := expr.Compile(`Fn(40)`, expr.Env(testEnvContext{}), expr.Patch(withContext))\n\trequire.NoError(t, err)\n\n\tctx := context.WithValue(context.Background(), \"value\", 2)\n\tenv := testEnvContext{\n\t\tContext: ctx,\n\t}\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 42, output)\n}\n\ntype TestFoo struct {\n\tcontextValue int\n}\n\nfunc (f *TestFoo) GetValue(a int) int64 {\n\treturn int64(f.contextValue + a)\n}\n\nfunc TestWithContext_with_env_method_chain(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"ctx\": context.TODO(),\n\t}\n\n\tfn := expr.Function(\"fn\",\n\t\tfunc(params ...any) (any, error) {\n\t\t\tctx := params[0].(context.Context)\n\n\t\t\tcontextValue := ctx.Value(\"value\").(int)\n\n\t\t\treturn &TestFoo{\n\t\t\t\tcontextValue: contextValue,\n\t\t\t}, nil\n\t\t},\n\t\tnew(func(context.Context) *TestFoo),\n\t)\n\n\tprogram, err := expr.Compile(\n\t\t`fn().GetValue(40)`,\n\t\texpr.Env(env),\n\t\texpr.WithContext(\"ctx\"),\n\t\tfn,\n\t\texpr.AsInt64(),\n\t)\n\trequire.NoError(t, err)\n\n\tctx := context.WithValue(context.Background(), \"value\", 2)\n\tenv[\"ctx\"] = ctx\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, int64(42), output)\n}\n\nfunc TestWithContext_issue529(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"ctx\": context.Background(),\n\t\t\"foo\": func(ctx context.Context, n int) int {\n\t\t\tif ctx == nil {\n\t\t\t\tpanic(\"wanted a context\")\n\t\t\t}\n\t\t\treturn n + 1\n\t\t},\n\t}\n\toptions := []expr.Option{\n\t\texpr.Env(env),\n\t\texpr.WithContext(\"ctx\"),\n\t}\n\n\tcode := \"foo(0) | foo()\"\n\tprogram, err := expr.Compile(code, options...)\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 2, out)\n}\n"
  },
  {
    "path": "patcher/with_timezone.go",
    "content": "package patcher\n\nimport (\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/ast\"\n)\n\n// WithTimezone passes Location to date() and now() functions.\ntype WithTimezone struct {\n\tLocation *time.Location\n}\n\nfunc (t WithTimezone) Visit(node *ast.Node) {\n\tif btin, ok := (*node).(*ast.BuiltinNode); ok {\n\t\tswitch btin.Name {\n\t\tcase \"date\", \"now\":\n\t\t\tloc := &ast.ConstantNode{Value: t.Location}\n\t\t\tast.Patch(node, &ast.BuiltinNode{\n\t\t\t\tName:      btin.Name,\n\t\t\t\tArguments: append([]ast.Node{loc}, btin.Arguments...),\n\t\t\t})\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "patcher/with_timezone_test.go",
    "content": "package patcher_test\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n)\n\nfunc TestWithTimezone_date(t *testing.T) {\n\tprogram, err := expr.Compile(`date(\"2024-05-07 23:00:00\")`, expr.Timezone(\"Europe/Zurich\"))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, nil)\n\trequire.NoError(t, err)\n\trequire.Equal(t, \"2024-05-07T23:00:00+02:00\", out.(time.Time).Format(time.RFC3339))\n}\n\nfunc TestWithTimezone_now(t *testing.T) {\n\tprogram, err := expr.Compile(`now()`, expr.Timezone(\"Asia/Kamchatka\"))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, nil)\n\trequire.NoError(t, err)\n\trequire.Equal(t, \"Asia/Kamchatka\", out.(time.Time).Location().String())\n}\n"
  },
  {
    "path": "repl/go.mod",
    "content": "module github.com/expr-lang/expr/repl\n\ngo 1.20\n\nrequire (\n\tgithub.com/bettercap/readline v0.0.0-20210228151553-655e48bcb7bf\n\tgithub.com/expr-lang/expr v1.13.0\n\tgithub.com/expr-lang/expr/debug v0.0.0\n)\n\nrequire (\n\tgithub.com/chzyer/test v1.0.0 // indirect\n\tgithub.com/gdamore/encoding v1.0.0 // indirect\n\tgithub.com/gdamore/tcell/v2 v2.6.0 // indirect\n\tgithub.com/lucasb-eyer/go-colorful v1.2.0 // indirect\n\tgithub.com/mattn/go-runewidth v0.0.15 // indirect\n\tgithub.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703 // indirect\n\tgithub.com/rivo/uniseg v0.4.4 // indirect\n\tgolang.org/x/sys v0.11.0 // indirect\n\tgolang.org/x/term v0.11.0 // indirect\n\tgolang.org/x/text v0.12.0 // indirect\n)\n\nreplace github.com/expr-lang/expr => ../\n\nreplace github.com/expr-lang/expr/debug => ../debug\n"
  },
  {
    "path": "repl/go.sum",
    "content": "github.com/bettercap/readline v0.0.0-20210228151553-655e48bcb7bf h1:pwGPRc5PIp4KCF9QbKn0iLVMhfigUMw4IzGZEZ81m1I=\ngithub.com/bettercap/readline v0.0.0-20210228151553-655e48bcb7bf/go.mod h1:03rWiUf60r1miMVzMEtgtkq7RdZniecZFw3/Zgvyxcs=\ngithub.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM=\ngithub.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ=\ngithub.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04=\ngithub.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=\ngithub.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko=\ngithub.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=\ngithub.com/gdamore/tcell/v2 v2.6.0 h1:OKbluoP9VYmJwZwq/iLb4BxwKcwGthaa1YNBJIyCySg=\ngithub.com/gdamore/tcell/v2 v2.6.0/go.mod h1:be9omFATkdr0D9qewWW3d+MEvl5dha+Etb5y65J2H8Y=\ngithub.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=\ngithub.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=\ngithub.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=\ngithub.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=\ngithub.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=\ngithub.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703 h1:ZyM/+FYnpbZsFWuCohniM56kRoHRB4r5EuIzXEYkpxo=\ngithub.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE=\ngithub.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=\ngithub.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=\ngithub.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=\ngithub.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=\ngolang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=\ngolang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=\ngolang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n"
  },
  {
    "path": "repl/repl.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\t\"strings\"\n\n\t\"github.com/expr-lang/expr/test/fuzz\"\n\n\t\"github.com/bettercap/readline\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/builtin\"\n\t\"github.com/expr-lang/expr/debug\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\nvar keywords = []string{\n\t// Commands:\n\t\"exit\", \"opcodes\", \"debug\", \"mem\",\n\n\t// Operators:\n\t\"and\", \"or\", \"in\", \"not\", \"not in\",\n\t\"contains\", \"matches\", \"startsWith\", \"endsWith\",\n}\n\nfunc main() {\n\tenv := fuzz.NewEnv()\n\tfor name := range env {\n\t\tkeywords = append(keywords, name)\n\t}\n\tfn := fuzz.Func()\n\tkeywords = append(keywords, \"fn\")\n\thome, err := os.UserHomeDir()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\trl, err := readline.NewEx(&readline.Config{\n\t\tPrompt:       \"❯ \",\n\t\tAutoComplete: completer{append(builtin.Names, keywords...)},\n\t\tHistoryFile:  home + \"/.expr_history\",\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer rl.Close()\n\n\tvar memUsage uint64\n\tvar program *vm.Program\n\n\tfor {\n\t\tline, err := rl.Readline()\n\t\tif err != nil { // io.EOF when Ctrl-D is pressed\n\t\t\tbreak\n\t\t}\n\t\tline = strings.TrimSpace(line)\n\n\t\tswitch line {\n\t\tcase \"\":\n\t\t\tcontinue\n\n\t\tcase \"exit\":\n\t\t\treturn\n\n\t\tcase \"mem\":\n\t\t\tfmt.Printf(\"memory usage: %s\\n\", humanizeBytes(memUsage))\n\t\t\tcontinue\n\n\t\tcase \"opcodes\":\n\t\t\tif program == nil {\n\t\t\t\tfmt.Println(\"no program\")\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfmt.Println(program.Disassemble())\n\t\t\tcontinue\n\n\t\tcase \"debug\":\n\t\t\tif program == nil {\n\t\t\t\tfmt.Println(\"no program\")\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tdebug.StartDebugger(program, env)\n\t\t\tcontinue\n\t\t}\n\n\t\tprogram, err = expr.Compile(line, expr.Env(env), fn)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"compile error: %s\\n\", err)\n\t\t\tcontinue\n\t\t}\n\n\t\tstart := memoryUsage()\n\t\toutput, err := expr.Run(program, env)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"runtime error: %s\\n\", err)\n\t\t\tcontinue\n\t\t}\n\t\tmemUsage = memoryUsage() - start\n\n\t\tfmt.Println(output)\n\t}\n}\n\ntype completer struct {\n\twords []string\n}\n\nfunc (c completer) Do(line []rune, pos int) ([][]rune, int) {\n\tvar lastWord string\n\tfor i := pos - 1; i >= 0; i-- {\n\t\tif line[i] == ' ' {\n\t\t\tbreak\n\t\t}\n\t\tlastWord = string(line[i]) + lastWord\n\t}\n\n\tvar words [][]rune\n\tfor _, word := range c.words {\n\t\tif strings.HasPrefix(word, lastWord) {\n\t\t\twords = append(words, []rune(strings.TrimPrefix(word, lastWord)))\n\t\t}\n\t}\n\n\treturn words, len(lastWord)\n}\n\nfunc memoryUsage() uint64 {\n\tvar m runtime.MemStats\n\truntime.ReadMemStats(&m)\n\treturn m.Alloc\n}\n\nfunc humanizeBytes(b uint64) string {\n\tconst unit = 1024\n\tif b < unit {\n\t\treturn fmt.Sprintf(\"%d B\", b)\n\t}\n\tdiv, exp := uint64(unit), 0\n\tfor n := b / unit; n >= unit; n /= unit {\n\t\tdiv *= unit\n\t\texp++\n\t}\n\treturn fmt.Sprintf(\"%.2f %ciB\",\n\t\tfloat64(b)/float64(div), \"KMGTPE\"[exp])\n}\n"
  },
  {
    "path": "test/bench/bench_call_test.go",
    "content": "package bench_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\ntype Env struct {\n\tFn func() bool\n}\n\nfunc BenchmarkCall_callTyped(b *testing.B) {\n\tcode := `Fn()`\n\n\tp, err := expr.Compile(code, expr.Env(Env{}))\n\trequire.NoError(b, err)\n\trequire.Equal(b, p.Bytecode[1], vm.OpCallTyped)\n\n\tenv := Env{\n\t\tFn: func() bool {\n\t\t\treturn true\n\t\t},\n\t}\n\n\tvar out any\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tprogram, _ := expr.Compile(code, expr.Env(env))\n\t\tout, err = vm.Run(program, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.True(b, out.(bool))\n}\n\nfunc BenchmarkCall_eval(b *testing.B) {\n\tcode := `Fn()`\n\n\tp, err := expr.Compile(code)\n\trequire.NoError(b, err)\n\trequire.Equal(b, p.Bytecode[1], vm.OpCall)\n\n\tenv := Env{\n\t\tFn: func() bool {\n\t\t\treturn true\n\t\t},\n\t}\n\n\tvar out any\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\tout, err = expr.Eval(code, env)\n\t}\n\tb.StopTimer()\n\n\trequire.NoError(b, err)\n\trequire.True(b, out.(bool))\n}\n"
  },
  {
    "path": "test/coredns/coredns.go",
    "content": "package coredns\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"net\"\n)\n\nfunc DefaultEnv(ctx context.Context, state *Request) map[string]any {\n\treturn map[string]any{\n\t\t\"incidr\": func(ipStr, cidrStr string) (bool, error) {\n\t\t\tip := net.ParseIP(ipStr)\n\t\t\tif ip == nil {\n\t\t\t\treturn false, errors.New(\"first argument is not an IP address\")\n\t\t\t}\n\t\t\t_, cidr, err := net.ParseCIDR(cidrStr)\n\t\t\tif err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\t\t\treturn cidr.Contains(ip), nil\n\t\t},\n\t\t\"metadata\": func(label string) string {\n\t\t\treturn \"\"\n\t\t},\n\t\t\"type\":        state.Type,\n\t\t\"name\":        state.Name,\n\t\t\"class\":       state.Class,\n\t\t\"proto\":       state.Proto,\n\t\t\"size\":        state.Len,\n\t\t\"client_ip\":   state.IP,\n\t\t\"port\":        state.Port,\n\t\t\"id\":          func() int { return int(state.Req.Id) },\n\t\t\"opcode\":      func() int { return state.Req.Opcode },\n\t\t\"do\":          state.Do,\n\t\t\"bufsize\":     state.Size,\n\t\t\"server_ip\":   state.LocalIP,\n\t\t\"server_port\": state.LocalPort,\n\t}\n}\n\ntype Request struct {\n\tReq  *Msg\n\tW    ResponseWriter\n\tZone string\n}\n\nfunc (r *Request) NewWithQuestion(name string, typ uint16) Request {\n\treturn Request{}\n}\n\nfunc (r *Request) IP() string {\n\treturn \"\"\n}\n\nfunc (r *Request) LocalIP() string {\n\treturn \"\"\n}\n\nfunc (r *Request) Port() string {\n\treturn \"\"\n}\n\nfunc (r *Request) LocalPort() string {\n\treturn \"\"\n}\n\nfunc (r *Request) RemoteAddr() string { return r.W.RemoteAddr().String() }\n\nfunc (r *Request) LocalAddr() string { return r.W.LocalAddr().String() }\n\nfunc (r *Request) Proto() string {\n\treturn \"udp\"\n}\n\nfunc (r *Request) Family() int {\n\treturn 2\n}\n\nfunc (r *Request) Do() bool {\n\treturn true\n}\n\nfunc (r *Request) Len() int { return 0 }\n\nfunc (r *Request) Size() int {\n\treturn 0\n}\n\nfunc (r *Request) SizeAndDo(m *Msg) bool {\n\treturn true\n}\n\nfunc (r *Request) Scrub(reply *Msg) *Msg {\n\treturn reply\n}\n\nfunc (r *Request) Type() string {\n\treturn \"\"\n}\n\nfunc (r *Request) QType() uint16 {\n\treturn 0\n}\n\nfunc (r *Request) Name() string {\n\treturn \".\"\n}\n\nfunc (r *Request) QName() string {\n\treturn \".\"\n}\n\nfunc (r *Request) Class() string {\n\treturn \"\"\n}\n\nfunc (r *Request) QClass() uint16 {\n\treturn 0\n}\n\nfunc (r *Request) Clear() {\n}\n\nfunc (r *Request) Match(reply *Msg) bool {\n\treturn true\n}\n\ntype Msg struct {\n\tMsgHdr\n\tCompress bool `json:\"-\"`\n\tQuestion []Question\n\tAnswer   []RR\n\tNs       []RR\n\tExtra    []RR\n}\n\ntype MsgHdr struct {\n\tId                 uint16\n\tResponse           bool\n\tOpcode             int\n\tAuthoritative      bool\n\tTruncated          bool\n\tRecursionDesired   bool\n\tRecursionAvailable bool\n\tZero               bool\n\tAuthenticatedData  bool\n\tCheckingDisabled   bool\n\tRcode              int\n}\n\ntype Question struct {\n\tName   string `dns:\"cdomain-name\"`\n\tQtype  uint16\n\tQclass uint16\n}\n\ntype RR interface {\n\tHeader() *RR_Header\n\tString() string\n}\n\ntype RR_Header struct {\n\tName     string `dns:\"cdomain-name\"`\n\tRrtype   uint16\n\tClass    uint16\n\tTtl      uint32\n\tRdlength uint16\n}\n\ntype ResponseWriter interface {\n\tLocalAddr() net.Addr\n\tRemoteAddr() net.Addr\n\tWriteMsg(*Msg) error\n\tWrite([]byte) (int, error)\n\tClose() error\n\tTsigStatus() error\n\tTsigTimersOnly(bool)\n\tHijack()\n}\n"
  },
  {
    "path": "test/coredns/coredns_test.go",
    "content": "package coredns_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/test/coredns\"\n)\n\nfunc TestCoreDNS(t *testing.T) {\n\tenv := coredns.DefaultEnv(context.Background(), &coredns.Request{})\n\n\ttests := []struct {\n\t\tinput string\n\t}{\n\t\t{`metadata('geoip/city/name') == 'Exampleshire'`},\n\t\t{`(type() == 'A' && name() == 'example.com') || client_ip() == '1.2.3.4'`},\n\t\t{`name() matches '^abc\\\\..*\\\\.example\\\\.com\\\\.$'`},\n\t\t{`type() in ['A', 'AAAA']`},\n\t\t{`incidr(client_ip(), '192.168.0.0/16')`},\n\t\t{`incidr(client_ip(), '127.0.0.0/24')`},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\t_, err := expr.Compile(test.input, expr.Env(env), expr.DisableBuiltin(\"type\"))\n\t\t\tassert.NoError(t, err)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "test/crowdsec/crowdsec.go",
    "content": "package crowdsec\n\nimport (\n\t\"time\"\n)\n\ntype Event struct {\n\tType            int               `yaml:\"Type,omitempty\" json:\"Type,omitempty\"`\n\tExpectMode      int               `yaml:\"ExpectMode,omitempty\" json:\"ExpectMode,omitempty\"`\n\tWhitelisted     bool              `yaml:\"Whitelisted,omitempty\" json:\"Whitelisted,omitempty\"`\n\tWhitelistReason string            `yaml:\"WhitelistReason,omitempty\" json:\"whitelist_reason,omitempty\"`\n\tStage           string            `yaml:\"Stage,omitempty\" json:\"Stage,omitempty\"`\n\tLine            Line              `yaml:\"Line,omitempty\" json:\"Line,omitempty\"`\n\tParsed          map[string]string `yaml:\"Parsed,omitempty\" json:\"Parsed,omitempty\"`\n\tEnriched        map[string]string `yaml:\"Enriched,omitempty\" json:\"Enriched,omitempty\"`\n\tUnmarshaled     map[string]any    `yaml:\"Unmarshaled,omitempty\" json:\"Unmarshaled,omitempty\"`\n\tOverflow        RuntimeAlert      `yaml:\"Overflow,omitempty\" json:\"Alert,omitempty\"`\n\tTime            time.Time         `yaml:\"Time,omitempty\" json:\"Time,omitempty\"`\n\tStrTime         string            `yaml:\"StrTime,omitempty\" json:\"StrTime,omitempty\"`\n\tStrTimeFormat   string            `yaml:\"StrTimeFormat,omitempty\" json:\"StrTimeFormat,omitempty\"`\n\tMarshaledTime   string            `yaml:\"MarshaledTime,omitempty\" json:\"MarshaledTime,omitempty\"`\n\tProcess         bool              `yaml:\"Process,omitempty\" json:\"Process,omitempty\"`\n\tMeta            map[string]string `yaml:\"Meta,omitempty\" json:\"Meta,omitempty\"`\n}\n\nfunc (e *Event) GetType() string {\n\treturn \"\"\n}\n\nfunc (e *Event) GetMeta(key string) string {\n\treturn \"\"\n}\n\ntype Alert struct {\n\tCapacity        *int32      `json:\"capacity\"`\n\tCreatedAt       string      `json:\"created_at,omitempty\"`\n\tDecisions       []*Decision `json:\"decisions\"`\n\tEvents          []*Event    `json:\"events\"`\n\tEventsCount     *int32      `json:\"events_count\"`\n\tID              int64       `json:\"id,omitempty\"`\n\tLabels          []string    `json:\"labels\"`\n\tLeakspeed       *string     `json:\"leakspeed\"`\n\tMachineID       string      `json:\"machine_id,omitempty\"`\n\tMessage         *string     `json:\"message\"`\n\tMeta            Meta        `json:\"meta,omitempty\"`\n\tRemediation     bool        `json:\"remediation,omitempty\"`\n\tScenario        *string     `json:\"scenario\"`\n\tScenarioHash    *string     `json:\"scenario_hash\"`\n\tScenarioVersion *string     `json:\"scenario_version\"`\n\tSimulated       *bool       `json:\"simulated\"`\n\tSource          *Source     `json:\"source\"`\n\tStartAt         *string     `json:\"start_at\"`\n\tStopAt          *string     `json:\"stop_at\"`\n\tUUID            string      `json:\"uuid,omitempty\"`\n\tEdges           AlertEdges  `json:\"edges\"`\n}\n\nfunc (a *Alert) HasRemediation() bool {\n\treturn true\n}\n\nfunc (a *Alert) GetScope() string {\n\treturn \"\"\n}\n\nfunc (a *Alert) GetValue() string {\n\treturn \"\"\n}\n\nfunc (a *Alert) GetScenario() string {\n\treturn \"\"\n}\n\nfunc (a *Alert) GetEventsCount() int32 {\n\treturn 0\n}\n\nfunc (a *Alert) GetMeta(_ string) string {\n\treturn \"\"\n}\n\nfunc (s Source) GetValue() string {\n\treturn *s.Value\n}\n\nfunc (s Source) GetScope() string {\n\treturn *s.Scope\n}\n\nfunc (s Source) GetAsNumberName() string {\n\treturn \"\"\n}\n\ntype AlertEdges struct {\n\tOwner     *Machine    `json:\"owner,omitempty\"`\n\tDecisions []*Decision `json:\"decisions,omitempty\"`\n\tEvents    []*Event    `json:\"events,omitempty\"`\n\tMetas     []*Meta     `json:\"metas,omitempty\"`\n}\n\nfunc (e AlertEdges) OwnerOrErr() (*Machine, error) {\n\treturn nil, nil\n}\n\nfunc (e AlertEdges) DecisionsOrErr() ([]*Decision, error) {\n\treturn nil, nil\n}\n\nfunc (e AlertEdges) EventsOrErr() ([]*Event, error) {\n\treturn nil, nil\n}\n\nfunc (e AlertEdges) MetasOrErr() ([]*Meta, error) {\n\treturn nil, nil\n}\n\ntype Machine struct {\n\tID            int          `json:\"id,omitempty\"`\n\tCreatedAt     *time.Time   `json:\"created_at,omitempty\"`\n\tUpdatedAt     *time.Time   `json:\"updated_at,omitempty\"`\n\tLastPush      *time.Time   `json:\"last_push,omitempty\"`\n\tLastHeartbeat *time.Time   `json:\"last_heartbeat,omitempty\"`\n\tMachineId     string       `json:\"machineId,omitempty\"`\n\tPassword      string       `json:\"-\"`\n\tIpAddress     string       `json:\"ipAddress,omitempty\"`\n\tScenarios     string       `json:\"scenarios,omitempty\"`\n\tVersion       string       `json:\"version,omitempty\"`\n\tIsValidated   bool         `json:\"isValidated,omitempty\"`\n\tStatus        string       `json:\"status,omitempty\"`\n\tAuthType      string       `json:\"auth_type\"`\n\tEdges         MachineEdges `json:\"edges\"`\n}\n\ntype MachineEdges struct {\n\tAlerts []*Alert `json:\"alerts,omitempty\"`\n}\n\ntype Decision struct {\n\tDuration  *string `json:\"duration\"`\n\tID        int64   `json:\"id,omitempty\"`\n\tOrigin    *string `json:\"origin\"`\n\tScenario  *string `json:\"scenario\"`\n\tScope     *string `json:\"scope\"`\n\tSimulated *bool   `json:\"simulated,omitempty\"`\n\tType      *string `json:\"type\"`\n\tUntil     string  `json:\"until,omitempty\"`\n\tUUID      string  `json:\"uuid,omitempty\"`\n\tValue     *string `json:\"value\"`\n}\n\ntype Line struct {\n\tRaw     string `yaml:\"Raw,omitempty\"`\n\tSrc     string `yaml:\"Src,omitempty\"`\n\tTime    time.Time\n\tLabels  map[string]string `yaml:\"Labels,omitempty\"`\n\tProcess bool\n\tModule  string `yaml:\"Module,omitempty\"`\n}\n\ntype ScopeType struct {\n\tScope  string `yaml:\"type\"`\n\tFilter string `yaml:\"expression\"`\n}\n\ntype RuntimeAlert struct {\n\tMapkey      string            `yaml:\"MapKey,omitempty\" json:\"MapKey,omitempty\"`\n\tBucketId    string            `yaml:\"BucketId,omitempty\" json:\"BucketId,omitempty\"`\n\tWhitelisted bool              `yaml:\"Whitelisted,omitempty\" json:\"Whitelisted,omitempty\"`\n\tReprocess   bool              `yaml:\"Reprocess,omitempty\" json:\"Reprocess,omitempty\"`\n\tSources     map[string]Source `yaml:\"Sources,omitempty\" json:\"Sources,omitempty\"`\n\tAlert       *Alert            `yaml:\"Alert,omitempty\" json:\"Alert,omitempty\"`\n\tAPIAlerts   []Alert           `yaml:\"APIAlerts,omitempty\" json:\"APIAlerts,omitempty\"`\n}\n\nfunc (r RuntimeAlert) GetSources() []string {\n\treturn nil\n}\n\ntype Source struct {\n\tAsName    string  `json:\"as_name,omitempty\"`\n\tAsNumber  string  `json:\"as_number,omitempty\"`\n\tCn        string  `json:\"cn,omitempty\"`\n\tIP        string  `json:\"ip,omitempty\"`\n\tLatitude  float32 `json:\"latitude,omitempty\"`\n\tLongitude float32 `json:\"longitude,omitempty\"`\n\tRange     string  `json:\"range,omitempty\"`\n\tScope     *string `json:\"scope\"`\n\tValue     *string `json:\"value\"`\n}\n\ntype Meta []*MetaItems0\n\ntype MetaItems0 struct {\n\tKey   string `json:\"key,omitempty\"`\n\tValue string `json:\"value,omitempty\"`\n}\n"
  },
  {
    "path": "test/crowdsec/crowdsec_test.go",
    "content": "package crowdsec_test\n\nimport (\n\t\"encoding/json\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/test/crowdsec\"\n)\n\nfunc TestCrowdsec(t *testing.T) {\n\tb, err := os.ReadFile(\"../../testdata/crowdsec.json\")\n\trequire.NoError(t, err)\n\n\tvar examples []string\n\terr = json.Unmarshal(b, &examples)\n\trequire.NoError(t, err)\n\n\tenv := map[string]any{\n\t\t\"evt\": &crowdsec.Event{},\n\t}\n\n\tvar opt = []expr.Option{\n\t\texpr.Env(env),\n\t}\n\tfor _, fn := range crowdsec.CustomFunctions {\n\t\topt = append(\n\t\t\topt,\n\t\t\texpr.Function(\n\t\t\t\tfn.Name,\n\t\t\t\tfunc(params ...any) (any, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t\tfn.Func...,\n\t\t\t),\n\t\t)\n\t}\n\n\tfor _, line := range examples {\n\t\tt.Run(line, func(t *testing.T) {\n\t\t\t_, err = expr.Compile(line, opt...)\n\t\t\trequire.NoError(t, err)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "test/crowdsec/funcs.go",
    "content": "package crowdsec\n\nimport (\n\t\"time\"\n)\n\nvar CustomFunctions = []struct {\n\tName string\n\tFunc []any\n}{\n\t{\n\t\tName: \"Distance\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string, string, string) (float64, error)),\n\t\t},\n\t},\n\t{\n\t\tName: \"GetFromStash\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) (string, error)),\n\t\t},\n\t},\n\t{\n\t\tName: \"Atof\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) float64),\n\t\t},\n\t},\n\t{\n\t\tName: \"JsonExtract\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"JsonExtractUnescape\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, ...string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"JsonExtractLib\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, ...string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"JsonExtractSlice\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) []any),\n\t\t},\n\t},\n\t{\n\t\tName: \"JsonExtractObject\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) map[string]any),\n\t\t},\n\t},\n\t{\n\t\tName: \"ToJsonString\",\n\t\tFunc: []any{\n\t\t\tnew(func(any) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"File\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) []string),\n\t\t},\n\t},\n\t{\n\t\tName: \"RegexpInFile\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) bool),\n\t\t},\n\t},\n\t{\n\t\tName: \"Upper\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"Lower\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"IpInRange\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) bool),\n\t\t},\n\t},\n\t{\n\t\tName: \"TimeNow\",\n\t\tFunc: []any{\n\t\t\tnew(func() string),\n\t\t},\n\t},\n\t{\n\t\tName: \"ParseUri\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) map[string][]string),\n\t\t},\n\t},\n\t{\n\t\tName: \"PathUnescape\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"QueryUnescape\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"PathEscape\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"QueryEscape\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"XMLGetAttributeValue\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string, string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"XMLGetNodeValue\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"IpToRange\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"IsIPV6\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) bool),\n\t\t},\n\t},\n\t{\n\t\tName: \"IsIPV4\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) bool),\n\t\t},\n\t},\n\t{\n\t\tName: \"IsIP\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) bool),\n\t\t},\n\t},\n\t{\n\t\tName: \"LookupHost\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) []string),\n\t\t},\n\t},\n\t{\n\t\tName: \"GetDecisionsCount\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) int),\n\t\t},\n\t},\n\t{\n\t\tName: \"GetDecisionsSinceCount\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) int),\n\t\t},\n\t},\n\t{\n\t\tName: \"Sprintf\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, ...any) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"ParseUnix\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"SetInStash\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string, string, *time.Duration) error),\n\t\t},\n\t},\n\t{\n\t\tName: \"Fields\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) []string),\n\t\t},\n\t},\n\t{\n\t\tName: \"Index\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) int),\n\t\t},\n\t},\n\t{\n\t\tName: \"IndexAny\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) int),\n\t\t},\n\t},\n\t{\n\t\tName: \"Join\",\n\t\tFunc: []any{\n\t\t\tnew(func([]string, string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"Split\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) []string),\n\t\t},\n\t},\n\t{\n\t\tName: \"SplitAfter\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) []string),\n\t\t},\n\t},\n\t{\n\t\tName: \"SplitAfterN\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string, int) []string),\n\t\t},\n\t},\n\t{\n\t\tName: \"SplitN\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string, int) []string),\n\t\t},\n\t},\n\t{\n\t\tName: \"Replace\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string, string, int) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"ReplaceAll\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string, string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"Trim\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"TrimLeft\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"TrimRight\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"TrimSpace\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"TrimPrefix\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"TrimSuffix\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"Get\",\n\t\tFunc: []any{\n\t\t\tnew(func([]string, int) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"ToString\",\n\t\tFunc: []any{\n\t\t\tnew(func(any) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"Match\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, string) bool),\n\t\t},\n\t},\n\t{\n\t\tName: \"KeyExists\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, map[string]any) bool),\n\t\t},\n\t},\n\t{\n\t\tName: \"LogInfo\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, ...any) bool),\n\t\t},\n\t},\n\t{\n\t\tName: \"B64Decode\",\n\t\tFunc: []any{\n\t\t\tnew(func(string) string),\n\t\t},\n\t},\n\t{\n\t\tName: \"UnmarshalJSON\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, map[string]any, string) error),\n\t\t},\n\t},\n\t{\n\t\tName: \"ParseKV\",\n\t\tFunc: []any{\n\t\t\tnew(func(string, map[string]any, string) error),\n\t\t},\n\t},\n\t{\n\t\tName: \"Hostname\",\n\t\tFunc: []any{\n\t\t\tnew(func() (string, error)),\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "test/deref/deref_test.go",
    "content": "package deref_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n)\n\nfunc TestDeref_binary(t *testing.T) {\n\ti := 1\n\tenv := map[string]any{\n\t\t\"i\": &i,\n\t\t\"obj\": map[string]any{\n\t\t\t\"i\": &i,\n\t\t},\n\t}\n\tt.Run(\"==\", func(t *testing.T) {\n\t\tprogram, err := expr.Compile(`i == 1 && obj.i == 1`, expr.Env(env))\n\t\trequire.NoError(t, err)\n\n\t\tout, err := expr.Run(program, env)\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, true, out)\n\t})\n\tt.Run(\"><\", func(t *testing.T) {\n\t\tprogram, err := expr.Compile(`i > 0 && obj.i < 99`, expr.Env(env))\n\t\trequire.NoError(t, err)\n\n\t\tout, err := expr.Run(program, env)\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, true, out)\n\t})\n\tt.Run(\"??+\", func(t *testing.T) {\n\t\tprogram, err := expr.Compile(`(i ?? obj.i) + 1`, expr.Env(env))\n\t\trequire.NoError(t, err)\n\n\t\tout, err := expr.Run(program, env)\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, 2, out)\n\t})\n}\n\nfunc TestDeref_unary(t *testing.T) {\n\ti := 1\n\tok := true\n\tenv := map[string]any{\n\t\t\"i\": &i,\n\t\t\"obj\": map[string]any{\n\t\t\t\"ok\": &ok,\n\t\t},\n\t}\n\n\tprogram, err := expr.Compile(`-i < 0 && !!obj.ok`, expr.Env(env))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, true, out)\n}\n\nfunc TestDeref_eval(t *testing.T) {\n\ti := 1\n\tenv := map[string]any{\n\t\t\"i\": &i,\n\t\t\"obj\": map[string]any{\n\t\t\t\"i\": &i,\n\t\t},\n\t}\n\tout, err := expr.Eval(`i == 1 && obj.i == 1`, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, true, out)\n}\n\nfunc TestDeref_emptyCtx(t *testing.T) {\n\tprogram, err := expr.Compile(`ctx`)\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, map[string]any{\n\t\t\"ctx\": context.Background(),\n\t})\n\trequire.NoError(t, err)\n\trequire.Implements(t, new(context.Context), output)\n}\n\nfunc TestDeref_emptyCtx_Eval(t *testing.T) {\n\toutput, err := expr.Eval(`ctx`, map[string]any{\n\t\t\"ctx\": context.Background(),\n\t})\n\trequire.NoError(t, err)\n\trequire.Implements(t, new(context.Context), output)\n}\n\nfunc TestDeref_context_WithValue(t *testing.T) {\n\tprogram, err := expr.Compile(`ctxWithValue`)\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, map[string]any{\n\t\t\"ctxWithValue\": context.WithValue(context.Background(), \"value\", \"test\"),\n\t})\n\trequire.NoError(t, err)\n\trequire.Implements(t, new(context.Context), output)\n}\n\nfunc TestDeref_method_on_int_pointer(t *testing.T) {\n\toutput, err := expr.Eval(`foo.Bar()`, map[string]any{\n\t\t\"foo\": new(foo),\n\t})\n\trequire.NoError(t, err)\n\trequire.Equal(t, 42, output)\n}\n\ntype foo int\n\nfunc (f *foo) Bar() int {\n\treturn 42\n}\n\nfunc TestDeref_multiple_pointers(t *testing.T) {\n\ta := 42\n\tb := &a\n\tc := &b\n\tt.Run(\"returned as is\", func(t *testing.T) {\n\t\toutput, err := expr.Eval(`c`, map[string]any{\n\t\t\t\"c\": c,\n\t\t})\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, c, output)\n\t\trequire.IsType(t, (**int)(nil), output)\n\t})\n\tt.Run(\"+ works\", func(t *testing.T) {\n\t\toutput, err := expr.Eval(`c+2`, map[string]any{\n\t\t\t\"c\": c,\n\t\t})\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, 44, output)\n\t})\n}\n\nfunc TestDeref_pointer_of_interface(t *testing.T) {\n\tv := 42\n\ta := &v\n\tb := any(a)\n\tc := any(&b)\n\tt.Run(\"returned as is\", func(t *testing.T) {\n\t\toutput, err := expr.Eval(`c`, map[string]any{\n\t\t\t\"c\": c,\n\t\t})\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, c, output)\n\t\trequire.IsType(t, (*interface{})(nil), output)\n\t})\n\tt.Run(\"+ works\", func(t *testing.T) {\n\t\toutput, err := expr.Eval(`c+2`, map[string]any{\n\t\t\t\"c\": c,\n\t\t})\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, 44, output)\n\t})\n}\n\nfunc TestDeref_nil(t *testing.T) {\n\tvar b *int = nil\n\tc := &b\n\tt.Run(\"returned as is\", func(t *testing.T) {\n\t\toutput, err := expr.Eval(`c`, map[string]any{\n\t\t\t\"c\": c,\n\t\t})\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, c, output)\n\t\trequire.IsType(t, (**int)(nil), output)\n\t})\n\tt.Run(\"== nil works\", func(t *testing.T) {\n\t\toutput, err := expr.Eval(`c == nil`, map[string]any{\n\t\t\t\"c\": c,\n\t\t})\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, true, output)\n\t})\n}\n\nfunc TestDeref_nil_in_pointer_of_interface(t *testing.T) {\n\tvar a *int32 = nil\n\tb := any(a)\n\tc := any(&b)\n\tt.Run(\"returned as is\", func(t *testing.T) {\n\t\toutput, err := expr.Eval(`c`, map[string]any{\n\t\t\t\"c\": c,\n\t\t})\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, c, output)\n\t\trequire.IsType(t, (*interface{})(nil), output)\n\t})\n\tt.Run(\"== nil works\", func(t *testing.T) {\n\t\toutput, err := expr.Eval(`c == nil`, map[string]any{\n\t\t\t\"c\": c,\n\t\t})\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, true, output)\n\t})\n}\n\nfunc TestDeref_commutative(t *testing.T) {\n\ta := \"ok\"\n\tb := \"ok\"\n\n\ttype Env struct {\n\t\tA string\n\t\tB *string\n\t}\n\n\tenv := Env{\n\t\tA: a,\n\t\tB: &b,\n\t}\n\n\ttests := []struct {\n\t\tcode string\n\t\twant bool\n\t}{\n\t\t{`A == B`, true},\n\t\t{`B == A`, true},\n\t\t{`A != B`, false},\n\t\t{`B != A`, false},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.code, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(test.code, expr.Env(env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tout, err := expr.Run(program, env)\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.Equal(t, test.want, out)\n\t\t})\n\t}\n}\n\nfunc TestDeref_fetch_from_interface_mix_pointer(t *testing.T) {\n\ttype FooBar struct {\n\t\tValue string\n\t}\n\tfoobar := &FooBar{\"waldo\"}\n\tvar foobarAny any = foobar\n\tvar foobarPtrAny any = &foobarAny\n\n\tres, err := expr.Eval(\"foo.Value\", map[string]any{\n\t\t\"foo\": foobarPtrAny,\n\t})\n\tassert.NoError(t, err)\n\tassert.Equal(t, \"waldo\", res)\n}\n\nfunc TestDeref_func_args(t *testing.T) {\n\ti := 20\n\tenv := map[string]any{\n\t\t\"var\": &i,\n\t\t\"fn\": func(p int) int {\n\t\t\treturn p + 1\n\t\t},\n\t}\n\n\tprogram, err := expr.Compile(`fn(var) + fn(var + 0)`, expr.Env(env))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 42, out)\n}\n\nfunc TestDeref_struct_func_args(t *testing.T) {\n\tn, _ := time.Parse(time.RFC3339, \"2024-05-12T18:30:00+00:00\")\n\tduration := 30 * time.Minute\n\tenv := map[string]any{\n\t\t\"time\":     n,\n\t\t\"duration\": &duration,\n\t}\n\n\tprogram, err := expr.Compile(`time.Add(duration).Format('2006-01-02T15:04:05Z07:00')`, expr.Env(env))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, \"2024-05-12T19:00:00Z\", out)\n}\n\nfunc TestDeref_ignore_func_args(t *testing.T) {\n\tf := foo(1)\n\tenv := map[string]any{\n\t\t\"foo\": &f,\n\t\t\"fn\": func(f *foo) int {\n\t\t\treturn f.Bar()\n\t\t},\n\t}\n\n\tprogram, err := expr.Compile(`fn(foo)`, expr.Env(env))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 42, out)\n}\n\nfunc TestDeref_ignore_struct_func_args(t *testing.T) {\n\tn := time.Now()\n\tlocation, _ := time.LoadLocation(\"UTC\")\n\tenv := map[string]any{\n\t\t\"time\":     n,\n\t\t\"location\": location,\n\t}\n\n\tprogram, err := expr.Compile(`time.In(location).Location().String()`, expr.Env(env))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, \"UTC\", out)\n}\n\nfunc TestDeref_keep_pointer_if_arg_in_interface(t *testing.T) {\n\tx := 42\n\tenv := map[string]any{\n\t\t\"x\": &x,\n\t\t\"fn\": func(p any) int {\n\t\t\treturn *p.(*int) + 1\n\t\t},\n\t}\n\n\tprogram, err := expr.Compile(`fn(x)`, expr.Env(env))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 43, out)\n}\n"
  },
  {
    "path": "test/examples/examples_test.go",
    "content": "package main\n\nimport (\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\nvar examples []CodeBlock\n\nfunc init() {\n\tb, err := os.ReadFile(\"../../testdata/examples.md\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\texamples = extractCodeBlocksWithTitle(string(b))\n}\n\nfunc TestExamples(t *testing.T) {\n\tfor _, code := range examples {\n\t\tcode := code\n\t\tt.Run(code.Title, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(code.Content, expr.Env(nil))\n\t\t\trequire.NoError(t, err)\n\n\t\t\t_, err = expr.Run(program, nil)\n\t\t\trequire.NoError(t, err)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "test/examples/markdown.go",
    "content": "package main\n\nimport (\n\t\"strings\"\n)\n\n// CodeBlock holds the optional title and content of a code block.\ntype CodeBlock struct {\n\tTitle   string\n\tContent string\n}\n\nfunc extractCodeBlocksWithTitle(markdown string) []CodeBlock {\n\tvar blocks []CodeBlock\n\tvar currentBlock []string\n\tvar currentTitle string\n\tinBlock := false\n\n\t// Split the markdown into lines.\n\tlines := strings.Split(markdown, \"\\n\")\n\tfor i, line := range lines {\n\t\ttrimmed := strings.TrimSpace(line)\n\t\t// Check if the line starts with a code block fence.\n\t\tif strings.HasPrefix(trimmed, \"```\") {\n\t\t\t// If already inside a code block, this marks its end.\n\t\t\tif inBlock {\n\t\t\t\tblocks = append(blocks, CodeBlock{\n\t\t\t\t\tTitle:   currentTitle,\n\t\t\t\t\tContent: strings.Join(currentBlock, \"\\n\"),\n\t\t\t\t})\n\t\t\t\tcurrentBlock = nil\n\t\t\t\tinBlock = false\n\t\t\t\tcurrentTitle = \"\"\n\t\t\t} else {\n\t\t\t\t// Not in a block: starting a new code block.\n\t\t\t\t// Look backwards for the closest non-empty line that is not a code fence.\n\t\t\t\ttitle := \"\"\n\t\t\t\tfor j := i - 1; j >= 0; j-- {\n\t\t\t\t\tprev := strings.TrimSpace(lines[j])\n\t\t\t\t\tif prev == \"\" || strings.HasPrefix(prev, \"```\") {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\ttitle = prev\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcurrentTitle = title\n\t\t\t\tinBlock = true\n\t\t\t}\n\t\t\t// Skip the fence line.\n\t\t\tcontinue\n\t\t}\n\n\t\t// If inside a code block, add the line.\n\t\tif inBlock {\n\t\t\tcurrentBlock = append(currentBlock, line)\n\t\t}\n\t}\n\treturn blocks\n}\n"
  },
  {
    "path": "test/fuzz/fuzz_corpus.sh",
    "content": "#!/bin/bash\n\ninputfile=./fuzz_corpus.txt\nzipname=fuzz_expr_seed_corpus.zip\n\nif [ ! -f \"$inputfile\" ]; then\n  echo \"Error: File $inputfile not found!\"\n  exit 1\nfi\n\nlineno=1\nwhile IFS= read -r line; do\n  echo \"$line\" >\"file_${lineno}.txt\"\n  ((lineno++))\ndone <\"$inputfile\"\n\nzip \"$zipname\" file_*.txt\n\nrm file_*.txt\n\necho \"Done!\"\n"
  },
  {
    "path": "test/fuzz/fuzz_corpus.txt",
    "content": "!!!false\n!!(1 <= f64)\n!!(1 > 0.5)\n!!(i64 != f64)\n!!all(array, ok)\n!!false\n!!ok\n!!true\n!(\"bar\" != \"bar\")\n!(\"bar\" != \"foo\")\n!(\"bar\" != nil)\n!(\"bar\" < \"foo\")\n!(\"bar\" <= \"foo\")\n!(\"bar\" == \"bar\")\n!(\"bar\" == \"foo\")\n!(\"bar\" == nil)\n!(\"bar\" > \"bar\")\n!(\"bar\" > \"foo\")\n!(\"bar\" >= \"bar\")\n!(\"bar\" >= \"foo\")\n!(\"bar\" contains \"bar\")\n!(\"bar\" contains \"foo\")\n!(\"bar\" endsWith \"bar\")\n!(\"bar\" endsWith \"foo\")\n!(\"bar\" in foo)\n!(\"bar\" matches \"foo\")\n!(\"bar\" not contains \"bar\")\n!(\"bar\" not endsWith \"bar\")\n!(\"bar\" not endsWith \"foo\")\n!(\"bar\" not in foo)\n!(\"bar\" not matches \"bar\")\n!(\"bar\" not startsWith \"bar\")\n!(\"bar\" not startsWith \"foo\")\n!(\"bar\" startsWith \"bar\")\n!(\"foo\" != \"bar\")\n!(\"foo\" != nil)\n!(\"foo\" < \"foo\")\n!(\"foo\" <= \"bar\")\n!(\"foo\" <= \"foo\")\n!(\"foo\" == \"bar\")\n!(\"foo\" == nil)\n!(\"foo\" > \"bar\")\n!(\"foo\" > \"foo\")\n!(\"foo\" >= \"bar\")\n!(\"foo\" contains \"bar\")\n!(\"foo\" contains \"foo\")\n!(\"foo\" endsWith \"foo\")\n!(\"foo\" in foo)\n!(\"foo\" matches \"bar\")\n!(\"foo\" matches \"foo\")\n!(\"foo\" not contains \"bar\")\n!(\"foo\" not contains \"foo\")\n!(\"foo\" not endsWith \"bar\")\n!(\"foo\" not matches \"bar\")\n!(\"foo\" not matches \"foo\")\n!(\"foo\" not startsWith \"bar\")\n!(\"foo\" not startsWith \"foo\")\n!(\"foo\" startsWith \"bar\")\n!(\"foo\" startsWith \"foo\")\n!(-f32 < f32)\n!(-i < i32)\n!(-i32 >= i)\n!(0.5 != 0.5)\n!(0.5 != 1)\n!(0.5 != f32)\n!(0.5 != f64)\n!(0.5 != i)\n!(0.5 != i32)\n!(0.5 != i64)\n!(0.5 != nil)\n!(0.5 < 0.5)\n!(0.5 < 1)\n!(0.5 < f32)\n!(0.5 < f64)\n!(0.5 < i)\n!(0.5 < i32)\n!(0.5 < i64)\n!(0.5 <= 0.5)\n!(0.5 <= 1)\n!(0.5 <= f32)\n!(0.5 <= f64)\n!(0.5 <= i)\n!(0.5 <= i32)\n!(0.5 <= i64)\n!(0.5 == 0.5)\n!(0.5 == 1)\n!(0.5 == f32)\n!(0.5 == f64)\n!(0.5 == i)\n!(0.5 == i32)\n!(0.5 == i64)\n!(0.5 == nil)\n!(0.5 > 0.5)\n!(0.5 > 1)\n!(0.5 > f32)\n!(0.5 > f64)\n!(0.5 > i)\n!(0.5 > i32)\n!(0.5 > i64)\n!(0.5 >= 0.5)\n!(0.5 >= 1)\n!(0.5 >= f32)\n!(0.5 >= f64)\n!(0.5 >= i)\n!(0.5 >= i32)\n!(0.5 >= i64)\n!(0.5 in array)\n!(0.5 not in array)\n!(1 != 0.5)\n!(1 != 1)\n!(1 != f32)\n!(1 != f64)\n!(1 != i)\n!(1 != i32)\n!(1 != i64)\n!(1 != nil)\n!(1 / i64 == i64)\n!(1 < 0.5)\n!(1 < 1)\n!(1 < f32)\n!(1 < f64)\n!(1 < i)\n!(1 < i32)\n!(1 < i64)\n!(1 <= 0.5)\n!(1 <= 1)\n!(1 <= f32)\n!(1 <= f64)\n!(1 <= i)\n!(1 <= i32)\n!(1 <= i64)\n!(1 == 0.5)\n!(1 == 1)\n!(1 == f32)\n!(1 == f64)\n!(1 == i)\n!(1 == i32)\n!(1 == i64)\n!(1 == nil)\n!(1 > 0.5)\n!(1 > 1)\n!(1 > f32)\n!(1 > f64)\n!(1 > i)\n!(1 > i32)\n!(1 > i64)\n!(1 >= 0.5)\n!(1 >= 1)\n!(1 >= f32)\n!(1 >= f64)\n!(1 >= i)\n!(1 >= i32)\n!(1 >= i64)\n!(1 in array)\n!(1 not in array)\n!(add != add)\n!(add != div)\n!(add != nil)\n!(add == add)\n!(add == div)\n!(add == nil)\n!(array != array)\n!(array != list)\n!(array != nil)\n!(array == array)\n!(array == list)\n!(array == nil)\n!(div != add)\n!(div != div)\n!(div != nil)\n!(div == add)\n!(div == div)\n!(f32 != 0.5)\n!(f32 != 1)\n!(f32 != f32)\n!(f32 != f64)\n!(f32 != i)\n!(f32 != i32)\n!(f32 != i64)\n!(f32 != nil)\n!(f32 < 0.5)\n!(f32 < 1)\n!(f32 < f32)\n!(f32 < f64)\n!(f32 < i)\n!(f32 < i32)\n!(f32 < i64)\n!(f32 <= 0.5)\n!(f32 <= 1)\n!(f32 <= f32)\n!(f32 <= f64)\n!(f32 <= i32)\n!(f32 <= i64)\n!(f32 == 0.5)\n!(f32 == 1)\n!(f32 == f32)\n!(f32 == f64)\n!(f32 == i)\n!(f32 == i32)\n!(f32 == i64)\n!(f32 == nil)\n!(f32 > 0.5)\n!(f32 > 1)\n!(f32 > f32)\n!(f32 > f64)\n!(f32 > i)\n!(f32 > i32)\n!(f32 > i64)\n!(f32 >= 0.5)\n!(f32 >= 1)\n!(f32 >= f32)\n!(f32 >= i)\n!(f32 >= i32)\n!(f32 >= i64)\n!(f32 in array)\n!(f32 not in array)\n!(f64 != 0.5)\n!(f64 != 1)\n!(f64 != f32)\n!(f64 != f64)\n!(f64 != i)\n!(f64 != i32)\n!(f64 != i64)\n!(f64 != nil)\n!(f64 < 0.5 + 1)\n!(f64 < 0.5)\n!(f64 < 1)\n!(f64 < f64)\n!(f64 < i)\n!(f64 < i32)\n!(f64 < i64)\n!(f64 < max(1))\n!(f64 <= 0.5)\n!(f64 <= 1)\n!(f64 <= i32)\n!(f64 <= i64)\n!(f64 == 0.5)\n!(f64 == 1)\n!(f64 == f32)\n!(f64 == f64)\n!(f64 == i)\n!(f64 == i32)\n!(f64 == i64)\n!(f64 == nil)\n!(f64 > 0.5)\n!(f64 > 1)\n!(f64 > f32)\n!(f64 > f64)\n!(f64 > i)\n!(f64 > i32)\n!(f64 > i64)\n!(f64 >= 0.5)\n!(f64 >= 1)\n!(f64 >= f32)\n!(f64 >= f64)\n!(f64 >= i)\n!(f64 >= i32)\n!(f64 >= i64)\n!(f64 in array)\n!(f64 not in array)\n!(false != false)\n!(false != nil)\n!(false != ok)\n!(false != true)\n!(false && false)\n!(false && ok)\n!(false && true)\n!(false == false)\n!(false == nil)\n!(false == ok)\n!(false == true)\n!(false and false)\n!(false and ok)\n!(false and true)\n!(false or false)\n!(false or ok)\n!(false || false)\n!(false || ok)\n!(false || true)\n!(foo != foo)\n!(foo != nil)\n!(foo == foo)\n!(foo == nil)\n!(foo == reduce(list, #))\n!(foo in list)\n!(foo not in list)\n!(greet != greet)\n!(greet != nil)\n!(greet == greet)\n!(greet == nil)\n!(half != half)\n!(half != nil)\n!(half == half)\n!(half == nil)\n!(i != 0.5)\n!(i != 1)\n!(i != f32)\n!(i != f64)\n!(i != i)\n!(i != i32)\n!(i != i64)\n!(i != nil)\n!(i < 0.5)\n!(i < 1)\n!(i < f64)\n!(i < i)\n!(i < i32)\n!(i < i64)\n!(i <= 0.5)\n!(i <= 1)\n!(i <= f32)\n!(i <= f64)\n!(i <= i32)\n!(i == 0.5)\n!(i == 1)\n!(i == f32)\n!(i == f64)\n!(i == i)\n!(i == i32)\n!(i == i64)\n!(i == nil)\n!(i > 0.5)\n!(i > 1)\n!(i > f32)\n!(i > f64)\n!(i > i)\n!(i > i32)\n!(i > i64)\n!(i >= 0.5)\n!(i >= 1 * i64)\n!(i >= 1)\n!(i >= f32)\n!(i >= f64)\n!(i >= i)\n!(i >= i32)\n!(i >= i64)\n!(i in array)\n!(i not in array)\n!(i32 != 0.5)\n!(i32 != 1)\n!(i32 != f32)\n!(i32 != f64)\n!(i32 != i)\n!(i32 != i32)\n!(i32 != i64)\n!(i32 != nil)\n!(i32 < 0.5)\n!(i32 < 1)\n!(i32 < f32)\n!(i32 < f64)\n!(i32 < i)\n!(i32 < i32)\n!(i32 < i64)\n!(i32 <= 0.5)\n!(i32 <= 1)\n!(i32 <= f32)\n!(i32 <= f64)\n!(i32 <= i)\n!(i32 <= i32)\n!(i32 <= i64)\n!(i32 == 0.5)\n!(i32 == 1)\n!(i32 == f32)\n!(i32 == f64)\n!(i32 == i)\n!(i32 == i32)\n!(i32 == i64)\n!(i32 == nil)\n!(i32 > 0.5)\n!(i32 > 1)\n!(i32 > f32)\n!(i32 > f64)\n!(i32 > i)\n!(i32 > i32)\n!(i32 >= 0.5)\n!(i32 >= 1)\n!(i32 >= f32)\n!(i32 >= f64)\n!(i32 >= i)\n!(i32 >= i32)\n!(i32 >= i64)\n!(i32 in array)\n!(i32 not in array)\n!(i64 != 0.5)\n!(i64 != 1)\n!(i64 != f32)\n!(i64 != f64)\n!(i64 != i)\n!(i64 != i32)\n!(i64 != i64)\n!(i64 != nil)\n!(i64 < 0.5)\n!(i64 < 1)\n!(i64 < f32)\n!(i64 < f64)\n!(i64 < i)\n!(i64 < i32 + i64)\n!(i64 < i32)\n!(i64 < i64)\n!(i64 <= 0.5)\n!(i64 <= 1)\n!(i64 <= f32)\n!(i64 <= f64)\n!(i64 <= i)\n!(i64 <= i32)\n!(i64 <= i64)\n!(i64 == 0.5)\n!(i64 == 1)\n!(i64 == f32)\n!(i64 == f64)\n!(i64 == i32)\n!(i64 == i64)\n!(i64 == nil)\n!(i64 > 0.5)\n!(i64 > 1)\n!(i64 > f32)\n!(i64 > f64)\n!(i64 > i)\n!(i64 > i32)\n!(i64 > i64)\n!(i64 >= 0.5)\n!(i64 >= 1)\n!(i64 >= f32)\n!(i64 >= f64)\n!(i64 >= i)\n!(i64 >= i32)\n!(i64 >= i64)\n!(i64 in array)\n!(len(\"bar\") <= i)\n!(list != array)\n!(list != list)\n!(list != nil)\n!(list == array)\n!(list == list)\n!(list == nil)\n!(nil != \"bar\")\n!(nil != \"foo\")\n!(nil != 0.5)\n!(nil != 1)\n!(nil != add)\n!(nil != array)\n!(nil != div)\n!(nil != f32)\n!(nil != f64)\n!(nil != false)\n!(nil != foo)\n!(nil != greet)\n!(nil != half)\n!(nil != i)\n!(nil != i32)\n!(nil != i64)\n!(nil != list)\n!(nil != nil)\n!(nil != ok)\n!(nil != score)\n!(nil != true)\n!(nil == \"bar\")\n!(nil == \"foo\")\n!(nil == 0.5)\n!(nil == 1)\n!(nil == add)\n!(nil == array)\n!(nil == div)\n!(nil == f32)\n!(nil == f64)\n!(nil == false)\n!(nil == foo)\n!(nil == greet)\n!(nil == half)\n!(nil == i)\n!(nil == i32)\n!(nil == i64)\n!(nil == list)\n!(nil == nil)\n!(nil == ok)\n!(nil == score)\n!(nil == true)\n!(nil in array)\n!(nil in list)\n!(nil not in array)\n!(nil not in list)\n!(ok != false)\n!(ok != nil)\n!(ok != ok)\n!(ok != true)\n!(ok && false)\n!(ok && ok)\n!(ok && true)\n!(ok == nil)\n!(ok == ok)\n!(ok == true)\n!(ok and ok)\n!(ok and true)\n!(ok or false)\n!(ok or ok)\n!(ok or true)\n!(ok || false)\n!(ok || ok)\n!(ok || true)\n!(score != nil)\n!(score != score)\n!(score == nil)\n!(score == score)\n!(true != false)\n!(true != nil)\n!(true != ok)\n!(true != true)\n!(true && false)\n!(true && ok)\n!(true && true)\n!(true == false)\n!(true == nil)\n!(true == ok)\n!(true == true)\n!(true and ok)\n!(true and true)\n!(true or ok)\n!(true or true)\n!(true || false)\n!(true || ok)\n!(true || true)\n!all(array, false)\n!all(array, ok)\n!all(array, true)\n!all(list, false)\n!all(list, ok)\n!all(list, true)\n!any(array, i == #)\n!any(array, ok)\n!any(array, true)\n!any(list, false)\n!any(list, ok)\n!any(list, true)\n!false != not true\n!false != ok\n!false && 0.5 == 1\n!false == ok\n!false ? \"foo\" : 0.5\n!false ? \"foo\" : f32\n!false ? 0.5 : \"foo\"\n!false ? 0.5 : f32\n!false ? 1 : half\n!false ? 1 : i\n!false ? add : f32\n!false ? add : i64\n!false ? array : add\n!false ? array : ok\n!false ? div : array\n!false ? div : greet\n!false ? div : half\n!false ? f32 : add\n!false ? f32 : false\n!false ? f64 : \"foo\"\n!false ? foo : \"bar\"\n!false ? half : 1\n!false ? half : add\n!false ? half : list\n!false ? half : true\n!false ? i : nil\n!false ? i32 : list\n!false ? i64 : foo\n!false ? i64 : i64\n!false ? nil : add\n!false ? nil : f64\n!false ? nil : foo\n!false ? nil : half\n!false ? ok : 1\n!false ? score : \"bar\"\n!false ? score : foo\n!false ? score : ok\n!false ? true : \"foo\"\n!false or 0.5 > i32\n!false or ok\n!false || ok\n!hasPrefix(\"foo\", \"foo\")\n!none(array, # > #)\n!none(array, # >= #)\n!none(array, false)\n!none(array, ok)\n!none(list, ok)\n!none(list, true)\n!not (\"bar\" == nil)\n!not (1 <= 1)\n!not (1 > 0.5)\n!not (greet == nil)\n!not (i32 == f64)\n!not false\n!not none(list, true)\n!not ok\n!not true\n!ok\n!ok != !true\n!ok != ok\n!ok && ok\n!ok == ok\n!ok ? \"bar\" : \"foo\"\n!ok ? \"bar\" : foo\n!ok ? \"foo\" : 0.5\n!ok ? \"foo\" : list\n!ok ? 0.5 : 1\n!ok ? 0.5 : i\n!ok ? 1 : array\n!ok ? 1 : div\n!ok ? 1 : f64\n!ok ? 1 : list\n!ok ? 1 : ok\n!ok ? add : 0.5\n!ok ? array : div\n!ok ? array : f32\n!ok ? array : foo\n!ok ? array : i\n!ok ? array : i32\n!ok ? div : \"foo\"\n!ok ? div : 1\n!ok ? div : i\n!ok ? f32 : \"bar\"\n!ok ? f32 : add\n!ok ? f32 : false\n!ok ? f32 : greet\n!ok ? f64 : \"bar\"\n!ok ? f64 : \"foo\"\n!ok ? f64 : 0.5\n!ok ? f64 : half\n!ok ? f64 : score\n!ok ? false : ok\n!ok ? foo : \"foo\"\n!ok ? foo : f32\n!ok ? foo : false\n!ok ? foo : i32\n!ok ? greet : div\n!ok ? greet : list\n!ok ? greet : nil\n!ok ? half : f64\n!ok ? i : \"bar\"\n!ok ? i : array\n!ok ? i : div\n!ok ? i : foo\n!ok ? i32 : 0.5\n!ok ? i32 : f32\n!ok ? i32 : greet\n!ok ? i32 : nil\n!ok ? i64 : 0.5\n!ok ? i64 : 1\n!ok ? i64 : f32\n!ok ? i64 : true\n!ok ? list : f32\n!ok ? list : i\n!ok ? nil : 1\n!ok ? nil : array\n!ok ? ok : f32\n!ok ? ok : list\n!ok and ok\n!ok or f32 < i64\n!ok or false or false\n!ok or ok\n!ok || ok\n!one(array, false)\n!one(array, ok)\n!one(array, true)\n!one(list, false)\n!one(list, ok)\n!one(list, true)\n!reduce(array, false)\n!reduce(array, ok)\n!reduce(array, true)\n!reduce(list, # != #)\n!reduce(list, false)\n!reduce(list, ok)\n!reduce(list, true)\n!true != all(array, ok)\n!true ? \"bar\" : \"foo\"\n!true ? \"bar\" : true\n!true ? \"foo\" : \"foo\"\n!true ? \"foo\" : 0.5\n!true ? \"foo\" : i\n!true ? 1 : \"foo\"\n!true ? 1 : i64\n!true ? add : 0.5\n!true ? add : score\n!true ? array : f64\n!true ? array : list\n!true ? div : add\n!true ? f32 : false\n!true ? f64 : f64\n!true ? foo : 1\n!true ? foo : array\n!true ? greet : ok\n!true ? greet : score\n!true ? greet : true\n!true ? half : f64\n!true ? i : 1\n!true ? i : add\n!true ? i : ok\n!true ? i32 : 1\n!true ? i64 : false\n!true ? i64 : i64\n!true ? i64 : list\n!true ? list : 0.5\n!true ? list : nil\n!true ? list : score\n!true ? nil : 0.5\n!true ? nil : false\n!true ? nil : ok\n!true ? ok : add\n!true ? ok : div\n!true ? score : false\n!true ? true : f32\n!true ? true : half\n!true and foo != nil\n!true || ok\n\"bar\" != \"bar\" || ok\n\"bar\" != foo.Bar\n\"bar\" != foo?.Bar\n\"bar\" + \"bar\" not in foo\n\"bar\" + foo.Bar\n\"bar\" + foo?.Bar\n\"bar\" < foo.Bar\n\"bar\" < foo?.Bar\n\"bar\" < foo?.String()\n\"bar\" <= foo.Bar\n\"bar\" <= foo.String()\n\"bar\" <= foo?.Bar\n\"bar\" == foo.Bar\n\"bar\" == foo?.Bar\n\"bar\" == foo?.String()\n\"bar\" > \"bar\" or ok ? f32 : i64\n\"bar\" > foo.Bar\n\"bar\" > foo?.String()\n\"bar\" >= foo.Bar\n\"bar\" >= foo.String()\n\"bar\" >= foo?.Bar\n\"bar\" contains foo.Bar\n\"bar\" contains foo.String()\n\"bar\" contains foo?.Bar\n\"bar\" endsWith foo.Bar\n\"bar\" endsWith foo?.Bar\n\"bar\" endsWith foo?.String()\n\"bar\" matches \"bar\" and ok\n\"bar\" matches foo.Bar\n\"bar\" matches foo.String()\n\"bar\" matches foo?.Bar\n\"bar\" matches foo?.String()\n\"bar\" not contains foo.Bar\n\"bar\" not contains foo?.Bar\n\"bar\" not endsWith foo.Bar\n\"bar\" not endsWith foo?.Bar\n\"bar\" not endsWith foo?.String()\n\"bar\" not matches foo.Bar\n\"bar\" not matches foo.String()\n\"bar\" not matches foo?.Bar\n\"bar\" not matches foo?.String()\n\"bar\" not startsWith foo.Bar\n\"bar\" not startsWith foo?.Bar\n\"bar\" not startsWith foo?.String()\n\"bar\" startsWith \"foo\" or list == array\n\"bar\" startsWith foo.Bar\n\"bar\" startsWith foo.String()\n\"foo\" != \"foo\" ? f64 : array\n\"foo\" != \"foo\" or ok\n\"foo\" != foo.Bar\n\"foo\" != foo.String()\n\"foo\" != foo?.Bar\n\"foo\" != foo?.String()\n\"foo\" + \"bar\" not in foo\n\"foo\" + foo.Bar\n\"foo\" + foo?.Bar\n\"foo\" + foo?.String()\n\"foo\" < \"bar\" and ok\n\"foo\" < foo.Bar\n\"foo\" < foo?.Bar\n\"foo\" < foo?.String()\n\"foo\" <= foo.Bar\n\"foo\" <= foo?.Bar\n\"foo\" == \"bar\" != ok\n\"foo\" == \"bar\" and ok\n\"foo\" == foo.Bar\n\"foo\" == foo?.Bar\n\"foo\" == foo?.String()\n\"foo\" > foo.Bar\n\"foo\" > foo.String()\n\"foo\" > foo?.Bar\n\"foo\" >= foo.Bar\n\"foo\" >= foo.String()\n\"foo\" >= foo?.Bar\n\"foo\" >= foo?.String()\n\"foo\" contains \"bar\" == ok\n\"foo\" contains foo?.Bar\n\"foo\" endsWith foo.Bar\n\"foo\" endsWith foo?.Bar\n\"foo\" matches \"bar\" ? add : div\n\"foo\" matches \"foo\" || true ? greet : \"bar\"\n\"foo\" matches foo.Bar\n\"foo\" matches foo.String()\n\"foo\" matches foo?.Bar\n\"foo\" not contains foo.Bar\n\"foo\" not contains foo?.Bar\n\"foo\" not contains foo?.String()\n\"foo\" not endsWith foo.Bar\n\"foo\" not endsWith foo?.Bar\n\"foo\" not matches foo.Bar\n\"foo\" not matches foo?.Bar\n\"foo\" not matches foo?.String()\n\"foo\" not startsWith foo.Bar\n\"foo\" not startsWith foo?.Bar\n\"foo\" not startsWith foo?.String()\n\"foo\" startsWith foo.Bar\n\"foo\" startsWith foo?.Bar\n(\"bar\" not endsWith \"bar\") != ok\n(\"bar\" not endsWith \"foo\") != ok\n(\"bar\" not endsWith \"foo\") && false != nil\n(\"bar\" not matches \"foo\") || reduce(list, ok)\n(\"foo\" not matches \"bar\") == ok\n(0.5 * 0.5) ** i\n(0.5 * 0.5) ^ f32\n(0.5 * 1) ** f64\n(0.5 * 1) ** i\n(0.5 * 1) ^ i32\n(0.5 * f64) ^ f32\n(0.5 * i) ^ i\n(0.5 + 0.5) * f32\n(0.5 + 0.5) ^ i32\n(0.5 + 1) ^ i\n(0.5 + f64) * f64\n(0.5 + f64) / i32\n(0.5 + i) ** i\n(0.5 + i) ^ i\n(0.5 + i64) ** f32\n(0.5 + i64) / f32\n(0.5 + i64) / i\n(0.5 - 0.5) * (i32 - 0.5)\n(0.5 - 0.5) * i64\n(0.5 - 0.5) ** f32\n(0.5 - 1) * i32\n(0.5 - 1) ** f64\n(0.5 - 1) ^ i64\n(0.5 - f32) ** i\n(0.5 - f64) * i\n(0.5 - f64) / f32\n(0.5 - f64) / f64\n(0.5 - i) ^ f32\n(0.5 - i32) ** (i32 * 1)\n(0.5 - i32) / f64\n(0.5 - i32) ^ f32\n(0.5 - i64) * i\n(0.5 - i64) / f64\n(0.5 - i64) / i64\n(0.5 / 0.5) ** f32\n(0.5 / 0.5) ** i32\n(0.5 / 0.5) ^ f64\n(0.5 / 1) ^ f32\n(0.5 / i) ** f64\n(0.5 / i) ** i\n(0.5 / i32) ** i\n(0.5 / i32) ^ f32\n(1 * 0.5) ** (f64 * 1)\n(1 * 0.5) ** i32\n(1 * 0.5) ^ f64\n(1 * 1) ^ -1\n(1 * 1) ^ f32\n(1 * f32) ^ i32\n(1 * i) ** i32\n(1 * i32) ^ i\n(1 * i64) ** i64\n(1 + 0.5) ** i\n(1 + 1) * i64\n(1 + 1) / i\n(1 + f32) ^ i\n(1 + f64) ^ i\n(1 + f64) ^ i32\n(1 + i) ** f32\n(1 + i) / f64\n(1 + i) ^ i64\n(1 + i32) * f64\n(1 + i32) ^ f64\n(1 - 0.5) * f32 ^ 1\n(1 - 0.5) * i64\n(1 - 0.5) / i\n(1 - 0.5) ^ min(f32)\n(1 - f32) * f32\n(1 - f64) ** f64\n(1 - i) * -i32\n(1 - i32) ^ f32\n(1 - i32) ^ i\n(1 - i64) ** f32\n(1 - i64) / f64\n(1 - i64) / i64\n(1 / 0.5) ** f32\n(1 / 0.5) ^ i32\n(1 / 1) ** (f64 * 0.5)\n(1 / 1) ^ ceil(i64)\n(1 / 1) ^ max(0.5)\n(1 / f32) ^ f32\n(1 / i) ^ f32\n(1 / i32) ^ i\n(1 / i64) ** i64\n(f32 * 0.5) ** f64\n(f32 * 0.5) ^ i32\n(f32 * f32) ^ -f32\n(f32 * f32) ^ i\n(f32 * i) ^ -1\n(f32 * i64) ** i\n(f32 + f64) * i\n(f32 + i) ^ f64\n(f32 - 0.5) / f64\n(f32 - 0.5) ^ f32\n(f32 - 1) / f64\n(f32 - 1) ^ f64\n(f32 - f32) / i64\n(f32 - i32) * i64\n(f32 / 0.5) ^ f32\n(f32 / i64) ^ f64\n(f64 * 0.5) ** f32\n(f64 * 0.5) ** i64\n(f64 * f32) ** f64\n(f64 * i64) ** f64\n(f64 * i64) ** i32\n(f64 + 0.5) * f32\n(f64 + 0.5) * i64\n(f64 + f32) ** get(array, i)\n(f64 + f32) ** i32\n(f64 + f64) * (i64 - i64)\n(f64 + f64) ^ f64\n(f64 + i) * (0.5 + i64)\n(f64 + i32) ^ i64\n(f64 + i64) ^ i\n(f64 - 0.5) ** f64\n(f64 - 1) ** i64\n(f64 - 1) ^ i32\n(f64 - f32) ** i\n(f64 - f32) ^ i64\n(f64 - i) * i32\n(f64 - i32) / i\n(f64 - i64) ** i\n(f64 - i64) / f32\n(f64 - i64) / f64\n(f64 / 1) ** i64\n(f64 / f32) ^ i\n(f64 / f64) ** i32\n(f64 / f64) ^ i32 ** 0.5\n(false || ok) == ok\n(i % i) ^ i\n(i % i32) ^ (1 - i32)\n(i % i64) ^ f64\n(i * 0.5) ** f32\n(i * 1) ^ f64\n(i * 1) ^ i\n(i * i64) ** f32\n(i + 0.5) ** half(f64)\n(i + 1) % i64\n(i + 1) / i64\n(i + i) ^ i64\n(i + i32) * i64 ^ f64\n(i + i32) / i32\n(i + i32) ^ f32\n(i + i64) ^ i32\n(i - 0.5) / i64\n(i - 1) ^ i64\n(i / 0.5) ** f32\n(i / f32) ^ f64\n(i32 % 1) ** f32\n(i32 % i) ** f32\n(i32 % i32) ** i32\n(i32 % i32) ^ i32\n(i32 * 0.5) ^ f32\n(i32 * 1) ^ i32\n(i32 + 0.5) ** i64\n(i32 + f32) * i64\n(i32 + f64) / i\n(i32 + i) / i\n(i32 + i32) ^ i32\n(i32 - 0.5) * f64\n(i32 - 0.5) / i64\n(i32 - 1) ^ f64\n(i32 - f32) / i64\n(i32 - i) % i64\n(i32 - i) / f32\n(i32 - i32) ^ (i32 * i)\n(i32 - i64) * i32\n(i32 - i64) * i32 * i64\n(i32 / i) ** f32\n(i32 / i) ^ i64\n(i32 < f64 ? nil : i) .. i32\n(i32 not in array) and ok\n(i64 % i) ** f32\n(i64 * 0.5) ^ f64\n(i64 * f32) ^ i64\n(i64 * f64) ^ i32\n(i64 * i) ** score(1)\n(i64 * i64) ** i ** 0.5\n(i64 * i64) ^ i\n(i64 + 0.5) * f32\n(i64 + 0.5) ** i64\n(i64 + 1) % i\n(i64 + 1) ^ i\n(i64 + f32) * -i32\n(i64 + f32) ** i32\n(i64 + f32) / f64\n(i64 + f32) / i\n(i64 + f32) / i32\n(i64 + f64) * i32\n(i64 + i) % i64\n(i64 + i) / f64\n(i64 + i32) * i64\n(i64 + i64) / i64\n(i64 - 0.5) / f64\n(i64 - 0.5) ^ i64\n(i64 - 1) ^ i32\n(i64 - f32) ** f64\n(i64 - f32) ^ i64\n(i64 - i) ** i\n(i64 - i32) * i64\n(i64 / 1) ** f32\n(i64 / f64) ** i32\n(nil not in array) || ok\n(ok || true) && (ok or true)\n-((i64 + 1) % i32)\n-(0.5 * 0.5)\n-(0.5 * 1)\n-(0.5 * f32)\n-(0.5 * f64)\n-(0.5 * i)\n-(0.5 * i32)\n-(0.5 * i64)\n-(0.5 ** 0.5)\n-(0.5 ** 1)\n-(0.5 ** f32)\n-(0.5 ** f64)\n-(0.5 ** i)\n-(0.5 ** i32)\n-(0.5 ** i64)\n-(0.5 + 0.5)\n-(0.5 + 1)\n-(0.5 + f32)\n-(0.5 + f64)\n-(0.5 + i)\n-(0.5 + i32)\n-(0.5 + i64)\n-(0.5 - 0.5)\n-(0.5 - 1)\n-(0.5 - f32)\n-(0.5 - f64)\n-(0.5 - i)\n-(0.5 - i32)\n-(0.5 - i64)\n-(0.5 / 0.5)\n-(0.5 / 1)\n-(0.5 / f32)\n-(0.5 / f64)\n-(0.5 / i)\n-(0.5 / i32)\n-(0.5 / i64)\n-(0.5 ^ 0.5)\n-(0.5 ^ 1)\n-(0.5 ^ f32)\n-(0.5 ^ f64)\n-(0.5 ^ i)\n-(0.5 ^ i32)\n-(0.5 ^ i64)\n-(1 % 1)\n-(1 % i)\n-(1 % i32)\n-(1 % i64)\n-(1 * 0.5)\n-(1 * 1)\n-(1 * f32)\n-(1 * f64)\n-(1 * i)\n-(1 * i32)\n-(1 * i64)\n-(1 ** 0.5)\n-(1 ** 1)\n-(1 ** f32)\n-(1 ** f64)\n-(1 ** i)\n-(1 ** i32)\n-(1 ** i64)\n-(1 + 0.5)\n-(1 + 1)\n-(1 + f32)\n-(1 + f64)\n-(1 + i)\n-(1 + i32)\n-(1 + i64)\n-(1 - 0.5)\n-(1 - 1)\n-(1 - f32)\n-(1 - f64)\n-(1 - i)\n-(1 - i32)\n-(1 - i64)\n-(1 / 0.5)\n-(1 / 1)\n-(1 / f32)\n-(1 / f64)\n-(1 / i)\n-(1 / i32)\n-(1 / i64)\n-(1 ^ 0.5)\n-(1 ^ 1)\n-(1 ^ f32)\n-(1 ^ f64)\n-(1 ^ i)\n-(1 ^ i32)\n-(1 ^ i64)\n-(f32 * 0.5)\n-(f32 * 1)\n-(f32 * f32)\n-(f32 * f64)\n-(f32 * i)\n-(f32 * i32)\n-(f32 * i64)\n-(f32 ** 0.5)\n-(f32 ** 1)\n-(f32 ** f32)\n-(f32 ** f64)\n-(f32 ** i)\n-(f32 ** i32)\n-(f32 ** i64)\n-(f32 + 0.5)\n-(f32 + 1)\n-(f32 + f32)\n-(f32 + f64)\n-(f32 + i)\n-(f32 + i64)\n-(f32 - 0.5)\n-(f32 - 1)\n-(f32 - f32)\n-(f32 - i)\n-(f32 - i32)\n-(f32 - i64)\n-(f32 / 0.5)\n-(f32 / 1)\n-(f32 / f32)\n-(f32 / f64)\n-(f32 / i)\n-(f32 / i32)\n-(f32 / i64)\n-(f32 ^ 0.5)\n-(f32 ^ 1)\n-(f32 ^ f32)\n-(f32 ^ f64)\n-(f32 ^ i)\n-(f32 ^ i32)\n-(f32 ^ i64)\n-(f64 * 0.5)\n-(f64 * 1)\n-(f64 * f32)\n-(f64 * f64)\n-(f64 * i)\n-(f64 * i32)\n-(f64 * i64)\n-(f64 ** 0.5)\n-(f64 ** 1)\n-(f64 ** f32)\n-(f64 ** f64)\n-(f64 ** i)\n-(f64 ** i32)\n-(f64 ** i64)\n-(f64 + 0.5)\n-(f64 + 1)\n-(f64 + f32)\n-(f64 + i)\n-(f64 + i32)\n-(f64 + i64)\n-(f64 - 0.5)\n-(f64 - 1)\n-(f64 - f32)\n-(f64 - f64)\n-(f64 - i)\n-(f64 - i64)\n-(f64 / 0.5)\n-(f64 / 1)\n-(f64 / f32)\n-(f64 / f64)\n-(f64 / i)\n-(f64 / i64)\n-(f64 ^ 0.5)\n-(f64 ^ 1)\n-(f64 ^ f32)\n-(f64 ^ f64)\n-(f64 ^ i)\n-(f64 ^ i32)\n-(f64 ^ i64)\n-(i % 1)\n-(i % i)\n-(i % i32)\n-(i % i64)\n-(i * 0.5)\n-(i * 1)\n-(i * f32)\n-(i * f64)\n-(i * i)\n-(i * i32)\n-(i * i64)\n-(i ** 0.5)\n-(i ** 1)\n-(i ** f64)\n-(i ** i)\n-(i ** i32)\n-(i ** i64)\n-(i + 0.5)\n-(i + 1)\n-(i + i32)\n-(i + i64)\n-(i - 0.5)\n-(i - 1)\n-(i - f32)\n-(i - f64)\n-(i - i ** 1)\n-(i - i)\n-(i - i32)\n-(i - i64)\n-(i / 0.5)\n-(i / 1)\n-(i / f32)\n-(i / f64)\n-(i / i)\n-(i / i32)\n-(i / i64)\n-(i ^ 0.5)\n-(i ^ 1)\n-(i ^ f32)\n-(i ^ f64)\n-(i ^ i)\n-(i ^ i32)\n-(i ^ i64)\n-(i32 % 1)\n-(i32 % i)\n-(i32 % i32)\n-(i32 % i64)\n-(i32 * 0.5)\n-(i32 * 1)\n-(i32 * f32)\n-(i32 * f64)\n-(i32 * i)\n-(i32 * i32)\n-(i32 * i64)\n-(i32 ** 0.5)\n-(i32 ** 1)\n-(i32 ** f32)\n-(i32 ** f64)\n-(i32 ** i)\n-(i32 ** i32)\n-(i32 ** i64)\n-(i32 + 0.5)\n-(i32 + 1)\n-(i32 + f32)\n-(i32 + f64)\n-(i32 + i)\n-(i32 + i32)\n-(i32 + i64)\n-(i32 - 0.5)\n-(i32 - 1)\n-(i32 - f32)\n-(i32 - f64)\n-(i32 - i)\n-(i32 - i32)\n-(i32 - i64)\n-(i32 / 0.5)\n-(i32 / 1)\n-(i32 / f64)\n-(i32 / i)\n-(i32 / i32)\n-(i32 / i64)\n-(i32 ^ 0.5)\n-(i32 ^ 1)\n-(i32 ^ f32)\n-(i32 ^ f64)\n-(i32 ^ i)\n-(i32 ^ i32)\n-(i32 ^ i64)\n-(i64 % 1)\n-(i64 % i)\n-(i64 % i32)\n-(i64 % i64)\n-(i64 * 0.5)\n-(i64 * 1)\n-(i64 * f32)\n-(i64 * f64)\n-(i64 * i)\n-(i64 * i32)\n-(i64 * i64)\n-(i64 ** 0.5)\n-(i64 ** 1)\n-(i64 ** f32)\n-(i64 ** f64)\n-(i64 ** i)\n-(i64 ** i32)\n-(i64 ** i64)\n-(i64 + 0.5)\n-(i64 + 1)\n-(i64 + f32)\n-(i64 + f64)\n-(i64 + i32)\n-(i64 + i64)\n-(i64 - 0.5)\n-(i64 - 1)\n-(i64 - f32)\n-(i64 - f64)\n-(i64 - i)\n-(i64 - i32)\n-(i64 - i64)\n-(i64 / 0.5)\n-(i64 / 1)\n-(i64 / f32)\n-(i64 / f64)\n-(i64 / i)\n-(i64 / i32)\n-(i64 / i64)\n-(i64 ^ 0.5)\n-(i64 ^ 1)\n-(i64 ^ f32)\n-(i64 ^ f64)\n-(i64 ^ i)\n-(i64 ^ i32)\n-(i64 ^ i64)\n-(max(f32) ^ i32)\n-(min(0.5) ^ i32)\n--(f64 ** 0.5)\n--(i64 ** i64)\n--0.5\n--1\n--ceil(1)\n--f32\n--f64\n--f64 ** i64\n--float(f64)\n--i\n--i32\n--i64\n-0.5 != f32\n-0.5 != i32\n-0.5 * 1 ** 1\n-0.5 * f32\n-0.5 * f64\n-0.5 * i32\n-0.5 * i64\n-0.5 ** -1\n-0.5 ** ceil(i)\n-0.5 ** f32\n-0.5 ** f64\n-0.5 ** i\n-0.5 ** i32\n-0.5 ** i64\n-0.5 + f64\n-0.5 + i\n-0.5 + i32\n-0.5 + i64\n-0.5 - abs(i)\n-0.5 - f32\n-0.5 - f64\n-0.5 - i\n-0.5 - i32\n-0.5 - i64\n-0.5 / f32\n-0.5 / i\n-0.5 / i32\n-0.5 < i32\n-0.5 < i64\n-0.5 <= 0.5 + 0.5\n-0.5 <= f32\n-0.5 <= i\n-0.5 <= i32\n-0.5 <= i64\n-0.5 == f32\n-0.5 == f64\n-0.5 == i\n-0.5 == i32\n-0.5 == i32 ^ i32\n-0.5 == i64\n-0.5 > f32\n-0.5 > i\n-0.5 >= f32\n-0.5 >= f32 ? f32 : i32\n-0.5 >= f64\n-0.5 >= i\n-0.5 >= i32\n-0.5 >= i64\n-0.5 ^ f32\n-0.5 ^ f64\n-0.5 ^ float(f64)\n-0.5 ^ i32\n-0.5 ^ i64\n-0.5 in array\n-0.5 not in sort(array)\n-1 != -i\n-1 != f32\n-1 != f64\n-1 != i32\n-1 != i64\n-1 % i\n-1 % i32\n-1 * array[i]\n-1 * f32\n-1 * f64\n-1 * i\n-1 * i32\n-1 * i64\n-1 ** (f32 + f32)\n-1 ** (i + i64)\n-1 ** ceil(0.5)\n-1 ** f32\n-1 ** f64\n-1 ** i\n-1 ** i64 ^ 1\n-1 + -i32\n-1 + f32\n-1 + f64\n-1 + i\n-1 + i32\n-1 + i64\n-1 + reduce(array, #)\n-1 + reduce(list, f32)\n-1 - f64\n-1 - i\n-1 - i % i32\n-1 - i32\n-1 - i64\n-1 .. i\n-1 .. i64\n-1 / f32\n-1 / f64\n-1 / i\n-1 / i32\n-1 < f64\n-1 < i\n-1 < i64\n-1 <= -1\n-1 <= f64\n-1 <= i\n-1 <= i32\n-1 <= i64\n-1 == f32\n-1 == f64\n-1 == floor(f64)\n-1 == i\n-1 == i32\n-1 == i64\n-1 > f32\n-1 > i\n-1 > i64\n-1 >= f32 * f32\n-1 >= f64\n-1 >= i32\n-1 >= i64\n-1 ^ f32\n-1 ^ f64\n-1 ^ i32\n-1 ^ i64\n-1 in array\n-1 not in array\n-abs(0.5)\n-abs(1)\n-abs(f32)\n-abs(f64)\n-abs(i)\n-abs(i32)\n-abs(i64)\n-add(i, 1)\n-add(i, i)\n-array[1]\n-array[i32]\n-array[i64]\n-array[i]\n-bitand(i64, i32)\n-bitnand(1, i)\n-bitnot(1)\n-bitnot(i)\n-bitnot(i32)\n-bitnot(i64)\n-bitor(1, i64)\n-bitor(i, i32)\n-bitshl(i, 1)\n-bitshl(i, i32)\n-bitshl(i, i64)\n-bitshl(i64, i32)\n-bitshr(i, i)\n-bitshr(i64, i32)\n-bitushr(i, i32)\n-bitxor(1, 1)\n-bitxor(i, i32)\n-ceil(0.5)\n-ceil(1)\n-ceil(f32)\n-ceil(f64)\n-ceil(i)\n-ceil(i32)\n-ceil(i64)\n-count(array, false)\n-count(array, ok)\n-count(array, true)\n-count(list, ok)\n-count(list, true)\n-div(1, 1)\n-f32\n-f32 != i32\n-f32 * i64\n-f32 ** (i + 1)\n-f32 ** f32\n-f32 ** f64\n-f32 ** i\n-f32 ** i32\n-f32 ** i64\n-f32 + i32\n-f32 - i\n-f32 - round(i)\n-f32 / f32\n-f32 / f64\n-f32 / i\n-f32 < f32 ** 0.5\n-f32 < f64\n-f32 < i\n-f32 < i32\n-f32 <= f32\n-f32 <= i\n-f32 <= i32\n-f32 <= i64\n-f32 == f32\n-f32 == f64\n-f32 > 0.5 ? f32 : \"bar\"\n-f32 > f32\n-f32 > f64\n-f32 >= f32\n-f32 >= f64\n-f32 >= i64\n-f32 ^ i\n-f32 ^ i32\n-f32 ^ i64\n-f32 in array\n-f32 not in array\n-f64\n-f64 != f32\n-f64 != f64\n-f64 != i\n-f64 != i32\n-f64 * -1\n-f64 * -f64\n-f64 * f32\n-f64 * f64\n-f64 * i\n-f64 * i32\n-f64 * i64\n-f64 ** 0.5 ** f32\n-f64 ** f32\n-f64 ** i\n-f64 ** i32\n-f64 + f32\n-f64 + i64\n-f64 - 0.5 / i64\n-f64 - f32\n-f64 - i\n-f64 - i32\n-f64 - i64\n-f64 - int(f64)\n-f64 / f32\n-f64 / f64\n-f64 / i\n-f64 / i32\n-f64 / i64\n-f64 < 0.5 ^ f32\n-f64 < f64\n-f64 < f64 ** 1\n-f64 < half(0.5)\n-f64 < half(f64)\n-f64 < i\n-f64 < i ^ f32\n-f64 < i32\n-f64 < i64\n-f64 <= f32\n-f64 <= f64\n-f64 == f64\n-f64 == i\n-f64 == i32\n-f64 == i64\n-f64 > f32\n-f64 > f32 ? false : array\n-f64 > f64\n-f64 > i32\n-f64 > i64\n-f64 >= f32\n-f64 >= f32 / f64\n-f64 >= f64\n-f64 >= i32\n-f64 ^ f32\n-f64 ^ f64\n-f64 ^ i64\n-f64 not in array\n-find(array, ok)\n-find(array, true)\n-findIndex(array, # <= #)\n-findIndex(array, ok)\n-findIndex(array, true)\n-findIndex(list, ok)\n-findIndex(list, true)\n-findLast(array, # <= #)\n-findLast(array, ok)\n-findLast(array, true)\n-findLastIndex(array, ok)\n-findLastIndex(array, true)\n-findLastIndex(list, ok)\n-findLastIndex(list, true)\n-first(array)\n-float(0.5 ** 0.5)\n-float(0.5 ^ 0.5)\n-float(0.5)\n-float(1)\n-float(bitnot(i64))\n-float(f32)\n-float(f64)\n-float(i)\n-float(i32)\n-float(i64)\n-floor(0.5)\n-floor(1)\n-floor(f32)\n-floor(f64)\n-floor(i)\n-floor(i32)\n-floor(i64)\n-get(array, 1)\n-get(array, i)\n-get(array, i32)\n-get(array, i64)\n-half(-0.5)\n-half(-1)\n-half(0.5)\n-half(1)\n-half(f32 + i64)\n-half(f64)\n-half(median(array))\n-i\n-i != f32\n-i != f64\n-i != f64 ? foo : 1\n-i != i\n-i != i + f64\n-i != i32\n-i != i64\n-i % i32\n-i % i64\n-i * abs(0.5)\n-i * f64\n-i * i\n-i * i64\n-i * reduce(array, 0.5)\n-i ** f32\n-i ** f64\n-i ** i\n-i + f32\n-i + f64\n-i + i32\n-i + i64 * 1\n-i - f32\n-i - i64\n-i .. i\n-i .. i64\n-i / f32\n-i / i64\n-i < f32\n-i < half(1)\n-i < i\n-i < i64\n-i <= 0.5 ? half : \"bar\"\n-i <= 1 - 0.5\n-i <= f32\n-i <= i\n-i <= i32\n-i <= i64\n-i <= i64 ** 0.5\n-i == f32\n-i == f64\n-i == f64 ^ f32\n-i == i\n-i == i32\n-i > f32\n-i > i\n-i > i32\n-i >= f32\n-i >= f64\n-i >= i\n-i >= i64\n-i >= score(1)\n-i ^ 0.5 ** 0.5\n-i ^ f32\n-i ^ f32 ^ 0.5\n-i ^ f64\n-i ^ i\n-i ^ i64\n-i in array\n-i not in array\n-i32\n-i32 != f32\n-i32 != i\n-i32 != i32 ** 1\n-i32 != i64\n-i32 % i\n-i32 % i32\n-i32 % i64\n-i32 * i\n-i32 * i32\n-i32 * i64\n-i32 ** f32\n-i32 ** f64\n-i32 ** i64\n-i32 + f32\n-i32 + i\n-i32 + i32\n-i32 - f32\n-i32 .. i32\n-i32 / i32\n-i32 / i64\n-i32 < i\n-i32 < i32\n-i32 < i64\n-i32 < round(f64)\n-i32 <= f64\n-i32 <= i\n-i32 <= i32\n-i32 <= i64\n-i32 == 1 % i\n-i32 == f32\n-i32 == f64\n-i32 == i64\n-i32 == max(1)\n-i32 > f32\n-i32 > f64\n-i32 > i\n-i32 > i ** 0.5\n-i32 > i32\n-i32 > i64\n-i32 >= f64\n-i32 >= i\n-i32 >= i == nil\n-i32 >= i32\n-i32 ^ f32\n-i32 ^ i32\n-i32 ^ i64\n-i32 ^ score(1)\n-i32 in array\n-i64\n-i64 != f32\n-i64 != f64\n-i64 != i32\n-i64 != i64\n-i64 != i64 ? score : foo\n-i64 * (1 + f64)\n-i64 * f32\n-i64 * i\n-i64 * i32\n-i64 * i64\n-i64 * indexOf(\"foo\", \"bar\")\n-i64 ** i\n-i64 ** i32\n-i64 + f32\n-i64 + i\n-i64 + i32\n-i64 + i64\n-i64 - f32\n-i64 - i\n-i64 - i32\n-i64 .. i\n-i64 .. i32\n-i64 .. i64\n-i64 / f64\n-i64 / i32\n-i64 < f32\n-i64 < f64\n-i64 < half(f64)\n-i64 < i32\n-i64 < i64\n-i64 <= i\n-i64 <= i32\n-i64 == 1 ^ i64\n-i64 == f32\n-i64 == f64\n-i64 == i\n-i64 == i32\n-i64 > f32\n-i64 > f64\n-i64 > i\n-i64 > i32\n-i64 >= f32\n-i64 >= i\n-i64 >= i32\n-i64 ^ f64\n-i64 ^ float(i)\n-i64 ^ i\n-i64 ^ i32\n-i64 ^ i64\n-i64 in array\n-i64 not in array\n-int(0.5)\n-int(1)\n-int(f32)\n-int(f64)\n-int(i)\n-int(i32)\n-int(i64)\n-last(array)\n-len(\"bar\")\n-len(\"foo\")\n-len(array)\n-len(list)\n-max(0.5)\n-max(0.5, 0.5, f64)\n-max(1)\n-max(f32)\n-max(f64)\n-max(i)\n-max(i, 0.5)\n-max(i32 - 1)\n-max(i32)\n-max(i32, f32)\n-max(i64 * 0.5)\n-max(i64)\n-max(i64, f64)\n-max(i64, i)\n-mean(array)\n-median(array)\n-min(-1)\n-min(0.5)\n-min(1)\n-min(1, 0.5)\n-min(f32)\n-min(f32, 1)\n-min(f64)\n-min(float(0.5))\n-min(i)\n-min(i, 1)\n-min(i32)\n-min(i32, 0.5)\n-min(i64)\n-min(i64, i, 0.5)\n-reduce(array, #)\n-reduce(array, -#)\n-reduce(array, 0.5)\n-reduce(array, 1)\n-reduce(array, 1) - f32\n-reduce(array, f64)\n-reduce(array, i)\n-reduce(array, i32)\n-reduce(array, i64)\n-reduce(list, 0.5)\n-reduce(list, 1)\n-reduce(list, f32)\n-reduce(list, f64)\n-reduce(list, i)\n-reduce(list, i32)\n-round(0.5)\n-round(1)\n-round(f32)\n-round(f64)\n-round(i)\n-round(i32)\n-round(i64)\n-score(1)\n-score(1, 1)\n-score(1, i)\n-score(i)\n-score(i32 + i)\n-score(int(i))\n-sum(array)\n-sum(i .. 1)\n0.5 != 0.5 == ok\n0.5 != f64 ? list : f32\n0.5 != f64 and !true\n0.5 != f64 and ok\n0.5 != i == ok\n0.5 != i32 && ok\n0.5 != i32 == ok\n0.5 != i32 ? ok : ok\n0.5 != i32 and 1 > f64\n0.5 != nil == ok\n0.5 * 0.5 * f64\n0.5 * 0.5 / f32\n0.5 * 0.5 / f64\n0.5 * 0.5 < f64\n0.5 * 0.5 >= i64\n0.5 * 1 * i64\n0.5 * 1 <= f32\n0.5 * 1 > i32\n0.5 * 1 not in array\n0.5 * f32 * f32\n0.5 * f32 * i32\n0.5 * f32 + f32\n0.5 * f32 - f64\n0.5 * f32 / half(1)\n0.5 * f32 == i32\n0.5 * f32 > i\n0.5 * f64 != i64\n0.5 * f64 < i\n0.5 * f64 <= i\n0.5 * i + i\n0.5 * i + mean(array)\n0.5 * i - i32\n0.5 * i == 0.5 ? ok : ok\n0.5 * i32 / f32\n0.5 * i64 < f64\n0.5 * i64 == 1 ** i64\n0.5 ** 0.5 != i64\n0.5 ** 0.5 * max(1)\n0.5 ** 0.5 ** i64\n0.5 ** 0.5 + -f32\n0.5 ** 0.5 < f64\n0.5 ** 0.5 == i\n0.5 ** 0.5 ^ f32\n0.5 ** 0.5 not in array\n0.5 ** 1 != i\n0.5 ** 1 != i32\n0.5 ** 1 - f64\n0.5 ** 1 / f64\n0.5 ** 1 / i32\n0.5 ** 1 ^ i64\n0.5 ** f32 + f32 / i64\n0.5 ** f32 <= f32\n0.5 ** f32 ^ i\n0.5 ** f64 * f64\n0.5 ** f64 > f64 ? 1 : nil\n0.5 ** f64 >= i64\n0.5 ** i / i\n0.5 ** i > i\n0.5 ** i32 * i32\n0.5 ** i32 > f64\n0.5 ** i32 >= mean(array)\n0.5 + 0.5 != i\n0.5 + 0.5 == i32\n0.5 + 0.5 > f32\n0.5 + 1 != f64\n0.5 + 1 + i32\n0.5 + 1 - i32\n0.5 + 1 < float(1)\n0.5 + 1 == f32\n0.5 + f32 - i64\n0.5 + f32 <= ceil(f32)\n0.5 + f32 <= i32\n0.5 + f32 > f32\n0.5 + f64 != i64\n0.5 + f64 <= i32\n0.5 + f64 == 1 / 0.5\n0.5 + i + i\n0.5 + i > i64\n0.5 + i in array\n0.5 + i32 - i64\n0.5 + i32 <= f32\n0.5 + i64 - i\n0.5 + i64 > i64 * 0.5\n0.5 - 0.5 - i32\n0.5 - 0.5 >= f32\n0.5 - 0.5 >= i\n0.5 - 0.5 >= i32\n0.5 - 1 + i\n0.5 - 1 + i / i\n0.5 - 1 <= f64\n0.5 - f32 != i64\n0.5 - f32 >= i64\n0.5 - f64 - f32\n0.5 - f64 < i\n0.5 - f64 in array\n0.5 - i != i64\n0.5 - i + i\n0.5 - i > f32\n0.5 - i32 != f32\n0.5 - i64 + -f64\n0.5 - i64 == i\n0.5 - i64 not in array\n0.5 / 0.5 + i\n0.5 / 0.5 - i\n0.5 / 0.5 - i32\n0.5 / 0.5 - i64\n0.5 / 0.5 / half(0.5)\n0.5 / 0.5 < i32\n0.5 / 0.5 == i64\n0.5 / 0.5 >= f32\n0.5 / 0.5 >= f64\n0.5 / 1 * i\n0.5 / 1 / f64\n0.5 / 1 < f64\n0.5 / 1 == i\n0.5 / 1 > f32\n0.5 / 1 >= i32\n0.5 / 1 not in array\n0.5 / f32 * f64\n0.5 / f64 + f64\n0.5 / f64 - i\n0.5 / f64 / f64\n0.5 / f64 < i\n0.5 / f64 == f32\n0.5 / i != i64\n0.5 / i * i64\n0.5 / i / i32\n0.5 / i <= i\n0.5 / i32 + i64\n0.5 / i32 > i ^ i\n0.5 / i32 > i64\n0.5 / i32 >= f64\n0.5 / i64 != f64\n0.5 / i64 != i\n0.5 / i64 != min(f32)\n0.5 / i64 * i32\n0.5 < 0.5 ? f32 : array\n0.5 < 0.5 ? foo : greet\n0.5 < 1 == ok\n0.5 < 1 || ok\n0.5 < f32 && ok\n0.5 < f32 || ok\n0.5 <= f64 ? i : i64\n0.5 <= f64 || ok\n0.5 == 1 and ok\n0.5 == 1 || ok\n0.5 == array[ok ? 0.5 : score]\n0.5 == f32 and i64 == i32\n0.5 == f64 ? i : (false ? i : i64)\n0.5 == f64 and i64 == 0.5\n0.5 == i or ok\n0.5 == i32 and ok\n0.5 == i64 and ok\n0.5 == nil or \"foo\" endsWith \"bar\"\n0.5 == nil or ok\n0.5 == nil || ok\n0.5 > 0.5 == ok\n0.5 > array[i64]\n0.5 > f32 and ok\n0.5 > i && 0.5 < i64\n0.5 > i64 ? -i : array\n0.5 >= 0.5 ? array[i64] : f32\n0.5 >= 0.5 and ok\n0.5 >= i && 1 < 0.5\n0.5 >= i32 == ok\n0.5 >= i32 and ok\n0.5 ^ 0.5 == f64\n0.5 ^ 0.5 >= i32\n0.5 ^ 0.5 >= i64\n0.5 ^ 1 ** i64\n0.5 ^ 1 - f32\n0.5 ^ 1 < f32\n0.5 ^ 1 < i\n0.5 ^ 1 <= i32\n0.5 ^ 1 > f64 / 1\n0.5 ^ 1 >= i\n0.5 ^ f32 * i\n0.5 ^ f32 ** i64\n0.5 ^ f32 <= i32\n0.5 ^ f32 > i64\n0.5 ^ f32 >= i\n0.5 ^ f64 - i64\n0.5 ^ f64 / f32\n0.5 ^ f64 < f32\n0.5 ^ f64 > i32\n0.5 ^ i != f64\n0.5 ^ i * reduce(array, i)\n0.5 ^ i ** floor(0.5)\n0.5 ^ i / (0.5 + i32)\n0.5 ^ i < -f64\n0.5 ^ i <= i32\n0.5 ^ i >= i64\n0.5 ^ i32 * reduce(list, f64)\n0.5 ^ i32 ** f32\n0.5 ^ i32 < f32 ? ok : i32\n0.5 ^ i32 == i64\n0.5 ^ i32 ^ f64\n0.5 ^ i32 in array\n0.5 ^ i64 * i\n0.5 ^ i64 ** i\n0.5 ^ i64 ** i64\n0.5 ^ i64 > i32\n0.5 in array != ok\n0.5 in array && ok\n1 != 0.5 != ok\n1 != 0.5 and 1 == 1\n1 != 1 && ok\n1 != 1 ? f64 : 0.5 > i\n1 != 1 ? list : score\n1 != f32 != ok\n1 != f32 ? ok : half\n1 != i or ok\n1 != i64 ? add : div\n1 != nil && ok\n1 != nil == ok\n1 != nil or not false\n1 % 1 != i\n1 % 1 != i32\n1 % 1 % i\n1 % 1 / f32\n1 % 1 / i32\n1 % 1 < f64\n1 % 1 < i\n1 % 1 == f64\n1 % 1 == i ? nil : 0.5\n1 % 1 == i32\n1 % array[i32]\n1 % array[i]\n1 % i != -i64\n1 % i != 1 != nil\n1 % i - i64\n1 % i < i32\n1 % i >= f64\n1 % i >= i\n1 % i not in array\n1 % i32 != i\n1 % i32 <= f32\n1 % i32 > i64\n1 % i32 >= f64\n1 % i64 - f32\n1 % i64 < score(i)\n1 % i64 > f32\n1 * 0.5 + f64\n1 * 0.5 + i32\n1 * 0.5 + round(f64)\n1 * 0.5 / i\n1 * 0.5 / i64\n1 * 0.5 < i64\n1 * 0.5 == f32\n1 * 0.5 >= f32\n1 * 1 - i32\n1 * 1 <= int(i)\n1 * 1 >= f32\n1 * f32 != f64 - 0.5\n1 * f32 <= reduce(array, #)\n1 * f32 >= f64\n1 * f64 * i64\n1 * f64 <= i64\n1 * f64 > i\n1 * f64 >= f64\n1 * i * f32\n1 * i - i32\n1 * i / f64\n1 * i < f32\n1 * i > i32\n1 * i not in array\n1 * i32 + i32\n1 * i32 - i\n1 * i32 < i\n1 * i64 * f32\n1 * i64 + i\n1 * i64 - f64\n1 * i64 / f64\n1 * i64 <= f64\n1 * i64 in array\n1 ** 0.5 * i\n1 ** 0.5 ** f32\n1 ** 0.5 ** f64\n1 ** 0.5 ** i64\n1 ** 0.5 - f32\n1 ** 0.5 - i32\n1 ** 0.5 - i64\n1 ** 0.5 < -f32\n1 ** 0.5 > i\n1 ** 0.5 > i64\n1 ** 0.5 ^ f64\n1 ** 1 ** f64\n1 ** 1 + f64\n1 ** 1 + i64\n1 ** 1 - round(0.5)\n1 ** 1 / f64\n1 ** 1 < f32\n1 ** 1 == 0.5 + i32\n1 ** 1 >= i\n1 ** 1 >= i32\n1 ** 1 ^ i\n1 ** 1 ^ i32\n1 ** 1 in array\n1 ** array[i32]\n1 ** f32 / i32\n1 ** f32 / i64\n1 ** f32 <= f32\n1 ** f32 <= i64\n1 ** f32 == i64 ? i32 : array\n1 ** f32 >= f32\n1 ** f32 >= i\n1 ** f32 ^ f32\n1 ** f32 ^ i64\n1 ** i + i32\n1 ** i >= i\n1 ** i32 != i32\n1 ** i32 + f32\n1 ** i32 + i64\n1 ** i64 <= f32\n1 ** i64 <= f64\n1 ** i64 <= i32\n1 ** i64 > f32\n1 + 0.5 != i32\n1 + 0.5 + i\n1 + 0.5 - i64\n1 + 0.5 < f32\n1 + 0.5 < i\n1 + 0.5 == f64\n1 + 0.5 == f64 != nil\n1 + 0.5 > i64\n1 + 0.5 not in array\n1 + 1 != 0.5 ? 0.5 : half\n1 + 1 - f32\n1 + 1 - i\n1 + 1 < i\n1 + 1 == f64 * i64\n1 + 1 > f32\n1 + 1 >= half(0.5)\n1 + 1 >= i\n1 + f32 != i32\n1 + f32 < i32\n1 + f32 <= i\n1 + f32 > i64\n1 + f64 == i64\n1 + f64 >= f64\n1 + i .. i32\n1 + i <= ceil(f32)\n1 + i <= f64\n1 + i >= min(i64)\n1 + i32 != i32\n1 + i32 - f64\n1 + i32 < f32\n1 + i32 < i32\n1 + i32 <= f64\n1 + i32 > reduce(array, #)\n1 + i32 >= f64\n1 + i64 != i32\n1 + i64 != i64\n1 + i64 < i32\n1 + i64 <= i64\n1 - 0.5 != f32\n1 - 0.5 + i\n1 - 0.5 - f32\n1 - 0.5 <= i32\n1 - 0.5 <= i64\n1 - 1 < i64 ? 0.5 : \"foo\"\n1 - 1 <= i32 + i64\n1 - 1 == f64\n1 - 1 > i32 / i32\n1 - f32 != f32\n1 - f32 <= i64\n1 - f64 != f32\n1 - f64 + f32\n1 - f64 + i - 0.5\n1 - f64 <= i\n1 - f64 in array\n1 - f64 not in array\n1 - i > f64\n1 - i > i\n1 - i > i32\n1 - i >= i64\n1 - i not in array\n1 - i32 < i32\n1 - i32 < i64\n1 - i32 == i32\n1 - i64 <= i32\n1 .. i != list\n1 / 0.5 <= abs(f32)\n1 / 0.5 <= i32\n1 / 0.5 == f64\n1 / 0.5 > f32\n1 / 0.5 >= i\n1 / 0.5 >= i - i\n1 / 0.5 >= i32\n1 / 1 != i32\n1 / 1 * f32\n1 / 1 <= f64\n1 / 1 in array\n1 / f32 != f64\n1 / f32 / i64\n1 / f32 <= f32\n1 / f32 <= f64\n1 / f32 == i32\n1 / f32 == i32 / i\n1 / f32 > f32\n1 / f32 >= f64\n1 / f64 + f64\n1 / f64 < f32\n1 / f64 == f64\n1 / i * f32\n1 / i / f64\n1 / i < i\n1 / i == f64\n1 / i >= i32\n1 / i in map(list, 1)\n1 / i32 > f32\n1 / i32 >= i64\n1 / i64 * i\n1 / i64 > f32 / f64\n1 / i64 > f64\n1 / i64 >= f64\n1 < 1 == ok\n1 < 1 and ok\n1 < array[get(array, i32)]\n1 < array[i32]\n1 < f32 != not true\n1 < f64 || ok\n1 < i ? array : foo\n1 < i32 || 1 >= f32\n1 < i64 == ok\n1 < i64 ? ok : list\n1 <= 1 == ok\n1 <= 1 || add == add\n1 <= f32 && ok\n1 <= f64 || ok\n1 <= i32 ? foo : f32\n1 == 0.5 ? i32 : greet\n1 == 0.5 and ok\n1 == 1 || ok\n1 == f64 && 0.5 != nil\n1 == f64 || ok\n1 == i32 && ok\n1 == i32 == ok\n1 == i64 == ok\n1 == nil ? ok : half\n1 > 0.5 == ok\n1 > array[i64]\n1 > f32 && ok\n1 > f32 == reduce(array, ok)\n1 > f64 != ok\n1 > i == ok\n1 > i64 or i != 1\n1 >= 1 != (nil not in list)\n1 >= f32 ? i64 : half\n1 >= f64 ? ok : half\n1 >= i and ok\n1 ^ 0.5 != f32\n1 ^ 0.5 != i\n1 ^ 0.5 ** f32\n1 ^ 0.5 ** i32\n1 ^ 0.5 - i32\n1 ^ 0.5 < i32\n1 ^ 0.5 <= f64\n1 ^ 0.5 == i\n1 ^ 0.5 ^ f32\n1 ^ 0.5 ^ i64\n1 ^ 1 != f64\n1 ^ 1 != i64\n1 ^ 1 ** i\n1 ^ 1 + f64\n1 ^ 1 / i\n1 ^ 1 < i\n1 ^ 1 < i64\n1 ^ 1 >= i\n1 ^ 1 >= i32\n1 ^ f32 < i32\n1 ^ f32 <= f64\n1 ^ f64 / f64\n1 ^ f64 == f32\n1 ^ f64 > f32\n1 ^ f64 >= 1 / f64\n1 ^ i != i * f32\n1 ^ i - i32\n1 ^ i < i\n1 ^ i32 * i32\n1 ^ i32 ** i64\n1 ^ i32 / i\n1 ^ i32 >= i32\n1 ^ i32 >= i64\n1 ^ i64 * i64\n1 ^ i64 ** reduce(list, 1)\n1 ^ i64 - i64\n1 ^ i64 / f64\n1 ^ i64 > i\n1 ^ i64 >= i32 + i32\n1 in array ? f32 : foo\n[!false]\n[!ok]\n[!true]\n[\"bar\" + \"foo\"]\n[\"bar\" < \"bar\"]\n[\"bar\" not contains \"bar\"]\n[-0.5]\n[-1]\n[-f32]\n[-f64]\n[-i64]\n[0.5 != f32]\n[0.5 != i]\n[0.5 * 0.5]\n[0.5 * f32]\n[0.5 ** i]\n[0.5 - 0.5]\n[0.5 - i]\n[0.5 / i32]\n[0.5 <= i32, half]\n[0.5 > 1]\n[0.5 > f32]\n[0.5 > i64]\n[0.5 >= f64]\n[0.5 ^ 0.5]\n[1 != 1]\n[1 * 0.5]\n[1 ** 0.5]\n[1 + i64, add]\n[1 == i64]\n[1 == i]\n[[f32]]\n[add != nil]\n[add, add]\n[add, f32]\n[add, i]\n[add]\n[all(list, false)]\n[any(list, ok)]\n[array, add]\n[array, array]\n[array, f32]\n[array, greet]\n[array, i64]\n[array, i]\n[array, list]\n[array, ok, add]\n[array, string(nil)]\n[array]\n[bitnot(1)]\n[ceil(i32)]\n[div(1, 1)]\n[div, add]\n[div, foo]\n[div, i32]\n[div, i64, array]\n[div]\n[f32 * i]\n[f32 + f64]\n[f32 >= i]\n[f32, f64]\n[f32, foo, greet]\n[f32, greet]\n[f32, i32]\n[f32, list]\n[f32, ok]\n[f32, score]\n[f32]\n[f64 + f64]\n[f64 / f64]\n[f64 < 0.5]\n[f64 < f32]\n[f64 < i64]\n[f64 <= 1]\n[f64 in array]\n[f64, add]\n[f64, f64]\n[f64, half]\n[f64, i64]\n[f64]\n[f64] == array\n[find(array, true)]\n[findIndex(list, false)]\n[findLast(list, ok)]\n[float(0.5)]\n[float(1)]\n[foo, add]\n[foo, array]\n[foo, half]\n[foo, i]\n[foo, ok]\n[foo, reduce(array, #)]\n[foo.Bar]\n[foo.Qux]\n[foo?.Bar, f32, f64]\n[foo?.Bar, i32]\n[foo?.Bar]\n[foo?.Qux]\n[foo?.String()]\n[foo]\n[greet != nil]\n[greet, array]\n[greet, div]\n[greet, foo]\n[greet, greet]\n[greet, half]\n[greet, i64]\n[greet, list]\n[greet]\n[greet] == list\n[groupBy(array, \"bar\")]\n[groupBy(array, #), half]\n[groupBy(array, #)]\n[groupBy(array, f64)]\n[groupBy(list, #)?.Qux]\n[half(0.5)]\n[half(f64)]\n[half(i64 ^ 1)]\n[half, array]\n[half, div]\n[half, f64]\n[half, i64 < f64]\n[half, list]\n[half]\n[i != i64]\n[i .. 1]\n[i / i]\n[i < i64, score]\n[i <= 0.5]\n[i == i32]\n[i >= i32]\n[i ^ 1]\n[i, array, list]\n[i, array]\n[i, greet(\"bar\")]\n[i, greet]\n[i, i32]\n[i, i]\n[i, list]\n[i32 < i]\n[i32 > 1]\n[i32, -1]\n[i32, div]\n[i32, f64]\n[i32, i32]\n[i32, list]\n[i32, type(greet)]\n[i32]\n[i64 != f64]\n[i64 + 0.5]\n[i64 / f64]\n[i64 <= i64]\n[i64 >= 1]\n[i64 ^ 1]\n[i64, div]\n[i64, foo]\n[i64, half]\n[i64, score]\n[i64]\n[i]\n[list != nil]\n[list, div]\n[list, f32]\n[list, greet]\n[list, half]\n[list, i]\n[list, ok]\n[list]\n[map(array, #)]\n[map(array, add)]\n[map(array, f64)]\n[map(array, foo)]\n[max(1)]\n[nil != 0.5]\n[not false]\n[ok ? 1 : greet]\n[ok, f32]\n[ok, half]\n[ok, i64]\n[ok, i]\n[ok, list, 0.5] == list\n[ok, ok]\n[ok]\n[reduce(array, foo)]\n[reduce(list, #)]\n[reduce(list, div)]\n[score == nil]\n[score, div]\n[score, f32]\n[score, f64]\n[score, greet]\n[score, half]\n[score, one(array, # > i32)]\n[score, score]\n[score]\n[string(0.5)]\n[string(1)]\n[string(foo)]\n[string(i)]\n[string(i64)]\n[toJSON(list)]\n[trimPrefix(\"bar\")]\n[true ? add : f64]\n[true and ok]\n[true || ok]\n[type(1)]\n[type(add)]\n[type(div)]\n[type(greet)]\n[type(nil)]\nabs(-0.5)\nabs(-1)\nabs(-f32)\nabs(-f64)\nabs(-i)\nabs(-i32)\nabs(-i64)\nabs(0.5 * 0.5)\nabs(0.5 * 1)\nabs(0.5 * i)\nabs(0.5 * i64)\nabs(0.5 ** 0.5)\nabs(0.5 ** 1)\nabs(0.5 ** i32)\nabs(0.5 + 0.5)\nabs(0.5 + 1)\nabs(0.5 + f32)\nabs(0.5 + i)\nabs(0.5 + i64)\nabs(0.5 - 0.5)\nabs(0.5 - 1)\nabs(0.5 - i)\nabs(0.5 - i32)\nabs(0.5 - i64)\nabs(0.5 / 0.5)\nabs(0.5 / 1)\nabs(0.5 / f64)\nabs(0.5 ^ 0.5)\nabs(0.5 ^ 1)\nabs(0.5 ^ f32)\nabs(0.5) - i32\nabs(0.5) / f32\nabs(0.5) < f64\nabs(0.5) < i32\nabs(0.5) <= i64\nabs(0.5) == -0.5\nabs(0.5) == half(1)\nabs(0.5) > i32\nabs(0.5) >= f64\nabs(0.5) ^ i64\nabs(0.5) not in array\nabs(1 * f32)\nabs(1 * f64)\nabs(1 * i32)\nabs(1 ** 0.5)\nabs(1 ** 1)\nabs(1 ** i)\nabs(1 + 1)\nabs(1 + i)\nabs(1 + i64)\nabs(1 - 0.5)\nabs(1 - 1)\nabs(1 - i64)\nabs(1 / 0.5)\nabs(1 / 1)\nabs(1 / i)\nabs(1 / i32)\nabs(1 ^ f32)\nabs(1 ^ i)\nabs(1 ^ i32)\nabs(1) - i32\nabs(1) .. i\nabs(1) / f64\nabs(1) / i64\nabs(1) < i64\nabs(1) <= i32\nabs(1) == i32\nabs(1) >= i\nabs(1) ^ f64\nabs(abs(0.5))\nabs(abs(1))\nabs(abs(f64))\nabs(abs(i32))\nabs(abs(i64))\nabs(add(i, 1))\nabs(bitand(i64, i32))\nabs(bitnand(i64, i))\nabs(bitnot(1))\nabs(bitnot(i))\nabs(bitnot(i32))\nabs(bitnot(i64))\nabs(bitushr(1, 1))\nabs(ceil(0.5))\nabs(ceil(1))\nabs(ceil(f32))\nabs(ceil(i))\nabs(ceil(i32))\nabs(ceil(i64))\nabs(count(array, ok))\nabs(count(array, true))\nabs(count(list, false))\nabs(div(i, i))\nabs(f32 * 0.5)\nabs(f32 ** 1)\nabs(f32 ** f32)\nabs(f32 ** i32)\nabs(f32 + 0.5)\nabs(f32 + 1)\nabs(f32 + i)\nabs(f32 + i32)\nabs(f32 - 0.5)\nabs(f32 - 1)\nabs(f32 - i32)\nabs(f32 - i64)\nabs(f32 / 0.5)\nabs(f32 / 1)\nabs(f32 / f32)\nabs(f32 / f64)\nabs(f32 / i32)\nabs(f32 ^ i)\nabs(f32 ^ i64)\nabs(f32)\nabs(f32) ** f32\nabs(f32) ** i\nabs(f32) + i64\nabs(f32) - i32\nabs(f32) / f64\nabs(f32) < f64\nabs(f32) >= 0.5 / 1\nabs(f32) ^ f32\nabs(f64 * f32)\nabs(f64 * f64)\nabs(f64 ** 1)\nabs(f64 + 0.5)\nabs(f64 + 1)\nabs(f64 + f64)\nabs(f64 - 1)\nabs(f64 - f32)\nabs(f64 / 0.5)\nabs(f64 / 1)\nabs(f64 / f64)\nabs(f64 / i)\nabs(f64 ^ 0.5)\nabs(f64 ^ f32)\nabs(f64 ^ i)\nabs(f64 ^ i64)\nabs(f64)\nabs(f64) + f32\nabs(f64) + f64\nabs(f64) + i32\nabs(f64) + i64 / i\nabs(f64) - i\nabs(f64) < i32\nabs(f64) <= f64\nabs(f64) > i64\nabs(f64) ^ f32\nabs(f64) ^ i64\nabs(f64) in array\nabs(false ? f32 : 1)\nabs(false ? half : 0.5)\nabs(false ? list : 1)\nabs(find(array, ok))\nabs(find(array, true))\nabs(findIndex(list, ok))\nabs(findIndex(list, true))\nabs(findLastIndex(array, ok))\nabs(first(array))\nabs(float(0.5))\nabs(float(1))\nabs(float(f32))\nabs(float(f64))\nabs(float(i))\nabs(float(i32))\nabs(floor(0.5))\nabs(floor(f32))\nabs(floor(i32))\nabs(get(array, 1))\nabs(get(array, i))\nabs(get(array, i32))\nabs(get(array, i64))\nabs(half(0.5))\nabs(half(1))\nabs(half(f64))\nabs(i * 1)\nabs(i * f32)\nabs(i ** 1)\nabs(i ** f32)\nabs(i ** i32)\nabs(i + 0.5)\nabs(i + f64)\nabs(i - 0.5)\nabs(i - 1)\nabs(i - f32)\nabs(i - f64)\nabs(i - i32)\nabs(i / 0.5)\nabs(i / f64)\nabs(i / i)\nabs(i / i32)\nabs(i / i64)\nabs(i ^ 0.5)\nabs(i ^ f64)\nabs(i ^ i)\nabs(i ^ i32)\nabs(i ^ i64)\nabs(i)\nabs(i) % i\nabs(i) * i32\nabs(i) ** f32\nabs(i) + f64\nabs(i) - f32\nabs(i) .. i\nabs(i) .. i32\nabs(i) / f32\nabs(i) < f64\nabs(i) <= i64\nabs(i) == 0.5 / i\nabs(i) > i64\nabs(i) ^ f64\nabs(i) ^ half(1)\nabs(i) ^ i\nabs(i) ^ i32\nabs(i32 % i32)\nabs(i32 % i64)\nabs(i32 * f64)\nabs(i32 * i32)\nabs(i32 ** 0.5)\nabs(i32 ** 1)\nabs(i32 ** i32)\nabs(i32 + 0.5)\nabs(i32 + 1)\nabs(i32 + f64)\nabs(i32 + i)\nabs(i32 + i32)\nabs(i32 - 0.5)\nabs(i32 - i64)\nabs(i32 / 0.5)\nabs(i32 / i)\nabs(i32 / i64)\nabs(i32)\nabs(i32) != f64\nabs(i32) * f32\nabs(i32) * i\nabs(i32) ** i\nabs(i32) - i32\nabs(i32) / -1\nabs(i32) / i32 ** f64\nabs(i32) < i64 == false\nabs(i32) <= i\nabs(i32) <= i32\nabs(i32) == i32\nabs(i32) ^ i64\nabs(i32) in array\nabs(i64 * 0.5)\nabs(i64 * f32)\nabs(i64 * i32)\nabs(i64 ** 0.5)\nabs(i64 ** f64)\nabs(i64 ** i64)\nabs(i64 + 0.5)\nabs(i64 + 1)\nabs(i64 + f32)\nabs(i64 + f64)\nabs(i64 + i)\nabs(i64 - 0.5)\nabs(i64 - i)\nabs(i64 / f32)\nabs(i64 / i32)\nabs(i64 ^ f64)\nabs(i64 ^ i)\nabs(i64 ^ i32)\nabs(i64)\nabs(i64) * i32\nabs(i64) ** i\nabs(i64) + f32\nabs(i64) / i\nabs(i64) > i32\nabs(i64) ^ i32\nabs(i64) not in array\nabs(int(0.5))\nabs(int(1))\nabs(int(i))\nabs(int(i32))\nabs(int(i64))\nabs(last(array))\nabs(len(\"foo\"))\nabs(len(list))\nabs(max(0.5))\nabs(max(f32))\nabs(max(f64))\nabs(max(i32))\nabs(max(i64))\nabs(mean(array))\nabs(median(array))\nabs(min(0.5))\nabs(min(1))\nabs(min(f32))\nabs(min(f64))\nabs(min(i))\nabs(min(i32))\nabs(ok ? 1 : \"foo\")\nabs(ok ? f32 : 0.5)\nabs(ok ? f32 : nil)\nabs(ok ? f64 : ok)\nabs(ok ? i32 : foo)\nabs(reduce(array, #))\nabs(reduce(array, i))\nabs(reduce(list, 1))\nabs(reduce(list, i32))\nabs(round(0.5))\nabs(round(1))\nabs(round(f32))\nabs(round(i))\nabs(round(i64))\nabs(score(1))\nabs(score(i))\nabs(sum(array))\nabs(true ? 1 : ok)\nadd\nadd != add\nadd != add == nil\nadd != div\nadd != div != false\nadd != div == true\nadd != nil ? f64 : i64\nadd != reduce(list, add)\nadd == add\nadd == add != nil\nadd == add == nil\nadd == add ? 1 : i64\nadd == div\nadd == div ? f64 : list\nadd == nil ? false : i32\nadd == nil ? greet : i32\nadd == nil ? nil : nil\nadd in sort(array)\nadd(1, i) < i\nadd(i, 1) ** f32\nadd(i, i)\nadd(i, i32 + 1)\nall(1 .. i64, ok)\nall([\"bar\"], # >= #)\nall([\"foo\"], # not matches #)\nall([false], # && false)\nall([false], #)\nall(array, !(# >= f64))\nall(array, !ok)\nall(array, !true)\nall(array, \"foo\" < \"bar\")\nall(array, # != #)\nall(array, # != 1)\nall(array, # != f32)\nall(array, # != f64)\nall(array, # != i32)\nall(array, # != nil)\nall(array, # < #)\nall(array, # < 0.5)\nall(array, # < 1)\nall(array, # < f64)\nall(array, # < i)\nall(array, # < i64)\nall(array, # <= #)\nall(array, # <= 0.5)\nall(array, # <= i)\nall(array, # == # + #)\nall(array, # == #)\nall(array, # == 0.5)\nall(array, # == 1)\nall(array, # == f64)\nall(array, # == i)\nall(array, # == i32)\nall(array, # == i64)\nall(array, # > #)\nall(array, # > 0.5)\nall(array, # > 1)\nall(array, # > f64)\nall(array, # > i)\nall(array, # > i32)\nall(array, # > i64)\nall(array, # >= #)\nall(array, # >= 0.5)\nall(array, # >= f32)\nall(array, # >= f64)\nall(array, # >= i32)\nall(array, # >= i64)\nall(array, # in array)\nall(array, 0.5 != #)\nall(array, 0.5 < #)\nall(array, 0.5 < f32)\nall(array, 0.5 <= #)\nall(array, 0.5 <= f32)\nall(array, 0.5 <= i)\nall(array, 0.5 > f32)\nall(array, 0.5 > f64)\nall(array, 0.5 > i32)\nall(array, 0.5 >= #)\nall(array, 0.5 >= 0.5)\nall(array, 0.5 in array)\nall(array, 1 != #)\nall(array, 1 != f32)\nall(array, 1 < #)\nall(array, 1 < f32)\nall(array, 1 == #)\nall(array, 1 > #)\nall(array, 1 > i64)\nall(array, 1 >= #)\nall(array, 1 >= 1)\nall(array, 1 >= i64)\nall(array, f32 < #)\nall(array, f32 <= #)\nall(array, f32 <= f32)\nall(array, f32 > i)\nall(array, f32 >= #)\nall(array, f64 != #)\nall(array, f64 <= #)\nall(array, f64 <= f32)\nall(array, f64 == #)\nall(array, f64 == 0.5)\nall(array, f64 == i64)\nall(array, f64 >= i64)\nall(array, false && true)\nall(array, false ? 1 : true)\nall(array, i != 0.5)\nall(array, i <= 0.5)\nall(array, i <= f32)\nall(array, i <= i32)\nall(array, i == #)\nall(array, i32 != #)\nall(array, i32 != i64)\nall(array, i32 < i)\nall(array, i32 >= #)\nall(array, i64 != #)\nall(array, i64 != i64)\nall(array, i64 == i32)\nall(array, i64 > #)\nall(array, i64 > 0.5)\nall(array, i64 >= #)\nall(array, nil != \"bar\")\nall(array, nil != #)\nall(array, nil != list)\nall(array, nil != ok)\nall(array, nil == \"foo\")\nall(array, nil == i32)\nall(array, nil == list)\nall(array, none(list, true))\nall(array, not false)\nall(array, not true)\nall(array, ok)\nall(false ? add : \"bar\", ok)\nall(filter(array, true), ok)\nall(groupBy(array, f32).score, 0.5 in #?.f64)\nall(groupBy(list, #).i, #?.half() not in # + #)\nall(i32 .. 1, ok)\nall(list, !false)\nall(list, \"bar\" in #)\nall(list, \"bar\" not in #)\nall(list, \"foo\" > \"foo\")\nall(list, # != #)\nall(list, # != nil)\nall(list, # == # || f64 != i64)\nall(list, # == #)\nall(list, # == foo)\nall(list, # in list)\nall(list, # not in list)\nall(list, 0.5 < f64)\nall(list, 0.5 < i64)\nall(list, 0.5 <= i64)\nall(list, 0.5 >= i)\nall(list, 0.5 >= i32)\nall(list, 1 != 1)\nall(list, 1 <= 1)\nall(list, 1 > i32)\nall(list, 1 >= f64)\nall(list, add == div)\nall(list, all(array, ok))\nall(list, div != nil)\nall(list, f64 != 0.5)\nall(list, f64 != f32)\nall(list, f64 < i32)\nall(list, f64 > i64)\nall(list, false ? i : true)\nall(list, i < f32)\nall(list, i <= 1)\nall(list, i <= i32)\nall(list, i > f64)\nall(list, i > i32)\nall(list, i >= 1)\nall(list, i32 < 1)\nall(list, i32 <= 0.5)\nall(list, i32 == f32)\nall(list, i64 != nil)\nall(list, i64 <= 0.5)\nall(list, i64 > 1)\nall(list, list != nil)\nall(list, nil != 1)\nall(list, nil != i64)\nall(list, nil != nil)\nall(list, nil != score)\nall(list, nil == #)\nall(list, nil == score)\nall(list, nil in array)\nall(list, none(array, 1 > #))\nall(list, not true)\nall(list, ok)\nall(list, reduce(array, true))\nall(list, type(i) not endsWith .Bar)\nall(map(array, #), ok && false)\nall(map(array, #), ok)\nall(map(array, f32), !ok)\nall(map(array, false), #)\nall(map(array, score), # != #)\nall(map(array, score), ok)\nall(map(list, \"bar\" not in #), #)\nall(map(list, 0.5), 0.5 <= #)\nall(map(list, i), # == 0.5)\nall(map(list, list), 1 == 0.5)\nall(map(list, ok), #)\nall(reduce(array, array), # > #)\nall(reduce(array, list), ok)\nall(true ? list : false, not true)\nany([\"bar\"], # not endsWith #)\nany([greet], ok)\nany(array, !(i32 <= #))\nany(array, \"foo\" >= \"foo\")\nany(array, \"foo\" not endsWith \"bar\")\nany(array, # != # or # > #)\nany(array, # != #)\nany(array, # != 0.5)\nany(array, # != f32)\nany(array, # != f64)\nany(array, # != i32)\nany(array, # != i64)\nany(array, # != nil)\nany(array, # < #)\nany(array, # < 0.5)\nany(array, # < 1)\nany(array, # < f32)\nany(array, # < f64)\nany(array, # < i)\nany(array, # < i32)\nany(array, # <= #)\nany(array, # <= 0.5)\nany(array, # <= 1)\nany(array, # <= f32)\nany(array, # <= i)\nany(array, # <= i32)\nany(array, # <= i64)\nany(array, # == #)\nany(array, # == 0.5)\nany(array, # == 1)\nany(array, # == i32)\nany(array, # == i64)\nany(array, # > #)\nany(array, # > 0.5)\nany(array, # > 1)\nany(array, # > f64)\nany(array, # > i32)\nany(array, # >= #)\nany(array, # >= 0.5)\nany(array, # >= 1)\nany(array, # >= f32)\nany(array, # >= i32)\nany(array, # >= i64)\nany(array, # in array)\nany(array, 0.5 != #)\nany(array, 0.5 == #)\nany(array, 0.5 == i32)\nany(array, 0.5 > #)\nany(array, 0.5 > f64)\nany(array, 0.5 >= #)\nany(array, 1 != i64)\nany(array, 1 < #)\nany(array, 1 < 0.5)\nany(array, 1 <= #)\nany(array, 1 == #)\nany(array, 1 > #)\nany(array, 1 > 1)\nany(array, 1 >= #)\nany(array, 1 >= f64)\nany(array, all(list, false))\nany(array, f32 < i)\nany(array, f32 > #)\nany(array, f32 > 0.5)\nany(array, f32 >= #)\nany(array, f64 != #)\nany(array, f64 < i)\nany(array, f64 <= #)\nany(array, f64 == #)\nany(array, f64 > #)\nany(array, f64 > 0.5)\nany(array, false && false)\nany(array, greet == greet)\nany(array, i != #)\nany(array, i < #)\nany(array, i > #)\nany(array, i >= #)\nany(array, i32 > i64)\nany(array, i64 < #)\nany(array, i64 == f64)\nany(array, i64 >= #)\nany(array, nil != #)\nany(array, nil != 1)\nany(array, nil != i)\nany(array, nil != ok)\nany(array, nil == \"foo\")\nany(array, nil == #)\nany(array, nil == 1)\nany(array, ok != true)\nany(array, ok)\nany(array, one(array, # <= 0.5))\nany(array, one(array, ok))\nany(array, score == nil)\nany(i32 .. i, half == half)\nany(list, !ok)\nany(list, !true)\nany(list, \"bar\" < \"foo\")\nany(list, \"bar\" not in #)\nany(list, \"bar\" not startsWith \"foo\")\nany(list, \"foo\" not in foo)\nany(list, # != #)\nany(list, # == #)\nany(list, # == foo)\nany(list, # == nil)\nany(list, 0.5 != 1)\nany(list, 0.5 < 1)\nany(list, 0.5 < f64)\nany(list, 0.5 == i64)\nany(list, 1 >= f64)\nany(list, 1 >= i32)\nany(list, any(list, false))\nany(list, any(list, ok))\nany(list, array == nil)\nany(list, f32 < 1)\nany(list, f32 <= i64)\nany(list, f32 > 1)\nany(list, f32 > i64)\nany(list, f32 >= i32)\nany(list, f64 != i64)\nany(list, f64 >= 1)\nany(list, false) == (foo not in list)\nany(list, false) || false ? nil : add\nany(list, i > i64)\nany(list, i >= 0.5)\nany(list, i32 != 0.5)\nany(list, i64 <= 1)\nany(list, i64 == 0.5)\nany(list, i64 == i)\nany(list, i64 >= i32)\nany(list, i64 not in array)\nany(list, nil == false)\nany(list, nil == nil)\nany(list, none(array, false))\nany(list, not ok)\nany(list, ok || # == #)\nany(list, ok)\nany(list, reduce(list, true))\nany(list, true ? false : f64)\nany(map(array, #), # >= #)\nany(map(array, #), ok)\nany(map(array, false), #)\nany(map(array, ok), # and #)\nany(map(array, ok), #)\nany(map(list, #), nil == #)\nany(map(list, false), nil == i32)\nany(map(list, ok), #)\nany(ok ? \"foo\" : 1, ok)\nany(ok ? \"foo\" : f32, i > #)\nany(reduce(array, array), 1 == #)\narray\narray != array\narray != array ? 1 : false\narray != array ? score : i32\narray != list\narray != list ? list : f64\narray != map(array, #)\narray != map(array, 1)\narray != map(list, #)\narray != map(list, true)\narray != nil ? add : 0.5\narray == array\narray == array ? half : false\narray == list\narray == map(array, score)\narray == map(list, #)\narray == nil ? list : float(f32)\narray not in sort(array)\narray[-i32]\narray[-i64]\narray[-i]\narray[1 % i64]\narray[1 + 1]\narray[1] * i32\narray[1] * i64\narray[1] - f64\narray[1] / i32\narray[1] == -i\narray[1] > i\narray[1] ^ i\narray[abs(1)]\narray[array[i32]]\narray[bitnot(1)]\narray[bitor(1, i)]\narray[count(list, ok)]\narray[get(array, 1)]\narray[i32 * 1]\narray[i32:i]\narray[i32]\narray[i32] != i\narray[i32] % i32\narray[i32] * f64\narray[i32] ** i32\narray[i32] + i64\narray[i32] - f64\narray[i32] / f32\narray[i32] == i32\narray[i32] == i64\narray[i32] > f64\narray[i32] >= f32\narray[i64:i64]\narray[i64]\narray[i64] .. i32\narray[i64] == floor(0.5)\narray[i64] == i\narray[i64] > half(f64)\narray[i64] ^ f64\narray[i:i32]\narray[i:i64]\narray[i]\narray[i] * f64\narray[i] + f32\narray[i] - f32\narray[i] / f64\narray[i] < round(i)\narray[i] == i32\narray[i] > f64\narray[i] >= 0.5 ** i\narray[max(1)]\narray[reduce(list, 1)]\narray[score(1):i]\narray[score(1)]\narray[score(i)]\nbitand(1 * i64, i)\nbitand(1, 1) != i\nbitand(1, i64) == f64\nbitand(i, i)\nbitand(i, i32)\nbitand(i, i64)\nbitand(i32, 1) != f32\nbitand(i32, i)\nbitand(i32, i) - i32\nbitand(i32, i32 * i)\nbitand(i32, i32)\nbitand(i32, i64)\nbitand(i64, 1) <= i32\nbitand(i64, i + i64)\nbitand(i64, i)\nbitand(i64, i) ^ f64\nbitand(i64, i32)\nbitand(i64, i64)\nbitand(int(i32), i64)\nbitnand(1, i64) != int(i64)\nbitnand(i, i)\nbitnand(i, i32 + i32)\nbitnand(i, i32)\nbitnand(i, i64)\nbitnand(i32, bitnot(1))\nbitnand(i32, i)\nbitnand(i32, i32)\nbitnand(i32, i64)\nbitnand(i64 + i, i32)\nbitnand(i64 + i64, i64)\nbitnand(i64, -1)\nbitnand(i64, 1) + i64 + 1\nbitnand(i64, i)\nbitnand(i64, i32)\nbitnand(i64, i32) > f64\nbitnand(i64, i64)\nbitnot(-1)\nbitnot(-i)\nbitnot(-i32)\nbitnot(-i64)\nbitnot(1 % 1)\nbitnot(1 % i32)\nbitnot(1 % i64)\nbitnot(1 * 1)\nbitnot(1 * i64)\nbitnot(1 + 1)\nbitnot(1 - i)\nbitnot(1 - i32)\nbitnot(1) * i % 1\nbitnot(1) ** f32\nbitnot(1) ** i\nbitnot(1) + i32\nbitnot(1) - i\nbitnot(1) - i32\nbitnot(1) / min(i)\nbitnot(1) < i32\nbitnot(1) < i64\nbitnot(1) == i32\nbitnot(1) > f64\nbitnot(1) >= i\nbitnot(1) >= i64\nbitnot(abs(1))\nbitnot(abs(i32))\nbitnot(abs(i64))\nbitnot(array[1])\nbitnot(array[i64])\nbitnot(array[i])\nbitnot(bitnot(i))\nbitnot(bitushr(1, 1))\nbitnot(bitushr(i32, 1))\nbitnot(bitxor(i, i64))\nbitnot(count(array, false))\nbitnot(findLast(array, ok))\nbitnot(first(array))\nbitnot(get(array, 1))\nbitnot(get(array, i))\nbitnot(i % i64)\nbitnot(i * i)\nbitnot(i * i32)\nbitnot(i + 1)\nbitnot(i - 1)\nbitnot(i - i64)\nbitnot(i)\nbitnot(i) % i32\nbitnot(i) * i\nbitnot(i) + f64\nbitnot(i) .. i64\nbitnot(i) == 1 - i\nbitnot(i) > i\nbitnot(i) >= i32\nbitnot(i) ^ f32\nbitnot(i) ^ f64\nbitnot(i) in array\nbitnot(i32 % 1)\nbitnot(i32 % i64)\nbitnot(i32 + i)\nbitnot(i32 + i32)\nbitnot(i32 - 1)\nbitnot(i32 - i32)\nbitnot(i32)\nbitnot(i32) != f64\nbitnot(i32) != i32\nbitnot(i32) * i\nbitnot(i32) * i64\nbitnot(i32) ** f32\nbitnot(i32) - i32\nbitnot(i32) / f64\nbitnot(i32) == i64\nbitnot(i32) > 1 != true\nbitnot(i32) >= f32\nbitnot(i64 % 1)\nbitnot(i64 % i)\nbitnot(i64 % i32)\nbitnot(i64 * 1)\nbitnot(i64 * i)\nbitnot(i64 * i32)\nbitnot(i64 * i64)\nbitnot(i64 - 1)\nbitnot(i64 - i)\nbitnot(i64 - i64)\nbitnot(i64)\nbitnot(i64) % i32\nbitnot(i64) * f32\nbitnot(i64) < f32\nbitnot(i64) > f64\nbitnot(i64) > i % i\nbitnot(i64) >= i32 ^ f32\nbitnot(i64) ^ f64\nbitnot(i64) not in array\nbitnot(int(f32))\nbitnot(int(f64))\nbitnot(int(i))\nbitnot(int(i32))\nbitnot(int(i64))\nbitnot(last(array))\nbitnot(len(\"bar\"))\nbitnot(len(\"foo\"))\nbitnot(len(list))\nbitnot(max(1))\nbitnot(max(1, i64))\nbitnot(max(i))\nbitnot(max(i32))\nbitnot(min(1))\nbitnot(min(i32))\nbitnot(min(i64))\nbitnot(ok ? 1 : array)\nbitnot(ok ? 1 : ok)\nbitnot(ok ? i : add)\nbitnot(reduce(array, #))\nbitnot(reduce(array, 1))\nbitnot(reduce(list, 1))\nbitnot(score(1))\nbitnot(score(i))\nbitnot(sum(array))\nbitor(1, 1) < i\nbitor(1, 1) == i\nbitor(1, i32) != i64\nbitor(i, -i64)\nbitor(i, i)\nbitor(i, i64)\nbitor(i32, i)\nbitor(i32, i32)\nbitor(i32, i64)\nbitor(i64 % 1, i32)\nbitor(i64, i)\nbitor(i64, i32)\nbitor(i64, i64)\nbitor(min(i64), i)\nbitor(score(i), i64)\nbitshl(bitnot(i), i)\nbitshl(i, i)\nbitshl(i, i32)\nbitshl(i, i64)\nbitshl(i32, i)\nbitshl(i32, i32)\nbitshl(i32, i64)\nbitshl(i64, i32)\nbitshl(i64, i64)\nbitshl(len(array), i)\nbitshl(score(i), i32)\nbitshr(i % 1, i32)\nbitshr(i, 1) - i64\nbitshr(i, i32)\nbitshr(i, i64)\nbitshr(i32, i)\nbitshr(i32, i) - f32\nbitshr(i32, i32)\nbitshr(i32, i64)\nbitshr(i64, i32)\nbitshr(i64, i64)\nbitushr(-i64, i64)\nbitushr(1 % i, i)\nbitushr(1, i) * i\nbitushr(abs(1), i32)\nbitushr(i, i)\nbitushr(i, i) % i64\nbitushr(i, i32)\nbitushr(i, i64)\nbitushr(i32, i)\nbitushr(i32, i32)\nbitushr(i32, i64)\nbitushr(i64, i)\nbitushr(i64, i32)\nbitushr(i64, i64)\nbitxor(-i, i64)\nbitxor(1, i) * i\nbitxor(bitnot(1), -i)\nbitxor(i, i32)\nbitxor(i, i64)\nbitxor(i32, 1) > i64\nbitxor(i32, i)\nbitxor(i32, i) ** f64\nbitxor(i32, i32)\nbitxor(i32, i64)\nbitxor(i32, i64) ** i32\nbitxor(i64, i)\nbitxor(i64, i32)\nbitxor(i64, i64)\nbitxor(score(1), i)\nceil(-0.5)\nceil(-1)\nceil(-f32)\nceil(-f64)\nceil(-i)\nceil(-i32)\nceil(-i64)\nceil(0.5 * 0.5)\nceil(0.5 * 1)\nceil(0.5 * f64)\nceil(0.5 * i)\nceil(0.5 ** 1)\nceil(0.5 ** f64)\nceil(0.5 ** i)\nceil(0.5 + 0.5)\nceil(0.5 + 1)\nceil(0.5 + f32)\nceil(0.5 + f64)\nceil(0.5 + i)\nceil(0.5 + i32)\nceil(0.5 + i64)\nceil(0.5 - 0.5)\nceil(0.5 - f64)\nceil(0.5 - i)\nceil(0.5 / 0.5)\nceil(0.5 / 1)\nceil(0.5 / f32)\nceil(0.5 / i)\nceil(0.5 / i32)\nceil(0.5 ^ 1)\nceil(0.5 ^ f32)\nceil(0.5 ^ i32)\nceil(0.5 ^ i64)\nceil(0.5) != 0.5 * 0.5\nceil(0.5) != i\nceil(0.5) != nil ? score : \"foo\"\nceil(0.5) ** round(f32)\nceil(0.5) - i\nceil(0.5) < i\nceil(0.5) == f32\nceil(0.5) == i ? div : half\nceil(0.5) == i64\nceil(0.5) > f64\nceil(0.5) >= i\nceil(0.5) >= i64\nceil(0.5) ^ i64\nceil(1 % i64)\nceil(1 * 0.5)\nceil(1 * 1)\nceil(1 ** 1)\nceil(1 + 0.5)\nceil(1 + 1)\nceil(1 + f64)\nceil(1 + i)\nceil(1 - 0.5)\nceil(1 - f64)\nceil(1 / 0.5)\nceil(1 / 1)\nceil(1 / f64)\nceil(1 / i64)\nceil(1 ^ f64)\nceil(1 ^ i)\nceil(1 ^ i64)\nceil(1) ** f32\nceil(1) + i32\nceil(1) / i\nceil(1) < f32 ^ i\nceil(1) <= f32\nceil(1) <= i64\nceil(1) == f32\nceil(1) > f32\nceil(1) >= f32\nceil(1) >= i64 ** 0.5\nceil(1) ^ i\nceil(abs(0.5))\nceil(abs(1))\nceil(abs(f32))\nceil(abs(f64))\nceil(abs(i32))\nceil(abs(i64))\nceil(add(1, 1))\nceil(array[1])\nceil(array[i64])\nceil(array[i])\nceil(bitnot(1))\nceil(bitnot(i))\nceil(ceil(0.5))\nceil(ceil(f64))\nceil(ceil(i))\nceil(ceil(i32))\nceil(count(list, ok))\nceil(f32 * 0.5)\nceil(f32 * i)\nceil(f32 * i32)\nceil(f32 ** i)\nceil(f32 ** i32)\nceil(f32 + 1)\nceil(f32 + i64)\nceil(f32 - f32)\nceil(f32 - i)\nceil(f32 - i32)\nceil(f32 - i64)\nceil(f32 / 0.5)\nceil(f32 / f64)\nceil(f32 / i32)\nceil(f32 ^ 0.5)\nceil(f32 ^ 1)\nceil(f32 ^ i64)\nceil(f32)\nceil(f32) != i64\nceil(f32) * i64\nceil(f32) ** -1\nceil(f32) ** i\nceil(f32) + i\nceil(f32) + i64\nceil(f32) - i32\nceil(f32) / i64\nceil(f32) < i\nceil(f32) < i32\nceil(f64 * 1)\nceil(f64 * i)\nceil(f64 ** i)\nceil(f64 ** i64)\nceil(f64 + 1)\nceil(f64 + f32)\nceil(f64 - 0.5)\nceil(f64 - f32)\nceil(f64 - f64)\nceil(f64 - i32)\nceil(f64 / 0.5)\nceil(f64 / f64)\nceil(f64 / i32)\nceil(f64 / i64)\nceil(f64 ^ 0.5)\nceil(f64 ^ f32)\nceil(f64 ^ f64)\nceil(f64 ^ i32)\nceil(f64 ^ i64)\nceil(f64)\nceil(f64) != i\nceil(f64) != i64\nceil(f64) * f32\nceil(f64) ** f32\nceil(f64) - i32\nceil(f64) / f64\nceil(f64) / i / i64\nceil(f64) in array\nceil(false ? add : 0.5)\nceil(find(array, ok))\nceil(findLast(array, true))\nceil(findLastIndex(list, ok))\nceil(findLastIndex(list, true))\nceil(first(array))\nceil(float(0.5))\nceil(float(1))\nceil(float(f64))\nceil(float(i))\nceil(float(i32))\nceil(float(i64))\nceil(floor(0.5))\nceil(floor(1))\nceil(floor(f64))\nceil(floor(i))\nceil(floor(i32))\nceil(floor(i64))\nceil(get(array, 1))\nceil(get(array, i))\nceil(half(0.5))\nceil(half(1))\nceil(half(f64))\nceil(i % i)\nceil(i * 0.5)\nceil(i * i)\nceil(i ** f64)\nceil(i ** i)\nceil(i + 0.5)\nceil(i + 1)\nceil(i + f32)\nceil(i + i64)\nceil(i - i)\nceil(i / f32)\nceil(i / i)\nceil(i / i64)\nceil(i ^ i)\nceil(i ^ i32)\nceil(i)\nceil(i) != i32\nceil(i) * f64\nceil(i) * i64\nceil(i) ** f64\nceil(i) + i\nceil(i) - f32\nceil(i) / f32\nceil(i) <= f64\nceil(i) == i32\nceil(i) > i64\nceil(i32 * i)\nceil(i32 * i32)\nceil(i32 ** i32)\nceil(i32 + 0.5)\nceil(i32 + i32)\nceil(i32 - 0.5)\nceil(i32 - 1)\nceil(i32 - i)\nceil(i32 - i64)\nceil(i32 / 0.5)\nceil(i32 / f32)\nceil(i32 / i)\nceil(i32 / i32)\nceil(i32 ^ 0.5)\nceil(i32 ^ i64)\nceil(i32)\nceil(i32) * 1 ^ i32\nceil(i32) * i32\nceil(i32) ** max(i)\nceil(i32) + f32\nceil(i32) + i\nceil(i32) + i32\nceil(i32) <= i64\nceil(i32) not in array\nceil(i64 % 1)\nceil(i64 % i32)\nceil(i64 * f32)\nceil(i64 * f64)\nceil(i64 ** i32)\nceil(i64 ** i64)\nceil(i64 + 0.5)\nceil(i64 + f64)\nceil(i64 + i32)\nceil(i64 - 0.5)\nceil(i64 - f64)\nceil(i64 / 0.5)\nceil(i64 / 1)\nceil(i64 / f64)\nceil(i64 ^ 0.5)\nceil(i64 ^ i)\nceil(i64 ^ i32)\nceil(i64 ^ i64)\nceil(i64)\nceil(i64) - -1\nceil(i64) - f32\nceil(i64) - i32\nceil(i64) / (0.5 - f32)\nceil(i64) >= f32\nceil(i64) ^ i32\nceil(int(0.5))\nceil(int(f32))\nceil(int(f64))\nceil(int(i))\nceil(int(i64))\nceil(len(\"bar\"))\nceil(len(array))\nceil(len(list))\nceil(max(1, i))\nceil(max(f32, 0.5))\nceil(max(f64))\nceil(max(i))\nceil(mean(array))\nceil(median(array))\nceil(min(0.5, f32))\nceil(min(1))\nceil(min(f32))\nceil(min(f64))\nceil(min(i))\nceil(min(i64))\nceil(ok ? f32 : nil)\nceil(ok ? i32 : \"bar\")\nceil(ok ? i32 : i64)\nceil(reduce(array, #))\nceil(reduce(array, 0.5))\nceil(reduce(list, 1))\nceil(round(0.5))\nceil(round(1))\nceil(round(f32))\nceil(round(f64))\nceil(round(i))\nceil(round(i32))\nceil(round(i64))\nceil(score(1))\nceil(score(i))\nceil(true ? 1 : half)\nceil(true ? 1 : nil)\nceil(true ? f64 : nil)\ncount([\"bar\", score, i], 1 != #)\ncount([\"bar\"], # startsWith #)\ncount([0.5], ok)\ncount([greet], ok)\ncount([i32], f32 != #)\ncount([list, 0.5], # not in list)\ncount([nil], ok)\ncount(array, !ok)\ncount(array, !true)\ncount(array, \"bar\" <= \"bar\")\ncount(array, \"bar\" not endsWith \"bar\")\ncount(array, \"foo\" matches \"foo\")\ncount(array, # != #)\ncount(array, # != 0.5)\ncount(array, # != i)\ncount(array, # != i64)\ncount(array, # != nil)\ncount(array, # < #)\ncount(array, # < i)\ncount(array, # < i32)\ncount(array, # <= #)\ncount(array, # <= 0.5)\ncount(array, # <= 1)\ncount(array, # <= i)\ncount(array, # <= i32)\ncount(array, # == #)\ncount(array, # == 0.5)\ncount(array, # == 1)\ncount(array, # == f32)\ncount(array, # == i)\ncount(array, # == i64)\ncount(array, # == nil)\ncount(array, # > #)\ncount(array, # > 0.5)\ncount(array, # > i)\ncount(array, # > i64)\ncount(array, # >= #)\ncount(array, # >= 0.5)\ncount(array, # >= 1)\ncount(array, # >= f32)\ncount(array, # >= i)\ncount(array, # in array)\ncount(array, # not in array)\ncount(array, 0.5 != #)\ncount(array, 0.5 < #)\ncount(array, 0.5 <= #)\ncount(array, 0.5 <= f32)\ncount(array, 0.5 <= f64)\ncount(array, 0.5 == #)\ncount(array, 0.5 == f32)\ncount(array, 0.5 == i)\ncount(array, 0.5 > #)\ncount(array, 1 != #)\ncount(array, 1 != 0.5)\ncount(array, 1 < #)\ncount(array, 1 <= #)\ncount(array, 1 == #)\ncount(array, 1 >= #)\ncount(array, any(array, true))\ncount(array, div(#, 1) >= #)\ncount(array, f32 <= #)\ncount(array, f32 == #)\ncount(array, f64 < #)\ncount(array, f64 < f32)\ncount(array, f64 <= #)\ncount(array, f64 <= 1)\ncount(array, f64 == #)\ncount(array, false) ** i32\ncount(array, false) + f32\ncount(array, false) - i64\ncount(array, false) / f64\ncount(array, false) > i64 * i64\ncount(array, foo in list)\ncount(array, foo not in list)\ncount(array, i != #)\ncount(array, i < #)\ncount(array, i < 0.5)\ncount(array, i <= #)\ncount(array, i == #)\ncount(array, i > i64)\ncount(array, i >= #)\ncount(array, i32 != #)\ncount(array, i32 != i)\ncount(array, i32 < #)\ncount(array, i32 < 1)\ncount(array, i32 <= #)\ncount(array, i32 <= f32)\ncount(array, i32 == #)\ncount(array, i32 == 0.5)\ncount(array, i32 > #)\ncount(array, i32 >= #)\ncount(array, i32 >= f32)\ncount(array, i32 >= i32)\ncount(array, i64 != i32)\ncount(array, i64 != i64)\ncount(array, i64 < #)\ncount(array, i64 <= #)\ncount(array, i64 == #)\ncount(array, i64 == i64)\ncount(array, i64 > 1)\ncount(array, list != array)\ncount(array, list != nil)\ncount(array, nil != \"foo\")\ncount(array, nil != f64)\ncount(array, nil == 1)\ncount(array, nil == list)\ncount(array, nil == nil)\ncount(array, none(array, false))\ncount(array, not false)\ncount(array, ok or false)\ncount(array, ok)\ncount(array, ok) * i32\ncount(array, ok) ^ i\ncount(array, reduce(list, false))\ncount(array, true == ok)\ncount(array, true) / f64\ncount(filter(list, true), ok)\ncount(groupBy(list, #).String, .div?.array)\ncount(i .. 1, # == i)\ncount(i .. i, ok)\ncount(i32 .. i, # >= #)\ncount(i64 .. 1, nil != f32)\ncount(list, !false)\ncount(list, !true)\ncount(list, \"bar\" not matches \"bar\")\ncount(list, \"foo\" in #)\ncount(list, # != #)\ncount(list, # == #)\ncount(list, # == nil)\ncount(list, # in list)\ncount(list, 0.5 < f32)\ncount(list, 0.5 <= 0.5)\ncount(list, 0.5 <= i64)\ncount(list, 0.5 > 0.5)\ncount(list, 0.5 > 1)\ncount(list, 0.5 > f32)\ncount(list, 1 != i)\ncount(list, 1 >= 0.5)\ncount(list, 1 >= f32)\ncount(list, f32 == i64)\ncount(list, f32 >= f32)\ncount(list, false && false)\ncount(list, false) + -1\ncount(list, false) / f64\ncount(list, false) > f32\ncount(list, foo == #)\ncount(list, i != i64)\ncount(list, i < 0.5)\ncount(list, i <= i64)\ncount(list, i > 1)\ncount(list, i32 < f32)\ncount(list, i32 < i64)\ncount(list, i64 not in array)\ncount(list, nil != #)\ncount(list, nil != false)\ncount(list, nil == list)\ncount(list, not false)\ncount(list, ok)\ncount(list, ok) % i64\ncount(list, ok) / half(1)\ncount(list, ok) / i\ncount(list, ok) >= i32\ncount(list, ok) ^ i\ncount(list, ok) ^ i64\ncount(list, true or ok)\ncount(list, true || true)\ncount(list, true) * f32\ncount(list, true) == i\ncount(map(array, #), # == i32)\ncount(map(array, #), not true)\ncount(map(array, #), ok)\ncount(map(array, false), #)\ncount(map(array, i), ok)\ncount(map(array, i32), 1 == #)\ncount(map(array, i64), f64 != nil)\ncount(map(array, ok), !#)\ncount(map(list, 0.5), \"bar\" == \"foo\")\ncount(map(list, div), ok)\ncount(map(list, f32), # == #)\ncount(map(list, greet), ok)\ncount(map(list, i32), # != i64)\ncount(map(list, ok), #)\ncount(map(list, ok), 0.5 <= i64)\ncount(ok ? array : i64, # > 0.5)\ncount(sort(array), 1 <= #)\ndiv\ndiv != add\ndiv != add != nil\ndiv != add == ok\ndiv != div\ndiv != div != ok\ndiv != div && ok\ndiv != div ? \"bar\" : \"foo\"\ndiv != nil == ok\ndiv != nil || f32 < 0.5\ndiv != reduce(array, div)\ndiv == add\ndiv == add ? 1 : ok\ndiv == div\ndiv == nil ? f32 : half\ndiv == nil ? false : 1\ndiv(-i, array[i64])\ndiv(-i, i)\ndiv(1, i) + i\ndiv(findLast(array, true), i)\ndiv(i, -1)\ndiv(i, i)\ndiv(last(array), 1 * i32)\ndiv(score(1), bitnot(1))\nf32\nf32 != -0.5\nf32 != -1\nf32 != -f32\nf32 != 0.5 != false\nf32 != 0.5 * 1\nf32 != 0.5 * i64\nf32 != 0.5 ** f32\nf32 != 0.5 + 1\nf32 != 0.5 - i64\nf32 != 0.5 / 0.5\nf32 != 0.5 / i32\nf32 != 0.5 == ok\nf32 != 0.5 == true\nf32 != 0.5 ? array : score\nf32 != 0.5 ? foo : f64\nf32 != 0.5 ? true : i32\nf32 != 0.5 ^ 1\nf32 != 0.5 ^ f32\nf32 != 1 && ok\nf32 != 1 * i\nf32 != 1 + i64\nf32 != f32\nf32 != f32 / 0.5\nf32 != f32 / f32\nf32 != f64\nf32 != findLast(array, ok)\nf32 != findLastIndex(array, ok)\nf32 != floor(0.5)\nf32 != half(0.5)\nf32 != i\nf32 != i != true\nf32 != i % 1\nf32 != i % i\nf32 != i ** i64\nf32 != i / f64\nf32 != i32\nf32 != i32 % i\nf32 != i32 * i32\nf32 != i32 + 0.5\nf32 != i64\nf32 != i64 != nil\nf32 != i64 != true\nf32 != i64 ? 0.5 : f64\nf32 != i64 ^ i32\nf32 != int(f32)\nf32 != int(i32)\nf32 != len(array)\nf32 != nil ? true : score\nf32 != nil || ok\nf32 != round(i)\nf32 != score(1)\nf32 != score(1, i)\nf32 * (0.5 + f64)\nf32 * (0.5 + i32)\nf32 * (0.5 - f32)\nf32 * (f64 + f64)\nf32 * (f64 + i64)\nf32 * (f64 - i)\nf32 * -0.5\nf32 * -1\nf32 * -f64\nf32 * -i\nf32 * -i64\nf32 * -len(array)\nf32 * 0.5 * 0.5\nf32 * 0.5 * i\nf32 * 0.5 * i32\nf32 * 0.5 - i32\nf32 * 0.5 / i\nf32 * 0.5 <= i\nf32 * 0.5 ^ f32\nf32 * 0.5 not in array\nf32 * 1 != f32\nf32 * 1 * f64\nf32 * 1 * i32\nf32 * 1 ** 0.5\nf32 * 1 + f64\nf32 * 1 < i64\nf32 * 1 >= i64\nf32 * 1 ^ i64\nf32 * ceil(i)\nf32 * f32\nf32 * f32 * 0.5\nf32 * f32 < i32\nf32 * f32 <= i64\nf32 * f32 > f32 - 1\nf32 * f32 ^ 0.5\nf32 * f32 in array\nf32 * f64\nf32 * f64 + f64\nf32 * f64 + i32\nf32 * f64 / i64\nf32 * f64 >= 1 - i\nf32 * float(i)\nf32 * float(i32)\nf32 * floor(0.5)\nf32 * floor(i)\nf32 * half(0.5)\nf32 * half(1)\nf32 * half(f64)\nf32 * i\nf32 * i != i32\nf32 * i - i\nf32 * i / f64\nf32 * i == i64\nf32 * i32\nf32 * i32 != max(i)\nf32 * i32 * i32\nf32 * i32 ** 0.5\nf32 * i32 >= i\nf32 * i64\nf32 * i64 != f64\nf32 * i64 ** i\nf32 * int(i64)\nf32 * min(i64)\nf32 * reduce(array, 1)\nf32 * reduce(list, 1)\nf32 * round(f64)\nf32 ** (0.5 + 0.5)\nf32 ** (0.5 - 1)\nf32 ** (0.5 / f32)\nf32 ** (1 / f64)\nf32 ** (f32 - 0.5)\nf32 ** (f64 - i64)\nf32 ** (i % 1)\nf32 ** (i64 * i32)\nf32 ** (i64 + 0.5)\nf32 ** (i64 - 1)\nf32 ** -0.5\nf32 ** -f32\nf32 ** -f64\nf32 ** -i\nf32 ** 0.5 != f32\nf32 ** 0.5 + f32\nf32 ** 0.5 >= -i64\nf32 ** 0.5 ^ (f32 / f64)\nf32 ** 0.5 ^ i64\nf32 ** 1 + i64\nf32 ** 1 / i\nf32 ** 1 < f64\nf32 ** 1 < i64\nf32 ** 1 <= i64\nf32 ** ceil(i64)\nf32 ** f32\nf32 ** f32 * f32\nf32 ** f32 ** f32\nf32 ** f32 < f64\nf32 ** f32 ^ f32\nf32 ** f32 ^ f64\nf32 ** f64\nf32 ** f64 ** 1\nf32 ** f64 <= f64\nf32 ** f64 >= i\nf32 ** float(f32)\nf32 ** float(f64)\nf32 ** half(0.5)\nf32 ** half(1)\nf32 ** i\nf32 ** i != half(1)\nf32 ** i ** f64\nf32 ** i ** i32\nf32 ** i <= i64\nf32 ** i32\nf32 ** i32 / i32\nf32 ** i32 == f64\nf32 ** i32 ^ f32\nf32 ** i64\nf32 ** i64 / f32\nf32 ** i64 == i32\nf32 ** i64 > i32\nf32 ** int(f64)\nf32 ** len(\"foo\")\nf32 ** max(f32)\nf32 ** max(i32)\nf32 ** median(array)\nf32 ** reduce(array, 0.5)\nf32 ** round(f64)\nf32 + -0.5\nf32 + -1\nf32 + -f32\nf32 + -i\nf32 + 0.5 ** f32\nf32 + 0.5 + i32\nf32 + 0.5 - i\nf32 + 0.5 - i32\nf32 + 0.5 / f32\nf32 + 0.5 == i\nf32 + 0.5 > i64\nf32 + 0.5 ^ 0.5\nf32 + 1 * 0.5\nf32 + 1 * 1\nf32 + 1 + i\nf32 + 1 - f64\nf32 + 1 - i64\nf32 + 1 / f64\nf32 + 1 < f32\nf32 + 1 < i\nf32 + 1 >= ceil(0.5)\nf32 + bitnot(i64)\nf32 + ceil(-1)\nf32 + ceil(1)\nf32 + ceil(f32)\nf32 + f32\nf32 + f32 * 0.5\nf32 + f32 ** i64\nf32 + f32 - i32\nf32 + f32 / 1\nf32 + f32 > i32\nf32 + f32 ^ 0.5\nf32 + f64\nf32 + f64 in array\nf32 + findIndex(array, true)\nf32 + first(array)\nf32 + float(i)\nf32 + floor(1)\nf32 + floor(i64)\nf32 + half(1)\nf32 + half(f64)\nf32 + i\nf32 + i != i64\nf32 + i + 1\nf32 + i + i\nf32 + i - i32\nf32 + i == f64\nf32 + i32\nf32 + i32 != f32\nf32 + i32 % i\nf32 + i32 / f32\nf32 + i32 <= i\nf32 + i32 ^ 0.5\nf32 + i64\nf32 + i64 != f32\nf32 + i64 + 0.5\nf32 + i64 < f32\nf32 + i64 <= i32\nf32 + i64 >= i\nf32 + i64 >= i32\nf32 + int(1)\nf32 + int(f64)\nf32 + max(0.5)\nf32 + max(f64)\nf32 + reduce(array, #)\nf32 + round(1)\nf32 + round(i32)\nf32 + score(1)\nf32 + score(i)\nf32 - -1\nf32 - -f64\nf32 - -i\nf32 - 0.5 ** i64\nf32 - 0.5 + 0.5\nf32 - 0.5 + f64\nf32 - 0.5 - i64\nf32 - 0.5 < i\nf32 - 0.5 <= i32\nf32 - 0.5 <= i64\nf32 - 0.5 > f64\nf32 - 1 % i64\nf32 - 1 * i64\nf32 - 1 + 1\nf32 - 1 / 0.5\nf32 - 1 < i32\nf32 - 1 <= i32\nf32 - 1 == f32\nf32 - 1 >= f64\nf32 - abs(i32)\nf32 - abs(i64)\nf32 - bitshl(i, i32)\nf32 - ceil(f64)\nf32 - f32\nf32 - f32 ** i32\nf32 - f32 + i\nf32 - f32 == i\nf32 - f64\nf32 - f64 + f64\nf32 - f64 - i\nf32 - f64 <= f32\nf32 - i\nf32 - i >= f32\nf32 - i32\nf32 - i32 * 0.5\nf32 - i32 * f64\nf32 - i32 ** 1\nf32 - i32 <= f32\nf32 - i32 <= i32\nf32 - i32 >= abs(0.5)\nf32 - i64\nf32 - i64 ** 0.5\nf32 - len(array)\nf32 - max(1)\nf32 - min(0.5)\nf32 - min(0.5, 0.5)\nf32 - reduce(array, #)\nf32 - score(1)\nf32 - score(i)\nf32 / (0.5 - i32)\nf32 / (1 + i)\nf32 / (f64 - 0.5)\nf32 / (i - i32)\nf32 / (i32 + 1)\nf32 / -1\nf32 / -f64\nf32 / -i64\nf32 / 0.5 ** f64\nf32 / 0.5 / i\nf32 / 0.5 <= i64\nf32 / 0.5 ^ f64\nf32 / 1 * i32\nf32 / 1 <= f32\nf32 / 1 >= 0.5 ? f64 : foo\nf32 / 1 >= f32\nf32 / 1 >= i32\nf32 / array[1]\nf32 / array[i32]\nf32 / bitnot(i)\nf32 / ceil(1)\nf32 / ceil(f32)\nf32 / count(list, false)\nf32 / f32\nf32 / f32 / 0.5\nf32 / f32 ^ 1\nf32 / f64\nf32 / f64 * i32\nf32 / f64 + f32\nf32 / f64 - i32\nf32 / f64 / 1\nf32 / f64 / f64\nf32 / f64 / i64\nf32 / f64 < i\nf32 / float(1)\nf32 / float(i32)\nf32 / float(i64)\nf32 / floor(i)\nf32 / half(0.5)\nf32 / half(1)\nf32 / half(f64)\nf32 / i\nf32 / i * 0.5\nf32 / i / 0.5\nf32 / i <= i\nf32 / i == i32\nf32 / i > f64\nf32 / i32\nf32 / i32 * 1\nf32 / i32 * f32\nf32 / i32 ** f32\nf32 / i32 + i\nf32 / i32 + i64\nf32 / i32 < f64 + 0.5\nf32 / i32 >= i32\nf32 / i64\nf32 / i64 - f64\nf32 / i64 ^ 0.5\nf32 / int(0.5)\nf32 / int(1 * i64)\nf32 / max(0.5)\nf32 / min(i32)\nf32 / reduce(array, #)\nf32 / reduce(list, 1)\nf32 / score(i)\nf32 < -0.5\nf32 < -f64\nf32 < -i\nf32 < -i64\nf32 < 0.5 + 0.5\nf32 < 0.5 + 1\nf32 < 0.5 ^ f32\nf32 < 0.5 ^ i64\nf32 < 1 % 1\nf32 < 1 + f64\nf32 < 1 ? f64 : i\nf32 < 1 and ok\nf32 < abs(0.5)\nf32 < ceil(0.5)\nf32 < ceil(f64)\nf32 < count(array, ok)\nf32 < count(list, ok)\nf32 < f32\nf32 < f32 / 1\nf32 < f32 ^ f64\nf32 < f64\nf32 < f64 ** 1\nf32 < f64 + 0.5\nf32 < f64 + i\nf32 < f64 / i64\nf32 < f64 ? 0.5 : array\nf32 < f64 ? div : i32\nf32 < f64 and ok\nf32 < floor(0.5)\nf32 < floor(i)\nf32 < half(0.5)\nf32 < half(1)\nf32 < i\nf32 < i != ok\nf32 < i / 1\nf32 < i ? 1 : i\nf32 < i32\nf32 < i32 ** i64\nf32 < i32 ? f64 : i\nf32 < i32 ? greet : i32\nf32 < i32 or ok\nf32 < i64\nf32 < i64 - i32\nf32 < i64 / 0.5\nf32 < i64 ? foo : i32\nf32 < i64 ? foo?.Bar : div\nf32 < i64 ^ 0.5\nf32 < max(i)\nf32 < max(i32, 1)\nf32 < min(0.5)\nf32 < reduce(array, #)\nf32 < reduce(list, 1)\nf32 < round(i64)\nf32 <= -0.5\nf32 <= -1\nf32 <= -f64\nf32 <= -i64\nf32 <= 0.5 != true\nf32 <= 0.5 * 0.5\nf32 <= 0.5 + i\nf32 <= 0.5 / i64\nf32 <= 0.5 ? i64 : i\nf32 <= 1 - 0.5\nf32 <= 1 == nil\nf32 <= 1 ? f64 : add\nf32 <= 1 ? i64 : i64 % 1\nf32 <= 1 ? list : div\nf32 <= 1 || ok\nf32 <= f32\nf32 <= f32 * 1\nf32 <= f32 + f64\nf32 <= f32 + i\nf32 <= f32 ? greet : half\nf32 <= f64\nf32 <= findIndex(list, ok) * f64\nf32 <= float(1)\nf32 <= float(i)\nf32 <= float(i64)\nf32 <= float(toJSON(1))\nf32 <= floor(0.5)\nf32 <= half(0.5)\nf32 <= half(1)\nf32 <= half(f64)\nf32 <= i\nf32 <= i == nil\nf32 <= i and i32 <= f32\nf32 <= i32\nf32 <= i32 ** i32\nf32 <= i32 + 1\nf32 <= i32 / 1\nf32 <= i64\nf32 <= i64 ** i64\nf32 <= i64 - f32\nf32 <= i64 ? f64 : f64\nf32 <= i64 ^ i32\nf32 <= i64 || nil in array\nf32 <= last(array)\nf32 <= min(0.5)\nf32 <= min(1)\nf32 <= min(f64)\nf32 <= round(0.5)\nf32 <= score(1)\nf32 == -0.5\nf32 == -1\nf32 == -f32\nf32 == -i32\nf32 == -i64\nf32 == 0.5 != ok\nf32 == 0.5 * 0.5\nf32 == 0.5 * 1\nf32 == 0.5 ** i32\nf32 == 0.5 + 1\nf32 == 0.5 / i32\nf32 == 0.5 / i64\nf32 == 0.5 ? array : greet\nf32 == 0.5 ? true : score\nf32 == 0.5 ^ 0.5\nf32 == 0.5 || f64 >= 1\nf32 == 1 != nil\nf32 == 1 + f32\nf32 == 1 - 1\nf32 == 1 - i\nf32 == 1 == ok\nf32 == 1 ? foo : f32\nf32 == 1 ? ok : add != nil\nf32 == add(i, 1)\nf32 == array[i32]\nf32 == bitnot(i)\nf32 == ceil(1)\nf32 == ceil(i32)\nf32 == ceil(i64)\nf32 == f32\nf32 == f32 ? f32 : list\nf32 == f32 and ok\nf32 == f64\nf32 == f64 + f64\nf32 == f64 ^ 1\nf32 == findLastIndex(array, ok)\nf32 == first(array)\nf32 == float(0.5)\nf32 == float(1)\nf32 == floor(f64)\nf32 == half(1)\nf32 == half(f64)\nf32 == i\nf32 == i != nil\nf32 == i - 0.5\nf32 == i - i64\nf32 == i32\nf32 == i32 + i32\nf32 == i32 ? 0.5 : array\nf32 == i32 ? i64 : i64\nf32 == i32 ? true : half\nf32 == i32 ^ i32\nf32 == i32 or ok\nf32 == i64\nf32 == i64 * i64\nf32 == i64 + 0.5\nf32 == i64 - 0.5\nf32 == i64 - 1\nf32 == i64 ? div : 0.5\nf32 == last(array)\nf32 == max(f64)\nf32 == min(0.5)\nf32 == min(f32)\nf32 == nil ? array : add\nf32 == nil ? i : div\nf32 == round(1)\nf32 == score(1)\nf32 == score(i)\nf32 > -(0.5 / 1)\nf32 > -0.5\nf32 > -f32\nf32 > -i32\nf32 > 0.5 / f32\nf32 > 0.5 / i32\nf32 > 0.5 == true ? i32 : array\nf32 > 0.5 ? half : false\nf32 > 0.5 ^ f64\nf32 > 1 ** i\nf32 > 1 ? 1 : false\nf32 > 1 ? list : \"foo\"\nf32 > abs(1)\nf32 > abs(f32)\nf32 > abs(f64)\nf32 > count(array, ok)\nf32 > f32\nf32 > f32 + f32\nf32 > f32 - f32\nf32 > f32 == nil\nf32 > f64\nf32 > f64 * i\nf32 > f64 ** 0.5\nf32 > float(0.5)\nf32 > float(i32)\nf32 > floor(1)\nf32 > half(1)\nf32 > half(f64)\nf32 > i\nf32 > i != ok\nf32 > i * 1\nf32 > i ? array : 1\nf32 > i ? foo : list\nf32 > i32\nf32 > i32 != nil\nf32 > i32 * f64\nf32 > i32 ? 0.5 : greet\nf32 > i32 and ok\nf32 > i64\nf32 > i64 % i64\nf32 > i64 ** i\nf32 > i64 + 0.5\nf32 > i64 - i64\nf32 > i64 ? i : 0.5\nf32 > mean(array)\nf32 > min(f32)\nf32 > min(i64)\nf32 > reduce(array, #)\nf32 > reduce(array, i64)\nf32 > reduce(list, f32)\nf32 > round(0.5)\nf32 > score(1, 1)\nf32 >= -0.5\nf32 >= -f32\nf32 >= -f64\nf32 >= 0.5 * f64\nf32 >= 0.5 / i64\nf32 >= 0.5 ? i64 : nil\nf32 >= 0.5 ^ i64\nf32 >= 1 == false\nf32 >= 1 == ok ? add : array\nf32 >= 1 ? i : 1\nf32 >= abs(0.5)\nf32 >= abs(f32)\nf32 >= abs(i)\nf32 >= array[1]\nf32 >= array[i32]\nf32 >= bitnot(i32)\nf32 >= count(list, false)\nf32 >= f32\nf32 >= f32 ** 1\nf32 >= f32 - i64\nf32 >= f32 ? half : greet\nf32 >= f32 or nil != ok\nf32 >= f64\nf32 >= f64 && ok\nf32 >= f64 ** 0.5\nf32 >= f64 ** i32\nf32 >= f64 - f64\nf32 >= f64 / i64\nf32 >= f64 or ok\nf32 >= float(0.5)\nf32 >= half(f64)\nf32 >= i\nf32 >= i - f32\nf32 >= i ? 1 : nil\nf32 >= i ^ i\nf32 >= i32\nf32 >= i32 % i\nf32 >= i32 - f32\nf32 >= i32 / i64\nf32 >= i32 ? f32 : 0.5\nf32 >= i32 or not ok\nf32 >= i64\nf32 >= i64 * i32\nf32 >= i64 + f64\nf32 >= i64 / 1\nf32 >= len(\"bar\")\nf32 >= max(i)\nf32 >= max(i64)\nf32 >= reduce(array, #)\nf32 >= score(1)\nf32 >= sum(array)\nf32 ^ (0.5 * f64)\nf32 ^ (0.5 / 1)\nf32 ^ (0.5 / i)\nf32 ^ (1 * i)\nf32 ^ (1 + f64)\nf32 ^ (f32 * i64)\nf32 ^ (f64 * f64)\nf32 ^ (f64 - 1)\nf32 ^ (f64 / i)\nf32 ^ (i64 * f64)\nf32 ^ (i64 * i32)\nf32 ^ (i64 * i64)\nf32 ^ (i64 + i64)\nf32 ^ (i64 - f32)\nf32 ^ -0.5\nf32 ^ -1\nf32 ^ -i32\nf32 ^ 0.5 ** i32\nf32 ^ 0.5 - f32\nf32 ^ 0.5 - i32\nf32 ^ 0.5 == i64\nf32 ^ 0.5 ^ 0.5\nf32 ^ 1 != i64\nf32 ^ 1 / f32\nf32 ^ 1 >= -0.5\nf32 ^ abs(1)\nf32 ^ abs(f32)\nf32 ^ array[i64]\nf32 ^ array[i]\nf32 ^ bitnot(1)\nf32 ^ bitor(1, i32)\nf32 ^ f32\nf32 ^ f32 ^ 0.5\nf32 ^ f32 in array\nf32 ^ f64\nf32 ^ f64 ** f64\nf32 ^ f64 / 1 * 1\nf32 ^ f64 / f64\nf32 ^ f64 == i64\nf32 ^ f64 not in array\nf32 ^ floor(0.5)\nf32 ^ floor(1)\nf32 ^ half(1)\nf32 ^ half(f64)\nf32 ^ i\nf32 ^ i - f64\nf32 ^ i <= i\nf32 ^ i >= f64\nf32 ^ i ^ f32\nf32 ^ i32\nf32 ^ i32 ** i64\nf32 ^ i64\nf32 ^ i64 ** 1\nf32 ^ i64 + i64\nf32 ^ i64 - f32\nf32 ^ i64 >= f64\nf32 ^ i64 ^ f32\nf32 ^ int(i32)\nf32 ^ len(\"foo\")\nf32 ^ len(array)\nf32 ^ min(1)\nf32 ^ min(f64)\nf32 ^ min(i)\nf32 ^ reduce(array, 1)\nf32 ^ round(i)\nf32 ^ round(i32)\nf32 ^ score(i)\nf32 ^ score(reduce(array, #))\nf32 in [i]\nf32 in [nil]\nf32 in array\nf32 in array == nil\nf32 in array ? 1 : i\nf32 in array ? false : 0.5\nf32 in array ? nil : \"bar\"\nf32 in groupBy(array, #)\nf32 in groupBy(list, #)\nf32 in groupBy(list, ok)\nf32 in map(array, #)\nf32 not in [f32, \"bar\"]\nf32 not in array\nf32 not in array ? foo : i\nf32 not in array ? i32 : div\nf64\nf64 != -0.5\nf64 != -1\nf64 != -f32\nf64 != -i\nf64 != -i64\nf64 != 0.5 != false\nf64 != 0.5 ** 1\nf64 != 0.5 ** f64\nf64 != 0.5 + f32\nf64 != 0.5 ^ 0.5\nf64 != 1 - 1\nf64 != 1 / 0.5\nf64 != 1 ? half : div\nf64 != 1 ^ i\nf64 != abs(i32)\nf64 != bitnot(i64)\nf64 != ceil(i)\nf64 != f32\nf64 != f32 != nil\nf64 != f32 + 0.5\nf64 != f32 + i32\nf64 != f32 - i32\nf64 != f32 ? array : nil\nf64 != f32 ? i32 : \"bar\"\nf64 != f32 ? ok : i\nf64 != f32 or greet == nil\nf64 != f64\nf64 != f64 * f32\nf64 != f64 ? f64 : true\nf64 != first(array)\nf64 != floor(1)\nf64 != half(0.5)\nf64 != half(1)\nf64 != i\nf64 != i * 0.5\nf64 != i / 1\nf64 != i / f32\nf64 != i ^ f64\nf64 != i32\nf64 != i32 * f32\nf64 != i32 == ok\nf64 != i32 ? f64 : ok\nf64 != i32 ? foo : ok\nf64 != i32 ^ i32\nf64 != i64\nf64 != i64 * f64\nf64 != i64 - i32\nf64 != i64 or ok\nf64 != int(i64)\nf64 != min(f64)\nf64 != nil != ok\nf64 != nil && f64 > 0.5\nf64 != nil == true\nf64 != nil ? array : foo\nf64 != nil ? f64 : half\nf64 != nil ? i64 : 0.5\nf64 != nil ? nil : half\nf64 != round(1)\nf64 * (0.5 - 1)\nf64 * (i64 + 0.5)\nf64 * -1\nf64 * -f32\nf64 * -f64\nf64 * 0.5 * 1\nf64 * 0.5 * i64\nf64 * 0.5 ** 0.5\nf64 * 0.5 / 0.5\nf64 * 0.5 / f32\nf64 * 0.5 / i32\nf64 * 0.5 < f32\nf64 * 0.5 <= i\nf64 * 0.5 == f64\nf64 * 0.5 ^ 1\nf64 * 1 * f64\nf64 * 1 * i32\nf64 * 1 ** 1\nf64 * 1 + f64\nf64 * 1 - i32\nf64 * 1 <= 1 + 1\nf64 * 1 == i64\nf64 * 1 > f32\nf64 * 1 > f64\nf64 * 1 >= f64\nf64 * bitnot(i64)\nf64 * ceil(i)\nf64 * ceil(i64)\nf64 * f32\nf64 * f32 != i\nf64 * f32 / i64\nf64 * f32 > f64\nf64 * f32 > i\nf64 * f64\nf64 * f64 * f64\nf64 * f64 / 1\nf64 * f64 <= f64\nf64 * f64 > f64\nf64 * f64 in array\nf64 * float(f32)\nf64 * floor(0.5)\nf64 * get(array, 1)\nf64 * half(f64)\nf64 * i\nf64 * i / f64\nf64 * i32\nf64 * i32 != i64 * f64\nf64 * i32 - i32\nf64 * i64\nf64 * i64 ** i\nf64 * i64 == i\nf64 * i64 > i32\nf64 * i64 ^ i32\nf64 * median(array)\nf64 * min(1)\nf64 * min(f64)\nf64 * min(i)\nf64 * round(1)\nf64 * round(i64)\nf64 ** (0.5 - i)\nf64 ** (0.5 / i64)\nf64 ** (1 * i)\nf64 ** (f64 * i32)\nf64 ** (f64 / 1)\nf64 ** (i * 1)\nf64 ** (i * i64)\nf64 ** (i32 * i)\nf64 ** (i32 + i32)\nf64 ** (i32 - f64)\nf64 ** (i32 / i64)\nf64 ** (i64 % 1)\nf64 ** (i64 + 0.5)\nf64 ** (i64 + i64)\nf64 ** (i64 - i32)\nf64 ** (i64 / 0.5)\nf64 ** -0.5\nf64 ** -1\nf64 ** -i\nf64 ** 0.5 ** f32\nf64 ** 0.5 == i32\nf64 ** 1 + f64\nf64 ** 1 / i\nf64 ** 1 < f32\nf64 ** 1 > i32\nf64 ** 1 ^ f32\nf64 ** abs(i)\nf64 ** bitand(1, 1)\nf64 ** ceil(0.5)\nf64 ** ceil(f64)\nf64 ** f32\nf64 ** f32 != f64\nf64 ** f32 ** f64\nf64 ** f32 > f64\nf64 ** f64\nf64 ** f64 - f32\nf64 ** f64 / min(1)\nf64 ** f64 <= f32\nf64 ** f64 <= i64\nf64 ** f64 ^ 0.5\nf64 ** half(0.5)\nf64 ** i\nf64 ** i * f64\nf64 ** i ** i\nf64 ** i + -i32\nf64 ** i + f32\nf64 ** i32\nf64 ** i32 != f64\nf64 ** i32 > f64\nf64 ** i64\nf64 ** i64 + f32\nf64 ** i64 <= f32\nf64 ** i64 not in map(array, 0.5)\nf64 ** last(array)\nf64 ** len(\"bar\")\nf64 ** max(i)\nf64 ** min(f32)\nf64 ** reduce(array, #)\nf64 ** reduce(list, i32)\nf64 ** score(i)\nf64 + -0.5\nf64 + -1\nf64 + -f64\nf64 + -i\nf64 + -i32\nf64 + 0.5 / f32\nf64 + 0.5 < i32\nf64 + 0.5 <= f64\nf64 + 0.5 <= float(f32)\nf64 + 0.5 <= i\nf64 + 0.5 > f64\nf64 + 0.5 ^ i\nf64 + 0.5 ^ i64\nf64 + 1 % i\nf64 + 1 * 0.5\nf64 + 1 * 1\nf64 + 1 * f64\nf64 + 1 ** 0.5\nf64 + 1 + i32\nf64 + 1 / i64\nf64 + 1 ^ i\nf64 + 1 not in map(array, #)\nf64 + ceil(0.5)\nf64 + count(list, true)\nf64 + f32\nf64 + f32 == i != true\nf64 + f64\nf64 + f64 < f32\nf64 + f64 <= i32\nf64 + f64 ^ i32\nf64 + float(f64)\nf64 + floor(f64)\nf64 + get(array, i32)\nf64 + half(0.5)\nf64 + half(1)\nf64 + i\nf64 + i + 0.5\nf64 + i / 0.5\nf64 + i / i32\nf64 + i > 0.5 != true\nf64 + i > f64\nf64 + i >= f64\nf64 + i32\nf64 + i32 != i64\nf64 + i32 % i32\nf64 + i32 ** 1\nf64 + i32 > i64\nf64 + i64\nf64 + i64 + i64\nf64 + i64 / f64\nf64 + i64 > i32 / i\nf64 + i64 > i64\nf64 + i64 ^ i32\nf64 + reduce(array, #)\nf64 + reduce(list, f32)\nf64 + score(1)\nf64 - -0.5\nf64 - -1\nf64 - -f64\nf64 - -i\nf64 - -i64\nf64 - 0.5 - 0.5\nf64 - 0.5 - 1\nf64 - 0.5 - i32\nf64 - 0.5 >= f64\nf64 - 0.5 ^ i64\nf64 - 1 * i32\nf64 - 1 + i64\nf64 - 1 - f64\nf64 - 1 / i64\nf64 - 1 < f32\nf64 - 1 < f32 ? i64 : false\nf64 - 1 >= len(array)\nf64 - 1 ^ i64\nf64 - f32\nf64 - f32 != i64\nf64 - f32 + f32\nf64 - f32 < f64\nf64 - f32 ^ f32\nf64 - f64\nf64 - f64 + -1\nf64 - f64 < f64\nf64 - float(f32)\nf64 - floor(1)\nf64 - half(1)\nf64 - i\nf64 - i + 0.5\nf64 - i + 1\nf64 - i + i32\nf64 - i / i\nf64 - i ^ f32\nf64 - i32\nf64 - i32 / 0.5\nf64 - i32 >= i64\nf64 - i32 ^ 0.5\nf64 - i64\nf64 - i64 ** i32\nf64 - int(i)\nf64 - int(i32)\nf64 - reduce(array, -#)\nf64 - round(1)\nf64 - score(i)\nf64 / (0.5 - 1)\nf64 / (0.5 - i64)\nf64 / (f32 + 1)\nf64 / (i + 0.5)\nf64 / (i32 + i64)\nf64 / -0.5\nf64 / -1\nf64 / -f64\nf64 / -i\nf64 / -i32\nf64 / -i64\nf64 / 0.5 != f64\nf64 / 0.5 * f32\nf64 / 0.5 + f64\nf64 / 0.5 / 1\nf64 / 0.5 < i32\nf64 / 0.5 == i32\nf64 / 0.5 >= i64\nf64 / 1 != i\nf64 / 1 * i32\nf64 / 1 ** 1\nf64 / 1 / i\nf64 / 1 <= i64\nf64 / 1 ^ i\nf64 / abs(f64)\nf64 / array[1]\nf64 / array[i64]\nf64 / ceil(i32)\nf64 / f32\nf64 / f32 * i\nf64 / f32 * i64\nf64 / f32 / 0.5\nf64 / f32 == f32\nf64 / f32 ^ 0.5\nf64 / f64\nf64 / f64 / 0.5\nf64 / f64 >= f64\nf64 / f64 >= i32\nf64 / f64 >= i64\nf64 / float(1)\nf64 / float(f64)\nf64 / floor(i64)\nf64 / get(array, 1)\nf64 / get(array, i32)\nf64 / half(0.5)\nf64 / half(1)\nf64 / i\nf64 / i != f64\nf64 / i ** 0.5\nf64 / i ** f32\nf64 / i + i32\nf64 / i == i64\nf64 / i >= i\nf64 / i32\nf64 / i32 != 0.5 - i64\nf64 / i32 == f64 ** i\nf64 / i32 == i32\nf64 / i32 >= f32\nf64 / i64\nf64 / i64 < f64\nf64 / int(f32)\nf64 / last(array)\nf64 / max(i)\nf64 / reduce(array, #)\nf64 / reduce(array, f64)\nf64 / reduce(list, f32)\nf64 / round(1)\nf64 / round(i64)\nf64 / score(1)\nf64 < -0.5\nf64 < -i32\nf64 < -i64\nf64 < 0.5 + i64\nf64 < 0.5 / 0.5\nf64 < 0.5 / i\nf64 < 0.5 == true\nf64 < 0.5 ? f64 : array\nf64 < 1 % 1\nf64 < 1 * 0.5\nf64 < 1 ** i32\nf64 < 1 / f32\nf64 < 1 == false\nf64 < 1 ? i : \"foo\"\nf64 < abs(1)\nf64 < abs(f32)\nf64 < array[i64]\nf64 < bitnot(1)\nf64 < ceil(f64)\nf64 < count(array, false)\nf64 < f32\nf64 < f32 * i\nf64 < f32 / i64\nf64 < f32 ^ 1\nf64 < f32 ^ f64\nf64 < f64\nf64 < f64 == ok\nf64 < floor(i64)\nf64 < get(array, i)\nf64 < i\nf64 < i && \"bar\" < \"bar\"\nf64 < i && ok\nf64 < i ** i32\nf64 < i + 1\nf64 < i ? 0.5 : \"bar\"\nf64 < i ? div : nil\nf64 < i32\nf64 < i32 * f64\nf64 < i32 * i\nf64 < i32 ** f32\nf64 < i32 ** i64\nf64 < i32 + f32\nf64 < i32 + f64\nf64 < i32 + i64\nf64 < i32 ? false : ok\nf64 < i32 ? true : 1\nf64 < i32 ^ 1\nf64 < i32 ^ i32\nf64 < i64\nf64 < i64 * f64\nf64 < i64 ^ i\nf64 < int(0.5)\nf64 < max(1)\nf64 < max(f64, i32)\nf64 < min(0.5, i64)\nf64 < min(f32)\nf64 < min(f64, f32)\nf64 < min(i32)\nf64 < round(0.5)\nf64 < score(1)\nf64 <= -0.5\nf64 <= -1\nf64 <= -i\nf64 <= -i32\nf64 <= 0.5 != false\nf64 <= 0.5 + 0.5\nf64 <= 0.5 / f32\nf64 <= 0.5 ? greet : f64\nf64 <= 0.5 ? score : array\nf64 <= 1 * i32\nf64 <= 1 + 0.5\nf64 <= 1 / i\nf64 <= 1 == nil\nf64 <= 1 ? \"bar\" : array\nf64 <= 1 ? half : list\nf64 <= 1 ^ f64\nf64 <= abs(0.5)\nf64 <= abs(i)\nf64 <= array[i64]\nf64 <= ceil(i)\nf64 <= f32\nf64 <= f32 ** 0.5\nf64 <= f32 - i64\nf64 <= f32 ? f64 : div\nf64 <= f32 ^ f32\nf64 <= f64\nf64 <= f64 != ok\nf64 <= f64 + f64\nf64 <= f64 + i32\nf64 <= f64 - 1\nf64 <= f64 ^ i\nf64 <= float(i)\nf64 <= float(i64)\nf64 <= half(0.5)\nf64 <= half(1)\nf64 <= i\nf64 <= i * i64\nf64 <= i - 1\nf64 <= i - f32\nf64 <= i ^ f64\nf64 <= i32\nf64 <= i32 ** 1\nf64 <= i32 ? div : foo\nf64 <= i32 or all(list, ok)\nf64 <= i64\nf64 <= i64 + 1\nf64 <= i64 - 0.5\nf64 <= int(f32)\nf64 <= max(i)\nf64 <= max(i64, i32)\nf64 <= min(i32)\nf64 <= min(i64)\nf64 <= reduce(array, #)\nf64 == -0.5\nf64 == -1\nf64 == -f32\nf64 == -f64\nf64 == -i\nf64 == -i64\nf64 == 0.5 ** 0.5\nf64 == 0.5 - i\nf64 == 0.5 ? 0.5 : i64\nf64 == 0.5 ? 1 : 1\nf64 == 1 != ok\nf64 == 1 % 1\nf64 == 1 * i64\nf64 == 1 ** 0.5\nf64 == 1 == false\nf64 == abs(0.5)\nf64 == abs(i64)\nf64 == ceil(i)\nf64 == f32\nf64 == f32 && ok\nf64 == f32 + len(array)\nf64 == f32 ? 0.5 : i\nf64 == f32 ^ i32\nf64 == f64\nf64 == f64 ** i\nf64 == f64 - f64\nf64 == float(0.5)\nf64 == floor(0.5)\nf64 == half(0.5)\nf64 == half(f64)\nf64 == i\nf64 == i != false\nf64 == i * 1\nf64 == i ? i32 : score\nf64 == i32\nf64 == i32 == ok ? 1 : list\nf64 == i32 == true\nf64 == i32 || ok\nf64 == i64\nf64 == i64 / i\nf64 == i64 ? 1 : 0.5\nf64 == i64 ? greet : i32\nf64 == int(f32)\nf64 == max(0.5)\nf64 == max(i)\nf64 == min(i32)\nf64 == nil && ok\nf64 == nil ? 0.5 : add\nf64 == nil ? foo : \"foo\"\nf64 == reduce(list, i32)\nf64 == round(i)\nf64 == score(i, 1)\nf64 > -0.5\nf64 > -1\nf64 > -f64\nf64 > -i\nf64 > -i32\nf64 > 0.5 ** f32\nf64 > 0.5 / i\nf64 > 0.5 ^ i\nf64 > 0.5 or i <= 0.5\nf64 > 1 + f32\nf64 > 1 + i32\nf64 > 1 ? div : i32\nf64 > 1 ^ i32\nf64 > array[i64]\nf64 > ceil(0.5)\nf64 > ceil(1)\nf64 > ceil(f32)\nf64 > f32\nf64 > f32 / 1\nf64 > f64\nf64 > f64 - 0.5\nf64 > float(0.5 * i64)\nf64 > floor(f64)\nf64 > get(array, 1)\nf64 > half(0.5)\nf64 > half(1)\nf64 > half(f64)\nf64 > i\nf64 > i - 0.5\nf64 > i32\nf64 > i32 == ok\nf64 > i32 ? f32 : array\nf64 > i32 ? list : half\nf64 > i32 ^ i32\nf64 > i32 ^ i64\nf64 > i64\nf64 > i64 - 1\nf64 > i64 ? array : half\nf64 > i64 ? list : div\nf64 > i64 || ok or ok\nf64 > int(f32)\nf64 > last(array)\nf64 > max(0.5)\nf64 > max(0.5, i64)\nf64 > max(f32)\nf64 > median(array)\nf64 > min(f32)\nf64 >= -0.5\nf64 >= -1\nf64 >= -i64\nf64 >= 0.5 + i32\nf64 >= 0.5 - 1\nf64 >= 0.5 - f32\nf64 >= 0.5 / i64\nf64 >= 0.5 ? list : i32\nf64 >= 0.5 ^ i64\nf64 >= array[1]\nf64 >= f32\nf64 >= f32 - i32\nf64 >= f32 ^ 1\nf64 >= f64\nf64 >= f64 != nil\nf64 >= f64 != ok\nf64 >= findIndex(array, ok)\nf64 >= floor(f32)\nf64 >= floor(i)\nf64 >= half(0.5)\nf64 >= half(1)\nf64 >= i\nf64 >= i * 0.5\nf64 >= i ** 0.5\nf64 >= i ** i32\nf64 >= i / i32\nf64 >= i ^ 1\nf64 >= i32\nf64 >= i32 - f64\nf64 >= i32 ? ok : add\nf64 >= i32 ^ 1\nf64 >= i64\nf64 >= i64 + f64\nf64 >= i64 ? 0.5 : score\nf64 >= i64 ? 1 : f32\nf64 >= max(1)\nf64 >= median(array)\nf64 >= reduce(array, #)\nf64 >= reduce(array, i32)\nf64 >= score(i)\nf64 ^ (0.5 * i)\nf64 ^ (0.5 + 1)\nf64 ^ (1 * f64)\nf64 ^ (1 - 1)\nf64 ^ (f32 + 1)\nf64 ^ (f32 - 0.5)\nf64 ^ (f32 - i)\nf64 ^ (f32 / -f64)\nf64 ^ (i32 - 1)\nf64 ^ (i32 / f32)\nf64 ^ (i64 - 1)\nf64 ^ -0.5\nf64 ^ -i32\nf64 ^ 0.5 * f64\nf64 ^ 0.5 ** f32\nf64 ^ 0.5 ** i32\nf64 ^ 0.5 > ceil(f32)\nf64 ^ 0.5 > i\nf64 ^ 0.5 >= f64\nf64 ^ 0.5 >= i32\nf64 ^ 0.5 ^ i32\nf64 ^ 0.5 not in array\nf64 ^ 1 ** i\nf64 ^ 1 ** i64\nf64 ^ 1 ^ i\nf64 ^ abs(0.5)\nf64 ^ array[i64]\nf64 ^ f32\nf64 ^ f32 ** 1\nf64 ^ f32 < score(1)\nf64 ^ f32 >= i32\nf64 ^ f64\nf64 ^ f64 - -i\nf64 ^ f64 == i32\nf64 ^ f64 > f64\nf64 ^ f64 ^ i\nf64 ^ f64 ^ i64\nf64 ^ findIndex(array, true)\nf64 ^ float(abs(i))\nf64 ^ floor(f64)\nf64 ^ half(1)\nf64 ^ half(f64)\nf64 ^ i\nf64 ^ i ** 1\nf64 ^ i + f32\nf64 ^ i + i32\nf64 ^ i <= i32\nf64 ^ i ^ i64\nf64 ^ i32\nf64 ^ i32 / f64\nf64 ^ i32 <= i32\nf64 ^ i32 >= i\nf64 ^ i64\nf64 ^ i64 ** i64\nf64 ^ int(0.5)\nf64 ^ int(f64)\nf64 ^ last(array)\nf64 ^ len(list)\nf64 ^ min(1)\nf64 ^ reduce(array, #)\nf64 ^ round(i)\nf64 ^ score(1)\nf64 in array\nf64 in array != nil\nf64 in groupBy(list, i64)\nf64 not in array\nf64 not in array != ok\nf64 not in array != true\nf64 not in array == true\nf64 not in groupBy(array, #)\nf64 not in groupBy(array, bitnand(#, 1))\nf64 not in i .. i32\nf64 not in map(array, #)\nfalse != false ? foo : greet\nfalse && i not in array\nfalse && nil not in array\nfalse && nil not in list\nfalse == nil ? i32 : f64\nfalse == nil ? i32 : i32\nfalse ? \"bar\" : 0.5 - i\nfalse ? \"foo\" : f32 * i\nfalse ? \"foo\" : f32 / i32\nfalse ? \"foo\" : foo.Qux\nfalse ? add : 1 / i ^ 0.5\nfalse ? add : i64 - i\nfalse ? div : i64 ** i\nfalse ? f32 : foo.Qux\nfalse ? f64 : 0.5 != i32\nfalse ? f64 : 0.5 ** i32\nfalse ? f64 : 1 >= i\nfalse ? f64 : foo?.Qux\nfalse ? f64 : i ^ f32\nfalse ? false : foo?.Qux\nfalse ? foo : i32 - i\nfalse ? half : 0.5 == f32\nfalse ? half : i ^ i64\nfalse ? i : foo?.Qux\nfalse ? i : nil in list\nfalse ? i32 : 1 <= i32\nfalse ? i32 : foo.Qux\nfalse ? i64 : 1 <= f32\nfalse ? i64 : foo.Qux\nfalse ? i64 : i64 ** i64\nfalse ? list : list == list\nfalse ? nil : foo?.Qux\nfalse ? nil : i32 > i32\nfalse ? ok : foo.String()\nfalse ? ok : i64 < i64\nfalse and false || 0.5 > f32\nfalse or 1 not in array\nfalse or true or ok\nfalse or true || ok\nfilter(1 .. 1, # > i)\nfilter(1 .. i, i >= #)\nfilter([0.5], # > 0.5)\nfilter([nil], # != false)\nfilter(array, !true)\nfilter(array, \"bar\" != \"foo\")\nfilter(array, \"foo\" == nil)\nfilter(array, # != #)\nfilter(array, # != f32)\nfilter(array, # != f64)\nfilter(array, # != i)\nfilter(array, # != i64)\nfilter(array, # < #)\nfilter(array, # < f64)\nfilter(array, # <= #)\nfilter(array, # <= 1)\nfilter(array, # <= bitshr(#, #))\nfilter(array, # <= i)\nfilter(array, # <= i64)\nfilter(array, # == #)\nfilter(array, # == 0.5)\nfilter(array, # == f32)\nfilter(array, # == f64)\nfilter(array, # == i)\nfilter(array, # == i32)\nfilter(array, # == i64)\nfilter(array, # == nil)\nfilter(array, # > #)\nfilter(array, # > 0.5)\nfilter(array, # > 1)\nfilter(array, # > i)\nfilter(array, # > i32)\nfilter(array, # >= #)\nfilter(array, # >= 0.5)\nfilter(array, # >= 1)\nfilter(array, # >= f32)\nfilter(array, # >= i)\nfilter(array, # >= i32)\nfilter(array, # >= i64)\nfilter(array, 0.5 != #)\nfilter(array, 0.5 != f64)\nfilter(array, 0.5 != i)\nfilter(array, 0.5 < #)\nfilter(array, 0.5 < f64)\nfilter(array, 0.5 < i32)\nfilter(array, 0.5 <= #)\nfilter(array, 0.5 <= i)\nfilter(array, 0.5 <= i32)\nfilter(array, 0.5 == #)\nfilter(array, 0.5 == f64)\nfilter(array, 0.5 > #)\nfilter(array, 0.5 >= #)\nfilter(array, 1 != #)\nfilter(array, 1 < i)\nfilter(array, 1 == #)\nfilter(array, 1 == 0.5)\nfilter(array, 1 == i)\nfilter(array, 1 > i)\nfilter(array, 1 >= #)\nfilter(array, add == add)\nfilter(array, add == nil)\nfilter(array, any(list, ok))\nfilter(array, f32 != #)\nfilter(array, f32 < #)\nfilter(array, f32 <= #)\nfilter(array, f32 == #)\nfilter(array, f32 == i64)\nfilter(array, f32 > #)\nfilter(array, f32 >= #)\nfilter(array, f64 < #)\nfilter(array, f64 <= #)\nfilter(array, f64 == i32)\nfilter(array, f64 >= #)\nfilter(array, half != nil)\nfilter(array, half == half)\nfilter(array, half(1) >= # ^ i)\nfilter(array, i != #)\nfilter(array, i != f64)\nfilter(array, i <= i32)\nfilter(array, i == #)\nfilter(array, i > #)\nfilter(array, i > f32)\nfilter(array, i32 != i64)\nfilter(array, i32 < 0.5)\nfilter(array, i32 > #)\nfilter(array, i64 < #)\nfilter(array, i64 < i64)\nfilter(array, i64 == #)\nfilter(array, i64 == i32)\nfilter(array, i64 >= #)\nfilter(array, nil != #)\nfilter(array, nil != greet)\nfilter(array, nil == #)\nfilter(array, nil == 1)\nfilter(array, nil == i32)\nfilter(array, not false)\nfilter(array, not ok)\nfilter(array, not true)\nfilter(array, ok && true)\nfilter(array, ok)\nfilter(array, ok)[i64]\nfilter(array, score == nil)\nfilter(array, true == true)\nfilter(array, true and true)\nfilter(false ? ok : array, # == nil)\nfilter(filter(list, true), ok)\nfilter(groupBy(list, #).f64, # not matches #?.foo)\nfilter(i .. i64, ok)\nfilter(list, !ok)\nfilter(list, !true)\nfilter(list, \"bar\" < \"foo\")\nfilter(list, \"bar\" not matches \"foo\")\nfilter(list, \"foo\" == \"foo\")\nfilter(list, \"foo\" in #)\nfilter(list, \"foo\" not endsWith \"bar\")\nfilter(list, \"foo\" startsWith \"bar\")\nfilter(list, # != #)\nfilter(list, # != foo)\nfilter(list, # != nil)\nfilter(list, # == #)\nfilter(list, # == foo)\nfilter(list, # in list)\nfilter(list, 0.5 < 1)\nfilter(list, 0.5 <= 0.5)\nfilter(list, 0.5 >= 1)\nfilter(list, 0.5 >= i)\nfilter(list, 0.5 >= i64)\nfilter(list, 1 < 1)\nfilter(list, 1 <= f32)\nfilter(list, any(array, ok))\nfilter(list, any(list, true))\nfilter(list, div != div)\nfilter(list, f32 <= 1)\nfilter(list, f32 == f64)\nfilter(list, f32 > i)\nfilter(list, f64 <= 1)\nfilter(list, f64 == 0.5)\nfilter(list, false != false)\nfilter(list, false or ok)\nfilter(list, foo == #)\nfilter(list, i < 0.5)\nfilter(list, i < f32)\nfilter(list, i >= 0.5)\nfilter(list, i64 > 0.5)\nfilter(list, nil != \"foo\")\nfilter(list, nil != #)\nfilter(list, nil != #?.Bar)\nfilter(list, nil != add)\nfilter(list, nil != greet)\nfilter(list, nil != i64)\nfilter(list, nil == #)\nfilter(list, nil == 0.5)\nfilter(list, nil == f32)\nfilter(list, nil == half)\nfilter(list, nil == i32)\nfilter(list, nil == score)\nfilter(list, ok == nil)\nfilter(list, ok and false)\nfilter(list, ok)\nfilter(list, ok)[i]\nfilter(list, true == ok)\nfilter(list, true || true)\nfilter(list, true) == list\nfilter(map(array, #), # == 1)\nfilter(map(array, #), # > #)\nfilter(map(array, 1), ok)\nfilter(map(array, greet), ok)\nfilter(map(array, i32), ok)\nfilter(map(array, i64), nil == div)\nfilter(map(array, ok), true || ok)\nfilter(map(array, score), # != nil)\nfilter(map(list, #), # == #)\nfilter(map(list, #), half != nil)\nfilter(map(list, #), ok)\nfilter(map(list, array), # == #)\nfilter(map(list, f32), # == #)\nfilter(map(list, f32), ok)\nfilter(map(list, false), #)\nfilter(map(list, i32), i64 <= i32)\nfilter(map(list, ok), #)\nfilter(map(list, true), #)\nfilter(ok ? \"foo\" : 0.5, # <= i64)\nfilter(true ? list : score, # != #)\nfind(1 .. i, ok)\nfind([ok], #)\nfind([score, score], # == #)\nfind(array, !(# <= i32))\nfind(array, !ok)\nfind(array, !true)\nfind(array, \"bar\" not startsWith \"foo\")\nfind(array, \"foo\" not contains \"bar\")\nfind(array, # != #)\nfind(array, # != 1)\nfind(array, # != i)\nfind(array, # != i32)\nfind(array, # != nil)\nfind(array, # - i != #)\nfind(array, # < #)\nfind(array, # < 0.5)\nfind(array, # < 1)\nfind(array, # < f32)\nfind(array, # < i)\nfind(array, # < i32)\nfind(array, # < i64)\nfind(array, # <= #)\nfind(array, # <= 0.5)\nfind(array, # <= 1)\nfind(array, # <= i32)\nfind(array, # == #)\nfind(array, # == 0.5)\nfind(array, # == 1)\nfind(array, # == i)\nfind(array, # == i64)\nfind(array, # == nil)\nfind(array, # > #)\nfind(array, # > 1)\nfind(array, # > i32)\nfind(array, # > i64)\nfind(array, # >= #)\nfind(array, # >= 1)\nfind(array, # >= f64)\nfind(array, # >= i)\nfind(array, # not in array)\nfind(array, 0.5 != 1)\nfind(array, 0.5 / i64 <= #)\nfind(array, 0.5 < #)\nfind(array, 0.5 < f64)\nfind(array, 0.5 <= #)\nfind(array, 0.5 >= #)\nfind(array, 0.5 >= 0.5)\nfind(array, 0.5 >= f64)\nfind(array, 1 != #)\nfind(array, 1 < #)\nfind(array, 1 < i32)\nfind(array, 1 < i64)\nfind(array, 1 <= #)\nfind(array, 1 <= i)\nfind(array, 1 == #)\nfind(array, 1 > #)\nfind(array, 1 >= #)\nfind(array, div != nil)\nfind(array, f32 != #)\nfind(array, f32 != f32)\nfind(array, f32 < #)\nfind(array, f32 <= #)\nfind(array, f32 == #)\nfind(array, f32 == i32)\nfind(array, f32 > #)\nfind(array, f32 >= #)\nfind(array, f64 != #)\nfind(array, f64 < #)\nfind(array, f64 < 1)\nfind(array, f64 <= #)\nfind(array, f64 == #)\nfind(array, f64 == i64)\nfind(array, false ? # : false)\nfind(array, false) != f64\nfind(array, floor(#) > #)\nfind(array, greet != greet)\nfind(array, i % # != f64)\nfind(array, i < 0.5)\nfind(array, i <= #)\nfind(array, i > 0.5)\nfind(array, i >= #)\nfind(array, i >= 1)\nfind(array, i32 != #)\nfind(array, i32 != i32)\nfind(array, i32 == #)\nfind(array, i32 > #)\nfind(array, i32 >= #)\nfind(array, i64 != #)\nfind(array, i64 != 1)\nfind(array, i64 < #)\nfind(array, i64 <= #)\nfind(array, i64 == #)\nfind(array, i64 > #)\nfind(array, nil != nil)\nfind(array, nil == #)\nfind(array, nil == 0.5)\nfind(array, nil == i32)\nfind(array, none(array, true))\nfind(array, not (# == #))\nfind(array, ok == nil)\nfind(array, ok and false)\nfind(array, ok)\nfind(array, ok) % i32\nfind(array, ok) ** i\nfind(array, ok) >= i32\nfind(array, true) > f64\nfind(array, true) > i64\nfind(filter(list, false), i64 not in array)\nfind(groupBy(array, #).Qux, .String?.f32)\nfind(groupBy(array, #).ok, first(#[1]))\nfind(i .. i64, ok)\nfind(i64 .. i32, # != #)\nfind(list, !false)\nfind(list, !ok)\nfind(list, \"bar\" not in #)\nfind(list, \"foo\" contains \"foo\")\nfind(list, # != #)\nfind(list, # != nil)\nfind(list, # == #)\nfind(list, # == foo)\nfind(list, # == nil)\nfind(list, 0.5 != 1)\nfind(list, 0.5 <= 0.5)\nfind(list, 1 != 0.5)\nfind(list, 1 < 1)\nfind(list, 1 < i64)\nfind(list, 1 == f64)\nfind(list, 1 > 0.5)\nfind(list, 1 > i)\nfind(list, 1 > i64)\nfind(list, f32 < 1)\nfind(list, f32 <= 0.5)\nfind(list, f32 <= i32)\nfind(list, f32 == i64)\nfind(list, f32 > f64)\nfind(list, f32 not in array)\nfind(list, f64 < f64)\nfind(list, false && true)\nfind(list, false)?.Bar\nfind(list, foo != #)\nfind(list, foo == #)\nfind(list, i != 1)\nfind(list, i != f64)\nfind(list, i != i32)\nfind(list, i32 != 1)\nfind(list, i32 != f64)\nfind(list, i32 < i)\nfind(list, i32 == i32)\nfind(list, nil != #)\nfind(list, nil != ok)\nfind(list, nil == array)\nfind(list, nil == div)\nfind(list, not false)\nfind(list, ok != false)\nfind(list, ok)\nfind(list, ok).String\nfind(list, ok).String()\nfind(list, ok)?.Bar\nfind(list, ok)?.Qux\nfind(list, ok)?.String\nfind(list, score == score)\nfind(list, true != nil)\nfind(list, true == true)\nfind(list, true or false)\nfind(list, true).Bar\nfind(list, true).Qux\nfind(list, true).String\nfind(list, true)?.Bar\nfind(list, true)?.String\nfind(map(array, #), # != f32)\nfind(map(array, #), # <= 1)\nfind(map(array, #), # == 0.5)\nfind(map(array, #), ok)\nfind(map(array, false), #)\nfind(map(array, foo), ok)\nfind(map(array, ok), #)\nfind(map(list, #), # != #)\nfind(map(list, #), ok)\nfind(map(list, 0.5), # != #)\nfind(map(list, add), 0.5 >= i64)\nfind(map(list, div), # == #)\nfind(map(list, f32), # > 0.5)\nfind(map(list, false), #)\nfind(map(list, i), # == i64)\nfind(map(list, ok), #)\nfind(map(list, true), #)\nfind(ok ? \"foo\" : f64, f32 >= #)\nfindIndex(array, !ok)\nfindIndex(array, \"bar\" == \"foo\")\nfindIndex(array, \"foo\" > \"foo\")\nfindIndex(array, \"foo\" in foo)\nfindIndex(array, # != #)\nfindIndex(array, # != 0.5)\nfindIndex(array, # != f32)\nfindIndex(array, # != f64)\nfindIndex(array, # != i)\nfindIndex(array, # != i64)\nfindIndex(array, # != nil)\nfindIndex(array, # < #)\nfindIndex(array, # < 1)\nfindIndex(array, # < i32)\nfindIndex(array, # <= #)\nfindIndex(array, # <= 0.5)\nfindIndex(array, # <= 1)\nfindIndex(array, # == #)\nfindIndex(array, # == 0.5)\nfindIndex(array, # == 1)\nfindIndex(array, # == i32)\nfindIndex(array, # == nil)\nfindIndex(array, # > #)\nfindIndex(array, # > 0.5)\nfindIndex(array, # > 1)\nfindIndex(array, # > f64)\nfindIndex(array, # > i)\nfindIndex(array, # > i64)\nfindIndex(array, # >= #)\nfindIndex(array, # >= 0.5)\nfindIndex(array, # >= 1)\nfindIndex(array, # >= f32)\nfindIndex(array, # >= f64)\nfindIndex(array, # >= i)\nfindIndex(array, # >= i32)\nfindIndex(array, # >= i64)\nfindIndex(array, 0.5 != #)\nfindIndex(array, 0.5 != 1)\nfindIndex(array, 0.5 < 1)\nfindIndex(array, 0.5 <= #)\nfindIndex(array, 0.5 == #)\nfindIndex(array, 0.5 == i64)\nfindIndex(array, 0.5 > #)\nfindIndex(array, 0.5 > 0.5)\nfindIndex(array, 0.5 > i)\nfindIndex(array, 0.5 > i32)\nfindIndex(array, 0.5 >= 0.5)\nfindIndex(array, 0.5 >= 1)\nfindIndex(array, 0.5 not in array)\nfindIndex(array, 1 != #)\nfindIndex(array, 1 != i64)\nfindIndex(array, 1 != nil)\nfindIndex(array, 1 < #)\nfindIndex(array, 1 <= #)\nfindIndex(array, 1 > #)\nfindIndex(array, 1 > i)\nfindIndex(array, 1 >= #)\nfindIndex(array, add != div)\nfindIndex(array, add != nil)\nfindIndex(array, f32 != #)\nfindIndex(array, f32 != 1)\nfindIndex(array, f32 < #)\nfindIndex(array, f32 == #)\nfindIndex(array, f32 >= #)\nfindIndex(array, f32 >= i32)\nfindIndex(array, f64 >= #)\nfindIndex(array, f64 >= i32)\nfindIndex(array, false) == -f64\nfindIndex(array, i != f64)\nfindIndex(array, i < #)\nfindIndex(array, i < i32)\nfindIndex(array, i <= #)\nfindIndex(array, i <= 0.5)\nfindIndex(array, i == #)\nfindIndex(array, i >= i)\nfindIndex(array, i >= i32)\nfindIndex(array, i32 != #)\nfindIndex(array, i32 < #)\nfindIndex(array, i32 == #)\nfindIndex(array, i32 > f32)\nfindIndex(array, i64 != #)\nfindIndex(array, i64 != nil)\nfindIndex(array, i64 < 0.5)\nfindIndex(array, i64 <= #)\nfindIndex(array, i64 <= i64)\nfindIndex(array, i64 > #)\nfindIndex(array, i64 >= #)\nfindIndex(array, i64 >= f64)\nfindIndex(array, i64 >= i32)\nfindIndex(array, nil != half)\nfindIndex(array, nil != ok)\nfindIndex(array, nil == #)\nfindIndex(array, nil == 1)\nfindIndex(array, nil == nil)\nfindIndex(array, not false)\nfindIndex(array, ok)\nfindIndex(array, ok) / f64\nfindIndex(array, ok) / i\nfindIndex(array, ok) <= f32\nfindIndex(array, one(list, false))\nfindIndex(array, true) + f64\nfindIndex(array, true) - f64\nfindIndex(array, true) .. i\nfindIndex(filter(array, false), # > 1)\nfindIndex(filter(array, true), # not in array)\nfindIndex(filter(list, false), 1 <= i64)\nfindIndex(groupBy(array, #).f64, .Bar(half(add, half, div, greet, f64)))\nfindIndex(groupBy(array, false).String, #?.i64())\nfindIndex(groupBy(array, foo).String, #)\nfindIndex(groupBy(list, #).Qux, #)\nfindIndex(i32 .. 1, # >= #)\nfindIndex(list, !false)\nfindIndex(list, !ok)\nfindIndex(list, !true)\nfindIndex(list, \"bar\" > \"foo\")\nfindIndex(list, \"bar\" in #)\nfindIndex(list, \"bar\" not in #)\nfindIndex(list, # != #)\nfindIndex(list, # != nil)\nfindIndex(list, # == #)\nfindIndex(list, # == foo)\nfindIndex(list, # in list)\nfindIndex(list, #?.Bar not in #)\nfindIndex(list, 0.5 != i)\nfindIndex(list, 0.5 > 1)\nfindIndex(list, 0.5 >= i)\nfindIndex(list, 1 != i32)\nfindIndex(list, 1 < f64)\nfindIndex(list, 1 < i32)\nfindIndex(list, 1 == f32)\nfindIndex(list, 1 > 0.5)\nfindIndex(list, 1 > i32)\nfindIndex(list, 1 >= 1)\nfindIndex(list, 1 >= i)\nfindIndex(list, f32 != f32)\nfindIndex(list, f32 != i)\nfindIndex(list, f32 < i32)\nfindIndex(list, f32 == bitshl(i, i64))\nfindIndex(list, f32 > 1)\nfindIndex(list, f64 != 0.5)\nfindIndex(list, f64 < 1)\nfindIndex(list, f64 < i)\nfindIndex(list, f64 > 1)\nfindIndex(list, f64 >= f64)\nfindIndex(list, false != nil)\nfindIndex(list, false || ok)\nfindIndex(list, foo != #)\nfindIndex(list, greet == nil)\nfindIndex(list, i < 0.5)\nfindIndex(list, i <= i32)\nfindIndex(list, i32 == 1)\nfindIndex(list, i32 >= i64)\nfindIndex(list, i64 != f32)\nfindIndex(list, nil != 0.5)\nfindIndex(list, nil != f32)\nfindIndex(list, nil != i64)\nfindIndex(list, nil == \"foo\")\nfindIndex(list, nil == f64)\nfindIndex(list, not ok)\nfindIndex(list, not true)\nfindIndex(list, ok)\nfindIndex(list, ok) * i\nfindIndex(list, ok) ** i\nfindIndex(list, ok) >= f64\nfindIndex(list, ok) ^ i32\nfindIndex(list, true ? ok : #)\nfindIndex(list, true) % i64\nfindIndex(map(array, #), # < #)\nfindIndex(map(array, #), # >= #)\nfindIndex(map(array, #), i > #)\nfindIndex(map(array, f32), i32 == #)\nfindIndex(map(array, i), # != #)\nfindIndex(map(array, i), ok)\nfindIndex(map(list, #), # != #)\nfindIndex(map(list, #), # == #)\nfindIndex(map(list, i64), # == 0.5)\nfindIndex(map(list, i64), i64 < #)\nfindIndex(map(list, true), #)\nfindIndex(map(list, true), ok)\nfindIndex(ok ? \"foo\" : greet, !ok)\nfindIndex(ok ? \"foo\" : i, # == #)\nfindIndex(sort(array), i32 == #)\nfindIndex(true ? \"foo\" : ok, # == greet)\nfindLast(1 .. i, # <= #)\nfindLast(1 .. i32, 1 >= #)\nfindLast(1 .. i64, ok)\nfindLast([false], #)\nfindLast(array, !false)\nfindLast(array, !ok)\nfindLast(array, \"foo\" > \"bar\")\nfindLast(array, # != #)\nfindLast(array, # != 0.5)\nfindLast(array, # != 1)\nfindLast(array, # != f32)\nfindLast(array, # != f64)\nfindLast(array, # != i)\nfindLast(array, # < #)\nfindLast(array, # < 0.5)\nfindLast(array, # < f32)\nfindLast(array, # < f64)\nfindLast(array, # < i + #)\nfindLast(array, # <= #)\nfindLast(array, # <= 0.5)\nfindLast(array, # <= 1)\nfindLast(array, # <= f32)\nfindLast(array, # <= i64)\nfindLast(array, # == #)\nfindLast(array, # == 0.5)\nfindLast(array, # == nil)\nfindLast(array, # > #)\nfindLast(array, # > 0.5)\nfindLast(array, # > 1)\nfindLast(array, # > i)\nfindLast(array, # > i32)\nfindLast(array, # > i64)\nfindLast(array, # >= #)\nfindLast(array, # >= 0.5)\nfindLast(array, # >= 1)\nfindLast(array, # >= f32)\nfindLast(array, # >= i32)\nfindLast(array, 0.5 <= #)\nfindLast(array, 0.5 <= i64)\nfindLast(array, 0.5 > #)\nfindLast(array, 0.5 >= #)\nfindLast(array, 0.5 >= 1)\nfindLast(array, 1 != #)\nfindLast(array, 1 <= #)\nfindLast(array, 1 == #)\nfindLast(array, f32 >= #)\nfindLast(array, f64 != #)\nfindLast(array, f64 != nil)\nfindLast(array, f64 <= #)\nfindLast(array, f64 <= 1)\nfindLast(array, f64 == #)\nfindLast(array, f64 == nil)\nfindLast(array, f64 >= 1)\nfindLast(array, f64 >= i64)\nfindLast(array, false != true)\nfindLast(array, false or true)\nfindLast(array, greet != nil)\nfindLast(array, i < #)\nfindLast(array, i == i32)\nfindLast(array, i > #)\nfindLast(array, i >= 0.5)\nfindLast(array, i32 < #)\nfindLast(array, i32 == 0.5)\nfindLast(array, i32 > #)\nfindLast(array, i32 >= #)\nfindLast(array, i32 >= i32)\nfindLast(array, i64 != #)\nfindLast(array, i64 < #)\nfindLast(array, i64 <= #)\nfindLast(array, i64 == #)\nfindLast(array, i64 > 0.5)\nfindLast(array, list != nil)\nfindLast(array, nil != array)\nfindLast(array, not (array == array))\nfindLast(array, not false)\nfindLast(array, not ok)\nfindLast(array, ok and true)\nfindLast(array, ok)\nfindLast(array, ok) == i64\nfindLast(array, reduce(list, ok))\nfindLast(array, score != nil)\nfindLast(array, true) % i64\nfindLast(groupBy(array, #).i32, #)\nfindLast(groupBy(list, \"bar\").div, #?.f32?.half())\nfindLast(groupBy(list, #)[ok], .ok)\nfindLast(groupBy(list, f64).foo, .f32(#, #)?.Qux(#?.i64(add, nil)))\nfindLast(i .. 1, # < #)\nfindLast(i .. i32, # != i64)\nfindLast(i .. i32, ok)\nfindLast(i32 .. i64, # >= i)\nfindLast(i64 .. 1, # < #)\nfindLast(list, !false)\nfindLast(list, !ok)\nfindLast(list, \"foo\" in #)\nfindLast(list, # != #)\nfindLast(list, # != nil)\nfindLast(list, # == #)\nfindLast(list, # == foo)\nfindLast(list, # in list)\nfindLast(list, # not in list)\nfindLast(list, 0.5 != i64)\nfindLast(list, 0.5 <= 1)\nfindLast(list, 0.5 == i64)\nfindLast(list, 1 != f32)\nfindLast(list, 1 != nil)\nfindLast(list, 1 <= 1)\nfindLast(list, 1 > f32)\nfindLast(list, 1 >= f64)\nfindLast(list, f32 != i)\nfindLast(list, f32 > f32)\nfindLast(list, f32 >= 1)\nfindLast(list, f64 <= i)\nfindLast(list, f64 in array)\nfindLast(list, false)?.Bar\nfindLast(list, foo != #)\nfindLast(list, foo in list)\nfindLast(list, i != i)\nfindLast(list, i <= 1)\nfindLast(list, i <= i)\nfindLast(list, i == i32)\nfindLast(list, i >= i)\nfindLast(list, i32 != f32)\nfindLast(list, i64 > f32)\nfindLast(list, i64 > i)\nfindLast(list, i64 >= 1)\nfindLast(list, nil != #)\nfindLast(list, nil not in array)\nfindLast(list, nil not in list)\nfindLast(list, none(array, ok))\nfindLast(list, not false)\nfindLast(list, not true)\nfindLast(list, ok or true)\nfindLast(list, ok)\nfindLast(list, ok) not in list\nfindLast(list, ok).Bar\nfindLast(list, ok).Qux\nfindLast(list, ok).String\nfindLast(list, ok)?.Bar\nfindLast(list, ok)?.Qux\nfindLast(list, ok)?.String\nfindLast(list, true or ok)\nfindLast(list, true).Bar\nfindLast(list, true).Qux\nfindLast(list, true).String\nfindLast(list, true)?.Bar\nfindLast(list, true)?.Qux\nfindLast(list, true)?.String\nfindLast(map(array, #), # < #)\nfindLast(map(array, #), # < i32)\nfindLast(map(array, #), # <= 1)\nfindLast(map(array, #), # == f64)\nfindLast(map(array, #), 0.5 != 0.5)\nfindLast(map(array, #), i32 == #)\nfindLast(map(array, #), ok)\nfindLast(map(array, f64 * #), # + # > f32)\nfindLast(map(array, score), ok)\nfindLast(map(list, #), # == #)\nfindLast(map(list, #), greet == nil)\nfindLast(map(list, #), ok)\nfindLast(map(list, ok), # ? # : #)\nfindLastIndex(1 .. 1, i64 < #)\nfindLastIndex([i64, half], ok)\nfindLastIndex(array, \"bar\" not matches \"foo\")\nfindLastIndex(array, \"bar\" startsWith \"foo\")\nfindLastIndex(array, \"foo\" == nil)\nfindLastIndex(array, \"foo\" >= \"foo\")\nfindLastIndex(array, \"foo\" contains \"foo\")\nfindLastIndex(array, # != #)\nfindLastIndex(array, # != 1)\nfindLastIndex(array, # != f32)\nfindLastIndex(array, # != f64)\nfindLastIndex(array, # != i32)\nfindLastIndex(array, # != i64)\nfindLastIndex(array, # != nil)\nfindLastIndex(array, # < #)\nfindLastIndex(array, # < 1)\nfindLastIndex(array, # < f64)\nfindLastIndex(array, # < i)\nfindLastIndex(array, # < i64)\nfindLastIndex(array, # <= #)\nfindLastIndex(array, # <= 0.5)\nfindLastIndex(array, # <= i64)\nfindLastIndex(array, # == #)\nfindLastIndex(array, # == 0.5)\nfindLastIndex(array, # == 1)\nfindLastIndex(array, # == f64)\nfindLastIndex(array, # == i64)\nfindLastIndex(array, # == nil)\nfindLastIndex(array, # > #)\nfindLastIndex(array, # > 0.5)\nfindLastIndex(array, # > f32)\nfindLastIndex(array, # > f64)\nfindLastIndex(array, # > i)\nfindLastIndex(array, # >= #)\nfindLastIndex(array, # >= 0.5)\nfindLastIndex(array, # >= 1)\nfindLastIndex(array, # >= f32)\nfindLastIndex(array, # >= i32)\nfindLastIndex(array, # ^ # >= #)\nfindLastIndex(array, # not in array)\nfindLastIndex(array, 0.5 != #)\nfindLastIndex(array, 0.5 != i64)\nfindLastIndex(array, 0.5 < #)\nfindLastIndex(array, 0.5 < i32)\nfindLastIndex(array, 0.5 <= #)\nfindLastIndex(array, 0.5 > #)\nfindLastIndex(array, 0.5 >= 0.5)\nfindLastIndex(array, 0.5 >= f64)\nfindLastIndex(array, 1 != #)\nfindLastIndex(array, 1 <= #)\nfindLastIndex(array, 1 == #)\nfindLastIndex(array, 1 == f64)\nfindLastIndex(array, 1 >= i32)\nfindLastIndex(array, array == nil)\nfindLastIndex(array, f32 != #)\nfindLastIndex(array, f32 != f32)\nfindLastIndex(array, f32 < #)\nfindLastIndex(array, f32 == #)\nfindLastIndex(array, f32 == nil)\nfindLastIndex(array, f32 > #)\nfindLastIndex(array, f64 != #)\nfindLastIndex(array, f64 < #)\nfindLastIndex(array, f64 <= #)\nfindLastIndex(array, f64 <= i32)\nfindLastIndex(array, f64 == #)\nfindLastIndex(array, f64 == 0.5)\nfindLastIndex(array, f64 > #)\nfindLastIndex(array, false ? # : false)\nfindLastIndex(array, foo != foo)\nfindLastIndex(array, greet == greet)\nfindLastIndex(array, i - # >= #)\nfindLastIndex(array, i < #)\nfindLastIndex(array, i <= #)\nfindLastIndex(array, i > 0.5)\nfindLastIndex(array, i32 <= #)\nfindLastIndex(array, i32 <= 1)\nfindLastIndex(array, i32 <= f32)\nfindLastIndex(array, i32 > 0.5)\nfindLastIndex(array, i32 >= #)\nfindLastIndex(array, i64 <= # + #)\nfindLastIndex(array, i64 > #)\nfindLastIndex(array, min(1, #) <= i32 + #)\nfindLastIndex(array, nil != #)\nfindLastIndex(array, nil != add)\nfindLastIndex(array, nil != i32)\nfindLastIndex(array, nil == #)\nfindLastIndex(array, not (i32 != 0.5))\nfindLastIndex(array, not ok)\nfindLastIndex(array, ok && true)\nfindLastIndex(array, ok)\nfindLastIndex(array, ok) % i64\nfindLastIndex(array, ok) + f64\nfindLastIndex(array, one(list, ok))\nfindLastIndex(array, score == nil)\nfindLastIndex(array, true == false)\nfindLastIndex(array, true) / f32\nfindLastIndex(array, true) not in array\nfindLastIndex(filter(array, false), ok)\nfindLastIndex(groupBy(list, #).ok, #)\nfindLastIndex(groupBy(list, 0.5).Bar, #?.String endsWith .f32(list))\nfindLastIndex(i32 .. i32, ok)\nfindLastIndex(i64 .. 1, ok)\nfindLastIndex(list, !(nil != #))\nfindLastIndex(list, !false)\nfindLastIndex(list, !ok)\nfindLastIndex(list, !true)\nfindLastIndex(list, \"bar\" in #)\nfindLastIndex(list, \"bar\" matches \"foo\")\nfindLastIndex(list, \"bar\" not endsWith \"foo\")\nfindLastIndex(list, \"bar\" not matches \"bar\")\nfindLastIndex(list, \"foo\" <= \"bar\")\nfindLastIndex(list, \"foo\" not in #)\nfindLastIndex(list, # != #)\nfindLastIndex(list, # != foo)\nfindLastIndex(list, # == #)\nfindLastIndex(list, # == foo)\nfindLastIndex(list, # == nil)\nfindLastIndex(list, # in list)\nfindLastIndex(list, # not in list)\nfindLastIndex(list, 1 != f32)\nfindLastIndex(list, 1 != nil)\nfindLastIndex(list, 1 > 1)\nfindLastIndex(list, 1 >= 0.5)\nfindLastIndex(list, array != nil)\nfindLastIndex(list, div != nil)\nfindLastIndex(list, f32 != 1)\nfindLastIndex(list, f32 != f64)\nfindLastIndex(list, f64 > 0.5)\nfindLastIndex(list, foo == #)\nfindLastIndex(list, i <= 1)\nfindLastIndex(list, i32 > 1)\nfindLastIndex(list, i32 > f32)\nfindLastIndex(list, i64 == i64)\nfindLastIndex(list, i64 >= 0.5)\nfindLastIndex(list, i64 not in array)\nfindLastIndex(list, nil != \"bar\")\nfindLastIndex(list, nil != #)\nfindLastIndex(list, nil != f64)\nfindLastIndex(list, nil == #)\nfindLastIndex(list, nil == 1)\nfindLastIndex(list, nil == half)\nfindLastIndex(list, not false)\nfindLastIndex(list, not true)\nfindLastIndex(list, ok ? ok : 0.5)\nfindLastIndex(list, ok and false)\nfindLastIndex(list, ok)\nfindLastIndex(list, ok) != i64\nfindLastIndex(list, ok) > f32\nfindLastIndex(list, ok) > i64\nfindLastIndex(list, one(array, true))\nfindLastIndex(list, true && ok)\nfindLastIndex(list, true) * i32\nfindLastIndex(list, true) - i32\nfindLastIndex(list, true) < i64\nfindLastIndex(list, true) > i64\nfindLastIndex(list, true) ^ f64\nfindLastIndex(map(array, \"bar\"), # not endsWith #)\nfindLastIndex(map(array, #), # < f64)\nfindLastIndex(map(array, #), # <= #)\nfindLastIndex(map(array, #), ok)\nfindLastIndex(map(array, div), 0.5 <= 0.5)\nfindLastIndex(map(array, f32), nil == nil)\nfindLastIndex(map(array, list), ok)\nfindLastIndex(map(array, ok), # and #)\nfindLastIndex(map(list, \"bar\"), # >= #)\nfindLastIndex(map(list, #), !true)\nfindLastIndex(map(list, #), nil == 0.5)\nfindLastIndex(map(list, false), #)\nfindLastIndex(map(list, foo), ok)\nfindLastIndex(map(list, i32), # >= #)\nfindLastIndex(map(list, i64), ok)\nfindLastIndex(ok ? \"bar\" : add, not false)\nfindLastIndex(true ? \"foo\" : 1, # and false)\nfirst(1 .. 1)\nfirst(1 .. i64)\nfirst([f32])\nfirst([foo])\nfirst([ok])\nfirst(array)\nfirst(array) * i\nfirst(array) * i64\nfirst(array) + f32\nfirst(array) <= i\nfirst(array) == f32\nfirst(array) == f64\nfirst(array) == i64\nfirst(array) > 0.5 ** i\nfirst(array) > i64\nfirst(array) ^ f64\nfirst(array[1:1])\nfirst(false ? foo : 1)\nfirst(false ? greet : foo)\nfirst(get(groupBy(array, #), i))\nfirst(groupBy(array, #).greet)\nfirst(groupBy(list, #)?.div)\nfirst(i .. i)\nfirst(i64 .. i32)\nfirst(i64 .. i64)\nfirst(list)\nfirst(list) not in list\nfirst(list).Bar\nfirst(list).Qux\nfirst(list).String\nfirst(list).String()\nfirst(list)?.Bar\nfirst(list)?.Qux\nfirst(list)?.String\nfirst(list)?.String()\nfirst(map(array, #))\nfirst(map(array, 0.5))\nfirst(map(array, 1))\nfirst(map(array, add))\nfirst(map(array, array))\nfirst(map(array, div))\nfirst(map(array, half))\nfirst(map(array, i))\nfirst(map(array, i32))\nfirst(map(array, i64))\nfirst(map(array, ok))\nfirst(map(list, #))\nfirst(map(list, 0.5))\nfirst(map(list, f32))\nfirst(map(list, greet))\nfirst(map(list, i))\nfirst(map(list, list))\nfirst(map(list, score))\nfirst(ok ? 0.5 : false)\nfirst(ok ? array : add)\nfirst(ok ? greet : i64)\nfirst(ok ? list : ok)\nfirst(reduce(list, array))\nfirst(sort(array))\nfirst(true ? f32 : div)\nfirst(true ? greet : div)\nfirst(true ? score : div)\nfloat(-0.5)\nfloat(-1)\nfloat(-f32)\nfloat(-f64)\nfloat(-i)\nfloat(-i32)\nfloat(-i64)\nfloat(0.5 * 0.5)\nfloat(0.5 * 1)\nfloat(0.5 * f32)\nfloat(0.5 * i64)\nfloat(0.5 ** 0.5)\nfloat(0.5 ** f32)\nfloat(0.5 + 1)\nfloat(0.5 + i32)\nfloat(0.5 + i64)\nfloat(0.5 - 0.5)\nfloat(0.5 - 1)\nfloat(0.5 - i64)\nfloat(0.5 / 0.5)\nfloat(0.5 / i32)\nfloat(0.5 / i64)\nfloat(0.5 ^ 1)\nfloat(0.5 ^ i)\nfloat(0.5) != f32\nfloat(0.5) != i32\nfloat(0.5) * f32\nfloat(0.5) * i32\nfloat(0.5) * i64\nfloat(0.5) ** f64\nfloat(0.5) ** i\nfloat(0.5) ** i32\nfloat(0.5) - i\nfloat(0.5) - i64\nfloat(0.5) / f32\nfloat(0.5) / f64\nfloat(0.5) / i32\nfloat(0.5) == i32 * 0.5\nfloat(0.5) ^ i64\nfloat(0.5) in array\nfloat(1 % i64)\nfloat(1 * 0.5)\nfloat(1 * f32)\nfloat(1 * i)\nfloat(1 * i64)\nfloat(1 ** 0.5)\nfloat(1 ** 1)\nfloat(1 ** f64)\nfloat(1 ** i)\nfloat(1 + f64)\nfloat(1 + i32)\nfloat(1 - 0.5)\nfloat(1 / 0.5)\nfloat(1 ^ f64)\nfloat(1) * f32\nfloat(1) * i64\nfloat(1) ** i\nfloat(1) ** i64\nfloat(1) - f64\nfloat(1) <= i64\nfloat(1) == i64\nfloat(1) > -0.5\nfloat(1) > i64\nfloat(1) >= f64\nfloat(1) >= i\nfloat(abs(f32))\nfloat(abs(f64))\nfloat(abs(i))\nfloat(abs(i32))\nfloat(add(1, 1))\nfloat(array[i32])\nfloat(array[i64])\nfloat(array[i])\nfloat(bitnot(1))\nfloat(bitnot(i))\nfloat(bitnot(i32))\nfloat(bitnot(i64))\nfloat(ceil(0.5))\nfloat(ceil(f32))\nfloat(ceil(f64))\nfloat(ceil(i32))\nfloat(ceil(i64))\nfloat(count(array, false))\nfloat(count(array, ok))\nfloat(count(list, i32 == 0.5))\nfloat(f32 * f64)\nfloat(f32 * i)\nfloat(f32 * i32)\nfloat(f32 ** 1)\nfloat(f32 ** f32)\nfloat(f32 ** i)\nfloat(f32 ** i64)\nfloat(f32 + 0.5)\nfloat(f32 + 1)\nfloat(f32 + f64)\nfloat(f32 + i32)\nfloat(f32 + i64)\nfloat(f32 - 0.5)\nfloat(f32 - f64)\nfloat(f32 - i64)\nfloat(f32 / 0.5)\nfloat(f32 / 1)\nfloat(f32 / i)\nfloat(f32 ^ 0.5)\nfloat(f32 ^ 1)\nfloat(f32 ^ f32)\nfloat(f32 ^ i)\nfloat(f32 ^ i32)\nfloat(f32)\nfloat(f32) < i32\nfloat(f32) <= f32\nfloat(f32) <= f64 / f32\nfloat(f32) <= i\nfloat(f32) > i\nfloat(f32) >= i64\nfloat(f32) ^ f64\nfloat(f32) ^ i64\nfloat(f64 * 0.5)\nfloat(f64 * 1)\nfloat(f64 * f32)\nfloat(f64 * f64)\nfloat(f64 * i32)\nfloat(f64 ** f32)\nfloat(f64 + 1)\nfloat(f64 + i)\nfloat(f64 + i32)\nfloat(f64 - 1)\nfloat(f64 - i)\nfloat(f64 / 0.5)\nfloat(f64 / 1)\nfloat(f64 / i64)\nfloat(f64 ^ f32)\nfloat(f64)\nfloat(f64) * f32\nfloat(f64) * i\nfloat(f64) / -i32\nfloat(f64) / i\nfloat(f64) == f64\nfloat(f64) > f64\nfloat(f64) > i64\nfloat(f64) >= f32\nfloat(f64) >= i\nfloat(f64) >= i64\nfloat(f64) ^ i64\nfloat(false ? f64 : 0.5)\nfloat(false ? half : f64)\nfloat(false ? list : f64)\nfloat(find(array, ok))\nfloat(findIndex(array, ok))\nfloat(findLastIndex(array, ok))\nfloat(findLastIndex(list, true))\nfloat(first(array))\nfloat(float(0.5))\nfloat(float(1))\nfloat(float(f32))\nfloat(float(f64))\nfloat(float(i))\nfloat(float(i32))\nfloat(floor(0.5))\nfloat(floor(1))\nfloat(floor(f32))\nfloat(floor(f64))\nfloat(floor(i32))\nfloat(floor(i64))\nfloat(get(array, 1))\nfloat(get(array, i))\nfloat(half(0.5))\nfloat(half(1))\nfloat(half(f64))\nfloat(i % i32)\nfloat(i * 0.5)\nfloat(i * f64)\nfloat(i * i64)\nfloat(i ** f32)\nfloat(i ** i32)\nfloat(i + 0.5)\nfloat(i + 1)\nfloat(i + i64)\nfloat(i - 1)\nfloat(i - f64)\nfloat(i / 0.5)\nfloat(i / 1)\nfloat(i ^ 0.5)\nfloat(i ^ i32)\nfloat(i)\nfloat(i) != 1 ? nil : foo\nfloat(i) != f64\nfloat(i) + f32\nfloat(i) + f64\nfloat(i) < i\nfloat(i) == f32\nfloat(i) == i\nfloat(i) > f64\nfloat(i32 % i)\nfloat(i32 % i64)\nfloat(i32 * f64)\nfloat(i32 * i32)\nfloat(i32 ** 1)\nfloat(i32 + f64)\nfloat(i32 + i64)\nfloat(i32 / 1)\nfloat(i32 / f32)\nfloat(i32 / i32)\nfloat(i32 ^ f64)\nfloat(i32 ^ i32)\nfloat(i32)\nfloat(i32) != f64\nfloat(i32) ** f32\nfloat(i32) ** i\nfloat(i32) > i32\nfloat(i32) >= i\nfloat(i64 % i64)\nfloat(i64 * i64)\nfloat(i64 ** 1)\nfloat(i64 + f32)\nfloat(i64 + i)\nfloat(i64 - 0.5)\nfloat(i64 - 1)\nfloat(i64 - f32)\nfloat(i64 / 1)\nfloat(i64 ^ f32)\nfloat(i64)\nfloat(i64) != i\nfloat(i64) ** max(f64)\nfloat(i64) + i32\nfloat(i64) - 0.5 ^ f32\nfloat(i64) - f64\nfloat(i64) / i32\nfloat(i64) < i32\nfloat(i64) == i\nfloat(i64) == i64\nfloat(i64) > i\nfloat(i64) ^ f32\nfloat(int(0.5))\nfloat(int(1))\nfloat(int(f32))\nfloat(int(i))\nfloat(int(i32))\nfloat(last(array))\nfloat(len(\"bar\"))\nfloat(len(array))\nfloat(len(list))\nfloat(max(0.5))\nfloat(max(0.5, i64))\nfloat(max(1))\nfloat(max(1, 1))\nfloat(max(f32))\nfloat(max(f64))\nfloat(max(i))\nfloat(max(i32))\nfloat(max(i64))\nfloat(mean(array))\nfloat(min(1))\nfloat(min(f64))\nfloat(min(f64, i64))\nfloat(min(i32))\nfloat(min(i64))\nfloat(ok ? 0.5 : foo)\nfloat(ok ? 0.5 : list)\nfloat(reduce(array, #))\nfloat(reduce(array, 0.5))\nfloat(reduce(array, f64))\nfloat(reduce(array, i32))\nfloat(reduce(list, i64))\nfloat(round(0.5))\nfloat(round(1))\nfloat(round(i32))\nfloat(round(i64))\nfloat(score(1))\nfloat(score(1, 1))\nfloat(score(i))\nfloat(string(0.5))\nfloat(string(1))\nfloat(string(f64 - 0.5))\nfloat(string(i))\nfloat(string(i32))\nfloat(string(i64))\nfloat(sum(array))\nfloat(toJSON(0.5))\nfloat(toJSON(1))\nfloat(toJSON(f32))\nfloat(toJSON(f64))\nfloat(toJSON(i32))\nfloat(toJSON(i64))\nfloat(true ? f32 : \"foo\")\nfloor(-0.5)\nfloor(-1)\nfloor(-f32)\nfloor(-f64)\nfloor(-i)\nfloor(-i32)\nfloor(-i64)\nfloor(0.5 * 0.5)\nfloor(0.5 * 1)\nfloor(0.5 * i32)\nfloor(0.5 ** 1)\nfloor(0.5 ** f64)\nfloor(0.5 ** i)\nfloor(0.5 + 1)\nfloor(0.5 + f32)\nfloor(0.5 + i)\nfloor(0.5 + i32)\nfloor(0.5 + i64)\nfloor(0.5 - 1)\nfloor(0.5 - f32)\nfloor(0.5 - i)\nfloor(0.5 / 0.5)\nfloor(0.5 / 1)\nfloor(0.5 / i32)\nfloor(0.5 ^ 0.5)\nfloor(0.5 ^ 1)\nfloor(0.5 ^ f32)\nfloor(0.5 ^ f64)\nfloor(0.5 ^ i)\nfloor(0.5) != i64\nfloor(0.5) ** f32\nfloor(0.5) - i\nfloor(0.5) - i64\nfloor(0.5) / i\nfloor(0.5) <= i64\nfloor(0.5) > i32\nfloor(0.5) > i64 != ok\nfloor(0.5) >= f32\nfloor(0.5) ^ i\nfloor(1 % 1)\nfloor(1 % i)\nfloor(1 * 0.5)\nfloor(1 * 1)\nfloor(1 ** 1)\nfloor(1 ** f64)\nfloor(1 ** i32)\nfloor(1 + 0.5)\nfloor(1 + 1)\nfloor(1 + f32)\nfloor(1 + f64)\nfloor(1 + i32)\nfloor(1 - 0.5)\nfloor(1 - 1)\nfloor(1 - i)\nfloor(1 - i32)\nfloor(1 - i64)\nfloor(1 / 0.5)\nfloor(1 / 1)\nfloor(1 / i)\nfloor(1 / i64)\nfloor(1 ^ i)\nfloor(1 ^ i32)\nfloor(1 ^ i64)\nfloor(1) * i64\nfloor(1) - f32\nfloor(1) - i\nfloor(1) <= f32\nfloor(1) >= half(0.5)\nfloor(abs(0.5))\nfloor(abs(1))\nfloor(abs(f32))\nfloor(abs(f64))\nfloor(abs(i32))\nfloor(abs(i64))\nfloor(array[1])\nfloor(array[i32])\nfloor(array[i64])\nfloor(array[i])\nfloor(bitnot(1))\nfloor(bitnot(i))\nfloor(bitnot(i32))\nfloor(bitnot(i64))\nfloor(ceil(0.5))\nfloor(ceil(1))\nfloor(ceil(f64))\nfloor(ceil(i))\nfloor(ceil(i32))\nfloor(ceil(i64))\nfloor(count(array, false))\nfloor(count(array, ok))\nfloor(count(list, ok))\nfloor(f32 ** 1)\nfloor(f32 ** f64)\nfloor(f32 ** i32)\nfloor(f32 + f32)\nfloor(f32 + i32)\nfloor(f32 + i64)\nfloor(f32 - 0.5)\nfloor(f32 - f64)\nfloor(f32 / 0.5)\nfloor(f32 / f64)\nfloor(f32 / i)\nfloor(f32 / i32)\nfloor(f32 / i64)\nfloor(f32 ^ 0.5)\nfloor(f32 ^ f64)\nfloor(f32 ^ i)\nfloor(f32)\nfloor(f32) != -i32\nfloor(f32) * i32\nfloor(f32) + f32\nfloor(f32) / f32\nfloor(f32) / f64\nfloor(f32) == i64\nfloor(f32) > i32\nfloor(f32) >= f32\nfloor(f32) >= i\nfloor(f32) ^ f32\nfloor(f64 * f32)\nfloor(f64 ** 0.5)\nfloor(f64 ** 1)\nfloor(f64 ** i32)\nfloor(f64 + 0.5)\nfloor(f64 + 1)\nfloor(f64 + i32)\nfloor(f64 - 0.5)\nfloor(f64 - i32)\nfloor(f64 / 0.5)\nfloor(f64 / 1)\nfloor(f64 / f32)\nfloor(f64 / f64)\nfloor(f64 / i)\nfloor(f64 ^ 1)\nfloor(f64)\nfloor(f64) * i32\nfloor(f64) ** f64\nfloor(f64) / f32\nfloor(f64) < i32\nfloor(f64) <= f64\nfloor(f64) <= i64\nfloor(f64) == f64 ** i\nfloor(f64) == i\nfloor(f64) > i32\nfloor(f64) >= 1 * 1\nfloor(f64) >= f32\nfloor(false ? div : 0.5)\nfloor(find(array, true))\nfloor(findIndex(array, ok))\nfloor(findLastIndex(array, ok))\nfloor(float(0.5))\nfloor(float(1))\nfloor(float(f64))\nfloor(float(i32))\nfloor(floor(0.5))\nfloor(floor(1))\nfloor(floor(f32))\nfloor(floor(f64))\nfloor(floor(i))\nfloor(floor(i32))\nfloor(floor(i64))\nfloor(get(array, 1))\nfloor(get(array, i))\nfloor(get(array, i64))\nfloor(half(0.5))\nfloor(half(1))\nfloor(half(f64))\nfloor(i % 1)\nfloor(i % i)\nfloor(i % i32)\nfloor(i % i64)\nfloor(i * 1)\nfloor(i * f64)\nfloor(i ** 0.5)\nfloor(i ** f32)\nfloor(i ** i32)\nfloor(i ** i64)\nfloor(i + 0.5)\nfloor(i + f64)\nfloor(i - 0.5)\nfloor(i - f32)\nfloor(i - i32)\nfloor(i / 0.5)\nfloor(i / 1)\nfloor(i / f64)\nfloor(i ^ i32)\nfloor(i)\nfloor(i) != i\nfloor(i) * f64\nfloor(i) ^ i\nfloor(i32 % i32)\nfloor(i32 * 1)\nfloor(i32 * f32)\nfloor(i32 * f64)\nfloor(i32 * i32)\nfloor(i32 ** i)\nfloor(i32 ** i64)\nfloor(i32 + 0.5)\nfloor(i32 + f64)\nfloor(i32 - 1)\nfloor(i32 - f32)\nfloor(i32 - i)\nfloor(i32 - i32)\nfloor(i32 - i64)\nfloor(i32 ^ 0.5)\nfloor(i32 ^ 1)\nfloor(i32 ^ f64)\nfloor(i32 ^ i)\nfloor(i32 ^ i32)\nfloor(i32 ^ i64)\nfloor(i32)\nfloor(i32) != f32\nfloor(i32) * f64\nfloor(i32) * i\nfloor(i32) * i64\nfloor(i32) > i32\nfloor(i32) > i64\nfloor(i32) >= i32\nfloor(i32) ^ i32\nfloor(i64 % i)\nfloor(i64 * 0.5)\nfloor(i64 * f32)\nfloor(i64 * i)\nfloor(i64 ** 0.5)\nfloor(i64 ** 1)\nfloor(i64 ** i)\nfloor(i64 ** i32)\nfloor(i64 + 0.5)\nfloor(i64 + f64)\nfloor(i64 + i64)\nfloor(i64 - f64)\nfloor(i64 - i)\nfloor(i64 / f32)\nfloor(i64 ^ 0.5)\nfloor(i64 ^ f32)\nfloor(i64 ^ i64)\nfloor(i64)\nfloor(i64) * i64\nfloor(i64) / (i64 - i)\nfloor(i64) / f64\nfloor(i64) / i32\nfloor(i64) < f32\nfloor(i64) <= i64\nfloor(i64) ^ f32\nfloor(int(0.5))\nfloor(int(1))\nfloor(int(i32))\nfloor(int(i64))\nfloor(len(\"foo\"))\nfloor(len(array))\nfloor(len(list))\nfloor(max(0.5))\nfloor(max(1))\nfloor(max(f32))\nfloor(max(f64))\nfloor(max(i32))\nfloor(min(0.5))\nfloor(min(f64) ^ i64)\nfloor(min(i, i64))\nfloor(min(i32))\nfloor(ok ? 1 : 1)\nfloor(ok ? f32 : \"foo\")\nfloor(ok ? i64 : f64)\nfloor(reduce(array, #))\nfloor(reduce(array, i))\nfloor(reduce(array, i64))\nfloor(reduce(list, 1))\nfloor(reduce(list, f32))\nfloor(reduce(list, i64))\nfloor(round(0.5))\nfloor(round(f32))\nfloor(round(f64))\nfloor(round(i))\nfloor(round(i32))\nfloor(score(1))\nfloor(score(1, 1))\nfloor(score(i))\nfloor(true ? 0.5 : false)\nfloor(true ? 1 : true)\nfloor(true ? f64 : 0.5)\nfloor(true ? f64 : array)\nfoo\nfoo != foo\nfoo != nil != nil\nfoo != reduce(list, #)\nfoo == foo\nfoo == foo and 0.5 != f64\nfoo == get(list, 1)\nfoo == list[i]\nfoo == nil ? i : i32\nfoo == nil ? i64 : i\nfoo == reduce(list, #)\nfoo in filter(list, false)\nfoo in groupBy(array, #)\nfoo in groupBy(list, #)\nfoo in list\nfoo in list != ok\nfoo not in groupBy(array, #)\nfoo not in groupBy(array, f64).foo\nfoo not in groupBy(list, #).i\nfoo not in groupBy(list, f32)\nfoo not in groupBy(list, ok)\nfoo not in list\nfoo not in list and ok\nfoo not in list or false\nfoo not in map(list, #)\nfoo.Bar\nfoo.Bar <= foo.Bar\nfoo.Bar matches foo.Bar\nfoo.Bar matches trimPrefix(\"foo\")\nfoo.Qux\nfoo.Qux(\"foo\" + \"foo\")\nfoo.Qux(foo.Bar)\nfoo.Qux(foo.String())\nfoo.Qux(greet(\"foo\"))\nfoo.Qux(string(\"foo\"))\nfoo.Qux(toJSON(i))\nfoo.Qux(type(\"bar\"))\nfoo.Qux(type(f64))\nfoo.Qux(type(half))\nfoo.String\nfoo.String()\nfoo.String() != foo?.String()\nfoo.String() in foo\nfoo.String() not in foo\nfoo?.Bar\nfoo?.Bar != foo?.Bar\nfoo?.Bar in foo\nfoo?.Bar matches toJSON(f64)\nfoo?.Bar not endsWith foo.Bar\nfoo?.Bar not endsWith toJSON(foo)\nfoo?.Qux\nfoo?.Qux(foo?.Bar)\nfoo?.Qux(string(i32))\nfoo?.Qux(toJSON(1))\nfoo?.Qux(toJSON(i32))\nfoo?.Qux(upper(\"bar\"))\nfoo?.String\nfoo?.String()\nfoo?.String() contains string(\"foo\")\nfromBase64(string(ok))\nfromBase64(toBase64(\"bar\"))\nfromBase64(type(1 == 0.5))\nfromBase64(type(add))\nfromBase64(type(div))\nfromBase64(type(false))\nfromBase64(type(greet))\nfromBase64(type(half))\nfromBase64(type(ok))\nfromBase64(type(score))\nfromBase64(type(true))\nfromJSON(string(1))\nfromJSON(string(f32))\nfromJSON(string(f64))\nfromJSON(string(i))\nfromJSON(string(i32))\nfromJSON(string(i64))\nfromJSON(string(ok))\nfromJSON(string(true))\nfromJSON(toJSON(\"bar\"))\nfromJSON(toJSON(0.5))\nfromJSON(toJSON(array))\nfromJSON(toJSON(f64))\nfromJSON(toJSON(false))\nfromJSON(toJSON(foo))\nfromJSON(toJSON(i))\nfromJSON(toJSON(i32))\nfromJSON(toJSON(list))\nfromJSON(toJSON(nil))\nfromJSON(toJSON(true))\nfromPairs(filter(array, false))\nfromPairs(filter(list, false))\nfromPairs(groupBy(array, #).String)\nget([\"foo\"], i32)\nget(array, -1)\nget(array, -i32)\nget(array, -i64)\nget(array, -score(1))\nget(array, 1 * 1)\nget(array, 1 * i)\nget(array, 1) ** f32\nget(array, 1) < f32\nget(array, 1) > i32\nget(array, 1) > i64\nget(array, bitnot(1))\nget(array, count(array, ok))\nget(array, false ? \"foo\" : 0.5)\nget(array, i)\nget(array, i) != f32\nget(array, i) != i32\nget(array, i) * i32\nget(array, i) - i\nget(array, i) / i64\nget(array, i) > f64\nget(array, i) >= f64\nget(array, i) >= i64\nget(array, i) ^ half(0.5)\nget(array, i32 % i32)\nget(array, i32)\nget(array, i32) / f64\nget(array, i32) < i\nget(array, i64 - 1)\nget(array, i64)\nget(array, i64) > f64\nget(array, last(array))\nget(array, min(i))\nget(array, reduce(array, #))\nget(array, reduce(list, i64))\nget(array, score(1))\nget(array, score(abs(1)))\nget(array, score(i))\nget(array, sum(array))\nget(false ? 0.5 : greet, list)\nget(false ? add : array, f64)\nget(false ? add : score, ok)\nget(false ? f64 : 1, ok)\nget(false ? f64 : score, add)\nget(false ? false : f32, i)\nget(false ? i32 : list, i64)\nget(false ? i64 : true, f64)\nget(false ? score : ok, trimSuffix(\"bar\", \"bar\"))\nget(filter(list, true), i)\nget(groupBy(array, \"bar\"), i)\nget(groupBy(array, \"bar\"), ok)\nget(groupBy(array, #), f32)\nget(groupBy(array, #), f64)\nget(groupBy(array, #), foo)\nget(groupBy(array, #), i)\nget(groupBy(array, #), i64 * 0.5)\nget(groupBy(array, #), i64)\nget(groupBy(array, 0.5), ok)\nget(groupBy(array, 1), f32)\nget(groupBy(array, f64), i64)\nget(groupBy(array, false), findIndex(array, ok))\nget(groupBy(array, i), ok)\nget(groupBy(array, true), i32)\nget(groupBy(list, \"bar\"), i32)\nget(groupBy(list, #), f32 <= f64)\nget(groupBy(list, #), f32)\nget(groupBy(list, #), foo)\nget(groupBy(list, #), i)\nget(groupBy(list, #), i32)\nget(groupBy(list, #), i64)\nget(groupBy(list, #), int(f32))\nget(groupBy(list, #), reduce(array, foo))\nget(groupBy(list, #), score(1))\nget(groupBy(list, 0.5), ok)\nget(groupBy(list, 1), i32)\nget(groupBy(list, foo), i32)\nget(i .. 1, 1 * 1)\nget(i .. i32, i)\nget(i32 .. i, i64)\nget(i64 .. 1, i32)\nget(i64 .. i, i32)\nget(i64 .. i64, i64)\nget(list, -1)\nget(list, -i)\nget(list, -i64)\nget(list, 1 * 1)\nget(list, 1 - 1)\nget(list, 1 - i)\nget(list, 1) != foo\nget(list, 1).Bar\nget(list, 1).Qux\nget(list, 1).String\nget(list, 1).String()\nget(list, 1)?.Bar\nget(list, 1)?.Qux\nget(list, 1)?.String\nget(list, 1)?.String()\nget(list, bitshr(i, i32))\nget(list, first(array))\nget(list, get(array, 1))\nget(list, get(array, i64))\nget(list, i % 1)\nget(list, i)\nget(list, i).Bar\nget(list, i).Qux\nget(list, i).String\nget(list, i)?.Bar\nget(list, i)?.Qux\nget(list, i)?.String\nget(list, i)?.String()\nget(list, i32 * i32)\nget(list, i32 - i32)\nget(list, i32)\nget(list, i32).Bar\nget(list, i32).Qux\nget(list, i32).String\nget(list, i32)?.Bar\nget(list, i32)?.Qux\nget(list, i32)?.String\nget(list, i32)?.String()\nget(list, i64 * 1)\nget(list, i64 * i)\nget(list, i64 - 1)\nget(list, i64)\nget(list, i64).Bar\nget(list, i64).Qux\nget(list, i64).String\nget(list, i64)?.Bar\nget(list, i64)?.Qux\nget(list, i64)?.String\nget(list, i64)?.String()\nget(list, int(1))\nget(list, max(i32))\nget(list, min(i32))\nget(list, min(i64))\nget(list, ok ? 0.5 : \"foo\")\nget(list, reduce(list, i64))\nget(list, score(1))\nget(list, score(i))\nget(list, true ? i : i32)\nget(list[i64:1], i)\nget(map(array, #), i)\nget(map(array, #), i32)\nget(map(array, #), i64)\nget(map(array, add), i32)\nget(map(array, array), i)\nget(map(array, greet), i64)\nget(map(array, half), i64)\nget(map(list, \"foo\"), i64)\nget(map(list, #), i)\nget(map(list, #), i64)\nget(map(list, 1), i32)\nget(map(list, array), i)\nget(map(list, i32), i64)\nget(map(list, i64), i64)\nget(ok ? 1 : \"bar\", f32)\nget(ok ? add : f32, array)\nget(ok ? f64 : div, i64)\nget(ok ? false : list, f32 > i)\nget(ok ? half : i32, i)\nget(ok ? half : ok, f64)\nget(ok ? i : 0.5, half)\nget(ok ? i32 : half, f64)\nget(ok ? i64 : foo, f32)\nget(ok ? list : i32, f32)\nget(ok ? ok : div, greet)\nget(ok ? score : f64, i)\nget(ok ? score : i64, foo)\nget(reduce(list, array), i32)\nget(sort(array), i32)\nget(take(list, i), i64)\nget(true ? \"bar\" : ok, score(i))\nget(true ? 0.5 : i32, array)\nget(true ? f32 : 0.5, ok)\nget(true ? false : foo, i64 > 0.5)\nget(true ? greet : i32, score)\nget(true ? half : f32, greet)\nget(true ? half : list, add)\nget(true ? i64 : greet, i32)\nget(true ? score : true, half)?.half\nget(true ? true : i, f64)\nget({\"foo\": foo, \"bar\": false}, type(i))\ngreet\ngreet != greet\ngreet != greet != ok\ngreet != nil ? \"bar\" : add\ngreet != nil ? 0.5 : false\ngreet != nil ? list : false\ngreet == greet\ngreet == greet ? 0.5 : \"bar\"\ngreet == greet and ok\ngreet == nil == ok\ngreet == nil ? i64 : ok\ngreet in groupBy(array, f64).f32\ngreet in groupBy(list, #).score\ngreet not in sort(array)\ngreet(\"bar\" + \"bar\")\ngreet(\"foo\" + \"foo\")\ngreet(\"foo\") startsWith type(f64)\ngreet(false ? i64 : \"bar\")\ngreet(foo.Bar)\ngreet(foo.Qux(\"foo\"))\ngreet(foo.String())\ngreet(foo?.Bar)\ngreet(foo?.String())\ngreet(greet(\"bar\"))\ngreet(greet(\"foo\"))\ngreet(lower(\"bar\"))\ngreet(lower(\"foo\"))\ngreet(ok ? \"bar\" : 1)\ngreet(ok ? \"bar\" : i64)\ngreet(ok ? \"foo\" : 0.5)\ngreet(ok ? \"foo\" : div)\ngreet(ok ? \"foo\" : true)\ngreet(reduce(array, \"bar\"))\ngreet(reduce(array, \"foo\"))\ngreet(reduce(list, \"foo\"))\ngreet(repeat(\"bar\", 1))\ngreet(repeat(foo?.String(), i32))\ngreet(string(\"bar\"))\ngreet(string(\"foo\"))\ngreet(string(0.5))\ngreet(string(1))\ngreet(string(add))\ngreet(string(array))\ngreet(string(div))\ngreet(string(f32))\ngreet(string(f64))\ngreet(string(false))\ngreet(string(foo))\ngreet(string(greet))\ngreet(string(half))\ngreet(string(i))\ngreet(string(i32))\ngreet(string(i64))\ngreet(string(list))\ngreet(string(nil))\ngreet(string(ok))\ngreet(string(score))\ngreet(string(true))\ngreet(toBase64(\"bar\"))\ngreet(toBase64(trimPrefix(\"bar\")))\ngreet(toJSON(\"bar\"))\ngreet(toJSON(\"foo\"))\ngreet(toJSON(0.5))\ngreet(toJSON(1))\ngreet(toJSON(array))\ngreet(toJSON(f32))\ngreet(toJSON(f64))\ngreet(toJSON(false))\ngreet(toJSON(foo))\ngreet(toJSON(i))\ngreet(toJSON(i32))\ngreet(toJSON(i64))\ngreet(toJSON(list))\ngreet(toJSON(nil))\ngreet(toJSON(ok))\ngreet(toJSON(true))\ngreet(trim(\"bar\"))\ngreet(trim(\"foo\"))\ngreet(trimPrefix(\"bar\"))\ngreet(trimPrefix(\"foo\"))\ngreet(trimSuffix(\"bar\"))\ngreet(trimSuffix(\"foo\"))\ngreet(trimSuffix(foo.String()))\ngreet(trimSuffix(foo?.Bar))\ngreet(true ? \"bar\" : i64)\ngreet(true ? \"bar\" : ok)\ngreet(true ? \"foo\" : foo)\ngreet(type(\"bar\"))\ngreet(type(\"foo\"))\ngreet(type(0.5))\ngreet(type(1))\ngreet(type(add))\ngreet(type(array))\ngreet(type(div))\ngreet(type(f32))\ngreet(type(f64))\ngreet(type(false))\ngreet(type(foo))\ngreet(type(greet))\ngreet(type(half))\ngreet(type(i))\ngreet(type(i32))\ngreet(type(i64))\ngreet(type(list))\ngreet(type(nil))\ngreet(type(ok))\ngreet(type(score))\ngreet(type(true))\ngreet(upper(\"bar\"))\ngreet(upper(\"foo\"))\ngroupBy(1 .. 1, #).f64\ngroupBy(1 .. i, #)\ngroupBy(1 .. i, i32)?.score\ngroupBy(1 .. i32, #)\ngroupBy(1 .. i32, ok)\ngroupBy(1 .. i64, i32)\ngroupBy([0.5, f64], nil == \"foo\")\ngroupBy([1], # <= #)\ngroupBy([f32 ^ i64], #)\ngroupBy([f32], f64)\ngroupBy([f64], # >= f32)\ngroupBy([half], f32)\ngroupBy([i32], array[#])\ngroupBy([nil], foo)\ngroupBy([true], #)\ngroupBy(array, !false)\ngroupBy(array, !true)\ngroupBy(array, \"bar\" in foo).String\ngroupBy(array, \"bar\").Bar\ngroupBy(array, \"bar\").Qux\ngroupBy(array, \"bar\").String\ngroupBy(array, \"bar\").add\ngroupBy(array, \"bar\").array\ngroupBy(array, \"bar\").div\ngroupBy(array, \"bar\").f32\ngroupBy(array, \"bar\").f64\ngroupBy(array, \"bar\").foo\ngroupBy(array, \"bar\").greet\ngroupBy(array, \"bar\").half\ngroupBy(array, \"bar\").i\ngroupBy(array, \"bar\").i32\ngroupBy(array, \"bar\").i64\ngroupBy(array, \"bar\").list\ngroupBy(array, \"bar\").ok\ngroupBy(array, \"bar\").score\ngroupBy(array, \"bar\")?.Bar\ngroupBy(array, \"bar\")?.Qux\ngroupBy(array, \"bar\")?.String\ngroupBy(array, \"bar\")?.add\ngroupBy(array, \"bar\")?.array\ngroupBy(array, \"bar\")?.div\ngroupBy(array, \"bar\")?.f32\ngroupBy(array, \"bar\")?.f64\ngroupBy(array, \"bar\")?.foo\ngroupBy(array, \"bar\")?.greet\ngroupBy(array, \"bar\")?.half\ngroupBy(array, \"bar\")?.i\ngroupBy(array, \"bar\")?.i64\ngroupBy(array, \"bar\")?.list\ngroupBy(array, \"bar\")?.ok\ngroupBy(array, \"bar\")?.score\ngroupBy(array, \"bar\")[f32 > f32]\ngroupBy(array, \"foo\").Bar\ngroupBy(array, \"foo\").Qux\ngroupBy(array, \"foo\").String\ngroupBy(array, \"foo\").add\ngroupBy(array, \"foo\").array\ngroupBy(array, \"foo\").div\ngroupBy(array, \"foo\").f32\ngroupBy(array, \"foo\").f64\ngroupBy(array, \"foo\").foo\ngroupBy(array, \"foo\").greet\ngroupBy(array, \"foo\").half\ngroupBy(array, \"foo\").i\ngroupBy(array, \"foo\").i32\ngroupBy(array, \"foo\").i64\ngroupBy(array, \"foo\").list\ngroupBy(array, \"foo\").ok\ngroupBy(array, \"foo\").score\ngroupBy(array, \"foo\")?.Bar\ngroupBy(array, \"foo\")?.String\ngroupBy(array, \"foo\")?.add\ngroupBy(array, \"foo\")?.array\ngroupBy(array, \"foo\")?.div\ngroupBy(array, \"foo\")?.f32\ngroupBy(array, \"foo\")?.f64\ngroupBy(array, \"foo\")?.foo\ngroupBy(array, \"foo\")?.greet\ngroupBy(array, \"foo\")?.half\ngroupBy(array, \"foo\")?.i\ngroupBy(array, \"foo\")?.i32\ngroupBy(array, \"foo\")?.i64\ngroupBy(array, \"foo\")?.list\ngroupBy(array, \"foo\")?.ok\ngroupBy(array, \"foo\")?.score\ngroupBy(array, # != #)\ngroupBy(array, # != #).Qux\ngroupBy(array, # != #)?.array\ngroupBy(array, # != 0.5)\ngroupBy(array, # != 1)\ngroupBy(array, # != f32)\ngroupBy(array, # != f64)\ngroupBy(array, # != f64)?.String\ngroupBy(array, # != i64)\ngroupBy(array, # != nil)\ngroupBy(array, # % #)\ngroupBy(array, # % 1)\ngroupBy(array, # % i32)\ngroupBy(array, # * #)\ngroupBy(array, # * #)?.Qux\ngroupBy(array, # * 0.5)\ngroupBy(array, # * 1)\ngroupBy(array, # * i)\ngroupBy(array, # * i32)\ngroupBy(array, # * i64)\ngroupBy(array, # ** #)\ngroupBy(array, # ** #).add\ngroupBy(array, # ** 0.5)\ngroupBy(array, # ** 0.5)?.foo\ngroupBy(array, # ** 0.5)?.greet\ngroupBy(array, # ** 1)\ngroupBy(array, # ** f64)\ngroupBy(array, # ** i)\ngroupBy(array, # ** i32)\ngroupBy(array, # ** i64)\ngroupBy(array, # + #)\ngroupBy(array, # + 1)\ngroupBy(array, # + f32)\ngroupBy(array, # + i)\ngroupBy(array, # - #)\ngroupBy(array, # - 0.5)\ngroupBy(array, # - 1)\ngroupBy(array, # - f32)\ngroupBy(array, # - f64)\ngroupBy(array, # - i)\ngroupBy(array, # - i32)\ngroupBy(array, # / #)\ngroupBy(array, # / 0.5)\ngroupBy(array, # / 0.5)?.foo\ngroupBy(array, # / 1)\ngroupBy(array, # / i)\ngroupBy(array, # / i32)\ngroupBy(array, # / i64)\ngroupBy(array, # < # || 0.5 > f64)\ngroupBy(array, # < #)\ngroupBy(array, # < 0.5)\ngroupBy(array, # < 1)\ngroupBy(array, # < i32)\ngroupBy(array, # < i64)\ngroupBy(array, # <= #)\ngroupBy(array, # <= #)?.Bar\ngroupBy(array, # <= #)?.Qux\ngroupBy(array, # <= 0.5)\ngroupBy(array, # <= 1)\ngroupBy(array, # <= f32)\ngroupBy(array, # <= f64)\ngroupBy(array, # <= i)\ngroupBy(array, # <= i64)\ngroupBy(array, # == #)\ngroupBy(array, # == #).String\ngroupBy(array, # == #)?.half\ngroupBy(array, # == 0.5)\ngroupBy(array, # == 1)\ngroupBy(array, # == f32)\ngroupBy(array, # == f32).half\ngroupBy(array, # == f64)\ngroupBy(array, # == i)\ngroupBy(array, # == i64)\ngroupBy(array, # == nil)\ngroupBy(array, # > #)\ngroupBy(array, # > 0.5)\ngroupBy(array, # > 1)\ngroupBy(array, # > 1).Bar\ngroupBy(array, # > i)?.i64\ngroupBy(array, # > i64)\ngroupBy(array, # >= #)\ngroupBy(array, # >= f64)\ngroupBy(array, # >= i)\ngroupBy(array, # >= i32)\ngroupBy(array, # >= i64)\ngroupBy(array, # ^ #)\ngroupBy(array, # ^ 0.5)\ngroupBy(array, # ^ f32)\ngroupBy(array, # ^ i)\ngroupBy(array, # ^ i32)\ngroupBy(array, # in array)\ngroupBy(array, #)\ngroupBy(array, #).Bar\ngroupBy(array, #).Qux\ngroupBy(array, #).String\ngroupBy(array, #).add\ngroupBy(array, #).array\ngroupBy(array, #).div\ngroupBy(array, #).f32\ngroupBy(array, #).f64\ngroupBy(array, #).foo\ngroupBy(array, #).greet\ngroupBy(array, #).half\ngroupBy(array, #).i\ngroupBy(array, #).i32\ngroupBy(array, #).i64\ngroupBy(array, #).list\ngroupBy(array, #).ok\ngroupBy(array, #).score\ngroupBy(array, #)?.Bar\ngroupBy(array, #)?.Qux\ngroupBy(array, #)?.String\ngroupBy(array, #)?.add\ngroupBy(array, #)?.array\ngroupBy(array, #)?.div\ngroupBy(array, #)?.f32\ngroupBy(array, #)?.f64\ngroupBy(array, #)?.foo\ngroupBy(array, #)?.greet\ngroupBy(array, #)?.half\ngroupBy(array, #)?.i\ngroupBy(array, #)?.i32\ngroupBy(array, #)?.i64\ngroupBy(array, #)?.list\ngroupBy(array, #)?.ok\ngroupBy(array, #)?.score\ngroupBy(array, #)[1 / i]\ngroupBy(array, #)[f32]\ngroupBy(array, #)[f64]\ngroupBy(array, #)[foo]\ngroupBy(array, #)[i32]\ngroupBy(array, #)[i64]\ngroupBy(array, #)[i]\ngroupBy(array, #)[ok]\ngroupBy(array, #)[reduce(list, #)]\ngroupBy(array, -# * # * 0.5)\ngroupBy(array, -#)\ngroupBy(array, -#).Qux\ngroupBy(array, -0.5)\ngroupBy(array, -1)\ngroupBy(array, -f32)\ngroupBy(array, -i)?.score\ngroupBy(array, -i32)\ngroupBy(array, -i64)\ngroupBy(array, 0.5 != #)\ngroupBy(array, 0.5 * #)\ngroupBy(array, 0.5 * 0.5)\ngroupBy(array, 0.5 * f64)\ngroupBy(array, 0.5 ** #)\ngroupBy(array, 0.5 ** 1)\ngroupBy(array, 0.5 ** i64)\ngroupBy(array, 0.5 + #)?.score\ngroupBy(array, 0.5 + f32)\ngroupBy(array, 0.5 - 1)\ngroupBy(array, 0.5 / #).array\ngroupBy(array, 0.5 / f64)\ngroupBy(array, 0.5 / i64)\ngroupBy(array, 0.5 < 0.5)\ngroupBy(array, 0.5 <= f32)\ngroupBy(array, 0.5 == #)\ngroupBy(array, 0.5 >= #)\ngroupBy(array, 0.5 >= i32)\ngroupBy(array, 0.5 >= i64)\ngroupBy(array, 0.5 ^ f32)\ngroupBy(array, 0.5 ^ i64)\ngroupBy(array, 0.5).Bar\ngroupBy(array, 0.5).Qux\ngroupBy(array, 0.5).String\ngroupBy(array, 0.5).add\ngroupBy(array, 0.5).array\ngroupBy(array, 0.5).div\ngroupBy(array, 0.5).f32\ngroupBy(array, 0.5).f64\ngroupBy(array, 0.5).foo\ngroupBy(array, 0.5).greet\ngroupBy(array, 0.5).half\ngroupBy(array, 0.5).i\ngroupBy(array, 0.5).i32\ngroupBy(array, 0.5).i64\ngroupBy(array, 0.5).list\ngroupBy(array, 0.5).ok\ngroupBy(array, 0.5).score\ngroupBy(array, 0.5)?.Bar\ngroupBy(array, 0.5)?.Qux\ngroupBy(array, 0.5)?.String\ngroupBy(array, 0.5)?.add\ngroupBy(array, 0.5)?.array\ngroupBy(array, 0.5)?.div\ngroupBy(array, 0.5)?.f32\ngroupBy(array, 0.5)?.f64\ngroupBy(array, 0.5)?.foo\ngroupBy(array, 0.5)?.greet\ngroupBy(array, 0.5)?.half\ngroupBy(array, 0.5)?.i\ngroupBy(array, 0.5)?.i32\ngroupBy(array, 0.5)?.i64\ngroupBy(array, 0.5)?.list\ngroupBy(array, 0.5)?.ok\ngroupBy(array, 0.5)?.score\ngroupBy(array, 1 != #)?.String\ngroupBy(array, 1 != 0.5)\ngroupBy(array, 1 != f32)\ngroupBy(array, 1 % #)\ngroupBy(array, 1 % i)\ngroupBy(array, 1 * 0.5)\ngroupBy(array, 1 * i)\ngroupBy(array, 1 + #)\ngroupBy(array, 1 + 1)\ngroupBy(array, 1 - #)\ngroupBy(array, 1 - 1)\ngroupBy(array, 1 / #)\ngroupBy(array, 1 < #)\ngroupBy(array, 1 < i32)?.array\ngroupBy(array, 1 < i64)?.ok\ngroupBy(array, 1 <= #)\ngroupBy(array, 1 == #)\ngroupBy(array, 1 == #).add\ngroupBy(array, 1 == i32)\ngroupBy(array, 1 == nil)\ngroupBy(array, 1 > i)\ngroupBy(array, 1 >= #)\ngroupBy(array, 1 ^ #)\ngroupBy(array, 1 not in array)\ngroupBy(array, 1).Bar\ngroupBy(array, 1).Qux\ngroupBy(array, 1).String\ngroupBy(array, 1).add\ngroupBy(array, 1).array\ngroupBy(array, 1).div\ngroupBy(array, 1).f64\ngroupBy(array, 1).foo\ngroupBy(array, 1).greet\ngroupBy(array, 1).half\ngroupBy(array, 1).i\ngroupBy(array, 1).i32\ngroupBy(array, 1).i64\ngroupBy(array, 1).list\ngroupBy(array, 1).ok\ngroupBy(array, 1).score\ngroupBy(array, 1)?.Bar\ngroupBy(array, 1)?.Qux\ngroupBy(array, 1)?.String\ngroupBy(array, 1)?.add\ngroupBy(array, 1)?.array\ngroupBy(array, 1)?.div\ngroupBy(array, 1)?.f32\ngroupBy(array, 1)?.f64\ngroupBy(array, 1)?.foo\ngroupBy(array, 1)?.greet\ngroupBy(array, 1)?.half\ngroupBy(array, 1)?.i\ngroupBy(array, 1)?.i32\ngroupBy(array, 1)?.i64\ngroupBy(array, 1)?.list\ngroupBy(array, 1)?.ok\ngroupBy(array, 1)?.score\ngroupBy(array, abs(#))\ngroupBy(array, abs(0.5))\ngroupBy(array, abs(1))\ngroupBy(array, abs(f32))\ngroupBy(array, abs(f64))\ngroupBy(array, abs(i))\ngroupBy(array, abs(i64))\ngroupBy(array, add(#, #))\ngroupBy(array, add(#, 1))?.i64\ngroupBy(array, bitnand(1, #))\ngroupBy(array, bitnot(#))\ngroupBy(array, bitnot(1))\ngroupBy(array, bitor(#, #))\ngroupBy(array, bitor(1, #))\ngroupBy(array, bitor(i32, #))\ngroupBy(array, bitshl(1, #))\ngroupBy(array, bitshr(i, #))\ngroupBy(array, bitushr(#, #))\ngroupBy(array, ceil(#))\ngroupBy(array, ceil(i))\ngroupBy(array, ceil(i32))\ngroupBy(array, div(#, #))\ngroupBy(array, f32 != #)\ngroupBy(array, f32 ** 0.5)\ngroupBy(array, f32 - #)\ngroupBy(array, f32 - f64)\ngroupBy(array, f32 / #)\ngroupBy(array, f32 < #)\ngroupBy(array, f32 <= #)\ngroupBy(array, f32 == #)\ngroupBy(array, f32 > 0.5)\ngroupBy(array, f32 > i32)\ngroupBy(array, f32 ^ i)\ngroupBy(array, f32)\ngroupBy(array, f32).Bar\ngroupBy(array, f32).Qux\ngroupBy(array, f32).String\ngroupBy(array, f32).add\ngroupBy(array, f32).array\ngroupBy(array, f32).div\ngroupBy(array, f32).f64\ngroupBy(array, f32).greet\ngroupBy(array, f32).half\ngroupBy(array, f32).i\ngroupBy(array, f32).i32\ngroupBy(array, f32).i64\ngroupBy(array, f32).list\ngroupBy(array, f32).ok\ngroupBy(array, f32).score\ngroupBy(array, f32)?.Bar\ngroupBy(array, f32)?.Qux\ngroupBy(array, f32)?.String\ngroupBy(array, f32)?.add\ngroupBy(array, f32)?.array\ngroupBy(array, f32)?.div\ngroupBy(array, f32)?.f32\ngroupBy(array, f32)?.f64\ngroupBy(array, f32)?.greet\ngroupBy(array, f32)?.half\ngroupBy(array, f32)?.i32\ngroupBy(array, f32)?.i64\ngroupBy(array, f32)?.list\ngroupBy(array, f32)?.ok\ngroupBy(array, f32)?.score\ngroupBy(array, f32)[foo]\ngroupBy(array, f64 != #)\ngroupBy(array, f64 != i64)\ngroupBy(array, f64 ** #)\ngroupBy(array, f64 - #)\ngroupBy(array, f64 - #).i32\ngroupBy(array, f64 < #)\ngroupBy(array, f64 == #)\ngroupBy(array, f64 > #)\ngroupBy(array, f64 >= #)\ngroupBy(array, f64 >= 0.5)\ngroupBy(array, f64)\ngroupBy(array, f64).Bar\ngroupBy(array, f64).Qux\ngroupBy(array, f64).String\ngroupBy(array, f64).add\ngroupBy(array, f64).array\ngroupBy(array, f64).div\ngroupBy(array, f64).f32\ngroupBy(array, f64).f64\ngroupBy(array, f64).foo\ngroupBy(array, f64).greet\ngroupBy(array, f64).half\ngroupBy(array, f64).i\ngroupBy(array, f64).i32\ngroupBy(array, f64).i64\ngroupBy(array, f64).list\ngroupBy(array, f64).ok\ngroupBy(array, f64).score\ngroupBy(array, f64)?.Bar\ngroupBy(array, f64)?.Qux\ngroupBy(array, f64)?.String\ngroupBy(array, f64)?.add\ngroupBy(array, f64)?.array\ngroupBy(array, f64)?.div\ngroupBy(array, f64)?.f32\ngroupBy(array, f64)?.f64\ngroupBy(array, f64)?.foo\ngroupBy(array, f64)?.greet\ngroupBy(array, f64)?.half\ngroupBy(array, f64)?.i\ngroupBy(array, f64)?.i32\ngroupBy(array, f64)?.i64\ngroupBy(array, f64)?.list\ngroupBy(array, f64)?.ok\ngroupBy(array, f64)?.score\ngroupBy(array, f64)[i32]\ngroupBy(array, false ? # : #)\ngroupBy(array, false || ok)\ngroupBy(array, false).Bar\ngroupBy(array, false).Qux\ngroupBy(array, false).String\ngroupBy(array, false).add\ngroupBy(array, false).array\ngroupBy(array, false).div\ngroupBy(array, false).f32\ngroupBy(array, false).f64\ngroupBy(array, false).greet\ngroupBy(array, false).half\ngroupBy(array, false).i\ngroupBy(array, false).i32\ngroupBy(array, false).i64\ngroupBy(array, false).list\ngroupBy(array, false).ok\ngroupBy(array, false).score\ngroupBy(array, false)?.Bar\ngroupBy(array, false)?.Qux\ngroupBy(array, false)?.String\ngroupBy(array, false)?.add\ngroupBy(array, false)?.array\ngroupBy(array, false)?.div\ngroupBy(array, false)?.f32\ngroupBy(array, false)?.f64\ngroupBy(array, false)?.foo\ngroupBy(array, false)?.greet\ngroupBy(array, false)?.half\ngroupBy(array, false)?.i\ngroupBy(array, false)?.i32\ngroupBy(array, false)?.i64\ngroupBy(array, false)?.list\ngroupBy(array, false)?.ok\ngroupBy(array, false)?.score\ngroupBy(array, findLastIndex(list, true))\ngroupBy(array, float(#))\ngroupBy(array, floor(#))\ngroupBy(array, floor(i32))\ngroupBy(array, foo)\ngroupBy(array, foo).Bar\ngroupBy(array, foo).Qux\ngroupBy(array, foo).String\ngroupBy(array, foo).add\ngroupBy(array, foo).array\ngroupBy(array, foo).div\ngroupBy(array, foo).f32\ngroupBy(array, foo).f64\ngroupBy(array, foo).foo\ngroupBy(array, foo).greet\ngroupBy(array, foo).half\ngroupBy(array, foo).i\ngroupBy(array, foo).i32\ngroupBy(array, foo).i64\ngroupBy(array, foo).list\ngroupBy(array, foo).ok\ngroupBy(array, foo).score\ngroupBy(array, foo)?.Bar\ngroupBy(array, foo)?.Qux\ngroupBy(array, foo)?.String\ngroupBy(array, foo)?.add\ngroupBy(array, foo)?.array\ngroupBy(array, foo)?.div\ngroupBy(array, foo)?.f32\ngroupBy(array, foo)?.f64\ngroupBy(array, foo)?.foo\ngroupBy(array, foo)?.greet\ngroupBy(array, foo)?.half\ngroupBy(array, foo)?.i\ngroupBy(array, foo)?.i32\ngroupBy(array, foo)?.i64\ngroupBy(array, foo)?.list\ngroupBy(array, foo)?.ok\ngroupBy(array, foo)?.score\ngroupBy(array, foo.Bar)\ngroupBy(array, foo?.Bar)\ngroupBy(array, get(array, #))\ngroupBy(array, get(list, #))\ngroupBy(array, get(list, i32))\ngroupBy(array, half(1))\ngroupBy(array, half(f64))\ngroupBy(array, half(f64))?.i64\ngroupBy(array, i != #)\ngroupBy(array, i % #)\ngroupBy(array, i * #)\ngroupBy(array, i * #)?.f64\ngroupBy(array, i ** #)\ngroupBy(array, i + #)\ngroupBy(array, i - f64).array\ngroupBy(array, i / #)\ngroupBy(array, i < #)\ngroupBy(array, i <= #)\ngroupBy(array, i <= f64)\ngroupBy(array, i > i)\ngroupBy(array, i ^ #)\ngroupBy(array, i ^ 0.5)\ngroupBy(array, i)\ngroupBy(array, i).Bar\ngroupBy(array, i).Qux\ngroupBy(array, i).String\ngroupBy(array, i).add\ngroupBy(array, i).array\ngroupBy(array, i).div\ngroupBy(array, i).f32\ngroupBy(array, i).f64\ngroupBy(array, i).foo\ngroupBy(array, i).greet\ngroupBy(array, i).half\ngroupBy(array, i).i\ngroupBy(array, i).i32\ngroupBy(array, i).i64\ngroupBy(array, i).list\ngroupBy(array, i).ok\ngroupBy(array, i).score\ngroupBy(array, i)?.Bar\ngroupBy(array, i)?.String\ngroupBy(array, i)?.add\ngroupBy(array, i)?.array\ngroupBy(array, i)?.div\ngroupBy(array, i)?.f32\ngroupBy(array, i)?.f64\ngroupBy(array, i)?.foo\ngroupBy(array, i)?.greet\ngroupBy(array, i)?.half\ngroupBy(array, i)?.i\ngroupBy(array, i)?.i32\ngroupBy(array, i)?.i64\ngroupBy(array, i)?.list\ngroupBy(array, i)?.ok\ngroupBy(array, i)?.score\ngroupBy(array, i)[f64]\ngroupBy(array, i)[false ? i32 : ok]\ngroupBy(array, i32 * f64)\ngroupBy(array, i32 ** # <= i32)\ngroupBy(array, i32 ** f64)\ngroupBy(array, i32 ** i)\ngroupBy(array, i32 ** i64)\ngroupBy(array, i32 + #)\ngroupBy(array, i32 - 1)?.foo\ngroupBy(array, i32 - i64)\ngroupBy(array, i32 / #)\ngroupBy(array, i32 / f32)\ngroupBy(array, i32 < #)\ngroupBy(array, i32 < f64)\ngroupBy(array, i32 <= 1)\ngroupBy(array, i32 == #)\ngroupBy(array, i32 == i)\ngroupBy(array, i32 > #)\ngroupBy(array, i32 >= #).Bar\ngroupBy(array, i32 ^ #)\ngroupBy(array, i32)\ngroupBy(array, i32).Bar\ngroupBy(array, i32).Qux\ngroupBy(array, i32).String\ngroupBy(array, i32).add\ngroupBy(array, i32).array\ngroupBy(array, i32).div\ngroupBy(array, i32).f32\ngroupBy(array, i32).f64\ngroupBy(array, i32).greet\ngroupBy(array, i32).half\ngroupBy(array, i32).i\ngroupBy(array, i32).i32\ngroupBy(array, i32).i64\ngroupBy(array, i32).list\ngroupBy(array, i32).ok\ngroupBy(array, i32).score\ngroupBy(array, i32)?.Bar\ngroupBy(array, i32)?.Qux\ngroupBy(array, i32)?.String\ngroupBy(array, i32)?.add\ngroupBy(array, i32)?.array\ngroupBy(array, i32)?.div\ngroupBy(array, i32)?.f32\ngroupBy(array, i32)?.f64\ngroupBy(array, i32)?.foo\ngroupBy(array, i32)?.greet\ngroupBy(array, i32)?.half\ngroupBy(array, i32)?.i\ngroupBy(array, i32)?.i32\ngroupBy(array, i32)?.i64\ngroupBy(array, i32)?.list\ngroupBy(array, i32)?.ok\ngroupBy(array, i32)?.score\ngroupBy(array, i32)[i]\ngroupBy(array, i64 != i)\ngroupBy(array, i64 % #)\ngroupBy(array, i64 * f32)\ngroupBy(array, i64 ** #)\ngroupBy(array, i64 ** i)\ngroupBy(array, i64 + #)\ngroupBy(array, i64 - #)\ngroupBy(array, i64 / #)?.Qux\ngroupBy(array, i64 / 0.5)\ngroupBy(array, i64 < #)\ngroupBy(array, i64 <= #).foo\ngroupBy(array, i64 >= #)\ngroupBy(array, i64 ^ #)\ngroupBy(array, i64)\ngroupBy(array, i64).Bar\ngroupBy(array, i64).Qux\ngroupBy(array, i64).String\ngroupBy(array, i64).add\ngroupBy(array, i64).array\ngroupBy(array, i64).div\ngroupBy(array, i64).f32\ngroupBy(array, i64).f64\ngroupBy(array, i64).foo\ngroupBy(array, i64).greet\ngroupBy(array, i64).half\ngroupBy(array, i64).i\ngroupBy(array, i64).i32\ngroupBy(array, i64).i64\ngroupBy(array, i64).list\ngroupBy(array, i64).ok\ngroupBy(array, i64).score\ngroupBy(array, i64)?.Bar\ngroupBy(array, i64)?.Qux\ngroupBy(array, i64)?.String\ngroupBy(array, i64)?.add\ngroupBy(array, i64)?.array\ngroupBy(array, i64)?.div\ngroupBy(array, i64)?.f32\ngroupBy(array, i64)?.f64\ngroupBy(array, i64)?.foo\ngroupBy(array, i64)?.greet\ngroupBy(array, i64)?.half\ngroupBy(array, i64)?.i\ngroupBy(array, i64)?.i32\ngroupBy(array, i64)?.i64\ngroupBy(array, i64)?.list\ngroupBy(array, i64)?.ok\ngroupBy(array, i64)?.score\ngroupBy(array, int(f64)).i32\ngroupBy(array, max(#))\ngroupBy(array, max(#, #, #)).ok\ngroupBy(array, max(0.5, #))\ngroupBy(array, max(1))\ngroupBy(array, max(f64))\ngroupBy(array, min(#))\ngroupBy(array, min(0.5))\ngroupBy(array, min(f32))\ngroupBy(array, min(i, #, i32))\ngroupBy(array, nil != #)\ngroupBy(array, nil != f64)\ngroupBy(array, nil != foo)\ngroupBy(array, nil != half)\ngroupBy(array, nil == #)\ngroupBy(array, nil == 0.5)\ngroupBy(array, none(array, false))\ngroupBy(array, none(array, ok))\ngroupBy(array, not ok)?.Bar\ngroupBy(array, not true)\ngroupBy(array, ok == ok)\ngroupBy(array, ok ? # : #)\ngroupBy(array, ok)\ngroupBy(array, ok).Bar\ngroupBy(array, ok).Qux\ngroupBy(array, ok).String\ngroupBy(array, ok).add\ngroupBy(array, ok).array\ngroupBy(array, ok).div\ngroupBy(array, ok).f32\ngroupBy(array, ok).f64\ngroupBy(array, ok).foo\ngroupBy(array, ok).greet\ngroupBy(array, ok).half\ngroupBy(array, ok).i\ngroupBy(array, ok).i32\ngroupBy(array, ok).i64\ngroupBy(array, ok).list\ngroupBy(array, ok).ok\ngroupBy(array, ok).score\ngroupBy(array, ok)?.Bar\ngroupBy(array, ok)?.Qux\ngroupBy(array, ok)?.String\ngroupBy(array, ok)?.array\ngroupBy(array, ok)?.div\ngroupBy(array, ok)?.f32\ngroupBy(array, ok)?.f64\ngroupBy(array, ok)?.foo\ngroupBy(array, ok)?.greet\ngroupBy(array, ok)?.half\ngroupBy(array, ok)?.i32\ngroupBy(array, ok)?.i64\ngroupBy(array, ok)?.list\ngroupBy(array, ok)?.ok\ngroupBy(array, ok)?.score\ngroupBy(array, one(array, ok))\ngroupBy(array, reduce(array, #))\ngroupBy(array, reduce(array, foo))\ngroupBy(array, reduce(list, #))\ngroupBy(array, round(#))\ngroupBy(array, score(#))\ngroupBy(array, score(#, #))\ngroupBy(array, score(#, #, #, 1))\ngroupBy(array, score(#, 1)).list\ngroupBy(array, score(1))\ngroupBy(array, score(i))\ngroupBy(array, string(#))\ngroupBy(array, string(div))\ngroupBy(array, string(i32))\ngroupBy(array, toJSON(\"bar\"))\ngroupBy(array, toJSON(#))\ngroupBy(array, toJSON(1 .. i))\ngroupBy(array, toJSON(foo))\ngroupBy(array, trimPrefix(\"foo\"))\ngroupBy(array, true == nil)\ngroupBy(array, true ? # : #)\ngroupBy(array, true ? # : 1)\ngroupBy(array, true ? nil : \"foo\")\ngroupBy(array, true).Bar\ngroupBy(array, true).Qux\ngroupBy(array, true).add\ngroupBy(array, true).div\ngroupBy(array, true).f64\ngroupBy(array, true).foo\ngroupBy(array, true).greet\ngroupBy(array, true).half\ngroupBy(array, true).i\ngroupBy(array, true).i32\ngroupBy(array, true).i64\ngroupBy(array, true).list\ngroupBy(array, true).ok\ngroupBy(array, true).score\ngroupBy(array, true)?.Bar\ngroupBy(array, true)?.Qux\ngroupBy(array, true)?.String\ngroupBy(array, true)?.add\ngroupBy(array, true)?.array\ngroupBy(array, true)?.div\ngroupBy(array, true)?.f32\ngroupBy(array, true)?.f64\ngroupBy(array, true)?.half\ngroupBy(array, true)?.i\ngroupBy(array, true)?.i32\ngroupBy(array, true)?.i64\ngroupBy(array, true)?.list\ngroupBy(array, true)?.ok\ngroupBy(array, true)?.score\ngroupBy(array, true)[i32]\ngroupBy(array, type(# <= #))\ngroupBy(array, type(#)).i64\ngroupBy(array, type(-f64))\ngroupBy(array, type(f32))\ngroupBy(false ? 0.5 : \"bar\", #)\ngroupBy(filter(array, false), #)\ngroupBy(filter(array, false), add)\ngroupBy(filter(array, false), f32)\ngroupBy(filter(array, false), nil == #)\ngroupBy(filter(array, ok), half(1))\ngroupBy(filter(array, true), #)\ngroupBy(filter(array, true), f64)\ngroupBy(filter(list, ok), #)\ngroupBy(groupBy(array, \"foo\").list, #)\ngroupBy(groupBy(array, #).i32, add)\ngroupBy(groupBy(array, ok).Bar, #?.array not matches #)\ngroupBy(groupBy(array, true).f64, #[#])\ngroupBy(i .. 1, !ok)?.f64\ngroupBy(i .. 1, # % #)\ngroupBy(i .. i, i64)\ngroupBy(i .. i32, #)\ngroupBy(i .. i32, f64 * #)\ngroupBy(i .. i64, f64)?.score\ngroupBy(i .. i64, foo)\ngroupBy(i .. len(array), #)\ngroupBy(i32 .. 1, # - #)\ngroupBy(i32 .. 1, #)?.f32\ngroupBy(i32 .. i, #)\ngroupBy(i32 .. i32, i)\ngroupBy(i32 .. i32, i32)\ngroupBy(i32 .. i32, i64)\ngroupBy(i32 .. i32, list[i])\ngroupBy(i32 .. i32, ok)\ngroupBy(i32 .. i64, #)\ngroupBy(i32 .. i64, get(array, #))\ngroupBy(i64 .. 1, -0.5)\ngroupBy(i64 .. 1, i)\ngroupBy(i64 .. i, -#)\ngroupBy(i64 .. i, i32)\ngroupBy(i64 .. i32, i)\ngroupBy(i64 .. i64, i32)\ngroupBy(list, !(\"foo\" in #))\ngroupBy(list, !false)\ngroupBy(list, !ok)\ngroupBy(list, !true)\ngroupBy(list, \"bar\" contains \"foo\")?.ok\ngroupBy(list, \"bar\" endsWith \"bar\")\ngroupBy(list, \"bar\" not in #)\ngroupBy(list, \"bar\").Bar\ngroupBy(list, \"bar\").Qux\ngroupBy(list, \"bar\").String\ngroupBy(list, \"bar\").add\ngroupBy(list, \"bar\").array\ngroupBy(list, \"bar\").div\ngroupBy(list, \"bar\").f32\ngroupBy(list, \"bar\").f64\ngroupBy(list, \"bar\").foo\ngroupBy(list, \"bar\").greet\ngroupBy(list, \"bar\").i\ngroupBy(list, \"bar\").i32\ngroupBy(list, \"bar\").i64\ngroupBy(list, \"bar\").list\ngroupBy(list, \"bar\").ok\ngroupBy(list, \"bar\").score\ngroupBy(list, \"bar\")?.Bar\ngroupBy(list, \"bar\")?.Qux\ngroupBy(list, \"bar\")?.String\ngroupBy(list, \"bar\")?.add\ngroupBy(list, \"bar\")?.array\ngroupBy(list, \"bar\")?.div\ngroupBy(list, \"bar\")?.f32\ngroupBy(list, \"bar\")?.f64\ngroupBy(list, \"bar\")?.foo\ngroupBy(list, \"bar\")?.greet\ngroupBy(list, \"bar\")?.half\ngroupBy(list, \"bar\")?.i\ngroupBy(list, \"bar\")?.i32\ngroupBy(list, \"bar\")?.i64\ngroupBy(list, \"bar\")?.list\ngroupBy(list, \"bar\")?.ok\ngroupBy(list, \"bar\")?.score\ngroupBy(list, \"foo\" not in #)?.foo\ngroupBy(list, \"foo\").Bar\ngroupBy(list, \"foo\").Qux\ngroupBy(list, \"foo\").String\ngroupBy(list, \"foo\").add\ngroupBy(list, \"foo\").array\ngroupBy(list, \"foo\").div\ngroupBy(list, \"foo\").f32\ngroupBy(list, \"foo\").f64\ngroupBy(list, \"foo\").foo\ngroupBy(list, \"foo\").greet\ngroupBy(list, \"foo\").half\ngroupBy(list, \"foo\").i\ngroupBy(list, \"foo\").i32\ngroupBy(list, \"foo\").i64\ngroupBy(list, \"foo\").list\ngroupBy(list, \"foo\").ok\ngroupBy(list, \"foo\").score\ngroupBy(list, \"foo\")?.Bar\ngroupBy(list, \"foo\")?.Qux\ngroupBy(list, \"foo\")?.String\ngroupBy(list, \"foo\")?.add\ngroupBy(list, \"foo\")?.array\ngroupBy(list, \"foo\")?.div\ngroupBy(list, \"foo\")?.f32\ngroupBy(list, \"foo\")?.f64\ngroupBy(list, \"foo\")?.foo\ngroupBy(list, \"foo\")?.greet\ngroupBy(list, \"foo\")?.half\ngroupBy(list, \"foo\")?.i\ngroupBy(list, \"foo\")?.i32\ngroupBy(list, \"foo\")?.i64\ngroupBy(list, \"foo\")?.list\ngroupBy(list, \"foo\")?.ok\ngroupBy(list, \"foo\")?.score\ngroupBy(list, # != #)\ngroupBy(list, # != foo)\ngroupBy(list, # != foo)?.i\ngroupBy(list, # != nil)\ngroupBy(list, # == #)\ngroupBy(list, # == #).div\ngroupBy(list, # in list)\ngroupBy(list, # not in list)\ngroupBy(list, #)\ngroupBy(list, #).Bar\ngroupBy(list, #).Qux\ngroupBy(list, #).String\ngroupBy(list, #).add\ngroupBy(list, #).array\ngroupBy(list, #).div\ngroupBy(list, #).f32\ngroupBy(list, #).f64\ngroupBy(list, #).foo\ngroupBy(list, #).greet\ngroupBy(list, #).half\ngroupBy(list, #).i\ngroupBy(list, #).i32\ngroupBy(list, #).i64\ngroupBy(list, #).list\ngroupBy(list, #).ok\ngroupBy(list, #).score\ngroupBy(list, #)?.Bar\ngroupBy(list, #)?.Qux\ngroupBy(list, #)?.String\ngroupBy(list, #)?.add\ngroupBy(list, #)?.array\ngroupBy(list, #)?.div\ngroupBy(list, #)?.f32\ngroupBy(list, #)?.f64\ngroupBy(list, #)?.foo\ngroupBy(list, #)?.greet\ngroupBy(list, #)?.half\ngroupBy(list, #)?.i\ngroupBy(list, #)?.i32\ngroupBy(list, #)?.i64\ngroupBy(list, #)?.list\ngroupBy(list, #)?.ok\ngroupBy(list, #)?.score\ngroupBy(list, #)[-i64]\ngroupBy(list, #)[1 == i32]\ngroupBy(list, #)[f32]\ngroupBy(list, #)[foo]\ngroupBy(list, #)[i == i64]\ngroupBy(list, #)[i32]\ngroupBy(list, #)[i64]\ngroupBy(list, #)[ok]\ngroupBy(list, #?.Bar)\ngroupBy(list, #?.String())\ngroupBy(list, #?.String())?.score\ngroupBy(list, -0.5)\ngroupBy(list, -1)\ngroupBy(list, -f32)\ngroupBy(list, -i)\ngroupBy(list, .Bar)\ngroupBy(list, .Bar).f32\ngroupBy(list, .String())\ngroupBy(list, .String())?.score\ngroupBy(list, 0.5 != f32)\ngroupBy(list, 0.5 != f64)\ngroupBy(list, 0.5 * f32)\ngroupBy(list, 0.5 ** i64)\ngroupBy(list, 0.5 / i)\ngroupBy(list, 0.5).Bar\ngroupBy(list, 0.5).Qux\ngroupBy(list, 0.5).String\ngroupBy(list, 0.5).add\ngroupBy(list, 0.5).array\ngroupBy(list, 0.5).div\ngroupBy(list, 0.5).f32\ngroupBy(list, 0.5).f64\ngroupBy(list, 0.5).greet\ngroupBy(list, 0.5).half\ngroupBy(list, 0.5).i\ngroupBy(list, 0.5).i32\ngroupBy(list, 0.5).i64\ngroupBy(list, 0.5).list\ngroupBy(list, 0.5).ok\ngroupBy(list, 0.5).score\ngroupBy(list, 0.5)?.Bar\ngroupBy(list, 0.5)?.Qux\ngroupBy(list, 0.5)?.String\ngroupBy(list, 0.5)?.add\ngroupBy(list, 0.5)?.array\ngroupBy(list, 0.5)?.div\ngroupBy(list, 0.5)?.f32\ngroupBy(list, 0.5)?.f64\ngroupBy(list, 0.5)?.foo\ngroupBy(list, 0.5)?.greet\ngroupBy(list, 0.5)?.half\ngroupBy(list, 0.5)?.i\ngroupBy(list, 0.5)?.i32\ngroupBy(list, 0.5)?.i64\ngroupBy(list, 0.5)?.list\ngroupBy(list, 0.5)?.ok\ngroupBy(list, 0.5)?.score\ngroupBy(list, 1 * f64).f32\ngroupBy(list, 1 + i)\ngroupBy(list, 1 - 0.5)\ngroupBy(list, 1 ^ 0.5)\ngroupBy(list, 1 ^ 1)\ngroupBy(list, 1 ^ i)\ngroupBy(list, 1).Bar\ngroupBy(list, 1).Qux\ngroupBy(list, 1).String\ngroupBy(list, 1).add\ngroupBy(list, 1).array\ngroupBy(list, 1).div\ngroupBy(list, 1).f32\ngroupBy(list, 1).f64\ngroupBy(list, 1).foo\ngroupBy(list, 1).greet\ngroupBy(list, 1).half\ngroupBy(list, 1).i\ngroupBy(list, 1).i32\ngroupBy(list, 1).i64\ngroupBy(list, 1).list\ngroupBy(list, 1).ok\ngroupBy(list, 1).score\ngroupBy(list, 1)?.Bar\ngroupBy(list, 1)?.Qux\ngroupBy(list, 1)?.String\ngroupBy(list, 1)?.add\ngroupBy(list, 1)?.array\ngroupBy(list, 1)?.div\ngroupBy(list, 1)?.f32\ngroupBy(list, 1)?.f64\ngroupBy(list, 1)?.foo\ngroupBy(list, 1)?.greet\ngroupBy(list, 1)?.half\ngroupBy(list, 1)?.i\ngroupBy(list, 1)?.i32\ngroupBy(list, 1)?.i64\ngroupBy(list, 1)?.list\ngroupBy(list, 1)?.ok\ngroupBy(list, 1)?.score\ngroupBy(list, 1)[i]\ngroupBy(list, 1)[reduce(list, \"foo\")]\ngroupBy(list, abs(1))\ngroupBy(list, abs(i))\ngroupBy(list, abs(i64))\ngroupBy(list, all(list, ok))\ngroupBy(list, ceil(0.5))\ngroupBy(list, ceil(f64))\ngroupBy(list, f32 ** 0.5)\ngroupBy(list, f32 ** 1)\ngroupBy(list, f32 < f32)\ngroupBy(list, f32 == i64)\ngroupBy(list, f32 >= 1)\ngroupBy(list, f32)\ngroupBy(list, f32).Bar\ngroupBy(list, f32).Qux\ngroupBy(list, f32).String\ngroupBy(list, f32).add\ngroupBy(list, f32).array\ngroupBy(list, f32).div\ngroupBy(list, f32).f32\ngroupBy(list, f32).f64\ngroupBy(list, f32).foo\ngroupBy(list, f32).half\ngroupBy(list, f32).i\ngroupBy(list, f32).i32\ngroupBy(list, f32).i64\ngroupBy(list, f32).list\ngroupBy(list, f32).ok\ngroupBy(list, f32)?.Bar\ngroupBy(list, f32)?.Qux\ngroupBy(list, f32)?.String\ngroupBy(list, f32)?.add\ngroupBy(list, f32)?.array\ngroupBy(list, f32)?.div\ngroupBy(list, f32)?.f32\ngroupBy(list, f32)?.f64\ngroupBy(list, f32)?.foo\ngroupBy(list, f32)?.greet\ngroupBy(list, f32)?.half\ngroupBy(list, f32)?.i\ngroupBy(list, f32)?.i32\ngroupBy(list, f32)?.i64\ngroupBy(list, f32)?.list\ngroupBy(list, f32)?.ok\ngroupBy(list, f32)?.score\ngroupBy(list, f32)[add == nil]\ngroupBy(list, f32)[toJSON(true)]\ngroupBy(list, f64 * 0.5)\ngroupBy(list, f64 * 1)\ngroupBy(list, f64 - 1)\ngroupBy(list, f64 < f64)\ngroupBy(list, f64)\ngroupBy(list, f64).Bar\ngroupBy(list, f64).Qux\ngroupBy(list, f64).String\ngroupBy(list, f64).add\ngroupBy(list, f64).array\ngroupBy(list, f64).div\ngroupBy(list, f64).f32\ngroupBy(list, f64).f64\ngroupBy(list, f64).foo\ngroupBy(list, f64).greet\ngroupBy(list, f64).half\ngroupBy(list, f64).i\ngroupBy(list, f64).i32\ngroupBy(list, f64).i64\ngroupBy(list, f64).list\ngroupBy(list, f64).ok\ngroupBy(list, f64).score\ngroupBy(list, f64)?.Bar\ngroupBy(list, f64)?.Qux\ngroupBy(list, f64)?.String\ngroupBy(list, f64)?.add\ngroupBy(list, f64)?.array\ngroupBy(list, f64)?.div\ngroupBy(list, f64)?.f32\ngroupBy(list, f64)?.f64\ngroupBy(list, f64)?.foo\ngroupBy(list, f64)?.greet\ngroupBy(list, f64)?.half\ngroupBy(list, f64)?.i\ngroupBy(list, f64)?.i32\ngroupBy(list, f64)?.i64\ngroupBy(list, f64)?.list\ngroupBy(list, f64)?.ok\ngroupBy(list, f64)?.score\ngroupBy(list, false == ok)\ngroupBy(list, false ? score : #)\ngroupBy(list, false).Bar\ngroupBy(list, false).add\ngroupBy(list, false).array\ngroupBy(list, false).div\ngroupBy(list, false).f32\ngroupBy(list, false).foo\ngroupBy(list, false).greet\ngroupBy(list, false).half\ngroupBy(list, false).i\ngroupBy(list, false).i32\ngroupBy(list, false).i64\ngroupBy(list, false).list\ngroupBy(list, false).ok\ngroupBy(list, false)?.Bar\ngroupBy(list, false)?.Qux\ngroupBy(list, false)?.String\ngroupBy(list, false)?.add\ngroupBy(list, false)?.div\ngroupBy(list, false)?.f32\ngroupBy(list, false)?.f64\ngroupBy(list, false)?.greet\ngroupBy(list, false)?.half\ngroupBy(list, false)?.i\ngroupBy(list, false)?.i32\ngroupBy(list, false)?.i64\ngroupBy(list, false)?.list\ngroupBy(list, false)?.ok\ngroupBy(list, false)?.score\ngroupBy(list, findLastIndex(array, ok))\ngroupBy(list, findLastIndex(list, false))\ngroupBy(list, first(array))\ngroupBy(list, float(-1))\ngroupBy(list, float(0.5))\ngroupBy(list, floor(i))\ngroupBy(list, floor(i64))\ngroupBy(list, foo != #)\ngroupBy(list, foo)\ngroupBy(list, foo).Bar\ngroupBy(list, foo).Qux\ngroupBy(list, foo).String\ngroupBy(list, foo).add\ngroupBy(list, foo).array\ngroupBy(list, foo).div\ngroupBy(list, foo).f32\ngroupBy(list, foo).f64\ngroupBy(list, foo).foo\ngroupBy(list, foo).greet\ngroupBy(list, foo).half\ngroupBy(list, foo).i\ngroupBy(list, foo).i32\ngroupBy(list, foo).i64\ngroupBy(list, foo).list\ngroupBy(list, foo).ok\ngroupBy(list, foo).score\ngroupBy(list, foo)?.Bar\ngroupBy(list, foo)?.Qux\ngroupBy(list, foo)?.String\ngroupBy(list, foo)?.add\ngroupBy(list, foo)?.array\ngroupBy(list, foo)?.div\ngroupBy(list, foo)?.f32\ngroupBy(list, foo)?.f64\ngroupBy(list, foo)?.foo\ngroupBy(list, foo)?.half\ngroupBy(list, foo)?.i\ngroupBy(list, foo)?.i32\ngroupBy(list, foo)?.i64\ngroupBy(list, foo)?.list\ngroupBy(list, foo)?.ok\ngroupBy(list, foo)?.score\ngroupBy(list, foo)[i32]\ngroupBy(list, foo.Bar)\ngroupBy(list, foo.String())\ngroupBy(list, foo?.String())\ngroupBy(list, greet != greet)\ngroupBy(list, greet(\"bar\"))\ngroupBy(list, i * i)\ngroupBy(list, i / f64)\ngroupBy(list, i <= i)\ngroupBy(list, i ^ i)\ngroupBy(list, i)\ngroupBy(list, i).Bar\ngroupBy(list, i).Qux\ngroupBy(list, i).String\ngroupBy(list, i).add\ngroupBy(list, i).array\ngroupBy(list, i).div\ngroupBy(list, i).f32\ngroupBy(list, i).f64\ngroupBy(list, i).foo\ngroupBy(list, i).half\ngroupBy(list, i).i\ngroupBy(list, i).i32\ngroupBy(list, i).i64\ngroupBy(list, i).list\ngroupBy(list, i).ok\ngroupBy(list, i).score\ngroupBy(list, i)?.Bar\ngroupBy(list, i)?.Qux\ngroupBy(list, i)?.String\ngroupBy(list, i)?.add\ngroupBy(list, i)?.array\ngroupBy(list, i)?.div\ngroupBy(list, i)?.f32\ngroupBy(list, i)?.f64\ngroupBy(list, i)?.foo\ngroupBy(list, i)?.greet\ngroupBy(list, i)?.half\ngroupBy(list, i)?.i\ngroupBy(list, i)?.i32\ngroupBy(list, i)?.i64\ngroupBy(list, i)?.list\ngroupBy(list, i)?.ok\ngroupBy(list, i)?.score\ngroupBy(list, i32 != f32)?.foo\ngroupBy(list, i32 * 0.5)\ngroupBy(list, i32 ** 0.5)\ngroupBy(list, i32 ** f32)\ngroupBy(list, i32 > i)\ngroupBy(list, i32 ^ i)\ngroupBy(list, i32)\ngroupBy(list, i32).Bar\ngroupBy(list, i32).Qux\ngroupBy(list, i32).add\ngroupBy(list, i32).array\ngroupBy(list, i32).div\ngroupBy(list, i32).f32\ngroupBy(list, i32).f64\ngroupBy(list, i32).foo\ngroupBy(list, i32).greet\ngroupBy(list, i32).half\ngroupBy(list, i32).i\ngroupBy(list, i32).i32\ngroupBy(list, i32).i64\ngroupBy(list, i32).list\ngroupBy(list, i32).ok\ngroupBy(list, i32).score\ngroupBy(list, i32)?.Bar\ngroupBy(list, i32)?.Qux\ngroupBy(list, i32)?.String\ngroupBy(list, i32)?.add\ngroupBy(list, i32)?.array\ngroupBy(list, i32)?.div\ngroupBy(list, i32)?.f32\ngroupBy(list, i32)?.f64\ngroupBy(list, i32)?.foo\ngroupBy(list, i32)?.greet\ngroupBy(list, i32)?.half\ngroupBy(list, i32)?.i\ngroupBy(list, i32)?.i32\ngroupBy(list, i32)?.i64\ngroupBy(list, i32)?.list\ngroupBy(list, i32)?.ok\ngroupBy(list, i32)?.score\ngroupBy(list, i64 != i32)\ngroupBy(list, i64 != nil)\ngroupBy(list, i64 - 0.5)\ngroupBy(list, i64 < 1)\ngroupBy(list, i64 <= 1)\ngroupBy(list, i64 == 1)\ngroupBy(list, i64 == nil)\ngroupBy(list, i64)\ngroupBy(list, i64).Bar\ngroupBy(list, i64).Qux\ngroupBy(list, i64).String\ngroupBy(list, i64).add\ngroupBy(list, i64).array\ngroupBy(list, i64).div\ngroupBy(list, i64).f32\ngroupBy(list, i64).f64\ngroupBy(list, i64).foo\ngroupBy(list, i64).greet\ngroupBy(list, i64).half\ngroupBy(list, i64).i\ngroupBy(list, i64).i32\ngroupBy(list, i64).list\ngroupBy(list, i64).ok\ngroupBy(list, i64).score\ngroupBy(list, i64)?.Bar\ngroupBy(list, i64)?.Qux\ngroupBy(list, i64)?.String\ngroupBy(list, i64)?.add\ngroupBy(list, i64)?.array\ngroupBy(list, i64)?.div\ngroupBy(list, i64)?.f32\ngroupBy(list, i64)?.f64\ngroupBy(list, i64)?.foo\ngroupBy(list, i64)?.greet\ngroupBy(list, i64)?.half\ngroupBy(list, i64)?.i\ngroupBy(list, i64)?.i32\ngroupBy(list, i64)?.i64\ngroupBy(list, i64)?.list\ngroupBy(list, i64)?.ok\ngroupBy(list, i64)?.score\ngroupBy(list, i64)[max(i)]\ngroupBy(list, i64)[ok]\ngroupBy(list, int(1))\ngroupBy(list, list == array)\ngroupBy(list, lower(\"foo\"))\ngroupBy(list, max(f64))\ngroupBy(list, max(i))\ngroupBy(list, nil != #)\ngroupBy(list, nil != div)\ngroupBy(list, nil != true)\ngroupBy(list, nil == #)\ngroupBy(list, nil == #).i\ngroupBy(list, nil in list)\ngroupBy(list, not false)\ngroupBy(list, not ok)\ngroupBy(list, ok != false)\ngroupBy(list, ok ? # : true)\ngroupBy(list, ok)\ngroupBy(list, ok).Bar\ngroupBy(list, ok).Qux\ngroupBy(list, ok).String\ngroupBy(list, ok).add\ngroupBy(list, ok).array\ngroupBy(list, ok).div\ngroupBy(list, ok).f32\ngroupBy(list, ok).f64\ngroupBy(list, ok).foo\ngroupBy(list, ok).greet\ngroupBy(list, ok).half\ngroupBy(list, ok).i\ngroupBy(list, ok).i32\ngroupBy(list, ok).i64\ngroupBy(list, ok).list\ngroupBy(list, ok).ok\ngroupBy(list, ok).score\ngroupBy(list, ok)?.Bar\ngroupBy(list, ok)?.Qux\ngroupBy(list, ok)?.String\ngroupBy(list, ok)?.add\ngroupBy(list, ok)?.array\ngroupBy(list, ok)?.div\ngroupBy(list, ok)?.f32\ngroupBy(list, ok)?.f64\ngroupBy(list, ok)?.foo\ngroupBy(list, ok)?.greet\ngroupBy(list, ok)?.half\ngroupBy(list, ok)?.i\ngroupBy(list, ok)?.i32\ngroupBy(list, ok)?.i64\ngroupBy(list, ok)?.list\ngroupBy(list, ok)?.ok\ngroupBy(list, ok)?.score\ngroupBy(list, reduce(array, #))\ngroupBy(list, reduce(list, #)).i32\ngroupBy(list, reduce(list, f64))\ngroupBy(list, reduce(list, i32))\ngroupBy(list, reduce(map(list, i64), #))\ngroupBy(list, round(0.5))\ngroupBy(list, round(1))\ngroupBy(list, round(f64))\ngroupBy(list, score(1))\ngroupBy(list, score(i))\ngroupBy(list, string(#))\ngroupBy(list, string(add))\ngroupBy(list, string(half))\ngroupBy(list, string(i32))\ngroupBy(list, string(true))\ngroupBy(list, toBase64(\"foo\"))\ngroupBy(list, toJSON(#))\ngroupBy(list, toJSON(1))\ngroupBy(list, toJSON(array))\ngroupBy(list, toJSON(foo))\ngroupBy(list, true && false)\ngroupBy(list, true ? # : 1)\ngroupBy(list, true ? 1 : #)\ngroupBy(list, true).Qux\ngroupBy(list, true).String\ngroupBy(list, true).add\ngroupBy(list, true).array\ngroupBy(list, true).div\ngroupBy(list, true).f32\ngroupBy(list, true).f64\ngroupBy(list, true).foo\ngroupBy(list, true).greet\ngroupBy(list, true).half\ngroupBy(list, true).i\ngroupBy(list, true).i32\ngroupBy(list, true).i64\ngroupBy(list, true).list\ngroupBy(list, true).ok\ngroupBy(list, true).score\ngroupBy(list, true)?.Bar\ngroupBy(list, true)?.Qux\ngroupBy(list, true)?.String\ngroupBy(list, true)?.add\ngroupBy(list, true)?.array\ngroupBy(list, true)?.div\ngroupBy(list, true)?.f32\ngroupBy(list, true)?.f64\ngroupBy(list, true)?.foo\ngroupBy(list, true)?.greet\ngroupBy(list, true)?.half\ngroupBy(list, true)?.i\ngroupBy(list, true)?.i32\ngroupBy(list, true)?.i64\ngroupBy(list, true)?.list\ngroupBy(list, true)?.ok\ngroupBy(list, true)?.score\ngroupBy(list, type(\"foo\"))\ngroupBy(list, type(#))\ngroupBy(list, type(false))\ngroupBy(list[i32:1], i64)\ngroupBy(list[i32:i32], foo)\ngroupBy(list[i64:1], i32)\ngroupBy(list[i:1], f64)\ngroupBy(map(array, #), # <= #)\ngroupBy(map(array, #), # == #)\ngroupBy(map(array, #), # >= #)\ngroupBy(map(array, #), #)\ngroupBy(map(array, #), 0.5 < 0.5)\ngroupBy(map(array, #), foo)\ngroupBy(map(array, #), i)\ngroupBy(map(array, #), i64)\ngroupBy(map(array, #), min(1))\ngroupBy(map(array, #), ok)\ngroupBy(map(array, 0.5), # != 0.5)\ngroupBy(map(array, 0.5), # / #)\ngroupBy(map(array, 0.5), #)\ngroupBy(map(array, 0.5), f64)\ngroupBy(map(array, 1), 0.5 / #)\ngroupBy(map(array, 1), f64)\ngroupBy(map(array, 1), max(#))\ngroupBy(map(array, 1), ok)\ngroupBy(map(array, div), div != #)\ngroupBy(map(array, f32), # - 0.5)\ngroupBy(map(array, f32), min(#))\ngroupBy(map(array, f64), #)\ngroupBy(map(array, false), f64)\ngroupBy(map(array, false), i)\ngroupBy(map(array, foo), #).add\ngroupBy(map(array, foo), i)\ngroupBy(map(array, foo), ok)\ngroupBy(map(array, i), #)\ngroupBy(map(array, i32), # % i)\ngroupBy(map(array, i32), #)\ngroupBy(map(array, ok), i64)\ngroupBy(map(list, \"bar\"), #)\ngroupBy(map(list, \"foo\"), #)\ngroupBy(map(list, #), \"bar\" == \"bar\")\ngroupBy(map(list, #), #)\ngroupBy(map(list, #), #)?.array\ngroupBy(map(list, #), f32)\ngroupBy(map(list, #), f64)\ngroupBy(map(list, #), i32)\ngroupBy(map(list, #), i64)\ngroupBy(map(list, #), ok)\ngroupBy(map(list, 0.5), # * i64)\ngroupBy(map(list, 0.5), # ** #)\ngroupBy(map(list, 0.5), #)\ngroupBy(map(list, 0.5), i32)\ngroupBy(map(list, 1), #)\ngroupBy(map(list, 1), get(list, #)).i64\ngroupBy(map(list, 1), i64)\ngroupBy(map(list, f32), # ** #).array\ngroupBy(map(list, f64), #)\ngroupBy(map(list, f64), #).half\ngroupBy(map(list, f64), f32)\ngroupBy(map(list, f64), i)\ngroupBy(map(list, i), #)\ngroupBy(map(list, i32), # == #)\ngroupBy(map(list, i64), #)?.i32\ngroupBy(map(list, i64), i)\ngroupBy(map(list, list), foo)\ngroupBy(map(list, ok), #)\ngroupBy(ok ? \"foo\" : greet, # <= #)\ngroupBy(reduce(array, # .. i64), add)\ngroupBy(reduce(array, array), foo)\ngroupBy(reduce(array, array), i)\ngroupBy(reduce(list, array), # / #)\ngroupBy(reduce(list, array), true ? true : nil)\ngroupBy(sort(array), #)\ngroupBy(sort(array), foo)\ngroupBy(true ? \"foo\" : 1, # > 0.5)\ngroupBy(true ? \"foo\" : 1, foo)\ngroupBy(true ? \"foo\" : false, # / #)\ngroupBy(true ? \"foo\" : score, #)\nhalf\nhalf != half\nhalf != half != nil\nhalf != half and \"bar\" in foo\nhalf != nil == false\nhalf != nil ? \"bar\" : div\nhalf != nil ? \"bar\" : false\nhalf != nil ? true : div\nhalf != reduce(list, half)\nhalf == half\nhalf == nil && ok\nhalf == nil ? array : 0.5\nhalf == nil ? foo : false\nhalf(-(0.5 + 1))\nhalf(-(f64 + 1))\nhalf(-(i64 - 0.5))\nhalf(-0.5)\nhalf(-1)\nhalf(-f64)\nhalf(0.5 * 0.5)\nhalf(0.5 * 1)\nhalf(0.5 * f64)\nhalf(0.5 * i)\nhalf(0.5 * i32)\nhalf(0.5 * i64)\nhalf(0.5 ** 0.5)\nhalf(0.5 ** 1)\nhalf(0.5 ** f32)\nhalf(0.5 ** f64)\nhalf(0.5 ** i)\nhalf(0.5 ** i32)\nhalf(0.5 ** i64)\nhalf(0.5 + 0.5)\nhalf(0.5 + 1 + i64)\nhalf(0.5 + 1)\nhalf(0.5 + f32)\nhalf(0.5 + f64)\nhalf(0.5 + i)\nhalf(0.5 + i32)\nhalf(0.5 + i64)\nhalf(0.5 - 0.5)\nhalf(0.5 - 1)\nhalf(0.5 - f32)\nhalf(0.5 - f64)\nhalf(0.5 - i)\nhalf(0.5 - i32)\nhalf(0.5 - i64)\nhalf(0.5 / 0.5)\nhalf(0.5 / 1)\nhalf(0.5 / f32)\nhalf(0.5 / f64)\nhalf(0.5 / i)\nhalf(0.5 / i64)\nhalf(0.5 ^ 0.5)\nhalf(0.5 ^ 1)\nhalf(0.5 ^ f32)\nhalf(0.5 ^ f64)\nhalf(0.5 ^ i)\nhalf(0.5 ^ i32)\nhalf(0.5 ^ i64)\nhalf(0.5) != -i64\nhalf(0.5) != 0.5 ^ i\nhalf(0.5) != i32\nhalf(0.5) != i64\nhalf(0.5) * f32\nhalf(0.5) * i\nhalf(0.5) * i32\nhalf(0.5) * i64\nhalf(0.5) ** f32\nhalf(0.5) ** i\nhalf(0.5) ** i32\nhalf(0.5) ** i64\nhalf(0.5) ** max(1)\nhalf(0.5) + 1 / 1\nhalf(0.5) + f32\nhalf(0.5) + f64\nhalf(0.5) + i32\nhalf(0.5) + i64\nhalf(0.5) - i64\nhalf(0.5) / -0.5\nhalf(0.5) / f64\nhalf(0.5) / i\nhalf(0.5) / i64\nhalf(0.5) < f64\nhalf(0.5) <= f32 ? f64 : 1\nhalf(0.5) <= f64\nhalf(0.5) <= i32\nhalf(0.5) <= i64 + i32\nhalf(0.5) <= int(0.5)\nhalf(0.5) == f32\nhalf(0.5) == i32 / i\nhalf(0.5) == i64\nhalf(0.5) > f32\nhalf(0.5) > f64\nhalf(0.5) > i\nhalf(0.5) > i64\nhalf(0.5) >= i32\nhalf(0.5) ^ (1 * i32)\nhalf(0.5) ^ f32\nhalf(0.5) ^ f64\nhalf(0.5) ^ i\nhalf(0.5) ^ i32\nhalf(0.5) ^ i64\nhalf(1 * 0.5)\nhalf(1 * 1)\nhalf(1 * f32)\nhalf(1 * f64)\nhalf(1 * i)\nhalf(1 * i32)\nhalf(1 * i64)\nhalf(1 ** 0.5)\nhalf(1 ** 1)\nhalf(1 ** f32)\nhalf(1 ** f64)\nhalf(1 ** i)\nhalf(1 ** i32)\nhalf(1 ** i64)\nhalf(1 + 0.5)\nhalf(1 + 1)\nhalf(1 + f32)\nhalf(1 + f64)\nhalf(1 + i)\nhalf(1 + i32)\nhalf(1 + i64)\nhalf(1 - 0.5)\nhalf(1 - 1)\nhalf(1 - f32)\nhalf(1 - f64)\nhalf(1 - i)\nhalf(1 - i32)\nhalf(1 - i64)\nhalf(1 / 0.5)\nhalf(1 / 1)\nhalf(1 / f32)\nhalf(1 / f64)\nhalf(1 / i)\nhalf(1 / i32)\nhalf(1 / i64)\nhalf(1 ^ 0.5)\nhalf(1 ^ 1)\nhalf(1 ^ f32)\nhalf(1 ^ f64)\nhalf(1 ^ i)\nhalf(1 ^ i32)\nhalf(1 ^ i64)\nhalf(1) != f32\nhalf(1) != f64\nhalf(1) != f64 ** f32\nhalf(1) != f64 ^ 0.5\nhalf(1) != i32\nhalf(1) != i64\nhalf(1) * i32 * i64\nhalf(1) ** (i64 * f32)\nhalf(1) ** f32\nhalf(1) ** i\nhalf(1) ** i32\nhalf(1) ** i64\nhalf(1) + f32\nhalf(1) + f32 / 0.5\nhalf(1) + i\nhalf(1) + i32\nhalf(1) + i64 + i32\nhalf(1) - f32\nhalf(1) - i < i64\nhalf(1) - i32\nhalf(1) - i64\nhalf(1) / -1\nhalf(1) / 0.5 / i\nhalf(1) / i\nhalf(1) / i32\nhalf(1) < f64\nhalf(1) < i\nhalf(1) < i64\nhalf(1) <= f32\nhalf(1) <= i32\nhalf(1) <= i64\nhalf(1) == -1\nhalf(1) == 1 ^ i64\nhalf(1) == f32\nhalf(1) == i32\nhalf(1) > i\nhalf(1) > i32\nhalf(1) > i64\nhalf(1) >= f32\nhalf(1) >= i\nhalf(1) >= i32\nhalf(1) >= i64\nhalf(1) >= max(1)\nhalf(1) >= mean(array)\nhalf(1) ^ f32\nhalf(1) ^ findIndex(list, true)\nhalf(1) ^ i64\nhalf(1) in array\nhalf(1) not in array\nhalf(abs(0.5))\nhalf(abs(f64))\nhalf(ceil(0.5))\nhalf(ceil(1))\nhalf(ceil(f32))\nhalf(ceil(f64))\nhalf(ceil(i))\nhalf(ceil(i32))\nhalf(ceil(i64))\nhalf(f32 * 0.5)\nhalf(f32 * 1)\nhalf(f32 * f64)\nhalf(f32 * i)\nhalf(f32 * i32)\nhalf(f32 ** 0.5)\nhalf(f32 ** f32)\nhalf(f32 ** f64)\nhalf(f32 ** i64)\nhalf(f32 + 0.5)\nhalf(f32 + 1)\nhalf(f32 + f64)\nhalf(f32 + i32)\nhalf(f32 + i64)\nhalf(f32 - 0.5)\nhalf(f32 - 1)\nhalf(f32 - f64)\nhalf(f32 - i)\nhalf(f32 - i32)\nhalf(f32 - i64)\nhalf(f32 / 0.5)\nhalf(f32 / 1)\nhalf(f32 / f32)\nhalf(f32 / f64)\nhalf(f32 / i)\nhalf(f32 / i32)\nhalf(f32 / i64)\nhalf(f32 ^ 0.5)\nhalf(f32 ^ 1)\nhalf(f32 ^ f32)\nhalf(f32 ^ f64)\nhalf(f32 ^ i)\nhalf(f32 ^ i32)\nhalf(f32 ^ i64)\nhalf(f64 * 0.5)\nhalf(f64 * f32)\nhalf(f64 * f64)\nhalf(f64 * i)\nhalf(f64 * i32)\nhalf(f64 * i64)\nhalf(f64 ** 0.5)\nhalf(f64 ** 1)\nhalf(f64 ** f32)\nhalf(f64 ** i)\nhalf(f64 ** i32)\nhalf(f64 + 0.5)\nhalf(f64 + 1)\nhalf(f64 + f64)\nhalf(f64 + i)\nhalf(f64 + i64)\nhalf(f64 - 0.5)\nhalf(f64 - 1)\nhalf(f64 - f32)\nhalf(f64 - f64)\nhalf(f64 - i)\nhalf(f64 - i64)\nhalf(f64 / 0.5)\nhalf(f64 / 1)\nhalf(f64 / f32)\nhalf(f64 / f64)\nhalf(f64 / i)\nhalf(f64 / i32)\nhalf(f64 ^ 0.5)\nhalf(f64 ^ 1)\nhalf(f64 ^ f32)\nhalf(f64 ^ f64)\nhalf(f64 ^ i32)\nhalf(f64)\nhalf(f64) != f64 != false\nhalf(f64) != i32\nhalf(f64) != i64\nhalf(f64) ** f64\nhalf(f64) ** i\nhalf(f64) ** i32\nhalf(f64) + i32\nhalf(f64) + i64\nhalf(f64) - f64\nhalf(f64) - i32\nhalf(f64) / f64\nhalf(f64) / i32\nhalf(f64) < i\nhalf(f64) < i32\nhalf(f64) <= f32\nhalf(f64) <= i32\nhalf(f64) == f32\nhalf(f64) == f64\nhalf(f64) == i\nhalf(f64) == i32\nhalf(f64) == i64\nhalf(f64) > f32\nhalf(f64) > f64\nhalf(f64) > i\nhalf(f64) > i32\nhalf(f64) > i64\nhalf(f64) >= i\nhalf(f64) >= i64\nhalf(f64) ^ i\nhalf(f64) not in array\nhalf(false ? f64 : 0.5)\nhalf(false ? i32 : 0.5)\nhalf(false ? ok : 0.5)\nhalf(false ? score : 0.5)\nhalf(false ? true : f64)\nhalf(float(0.5))\nhalf(float(1))\nhalf(float(f32))\nhalf(float(f64))\nhalf(float(i))\nhalf(float(i32))\nhalf(float(i64))\nhalf(floor(0.5))\nhalf(floor(1))\nhalf(floor(f32))\nhalf(floor(f64))\nhalf(floor(i))\nhalf(floor(i32))\nhalf(floor(i64))\nhalf(half(0.5))\nhalf(half(1))\nhalf(half(ceil(i)))\nhalf(half(f64 - 0.5))\nhalf(half(f64))\nhalf(i * 0.5)\nhalf(i * 1)\nhalf(i * f64)\nhalf(i ** 0.5)\nhalf(i ** 1)\nhalf(i ** f32)\nhalf(i ** f64)\nhalf(i ** i)\nhalf(i ** i32)\nhalf(i ** i64)\nhalf(i + 0.5)\nhalf(i + 1)\nhalf(i + f32)\nhalf(i + f64)\nhalf(i - 1)\nhalf(i - f32)\nhalf(i - f64)\nhalf(i / 0.5)\nhalf(i / 1)\nhalf(i / f64)\nhalf(i / i)\nhalf(i / i32)\nhalf(i ^ 0.5)\nhalf(i ^ 1)\nhalf(i ^ i)\nhalf(i ^ i32)\nhalf(i ^ i64)\nhalf(i32 * 0.5)\nhalf(i32 * 1)\nhalf(i32 * f32)\nhalf(i32 * f64)\nhalf(i32 ** 0.5)\nhalf(i32 ** 1)\nhalf(i32 ** f64)\nhalf(i32 ** i)\nhalf(i32 ** i32)\nhalf(i32 ** i64)\nhalf(i32 + 0.5)\nhalf(i32 + 1)\nhalf(i32 + f32)\nhalf(i32 + f64)\nhalf(i32 - 0.5)\nhalf(i32 - 1)\nhalf(i32 - f32)\nhalf(i32 / 0.5)\nhalf(i32 / 1)\nhalf(i32 / f32)\nhalf(i32 / f64)\nhalf(i32 / i)\nhalf(i32 / i32 / f32 / f64)\nhalf(i32 / i32)\nhalf(i32 / i64)\nhalf(i32 ^ 0.5)\nhalf(i32 ^ 1)\nhalf(i32 ^ f32)\nhalf(i32 ^ f64)\nhalf(i32 ^ i)\nhalf(i32 ^ i32)\nhalf(i32 ^ i64 ^ i)\nhalf(i32 ^ i64)\nhalf(i64 != i ? true : 0.5)\nhalf(i64 * 0.5)\nhalf(i64 * 1)\nhalf(i64 * f64)\nhalf(i64 ** 0.5)\nhalf(i64 ** 1)\nhalf(i64 ** f64)\nhalf(i64 ** i)\nhalf(i64 ** i32)\nhalf(i64 ** i64)\nhalf(i64 + 0.5)\nhalf(i64 + f32)\nhalf(i64 + f64)\nhalf(i64 - 0.5)\nhalf(i64 - 1)\nhalf(i64 - f32)\nhalf(i64 - f64)\nhalf(i64 / 0.5)\nhalf(i64 / 1)\nhalf(i64 / f32)\nhalf(i64 / f64)\nhalf(i64 / i)\nhalf(i64 / i32)\nhalf(i64 ^ 0.5)\nhalf(i64 ^ 1)\nhalf(i64 ^ f32)\nhalf(i64 ^ f64)\nhalf(i64 ^ i)\nhalf(i64 ^ i32)\nhalf(max(0.5))\nhalf(max(0.5)) ** i\nhalf(max(f64))\nhalf(mean(array))\nhalf(median(array))\nhalf(min(0.5))\nhalf(min(0.5, f32))\nhalf(min(0.5, i32))\nhalf(min(f64))\nhalf(min(i, 0.5))\nhalf(reduce(array, 0.5))\nhalf(reduce(array, f64))\nhalf(reduce(list, 0.5))\nhalf(reduce(list, f64))\nhalf(round(0.5))\nhalf(round(1))\nhalf(round(f32))\nhalf(round(f64))\nhalf(round(i))\nhalf(round(i32))\nhalf(round(i64))\nhalf(score(1) ^ i64)\nhalf(true ? 0.5 : i64)\nhalf(true ? f64 : nil)\ni\ni != -0.5\ni != -1\ni != -f32\ni != -f64\ni != -i\ni != -i32\ni != 0.5 + 0.5\ni != 0.5 - 1\ni != 0.5 / 1\ni != 0.5 ? 1 : div\ni != 0.5 ? false : i32\ni != 0.5 ^ 0.5\ni != 0.5 ^ 1\ni != 0.5 ^ f32\ni != 1 != nil\ni != 1 / 1\ni != 1 ? f64 : score\ni != ceil(1)\ni != ceil(f32)\ni != ceil(i64)\ni != f32\ni != f32 ** i64\ni != f32 + i64\ni != f32 == ok\ni != f64\ni != f64 + i32\ni != f64 == true\ni != f64 ^ f32\ni != f64 ^ i64\ni != float(0.5)\ni != float(i)\ni != half(0.5)\ni != half(f64)\ni != i\ni != i * 1\ni != i * i32\ni != i - i32\ni != i ? i : false\ni != i32\ni != i32 != nil ? greet : score\ni != i32 * 0.5\ni != i32 * f32\ni != i32 and ok\ni != i64\ni != i64 ** i\ni != i64 ? add : i64\ni != i64 ? f32 : nil\ni != i64 ^ 1\ni != int(1)\ni != min(i64)\ni != nil != ok\ni != nil ? ok : f64\ni != reduce(array, #)\ni != reduce(array, 0.5)\ni != reduce(list, 1)\ni != round(f64)\ni != score(1)\ni != score(i)\ni != {\"foo\": score}?.f32\ni % (1 + i32)\ni % (i32 + i32)\ni % (i64 + 1)\ni % -1\ni % -i\ni % -i32\ni % 1 % i32\ni % 1 % i64\ni % 1 * i32\ni % 1 + i64\ni % 1 .. i\ni % 1 / 0.5\ni % 1 / f32\ni % 1 <= i64\ni % 1 >= i\ni % abs(1)\ni % abs(i)\ni % array[1]\ni % array[i64]\ni % i\ni % i / i\ni % i32\ni % i32 != i32\ni % i32 * 1\ni % i32 * f64\ni % i32 / i32\ni % i32 <= f64\ni % i64\ni % i64 != i ? f64 : list\ni % i64 <= i\ni % min(1)\ni % min(i64)\ni % reduce(array, #)\ni % score(i)\ni * (1 + 1)\ni * (f32 + 0.5)\ni * (f32 + 1)\ni * (f64 + i)\ni * (f64 - i32)\ni * -i32\ni * -i64\ni * 0.5 * f64\ni * 0.5 + i\ni * 0.5 / i\ni * 0.5 < i32\ni * 0.5 > i32 * f32\ni * 0.5 ^ 1\ni * 1 % i64\ni * 1 ** 1\ni * 1 < f64\ni * 1 < i32\ni * 1 == i32\ni * bitnand(i64, i64)\ni * bitnot(i64)\ni * ceil(1)\ni * f32\ni * f32 <= f64\ni * f32 ^ 0.5\ni * f32 ^ 1\ni * f32 ^ f32\ni * f64\ni * f64 != i\ni * f64 * f32 > i\ni * f64 * i\ni * f64 ** i32\ni * float(f32)\ni * floor(f32)\ni * floor(i)\ni * floor(i32)\ni * floor(i64)\ni * half(0.5)\ni * half(1)\ni * half(f64)\ni * i\ni * i % i\ni * i * 0.5\ni * i * f32\ni * i ** 0.5\ni * i - f32\ni * i .. i\ni * i == f32\ni * i32\ni * i32 * i\ni * i32 .. i32\ni * i32 / min(1)\ni * i32 == f32\ni * i32 in array\ni * i64\ni * i64 < f64\ni * int(1)\ni * max(1)\ni * max(f64, f32)\ni * max(i)\ni * min(f64, i)\ni * reduce(array, #)\ni * score(1)\ni * score(i)\ni * sum(array)\ni ** (0.5 * f64)\ni ** (0.5 + 0.5)\ni ** (0.5 - 1)\ni ** (0.5 - f64)\ni ** (0.5 / i32)\ni ** (f32 + 0.5)\ni ** (f32 + f32)\ni ** (i * 0.5)\ni ** (i * 1)\ni ** (i + f64)\ni ** (i - i32 + i32)\ni ** (i32 - i64)\ni ** (i32 / 1)\ni ** (i64 - 0.5)\ni ** -0.5\ni ** -1\ni ** -f32\ni ** -i32\ni ** -i64\ni ** 0.5 ** f32\ni ** 0.5 ** reduce(array, #)\ni ** 0.5 < bitnot(i64)\ni ** 0.5 < f32\ni ** 0.5 < f64\ni ** 0.5 <= i64\ni ** 0.5 ^ i\ni ** 0.5 ^ i64\ni ** 1 ** 1\ni ** 1 / i\ni ** 1 < -f32\ni ** 1 >= f64\ni ** 1 ^ i\ni ** 1 ^ i32\ni ** abs(0.5)\ni ** array[i64]\ni ** bitnand(i32, 1)\ni ** bitshl(i64, i32)\ni ** ceil(1)\ni ** f32\ni ** f32 * i32\ni ** f32 ** 1\ni ** f32 ^ f64\ni ** f32 ^ i64\ni ** f64\ni ** f64 != i32\ni ** f64 ** f64\ni ** f64 > i64 ? 1 : ok\ni ** f64 >= i\ni ** first(array)\ni ** floor(f64)\ni ** half(1)\ni ** half(f64)\ni ** half(i + f32)\ni ** i\ni ** i != i == ok\ni ** i ^ 0.5\ni ** i32\ni ** i32 == f32\ni ** i32 > i64\ni ** i64\ni ** i64 ** i\ni ** i64 < i\ni ** i64 == i32\ni ** i64 >= i\ni ** i64 ^ i64\ni ** i64 not in array\ni ** len(\"foo\")\ni ** len(array)\ni ** min(1)\ni ** min(i32)\ni ** reduce(array, #)\ni ** score(1)\ni ** score(i)\ni + -0.5\ni + -1\ni + -f32\ni + -f64\ni + 0.5 ** 0.5\ni + 0.5 + i\ni + 0.5 / 1\ni + 1 + f32\ni + 1 / f32\ni + 1 > f64\ni + 1 ^ 1\ni + 1 ^ f32\ni + abs(0.5)\ni + array[i64]\ni + array[i]\ni + count(list, true)\ni + f32\ni + f32 ** i\ni + f32 / f64\ni + f32 / i32\ni + f32 < i64\ni + f64\ni + f64 - i32\ni + f64 < i64\ni + f64 == i32\ni + f64 > f64\ni + float(0.5)\ni + float(i32)\ni + get(array, i)\ni + half(1)\ni + half(f64)\ni + i\ni + i * i64\ni + i ^ 1\ni + i32\ni + i32 .. -i64\ni + i32 .. i\ni + i32 <= f32\ni + i32 == i64\ni + i32 > min(i)\ni + i32 >= i32 == nil\ni + i32 in array\ni + i64\ni + i64 - f64\ni + i64 / 0.5\ni + i64 / f64\ni + i64 > f32\ni + int(f32)\ni + len(\"bar\")\ni + reduce(array, #)\ni + reduce(array, f32)\ni + reduce(list, i32)\ni + score(i)\ni - -0.5\ni - -1\ni - -f32\ni - -f64\ni - -i64\ni - 0.5 + i64\ni - 0.5 - 1\ni - 0.5 < f64\ni - 0.5 > i\ni - 0.5 not in array\ni - 1 + i\ni - 1 - i64\ni - 1 .. i64\ni - 1 < i32\ni - 1 <= f64\ni - 1 <= i\ni - 1 > 0.5 - 0.5\ni - 1 ^ 0.5\ni - bitxor(i, i)\ni - ceil(f64)\ni - f32\ni - f32 * f32\ni - f32 - i32\ni - f32 / i\ni - f32 ^ 0.5\ni - f64\ni - f64 + i32\ni - f64 + i32 - f64\ni - f64 / i32\ni - f64 ^ i64\ni - find(array, true)\ni - float(0.5)\ni - floor(1)\ni - half(f64)\ni - i\ni - i + f32\ni - i32\ni - i32 + 0.5\ni - i32 - f32\ni - i32 - i32\ni - i64\ni - i64 .. i32\ni - i64 / i\ni - i64 <= i32\ni - i64 ^ f32\ni - i64 ^ f64\ni - int(i32)\ni - max(i64)\ni - median(array)\ni - round(i32)\ni - score(1)\ni .. -i\ni .. -i32\ni .. -i64\ni .. abs(1)\ni .. i\ni .. i32\ni .. i64\ni .. i64 * 1\ni .. i64 + 1\ni .. int(0.5)\ni .. max(1)\ni .. max(i)\ni .. min(i)\ni .. reduce(list, i64)\ni .. score(1)\ni .. score(i)\ni / (0.5 + 1)\ni / (0.5 + f64)\ni / (0.5 + i)\ni / (0.5 - f32)\ni / (i + f32)\ni / -1\ni / -f32\ni / -f64\ni / -i32\ni / 0.5 * 1\ni / 0.5 * f64\ni / 0.5 / f64\ni / 0.5 == nil != false\ni / 0.5 >= f32\ni / 0.5 ^ i32\ni / 1 ** i32\ni / 1 <= i64\ni / 1 > i\ni / abs(i)\ni / bitnot(i64)\ni / count(array, false)\ni / f32\ni / f32 != i64 ? 1 : list\ni / f32 >= len(array)\ni / f64\ni / f64 * f64\ni / f64 ^ i32\ni / float(0.5)\ni / float(1)\ni / float(f64)\ni / floor(1)\ni / floor(i32)\ni / i\ni / i ** 1\ni / i / i\ni / i < i32\ni / i ^ 1\ni / i32\ni / i32 / 1\ni / i64\ni / i64 * f32\ni / i64 / f64\ni / max(0.5)\ni / mean(array)\ni / min(f32)\ni / min(i64)\ni / score(1)\ni < -(f32 * 1)\ni < --f64\ni < -i32\ni < -i64\ni < 0.5 != nil\ni < 0.5 + f64\ni < 0.5 == ok\ni < 1 / 0.5\ni < 1 == nil\ni < 1 ? array : score\ni < 1 ^ i64\ni < abs(i32)\ni < f32\ni < f32 && ok\ni < f32 * 0.5\ni < f32 * i64\ni < f32 ** i\ni < f32 ** i32\ni < f32 + 1\ni < f32 + array[i64]\ni < f32 / 0.5\ni < f32 ? \"bar\" : div\ni < f32 || ok\ni < f64\ni < f64 - 1\ni < float(f64)\ni < floor(f32)\ni < half(0.5)\ni < half(1)\ni < half(f64)\ni < i\ni < i != true\ni < i ** 1\ni < i / i64\ni < i ? score : list\ni < i32\ni < i32 * f32\ni < i32 + 1\ni < i64\ni < i64 ^ f32\ni < max(0.5)\ni < reduce(array, #)\ni <= -0.5\ni <= -1\ni <= -f64\ni <= -i\ni <= -i32\ni <= -i64\ni <= 0.5 * f32\ni <= 0.5 + 0.5\ni <= 0.5 / 1\ni <= 0.5 / f64\ni <= 0.5 == ok\ni <= 0.5 ? i : ok\ni <= 0.5 ? nil : i32\ni <= 0.5 ^ f32\ni <= 1 != nil\ni <= 1 && ok\ni <= 1 * 0.5\ni <= 1 ** i\ni <= 1 + f64\ni <= 1 - f32\ni <= 1 ? 0.5 : f32\ni <= 1 ? 0.5 : list\ni <= 1 ? list : div\ni <= 1 ^ f32\ni <= abs(0.5)\ni <= ceil(1)\ni <= f32\ni <= f32 - 0.5\ni <= f32 ? array : nil\ni <= f64\ni <= float(0.5)\ni <= float(f32)\ni <= half(1)\ni <= half(f64)\ni <= i\ni <= i != nil\ni <= i * f32\ni <= i ** f64\ni <= i - 0.5\ni <= i - 1\ni <= i / i\ni <= i ^ 1\ni <= i32\ni <= i32 - f64\ni <= i32 - i\ni <= i32 == ok\ni <= i32 ? array : false\ni <= i32 ? greet : foo\ni <= i32 || false ? f32 : i32\ni <= i64\ni <= i64 * i\ni <= i64 + f64\ni <= len(list)\ni <= max(0.5)\ni <= max(f32, i32)\ni <= round(f32)\ni <= round(i32)\ni <= score(1)\ni == -f32\ni == -f64\ni == -i\ni == -i32\ni == -i64\ni == 0.5 ** f64\ni == 0.5 == ok\ni == 0.5 ? \"foo\" : f64\ni == 1 * 0.5\ni == 1 ** i64\ni == 1 / 0.5\ni == 1 / f32\ni == 1 ? f32 : 1\ni == 1 ? f64 : f64\ni == 1 ? greet : score\ni == abs(i64)\ni == bitnot(1)\ni == f32\ni == f32 + i\ni == f32 == nil\ni == f32 ? foo : foo\ni == f32 ^ i32\ni == f64\ni == f64 + i32\ni == f64 - i\ni == f64 ? i64 : div\ni == f64 ? score : foo\ni == f64 and ok\ni == findIndex(list, true)\ni == float(0.5)\ni == floor(f32)\ni == floor(i32)\ni == half(0.5)\ni == half(f64)\ni == i\ni == i + 0.5\ni == i - i32\ni == i == true\ni == i ? add : i32\ni == i ? i32 : add\ni == i and ok\ni == i32\ni == i32 * 0.5\ni == i32 ** 0.5\ni == i32 + 0.5\ni == i32 + i64\ni == i32 ^ f32\ni == i64\ni == i64 * 0.5\ni == i64 * f32\ni == i64 ** 0.5\ni == i64 == nil\ni == i64 == ok\ni == i64 ? list : div\ni == len(\"bar\")\ni == nil ? 0.5 : div\ni == nil ? div : i32\ni == nil and add != nil\ni == reduce(array, #)\ni == reduce(array, 0.5)\ni == score(1)\ni == score(i)\ni > -f32\ni > -f64\ni > -i\ni > -i32\ni > 0.5 - 0.5\ni > 0.5 ^ i64\ni > 0.5 or ok\ni > 0.5 || ok\ni > 1 != ok\ni > 1 % i64\ni > 1 ** i32\ni > 1 == ok\ni > 1 ? greet : nil\ni > 1 ? score : 0.5\ni > 1 ? true : greet\ni > bitnot(1)\ni > bitor(1, i32)\ni > count(array, true)\ni > f32\ni > f32 ** i32\ni > f32 - f64\ni > f32 ^ 1\ni > f64\ni > f64 != ok\ni > f64 * 1\ni > f64 * f32\ni > f64 ** i32\ni > f64 ? foo : array\ni > f64 ? greet : \"bar\"\ni > first(array)\ni > floor(f64)\ni > i\ni > i % i32\ni > i ** i\ni > i + i\ni > i ? f32 : i32\ni > i32\ni > i32 * 1\ni > i32 * i32\ni > i32 + 1\ni > i32 == ok\ni > i64\ni > i64 && f32 < 0.5\ni > i64 + 0.5\ni > i64 - 0.5\ni > i64 - i\ni > int(f32)\ni > len(\"bar\")\ni > reduce(list, i32)\ni >= -0.5\ni >= -1\ni >= -f32\ni >= -i\ni >= -i32\ni >= -i64\ni >= 0.5 / 1\ni >= 0.5 ? i64 : array\ni >= 0.5 ? nil : ok\ni >= 0.5 ^ i\ni >= 1 * i64\ni >= 1 + f32\ni >= 1 == nil\ni >= 1 ? f32 : nil\ni >= 1 ? ok : false\ni >= 1 ^ f64\ni >= bitnot(i)\ni >= f32\ni >= f32 ? f32 : i\ni >= f32 ? true : list\ni >= f64\ni >= f64 * 0.5\ni >= f64 - 1\ni >= first(array)\ni >= float(0.5)\ni >= float(1)\ni >= get(array, i64)\ni >= half(f64)\ni >= i\ni >= i * 1\ni >= i ** f32\ni >= i ? foo : div\ni >= i32\ni >= i32 ** i64\ni >= i32 ? f32 : div\ni >= i32 ^ 1\ni >= i64\ni >= int(0.5)\ni >= min(0.5)\ni >= reduce(array, f64)\ni >= reduce(array, i)\ni >= reduce(list, 1)\ni >= round(1)\ni >= score(1)\ni >= score(i)\ni ^ (1 % i)\ni ^ (1 * f64)\ni ^ (1 - 0.5)\ni ^ (f32 - f64)\ni ^ (f64 - 1)\ni ^ (i + 0.5)\ni ^ (i + i64)\ni ^ (i - f32)\ni ^ (i32 * i32)\ni ^ (i32 + 1)\ni ^ (i32 / f32)\ni ^ (i32 / i)\ni ^ (i64 * 1)\ni ^ -1\ni ^ -f32\ni ^ -f64\ni ^ -i\ni ^ 0.5 ** 0.5\ni ^ 0.5 + i32\ni ^ 0.5 < f64\ni ^ 0.5 < i\ni ^ 0.5 <= i64\ni ^ 0.5 > f64\ni ^ 0.5 >= f32\ni ^ 0.5 >= reduce(array, #)\ni ^ 0.5 ^ f32\ni ^ 0.5 ^ i64\ni ^ 1 * f64\ni ^ 1 / i\ni ^ 1 >= f32\ni ^ 1 ^ i\ni ^ 1 not in array\ni ^ bitnot(i64 + 1)\ni ^ bitnot(min(i))\ni ^ ceil(0.5)\ni ^ f32\ni ^ f32 ** 1\ni ^ f32 < i\ni ^ f32 <= -f32\ni ^ f64\ni ^ f64 ** 0.5\ni ^ f64 - f64\ni ^ f64 / i32\ni ^ f64 <= f32\ni ^ f64 == i\ni ^ f64 > f32\ni ^ find(array, ok)\ni ^ floor(i32)\ni ^ half(0.5)\ni ^ half(1)\ni ^ half(f64)\ni ^ i\ni ^ i * i\ni ^ i * i64\ni ^ i ** i\ni ^ i / i\ni ^ i32\ni ^ i32 / f64\ni ^ i32 in array\ni ^ i64\ni ^ i64 != f32 + 1\ni ^ i64 ** f32\ni ^ last(array)\ni ^ median(array)\ni ^ min(i32, 1)\ni ^ reduce(array, #)\ni ^ round(i32)\ni ^ score(1)\ni in 1 .. i\ni in array\ni in array != nil\ni in array ? nil : 1\ni in groupBy(list, #)\ni in groupBy(list, foo)\ni in map(array, #)\ni in map(array, i64)\ni not in 1 .. 1\ni not in array\ni not in groupBy(array, #)\ni not in groupBy(list, #)\ni not in i64 .. 1\ni not in i64 .. i64\ni not in map(array, #)\ni not in map(list, i32)\ni32\ni32 != -0.5\ni32 != -1\ni32 != -f32\ni32 != -i\ni32 != -i32\ni32 != -i64\ni32 != 0.5 - 0.5\ni32 != 0.5 - i32\ni32 != 0.5 / f32\ni32 != 0.5 ^ 0.5\ni32 != 0.5 ^ i64\ni32 != 0.5 || ok\ni32 != 1 % i64\ni32 != 1 && ok\ni32 != 1 * f32\ni32 != 1 ? \"foo\" : array\ni32 != 1 ? greet : \"foo\"\ni32 != array[i64]\ni32 != bitnot(i)\ni32 != bitnot(i64)\ni32 != ceil(1)\ni32 != ceil(f64)\ni32 != count(array, false)\ni32 != f32\ni32 != f32 == true\ni32 != f32 ? false : 0.5\ni32 != f32 ? i : 0.5\ni32 != f64\ni32 != f64 ** i\ni32 != f64 - 1\ni32 != f64 ? 1 : add\ni32 != findLastIndex(array, false)\ni32 != get(array, 1)\ni32 != half(1)\ni32 != i\ni32 != i + 1\ni32 != i32\ni32 != i32 ** 0.5\ni32 != i32 + 0.5\ni32 != i32 ^ i64\ni32 != i64\ni32 != i64 * i64\ni32 != i64 / 0.5\ni32 != i64 / f32\ni32 != len(list)\ni32 != max(f64)\ni32 != min(1)\ni32 != min(i32)\ni32 != nil != false\ni32 != nil ? f64 : \"foo\"\ni32 != reduce(array, #)\ni32 != reduce(array, i)\ni32 != reduce(list, f32)\ni32 != round(1)\ni32 % -1\ni32 % -i32\ni32 % 1 % i32\ni32 % 1 * f32\ni32 % 1 * i\ni32 % 1 * i32\ni32 % 1 .. i\ni32 % 1 / 0.5\ni32 % 1 / i32\ni32 % 1 > i\ni32 % array[i64]\ni32 % get(array, 1)\ni32 % i\ni32 % i != i\ni32 % i < i\ni32 % i32\ni32 % i32 != f64\ni32 % i32 * i64\ni32 % i32 == i32\ni32 % i32 >= i64\ni32 % i64\ni32 % i64 % i\ni32 % i64 * i64\ni32 % i64 + i\ni32 % i64 .. i\ni32 % i64 / i\ni32 % i64 == f64\ni32 % max(i32)\ni32 % reduce(array, #)\ni32 % score(1)\ni32 * (1 + f32)\ni32 * (1 + f64)\ni32 * (f32 + 1)\ni32 * (f32 - i)\ni32 * (f64 + 0.5)\ni32 * (f64 + i)\ni32 * (i - f32)\ni32 * (i32 + i64)\ni32 * (i32 - 1)\ni32 * (i32 - f64)\ni32 * -0.5\ni32 * -1\ni32 * -f32\ni32 * -i32\ni32 * -i64\ni32 * 0.5 * 0.5\ni32 * 0.5 / 0.5\ni32 * 0.5 / 1\ni32 * 0.5 / i32\ni32 * 0.5 == f64\ni32 * 0.5 == i64\ni32 * 0.5 ^ f64\ni32 * 0.5 ^ i32\ni32 * 1 * i\ni32 * 1 ** i64\ni32 * 1 + f64\ni32 * 1 - i64\ni32 * 1 > half(0.5)\ni32 * 1 ^ 1\ni32 * abs(i32)\ni32 * bitnot(i32)\ni32 * ceil(1)\ni32 * f32\ni32 * f32 + f32\ni32 * f32 / i\ni32 * f32 <= f64\ni32 * f32 <= i32\ni32 * f32 ^ f32\ni32 * f64\ni32 * f64 * 1\ni32 * f64 >= f32\ni32 * first(array)\ni32 * float(f32)\ni32 * float(f64)\ni32 * floor(f64)\ni32 * half(0.5)\ni32 * half(1)\ni32 * i\ni32 * i / -i\ni32 * i / f32\ni32 * i / i64\ni32 * i < f32\ni32 * i32\ni32 * i32 != f64\ni32 * i32 % i64 / i\ni32 * i32 / i64\ni32 * i32 < i64\ni32 * i32 >= f32\ni32 * i64\ni32 * i64 % 1\ni32 * i64 % 1 % 1\ni32 * i64 ** i64\ni32 * i64 / f32\ni32 * i64 < i\ni32 * len(\"foo\")\ni32 * max(i32)\ni32 * max(i64)\ni32 * median(array)\ni32 * min(0.5)\ni32 * min(i)\ni32 * reduce(array, #)\ni32 * round(i)\ni32 * score(1)\ni32 * score(i)\ni32 ** (0.5 - i32)\ni32 ** (1 * i64)\ni32 ** (1 / 0.5)\ni32 ** (f32 * i64)\ni32 ** (i % i32)\ni32 ** (i - i)\ni32 ** (i - i32)\ni32 ** (i / 0.5)\ni32 ** (i32 / i64)\ni32 ** (i64 + 0.5)\ni32 ** (i64 - 1)\ni32 ** -1\ni32 ** -f64\ni32 ** -i\ni32 ** -i64\ni32 ** 0.5 * i64\ni32 ** 0.5 - f64\ni32 ** 0.5 / reduce(array, #)\ni32 ** 0.5 ^ i\ni32 ** 1 ** i64\ni32 ** 1 + f32\ni32 ** 1 / i64\ni32 ** 1 <= i\ni32 ** 1 ^ i64\ni32 ** 1 in array\ni32 ** array[1]\ni32 ** array[i64]\ni32 ** bitnot(i64)\ni32 ** ceil(1)\ni32 ** ceil(f64)\ni32 ** f32\ni32 ** f32 / score(1)\ni32 ** f32 < f32\ni32 ** f32 <= i\ni32 ** f32 == f32\ni32 ** f64\ni32 ** f64 == f32\ni32 ** f64 > i\ni32 ** find(array, ok)\ni32 ** float(i32)\ni32 ** half(0.5)\ni32 ** half(1)\ni32 ** half(f64)\ni32 ** i\ni32 ** i * f64\ni32 ** i ** i\ni32 ** i ^ i\ni32 ** i32\ni32 ** i32 ^ i64\ni32 ** i64\ni32 ** int(1)\ni32 ** int(i32)\ni32 ** len(\"foo\")\ni32 ** len(list)\ni32 ** max(f32, i32)\ni32 ** min(0.5)\ni32 ** min(i64)\ni32 ** reduce(array, 1)\ni32 ** reduce(array, i64)\ni32 ** reduce(list, i64)\ni32 ** round(i64)\ni32 ** sum(array)\ni32 + -0.5\ni32 + -1\ni32 + -i\ni32 + -i32\ni32 + -i64\ni32 + 0.5 != f32\ni32 + 0.5 != i32\ni32 + 0.5 * i\ni32 + 0.5 + 0.5\ni32 + 0.5 + 1\ni32 + 0.5 + f32\ni32 + 0.5 + f64\ni32 + 0.5 + i\ni32 + 0.5 + i64\ni32 + 0.5 / i64\ni32 + 0.5 <= -f32\ni32 + 1 % 1\ni32 + 1 + i64\ni32 + 1 - f32\ni32 + 1 - i\ni32 + 1 - i64\ni32 + 1 / i\ni32 + 1 ^ f32\ni32 + abs(f32)\ni32 + array[i64]\ni32 + bitnot(i32)\ni32 + ceil(i)\ni32 + f32\ni32 + f32 / i\ni32 + f32 < i32\ni32 + f32 <= i64\ni32 + f64\ni32 + f64 * 1\ni32 + f64 * i32\ni32 + f64 > i32\ni32 + f64 ^ 0.5\ni32 + f64 ^ i32\ni32 + findIndex(list, true)\ni32 + floor(0.5)\ni32 + floor(f64)\ni32 + i\ni32 + i + f64\ni32 + i + i64\ni32 + i - 0.5\ni32 + i - i64\ni32 + i <= i32\ni32 + i > i64\ni32 + i32\ni32 + i32 + f64\ni32 + i32 <= i + i64\ni32 + i32 > i\ni32 + i32 > i32\ni32 + i64\ni32 + i64 % i32\ni32 + i64 ** 1\ni32 + i64 - 0.5\ni32 + i64 - f32\ni32 + i64 / 0.5\ni32 + i64 ^ 1\ni32 + int(i64)\ni32 + len(\"bar\")\ni32 + min(i32)\ni32 + reduce(array, #)\ni32 + round(f32)\ni32 + round(i32)\ni32 + score(i)\ni32 - -0.5\ni32 - -1\ni32 - -f32\ni32 - -i\ni32 - 0.5 * f32\ni32 - 0.5 + half(0.5)\ni32 - 0.5 - i32\ni32 - 0.5 <= f32\ni32 - 0.5 ^ 0.5\ni32 - 1 ** i\ni32 - 1 + 0.5\ni32 - 1 > -i64\ni32 - abs(i32)\ni32 - abs(i64)\ni32 - array[i]\ni32 - bitushr(i32, i64)\ni32 - div(1, i)\ni32 - div(i, i)\ni32 - f32\ni32 - f32 * 0.5\ni32 - f32 + i32\ni32 - f32 - int(f64)\ni32 - f32 / i32\ni32 - f32 < i64\ni32 - f32 <= f32\ni32 - f32 <= i32\ni32 - f32 > i\ni32 - f32 >= f32\ni32 - f64\ni32 - f64 + f32\ni32 - float(0.5)\ni32 - float(1)\ni32 - float(f64)\ni32 - floor(1)\ni32 - floor(f64)\ni32 - get(array, i)\ni32 - half(0.5)\ni32 - half(f64)\ni32 - i\ni32 - i ** i64\ni32 - i + i32\ni32 - i / 0.5\ni32 - i == f32\ni32 - i > f64\ni32 - i > i\ni32 - i >= i64\ni32 - i32\ni32 - i32 != i64\ni32 - i32 * 1\ni32 - i32 * i32\ni32 - i32 + 1\ni32 - i32 < i32\ni32 - i32 > i64\ni32 - i32 > i64 / i\ni32 - i64\ni32 - i64 != -f32\ni32 - i64 / 1\ni32 - i64 == f64\ni32 - len(array)\ni32 - len(list)\ni32 - max(f32)\ni32 - score(1)\ni32 .. -i64\ni32 .. abs(i64)\ni32 .. bitnot(i64)\ni32 .. bitushr(i, 1)\ni32 .. count(array, true)\ni32 .. div(i, 1)\ni32 .. i\ni32 .. i32\ni32 .. i64\ni32 .. int(f32)\ni32 .. len(\"foo\")\ni32 .. max(1)\ni32 .. max(i32)\ni32 .. max(i32, 0.5)\ni32 .. score(i)\ni32 / (1 + 1)\ni32 / (1 + i64)\ni32 / (f64 - i64)\ni32 / (i32 + i64)\ni32 / (i64 + 0.5)\ni32 / -0.5\ni32 / -f32\ni32 / -i\ni32 / -i32\ni32 / -i64\ni32 / 0.5 * i\ni32 / 0.5 * i / 1\ni32 / 0.5 + i64\ni32 / 0.5 - i32\ni32 / 0.5 / i32\ni32 / 0.5 / i64\ni32 / 0.5 >= i64\ni32 / 0.5 ^ 1\ni32 / 0.5 ^ f64\ni32 / 1 != i\ni32 / 1 * i64\ni32 / 1 ** 1\ni32 / 1 ^ 0.5\ni32 / abs(0.5)\ni32 / abs(1)\ni32 / abs(f64)\ni32 / abs(i32)\ni32 / array[1]\ni32 / ceil(i32)\ni32 / f32\ni32 / f32 ** 1\ni32 / f32 / i64\ni32 / f32 <= i32\ni32 / f32 <= i64\ni32 / f32 >= i32 == false\ni32 / f64\ni32 / f64 != f64\ni32 / f64 != i64\ni32 / f64 * 1\ni32 / f64 - i32\ni32 / f64 == i64\ni32 / f64 >= f32\ni32 / find(array, ok)\ni32 / float(f32)\ni32 / floor(1)\ni32 / floor(f64)\ni32 / half(0.5)\ni32 / i\ni32 / i * i32\ni32 / i ^ i32\ni32 / i32\ni32 / i32 * f64\ni32 / i32 / i64\ni32 / i32 <= i64\ni32 / i64\ni32 / i64 ** f32\ni32 / i64 ^ 0.5\ni32 / int(1)\ni32 / len(\"foo\")\ni32 / max(1)\ni32 / max(i)\ni32 / min(f32)\ni32 / reduce(array, #)\ni32 / score(i)\ni32 < -f32\ni32 < -f64\ni32 < -i32\ni32 < 0.5 ** i32\ni32 < 0.5 - 1\ni32 < 0.5 - f32\ni32 < 0.5 / 1\ni32 < 0.5 == nil\ni32 < 0.5 ? \"foo\" : half\ni32 < 0.5 ? foo : 1\ni32 < 0.5 or ok\ni32 < 0.5 || ok\ni32 < 1 * f32\ni32 < 1 + i64\ni32 < 1 / f32\ni32 < 1 ^ i\ni32 < abs(f64)\ni32 < f32\ni32 < f32 * i\ni32 < f32 - 0.5\ni32 < f32 - 1\ni32 < f64\ni32 < f64 * i64\ni32 < float(reduce(array, f32))\ni32 < get(array, i32)\ni32 < get(array, i64)\ni32 < half(1)\ni32 < half(f64)\ni32 < i\ni32 < i ** i64\ni32 < i + 0.5\ni32 < i / i32\ni32 < i ? score : score\ni32 < i32\ni32 < i32 % i\ni32 < i32 ** 1\ni32 < i32 - f32\ni32 < i32 ^ i64\ni32 < i64\ni32 < i64 ** 0.5\ni32 < i64 + f32\ni32 < i64 / f64\ni32 < int(0.5)\ni32 < last(array)\ni32 < min(1)\ni32 < min(f64)\ni32 < min(i32)\ni32 < score(1)\ni32 < score(i)\ni32 <= -0.5\ni32 <= -f32\ni32 <= -i\ni32 <= -i32\ni32 <= -i64\ni32 <= 0.5 - f64\ni32 <= 0.5 == nil\ni32 <= 0.5 ? i32 : greet\ni32 <= 0.5 ? i32 : half\ni32 <= 0.5 ^ i64\ni32 <= 0.5 and ok\ni32 <= 1 + i32\ni32 <= 1 + i64\ni32 <= 1 ^ 0.5\ni32 <= 1 and ok\ni32 <= 1 || i32 >= i32\ni32 <= abs(1)\ni32 <= f32\ni32 <= f32 != ok\ni32 <= f64\ni32 <= f64 != ok\ni32 <= f64 * i\ni32 <= f64 == ok\ni32 <= f64 ^ f64\ni32 <= findIndex(array, true)\ni32 <= float(i32)\ni32 <= floor(0.5)\ni32 <= half(0.5)\ni32 <= half(1)\ni32 <= half(f64)\ni32 <= i\ni32 <= i * 1\ni32 <= i * i64\ni32 <= i - 0.5\ni32 <= i32\ni32 <= i32 != true\ni32 <= i64\ni32 <= i64 / 1\ni32 <= len(\"foo\")\ni32 <= max(i64)\ni32 <= mean(array)\ni32 <= round(0.5)\ni32 <= score(1)\ni32 <= score(i)\ni32 == -0.5\ni32 == -1\ni32 == -f32\ni32 == -f64\ni32 == -i\ni32 == 0.5 != false\ni32 == 0.5 * f32\ni32 == 0.5 / 0.5\ni32 == 1 % 1\ni32 == 1 + f32\ni32 == 1 - i\ni32 == 1 ? div : div\ni32 == 1 ^ 0.5\ni32 == 1 ^ f64\ni32 == abs(f64)\ni32 == abs(i)\ni32 == bitnot(1)\ni32 == bitnot(i)\ni32 == ceil(1)\ni32 == count(list, ok)\ni32 == f32\ni32 == f32 * i32\ni32 == f32 ** 1\ni32 == f32 - f32\ni32 == f32 ? f64 : list\ni32 == f32 ? i64 : true\ni32 == f32 ? score : \"bar\"\ni32 == f64\ni32 == f64 ** 0.5\ni32 == find(array, 0.5 == i64)\ni32 == first(array)\ni32 == floor(f64)\ni32 == half(f64)\ni32 == i\ni32 == i ** f64\ni32 == i ? half : 1\ni32 == i ? i : \"bar\"\ni32 == i32\ni32 == i32 && i == i\ni32 == i32 - 1\ni32 == i32 - i64\ni32 == i64\ni32 == i64 * f32\ni32 == i64 ? \"foo\" : 1\ni32 == i64 or ok\ni32 == int(f64)\ni32 == int(i)\ni32 == nil ? f32 : 0.5\ni32 == reduce(array, #)\ni32 == round(i32)\ni32 == round(i64)\ni32 == score(1)\ni32 > -0.5\ni32 > -f64\ni32 > -i32\ni32 > 0.5 != true\ni32 > 0.5 * f64\ni32 > 0.5 ** 0.5\ni32 > 0.5 ** 1\ni32 > 0.5 ** i\ni32 > 0.5 - i\ni32 > 0.5 / 1\ni32 > 0.5 == ok\ni32 > 0.5 ^ 1\ni32 > 0.5 || ok\ni32 > 1 * f64\ni32 > 1 * i32\ni32 > 1 + i64\ni32 > 1 ? f32 : f64\ni32 > 1 ? i : \"bar\"\ni32 > 1 ? i64 : div\ni32 > ceil(0.5)\ni32 > ceil(1)\ni32 > count(array, ok)\ni32 > f32\ni32 > f32 * i64\ni32 > f32 + 0.5\ni32 > f32 + 1\ni32 > f32 - f32\ni32 > f32 - i32\ni32 > f32 ^ 0.5\ni32 > f64\ni32 > f64 ** i32\ni32 > f64 + f64\ni32 > get(array, i32)\ni32 > half(1)\ni32 > half(half(1))\ni32 > i\ni32 > i != ok\ni32 > i + f32\ni32 > i ? i : i\ni32 > i ^ i32\ni32 > i32\ni32 > i32 - i\ni32 > i32 == nil ? score : i\ni32 > i32 ? score : 1\ni32 > i32 ^ 1\ni32 > i32 ^ i32\ni32 > i64\ni32 > i64 != false\ni32 > i64 ** f32\ni32 > i64 / 1\ni32 > i64 == ok\ni32 > i64 || ok\ni32 > int(1)\ni32 > int(i64)\ni32 > min(i32)\ni32 > reduce(array, #)\ni32 > round(i64)\ni32 > score(i)\ni32 >= -1\ni32 >= -f32\ni32 >= -f64\ni32 >= -i\ni32 >= -i64\ni32 >= 0.5 != not true\ni32 >= 0.5 == true\ni32 >= 0.5 ? 0.5 : half\ni32 >= 0.5 ^ 0.5\ni32 >= 0.5 ^ i32\ni32 >= 1 % i\ni32 >= 1 * 0.5\ni32 >= 1 * i32\ni32 >= 1 + i64\ni32 >= 1 - 1\ni32 >= 1 == ok\ni32 >= 1 ? 1 : false\ni32 >= 1 ? add : 1\ni32 >= abs(0.5)\ni32 >= abs(f32)\ni32 >= bitnot(1 + i)\ni32 >= bitnot(i64)\ni32 >= ceil(1)\ni32 >= ceil(f32)\ni32 >= count(list, true)\ni32 >= f32\ni32 >= f32 ** f32\ni32 >= f32 ^ 1\ni32 >= f64\ni32 >= f64 != false\ni32 >= f64 ** f64\ni32 >= f64 / i64\ni32 >= f64 ? half : f64\ni32 >= f64 ^ f64\ni32 >= float(0.5)\ni32 >= floor(1)\ni32 >= floor(f32)\ni32 >= half(0.5)\ni32 >= i\ni32 >= i % 1\ni32 >= i % i64\ni32 >= i / i32\ni32 >= i / i64\ni32 >= i == ok\ni32 >= i32\ni32 >= i32 ** i32\ni32 >= i64\ni32 >= i64 != false\ni32 >= i64 - i64\ni32 >= i64 / i32\ni32 >= i64 ? 0.5 : 0.5\ni32 >= i64 ? div : half\ni32 >= i64 ? half : i64\ni32 >= i64 and ok\ni32 >= int(i64)\ni32 >= last(array)\ni32 >= min(i32)\ni32 >= reduce(array, #)\ni32 >= reduce(array, i64)\ni32 >= reduce(list, i32)\ni32 >= round(f32)\ni32 >= score(1)\ni32 ^ (0.5 + 1)\ni32 ^ (1 - i)\ni32 ^ (i + 1)\ni32 ^ (i / f64)\ni32 ^ (i32 + 0.5)\ni32 ^ (i32 - f32)\ni32 ^ (i64 + i)\ni32 ^ -0.5\ni32 ^ -1\ni32 ^ -f64\ni32 ^ -i\ni32 ^ -i32\ni32 ^ -i64\ni32 ^ 0.5 != f32\ni32 ^ 0.5 != f64\ni32 ^ 0.5 * i\ni32 ^ 0.5 ** i64\ni32 ^ 0.5 - f32\ni32 ^ 0.5 / i32\ni32 ^ 0.5 == i64\ni32 ^ 0.5 >= f64\ni32 ^ 1 ** i32\ni32 ^ 1 + i32\ni32 ^ 1 - f64\ni32 ^ 1 < f64\ni32 ^ 1 ^ (1 + i64)\ni32 ^ 1 ^ f32\ni32 ^ array[i64]\ni32 ^ f32\ni32 ^ f32 / bitnot(1)\ni32 ^ f32 >= max(f64)\ni32 ^ f64\ni32 ^ f64 + i\ni32 ^ find(array, true)\ni32 ^ first(array)\ni32 ^ float(i64)\ni32 ^ i\ni32 ^ i * f64\ni32 ^ i + i64\ni32 ^ i <= f32\ni32 ^ i32\ni32 ^ i32 * f64\ni32 ^ i32 ** i\ni32 ^ i64\ni32 ^ i64 == f64\ni32 ^ i64 > -f64\ni32 ^ len(list)\ni32 ^ mean(array)\ni32 ^ min(i)\ni32 ^ reduce(array, #)\ni32 ^ reduce(list, 1)\ni32 in [0.5]\ni32 in array\ni32 in array || ok\ni32 in groupBy(array, #)\ni32 in groupBy(array, f32)\ni32 in groupBy(list, #)\ni32 in groupBy(list, #?.Bar)\ni32 in groupBy(list, foo).i\ni32 in i32 .. 1\ni32 in i32 .. i64\ni32 in map(array, #)\ni32 in map(list, 0.5)\ni32 in map(list, i32)\ni32 not in 1 .. i\ni32 not in array\ni32 not in array ? array : array\ni32 not in filter(array, ok)\ni32 not in groupBy(list, #)\ni64\ni64 != -1\ni64 != -i\ni64 != -i64\ni64 != 0.5 && ok\ni64 != 0.5 * 0.5\ni64 != 0.5 * i\ni64 != 0.5 + 0.5\ni64 != 0.5 + i\ni64 != 0.5 - 0.5\ni64 != 0.5 / i64\ni64 != 0.5 ? i : 1\ni64 != 0.5 ^ i32\ni64 != 1 * f64\ni64 != 1 - 1\ni64 != abs(f64)\ni64 != array[i64]\ni64 != bitnot(i32)\ni64 != f32\ni64 != f32 + i64\ni64 != f64\ni64 != f64 * 1\ni64 != f64 == true\ni64 != f64 or i64 <= f32\ni64 != findIndex(array, ok)\ni64 != float(1)\ni64 != floor(i)\ni64 != get(array, i)\ni64 != half(0.5)\ni64 != half(1)\ni64 != i\ni64 != i % 1\ni64 != i + 1\ni64 != i / 0.5\ni64 != i ? f32 : true\ni64 != i32\ni64 != i32 ? 0.5 : nil\ni64 != i32 ? f64 : greet\ni64 != i32 ^ i\ni64 != i32 || ok\ni64 != i64\ni64 != i64 - 0.5\ni64 != len(\"bar\")\ni64 != len(list)\ni64 != max(0.5)\ni64 != min(1)\ni64 != min(1, f32)\ni64 != min(f32)\ni64 != min(i)\ni64 != nil != ok\ni64 != nil ? div : 1\ni64 != nil ? greet : i\ni64 != nil ? i : i\ni64 != nil ? i64 : false\ni64 != score(1)\ni64 != score(i)\ni64 % -i\ni64 % 1 % 1\ni64 % 1 * i\ni64 % 1 < i32\ni64 % 1 >= f64\ni64 % 1 >= i32\ni64 % abs(i32)\ni64 % array[i32]\ni64 % i\ni64 % i * i\ni64 % i >= i\ni64 % i32\ni64 % i32 / f64\ni64 % i32 <= f64\ni64 % i64\ni64 % i64 % 1\ni64 % i64 .. i64\ni64 % i64 == i64\ni64 % int(i32)\ni64 % len(\"bar\")\ni64 % max(i)\ni64 % min(1)\ni64 % score(1)\ni64 * (0.5 + f64)\ni64 * (1 - i64)\ni64 * (f32 - f32)\ni64 * (f64 + f32)\ni64 * (i + 0.5)\ni64 * (i + f64)\ni64 * (i32 + f64)\ni64 * -0.5\ni64 * -1\ni64 * -f32\ni64 * -i32\ni64 * 0.5 * i32\ni64 * 0.5 ** 0.5\ni64 * 0.5 - f32\ni64 * 0.5 / 1\ni64 * 0.5 >= f32\ni64 * 1 % 1\ni64 * 1 * 0.5\ni64 * 1 * f64\ni64 * 1 ** 1\ni64 * 1 - i64\ni64 * 1 .. i32\ni64 * 1 / i64\ni64 * 1 <= f64\ni64 * 1 == 0.5 != true\ni64 * 1 == f32\ni64 * 1 > 1 - i64\ni64 * 1 > f64\ni64 * 1 ^ i32\ni64 * add(1, 1)\ni64 * ceil(1)\ni64 * ceil(i)\ni64 * ceil(i64)\ni64 * count(array, false)\ni64 * f32\ni64 * f32 * f32\ni64 * f32 ** 1\ni64 * f32 / f32\ni64 * f32 / i\ni64 * f32 / i32\ni64 * f32 not in array\ni64 * f64\ni64 * f64 + i32\ni64 * f64 - f64\ni64 * f64 / f64\ni64 * f64 < f64\ni64 * f64 > f64\ni64 * f64 ^ i32\ni64 * findIndex(array, ok)\ni64 * float(i)\ni64 * float(i64)\ni64 * half(0.5)\ni64 * i\ni64 * i - -f64\ni64 * i <= f64\ni64 * i32\ni64 * i32 != i32\ni64 * i32 * 1\ni64 * i32 * i\ni64 * i32 / 0.5\ni64 * i32 ^ i\ni64 * i64\ni64 * i64 % i64\ni64 * i64 * i64\ni64 * i64 ** i\ni64 * i64 / f32\ni64 * i64 > i32\ni64 * int(1)\ni64 * int(i)\ni64 * max(1)\ni64 * max(i64)\ni64 * min(1)\ni64 * min(i32)\ni64 * reduce(array, #)\ni64 * reduce(list, 0.5)\ni64 * reduce(list, 1)\ni64 * round(i)\ni64 * score(1)\ni64 ** (0.5 + 0.5)\ni64 ** (0.5 / 1)\ni64 ** (1 % 1)\ni64 ** (1 * 1)\ni64 ** (1 - f32)\ni64 ** (f32 + 1)\ni64 ** (f32 / 0.5)\ni64 ** (f64 - 0.5)\ni64 ** (i * i64)\ni64 ** (i / 1)\ni64 ** (i64 % i)\ni64 ** (i64 / i)\ni64 ** -0.5\ni64 ** -1\ni64 ** -f32\ni64 ** 0.5 != i32\ni64 ** 0.5 <= f32\ni64 ** 0.5 <= i\ni64 ** 1 + i32\ni64 ** 1 - f32\ni64 ** 1 / i64\ni64 ** 1 >= f32\ni64 ** bitnot(i32)\ni64 ** ceil(i32)\ni64 ** count(array, false)\ni64 ** f32\ni64 ** f32 * min(0.5)\ni64 ** f64\ni64 ** f64 ** f64\ni64 ** f64 not in array\ni64 ** f64 not in array ? f32 : greet\ni64 ** floor(f32)\ni64 ** half(1)\ni64 ** i\ni64 ** i != f32\ni64 ** i * f32\ni64 ** i <= -i\ni64 ** i == f64\ni64 ** i ^ f32\ni64 ** i32\ni64 ** i32 != i64\ni64 ** i32 * i ^ i\ni64 ** i32 not in array\ni64 ** i64\ni64 ** i64 - i64\ni64 ** i64 in array\ni64 ** max(1)\ni64 ** min(0.5)\ni64 ** min(1)\ni64 ** min(i32, 1)\ni64 ** reduce(array, #)\ni64 + -1\ni64 + -i\ni64 + -i64\ni64 + 0.5 ** f32\ni64 + 0.5 + i32\ni64 + 0.5 + i64\ni64 + 0.5 - f64\ni64 + 0.5 <= bitnand(1, 1)\ni64 + 0.5 <= f64\ni64 + 0.5 == f32\ni64 + 1 != f64\ni64 + 1 % i64\ni64 + 1 + f64\ni64 + 1 <= f32\ni64 + array[i64]\ni64 + array[i]\ni64 + f32\ni64 + f32 * f64\ni64 + f32 / i64\ni64 + f64\ni64 + f64 * 0.5\ni64 + f64 ** 0.5\ni64 + f64 > f32\ni64 + float(f32)\ni64 + float(i32)\ni64 + half(0.5)\ni64 + i\ni64 + i % 1\ni64 + i * 0.5\ni64 + i + f32\ni64 + i - i32\ni64 + i / i32\ni64 + i == 0.5 - i32\ni64 + i ^ f32\ni64 + i ^ f64\ni64 + i32\ni64 + i32 % i64\ni64 + i32 - 0.5\ni64 + i32 == f64\ni64 + i64\ni64 + i64 - 0.5\ni64 + reduce(array, #)\ni64 + score(i)\ni64 - -1\ni64 - -f32\ni64 - -i32\ni64 - -i64\ni64 - 0.5 + f32\ni64 - 0.5 / i64\ni64 - 0.5 <= i\ni64 - 0.5 ^ f32\ni64 - 1 ** 1\ni64 - 1 < i\ni64 - 1 == i32\ni64 - 1 > f32\ni64 - 1 >= i\ni64 - 1 not in array\ni64 - ceil(1)\ni64 - f32\ni64 - f32 != f32\ni64 - f32 - 1\ni64 - f32 - i\ni64 - f32 / 1\ni64 - f32 < i64\ni64 - f32 >= f64\ni64 - f64\ni64 - f64 != i\ni64 - f64 ** f32\ni64 - f64 ** i32\ni64 - f64 + f32\ni64 - f64 + i32\ni64 - f64 >= f64\ni64 - float(0.5)\ni64 - half(1)\ni64 - half(f64)\ni64 - i\ni64 - i * 1\ni64 - i + i64\ni64 - i - 1\ni64 - i .. i64\ni64 - i < i32\ni64 - i > 1 - 0.5\ni64 - i >= f64\ni64 - i ^ i64\ni64 - i not in array\ni64 - i32\ni64 - i32 - i64\ni64 - i32 .. i64\ni64 - i32 > i\ni64 - i32 >= i\ni64 - i64\ni64 - i64 > f32\ni64 - int(i)\ni64 - len(\"foo\")\ni64 - max(0.5)\ni64 - min(f32)\ni64 - min(f64)\ni64 - min(i)\ni64 - reduce(array, #)\ni64 - reduce(array, i64)\ni64 - round(1)\ni64 - score(1)\ni64 - score(i)\ni64 .. -1\ni64 .. -i\ni64 .. -i32\ni64 .. -i64\ni64 .. 1 * i64\ni64 .. 1 - 1\ni64 .. 1 - i\ni64 .. 1 - i64\ni64 .. abs(i)\ni64 .. bitnot(i32)\ni64 .. count(array, false)\ni64 .. get(array, 1)\ni64 .. i\ni64 .. i * i\ni64 .. i + 1\ni64 .. i == list\ni64 .. i32\ni64 .. i32 * 1\ni64 .. i64\ni64 .. i64 * i32\ni64 .. i64 + i\ni64 .. i64 - i\ni64 .. int(0.5)\ni64 .. int(f32)\ni64 .. int(i64)\ni64 .. min(i32)\ni64 .. min(i64, 0.5)\ni64 .. reduce(array, #)\ni64 .. score(1)\ni64 / (f32 + i64)\ni64 / (f32 - i)\ni64 / (i + 1)\ni64 / (i32 + 0.5)\ni64 / (i64 - i)\ni64 / -0.5\ni64 / -1\ni64 / -f32\ni64 / -f64\ni64 / -i\ni64 / 0.5 * f64\ni64 / 0.5 - i64\ni64 / 0.5 / i\ni64 / 0.5 == i\ni64 / 1 ** i64\ni64 / 1 / i32\ni64 / 1 / i64\ni64 / 1 < i\ni64 / 1 == f32\ni64 / ceil(i)\ni64 / f32\ni64 / f32 - i\ni64 / f32 / i64\ni64 / f32 > i\ni64 / f32 ^ 1\ni64 / f32 ^ i\ni64 / f64\ni64 / f64 * i64\ni64 / f64 - min(i64)\ni64 / f64 / f32\ni64 / f64 / i * 0.5\ni64 / f64 / i32\ni64 / f64 in array\ni64 / float(1)\ni64 / get(array, i32)\ni64 / half(1)\ni64 / i\ni64 / i * i64\ni64 / i - f64\ni64 / i32\ni64 / i32 != f32\ni64 / i32 * f64\ni64 / i32 == f64\ni64 / i32 > 1 + 1\ni64 / i32 >= f32\ni64 / i32 >= f64\ni64 / i32 ^ f32\ni64 / i64\ni64 / i64 + f64\ni64 / i64 < i32\ni64 / i64 <= f32\ni64 / i64 == i32\ni64 / int(1)\ni64 / len(list)\ni64 / max(1)\ni64 / reduce(array, #)\ni64 / reduce(array, 1)\ni64 / round(0.5)\ni64 / round(i)\ni64 / score(1)\ni64 / score(i)\ni64 < -0.5\ni64 < -1\ni64 < -f32\ni64 < -f64\ni64 < -i\ni64 < -i32\ni64 < -i64\ni64 < 0.5 * 0.5\ni64 < 0.5 + i\ni64 < 0.5 - 1\ni64 < 0.5 / 0.5\ni64 < 0.5 / 1\ni64 < 0.5 == ok\ni64 < 0.5 || false ? 1 : nil\ni64 < 1 * i32\ni64 < 1 ** 0.5\ni64 < 1 + 0.5\ni64 < 1 + i64\ni64 < 1 / f32\ni64 < ceil(i64)\ni64 < f32\ni64 < f32 * 0.5\ni64 < f32 - i64\ni64 < f32 ^ f32\ni64 < f64\ni64 < f64 && ok\ni64 < f64 - f64\ni64 < f64 ? score : add\ni64 < float(0.5)\ni64 < float(i32)\ni64 < floor(0.5)\ni64 < floor(i32)\ni64 < half(1)\ni64 < i\ni64 < i % i64\ni64 < i ^ 0.5\ni64 < i || ok\ni64 < i32\ni64 < i32 + 1\ni64 < i32 + i32\ni64 < i32 / f32\ni64 < i32 ? foo : i\ni64 < i64\ni64 < i64 != nil\ni64 < i64 * 1\ni64 < i64 * i64\ni64 < i64 / f32\ni64 < i64 / i\ni64 < i64 ^ 1\ni64 < i64 ^ i\ni64 < int(f64)\ni64 < len(\"bar\")\ni64 < len(\"foo\")\ni64 <= -0.5\ni64 <= -1\ni64 <= -f32\ni64 <= -f64\ni64 <= -i64\ni64 <= 0.5 && ok\ni64 <= 0.5 * 0.5\ni64 <= 0.5 + 1\ni64 <= 0.5 ? i : i32\ni64 <= 1 ** i32\ni64 <= 1 + 1\ni64 <= 1 - 0.5\ni64 <= 1 - 1\ni64 <= 1 / 1\ni64 <= 1 == ok\ni64 <= 1 ? add : div\ni64 <= 1 ? f32 : greet\ni64 <= 1 ? i64 : true\ni64 <= 1 ^ 1\ni64 <= array[i64]\ni64 <= array[i]\ni64 <= bitnot(1)\ni64 <= f32\ni64 <= f32 ** i\ni64 <= f32 ** i64\ni64 <= f32 == ok\ni64 <= f64\ni64 <= f64 + 1\ni64 <= f64 + f32\ni64 <= f64 / 1\ni64 <= f64 ? nil : i32\ni64 <= float(1)\ni64 <= floor(i)\ni64 <= floor(i32)\ni64 <= half(min(0.5, 1, i64))\ni64 <= i\ni64 <= i * 1\ni64 <= i * f32\ni64 <= i ** i32\ni64 <= i ? greet : add\ni64 <= i32\ni64 <= i32 ** i32\ni64 <= i32 ? list : half\ni64 <= i32 ^ -1\ni64 <= i64\ni64 <= i64 * i\ni64 <= len(list)\ni64 <= max(f32)\ni64 <= min(0.5)\ni64 <= min(i32)\ni64 <= reduce(array, i32)\ni64 <= reduce(list, i64)\ni64 <= round(0.5)\ni64 == -1\ni64 == -f32\ni64 == -f64\ni64 == -i\ni64 == -i32\ni64 == 0.5 * 1\ni64 == 0.5 - f64\ni64 == 0.5 == ok\ni64 == 0.5 ? 0.5 : f64\ni64 == 1 ** f64\ni64 == 1 + 0.5\ni64 == 1 / i\ni64 == 1 == ok\ni64 == 1 ? \"foo\" : i\ni64 == array[1]\ni64 == bitnot(i64)\ni64 == ceil(i64)\ni64 == f32\ni64 == f32 != true\ni64 == f32 + i\ni64 == f32 - f32\ni64 == f32 == ok\ni64 == f64\ni64 == f64 * f64\ni64 == f64 ? 1 : nil\ni64 == f64 ^ 0.5\ni64 == f64 ^ f32\ni64 == f64 and not true\ni64 == findIndex(list, f64 <= f64)\ni64 == floor(0.5)\ni64 == get(array, 1)\ni64 == half(1)\ni64 == i\ni64 == i != nil\ni64 == i + i32\ni64 == i ? i64 : foo\ni64 == i32\ni64 == i64\ni64 == i64 * f32\ni64 == i64 / i64\ni64 == i64 ? add : 0.5\ni64 == i64 ? add : greet\ni64 == int(0.5)\ni64 == int(1)\ni64 == int(i)\ni64 == len(\"foo\")\ni64 == nil != nil\ni64 == reduce(array, #)\ni64 == score(1)\ni64 > -0.5\ni64 > -f32\ni64 > -f64\ni64 > 0.5 + f32\ni64 > 0.5 - f64\ni64 > 0.5 - i32\ni64 > 0.5 ? array : 1\ni64 > 0.5 ? f32 : nil\ni64 > 0.5 ? ok : nil\ni64 > 0.5 ? score : foo\ni64 > 0.5 or ok\ni64 > 1 != true\ni64 > 1 ** 1\ni64 > 1 == false\ni64 > 1 ? nil : 1\ni64 > 1 ^ f32\ni64 > 1 ^ i32\ni64 > f32\ni64 > f32 * 0.5\ni64 > f32 + f64\ni64 > f32 / f32\ni64 > f32 ? \"foo\" : greet\ni64 > f32 ? 1 : i32\ni64 > f64\ni64 > f64 * i\ni64 > f64 - 0.5\ni64 > f64 - f32\ni64 > first(array)\ni64 > half(0.5)\ni64 > i\ni64 > i != nil\ni64 > i == true\ni64 > i32\ni64 > i32 ? div : f32\ni64 > i32 ^ f32\ni64 > i64\ni64 > i64 - i\ni64 > i64 - i32\ni64 > i64 / f64\ni64 > i64 == false\ni64 > len(list)\ni64 > max(0.5)\ni64 > min(1)\ni64 > min(i32)\ni64 > reduce(array, #)\ni64 > reduce(array, 1)\ni64 > round(0.5)\ni64 > round(i32)\ni64 > score(i)\ni64 >= -0.5\ni64 >= -1\ni64 >= -i\ni64 >= -i64\ni64 >= 0.5 / i\ni64 >= 0.5 == nil\ni64 >= 0.5 ? 0.5 : f64\ni64 >= 0.5 ^ i\ni64 >= 1 % i64\ni64 >= 1 * f64\ni64 >= 1 * i64\ni64 >= abs(i64)\ni64 >= array[i32]\ni64 >= bitnot(1)\ni64 >= f32\ni64 >= f32 + f32\ni64 >= f32 - f32\ni64 >= f32 ? array : i\ni64 >= f32 ? f32 : i32\ni64 >= f32 ? list : f32\ni64 >= f64\ni64 >= f64 + 0.5\ni64 >= first(array)\ni64 >= float(0.5)\ni64 >= float(f32)\ni64 >= floor(1)\ni64 >= floor(i64)\ni64 >= half(0.5)\ni64 >= half(half(f64))\ni64 >= i\ni64 >= i / 0.5\ni64 >= i ? true : i32\ni64 >= i32\ni64 >= i32 * i\ni64 >= i32 / f32\ni64 >= i32 == false\ni64 >= i32 || f64 == 1\ni64 >= i64\ni64 >= i64 + 1\ni64 >= i64 ? foo : foo\ni64 >= i64 or ok\ni64 >= int(f64)\ni64 >= last(array)\ni64 >= max(i64)\ni64 >= min(1)\ni64 >= min(f64)\ni64 >= round(1)\ni64 >= round(i)\ni64 >= score(1)\ni64 ^ (0.5 * i32)\ni64 ^ (0.5 / i64)\ni64 ^ (1 * f64)\ni64 ^ (1 - i)\ni64 ^ (f32 / 1)\ni64 ^ (i % i)\ni64 ^ (i32 * f64)\ni64 ^ (i32 - f64)\ni64 ^ (i64 + 0.5)\ni64 ^ (i64 + 1)\ni64 ^ (i64 - f32)\ni64 ^ -0.5\ni64 ^ -1\ni64 ^ -f32\ni64 ^ -i64\ni64 ^ 0.5 != i64\ni64 ^ 0.5 ** 0.5\ni64 ^ 0.5 / f32\ni64 ^ 0.5 <= i64\ni64 ^ 0.5 == i\ni64 ^ 0.5 ^ f32\ni64 ^ 0.5 ^ i64\ni64 ^ 1 * i64\ni64 ^ 1 * round(0.5)\ni64 ^ 1 ** f64\ni64 ^ 1 ** i32\ni64 ^ 1 - f32\ni64 ^ 1 < f64\ni64 ^ 1 >= f32\ni64 ^ 1 >= half(1)\ni64 ^ 1 ^ f32\ni64 ^ 1 ^ i32\ni64 ^ abs(1)\ni64 ^ array[i]\ni64 ^ f32\ni64 ^ f32 * i32\ni64 ^ f32 ** f64\ni64 ^ f32 - f64\ni64 ^ f32 / i - i32\ni64 ^ f32 < f32\ni64 ^ f32 <= i64\ni64 ^ f32 ^ 1\ni64 ^ f64\ni64 ^ f64 * i\ni64 ^ f64 ** 1\ni64 ^ f64 > i64\ni64 ^ f64 ^ f32\ni64 ^ float(i32)\ni64 ^ floor(i32)\ni64 ^ floor(i64)\ni64 ^ half(0.5)\ni64 ^ half(1)\ni64 ^ i\ni64 ^ i * i\ni64 ^ i ** i32\ni64 ^ i + i % 1\ni64 ^ i + i64\ni64 ^ i - f32 ^ 1\ni64 ^ i - f64\ni64 ^ i / i\ni64 ^ i < f32\ni64 ^ i ^ i32\ni64 ^ i32\ni64 ^ i32 * i\ni64 ^ i32 + i32\ni64 ^ i32 + i64\ni64 ^ i64\ni64 ^ i64 * i64\ni64 ^ i64 + i\ni64 ^ i64 == i64\ni64 ^ i64 ^ 1\ni64 ^ i64 in array\ni64 ^ int(1)\ni64 ^ max(0.5)\ni64 ^ reduce(array, #)\ni64 ^ round(i64)\ni64 ^ score(1)\ni64 in array\ni64 in array == ok\ni64 in groupBy(array, 0.5)\ni64 in groupBy(array, foo)\ni64 in groupBy(list, \"bar\")\ni64 in groupBy(list, i)\ni64 in i64 .. i32\ni64 in map(array, #)\ni64 in map(list, 1)\ni64 in map(list, i)\ni64 not in 1 .. i\ni64 not in array\ni64 not in array ? f32 : i32\ni64 not in array ? ok : f32\ni64 not in map(array, #)\ni64 not in map(list, 0.5)\nint(-0.5)\nint(-1)\nint(-f32)\nint(-f64)\nint(-i)\nint(-i32)\nint(-i64)\nint(0.5 * 0.5)\nint(0.5 * f32)\nint(0.5 * f64)\nint(0.5 * i32)\nint(0.5 ** 0.5)\nint(0.5 ** 1)\nint(0.5 ** f32)\nint(0.5 ** f64)\nint(0.5 ** i32)\nint(0.5 + 0.5)\nint(0.5 + 1)\nint(0.5 + f64)\nint(0.5 + i32)\nint(0.5 + i64)\nint(0.5 - f32)\nint(0.5 - i)\nint(0.5 - i32)\nint(0.5 - i64)\nint(0.5 / i)\nint(0.5 / i64)\nint(0.5 ^ i)\nint(0.5 ^ i64)\nint(0.5) * -i\nint(0.5) ** f64\nint(0.5) ** i32\nint(0.5) + i\nint(0.5) / i32\nint(0.5) < 0.5 * f64\nint(0.5) <= i\nint(0.5) <= i32\nint(0.5) == f32\nint(0.5) > -i64\nint(0.5) > i\nint(0.5) >= f32\nint(0.5) >= i32\nint(0.5) >= max(0.5)\nint(0.5) ^ i32\nint(1 % i)\nint(1 * f32)\nint(1 * i)\nint(1 * i32)\nint(1 ** i)\nint(1 + 1)\nint(1 + f32)\nint(1 + f64)\nint(1 + i32)\nint(1 - 0.5)\nint(1 - f32)\nint(1 - f64)\nint(1 - i32)\nint(1 - i64)\nint(1 / 0.5)\nint(1 / 1)\nint(1 ^ 0.5)\nint(1 ^ i64)\nint(1) != i64\nint(1) ** f32\nint(1) ** i32\nint(1) + f32\nint(1) + i64\nint(1) + reduce(array, #)\nint(1) - i\nint(1) < f64\nint(1) < i64 * 0.5\nint(1) == i32\nint(1) ^ f64\nint(abs(0.5))\nint(abs(1))\nint(abs(f64))\nint(abs(i))\nint(abs(i32))\nint(abs(i64))\nint(add(1, 1))\nint(array[i64])\nint(bitnot(1))\nint(bitnot(i32))\nint(bitnot(i64))\nint(bitshl(1, i))\nint(bitxor(1, i32) + i)\nint(bitxor(i32, i))\nint(ceil(0.5))\nint(ceil(1))\nint(ceil(f32))\nint(ceil(half(1)))\nint(ceil(i))\nint(ceil(i32))\nint(count(array, ok))\nint(count(list, false))\nint(f32 * 1)\nint(f32 * i)\nint(f32 ** 0.5)\nint(f32 ** i64)\nint(f32 + f32)\nint(f32 - 0.5)\nint(f32 - i64)\nint(f32 / 0.5)\nint(f32 / 1)\nint(f32 / f64)\nint(f32 / i32)\nint(f32 / i64)\nint(f32 ^ f32)\nint(f32 ^ i32)\nint(f32)\nint(f32) != i\nint(f32) != i64\nint(f32) ** f64\nint(f32) + i32\nint(f32) - f32\nint(f32) < i\nint(f32) <= i32\nint(f32) == i ? list : add\nint(f64 * 0.5)\nint(f64 ** 1)\nint(f64 ** i)\nint(f64 ** i32)\nint(f64 + 0.5)\nint(f64 + 1)\nint(f64 + i)\nint(f64 - 0.5)\nint(f64 - f32)\nint(f64 / 0.5)\nint(f64 / i64)\nint(f64 ^ 0.5)\nint(f64 ^ 1)\nint(f64 ^ f64)\nint(f64 ^ i64)\nint(f64)\nint(f64) % i64\nint(f64) * f64\nint(f64) + f64\nint(f64) < i32\nint(f64) == f32\nint(f64) == f64\nint(f64) > i\nint(f64) > i64\nint(false ? 0.5 : 0.5)\nint(false ? i : 0.5)\nint(findIndex(list, ok))\nint(findLastIndex(list, ok))\nint(first(array))\nint(float(0.5))\nint(float(1))\nint(float(f32))\nint(float(f64))\nint(float(i32 ** i))\nint(float(i32))\nint(floor(f64))\nint(floor(i))\nint(floor(i32))\nint(get(array, i64))\nint(half(0.5))\nint(half(1))\nint(half(f64))\nint(i % 1)\nint(i % i32)\nint(i % i64)\nint(i * 0.5)\nint(i * 1)\nint(i * f64)\nint(i ** f32)\nint(i ** f64)\nint(i ** i64)\nint(i + f32)\nint(i + f64)\nint(i + i)\nint(i - 0.5)\nint(i - f32)\nint(i - i32)\nint(i - i64)\nint(i / 0.5)\nint(i / 1)\nint(i / i)\nint(i / i32)\nint(i ^ 0.5)\nint(i ^ 1)\nint(i ^ i32)\nint(i)\nint(i) != i32\nint(i) * f64\nint(i) * i64\nint(i) - i\nint(i) .. i64\nint(i32 * 0.5)\nint(i32 * 1)\nint(i32 * i64)\nint(i32 ** 0.5)\nint(i32 ** 1)\nint(i32 + 0.5)\nint(i32 + 1)\nint(i32 + f64)\nint(i32 + i64)\nint(i32 - 1)\nint(i32 - i)\nint(i32 / 0.5)\nint(i32 / 1)\nint(i32 / f64)\nint(i32 ^ 0.5)\nint(i32 ^ f64)\nint(i32 ^ i32)\nint(i32)\nint(i32) != f32\nint(i32) - i\nint(i32) / f32\nint(i32) / i\nint(i32) / i64\nint(i32) < i64\nint(i32) > half(0.5)\nint(i64 * 1)\nint(i64 ** 0.5)\nint(i64 ** f64)\nint(i64 ** i64)\nint(i64 + i)\nint(i64 + i32)\nint(i64 - 0.5)\nint(i64 - f32)\nint(i64 - i)\nint(i64 - i64)\nint(i64 / 1)\nint(i64 ^ f64)\nint(i64 ^ i32)\nint(i64 ^ i64)\nint(i64)\nint(i64) != i64\nint(i64) - i64\nint(i64) .. i32\nint(i64) / i\nint(i64) <= i\nint(i64) == f32\nint(i64) > i64\nint(i64) ^ i\nint(int(0.5))\nint(int(1))\nint(int(f64))\nint(len(\"bar\"))\nint(len(array))\nint(max(0.5))\nint(max(0.5, i64))\nint(max(1))\nint(max(f32))\nint(max(f64))\nint(max(i))\nint(max(i64))\nint(mean(array))\nint(min(0.5))\nint(min(1))\nint(min(1, i64))\nint(min(f32))\nint(min(i))\nint(min(i32))\nint(min(i64))\nint(ok ? i : div)\nint(ok ? i : i64)\nint(ok ? i64 : list)\nint(reduce(array, #))\nint(reduce(array, f32))\nint(reduce(array, i32))\nint(reduce(list, 0.5))\nint(reduce(list, 1))\nint(reduce(list, i64))\nint(round(0.5))\nint(round(1))\nint(round(f32))\nint(round(f64))\nint(round(i))\nint(score(1))\nint(score(1, i))\nint(score(i))\nint(string(1))\nint(string(i))\nint(string(i32))\nint(string(i64))\nint(sum(array))\nint(toJSON(i))\nint(toJSON(i32))\nint(toJSON(i64))\nint(true ? 1 : foo)\nint(true ? f64 : greet)\njoin(map(array, \"foo\"))\njoin(map(list, \"foo\"))\nkeys(groupBy(array, \"foo\"))\nkeys(groupBy(array, # ** 0.5))\nkeys(groupBy(array, #))\nkeys(groupBy(array, f32 != f64))\nkeys(groupBy(array, foo))\nkeys(groupBy(array, i32))\nkeys(groupBy(array, ok))\nkeys(groupBy(list, \"bar\"))\nkeys(groupBy(list, #))\nkeys(groupBy(list, false))\nkeys(groupBy(list, i32))\nkeys({\"bar\": 1})\nkeys({\"bar\": array, \"foo\": \"bar\"})\nkeys({\"bar\": f32})\nkeys({\"foo\": array, \"bar\": f64})\nkeys({\"foo\": array})\nlast(1 .. 1)\nlast(1 .. i)\nlast([0.5])\nlast([f32, list])\nlast([list, list])\nlast(array)\nlast(array) != int(i64)\nlast(array) + f64\nlast(array) - f32\nlast(array) - i64\nlast(array) .. i32\nlast(array) / f32\nlast(array) <= i32\nlast(array) == f32\nlast(array) > f32 * i64\nlast(array) >= f64\nlast(false ? \"foo\" : true)\nlast(false ? 0.5 : \"bar\")\nlast(false ? 1 : foo)?.div\nlast(false ? div : score)\nlast(false ? f64 : false)\nlast(filter(array, false))\nlast(filter(array, ok))\nlast(filter(list, true))\nlast(groupBy(array, foo).Qux)\nlast(groupBy(array, i32).Qux)\nlast(groupBy(list, #).list)\nlast(groupBy(list, #)?.Qux)\nlast(groupBy(list, #)?.ok)\nlast(i32 .. 1)\nlast(i32 .. i64)\nlast(i64 .. 1)\nlast(list)\nlast(list).Bar\nlast(list).Qux\nlast(list).String\nlast(list).String()\nlast(list)?.Bar\nlast(list)?.Qux\nlast(list)?.String\nlast(list)?.String()\nlast(list[1:i64])\nlast(map(array, #))\nlast(map(array, 1))\nlast(map(array, array))\nlast(map(array, foo))\nlast(map(array, i))\nlast(map(list, \"foo\"))\nlast(map(list, #))\nlast(map(list, 1))\nlast(map(list, false))\nlast(map(list, half))\nlast(map(list, i32))\nlast(map(list, i64))\nlast(map(list, ok))\nlast(ok ? \"bar\" : true)\nlast(ok ? \"foo\" : f64)\nlast(ok ? 0.5 : \"foo\")\nlast(ok ? 0.5 : list)\nlast(ok ? 1 : add)\nlast(ok ? 1 : half)\nlast(ok ? array : array)\nlast(ok ? array : ok)\nlast(ok ? f32 : 0.5)\nlast(ok ? greet : 1)\nlast(ok ? i32 : array)\nlast(ok ? i64 : add)\nlast(ok ? ok : 0.5)\nlast(reduce(array, list))\nlast(reduce(list, array))\nlast(sort(array))\nlast(true ? \"bar\" : half)\nlast(true ? add : list)\nlast(true ? foo : 1)\nlast(true ? greet : true)\nlast(true ? ok : 1)\nlen(\"bar\") ** i64\nlen(\"bar\") + i64 - i64\nlen(\"bar\") / i64\nlen(\"bar\") >= i\nlen(\"bar\") in array\nlen(\"foo\") ** i32\nlen(\"foo\") ** i64\nlen(\"foo\") - i\nlen(\"foo\") - i32\nlen(\"foo\") >= i\nlen(1 .. 1)\nlen([f32])\nlen([foo])\nlen([half])\nlen(array)\nlen(array) != f32\nlen(array) + i64\nlen(array) < f64\nlen(array) <= i32\nlen(array) == f32\nlen(array) >= f64\nlen(array) ^ i32\nlen(array) not in array\nlen(filter(list, false))\nlen(filter(list, ok))\nlen(foo.Bar)\nlen(foo.String())\nlen(foo?.Bar)\nlen(foo?.Qux(\"bar\"))\nlen(foo?.String())\nlen(greet(\"bar\"))\nlen(greet(\"foo\"))\nlen(groupBy(array, #))\nlen(groupBy(array, 0.5))\nlen(groupBy(array, f32))\nlen(groupBy(array, false))\nlen(groupBy(array, i64))\nlen(groupBy(array, true))\nlen(groupBy(list, #))\nlen(groupBy(list, #).ok)\nlen(groupBy(list, 0.5))\nlen(groupBy(list, false))\nlen(groupBy(list, foo).list)\nlen(groupBy(list, i32))\nlen(groupBy(list, i64))\nlen(i64 .. 1)\nlen(i64 .. i)\nlen(list)\nlen(list) % i32\nlen(list) % i64\nlen(list) .. i64\nlen(list) / i32\nlen(list) <= i\nlen(list) > i\nlen(list) ^ f64\nlen(list[1:i])\nlen(lower(\"bar\"))\nlen(lower(\"foo\"))\nlen(map(array, \"bar\"))\nlen(map(array, #))\nlen(map(array, add))\nlen(map(array, f32))\nlen(map(array, greet))\nlen(map(array, i))\nlen(map(array, list)[i64])\nlen(map(array, score))\nlen(map(list, #))\nlen(map(list, 1))\nlen(map(list, f32))\nlen(map(list, f64))\nlen(map(list, foo))\nlen(map(list, i64))\nlen(map(list, ok))\nlen(map(list, true))\nlen(ok ? list : score)\nlen(sort(array))\nlen(string(\"bar\"))\nlen(string(\"foo\"))\nlen(string(0.5))\nlen(string(1))\nlen(string(add))\nlen(string(f64))\nlen(string(foo))\nlen(string(half))\nlen(string(i))\nlen(string(i32))\nlen(string(i64))\nlen(string(list))\nlen(string(nil))\nlen(string(score))\nlen(string(string(list)))\nlen(toJSON(\"bar\"))\nlen(toJSON(\"foo\"))\nlen(toJSON(0.5))\nlen(toJSON(1))\nlen(toJSON(array))\nlen(toJSON(f32))\nlen(toJSON(false))\nlen(toJSON(i))\nlen(toJSON(i32))\nlen(toJSON(list))\nlen(toJSON(nil))\nlen(toJSON(ok))\nlen(toJSON(true))\nlen(trim(\"foo\"))\nlen(trimPrefix(\"foo\"))\nlen(trimSuffix(\"bar\"))\nlen(type(\"foo\"))\nlen(type(0.5))\nlen(type(1))\nlen(type(add))\nlen(type(array))\nlen(type(div))\nlen(type(half))\nlen(type(i))\nlen(type(i32))\nlen(type(i64))\nlen(type(list))\nlen(type(nil))\nlen(type(ok))\nlen(type(score))\nlen(upper(\"bar\"))\nlen(upper(\"foo\"))\nlen({\"bar\": array})\nlen({\"bar\": f64})\nlen({\"bar\": score})\nlen({\"foo\": 1})\nlen({\"foo\": add, \"foo\": \"foo\"})\nlen({\"foo\": i64})\nlist\nlist != 1 .. 1\nlist != [\"foo\"]\nlist != [i, 0.5]\nlist != [i]\nlist != array\nlist != filter(array, ok)\nlist != filter(array, true)\nlist != list\nlist != list ? 0.5 : div\nlist != list ? half : div\nlist != map(array, #)\nlist != map(list, 1)\nlist != map(list, i64)\nlist != nil && i32 <= 1\nlist != nil ? false : 1\nlist != nil ? i : 1\nlist != sort(array)\nlist == [div, nil]\nlist == [i]\nlist == array\nlist == array == nil\nlist == list\nlist == list != false\nlist == list ? i32 : i\nlist == map(list, #)\nlist == nil && ok\nlist == nil ? nil : \"foo\"\nlist == nil or f64 == f64\nlist not in groupBy(list, #).i\nlist[-1]\nlist[-i32]\nlist[-i64]\nlist[-i]\nlist[1 - 1]\nlist[1] not in list\nlist[1].Bar\nlist[1].Qux\nlist[1].String\nlist[1].String()\nlist[1]?.Bar\nlist[1]?.Qux\nlist[1]?.String\nlist[1]?.String()\nlist[bitnot(i)]\nlist[bitshr(i32, i32)]\nlist[findIndex(array, true)]\nlist[first(array)]\nlist[i * i64]\nlist[i32:i32]\nlist[i32:i]\nlist[i32]\nlist[i32] in list\nlist[i32].Bar\nlist[i32].Qux\nlist[i32].String\nlist[i32]?.Bar\nlist[i32]?.Qux\nlist[i32]?.String\nlist[i32]?.String()\nlist[i64:i32 - i]\nlist[i64:i64]\nlist[i64]\nlist[i64] in list\nlist[i64].Bar\nlist[i64].Qux\nlist[i64].String\nlist[i64]?.Bar\nlist[i64]?.Qux\nlist[i64]?.String\nlist[i:i32]\nlist[i:i64]\nlist[i:i64] == nil != nil\nlist[i:i]\nlist[i]\nlist[i].Bar\nlist[i].Qux\nlist[i].String\nlist[i].String()\nlist[i]?.Bar\nlist[i]?.Qux\nlist[i]?.String\nlist[i]?.String()\nlist[int(f32)]\nlist[int(f64)]\nlist[int(i)]\nlist[int(i64)]\nlist[max(i64, 1)]\nlist[min(i)]\nlist[min(i32)]\nlist[ok ? 1 : half]\nlist[score(1)]\nlist[score(i)]\nlower(\"bar\" + \"bar\")\nlower(\"bar\") == trimSuffix(\"bar\")\nlower(\"foo\" + \"bar\")\nlower(false ? foo : \"bar\")\nlower(foo.Bar)\nlower(foo.String())\nlower(foo?.Bar)\nlower(foo?.String())\nlower(greet(\"bar\"))\nlower(greet(\"foo\"))\nlower(lower(\"bar\"))\nlower(lower(\"foo\"))\nlower(reduce(array, \"bar\"))\nlower(reduce(list, \"bar\"))\nlower(string(\"foo\"))\nlower(string(0.5))\nlower(string(add))\nlower(string(f32))\nlower(string(f64))\nlower(string(foo))\nlower(string(greet))\nlower(string(i))\nlower(string(i32))\nlower(string(i64))\nlower(string(list))\nlower(string(nil))\nlower(string(score))\nlower(toBase64(\"foo\"))\nlower(toBase64(string(i)))\nlower(toJSON(\"bar\"))\nlower(toJSON(\"foo\"))\nlower(toJSON(0.5))\nlower(toJSON(1))\nlower(toJSON(f64))\nlower(toJSON(foo))\nlower(toJSON(list))\nlower(toJSON(nil))\nlower(toJSON(ok))\nlower(toJSON(true))\nlower(trim(\"bar\"))\nlower(trim(\"foo\"))\nlower(trimPrefix(\"bar\"))\nlower(trimPrefix(\"foo\"))\nlower(trimSuffix(\"bar\"))\nlower(type(\"bar\"))\nlower(type(\"foo\"))\nlower(type(0.5))\nlower(type(1))\nlower(type(add))\nlower(type(div))\nlower(type(f32))\nlower(type(half))\nlower(type(i))\nlower(type(i32))\nlower(type(i64))\nlower(type(list))\nlower(type(ok))\nlower(type(true))\nlower(upper(\"bar\"))\nlower(upper(\"foo\"))\nmap(1 .. 1, f32)\nmap(1 .. 1, foo)\nmap(1 .. 1, score)\nmap(1 .. i, foo)\nmap(1 .. i32, #)\nmap(1 .. i32, 0.5 / f64)\nmap(1 .. i32, div)\nmap(1 .. i32, reduce(array, #))\nmap(1 .. i64, # ^ #)\nmap(1 .. i64, #)\nmap(1 .. i64, half)\nmap(1 .. i64, i32)\nmap([f64], half)\nmap([false], ok)\nmap([half], #)\nmap([i * i32], score)\nmap([i32, foo, score], #)\nmap([i32], foo)\nmap([i32], greet)\nmap([i32], half)\nmap([list, 1, foo], i32)\nmap([nil], foo)\nmap([score, \"bar\"], f32)\nmap([true, i32, 1], #)\nmap(array, !(# == #))\nmap(array, !(nil in list))\nmap(array, !ok)\nmap(array, \"bar\" in foo)\nmap(array, \"foo\" not endsWith \"bar\")\nmap(array, \"foo\") == array\nmap(array, # != #)\nmap(array, # != 0.5)\nmap(array, # != 1)\nmap(array, # != f64)\nmap(array, # != i32)\nmap(array, # != nil)\nmap(array, # % #)\nmap(array, # % 1)\nmap(array, # % i)\nmap(array, # % i64)\nmap(array, # * #)\nmap(array, # * 0.5)\nmap(array, # * 1)\nmap(array, # * f32)\nmap(array, # * f64)\nmap(array, # * i)\nmap(array, # ** #)\nmap(array, # ** 1)\nmap(array, # ** f32)\nmap(array, # ** i)\nmap(array, # ** i64)\nmap(array, # + #)\nmap(array, # + 0.5)\nmap(array, # + 1)\nmap(array, # + f32)\nmap(array, # + i)\nmap(array, # + i32)\nmap(array, # - #)\nmap(array, # - 0.5)\nmap(array, # - 1)\nmap(array, # - f32)\nmap(array, # - f64)\nmap(array, # - i)\nmap(array, # - i32)\nmap(array, # .. #)\nmap(array, # .. 1)\nmap(array, # / #)\nmap(array, # / 0.5)\nmap(array, # / 1)\nmap(array, # / f32)\nmap(array, # / f64)\nmap(array, # / i)\nmap(array, # / i64)\nmap(array, # < #)\nmap(array, # < 1)\nmap(array, # < f32)\nmap(array, # < i32)\nmap(array, # < i64)\nmap(array, # <= #)\nmap(array, # <= f32)\nmap(array, # <= i)\nmap(array, # <= i32)\nmap(array, # == #)\nmap(array, # == f32)\nmap(array, # == f64)\nmap(array, # == nil)\nmap(array, # > #)\nmap(array, # > 0.5)\nmap(array, # > 1)\nmap(array, # > f32)\nmap(array, # > f64)\nmap(array, # >= #)\nmap(array, # >= 1)\nmap(array, # >= f32)\nmap(array, # >= i32)\nmap(array, # >= i64)\nmap(array, # ^ #)\nmap(array, # ^ 0.5)\nmap(array, # ^ 1)\nmap(array, # ^ i)\nmap(array, # ^ i32)\nmap(array, # not in array)\nmap(array, #)\nmap(array, #) != array\nmap(array, #) != list\nmap(array, #) == array\nmap(array, #) == list\nmap(array, #)[i64]\nmap(array, #)[i]\nmap(array, -#)\nmap(array, --#)\nmap(array, -0.5)\nmap(array, -1)\nmap(array, -f64)\nmap(array, -i)\nmap(array, -i32)\nmap(array, -i64)\nmap(array, 0.5 != #)\nmap(array, 0.5 != 0.5)\nmap(array, 0.5 * #)\nmap(array, 0.5 * f64)\nmap(array, 0.5 ** f32)\nmap(array, 0.5 ** i64)\nmap(array, 0.5 + #)\nmap(array, 0.5 + 1)\nmap(array, 0.5 - #)\nmap(array, 0.5 - 0.5)\nmap(array, 0.5 / i)\nmap(array, 0.5 < #)\nmap(array, 0.5 < i32)\nmap(array, 0.5 > #)\nmap(array, 0.5 > i64)\nmap(array, 0.5 >= #)\nmap(array, 0.5 ^ #)\nmap(array, 0.5)[i]\nmap(array, 1 != #)\nmap(array, 1 != f32)\nmap(array, 1 % #)\nmap(array, 1 ** #)\nmap(array, 1 ** i)\nmap(array, 1 ** i64)\nmap(array, 1 + #)\nmap(array, 1 + f64)\nmap(array, 1 - #)\nmap(array, 1 .. #)\nmap(array, 1 / #)\nmap(array, 1 / i32)\nmap(array, 1 < #)\nmap(array, 1 <= #)\nmap(array, 1 <= 1)\nmap(array, 1 <= f32)\nmap(array, 1 == #)\nmap(array, 1 ^ #)\nmap(array, abs(#))\nmap(array, abs(i64))\nmap(array, add == nil)\nmap(array, add(#, #))\nmap(array, add(#, i))\nmap(array, add)\nmap(array, array)\nmap(array, array)[bitnot(i32)]\nmap(array, array)[i64]\nmap(array, array[#:#])\nmap(array, bitand(#, 1))\nmap(array, bitnand(#, 1))\nmap(array, bitnot(#))\nmap(array, bitnot(1))\nmap(array, bitshl(#, #))\nmap(array, bitshr(#, #))\nmap(array, bitshr(#, i64))\nmap(array, bitushr(1, #))\nmap(array, ceil(#))\nmap(array, ceil(0.5))\nmap(array, ceil(f32))\nmap(array, div(#, #))\nmap(array, div)\nmap(array, f32 * #)\nmap(array, f32 * f64)\nmap(array, f32 ** #)\nmap(array, f32 + #)\nmap(array, f32 / #)\nmap(array, f32 < #)\nmap(array, f32 == #)\nmap(array, f32 > #)\nmap(array, f32 >= #)\nmap(array, f32 >= i)\nmap(array, f32 ^ #)\nmap(array, f32)\nmap(array, f32)[min(i32)]\nmap(array, f64 != #)\nmap(array, f64 != 0.5)\nmap(array, f64 * #)\nmap(array, f64 ** #)\nmap(array, f64 ** 0.5)\nmap(array, f64 / #)\nmap(array, f64 < #)\nmap(array, f64 < f64)\nmap(array, f64 <= #)\nmap(array, f64 == #)\nmap(array, f64 >= #)\nmap(array, f64 >= i32)\nmap(array, f64 ^ #)\nmap(array, f64)\nmap(array, false && false)\nmap(array, false ? # : f64)\nmap(array, false ? greet : i)\nmap(array, false)[i32]\nmap(array, find(array, true))\nmap(array, findIndex(list, ok))\nmap(array, float(# + #))\nmap(array, float(#))\nmap(array, floor(#))\nmap(array, foo == foo)\nmap(array, foo)\nmap(array, foo.Bar)\nmap(array, foo.Qux)\nmap(array, foo.String())\nmap(array, foo.String)\nmap(array, foo?.Bar)\nmap(array, foo?.String)\nmap(array, get(array, #))\nmap(array, greet(\"bar\"))\nmap(array, greet(\"foo\"))\nmap(array, greet)\nmap(array, groupBy(array, #))\nmap(array, groupBy(array, f32))\nmap(array, groupBy(list, #))\nmap(array, groupBy(list, f64))\nmap(array, groupBy(list, i))\nmap(array, half != half)\nmap(array, half != nil)\nmap(array, half(0.5))\nmap(array, half(1))\nmap(array, half(f64))\nmap(array, half(i - 0.5))\nmap(array, half)\nmap(array, i % #)\nmap(array, i + #)\nmap(array, i - i32)\nmap(array, i / 0.5)\nmap(array, i <= #)\nmap(array, i <= f32)\nmap(array, i <= f64)\nmap(array, i == #)\nmap(array, i == f64)\nmap(array, i > i32)\nmap(array, i >= #)\nmap(array, i)\nmap(array, i)[i]\nmap(array, i32 * #)\nmap(array, i32 ** #)\nmap(array, i32 ** f64)\nmap(array, i32 / f32)\nmap(array, i32 < #)\nmap(array, i32 < f64)\nmap(array, i32 == #)\nmap(array, i32 == 1)\nmap(array, i32 > #)\nmap(array, i32 ^ #)\nmap(array, i32 not in array)\nmap(array, i32)\nmap(array, i32) == array\nmap(array, i32) == list\nmap(array, i64 != #)\nmap(array, i64 % #)\nmap(array, i64 * #)\nmap(array, i64 * 0.5)\nmap(array, i64 + 0.5)\nmap(array, i64 - #)\nmap(array, i64 .. #)\nmap(array, i64 < #)\nmap(array, i64 <= #)\nmap(array, i64 <= f64)\nmap(array, i64 <= i64)\nmap(array, i64 > #)\nmap(array, i64)\nmap(array, int(#))\nmap(array, int(0.5))\nmap(array, len(\"foo\"))\nmap(array, list != array)\nmap(array, list)\nmap(array, map(array, f64))\nmap(array, map(list, greet))\nmap(array, max(#))\nmap(array, max(f32, 1))\nmap(array, max(f64))\nmap(array, mean(array))\nmap(array, min(#, #))\nmap(array, nil == #)\nmap(array, nil == ok)\nmap(array, nil not in list)\nmap(array, not ok)\nmap(array, not true)\nmap(array, ok || ok)\nmap(array, ok)\nmap(array, ok)[i64]\nmap(array, reduce(array, \"bar\"))\nmap(array, reduce(array, #))\nmap(array, reduce(list, add))\nmap(array, reduce(list, half))\nmap(array, round(#))\nmap(array, score(#))\nmap(array, score(#, #))\nmap(array, score(1))\nmap(array, score)\nmap(array, string(add))\nmap(array, string(foo))\nmap(array, string(i64))\nmap(array, take(array, #))\nmap(array, toBase64(\"foo\"))\nmap(array, toJSON(#))\nmap(array, toJSON(foo))\nmap(array, toJSON(list))\nmap(array, true != nil)\nmap(array, true ? 0.5 : #)\nmap(array, true ? 0.5 : 1)\nmap(array, true ? f32 : div)\nmap(array, true ? i : true)\nmap(array, type(#))\nmap(array, type(f32))\nmap(array[1:i32], list)\nmap(false ? i32 : list, ok)\nmap(filter(array, false), foo)\nmap(filter(array, ok), 1 * #)\nmap(filter(list, # != #), #)\nmap(filter(list, false), #)\nmap(filter(list, ok), #)\nmap(filter(list, ok), i)\nmap(filter(list, true), i64)\nmap(groupBy(array, #).String, i32)\nmap(groupBy(array, #).greet, foo.Qux(.f32))\nmap(groupBy(array, #).greet, score)\nmap(groupBy(array, #).score, #?.list())\nmap(groupBy(list, i32).i, #)\nmap(i .. 1, -#)\nmap(i .. 1, 0.5 ^ #)\nmap(i .. 1, f32)\nmap(i .. 1, i)\nmap(i .. i, add(#, #))\nmap(i .. i, div)\nmap(i .. i, i32)\nmap(i .. i32, half)\nmap(i .. i64, min(#, #, #))\nmap(i32 .. 1, half)\nmap(i32 .. i, f32)\nmap(i32 .. i32, array)\nmap(i32 .. i64, div)\nmap(i32 .. i64, list)\nmap(i64 .. 1, #)\nmap(i64 .. 1, 1 ^ #)\nmap(i64 .. 1, array)\nmap(i64 .. 1, f32)\nmap(i64 .. 1, f64)\nmap(i64 .. i32, #)\nmap(i64 .. i64, # - #)\nmap(i64 .. i64, #)\nmap(list, !false)\nmap(list, !ok)\nmap(list, \"bar\" not matches \"foo\")\nmap(list, \"bar\") != list\nmap(list, \"bar\")[i64]\nmap(list, \"foo\" not in foo)\nmap(list, \"foo\" not matches #.Bar)\nmap(list, # != #)\nmap(list, # != nil)\nmap(list, # == #)\nmap(list, # in list)\nmap(list, #)\nmap(list, #) != array\nmap(list, #) == list\nmap(list, #)[i64]\nmap(list, #)[i]\nmap(list, #?.Bar)\nmap(list, #?.Qux)\nmap(list, #?.String())\nmap(list, #?.String)\nmap(list, -0.5)\nmap(list, -f32)\nmap(list, -i)\nmap(list, -i32)\nmap(list, .Bar)\nmap(list, .Qux)\nmap(list, .String())\nmap(list, .String)\nmap(list, 0.5 != 0.5)\nmap(list, 0.5 != i64)\nmap(list, 0.5 + i64)\nmap(list, 0.5 - 0.5)\nmap(list, 0.5 <= 0.5)\nmap(list, 0.5 == i32)\nmap(list, 0.5 in array)\nmap(list, 0.5) != array\nmap(list, 0.5) == array\nmap(list, 1 % i)\nmap(list, 1 ** 0.5)\nmap(list, 1 ** f32)\nmap(list, 1 + 1)\nmap(list, 1 / f64)\nmap(list, 1 / i64)\nmap(list, 1 < 0.5)\nmap(list, 1 <= i32)\nmap(list, 1 ^ i32)\nmap(list, [#])\nmap(list, [foo, 0.5, #])\nmap(list, [score])\nmap(list, abs(f32))\nmap(list, add)\nmap(list, array)\nmap(list, ceil(0.5))\nmap(list, count(array, true))\nmap(list, div)\nmap(list, f32 != i32)\nmap(list, f32 ** 1)\nmap(list, f32 + i64)\nmap(list, f32 < f32)\nmap(list, f32 == 0.5)\nmap(list, f32 > i64)\nmap(list, f32 >= i)\nmap(list, f32 >= i32)\nmap(list, f32 ^ i)\nmap(list, f32)\nmap(list, f64 < 0.5)\nmap(list, f64 < f32)\nmap(list, f64 <= 1)\nmap(list, f64 > 1)\nmap(list, f64 >= 0.5)\nmap(list, f64 >= f32)\nmap(list, f64)\nmap(list, f64)[i]\nmap(list, false ? # : list)\nmap(list, false) != array\nmap(list, float(f64))\nmap(list, float(i))\nmap(list, float(i32))\nmap(list, foo == #)\nmap(list, foo)\nmap(list, foo.Qux)\nmap(list, foo.String())\nmap(list, foo?.String)\nmap(list, greet)\nmap(list, groupBy(array, #))\nmap(list, groupBy(array, i))\nmap(list, groupBy(list, #))\nmap(list, half(0.5))\nmap(list, half(f64))\nmap(list, half)\nmap(list, i ** 1)\nmap(list, i + i64)\nmap(list, i .. i)\nmap(list, i < 0.5)\nmap(list, i == 1)\nmap(list, i)\nmap(list, i)[i64]\nmap(list, i32 % i64)\nmap(list, i32 ** 0.5)\nmap(list, i32 + f32)\nmap(list, i32 - i32)\nmap(list, i32 / f64)\nmap(list, i32 < 1)\nmap(list, i32 < i32)\nmap(list, i32 <= 1)\nmap(list, i32 >= 1)\nmap(list, i32)\nmap(list, i64 * i)\nmap(list, i64 + i64)\nmap(list, i64 <= i64)\nmap(list, i64 == nil)\nmap(list, i64)\nmap(list, i64)[i64]\nmap(list, i64)[i]\nmap(list, last(array))\nmap(list, list)\nmap(list, list)[i]\nmap(list, map(array, #))\nmap(list, map(array, 1))\nmap(list, map(array, div))\nmap(list, map(array, i64))\nmap(list, map(list, \"foo\"))\nmap(list, max(f32))\nmap(list, min(0.5))\nmap(list, min(f64))\nmap(list, nil != #)\nmap(list, nil != i64)\nmap(list, nil == #)\nmap(list, nil == ok)\nmap(list, nil not in list)\nmap(list, none(array, true))\nmap(list, not ok)\nmap(list, ok ? # : #)\nmap(list, ok || ok)\nmap(list, ok)\nmap(list, reduce(array, half))\nmap(list, reduce(list, foo))\nmap(list, reduce(list, half))\nmap(list, score(1))\nmap(list, score)\nmap(list, score)[i64]\nmap(list, string(#))\nmap(list, string(1))\nmap(list, string(add))\nmap(list, string(i32))\nmap(list, toJSON(#))\nmap(list, toJSON([#]))\nmap(list, toJSON(false))\nmap(list, toJSON(ok))\nmap(list, true ? i : f32)\nmap(list, true ? i32 : #)\nmap(list, true ? list : div)\nmap(list, true)[i32]\nmap(list, type(\"bar\"))\nmap(list, type(#))\nmap(list, type(i32))\nmap(list, type(true))\nmap(list[i64:i32], greet)\nmap(map(array, #), # - i32)\nmap(map(array, #), # == #)\nmap(map(array, #), # >= #)\nmap(map(array, #), #)\nmap(map(array, #), add)\nmap(map(array, #), bitand(#, #))\nmap(map(array, #), foo)\nmap(map(array, #), greet)\nmap(map(array, #), half)\nmap(map(array, #), i % i64)\nmap(map(array, #), i)\nmap(map(array, #), i32)\nmap(map(array, #), i64)\nmap(map(array, #), list)\nmap(map(array, 0.5), #)\nmap(map(array, 0.5), ok)\nmap(map(array, 1), greet)\nmap(map(array, array), i32 ^ i32)\nmap(map(array, array), i64)\nmap(map(array, array), reduce(#, array))\nmap(map(array, div), i)\nmap(map(array, div), list)\nmap(map(array, f32), #)\nmap(map(array, f32), array)\nmap(map(array, f32), f64)\nmap(map(array, f64), # > #)\nmap(map(array, f64), f64)\nmap(map(array, f64), greet)\nmap(map(array, foo), div)\nmap(map(array, greet), foo)\nmap(map(array, greet), list)\nmap(map(array, half), array)\nmap(map(array, i), #)\nmap(map(array, i32), #)\nmap(map(array, i64), array)\nmap(map(array, i64), f64)\nmap(map(array, list), foo)\nmap(map(array, ok), !#)\nmap(map(array, ok), -f32)\nmap(map(array, true), # != nil)\nmap(map(array, true), i64)\nmap(map(list, #), # != #)\nmap(map(list, #), #)\nmap(map(list, #), #?.Qux)\nmap(map(list, #), .Bar)\nmap(map(list, #), div)\nmap(map(list, #), f32)\nmap(map(list, #), f64)\nmap(map(list, #), greet)\nmap(map(list, #), half)\nmap(map(list, #), list)\nmap(map(list, #), ok)\nmap(map(list, #), score)\nmap(map(list, 0.5), #)\nmap(map(list, 0.5), div)\nmap(map(list, 1), # * #)\nmap(map(list, 1), f32)\nmap(map(list, add), #)\nmap(map(list, add), i)\nmap(map(list, array), f64)\nmap(map(list, array), findIndex(#, ok))\nmap(map(list, f64), f32)\nmap(map(list, f64), i32)\nmap(map(list, false), 0.5 / f64)\nmap(map(list, foo), #)\nmap(map(list, foo), list)\nmap(map(list, greet), \"bar\" <= \"foo\")\nmap(map(list, i64), # >= f64)\nmap(map(list, i64), #)\nmap(map(list, i64), i64)\nmap(map(list, list), #)\nmap(map(list, ok), f64 > i64)\nmap(map(list, ok), foo)\nmap(map(list, true), f64)\nmap(map(list, true), list)\nmap(ok ? \"bar\" : i64, ok)\nmap(ok ? \"bar\" : ok, i64)\nmap(ok ? \"bar\" : score, 1 .. #)\nmap(ok ? array : foo, foo)\nmap(ok ? array : i64, list)\nmap(ok ? list : i64, #)\nmap(ok ? list : list, add)\nmap(reduce(array, array), # <= #)\nmap(reduce(array, array), #)\nmap(reduce(list, array), -i32)\nmap(reduce(list, array), foo)\nmap(reduce(list, array), half)\nmap(reduce(list, list), #)\nmap(sort(array), # / 0.5)\nmap(sort(array), #)\nmap(sort(array), greet)\nmap(split(\"foo\", \"bar\"), #)\nmap(true ? \"foo\" : 0.5, # * #)\nmap(true ? array : \"foo\", f32 + #)\nmap(true ? list : greet, greet)\nmap(true ? list : list, #)\nmax(-0.5)\nmax(-1)\nmax(-f32)\nmax(-f64)\nmax(-findIndex(array, ok))\nmax(-i)\nmax(-i, f32)\nmax(-i32)\nmax(-i64)\nmax(-reduce(array, #))\nmax(0.5 * f32)\nmax(0.5 * i)\nmax(0.5 * i64)\nmax(0.5 ** 0.5)\nmax(0.5 ** 1)\nmax(0.5 ** f32)\nmax(0.5 ** f64 ^ reduce(array, f64))\nmax(0.5 ** i)\nmax(0.5 ** i32)\nmax(0.5 + 1)\nmax(0.5 - 0.5)\nmax(0.5 - f32)\nmax(0.5 - f64)\nmax(0.5 / 0.5)\nmax(0.5 / 1)\nmax(0.5 / f64)\nmax(0.5 / i32)\nmax(0.5 / i64)\nmax(0.5 ^ 0.5)\nmax(0.5 ^ 1)\nmax(0.5 ^ i)\nmax(0.5 ^ i32)\nmax(0.5 ^ i64)\nmax(0.5) != f32\nmax(0.5) != i\nmax(0.5) + f64\nmax(0.5) + i\nmax(0.5) - i32\nmax(0.5) / i64\nmax(0.5) <= i\nmax(0.5) > f64\nmax(0.5) > i\nmax(0.5) > i64\nmax(0.5) >= i64\nmax(0.5, 0.5) != i\nmax(0.5, i) ** i32\nmax(1 % 1)\nmax(1 % i64)\nmax(1 * 0.5)\nmax(1 * 1)\nmax(1 * f64)\nmax(1 * i32)\nmax(1 ** 0.5)\nmax(1 ** 1)\nmax(1 ** f32)\nmax(1 ** i64)\nmax(1 + f32)\nmax(1 + i64)\nmax(1 - f32)\nmax(1 - f64)\nmax(1 / 1)\nmax(1 / f32)\nmax(1 / f32, i64)\nmax(1 / f64)\nmax(1 / i)\nmax(1 / i32)\nmax(1 / i64)\nmax(1 ^ 0.5)\nmax(1 ^ 1)\nmax(1 ^ f32)\nmax(1 ^ f64)\nmax(1 ^ i32)\nmax(1 ^ i64)\nmax(1) != 1 ? foo : \"bar\"\nmax(1) + f32\nmax(1) - f64\nmax(1) .. i\nmax(1) / i\nmax(1) == i64\nmax(1) > f64\nmax(1) > i32\nmax(1, i) not in array\nmax(abs(0.5))\nmax(abs(1))\nmax(abs(f32))\nmax(abs(f64))\nmax(abs(i))\nmax(abs(i32))\nmax(add(1, i))\nmax(array[1])\nmax(array[i64])\nmax(bitnand(i32, 1))\nmax(bitnot(1))\nmax(bitnot(i))\nmax(bitnot(i64))\nmax(bitshr(1, i32))\nmax(bitxor(1, 1))\nmax(ceil(0.5), f64 / i64)\nmax(ceil(f32))\nmax(ceil(i32))\nmax(f32 * 1)\nmax(f32 * f64)\nmax(f32 * i64)\nmax(f32 ** 1)\nmax(f32 ** f64)\nmax(f32 + 1)\nmax(f32 + f64)\nmax(f32 + i)\nmax(f32 + i64)\nmax(f32 - 1)\nmax(f32 - i64)\nmax(f32 / 0.5)\nmax(f32 / f32)\nmax(f32 ^ 1)\nmax(f32 ^ f32)\nmax(f32 ^ f64)\nmax(f32 ^ i64)\nmax(f32)\nmax(f32) * i64\nmax(f32) ** i\nmax(f32) + f32\nmax(f32) + f64\nmax(f32) - f64\nmax(f32) / i32\nmax(f32) < i\nmax(f32) == i\nmax(f32) ^ f32\nmax(f32, f32)\nmax(f32, f64)\nmax(f32, f64) in array\nmax(f32, i)\nmax(f32, i32)\nmax(f32, i32) ** i64\nmax(f32, i64)\nmax(f64 * 1)\nmax(f64 * f64)\nmax(f64 ** 0.5)\nmax(f64 ** f64)\nmax(f64 ** i)\nmax(f64 + 1)\nmax(f64 + f32)\nmax(f64 + f64)\nmax(f64 - 0.5)\nmax(f64 - i)\nmax(f64 ^ 0.5)\nmax(f64 ^ 1)\nmax(f64 ^ f32)\nmax(f64 ^ f64)\nmax(f64)\nmax(f64) != f64\nmax(f64) < i32\nmax(f64) <= f32\nmax(f64) == f32\nmax(f64) == i\nmax(f64) == round(i)\nmax(f64) ^ f32\nmax(f64) ^ i64\nmax(f64, f32)\nmax(f64, f32) <= int(f64)\nmax(f64, f64)\nmax(f64, i)\nmax(f64, i) - 1 ^ i\nmax(f64, i) < i\nmax(f64, i) > f64\nmax(f64, i32)\nmax(f64, i64)\nmax(f64, i64) ^ f32\nmax(false ? 0.5 : array)\nmax(false ? add : f64)\nmax(false ? div : half)\nmax(false ? div : i64)\nmax(false ? ok : 0.5)\nmax(find(array, false))\nmax(findIndex(list, false))\nmax(findIndex(list, ok))\nmax(findLast(array, false))\nmax(float(0.5))\nmax(float(1))\nmax(float(1), i)\nmax(float(i32))\nmax(float(i64))\nmax(float(score(i)))\nmax(floor(0.5))\nmax(floor(1))\nmax(floor(f32))\nmax(floor(i))\nmax(floor(i32))\nmax(floor(len(array)))\nmax(get(array, 1))\nmax(get(array, i))\nmax(get(array, i32))\nmax(get(array, i64))\nmax(half(0.5))\nmax(half(1))\nmax(half(1), i64)\nmax(half(f64))\nmax(i % 1)\nmax(i * 0.5)\nmax(i * f32)\nmax(i * i)\nmax(i * i64)\nmax(i ** f64)\nmax(i ** score(1))\nmax(i + 1)\nmax(i - 1)\nmax(i - i)\nmax(i - i64)\nmax(i ^ f64)\nmax(i)\nmax(i) != i32\nmax(i) != i64\nmax(i) % (i64 + i)\nmax(i) % array[i32]\nmax(i) ** (1 / i32)\nmax(i) + f64\nmax(i) - i\nmax(i) / f32\nmax(i) / i\nmax(i) < 0.5 - f64\nmax(i) < f32\nmax(i) < i32\nmax(i) <= f64\nmax(i) == f64\nmax(i) >= i\nmax(i, f32)\nmax(i, f64)\nmax(i, i)\nmax(i, i32)\nmax(i, i64)\nmax(i, i64, i32)\nmax(i32 % 1)\nmax(i32 * 0.5)\nmax(i32 * 1)\nmax(i32 * f32)\nmax(i32 * i)\nmax(i32 * i64)\nmax(i32 ** f32)\nmax(i32 ** i)\nmax(i32 ** i32)\nmax(i32 + 0.5)\nmax(i32 + i64)\nmax(i32 - 0.5)\nmax(i32 - 1)\nmax(i32 - f64)\nmax(i32 - i)\nmax(i32 / 1)\nmax(i32 ^ i)\nmax(i32 ^ i, f32)\nmax(i32)\nmax(i32) * i32\nmax(i32) / f32\nmax(i32) / i\nmax(i32) <= f32\nmax(i32) ^ f32\nmax(i32) in array\nmax(i32, f32)\nmax(i32, f64)\nmax(i32, i)\nmax(i32, i32)\nmax(i32, i64)\nmax(i64 % i)\nmax(i64 * 0.5)\nmax(i64 * i64)\nmax(i64 ** 0.5)\nmax(i64 ** f32)\nmax(i64 ** i64)\nmax(i64 + i)\nmax(i64 + i64)\nmax(i64 - 0.5)\nmax(i64 - 1)\nmax(i64 - f64)\nmax(i64 / f64)\nmax(i64 / i32)\nmax(i64 / i64)\nmax(i64 ^ 0.5)\nmax(i64 ^ 1)\nmax(i64 ^ i)\nmax(i64)\nmax(i64) ** (1 + 1)\nmax(i64) ** f32\nmax(i64) + i32\nmax(i64) - i32\nmax(i64) - i64\nmax(i64) .. i32\nmax(i64) < f32\nmax(i64) >= f32\nmax(i64) ^ i\nmax(i64, 0.5 + 1)\nmax(i64, 0.5, i64) ** i32\nmax(i64, f32)\nmax(i64, f64)\nmax(i64, half(1))\nmax(i64, i)\nmax(i64, i) + i32\nmax(i64, i32)\nmax(i64, i32) == f64\nmax(i64, i64)\nmax(int(0.5))\nmax(int(f32))\nmax(int(i32))\nmax(int(i64))\nmax(len(\"foo\"))\nmax(len(array))\nmax(len(list))\nmax(max(0.5))\nmax(max(0.5, f64))\nmax(max(1))\nmax(max(i))\nmax(max(i32))\nmax(max(i64))\nmax(mean(array))\nmax(median(array))\nmax(min(0.5, 0.5))\nmax(min(1))\nmax(min(1, f64))\nmax(min(f32, i64, i32))\nmax(min(i))\nmax(min(i32))\nmax(ok ? \"foo\" : f64)\nmax(ok ? 0.5 : i64)\nmax(ok ? 1 : i)\nmax(ok ? array : true)\nmax(ok ? foo : greet)\nmax(ok ? half : f32)\nmax(ok ? half : list)\nmax(ok ? i : 1)\nmax(ok ? i : nil)\nmax(reduce(array, # % #))\nmax(reduce(array, #))\nmax(reduce(array, 1))\nmax(reduce(array, f32))\nmax(reduce(array, f64))\nmax(reduce(list, 0.5))\nmax(reduce(list, f32), i64)\nmax(reduce(list, i64))\nmax(round(1))\nmax(round(f32))\nmax(round(f64))\nmax(round(i))\nmax(round(i32))\nmax(score(1))\nmax(score(i), i)\nmax(true ? f32 : f32)\nmax(true ? foo : array)\nmax(true ? greet : 1)\nmax({\"bar\": list}.String)\nmax({\"foo\": array}?.f32)\nmax({\"foo\": half}?.f32)\nmean(1 .. 1)\nmean(1 .. i)\nmean([f64, 0.5])\nmean([i])\nmean(array)\nmean(array) * i\nmean(array) + i\nmean(array) - min(i)\nmean(array) / i\nmean(array) / i64\nmean(array) < f32\nmean(array) < f64\nmean(array) <= i64\nmean(array) > f32\nmean(array) >= f32\nmean(array) >= i64\nmean(array) ^ i\nmean(array) ^ i32\nmean(filter(array, true))\nmean(groupBy(array, i64).score)\nmean(i .. 1)\nmean(i .. i)\nmean(map(array, #))\nmean(map(array, -#))\nmean(map(array, f32))\nmean(map(array, i))\nmean(map(array, i32))\nmean(map(list, 1))\nmean(map(list, f32))\nmean(map(list, i))\nmean(map(list, i32))\nmean(sort(array))\nmedian(1 .. i)\nmedian(array)\nmedian(array) != f32\nmedian(array) * 1 * f32\nmedian(array) * i32\nmedian(array) ** i64\nmedian(array) + f32\nmedian(array) >= i32\nmedian(array) ^ i32\nmedian(array) ^ i64\nmedian(array) not in array\nmedian(array[1:1])\nmedian(filter(array, ok))\nmedian(groupBy(list, #).i32)\nmedian(i .. i)\nmedian(i .. i64)\nmedian(i64 .. i64)\nmedian(map(array, #))\nmedian(map(array, 1))\nmedian(map(list, 0.5))\nmedian(map(list, f32))\nmedian(map(list, i32))\nmedian(reduce(array, array))\nmedian(reduce(list, array))\nmedian(sort(array))\nmin(-0.5)\nmin(-0.5, i)\nmin(-1)\nmin(-f32)\nmin(-f64)\nmin(-half(0.5))\nmin(-i)\nmin(-i32)\nmin(-i64)\nmin(0.5 * 0.5)\nmin(0.5 * 1)\nmin(0.5 * f32, i32 ** i32)\nmin(0.5 * f64)\nmin(0.5 * i32)\nmin(0.5 * i64)\nmin(0.5 ** i)\nmin(0.5 ** i64)\nmin(0.5 + f64)\nmin(0.5 + i)\nmin(0.5 + i32)\nmin(0.5 - 0.5)\nmin(0.5 - 1)\nmin(0.5 - f32)\nmin(0.5 - f64)\nmin(0.5 - i)\nmin(0.5 / 0.5)\nmin(0.5 / i64)\nmin(0.5 / i64, i64)\nmin(0.5 ^ 0.5)\nmin(0.5 ^ f32)\nmin(0.5 ^ i)\nmin(0.5 ^ i32)\nmin(0.5) != i64\nmin(0.5) * i32\nmin(0.5) ** f64\nmin(0.5) ** i\nmin(0.5) + f64 ^ i64\nmin(0.5) - f32\nmin(0.5) - f64\nmin(0.5) / i32\nmin(0.5) < i32\nmin(0.5) == f32 / f32\nmin(0.5) == i\nmin(0.5) >= i64\nmin(0.5) ^ (f32 - i64)\nmin(0.5, 0.5) < f32 + f64\nmin(1 % 1)\nmin(1 % i)\nmin(1 % i32)\nmin(1 % i64)\nmin(1 * 0.5)\nmin(1 * 1)\nmin(1 * f32)\nmin(1 * i)\nmin(1 * i32)\nmin(1 ** i)\nmin(1 + 0.5)\nmin(1 + 1)\nmin(1 + f32)\nmin(1 + i64)\nmin(1 - 1)\nmin(1 - f64)\nmin(1 - i)\nmin(1 - i32)\nmin(1 - i64)\nmin(1 / 0.5)\nmin(1 / f32)\nmin(1 / i)\nmin(1 / i32)\nmin(1 / i64)\nmin(1 ^ 0.5)\nmin(1 ^ 1)\nmin(1 ^ f32)\nmin(1 ^ i)\nmin(1 ^ i32)\nmin(1 ^ i64)\nmin(1) != i\nmin(1) - i\nmin(1) .. i32\nmin(1) <= f32\nmin(1) <= f64\nmin(1) > i64\nmin(1) >= i\nmin(1) >= i64\nmin(1) ^ f64\nmin(abs(0.5))\nmin(abs(1))\nmin(abs(f32))\nmin(abs(f64))\nmin(abs(i))\nmin(abs(i32))\nmin(array[1])\nmin(array[i32])\nmin(array[i])\nmin(bitnand(1, i32))\nmin(bitnot(1))\nmin(bitnot(i))\nmin(bitnot(i32))\nmin(bitnot(i32), i64)\nmin(bitnot(i64))\nmin(ceil(0.5))\nmin(ceil(1))\nmin(ceil(f32))\nmin(ceil(f64))\nmin(ceil(i))\nmin(count(array, false))\nmin(count(list, ok))\nmin(f32 * 1)\nmin(f32 * i64)\nmin(f32 ** 0.5)\nmin(f32 - 0.5)\nmin(f32 - 1)\nmin(f32 - f64)\nmin(f32 - i)\nmin(f32 - i64)\nmin(f32 / 1)\nmin(f32 / i64)\nmin(f32 ^ i32)\nmin(f32)\nmin(f32) * i64\nmin(f32) / f64\nmin(f32) / i32\nmin(f32) == i\nmin(f32) >= f64\nmin(f32, -0.5)\nmin(f32, ceil(1))\nmin(f32, f32)\nmin(f32, f64)\nmin(f32, i)\nmin(f32, i32)\nmin(f32, i64)\nmin(f64 * 1)\nmin(f64 * f64)\nmin(f64 ** f32)\nmin(f64 ** f64)\nmin(f64 + 0.5)\nmin(f64 + f32)\nmin(f64 + i64)\nmin(f64 - 1)\nmin(f64 - i)\nmin(f64 - i32)\nmin(f64 / 0.5)\nmin(f64 / f32)\nmin(f64 / i)\nmin(f64 / i64)\nmin(f64 ^ 1)\nmin(f64)\nmin(f64) * f64\nmin(f64) * i32\nmin(f64) / i\nmin(f64) >= f64\nmin(f64, 0.5 ** i64)\nmin(f64, 0.5) == f64\nmin(f64, f32)\nmin(f64, f64)\nmin(f64, i)\nmin(f64, i32)\nmin(f64, i64)\nmin(false ? foo : i32)\nmin(false ? greet : f32)\nmin(find(array, false))\nmin(find(array, ok))\nmin(findIndex(array, false))\nmin(findLastIndex(array, i32 > #))\nmin(findLastIndex(array, ok))\nmin(findLastIndex(array, true))\nmin(findLastIndex(list, ok))\nmin(first(array))\nmin(float(0.5))\nmin(float(1))\nmin(float(f32))\nmin(float(f64))\nmin(float(i))\nmin(float(i64), i)\nmin(floor(0.5))\nmin(floor(1))\nmin(floor(f32))\nmin(floor(i))\nmin(floor(i32))\nmin(floor(i64))\nmin(half(0.5))\nmin(half(1))\nmin(half(1), -1)\nmin(half(f64 - 0.5))\nmin(half(f64))\nmin(i % 1)\nmin(i % i64)\nmin(i * i)\nmin(i ** 0.5)\nmin(i ** i)\nmin(i + 1)\nmin(i - 0.5)\nmin(i - f64)\nmin(i - i32)\nmin(i / 1) + f64\nmin(i / f64)\nmin(i ^ f32)\nmin(i ^ f64)\nmin(i ^ i)\nmin(i)\nmin(i) * f32\nmin(i) ** i64\nmin(i) / f64\nmin(i) / i\nmin(i) < f64\nmin(i) < i32\nmin(i) >= i32\nmin(i) ^ f32\nmin(i, f32)\nmin(i, f32, i) + i32\nmin(i, f64)\nmin(i, i)\nmin(i, i32)\nmin(i, i64)\nmin(i, last(array))\nmin(i32 % 1)\nmin(i32 * f32)\nmin(i32 * i)\nmin(i32 ** 0.5)\nmin(i32 ** i32)\nmin(i32 + i32)\nmin(i32 + i64)\nmin(i32 - 0.5)\nmin(i32 - i64)\nmin(i32 / 0.5)\nmin(i32 / f64)\nmin(i32 ^ 0.5)\nmin(i32 ^ f32)\nmin(i32 ^ f64)\nmin(i32 ^ i64)\nmin(i32)\nmin(i32) - i\nmin(i32) .. i32\nmin(i32) / i\nmin(i32) < i\nmin(i32) <= f32\nmin(i32) <= i\nmin(i32) > f32\nmin(i32) > i64 + f64\nmin(i32) >= i\nmin(i32) ^ f32\nmin(i32) ^ i64\nmin(i32, f32)\nmin(i32, f64 * 0.5)\nmin(i32, f64)\nmin(i32, i)\nmin(i32, i32)\nmin(i32, i64)\nmin(i64 % 1)\nmin(i64 * 0.5)\nmin(i64 * 1)\nmin(i64 * bitnot(i64))\nmin(i64 * i)\nmin(i64 * i32)\nmin(i64 * i64)\nmin(i64 ** 0.5)\nmin(i64 ** f64)\nmin(i64 ** i)\nmin(i64 ** i32)\nmin(i64 + f32)\nmin(i64 - f64)\nmin(i64 - i32)\nmin(i64 / 1)\nmin(i64 / f32)\nmin(i64 / i)\nmin(i64 / i32)\nmin(i64 / i64)\nmin(i64 ^ 0.5)\nmin(i64 ^ 1)\nmin(i64 ^ f64)\nmin(i64 ^ i32)\nmin(i64)\nmin(i64) / f32\nmin(i64) < i32\nmin(i64) >= f64\nmin(i64) not in array\nmin(i64, f32)\nmin(i64, f64)\nmin(i64, i)\nmin(i64, i32)\nmin(i64, i64)\nmin(i64, i64) < i64\nmin(int(0.5))\nmin(int(1))\nmin(int(f32))\nmin(int(f64))\nmin(int(i))\nmin(int(i32))\nmin(int(i64))\nmin(last(1 .. 1))\nmin(last(array))\nmin(len(array))\nmin(len(list))\nmin(max(0.5))\nmin(max(1, 0.5))\nmin(max(f32))\nmin(max(f64))\nmin(max(i))\nmin(max(i64, 1))\nmin(mean(array))\nmin(min(1))\nmin(min(1, 1, 1))\nmin(min(1, i, f32))\nmin(min(i))\nmin(min(i32))\nmin(min(reduce(list, f32)))\nmin(ok ? array : false)\nmin(ok ? f64 : i)\nmin(ok ? half : ok)\nmin(ok ? i : f32)\nmin(ok ? array : score)\nmin(ok ? true : div)\nmin(reduce(array, #))\nmin(reduce(array, 0.5))\nmin(reduce(array, 1))\nmin(reduce(list, 1))\nmin(round(0.5))\nmin(round(1))\nmin(round(f32))\nmin(round(i32))\nmin(round(i64))\nmin(score(1))\nmin(score(i))\nmin(sum(array))\nmin(true ? i : \"foo\")\nmin(true ? i : i32)\nmin(true ? i64 : \"foo\")\nnil != array != nil ? add : half\nnil != array && ok\nnil != div == reduce(array, ok)\nnil != f64 || ok || false\nnil != false && ok\nnil != false or i == nil\nnil != foo and ok\nnil != foo.Bar\nnil != foo.Qux\nnil != foo.String\nnil != foo.String()\nnil != foo?.Bar\nnil != foo?.Qux\nnil != foo?.String\nnil != foo?.String()\nnil != nil ? score : div\nnil != true || i < 1\nnil == \"foo\" != ok\nnil == \"foo\" && 0.5 < f64\nnil == 0.5 and reduce(list, true)\nnil == add && 0.5 >= 0.5\nnil == add || f32 >= i64\nnil == array and ok\nnil == array or ok\nnil == array[i64]\nnil == div ? f64 : ok\nnil == false && nil != true\nnil == false ? i64 : toBase64(\"bar\")\nnil == foo.Bar\nnil == foo.Qux\nnil == foo.String\nnil == foo.String()\nnil == foo?.Bar\nnil == foo?.Qux\nnil == foo?.String\nnil == greet ? i : greet(\"bar\")\nnil == list || f32 == i\nnil == list[i32]\nnil == nil and ok\nnil in array || score == nil\nnil in list != not false\nnone(1 .. i, # < #)\nnone(1 .. i32, # <= #)\nnone([foo, list, 1 >= i], ok)\nnone([greet], ok)\nnone([true], #)\nnone(array, !(i32 != i32))\nnone(array, !false)\nnone(array, !true)\nnone(array, \"bar\" endsWith \"foo\")\nnone(array, # != #)\nnone(array, # != 0.5)\nnone(array, # != 1)\nnone(array, # != f32)\nnone(array, # != f64)\nnone(array, # != i)\nnone(array, # < #)\nnone(array, # < 0.5)\nnone(array, # < f32)\nnone(array, # < i32)\nnone(array, # < i64)\nnone(array, # <= #)\nnone(array, # <= 0.5)\nnone(array, # <= 1)\nnone(array, # <= f32)\nnone(array, # <= i)\nnone(array, # <= i32)\nnone(array, # <= i64)\nnone(array, # == #)\nnone(array, # == 0.5)\nnone(array, # == f32)\nnone(array, # == i32)\nnone(array, # == i64)\nnone(array, # == nil)\nnone(array, # > #)\nnone(array, # > 0.5)\nnone(array, # > i)\nnone(array, # >= #)\nnone(array, # >= 0.5)\nnone(array, # >= 1)\nnone(array, # >= f32)\nnone(array, # >= f64)\nnone(array, # >= i32)\nnone(array, # >= i64)\nnone(array, # in array)\nnone(array, 0.5 != #)\nnone(array, 0.5 != 1)\nnone(array, 0.5 < #)\nnone(array, 0.5 < i64)\nnone(array, 0.5 <= #)\nnone(array, 0.5 <= 1)\nnone(array, 0.5 <= f64)\nnone(array, 0.5 == #)\nnone(array, 0.5 > 0.5)\nnone(array, 0.5 > 1)\nnone(array, 0.5 > f32)\nnone(array, 0.5 >= #)\nnone(array, 0.5 >= 1)\nnone(array, 1 < #)\nnone(array, 1 <= #)\nnone(array, 1 == 1)\nnone(array, 1 > #)\nnone(array, any(array, true))\nnone(array, f32 != #)\nnone(array, f32 < 0.5)\nnone(array, f32 < 1)\nnone(array, f32 == 1)\nnone(array, f32 > #)\nnone(array, f32 >= #)\nnone(array, f32 >= 1)\nnone(array, f32 >= f32)\nnone(array, f64 != 1)\nnone(array, f64 == #)\nnone(array, f64 > #)\nnone(array, f64 >= #)\nnone(array, i != #)\nnone(array, i < #)\nnone(array, i < f64)\nnone(array, i <= #)\nnone(array, i > #)\nnone(array, i >= #)\nnone(array, i >= 0.5)\nnone(array, i >= i32)\nnone(array, i32 != #)\nnone(array, i32 != i)\nnone(array, i32 != nil)\nnone(array, i32 < #)\nnone(array, i32 > #)\nnone(array, i64 != #)\nnone(array, i64 != 0.5)\nnone(array, i64 > i64)\nnone(array, i64 >= #)\nnone(array, nil != \"bar\")\nnone(array, nil != #)\nnone(array, nil != false)\nnone(array, nil != greet)\nnone(array, nil == #)\nnone(array, nil == 1)\nnone(array, nil == f32)\nnone(array, nil == greet)\nnone(array, nil == half)\nnone(array, not (# == #))\nnone(array, not (# >= 1))\nnone(array, not false)\nnone(array, ok)\nnone(array, reduce(array, true))\nnone(filter(array, # >= f64), ok)\nnone(groupBy(array, #).f64, # or #.Bar)\nnone(groupBy(list, #).div, ok)\nnone(groupBy(list, #).greet, #)\nnone(groupBy(list, 0.5).i, ok)\nnone(i .. i, ok)\nnone(i .. i32, # <= #)\nnone(list, !false)\nnone(list, !ok)\nnone(list, \"bar\" contains \"bar\")\nnone(list, # != #)\nnone(list, # != foo)\nnone(list, # != nil)\nnone(list, # == #)\nnone(list, # == foo)\nnone(list, # in list)\nnone(list, # not in list)\nnone(list, (0.5 not in array) || ok)\nnone(list, 0.5 != i32)\nnone(list, 0.5 > f64)\nnone(list, 0.5 > i)\nnone(list, 1 != i64)\nnone(list, 1 != nil)\nnone(list, 1 == f32)\nnone(list, 1 > 0.5)\nnone(list, all(array, ok))\nnone(list, f32 != 1 ** f64)\nnone(list, f32 >= 0.5)\nnone(list, f32 in array)\nnone(list, f32 not in array)\nnone(list, f64 <= i32)\nnone(list, f64 >= 1)\nnone(list, false) ? ok : half\nnone(list, false) || ok\nnone(list, foo != #)\nnone(list, foo == foo)\nnone(list, i != i)\nnone(list, i != i64)\nnone(list, i >= f32)\nnone(list, i32 == f32)\nnone(list, i32 > 1)\nnone(list, i32 > i64)\nnone(list, i32 not in array)\nnone(list, i64 != 0.5)\nnone(list, i64 > i64)\nnone(list, nil != #)\nnone(list, nil != greet)\nnone(list, nil != i64)\nnone(list, nil == #)\nnone(list, nil == list)\nnone(list, not false)\nnone(list, ok)\nnone(list, one(array, true))\nnone(list, true && ok)\nnone(list, true) and ok\nnone(map(array, #), ok)\nnone(map(array, div), # != #)\nnone(map(array, f64 == #), ok)\nnone(map(list, \"bar\"), # endsWith #)\nnone(map(list, #), nil == list)\nnone(map(list, #), ok)\nnone(map(list, 1), i > #)\nnone(map(list, ok), # ? true : #)\nnone(map(list, ok), #)\nnone(map(list, score), ok)\nnone(sort(filter(array, false)), #?.div > greet(#))\nnot !(0.5 != i64)\nnot !(i < 1)\nnot !(i >= 0.5)\nnot !(i32 != i32)\nnot !(nil != false)\nnot !false\nnot !not false\nnot !ok\nnot !true\nnot (\"bar\" != \"bar\")\nnot (\"bar\" != \"foo\")\nnot (\"bar\" != nil)\nnot (\"bar\" < \"bar\")\nnot (\"bar\" < \"foo\")\nnot (\"bar\" <= \"bar\")\nnot (\"bar\" <= \"foo\")\nnot (\"bar\" == \"bar\")\nnot (\"bar\" == \"foo\")\nnot (\"bar\" == nil)\nnot (\"bar\" > \"bar\")\nnot (\"bar\" > \"foo\")\nnot (\"bar\" >= \"bar\")\nnot (\"bar\" >= \"foo\")\nnot (\"bar\" contains \"bar\")\nnot (\"bar\" contains \"foo\")\nnot (\"bar\" endsWith \"bar\")\nnot (\"bar\" endsWith \"foo\")\nnot (\"bar\" in foo)\nnot (\"bar\" matches \"bar\")\nnot (\"bar\" matches \"foo\")\nnot (\"bar\" not contains \"bar\")\nnot (\"bar\" not contains \"foo\")\nnot (\"bar\" not endsWith \"bar\")\nnot (\"bar\" not endsWith \"foo\")\nnot (\"bar\" not in foo)\nnot (\"bar\" not matches \"bar\")\nnot (\"bar\" not matches \"foo\")\nnot (\"bar\" not startsWith \"bar\")\nnot (\"bar\" not startsWith \"foo\")\nnot (\"bar\" startsWith \"bar\")\nnot (\"bar\" startsWith \"foo\")\nnot (\"foo\" != \"bar\")\nnot (\"foo\" != \"foo\")\nnot (\"foo\" != nil)\nnot (\"foo\" < \"bar\")\nnot (\"foo\" < \"foo\")\nnot (\"foo\" <= \"bar\")\nnot (\"foo\" <= \"foo\")\nnot (\"foo\" == \"bar\")\nnot (\"foo\" == \"foo\")\nnot (\"foo\" == nil)\nnot (\"foo\" > \"bar\")\nnot (\"foo\" > \"foo\")\nnot (\"foo\" >= \"bar\")\nnot (\"foo\" >= \"foo\")\nnot (\"foo\" contains \"bar\")\nnot (\"foo\" contains \"foo\")\nnot (\"foo\" endsWith \"bar\")\nnot (\"foo\" endsWith \"foo\")\nnot (\"foo\" in foo)\nnot (\"foo\" matches \"bar\")\nnot (\"foo\" matches \"foo\")\nnot (\"foo\" not contains \"bar\")\nnot (\"foo\" not contains \"foo\")\nnot (\"foo\" not endsWith \"bar\")\nnot (\"foo\" not endsWith \"foo\")\nnot (\"foo\" not in foo)\nnot (\"foo\" not matches \"foo\")\nnot (\"foo\" not startsWith \"foo\")\nnot (\"foo\" startsWith \"bar\")\nnot (\"foo\" startsWith \"foo\")\nnot (0.5 != 0.5)\nnot (0.5 != 1)\nnot (0.5 != f32)\nnot (0.5 != f64)\nnot (0.5 != i)\nnot (0.5 != i32)\nnot (0.5 != i64)\nnot (0.5 != nil)\nnot (0.5 < 0.5)\nnot (0.5 < 1)\nnot (0.5 < f32)\nnot (0.5 < f64)\nnot (0.5 < i)\nnot (0.5 < i32)\nnot (0.5 < i64)\nnot (0.5 <= 0.5)\nnot (0.5 <= 1)\nnot (0.5 <= f32)\nnot (0.5 <= f64)\nnot (0.5 <= i)\nnot (0.5 <= i32)\nnot (0.5 <= i64)\nnot (0.5 == 0.5)\nnot (0.5 == 1)\nnot (0.5 == f32)\nnot (0.5 == f64)\nnot (0.5 == i && i32 != i32)\nnot (0.5 == i)\nnot (0.5 == i32)\nnot (0.5 == i64)\nnot (0.5 == nil)\nnot (0.5 > 0.5)\nnot (0.5 > 1)\nnot (0.5 > f32)\nnot (0.5 > f64)\nnot (0.5 > i)\nnot (0.5 > i32)\nnot (0.5 > i64)\nnot (0.5 >= 0.5)\nnot (0.5 >= 1)\nnot (0.5 >= f32)\nnot (0.5 >= f64)\nnot (0.5 >= i)\nnot (0.5 >= i32)\nnot (0.5 >= i64)\nnot (0.5 in array)\nnot (0.5 not in array)\nnot (1 != 0.5)\nnot (1 != 1)\nnot (1 != f32)\nnot (1 != f64)\nnot (1 != i)\nnot (1 != i32)\nnot (1 != i64)\nnot (1 != nil)\nnot (1 < 0.5)\nnot (1 < 1)\nnot (1 < f32)\nnot (1 < f64)\nnot (1 < i)\nnot (1 < i32)\nnot (1 < i64)\nnot (1 <= 0.5)\nnot (1 <= 1)\nnot (1 <= f32)\nnot (1 <= f64)\nnot (1 <= i)\nnot (1 <= i32)\nnot (1 <= i64)\nnot (1 == 0.5)\nnot (1 == 1)\nnot (1 == f32)\nnot (1 == f64)\nnot (1 == i)\nnot (1 == i32)\nnot (1 == i64)\nnot (1 == nil)\nnot (1 > 0.5)\nnot (1 > 1)\nnot (1 > f32)\nnot (1 > f64)\nnot (1 > i)\nnot (1 > i32)\nnot (1 > i64)\nnot (1 >= 0.5)\nnot (1 >= 1)\nnot (1 >= f32)\nnot (1 >= f64)\nnot (1 >= i)\nnot (1 >= i32)\nnot (1 >= i64)\nnot (1 in array)\nnot (1 not in array)\nnot (add != add)\nnot (add != nil)\nnot (add == div)\nnot (add == nil)\nnot (array != array)\nnot (array != list)\nnot (array != nil)\nnot (array == array)\nnot (array == list)\nnot (array == nil)\nnot (array[i32] > i64)\nnot (div != add)\nnot (div != div)\nnot (div != nil)\nnot (div == add)\nnot (div == div)\nnot (div == nil)\nnot (f32 != 0.5)\nnot (f32 != 1)\nnot (f32 != f32)\nnot (f32 != f64)\nnot (f32 != i)\nnot (f32 != i32)\nnot (f32 != i64)\nnot (f32 != nil)\nnot (f32 < 0.5)\nnot (f32 < 1)\nnot (f32 < f32)\nnot (f32 < f64)\nnot (f32 < i)\nnot (f32 < i32)\nnot (f32 < i64)\nnot (f32 <= 0.5)\nnot (f32 <= 1)\nnot (f32 <= f64)\nnot (f32 <= i)\nnot (f32 <= i32)\nnot (f32 <= i64)\nnot (f32 == 0.5)\nnot (f32 == 1)\nnot (f32 == f32)\nnot (f32 == f64)\nnot (f32 == i)\nnot (f32 == i32)\nnot (f32 == i64)\nnot (f32 == nil)\nnot (f32 > 0.5)\nnot (f32 > 1)\nnot (f32 > f32)\nnot (f32 > f64)\nnot (f32 > i)\nnot (f32 > i32)\nnot (f32 > i64)\nnot (f32 >= 0.5)\nnot (f32 >= 1)\nnot (f32 >= f32)\nnot (f32 >= f64)\nnot (f32 >= i)\nnot (f32 >= i32)\nnot (f32 >= i64)\nnot (f32 in array)\nnot (f32 not in array)\nnot (f64 != 0.5)\nnot (f64 != 1)\nnot (f64 != f32)\nnot (f64 != f64)\nnot (f64 != i)\nnot (f64 != i32)\nnot (f64 != i64)\nnot (f64 != nil)\nnot (f64 < 0.5)\nnot (f64 < 1)\nnot (f64 < f32)\nnot (f64 < f64)\nnot (f64 < i32)\nnot (f64 < i64)\nnot (f64 <= -0.5)\nnot (f64 <= 0.5)\nnot (f64 <= 1)\nnot (f64 <= f32)\nnot (f64 <= f64)\nnot (f64 <= i)\nnot (f64 <= i32)\nnot (f64 <= i64)\nnot (f64 == 0.5)\nnot (f64 == 1)\nnot (f64 == f64)\nnot (f64 == i)\nnot (f64 == i32)\nnot (f64 == i64)\nnot (f64 == nil)\nnot (f64 > 0.5)\nnot (f64 > 1)\nnot (f64 > f32)\nnot (f64 > f64)\nnot (f64 > i)\nnot (f64 > i32)\nnot (f64 > i64)\nnot (f64 >= 0.5)\nnot (f64 >= 1)\nnot (f64 >= f32)\nnot (f64 >= f64)\nnot (f64 >= i)\nnot (f64 >= i32)\nnot (f64 >= i64)\nnot (f64 in array)\nnot (f64 not in array)\nnot (false != false)\nnot (false != nil)\nnot (false != ok)\nnot (false != true)\nnot (false && false)\nnot (false && ok)\nnot (false == nil)\nnot (false == ok)\nnot (false and false)\nnot (false and ok)\nnot (false and true)\nnot (false or false)\nnot (false or ok)\nnot (false or true)\nnot (false || false)\nnot (false || ok)\nnot (false || true)\nnot (findIndex(list, ok) != i ^ f64)\nnot (foo != foo)\nnot (foo != nil)\nnot (foo == foo)\nnot (foo == nil)\nnot (foo in list)\nnot (foo not in list)\nnot (greet != greet)\nnot (greet != nil)\nnot (greet == greet)\nnot (greet == nil)\nnot (half != half)\nnot (half != nil)\nnot (half == half)\nnot (half == nil)\nnot (i != 0.5)\nnot (i != 1)\nnot (i != f32)\nnot (i != f64)\nnot (i != i)\nnot (i != i32)\nnot (i != i64)\nnot (i != nil)\nnot (i < 0.5)\nnot (i < 1)\nnot (i < f32)\nnot (i < f64)\nnot (i < i)\nnot (i < i32)\nnot (i < i64)\nnot (i <= 0.5)\nnot (i <= 1)\nnot (i <= f32)\nnot (i <= f64)\nnot (i <= i)\nnot (i <= i32)\nnot (i <= i64)\nnot (i == 0.5)\nnot (i == 1)\nnot (i == ceil(f64))\nnot (i == f32)\nnot (i == f64)\nnot (i == i)\nnot (i == i32)\nnot (i == i64)\nnot (i == nil)\nnot (i > 0.5)\nnot (i > 1)\nnot (i > f32)\nnot (i > f64)\nnot (i > i)\nnot (i > i32)\nnot (i > i64)\nnot (i >= 0.5)\nnot (i >= 1)\nnot (i >= f32)\nnot (i >= f64)\nnot (i >= i)\nnot (i >= i32)\nnot (i >= i64)\nnot (i in array)\nnot (i not in array)\nnot (i32 != 0.5)\nnot (i32 != 1)\nnot (i32 != f32)\nnot (i32 != f64)\nnot (i32 != i)\nnot (i32 != i32)\nnot (i32 != i64)\nnot (i32 != nil)\nnot (i32 < 0.5)\nnot (i32 < 1)\nnot (i32 < f32 ** 0.5)\nnot (i32 < f32)\nnot (i32 < f64)\nnot (i32 < i)\nnot (i32 < i32)\nnot (i32 < i64)\nnot (i32 <= 0.5)\nnot (i32 <= 1)\nnot (i32 <= f32)\nnot (i32 <= f64)\nnot (i32 <= i)\nnot (i32 <= i32)\nnot (i32 <= i64)\nnot (i32 == -i)\nnot (i32 == 0.5)\nnot (i32 == 1)\nnot (i32 == f32)\nnot (i32 == f64)\nnot (i32 == i)\nnot (i32 == i32)\nnot (i32 == i64)\nnot (i32 == nil)\nnot (i32 > 0.5)\nnot (i32 > 1)\nnot (i32 > f32)\nnot (i32 > f64)\nnot (i32 > i)\nnot (i32 > i32)\nnot (i32 > i64)\nnot (i32 >= 0.5)\nnot (i32 >= 1)\nnot (i32 >= f32)\nnot (i32 >= f64)\nnot (i32 >= i)\nnot (i32 >= i32)\nnot (i32 >= i64)\nnot (i32 in array)\nnot (i32 not in array)\nnot (i64 != 0.5)\nnot (i64 != 1)\nnot (i64 != f32)\nnot (i64 != f64)\nnot (i64 != i)\nnot (i64 != i32)\nnot (i64 != i64)\nnot (i64 != nil)\nnot (i64 < 0.5)\nnot (i64 < 1)\nnot (i64 < f32)\nnot (i64 < f64)\nnot (i64 < i)\nnot (i64 < i32)\nnot (i64 < i64)\nnot (i64 <= 0.5)\nnot (i64 <= 1)\nnot (i64 <= f32)\nnot (i64 <= f64)\nnot (i64 <= i)\nnot (i64 <= i32)\nnot (i64 <= i64)\nnot (i64 == 0.5)\nnot (i64 == 1)\nnot (i64 == f32)\nnot (i64 == f64)\nnot (i64 == i)\nnot (i64 == i32)\nnot (i64 == i64)\nnot (i64 == nil)\nnot (i64 > 0.5)\nnot (i64 > 1)\nnot (i64 > f32)\nnot (i64 > f64)\nnot (i64 > i)\nnot (i64 > i32)\nnot (i64 > i64)\nnot (i64 >= 0.5)\nnot (i64 >= 1)\nnot (i64 >= f32)\nnot (i64 >= f64)\nnot (i64 >= i)\nnot (i64 >= i32)\nnot (i64 >= i64)\nnot (i64 not in array)\nnot (list != array)\nnot (list != list)\nnot (list != nil)\nnot (list == array)\nnot (list == list)\nnot (list == nil)\nnot (nil != \"bar\")\nnot (nil != \"foo\")\nnot (nil != 0.5)\nnot (nil != 1)\nnot (nil != add)\nnot (nil != array)\nnot (nil != div)\nnot (nil != f32)\nnot (nil != f64)\nnot (nil != false)\nnot (nil != foo)\nnot (nil != half)\nnot (nil != i)\nnot (nil != i32)\nnot (nil != i64)\nnot (nil != list)\nnot (nil != nil)\nnot (nil != ok)\nnot (nil != score)\nnot (nil != true)\nnot (nil == \"bar\")\nnot (nil == \"foo\")\nnot (nil == 0.5)\nnot (nil == 1)\nnot (nil == add)\nnot (nil == array)\nnot (nil == div)\nnot (nil == f32)\nnot (nil == f64)\nnot (nil == false)\nnot (nil == foo)\nnot (nil == greet)\nnot (nil == half)\nnot (nil == i)\nnot (nil == i32)\nnot (nil == i64)\nnot (nil == list)\nnot (nil == nil)\nnot (nil == ok)\nnot (nil == score)\nnot (nil == true)\nnot (nil in array)\nnot (nil in list)\nnot (nil not in array)\nnot (nil not in list)\nnot (ok != nil)\nnot (ok != ok)\nnot (ok != true)\nnot (ok && false)\nnot (ok && ok)\nnot (ok && true)\nnot (ok == false)\nnot (ok == nil)\nnot (ok == ok)\nnot (ok == true)\nnot (ok and false)\nnot (ok and ok)\nnot (ok and true)\nnot (ok or false)\nnot (ok or ok)\nnot (ok or true)\nnot (ok || ok)\nnot (ok || true)\nnot (score != nil)\nnot (score != score)\nnot (score == nil)\nnot (score == score)\nnot (true != false)\nnot (true != nil)\nnot (true != ok)\nnot (true != true)\nnot (true && false)\nnot (true && true)\nnot (true == false)\nnot (true == nil)\nnot (true == ok)\nnot (true == true)\nnot (true and false)\nnot (true and ok)\nnot (true and true)\nnot (true or false)\nnot (true or ok)\nnot (true or true)\nnot (true || false)\nnot (true || ok)\nnot (true || true)\nnot all(array, false)\nnot all(array, ok)\nnot all(array, true)\nnot all(list, nil == #)\nnot all(list, ok)\nnot all(list, true)\nnot any(array, false)\nnot any(array, ok)\nnot any(array, true)\nnot any(list, false)\nnot any(list, ok)\nnot any(list, true)\nnot false && nil == f64\nnot false && ok\nnot false == ok\nnot false ? \"foo\" : \"foo\"\nnot false ? 0.5 : \"foo\"\nnot false ? 0.5 : array\nnot false ? 0.5 : div\nnot false ? 0.5 : foo\nnot false ? 0.5 : i64\nnot false ? 0.5 : nil\nnot false ? 1 : 0.5\nnot false ? add : array\nnot false ? array : 0.5\nnot false ? array : 1\nnot false ? array : f64\nnot false ? array : i\nnot false ? array : true\nnot false ? div : 0.5\nnot false ? div : f64\nnot false ? f32 : 0.5\nnot false ? f32 : 1\nnot false ? f32 : i\nnot false ? f32 : nil\nnot false ? f32 : score\nnot false ? f64 : \"foo\"\nnot false ? f64 : f64\nnot false ? false : half\nnot false ? false : list\nnot false ? foo : f64\nnot false ? greet : 1\nnot false ? i : \"bar\"\nnot false ? i : 1\nnot false ? i : array\nnot false ? i : i\nnot false ? i32 : greet\nnot false ? i64 : list\nnot false ? list : i\nnot false ? list : true\nnot false ? nil : f32\nnot false ? nil : half\nnot false ? nil : ok\nnot false ? ok : 1\nnot false ? score : ok\nnot false ? true : f64\nnot false ? true : nil\nnot false or false == false\nnot false or ok\nnot false || ok\nnot none(array, # > f32)\nnot none(array, false)\nnot none(array, ok)\nnot none(array, true)\nnot none(list, false)\nnot none(list, ok)\nnot none(list, true)\nnot not (f64 <= 1)\nnot not (i32 < i64)\nnot not (i64 >= f64)\nnot not (nil != greet)\nnot not (ok or ok)\nnot not false\nnot not ok\nnot not true\nnot ok\nnot ok != ok\nnot ok && 1 > 0.5\nnot ok && ok\nnot ok ? \"bar\" : list\nnot ok ? \"foo\" : 0.5\nnot ok ? \"foo\" : 1\nnot ok ? 0.5 : \"bar\"\nnot ok ? 0.5 : 0.5\nnot ok ? 0.5 : i\nnot ok ? 1 : f64\nnot ok ? 1 : nil\nnot ok ? add : array\nnot ok ? add : groupBy(array, #)\nnot ok ? array : 1\nnot ok ? array : f32\nnot ok ? div : f64\nnot ok ? f32 : f32\nnot ok ? f64 : f64\nnot ok ? f64 : half\nnot ok ? foo : foo\nnot ok ? greet : 0.5\nnot ok ? half : half\nnot ok ? i : 1\nnot ok ? i : add\nnot ok ? i32 : 1\nnot ok ? i32 : i\nnot ok ? i64 : f32\nnot ok ? i64 : f64\nnot ok ? nil : \"bar\"\nnot ok ? nil : 0.5\nnot ok ? nil : foo\nnot ok ? nil : greet\nnot ok ? nil : i\nnot ok ? ok : false\nnot ok ? ok : list\nnot ok ? score : \"foo\"\nnot ok ? score : score\nnot ok ? true : 1\nnot ok ? true : div\nnot ok ? true : half\nnot ok ? true : i64\nnot ok ? true : nil\nnot ok and \"foo\" == \"foo\"\nnot ok and i32 > 0.5\nnot ok and ok\nnot ok or 1 != i\nnot ok or ok\nnot ok || array == list\nnot ok || ok\nnot one(array, false)\nnot one(array, ok)\nnot one(array, true)\nnot one(list, false)\nnot one(list, ok)\nnot one(list, true)\nnot reduce(array, false)\nnot reduce(array, ok)\nnot reduce(array, true)\nnot reduce(list, false)\nnot reduce(list, ok)\nnot reduce(list, true)\nnot true != ok\nnot true && ok\nnot true == ok\nnot true ? \"bar\" : array\nnot true ? \"bar\" : i32\nnot true ? \"foo\" : f32\nnot true ? \"foo\" : f64\nnot true ? 0.5 : foo\nnot true ? 0.5 : greet\nnot true ? 0.5 : i\nnot true ? 0.5 : i64\nnot true ? 1 : f32\nnot true ? add : i32\nnot true ? add : ok\nnot true ? array : nil\nnot true ? f32 : 0.5\nnot true ? f32 : div\nnot true ? f64 : 1\nnot true ? f64 : array\nnot true ? foo : greet\nnot true ? foo : ok\nnot true ? greet : 1\nnot true ? greet : i64\nnot true ? greet : list\nnot true ? greet : true\nnot true ? half : half\nnot true ? i : f64\nnot true ? i64 : \"foo\"\nnot true ? i64 : array\nnot true ? i64 : i64\nnot true ? list : \"bar\"\nnot true ? list : f64\nnot true ? list : foo\nnot true ? nil : div\nnot true ? ok : nil\nnot true ? score : f32\nnot true ? score : score\nnot true ? true : 1\nnot true and ok ? i : half\nnot true || ok\nok\nok != !ok\nok != (0.5 not in array)\nok != false != ok\nok != false ? f32 : list\nok != nil == nil\nok != nil ? f32 : greet\nok != nil ? nil : array\nok != not ok\nok != ok\nok != ok ? false : \"bar\"\nok && !false\nok && !ok\nok && \"foo\" matches \"bar\"\nok && (\"bar\" not endsWith \"bar\")\nok && (false || ok)\nok && (ok or false)\nok && (true || true)\nok && 0.5 < 1\nok && 0.5 < f64\nok && 0.5 <= 1\nok && 0.5 == nil\nok && 0.5 > i64\nok && 1 != 0.5\nok && 1 != i32\nok && 1 <= 1\nok && 1 <= f64\nok && 1 == 0.5\nok && 1 == nil\nok && 1 >= f64\nok && f32 != i\nok && f32 >= i64\nok && f64 <= 0.5\nok && false != ok\nok && false ? i : list\nok && false ? ok : ok\nok && i < 0.5\nok && i < i64\nok && i == 0.5\nok && i > f64\nok && i32 > 0.5\nok && i32 >= i64\nok && i64 != i\nok && i64 == 0.5\nok && nil != 0.5\nok && nil != 1\nok && nil == ok\nok && not false\nok && not true\nok && ok\nok && ok ? nil : div\nok && ok and false\nok && true != false\nok && true && 1 >= i64\nok == !false\nok == !true\nok == (\"bar\" not endsWith \"foo\")\nok == (0.5 not in array)\nok == (false and ok)\nok == (i32 not in array)\nok == (nil not in list)\nok == false ? f64 : 1\nok == false ? score : 1\nok == nil ? i64 : add\nok == nil ? nil : f64\nok == none(array, true)\nok == not false\nok == ok\nok == ok != false\nok == true && ok\nok ? \"bar\" : f64 <= f32\nok ? \"foo\" : foo.Bar\nok ? -0.5 : add\nok ? -f64 : list\nok ? -i32 : i\nok ? 0.5 / 0.5 : f64\nok ? 0.5 : i32 >= i64\nok ? 0.5 > 1 : 0.5 * i64\nok ? 1 + i : i32\nok ? 1 / i64 : greet\nok ? 1 : foo.Bar\nok ? 1 : foo?.Qux\nok ? abs(i64) : i64\nok ? add : abs(f32)\nok ? add : add\nok ? add : array\nok ? add : f64\nok ? add : foo\nok ? add : foo?.String\nok ? add : greet\nok ? add : half\nok ? add : i\nok ? add : i64\nok ? add : list\nok ? add : ok\nok ? array : array\nok ? array : f32\nok ? array : f64 + f64\nok ? array : foo\nok ? array : foo.String\nok ? array : foo?.String\nok ? array : greet\nok ? array : i\nok ? array : i32\nok ? array : list\nok ? array : ok\nok ? array : score\nok ? div : add\nok ? div : array\nok ? div : div\nok ? div : f64\nok ? div : foo\nok ? div : foo.Bar\nok ? div : greet\nok ? div : half\nok ? div : i32 > reduce(array, #)\nok ? div : nil == true\nok ? div : ok\nok ? div : score\nok ? f32 != i32 : f32\nok ? f32 ** i64 : score\nok ? f32 : -0.5\nok ? f32 : add\nok ? f32 : array\nok ? f32 : div\nok ? f32 : f32\nok ? f32 : f64\nok ? f32 : foo\nok ? f32 : half\nok ? f32 : i32\nok ? f32 : i64\nok ? f32 : ok\nok ? f32 : score\nok ? f64 : add\nok ? f64 : array\nok ? f64 : div\nok ? f64 : f64 - f64\nok ? f64 : false != true\nok ? f64 : foo\nok ? f64 : foo.String\nok ? f64 : greet\nok ? f64 : i32\nok ? f64 : i32 % i32\nok ? f64 : i32 >= -i64\nok ? f64 : ok\nok ? f64 : score\nok ? false : foo.Bar\nok ? foo : div\nok ? foo : f32\nok ? foo : foo\nok ? foo : greet\nok ? foo : half\nok ? foo : i32\nok ? foo : i32 > i32\nok ? foo : i64\nok ? foo : list\nok ? foo : ok\nok ? foo : score\nok ? foo.Qux : ok\nok ? greet : 0.5 > i\nok ? greet : 1 <= 0.5\nok ? greet : add\nok ? greet : div\nok ? greet : f32\nok ? greet : f64\nok ? greet : foo\nok ? greet : half\nok ? greet : i64\nok ? greet : list\nok ? greet : map(list, i)\nok ? greet : ok\nok ? greet : score\nok ? half : add\nok ? half : f32\nok ? half : f64\nok ? half : foo\nok ? half : foo?.Qux\nok ? half : greet\nok ? half : half\nok ? half : list\nok ? half : nil in list\nok ? half : ok\nok ? half : reduce(list, \"bar\")\nok ? half : string(array)\nok ? half(1) : add\nok ? i : 1 / i64\nok ? i : add\nok ? i : array\nok ? i : f32 <= 0.5\nok ? i : foo\nok ? i : half\nok ? i : i\nok ? i : i32\nok ? i : i64\nok ? i : list\nok ? i : ok\nok ? i : score\nok ? i32 : 1 - f64\nok ? i32 : add\nok ? i32 : div\nok ? i32 : f32\nok ? i32 : f32 + 0.5\nok ? i32 : f64\nok ? i32 : foo\nok ? i32 : foo.Qux\nok ? i32 : greet\nok ? i32 : i\nok ? i32 : i32\nok ? i32 : i32 + i32\nok ? i32 : list\nok ? i32 : ok\nok ? i32 : score\nok ? i64 : (ok ? list : half)\nok ? i64 : div\nok ? i64 : f32\nok ? i64 : foo\nok ? i64 : foo.String\nok ? i64 : half\nok ? i64 : i\nok ? i64 : i32\nok ? i64 : i64\nok ? i64 : list\nok ? i64 : ok\nok ? i64 ^ f32 : foo\nok ? list : 0.5 * f64\nok ? list : add\nok ? list : array\nok ? list : div\nok ? list : div(i64, 1)\nok ? list : f32\nok ? list : foo.String\nok ? list : greet\nok ? list : half\nok ? list : i\nok ? list : i - f32\nok ? list : i64\nok ? list : list\nok ? list : list != array\nok ? list : not ok\nok ? list : score\nok ? map(list, #) : add\nok ? nil : 0.5 <= f64\nok ? nil : foo.Qux\nok ? nil : foo?.Bar\nok ? not false : i32\nok ? ok : 0.5 ** i32\nok ? ok : add\nok ? ok : array\nok ? ok : div\nok ? ok : f32\nok ? ok : f64 ** int(f64)\nok ? ok : foo\nok ? ok : foo.String\nok ? ok : greet\nok ? ok : half\nok ? ok : i32\nok ? ok : i64\nok ? ok : list\nok ? ok : ok\nok ? reduce(array, false) : score\nok ? reduce(list, #) : list\nok ? score : 1 == i32\nok ? score : div\nok ? score : f32\nok ? score : f64\nok ? score : greet\nok ? score : half\nok ? score : i\nok ? score : i32\nok ? score : min(i64)\nok ? score : score\nok ? score : true == nil\nok ? toJSON(i64) : div\nok and !ok\nok and \"bar\" < \"foo\"\nok and (\"foo\" not contains \"bar\")\nok and 1 < i64\nok and 1 == 1\nok and 1 == i64\nok and add == nil\nok and f32 != 1\nok and f32 >= 1\nok and greet == greet\nok and i == 0.5\nok and i32 < f32\nok and i32 <= i64\nok and i32 > i32\nok and i64 < i32\nok and i64 <= i64\nok and i64 > 1\nok and i64 >= i\nok and i64 in array\nok and list != nil\nok and nil == array\nok and nil == nil\nok and nil in array\nok and nil in list\nok and nil not in array\nok and not ok\nok and not true\nok and ok\nok and ok && ok\nok and true ? f64 : add\nok and true ? greet : i\nok in groupBy(array, \"bar\")\nok in groupBy(list, #)\nok in groupBy(list, i32)\nok in {\"bar\": true}?.greet\nok not in groupBy(array, # != i32)\nok not in groupBy(array, 0.5)\nok not in groupBy(array, f64)\nok not in groupBy(list, #)?.f64\nok not in groupBy(list, f64)?.Bar\nok or !ok\nok or !true\nok or \"bar\" endsWith \"foo\"\nok or 0.5 != f32\nok or 0.5 != nil\nok or 0.5 == i\nok or 1 != f32\nok or 1 <= 1\nok or 1 <= i\nok or div != nil\nok or f32 != f32\nok or f32 == 0.5\nok or f32 == f32\nok or f64 <= 1\nok or false ? ok : 1\nok or false and false\nok or foo != foo\nok or i < 1\nok or i == 0.5\nok or i == f32\nok or i32 < 1\nok or i32 > f64\nok or i64 != i32\nok or i64 > i64\nok or i64 >= 0.5\nok or i64 not in array\nok or nil != \"foo\"\nok or nil != f64\nok or nil != foo\nok or nil != greet\nok or nil != ok\nok or nil == div\nok or not false\nok or not ok\nok or ok\nok or ok == true\nok or true || true\nok or {\"foo\": false}.String\nok || !ok\nok || (nil not in list)\nok || 0.5 < f32\nok || 0.5 > 0.5\nok || 0.5 > 1\nok || 0.5 >= f64\nok || 1 != nil\nok || 1 < i32\nok || 1 == i\nok || f32 >= 1\nok || f64 < 1\nok || f64 == i\nok || f64 > f64\nok || f64 >= i64\nok || false ? half : i64\nok || foo == foo\nok || i == i\nok || i32 < f32\nok || i32 <= 0.5\nok || i32 == i\nok || i32 > 0.5\nok || i32 >= i32\nok || i64 != i32\nok || i64 == 0.5\nok || list == list\nok || nil == 0.5\nok || nil == array\nok || nil == nil\nok || nil not in array\nok || not false\nok || not ok\nok || ok\nok || ok ? f64 : i64\nok || ok ? ok : score\nok || ok or ok\nok || reduce(array, false)\nok || true ? add : ok\none(1 .. i64, ok)\none([div], nil == i32)\none([false], i64 != i32)\none(array, !(# <= 0.5))\none(array, !false)\none(array, !ok)\none(array, !true)\none(array, \"bar\" matches \"bar\")\none(array, # != #)\none(array, # != 0.5)\none(array, # != 1)\none(array, # != f32)\none(array, # != f64)\none(array, # != i)\none(array, # != i32)\none(array, # != nil)\none(array, # / i >= f64)\none(array, # < #)\none(array, # < 0.5)\none(array, # < 1)\none(array, # < f32)\none(array, # < i64)\none(array, # <= #)\none(array, # <= 0.5)\none(array, # <= 1)\none(array, # <= f32)\none(array, # <= f64)\none(array, # <= i32)\none(array, # == #)\none(array, # == 0.5)\none(array, # == 1)\none(array, # == nil)\none(array, # > #)\none(array, # > f32)\none(array, # > f64)\none(array, # > i32)\none(array, # >= #)\none(array, # >= 0.5)\none(array, # >= 1)\none(array, # >= f64)\none(array, 0.5 != #)\none(array, 0.5 != i64)\none(array, 0.5 < #)\none(array, 0.5 < 0.5)\none(array, 0.5 <= #)\none(array, 0.5 == #)\none(array, 0.5 == 0.5)\none(array, 0.5 > #)\none(array, 0.5 > 1)\none(array, 0.5 >= #)\none(array, 1 != #)\none(array, 1 != i64)\none(array, 1 != nil)\none(array, 1 < #)\none(array, 1 < f64)\none(array, 1 <= #)\none(array, 1 > 0.5)\none(array, 1 >= #)\none(array, add == div)\none(array, all(array, true))\none(array, f32 <= #)\none(array, f32 <= 0.5)\none(array, f32 >= #)\none(array, f64 < #)\none(array, f64 == #)\none(array, f64 >= #)\none(array, f64 >= 1)\none(array, f64 >= i32)\none(array, f64 in array)\none(array, false || true)\none(array, i < #)\none(array, i > 0.5)\none(array, i > f64)\none(array, i32 != #)\none(array, i32 < #)\none(array, i32 <= #)\none(array, i32 > #)\none(array, i32 >= #)\none(array, i64 != #)\none(array, i64 < #)\none(array, i64 == #)\none(array, i64 == f32)\none(array, i64 >= #)\none(array, i64 >= f64)\none(array, list != array)\none(array, nil != #)\none(array, nil != i64)\none(array, not ok)\none(array, ok)\none(array, one(list, false))\none(array, true != false)\none(array, true == nil)\none(array, true) ? greet : add\none(array, true) or 1 != nil\none(false ? greet : \"bar\", f64 != #)\none(groupBy(array, f64).array, .i(nil).ok)\none(groupBy(list, ok).foo, .add?.array)\none(i32 .. 1, # == #)\none(i32 .. i32, not ok)\none(i64 .. 1, # >= 1)\none(i64 .. i32, # != #)\none(i64 .. i32, # >= #)\none(list, !(i64 != 1))\none(list, !false)\none(list, !ok)\none(list, \"foo\" < \"bar\")\none(list, \"foo\" not endsWith \"bar\")\none(list, \"foo\" not in #)\none(list, \"foo\" startsWith \"bar\")\none(list, # != #)\none(list, # != foo)\none(list, # == #)\none(list, # in list)\none(list, # not in list)\none(list, 0.5 < 1)\none(list, 0.5 <= 0.5)\none(list, 0.5 == f64)\none(list, 1 > i)\none(list, add != nil)\none(list, all(array, true))\none(list, any(list, true))\none(list, div != nil)\none(list, f32 == nil)\none(list, f32 > i)\none(list, f32 >= 1)\none(list, f64 >= 1)\none(list, false == nil)\none(list, foo != #)\none(list, foo != nil)\none(list, foo == #)\none(list, greet == nil)\none(list, half == nil)\none(list, i <= i64)\none(list, i > f64)\none(list, i > i32)\none(list, i32 != f32)\none(list, i64 == 1)\none(list, nil != #)\none(list, nil != half)\none(list, nil == #)\none(list, nil == f64)\none(list, ok or true)\none(list, ok)\none(list, ok) or 0.5 == nil\none(list, score != nil)\none(list, true == nil)\none(list[i64:i32], i != i)\none(map(array, \"bar\"), not false)\none(map(array, #), # != #)\none(map(array, #), # >= #)\none(map(array, #), i32 == #)\none(map(array, 1), ok)\none(map(array, div), # == #)\none(map(array, f64), # < 0.5)\none(map(array, false), #)\none(map(array, i), ok)\none(map(array, list), ok)\none(map(array, true), #)\none(map(list, ok), #)\none(map(list, score), # != #)\none(ok ? \"foo\" : false, # > #)\none(reduce(array, array), ok)\none(true ? array : 1, # <= #)\nreduce(1 .. 1, #)\nreduce(1 .. 1, f32 >= i)\nreduce(1 .. i64, array)\nreduce(1 .. i64, greet)\nreduce(1 .. i64, half)\nreduce([\"foo\"], f32)\nreduce([0.5], f64)\nreduce([div, \"foo\"], i32)\nreduce([f32, f64], f32)\nreduce([foo], ok)\nreduce([i32], list)\nreduce([i64, half], \"bar\" not startsWith \"foo\")\nreduce([i], # < #)\nreduce([i], ok)\nreduce([list], f64)\nreduce([nil], # in array)\nreduce(array, !false)\nreduce(array, \"foo\" endsWith \"foo\")\nreduce(array, \"foo\") not in foo\nreduce(array, # != #)\nreduce(array, # != 1)\nreduce(array, # != i32)\nreduce(array, # != nil)\nreduce(array, # % #)\nreduce(array, # % i64)\nreduce(array, # * #)\nreduce(array, # * 0.5)\nreduce(array, # * 1)\nreduce(array, # * f32)\nreduce(array, # * i)\nreduce(array, # * i32)\nreduce(array, # * i64)\nreduce(array, # ** #)\nreduce(array, # ** f32)\nreduce(array, # ** i32)\nreduce(array, # + #)\nreduce(array, # + 0.5)\nreduce(array, # + 1)\nreduce(array, # + i)\nreduce(array, # + i64)\nreduce(array, # - #)\nreduce(array, # - 0.5)\nreduce(array, # - 1)\nreduce(array, # - i)\nreduce(array, # - i32)\nreduce(array, # - i64)\nreduce(array, # .. #)\nreduce(array, # .. i32)\nreduce(array, # / #)\nreduce(array, # / 0.5)\nreduce(array, # / 1)\nreduce(array, # / f32)\nreduce(array, # / i32)\nreduce(array, # < #)\nreduce(array, # < 0.5)\nreduce(array, # < 1)\nreduce(array, # < i32)\nreduce(array, # <= #)\nreduce(array, # <= 0.5)\nreduce(array, # <= f32)\nreduce(array, # <= i32)\nreduce(array, # == #)\nreduce(array, # == 0.5)\nreduce(array, # == 1)\nreduce(array, # == f32)\nreduce(array, # == i32)\nreduce(array, # == i64)\nreduce(array, # == nil)\nreduce(array, # > #)\nreduce(array, # > 1)\nreduce(array, # > f64)\nreduce(array, # > i)\nreduce(array, # >= #)\nreduce(array, # >= f32)\nreduce(array, # >= f64)\nreduce(array, # >= i32)\nreduce(array, # >= i64)\nreduce(array, # ^ #)\nreduce(array, # ^ 0.5)\nreduce(array, # ^ f32)\nreduce(array, # ^ f64)\nreduce(array, # ^ i64)\nreduce(array, # in array)\nreduce(array, # not in array)\nreduce(array, #)\nreduce(array, #) != 0.5 == true\nreduce(array, #) != 0.5 ? ok : nil\nreduce(array, #) != f32\nreduce(array, #) != i32\nreduce(array, #) != i64\nreduce(array, #) % i\nreduce(array, #) % i32\nreduce(array, #) % i64\nreduce(array, #) * i\nreduce(array, #) * i32\nreduce(array, #) * len(\"foo\")\nreduce(array, #) ** f64\nreduce(array, #) ** min(1, i32)\nreduce(array, #) + i\nreduce(array, #) + i64\nreduce(array, #) + reduce(array, #)\nreduce(array, #) - f64\nreduce(array, #) - i\nreduce(array, #) - max(f32)\nreduce(array, #) .. i\nreduce(array, #) .. i32\nreduce(array, #) .. i64\nreduce(array, #) / f32\nreduce(array, #) / f64\nreduce(array, #) / i32\nreduce(array, #) / i64\nreduce(array, #) < f32\nreduce(array, #) < f32 / 0.5\nreduce(array, #) < f64\nreduce(array, #) < i\nreduce(array, #) <= -1\nreduce(array, #) <= f32\nreduce(array, #) <= f64\nreduce(array, #) <= f64 * 0.5\nreduce(array, #) <= i\nreduce(array, #) == f64\nreduce(array, #) == i64\nreduce(array, #) > i32\nreduce(array, #) >= f32\nreduce(array, #) >= f64\nreduce(array, #) >= i32\nreduce(array, #) >= i64\nreduce(array, #) ^ f32 ** 0.5\nreduce(array, #) ^ i32\nreduce(array, #) not in array\nreduce(array, #) not in map(array, #)\nreduce(array, (0.5 + #) * f32)\nreduce(array, -#)\nreduce(array, -(# - #))\nreduce(array, -0.5)\nreduce(array, -1)\nreduce(array, -f32)\nreduce(array, -f64)\nreduce(array, -i)\nreduce(array, -i32)\nreduce(array, -i64)\nreduce(array, 0.5 != #)\nreduce(array, 0.5 != 0.5)\nreduce(array, 0.5 * #)\nreduce(array, 0.5 ** #)\nreduce(array, 0.5 ** 1)\nreduce(array, 0.5 + #)\nreduce(array, 0.5 - #)\nreduce(array, 0.5 - i64)\nreduce(array, 0.5 / #)\nreduce(array, 0.5 / f32)\nreduce(array, 0.5 < #)\nreduce(array, 0.5 < 1)\nreduce(array, 0.5 <= #)\nreduce(array, 0.5 <= 1)\nreduce(array, 0.5 == #)\nreduce(array, 0.5 == f64)\nreduce(array, 0.5 == i64)\nreduce(array, 0.5 > #)\nreduce(array, 0.5 > 0.5)\nreduce(array, 0.5 >= 0.5)\nreduce(array, 0.5 >= 1)\nreduce(array, 0.5 ^ #)\nreduce(array, 0.5 ^ 0.5)\nreduce(array, 0.5) * f32\nreduce(array, 0.5) - i\nreduce(array, 0.5) > i64 ? 1 : 0.5\nreduce(array, 1 != #)\nreduce(array, 1 * f64)\nreduce(array, 1 ** #)\nreduce(array, 1 + #)\nreduce(array, 1 - #)\nreduce(array, 1 - 1)\nreduce(array, 1 / i32)\nreduce(array, 1 < #)\nreduce(array, 1 >= #)\nreduce(array, 1 ^ #)\nreduce(array, 1 ^ 0.5)\nreduce(array, 1 ^ i32)\nreduce(array, 1) % i32\nreduce(array, 1) ** f32\nreduce(array, 1) + f64\nreduce(array, 1) / f64\nreduce(array, 1) / i32\nreduce(array, 1) <= i32\nreduce(array, 1) ^ i\nreduce(array, 1) not in array\nreduce(array, [#])\nreduce(array, abs(#))\nreduce(array, abs(f64))\nreduce(array, abs(i64))\nreduce(array, add(#, #))\nreduce(array, add)\nreduce(array, all(list, ok))\nreduce(array, array)\nreduce(array, array)[i32]\nreduce(array, array[#:#])\nreduce(array, array[i64:#])\nreduce(array, bitand(i32, i32))\nreduce(array, bitnot(#))\nreduce(array, bitor(#, #))\nreduce(array, bitshr(#, #))\nreduce(array, bitushr(#, #))\nreduce(array, ceil(#))\nreduce(array, div(#, #))\nreduce(array, div)\nreduce(array, f32 ** #)\nreduce(array, f32 + #)\nreduce(array, f32 / #)\nreduce(array, f32 <= #)\nreduce(array, f32 == #)\nreduce(array, f32 == i)\nreduce(array, f32 >= #)\nreduce(array, f32 >= 0.5)\nreduce(array, f32 ^ #)\nreduce(array, f32 ^ f32)\nreduce(array, f32 ^ i32)\nreduce(array, f32)\nreduce(array, f32) ** (0.5 * f64)\nreduce(array, f32) <= f32\nreduce(array, f32) not in array\nreduce(array, f64 ** #)\nreduce(array, f64 + #)\nreduce(array, f64 + i32)\nreduce(array, f64 - #)\nreduce(array, f64 / 1)\nreduce(array, f64 < #)\nreduce(array, f64 == #)\nreduce(array, f64 ^ 1)\nreduce(array, f64)\nreduce(array, f64) != i32\nreduce(array, f64) * i\nreduce(array, f64) / f64\nreduce(array, f64) <= f32\nreduce(array, f64) <= first(array)\nreduce(array, f64) == i\nreduce(array, f64) >= i\nreduce(array, f64) ^ f64\nreduce(array, false ? f64 : #)\nreduce(array, false ? score : #)\nreduce(array, false) ? i64 : f32\nreduce(array, false) || ok\nreduce(array, findLastIndex(list, false))\nreduce(array, findLastIndex(list, reduce(array, true)))\nreduce(array, float(#))\nreduce(array, floor(i64))\nreduce(array, foo)\nreduce(array, foo).Bar\nreduce(array, foo).Qux\nreduce(array, foo).String\nreduce(array, foo).String()\nreduce(array, foo)?.Bar\nreduce(array, foo)?.Qux\nreduce(array, foo)?.String\nreduce(array, foo)?.String()\nreduce(array, foo.Bar)\nreduce(array, foo.String)\nreduce(array, foo?.String())\nreduce(array, foo?.String)\nreduce(array, get(array, 1))\nreduce(array, get(list, #))\nreduce(array, greet(\"bar\"))\nreduce(array, greet)\nreduce(array, groupBy(array, #))\nreduce(array, groupBy(list, #))\nreduce(array, groupBy(list, #)?.f32)\nreduce(array, half(1))\nreduce(array, half)\nreduce(array, i != #)\nreduce(array, i % #)\nreduce(array, i * #)\nreduce(array, i ** f64)\nreduce(array, i + 0.5)\nreduce(array, i - #)\nreduce(array, i / #)\nreduce(array, i <= #)\nreduce(array, i <= i64)\nreduce(array, i > i32)\nreduce(array, i ^ #)\nreduce(array, i)\nreduce(array, i) % i32\nreduce(array, i) + i32\nreduce(array, i) - f32\nreduce(array, i) == 0.5 ** 1\nreduce(array, i32 != #)\nreduce(array, i32 != i32)\nreduce(array, i32 + 0.5)\nreduce(array, i32 - #)\nreduce(array, i32 .. #)\nreduce(array, i32 < #)\nreduce(array, i32 < 1)\nreduce(array, i32 > #)\nreduce(array, i32 >= #)\nreduce(array, i32)\nreduce(array, i32) * 1 * 0.5\nreduce(array, i64 != #)\nreduce(array, i64 % i)\nreduce(array, i64 % i32)\nreduce(array, i64 * #)\nreduce(array, i64 + i32)\nreduce(array, i64 - #)\nreduce(array, i64 .. #)\nreduce(array, i64 .. 1)\nreduce(array, i64 / f64)\nreduce(array, i64 <= #)\nreduce(array, i64 == 1)\nreduce(array, i64 == nil)\nreduce(array, i64 ^ #)\nreduce(array, i64 ^ f64)\nreduce(array, i64)\nreduce(array, i64) + i\nreduce(array, i64) / f64\nreduce(array, i64) < i\nreduce(array, i64) == f32\nreduce(array, int(f64))\nreduce(array, len(array))\nreduce(array, list)\nreduce(array, list) != map(list, half)\nreduce(array, map(array, div))\nreduce(array, map(array, score))\nreduce(array, map(list, 1))\nreduce(array, max(#, #, #))\nreduce(array, max(0.5))\nreduce(array, min(#))\nreduce(array, min(#, #, 0.5))\nreduce(array, min(0.5))\nreduce(array, min(1, 1))\nreduce(array, nil != \"bar\")\nreduce(array, nil != #)\nreduce(array, nil != 1)\nreduce(array, not ok)\nreduce(array, ok ? \"foo\" : \"bar\")\nreduce(array, ok ? # : array)\nreduce(array, ok ? # : i)\nreduce(array, ok || true)\nreduce(array, ok)\nreduce(array, ok) and ok\nreduce(array, reduce(array, 1))\nreduce(array, reduce(list, 0.5))\nreduce(array, round(0.5))\nreduce(array, score(#))\nreduce(array, score(1, #))\nreduce(array, score)\nreduce(array, string(0.5))\nreduce(array, string(1))\nreduce(array, string(foo))\nreduce(array, string(i32))\nreduce(array, toJSON(i))\nreduce(array, trimPrefix(\"bar\"))\nreduce(array, true && true)\nreduce(array, true ? add : #)\nreduce(array, true) != ok\nreduce(array, true) and ok\nreduce(array, type(#))\nreduce(array, type(1))\nreduce(array, type(add))\nreduce(array, type(greet))\nreduce(array, type(score))\nreduce(array, upper(\"bar\"))\nreduce(false ? 0.5 : \"bar\", # and false)\nreduce(false ? i32 : array, toJSON(#))\nreduce(false ? nil : list, #)\nreduce(filter(array, ok), foo)\nreduce(filter(list, ok), foo.Bar)\nreduce(filter(list, true), i)\nreduce(i .. 1, f64)\nreduce(i .. 1, score)\nreduce(i .. i, #)\nreduce(i .. i, foo)\nreduce(i .. i32, add)\nreduce(i32 .. 1, #)\nreduce(i32 .. 1, foo)\nreduce(i32 .. i, 0.5 - #)\nreduce(i32 .. i32, i64)\nreduce(i32 .. i64, abs(f64))\nreduce(i64 .. 1, -#)\nreduce(i64 .. i, #)\nreduce(i64 .. i, -0.5)\nreduce(i64 .. i, false ? \"bar\" : #)\nreduce(i64 .. i, i)\nreduce(i64 .. i, ok)\nreduce(i64 .. i, round(i32))\nreduce(i64 .. i64, i64)\nreduce(list, !true)\nreduce(list, \"bar\" <= \"bar\")\nreduce(list, \"bar\" in #)\nreduce(list, \"foo\" not in #)\nreduce(list, # != #)\nreduce(list, # != foo)\nreduce(list, # != nil)\nreduce(list, # == #)\nreduce(list, # == foo)\nreduce(list, # == nil)\nreduce(list, # in list)\nreduce(list, # not in list)\nreduce(list, #)\nreduce(list, #) != foo\nreduce(list, #) not in groupBy(array, i)\nreduce(list, #) not in list\nreduce(list, #).Bar\nreduce(list, #).Qux\nreduce(list, #).String\nreduce(list, #).String()\nreduce(list, #)?.Bar\nreduce(list, #)?.Qux\nreduce(list, #)?.String\nreduce(list, #)?.String()\nreduce(list, #?.Bar not in # ? # : #)\nreduce(list, #?.Bar)\nreduce(list, #?.Qux(\"foo\"))\nreduce(list, #?.Qux)\nreduce(list, #?.String())\nreduce(list, #?.String)\nreduce(list, -0.5)\nreduce(list, -f64)\nreduce(list, -i)\nreduce(list, -i32)\nreduce(list, .Bar)\nreduce(list, .Qux)\nreduce(list, .String())\nreduce(list, .String)\nreduce(list, 0.5 != f64)\nreduce(list, 0.5 != nil)\nreduce(list, 0.5 == i64)\nreduce(list, 0.5 >= 0.5)\nreduce(list, 0.5) != i\nreduce(list, 0.5) / i64\nreduce(list, 0.5) < f32\nreduce(list, 0.5) < i\nreduce(list, 0.5) < i32\nreduce(list, 0.5) < i64\nreduce(list, 0.5) <= f32\nreduce(list, 0.5) >= f64\nreduce(list, 0.5) >= i64\nreduce(list, 1 != nil)\nreduce(list, 1 + f64)\nreduce(list, 1 - 0.5)\nreduce(list, 1 / 0.5)\nreduce(list, 1 < f64)\nreduce(list, 1 <= 1)\nreduce(list, 1 == 0.5)\nreduce(list, 1 == nil)\nreduce(list, 1 ^ 1)\nreduce(list, 1) * f64\nreduce(list, 1) + f32\nreduce(list, 1) - i\nreduce(list, add)\nreduce(list, add) != div\nreduce(list, array != array)\nreduce(list, array)\nreduce(list, div)\nreduce(list, f32 / 0.5)\nreduce(list, f32 < i32)\nreduce(list, f32 <= f32)\nreduce(list, f32)\nreduce(list, f32) == f32\nreduce(list, f64 != nil)\nreduce(list, f64 + 0.5)\nreduce(list, f64 + 1)\nreduce(list, f64 / i32)\nreduce(list, f64 <= i32)\nreduce(list, f64 == f32)\nreduce(list, f64 > f32)\nreduce(list, f64 >= 0.5)\nreduce(list, f64)\nreduce(list, f64) * i64\nreduce(list, false == false)\nreduce(list, false ? \"foo\" : list)\nreduce(list, false ? # : #)\nreduce(list, false || true)\nreduce(list, filter(list, ok))\nreduce(list, findIndex(array, true))\nreduce(list, findLastIndex(list, false))\nreduce(list, float(i))\nreduce(list, floor(0.5))\nreduce(list, foo != #)\nreduce(list, foo)\nreduce(list, foo) == foo\nreduce(list, foo).Bar\nreduce(list, foo).Qux\nreduce(list, foo).String\nreduce(list, foo).String()\nreduce(list, foo)?.Bar\nreduce(list, foo)?.Qux\nreduce(list, foo)?.String\nreduce(list, foo)?.String()\nreduce(list, foo.Bar)\nreduce(list, foo.String)\nreduce(list, foo?.Bar)\nreduce(list, foo?.Qux)\nreduce(list, foo?.String)\nreduce(list, get(list, i))\nreduce(list, greet != nil)\nreduce(list, greet(\"bar\"))\nreduce(list, greet)\nreduce(list, groupBy(array, 1))\nreduce(list, groupBy(list, \"bar\"))\nreduce(list, groupBy(list, #))\nreduce(list, half(1))\nreduce(list, half)\nreduce(list, i * i64)\nreduce(list, i + 1)\nreduce(list, i - f64)\nreduce(list, i .. 1)\nreduce(list, i == 0.5)\nreduce(list, i > i64)\nreduce(list, i >= 0.5)\nreduce(list, i)\nreduce(list, i) * i64\nreduce(list, i) .. 1 % 1\nreduce(list, i) .. i\nreduce(list, i) / f64\nreduce(list, i) / i32\nreduce(list, i) < f32\nreduce(list, i) == f32\nreduce(list, i) > f32\nreduce(list, i) ^ f32\nreduce(list, i32 != nil)\nreduce(list, i32 - i32)\nreduce(list, i32 .. 1)\nreduce(list, i32 / 0.5)\nreduce(list, i32 < i)\nreduce(list, i32 <= i)\nreduce(list, i32 == f64)\nreduce(list, i32 >= f32)\nreduce(list, i32)\nreduce(list, i32) != f64\nreduce(list, i32) % i\nreduce(list, i32) - f32\nreduce(list, i32) >= i\nreduce(list, i64 .. 1)\nreduce(list, i64 < i64)\nreduce(list, i64 > i64)\nreduce(list, i64 >= 0.5)\nreduce(list, i64)\nreduce(list, i64) * f64\nreduce(list, i64) ** i32\nreduce(list, i64) <= i64\nreduce(list, int(i64))\nreduce(list, len(array))\nreduce(list, list != nil)\nreduce(list, list == nil)\nreduce(list, list)\nreduce(list, map(array, \"bar\"))\nreduce(list, map(array, #))\nreduce(list, map(list, 1))\nreduce(list, max(0.5))\nreduce(list, max(f32))\nreduce(list, min(0.5))\nreduce(list, min(1))\nreduce(list, min(f32))\nreduce(list, nil != #)\nreduce(list, nil != add)\nreduce(list, nil != half)\nreduce(list, nil == #)\nreduce(list, not false)\nreduce(list, not ok)\nreduce(list, not true)\nreduce(list, ok ? # : #)\nreduce(list, ok ? # : score)\nreduce(list, ok ? greet : add)\nreduce(list, ok ? score : #)\nreduce(list, ok)\nreduce(list, reduce(array, ok))\nreduce(list, reduce(array, score))\nreduce(list, reduce(list, #))\nreduce(list, reduce(list, 1))\nreduce(list, reduce(list, add))\nreduce(list, reduce(list, i32))\nreduce(list, score(i))\nreduce(list, score)\nreduce(list, string(greet))\nreduce(list, toBase64(\"bar\"))\nreduce(list, toBase64(\"foo\"))\nreduce(list, toJSON(array))\nreduce(list, toJSON(list))\nreduce(list, toJSON(nil))\nreduce(list, true == nil)\nreduce(list, true ? foo : f64)\nreduce(list, type(#))\nreduce(map(array, \"bar\"), # not endsWith #)\nreduce(map(array, \"bar\"), add)\nreduce(map(array, \"foo\"), half(f64))\nreduce(map(array, #), # != i)\nreduce(map(array, #), # .. #)\nreduce(map(array, #), #)\nreduce(map(array, #), abs(#))\nreduce(map(array, #), i)\nreduce(map(array, #), i32 * #)\nreduce(map(array, #), not ok)\nreduce(map(array, 0.5), add)\nreduce(map(array, 0.5), div)\nreduce(map(array, 0.5), f32)\nreduce(map(array, 1), # ^ 0.5)\nreduce(map(array, 1), #)\nreduce(map(array, 1), foo)\nreduce(map(array, add), #)\nreduce(map(array, add), f32)\nreduce(map(array, add), list)\nreduce(map(array, array), f64)\nreduce(map(array, div), #)\nreduce(map(array, div), div)\nreduce(map(array, div), i32 * i)\nreduce(map(array, f32), f32)\nreduce(map(array, f32), i)\nreduce(map(array, f32), i32)\nreduce(map(array, f64), #)\nreduce(map(array, f64), f32 < #)\nreduce(map(array, false), # and true)\nreduce(map(array, false), f32)\nreduce(map(array, foo), # == nil)\nreduce(map(array, i), # / 1)\nreduce(map(array, i), #)\nreduce(map(array, i), add)\nreduce(map(array, i), f64 + 1)\nreduce(map(array, i32), array)\nreduce(map(array, i32), list)\nreduce(map(array, i64), # <= #)\nreduce(map(array, i64), #)\nreduce(map(array, list), filter(#, false))\nreduce(map(array, ok), i)\nreduce(map(array, score), i32)\nreduce(map(list, \"bar\"), #)\nreduce(map(list, \"foo\"), #)\nreduce(map(list, #), #)\nreduce(map(list, #), .Qux)\nreduce(map(list, #), add)\nreduce(map(list, #), array)\nreduce(map(list, #), f32)\nreduce(map(list, #), f64)\nreduce(map(list, #), half)\nreduce(map(list, #), i64)\nreduce(map(list, #), ok)\nreduce(map(list, 0.5), #)\nreduce(map(list, 0.5), foo)\nreduce(map(list, 1), # > #)\nreduce(map(list, 1), #)\nreduce(map(list, 1), list)\nreduce(map(list, array), div)\nreduce(map(list, div), add)\nreduce(map(list, f64), #)\nreduce(map(list, f64), ok)\nreduce(map(list, false), div)\nreduce(map(list, greet), #)\nreduce(map(list, i), #)\nreduce(map(list, i), [i32])\nreduce(map(list, i), f32)\nreduce(map(list, i), score(#))\nreduce(map(list, i32), #)\nreduce(map(list, i32), foo)\nreduce(map(list, i64), #)\nreduce(map(list, i64), i32)\nreduce(map(list, list), ok)\nreduce(map(list, score), #)\nreduce(map(list, score), f64)\nreduce(map(list, true), #)\nreduce(map(list, true), add)\nreduce(map(list, true), half)\nreduce(ok ? \"bar\" : i32, #)\nreduce(ok ? \"foo\" : list, #)\nreduce(ok ? array : half, f32)\nreduce(ok ? list : i, #)\nreduce(reduce(array, array), f64 != #)\nreduce(reduce(array, list), get(array, i32))\nreduce(reduce(list, array), f64)\nreduce(sort(array), #)\nreduce(sort(array), foo)\nreduce(sort(array), greet)\nreduce(sort(array), ok)\nreduce(true ? array : 1, array)\nreduce(true ? array : array, #)\nrepeat(type(ok), i)\nround(-0.5)\nround(-1)\nround(-f32)\nround(-f64)\nround(-i)\nround(-i32)\nround(-i64)\nround(0.5 * 1)\nround(0.5 * f64)\nround(0.5 * i32)\nround(0.5 ** 0.5)\nround(0.5 ** 1)\nround(0.5 ** i)\nround(0.5 ** i32)\nround(0.5 ** i64)\nround(0.5 + 1)\nround(0.5 + f64)\nround(0.5 + i)\nround(0.5 + i32)\nround(0.5 - 0.5)\nround(0.5 - 1)\nround(0.5 - i32)\nround(0.5 / 0.5)\nround(0.5 / 1)\nround(0.5 / f64)\nround(0.5 / i32)\nround(0.5 ^ f64)\nround(0.5 ^ i)\nround(0.5 ^ i64)\nround(0.5) * f32\nround(0.5) ** i32\nround(0.5) + -f32\nround(0.5) - i64 ^ i\nround(0.5) < f64\nround(0.5) <= i64\nround(0.5) == i32\nround(0.5) == i64\nround(0.5) == max(i, i64)\nround(0.5) > -1\nround(0.5) > i\nround(0.5) >= i\nround(0.5) in array\nround(1 % i)\nround(1 % i64)\nround(1 * 0.5)\nround(1 * f32)\nround(1 * i64)\nround(1 ** 0.5)\nround(1 ** 1)\nround(1 ** f32)\nround(1 ** f64)\nround(1 ** i)\nround(1 + 0.5)\nround(1 + 1)\nround(1 + i64)\nround(1 - 0.5)\nround(1 - 1)\nround(1 - i)\nround(1 - i32)\nround(1 - i64)\nround(1 / 0.5)\nround(1 / 1)\nround(1 / f32)\nround(1 / i)\nround(1 / i64)\nround(1 ^ 0.5)\nround(1 ^ 1)\nround(1 ^ f32)\nround(1 ^ i)\nround(1 ^ i64)\nround(1) != ceil(i32)\nround(1) * i32\nround(1) + i64\nround(1) - i64\nround(1) / i32\nround(1) / i64\nround(1) < i64\nround(1) <= i\nround(1) == i\nround(1) >= f64\nround(1) >= i32\nround(1) >= i64\nround(1) ^ f64\nround(1) not in array\nround(abs(0.5))\nround(abs(1))\nround(abs(f64))\nround(abs(i))\nround(abs(i64))\nround(add(1, i))\nround(array[1])\nround(array[i32])\nround(array[i64])\nround(bitnot(i))\nround(bitnot(i32))\nround(bitnot(i64))\nround(ceil(1))\nround(ceil(f64))\nround(ceil(i32))\nround(ceil(i64))\nround(count(list, true))\nround(div(1, 1))\nround(f32 * 0.5)\nround(f32 * 1)\nround(f32 * f64)\nround(f32 * i32 ^ f32)\nround(f32 * i64)\nround(f32 ** 0.5)\nround(f32 ** 1)\nround(f32 + f64)\nround(f32 + i32)\nround(f32 - 0.5)\nround(f32 - i)\nround(f32 / i32)\nround(f32 ^ 0.5)\nround(f32 ^ f32)\nround(f32 ^ i)\nround(f32 ^ i64)\nround(f32)\nround(f32) * i32\nround(f32) - i32\nround(f32) / f32\nround(f32) == i32\nround(f64 * 0.5)\nround(f64 * i)\nround(f64 ** 0.5)\nround(f64 ** 1)\nround(f64 ** f32)\nround(f64 ** i)\nround(f64 + f64)\nround(f64 + i)\nround(f64 + i32)\nround(f64 - 0.5)\nround(f64 - 1)\nround(f64 - i32)\nround(f64 / f64)\nround(f64 / i)\nround(f64 / i32)\nround(f64 / i64)\nround(f64 ^ 1)\nround(f64 ^ f64)\nround(f64)\nround(f64) * f32\nround(f64) ** i32\nround(f64) + f64\nround(f64) <= f64\nround(f64) > i\nround(f64) > i32\nround(f64) >= i64\nround(f64) not in array\nround(false ? f32 : f64)\nround(false ? f64 : 1)\nround(false ? nil : 1)\nround(findIndex(array, # <= #))\nround(findIndex(list, ok))\nround(findLast(array, ok))\nround(findLast(array, true))\nround(findLastIndex(array, ok))\nround(findLastIndex(list, ok))\nround(float(0.5))\nround(float(1))\nround(float(f32))\nround(float(i))\nround(floor(0.5))\nround(floor(1))\nround(floor(f64))\nround(floor(i32))\nround(floor(i64))\nround(get(array, i))\nround(get(array, i32))\nround(get(array, i64))\nround(half(-1))\nround(half(0.5))\nround(half(1))\nround(half(f64))\nround(i % i32)\nround(i % i64)\nround(i * 1)\nround(i * f64)\nround(i * i32)\nround(i ** 1)\nround(i ** i64)\nround(i + 0.5)\nround(i + 1)\nround(i + f64)\nround(i + i)\nround(i + i32)\nround(i + i64)\nround(i - i)\nround(i - i32)\nround(i / 1)\nround(i / i)\nround(i / i64)\nround(i ^ 0.5) > f32\nround(i ^ 1)\nround(i ^ f32)\nround(i)\nround(i) * f32\nround(i) * i\nround(i) / f64\nround(i) < i\nround(i) < i32\nround(i) > i\nround(i) > i64 != ok\nround(i) >= f32\nround(i) >= i64\nround(i) ^ i32\nround(i32 % 1)\nround(i32 * 1)\nround(i32 ** 1)\nround(i32 ** f32)\nround(i32 ** f64)\nround(i32 + 0.5)\nround(i32 + 1)\nround(i32 + i32)\nround(i32 - 1)\nround(i32 - f32)\nround(i32 - f64)\nround(i32 / 0.5)\nround(i32 / 1)\nround(i32 ^ f64)\nround(i32)\nround(i32) != i\nround(i32) * f32\nround(i32) ** f64\nround(i32) - i\nround(i32) < i32\nround(i32) <= ceil(1)\nround(i32) <= f64\nround(i32) <= i64\nround(i32) >= f64\nround(i32) >= i32\nround(i32) ^ f64\nround(i64 % i)\nround(i64 % i32)\nround(i64 * 0.5)\nround(i64 * i)\nround(i64 ** 1)\nround(i64 ** f64)\nround(i64 ** i64)\nround(i64 + f32)\nround(i64 - 0.5)\nround(i64 - 1)\nround(i64 - i)\nround(i64 / 0.5)\nround(i64 / 1)\nround(i64 ^ 1)\nround(i64 ^ i32)\nround(i64 ^ i64)\nround(i64)\nround(i64) != f64\nround(i64) * i64\nround(i64) ** i32\nround(i64) - bitnot(1)\nround(i64) - f32\nround(i64) < f64\nround(i64) ^ f64\nround(int(0.5))\nround(int(1))\nround(int(f32))\nround(int(f64))\nround(int(i))\nround(int(i32))\nround(int(i64))\nround(last(array))\nround(len(\"bar\"))\nround(len(\"foo\"))\nround(len(array))\nround(len(list))\nround(max(0.5))\nround(max(1))\nround(max(i))\nround(max(i32))\nround(max(i64))\nround(max(i64, f32))\nround(mean(array))\nround(median(array))\nround(min(0.5))\nround(min(1))\nround(min(f32))\nround(min(f64))\nround(min(i32))\nround(min(i64))\nround(reduce(array, #))\nround(reduce(array, 0.5))\nround(reduce(array, 1))\nround(reduce(array, i64))\nround(reduce(list, 0.5))\nround(reduce(list, f32))\nround(round(0.5))\nround(round(1))\nround(round(f32))\nround(round(f64))\nround(round(i))\nround(round(i32))\nround(round(i64))\nround(score(1))\nround(score(i))\nround(sum(array))\nround(true ? i : ok)\nscore\nscore != nil != ok\nscore != nil ? half : f64\nscore != nil or i32 > 0.5\nscore != nil || ok\nscore != score\nscore != score != ok\nscore != score ? i32 : i32\nscore == nil != nil\nscore == nil && ok\nscore == nil ? 0.5 : \"bar\"\nscore == score\nscore == score == true\nscore == score ? 0.5 : score\nscore in groupBy(list, #)?.array\nscore in sort(array)\nscore(-1)\nscore(-1, i)\nscore(-get(array, i))\nscore(-i)\nscore(-i, i)\nscore(1 % 1)\nscore(1 % i)\nscore(1 % i32)\nscore(1 % i64)\nscore(1 * 1)\nscore(1 * i)\nscore(1 * i32)\nscore(1 * i64)\nscore(1 + 1)\nscore(1 + i)\nscore(1 + i32)\nscore(1 + i64)\nscore(1 - 1)\nscore(1 - i)\nscore(1 - i32)\nscore(1) != -f32\nscore(1) != i\nscore(1) != i32\nscore(1) % -1\nscore(1) % i\nscore(1) % i64\nscore(1) * f32\nscore(1) * i\nscore(1) * i64\nscore(1) ** i32\nscore(1) + f64\nscore(1) + i32\nscore(1) - f32\nscore(1) - i\nscore(1) - i32\nscore(1) - int(0.5)\nscore(1) .. i\nscore(1) .. i32\nscore(1) .. i64\nscore(1) .. score(1)\nscore(1) / f32\nscore(1) / i32\nscore(1) < i\nscore(1) < i32\nscore(1) < i64\nscore(1) < i64 - 0.5\nscore(1) <= 0.5 * 1\nscore(1) <= i\nscore(1) <= i64\nscore(1) == i32\nscore(1) == i64\nscore(1) > bitshr(i64, 1)\nscore(1) > f32\nscore(1) > i64\nscore(1) >= 0.5 + f64\nscore(1) >= f32\nscore(1) >= i\nscore(1) >= sum(array)\nscore(1) ^ f64\nscore(1) ^ i\nscore(1) ^ i32\nscore(1) in array\nscore(1) not in groupBy(list, false)\nscore(1, 1) < i\nscore(1, i) < f64\nscore(1, i) ^ f32\nscore(abs(1))\nscore(abs(i))\nscore(add(1, i))\nscore(array[1])\nscore(array[i64])\nscore(array[i])\nscore(bitnand(1, i64))\nscore(bitnand(i64, i32))\nscore(bitnot(1))\nscore(bitnot(i))\nscore(bitnot(i32))\nscore(bitnot(i64))\nscore(bitshl(i32, i))\nscore(bitshr(1, i64))\nscore(bitshr(i32, i64))\nscore(bitushr(1, i))\nscore(count(array, false))\nscore(count(array, ok))\nscore(count(array, true))\nscore(count(list, ok))\nscore(false ? f64 : 1)\nscore(false ? foo : 1)\nscore(find(array, i != #))\nscore(find(array, ok))\nscore(find(array, true))\nscore(findIndex(array, ok))\nscore(findIndex(array, true))\nscore(findIndex(list, true))\nscore(findLast(array, true))\nscore(findLastIndex(array, true))\nscore(findLastIndex(list, ok))\nscore(findLastIndex(list, true))\nscore(first(array))\nscore(get(array, 1))\nscore(get(array, i))\nscore(get(array, i32))\nscore(get(array, i64))\nscore(i % 1)\nscore(i % i)\nscore(i % i64)\nscore(i * 1 * i)\nscore(i * 1)\nscore(i * i)\nscore(i * i32)\nscore(i * i64)\nscore(i + 1)\nscore(i + i)\nscore(i + i32)\nscore(i - 1)\nscore(i - i)\nscore(i - i32)\nscore(i)\nscore(i) != f32\nscore(i) != f64\nscore(i) % i\nscore(i) % i * f64\nscore(i) * f32\nscore(i) * i32\nscore(i) ** (0.5 / 0.5)\nscore(i) ** -0.5\nscore(i) ** i32\nscore(i) ** i64\nscore(i) + f64\nscore(i) - f64\nscore(i) - i32\nscore(i) / i64\nscore(i) < 1 != ok\nscore(i) < f32\nscore(i) < f64 / 0.5\nscore(i) < i32\nscore(i) < i64\nscore(i) <= 0.5 / f32\nscore(i) <= f32\nscore(i) <= f64\nscore(i) <= i\nscore(i) <= i32\nscore(i) == f32\nscore(i) > f32\nscore(i) > i\nscore(i) > i64\nscore(i) >= f32\nscore(i) >= f64\nscore(i) >= i\nscore(i) >= i32\nscore(i) >= i64\nscore(i) ^ f32\nscore(i) ^ i32\nscore(i) ^ i64\nscore(i) ^ score(1)\nscore(i, 1) + -1\nscore(i, 1) .. i64\nscore(i, 1) <= f32\nscore(i, i)\nscore(i, i) ** f32\nscore(i32 % 1)\nscore(i32 % i)\nscore(i32 % i32)\nscore(i32 * 1)\nscore(i32 * i)\nscore(i32 * i32)\nscore(i32 * i64)\nscore(i32 + 1)\nscore(i32 + i)\nscore(i32 + i32)\nscore(i32 + i64)\nscore(i32 - 1)\nscore(i32 - i)\nscore(i32 - i32)\nscore(i32 - i64)\nscore(i64 % 1)\nscore(i64 % i)\nscore(i64 % i32)\nscore(i64 % i64)\nscore(i64 * 1)\nscore(i64 * i32)\nscore(i64 * i64)\nscore(i64 + 1)\nscore(i64 + i)\nscore(i64 + i32)\nscore(i64 - 1)\nscore(i64 - i64)\nscore(int(0.5))\nscore(int(1))\nscore(int(f32))\nscore(int(f64))\nscore(int(float(0.5)))\nscore(int(i))\nscore(int(i32))\nscore(int(i64))\nscore(last(array))\nscore(len(\"bar\"))\nscore(len(\"foo\"))\nscore(len(array))\nscore(len(list))\nscore(max(1))\nscore(max(1, i32, 0.5))\nscore(max(i))\nscore(max(i, i32))\nscore(min(1))\nscore(min(i))\nscore(min(i, i32))\nscore(ok ? 1 : \"bar\")\nscore(ok ? 1 : list)\nscore(reduce(array, #))\nscore(reduce(array, i))\nscore(reduce(list, 1))\nscore(reduce(list, i))\nscore(score(1))\nscore(score(i))\nscore(score(i32 + i))\nscore(sum(array))\nsort(1 .. 1)\nsort(1 .. i)\nsort([add])\nsort([greet])\nsort([half])\nsort([i64])\nsort([list])\nsort(array)\nsort(array) == array\nsort(false ? greet : array)\nsort(groupBy(list, #)?.foo)\nsort(groupBy(list, i32).half)\nsort(i .. i32)\nsort(i .. i64)\nsort(i32 .. 1)\nsort(i64 .. 1)\nsort(map(array, \"bar\"))\nsort(map(array, \"foo\"))\nsort(map(array, #))\nsort(map(array, 1))\nsort(map(array, f64))\nsort(map(array, i))\nsort(map(array, i64))\nsort(reduce(array, array))\nsortBy(array, string(true))\nstring(!!false)\nstring(!false)\nstring(!ok)\nstring(!true)\nstring(\"bar\" != nil)\nstring(\"bar\" <= \"bar\")\nstring(\"bar\" == \"bar\")\nstring(\"bar\" > \"foo\")\nstring(\"bar\" >= \"bar\")\nstring(\"bar\" not endsWith \"bar\")\nstring(\"bar\" not matches \"bar\")\nstring(\"bar\" not startsWith \"foo\")\nstring(\"bar\" startsWith \"foo\")\nstring(\"bar\") > type(i64)\nstring(\"bar\") >= toJSON(\"bar\")\nstring(\"foo\" != nil)\nstring(\"foo\" == \"foo\")\nstring(\"foo\" == nil)\nstring(\"foo\" > \"bar\")\nstring(\"foo\" in foo)\nstring(\"foo\" matches \"bar\")\nstring(\"foo\" not contains \"bar\")\nstring(\"foo\" not contains \"foo\")\nstring(\"foo\" not in foo)\nstring(--i)\nstring(-0.5)\nstring(-1)\nstring(-f32)\nstring(-f64)\nstring(-i)\nstring(-i32)\nstring(-i64)\nstring(0.5 != 0.5)\nstring(0.5 != f64)\nstring(0.5 != i)\nstring(0.5 != i32)\nstring(0.5 * 0.5)\nstring(0.5 * i)\nstring(0.5 * i32)\nstring(0.5 ** f32)\nstring(0.5 ** i32)\nstring(0.5 + f64)\nstring(0.5 + i)\nstring(0.5 + i64)\nstring(0.5 - f32)\nstring(0.5 - f64)\nstring(0.5 / 0.5)\nstring(0.5 / 1)\nstring(0.5 / f32)\nstring(0.5 / i)\nstring(0.5 < 0.5)\nstring(0.5 < 1)\nstring(0.5 < i64)\nstring(0.5 <= 0.5)\nstring(0.5 <= f64)\nstring(0.5 <= i)\nstring(0.5 <= i32)\nstring(0.5 == 0.5)\nstring(0.5 == 1)\nstring(0.5 == i64)\nstring(0.5 == nil)\nstring(0.5 > 0.5)\nstring(0.5 > 1)\nstring(0.5 > i)\nstring(0.5 > i64)\nstring(0.5 >= 0.5)\nstring(0.5 >= 1)\nstring(0.5 >= f32)\nstring(0.5 >= i32)\nstring(0.5 >= i64)\nstring(0.5 ^ f32)\nstring(0.5 ^ i)\nstring(0.5 ^ i32)\nstring(0.5 ^ i64)\nstring(0.5 in array)\nstring(0.5 not in array)\nstring(1 != 0.5)\nstring(1 != 1)\nstring(1 != i)\nstring(1 != i64)\nstring(1 != nil)\nstring(1 % 1)\nstring(1 % i)\nstring(1 % i32)\nstring(1 * 0.5)\nstring(1 * f32)\nstring(1 * f64)\nstring(1 ** 0.5)\nstring(1 ** 1)\nstring(1 ** i)\nstring(1 ** i64)\nstring(1 + 0.5)\nstring(1 + 1)\nstring(1 + f64)\nstring(1 - 0.5)\nstring(1 - f32)\nstring(1 - i32)\nstring(1 - i64)\nstring(1 .. 1)\nstring(1 .. i32)\nstring(1 .. i64)\nstring(1 / 0.5)\nstring(1 / f64)\nstring(1 / i)\nstring(1 / i32)\nstring(1 / i64)\nstring(1 < 0.5)\nstring(1 <= 1)\nstring(1 <= f32)\nstring(1 <= i)\nstring(1 <= i32)\nstring(1 <= i64)\nstring(1 == 1)\nstring(1 == f32)\nstring(1 == i32)\nstring(1 > 0.5)\nstring(1 > 1)\nstring(1 > i64)\nstring(1 >= f32)\nstring(1 >= i)\nstring(1 ^ 0.5)\nstring(1 ^ 1)\nstring(1 ^ f32)\nstring(1 ^ f64)\nstring(1 ^ i64)\nstring(1 not in array)\nstring([0.5])\nstring([div])\nstring([f64])\nstring([list])\nstring([score])\nstring([true])\nstring(abs(0.5))\nstring(abs(1))\nstring(abs(f32))\nstring(abs(i))\nstring(abs(i32))\nstring(add != add)\nstring(add != div)\nstring(add == div)\nstring(add == nil)\nstring(add)\nstring(add) in foo ? i64 : i32\nstring(add) not endsWith foo.Bar\nstring(all(array, ok))\nstring(all(array, true))\nstring(any(array, ok))\nstring(any(list, false))\nstring(any(list, ok))\nstring(array != array)\nstring(array != nil)\nstring(array)\nstring(array[i32])\nstring(bitnot(1))\nstring(bitnot(i32))\nstring(bitnot(i64))\nstring(ceil(0.5))\nstring(ceil(1))\nstring(ceil(f32))\nstring(ceil(f64))\nstring(ceil(i))\nstring(ceil(i64))\nstring(div != div)\nstring(div != nil)\nstring(div == add)\nstring(div == div)\nstring(div)\nstring(f32 != 0.5)\nstring(f32 != f64)\nstring(f32 != i)\nstring(f32 != nil)\nstring(f32 * 0.5)\nstring(f32 * 1)\nstring(f32 * f64)\nstring(f32 * i)\nstring(f32 * i32)\nstring(f32 ** 1)\nstring(f32 ** f64)\nstring(f32 + f32)\nstring(f32 + f64)\nstring(f32 + i32)\nstring(f32 + i64)\nstring(f32 - 0.5)\nstring(f32 - 1)\nstring(f32 - i64)\nstring(f32 / 0.5)\nstring(f32 / f64)\nstring(f32 / i64)\nstring(f32 < f32)\nstring(f32 <= i)\nstring(f32 <= i32)\nstring(f32 == 0.5)\nstring(f32 == i)\nstring(f32 > 0.5)\nstring(f32 > f64)\nstring(f32)\nstring(f32) in foo\nstring(f64 != 1)\nstring(f64 != i)\nstring(f64 != nil)\nstring(f64 * 0.5)\nstring(f64 * i)\nstring(f64 * i32)\nstring(f64 * i64)\nstring(f64 ** 0.5)\nstring(f64 ** f64)\nstring(f64 ** i)\nstring(f64 + 0.5)\nstring(f64 + 1)\nstring(f64 + f32)\nstring(f64 - 0.5)\nstring(f64 - 1)\nstring(f64 - i)\nstring(f64 / 0.5)\nstring(f64 < f32)\nstring(f64 < i)\nstring(f64 <= 1)\nstring(f64 <= f32)\nstring(f64 <= f64)\nstring(f64 == 1)\nstring(f64 == f32)\nstring(f64 == i)\nstring(f64 == i64)\nstring(f64 > 1)\nstring(f64 >= f32)\nstring(f64 >= i)\nstring(f64 ^ 0.5)\nstring(f64 ^ f32)\nstring(f64 ^ i)\nstring(f64 in array)\nstring(f64 not in array)\nstring(f64)\nstring(false != nil)\nstring(false != ok)\nstring(false != true)\nstring(false ? array : 0.5)\nstring(false ? f64 : i32)\nstring(false ? false : i)\nstring(false ? greet : f64)\nstring(false ? half : \"bar\")\nstring(false ? half : i)\nstring(false ? i : i)\nstring(false ? nil : nil)\nstring(false and ok)\nstring(false) endsWith toBase64(\"foo\")\nstring(filter(array, false))\nstring(filter(array, ok))\nstring(filter(array, true))\nstring(filter(list, false))\nstring(find(array, ok))\nstring(find(array, true))\nstring(find(list, ok))\nstring(findIndex(array, true))\nstring(findLast(array, false))\nstring(findLast(array, ok))\nstring(findLast(array, true))\nstring(findLastIndex(array, ok))\nstring(first(array))\nstring(first(list))\nstring(float(0.5))\nstring(float(1))\nstring(float(f64))\nstring(float(i))\nstring(float(i64))\nstring(floor(0.5))\nstring(floor(f32))\nstring(floor(f64))\nstring(floor(i))\nstring(floor(i32))\nstring(floor(i64))\nstring(foo == foo)\nstring(foo == nil)\nstring(foo not in list)\nstring(foo)\nstring(foo.Bar)\nstring(foo.Qux)\nstring(foo.String())\nstring(foo.String)\nstring(foo?.Bar)\nstring(foo?.Qux)\nstring(foo?.String())\nstring(foo?.String)\nstring(get(array, i))\nstring(get(array, i64))\nstring(get(list, 1))\nstring(get(list, i32))\nstring(get(list, i64))\nstring(greet != nil)\nstring(greet == greet)\nstring(greet == nil)\nstring(greet(\"bar\"))\nstring(greet(\"foo\"))\nstring(greet)\nstring(greet) == nil ? 0.5 : i\nstring(groupBy(array, #))\nstring(groupBy(array, 1))\nstring(groupBy(array, f32))\nstring(groupBy(array, false))\nstring(groupBy(array, i32))\nstring(groupBy(list, #))\nstring(groupBy(list, 0.5))\nstring(groupBy(list, 1))\nstring(groupBy(list, f64))\nstring(groupBy(list, false))\nstring(groupBy(list, i))\nstring(half != nil)\nstring(half == nil)\nstring(half(0.5))\nstring(half(1))\nstring(half(f64))\nstring(half)\nstring(i != 1)\nstring(i != i64)\nstring(i % 1)\nstring(i % i32)\nstring(i % i64)\nstring(i * 1)\nstring(i * f64)\nstring(i ** f32)\nstring(i ** f64)\nstring(i ** i64)\nstring(i + 0.5)\nstring(i + i)\nstring(i - f32)\nstring(i .. 1)\nstring(i .. i)\nstring(i .. i32)\nstring(i / 1)\nstring(i / f32)\nstring(i / f64)\nstring(i / i32)\nstring(i / i64)\nstring(i < 0.5)\nstring(i < 1)\nstring(i < i32)\nstring(i <= f32)\nstring(i <= i)\nstring(i == 1)\nstring(i == i)\nstring(i > 0.5)\nstring(i > 1)\nstring(i > f32)\nstring(i >= 0.5)\nstring(i >= i64)\nstring(i ^ 1)\nstring(i ^ f32)\nstring(i ^ i)\nstring(i ^ i64)\nstring(i)\nstring(i) in foo\nstring(i32 != 0.5)\nstring(i32 != 1)\nstring(i32 != f64)\nstring(i32 != i32)\nstring(i32 != nil)\nstring(i32 % 1)\nstring(i32 % i)\nstring(i32 % i64)\nstring(i32 * 1)\nstring(i32 * f32)\nstring(i32 * f64)\nstring(i32 * i)\nstring(i32 ** 0.5)\nstring(i32 ** f64)\nstring(i32 + 0.5)\nstring(i32 - 0.5)\nstring(i32 - 1)\nstring(i32 - f32)\nstring(i32 - f64)\nstring(i32 - i32)\nstring(i32 - i64)\nstring(i32 .. 1)\nstring(i32 .. i)\nstring(i32 / 0.5)\nstring(i32 < 1)\nstring(i32 < f64)\nstring(i32 < i64)\nstring(i32 == f32)\nstring(i32 == i64)\nstring(i32 == nil)\nstring(i32 > 1)\nstring(i32 > i)\nstring(i32 >= 0.5)\nstring(i32 >= 1)\nstring(i32 >= i)\nstring(i32 ^ f32)\nstring(i32 ^ f64)\nstring(i32 ^ i32)\nstring(i32 in array)\nstring(i32 not in array)\nstring(i32)\nstring(i32) not startsWith trimSuffix(\"foo\")\nstring(i64 != 1)\nstring(i64 != i)\nstring(i64 != i32)\nstring(i64 != i64)\nstring(i64 % i32)\nstring(i64 * 1)\nstring(i64 * f32)\nstring(i64 * i)\nstring(i64 ** 0.5)\nstring(i64 + i64)\nstring(i64 - i)\nstring(i64 - i32)\nstring(i64 - i64)\nstring(i64 .. 1)\nstring(i64 .. i)\nstring(i64 .. i32)\nstring(i64 / f64)\nstring(i64 / i)\nstring(i64 / i64)\nstring(i64 < 0.5)\nstring(i64 < i)\nstring(i64 <= i64)\nstring(i64 == 0.5)\nstring(i64 == i)\nstring(i64 > 0.5)\nstring(i64 > i64)\nstring(i64 >= 0.5)\nstring(i64 >= 1)\nstring(i64 ^ 0.5)\nstring(i64 ^ f64)\nstring(i64 in array)\nstring(i64)\nstring(i64) matches greet(\"bar\")\nstring(i64) not in foo\nstring(int(0.5))\nstring(int(1))\nstring(int(i32))\nstring(int(i64))\nstring(last(array))\nstring(last(list).String())\nstring(len(\"bar\"))\nstring(len(array))\nstring(len(list))\nstring(list != nil)\nstring(list == array)\nstring(list == list)\nstring(list == nil)\nstring(list)\nstring(list[1])\nstring(list[i32])\nstring(list[i64])\nstring(list[i])\nstring(map(array, #))\nstring(map(array, 0.5))\nstring(map(array, add))\nstring(map(array, div))\nstring(map(array, i))\nstring(map(array, i32))\nstring(map(array, true))\nstring(map(list, \"bar\"))\nstring(map(list, \"foo\"))\nstring(map(list, #))\nstring(map(list, 0.5))\nstring(map(list, 1))\nstring(map(list, array))\nstring(map(list, half))\nstring(map(list, i32))\nstring(map(list, i64))\nstring(max(0.5))\nstring(max(0.5, f32))\nstring(max(1))\nstring(max(f32))\nstring(max(f64))\nstring(max(i))\nstring(max(i64))\nstring(mean(array))\nstring(min(0.5))\nstring(min(f32))\nstring(min(i))\nstring(min(i32))\nstring(min(i64))\nstring(nil != \"bar\")\nstring(nil != div)\nstring(nil != false)\nstring(nil != greet)\nstring(nil != half)\nstring(nil != i)\nstring(nil != ok)\nstring(nil == \"bar\")\nstring(nil == 0.5)\nstring(nil == 1)\nstring(nil == div)\nstring(nil == foo)\nstring(nil == list)\nstring(nil == nil)\nstring(nil == ok)\nstring(nil == score)\nstring(nil in list)\nstring(nil not in list)\nstring(nil) <= list[i].Bar\nstring(none(array, ok))\nstring(none(list, false))\nstring(none(list, ok))\nstring(not !false)\nstring(not (i64 == 0.5))\nstring(not false)\nstring(not ok)\nstring(not true)\nstring(ok != nil)\nstring(ok != true)\nstring(ok ? 0.5 : nil)\nstring(ok ? 0.5 : true)\nstring(ok ? 1 : array)\nstring(ok ? 1 : f32)\nstring(ok ? array : add)\nstring(ok ? div : array)\nstring(ok ? half : score)\nstring(ok ? i : 1)\nstring(ok ? nil : half)\nstring(ok ? nil : list)\nstring(ok or false)\nstring(ok || false)\nstring(ok)\nstring(one(array, true))\nstring(one(list, true))\nstring(reduce(array, #))\nstring(reduce(array, 0.5))\nstring(reduce(array, 1))\nstring(reduce(array, f64))\nstring(reduce(array, greet))\nstring(reduce(array, half))\nstring(reduce(array, i64))\nstring(reduce(array, list))\nstring(reduce(array, score))\nstring(reduce(list, \"bar\"))\nstring(reduce(list, #))\nstring(reduce(list, 1))\nstring(reduce(list, add))\nstring(reduce(list, div))\nstring(reduce(list, foo))\nstring(reduce(list, i))\nstring(reduce(list, i64))\nstring(reduce(list, list))\nstring(round(0.5))\nstring(round(1))\nstring(round(ceil(i32)))\nstring(round(f64))\nstring(round(i64))\nstring(score != nil)\nstring(score == nil)\nstring(score(1 % 1))\nstring(score(1))\nstring(score(i))\nstring(score)\nstring(sort(array))\nstring(sortBy(array, \"foo\"))\nstring(string(\"bar\"))\nstring(string(\"foo\"))\nstring(string(0.5))\nstring(string(1))\nstring(string(array))\nstring(string(div))\nstring(string(f32))\nstring(string(f64))\nstring(string(false))\nstring(string(greet))\nstring(string(half))\nstring(string(i))\nstring(string(i64))\nstring(string(nil))\nstring(string(ok))\nstring(string(score))\nstring(sum(array))\nstring(toBase64(\"foo\"))\nstring(toJSON(\"bar\"))\nstring(toJSON(0.5))\nstring(toJSON(1))\nstring(toJSON(array))\nstring(toJSON(f32))\nstring(toJSON(f64))\nstring(toJSON(false))\nstring(toJSON(i))\nstring(toJSON(i32))\nstring(toJSON(i64))\nstring(toJSON(list))\nstring(toJSON(nil))\nstring(toJSON(ok))\nstring(toJSON(true))\nstring(trim(\"bar\"))\nstring(trim(type(nil)))\nstring(trimPrefix(\"foo\"))\nstring(trimSuffix(\"foo\"))\nstring(true != false)\nstring(true && ok)\nstring(true == nil)\nstring(true ? 0.5 : true)\nstring(true ? f64 : score)\nstring(true ? false : nil)\nstring(true ? greet : i)\nstring(true ? list : ok)\nstring(true and false)\nstring(true or false)\nstring(true or ok)\nstring(true || true)\nstring(type(\"bar\"))\nstring(type(\"foo\"))\nstring(type(-i64))\nstring(type(0.5))\nstring(type(1))\nstring(type(array))\nstring(type(f32))\nstring(type(f64))\nstring(type(foo))\nstring(type(greet))\nstring(type(half))\nstring(type(i))\nstring(type(i32))\nstring(type(i64))\nstring(type(list))\nstring(type(nil))\nstring(type(ok))\nstring(type(score))\nstring(upper(\"foo\"))\nstring({\"bar\": \"foo\", \"foo\": half})\nstring({\"bar\": f32, \"foo\": i32})\nstring({\"bar\": f32})\nstring({\"bar\": true})\nstring({\"foo\": add})\nstring({\"foo\": array, \"foo\": list})\nsum(1 .. 1)\nsum(1 .. i)\nsum(1 .. i32)\nsum(1 .. i64)\nsum([0.5])\nsum([f32])\nsum(array)\nsum(array) != f32\nsum(array) % i\nsum(array) % i64\nsum(array) - f32\nsum(array) / -f64\nsum(array) < i\nsum(array) == i64 - i\nsum(array) ^ f64\nsum(array) not in array\nsum(filter(array, ok))\nsum(groupBy(array, i32).String)\nsum(i32 .. 1)\nsum(i64 .. i32)\nsum(i64 .. i64)\nsum(list[i:1])\nsum(map(array, #))\nsum(map(array, f32))\nsum(map(list, 0.5))\nsum(map(list, f32))\nsum(map(list, i32))\nsum(ok ? array : i64)\nsum(reduce(array, array))\nsum(reduce(list, array))\nsum(sort(array))\nsum(true ? array : i32)\ntake(array, i)\ntake(array, i32)\ntake(array, i64)\ntake(list, i)\ntake(list, i32)\ntake(list, i64)\ntake(map(array, #), i)\ntoBase64(\"bar\" + \"bar\")\ntoBase64(\"bar\" + \"foo\")\ntoBase64(\"bar\") startsWith type(score)\ntoBase64(\"foo\" + \"bar\")\ntoBase64(foo.Bar)\ntoBase64(foo.String())\ntoBase64(foo?.Bar)\ntoBase64(foo?.String())\ntoBase64(greet(\"bar\"))\ntoBase64(greet(\"foo\"))\ntoBase64(lower(\"bar\"))\ntoBase64(lower(\"foo\"))\ntoBase64(ok ? \"bar\" : f64)\ntoBase64(reduce(list, \"bar\"))\ntoBase64(string(\"foo\"))\ntoBase64(string(0.5))\ntoBase64(string(1))\ntoBase64(string(add))\ntoBase64(string(array))\ntoBase64(string(f32))\ntoBase64(string(f64))\ntoBase64(string(foo))\ntoBase64(string(greet))\ntoBase64(string(half))\ntoBase64(string(i))\ntoBase64(string(list))\ntoBase64(string(ok))\ntoBase64(toBase64(\"bar\"))\ntoBase64(toJSON(\"bar\"))\ntoBase64(toJSON(0.5))\ntoBase64(toJSON(1))\ntoBase64(toJSON(f32))\ntoBase64(toJSON(f64))\ntoBase64(toJSON(foo))\ntoBase64(toJSON(i64))\ntoBase64(toJSON(list))\ntoBase64(toJSON(nil))\ntoBase64(toJSON(ok))\ntoBase64(toJSON(true))\ntoBase64(trim(\"bar\"))\ntoBase64(trimPrefix(\"foo\"))\ntoBase64(trimSuffix(\"foo\"))\ntoBase64(type(0.5))\ntoBase64(type(1))\ntoBase64(type(add))\ntoBase64(type(div))\ntoBase64(type(f32))\ntoBase64(type(f64))\ntoBase64(type(false))\ntoBase64(type(foo))\ntoBase64(type(greet))\ntoBase64(type(half))\ntoBase64(type(i))\ntoBase64(type(i32))\ntoBase64(type(i64))\ntoBase64(type(list))\ntoBase64(type(nil))\ntoBase64(type(score))\ntoBase64(upper(\"foo\"))\ntoJSON(!false)\ntoJSON(!ok)\ntoJSON(!true)\ntoJSON(\"bar\" < \"foo\")\ntoJSON(\"bar\" >= \"bar\")\ntoJSON(\"bar\" endsWith \"bar\")\ntoJSON(\"bar\" matches \"foo\")\ntoJSON(\"bar\" not in foo)\ntoJSON(\"bar\" not matches \"bar\")\ntoJSON(\"bar\" not startsWith \"foo\")\ntoJSON(\"bar\" startsWith \"bar\")\ntoJSON(\"bar\") not in foo\ntoJSON(\"foo\" != \"bar\")\ntoJSON(\"foo\" != \"foo\")\ntoJSON(\"foo\" < \"foo\")\ntoJSON(\"foo\" == \"bar\")\ntoJSON(\"foo\" > \"foo\")\ntoJSON(\"foo\" >= \"foo\")\ntoJSON(\"foo\" startsWith \"bar\")\ntoJSON(-0.5)\ntoJSON(-1)\ntoJSON(-f32)\ntoJSON(-f64)\ntoJSON(-i)\ntoJSON(-i32)\ntoJSON(-i64)\ntoJSON(0.5 != 1)\ntoJSON(0.5 != f64)\ntoJSON(0.5 != nil)\ntoJSON(0.5 * i)\ntoJSON(0.5 * i32)\ntoJSON(0.5 * i64)\ntoJSON(0.5 ** 0.5)\ntoJSON(0.5 ** 1)\ntoJSON(0.5 ** f32)\ntoJSON(0.5 ** f64)\ntoJSON(0.5 ** i)\ntoJSON(0.5 ** i32)\ntoJSON(0.5 + 0.5)\ntoJSON(0.5 + 1)\ntoJSON(0.5 + f32)\ntoJSON(0.5 - 0.5)\ntoJSON(0.5 - 1)\ntoJSON(0.5 - f32)\ntoJSON(0.5 - f64)\ntoJSON(0.5 - i)\ntoJSON(0.5 - i32)\ntoJSON(0.5 / 1)\ntoJSON(0.5 / f32)\ntoJSON(0.5 / f64)\ntoJSON(0.5 / i32)\ntoJSON(0.5 < 1)\ntoJSON(0.5 < f32)\ntoJSON(0.5 < f64)\ntoJSON(0.5 < i)\ntoJSON(0.5 <= 0.5)\ntoJSON(0.5 <= 1)\ntoJSON(0.5 <= f32)\ntoJSON(0.5 <= i64)\ntoJSON(0.5 == 0.5)\ntoJSON(0.5 == f64)\ntoJSON(0.5 == i)\ntoJSON(0.5 == i32)\ntoJSON(0.5 == i64)\ntoJSON(0.5 >= 0.5)\ntoJSON(0.5 >= 1)\ntoJSON(0.5 >= f32)\ntoJSON(0.5 ^ f32)\ntoJSON(0.5 ^ i32)\ntoJSON(0.5 ^ i64)\ntoJSON(0.5) not in foo\ntoJSON(1 != 0.5)\ntoJSON(1 != f32)\ntoJSON(1 != nil)\ntoJSON(1 % 1)\ntoJSON(1 % i)\ntoJSON(1 % i32)\ntoJSON(1 * f64)\ntoJSON(1 * i32)\ntoJSON(1 * i64)\ntoJSON(1 ** 0.5)\ntoJSON(1 ** 1)\ntoJSON(1 ** i32)\ntoJSON(1 + 0.5)\ntoJSON(1 + 1)\ntoJSON(1 + f64)\ntoJSON(1 + i)\ntoJSON(1 + i32)\ntoJSON(1 - i)\ntoJSON(1 - i32)\ntoJSON(1 .. i32)\ntoJSON(1 .. i64)\ntoJSON(1 / 1)\ntoJSON(1 / f64)\ntoJSON(1 / i64)\ntoJSON(1 < 0.5)\ntoJSON(1 < 1)\ntoJSON(1 < f64)\ntoJSON(1 < i)\ntoJSON(1 <= 0.5)\ntoJSON(1 <= f32)\ntoJSON(1 <= f64)\ntoJSON(1 == 0.5)\ntoJSON(1 == 1)\ntoJSON(1 == f64)\ntoJSON(1 == i)\ntoJSON(1 == i32)\ntoJSON(1 == nil)\ntoJSON(1 > f32)\ntoJSON(1 > i)\ntoJSON(1 >= 1)\ntoJSON(1 >= f32)\ntoJSON(1 >= i32)\ntoJSON(1 ^ 1)\ntoJSON(1 ^ f32)\ntoJSON(1 ^ i32)\ntoJSON(1 ^ i64)\ntoJSON(1) > reduce(list, \"bar\")\ntoJSON(1) not contains string(true)\ntoJSON([f64])\ntoJSON([false])\ntoJSON([foo])\ntoJSON([nil])\ntoJSON([true])\ntoJSON(abs(0.5))\ntoJSON(abs(1))\ntoJSON(abs(f32))\ntoJSON(abs(f64))\ntoJSON(abs(i))\ntoJSON(abs(i32))\ntoJSON(abs(i64))\ntoJSON(add == add)\ntoJSON(any(array, false))\ntoJSON(array == array)\ntoJSON(array == list)\ntoJSON(array == nil)\ntoJSON(array)\ntoJSON(array[1:i64])\ntoJSON(array[1])\ntoJSON(array[i])\ntoJSON(bitnot(1))\ntoJSON(bitnot(i))\ntoJSON(bitnot(i32))\ntoJSON(bitnot(i64))\ntoJSON(bitshl(i, i32))\ntoJSON(ceil(1))\ntoJSON(ceil(f64))\ntoJSON(ceil(i))\ntoJSON(ceil(i32))\ntoJSON(ceil(i64))\ntoJSON(count(array, ok))\ntoJSON(div != div)\ntoJSON(div == div)\ntoJSON(f32 != 0.5)\ntoJSON(f32 != 1 || ok)\ntoJSON(f32 != f32)\ntoJSON(f32 != i32)\ntoJSON(f32 * f32)\ntoJSON(f32 ** 0.5)\ntoJSON(f32 ** 1)\ntoJSON(f32 ** f64)\ntoJSON(f32 ** i32)\ntoJSON(f32 + 0.5)\ntoJSON(f32 + f32)\ntoJSON(f32 - 0.5)\ntoJSON(f32 - f32)\ntoJSON(f32 - f64)\ntoJSON(f32 - i64)\ntoJSON(f32 < 0.5)\ntoJSON(f32 < i)\ntoJSON(f32 < i64)\ntoJSON(f32 <= 0.5)\ntoJSON(f32 <= 1)\ntoJSON(f32 <= i64)\ntoJSON(f32 == f64)\ntoJSON(f32 == i)\ntoJSON(f32 == nil)\ntoJSON(f32 > i)\ntoJSON(f32 > i32)\ntoJSON(f32 >= 0.5)\ntoJSON(f32 ^ i64)\ntoJSON(f32)\ntoJSON(f32) in foo\ntoJSON(f64 != 0.5)\ntoJSON(f64 != f32)\ntoJSON(f64 != i)\ntoJSON(f64 != i32)\ntoJSON(f64 != nil)\ntoJSON(f64 * 1)\ntoJSON(f64 * f64)\ntoJSON(f64 * i64)\ntoJSON(f64 ** 0.5)\ntoJSON(f64 ** f32)\ntoJSON(f64 + 0.5)\ntoJSON(f64 + f32)\ntoJSON(f64 + i32)\ntoJSON(f64 - f64)\ntoJSON(f64 - i)\ntoJSON(f64 - i64)\ntoJSON(f64 / 1)\ntoJSON(f64 < f64)\ntoJSON(f64 <= 0.5)\ntoJSON(f64 == f64)\ntoJSON(f64 >= 1)\ntoJSON(f64 >= f64)\ntoJSON(f64 ^ f32)\ntoJSON(f64)\ntoJSON(false != ok)\ntoJSON(false ? 0.5 : \"foo\")\ntoJSON(false ? add : f64)\ntoJSON(false ? array : 1)\ntoJSON(false ? false : foo)\ntoJSON(false ? nil : ok)\ntoJSON(false ? ok : i32)\ntoJSON(filter(list, true))\ntoJSON(find(list, ok))\ntoJSON(findIndex(map(array, list), ok))\ntoJSON(first(array))\ntoJSON(first(list))\ntoJSON(float(0.5))\ntoJSON(float(1))\ntoJSON(float(f32))\ntoJSON(float(f64))\ntoJSON(float(i))\ntoJSON(float(i64))\ntoJSON(floor(0.5))\ntoJSON(floor(f64))\ntoJSON(floor(i))\ntoJSON(floor(i32))\ntoJSON(foo != nil)\ntoJSON(foo in list)\ntoJSON(foo)\ntoJSON(foo.Bar)\ntoJSON(foo.String())\ntoJSON(foo?.Bar)\ntoJSON(foo?.String())\ntoJSON(get(array, i32))\ntoJSON(get(array, i64))\ntoJSON(get(list, 1))\ntoJSON(get(list, i))\ntoJSON(get(list, i32))\ntoJSON(get(list, i64))\ntoJSON(greet != nil)\ntoJSON(greet == greet)\ntoJSON(greet == nil)\ntoJSON(greet(\"bar\"))\ntoJSON(greet(\"foo\"))\ntoJSON(groupBy(array, #)?.div)\ntoJSON(groupBy(array, ok)?.foo)\ntoJSON(groupBy(list, #)?.foo)\ntoJSON(half(0.5))\ntoJSON(half(1))\ntoJSON(half(f64))\ntoJSON(i != 0.5)\ntoJSON(i != 1)\ntoJSON(i % i)\ntoJSON(i % i32)\ntoJSON(i * 0.5)\ntoJSON(i * 1)\ntoJSON(i * f32)\ntoJSON(i * i)\ntoJSON(i * i32)\ntoJSON(i ** f32)\ntoJSON(i ** i)\ntoJSON(i + 0.5)\ntoJSON(i + 1)\ntoJSON(i + i)\ntoJSON(i - 1)\ntoJSON(i - f32)\ntoJSON(i .. i)\ntoJSON(i .. i32)\ntoJSON(i / i64)\ntoJSON(i < f32)\ntoJSON(i < f64)\ntoJSON(i < i)\ntoJSON(i < i32)\ntoJSON(i <= 1)\ntoJSON(i <= f32)\ntoJSON(i <= f64)\ntoJSON(i <= i)\ntoJSON(i <= i32)\ntoJSON(i <= i64)\ntoJSON(i == 0.5)\ntoJSON(i == 1)\ntoJSON(i == i32)\ntoJSON(i == nil)\ntoJSON(i > 0.5)\ntoJSON(i > i)\ntoJSON(i > i32)\ntoJSON(i > i64)\ntoJSON(i >= f64)\ntoJSON(i >= i32)\ntoJSON(i ^ i64)\ntoJSON(i not in array)\ntoJSON(i)\ntoJSON(i) matches string(\"bar\")\ntoJSON(i32 != i)\ntoJSON(i32 != i64)\ntoJSON(i32 % 1)\ntoJSON(i32 * 0.5)\ntoJSON(i32 * i)\ntoJSON(i32 * i32)\ntoJSON(i32 * i64)\ntoJSON(i32 ** f64)\ntoJSON(i32 ** i64)\ntoJSON(i32 + 0.5)\ntoJSON(i32 + 1)\ntoJSON(i32 + f64)\ntoJSON(i32 .. i)\ntoJSON(i32 .. i64)\ntoJSON(i32 / 0.5)\ntoJSON(i32 / f32)\ntoJSON(i32 / f64)\ntoJSON(i32 / i64)\ntoJSON(i32 < 0.5)\ntoJSON(i32 < 1)\ntoJSON(i32 < i)\ntoJSON(i32 < i32)\ntoJSON(i32 <= 0.5)\ntoJSON(i32 > f64)\ntoJSON(i32 > i)\ntoJSON(i32 > i32)\ntoJSON(i32 >= f64)\ntoJSON(i32 ^ 0.5)\ntoJSON(i32 ^ f32)\ntoJSON(i32 ^ f64)\ntoJSON(i32 ^ i32)\ntoJSON(i32 in array)\ntoJSON(i32 not in array)\ntoJSON(i32)\ntoJSON(i32) contains foo.Bar\ntoJSON(i64 != 1)\ntoJSON(i64 != i)\ntoJSON(i64 != i32)\ntoJSON(i64 % i32)\ntoJSON(i64 * 0.5)\ntoJSON(i64 * f64)\ntoJSON(i64 ** f64)\ntoJSON(i64 ** i)\ntoJSON(i64 ** i32)\ntoJSON(i64 + 1)\ntoJSON(i64 - i32)\ntoJSON(i64 .. 1)\ntoJSON(i64 .. i32)\ntoJSON(i64 / f64)\ntoJSON(i64 / i)\ntoJSON(i64 / i64)\ntoJSON(i64 < 1)\ntoJSON(i64 < f64)\ntoJSON(i64 < i32)\ntoJSON(i64 <= 1)\ntoJSON(i64 <= i64)\ntoJSON(i64 == 0.5)\ntoJSON(i64 > 0.5)\ntoJSON(i64 > 1)\ntoJSON(i64 > i)\ntoJSON(i64 > i32)\ntoJSON(i64 > i64)\ntoJSON(i64 >= 1)\ntoJSON(i64 >= i)\ntoJSON(i64 >= i64)\ntoJSON(i64 ^ 0.5)\ntoJSON(i64 ^ f32)\ntoJSON(i64 ^ i32)\ntoJSON(i64 in array)\ntoJSON(i64)\ntoJSON(int(0.5))\ntoJSON(int(1))\ntoJSON(int(i))\ntoJSON(int(i32))\ntoJSON(int(i64))\ntoJSON(len(\"bar\"))\ntoJSON(len(array))\ntoJSON(len(greet(\"foo\")))\ntoJSON(len(list))\ntoJSON(list != array)\ntoJSON(list != nil)\ntoJSON(list == array)\ntoJSON(list == list)\ntoJSON(list)\ntoJSON(list[1])\ntoJSON(lower(\"bar\"))\ntoJSON(map(array, #))\ntoJSON(map(array, -#))\ntoJSON(map(array, array))\ntoJSON(map(array, false))\ntoJSON(map(array, i))\ntoJSON(map(array, i64))\ntoJSON(map(array, list))\ntoJSON(map(list, #))\ntoJSON(map(list, 0.5))\ntoJSON(map(list, 1))\ntoJSON(map(list, foo))\ntoJSON(map(list, i32))\ntoJSON(map(list, i64))\ntoJSON(map(list, list))\ntoJSON(map(list, ok))\ntoJSON(max(1))\ntoJSON(max(f32))\ntoJSON(max(f64))\ntoJSON(max(i32))\ntoJSON(mean(array))\ntoJSON(median(array))\ntoJSON(min(0.5))\ntoJSON(min(1))\ntoJSON(min(f32))\ntoJSON(min(f64))\ntoJSON(min(f64, f64))\ntoJSON(min(i))\ntoJSON(min(i32))\ntoJSON(min(i64))\ntoJSON(nil != 0.5)\ntoJSON(nil != 1)\ntoJSON(nil != add)\ntoJSON(nil != array)\ntoJSON(nil != f32)\ntoJSON(nil != false)\ntoJSON(nil != foo)\ntoJSON(nil != greet)\ntoJSON(nil != half)\ntoJSON(nil == 0.5)\ntoJSON(nil == 1)\ntoJSON(nil == div)\ntoJSON(nil == f64)\ntoJSON(nil == half)\ntoJSON(nil == i)\ntoJSON(nil == i64)\ntoJSON(nil == list)\ntoJSON(nil == nil)\ntoJSON(nil == ok)\ntoJSON(nil in array)\ntoJSON(nil) + foo.Bar\ntoJSON(none(array, ok))\ntoJSON(none(array, true))\ntoJSON(none(list, false))\ntoJSON(none(list, ok))\ntoJSON(not (\"foo\" not in foo))\ntoJSON(not (f32 != 1))\ntoJSON(not false)\ntoJSON(not ok)\ntoJSON(not true)\ntoJSON(ok != false)\ntoJSON(ok && false)\ntoJSON(ok && ok)\ntoJSON(ok == nil)\ntoJSON(ok == ok)\ntoJSON(ok ? \"foo\" : f32)\ntoJSON(ok ? 0.5 : f32)\ntoJSON(ok ? f64 : 0.5)\ntoJSON(ok ? i : false)\ntoJSON(ok ? nil : i)\ntoJSON(ok ? nil : true)\ntoJSON(ok ? true : greet)\ntoJSON(ok and ok)\ntoJSON(ok or true)\ntoJSON(ok)\ntoJSON(one(array, false))\ntoJSON(one(array, true))\ntoJSON(reduce(array, #))\ntoJSON(reduce(array, 0.5))\ntoJSON(reduce(array, array))\ntoJSON(reduce(array, foo))\ntoJSON(reduce(array, i64))\ntoJSON(reduce(array, list))\ntoJSON(reduce(array, score(i32 * i64)))\ntoJSON(reduce(list, #))\ntoJSON(reduce(list, 1))\ntoJSON(reduce(list, f32))\ntoJSON(reduce(list, false))\ntoJSON(reduce(list, i))\ntoJSON(reduce(list, i32))\ntoJSON(reduce(list, list))\ntoJSON(reduce(list, ok))\ntoJSON(reduce(list, true))\ntoJSON(round(1))\ntoJSON(round(f64))\ntoJSON(round(i32))\ntoJSON(score != score)\ntoJSON(score(1))\ntoJSON(score(1, 1))\ntoJSON(score(i))\ntoJSON(sort(array))\ntoJSON(string(\"bar\"))\ntoJSON(string(0.5))\ntoJSON(string(1))\ntoJSON(string(array))\ntoJSON(string(f32))\ntoJSON(string(f64))\ntoJSON(string(false))\ntoJSON(string(foo))\ntoJSON(string(half))\ntoJSON(string(i))\ntoJSON(string(i32))\ntoJSON(string(i64))\ntoJSON(string(list))\ntoJSON(string(nil))\ntoJSON(string(ok))\ntoJSON(string(score))\ntoJSON(string(true))\ntoJSON(sum(array))\ntoJSON(take(array, i32))\ntoJSON(toBase64(\"bar\"))\ntoJSON(toJSON(\"bar\"))\ntoJSON(toJSON(array))\ntoJSON(toJSON(f32))\ntoJSON(toJSON(f64))\ntoJSON(toJSON(false))\ntoJSON(toJSON(foo))\ntoJSON(toJSON(i))\ntoJSON(toJSON(i32))\ntoJSON(toJSON(i64))\ntoJSON(toJSON(list))\ntoJSON(toJSON(nil))\ntoJSON(toJSON(ok))\ntoJSON(trim(\"bar\"))\ntoJSON(trimPrefix(\"foo\"))\ntoJSON(trimSuffix(\"bar\"))\ntoJSON(true != true)\ntoJSON(true && ok)\ntoJSON(true == ok)\ntoJSON(true ? \"bar\" : \"bar\")\ntoJSON(true ? nil : score)\ntoJSON(true and false)\ntoJSON(true and true)\ntoJSON(true) in foo\ntoJSON(type(\"foo\"))\ntoJSON(type(add))\ntoJSON(type(array))\ntoJSON(type(f32))\ntoJSON(type(f64))\ntoJSON(type(false))\ntoJSON(type(foo))\ntoJSON(type(i))\ntoJSON(type(i32))\ntoJSON(type(i64))\ntoJSON(type(list))\ntoJSON(type(ok))\ntoJSON(type(score))\ntoJSON(type(true))\ntoJSON(upper(\"bar\"))\ntoJSON({\"bar\": 1, \"bar\": array})\ntoJSON({\"bar\": 1})\ntoJSON({\"bar\": f64})\ntoJSON({\"bar\": list})\ntoJSON({\"foo\": i})\ntoJSON({\"foo\": nil})\ntoPairs(groupBy(array, # / #))\ntoPairs(groupBy(array, #))\ntoPairs(groupBy(array, 0.5))\ntoPairs(groupBy(array, 1))\ntoPairs(groupBy(array, false))\ntoPairs(groupBy(array, foo))\ntoPairs(groupBy(array, i))\ntoPairs(groupBy(array, i32))\ntoPairs(groupBy(array, ok))\ntoPairs(groupBy(array, true))\ntoPairs(groupBy(list, #))\ntoPairs(groupBy(list, 1))\ntoPairs(groupBy(list, f32))\ntoPairs(groupBy(list, i))\ntoPairs(groupBy(list, ok))\ntoPairs({\"bar\": f32})\ntoPairs({\"foo\": i32, \"bar\": score})\ntoPairs({\"foo\": nil})\ntrim(\"bar\") not in foo\ntrim(false ? \"bar\" : \"bar\")\ntrim(foo.Bar)\ntrim(foo.String())\ntrim(foo?.Bar)\ntrim(foo?.String())\ntrim(greet(\"bar\"))\ntrim(greet(\"foo\"))\ntrim(lower(\"bar\"))\ntrim(lower(\"foo\"))\ntrim(reduce(list, \"bar\"))\ntrim(string(\"bar\"))\ntrim(string(-f64))\ntrim(string(0.5))\ntrim(string(1))\ntrim(string(add))\ntrim(string(array))\ntrim(string(f32))\ntrim(string(foo))\ntrim(string(i64))\ntrim(string(list))\ntrim(string(nil))\ntrim(toJSON(\"bar\"))\ntrim(toJSON(1))\ntrim(toJSON(f32))\ntrim(toJSON(false))\ntrim(toJSON(foo))\ntrim(toJSON(i32))\ntrim(toJSON(i64))\ntrim(toJSON(ok))\ntrim(toJSON(true))\ntrim(trim(\"bar\"))\ntrim(trimPrefix(\"foo\"))\ntrim(trimSuffix(\"bar\"))\ntrim(true ? \"foo\" : greet)\ntrim(type(\"bar\"))\ntrim(type(\"foo\"))\ntrim(type(0.5))\ntrim(type(1))\ntrim(type(add))\ntrim(type(div))\ntrim(type(f32))\ntrim(type(f64))\ntrim(type(greet))\ntrim(type(i))\ntrim(type(list))\ntrim(type(nil))\ntrim(type(ok))\ntrim(type(score))\ntrim(type(true))\ntrimPrefix(\"bar\" + \"foo\")\ntrimPrefix(\"foo\" + \"bar\")\ntrimPrefix(false ? 1 : \"bar\")\ntrimPrefix(foo.Bar)\ntrimPrefix(foo.String())\ntrimPrefix(foo?.Bar)\ntrimPrefix(foo?.String())\ntrimPrefix(greet(\"bar\"))\ntrimPrefix(greet(\"foo\"))\ntrimPrefix(greet(type(0.5)))\ntrimPrefix(lower(\"bar\"))\ntrimPrefix(string(\"foo\"))\ntrimPrefix(string(0.5))\ntrimPrefix(string(1))\ntrimPrefix(string(add))\ntrimPrefix(string(array))\ntrimPrefix(string(div))\ntrimPrefix(string(f32))\ntrimPrefix(string(f64))\ntrimPrefix(string(foo))\ntrimPrefix(string(greet))\ntrimPrefix(string(half))\ntrimPrefix(string(i))\ntrimPrefix(string(i32))\ntrimPrefix(string(i64))\ntrimPrefix(string(nil))\ntrimPrefix(string(score))\ntrimPrefix(string(true))\ntrimPrefix(string({\"bar\": greet}))\ntrimPrefix(toBase64(\"bar\"))\ntrimPrefix(toJSON(\"foo\"))\ntrimPrefix(toJSON(1))\ntrimPrefix(toJSON(array))\ntrimPrefix(toJSON(f32))\ntrimPrefix(toJSON(foo))\ntrimPrefix(toJSON(i32))\ntrimPrefix(toJSON(i64))\ntrimPrefix(toJSON(list))\ntrimPrefix(toJSON(nil))\ntrimPrefix(toJSON(true))\ntrimPrefix(trimPrefix(\"foo\"))\ntrimPrefix(type(\"bar\"))\ntrimPrefix(type(0.5))\ntrimPrefix(type(1))\ntrimPrefix(type(array))\ntrimPrefix(type(f32))\ntrimPrefix(type(f64))\ntrimPrefix(type(greet))\ntrimPrefix(type(half))\ntrimPrefix(type(i))\ntrimPrefix(type(i32))\ntrimPrefix(type(i64))\ntrimPrefix(type(list))\ntrimPrefix(type(nil))\ntrimPrefix(type(ok))\ntrimPrefix(type(true))\ntrimPrefix(upper(\"bar\"))\ntrimPrefix(upper(\"foo\"))\ntrimSuffix(\"bar\" + \"foo\")\ntrimSuffix(\"bar\") not contains reduce(list, \"bar\")\ntrimSuffix(\"foo\" + \"bar\")\ntrimSuffix(false ? i64 : \"foo\")\ntrimSuffix(foo.Bar)\ntrimSuffix(foo.String())\ntrimSuffix(foo?.Bar)\ntrimSuffix(foo?.String())\ntrimSuffix(greet(\"bar\"))\ntrimSuffix(greet(\"foo\"))\ntrimSuffix(lower(\"bar\"))\ntrimSuffix(reduce(array, \"foo\"))\ntrimSuffix(reduce(list, #)?.Bar)\ntrimSuffix(string(\"bar\"))\ntrimSuffix(string(\"foo\"))\ntrimSuffix(string(0.5))\ntrimSuffix(string(add))\ntrimSuffix(string(array))\ntrimSuffix(string(div))\ntrimSuffix(string(f64))\ntrimSuffix(string(false))\ntrimSuffix(string(foo))\ntrimSuffix(string(half))\ntrimSuffix(string(i))\ntrimSuffix(string(i32))\ntrimSuffix(string(i64))\ntrimSuffix(string(list))\ntrimSuffix(string(nil))\ntrimSuffix(string(ok))\ntrimSuffix(string(true))\ntrimSuffix(toBase64(\"bar\"))\ntrimSuffix(toBase64(\"foo\"))\ntrimSuffix(toJSON(1 > f64))\ntrimSuffix(toJSON(1))\ntrimSuffix(toJSON(f32))\ntrimSuffix(toJSON(f64))\ntrimSuffix(toJSON(false))\ntrimSuffix(toJSON(foo))\ntrimSuffix(toJSON(i))\ntrimSuffix(toJSON(i32))\ntrimSuffix(toJSON(i64))\ntrimSuffix(toJSON(list))\ntrimSuffix(toJSON(nil))\ntrimSuffix(toJSON(true))\ntrimSuffix(trim(\"bar\"))\ntrimSuffix(trim(\"foo\"))\ntrimSuffix(trimPrefix(\"bar\"))\ntrimSuffix(trimPrefix(\"foo\"))\ntrimSuffix(trimSuffix(\"bar\"))\ntrimSuffix(type(1))\ntrimSuffix(type(add))\ntrimSuffix(type(array))\ntrimSuffix(type(div))\ntrimSuffix(type(f32))\ntrimSuffix(type(foo))\ntrimSuffix(type(greet))\ntrimSuffix(type(half))\ntrimSuffix(type(i32))\ntrimSuffix(type(list))\ntrimSuffix(type(nil))\ntrimSuffix(type(ok))\ntrimSuffix(upper(\"foo\"))\ntrue != nil || true == true\ntrue != ok != ok\ntrue == ok == ok\ntrue ? 0.5 : i <= f32\ntrue ? 1 : foo?.Bar\ntrue ? 1 : ok or i64 == 0.5\ntrue ? add : foo?.Bar\ntrue ? array : 0.5 >= i32\ntrue ? array : foo.String\ntrue ? array : foo?.Bar\ntrue ? array : foo?.String\ntrue ? array : i32 ** f64\ntrue ? div : i64 ** 1 ^ i32\ntrue ? false : 0.5 > i\ntrue ? false : foo.Qux\ntrue ? foo : 0.5 + -1\ntrue ? foo : foo.Bar\ntrue ? foo : i64 / f32\ntrue ? greet : foo.Bar\ntrue ? greet : ok == ok\ntrue ? half : 0.5 / i32\ntrue ? half : foo.String\ntrue ? i : 1 * i64\ntrue ? i32 : i32 - f32\ntrue ? i32 : i32 >= f32\ntrue ? i64 : f64 != i\ntrue ? list : f32 != i\ntrue ? nil : foo.String\ntrue ? nil : foo?.String\ntrue ? nil : i32 != f64 + 1\ntrue ? ok : foo.Qux\ntrue ? ok : foo?.String\ntrue ? score : ok or f64 < f32\ntrue and nil not in list\ntrue and ok or ok\ntrue and true || ok\ntrue or 0.5 not in array\ntrue || f32 not in groupBy(list, #)\ntrue || false ? half : half\ntype(!false)\ntype(!ok)\ntype(!true)\ntype(\"bar\" != \"bar\")\ntype(\"bar\" < \"foo\")\ntype(\"bar\" <= \"bar\")\ntype(\"bar\" == \"foo\")\ntype(\"bar\" >= \"bar\")\ntype(\"bar\" not endsWith \"foo\")\ntype(\"bar\" startsWith \"bar\")\ntype(\"bar\") startsWith greet(\"bar\")\ntype(\"foo\" != nil)\ntype(\"foo\" + \"bar\")\ntype(\"foo\" not startsWith \"bar\")\ntype(\"foo\") not in foo\ntype(-0.5)\ntype(-1)\ntype(-f32)\ntype(-f64)\ntype(-i)\ntype(-i32)\ntype(-i64)\ntype(-int(f64))\ntype(0.5 != f64)\ntype(0.5 != i32)\ntype(0.5 != nil)\ntype(0.5 * 0.5)\ntype(0.5 * f32)\ntype(0.5 * f64)\ntype(0.5 * i64)\ntype(0.5 ** 0.5)\ntype(0.5 ** 1)\ntype(0.5 ** f32)\ntype(0.5 ** f64)\ntype(0.5 ** i)\ntype(0.5 ** i32)\ntype(0.5 + 0.5)\ntype(0.5 + 1)\ntype(0.5 + f32)\ntype(0.5 + f64)\ntype(0.5 + i)\ntype(0.5 + i64)\ntype(0.5 - 1)\ntype(0.5 - f64)\ntype(0.5 - i32)\ntype(0.5 / 1)\ntype(0.5 / f32)\ntype(0.5 / i)\ntype(0.5 / i32)\ntype(0.5 / i64)\ntype(0.5 < 1)\ntype(0.5 < f32)\ntype(0.5 < i32)\ntype(0.5 < i64)\ntype(0.5 <= 1)\ntype(0.5 <= f32)\ntype(0.5 <= i64)\ntype(0.5 == 0.5)\ntype(0.5 == f32)\ntype(0.5 == f64)\ntype(0.5 == i32)\ntype(0.5 > 0.5)\ntype(0.5 > f32)\ntype(0.5 > i)\ntype(0.5 > i32)\ntype(0.5 > i64)\ntype(0.5 >= 0.5)\ntype(0.5 >= i)\ntype(0.5 >= i32)\ntype(0.5 ^ 0.5)\ntype(0.5 ^ i)\ntype(0.5 ^ i32)\ntype(0.5 ^ i64)\ntype(0.5 not in array)\ntype(0.5) in foo\ntype(1 != i32)\ntype(1 != nil)\ntype(1 % 1)\ntype(1 % i)\ntype(1 * 0.5)\ntype(1 * f32)\ntype(1 * i)\ntype(1 * i32)\ntype(1 ** 0.5)\ntype(1 ** f64)\ntype(1 ** i)\ntype(1 ** i64)\ntype(1 + 0.5)\ntype(1 + 1)\ntype(1 + f32)\ntype(1 + i64)\ntype(1 - 0.5)\ntype(1 - 1)\ntype(1 - i64)\ntype(1 .. 1)\ntype(1 .. i64)\ntype(1 / f64)\ntype(1 / i)\ntype(1 < i32)\ntype(1 < i64)\ntype(1 <= 0.5)\ntype(1 <= 1)\ntype(1 <= f64)\ntype(1 <= i)\ntype(1 == f32)\ntype(1 == f64)\ntype(1 == i)\ntype(1 == i32)\ntype(1 == i64)\ntype(1 > i)\ntype(1 >= 0.5)\ntype(1 >= i)\ntype(1 >= i64)\ntype(1 ^ 1)\ntype(1 ^ i)\ntype(1 ^ i64)\ntype(1) endsWith foo.Bar\ntype(1) in reduce(list, #)\ntype(1) not endsWith \"bar\" ? i64 : nil\ntype(1) not startsWith string(0.5)\ntype([div])\ntype([f32])\ntype(abs(0.5))\ntype(abs(f32))\ntype(abs(f64))\ntype(abs(i))\ntype(abs(i32))\ntype(abs(i64))\ntype(add)\ntype(all(array, ok))\ntype(all(list, ok))\ntype(all(list, true))\ntype(any(array, false))\ntype(any(array, ok))\ntype(any(list, false))\ntype(array != list)\ntype(array != nil)\ntype(array == array)\ntype(array)\ntype(array) >= trimPrefix(\"foo\")\ntype(array[1])\ntype(array[i32])\ntype(array[i])\ntype(bitand(1, i))\ntype(bitnot(i))\ntype(bitnot(i32))\ntype(bitnot(i64))\ntype(bitxor(i64, 1))\ntype(ceil(0.5))\ntype(ceil(f32))\ntype(ceil(f64))\ntype(ceil(i64))\ntype(count(array, true))\ntype(div != div)\ntype(div == div)\ntype(div)\ntype(f32 != 0.5)\ntype(f32 != 1)\ntype(f32 * 1)\ntype(f32 * i)\ntype(f32 * i32)\ntype(f32 ** f32)\ntype(f32 + 1)\ntype(f32 + i)\ntype(f32 - f32)\ntype(f32 - i32)\ntype(f32 / 1)\ntype(f32 / f32)\ntype(f32 < 1)\ntype(f32 < f32)\ntype(f32 <= f64)\ntype(f32 == 0.5)\ntype(f32 == f64)\ntype(f32 == i)\ntype(f32 == i32)\ntype(f32 == i64)\ntype(f32 > 1)\ntype(f32 >= f32)\ntype(f32 >= i)\ntype(f32 >= i32)\ntype(f32 ^ i64)\ntype(f32 not in array)\ntype(f32)\ntype(f64 != 0.5)\ntype(f64 != i)\ntype(f64 * 0.5)\ntype(f64 * 1)\ntype(f64 * f32)\ntype(f64 ** 1)\ntype(f64 + f32)\ntype(f64 + i32)\ntype(f64 - 0.5)\ntype(f64 - 1)\ntype(f64 - f64)\ntype(f64 - i)\ntype(f64 / 1)\ntype(f64 / f32)\ntype(f64 / i64)\ntype(f64 < 0.5)\ntype(f64 < f32)\ntype(f64 < f64)\ntype(f64 < i32)\ntype(f64 < i64)\ntype(f64 <= 0.5)\ntype(f64 <= f64)\ntype(f64 <= i64)\ntype(f64 == 0.5)\ntype(f64 == f32)\ntype(f64 == i64)\ntype(f64 == nil)\ntype(f64 > i)\ntype(f64 > i32)\ntype(f64 >= 0.5)\ntype(f64 >= i)\ntype(f64 ^ 0.5)\ntype(f64 not in array)\ntype(f64)\ntype(false != nil)\ntype(false != ok)\ntype(false && true)\ntype(false ? \"bar\" : score)\ntype(false ? div : f64)\ntype(false ? half : greet)\ntype(false ? true : foo)\ntype(false || true)\ntype(false) startsWith \"bar\" ? ok : f32\ntype(find(array, false))\ntype(find(array, true))\ntype(find(list, true))\ntype(findIndex(array, ok))\ntype(findLast(array, false))\ntype(findLast(array, ok))\ntype(findLastIndex(array, false))\ntype(findLastIndex(list, false))\ntype(findLastIndex(list, ok))\ntype(findLastIndex(list, true))\ntype(first(list))\ntype(float(f32))\ntype(float(i32))\ntype(floor(0.5))\ntype(floor(1))\ntype(floor(f64))\ntype(floor(i64))\ntype(foo != foo)\ntype(foo != nil)\ntype(foo in list)\ntype(foo)\ntype(foo.Bar)\ntype(foo.Qux)\ntype(foo.String())\ntype(foo.String)\ntype(foo?.Bar)\ntype(foo?.Qux)\ntype(foo?.String())\ntype(foo?.String)\ntype(get(array, 1))\ntype(get(array, i64))\ntype(get(list, 1))\ntype(get(list, i))\ntype(get(list, i32))\ntype(get(list, i64))\ntype(greet(\"bar\"))\ntype(greet(\"foo\"))\ntype(greet)\ntype(groupBy(array, #))\ntype(groupBy(array, #).score)\ntype(groupBy(array, 0.5))\ntype(groupBy(array, false)?.add)\ntype(groupBy(array, i))\ntype(groupBy(array, i32))\ntype(groupBy(array, i64))\ntype(groupBy(list, \"bar\"))\ntype(groupBy(list, #))\ntype(groupBy(list, #)?.Bar)\ntype(groupBy(list, 1))\ntype(groupBy(list, i64))\ntype(groupBy(list, true))\ntype(half(0.5))\ntype(half(1))\ntype(half(f64))\ntype(half)\ntype(half) not in foo\ntype(i % 1)\ntype(i % i32)\ntype(i * 0.5)\ntype(i * i32)\ntype(i ** f32)\ntype(i ** f64)\ntype(i ** i)\ntype(i + i32)\ntype(i - 0.5)\ntype(i - 1)\ntype(i - i)\ntype(i - i64)\ntype(i .. i)\ntype(i / 0.5)\ntype(i / i32)\ntype(i < 0.5)\ntype(i < 1)\ntype(i <= 0.5)\ntype(i <= 1)\ntype(i == 1)\ntype(i > 0.5)\ntype(i > 1)\ntype(i > f32)\ntype(i > i64)\ntype(i >= i32)\ntype(i ^ 1)\ntype(i ^ i)\ntype(i ^ i32)\ntype(i ^ i64)\ntype(i)\ntype(i) + foo.Bar\ntype(i32 != 1)\ntype(i32 != f64)\ntype(i32 * 0.5)\ntype(i32 * i)\ntype(i32 ** 0.5)\ntype(i32 ** f64)\ntype(i32 ** i)\ntype(i32 + 1)\ntype(i32 - 1)\ntype(i32 .. i32)\ntype(i32 / 0.5)\ntype(i32 / f64)\ntype(i32 < 0.5)\ntype(i32 <= 0.5)\ntype(i32 <= f64)\ntype(i32 <= i32)\ntype(i32 == 1)\ntype(i32 == nil)\ntype(i32 > 0.5)\ntype(i32 > f64)\ntype(i32 > i64)\ntype(i32 >= 1)\ntype(i32 >= f32)\ntype(i32 >= i64)\ntype(i32 ^ 1)\ntype(i32 ^ f32)\ntype(i32 ^ f64)\ntype(i32 ^ i)\ntype(i32 not in array)\ntype(i32)\ntype(i32) in foo\ntype(i32) not matches trim(\"foo\")\ntype(i64 != 1)\ntype(i64 != f64)\ntype(i64 % 1)\ntype(i64 * f32)\ntype(i64 * i64)\ntype(i64 ** 0.5)\ntype(i64 ** f64)\ntype(i64 ** i32)\ntype(i64 + 0.5)\ntype(i64 + 1)\ntype(i64 + i64)\ntype(i64 - 0.5)\ntype(i64 - f32)\ntype(i64 - f64)\ntype(i64 - i32)\ntype(i64 .. i32)\ntype(i64 / 0.5)\ntype(i64 / f32)\ntype(i64 / i64)\ntype(i64 < 0.5)\ntype(i64 < f32)\ntype(i64 < f64)\ntype(i64 < i)\ntype(i64 < i64)\ntype(i64 <= 0.5)\ntype(i64 <= 1)\ntype(i64 <= f32)\ntype(i64 <= i)\ntype(i64 == 1)\ntype(i64 == f64)\ntype(i64 > i64)\ntype(i64 >= 1)\ntype(i64 ^ f64)\ntype(i64 ^ i)\ntype(i64 not in array)\ntype(i64)\ntype(int(0.5))\ntype(int(f32))\ntype(int(f64))\ntype(int(i))\ntype(int(i32))\ntype(int(i64))\ntype(last(array))\ntype(last(list))\ntype(len(array))\ntype(len(list))\ntype(list != nil)\ntype(list == array)\ntype(list == nil)\ntype(list)\ntype(list[1])\ntype(list[i32])\ntype(list[i64])\ntype(list[i])\ntype(map(array, \"bar\"))\ntype(map(array, \"foo\"))\ntype(map(array, #))\ntype(map(array, 1))\ntype(map(array, div))\ntype(map(array, f32))\ntype(map(array, foo))\ntype(map(array, greet))\ntype(map(array, ok))\ntype(map(array, true))\ntype(map(list, \"bar\"))\ntype(map(list, #))\ntype(map(list, array))\ntype(map(list, greet))\ntype(map(list, i64))\ntype(map(list, list))\ntype(map(list, ok))\ntype(max(0.5))\ntype(max(0.5, f64))\ntype(max(1))\ntype(max(1, i32))\ntype(max(f64))\ntype(max(i64))\ntype(median(array))\ntype(min(1))\ntype(min(f32))\ntype(min(i))\ntype(min(i32))\ntype(min(i64))\ntype(nil != \"foo\")\ntype(nil != 0.5)\ntype(nil != 1)\ntype(nil != greet)\ntype(nil != half)\ntype(nil != i32)\ntype(nil != i64)\ntype(nil != nil)\ntype(nil != score)\ntype(nil == \"foo\")\ntype(nil == array)\ntype(nil == f32)\ntype(nil == false)\ntype(nil == foo)\ntype(nil == greet)\ntype(nil == nil)\ntype(nil == score)\ntype(nil in array)\ntype(nil in list)\ntype(nil not in array)\ntype(nil not in list)\ntype(none(list, ok))\ntype(none(list, true))\ntype(not (f64 <= i))\ntype(not false)\ntype(not ok)\ntype(not true)\ntype(ok != false)\ntype(ok != nil)\ntype(ok != true)\ntype(ok && false)\ntype(ok == nil)\ntype(ok ? \"bar\" : half)\ntype(ok ? 1 : \"bar\")\ntype(ok ? array : i64)\ntype(ok ? array : score)\ntype(ok ? i : \"bar\")\ntype(ok ? i : nil)\ntype(ok ? nil : 0.5)\ntype(ok ? nil : div)\ntype(ok and ok)\ntype(ok or false)\ntype(ok || false)\ntype(ok)\ntype(one(array, false))\ntype(one(array, true))\ntype(one(list, false))\ntype(one(list, true))\ntype(reduce(array, \"bar\"))\ntype(reduce(array, #))\ntype(reduce(array, 1))\ntype(reduce(array, foo))\ntype(reduce(array, greet))\ntype(reduce(array, i))\ntype(reduce(array, ok))\ntype(reduce(list, \"foo\"))\ntype(reduce(list, #))\ntype(reduce(list, array))\ntype(reduce(list, i64))\ntype(reduce(list, ok))\ntype(round(0.5))\ntype(round(1))\ntype(round(f64))\ntype(round(i))\ntype(round(i64))\ntype(score != score)\ntype(score == nil)\ntype(score(1))\ntype(score(1, 1))\ntype(score(i))\ntype(score)\ntype(sort(array))\ntype(string(0.5))\ntype(string(1))\ntype(string(add))\ntype(string(div))\ntype(string(f32))\ntype(string(f64))\ntype(string(false))\ntype(string(greet))\ntype(string(i32))\ntype(string(i64))\ntype(string(list))\ntype(string(nil))\ntype(string(ok))\ntype(string(score))\ntype(toBase64(\"bar\"))\ntype(toJSON(\"bar\"))\ntype(toJSON(\"foo\"))\ntype(toJSON(0.5))\ntype(toJSON(1))\ntype(toJSON(array))\ntype(toJSON(false))\ntype(toJSON(i))\ntype(toJSON(i32))\ntype(toJSON(i64))\ntype(toJSON(list))\ntype(toJSON(nil))\ntype(trim(\"foo\"))\ntype(trimPrefix(\"bar\"))\ntype(true != nil)\ntype(true == false)\ntype(true == nil)\ntype(true ? array : false)\ntype(true ? array : half)\ntype(true ? div : add)\ntype(true ? f64 : i32)\ntype(true ? ok : 1)\ntype(true and false)\ntype(true and true)\ntype(true or true)\ntype(true || ok)\ntype(true || true)\ntype(true) in foo\ntype(true) matches string(list)\ntype(type(0.5))\ntype(type(1))\ntype(type(add))\ntype(type(div))\ntype(type(foo))\ntype(type(greet))\ntype(type(half))\ntype(type(i))\ntype(type(i32))\ntype(type(i64))\ntype(type(nil))\ntype(type(ok))\ntype(type(true))\ntype(upper(\"foo\"))\ntype({\"bar\": 1})\ntype({\"bar\": array})\ntype({\"foo\": \"foo\"})\ntype({\"foo\": f64})\ntype({\"foo\": false, \"foo\": foo}.Bar)\nupper(\"bar\") not in foo\nupper(\"foo\" + \"foo\")\nupper(\"foo\") == toJSON(\"bar\")\nupper(foo.Bar)\nupper(foo.String())\nupper(foo?.Bar)\nupper(foo?.String())\nupper(greet(\"bar\"))\nupper(greet(\"foo\"))\nupper(last(list).Bar)\nupper(lower(\"bar\"))\nupper(lower(\"foo\"))\nupper(reduce(list, #)?.Bar)\nupper(string(\"foo\"))\nupper(string(0.5))\nupper(string(1))\nupper(string(add))\nupper(string(array))\nupper(string(f32))\nupper(string(i32))\nupper(string(i64))\nupper(string(list))\nupper(string(nil))\nupper(string(score))\nupper(string(true))\nupper(toBase64(\"bar\"))\nupper(toBase64(\"foo\"))\nupper(toJSON(\"foo\"))\nupper(toJSON(1))\nupper(toJSON(f32))\nupper(toJSON(false))\nupper(toJSON(foo))\nupper(toJSON(i))\nupper(toJSON(i32))\nupper(toJSON(list))\nupper(toJSON(nil))\nupper(toJSON(true))\nupper(trim(\"bar\"))\nupper(trim(\"foo\"))\nupper(trimSuffix(\"bar\"))\nupper(trimSuffix(\"foo\"))\nupper(type(\"bar\"))\nupper(type(\"foo\"))\nupper(type(array))\nupper(type(div))\nupper(type(f32))\nupper(type(foo.Bar))\nupper(type(greet))\nupper(type(i))\nupper(type(i32))\nupper(type(list))\nupper(type(nil))\nupper(type(ok))\nupper(type(score))\nupper(type(true))\nupper(upper(\"foo\"))\nvalues(groupBy(array, \"bar\"))\nvalues(groupBy(array, \"foo\"))\nvalues(groupBy(array, #))\nvalues(groupBy(array, 0.5))\nvalues(groupBy(array, 1))\nvalues(groupBy(array, foo))\nvalues(groupBy(array, i))\nvalues(groupBy(list, #))\nvalues(groupBy(list, 1))\nvalues(groupBy(list, i))\nvalues(groupBy(list, i32))\nvalues(groupBy(list, true))\nvalues({\"bar\": \"bar\"})\nvalues({\"bar\": array})\nvalues({\"foo\": add, \"bar\": div})\nvalues({\"foo\": ok})\n{\"bar\": \"bar\" <= \"foo\"}\n{\"bar\": \"bar\", \"bar\": half}.add\n{\"bar\": \"bar\", \"bar\": i}.Qux\n{\"bar\": \"bar\", \"bar\": i}.String\n{\"bar\": \"bar\", \"foo\": 0.5}.i64\n{\"bar\": \"bar\", \"foo\": i64}?.Qux\n{\"bar\": \"bar\", \"foo\": score}.f32\n{\"bar\": \"bar\"}.String?.foo\n{\"bar\": \"bar\"}.array\n{\"bar\": \"bar\"}.f64\n{\"bar\": \"bar\"}.greet\n{\"bar\": \"bar\"}.list\n{\"bar\": \"bar\"}.ok\n{\"bar\": \"bar\"}?.Qux\n{\"bar\": \"bar\"}?.array\n{\"bar\": \"bar\"}?.half\n{\"bar\": \"bar\"}?.list\n{\"bar\": \"foo\", \"bar\": div}.half\n{\"bar\": \"foo\", \"foo\": f32}.String\n{\"bar\": \"foo\", \"foo\": i64}.ok?.f64\n{\"bar\": \"foo\", \"foo\": ok}?.i64\n{\"bar\": \"foo\"}.Bar\n{\"bar\": \"foo\"}.f32\n{\"bar\": \"foo\"}.foo\n{\"bar\": \"foo\"}.half\n{\"bar\": \"foo\"}.i\n{\"bar\": \"foo\"}.i64\n{\"bar\": \"foo\"}?.String\n{\"bar\": \"foo\"}?.f32\n{\"bar\": \"foo\"}?.foo\n{\"bar\": \"foo\"}?.greet\n{\"bar\": \"foo\"}?.i\n{\"bar\": \"foo\"}?.i32\n{\"bar\": \"foo\"}?.i?.String()\n{\"bar\": \"foo\"}?.list\n{\"bar\": \"foo\"}?.ok\n{\"bar\": -0.5}\n{\"bar\": -f32}\n{\"bar\": -f64}\n{\"bar\": -i32}\n{\"bar\": 0.5 != nil}\n{\"bar\": 0.5 * 1}.foo\n{\"bar\": 0.5, \"bar\": 0.5}.half\n{\"bar\": 0.5, \"bar\": add, \"foo\": i32}.list\n{\"bar\": 0.5, \"bar\": i}?.add\n{\"bar\": 0.5, \"bar\": list}?.div\n{\"bar\": 0.5, \"bar\": nil, \"bar\": nil}.i32\n{\"bar\": 0.5, \"bar\": ok, \"foo\": 1}?.String\n{\"bar\": 0.5, \"bar\": true}.score\n{\"bar\": 0.5, \"foo\": 0.5}?.f32\n{\"bar\": 0.5, \"foo\": array}?.list\n{\"bar\": 0.5, \"foo\": f32}.i32?.Bar\n{\"bar\": 0.5, \"foo\": ok}?.array\n{\"bar\": 0.5}.Qux\n{\"bar\": 0.5}.String\n{\"bar\": 0.5}.add\n{\"bar\": 0.5}.array\n{\"bar\": 0.5}.f32\n{\"bar\": 0.5}.f64\n{\"bar\": 0.5}.half\n{\"bar\": 0.5}.i\n{\"bar\": 0.5}.i32\n{\"bar\": 0.5}.i64\n{\"bar\": 0.5}.ok\n{\"bar\": 0.5}?.Bar\n{\"bar\": 0.5}?.Qux\n{\"bar\": 0.5}?.String\n{\"bar\": 0.5}?.div\n{\"bar\": 0.5}?.foo\n{\"bar\": 0.5}?.greet\n{\"bar\": 0.5}?.half\n{\"bar\": 0.5}?.i\n{\"bar\": 0.5}?.i32\n{\"bar\": 0.5}?.i64\n{\"bar\": 0.5}?.list\n{\"bar\": 0.5}?.score\n{\"bar\": 1 * i}\n{\"bar\": 1 ** 0.5}\n{\"bar\": 1 / 0.5}\n{\"bar\": 1 / f32}\n{\"bar\": 1 ^ 1}\n{\"bar\": 1, \"bar\": add, \"foo\": \"bar\"}?.add\n{\"bar\": 1, \"bar\": add}.div\n{\"bar\": 1, \"bar\": f32}?.Bar\n{\"bar\": 1, \"bar\": f64, \"foo\": array}.ok\n{\"bar\": 1, \"foo\": \"bar\"}.half\n{\"bar\": 1, \"foo\": array, \"bar\": score}?.i\n{\"bar\": 1, \"foo\": i}?.list\n{\"bar\": 1, \"foo\": i}?.ok\n{\"bar\": 1, \"foo\": ok}?.f32\n{\"bar\": 1, \"foo\": score}.f64\n{\"bar\": 1}.String\n{\"bar\": 1}.add\n{\"bar\": 1}.f32\n{\"bar\": 1}.foo\n{\"bar\": 1}.greet\n{\"bar\": 1}.half\n{\"bar\": 1}.i\n{\"bar\": 1}.i32\n{\"bar\": 1}.list\n{\"bar\": 1}.score\n{\"bar\": 1}?.Qux\n{\"bar\": 1}?.add\n{\"bar\": 1}?.div\n{\"bar\": 1}?.f32\n{\"bar\": 1}?.f64\n{\"bar\": 1}?.i\n{\"bar\": 1}?.i32\n{\"bar\": 1}?.i64\n{\"bar\": 1}?.list\n{\"bar\": 1}?.ok\n{\"bar\": add, \"bar\": half}.div\n{\"bar\": add, \"bar\": i, \"bar\": ok}?.foo\n{\"bar\": add, \"bar\": list}\n{\"bar\": add, \"bar\": ok, \"foo\": 1}?.ok\n{\"bar\": add, \"foo\": \"foo\"}?.f64\n{\"bar\": add}\n{\"bar\": add}.Qux\n{\"bar\": add}.String\n{\"bar\": add}.add\n{\"bar\": add}.array\n{\"bar\": add}.div\n{\"bar\": add}.half\n{\"bar\": add}?.Qux\n{\"bar\": add}?.String\n{\"bar\": add}?.add\n{\"bar\": add}?.array\n{\"bar\": add}?.div\n{\"bar\": add}?.f64\n{\"bar\": add}?.f64 != half\n{\"bar\": add}?.half\n{\"bar\": add}?.ok\n{\"bar\": add}?.score?.div\n{\"bar\": array, \"bar\": \"bar\"}?.i\n{\"bar\": array, \"bar\": array}?.foo\n{\"bar\": array, \"bar\": f32}\n{\"bar\": array, \"bar\": nil}.i64\n{\"bar\": array, \"foo\": f32}?.String\n{\"bar\": array, \"foo\": f64}\n{\"bar\": array, \"foo\": half}?.add\n{\"bar\": array, \"foo\": i32}\n{\"bar\": array, \"foo\": score}\n{\"bar\": array}\n{\"bar\": array}.Bar\n{\"bar\": array}.div\n{\"bar\": array}.div?.Qux\n{\"bar\": array}.greet\n{\"bar\": array}.i\n{\"bar\": array}.i64\n{\"bar\": array}.list\n{\"bar\": array}.score\n{\"bar\": array}?.add?.ok\n{\"bar\": array}?.div\n{\"bar\": array}?.f64\n{\"bar\": array}?.greet\n{\"bar\": array}?.half\n{\"bar\": array}?.i64\n{\"bar\": array}?.ok\n{\"bar\": div, \"bar\": array, \"bar\": 0.5}.i64\n{\"bar\": div, \"bar\": div}?.f32\n{\"bar\": div, \"bar\": foo}.foo\n{\"bar\": div, \"bar\": ok}\n{\"bar\": div, \"foo\": 1, \"bar\": ok}.Qux\n{\"bar\": div, \"foo\": false}?.String\n{\"bar\": div, \"foo\": foo, \"foo\": score}.Bar\n{\"bar\": div, \"foo\": greet}.i\n{\"bar\": div, \"foo\": greet}?.ok\n{\"bar\": div, \"foo\": score}\n{\"bar\": div}\n{\"bar\": div}.array\n{\"bar\": div}.f32\n{\"bar\": div}.f64\n{\"bar\": div}.i64?.Qux\n{\"bar\": div}.list\n{\"bar\": div}.ok\n{\"bar\": div}?.Bar\n{\"bar\": div}?.array\n{\"bar\": div}?.f64\n{\"bar\": div}?.greet\n{\"bar\": div}?.half\n{\"bar\": div}?.list\n{\"bar\": div}?.ok\n{\"bar\": div}?.score\n{\"bar\": f32 ** i}\n{\"bar\": f32 - 0.5}\n{\"bar\": f32 >= 0.5}\n{\"bar\": f32 ^ 1}\n{\"bar\": f32, \"bar\": \"foo\"}.add\n{\"bar\": f32, \"bar\": false}?.Bar\n{\"bar\": f32, \"bar\": true}?.String\n{\"bar\": f32, \"foo\": add, \"foo\": false}?.String\n{\"bar\": f32, \"foo\": f32}.ok\n{\"bar\": f32, \"foo\": f64}\n{\"bar\": f32, \"foo\": half, \"foo\": ok}\n{\"bar\": f32, \"foo\": half}\n{\"bar\": f32, \"foo\": list}?.f32\n{\"bar\": f32, \"foo\": nil}?.f64?.foo\n{\"bar\": f32}\n{\"bar\": f32}.Qux\n{\"bar\": f32}.div\n{\"bar\": f32}.f64\n{\"bar\": f32}.greet\n{\"bar\": f32}.i\n{\"bar\": f32}.i32\n{\"bar\": f32}.i64\n{\"bar\": f32}?.Bar\n{\"bar\": f32}?.String\n{\"bar\": f32}?.array\n{\"bar\": f32}?.f64\n{\"bar\": f32}?.half\n{\"bar\": f32}?.list\n{\"bar\": f64 + 1}\n{\"bar\": f64 == i32}\n{\"bar\": f64 > 0.5}\n{\"bar\": f64 ^ i32}\n{\"bar\": f64, \"bar\": \"bar\"}.i\n{\"bar\": f64, \"bar\": foo}?.i\n{\"bar\": f64, \"bar\": i64}?.i64\n{\"bar\": f64, \"bar\": i}.f64\n{\"bar\": f64, \"bar\": true}?.i\n{\"bar\": f64, \"foo\": 0.5, \"foo\": score}.ok\n{\"bar\": f64, \"foo\": 1}.f32\n{\"bar\": f64, \"foo\": f64}?.score\n{\"bar\": f64, \"foo\": i}?.Qux?.f64\n{\"bar\": f64}\n{\"bar\": f64}.array\n{\"bar\": f64}.f32?.Bar\n{\"bar\": f64}.f64\n{\"bar\": f64}.foo\n{\"bar\": f64}.i\n{\"bar\": f64}.i32\n{\"bar\": f64}.ok\n{\"bar\": f64}?.Bar\n{\"bar\": f64}?.Bar?.Qux\n{\"bar\": f64}?.add\n{\"bar\": f64}?.div\n{\"bar\": f64}?.f32\n{\"bar\": f64}?.foo\n{\"bar\": f64}?.i\n{\"bar\": f64}?.i64\n{\"bar\": f64}?.list\n{\"bar\": f64}?.ok\n{\"bar\": false, \"bar\": array}?.list\n{\"bar\": false, \"bar\": i32}?.div\n{\"bar\": false, \"bar\": i}?.i64\n{\"bar\": false, \"bar\": nil}.ok\n{\"bar\": false}.Bar\n{\"bar\": false}.Qux\n{\"bar\": false}.array\n{\"bar\": false}.f32\n{\"bar\": false}.f64\n{\"bar\": false}.half\n{\"bar\": false}.i\n{\"bar\": false}.i32\n{\"bar\": false}.ok\n{\"bar\": false}.score\n{\"bar\": false}?.Bar\n{\"bar\": false}?.array\n{\"bar\": false}?.div\n{\"bar\": false}?.foo\n{\"bar\": false}?.half\n{\"bar\": false}?.i\n{\"bar\": false}?.list\n{\"bar\": false}?.ok\n{\"bar\": filter(list, ok)}\n{\"bar\": float(0.5)}\n{\"bar\": floor(0.5)}.score\n{\"bar\": floor(i32)}\n{\"bar\": foo != nil, \"foo\": array}\n{\"bar\": foo, \"bar\": \"foo\", \"bar\": score}?.score\n{\"bar\": foo, \"bar\": 1, \"bar\": score}?.ok\n{\"bar\": foo, \"bar\": greet}\n{\"bar\": foo, \"bar\": i}?.i\n{\"bar\": foo, \"bar\": score}?.ok\n{\"bar\": foo, \"foo\": 0.5, \"foo\": ok}?.half\n{\"bar\": foo, \"foo\": 0.5}.score\n{\"bar\": foo, \"foo\": 1, \"foo\": i}?.add\n{\"bar\": foo, \"foo\": f64}\n{\"bar\": foo, \"foo\": f64}.Bar\n{\"bar\": foo.Bar}\n{\"bar\": foo.String()}\n{\"bar\": foo?.Qux, \"bar\": f32}\n{\"bar\": foo?.String}\n{\"bar\": foo}\n{\"bar\": foo}.Bar\n{\"bar\": foo}.array\n{\"bar\": foo}.f32\n{\"bar\": foo}.half\n{\"bar\": foo}.i\n{\"bar\": foo}.list\n{\"bar\": foo}.ok\n{\"bar\": foo}?.Bar\n{\"bar\": foo}?.add\n{\"bar\": foo}?.greet\n{\"bar\": foo}?.i\n{\"bar\": foo}?.i32\n{\"bar\": foo}?.i64\n{\"bar\": foo}?.list\n{\"bar\": foo}?.ok\n{\"bar\": foo}?.score\n{\"bar\": get(list, i32)}\n{\"bar\": greet(\"foo\")}\n{\"bar\": greet, \"bar\": 0.5}.i32\n{\"bar\": greet, \"bar\": 1}.Bar\n{\"bar\": greet, \"bar\": f32}.Bar\n{\"bar\": greet, \"bar\": i32}\n{\"bar\": greet, \"bar\": not ok}\n{\"bar\": greet, \"foo\": \"bar\"}.ok\n{\"bar\": greet, \"foo\": f64}\n{\"bar\": greet, \"foo\": false, \"bar\": ok}.i32\n{\"bar\": greet, \"foo\": i32}\n{\"bar\": greet}\n{\"bar\": greet}.Bar\n{\"bar\": greet}.array\n{\"bar\": greet}.f32\n{\"bar\": greet}.greet\n{\"bar\": greet}.half\n{\"bar\": greet}.list\n{\"bar\": greet}?.Qux\n{\"bar\": greet}?.div\n{\"bar\": greet}?.f32\n{\"bar\": greet}?.f64\n{\"bar\": greet}?.greet\n{\"bar\": greet}?.half\n{\"bar\": greet}?.i32\n{\"bar\": greet}?.ok\n{\"bar\": greet}?.score\n{\"bar\": groupBy(array, f32)}\n{\"bar\": half == nil}\n{\"bar\": half(f64)}\n{\"bar\": half, \"bar\": add, \"bar\": f64}?.i32\n{\"bar\": half, \"bar\": foo}\n{\"bar\": half, \"bar\": list}\n{\"bar\": half, \"bar\": score}\n{\"bar\": half, \"foo\": 1}?.i64\n{\"bar\": half, \"foo\": list}\n{\"bar\": half, \"foo\": ok, \"bar\": i}\n{\"bar\": half, \"foo\": ok}.Qux\n{\"bar\": half, \"foo\": true}?.String\n{\"bar\": half}\n{\"bar\": half}.Bar?.i\n{\"bar\": half}.Qux\n{\"bar\": half}.String\n{\"bar\": half}.div?.i\n{\"bar\": half}.f32\n{\"bar\": half}.foo\n{\"bar\": half}.half\n{\"bar\": half}.i32\n{\"bar\": half}.list\n{\"bar\": half}.list?.String()\n{\"bar\": half}?.Bar\n{\"bar\": half}?.String\n{\"bar\": half}?.array\n{\"bar\": half}?.f32\n{\"bar\": half}?.greet\n{\"bar\": half}?.i32\n{\"bar\": half}?.list\n{\"bar\": i % i32}\n{\"bar\": i ** f64}\n{\"bar\": i < 1}?.half\n{\"bar\": i, \"bar\": 1}.add\n{\"bar\": i, \"bar\": 1}?.i64\n{\"bar\": i, \"bar\": array}?.half\n{\"bar\": i, \"bar\": div}.ok\n{\"bar\": i, \"bar\": f64, \"bar\": \"foo\"}?.foo\n{\"bar\": i, \"bar\": f64, \"bar\": nil}.i32\n{\"bar\": i, \"bar\": score}\n{\"bar\": i, \"foo\": half}\n{\"bar\": i, \"foo\": i32}?.score\n{\"bar\": i, \"foo\": nil}?.String\n{\"bar\": i32 ^ 0.5}\n{\"bar\": i32 ^ f64}\n{\"bar\": i32, \"bar\": list}\n{\"bar\": i32, \"foo\": \"bar\"}.i64\n{\"bar\": i32, \"foo\": array}.div\n{\"bar\": i32, \"foo\": f64, \"foo\": add}.f64\n{\"bar\": i32, \"foo\": foo}?.add\n{\"bar\": i32, \"foo\": ok}.ok\n{\"bar\": i32}\n{\"bar\": i32}.Qux\n{\"bar\": i32}.f64\n{\"bar\": i32}.i\n{\"bar\": i32}.i32\n{\"bar\": i32}.list\n{\"bar\": i32}.ok\n{\"bar\": i32}.score\n{\"bar\": i32}?.Qux\n{\"bar\": i32}?.add\n{\"bar\": i32}?.array\n{\"bar\": i32}?.div\n{\"bar\": i32}?.f32\n{\"bar\": i32}?.i32\n{\"bar\": i32}?.list\n{\"bar\": i32}?.ok\n{\"bar\": i64 + 1}\n{\"bar\": i64 <= 0.5}\n{\"bar\": i64 == 0.5}\n{\"bar\": i64 in array}\n{\"bar\": i64, \"bar\": !ok}\n{\"bar\": i64, \"bar\": 0.5}.f32\n{\"bar\": i64, \"bar\": greet}.array\n{\"bar\": i64, \"bar\": score}.ok\n{\"bar\": i64, \"foo\": nil}?.i32\n{\"bar\": i64, \"foo\": ok}\n{\"bar\": i64, \"foo\": ok}?.f32\n{\"bar\": i64}\n{\"bar\": i64}.array?.Bar\n{\"bar\": i64}.div\n{\"bar\": i64}.f32\n{\"bar\": i64}.f64\n{\"bar\": i64}.i\n{\"bar\": i64}.list\n{\"bar\": i64}.ok\n{\"bar\": i64}.score\n{\"bar\": i64}?.div\n{\"bar\": i64}?.f32\n{\"bar\": i64}?.f64\n{\"bar\": i64}?.half\n{\"bar\": i64}?.i\n{\"bar\": i64}?.i32\n{\"bar\": i64}?.i?.ok\n{\"bar\": i64}?.list\n{\"bar\": int(f64)}\n{\"bar\": i}\n{\"bar\": i}.add\n{\"bar\": i}.array\n{\"bar\": i}.div?.Qux.div\n{\"bar\": i}.f64\n{\"bar\": i}.half\n{\"bar\": i}.i\n{\"bar\": i}.i64\n{\"bar\": i}.list\n{\"bar\": i}?.String\n{\"bar\": i}?.array\n{\"bar\": i}?.f64\n{\"bar\": i}?.foo\n{\"bar\": i}?.greet\n{\"bar\": i}?.i\n{\"bar\": i}?.i32\n{\"bar\": i}?.i64\n{\"bar\": i}?.score\n{\"bar\": list == nil}\n{\"bar\": list, \"bar\": half}?.Bar\n{\"bar\": list, \"bar\": score}\n{\"bar\": list, \"foo\": \"foo\"}.String\n{\"bar\": list, \"foo\": 1, \"foo\": nil}.score\n{\"bar\": list, \"foo\": 1, \"foo\": score}?.array\n{\"bar\": list, \"foo\": array}?.i64\n{\"bar\": list, \"foo\": f64}.div?.Qux\n{\"bar\": list, \"foo\": f64}.list\n{\"bar\": list, \"foo\": half}?.f32\n{\"bar\": list, \"foo\": i64}?.array\n{\"bar\": list, \"foo\": nil}.i64\n{\"bar\": list[i32:i32]}\n{\"bar\": list}\n{\"bar\": list}.String\n{\"bar\": list}.add\n{\"bar\": list}.array\n{\"bar\": list}.array?.i64\n{\"bar\": list}.f64\n{\"bar\": list}.greet\n{\"bar\": list}.i\n{\"bar\": list}.list\n{\"bar\": list}?.Bar\n{\"bar\": list}?.Qux\n{\"bar\": list}?.add\n{\"bar\": list}?.div\n{\"bar\": list}?.f64\n{\"bar\": list}?.i64\n{\"bar\": list}?.score\n{\"bar\": lower(\"bar\")}\n{\"bar\": map(array, #)}\n{\"bar\": map(array, i)}\n{\"bar\": map(list, #)}\n{\"bar\": nil != \"bar\"}\n{\"bar\": nil != nil}\n{\"bar\": nil == 0.5}\n{\"bar\": nil == nil}\n{\"bar\": nil, \"bar\": \"bar\"}?.i32\n{\"bar\": nil, \"bar\": add, \"bar\": i}.add\n{\"bar\": nil, \"bar\": foo}?.list\n{\"bar\": nil, \"foo\": \"foo\"}.f64\n{\"bar\": nil, \"foo\": 1, \"foo\": add}.ok\n{\"bar\": nil, \"foo\": foo}?.add\n{\"bar\": nil, \"foo\": i}?.f64\n{\"bar\": nil, \"foo\": list}?.f32\n{\"bar\": nil}.Bar\n{\"bar\": nil}.add\n{\"bar\": nil}.div\n{\"bar\": nil}.f32\n{\"bar\": nil}.foo\n{\"bar\": nil}.greet\n{\"bar\": nil}.half\n{\"bar\": nil}.i\n{\"bar\": nil}.i32\n{\"bar\": nil}.i32?.greet\n{\"bar\": nil}.i64\n{\"bar\": nil}.i?.f64\n{\"bar\": nil}.list\n{\"bar\": nil}.ok\n{\"bar\": nil}?.Qux\n{\"bar\": nil}?.String\n{\"bar\": nil}?.add\n{\"bar\": nil}?.div\n{\"bar\": nil}?.f32\n{\"bar\": nil}?.f64\n{\"bar\": nil}?.half\n{\"bar\": nil}?.i\n{\"bar\": nil}?.i32\n{\"bar\": nil}?.list\n{\"bar\": nil}?.ok\n{\"bar\": none(list, ok)}\n{\"bar\": not true}\n{\"bar\": ok ? \"bar\" : i}\n{\"bar\": ok ? i32 : \"foo\"}\n{\"bar\": ok ? nil : greet}\n{\"bar\": ok, \"bar\": 1, \"foo\": f64}.half\n{\"bar\": ok, \"bar\": array}\n{\"bar\": ok, \"bar\": i64, \"foo\": 1}?.Qux\n{\"bar\": ok, \"bar\": i}\n{\"bar\": ok, \"bar\": list}?.div\n{\"bar\": ok, \"bar\": ok}.f32\n{\"bar\": ok, \"foo\": 0.5}?.score\n{\"bar\": ok, \"foo\": 1}.i\n{\"bar\": ok, \"foo\": greet}\n{\"bar\": ok, \"foo\": half}\n{\"bar\": ok, \"foo\": list}\n{\"bar\": ok, \"foo\": list}?.f64\n{\"bar\": ok, \"foo\": nil}?.i32\n{\"bar\": ok, \"foo\": ok}.div\n{\"bar\": ok}\n{\"bar\": ok}.Bar\n{\"bar\": ok}.div\n{\"bar\": ok}.f32\n{\"bar\": ok}.greet\n{\"bar\": ok}.i32\n{\"bar\": ok}.i64\n{\"bar\": ok}.list\n{\"bar\": ok}.ok\n{\"bar\": ok}.score\n{\"bar\": ok}?.Qux\n{\"bar\": ok}?.add\n{\"bar\": ok}?.f32\n{\"bar\": ok}?.i32\n{\"bar\": ok}?.i64\n{\"bar\": ok}?.list\n{\"bar\": ok}?.score\n{\"bar\": one(list, false)}\n{\"bar\": reduce(array, i)}.i64\n{\"bar\": reduce(list, half)}\n{\"bar\": score(i)}\n{\"bar\": score, \"bar\": \"bar\", \"bar\": \"foo\"}?.f32\n{\"bar\": score, \"bar\": add}.String\n{\"bar\": score, \"bar\": i64}.f32\n{\"bar\": score, \"bar\": nil}.i\n{\"bar\": score, \"foo\": div}\n{\"bar\": score, \"foo\": foo}.i\n{\"bar\": score, \"foo\": half, \"foo\": i}?.array\n{\"bar\": score, \"foo\": half}\n{\"bar\": score, \"foo\": score}?.greet\n{\"bar\": score}\n{\"bar\": score}.add\n{\"bar\": score}.array\n{\"bar\": score}.div\n{\"bar\": score}.f64\n{\"bar\": score}.foo\n{\"bar\": score}.half\n{\"bar\": score}.list\n{\"bar\": score}?.String\n{\"bar\": score}?.array\n{\"bar\": score}?.f32\n{\"bar\": score}?.foo\n{\"bar\": score}?.half\n{\"bar\": score}?.i\n{\"bar\": score}?.i32\n{\"bar\": score}?.list\n{\"bar\": score}?.score\n{\"bar\": string(0.5)}\n{\"bar\": string(i64)}\n{\"bar\": string(ok)}\n{\"bar\": toJSON(list)}\n{\"bar\": true == false}\n{\"bar\": true, \"bar\": f64}?.score\n{\"bar\": true, \"bar\": i32}.array\n{\"bar\": true, \"foo\": nil}?.f32\n{\"bar\": true}.Bar\n{\"bar\": true}.Qux\n{\"bar\": true}.String\n{\"bar\": true}.div\n{\"bar\": true}.half\n{\"bar\": true}.i32\n{\"bar\": true}?.Bar\n{\"bar\": true}?.add\n{\"bar\": true}?.array\n{\"bar\": true}?.div\n{\"bar\": true}?.half\n{\"bar\": true}?.i32\n{\"bar\": true}?.i64\n{\"bar\": type(greet)}.Bar\n{\"bar\": type(half)}\n{\"bar\": type(score)}\n{\"foo\": !ok}\n{\"foo\": \"bar\" < \"bar\"}\n{\"foo\": \"bar\" > \"bar\"}\n{\"foo\": \"bar\", \"bar\": list}.div\n{\"foo\": \"bar\", \"bar\": nil}.f64\n{\"foo\": \"bar\", \"foo\": 0.5}?.add\n{\"foo\": \"bar\", \"foo\": 0.5}?.list\n{\"foo\": \"bar\", \"foo\": array}?.f64?.list()\n{\"foo\": \"bar\", \"foo\": list}.list\n{\"foo\": \"bar\"}.Bar\n{\"foo\": \"bar\"}.Qux\n{\"foo\": \"bar\"}.String\n{\"foo\": \"bar\"}.foo\n{\"foo\": \"bar\"}.half\n{\"foo\": \"bar\"}.i\n{\"foo\": \"bar\"}.i64\n{\"foo\": \"bar\"}?.Bar\n{\"foo\": \"bar\"}?.String\n{\"foo\": \"bar\"}?.add\n{\"foo\": \"bar\"}?.array\n{\"foo\": \"bar\"}?.div\n{\"foo\": \"bar\"}?.f32\n{\"foo\": \"bar\"}?.f64\n{\"foo\": \"bar\"}?.foo\n{\"foo\": \"bar\"}?.half\n{\"foo\": \"bar\"}?.i32\n{\"foo\": \"bar\"}?.score\n{\"foo\": \"foo\" <= \"foo\"}\n{\"foo\": \"foo\" endsWith \"foo\"}\n{\"foo\": \"foo\", \"bar\": false}.greet\n{\"foo\": \"foo\", \"bar\": half}?.String\n{\"foo\": \"foo\", \"bar\": list, \"bar\": div}?.String\n{\"foo\": \"foo\", \"foo\": add}?.f32\n{\"foo\": \"foo\"}.Qux\n{\"foo\": \"foo\"}.div\n{\"foo\": \"foo\"}.f32\n{\"foo\": \"foo\"}.i\n{\"foo\": \"foo\"}.i32\n{\"foo\": \"foo\"}.list\n{\"foo\": \"foo\"}?.div\n{\"foo\": \"foo\"}?.f32\n{\"foo\": \"foo\"}?.foo\n{\"foo\": \"foo\"}?.i\n{\"foo\": \"foo\"}?.i32\n{\"foo\": \"foo\"}?.score\n{\"foo\": -0.5}\n{\"foo\": -1}\n{\"foo\": -f64}\n{\"foo\": -i64}\n{\"foo\": 0.5 != 0.5}\n{\"foo\": 0.5 ** f64}\n{\"foo\": 0.5 < i64}.div\n{\"foo\": 0.5 <= 0.5}\n{\"foo\": 0.5, \"bar\": 0.5}.String\n{\"foo\": 0.5, \"bar\": 0.5}.foo\n{\"foo\": 0.5, \"bar\": 0.5}?.score\n{\"foo\": 0.5, \"bar\": 1}?.div\n{\"foo\": 0.5, \"bar\": i64}.i32\n{\"foo\": 0.5, \"bar\": list}?.i64\n{\"foo\": 0.5, \"foo\": 1}.Qux\n{\"foo\": 0.5, \"foo\": array}.i64\n{\"foo\": 0.5, \"foo\": f64}.i\n{\"foo\": 0.5, \"foo\": false, \"bar\": list}.add\n{\"foo\": 0.5, \"foo\": greet}.i32\n{\"foo\": 0.5, \"foo\": score}.foo\n{\"foo\": 0.5}.Qux?.half\n{\"foo\": 0.5}.String\n{\"foo\": 0.5}.add\n{\"foo\": 0.5}.array\n{\"foo\": 0.5}.div\n{\"foo\": 0.5}.f32\n{\"foo\": 0.5}.half\n{\"foo\": 0.5}.i64\n{\"foo\": 0.5}.list\n{\"foo\": 0.5}.score\n{\"foo\": 0.5}?.Bar\n{\"foo\": 0.5}?.String\n{\"foo\": 0.5}?.div\n{\"foo\": 0.5}?.f32\n{\"foo\": 0.5}?.f64\n{\"foo\": 0.5}?.half\n{\"foo\": 0.5}?.i\n{\"foo\": 0.5}?.list\n{\"foo\": 0.5}?.ok\n{\"foo\": 1 / i64}\n{\"foo\": 1 == f32}\n{\"foo\": 1, \"bar\": nil}?.add\n{\"foo\": 1, \"bar\": score}.greet\n{\"foo\": 1, \"foo\": 1}.f64\n{\"foo\": 1, \"foo\": f64}.i\n{\"foo\": 1, \"foo\": false}?.f32\n{\"foo\": 1, \"foo\": half}?.f32\n{\"foo\": 1, \"foo\": ok}.Bar\n{\"foo\": 1, \"foo\": ok}.f32\n{\"foo\": 1, \"foo\": ok}.i32\n{\"foo\": 1, \"foo\": score}.half\n{\"foo\": 1}.Bar\n{\"foo\": 1}.add\n{\"foo\": 1}.div\n{\"foo\": 1}.f32\n{\"foo\": 1}.f64\n{\"foo\": 1}.foo\n{\"foo\": 1}.greet\n{\"foo\": 1}.half\n{\"foo\": 1}.i\n{\"foo\": 1}.i64\n{\"foo\": 1}.list\n{\"foo\": 1}?.String\n{\"foo\": 1}?.add\n{\"foo\": 1}?.f64\n{\"foo\": 1}?.greet\n{\"foo\": 1}?.half\n{\"foo\": 1}?.list\n{\"foo\": 1}?.ok\n{\"foo\": abs(i64)}\n{\"foo\": add, \"bar\": half}\n{\"foo\": add, \"bar\": nil}.i\n{\"foo\": add, \"bar\": nil}?.i\n{\"foo\": add, \"bar\": ok, \"foo\": array}?.i32\n{\"foo\": add, \"foo\": 1, \"bar\": i32}.add\n{\"foo\": add, \"foo\": array}?.f32\n{\"foo\": add, \"foo\": foo}?.i64\n{\"foo\": add, \"foo\": half}\n{\"foo\": add, \"foo\": score, \"bar\": i32}.list\n{\"foo\": add}\n{\"foo\": add}.array\n{\"foo\": add}.div\n{\"foo\": add}.f32\n{\"foo\": add}.foo\n{\"foo\": add}.half\n{\"foo\": add}.i\n{\"foo\": add}.i32\n{\"foo\": add}.i?.score\n{\"foo\": add}.list\n{\"foo\": add}?.Bar\n{\"foo\": add}?.Qux\n{\"foo\": add}?.String\n{\"foo\": add}?.div\n{\"foo\": add}?.f32\n{\"foo\": add}?.foo\n{\"foo\": add}?.greet\n{\"foo\": add}?.half\n{\"foo\": add}?.i\n{\"foo\": add}?.i64\n{\"foo\": add}?.score\n{\"foo\": array, \"bar\": \"bar\"}.add\n{\"foo\": array, \"bar\": 0.5}?.div\n{\"foo\": array, \"bar\": add}.ok\n{\"foo\": array, \"bar\": array}.f32\n{\"foo\": array, \"bar\": i64}?.add\n{\"foo\": array, \"bar\": list}\n{\"foo\": array, \"bar\": nil}.half\n{\"foo\": array, \"bar\": ok, \"bar\": i}\n{\"foo\": array, \"foo\": \"foo\"}.array\n{\"foo\": array, \"foo\": array}\n{\"foo\": array, \"foo\": f32, \"foo\": half}.ok\n{\"foo\": array, \"foo\": f64}\n{\"foo\": array, \"foo\": list}\n{\"foo\": array}\n{\"foo\": array}.Bar\n{\"foo\": array}.Qux\n{\"foo\": array}.f32\n{\"foo\": array}.foo\n{\"foo\": array}.greet\n{\"foo\": array}.i\n{\"foo\": array}.i32\n{\"foo\": array}.i64\n{\"foo\": array}.score\n{\"foo\": array}?.Qux\n{\"foo\": array}?.add\n{\"foo\": array}?.array\n{\"foo\": array}?.greet\n{\"foo\": array}?.i64?.add\n{\"foo\": array}?.list\n{\"foo\": array}?.ok\n{\"foo\": div, \"bar\": \"foo\"}.array\n{\"foo\": div, \"bar\": array}\n{\"foo\": div, \"bar\": foo, \"foo\": true}?.i64\n{\"foo\": div, \"bar\": half}\n{\"foo\": div, \"bar\": i64}\n{\"foo\": div, \"foo\": array}\n{\"foo\": div, \"foo\": f32}\n{\"foo\": div, \"foo\": greet}?.i64\n{\"foo\": div}\n{\"foo\": div}.Qux\n{\"foo\": div}.array\n{\"foo\": div}.div\n{\"foo\": div}.f32\n{\"foo\": div}.greet?.i\n{\"foo\": div}.i32\n{\"foo\": div}.i64\n{\"foo\": div}?.Bar\n{\"foo\": div}?.Qux\n{\"foo\": div}?.String\n{\"foo\": div}?.div\n{\"foo\": div}?.greet\n{\"foo\": div}?.half\n{\"foo\": div}?.i32\n{\"foo\": div}?.i64\n{\"foo\": div}?.list\n{\"foo\": div}?.score\n{\"foo\": f32 > 1}\n{\"foo\": f32 >= 1}\n{\"foo\": f32, \"bar\": 0.5}.list\n{\"foo\": f32, \"bar\": div}\n{\"foo\": f32, \"bar\": f32}\n{\"foo\": f32, \"bar\": f64}\n{\"foo\": f32, \"bar\": greet}.greet\n{\"foo\": f32, \"bar\": half}\n{\"foo\": f32, \"bar\": ok}?.add\n{\"foo\": f32, \"bar\": score}?.i64\n{\"foo\": f32, \"foo\": \"foo\"}.ok\n{\"foo\": f32, \"foo\": add}?.half?.f64()\n{\"foo\": f32, \"foo\": foo}?.half\n{\"foo\": f32}\n{\"foo\": f32}.Qux\n{\"foo\": f32}.add\n{\"foo\": f32}.f32\n{\"foo\": f32}.foo\n{\"foo\": f32}.greet\n{\"foo\": f32}.half\n{\"foo\": f32}.i\n{\"foo\": f32}.i32\n{\"foo\": f32}.i64\n{\"foo\": f32}.list\n{\"foo\": f32}.score?.greet\n{\"foo\": f32}?.Bar\n{\"foo\": f32}?.String\n{\"foo\": f32}?.array\n{\"foo\": f32}?.f64?.i\n{\"foo\": f32}?.i\n{\"foo\": f32}?.ok\n{\"foo\": f64 < f64}\n{\"foo\": f64 > f32}\n{\"foo\": f64 >= 0.5}\n{\"foo\": f64 >= f32}\n{\"foo\": f64 in array}\n{\"foo\": f64, \"bar\": 0.5}.greet\n{\"foo\": f64, \"bar\": add, \"foo\": greet}.Bar\n{\"foo\": f64, \"bar\": list}.i64\n{\"foo\": f64, \"bar\": sum(array)}\n{\"foo\": f64, \"bar\": true}?.greet\n{\"foo\": f64, \"foo\": list, \"foo\": i}?.add\n{\"foo\": f64}\n{\"foo\": f64}.Bar\n{\"foo\": f64}.Qux\n{\"foo\": f64}.div\n{\"foo\": f64}.f32\n{\"foo\": f64}.f64\n{\"foo\": f64}.greet\n{\"foo\": f64}.i32\n{\"foo\": f64}.list\n{\"foo\": f64}.ok\n{\"foo\": f64}?.String\n{\"foo\": f64}?.f32\n{\"foo\": f64}?.f64\n{\"foo\": f64}?.foo\n{\"foo\": f64}?.greet\n{\"foo\": f64}?.i32\n{\"foo\": f64}?.i64\n{\"foo\": f64}?.ok\n{\"foo\": f64}?.ok?.ok\n{\"foo\": f64}?.score\n{\"foo\": false or false}.array\n{\"foo\": false, \"bar\": 0.5, \"foo\": add}.score\n{\"foo\": false, \"foo\": foo, \"bar\": half}.array\n{\"foo\": false, \"foo\": score, \"foo\": nil}?.div\n{\"foo\": false, \"foo\": true}?.i32\n{\"foo\": false}.array\n{\"foo\": false}.i\n{\"foo\": false}.ok\n{\"foo\": false}?.f32\n{\"foo\": false}?.f64\n{\"foo\": false}?.list\n{\"foo\": foo == nil}\n{\"foo\": foo, \"bar\": div}\n{\"foo\": foo, \"bar\": foo}\n{\"foo\": foo, \"bar\": ok}.i32\n{\"foo\": foo, \"bar\": {\"foo\": 1}}\n{\"foo\": foo, \"foo\": add}\n{\"foo\": foo, \"foo\": half}\n{\"foo\": foo, \"foo\": i}\n{\"foo\": foo, \"foo\": ok}\n{\"foo\": foo, \"foo\": score, \"foo\": f64}.i\n{\"foo\": foo.Bar}\n{\"foo\": foo.String, \"bar\": foo}\n{\"foo\": foo.String}\n{\"foo\": foo?.Bar}\n{\"foo\": foo?.Qux}\n{\"foo\": foo?.String()}\n{\"foo\": foo?.String}\n{\"foo\": foo}\n{\"foo\": foo}.Bar?.Bar\n{\"foo\": foo}.Qux\n{\"foo\": foo}.String\n{\"foo\": foo}.String?.String\n{\"foo\": foo}.f32\n{\"foo\": foo}.greet\n{\"foo\": foo}.half\n{\"foo\": foo}.i64\n{\"foo\": foo}?.Qux\n{\"foo\": foo}?.add\n{\"foo\": foo}?.array\n{\"foo\": foo}?.array?.Bar\n{\"foo\": foo}?.f64\n{\"foo\": foo}?.greet\n{\"foo\": foo}?.i32\n{\"foo\": foo}?.list\n{\"foo\": foo}?.ok\n{\"foo\": greet(\"foo\")}\n{\"foo\": greet, \"bar\": \"bar\"}?.i32\n{\"foo\": greet, \"bar\": i64}\n{\"foo\": greet, \"bar\": i}.list\n{\"foo\": greet, \"foo\": add}.String\n{\"foo\": greet, \"foo\": nil}?.add\n{\"foo\": greet}\n{\"foo\": greet}.Bar\n{\"foo\": greet}.Qux\n{\"foo\": greet}.String\n{\"foo\": greet}.add\n{\"foo\": greet}.array\n{\"foo\": greet}.f32\n{\"foo\": greet}.i\n{\"foo\": greet}.i32\n{\"foo\": greet}.i64\n{\"foo\": greet}.i64?.greet\n{\"foo\": greet}.ok\n{\"foo\": greet}.score\n{\"foo\": greet}?.Qux\n{\"foo\": greet}?.array\n{\"foo\": greet}?.div\n{\"foo\": greet}?.f32\n{\"foo\": greet}?.f64\n{\"foo\": greet}?.i32\n{\"foo\": greet}?.i64\n{\"foo\": greet}?.list\n{\"foo\": greet}?.ok\n{\"foo\": greet}?.score\n{\"foo\": groupBy(array, 1)}\n{\"foo\": groupBy(list, #)}\n{\"foo\": half, \"bar\": \"foo\"}?.half\n{\"foo\": half, \"bar\": add, \"foo\": true}?.array\n{\"foo\": half, \"bar\": array}.half\n{\"foo\": half, \"bar\": greet}?.half\n{\"foo\": half, \"bar\": half}?.i\n{\"foo\": half, \"bar\": list, \"foo\": 1}?.f64\n{\"foo\": half, \"bar\": list}\n{\"foo\": half, \"bar\": true}?.Qux\n{\"foo\": half, \"foo\": 1}?.i32\n{\"foo\": half, \"foo\": div, \"foo\": array}?.i32\n{\"foo\": half, \"foo\": f64}\n{\"foo\": half, \"foo\": list, \"foo\": half}.half\n{\"foo\": half, \"foo\": score, \"foo\": list}.String\n{\"foo\": half}\n{\"foo\": half}.Bar\n{\"foo\": half}.String\n{\"foo\": half}.add\n{\"foo\": half}.div\n{\"foo\": half}.f32\n{\"foo\": half}.foo\n{\"foo\": half}.half\n{\"foo\": half}.i\n{\"foo\": half}.i64\n{\"foo\": half}.ok\n{\"foo\": half}.score\n{\"foo\": half}?.Bar\n{\"foo\": half}?.Qux\n{\"foo\": half}?.String\n{\"foo\": half}?.div\n{\"foo\": half}?.f32\n{\"foo\": half}?.foo\n{\"foo\": half}?.i32\n{\"foo\": half}?.i64\n{\"foo\": half}?.score\n{\"foo\": i != 1}\n{\"foo\": i - f64}\n{\"foo\": i / 1}\n{\"foo\": i ^ 1}\n{\"foo\": i, \"bar\": 0.5}?.half\n{\"foo\": i, \"bar\": f32}\n{\"foo\": i, \"bar\": foo}\n{\"foo\": i, \"bar\": list}.foo\n{\"foo\": i, \"foo\": \"bar\"}?.div?.f32\n{\"foo\": i, \"foo\": 1}.list\n{\"foo\": i, \"foo\": 1}?.list\n{\"foo\": i, \"foo\": add}\n{\"foo\": i, \"foo\": array, \"bar\": 0.5}?.f32\n{\"foo\": i, \"foo\": half}?.list\n{\"foo\": i, \"foo\": score}\n{\"foo\": i, \"foo\": score}?.f32\n{\"foo\": i32 != i}\n{\"foo\": i32 * 0.5}\n{\"foo\": i32 + 1}\n{\"foo\": i32 - f32}.foo\n{\"foo\": i32 - f64}\n{\"foo\": i32 / 1}\n{\"foo\": i32 < 1}\n{\"foo\": i32, \"bar\": 0.5, \"bar\": foo}.i64\n{\"foo\": i32, \"bar\": foo}?.score\n{\"foo\": i32, \"bar\": nil}?.ok\n{\"foo\": i32, \"foo\": false, \"bar\": f32}?.foo\n{\"foo\": i32, \"foo\": greet}?.greet\n{\"foo\": i32}\n{\"foo\": i32}.i\n{\"foo\": i32}.ok\n{\"foo\": i32}?.Bar\n{\"foo\": i32}?.String\n{\"foo\": i32}?.add\n{\"foo\": i32}?.f32\n{\"foo\": i32}?.f64\n{\"foo\": i32}?.i\n{\"foo\": i32}?.i32\n{\"foo\": i32}?.i64\n{\"foo\": i32}?.list\n{\"foo\": i32}?.score\n{\"foo\": i64 % 1}\n{\"foo\": i64 * f32}\n{\"foo\": i64 .. i64}\n{\"foo\": i64, \"bar\": array}\n{\"foo\": i64, \"foo\": array}.f32\n{\"foo\": i64, \"foo\": f32}\n{\"foo\": i64, \"foo\": i32}?.foo\n{\"foo\": i64, \"foo\": i64, \"bar\": f64}.foo\n{\"foo\": i64, \"foo\": i64}\n{\"foo\": i64, \"foo\": i64}.greet\n{\"foo\": i64, \"foo\": i64}?.foo\n{\"foo\": i64}\n{\"foo\": i64}.Bar\n{\"foo\": i64}.array\n{\"foo\": i64}.div\n{\"foo\": i64}.foo\n{\"foo\": i64}.greet\n{\"foo\": i64}.half\n{\"foo\": i64}.i\n{\"foo\": i64}.i32\n{\"foo\": i64}.list\n{\"foo\": i64}?.Qux\n{\"foo\": i64}?.add\n{\"foo\": i64}?.array\n{\"foo\": i64}?.f32\n{\"foo\": i64}?.f64\n{\"foo\": i64}?.half\n{\"foo\": i64}?.i32\n{\"foo\": i64}?.i32?.f32\n{\"foo\": i64}?.i64\n{\"foo\": i64}?.score?.list\n{\"foo\": int(i)}\n{\"foo\": int(i32)}\n{\"foo\": int(i64)}\n{\"foo\": i}\n{\"foo\": i}.Bar\n{\"foo\": i}.String\n{\"foo\": i}.add\n{\"foo\": i}.array\n{\"foo\": i}.f64\n{\"foo\": i}.greet\n{\"foo\": i}.i\n{\"foo\": i}.ok\n{\"foo\": i}?.div\n{\"foo\": i}?.greet\n{\"foo\": i}?.i\n{\"foo\": i}?.i32\n{\"foo\": i}?.i64\n{\"foo\": i}?.score\n{\"foo\": last(list)}\n{\"foo\": len(list)}\n{\"foo\": list, \"bar\": add}\n{\"foo\": list, \"bar\": all(list, false)}\n{\"foo\": list, \"bar\": array}\n{\"foo\": list, \"bar\": f32}.f64\n{\"foo\": list, \"bar\": half}\n{\"foo\": list, \"bar\": i32, \"bar\": score}.array\n{\"foo\": list, \"bar\": true}?.foo\n{\"foo\": list}\n{\"foo\": list}.Qux\n{\"foo\": list}.String\n{\"foo\": list}.add\n{\"foo\": list}.div\n{\"foo\": list}.f32\n{\"foo\": list}.greet\n{\"foo\": list}.half\n{\"foo\": list}.i\n{\"foo\": list}.i32\n{\"foo\": list}?.String\n{\"foo\": list}?.div\n{\"foo\": list}?.f32\n{\"foo\": list}?.foo\n{\"foo\": list}?.i\n{\"foo\": list}?.i32\n{\"foo\": list}?.i64\n{\"foo\": list}?.ok\n{\"foo\": list}?.score\n{\"foo\": map(array, #)}\n{\"foo\": map(array, i64)}\n{\"foo\": nil, \"bar\": 0.5}.ok\n{\"foo\": nil, \"bar\": add, \"bar\": f32}?.list\n{\"foo\": nil, \"bar\": div, \"bar\": 1}.i64\n{\"foo\": nil, \"bar\": f32}.score\n{\"foo\": nil, \"bar\": foo}?.String\n{\"foo\": nil, \"bar\": score}?.ok?.div\n{\"foo\": nil, \"foo\": \"foo\"}.Bar\n{\"foo\": nil, \"foo\": greet}.String\n{\"foo\": nil, \"foo\": half}.f64\n{\"foo\": nil, \"foo\": i64, \"bar\": f64}?.list\n{\"foo\": nil, \"foo\": i}.div\n{\"foo\": nil, \"foo\": list}.add\n{\"foo\": nil, \"foo\": list}?.array\n{\"foo\": nil, \"foo\": nil}.ok\n{\"foo\": nil}.array?.half()\n{\"foo\": nil}.div\n{\"foo\": nil}.f32\n{\"foo\": nil}.f64\n{\"foo\": nil}.half\n{\"foo\": nil}.i\n{\"foo\": nil}.i32\n{\"foo\": nil}.i64?.Bar()\n{\"foo\": nil}.list\n{\"foo\": nil}.ok\n{\"foo\": nil}.score\n{\"foo\": nil}?.Bar\n{\"foo\": nil}?.Bar?.score\n{\"foo\": nil}?.add\n{\"foo\": nil}?.array\n{\"foo\": nil}?.f64\n{\"foo\": nil}?.foo\n{\"foo\": nil}?.half\n{\"foo\": nil}?.i32\n{\"foo\": nil}?.i64\n{\"foo\": nil}?.list\n{\"foo\": ok == false}\n{\"foo\": ok, \"bar\": \"foo\"}?.i64\n{\"foo\": ok, \"bar\": add}.String\n{\"foo\": ok, \"bar\": f32}\n{\"foo\": ok, \"foo\": half}.ok\n{\"foo\": ok, \"foo\": list}\n{\"foo\": ok}\n{\"foo\": ok}.Bar\n{\"foo\": ok}.Bar?.i\n{\"foo\": ok}.String\n{\"foo\": ok}.array\n{\"foo\": ok}.div\n{\"foo\": ok}.f64\n{\"foo\": ok}.foo\n{\"foo\": ok}.i32\n{\"foo\": ok}.i64\n{\"foo\": ok}.ok\n{\"foo\": ok}?.Qux\n{\"foo\": ok}?.String\n{\"foo\": ok}?.String?.Bar\n{\"foo\": ok}?.array\n{\"foo\": ok}?.f32\n{\"foo\": ok}?.foo\n{\"foo\": ok}?.greet\n{\"foo\": ok}?.half\n{\"foo\": ok}?.i32\n{\"foo\": ok}?.i64\n{\"foo\": ok}?.list\n{\"foo\": reduce(array, \"foo\")}\n{\"foo\": reduce(array, #)}\n{\"foo\": reduce(list, #).String()}\n{\"foo\": reduce(list, #)}\n{\"foo\": reduce(list, #)}?.list\n{\"foo\": score, \"bar\": add}.add\n{\"foo\": score, \"bar\": div}\n{\"foo\": score, \"bar\": f64}\n{\"foo\": score, \"bar\": false}?.array\n{\"foo\": score, \"bar\": false}?.i\n{\"foo\": score, \"bar\": true}.div?.i\n{\"foo\": score, \"foo\": 0.5}?.String\n{\"foo\": score, \"foo\": 1}.array\n{\"foo\": score, \"foo\": add}\n{\"foo\": score, \"foo\": array}.array\n{\"foo\": score, \"foo\": f32}\n{\"foo\": score, \"foo\": greet}\nfromJSON('5e2482')\n"
  },
  {
    "path": "test/fuzz/fuzz_env.go",
    "content": "package fuzz\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/expr-lang/expr\"\n)\n\nfunc NewEnv() map[string]any {\n\treturn map[string]any{\n\t\t\"ok\":    true,\n\t\t\"f64\":   .5,\n\t\t\"f32\":   float32(.5),\n\t\t\"i\":     1,\n\t\t\"i64\":   int64(1),\n\t\t\"i32\":   int32(1),\n\t\t\"array\": []int{1, 2, 3, 4, 5},\n\t\t\"list\":  []Foo{{\"bar\"}, {\"baz\"}},\n\t\t\"foo\":   Foo{\"bar\"},\n\t\t\"add\":   func(a, b int) int { return a + b },\n\t\t\"div\":   func(a, b int) int { return a / b },\n\t\t\"half\":  func(a float64) float64 { return a / 2 },\n\t\t\"score\": func(a int, x ...int) int {\n\t\t\ts := a\n\t\t\tfor _, n := range x {\n\t\t\t\ts += n\n\t\t\t}\n\t\t\treturn s\n\t\t},\n\t\t\"greet\": func(name string) string { return \"Hello, \" + name },\n\t}\n}\n\nfunc Func() expr.Option {\n\treturn expr.Function(\"fn\", func(params ...any) (any, error) {\n\t\treturn fmt.Sprintf(\"fn(%v)\", params), nil\n\t})\n}\n\ntype Foo struct {\n\tBar string\n}\n\nfunc (f Foo) String() string {\n\treturn \"foo\"\n}\n\nfunc (f Foo) Qux(s string) string {\n\treturn f.Bar + s\n}\n"
  },
  {
    "path": "test/fuzz/fuzz_expr.dict",
    "content": "\"{\"\n\"}\"\n\",\"\n\"[\"\n\"]\"\n\"(\"\n\")\"\n\":\"\n\"'\"\n\"\\\"\"\n\"0.1\"\n\"1.2\"\n\"2.3\"\n\"-3.4\"\n\"-4.5\"\n\"-5.6\"\n\"1e2\"\n\"2e3\"\n\"-3e4\"\n\"-4e5\"\n\"0\"\n\"1\"\n\"2\"\n\"-3\"\n\"-4\"\n\"0x\"\n\n\"true\"\n\"false\"\n\"not\"\n\"nil\"\n\n\"String\"\n\n\"ok\"\n\"f64\"\n\"f32\"\n\"i\"\n\"i64\"\n\"i32\"\n\"array\"\n\"list\"\n\"foo\"\n\"add\"\n\"div\"\n\"half\"\n\"score\"\n\"greet\"\n\"Foo\"\n\"Bar\"\n\"Qux\"\n\n\"all\"\n\"none\"\n\"any\"\n\"one\"\n\"filter\"\n\"map\"\n\"count\"\n\"find\"\n\"findIndex\"\n\"findLast\"\n\"findLastIndex\"\n\"len\"\n\"type\"\n\"abs\"\n\"int\"\n\"float\"\n\"string\"\n\"trim\"\n\"trimPrefix\"\n\"trimSuffix\"\n\"upper\"\n\"lower\"\n\"split\"\n\"splitAfter\"\n\"replace\"\n\"repeat\"\n\"join\"\n\"indexOf\"\n\"lastIndexOf\"\n\"hasPrefix\"\n\"hasSuffix\"\n\"max\"\n\"min\"\n\"toJSON\"\n\"fromJSON\"\n\"toBase64\"\n\"fromBase64\"\n\"now\"\n\"duration\"\n\"date\"\n\"first\"\n\"last\"\n\"get\"\n\"keys\"\n\"values\"\n\"sort\"\n\"sortBy\"\n"
  },
  {
    "path": "test/fuzz/fuzz_test.go",
    "content": "package fuzz\n\nimport (\n\t_ \"embed\"\n\t\"regexp\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\n//go:embed fuzz_corpus.txt\nvar fuzzCorpus string\n\nfunc FuzzExpr(f *testing.F) {\n\tcorpus := strings.Split(strings.TrimSpace(fuzzCorpus), \"\\n\")\n\tfor _, s := range corpus {\n\t\tf.Add(s)\n\t}\n\n\tskip := []*regexp.Regexp{\n\t\tregexp.MustCompile(`cannot fetch .* from .*`),\n\t\tregexp.MustCompile(`cannot get .* from .*`),\n\t\tregexp.MustCompile(`cannot slice`),\n\t\tregexp.MustCompile(`slice index out of range`),\n\t\tregexp.MustCompile(`error parsing regexp`),\n\t\tregexp.MustCompile(`integer divide by zero`),\n\t\tregexp.MustCompile(`interface conversion`),\n\t\tregexp.MustCompile(`invalid argument`),\n\t\tregexp.MustCompile(`invalid character`),\n\t\tregexp.MustCompile(`invalid operation`),\n\t\tregexp.MustCompile(`invalid duration`),\n\t\tregexp.MustCompile(`time: missing unit in duration`),\n\t\tregexp.MustCompile(`time: unknown unit .* in duration`),\n\t\tregexp.MustCompile(`unknown time zone`),\n\t\tregexp.MustCompile(`invalid location name`),\n\t\tregexp.MustCompile(`json: unsupported value`),\n\t\tregexp.MustCompile(`json: unsupported type`),\n\t\tregexp.MustCompile(`json: cannot unmarshal .* into Go value of type .*`),\n\t\tregexp.MustCompile(`unexpected end of JSON input`),\n\t\tregexp.MustCompile(`memory budget exceeded`),\n\t\tregexp.MustCompile(`using interface \\{} as type .*`),\n\t\tregexp.MustCompile(`reflect.Value.MapIndex: value of type .* is not assignable to type .*`),\n\t\tregexp.MustCompile(`reflect: Call using .* as type .*`),\n\t\tregexp.MustCompile(`reflect: cannot use .* as type .* in .*`),\n\t\tregexp.MustCompile(`reflect: Call with too few input arguments`),\n\t\tregexp.MustCompile(`invalid number of arguments`),\n\t\tregexp.MustCompile(`reflect: call of reflect.Value.Call on .* Value`),\n\t\tregexp.MustCompile(`reflect: call of reflect.Value.Index on map Value`),\n\t\tregexp.MustCompile(`reflect: call of reflect.Value.Len on .* Value`),\n\t\tregexp.MustCompile(`reflect: string index out of range`),\n\t\tregexp.MustCompile(`strings: negative Repeat count`),\n\t\tregexp.MustCompile(`strings: illegal bytes to escape`),\n\t\tregexp.MustCompile(`invalid date .*`),\n\t\tregexp.MustCompile(`parsing time .*`),\n\t\tregexp.MustCompile(`cannot parse .* as .*`),\n\t\tregexp.MustCompile(`operator \"in\" not defined on .*`),\n\t\tregexp.MustCompile(`cannot sum .*`),\n\t\tregexp.MustCompile(`index out of range: .* \\(array length is .*\\)`),\n\t\tregexp.MustCompile(`reduce of empty array with no initial value`),\n\t\tregexp.MustCompile(`cannot use <nil> as argument \\(type .*\\) to call .*`),\n\t\tregexp.MustCompile(`illegal base64 data at input byte .*`),\n\t\tregexp.MustCompile(`sort order argument must be a string`),\n\t\tregexp.MustCompile(`sortBy order argument must be a string`),\n\t\tregexp.MustCompile(`invalid order .*, expected asc or desc`),\n\t\tregexp.MustCompile(`unknown order, use asc or desc`),\n\t\tregexp.MustCompile(`cannot use .* as a key for groupBy: type is not comparable`),\n\t}\n\n\tenv := NewEnv()\n\tfn := Func()\n\n\tf.Fuzz(func(t *testing.T, code string) {\n\t\tif len(code) > 1000 {\n\t\t\tt.Skip(\"too long code\")\n\t\t}\n\n\t\tprogram, err := expr.Compile(code, expr.Env(env), fn)\n\t\tif err != nil {\n\t\t\tt.Skipf(\"compile error: %s\", err)\n\t\t}\n\n\t\tv := vm.VM{MemoryBudget: 500000}\n\t\t_, err = v.Run(program, env)\n\t\tif err != nil {\n\t\t\tfor _, r := range skip {\n\t\t\t\tif r.MatchString(err.Error()) {\n\t\t\t\t\tt.Skipf(\"skip error: %s\", err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tt.Errorf(\"%s\", err)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "test/gen/env.go",
    "content": "package main\n\nvar Env = map[string]any{\n\t\"ok\":    true,\n\t\"i\":     1,\n\t\"str\":   \"str\",\n\t\"f64\":   .5,\n\t\"array\": []int{1, 2, 3, 4, 5},\n\t\"foo\":   Foo{\"foo\"},\n\t\"list\":  []Foo{{\"bar\"}, {\"baz\"}},\n\t\"add\":   func(a, b int) int { return a + b },\n\t\"greet\": func(name string) string { return \"Hello, \" + name },\n}\n\ntype Foo struct {\n\tBar string\n}\n\nfunc (f Foo) String() string {\n\treturn \"foo\"\n}\n"
  },
  {
    "path": "test/gen/gen.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"runtime/debug\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/builtin\"\n)\n\nvar (\n\tdict       []string\n\tpredicates []string\n\tbuiltins   []string\n\toperators  = []string{\n\t\t\"or\",\n\t\t\"||\",\n\t\t\"and\",\n\t\t\"&&\",\n\t\t\"==\",\n\t\t\"!=\",\n\t\t\"<\",\n\t\t\">\",\n\t\t\">=\",\n\t\t\"<=\",\n\t\t\"..\",\n\t\t\"??\",\n\t\t\"+\",\n\t\t\"-\",\n\t\t\"*\",\n\t\t\"/\",\n\t\t\"%\",\n\t\t\"**\",\n\t\t\"^\",\n\t\t\"in\",\n\t\t\"matches\",\n\t\t\"contains\",\n\t\t\"startsWith\",\n\t\t\"endsWith\",\n\t\t\"not in\",\n\t\t\"not matches\",\n\t\t\"not contains\",\n\t\t\"not startsWith\",\n\t\t\"not endsWith\",\n\t}\n)\n\nfunc init() {\n\tfor name, x := range Env {\n\t\tdict = append(dict, name)\n\t\tv := reflect.ValueOf(x)\n\t\tif v.Kind() == reflect.Struct {\n\t\t\tfor i := 0; i < v.NumField(); i++ {\n\t\t\t\tdict = append(dict, v.Type().Field(i).Name)\n\t\t\t}\n\t\t\tfor i := 0; i < v.NumMethod(); i++ {\n\t\t\t\tdict = append(dict, v.Type().Method(i).Name)\n\t\t\t}\n\t\t}\n\t\tif v.Kind() == reflect.Map {\n\t\t\tfor _, key := range v.MapKeys() {\n\t\t\t\tdict = append(dict, fmt.Sprintf(\"%v\", key.Interface()))\n\t\t\t}\n\t\t}\n\t}\n\tfor _, b := range builtin.Builtins {\n\t\tif b.Predicate {\n\t\t\tpredicates = append(predicates, b.Name)\n\t\t} else {\n\t\t\tbuiltins = append(builtins, b.Name)\n\t\t}\n\t}\n}\n\nfunc main() {\n\truntime.GOMAXPROCS(runtime.NumCPU())\n\n\tvar corpus = make(map[string]struct{})\n\tvar corpusMutex sync.Mutex\n\n\tnumWorkers := runtime.NumCPU()\n\tvar wg sync.WaitGroup\n\twg.Add(numWorkers)\n\n\tfor i := 0; i < numWorkers; i++ {\n\t\tgo func(workerID int) {\n\t\t\tdefer func() {\n\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\tfmt.Printf(\"Worker %d recovered from panic: %v\\n\", workerID, r)\n\t\t\t\t\tdebug.PrintStack()\n\t\t\t\t}\n\t\t\t}()\n\n\t\t\tdefer wg.Done()\n\t\t\tfor {\n\t\t\t\tvar code string\n\n\t\t\t\tcode = node(oneOf(list[int]{\n\t\t\t\t\t{3, 100},\n\t\t\t\t\t{4, 40},\n\t\t\t\t\t{5, 50},\n\t\t\t\t\t{6, 30},\n\t\t\t\t\t{7, 20},\n\t\t\t\t\t{8, 10},\n\t\t\t\t\t{9, 5},\n\t\t\t\t\t{10, 5},\n\t\t\t\t}))\n\n\t\t\t\tprogram, err := expr.Compile(code, expr.Env(Env))\n\t\t\t\tif err != nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t_, err = expr.Run(program, Env)\n\t\t\t\tif err != nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tcorpusMutex.Lock()\n\t\t\t\tif _, exists := corpus[code]; exists {\n\t\t\t\t\tcorpusMutex.Unlock()\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tcorpus[code] = struct{}{}\n\t\t\t\tcorpusMutex.Unlock()\n\n\t\t\t\tfmt.Println(code)\n\t\t\t}\n\t\t}(i)\n\t}\n\n\twg.Wait()\n}\n\ntype fn func(depth int) string\n\nfunc node(depth int) string {\n\tif depth <= 0 {\n\t\treturn oneOf(list[fn]{\n\t\t\t{nilNode, 1},\n\t\t\t{envNode, 1},\n\t\t\t{floatNode, 1},\n\t\t\t{integerNode, 1},\n\t\t\t{stringNode, 1},\n\t\t\t{booleanNode, 1},\n\t\t\t{identifierNode, 10},\n\t\t\t{pointerNode, 10},\n\t\t})(depth - 1)\n\t}\n\treturn oneOf(list[fn]{\n\t\t{sequenceNode, 1},\n\t\t{variableNode, 1},\n\t\t{arrayNode, 10},\n\t\t{mapNode, 10},\n\t\t{identifierNode, 1000},\n\t\t{memberNode, 1500},\n\t\t{unaryNode, 100},\n\t\t{binaryNode, 2000},\n\t\t{callNode, 2000},\n\t\t{pipeNode, 1000},\n\t\t{builtinNode, 500},\n\t\t{predicateNode, 1000},\n\t\t{pointerNode, 500},\n\t\t{sliceNode, 100},\n\t\t{conditionalNode, 100},\n\t})(depth - 1)\n}\n\nfunc nilNode(_ int) string {\n\treturn \"nil\"\n}\n\nfunc envNode(_ int) string {\n\treturn \"$env\"\n}\n\nfunc floatNode(_ int) string {\n\treturn \"1.0\"\n}\n\nfunc integerNode(_ int) string {\n\treturn oneOf(list[string]{\n\t\t{\"1\", 1},\n\t\t{\"0\", 1},\n\t})\n}\n\nfunc stringNode(_ int) string {\n\treturn \"foo\"\n}\n\nfunc booleanNode(_ int) string {\n\treturn random([]string{\"true\", \"false\"})\n}\n\nfunc identifierNode(_ int) string {\n\tif maybe() {\n\t\treturn \"foobar\"\n\t}\n\treturn random(dict)\n}\n\nfunc memberNode(depth int) string {\n\tdot := \".\"\n\tif maybe() {\n\t\tdot = \"?.\"\n\t}\n\tprop := oneOf(list[fn]{\n\t\t{func(_ int) string { return random(dict) }, 5},\n\t\t{node, 1},\n\t})(depth - 1)\n\tif maybe() {\n\t\treturn fmt.Sprintf(\"%v%v%v\", node(depth-1), dot, prop)\n\t}\n\treturn fmt.Sprintf(\"%v%v[%v]\", node(depth-1), dot, prop)\n}\n\nfunc unaryNode(depth int) string {\n\top := random([]string{\"-\", \"!\", \"not\"})\n\t// Use a simple formatting to ensure valid unary expression syntax\n\tif op == \"not\" {\n\t\treturn fmt.Sprintf(\"not %v\", node(depth-1))\n\t}\n\treturn fmt.Sprintf(\"%s%v\", op, node(depth-1))\n}\n\nfunc binaryNode(depth int) string {\n\treturn fmt.Sprintf(\"%v %v %v\", node(depth-1), random(operators), node(depth-1))\n}\n\nfunc methodNode(depth int) string {\n\tdot := \".\"\n\tif maybe() {\n\t\tdot = \"?.\"\n\t}\n\tmethod := random(dict)\n\tif maybe() {\n\t\treturn fmt.Sprintf(\"%v%v%v\", node(depth-1), dot, method)\n\t}\n\treturn fmt.Sprintf(\"%v%v[%v]\", node(depth-1), dot, method)\n}\n\nfunc funcNode(_ int) string {\n\treturn random(dict)\n}\n\nfunc callNode(depth int) string {\n\tvar args []string\n\tfor i := 0; i < oneOf(list[int]{\n\t\t{0, 100},\n\t\t{1, 100},\n\t\t{2, 50},\n\t\t{3, 25},\n\t\t{4, 10},\n\t\t{5, 5},\n\t}); i++ {\n\t\targs = append(args, node(depth-1))\n\t}\n\n\tfn := oneOf(list[fn]{\n\t\t{methodNode, 2},\n\t\t{funcNode, 2},\n\t})(depth - 1)\n\n\treturn fmt.Sprintf(\"%v(%v)\", fn, strings.Join(args, \", \"))\n}\n\nfunc pipeNode(depth int) string {\n\ta := node(depth - 1)\n\tb := oneOf(list[fn]{\n\t\t{callNode, 2},\n\t\t{builtinNode, 5},\n\t\t{predicateNode, 10},\n\t})(depth - 1)\n\n\treturn fmt.Sprintf(\"%v | %v\", a, b)\n}\n\nfunc builtinNode(depth int) string {\n\tvar args []string\n\tfor i := 0; i < oneOf(list[int]{\n\t\t{1, 100},\n\t\t{2, 50},\n\t\t{3, 50},\n\t\t{4, 10},\n\t}); i++ {\n\t\targs = append(args, node(depth-1))\n\t}\n\treturn fmt.Sprintf(\"%v(%v)\", random(builtins), strings.Join(args, \", \"))\n}\n\nfunc predicateNode(depth int) string {\n\tvar args []string\n\tfor i := 0; i < oneOf(list[int]{\n\t\t{1, 100},\n\t\t{2, 50},\n\t\t{3, 50},\n\t}); i++ {\n\t\targs = append(args, node(depth-1))\n\t}\n\treturn fmt.Sprintf(\"%v(%v)\", random(predicates), strings.Join(args, \", \"))\n}\n\nfunc pointerNode(_ int) string {\n\treturn oneOf(list[string]{\n\t\t{\"#\", 100},\n\t\t{\"#.\" + random(dict), 100},\n\t\t{\".\" + random(dict), 100},\n\t\t{\"#acc\", 10},\n\t\t{\"#index\", 10},\n\t})\n}\n\nfunc arrayNode(depth int) string {\n\tvar items []string\n\tfor i := 0; i < oneOf(list[int]{\n\t\t{1, 100},\n\t\t{2, 50},\n\t\t{3, 25},\n\t}); i++ {\n\t\titems = append(items, node(depth-1))\n\t}\n\treturn fmt.Sprintf(\"[%v]\", strings.Join(items, \", \"))\n}\n\nfunc mapNode(depth int) string {\n\tvar items []string\n\tfor i := 0; i < oneOf(list[int]{\n\t\t{1, 100},\n\t\t{2, 50},\n\t\t{3, 25},\n\t}); i++ {\n\t\titems = append(items, fmt.Sprintf(\"%v: %v\", stringNode(depth-1), node(depth-1)))\n\t}\n\treturn fmt.Sprintf(\"{%v}\", strings.Join(items, \", \"))\n}\n\nfunc sliceNode(depth int) string {\n\treturn oneOf(list[string]{\n\t\t{fmt.Sprintf(\"%v[%v:%v]\", node(depth-1), node(depth-1), node(depth-1)), 100},\n\t\t{fmt.Sprintf(\"%v[%v:]\", node(depth-1), node(depth-1)), 100},\n\t\t{fmt.Sprintf(\"%v[:%v]\", node(depth-1), node(depth-1)), 100},\n\t\t{fmt.Sprintf(\"%v[:]\", node(depth-1)), 1},\n\t})\n}\n\nfunc conditionalNode(depth int) string {\n\treturn oneOf(list[string]{\n\t\t{fmt.Sprintf(\"if %v { %v } else { %v }\", node(depth-1), node(depth-1), node(depth-1)), 100},\n\t\t{fmt.Sprintf(\"if %v { %v } else %v\", node(depth-1), node(depth-1), node(depth-1)), 100},\n\t\t{fmt.Sprintf(\"%v ? %v : %v\", node(depth-1), node(depth-1), node(depth-1)), 100},\n\t\t{fmt.Sprintf(\"%v ?: %v\", node(depth-1), node(depth-1)), 20},\n\t})\n}\n\nfunc sequenceNode(depth int) string {\n\tvar items []string\n\tfor i := 0; i < oneOf(list[int]{\n\t\t{2, 50},\n\t\t{3, 25},\n\t}); i++ {\n\t\titems = append(items, node(depth-1))\n\t}\n\tif maybe() {\n\t\treturn strings.Join(items, \"; \")\n\t}\n\treturn fmt.Sprintf(\"(%v)\", strings.Join(items, \", \"))\n}\n\nfunc variableNode(depth int) string {\n\t// Generate 1-3 variable declarations with diverse names and then make sure\n\t// at least one of them is used in the final expression.\n\tnamesPool := []string{\"x\", \"y\", \"z\", \"foo\", \"bar\", \"foobar\", \"tmp\"}\n\tnDecls := oneOf(list[int]{\n\t\t{1, 60},\n\t\t{2, 30},\n\t\t{3, 10},\n\t})\n\n\tvar decls []string\n\tvar chosen []string\n\tfor i := 0; i < nDecls; i++ {\n\t\tname := random(namesPool)\n\t\tchosen = append(chosen, name)\n\t\tdecls = append(decls, fmt.Sprintf(\"let %s = %v\", name, node(depth-1)))\n\t}\n\n\t// Build a usage expression that references declared vars to guarantee coverage.\n\tuse := oneOf(list[string]{\n\t\t{chosen[0], 50},\n\t\t{fmt.Sprintf(\"%s + %v\", chosen[0], node(depth-1)), 30},\n\t\t{fmt.Sprintf(\"%v + %s\", node(depth-1), chosen[0]), 30},\n\t\t{fmt.Sprintf(\"if %v { %s } else { %v }\", node(depth-1), chosen[0], node(depth-1)), 20},\n\t\t{fmt.Sprintf(\"%s ? %v : %v\", chosen[0], node(depth-1), node(depth-1)), 10},\n\t})\n\n\treturn fmt.Sprintf(\"%s; %s\", strings.Join(decls, \"; \"), use)\n}\n"
  },
  {
    "path": "test/gen/gen_test.go",
    "content": "package main\n\nimport (\n\t\"bufio\"\n\t\"flag\"\n\t\"os\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\nvar updateFlag = flag.Bool(\"update\", false, \"Drop failing lines from examples.txt\")\n\nfunc TestGenerated(t *testing.T) {\n\tflag.Parse()\n\n\tb, err := os.ReadFile(\"../../testdata/generated.txt\")\n\trequire.NoError(t, err)\n\n\texamples := strings.TrimSpace(string(b))\n\tvar validLines []string\n\n\tfor _, line := range strings.Split(examples, \"\\n\") {\n\t\tline := line\n\t\tt.Run(line, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(line, expr.Env(Env))\n\t\t\tif err != nil {\n\t\t\t\tif !*updateFlag {\n\t\t\t\t\tt.Errorf(\"Compilation failed: %v\", err)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t_, err = expr.Run(program, Env)\n\t\t\tif err != nil {\n\t\t\t\tif !*updateFlag {\n\t\t\t\t\tt.Errorf(\"Execution failed: %v\", err)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvalidLines = append(validLines, line)\n\t\t})\n\t}\n\n\tif *updateFlag {\n\t\tfile, err := os.Create(\"../../testdata/examples.txt\")\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to update examples.txt: %v\", err)\n\t\t}\n\t\tdefer func(file *os.File) {\n\t\t\t_ = file.Close()\n\t\t}(file)\n\n\t\twriter := bufio.NewWriter(file)\n\t\tfor _, line := range validLines {\n\t\t\t_, err := writer.WriteString(line + \"\\n\")\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to write to examples.txt: %v\", err)\n\t\t\t}\n\t\t}\n\t\t_ = writer.Flush()\n\t}\n}\n"
  },
  {
    "path": "test/gen/utils.go",
    "content": "package main\n\nimport (\n\t\"math/rand\"\n)\n\nfunc maybe() bool {\n\treturn rand.Intn(2) == 0\n}\n\ntype list[T any] []element[T]\n\ntype element[T any] struct {\n\tvalue  T\n\tweight int\n}\n\nfunc oneOf[T any](cases []element[T]) T {\n\ttotal := 0\n\tfor _, c := range cases {\n\t\ttotal += c.weight\n\t}\n\tr := rand.Intn(total)\n\tfor _, c := range cases {\n\t\tif r < c.weight {\n\t\t\treturn c.value\n\t\t}\n\t\tr -= c.weight\n\t}\n\treturn cases[0].value\n}\n\nfunc random[T any](array []T) T {\n\treturn array[rand.Intn(len(array))]\n}\n"
  },
  {
    "path": "test/interface/interface_method_test.go",
    "content": "package interface_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n)\n\ntype Bar interface {\n\tBar() int\n}\n\ntype FooImpl struct{}\n\nfunc (f FooImpl) Foo() Bar {\n\treturn BarImpl{}\n}\n\ntype BarImpl struct{}\n\n// Aba is a special method that is not part of the Bar interface,\n// but is used to test that the correct method is called. \"Aba\" name\n// is chosen to be before \"Bar\" in the alphabet.\nfunc (b BarImpl) Aba() bool {\n\treturn true\n}\n\nfunc (b BarImpl) Bar() int {\n\treturn 42\n}\n\nfunc TestInterfaceMethod(t *testing.T) {\n\trequire.True(t, BarImpl{}.Aba())\n\trequire.True(t, BarImpl{}.Bar() == 42)\n\n\tenv := map[string]any{\n\t\t\"var\": FooImpl{},\n\t}\n\tp, err := expr.Compile(`var.Foo().Bar()`, expr.Env(env))\n\tassert.NoError(t, err)\n\n\tout, err := expr.Run(p, env)\n\tassert.NoError(t, err)\n\tassert.Equal(t, 42, out)\n}\n"
  },
  {
    "path": "test/interface/interface_test.go",
    "content": "package interface_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n)\n\ntype StoreInterface interface {\n\tGet(string) int\n}\n\ntype StoreImpt struct{}\n\nfunc (f StoreImpt) Get(s string) int {\n\treturn 42\n}\n\nfunc (f StoreImpt) Set(s string, i int) bool {\n\treturn true\n}\n\ntype Env struct {\n\tStore StoreInterface `expr:\"store\"`\n}\n\nfunc TestInterfaceHide(t *testing.T) {\n\tvar env Env\n\tp, err := expr.Compile(`store.Get(\"foo\")`, expr.Env(env))\n\tassert.NoError(t, err)\n\n\tout, err := expr.Run(p, Env{Store: StoreImpt{}})\n\tassert.NoError(t, err)\n\tassert.Equal(t, 42, out)\n\n\t_, err = expr.Compile(`store.Set(\"foo\", 100)`, expr.Env(env))\n\tassert.Error(t, err)\n\tassert.Contains(t, err.Error(), \"type interface_test.StoreInterface has no method Set\")\n}\n"
  },
  {
    "path": "test/issues/461/issue_test.go",
    "content": "package issue_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\nfunc TestIssue461(t *testing.T) {\n\ttype EnvStr string\n\ttype EnvField struct {\n\t\tS   EnvStr\n\t\tStr string\n\t}\n\ttype Env struct {\n\t\tS        EnvStr\n\t\tStr      string\n\t\tEnvField EnvField\n\t}\n\tvar tests = []struct {\n\t\tinput string\n\t\tenv   Env\n\t\twant  bool\n\t\terr   string\n\t}{\n\t\t{\n\t\t\tinput: \"Str == S\",\n\t\t\tenv:   Env{S: \"string\", Str: \"string\"},\n\t\t\terr:   \"invalid operation: == (mismatched types string and issue_test.EnvStr)\",\n\t\t},\n\t\t{\n\t\t\tinput: \"Str == Str\",\n\t\t\tenv:   Env{Str: \"string\"},\n\t\t\twant:  true,\n\t\t},\n\t\t{\n\t\t\tinput: \"S == S\",\n\t\t\tenv:   Env{Str: \"string\"},\n\t\t\twant:  true,\n\t\t},\n\t\t{\n\t\t\tinput: `Str == \"string\"`,\n\t\t\tenv:   Env{Str: \"string\"},\n\t\t\twant:  true,\n\t\t},\n\t\t{\n\t\t\tinput: `S == \"string\"`,\n\t\t\tenv:   Env{Str: \"string\"},\n\t\t\terr:   \"invalid operation: == (mismatched types issue_test.EnvStr and string)\",\n\t\t},\n\t\t{\n\t\t\tinput: \"EnvField.Str == EnvField.S\",\n\t\t\tenv:   Env{EnvField: EnvField{S: \"string\", Str: \"string\"}},\n\t\t\terr:   \"invalid operation: == (mismatched types string and issue_test.EnvStr)\",\n\t\t},\n\t\t{\n\t\t\tinput: \"EnvField.Str == EnvField.Str\",\n\t\t\tenv:   Env{EnvField: EnvField{Str: \"string\"}},\n\t\t\twant:  true,\n\t\t},\n\t\t{\n\t\t\tinput: \"EnvField.S == EnvField.S\",\n\t\t\tenv:   Env{EnvField: EnvField{Str: \"string\"}},\n\t\t\twant:  true,\n\t\t},\n\t\t{\n\t\t\tinput: `EnvField.Str == \"string\"`,\n\t\t\tenv:   Env{EnvField: EnvField{Str: \"string\"}},\n\t\t\twant:  true,\n\t\t},\n\t\t{\n\t\t\tinput: `EnvField.S == \"string\"`,\n\t\t\tenv:   Env{EnvField: EnvField{Str: \"string\"}},\n\t\t\terr:   \"invalid operation: == (mismatched types issue_test.EnvStr and string)\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.input, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.input, expr.Env(tt.env), expr.AsBool())\n\n\t\t\tif tt.err != \"\" {\n\t\t\t\trequire.Error(t, err)\n\t\t\t\trequire.Contains(t, err.Error(), tt.err)\n\t\t\t} else {\n\t\t\t\tout, err := expr.Run(program, tt.env)\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\trequire.Equal(t, tt.want, out)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "test/issues/567/issue_test.go",
    "content": "package expr_test\n\nimport (\n\t\"bytes\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\nfunc TestIssue567(t *testing.T) {\n\tprogram, err := expr.Compile(\"concat(1..2, 3..4)\")\n\trequire.NoError(t, err)\n\n\tvar buf bytes.Buffer\n\tprogram.DisassembleWriter(&buf)\n\toutput := buf.String()\n\n\t// Check if \"concat\" is mentioned in the output\n\trequire.True(t, strings.Contains(output, \"concat\"), \"expected 'concat' in disassembly output\")\n\n\t// It should appear as a pushed constant\n\trequire.True(t, strings.Contains(output, \"OpPush\\t<4>\\tconcat\"), \"expected 'OpPush <4> concat' in disassembly output\")\n}\n"
  },
  {
    "path": "test/issues/688/issue_test.go",
    "content": "package issue_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\ntype Foo interface {\n\tAdd(a int, b *int) int\n}\n\ntype FooImpl struct {\n}\n\nfunc (*FooImpl) Add(a int, b *int) int {\n\treturn 0\n}\n\ntype Env struct {\n\tFoo Foo `expr:\"foo\"`\n}\n\nfunc (Env) Any(x any) any {\n\treturn x\n}\n\nfunc TestNoInterfaceMethodWithNil(t *testing.T) {\n\tprogram, err := expr.Compile(`foo.Add(1, nil)`)\n\trequire.NoError(t, err)\n\n\t_, err = expr.Run(program, Env{Foo: &FooImpl{}})\n\trequire.NoError(t, err)\n}\n\nfunc TestNoInterfaceMethodWithNil_with_env(t *testing.T) {\n\tprogram, err := expr.Compile(`foo.Add(1, nil)`, expr.Env(Env{}))\n\trequire.NoError(t, err)\n\n\t_, err = expr.Run(program, Env{Foo: &FooImpl{}})\n\trequire.NoError(t, err)\n}\n\nfunc TestNoInterfaceMethodWithNil_with_any(t *testing.T) {\n\tprogram, err := expr.Compile(`Any(nil)`, expr.Env(Env{}))\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, Env{Foo: &FooImpl{}})\n\trequire.NoError(t, err)\n\trequire.Equal(t, nil, out)\n}\n"
  },
  {
    "path": "test/issues/723/issue_test.go",
    "content": "package issue_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\nfunc TestIssue723(t *testing.T) {\n\temptyMap := make(map[string]string)\n\tenv := map[string]interface{}{\n\t\t\"empty_map\": emptyMap,\n\t}\n\n\tcode := `get(empty_map, \"non_existing_key\")`\n\n\tprogram, err := expr.Compile(code, expr.Env(env))\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, nil, output)\n}\n"
  },
  {
    "path": "test/issues/730/issue_test.go",
    "content": "package issue_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\ntype ModeEnum int\n\nconst (\n\tModeEnumA ModeEnum = 1\n)\n\ntype Env struct {\n\tMode *ModeEnum\n}\n\nfunc TestIssue730(t *testing.T) {\n\tcode := `int(Mode) == 1`\n\n\ttmp := ModeEnumA\n\n\tenv := map[string]any{\n\t\t\"Mode\": &tmp,\n\t}\n\n\tprogram, err := expr.Compile(code, expr.Env(env))\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.True(t, output.(bool))\n}\n\nfunc TestIssue730_warn_about_different_types(t *testing.T) {\n\tcode := `Mode == 1`\n\n\t_, err := expr.Compile(code, expr.Env(Env{}))\n\trequire.Error(t, err)\n\trequire.Contains(t, err.Error(), \"invalid operation: == (mismatched types issue_test.ModeEnum and int)\")\n}\n\nfunc TestIssue730_eval(t *testing.T) {\n\tcode := `Mode == 1`\n\n\ttmp := ModeEnumA\n\n\tenv := map[string]any{\n\t\t\"Mode\": &tmp,\n\t}\n\n\t// Golang also does not allow this:\n\t// _ = ModeEnumA == int(1) // will not compile\n\n\tout, err := expr.Eval(code, env)\n\trequire.NoError(t, err)\n\trequire.False(t, out.(bool))\n}\n"
  },
  {
    "path": "test/issues/739/issue_test.go",
    "content": "package issue_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\nfunc TestIssue739(t *testing.T) {\n\tjsonString := `{\"Num\": 1}`\n\tenv := map[string]any{\n\t\t\"aJSONString\": &jsonString,\n\t}\n\n\tresult, err := expr.Eval(\"fromJSON(aJSONString)\", env)\n\trequire.NoError(t, err)\n\trequire.Contains(t, result, \"Num\")\n}\n"
  },
  {
    "path": "test/issues/756/issue_test.go",
    "content": "package issue_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\ntype X struct{}\n\nfunc (x *X) HelloCtx(ctx context.Context, text string) error {\n\treturn nil\n}\n\nfunc TestIssue756(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"_goctx_\": context.TODO(),\n\t\t\"_g_\": map[string]*X{\n\t\t\t\"rpc\": {},\n\t\t},\n\t\t\"text\": \"еуче\",\n\t}\n\texprStr := `let v = _g_.rpc.HelloCtx(text); v`\n\tprogram, err := expr.Compile(exprStr, expr.Env(env), expr.WithContext(\"_goctx_\"))\n\trequire.NoError(t, err)\n\n\t_, err = expr.Run(program, env)\n\trequire.NoError(t, err)\n}\n"
  },
  {
    "path": "test/issues/785/issue_test.go",
    "content": "package issue_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\nfunc TestIssue785(t *testing.T) {\n\temptyMap := map[string]any{}\n\n\tenv := map[string]interface{}{\n\t\t\"empty_map\": emptyMap,\n\t}\n\n\t{\n\t\tcode := `get(empty_map, \"non_existing_key\") | get(\"some_key\") | get(\"another_key\") | get(\"yet_another_key\") | get(\"last_key\")`\n\n\t\tprogram, err := expr.Compile(code, expr.Env(env))\n\t\trequire.NoError(t, err)\n\n\t\toutput, err := expr.Run(program, env)\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, nil, output)\n\t}\n\n\t{\n\t\tcode := `{} | get(\"non_existing_key\") | get(\"some_key\") | get(\"another_key\") | get(\"yet_another_key\") | get(\"last_key\")`\n\n\t\tprogram, err := expr.Compile(code, expr.Env(env))\n\t\trequire.NoError(t, err)\n\n\t\toutput, err := expr.Run(program, env)\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, nil, output)\n\t}\n}\n"
  },
  {
    "path": "test/issues/817/issue_test.go",
    "content": "package issue_test\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\nfunc TestIssue817_1(t *testing.T) {\n\tout, err := expr.Eval(\n\t\t`sprintf(\"result: %v %v\", 1, nil)`,\n\t\tmap[string]any{\n\t\t\t\"sprintf\": fmt.Sprintf,\n\t\t},\n\t)\n\trequire.NoError(t, err)\n\trequire.Equal(t, \"result: 1 <nil>\", out)\n}\n\nfunc TestIssue817_2(t *testing.T) {\n\tout, err := expr.Eval(\n\t\t`thing(nil)`,\n\t\tmap[string]any{\n\t\t\t\"thing\": func(arg ...any) string {\n\t\t\t\treturn fmt.Sprintf(\"result: (%T) %v\", arg[0], arg[0])\n\t\t\t},\n\t\t},\n\t)\n\trequire.NoError(t, err)\n\trequire.Equal(t, \"result: (<nil>) <nil>\", out)\n}\n"
  },
  {
    "path": "test/issues/819/issue_test.go",
    "content": "package issue_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\nfunc TestIssue819(t *testing.T) {\n\tt.Run(\"case 1\", func(t *testing.T) {\n\t\tprogram, err := expr.Compile(`\n\t\t\tlet a = [1];\n\t\t\tlet b = type(a[0]) == 'array' ? a : [a];\n\t\t\tb[0][0]\n\t\t`)\n\t\trequire.NoError(t, err)\n\n\t\tout, err := expr.Run(program, nil)\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, 1, out)\n\t})\n\n\tt.Run(\"case 2\", func(t *testing.T) {\n\t\tprogram, err := expr.Compile(`\n\t\t\tlet range = [1,1000];\n\t\t\tlet arr = false ? range : [range];\n\t\t\tmap(arr, {len(#)})\n\t\t`)\n\t\trequire.NoError(t, err)\n\n\t\tout, err := expr.Run(program, nil)\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, []interface{}{2}, out)\n\t})\n}\n"
  },
  {
    "path": "test/issues/823/issue_test.go",
    "content": "package issue_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\ntype env struct {\n\tCtx context.Context `expr:\"ctx\"`\n}\n\n// TestIssue823 verifies that WithContext injects context into nested custom\n// function calls. The bug was that date2() nested as an argument to After()\n// didn't receive the context because its callee type was unknown.\nfunc TestIssue823(t *testing.T) {\n\tnow2Called := false\n\tdate2Called := false\n\n\tp, err := expr.Compile(\n\t\t\"now2().After(date2())\",\n\t\texpr.Env(env{}),\n\t\texpr.WithContext(\"ctx\"),\n\t\texpr.Function(\n\t\t\t\"now2\",\n\t\t\tfunc(params ...any) (any, error) {\n\t\t\t\trequire.Len(t, params, 1, \"now2 should receive context\")\n\t\t\t\t_, ok := params[0].(context.Context)\n\t\t\t\trequire.True(t, ok, \"now2 first param should be context.Context\")\n\t\t\t\tnow2Called = true\n\t\t\t\treturn time.Now(), nil\n\t\t\t},\n\t\t\tnew(func(context.Context) time.Time),\n\t\t),\n\t\texpr.Function(\n\t\t\t\"date2\",\n\t\t\tfunc(params ...any) (any, error) {\n\t\t\t\trequire.Len(t, params, 1, \"date2 should receive context\")\n\t\t\t\t_, ok := params[0].(context.Context)\n\t\t\t\trequire.True(t, ok, \"date2 first param should be context.Context\")\n\t\t\t\tdate2Called = true\n\t\t\t\treturn time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), nil\n\t\t\t},\n\t\t\tnew(func(context.Context) time.Time),\n\t\t),\n\t)\n\trequire.NoError(t, err)\n\n\tr, err := expr.Run(p, &env{Ctx: context.Background()})\n\trequire.NoError(t, err)\n\trequire.True(t, r.(bool))\n\trequire.True(t, now2Called, \"now2 should have been called\")\n\trequire.True(t, date2Called, \"date2 should have been called\")\n}\n\n// envWithMethods tests that Env methods with context.Context work correctly\n// when nested in method chains (similar to TestIssue823 but with Env methods).\ntype envWithMethods struct {\n\tCtx context.Context `expr:\"ctx\"`\n}\n\nfunc (e *envWithMethods) Now2(ctx context.Context) time.Time {\n\treturn time.Now()\n}\n\nfunc (e *envWithMethods) Date2(ctx context.Context) time.Time {\n\treturn time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)\n}\n\nfunc TestIssue823_EnvMethods(t *testing.T) {\n\tp, err := expr.Compile(\n\t\t\"Now2().After(Date2())\",\n\t\texpr.Env(&envWithMethods{}),\n\t\texpr.WithContext(\"ctx\"),\n\t)\n\trequire.NoError(t, err)\n\n\tr, err := expr.Run(p, &envWithMethods{Ctx: context.Background()})\n\trequire.NoError(t, err)\n\trequire.True(t, r.(bool))\n}\n"
  },
  {
    "path": "test/issues/830/issue_test.go",
    "content": "package issues\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\nfunc TestIssue830(t *testing.T) {\n\tprogram, err := expr.Compile(\"varNotExist\", expr.AllowUndefinedVariables(), expr.AsBool())\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, map[string]interface{}{})\n\trequire.NoError(t, err)\n\n\t// The user expects output to be false (bool), but gets nil.\n\tassert.Equal(t, false, output)\n}\n"
  },
  {
    "path": "test/issues/836/issue_test.go",
    "content": "package issue_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\ntype InputStruct struct {\n\tEnabled *bool `json:\"enabled\"`\n}\n\nfunc TestIssue836(t *testing.T) {\n\tstr := \"foo\"\n\tptrStr := &str\n\tb := true\n\tptrBool := &b\n\ti := 1\n\tptrInt := &i\n\n\tenv := map[string]interface{}{\n\t\t\"ptrStr\":  ptrStr,\n\t\t\"ptrBool\": ptrBool,\n\t\t\"ptrInt\":  ptrInt,\n\t\t\"arr\":     []int{1, 2, 3},\n\t\t\"mapPtr\":  map[*int]int{ptrInt: 42},\n\t}\n\n\tt.Run(\"map access with pointer key\", func(t *testing.T) {\n\t\tprogram, err := expr.Compile(`{\"foo\": \"bar\"}[ptrStr]`, expr.Env(env))\n\t\trequire.NoError(t, err)\n\n\t\toutput, err := expr.Run(program, env)\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, \"bar\", output)\n\t})\n\n\tt.Run(\"conditional with pointer condition\", func(t *testing.T) {\n\t\tprogram, err := expr.Compile(`ptrBool ? 1 : 0`, expr.Env(env))\n\t\trequire.NoError(t, err)\n\n\t\toutput, err := expr.Run(program, env)\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, 1, output)\n\t})\n\n\tt.Run(\"get() with pointer key\", func(t *testing.T) {\n\t\tprogram, err := expr.Compile(`get({\"foo\": \"bar\"}, ptrStr)`, expr.Env(env))\n\t\trequire.NoError(t, err)\n\n\t\toutput, err := expr.Run(program, env)\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, \"bar\", output)\n\t})\n\n\tt.Run(\"struct field pointer check in ternary\", func(t *testing.T) {\n\t\tvar v InputStruct\n\t\t// v.Enabled is nil\n\n\t\tenv := map[string]any{\n\t\t\t\"v\": v,\n\t\t}\n\n\t\tcode := `v.Enabled == nil ? 'default' : ( v.Enabled ? 'enabled' : 'disabled' )`\n\n\t\tprogram, err := expr.Compile(code, expr.Env(env))\n\t\trequire.NoError(t, err)\n\n\t\toutput, err := expr.Run(program, env)\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, \"default\", output)\n\t})\n\n\tt.Run(\"struct field pointer check in ternary (enabled)\", func(t *testing.T) {\n\t\tb := true\n\t\tv := InputStruct{Enabled: &b}\n\n\t\tenv := map[string]any{\n\t\t\t\"v\": v,\n\t\t}\n\n\t\tcode := `v.Enabled == nil ? 'default' : ( v.Enabled ? 'enabled' : 'disabled' )`\n\n\t\tprogram, err := expr.Compile(code, expr.Env(env))\n\t\trequire.NoError(t, err)\n\n\t\toutput, err := expr.Run(program, env)\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, \"enabled\", output)\n\t})\n\n\tt.Run(\"slice with pointer indices\", func(t *testing.T) {\n\t\tprogram, err := expr.Compile(`arr[ptrInt:ptrInt]`, expr.Env(env))\n\t\trequire.NoError(t, err)\n\n\t\toutput, err := expr.Run(program, env)\n\t\trequire.NoError(t, err)\n\t\trequire.Equal(t, []int{}, output)\n\t})\n}\n"
  },
  {
    "path": "test/issues/840/issue_test.go",
    "content": "package issue_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\nfunc TestEnvFieldMethods(t *testing.T) {\n\tprogram, err := expr.Compile(`Func() + Int`, expr.Env(&Env{}))\n\trequire.NoError(t, err)\n\n\tenv := &Env{}\n\tenv.Func = func() int {\n\t\treturn 40\n\t}\n\tenv.EmbeddedEnv = &EmbeddedEnv{\n\t\tInt: 2,\n\t}\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\n\trequire.Equal(t, 42, out)\n}\n\ntype Env struct {\n\t*EmbeddedEnv\n\tFunc func() int\n}\n\ntype EmbeddedEnv struct {\n\tInt int\n}\n"
  },
  {
    "path": "test/issues/844/issue_test.go",
    "content": "package main\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/checker\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\t\"github.com/expr-lang/expr/parser\"\n)\n\nfunc TestIssue844(t *testing.T) {\n\ttestCases := []struct {\n\t\tname       string\n\t\tenv        any\n\t\texpression string\n\t\tshouldFail bool\n\t}{\n\t\t{\n\t\t\tname:       \"exported env, exported field\",\n\t\t\tenv:        ExportedEnv{},\n\t\t\texpression: `ExportedEmbedded`,\n\t\t\tshouldFail: false,\n\t\t},\n\t\t{\n\t\t\tname:       \"exported env, unexported field\",\n\t\t\tenv:        ExportedEnv{},\n\t\t\texpression: `unexportedEmbedded`,\n\t\t\tshouldFail: true,\n\t\t},\n\t\t{\n\t\t\tname:       \"exported env, exported field inherited from exported field\",\n\t\t\tenv:        ExportedEnv{},\n\t\t\texpression: `Str`,\n\t\t\tshouldFail: false,\n\t\t},\n\t\t{\n\t\t\tname:       \"exported env, unexported field inherited from exported field\",\n\t\t\tenv:        ExportedEnv{},\n\t\t\texpression: `str`,\n\t\t\tshouldFail: true,\n\t\t},\n\t\t{\n\t\t\tname:       \"exported env, exported field inherited from exported field\",\n\t\t\tenv:        ExportedEnv{},\n\t\t\texpression: `Integer`,\n\t\t\tshouldFail: false,\n\t\t},\n\t\t{\n\t\t\tname:       \"exported env, unexported field inherited from exported field\",\n\t\t\tenv:        ExportedEnv{},\n\t\t\texpression: `integer`,\n\t\t\tshouldFail: true,\n\t\t},\n\t\t{\n\t\t\tname:       \"exported env, exported field directly accessed from exported field\",\n\t\t\tenv:        ExportedEnv{},\n\t\t\texpression: `ExportedEmbedded.Str`,\n\t\t\tshouldFail: false,\n\t\t},\n\t\t{\n\t\t\tname:       \"exported env, unexported field directly accessed from exported field\",\n\t\t\tenv:        ExportedEnv{},\n\t\t\texpression: `ExportedEmbedded.str`,\n\t\t\tshouldFail: true,\n\t\t},\n\t\t{\n\t\t\tname:       \"exported env, exported field directly accessed from exported field\",\n\t\t\tenv:        ExportedEnv{},\n\t\t\texpression: `unexportedEmbedded.Integer`,\n\t\t\tshouldFail: true,\n\t\t},\n\t\t{\n\t\t\tname:       \"exported env, unexported field directly accessed from exported field\",\n\t\t\tenv:        ExportedEnv{},\n\t\t\texpression: `unexportedEmbedded.integer`,\n\t\t\tshouldFail: true,\n\t\t},\n\t\t{\n\t\t\tname:       \"unexported env, exported field\",\n\t\t\tenv:        unexportedEnv{},\n\t\t\texpression: `ExportedEmbedded`,\n\t\t\tshouldFail: false,\n\t\t},\n\t\t{\n\t\t\tname:       \"unexported env, unexported field\",\n\t\t\tenv:        unexportedEnv{},\n\t\t\texpression: `unexportedEmbedded`,\n\t\t\tshouldFail: true,\n\t\t},\n\t\t{\n\t\t\tname:       \"unexported env, exported field inherited from exported field\",\n\t\t\tenv:        unexportedEnv{},\n\t\t\texpression: `Str`,\n\t\t\tshouldFail: false,\n\t\t},\n\t\t{\n\t\t\tname:       \"unexported env, unexported field inherited from exported field\",\n\t\t\tenv:        unexportedEnv{},\n\t\t\texpression: `str`,\n\t\t\tshouldFail: true,\n\t\t},\n\t\t{\n\t\t\tname:       \"unexported env, exported field inherited from exported field\",\n\t\t\tenv:        unexportedEnv{},\n\t\t\texpression: `Integer`,\n\t\t\tshouldFail: false,\n\t\t},\n\t\t{\n\t\t\tname:       \"unexported env, unexported field inherited from exported field\",\n\t\t\tenv:        unexportedEnv{},\n\t\t\texpression: `integer`,\n\t\t\tshouldFail: true,\n\t\t},\n\t\t{\n\t\t\tname:       \"unexported env, exported field directly accessed from exported field\",\n\t\t\tenv:        unexportedEnv{},\n\t\t\texpression: `ExportedEmbedded.Str`,\n\t\t\tshouldFail: false,\n\t\t},\n\t\t{\n\t\t\tname:       \"unexported env, unexported field directly accessed from exported field\",\n\t\t\tenv:        unexportedEnv{},\n\t\t\texpression: `ExportedEmbedded.str`,\n\t\t\tshouldFail: true,\n\t\t},\n\t\t{\n\t\t\tname:       \"unexported env, exported field directly accessed from exported field\",\n\t\t\tenv:        unexportedEnv{},\n\t\t\texpression: `unexportedEmbedded.Integer`,\n\t\t\tshouldFail: true,\n\t\t},\n\t\t{\n\t\t\tname:       \"unexported env, unexported field directly accessed from exported field\",\n\t\t\tenv:        unexportedEnv{},\n\t\t\texpression: `unexportedEmbedded.integer`,\n\t\t\tshouldFail: true,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tconfig := conf.New(tc.env)\n\t\t\ttree, err := parser.ParseWithConfig(tc.expression, config)\n\t\t\trequire.NoError(t, err)\n\n\t\t\t_, err = new(checker.Checker).PatchAndCheck(tree, config)\n\t\t\tif tc.shouldFail {\n\t\t\t\trequire.Error(t, err)\n\t\t\t\terrStr := err.Error()\n\t\t\t\tif !strings.Contains(errStr, \"unknown name\") &&\n\t\t\t\t\t!strings.Contains(errStr, \" has no field \") {\n\t\t\t\t\tt.Fatalf(\"expected a different error, got: %v\", err)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\n\t\t\t// We add this because the issue was actually not catching something\n\t\t\t// that sometimes failed with the error:\n\t\t\t//\treflect.Value.Interface: cannot return value obtained from unexported field or method\n\t\t\t// This way, we test that everything we allow passing is also\n\t\t\t// allowed later\n\t\t\t_, err = expr.Eval(tc.expression, tc.env)\n\t\t\tif tc.shouldFail {\n\t\t\t\trequire.Error(t, err)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\ntype ExportedEnv struct {\n\tExportedEmbedded\n\tunexportedEmbedded\n}\n\ntype unexportedEnv struct {\n\tExportedEmbedded\n\tunexportedEmbedded\n}\n\ntype ExportedEmbedded struct {\n\tStr string\n\tstr string\n}\n\ntype unexportedEmbedded struct {\n\tInteger int\n\tinteger int\n}\n"
  },
  {
    "path": "test/issues/854/issue_test.go",
    "content": "package main\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\t\"github.com/expr-lang/expr/types\"\n)\n\nfunc TestIssue854(t *testing.T) {\n\tenvType := types.Map{\n\t\t\"user\": types.Map{\n\t\t\t// If we do not specify `Profile` here,\n\t\t\t// this is a correct behavior to throw\n\t\t\t// on a missing property.\n\t\t},\n\t}\n\n\tcode := `user.Profile?.Address ?? \"Unknown address\"`\n\n\t_, err := expr.Compile(code, expr.Env(envType))\n\trequire.Error(t, err)\n}\n"
  },
  {
    "path": "test/issues/857/issue_test.go",
    "content": "package main\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\nfunc TestIssue857(t *testing.T) {\n\tfoo := map[string]any{\n\t\t\"entry\": map[string]any{\n\t\t\t\"alpha\": \"x\",\n\t\t\t\"beta\":  1,\n\t\t},\n\t}\n\tbar := map[string]any{\n\t\t\"entry\": map[string]any{\n\t\t\t\"alpha\": \"x\",\n\t\t\t\"beta\":  1,\n\t\t},\n\t}\n\n\tenv := map[string]any{\n\t\t\"foo\": foo,\n\t\t\"bar\": bar,\n\t}\n\n\tcode := `\n\t\tfoo\n\t\t| keys()\n\t\t| filter(# in bar)\n\t\t| filter(foo[#].alpha == bar[#].alpha)\n\t\t| filter(foo[#].beta == bar[#].beta)\n\t`\n\n\t_, err := expr.Compile(code, expr.Env(env))\n\trequire.NoError(t, err)\n}\n"
  },
  {
    "path": "test/issues/888/issue_test.go",
    "content": "package main\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\ntype Container struct {\n\tID   string\n\tList []string\n}\n\nfunc (c Container) IncludesAny(s ...string) bool {\n\tfor _, l := range c.List {\n\t\t// Note: original issue used \"slices.Contains\" but\n\t\t// it is not available in the minimum Go version of expr (1.18).\n\t\tfor _, v := range s {\n\t\t\tif v == l {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n\nfunc TestIssue888(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"Container\": Container{\n\t\t\tID:   \"id\",\n\t\t\tList: []string{\"foo\", \"bar\", \"baz\"},\n\t\t},\n\t}\n\n\tcode := `Container.IncludesAny(\"nope\", \"nope again\", \"bar\")`\n\n\tprogram, err := expr.Compile(code, expr.Env(env))\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, true, output)\n}\n"
  },
  {
    "path": "test/issues/924/issue_test.go",
    "content": "package issue_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\nfunc TestIssue924_allow_disabling_builtins_and_providing_fn_at_runtime(t *testing.T) {\n\t// We disable the builtin \"upper\", but do not env information,\n\t// but we can provide a function at runtime.\n\tprogram, err := expr.Compile(`upper(1)`, expr.DisableBuiltin(\"upper\"))\n\trequire.NoError(t, err)\n\n\tenv := map[string]any{\n\t\t\"upper\": func(a int) int { return a },\n\t}\n\n\tout, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 1, out)\n}\n"
  },
  {
    "path": "test/issues/934/issue_test.go",
    "content": "package issue934\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n)\n\ntype Env struct {\n\tExported\n\tunexported\n}\n\ntype Exported struct {\n\tStr string\n\tstr string\n}\n\ntype unexported struct {\n\tInteger int\n\tinteger int\n}\n\n// TestIssue934 tests that accessing unexported fields on values whose type\n// is unknown at compile time (e.g., from a ternary with mixed types) yields\n// a descriptive error.\n//\n// OSS-Fuzz issue #486370271.\nfunc TestIssue934(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"v\": Env{},\n\t}\n\n\t// Accessing unexported fields like time.Time.loc\n        // should produce a proper error.\n\t_, err := expr.Eval(`(true ? v : \"string\").str`, env)\n\trequire.Error(t, err)\n\trequire.Contains(t, err.Error(), \"cannot fetch str\")\n\n\t// Exported field access should still work.\n\t_, err = expr.Eval(`(true ? v : \"string\").Str`, env)\n\trequire.NoError(t, err)\n\n\t// Access unexported field inherited from unexported embedded struct.\n\t_, err = expr.Eval(`(true ? v : \"string\").integer`, env)\n\trequire.Error(t, err)\n\trequire.Contains(t, err.Error(), \"cannot fetch integer\")\n\n\t// Access exported field inherited from unexported embedded struct should work.\n\t_, err = expr.Eval(`(true ? v : \"string\").Integer`, env)\n\trequire.NoError(t, err)\n}\n"
  },
  {
    "path": "test/mock/mock.go",
    "content": "package mock\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/ast\"\n)\n\ntype Env struct {\n\tEmbed\n\tAmbiguous          string\n\tAny                any\n\tBool               bool\n\tFloat              float64\n\tInt64              int64\n\tInt32              int32\n\tInt, One, Two      int\n\tUint32             uint32\n\tUint64             uint64\n\tFloat32            float32\n\tFloat64            float64\n\tString             string\n\tBoolPtr            *bool\n\tFloatPtr           *float64\n\tIntPtr             *int\n\tIntPtrPtr          **int\n\tStringPtr          *string\n\tFoo                Foo\n\tAbstract           Abstract\n\tArrayOfAny         []any\n\tArrayOfInt         []int\n\tArrayOfString      []string\n\tArrayOfFoo         []*Foo\n\tMapOfFoo           map[string]Foo\n\tMapOfAny           map[string]any\n\tMapIntAny          map[int]string\n\tFuncParam          func(_ bool, _ int, _ string) bool\n\tFuncParamAny       func(_ any) bool\n\tFuncTooManyReturns func() (int, int, error)\n\tFuncNamed          MyFunc\n\tNilAny             any\n\tNilInt             *int\n\tNilFn              func()\n\tNilStruct          *Foo\n\tNilSlice           []any\n\tVariadic           func(_ int, _ ...int) bool\n\tFast               func(...any) any\n\tTime               time.Time\n\tTimePlusDay        time.Time\n\tDuration           time.Duration\n}\n\nfunc (p Env) FuncFoo(_ Foo) int {\n\treturn 0\n}\n\nfunc (p Env) Func() int {\n\treturn 0\n}\n\nfunc (p Env) FuncTyped(_ string) int {\n\treturn 2023\n}\n\nfunc (p Env) FuncInt(_ int) int {\n\treturn 0\n}\n\nfunc (p Env) FuncUint(_ uint) int {\n\treturn 0\n}\n\nfunc (p Env) FuncInt8(_ float64) int {\n\treturn 0\n}\n\nfunc (p Env) FuncInt16(_ int16) int {\n\treturn 0\n}\n\nfunc (p Env) FuncInt32(_ int32) int {\n\treturn 0\n}\n\nfunc (p Env) FuncInt64(_ int64) int {\n\treturn 0\n}\n\nfunc (p Env) FuncUint8(_ uint8) int {\n\treturn 0\n}\n\nfunc (p Env) FuncUint16(_ uint16) int {\n\treturn 0\n}\n\nfunc (p Env) FuncUint32(_ uint32) int {\n\treturn 0\n}\n\nfunc (p Env) FuncUint64(_ uint64) int {\n\treturn 0\n}\n\nfunc (p Env) TimeEqualString(a time.Time, s string) bool {\n\treturn a.Format(\"2006-01-02\") == s\n}\n\nfunc (p Env) GetInt() int {\n\treturn p.Int\n}\n\nfunc (Env) Add(a, b int) int {\n\treturn a + b\n}\n\nfunc (Env) StringerStringEqual(f fmt.Stringer, s string) bool {\n\treturn f.String() == s\n}\n\nfunc (Env) StringStringerEqual(s string, f fmt.Stringer) bool {\n\treturn s == f.String()\n}\n\nfunc (Env) StringerStringerEqual(f fmt.Stringer, g fmt.Stringer) bool {\n\treturn f.String() == g.String()\n}\n\nfunc (Env) NotStringerStringEqual(f fmt.Stringer, s string) bool {\n\treturn f.String() != s\n}\n\nfunc (Env) NotStringStringerEqual(s string, f fmt.Stringer) bool {\n\treturn s != f.String()\n}\n\nfunc (Env) NotStringerStringerEqual(f fmt.Stringer, g fmt.Stringer) bool {\n\treturn f.String() != g.String()\n}\n\ntype Embed struct {\n\tEmbedEmbed\n\t*EmbedPointerEmbed\n\tEmbedString string\n}\n\nfunc (p Embed) EmbedMethod(_ int) string {\n\treturn \"\"\n}\n\ntype EmbedPointerEmbed struct {\n\tEmbedPointerEmbedInt int\n}\n\nfunc (p EmbedPointerEmbed) EmbedPointerEmbedMethod(_ int) string {\n\treturn \"\"\n}\n\nfunc (p *EmbedPointerEmbed) EmbedPointerEmbedPointerReceiverMethod(_ int) string {\n\treturn \"\"\n}\n\ntype EmbedEmbed struct {\n\tEmbedEmbedString string\n}\n\ntype Foo struct {\n\tValue string\n\tBar   Bar\n}\n\nfunc (Foo) Method() Bar {\n\treturn Bar{\n\t\tBaz: \"baz (from Foo.Method)\",\n\t}\n}\n\nfunc (f Foo) MethodWithArgs(prefix string) string {\n\treturn prefix + f.Value\n}\n\nfunc (Foo) String() string {\n\treturn \"Foo.String\"\n}\n\nfunc (Foo) VariadicMethod(_ ...string) bool {\n\treturn true\n}\n\ntype Bar struct {\n\tBaz string\n}\n\ntype Abstract interface {\n\tMethod(int) int\n}\n\ntype MyFunc func(string) int\n\nvar stringer = reflect.TypeOf((*fmt.Stringer)(nil)).Elem()\n\ntype StringerPatcher struct{}\n\nfunc (*StringerPatcher) Visit(node *ast.Node) {\n\tt := (*node).Type()\n\tif t == nil {\n\t\treturn\n\t}\n\tif t.Implements(stringer) {\n\t\tast.Patch(node, &ast.CallNode{\n\t\t\tCallee: &ast.MemberNode{\n\t\t\t\tNode:     *node,\n\t\t\t\tProperty: &ast.StringNode{Value: \"String\"},\n\t\t\t},\n\t\t})\n\t}\n}\n\ntype MapStringStringEnv map[string]string\n\nfunc (m MapStringStringEnv) Split(s, sep string) []string {\n\treturn strings.Split(s, sep)\n}\n\ntype MapStringIntEnv map[string]int\n\ntype Is struct{}\n\nfunc (Is) Nil(a any) bool {\n\treturn a == nil\n}\n"
  },
  {
    "path": "test/operator/issues584/issues584_test.go",
    "content": "package issues584_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\n\t\"github.com/expr-lang/expr\"\n)\n\ntype Env struct{}\n\ntype Program struct {\n}\n\nfunc (p *Program) Foo() Value {\n\treturn func(e *Env) float64 {\n\t\treturn 5\n\t}\n}\n\nfunc (p *Program) Bar() Value {\n\treturn func(e *Env) float64 {\n\t\treturn 100\n\t}\n}\n\nfunc (p *Program) AndCondition(a, b Condition) Conditions {\n\treturn Conditions{a, b}\n}\n\nfunc (p *Program) AndConditions(a Conditions, b Condition) Conditions {\n\treturn append(a, b)\n}\n\nfunc (p *Program) ValueGreaterThan_float(v Value, i float64) Condition {\n\treturn func(e *Env) bool {\n\t\trealized := v(e)\n\t\treturn realized > i\n\t}\n}\n\nfunc (p *Program) ValueLessThan_float(v Value, i float64) Condition {\n\treturn func(e *Env) bool {\n\t\trealized := v(e)\n\t\treturn realized < i\n\t}\n}\n\ntype Condition func(e *Env) bool\ntype Conditions []Condition\n\ntype Value func(e *Env) float64\n\nfunc TestIssue584(t *testing.T) {\n\tcode := `Foo() > 1.5 and Bar() < 200.0`\n\n\tp := &Program{}\n\n\topt := []expr.Option{\n\t\texpr.Env(p),\n\t\texpr.Operator(\"and\", \"AndCondition\", \"AndConditions\"),\n\t\texpr.Operator(\">\", \"ValueGreaterThan_float\"),\n\t\texpr.Operator(\"<\", \"ValueLessThan_float\"),\n\t}\n\n\tprogram, err := expr.Compile(code, opt...)\n\tassert.Nil(t, err)\n\n\tstate, err := expr.Run(program, p)\n\tassert.Nil(t, err)\n\tassert.NotNil(t, state)\n}\n"
  },
  {
    "path": "test/operator/operator_test.go",
    "content": "package operator_test\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/test/mock\"\n)\n\nfunc TestOperator_struct(t *testing.T) {\n\tenv := mock.Env{\n\t\tTime: time.Date(2017, time.October, 23, 18, 30, 0, 0, time.UTC),\n\t}\n\n\tcode := `Time == \"2017-10-23\"`\n\n\tprogram, err := expr.Compile(code, expr.Env(mock.Env{}), expr.Operator(\"==\", \"TimeEqualString\"))\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, true, output)\n}\n\nfunc TestOperator_no_env(t *testing.T) {\n\tcode := `Time == \"2017-10-23\"`\n\trequire.Panics(t, func() {\n\t\t_, _ = expr.Compile(code, expr.Operator(\"==\", \"TimeEqualString\"))\n\t})\n}\n\nfunc TestOperator_interface(t *testing.T) {\n\tenv := mock.Env{}\n\n\tcode := `Foo == \"Foo.String\" && \"Foo.String\" == Foo && Time != Foo && Time == Time`\n\n\tprogram, err := expr.Compile(\n\t\tcode,\n\t\texpr.Env(mock.Env{}),\n\t\texpr.Operator(\"==\", \"StringerStringEqual\", \"StringStringerEqual\", \"StringerStringerEqual\"),\n\t\texpr.Operator(\"!=\", \"NotStringerStringEqual\", \"NotStringStringerEqual\", \"NotStringerStringerEqual\"),\n\t)\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, true, output)\n}\n\ntype Value struct {\n\tInt int\n}\n\nfunc TestOperator_Function(t *testing.T) {\n\tenv := map[string]interface{}{\n\t\t\"foo\": Value{1},\n\t\t\"bar\": Value{2},\n\t}\n\n\ttests := []struct {\n\t\tinput string\n\t\twant  int\n\t}{\n\t\t{\n\t\t\tinput: `foo + bar`,\n\t\t\twant:  3,\n\t\t},\n\t\t{\n\t\t\tinput: `2 + 4`,\n\t\t\twant:  6,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(fmt.Sprintf(`operator function helper test %s`, tt.input), func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(\n\t\t\t\ttt.input,\n\t\t\t\texpr.Env(env),\n\t\t\t\texpr.Operator(\"+\", \"Add\", \"AddInt\"),\n\t\t\t\texpr.Function(\"Add\", func(args ...interface{}) (interface{}, error) {\n\t\t\t\t\treturn args[0].(Value).Int + args[1].(Value).Int, nil\n\t\t\t\t},\n\t\t\t\t\tnew(func(_ Value, __ Value) int),\n\t\t\t\t),\n\t\t\t\texpr.Function(\"AddInt\", func(args ...interface{}) (interface{}, error) {\n\t\t\t\t\treturn args[0].(int) + args[1].(int), nil\n\t\t\t\t},\n\t\t\t\t\tnew(func(_ int, __ int) int),\n\t\t\t\t),\n\t\t\t)\n\t\t\trequire.NoError(t, err)\n\n\t\t\toutput, err := expr.Run(program, env)\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.Equal(t, tt.want, output)\n\t\t})\n\t}\n\n}\n\nfunc TestOperator_Function_WithTypes(t *testing.T) {\n\tenv := map[string]interface{}{\n\t\t\"foo\": Value{1},\n\t\t\"bar\": Value{2},\n\t}\n\n\tassert.PanicsWithError(t, `function \"Add\" for \"+\" operator misses types`, func() {\n\t\t_, _ = expr.Compile(\n\t\t\t`foo + bar`,\n\t\t\texpr.Env(env),\n\t\t\texpr.Operator(\"+\", \"Add\", \"AddInt\"),\n\t\t\texpr.Function(\"Add\", func(args ...interface{}) (interface{}, error) {\n\t\t\t\treturn args[0].(Value).Int + args[1].(Value).Int, nil\n\t\t\t}),\n\t\t)\n\t})\n\n\tassert.PanicsWithError(t, `function \"Add\" for \"+\" operator does not have a correct signature`, func() {\n\t\t_, _ = expr.Compile(\n\t\t\t`foo + bar`,\n\t\t\texpr.Env(env),\n\t\t\texpr.Operator(\"+\", \"Add\", \"AddInt\"),\n\t\t\texpr.Function(\"Add\", func(args ...interface{}) (interface{}, error) {\n\t\t\t\treturn args[0].(Value).Int + args[1].(Value).Int, nil\n\t\t\t},\n\t\t\t\tnew(func(_ Value) int),\n\t\t\t),\n\t\t)\n\t})\n}\n\nfunc TestOperator_FunctionOverTypesPrecedence(t *testing.T) {\n\tenv := struct {\n\t\tAdd func(a, b int) int\n\t}{\n\t\tAdd: func(a, b int) int {\n\t\t\treturn a + b\n\t\t},\n\t}\n\n\tprogram, err := expr.Compile(\n\t\t`1 + 2`,\n\t\texpr.Env(env),\n\t\texpr.Operator(\"+\", \"Add\"),\n\t\texpr.Function(\"Add\", func(args ...interface{}) (interface{}, error) {\n\t\t\t// Weird function that returns 100 + a + b for testing purposes.\n\t\t\treturn args[0].(int) + args[1].(int) + 100, nil\n\t\t},\n\t\t\tnew(func(_ int, __ int) int),\n\t\t),\n\t)\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 103, output)\n}\n\nfunc TestOperator_CanBeDefinedEitherInTypesOrInFunctions(t *testing.T) {\n\tenv := struct {\n\t\tAdd func(a, b int) int\n\t}{\n\t\tAdd: func(a, b int) int {\n\t\t\treturn a + b\n\t\t},\n\t}\n\n\tprogram, err := expr.Compile(\n\t\t`1 + 2`,\n\t\texpr.Env(env),\n\t\texpr.Operator(\"+\", \"Add\", \"AddValues\"),\n\t\texpr.Function(\"AddValues\", func(args ...interface{}) (interface{}, error) {\n\t\t\treturn args[0].(Value).Int + args[1].(Value).Int, nil\n\t\t},\n\t\t\tnew(func(_ Value, __ Value) int),\n\t\t),\n\t)\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 3, output)\n}\n\nfunc TestOperator_Polymorphic(t *testing.T) {\n\tenv := struct {\n\t\tAdd func(a, b int) int\n\t\tFoo Value\n\t\tBar Value\n\t}{\n\t\tAdd: func(a, b int) int {\n\t\t\treturn a + b\n\t\t},\n\t\tFoo: Value{1},\n\t\tBar: Value{2},\n\t}\n\n\tprogram, err := expr.Compile(\n\t\t`1 + 2 + (Foo + Bar)`,\n\t\texpr.Env(env),\n\t\texpr.Operator(\"+\", \"Add\", \"AddValues\"),\n\t\texpr.Function(\"AddValues\", func(args ...interface{}) (interface{}, error) {\n\t\t\treturn args[0].(Value).Int + args[1].(Value).Int, nil\n\t\t},\n\t\t\tnew(func(_ Value, __ Value) int),\n\t\t),\n\t)\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 6, output)\n}\n\nfunc TestOperator_recursive_apply(t *testing.T) {\n\ttype Decimal struct {\n\t\tInt int\n\t}\n\n\tenv := map[string]any{\n\t\t\"add\": func(a, b Decimal) Decimal {\n\t\t\treturn Decimal{\n\t\t\t\tInt: a.Int + b.Int,\n\t\t\t}\n\t\t},\n\t\t\"addInt\": func(a Decimal, b int) Decimal {\n\t\t\treturn Decimal{\n\t\t\t\tInt: a.Int + b,\n\t\t\t}\n\t\t},\n\t\t\"a\": Decimal{1},\n\t\t\"b\": Decimal{2},\n\t\t\"c\": Decimal{3},\n\t\t\"d\": Decimal{4},\n\t\t\"e\": Decimal{5},\n\t}\n\n\tprogram, err := expr.Compile(\n\t\t`a + b + 100 + c + d + e`,\n\t\texpr.Env(env),\n\t\texpr.Operator(\"+\", \"add\"),\n\t\texpr.Operator(\"+\", \"addInt\"),\n\t)\n\trequire.NoError(t, err)\n\trequire.Equal(t, `add(add(add(addInt(add(a, b), 100), c), d), e)`, program.Node().String())\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 115, output.(Decimal).Int)\n}\n"
  },
  {
    "path": "test/patch/change_ident_test.go",
    "content": "package patch_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/vm\"\n\t\"github.com/expr-lang/expr/vm/runtime\"\n)\n\nfunc TestPatch_change_ident(t *testing.T) {\n\tprogram, err := expr.Compile(\n\t\t`foo`,\n\t\texpr.Env(Env{}),\n\t\texpr.Patch(changeIdent{}),\n\t)\n\trequire.NoError(t, err)\n\n\texpected := &vm.Program{\n\t\tBytecode: []vm.Opcode{\n\t\t\tvm.OpLoadField,\n\t\t},\n\t\tArguments: []int{\n\t\t\t0,\n\t\t},\n\t\tConstants: []any{\n\t\t\t&runtime.Field{\n\t\t\t\tPath:  []string{\"bar\"},\n\t\t\t\tIndex: []int{1},\n\t\t\t},\n\t\t},\n\t}\n\n\trequire.Equal(t, expected.Disassemble(), program.Disassemble())\n}\n\ntype Env struct {\n\tFoo int `expr:\"foo\"`\n\tBar int `expr:\"bar\"`\n}\n\ntype changeIdent struct{}\n\nfunc (changeIdent) Visit(node *ast.Node) {\n\tid, ok := (*node).(*ast.IdentifierNode)\n\tif !ok {\n\t\treturn\n\t}\n\tif id.Value == \"foo\" {\n\t\t// A correct way to patch the node:\n\t\t//\n\t\t//\tnewNode := &ast.IdentifierNode{Value: \"bar\"}\n\t\t//\tast.Patch(node, newNode)\n\t\t//\n\t\t// But we can do it in a wrong way:\n\t\tid.Value = \"bar\"\n\t}\n}\n"
  },
  {
    "path": "test/patch/patch_count_test.go",
    "content": "package patch_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/test/mock\"\n)\n\n// This patcher tracks how many nodes it patches which can \n// be used to verify if it was run too many times or not at all\ntype countingPatcher struct {\n\tPatchCount int\n}\n\nfunc (c *countingPatcher) Visit(node *ast.Node) {\n\tswitch (*node).(type) {\n\tcase *ast.IntegerNode:\n\t\tc.PatchCount++\n\t}\n}\n\n// Test over a simple expression\nfunc TestPatch_Count(t *testing.T) {\n\tpatcher := countingPatcher{}\n\n\t_, err := expr.Compile(\n\t\t`5 + 5`,\n\t\texpr.Env(mock.Env{}),\n\t\texpr.Patch(&patcher),\n\t)\n\trequire.NoError(t, err)\n\n\trequire.Equal(t, 2, patcher.PatchCount, \"Patcher run an unexpected number of times during compile\")\n}\n\n// Test with operator overloading\nfunc TestPatchOperator_Count(t *testing.T) {\n\tpatcher := countingPatcher{}\n\n\t_, err := expr.Compile(\n\t\t`5 + 5`,\n\t\texpr.Env(mock.Env{}),\n\t\texpr.Patch(&patcher),\n\t\texpr.Operator(\"+\", \"_intAdd\"),\n\t\texpr.Function(\n\t\t\t\"_intAdd\",\n\t\t\tfunc(params ...any) (any, error) {\n\t\t\t\treturn params[0].(int) + params[1].(int), nil\n\t\t\t},\n\t\t\tnew(func(int, int) int),\n\t\t),\n\t)\n\n\trequire.NoError(t, err)\n\n\trequire.Equal(t, 2, patcher.PatchCount, \"Patcher run an unexpected number of times during compile\")\n}\n"
  },
  {
    "path": "test/patch/patch_test.go",
    "content": "package patch_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/test/mock\"\n)\n\ntype lengthPatcher struct{}\n\nfunc (p *lengthPatcher) Visit(node *ast.Node) {\n\tswitch n := (*node).(type) {\n\tcase *ast.MemberNode:\n\t\tif prop, ok := n.Property.(*ast.StringNode); ok && prop.Value == \"length\" {\n\t\t\tast.Patch(node, &ast.BuiltinNode{\n\t\t\t\tName:      \"len\",\n\t\t\t\tArguments: []ast.Node{n.Node},\n\t\t\t})\n\t\t}\n\t}\n}\n\nfunc TestPatch_length(t *testing.T) {\n\tprogram, err := expr.Compile(\n\t\t`String.length == 5`,\n\t\texpr.Env(mock.Env{}),\n\t\texpr.Patch(&lengthPatcher{}),\n\t)\n\trequire.NoError(t, err)\n\n\tenv := mock.Env{String: \"hello\"}\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, true, output)\n}\n"
  },
  {
    "path": "test/patch/set_type/set_type_test.go",
    "content": "package set_type_test\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/ast\"\n)\n\nfunc TestPatch_SetType(t *testing.T) {\n\t_, err := expr.Compile(\n\t\t`Value + \"string\"`,\n\t\texpr.Env(Env{}),\n\t\texpr.Function(\n\t\t\t\"getValue\",\n\t\t\tfunc(params ...any) (any, error) {\n\t\t\t\treturn params[0].(Value).Int, nil\n\t\t\t},\n\t\t\t// We can set function type right here,\n\t\t\t// but we want to check what SetType in\n\t\t\t// getValuePatcher will take an effect.\n\t\t),\n\t\texpr.Patch(getValuePatcher{}),\n\t)\n\trequire.Error(t, err)\n}\n\ntype Value struct {\n\tInt int\n}\n\ntype Env struct {\n\tValue Value\n}\n\nvar valueType = reflect.TypeOf((*Value)(nil)).Elem()\n\ntype getValuePatcher struct{}\n\nfunc (getValuePatcher) Visit(node *ast.Node) {\n\tid, ok := (*node).(*ast.IdentifierNode)\n\tif !ok {\n\t\treturn\n\t}\n\tif id.Type() == valueType {\n\t\tnewNode := &ast.CallNode{\n\t\t\tCallee:    &ast.IdentifierNode{Value: \"getValue\"},\n\t\t\tArguments: []ast.Node{id},\n\t\t}\n\t\tnewNode.SetType(reflect.TypeOf(0))\n\t\tast.Patch(node, newNode)\n\t}\n}\n"
  },
  {
    "path": "test/pipes/pipes_test.go",
    "content": "package pipes_test\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n)\n\nfunc TestPipes(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"sprintf\": fmt.Sprintf,\n\t}\n\n\ttests := []struct {\n\t\tinput string\n\t\twant  any\n\t}{\n\t\t{\n\t\t\t`-1 | abs()`,\n\t\t\t1,\n\t\t},\n\t\t{\n\t\t\t`\"%s bar %d\" | sprintf(\"foo\", -42 | abs())`,\n\t\t\t\"foo bar 42\",\n\t\t},\n\t\t{\n\t\t\t`[] | first() ?? \"foo\"`,\n\t\t\t\"foo\",\n\t\t},\n\t\t{\n\t\t\t`\"a\" | upper() + \"B\" | lower()`,\n\t\t\t\"ab\",\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(test.input, expr.Env(env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tout, err := expr.Run(program, env)\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.Equal(t, test.want, out)\n\t\t})\n\t}\n}\n\nfunc TestPipes_map_filter(t *testing.T) {\n\tprogram, err := expr.Compile(`1..9 | map(# + 1) | filter(# % 2 == 0)`)\n\trequire.NoError(t, err)\n\n\tout, err := expr.Run(program, nil)\n\trequire.NoError(t, err)\n\trequire.Equal(t, []any{2, 4, 6, 8, 10}, out)\n}\n"
  },
  {
    "path": "test/playground/data.go",
    "content": "package playground\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc ExampleData() Blog {\n\tprofileJohn := UserProfile{\n\t\tBirthday:  time.Date(1990, 1, 1, 0, 0, 0, 0, time.UTC),\n\t\tBiography: \"A passionate writer about Go.\",\n\t\tWebsite:   \"https://johndoe.com\",\n\t}\n\n\tprofileJane := UserProfile{\n\t\tBirthday:  time.Date(1985, 2, 15, 0, 0, 0, 0, time.UTC),\n\t\tBiography: \"A web developer and writer.\",\n\t\tWebsite:   \"https://jane.com\",\n\t}\n\n\tauthorJohn := Author{\n\t\tID:        1,\n\t\tFirstName: \"John\",\n\t\tLastName:  \"Doe\",\n\t\tEmail:     \"john.doe@example.com\",\n\t\tProfile:   profileJohn,\n\t}\n\n\tauthorJane := Author{\n\t\tID:        2,\n\t\tFirstName: \"Jane\",\n\t\tLastName:  \"Smith\",\n\t\tEmail:     \"jane.smith@example.com\",\n\t\tProfile:   profileJane,\n\t}\n\n\tposts := []Post{\n\t\t{\n\t\t\tID:          1,\n\t\t\tTitle:       \"Understanding Golang\",\n\t\t\tContent:     \"Go is an open-source programming language...\",\n\t\t\tPublishDate: time.Now().AddDate(0, -1, 0),\n\t\t\tAuthor:      authorJohn,\n\t\t\tComments:    generateComments(3),\n\t\t\tTags:        []string{\"Go\", \"Programming\"},\n\t\t\tLikes:       100,\n\t\t},\n\t\t{\n\t\t\tID:          2,\n\t\t\tTitle:       \"Exploring Python\",\n\t\t\tContent:     \"Python is versatile...\",\n\t\t\tPublishDate: time.Now().AddDate(0, -2, 0),\n\t\t\tAuthor:      authorJane,\n\t\t\tComments:    generateComments(4),\n\t\t\tTags:        []string{\"Python\", \"Development\"},\n\t\t\tLikes:       150,\n\t\t},\n\t\t{\n\t\t\tID:          3,\n\t\t\tTitle:       \"Web Development Basics\",\n\t\t\tContent:     \"The world of web development...\",\n\t\t\tPublishDate: time.Now().AddDate(0, -3, 0),\n\t\t\tAuthor:      authorJane,\n\t\t\tComments:    generateComments(5),\n\t\t\tTags:        []string{\"Web\", \"HTML\", \"CSS\"},\n\t\t\tLikes:       125,\n\t\t},\n\t\t{\n\t\t\tID:          4,\n\t\t\tTitle:       \"Machine Learning in a Nutshell\",\n\t\t\tContent:     \"ML is revolutionizing industries...\",\n\t\t\tPublishDate: time.Now().AddDate(0, -5, 0),\n\t\t\tAuthor:      authorJohn,\n\t\t\tComments:    generateComments(6),\n\t\t\tTags:        []string{\"ML\", \"AI\"},\n\t\t\tLikes:       200,\n\t\t},\n\t\t{\n\t\t\tID:          5,\n\t\t\tTitle:       \"JavaScript: The Good Parts\",\n\t\t\tContent:     \"JavaScript powers the web...\",\n\t\t\tPublishDate: time.Now().AddDate(0, -4, 0),\n\t\t\tAuthor:      authorJane,\n\t\t\tComments:    generateComments(3),\n\t\t\tTags:        []string{\"JavaScript\", \"Web\"},\n\t\t\tLikes:       170,\n\t\t},\n\t}\n\n\tblog := Blog{\n\t\tPosts:      make([]Post, len(posts)),\n\t\tAuthors:    map[int]Author{authorJohn.ID: authorJohn, authorJane.ID: authorJane},\n\t\tTotalViews: 10000,\n\t\tTotalPosts: len(posts),\n\t\tTotalLikes: 0,\n\t}\n\n\tfor i, post := range posts {\n\t\tblog.Posts[i] = post\n\t\tblog.TotalLikes += post.Likes\n\t}\n\n\treturn blog\n}\n\nfunc generateComments(count int) []Comment {\n\tvar comments []Comment\n\tfor i := 1; i <= count; i++ {\n\t\tcomment := Comment{\n\t\t\tID:          i,\n\t\t\tAuthorName:  fmt.Sprintf(\"Commenter %d\", i),\n\t\t\tContent:     fmt.Sprintf(\"This is comment %d!\", i),\n\t\t\tCommentDate: time.Now().AddDate(0, 0, -i),\n\t\t\tUpvotes:     i * 5,\n\t\t}\n\t\tcomments = append(comments, comment)\n\t}\n\treturn comments\n}\n"
  },
  {
    "path": "test/playground/env.go",
    "content": "package playground\n\nimport (\n\t\"time\"\n)\n\ntype UserProfile struct {\n\tBirthday  time.Time\n\tBiography string\n\tWebsite   string\n}\n\nfunc (u UserProfile) Age() int {\n\treturn time.Now().Year() - u.Birthday.Year()\n}\n\ntype Author struct {\n\tID        int\n\tFirstName string\n\tLastName  string\n\tEmail     string\n\tProfile   UserProfile\n}\n\nfunc (a Author) FullName() string {\n\treturn a.FirstName + \" \" + a.LastName\n}\n\nfunc (a Author) IsAdmin() bool {\n\treturn a.ID == 1\n}\n\ntype Post struct {\n\tID          int\n\tTitle       string\n\tContent     string\n\tPublishDate time.Time\n\tAuthor      Author\n\tComments    []Comment\n\tTags        []string\n\tLikes       int\n}\n\nfunc (p Post) Published() bool {\n\treturn !p.PublishDate.IsZero()\n}\n\nfunc (p Post) After(date time.Time) bool {\n\treturn p.PublishDate.After(date)\n}\n\nfunc (p Post) Before(date time.Time) bool {\n\treturn p.PublishDate.Before(date)\n}\n\nfunc (p Post) Compare(other Post) int {\n\tif p.PublishDate.Before(other.PublishDate) {\n\t\treturn -1\n\t} else if p.PublishDate.After(other.PublishDate) {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc (p Post) Equal(other Post) bool {\n\treturn p.Compare(other) == 0\n}\n\nfunc (p Post) IsZero() bool {\n\treturn p.ID == 0 && p.Title == \"\" && p.Content == \"\" && p.PublishDate.IsZero()\n}\n\ntype Comment struct {\n\tID          int\n\tAuthorName  string\n\tContent     string\n\tCommentDate time.Time\n\tUpvotes     int\n}\n\nfunc (c Comment) Upvoted() bool {\n\treturn c.Upvotes > 0\n}\n\nfunc (c Comment) AuthorEmail() string {\n\treturn c.AuthorName + \"@example.com\"\n}\n\ntype Blog struct {\n\tPosts      []Post\n\tAuthors    map[int]Author\n\tTotalViews int\n\tTotalPosts int\n\tTotalLikes int\n}\n\nfunc (b Blog) RecentPosts() []Post {\n\tvar posts []Post\n\tfor _, post := range b.Posts {\n\t\tif post.Published() {\n\t\t\tposts = append(posts, post)\n\t\t}\n\t}\n\treturn posts\n}\n\nfunc (b Blog) PopularPosts() []Post {\n\tvar posts []Post\n\tfor _, post := range b.Posts {\n\t\tif post.Likes > 150 {\n\t\t\tposts = append(posts, post)\n\t\t}\n\t}\n\treturn posts\n}\n\nfunc (b Blog) TotalUpvotes() int {\n\tvar upvotes int\n\tfor _, post := range b.Posts {\n\t\tfor _, comment := range post.Comments {\n\t\t\tupvotes += comment.Upvotes\n\t\t}\n\t}\n\treturn upvotes\n}\n\nfunc (b Blog) TotalComments() int {\n\tvar comments int\n\tfor _, post := range b.Posts {\n\t\tcomments += len(post.Comments)\n\t}\n\treturn comments\n}\n\nfunc (Blog) Add(a, b float64) float64 {\n\treturn a + b\n}\n\nfunc (Blog) Sub(a, b float64) float64 {\n\treturn a - b\n}\n\nfunc (Blog) Title(post Post) string {\n\treturn post.Title\n}\n\nfunc (Blog) HasTag(post Post, tag string) bool {\n\tfor _, t := range post.Tags {\n\t\tif t == tag {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (Blog) IsAdmin(author Author) bool {\n\treturn author.IsAdmin()\n}\n\nfunc (Blog) IsZero(post Post) bool {\n\treturn post.IsZero()\n}\n\nfunc (Blog) WithID(posts []Post, id int) Post {\n\tfor _, post := range posts {\n\t\tif post.ID == id {\n\t\t\treturn post\n\t\t}\n\t}\n\treturn Post{}\n}\n"
  },
  {
    "path": "test/time/time_test.go",
    "content": "package time_test\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/checker\"\n\t\"github.com/expr-lang/expr/compiler\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/parser\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\nfunc TestTime(t *testing.T) {\n\ttestTime := time.Date(2000, time.Month(1), 1, 0, 0, 0, 0, time.UTC)\n\ttestDuration := time.Duration(1)\n\n\ttests := []struct {\n\t\ta       any\n\t\tb       any\n\t\top      string\n\t\twant    any\n\t\twantErr bool\n\t}{\n\t\t{a: testTime, b: testTime, op: \"<\", wantErr: false, want: false},\n\t\t{a: testTime, b: testTime, op: \">\", wantErr: false, want: false},\n\t\t{a: testTime, b: testTime, op: \"<=\", wantErr: false, want: true},\n\t\t{a: testTime, b: testTime, op: \">=\", wantErr: false, want: true},\n\t\t{a: testTime, b: testTime, op: \"==\", wantErr: false, want: true},\n\t\t{a: testTime, b: testTime, op: \"!=\", wantErr: false, want: false},\n\t\t{a: testTime, b: testTime, op: \"-\", wantErr: false},\n\t\t{a: testTime, b: testDuration, op: \"+\", wantErr: false},\n\t\t{a: testTime, b: testDuration, op: \"-\", wantErr: false},\n\n\t\t// error cases\n\t\t{a: testTime, b: int64(1), op: \"<\", wantErr: true},\n\t\t{a: testTime, b: float64(1), op: \"<\", wantErr: true},\n\t\t{a: testTime, b: testDuration, op: \"<\", wantErr: true},\n\n\t\t{a: testTime, b: int64(1), op: \">\", wantErr: true},\n\t\t{a: testTime, b: float64(1), op: \">\", wantErr: true},\n\t\t{a: testTime, b: testDuration, op: \">\", wantErr: true},\n\n\t\t{a: testTime, b: int64(1), op: \"<=\", wantErr: true},\n\t\t{a: testTime, b: float64(1), op: \"<=\", wantErr: true},\n\t\t{a: testTime, b: testDuration, op: \"<=\", wantErr: true},\n\n\t\t{a: testTime, b: int64(1), op: \">=\", wantErr: true},\n\t\t{a: testTime, b: float64(1), op: \">=\", wantErr: true},\n\t\t{a: testTime, b: testDuration, op: \">=\", wantErr: true},\n\n\t\t{a: testTime, b: int64(1), op: \"==\", wantErr: false, want: false},\n\t\t{a: testTime, b: float64(1), op: \"==\", wantErr: false, want: false},\n\t\t{a: testTime, b: testDuration, op: \"==\", wantErr: false, want: false},\n\n\t\t{a: testTime, b: int64(1), op: \"!=\", wantErr: false, want: true},\n\t\t{a: testTime, b: float64(1), op: \"!=\", wantErr: false, want: true},\n\t\t{a: testTime, b: testDuration, op: \"!=\", wantErr: false, want: true},\n\n\t\t{a: testTime, b: int64(1), op: \"-\", wantErr: true},\n\t\t{a: testTime, b: float64(1), op: \"-\", wantErr: true},\n\n\t\t{a: testTime, b: testTime, op: \"+\", wantErr: true},\n\t\t{a: testTime, b: int64(1), op: \"+\", wantErr: true},\n\t\t{a: testTime, b: float64(1), op: \"+\", wantErr: true},\n\t\t{a: testDuration, b: testTime, op: \"+\", wantErr: false},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(fmt.Sprintf(\"time helper test `%T %s %T`\", tt.a, tt.op, tt.b), func(t *testing.T) {\n\t\t\tinput := fmt.Sprintf(\"a %v b\", tt.op)\n\t\t\tenv := map[string]any{\n\t\t\t\t\"a\": tt.a,\n\t\t\t\t\"b\": tt.b,\n\t\t\t}\n\n\t\t\tconfig := conf.CreateNew()\n\n\t\t\ttree, err := parser.Parse(input)\n\t\t\trequire.NoError(t, err)\n\n\t\t\t_, err = checker.Check(tree, config)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tprogram, err := compiler.Compile(tree, config)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tgot, err := vm.Run(program, env)\n\t\t\tif tt.wantErr {\n\t\t\t\trequire.Error(t, err)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\n\t\t\t\tif tt.want != nil {\n\t\t\t\t\trequire.Equal(t, tt.want, got)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestTime_duration(t *testing.T) {\n\tenv := map[string]any{\n\t\t\"foo\": time.Date(2000, time.Month(1), 1, 0, 0, 0, 0, time.UTC),\n\t}\n\tprogram, err := expr.Compile(`now() - duration(\"1h\") < now() && foo + duration(\"24h\") < now()`, expr.Env(env))\n\trequire.NoError(t, err)\n\n\toutput, err := expr.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, true, output)\n}\n\nfunc TestTime_date(t *testing.T) {\n\tvar tests = []struct {\n\t\tinput string\n\t\twant  time.Time\n\t}{\n\t\t{\n\t\t\t`date('2017-10-23')`,\n\t\t\ttime.Date(2017, 10, 23, 0, 0, 0, 0, time.UTC),\n\t\t},\n\t\t{\n\t\t\t`date('24.11.1987 20:30', \"02.01.2006 15:04\", \"Europe/Zurich\")`,\n\t\t\ttime.Date(1987, 11, 24, 20, 30, 0, 0, time.FixedZone(\"Europe/Zurich\", 3600)),\n\t\t},\n\t\t{\n\t\t\t`date('24.11.1987 20:30 MSK', \"02.01.2006 15:04 MST\", \"Europe/Zurich\")`,\n\t\t\ttime.Date(1987, 11, 24, 20, 30, 0, 0, time.FixedZone(\"MSK\", 0)),\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.input, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(test.input)\n\t\t\trequire.NoError(t, err)\n\n\t\t\toutput, err := expr.Run(program, nil)\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.Truef(t, test.want.Equal(output.(time.Time)), \"want %v, got %v\", test.want, output)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "testdata/crowdsec.json",
    "content": "[\n  \" {Jan:'01',Feb:'02',Mar:'03',Apr:'04',May:'05',Jun:'06',Jul:'07',Aug:'08',Sep:'09',Oct:'10',Nov:'11',Dec:'12'}[evt.Parsed.ts_m] + '/' + evt.Parsed.ts_d + '/' + evt.Parsed.ts_y + ' ' + evt.Parsed.ts_t\",\n  \"\\\"20\\\" + evt.Parsed.year + \\\"/\\\" + evt.Parsed.month + \\\"/\\\" + evt.Parsed.day + \\\" \\\" + evt.Parsed.time\",\n  \"'source_ip' in evt.Meta\",\n  \"(\\nUpper(evt.Meta.http_path) contains Upper('/service/extension/backup/mboximport?account-name=admin&ow=2&no-switch=1&append=1') ||\\nUpper(evt.Meta.http_path) contains Upper('/service/extension/backup/mboximport?account-name=admin&account-status=1&ow=cmd') \\n)\\nand evt.Meta.http_status startsWith ('40') and\\nUpper(evt.Meta.http_verb) == 'POST'\\n\",\n  \"GetFromStash(\\\"auditd_pid_progname\\\", evt.Unmarshaled.auditd.ppid)\",\n  \"IpToRange(evt.Overflow.Alert.Source.IP, \\\"/64\\\")\",\n  \"IsIP(evt.Unmarshaled.cloudtrail.sourceIPAddress) ? evt.Unmarshaled.cloudtrail.sourceIPAddress : \\\"\\\"\\n\",\n  \"JsonExtract(evt.Line.Raw, \\\"common_log\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"metric_name\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"path_info\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"request.headers.User-Agent\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"request.host\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"request.method\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"request.remote_addr\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"request.remote_ip\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"request.uri\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"request_ip\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"resp_headers.Date[0]\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"status\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"time\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"timestamp\\\")\",\n  \"JsonExtract(evt.Line.Raw, \\\"user_agent\\\")\",\n  \"JsonExtract(evt.Line.Raw, 'status') == '401' && JsonExtract(evt.Line.Raw, 'request.headers.Authorization[0]') startsWith 'Basic ' ? 'auth_fail' : ''\",\n  \"JsonExtract(evt.Parsed.line, \\\"bouncer_agent\\\")\",\n  \"JsonExtract(evt.Parsed.line, \\\"customer_id\\\")\",\n  \"JsonExtract(evt.Parsed.line, \\\"ip\\\")\",\n  \"JsonExtract(evt.Parsed.line, \\\"order_id\\\")\",\n  \"JsonExtract(evt.Parsed.line, \\\"payment_method\\\")\",\n  \"JsonExtract(evt.Parsed.line, \\\"product_id\\\")\",\n  \"JsonExtract(evt.Parsed.line, \\\"quote_id\\\")\",\n  \"JsonExtract(evt.Parsed.line, \\\"type\\\")\",\n  \"JsonExtract(evt.Parsed.line, \\\"x-forwarded-for-ip\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"alert.rev\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"alert.severity\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"alert.signature\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"alert.signature_id\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"attr.authenticationDatabase\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"attr.principalName\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"attr.remote\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"client_ip\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"dest_ip\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"dest_port\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"eventAudience\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"eventData.eventConfidence\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"eventData.httpSourceId\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"eventData.matchedLocation\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"eventData.matchedParameter\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"eventData.matchedSample\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"eventData.securityAction\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"eventData.sourceIP\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"eventData.waapIncidentType\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"eventName\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"eventPriority\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"eventSeverity\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"eventTime\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"flow_id\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"message\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"msg\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"proto\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"remote_ip\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"request_method\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"request_referer\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"request_user_agent\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"response_body_size\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"response_status\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"src_ip\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"t.$date\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"time\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"timestamp\\\")\",\n  \"JsonExtract(evt.Parsed.message, \\\"url\\\")\",\n  \"JsonExtractUnescape(evt.Line.Raw, \\\"log\\\")\",\n  \"Lower(evt.Meta.http_path) contains '/index.php' &&\\nUpper(evt.Parsed.verb) == 'POST' &&\\nevt.Meta.http_status == '302' &&\\nLower(evt.Parsed.http_args) matches 'login=.*[$|%24][\\\\\\\\(|%28].*[\\\\\\\\)|%29]'\\n\",\n  \"Lower(evt.Unmarshaled.iptables.PROTO)\",\n  \"ParseKV(evt.Parsed.message, evt.Unmarshaled, \\\"iptables\\\")\",\n  \"RegexpInFile(evt.Enriched.reverse_dns, 'rdns_seo_bots.regex')\",\n  \"Split(evt.Unmarshaled.traefik.ClientAddr, ':')[0]\",\n  \"Split(evt.Unmarshaled.traefik.RequestProtocol, '/')[1]\",\n  \"UnmarshalJSON(evt.Line.Raw, evt.Unmarshaled, \\\"k8s_audit\\\")\",\n  \"UnmarshalJSON(evt.Line.Raw, evt.Unmarshaled, 'cloudtrail')\",\n  \"Upper(PathUnescape(evt.Meta.http_path)) contains Upper('${script:javascript:java.lang.Runtime.getRuntime().exec(')\\nor\\nUpper(PathUnescape(evt.Meta.http_path)) contains Upper('${script:js:java.lang.Runtime.getRuntime().exec(')\\nor\\nUpper(PathUnescape(evt.Meta.http_path)) contains Upper('${url:UTF-8:') \\nor\\nUpper(PathUnescape(evt.Meta.http_path)) contains Upper('${dns:address|') \\n\",\n  \"Upper(PathUnescape(evt.Meta.http_path)) contains Upper('@java.lang.Runtime@getRuntime().exec(')\",\n  \"Upper(evt.Meta.http_path) contains Upper('/autodiscover/autodiscover.json') &&\\nUpper(evt.Parsed.http_args) contains Upper('powershell')\\n\",\n  \"Upper(evt.Meta.http_path) contains Upper('/ghost/api/admin/session') &&\\nUpper(evt.Parsed.verb) == 'POST' &&\\nevt.Meta.http_status == '404'\\n\",\n  \"Upper(evt.Meta.http_path) contains Upper('/remote_agent.php') &&\\nUpper(evt.Parsed.verb) == 'GET' &&\\nLower(evt.Parsed.http_args) contains 'action=polldata' &&\\nLower(evt.Parsed.http_args) matches 'poller_id=.*(;|%3b)'\\n\",\n  \"Upper(evt.Meta.http_path) contains Upper('/remote_agent.php') &&\\nUpper(evt.Parsed.verb) == 'GET' &&\\nLower(evt.Parsed.http_args) contains 'host_id' &&\\nLower(evt.Parsed.http_args) contains 'local_data_ids'\\n\",\n  \"Upper(evt.Meta.http_path) contains Upper('/vendor/htmlawed/htmlawed/htmLawedTest.php')\",\n  \"Upper(evt.Parsed.file_ext) in ['.JPG', '.CSS', '.JS', '.JPEG', '.PNG', '.SVG', '.MAP', '.ICO', '.OTF', '.GIF', '.MP3', '.MP4', '.WOFF', '.WOFF2', '.TTF', '.OTF', '.EOT', '.WEBP', '.WAV', '.GZ', '.BROTLI', '.BVR', '.TS', '.BMP'] ? 'true' : 'false'\",\n  \"Upper(evt.Parsed.program) == 'BAIKAL'\",\n  \"Upper(evt.Parsed.program) == 'GITLAB'\",\n  \"Upper(evt.Parsed.program) == 'MONGODB'\",\n  \"Upper(evt.Parsed.program) == 'NAMED'\",\n  \"Upper(evt.Parsed.program) == 'NEXTCLOUD'\",\n  \"Upper(evt.Parsed.program) == 'PAPERLESS-NGX'\",\n  \"Upper(evt.Parsed.program) == 'UPTIME-KUMA'\",\n  \"Upper(evt.Parsed.program) == 'VAULTWARDEN'\",\n  \"Upper(evt.Parsed.program) == 'WEBMIN'\",\n  \"XMLGetAttributeValue(evt.Line.Raw, \\\"/Event/System[1]/Provider\\\", \\\"Name\\\")\",\n  \"XMLGetAttributeValue(evt.Line.Raw, \\\"/Event/System[1]/Security\\\", \\\"UserID\\\")\",\n  \"XMLGetAttributeValue(evt.Line.Raw, \\\"/Event/System[1]/TimeCreated\\\", \\\"SystemTime\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[1]\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[2]\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[3]\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Archived']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='CallTrace']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='ClientInfo']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='CommandLine']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Company']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Configuration']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='ConfigurationFileHash']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Consumer']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='CreationUtcTime']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='CurrentDirectory']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Description']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Destination']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='DestinationHostname']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='DestinationIp']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='DestinationIsIpv6']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='DestinationPort']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='DestinationPortName']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Details']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Device']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='EventNamespace']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='EventType']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='FileVersion']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Filter']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='GrantedAccess']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Hashes']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Image']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='ImageLoaded']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Initiated']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='IntegrityLevel']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='IpAddress']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='IsExecutable']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='LogonGuid']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='LogonId']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Name']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='NewName']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='NewThreadId']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Operation']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='OriginalFileName']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='ParentCommandLine']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='ParentImage']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='ParentProcessGuid']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='ParentProcessId']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='ParentUser']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='PipeName']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='ProcessGuid']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='ProcessId']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Protocol']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Query']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='QueryName']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='QueryResults']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='QueryStatus']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='RuleName']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='SchemaVersion']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Session']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Signature']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='SignatureStatus']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Signed']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='SourceHostname']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='SourceImage']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='SourceIp']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='SourceIsIpv6']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='SourcePort']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='SourcePortName']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='SourceProcessGUID']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='SourceProcessGuid']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='SourceProcessId']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='SourceThreadId']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='StartAddress']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='StartFunction']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='StartModule']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='State']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='TargetFilename']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='TargetImage']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='TargetObject']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='TargetProcessGUID']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='TargetProcessGuid']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='TargetProcessId']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='TargetUserName']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='TerminalSessionId']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Type']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='User']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='Version']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='c-ip']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='cs-method']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='cs-uri-query']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='cs-uri-stem']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='csUser-Agent']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='date']\\\") + \\\" \\\" + XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='time']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='s-sitename']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/EventData[1]/Data[@Name='sc-status']\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/System[1]/Channel\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/System[1]/Computer\\\")\",\n  \"XMLGetNodeValue(evt.Line.Raw, \\\"/Event/System[1]/EventID\\\")\",\n  \"all(evt.Overflow.Alert.Events, {.GetMeta('parent_progname') in ['/usr/bin/dpkg', '/usr/bin/dnf']})\",\n  \"any(File('cloudflare_ip6s.txt'), { IpInRange(evt.Overflow.Alert.Source.IP ,#)})\",\n  \"any(File('cloudflare_ips.txt'), { IpInRange(evt.Overflow.Alert.Source.IP ,#)})\",\n  \"any(File('ip_seo_bots.txt'), { len(#) > 0 && IpInRange(evt.Overflow.Alert.Source.IP ,#)})\",\n  \"any(File('rdns_seo_bots.txt'), { len(#) > 0 && evt.Enriched.reverse_dns endsWith #})\",\n  \"any(['Authentication failure', 'Password mismatch', 'password mismatch', 'auth failed', 'unknown user'], {evt.Parsed.dovecot_login_message contains #}) ? 'auth_failed' : ''\",\n  \"evt.Enriched.ASNNumber\",\n  \"evt.Enriched.ASNOrg\",\n  \"evt.Enriched.GeoCoords\",\n  \"evt.Enriched.IsInEU\",\n  \"evt.Enriched.IsoCode\",\n  \"evt.Enriched.MarshaledTime\",\n  \"evt.Enriched.SourceRange\",\n  \"evt.Enriched.reverse_dns\",\n  \"evt.Enriched.reverse_dns endsWith '.ptr.discord.com.'\",\n  \"evt.GetType() == 'overflow' && evt.Overflow.Alert.Remediation == true\",\n  \"evt.Line.Labels.external_format == 'fastly'\",\n  \"evt.Line.Labels.program\",\n  \"evt.Line.Labels.type\",\n  \"evt.Line.Labels.type != 'syslog'\",\n  \"evt.Line.Labels.type == 'aws-alb'\",\n  \"evt.Line.Labels.type == 'containerd'\",\n  \"evt.Line.Labels.type == 'docker'\",\n  \"evt.Line.Labels.type == 'syslog'\",\n  \"evt.Line.Labels.type == 'unifi'\",\n  \"evt.Line.Module\",\n  \"evt.Line.Module != 'wineventlog'\",\n  \"evt.Line.Module == 'wineventlog'\",\n  \"evt.Line.Raw\",\n  \"evt.Line.Src\",\n  \"evt.Meta.error in ['user_not_found', 'invalid_user_credentials']\",\n  \"evt.Meta.http_path + '?' + evt.Parsed.http_args\",\n  \"evt.Meta.http_status == '200' && evt.Parsed.static_ressource == 'false' && evt.Meta.http_verb == 'GET' && evt.Meta.http_path contains '/apps/photos/api/v1/preview' && evt.Parsed.http_args contains '&x=' && evt.Parsed.http_args contains '&y=' && evt.Parsed.http_args contains 'etag='\",\n  \"evt.Meta.http_status == '403' && evt.Meta.http_verb == 'POST' && evt.Meta.http_path contains \\\"/Sessions/Playing/Progress\\\"\",\n  \"evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Meta.http_path contains '/apps/files_trashbin/preview' && evt.Parsed.http_args contains 'fileId=' && evt.Parsed.http_args contains '&file='\",\n  \"evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Meta.http_path contains '/apps/files_versions/preview' && evt.Parsed.http_args contains 'version'\",\n  \"evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Meta.http_path contains '/apps/photos/api/v1/preview' && evt.Parsed.http_args contains 'x' && evt.Parsed.http_args contains 'y'\",\n  \"evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Meta.http_path matches '\\\\\\\\/apps\\\\\\\\/files\\\\\\\\/api\\\\\\\\/v1\\\\\\\\/thumbnail\\\\\\\\/(\\\\\\\\d+)/(\\\\\\\\d+)'\",\n  \"evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Meta.http_path startsWith '/apps/mail/api/avatars/url/'\",\n  \"evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Parsed.file_ext == '.vcf' && evt.Parsed.http_args contains \\\"photo\\\"\",\n  \"evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Parsed.request == '/ocs/v2.php/apps/text/workspace' && evt.Parsed.http_args contains 'path=%2F'\",\n  \"evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Parsed.request contains '/core/preview' && evt.Parsed.http_args contains 'x=' && evt.Parsed.http_args contains 'y=' && evt.Parsed.http_args contains 'fileId='\",\n  \"evt.Meta.http_status == '404' && evt.Meta.http_verb in ['PROPFIND', 'GET'] && evt.Meta.http_path matches '^/remote.php/(web)?dav/'\",\n  \"evt.Meta.http_status in ['404', '403', '502'] ? 'false' : 'true'\",\n  \"evt.Meta.log_subtype == 'zm_bad_password'\",\n  \"evt.Meta.log_subtype == 'zm_bad_user'\",\n  \"evt.Meta.log_type  == 'gotify_failed_auth'\",\n  \"evt.Meta.log_type == \\\"palo_alto\\\" && evt.Meta.severity in [\\\"medium\\\", \\\"high\\\", \\\"critical\\\"]\",\n  \"evt.Meta.log_type == 'ADMIN_LOGIN_FAILED'\",\n  \"evt.Meta.log_type == 'CVE-2021-4034-xpl'\",\n  \"evt.Meta.log_type == 'PAYMENT_FAILED'\",\n  \"evt.Meta.log_type == 'PAYMENT_FAILED' and evt.Meta.ASNNumber != '' \",\n  \"evt.Meta.log_type == 'PAYMENT_FAILED' and evt.Meta.IsoCode != '' \",\n  \"evt.Meta.log_type == 'adguardhome_failed_auth'\",\n  \"evt.Meta.log_type == 'apache-guacamole_failed_auth'\",\n  \"evt.Meta.log_type == 'asterisk_failed_auth'\",\n  \"evt.Meta.log_type == 'auth_bf_attempt'\",\n  \"evt.Meta.log_type == 'auth_bf_log'\",\n  \"evt.Meta.log_type == 'aws-cloudtrail'\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' &&\\n(\\n     (evt.Unmarshaled.cloudtrail.errorCode != nil && evt.Unmarshaled.cloudtrail.errorCode matches \\\".*UnauthorizedOperation$\\\") ||\\n     (evt.Unmarshaled.cloudtrail.errorCode != nil && evt.Unmarshaled.cloudtrail.errorCode matches \\\"^AccessDenied.*\\\")\\n)\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' &&\\n(\\n  evt.Meta.event_name == \\\"DeleteGroupPolicy\\\" ||\\n  evt.Meta.event_name == \\\"DeleteRolePolicy\\\" ||\\n  evt.Meta.event_name == \\\"DeleteUserPolicy\\\" ||\\n  evt.Meta.event_name == \\\"PutGroupPolicy\\\" ||\\n  evt.Meta.event_name == \\\"PutRolePolicy\\\" ||\\n  evt.Meta.event_name == \\\"PutUserPolicy\\\" ||\\n  evt.Meta.event_name == \\\"CreatePolicy\\\" ||\\n  evt.Meta.event_name == \\\"DeletePolicy\\\" ||\\n  evt.Meta.event_name == \\\"CreatePolicyVersion\\\" ||\\n  evt.Meta.event_name == \\\"DeletePolicyVersion\\\" ||\\n  evt.Meta.event_name == \\\"AttachRolePolicy\\\" ||\\n  evt.Meta.event_name == \\\"DetachRolePolicy\\\" ||\\n  evt.Meta.event_name == \\\"AttachUserPolicy\\\" ||\\n  evt.Meta.event_name == \\\"DetachUserPolicy\\\" ||\\n  evt.Meta.event_name == \\\"AttachGroupPolicy\\\" ||\\n  evt.Meta.event_name == \\\"DetachGroupPolicy\\\"\\n)\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' &&\\n(\\nevt.Meta.event_name == \\\"AuthorizeSecurityGroupIngress\\\" ||\\nevt.Meta.event_name == \\\"AuthorizeSecurityGroupEgress\\\" ||\\nevt.Meta.event_name == \\\"RevokeSecurityGroupIngress\\\" ||\\nevt.Meta.event_name == \\\"RevokeSecurityGroupEgress\\\" ||\\nevt.Meta.event_name == \\\"CreateSecurityGroup\\\" ||\\nevt.Meta.event_name == \\\"DeleteSecurityGroup\\\"\\n)\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' &&\\n(\\nevt.Meta.event_name == \\\"CreateCustomerGateway\\\" ||\\nevt.Meta.event_name == \\\"DeleteCustomerGateway\\\" ||\\nevt.Meta.event_name == \\\"AttachInternetGateway\\\" ||\\nevt.Meta.event_name == \\\"CreateInternetGateway\\\" ||\\nevt.Meta.event_name == \\\"DeleteInternetGateway\\\" ||\\nevt.Meta.event_name == \\\"DetachInternetGateway\\\"\\n)\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' &&\\n(\\nevt.Meta.event_name == \\\"CreateNetworkAcl\\\" ||\\nevt.Meta.event_name == \\\"CreateNetworkAclEntry\\\" ||\\nevt.Meta.event_name == \\\"DeleteNetworkAcl\\\" ||\\nevt.Meta.event_name == \\\"DeleteNetworkAclEntry\\\" ||\\nevt.Meta.event_name == \\\"ReplaceNetworkAclEntry\\\" ||\\nevt.Meta.event_name == \\\"ReplaceNetworkAclAssociation\\\"\\n)\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' &&\\n(\\nevt.Meta.event_name == \\\"CreateRoute\\\" ||\\nevt.Meta.event_name == \\\"CreateRouteTable\\\" ||\\nevt.Meta.event_name == \\\"ReplaceRoute\\\" ||\\nevt.Meta.event_name == \\\"ReplaceRouteTableAssociation\\\" ||\\nevt.Meta.event_name == \\\"DeleteRouteTable\\\" ||\\nevt.Meta.event_name == \\\"DeleteRoute\\\" ||\\nevt.Meta.event_name == \\\"DisassociateRouteTable\\\"\\n)\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' &&\\n(\\nevt.Meta.event_name == \\\"CreateTrail\\\" ||\\nevt.Meta.event_name == \\\"UpdateTrail\\\" ||\\nevt.Meta.event_name == \\\"DeleteTrail\\\" ||\\nevt.Meta.event_name == \\\"StartLogging\\\" ||\\nevt.Meta.event_name == \\\"StopLogging\\\"\\n)\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' &&\\n(\\nevt.Meta.event_name == \\\"CreateVpc\\\" ||\\nevt.Meta.event_name == \\\"DeleteVpc\\\" ||\\nevt.Meta.event_name == \\\"ModifyVpcAttribute\\\" ||\\nevt.Meta.event_name == \\\"AcceptVpcPeeringConnection\\\" ||\\nevt.Meta.event_name == \\\"CreateVpcPeeringConnection\\\" ||\\nevt.Meta.event_name == \\\"DeleteVpcPeeringConnection\\\" ||\\nevt.Meta.event_name == \\\"RejectVpcPeeringConnection\\\" ||\\nevt.Meta.event_name == \\\"AttachClassicLinkVpc\\\" ||\\nevt.Meta.event_name == \\\"DetachClassicLinkVpc\\\" ||\\nevt.Meta.event_name == \\\"DisableVpcClassicLink\\\" ||\\nevt.Meta.event_name == \\\"EnableVpcClassicLink\\\"\\n)\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' &&\\n(evt.Meta.event_name == 'ConsoleLogin' || evt.Meta.event_name == 'GetSessionToken' || evt.Meta.event_name == 'GetFederationToken') &&\\nevt.Unmarshaled.cloudtrail.responseElements?.ConsoleLogin == 'Success' &&\\n(\\n (evt.Time.Hour() >= 18 || evt.Time.Hour() < 6) || \\n (evt.Time.Weekday().String() == 'Saturday' || evt.Time.Weekday().String() == 'Sunday')\\n)\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' &&\\nevt.Meta.event_name == \\\"ConsoleLogin\\\" &&\\nevt.Unmarshaled.cloudtrail.additionalEventData.MFAUsed != \\\"Yes\\\" &&\\nevt.Unmarshaled.cloudtrail.userIdentity.type == \\\"IAMUser\\\" &&\\nevt.Unmarshaled.cloudtrail.responseElements.ConsoleLogin == \\\"Success\\\"\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' &&\\nevt.Unmarshaled.cloudtrail.eventSource == \\\"kms.amazonaws.com\\\" &&\\n(evt.Meta.event_name == \\\"DisableKey\\\" || evt.Meta.event_name == \\\"ScheduleKeyDeletion\\\")\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' &&\\nevt.Unmarshaled.cloudtrail.eventSource == \\\"s3.amazonaws.com\\\" &&\\n(\\n evt.Meta.event_name == \\\"PutBucketAcl\\\" ||\\n evt.Meta.event_name == \\\"PutBucketPolicy\\\" ||\\n evt.Meta.event_name == \\\"PutBucketCors\\\" ||\\n evt.Meta.event_name == \\\"PutBucketLifecycle\\\" ||\\n evt.Meta.event_name == \\\"PutBucketReplication\\\" ||\\n evt.Meta.event_name == \\\"DeleteBucketPolicy\\\" ||\\n evt.Meta.event_name == \\\"DeleteBucketCors\\\" ||\\n evt.Meta.event_name == \\\"DeleteBucketLifecycle\\\" ||\\n evt.Meta.event_name == \\\"DeleteBucketReplication\\\"\\n)\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' &&\\nevt.Unmarshaled.cloudtrail.userIdentity.type == \\\"Root\\\" &&\\nevt.Unmarshaled.cloudtrail.userIdentity.invokedBy == nil &&\\nevt.Unmarshaled.cloudtrail.eventType != \\\"AwsServiceEvent\\\"\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' && \\nevt.Meta.event_name == \\\"ConsoleLogin\\\" && \\nevt.Unmarshaled.cloudtrail.errorMessage == \\\"Failed authentication\\\"\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' && \\nevt.Unmarshaled.cloudtrail.eventSource == \\\"config.amazonaws.com\\\" &&\\n(\\n evt.Meta.event_name == \\\"StopConfigurationRecorder\\\" ||\\n evt.Meta.event_name == \\\"DeleteDeliveryChannel\\\" ||\\n evt.Meta.event_name == \\\"PutDeliveryChannel\\\" ||\\n evt.Meta.event_name == \\\"PutConfigurationRecorder\\\"\\n)\\n\",\n  \"evt.Meta.log_type == 'aws-cloudtrail' && (\\n  (evt.Meta.event_name == 'ConsoleLogin' && evt.Unmarshaled.cloudtrail.responseElements.ConsoleLogin == 'Failure') || \\n  (evt.Meta.event_name == 'GetSessionToken' && evt.Meta.error_code=='AccessDenied') || \\n  (evt.Meta.event_name == 'GetFederationToken' && evt.Meta.error_code=='AccessDenied')\\n)\\n\",\n  \"evt.Meta.log_type == 'baikal_failed_auth'\",\n  \"evt.Meta.log_type == 'bind9_denied'\",\n  \"evt.Meta.log_type == 'cas_failed-auth'\",\n  \"evt.Meta.log_type == 'dovecot_logs' && evt.Meta.dovecot_login_result == 'auth_failed'\",\n  \"evt.Meta.log_type == 'emby_failed_auth'\",\n  \"evt.Meta.log_type == 'endlessh_accept'\",\n  \"evt.Meta.log_type == 'execve'\",\n  \"evt.Meta.log_type == 'execve' && evt.Meta.exe == '/usr/bin/pgrep'\",\n  \"evt.Meta.log_type == 'execve' && evt.Meta.exe in ['/usr/bin/rm', '/bin/rm']\",\n  \"evt.Meta.log_type == 'execve' and ( evt.Meta.exe startsWith \\\"/tmp/\\\" or evt.Meta.exe contains \\\"/.\\\" )\",\n  \"evt.Meta.log_type == 'exim_failed_auth'\",\n  \"evt.Meta.log_type == 'ftp_failed_auth'\",\n  \"evt.Meta.log_type == 'gitea_failed_auth'\",\n  \"evt.Meta.log_type == 'gitlab_failed_password'\",\n  \"evt.Meta.log_type == 'grafana_failed_auth'\",\n  \"evt.Meta.log_type == 'harbor_failed_auth'\",\n  \"evt.Meta.log_type == 'home-assistant_failed_auth'\",\n  \"evt.Meta.log_type == 'http_access-log' && Upper(evt.Parsed.http_args) contains 'AUTHOR='\",\n  \"evt.Meta.log_type == 'http_access-log' && evt.Meta.http_path startsWith '/apps/login' && evt.Parsed.verb == 'POST' && evt.Meta.http_status == '200'\",\n  \"evt.Meta.log_type == 'http_access-log' && evt.Meta.http_status in ['400','405'] && (evt.Parsed.verb == 'CONNECT' || evt.Parsed.request matches '^http[s]?://')\",\n  \"evt.Meta.log_type == 'http_access-log' && evt.Parsed.file_name == 'wp-login.php' && evt.Parsed.verb == 'POST' && evt.Meta.http_status == '200'\",\n  \"evt.Meta.log_type == 'http_access-log' && evt.Parsed.file_name == 'xmlrpc.php' && evt.Parsed.verb == 'POST'\",\n  \"evt.Meta.log_type == 'http_access-log' && evt.Parsed.file_name contains 'w00tw00t.at.ISC.SANS.DFind'\",\n  \"evt.Meta.log_type == 'http_access-log' && evt.Parsed.file_name contains 'wp-config.php'\",\n  \"evt.Meta.log_type == 'http_access-log' && evt.Parsed.verb == 'POST' && evt.Meta.http_status == '401'\",\n  \"evt.Meta.log_type == 'http_access-log' && evt.Parsed.verb == 'POST' && evt.Meta.http_status == '403'\",\n  \"evt.Meta.log_type == 'http_error-log' && evt.Parsed.program == 'nginx'\",\n  \"evt.Meta.log_type == 'immich_failed_auth'\",\n  \"evt.Meta.log_type == 'iptables_drop' && evt.Meta.service == 'tcp'\",\n  \"evt.Meta.log_type == 'jellyfin_failed_auth'\",\n  \"evt.Meta.log_type == 'jellyseerr_failed_auth'\",\n  \"evt.Meta.log_type == 'k8s-audit' &&\\n(\\n (\\n  evt.Meta.datasource_type == \\\"k8s-audit\\\" &&\\n  evt.Unmarshaled.k8s_audit.ObjectRef?.Resource == 'pods' &&\\n  evt.Unmarshaled.k8s_audit.RequestObject != nil &&\\n  evt.Unmarshaled.k8s_audit.RequestObject.spec != nil &&\\n  evt.Unmarshaled.k8s_audit.RequestObject.spec.volumes != nil &&\\n  any(evt.Unmarshaled.k8s_audit.RequestObject.spec.volumes, { .hostPath != nil && .hostPath.path in [\\\"/proc\\\", \\\"/var/run/docker.sock\\\", \\\"/\\\", \\\"/etc\\\", \\\"/root\\\", \\\"/var/run/crio/crio.sock\\\", \\\"/home/admin\\\", \\\"/var/lib/kubelet\\\", \\\"/var/lib/kubelet/pki\\\", \\\"/etc/kubernetes\\\", \\\"/etc/kubernetes/manifests\\\"] })\\n )\\n ||\\n (\\n  evt.Meta.datasource_type != \\\"k8s-audit\\\" &&\\n  evt.Unmarshaled.k8s_audit.objectRef?.resource == 'pods' &&\\n  evt.Unmarshaled.k8s_audit.requestObject != nil &&\\n  evt.Unmarshaled.k8s_audit.requestObject.spec != nil &&\\n  evt.Unmarshaled.k8s_audit.requestObject.spec.volumes != nil &&\\n  any(evt.Unmarshaled.k8s_audit.requestObject.spec.volumes, { .hostPath != nil && .hostPath.path in [\\\"/proc\\\", \\\"/var/run/docker.sock\\\", \\\"/\\\", \\\"/etc\\\", \\\"/root\\\", \\\"/var/run/crio/crio.sock\\\", \\\"/home/admin\\\", \\\"/var/lib/kubelet\\\", \\\"/var/lib/kubelet/pki\\\", \\\"/etc/kubernetes\\\", \\\"/etc/kubernetes/manifests\\\"] })\\n )\\n)\\n\",\n  \"evt.Meta.log_type == 'k8s-audit' &&\\n(\\n (\\n  evt.Meta.datasource_type == \\\"k8s-audit\\\" &&\\n  evt.Unmarshaled.k8s_audit.Verb == 'create' &&\\n  evt.Unmarshaled.k8s_audit.ObjectRef?.Resource == 'pods' &&\\n  evt.Unmarshaled.k8s_audit.RequestObject != nil &&\\n  evt.Unmarshaled.k8s_audit.RequestObject.spec != nil &&\\n  any(evt.Unmarshaled.k8s_audit.RequestObject.spec.containers, { .securityContext != nil && .securityContext.privileged == true })\\n )\\n ||\\n (\\n  evt.Meta.datasource_type != \\\"k8s-audit\\\" &&\\n  evt.Unmarshaled.k8s_audit.verb == 'create' &&\\n  evt.Unmarshaled.k8s_audit.objectRef?.resource == 'pods' &&\\n  evt.Unmarshaled.k8s_audit.requestObject != nil &&\\n  evt.Unmarshaled.k8s_audit.requestObject.spec != nil &&\\n  any(evt.Unmarshaled.k8s_audit.requestObject.spec.containers, { .securityContext != nil && .securityContext.privileged == true })\\n )\\n)\\n\",\n  \"evt.Meta.log_type == 'k8s-audit' &&\\n(\\n (evt.Meta.datasource_type == \\\"k8s-audit\\\" && evt.Unmarshaled.k8s_audit.ObjectRef?.Resource == 'pods' && evt.Unmarshaled.k8s_audit.ObjectRef?.Subresource == 'exec')\\n ||\\n (evt.Meta.datasource_type != \\\"k8s-audit\\\" && evt.Unmarshaled.k8s_audit.objectRef?.resource == 'pods' && evt.Unmarshaled.k8s_audit.objectRef?.subresource == 'exec')\\n)\\n\",\n  \"evt.Meta.log_type == 'k8s-audit' &&\\n(\\n (evt.Meta.datasource_type == \\\"k8s-audit\\\" && evt.Unmarshaled.k8s_audit.ObjectRef?.Resource not in [\\\"healthz\\\", \\\"livez\\\", \\\"readyz\\\"]) \\n || \\n (evt.Meta.datasource_type != \\\"k8s-audit\\\" && evt.Unmarshaled.k8s_audit.objectRef?.resource not in [\\\"healthz\\\", \\\"livez\\\", \\\"readyz\\\"])\\n)\\n&& evt.Meta.user in [\\\"system:anonymous\\\", \\\"system:unauthenticated\\\"]\\n\",\n  \"evt.Meta.log_type == 'k8s-audit' &&\\n(\\n (evt.Meta.datasource_type == \\\"k8s-audit\\\" && evt.Unmarshaled.k8s_audit.Verb == 'create' && evt.Unmarshaled.k8s_audit.ObjectRef?.Resource == 'pods' && evt.Unmarshaled.k8s_audit.RequestObject?.spec?.hostNetwork == true)\\n ||\\n (evt.Meta.datasource_type != \\\"k8s-audit\\\" && evt.Unmarshaled.k8s_audit.verb == 'create' && evt.Unmarshaled.k8s_audit.objectRef?.resource == 'pods' && evt.Unmarshaled.k8s_audit.requestObject?.spec?.hostNetwork == true)\\n)\\n\",\n  \"evt.Meta.log_type == 'k8s-audit' &&\\nevt.Meta.user startsWith \\\"system:serviceaccount:\\\" &&\\n(\\n (evt.Meta.datasource_type == \\\"k8s-audit\\\" && evt.Unmarshaled.k8s_audit.Annotations[\\\"authorization.k8s.io/decision\\\"] == \\\"forbid\\\")\\n ||\\n (evt.Meta.datasource_type != \\\"k8s-audit\\\" && evt.Unmarshaled.k8s_audit.annotations[\\\"authorization.k8s.io/decision\\\"] == \\\"forbid\\\")\\n)\\n\",\n  \"evt.Meta.log_type == 'k8s-audit' && \\n(\\n (evt.Meta.datasource_type == \\\"k8s-audit\\\" && evt.Unmarshaled.k8s_audit.ResponseStatus.code in [401, 403])\\n ||\\n (evt.Meta.datasource_type != \\\"k8s-audit\\\" && evt.Unmarshaled.k8s_audit.responseStatus.code in [401, 403])\\n)\\n\",\n  \"evt.Meta.log_type == 'mail_auth' && evt.Meta.sub_type == 'auth_fail'\",\n  \"evt.Meta.log_type == 'mailu_admin_auth_attempt'\",\n  \"evt.Meta.log_type == 'mariadb_failed_auth'\",\n  \"evt.Meta.log_type == 'meshcentral_failed_auth'\",\n  \"evt.Meta.log_type == 'mikrotik_drop' && evt.Meta.service == 'tcp_udp'\",\n  \"evt.Meta.log_type == 'mikrotik_failed_auth'\",\n  \"evt.Meta.log_type == 'modsecurity' && (evt.Parsed.ruleseverity == 'CRITICAL' || evt.Parsed.ruleseverity == '2')\",\n  \"evt.Meta.log_type == 'mongodb_failed_auth'\",\n  \"evt.Meta.log_type == 'mssql_failed_auth'\",\n  \"evt.Meta.log_type == 'mysql_failed_auth'\",\n  \"evt.Meta.log_type == 'nextcloud_domain_error'\",\n  \"evt.Meta.log_type == 'nextcloud_failed_auth'\",\n  \"evt.Meta.log_type == 'odoo_failed_auth'\",\n  \"evt.Meta.log_type == 'ombi_auth_failed'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'bot protection'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'cross site redirect'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'cross site request forgery'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'cross site scripting'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'error disclosure'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'error limit'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'evasion techniques'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'general'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'http limit violation'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'illegal http method violation'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'ldap injection'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'open redirect'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'path traversal'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'remote code execution'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'request rate limit'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'schema validation'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'sql injection'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'url instead of file'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'vulnerability scanning'\",\n  \"evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'xml external entity'\",\n  \"evt.Meta.log_type == 'opnsense-gui-failed-auth'\",\n  \"evt.Meta.log_type == 'paperless_ngx_failed_auth'\",\n  \"evt.Meta.log_type == 'pf' and evt.Parsed.action == 'block'\",\n  \"evt.Meta.log_type == 'pf_drop' && evt.Meta.service == 'tcp_udp'\",\n  \"evt.Meta.log_type == 'pftpd_failed-auth'\",\n  \"evt.Meta.log_type == 'pgsql_failed_auth'\",\n  \"evt.Meta.log_type == 'pterodactly_wings_invalid_format'\",\n  \"evt.Meta.log_type == 'pterodactly_wings_invalid_username_or_password'\",\n  \"evt.Meta.log_type == 'pve_failed-auth'\",\n  \"evt.Meta.log_type == 'redmine_failed_auth'\",\n  \"evt.Meta.log_type == 'smb_failed_auth'\",\n  \"evt.Meta.log_type == 'spam-attempt' && evt.Meta.service == 'exim'\",\n  \"evt.Meta.log_type == 'ssh_bad_keyexchange'\",\n  \"evt.Meta.log_type == 'ssh_failed-auth'\",\n  \"evt.Meta.log_type == 'sshesame_cmd'\",\n  \"evt.Meta.log_type == 'sshesame_input'\",\n  \"evt.Meta.log_type == 'sshesame_login'\",\n  \"evt.Meta.log_type == 'suricata_alert' && evt.Parsed.proto == 'TCP' && evt.Meta.suricata_rule_severity == '1'\",\n  \"evt.Meta.log_type == 'suricata_alert' && evt.Parsed.proto == 'TCP' && evt.Meta.suricata_rule_severity == '2'\",\n  \"evt.Meta.log_type == 'synology-dsm_failed_auth'\",\n  \"evt.Meta.log_type == 'telnet_new_session'\",\n  \"evt.Meta.log_type == 'thehive_failed_auth'\",\n  \"evt.Meta.log_type == 'ts3_fail_auth'\",\n  \"evt.Meta.log_type == 'vaultwarden_failed_auth'\",\n  \"evt.Meta.log_type == 'waf_naxsi-log' && len(evt.Parsed.naxsi_id) > 4\",\n  \"evt.Meta.log_type == 'webmin_failed_auth_wrong_pass'\",\n  \"evt.Meta.log_type == 'windows_failed_auth'\",\n  \"evt.Meta.log_type == 'wireguard_failed_auth'\",\n  \"evt.Meta.log_type == 'zimbra_auth_fail'\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"]\\nand \\n  (\\n    ( Upper(evt.Meta.http_verb) == \\\"POST\\\" and\\n        Upper(evt.Meta.http_path) matches Upper('^(?P<path>/.*index.php)?.*(?P<file_query>file=.*&lt;/td&gt;&lt;/tr(?P<payload>.*)&gt;)')\\n    )\\n    or \\n    Upper(evt.Parsed.rawrequest) matches Upper('^(?P<verb>POST) (?P<path>/.*index.php)?.*(?P<file_query>file=.*&lt;/td&gt;&lt;/tr(?P<payload>.*)&gt;)')\\n  )\\n\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"]\\nand \\n(\\n( Upper(evt.Meta.http_verb) == \\\"POST\\\" and\\nUpper(evt.Meta.http_path) matches Upper('^(?P<path>/.*index.php)?.*(?P<view>view=request|request=log|task=create)+.*(?P<request_query>view=request|request=log|task=create)+.*(?P<task_query>view=request|request=log|task=create)+.*')\\n\\n)\\nor\\nUpper(evt.Parsed.rawrequest) matches Upper('^(?P<verb>POST) (?P<path>/.*index.php)?.*(?P<view>view=request|request=log|task=create)+.*(?P<request_query>view=request|request=log|task=create)+.*(?P<task_query>view=request|request=log|task=create)+.*')\\n)\\n\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"]\\nand Upper(evt.Meta.http_verb) == \\\"GET\\\"\\nand  Upper(evt.Meta.http_path) matches Upper('.*action=.*')\\n\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] && RegexpInFile(evt.Parsed.http_user_agent, \\\"bad_user_agents.regex.txt\\\")\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] and\\n  (Upper(evt.Meta.http_path) contains 'CLASS.MODULE.CLASSLOADER.')\\n\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] and \\n  (\\n  Upper(evt.Meta.http_path) matches Upper('/tmui/login.jsp/..;/tmui/[^.]+.jsp\\\\\\\\?(fileName|command|directoryPath|tabId)=')\\n  or\\n  Upper(evt.Meta.http_path) matches Upper('/tmui/login.jsp/%2E%2E;/tmui/[^.]+.jsp\\\\\\\\?(fileName|command|directoryPath|tabId)=')\\n  )\\n\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] and \\n  (Upper(evt.Meta.http_path) contains \\\"/.%2E/.%2E/\\\"\\n    or\\n   Upper(evt.Meta.http_path) contains \\\"/%2E%2E/%2E%2E\\\")\\n\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] and \\n  (Upper(evt.Meta.http_path) matches '/PUBLIC/PLUGINS/[^/]+/../[./]+/'\\n  or\\n  Upper(evt.Meta.http_path) matches '/PUBLIC/PLUGINS/[^/]+/%2E%2E/[%2E/]+/')\\n\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] and \\n  (Upper(evt.Meta.http_path) matches Upper('/dana-na/../dana/html5acc/guacamole/../../../../../../../[^?]+\\\\\\\\?/dana/html5acc/guacamole/')\\n  or\\n  Upper(evt.Meta.http_path) matches Upper('/dana-na/%2E%2E/dana/html5acc/guacamole/%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/[^?]+\\\\\\\\?/dana/html5acc/guacamole/'))\\n\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] and \\n  Upper(evt.Meta.http_path) contains \\\"/%%32%65%%32%65/\\\"\\n\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] and \\n  Upper(evt.Meta.http_path) contains Upper('/remote/fgt_lang?lang=/../../../..//////////dev/cmdb/sslvpn_websession')\\n\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] and \\n(\\n  any(File(\\\"log4j2_cve_2021_44228.txt\\\"), { Upper(evt.Meta.http_path) contains Upper(#)})\\nor\\n  any(File(\\\"log4j2_cve_2021_44228.txt\\\"), { Upper(evt.Parsed.http_user_agent) contains Upper(#)})\\nor\\n  any(File(\\\"log4j2_cve_2021_44228.txt\\\"), { Upper(evt.Parsed.http_referer) contains Upper(#)})  \\n)\\n\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] and \\nUpper(evt.Meta.http_path) startsWith Upper('/api/v2/cmdb/system/admin/') and Lower(evt.Parsed.http_user_agent) == 'report runner'\\n\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] and any(File(\\\"backdoors.txt\\\"), { evt.Parsed.file_name == #})\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] and any(File(\\\"jira_cve_2021-26086.txt\\\"), {Upper(evt.Meta.http_path) contains Upper(#)})\\n\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] and any(File(\\\"sensitive_data.txt\\\"), { evt.Parsed.request endsWith #})\",\n  \"evt.Meta.log_type in [\\\"http_access-log\\\", \\\"http_error-log\\\"] and any(File(\\\"thinkphp_cve_2018-20062.txt\\\"), {Upper(evt.Meta.http_path) matches Upper(#)})\\n\",\n  \"evt.Meta.log_type in ['authelia_failed_clf_auth', 'authelia_failed_json_auth']\",\n  \"evt.Meta.log_type in ['baikal_failed_auth', 'baikal_failed_auth_no_user']\",\n  \"evt.Meta.log_type in ['bitwarden_failed_auth','bitwarden_failed_auth_2fa']\",\n  \"evt.Meta.log_type in ['gitlab_failed_password', 'gitlab_failed_totp']\",\n  \"evt.Meta.log_type in ['http_access-log', 'http_error-log'] && Lower(QueryUnescape(evt.Meta.http_path)) startsWith Lower('/setup.cgi?next_file=netgear.cfg&todo=syscmd&cmd=')\\n\",\n  \"evt.Meta.log_type in ['http_access-log', 'http_error-log'] && Upper(QueryUnescape(evt.Meta.http_path)) startsWith Upper('/Telerik.Web.UI.WebResource.axd?type=rau')\\n\",\n  \"evt.Meta.log_type in ['http_access-log', 'http_error-log'] && Upper(QueryUnescape(evt.Meta.http_path)) startsWith Upper('/catalog-portal/ui/oauth/verify?error=&deviceUdid=${\\\"freemarker.template.utility.Execute\\\"?new()(')\\n\",\n  \"evt.Meta.log_type in ['http_access-log', 'http_error-log'] && any(File('http_path_traversal.txt'),{evt.Meta.http_path contains #})\",\n  \"evt.Meta.log_type in ['http_access-log', 'http_error-log'] && any(File('sqli_probe_patterns.txt'), {Upper(evt.Parsed.http_args) contains Upper(#)})\",\n  \"evt.Meta.log_type in ['http_access-log', 'http_error-log'] && any(File('xss_probe_patterns.txt'), {Upper(evt.Parsed.http_args) contains Upper(#)})\",\n  \"evt.Meta.log_type in ['http_access-log', 'http_error-log'] && evt.Meta.http_path matches '/ui/vcav-bootstrap/rest/vcav-providers/provider-logo\\\\\\\\?url=(file|http)'\\n\",\n  \"evt.Meta.log_type in ['http_access-log', 'http_error-log'] && evt.Parsed.static_ressource == 'false' && evt.Parsed.verb in ['GET', 'HEAD']\",\n  \"evt.Meta.log_type in ['nextcloud_failed_auth', 'nextcloud_bruteforce_attempt']\",\n  \"evt.Meta.log_type in ['prowlarr_failed_authentication']\",\n  \"evt.Meta.log_type in ['radarr_failed_authentication']\",\n  \"evt.Meta.log_type in ['sonarr_failed_authentication']\",\n  \"evt.Meta.log_type in ['uptime_kuma_failed_password', 'uptime_kuma_failed_totp']\",\n  \"evt.Meta.log_type in ['vaultwarden_failed_auth', 'vaultwarden_failed_admin_auth', 'vaultwarden_failed_totp']\",\n  \"evt.Meta.log_type_enh == 'spam-attempt' || evt.Meta.log_type == 'postfix' && evt.Meta.action == 'reject'\",\n  \"evt.Meta.metric_name in ['account.login.failed_invalid_user', 'account.login.failed_invalid_password']\",\n  \"evt.Meta.ppid\",\n  \"evt.Meta.service == 'exchange' && evt.Meta.sub_type == 'auth_fail'\",\n  \"evt.Meta.service == 'freeswitch' && evt.Meta.sub_type == 'acl_reject'\",\n  \"evt.Meta.service == 'freeswitch' && evt.Meta.sub_type == 'auth_failure'\",\n  \"evt.Meta.service == 'freeswitch' && evt.Meta.sub_type == 'user_enumeration'\",\n  \"evt.Meta.service == 'http' && evt.Meta.http_status in ['404', '403', '400'] && evt.Parsed.static_ressource == 'false'\",\n  \"evt.Meta.service == 'http' && evt.Meta.log_type in ['http_access-log', 'http_error-log']\",\n  \"evt.Meta.service == 'http' && evt.Meta.sub_type == 'auth_fail'\",\n  \"evt.Meta.service == 'http' && evt.Meta.sub_type == 'litespeed_admin_auth_fail'\",\n  \"evt.Meta.service == 'llng' and evt.Meta.log_type == 'llng_auth_fail'\",\n  \"evt.Meta.service == 'postscreen' && evt.Meta.pregreet == 'PREGREET'\",\n  \"evt.Meta.service == 'sysmon' && evt.Parsed.EventID == '1' &&\\nevt.Parsed.ParentImage endsWith \\\"\\\\\\\\svchost.exe\\\" &&\\nevt.Parsed.Image endsWith \\\"\\\\\\\\rundll32.exe\\\" &&\\nevt.Parsed.CommandLine contains \\\"C:\\\\\\\\windows\\\\\\\\system32\\\\\\\\davclnt.dll,DavSetCookie\\\" &&\\nevt.Parsed.CommandLine matches '://\\\\\\\\d{1,3}\\\\\\\\.\\\\\\\\d{1,3}\\\\\\\\.\\\\\\\\d{1,3}\\\\\\\\.\\\\\\\\d{1,3}' &&\\n(not (evt.Parsed.CommandLine contains \\\"://10.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://192.168.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.16.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.17.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.18.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.19.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.20.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.21.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.22.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.23.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.24.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.25.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.26.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.27.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.28.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.29.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.30.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://172.31.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://127.\\\" ||\\n      evt.Parsed.CommandLine contains \\\"://169.254.\\\"))\\n\",\n  \"evt.Meta.service == 'sysmon' && evt.Parsed.EventID == '1' && \\nUpper(evt.Parsed.Image) endsWith 'MSDT.EXE' && \\nUpper(evt.Parsed.ParentImage) endsWith 'WINWORD.EXE' &&\\n(Upper(evt.Parsed.CommandLine) contains 'PCWDIAGNOSTIC' && Upper(evt.Parsed.CommandLine) contains 'IT_REBROWSEFORFILE' && Upper(evt.Parsed.CommandLine) contains 'IT_BROWSEFORFILE')\\n\",\n  \"evt.Meta.service in [\\\"tcp\\\", \\\"udp\\\"] && evt.Unmarshaled.iptables.OUT == \\\"\\\" ? \\\"iptables_drop\\\" : \\\"\\\"\",\n  \"evt.Meta.source_ip\",\n  \"evt.Meta.sub_type == 'req_limit_exceeded'\",\n  \"evt.Meta.target_user\",\n  \"evt.Meta.user_arn\",\n  \"evt.Overflow.Alert.GetScenario() == 'crowdsecurity/auditd-sus-exec' && all(evt.Overflow.Alert.Events, {.GetMeta('exe') matches '\\\\\\\\.nvm\\\\\\\\/versions\\\\\\\\/node\\\\\\\\/v(\\\\\\\\d+)\\\\\\\\.(\\\\\\\\d+)\\\\\\\\.(\\\\\\\\d+)\\\\\\\\/bin\\\\\\\\/node$'})\",\n  \"evt.Overflow.Alert.Remediation == true && IsIPV6(evt.Overflow.Alert.Source.IP)\",\n  \"evt.Overflow.Alert.Remediation == true && evt.Overflow.Alert.GetScope() == 'Ip'\",\n  \"evt.Overflow.Alert.Source.IP\",\n  \"evt.Parsed.Channel == 'Application' && evt.Parsed.Source == 'MSSQLSERVER' && evt.Parsed.EventID == '18456'\",\n  \"evt.Parsed.Channel == 'Microsoft-Windows-Sysmon/Operational'\",\n  \"evt.Parsed.Channel == 'Security' && evt.Parsed.EventID == '4625'\",\n  \"evt.Parsed.User\",\n  \"evt.Parsed.action\",\n  \"evt.Parsed.app\",\n  \"evt.Parsed.asterisk_service\",\n  \"evt.Parsed.asterisk_session_id\",\n  \"evt.Parsed.auth_method\",\n  \"evt.Parsed.auth_result\",\n  \"evt.Parsed.cas_client_ip\",\n  \"evt.Parsed.cas_invalid_user\",\n  \"evt.Parsed.client\",\n  \"evt.Parsed.client_ip\",\n  \"evt.Parsed.clientip\",\n  \"evt.Parsed.cri_timestamp\",\n  \"evt.Parsed.date\",\n  \"evt.Parsed.date + ' ' + evt.Parsed.time\",\n  \"evt.Parsed.datetime\",\n  \"evt.Parsed.day + \\\" \\\" + evt.Parsed.month + \\\" \\\" + evt.Parsed.monthday + \\\" \\\" + evt.Parsed.time + \\\".000000\\\" + \\\" \\\" + evt.Parsed.year\",\n  \"evt.Parsed.db_name\",\n  \"evt.Parsed.dest_ip\",\n  \"evt.Parsed.dest_port\",\n  \"evt.Parsed.dovecot_remote_ip\",\n  \"evt.Parsed.dst_country\",\n  \"evt.Parsed.dst_port\",\n  \"evt.Parsed.elb_status_code\",\n  \"evt.Parsed.email\",\n  \"evt.Parsed.error\",\n  \"evt.Parsed.event_inc_id\",\n  \"evt.Parsed.fastly_timestamp + \\\".00+\\\" + evt.Parsed.tz_part1 + \\\":\\\" + evt.Parsed.tz_part2\",\n  \"evt.Parsed.file_frag + evt.Parsed.file_ext\",\n  \"evt.Parsed.haproxy_monthday + '/' + evt.Parsed.haproxy_month   + '/' + evt.Parsed.haproxy_year  + ':' +   evt.Parsed.haproxy_hour + ':' + evt.Parsed.haproxy_minute + ':' +  evt.Parsed.haproxy_second[0:2] + ' -0000'\",\n  \"evt.Parsed.http_path\",\n  \"evt.Parsed.http_request\",\n  \"evt.Parsed.http_status_code\",\n  \"evt.Parsed.http_user_agent\",\n  \"evt.Parsed.http_verb\",\n  \"evt.Parsed.invalid_user\",\n  \"evt.Parsed.ipAddress\",\n  \"evt.Parsed.ip_source\",\n  \"evt.Parsed.log_level\",\n  \"evt.Parsed.logsource\",\n  \"evt.Parsed.message contains 'PVEFW-reject' or evt.Parsed.message contains 'DROP' or evt.Parsed.message contains 'REJECT'\",\n  \"evt.Parsed.method\",\n  \"evt.Parsed.naxsi_src_ip\",\n  \"evt.Parsed.pgsql_dbname\",\n  \"evt.Parsed.pgsql_target_user\",\n  \"evt.Parsed.pregreet\",\n  \"evt.Parsed.program == \\\"gotify\\\"\",\n  \"evt.Parsed.program == \\\"suricata-evelogs\\\" && JsonExtract(evt.Parsed.message, \\\"event_type\\\") == \\\"alert\\\"\\n\",\n  \"evt.Parsed.program == \\\"zoneminder\\\"\",\n  \"evt.Parsed.program == 'Prowlarr'\",\n  \"evt.Parsed.program == 'Radarr'\",\n  \"evt.Parsed.program == 'adguardhome'\",\n  \"evt.Parsed.program == 'apache-guacamole'\",\n  \"evt.Parsed.program == 'asterisk'\",\n  \"evt.Parsed.program == 'audit'\",\n  \"evt.Parsed.program == 'auditd'\",\n  \"evt.Parsed.program == 'authelia'\",\n  \"evt.Parsed.program == 'aws-cloudtrail'\",\n  \"evt.Parsed.program == 'bitwarden'\",\n  \"evt.Parsed.program == 'cas'\",\n  \"evt.Parsed.program == 'cowrie'\",\n  \"evt.Parsed.program == 'cpanel'\",\n  \"evt.Parsed.program == 'dovecot'\",\n  \"evt.Parsed.program == 'dropbear'\",\n  \"evt.Parsed.program == 'emby'\",\n  \"evt.Parsed.program == 'endlessh'\",\n  \"evt.Parsed.program == 'exchange-imap'\",\n  \"evt.Parsed.program == 'exchange-pop'\",\n  \"evt.Parsed.program == 'exchange-smtp'\",\n  \"evt.Parsed.program == 'exim'\",\n  \"evt.Parsed.program == 'filterlog' or evt.Parsed.message matches '^filterlog:'\",\n  \"evt.Parsed.program == 'gitea'\",\n  \"evt.Parsed.program == 'grafana'\",\n  \"evt.Parsed.program == 'harbor'\",\n  \"evt.Parsed.program == 'home-assistant' or evt.Parsed.program endsWith 'homeassistant'\",\n  \"evt.Parsed.program == 'iis'\",\n  \"evt.Parsed.program == 'immich'\",\n  \"evt.Parsed.program == 'jellyfin'\",\n  \"evt.Parsed.program == 'jellyseerr'\",\n  \"evt.Parsed.program == 'k8s-audit'\",\n  \"evt.Parsed.program == 'kernel' and evt.Parsed.message contains 'IN=' and not (evt.Parsed.message contains 'ACCEPT')\",\n  \"evt.Parsed.program == 'kernel' and evt.Parsed.message contains 'wireguard:'\",\n  \"evt.Parsed.program == 'keycloak'\",\n  \"evt.Parsed.program == 'laurel'\",\n  \"evt.Parsed.program == 'litespeed'\",\n  \"evt.Parsed.program == 'magento-extension'\",\n  \"evt.Parsed.program == 'mailu-admin'\",\n  \"evt.Parsed.program == 'meshcentral'\",\n  \"evt.Parsed.program == 'mikrotik'\",\n  \"evt.Parsed.program == 'modsecurity'\",\n  \"evt.Parsed.program == 'mssql'\",\n  \"evt.Parsed.program == 'mysql'\",\n  \"evt.Parsed.program == 'odoo'\",\n  \"evt.Parsed.program == 'ombi'\",\n  \"evt.Parsed.program == 'openappsec' && JsonExtract(evt.Parsed.message, 'eventAudience') == 'Security' && Lower(JsonExtract(evt.Parsed.message, 'eventSeverity')) in ['critical', 'high'] && Lower(JsonExtract(evt.Parsed.message, 'eventData.practiceSubType')) in ['web application','web api']\",\n  \"evt.Parsed.program == 'palo-alto-threat'\",\n  \"evt.Parsed.program == 'pkexec'\",\n  \"evt.Parsed.program == 'postgres'\",\n  \"evt.Parsed.program == 'proftpd'\",\n  \"evt.Parsed.program == 'pterodactyl'\",\n  \"evt.Parsed.program == 'pure-ftpd'\",\n  \"evt.Parsed.program == 'pvedaemon'\",\n  \"evt.Parsed.program == 'redmine'\",\n  \"evt.Parsed.program == 'smb'\",\n  \"evt.Parsed.program == 'sshd'\",\n  \"evt.Parsed.program == 'sshesame'\",\n  \"evt.Parsed.program == 'sudo'\",\n  \"evt.Parsed.program == 'suricata-fastlogs'\",\n  \"evt.Parsed.program == 'tcpdump'\",\n  \"evt.Parsed.program == 'thehive'\",\n  \"evt.Parsed.program == 'ts3'\",\n  \"evt.Parsed.program == 'vsftpd'\",\n  \"evt.Parsed.program == 'windows-firewall' and evt.Parsed.message contains ' DROP TCP ' and evt.Parsed.message contains ' RECEIVE'\",\n  \"evt.Parsed.program in ['LLNG','lemonldap-ng']\",\n  \"evt.Parsed.program in ['mono', 'Sonarr']\",\n  \"evt.Parsed.program in ['postfix/postscreen', 'haproxy/postscreen']\",\n  \"evt.Parsed.program in ['postfix/smtpd','postfix/smtps/smtpd','postfix/submission/smtpd', 'postfix/smtps-haproxy/smtpd', 'postfix/submission-haproxy/smtpd']\",\n  \"evt.Parsed.program matches 'synoscgi_SYNO.API.Auth_[1-9]([0-9])?_login'\",\n  \"evt.Parsed.program startsWith 'apache2'\",\n  \"evt.Parsed.program startsWith 'caddy'\",\n  \"evt.Parsed.program startsWith 'freeswitch'\",\n  \"evt.Parsed.program startsWith 'haproxy'\",\n  \"evt.Parsed.program startsWith 'kasm'\",\n  \"evt.Parsed.program startsWith 'mariadb'\",\n  \"evt.Parsed.program startsWith 'nginx'\",\n  \"evt.Parsed.program startsWith 'nginx-proxy-manager'\",\n  \"evt.Parsed.program startsWith 'traefik'\",\n  \"evt.Parsed.program startsWith 'zimbra'\",\n  \"evt.Parsed.rbl_url\",\n  \"evt.Parsed.remote_addr\",\n  \"evt.Parsed.remote_host\",\n  \"evt.Parsed.remote_ip\",\n  \"evt.Parsed.remote_user\",\n  \"evt.Parsed.request\",\n  \"evt.Parsed.request_creation_time\",\n  \"evt.Parsed.response\",\n  \"evt.Parsed.rule\",\n  \"evt.Parsed.rule_id\",\n  \"evt.Parsed.ruledata\",\n  \"evt.Parsed.ruleid\",\n  \"evt.Parsed.rulemessage\",\n  \"evt.Parsed.severity\",\n  \"evt.Parsed.smtp_message\",\n  \"evt.Parsed.source_dns\",\n  \"evt.Parsed.source_helo\",\n  \"evt.Parsed.source_ip\",\n  \"evt.Parsed.source_rdns\",\n  \"evt.Parsed.source_user\",\n  \"evt.Parsed.sourcehost\",\n  \"evt.Parsed.src_country\",\n  \"evt.Parsed.src_ip\",\n  \"evt.Parsed.sshd_client_ip\",\n  \"evt.Parsed.sshd_invalid_user\",\n  \"evt.Parsed.sshesame_cmd\",\n  \"evt.Parsed.sshesame_input\",\n  \"evt.Parsed.sshesame_user\",\n  \"evt.Parsed.status\",\n  \"evt.Parsed.suricata_rule_severity\",\n  \"evt.Parsed.syslog_timestamp\",\n  \"evt.Parsed.target_fqdn\",\n  \"evt.Parsed.target_ip\",\n  \"evt.Parsed.target_port\",\n  \"evt.Parsed.target_uri\",\n  \"evt.Parsed.target_user\",\n  \"evt.Parsed.tcpflags contains 'S' ? 'true' : 'false'\",\n  \"evt.Parsed.telnet_session\",\n  \"evt.Parsed.threat_id\",\n  \"evt.Parsed.time\",\n  \"evt.Parsed.time + 'Z'\",\n  \"evt.Parsed.time_local\",\n  \"evt.Parsed.timestamp\",\n  \"evt.Parsed.timestamp + \\\"Z\\\"\",\n  \"evt.Parsed.timestamp8601\",\n  \"evt.Parsed.traefik_router_name\",\n  \"evt.Parsed.unix_epoch\",\n  \"evt.Parsed.user\",\n  \"evt.Parsed.user_agent\",\n  \"evt.Parsed.username\",\n  \"evt.Parsed.verb\",\n  \"evt.Parsed.year+ \\\"/\\\" + evt.Parsed.month + \\\"/\\\" + evt.Parsed.day + \\\" \\\" + evt.Parsed.time\",\n  \"evt.StrTime\",\n  \"evt.StrTime != ''\",\n  \"evt.Unmarshaled.auditd.auid\",\n  \"evt.Unmarshaled.auditd.exe\",\n  \"evt.Unmarshaled.auditd.msg\",\n  \"evt.Unmarshaled.auditd.ppid\",\n  \"evt.Unmarshaled.auditd.tty\",\n  \"evt.Unmarshaled.auditd.uid\",\n  \"evt.Unmarshaled.cloudtrail.awsRegion\",\n  \"evt.Unmarshaled.cloudtrail.errorCode\",\n  \"evt.Unmarshaled.cloudtrail.eventID\",\n  \"evt.Unmarshaled.cloudtrail.eventName\",\n  \"evt.Unmarshaled.cloudtrail.eventSource\",\n  \"evt.Unmarshaled.cloudtrail.eventTime\",\n  \"evt.Unmarshaled.cloudtrail.userAgent\",\n  \"evt.Unmarshaled.cloudtrail.userIdentity.accountId\",\n  \"evt.Unmarshaled.cloudtrail.userIdentity.type\",\n  \"evt.Unmarshaled.cloudtrail.userIdentity?.arn ?? evt.Unmarshaled.cloudtrail.userIdentity.userName\\n\",\n  \"evt.Unmarshaled.iptables.CODE\",\n  \"evt.Unmarshaled.iptables.DPT\",\n  \"evt.Unmarshaled.iptables.DST\",\n  \"evt.Unmarshaled.iptables.IN\",\n  \"evt.Unmarshaled.iptables.LEN\",\n  \"evt.Unmarshaled.iptables.PROTO\",\n  \"evt.Unmarshaled.iptables.SPT\",\n  \"evt.Unmarshaled.iptables.SRC\",\n  \"evt.Unmarshaled.iptables.TYPE\",\n  \"evt.Unmarshaled.k8s_audit.ObjectRef?.Name\",\n  \"evt.Unmarshaled.k8s_audit.ObjectRef?.Namespace\",\n  \"evt.Unmarshaled.k8s_audit.RequestObject?.kind\",\n  \"evt.Unmarshaled.k8s_audit.RequestReceivedTimestamp\",\n  \"evt.Unmarshaled.k8s_audit.SourceIPs[0]\",\n  \"evt.Unmarshaled.k8s_audit.User.username\",\n  \"evt.Unmarshaled.k8s_audit.objectRef?.name\",\n  \"evt.Unmarshaled.k8s_audit.objectRef?.namespace\",\n  \"evt.Unmarshaled.k8s_audit.requestObject?.kind\",\n  \"evt.Unmarshaled.k8s_audit.requestReceivedTimestamp\",\n  \"evt.Unmarshaled.k8s_audit.sourceIPs[0]\",\n  \"evt.Unmarshaled.k8s_audit.user.username\",\n  \"evt.Unmarshaled.laurel.ID\",\n  \"evt.Unmarshaled.laurel.SYSCALL.PPID.exe\",\n  \"evt.Unmarshaled.laurel.SYSCALL.SYSCALL\",\n  \"evt.Unmarshaled.laurel.SYSCALL.exe\",\n  \"evt.Unmarshaled.laurel.SYSCALL.tty\",\n  \"evt.Unmarshaled.traefik.ClientHost\",\n  \"evt.Unmarshaled.traefik.DownstreamContentSize != nil ? int(evt.Unmarshaled.traefik.DownstreamContentSize) : nil\",\n  \"evt.Unmarshaled.traefik.RequestAddr\",\n  \"evt.Unmarshaled.traefik.RequestMethod\",\n  \"evt.Unmarshaled.traefik.RequestPath\",\n  \"evt.Unmarshaled.traefik.RouterName\",\n  \"evt.Unmarshaled.traefik.ServiceAddr != nil ? Split(evt.Unmarshaled.traefik.ServiceAddr, ':')[0] : nil\",\n  \"evt.Unmarshaled.traefik.time\",\n  \"evt.Unmarshaled.traefik[\\\"request_User-Agent\\\"]\",\n  \"filter(JsonExtractSlice(evt.Parsed.message, \\\"params\\\"), {.key == 'user' && .value.login != ''})[0]['value']['login']\",\n  \"int(evt.Unmarshaled.laurel.SYSCALL.auid)\",\n  \"int(evt.Unmarshaled.laurel.SYSCALL.ppid)\",\n  \"int(evt.Unmarshaled.laurel.SYSCALL.uid)\",\n  \"int(evt.Unmarshaled.traefik.DownstreamStatus)\",\n  \"int(evt.Unmarshaled.traefik.Duration)\",\n  \"len(evt.Parsed.http_args)\"\n]\n"
  },
  {
    "path": "testdata/examples.md",
    "content": "# Examples\n\nCharacter Frequency Grouping\n\n```\nlet char = \"0\";\n1..100000\n| map(string(#))\n| groupBy(split(#, char) | len() - 1)\n| toPairs()\n| map({{\n    count: #[0], \n    len: len(#[1]), \n    examples: [first(#[1]), last(#[1])],\n }})\n| sortBy(.len, 'desc')\n```\n\nLog Filtering and Aggregation\n\n```\nlet logs = [\n  {timestamp: date(\"2023-08-14 08:30:00\"), message: \"User logged in\", level: \"info\"},\n  {timestamp: date(\"2023-08-14 09:00:00\"), message: \"Error processing payment\", level: \"error\"},\n  {timestamp: date(\"2023-08-14 10:15:00\"), message: \"User logged out\", level: \"info\"},\n  {timestamp: date(\"2023-08-14 11:00:00\"), message: \"Error connecting to database\", level: \"error\"}\n];\n\nlogs\n| filter(.level == \"error\")\n| map({{\n    time: string(.timestamp),\n    detail: .message\n }})\n| sortBy(.time)\n```\n\nFinancial Data Analysis and Summary\n\n```\nlet accounts = [\n  {name: \"Alice\", balance: 1234.56, transactions: [100, -50, 200]},\n  {name: \"Bob\", balance: 2345.67, transactions: [-200, 300, -150]},\n  {name: \"Charlie\", balance: 3456.78, transactions: [400, -100, 50]}\n];\n\n{\n  totalBalance: sum(accounts, .balance),\n  averageBalance: mean(map(accounts, .balance)),\n  totalTransactions: reduce(accounts, #acc + len(.transactions), 0),\n  accounts: map(accounts, {{\n      name: .name,\n      final: .balance + sum(.transactions),\n      transactionCount: len(.transactions)\n  }})\n}\n```\n\nBitwise Operations and Flags Decoding\n\n```\nlet flags = [\n  {name: \"read\", value: 0b0001},\n  {name: \"write\", value: 0b0010},\n  {name: \"execute\", value: 0b0100},\n  {name: \"admin\", value: 0b1000}\n];\n\nlet userPermissions = 0b1011;\n\nflags\n| filter(userPermissions | bitand(.value) != 0)\n| map(.name)\n```\n\nNested Predicates with Optional Chaining\n\n```\nlet users = [\n  {id: 1, name: \"Alice\", posts: [{title: \"Hello World\", content: \"Short post\"}, {title: \"Another Post\", content: \"This is a bit longer post\"}]},\n  {id: 2, name: \"Bob\", posts: nil},\n  {id: 3, name: \"Charlie\", posts: [{title: \"Quick Update\", content: \"Update content\"}]}\n];\n\nusers\n| filter(\n    // Check if any post has content length greater than 10.\n    any(.posts ?? [], len(.content) > 10)\n  )\n| map({{name: .name, postCount: len(.posts ?? [])}})\n```\n\nString Manipulation and Validation\n\n```\n\"  Apple, banana, Apple, orange, banana, kiwi \"\n| trim()\n| split(\",\")\n| map(trim(#))\n| map(lower(#))\n| uniq()\n| sort()\n| join(\", \")\n```\n\nDate Difference\n\n```\nlet startDate = date(\"2023-01-01\");\nlet endDate = date(\"2023-12-31\");\nlet diff = endDate - startDate;\n{\n  daysBetween: diff.Hours() / 24,\n  hoursBetween: diff.Hours()\n}\n```\n\nPhone number filtering\n\n```\nlet phone = filter(split(\"123-456-78901\", \"\"), # in map(0..9, string(#)))[:10];\njoin(concat([\"(\"], phone[:3], [\")\"], phone[3:6], [\"-\"], phone[6:]))\n```\n\nPrime numbers\n\n```\n2..1000 | filter(let N = #; none(2..N-1, N % # == 0))\n```\n"
  },
  {
    "path": "testdata/generated.txt",
    "content": "!!!ok\n!!$env?.ok\n!!false\n!!not false\n!!ok\n!!ok ?? 1\n!!true\n!$env && false\n!$env and !true\n!$env and false\n!$env or true\n!$env || true\n!$env.ok\n!$env.ok ?? foo\n!$env?.ok\n!all($env, false)\n!all($env, true)\n!all(array, false)\n!all(array, true)\n!all(list, true)\n!any($env, false)\n!any($env, ok)\n!any($env, true)\n!any(array, false)\n!any(array, ok ?? #)\n!any(array, ok)\n!any(array, true)\n!any(list, ok)\n!false != $env\n!false != 0 ?? false\n!false != false\n!false != nil\n!false != ok\n!false != true\n!false && $env\n!false && false\n!false && ok\n!false && true\n!false == $env\n!false == false\n!false == nil\n!false == ok\n!false == ok == ok\n!false == true\n!false ? 0 : f64\n!false ? 0 : nil\n!false ? 1 : ok\n!false ? 1.0 : 0\n!false ? add : array\n!false ? add : foo\n!false ? array : $env\n!false ? array : nil\n!false ? f64 : true\n!false ? false : foo\n!false ? false : greet\n!false ? false : true\n!false ? foo : $env\n!false ? foo : foo\n!false ? foo : greet\n!false ? str : $env\n!false ?: $env\n!false ?: 1.0\n!false ?: bitnand(i, 1)\n!false ?: foo\n!false ?: list\n!false ?: nil\n!false ?: true\n!false ?? $env\n!false ?? $env?.String\n!false ?? 0\n!false ?? 1\n!false ?? 1.0\n!false ?? add\n!false ?? array\n!false ?? f64\n!false ?? false\n!false ?? foo\n!false ?? greet\n!false ?? i\n!false ?? list\n!false ?? nil\n!false ?? ok\n!false ?? sortBy($env, $env)\n!false ?? str\n!false ?? true\n!false and $env\n!false and 1.0 != f64\n!false and 1.0 ?? list\n!false and false\n!false and false == $env\n!false and ok\n!false and true\n!false or $env\n!false or 1.0 != f64\n!false or false\n!false or ok\n!false or true\n!false || $env\n!false || $env?.[$env]\n!false || $env?.[greet()]\n!false || $env?.[greet]\n!false || false\n!false || ok\n!false || true\n!false; foo\n!nil ?? false\n!nil ?? false || true\n!nil ?? ok\n!nil ?? true\n!none($env, false)\n!none($env, ok)\n!none($env, true)\n!none(array, ok)\n!none(array, true)\n!none(list, ok)\n!not !false\n!not !ok\n!not $env.ok\n!not false\n!not not false\n!not ok\n!not true\n!ok\n!ok != $env\n!ok != false\n!ok != nil\n!ok != ok\n!ok != true\n!ok && $env\n!ok && $env?.Bar\n!ok && $env?.[i]\n!ok && false\n!ok && list not in $env\n!ok && ok\n!ok && true\n!ok == $env\n!ok == false\n!ok == nil\n!ok == nil == nil\n!ok == ok\n!ok == true\n!ok ? $env : $env\n!ok ? $env : 0\n!ok ? $env : str\n!ok ? 1 : str\n!ok ? 1.0 : 1.0\n!ok ? 1.0 : str\n!ok ? add : ok\n!ok ? array : false\n!ok ? foo : 1\n!ok ? foo : foo\n!ok ? list : foo\n!ok ? nil : 1.0\n!ok ? nil : true\n!ok ?: $env\n!ok ?: $env?.f64\n!ok ?: i\n!ok ?: ok\n!ok ?: str\n!ok ?? $env\n!ok ?? $env?.add\n!ok ?? 0\n!ok ?? 1\n!ok ?? 1.0\n!ok ?? add\n!ok ?? array\n!ok ?? f64\n!ok ?? false\n!ok ?? foo\n!ok ?? foo?.String\n!ok ?? greet\n!ok ?? i\n!ok ?? list\n!ok ?? nil\n!ok ?? ok\n!ok ?? str\n!ok ?? true\n!ok and $env\n!ok and $env ?? ok\n!ok and false\n!ok and ok\n!ok and true\n!ok not in $env?.[Bar]\n!ok or $env\n!ok or $env?.Bar\n!ok or false\n!ok or ok\n!ok or true\n!ok || $env\n!ok || $env ?? f64\n!ok || false\n!ok || foo ?? i\n!ok || greet == $env\n!ok || ok\n!ok || true\n!one($env, false)\n!one($env, ok)\n!one($env, true)\n!one(array, false)\n!one(array, true)\n!one(list, ok)\n!reduce($env, false, foo)\n!reduce([true], $env != nil)\n!reduce(array, false, list)\n!reduce(array, ok)\n!reduce(array, ok, $env)\n!reduce(array, true)\n!reduce(list, false)\n!reduce(list, ok)\n!reduce(list, true)\n!true != $env\n!true != $env?.[foobar]\n!true != false\n!true != nil\n!true != ok\n!true != true\n!true && $env\n!true && $env?.[Bar]\n!true && 1 ?? foo\n!true && 1.0 != nil\n!true && false\n!true && not $env\n!true && ok\n!true && true\n!true == $env\n!true == $env?.String\n!true == false\n!true == nil\n!true == ok\n!true == true\n!true ? 1 : false\n!true ? 1.0 : 1.0\n!true ? 1.0 : str\n!true ? add : 1.0\n!true ? array : 0\n!true ? f64 : f64\n!true ? nil : false\n!true ? str : 1.0\n!true ? str : add\n!true ? str : nil\n!true ? str : str\n!true ?: array\n!true ?: false\n!true ?: foo\n!true ?: i\n!true ?: nil\n!true ?: ok\n!true ?: str\n!true ?? $env\n!true ?? $env?.array\n!true ?? 0\n!true ?? 1\n!true ?? 1.0\n!true ?? add\n!true ?? array\n!true ?? date($env, foo)\n!true ?? f64\n!true ?? false\n!true ?? foo\n!true ?? greet\n!true ?? i\n!true ?? list\n!true ?? nil\n!true ?? ok\n!true ?? str\n!true ?? true\n!true and $env\n!true and false\n!true and nil ?? $env\n!true and ok\n!true and true\n!true not in [$env]\n!true or $env\n!true or $env == foo\n!true or false\n!true or ok\n!true or true\n!true || $env\n!true || false\n!true || ok\n!true || true\n$env != $env == ok\n$env != $env ?: greet\n$env != $env or f64 ?? foo\n$env != $env.add\n$env != $env.array\n$env != $env.f64\n$env != $env.foo\n$env != $env.greet\n$env != $env.i\n$env != $env.list\n$env != $env.ok\n$env != $env.str\n$env != $env?.Bar\n$env != $env?.Bar?.add\n$env != $env?.Bar?.list\n$env != $env?.String\n$env != $env?.String?.String\n$env != $env?.[Bar]\n$env != $env?.[Bar]?.Bar\n$env != $env?.[Bar]?.sum(foobar matches Bar)\n$env != $env?.[String]\n$env != $env?.[String]?.[array]\n$env != $env?.[String]?.greet\n$env != $env?.[foobar]\n$env != $env?.[str]\n$env != $env?.add\n$env != $env?.array\n$env != $env?.f64\n$env != $env?.foo\n$env != $env?.foobar\n$env != $env?.foobar?.greet\n$env != $env?.foobar?.ok\n$env != $env?.greet\n$env != $env?.i\n$env != $env?.list\n$env != $env?.ok\n$env != $env?.str\n$env != 0 != ok\n$env != 0 && 1.0 != nil\n$env != 0 ?: $env?.[f64]\n$env != 0 ?? add\n$env != 0 ?? ok\n$env != 1 != $env?.[str]\n$env != 1 / f64\n$env != 1.0 != $env.ok\n$env != 1.0 * $env.i\n$env != 1.0 * f64\n$env != 1.0 * i\n$env != 1.0 ** i && false\n$env != 1.0 + f64\n$env != 1.0 - f64\n$env != 1.0 / i\n$env != 1.0 == $env?.false\n$env != 1.0 ?? foo\n$env != 1.0 ?? ok\n$env != 1.0 or ok\n$env != 1.0 || abs($env)\n$env != add ? add : ok ?: array\n$env != add || $env + $env\n$env != add || 1.0 not in $env\n$env != array or ok\n$env != array?.[i]\n$env != f64 && ok\n$env != f64 + i\n$env != f64 / f64\n$env != f64 ? $env?.ok : foo\n$env != f64 and ok\n$env != false != ok\n$env != foo != greet ?? 1\n$env != foo && add ?? foo\n$env != foo == $env?.[String]\n$env != foo == ok\n$env != foo ?? add\n$env != foo ?? ok\n$env != foo ?? str\n$env != foo and ok\n$env != foo.Bar\n$env != foo.String\n$env != foo.String()\n$env != foo?.Bar\n$env != foo?.String\n$env != foo?.String()\n$env != greet ?? add\n$env != greet ?? f64\n$env != i ?? f64 ?? foo\n$env != i ?? i\n$env != i ?? list\n$env != i not in toPairs($env)\n$env != i or one($env, true)\n$env != i || ok\n$env != list ?? flatten($env)\n$env != list ?? list\n$env != list and ok\n$env != list or ok\n$env != list?.[i]\n$env != nil != ok\n$env != nil ?? array\n$env != nil ?? i\n$env != nil ?? ok\n$env != ok ?? add\n$env != str && ok\n$env != str + str\n$env != str in $env?.[String]\n$env != str || 1 in $env\n$env != true ?? list\n$env != true ?? ok\n$env != true and nil != nil\n$env && false && 1.0 == 1.0\n$env && false and $env matches $env\n$env && false or ok\n$env * 1 || true == true\n$env - 1.0 not startsWith $env && false\n$env .. $env in $env || true\n$env == $env && nil in list\n$env == $env && ok\n$env == $env ?: i != $env\n$env == $env ?? $env?.[ok]\n$env == $env ?? f64\n$env == $env and ok\n$env == $env or $env?.Bar()\n$env == $env or ok\n$env == $env.add\n$env == $env.array\n$env == $env.f64\n$env == $env.foo\n$env == $env.greet\n$env == $env.i\n$env == $env.list\n$env == $env.list?.[i]\n$env == $env.ok\n$env == $env.str\n$env == $env?.$env?.[list]\n$env == $env?.Bar\n$env == $env?.String\n$env == $env?.String?.foo\n$env == $env?.String?.foobar?.[array]\n$env == $env?.String?.list\n$env == $env?.[Bar]\n$env == $env?.[Bar]?.[i]\n$env == $env?.[Bar]?.[ok]?.[array]\n$env == $env?.[Bar]?.foo\n$env == $env?.[Bar]?.i\n$env == $env?.[String]\n$env == $env?.[foobar?.Bar]\n$env == $env?.[foobar]\n$env == $env?.[str]\n$env == $env?.add\n$env == $env?.array\n$env == $env?.f64\n$env == $env?.f64 / i\n$env == $env?.foo\n$env == $env?.foo.Bar\n$env == $env?.foobar\n$env == $env?.greet\n$env == $env?.i\n$env == $env?.list\n$env == $env?.ok\n$env == $env?.str\n$env == 0 ?? list\n$env == 0 ?? ok == ok\n$env == 0 ^ f64\n$env == 0 and take($env, 0)\n$env == 1 && ok\n$env == 1 * f64\n$env == 1 .. i\n$env == 1 ?: array\n$env == 1.0 && $env != greet\n$env == 1.0 && map($env, false)?.[i]\n$env == 1.0 ** 1 ?: 1\n$env == 1.0 ** f64\n$env == 1.0 - f64\n$env == 1.0 / $env?.i\n$env == 1.0 == $env?.Bar\n$env == 1.0 == none(array, true)\n$env == 1.0 ?: $env?.greet\n$env == 1.0 ?? i\n$env == 1.0 ?? ok\n$env == 1.0 ^ $env?.f64\n$env == 1.0 ^ f64\n$env == 1.0 and add != add\n$env == 1.0 or foo ?? str\n$env == add ?? array\n$env == add and $env[foo:]\n$env == add or nil != foo\n$env == array ?? -1.0\n$env == array ?? add\n$env == array and ok\n$env == array?.[i]\n$env == f64 * f64\n$env == f64 - f64\n$env == f64 - i\n$env == f64 == ok\n$env == false == ok\n$env == false not in $env?.[Bar]\n$env == false not in $env?.[String]\n$env == foo != !ok\n$env == foo && ok\n$env == foo == $env ?? 1.0\n$env == foo ?? add\n$env == foo ?? list\n$env == foo ?? ok\n$env == foo || ok\n$env == foo.Bar\n$env == foo.String\n$env == foo.String()\n$env == foo?.Bar\n$env == foo?.String\n$env == foo?.String()\n$env == greet ?? $env?.[str]\n$env == i ** f64\n$env == i || ok\n$env == list && $env not in list\n$env == list && findLast($env, .array)\n$env == list or ok\n$env == list?.[i]\n$env == list[i:]\n$env == nil != ok\n$env == nil && 1.0 > i\n$env == nil ?? type(foo)\n$env == nil or all($env, false)\n$env == ok ?? ok\n$env == ok and $env in foo\n$env == ok and not $env?.String\n$env == str && ok or $env\n$env == str ?? 1 and ok\n$env == str ?? add\n$env == str ?? lastIndexOf($env, str)\n$env == str || ok\n$env == true && f64 ?? 1\n$env == true ?? !true\n$env == true ?? list\n$env == true || ok\n$env >= 1.0 == $env or true\n$env ?? $env ?? timezone($env)\n$env ?? $env | map($env)\n$env ?? $env | map(i)\n$env ?? $env | map(str)\n$env ?? $env | reduce(true, true)\n$env ?? $env.add\n$env ?? $env.array\n$env ?? $env.f64\n$env ?? $env.foo\n$env ?? $env.foo?.String\n$env ?? $env.greet\n$env ?? $env.i\n$env ?? $env.list\n$env ?? $env.ok\n$env ?? $env.str\n$env ?? $env?.$env?.[add]\n$env ?? $env?.$env?.array\n$env ?? $env?.Bar\n$env ?? $env?.Bar()\n$env ?? $env?.Bar()?.add\n$env ?? $env?.Bar(String(foobar) | float(String))\n$env ?? $env?.Bar?.add\n$env ?? $env?.Bar?.f64\n$env ?? $env?.String\n$env ?? $env?.String()\n$env ?? $env?.String(String ?? not foobar)\n$env ?? $env?.String.f64\n$env ?? $env?.String.greet\n$env ?? $env?.String?.i(foo)\n$env ?? $env?.[Bar]\n$env ?? $env?.[String]\n$env ?? $env?.[add]\n$env ?? $env?.[array]\n$env ?? $env?.[f64]\n$env ?? $env?.[foo?.add]\n$env ?? $env?.[foo]\n$env ?? $env?.[foobar | sortBy(1)]\n$env ?? $env?.[foobar.foobar]\n$env ?? $env?.[foobar?.[f64]]\n$env ?? $env?.[foobar]\n$env ?? $env?.[greet || false]\n$env ?? $env?.[greet?.f64]\n$env ?? $env?.[greet]\n$env ?? $env?.[greet] | any(ok)\n$env ?? $env?.[greet]?.f64\n$env ?? $env?.[i]\n$env ?? $env?.[i].foo()\n$env ?? $env?.[list]\n$env ?? $env?.[ok()]\n$env ?? $env?.[ok?.[str]]\n$env ?? $env?.[ok]\n$env ?? $env?.[str]\n$env ?? $env?.[str].i\n$env ?? $env?.add\n$env ?? $env?.array\n$env ?? $env?.f64\n$env ?? $env?.findLast(ok)\n$env ?? $env?.foo\n$env ?? $env?.foobar\n$env ?? $env?.greet\n$env ?? $env?.i\n$env ?? $env?.list\n$env ?? $env?.ok\n$env ?? $env?.str\n$env ?? $env[:1 not endsWith foobar]\n$env ?? $env[:Bar()]\n$env ?? $env[:f64()]\n$env ?? $env[:f64(foobar)]\n$env ?? $env[:filter(foobar, #)]\n$env ?? $env[:foo.foo]\n$env ?? $env[:foobar not startsWith greet].f64\n$env ?? $env[:foobar]\n$env ?? $env[:nil | any(array)]?.[i]\n$env ?? $env[:str | foo(0)]\n$env ?? $env[String(String):]\n$env ?? $env[String(i):$env?.array(foo, false)]\n$env ?? $env[array():]\n$env ?? $env[filter(foobar, #):]\n$env ?? $env[foo:String]\n$env ?? $env[foobar | groupBy(1.0):]\n$env ?? $env[foobar || Bar:]\n$env ?? $env[foobar:]\n$env ?? $env[foobar[foobar:0]:foobar]\n$env ?? $env[list():true <= 1.0]\n$env ?? $env[list:foobar]\n$env ?? $env[str | groupBy(#.list):]\n$env ?? 0 | filter(false)\n$env ?? 0 | find(false)\n$env ?? 0 | map(array)\n$env ?? 0 | map(false)\n$env ?? 0 | map(str)\n$env ?? 0 | none(true)\n$env ?? 1 | map(#index)\n$env ?? 1 | sum(f64)\n$env ?? 1.0 ?? array\n$env ?? 1.0 ?? greet\n$env ?? 1.0 | findIndex(ok)\n$env ?? 1.0 | map($env)\n$env ?? 1.0 | map(ok)\n$env ?? 1.0 | sum(0)\n$env ?? 1.0 | sum(i)\n$env ?? add | any(false)\n$env ?? add | reduce(foo, nil)\n$env ?? array | map($env)\n$env ?? array | map(foo)\n$env ?? array | map(true)\n$env ?? array | reduce(i, 1.0)\n$env ?? array | sum(1.0)\n$env ?? array?.[i]\n$env ?? f64 ?? f64\n$env ?? f64 | find(false)\n$env ?? f64 | findLastIndex(ok)\n$env ?? f64 | map(add)\n$env ?? f64 | map(str)\n$env ?? false | all(false)\n$env ?? false | none(true)\n$env ?? false | sum(1.0)\n$env ?? foo ?? $env?.[str]\n$env ?? foo ?? array\n$env ?? foo ?? f64\n$env ?? foo ?? i\n$env ?? foo | any(false)\n$env ?? foo | count(true)\n$env ?? foo | map(1.0)\n$env ?? foo | none(ok)\n$env ?? foo | one(ok)\n$env ?? foo | reduce(f64, $env)\n$env ?? foo | sum(1.0)\n$env ?? foo | sum(i)\n$env ?? foo.Bar\n$env ?? foo.String\n$env ?? foo.String()\n$env ?? foo?.Bar\n$env ?? foo?.String\n$env ?? foo?.String()\n$env ?? greet ?? i\n$env ?? greet | map($env)\n$env ?? greet | none(true)\n$env ?? greet | sum(1.0)\n$env ?? i ?? array\n$env ?? i | map(0)\n$env ?? i | sum(0)\n$env ?? list | any(false)\n$env ?? list?.[i]\n$env ?? nil ?? false | map(foo)\n$env ?? nil ?? i\n$env ?? nil ?? str\n$env ?? nil | all(ok)\n$env ?? nil | any(true)\n$env ?? nil | filter(0 >= 1)\n$env ?? nil | findLastIndex(true)\n$env ?? nil | none(false)\n$env ?? nil | none(true)\n$env ?? nil | reduce(str, true)\n$env ?? nil | sum(1)\n$env ?? ok ?? ok\n$env ?? ok | map(true)\n$env ?? ok | none(ok)\n$env ?? str ?? $env?.add\n$env ?? str | map(foo)\n$env ?? str | map(ok)\n$env ?? str | none(true)\n$env ?? str | sum(0)\n$env ?? true | all(true)\n$env ?? true | findLastIndex(true)\n$env ?? true | none(ok)\n$env and false or 1.0 != f64\n$env contains $env?.Bar\n$env contains $env?.Bar?.str\n$env contains $env?.String\n$env contains $env?.String?.foo\n$env contains $env?.String?.list\n$env contains $env?.[Bar]\n$env contains $env?.[Bar]?.Bar\n$env contains $env?.[Bar]?.[f64]\n$env contains $env?.[String]\n$env contains $env?.[String]?.[foo]\n$env contains $env?.[foobar]\n$env contains $env?.[str[:1.0]]\n$env contains $env?.foobar\n$env contains $env?.nil?.[list]\n$env endsWith $env?.Bar\n$env endsWith $env?.Bar?.[foo]\n$env endsWith $env?.String\n$env endsWith $env?.String?.[array]\n$env endsWith $env?.[Bar]\n$env endsWith $env?.[Bar]?.[f64]\n$env endsWith $env?.[Bar]?.[foo].i\n$env endsWith $env?.[Bar]?.str\n$env endsWith $env?.[String?.array]\n$env endsWith $env?.[String]\n$env endsWith $env?.[foobar?.[add]]\n$env endsWith $env?.[foobar]\n$env endsWith $env?.foobar\n$env in $env.array\n$env in $env.list\n$env in $env?.Bar\n$env in $env?.Bar?.foo\n$env in $env?.String\n$env in $env?.String?.list\n$env in $env?.[Bar?.ok()]\n$env in $env?.[Bar]\n$env in $env?.[Bar]?.add?.[i]\n$env in $env?.[String?.[str]]\n$env in $env?.[String]\n$env in $env?.[String]?.foo(foo)\n$env in $env?.[foobar]\n$env in $env?.array\n$env in $env?.foo || true\n$env in $env?.foobar\n$env in $env?.foobar?.foo\n$env in $env?.foobar?.list(foo)\n$env in $env?.list\n$env in $env?.true?.f64(foobar)\n$env in 0 .. i\n$env in 1 .. i\n$env in 1..i\n$env in array ?: ok\n$env in array ?? greet\n$env in array or ok\n$env in array[:]\n$env in array[:i]\n$env in i .. $env.i\n$env in list && $env and $env\n$env in list and $env?.[f64]\n$env in list and max($env)\n$env in nil ?? list\n$env matches $env && ok or true\n$env matches $env?.$env?.add\n$env matches $env?.Bar\n$env matches $env?.String\n$env matches $env?.[Bar]\n$env matches $env?.[Bar]?.[f64]\n$env matches $env?.[String?.[foobar]]\n$env matches $env?.[String]\n$env matches $env?.[String]?.ok()\n$env matches $env?.[foobar]\n$env matches $env?.[last(foo)]\n$env matches $env?.foobar\n$env matches $env?.foobar?.Bar(foobar, foobar)\n$env matches $env?.foobar?.greet()\n$env matches $env?.foobar?.greet(foobar, 1)\n$env not contains $env?.Bar\n$env not contains $env?.String\n$env not contains $env?.String?.[str]\n$env not contains $env?.String?.array\n$env not contains $env?.[Bar]\n$env not contains $env?.[Bar]?.add()\n$env not contains $env?.[Bar]?.ok\n$env not contains $env?.[String?.str]\n$env not contains $env?.[String]\n$env not contains $env?.[first(foobar, greet)]\n$env not contains $env?.[foobar?.array()]\n$env not contains $env?.[foobar]\n$env not contains $env?.[toJSON(foobar)]\n$env not contains $env?.foobar\n$env not contains $env?.foobar?.[ok]\n$env not contains $env?.foobar?.greet()\n$env not contains $env?.foobar?.i\n$env not contains $env?.nil?.f64\n$env not endsWith $env?.Bar\n$env not endsWith $env?.Bar?.[list]\n$env not endsWith $env?.String\n$env not endsWith $env?.String?.[greet]\n$env not endsWith $env?.[Bar]\n$env not endsWith $env?.[String]\n$env not endsWith $env?.[foobar]\n$env not endsWith $env?.foobar\n$env not endsWith $env?.nil?.add()\n$env not in $env.array\n$env not in $env.list\n$env not in $env?.Bar\n$env not in $env?.Bar?.[ok]\n$env not in $env?.String\n$env not in $env?.String?.f64\n$env not in $env?.[Bar]\n$env not in $env?.[String]\n$env not in $env?.[foobar?.list]\n$env not in $env?.[foobar]\n$env not in $env?.array\n$env not in $env?.foobar\n$env not in $env?.foobar?.[foo]\n$env not in $env?.foobar?.foobar\n$env not in $env?.list\n$env not in 1 .. 1 ?? add\n$env not in 1..i\n$env not in array && ok\n$env not in array == $env || false\n$env not in array == $env?.[String]\n$env not in array || i ?? false\n$env not in array[:i]\n$env not in list and 1 <= f64\n$env not in list and greet == greet\n$env not in list or ok\n$env not in nil ?? list\n$env not matches $env?.Bar\n$env not matches $env?.Bar?.[add]\n$env not matches $env?.Bar?.array\n$env not matches $env?.String\n$env not matches $env?.String?.[add]\n$env not matches $env?.String?.[ok]\n$env not matches $env?.String?.array\n$env not matches $env?.[Bar]\n$env not matches $env?.[Bar]?.[str]\n$env not matches $env?.[String?.[Bar]]\n$env not matches $env?.[String]\n$env not matches $env?.[String]?.[add]\n$env not matches $env?.[foobar?.[0]]\n$env not matches $env?.[foobar]\n$env not matches $env?.foobar\n$env not startsWith $env?.Bar\n$env not startsWith $env?.Bar?.[greet]\n$env not startsWith $env?.String\n$env not startsWith $env?.[Bar]\n$env not startsWith $env?.[Bar]?.Bar\n$env not startsWith $env?.[Bar]?.f64\n$env not startsWith $env?.[String]\n$env not startsWith $env?.[String]?.[f64]\n$env not startsWith $env?.[foobar]\n$env not startsWith $env?.foobar\n$env not startsWith $env?.foobar?.[foo]\n$env not startsWith $env?.foobar?.add\n$env or nil != nil || true\n$env or nil == list and false\n$env or true ?: greet\n$env startsWith $env?.Bar\n$env startsWith $env?.Bar?.Bar\n$env startsWith $env?.Bar?.add\n$env startsWith $env?.String\n$env startsWith $env?.[Bar]\n$env startsWith $env?.[String]\n$env startsWith $env?.[String]?.greet\n$env startsWith $env?.[foobar]\n$env startsWith $env?.[foobar]?.[i]\n$env startsWith $env?.foobar\n$env startsWith $env?.foobar?.Bar()\n$env | all(false) && $env?.[f64]\n$env | all(ok) && ok\n$env | all(ok) or -$env\n$env | any(false) != ok\n$env | any(false) ?? str\n$env | any(ok) != ok\n$env | any(ok) == ok\n$env | count(ok) | min(0)\n$env | count(true) .. -i\n$env | filter(#) | filter(false)\n$env | filter(#.f64) | filter(false)\n$env | filter(false) | all(#.str())\n$env | filter(false) | all($env)\n$env | filter(false) | all(true)\n$env | filter(false) | any(#)\n$env | filter(false) | any(.list)\n$env | filter(false) | count($env)\n$env | filter(false) | count(.i.greet)\n$env | filter(false) | filter(.str)\n$env | filter(false) | find($env)\n$env | filter(false) | findIndex(#.ok)\n$env | filter(false) | findIndex(.String)\n$env | filter(false) | findIndex(.foo)\n$env | filter(false) | findLast(.greet)\n$env | filter(false) | findLast(.ok)\n$env | filter(false) | findLastIndex(.i)\n$env | filter(false) | groupBy(#.f64)\n$env | filter(false) | groupBy(str)\n$env | filter(false) | map(#)\n$env | filter(false) | one(#)\n$env | filter(false) | one(.foo)\n$env | filter(false) | sum(#)\n$env | filter(false) | sum(.greet)\n$env | filter(true) | map($env)\n$env | filter(true) | map(1.0)\n$env | find(.add) startsWith str || true\n$env | find(false) ?? $env?.String\n$env | findIndex(false) not in array\n$env | findIndex(ok) <= i\n$env | findIndex(true) ?? f64\n$env | findLast(false) == str or true\n$env | findLast(false) | get(nil)\n$env | findLastIndex(false) in sort($env)\n$env | findLastIndex(true) + f64\n$env | findLastIndex(true) - i\n$env | findLastIndex(true) > i\n$env | get(str) | groupBy(foo)\n$env | map(#index) != array\n$env | map(#index) | findIndex(true)\n$env | map(#index) | groupBy(f64)\n$env | map(#index) | map(i)\n$env | map(#index) | reduce(f64, nil)\n$env | map(#index) | sortBy(f64)\n$env | map($env) | count(ok)\n$env | map($env) | find(#.ok)\n$env | map($env) | findIndex(false)\n$env | map($env) | map(#.ok)\n$env | map($env) | map(.array)\n$env | map($env) | map(list)\n$env | map($env) | map(true)\n$env | map($env) | reduce(add)\n$env | map($env) | reduce(true)\n$env | map($env) | sortBy(#.i)\n$env | map($env) | sortBy(.i)\n$env | map($env) | sortBy(i)\n$env | map(0) == list\n$env | map(0) | all(ok)\n$env | map(0) | groupBy(1)\n$env | map(0) | map(ok)\n$env | map(0) | sortBy(#)\n$env | map(0) | sortBy(1.0)\n$env | map(0) | sum(#)\n$env | map(0) | sum(1.0)\n$env | map(1) | groupBy(#)\n$env | map(1) | map($env)\n$env | map(1) | sum(#)\n$env | map(1) | sum(f64)\n$env | map(1.0) | filter(true)\n$env | map(1.0) | findLastIndex(ok)\n$env | map(1.0) | groupBy(foo)\n$env | map(1.0) | mean(0)\n$env | map(1.0) | none(ok)\n$env | map(1.0) | none(true)\n$env | map(1.0) | reduce(#)\n$env | map(1.0) | reduce(1.0)\n$env | map(1.0) | reduce(false, list)\n$env | map(1.0) | sortBy(#)\n$env | map(add) | count(true)\n$env | map(add) | reduce(#, 1.0)\n$env | map(array) ?? i\n$env | map(array) | findIndex(ok)\n$env | map(array) | map(add)\n$env | map(array) | one(false)\n$env | map(f64) | map(#)\n$env | map(false) | groupBy(1)\n$env | map(false) | map(f64)\n$env | map(false) | reduce(foo, i)\n$env | map(false) | reduce(str)\n$env | map(foo) ?? array\n$env | map(foo) | any(false)\n$env | map(foo) | findIndex(true)\n$env | map(foo) | groupBy(#)\n$env | map(foo) | groupBy(1)\n$env | map(foo) | map(#)\n$env | map(foo) | map(list)\n$env | map(foo) | none(ok)\n$env | map(foo) | reduce(#acc)\n$env | map(foo) | reduce($env, $env)\n$env | map(foo) | sum(1)\n$env | map(greet) | map(array)\n$env | map(greet) | map(greet)\n$env | map(greet) | reduce(foo)\n$env | map(i) ?? greet\n$env | map(i) | count(false)\n$env | map(i) | groupBy(1.0)\n$env | map(list) ?? list\n$env | map(list) | any(false)\n$env | map(list) | any(ok)\n$env | map(list) | reduce(ok)\n$env | map(list) | reduce(true)\n$env | map(ok) ?? ok\n$env | map(ok) | findLast(ok)\n$env | map(ok) | map($env)\n$env | map(ok) | none(#)\n$env | map(ok) | one(#)\n$env | map(ok) | reduce(0)\n$env | map(ok) | reduce(false)\n$env | map(str) != list\n$env | map(str) | findIndex(ok)\n$env | map(str) | groupBy(foo)\n$env | map(str) | map(1)\n$env | map(str) | map(foo)\n$env | map(str) | reduce(#)\n$env | map(str) | sortBy(str)\n$env | map(true) ?? array\n$env | map(true) ?? str\n$env | map(true) | all(#)\n$env | map(true) | count(#)\n$env | map(true) | filter(#)\n$env | map(true) | find(false)\n$env | map(true) | findLastIndex(#)\n$env | map(true) | groupBy(foo)\n$env | map(true) | map(#)\n$env | map(true) | map($env)\n$env | median(1.0) or true || true\n$env | none(true) && ok\n$env | one(ok) || ok\n$env | reduce(#, nil) > $env and false\n$env | reduce($env, $env) | count(ok)\n$env | reduce($env, 1) | sum(0)\n$env | reduce(0, false) | max(1.0, f64)\n$env | reduce(1.0, 1) <= f64\n$env | reduce(false, $env); list\n$env | reduce(greet, array) ?? foo\n$env | reduce(ok, 1) ?: greet\n$env | reduce(str, foo) not startsWith str\n$env | sum(#) not endsWith $env or true\n$env | sum(1.0) <= i\n$env | sum(1.0) in array\n$env | sum(f64) > f64\n$env | sum(f64) ?? ok\n$env | sum(i) / bitnot(i)\n$env || false and $env?.Bar()\n$env || true || $env < 1\n$env.add != $env?.add\n$env.add == $env.add\n$env.add == $env?.add\n$env.add == add\n$env.add ?? !false\n$env.add ?? $env?.foo\n$env.add ?? [i]\n$env.add ?? add\n$env.add ?? array\n$env.add ?? count(array)\n$env.add ?? foo\n$env.add ?? greet\n$env.add ?? groupBy(array, $env)\n$env.add ?? i\n$env.add ?? list\n$env.add ?? list ?? nil\n$env.add ?? ok\n$env.add ?? str\n$env.add ?? sum($env)\n$env.add not in [nil, false]\n$env.add(1, 1) < f64 && ok\n$env.array != array\n$env.array != list\n$env.array == $env?.array\n$env.array == array\n$env.array == list\n$env.array ?? !true\n$env.array ?? $env | groupBy(#)\n$env.array ?? $env?.Bar\n$env.array ?? $env?.[String]\n$env.array ?? $env?.add\n$env.array ?? [nil]\n$env.array ?? add\n$env.array ?? array\n$env.array ?? f64\n$env.array ?? foo | findLastIndex(false)\n$env.array ?? greet\n$env.array ?? list\n$env.array ?? ok\n$env.array | all(false)\n$env.array | all(ok)\n$env.array | all(true)\n$env.array | any($env?.ok)\n$env.array | any(false)\n$env.array | any(nil == #)\n$env.array | any(ok)\n$env.array | concat(array)\n$env.array | concat(list)\n$env.array | count(false)\n$env.array | count(true)\n$env.array | filter(false)\n$env.array | filter(ok)\n$env.array | filter(true)\n$env.array | find(false)\n$env.array | find(ok)\n$env.array | find(true)\n$env.array | findIndex(false)\n$env.array | findIndex(nil == list)\n$env.array | findIndex(ok)\n$env.array | findIndex(true)\n$env.array | findLast(false)\n$env.array | findLast(ok)\n$env.array | findLast(true)\n$env.array | findLastIndex(false)\n$env.array | findLastIndex(ok)\n$env.array | findLastIndex(true)\n$env.array | groupBy(#)\n$env.array | groupBy(0)\n$env.array | groupBy(1)\n$env.array | groupBy(1.0)\n$env.array | groupBy(f64)\n$env.array | groupBy(false)\n$env.array | groupBy(foo)\n$env.array | groupBy(i)\n$env.array | groupBy(ok)\n$env.array | map(#)\n$env.array | map(#index)\n$env.array | map($env)\n$env.array | map($env?.[String])\n$env.array | map(1)\n$env.array | map(1.0)\n$env.array | map(array)\n$env.array | map(f64)\n$env.array | map(false)\n$env.array | map(float(1.0))\n$env.array | map(foo)\n$env.array | map(greet)\n$env.array | map(i)\n$env.array | map(list)\n$env.array | map(ok)\n$env.array | map(str)\n$env.array | map(true)\n$env.array | mean(1.0)\n$env.array | mean(f64)\n$env.array | mean(i)\n$env.array | median(0, array)\n$env.array | median(1)\n$env.array | median(1.0)\n$env.array | median(i)\n$env.array | min(0)\n$env.array | min(1)\n$env.array | none(ok)\n$env.array | none(true)\n$env.array | one(false)\n$env.array | one(ok)\n$env.array | one(true)\n$env.array | reduce(# ^ #)\n$env.array | reduce(#)\n$env.array | reduce(#, $env)\n$env.array | reduce(#, 0)\n$env.array | reduce(#, 1)\n$env.array | reduce(#, false)\n$env.array | reduce(#, foo)\n$env.array | reduce(#, greet)\n$env.array | reduce(#index)\n$env.array | reduce($env)\n$env.array | reduce($env, 1.0)\n$env.array | reduce(0)\n$env.array | reduce(1)\n$env.array | reduce(1.0)\n$env.array | reduce(1.0, f64)\n$env.array | reduce(1.0, greet)\n$env.array | reduce(add)\n$env.array | reduce(add, greet)\n$env.array | reduce(add, true)\n$env.array | reduce(array)\n$env.array | reduce(f64)\n$env.array | reduce(f64, 0)\n$env.array | reduce(f64, i)\n$env.array | reduce(false)\n$env.array | reduce(foo)\n$env.array | reduce(foo, 1)\n$env.array | reduce(foo, 1.0)\n$env.array | reduce(foo, array)\n$env.array | reduce(foo, i)\n$env.array | reduce(greet)\n$env.array | reduce(i)\n$env.array | reduce(i, true)\n$env.array | reduce(list)\n$env.array | reduce(not false)\n$env.array | reduce(ok)\n$env.array | reduce(str)\n$env.array | reduce(str, false)\n$env.array | reduce(true)\n$env.array | reduce(true, false)\n$env.array | reduce(true, true)\n$env.array | sortBy(#)\n$env.array | sortBy(0)\n$env.array | sortBy(1)\n$env.array | sortBy(1.0)\n$env.array | sortBy(f64)\n$env.array | sortBy(i)\n$env.array | sortBy(str)\n$env.array | sum(#)\n$env.array | sum(0)\n$env.array | sum(1)\n$env.array | sum(1.0)\n$env.array | sum(i)\n$env.array | take(0)\n$env.array | take(1)\n$env.array | take(i)\n$env.array?.[i]\n$env.array[:]\n$env.array[:i]\n$env.f64 != $env.i\n$env.f64 != -1.0\n$env.f64 != 0 % i\n$env.f64 != abs(f64)\n$env.f64 != f64\n$env.f64 != i\n$env.f64 != sum(array)\n$env.f64 * 0 >= 1.0\n$env.f64 * array?.[i]\n$env.f64 * f64\n$env.f64 * i\n$env.f64 * i ?? str\n$env.f64 ** f64\n$env.f64 ** i\n$env.f64 ** sum(array)\n$env.f64 + $env.i\n$env.f64 + f64\n$env.f64 + f64 == 1\n$env.f64 + i\n$env.f64 - 1 >= f64\n$env.f64 - 1.0 > 0\n$env.f64 - f64\n$env.f64 - i\n$env.f64 - i ^ 0\n$env.f64 / 0.0\n$env.f64 / f64\n$env.f64 / i\n$env.f64 < 1.0 ?: list\n$env.f64 < 1.0 || ok\n$env.f64 < f64\n$env.f64 < i\n$env.f64 <= $env.i\n$env.f64 <= 1.0 != false\n$env.f64 <= f64\n$env.f64 <= i\n$env.f64 <= i ?? foo\n$env.f64 == $env.f64\n$env.f64 == f64\n$env.f64 == i\n$env.f64 > $env.f64\n$env.f64 > bitushr(0, i)\n$env.f64 > f64\n$env.f64 > i\n$env.f64 > sum($env, f64)\n$env.f64 >= 1.0 - 1.0\n$env.f64 >= abs(1.0)\n$env.f64 >= i\n$env.f64 ?? !true\n$env.f64 ?? add\n$env.f64 ?? f64\n$env.f64 ?? foo\n$env.f64 ?? greet\n$env.f64 ?? i\n$env.f64 ?? list\n$env.f64 ?? list?.[i]\n$env.f64 ?? ok\n$env.f64 ?? sortBy(list, f64)\n$env.f64 ?? str\n$env.f64 ^ 0 / 0\n$env.f64 ^ f64\n$env.f64 ^ i\n$env.f64 ^ i != $env\n$env.f64 in array\n$env.f64 in array and ok\n$env.f64 not in array ? i : $env\n$env.f64 not in first($env)\n$env.f64 | max(1.0)\n$env.f64 | max(f64)\n$env.f64 | max(i, 1.0)\n$env.f64 | mean(0)\n$env.f64 | mean(1)\n$env.f64 | mean(f64)\n$env.f64 | median(i)\n$env.f64 | min(0)\n$env.f64 | min(array)\n$env.f64 | min(i)\n$env.foo != $env.foo\n$env.foo != $env?.foo\n$env.foo != foo\n$env.foo != {foo: list, foo: true, foo: $env}?.foo\n$env.foo == $env?.foo\n$env.foo == foo\n$env.foo == nil == $env\n$env.foo == nil and ok\n$env.foo ?? $env.array\n$env.foo ?? $env?.[add]\n$env.foo ?? add\n$env.foo ?? all($env, true)\n$env.foo ?? array\n$env.foo ?? array?.[i]\n$env.foo ?? foo\n$env.foo ?? greet\n$env.foo ?? greet(str)\n$env.foo ?? i\n$env.foo ?? last(array)\n$env.foo ?? list\n$env.foo ?? ok\n$env.foo ?? str\n$env.foo ?? sum($env, 1.0)\n$env.foo in list\n$env.foo not in list\n$env.foo.Bar\n$env.foo.String\n$env.foo.String()\n$env.foo?.Bar\n$env.foo?.Bar > str\n$env.foo?.String\n$env.foo?.String()\n$env.greet != $env && $env\n$env.greet != $env.greet\n$env.greet != greet\n$env.greet == $env?.foobar?.[list]\n$env.greet == greet\n$env.greet ?? $env?.[list]\n$env.greet ?? $env?.list\n$env.greet ?? array\n$env.greet ?? f64\n$env.greet ?? foo\n$env.greet ?? greet\n$env.greet ?? greet(str)\n$env.greet ?? list\n$env.greet ?? ok\n$env.greet ?? reduce(list, str)\n$env.greet ?? str\n$env.greet($env.str)\n$env.greet($env?.[str])\n$env.greet($env?.str)\n$env.greet(foo.Bar)\n$env.greet(foo.String())\n$env.greet(foo?.Bar)\n$env.greet(foo?.String())\n$env.greet(greet(str))\n$env.greet(str)\n$env.greet(string($env))\n$env.greet(string(1.0))\n$env.greet(toJSON(list))\n$env.greet(trimPrefix(str))\n$env.greet(type(0))\n$env.i != $env?.Bar\n$env.i != $env?.[Bar]?.foo()\n$env.i != 1 / 1\n$env.i != 1.0 + 1.0\n$env.i != f64\n$env.i != i\n$env.i % i\n$env.i % i != $env\n$env.i % i <= 0\n$env.i * -i\n$env.i * f64\n$env.i * i\n$env.i * min(0)\n$env.i ** f64\n$env.i ** i\n$env.i ** mean(1.0)\n$env.i + f64\n$env.i + i\n$env.i - -0\n$env.i - -1.0\n$env.i - 1 == 1.0\n$env.i - ceil(1)\n$env.i - f64\n$env.i - i\n$env.i .. i\n$env.i / $env.f64\n$env.i / f64\n$env.i / find(array, true)\n$env.i / i\n$env.i / i - 0\n$env.i < $env.i\n$env.i < 1.0 != $env\n$env.i < 1.0 or $env\n$env.i < f64\n$env.i < f64 ^ f64\n$env.i < i\n$env.i < i / i\n$env.i <= 1.0 > 1.0\n$env.i <= f64\n$env.i <= i\n$env.i == $env?.f64\n$env.i == f64\n$env.i == i\n$env.i > $env.i\n$env.i > f64\n$env.i > i\n$env.i >= $env?.i\n$env.i >= f64\n$env.i >= f64 / f64\n$env.i >= i\n$env.i ?? $env?.[str]\n$env.i ?? add\n$env.i ?? array\n$env.i ?? f64\n$env.i ?? foo?.Bar\n$env.i ?? foo?.String\n$env.i ?? greet\n$env.i ?? i\n$env.i ?? ok\n$env.i ?? str\n$env.i ?? sum(array)\n$env.i ?? toJSON(f64)\n$env.i ^ f64\n$env.i ^ i\n$env.i in $env?.[Bar]\n$env.i in array\n$env.i in array != nil\n$env.i in take(array, 0)\n$env.i not in $env?.[String]\n$env.i not in $env?.array\n$env.i not in array\n$env.i | add(i)\n$env.i | bitnand(i)\n$env.i | bitor(0)\n$env.i | bitor(1)\n$env.i | bitshl(0)\n$env.i | bitshl(1)\n$env.i | bitshr(i)\n$env.i | bitushr(1)\n$env.i | bitushr(i)\n$env.i | bitxor(0)\n$env.i | max(1.0)\n$env.i | mean(i)\n$env.i | median(1)\n$env.list != array\n$env.list != list\n$env.list == $env?.Bar\n$env.list == array\n$env.list == list\n$env.list == nil || $env\n$env.list ?? $env?.[greet]\n$env.list ?? $env?.i\n$env.list ?? -0\n$env.list ?? add\n$env.list ?? f64\n$env.list ?? false | sortBy(#.Bar)\n$env.list ?? foo\n$env.list ?? i\n$env.list ?? list\n$env.list | all(false)\n$env.list | all(ok)\n$env.list | all(true)\n$env.list | any(false)\n$env.list | any(ok)\n$env.list | any(true)\n$env.list | concat(array)\n$env.list | count(false)\n$env.list | count(ok)\n$env.list | count(true)\n$env.list | filter(false)\n$env.list | filter(ok)\n$env.list | filter(true)\n$env.list | find(false)\n$env.list | find(nil not in list)\n$env.list | find(ok)\n$env.list | find(true)\n$env.list | findIndex(false)\n$env.list | findIndex(ok)\n$env.list | findIndex(true)\n$env.list | findLast(false)\n$env.list | findLast(ok)\n$env.list | findLast(true)\n$env.list | findLastIndex(ok)\n$env.list | findLastIndex(true)\n$env.list | groupBy(#)\n$env.list | groupBy(#.Bar)\n$env.list | groupBy(.Bar)\n$env.list | groupBy(0)\n$env.list | groupBy(1)\n$env.list | groupBy(1.0)\n$env.list | groupBy(f64)\n$env.list | groupBy(false != false)\n$env.list | groupBy(false)\n$env.list | groupBy(foo)\n$env.list | groupBy(ok)\n$env.list | groupBy(true)\n$env.list | map(#)\n$env.list | map(#.Bar)\n$env.list | map(#.String)\n$env.list | map(#index)\n$env.list | map($env)\n$env.list | map(.Bar)\n$env.list | map(0)\n$env.list | map(1)\n$env.list | map(1.0)\n$env.list | map(add)\n$env.list | map(array)\n$env.list | map(f64)\n$env.list | map(false)\n$env.list | map(foo)\n$env.list | map(greet)\n$env.list | map(i)\n$env.list | map(list)\n$env.list | map(ok)\n$env.list | map(str)\n$env.list | map(true)\n$env.list | none(false)\n$env.list | none(ok)\n$env.list | none(true)\n$env.list | one(false)\n$env.list | one(foo != $env)\n$env.list | one(ok)\n$env.list | one(true)\n$env.list | reduce(#)\n$env.list | reduce(#, $env)\n$env.list | reduce(#, 0)\n$env.list | reduce(#, 1.0)\n$env.list | reduce(#, nil)\n$env.list | reduce(#, true)\n$env.list | reduce(#.Bar)\n$env.list | reduce(#.String)\n$env.list | reduce(#acc)\n$env.list | reduce(#acc, $env)\n$env.list | reduce(#index)\n$env.list | reduce($env)\n$env.list | reduce(.Bar, 1)\n$env.list | reduce(.Bar, 1.0)\n$env.list | reduce(.String)\n$env.list | reduce(0)\n$env.list | reduce(1)\n$env.list | reduce(1, $env)\n$env.list | reduce(1.0)\n$env.list | reduce(1.0, f64)\n$env.list | reduce(1.0, false)\n$env.list | reduce(add)\n$env.list | reduce(add, nil)\n$env.list | reduce(array)\n$env.list | reduce(array, 0)\n$env.list | reduce(f64)\n$env.list | reduce(false)\n$env.list | reduce(false, i)\n$env.list | reduce(false, str)\n$env.list | reduce(foo == #)\n$env.list | reduce(foo)\n$env.list | reduce(foo, 0)\n$env.list | reduce(foo, foo)\n$env.list | reduce(foo, i)\n$env.list | reduce(foo, nil)\n$env.list | reduce(foo, str)\n$env.list | reduce(greet)\n$env.list | reduce(greet, foo)\n$env.list | reduce(i)\n$env.list | reduce(i, 1.0)\n$env.list | reduce(list)\n$env.list | reduce(str)\n$env.list | reduce(str, false)\n$env.list | reduce(true)\n$env.list | reduce(true, 1)\n$env.list | sortBy(#.Bar)\n$env.list | sortBy(.Bar)\n$env.list | sortBy(0)\n$env.list | sortBy(1)\n$env.list | sortBy(1.0)\n$env.list | sortBy(f64)\n$env.list | sortBy(i)\n$env.list | sortBy(str)\n$env.list | sum(0)\n$env.list | sum(1)\n$env.list | sum(1.0)\n$env.list | sum(f64)\n$env.list | sum(i)\n$env.list?.[$env?.i]\n$env.list?.[i]\n$env.list?.[i].Bar\n$env.list?.[i].String()\n$env.list[:]\n$env.list[:sum(array, #)]\n$env.list[i:]\n$env.ok != list ?? foo\n$env.ok != ok\n$env.ok && $env?.$env\n$env.ok && $env?.[nil]\n$env.ok && $env?.[str]\n$env.ok && array ?? i\n$env.ok && f64 == nil\n$env.ok && ok\n$env.ok == $env ?? ok\n$env.ok == nil || true\n$env.ok == ok\n$env.ok ? list : date(1)\n$env.ok ?: array\n$env.ok ?: f64\n$env.ok ?? add\n$env.ok ?? array\n$env.ok ?? foo.String\n$env.ok ?? i\n$env.ok ?? ok\n$env.ok ?? str\n$env.ok and $env?.[foobar]\n$env.ok and $env?.[nil]\n$env.ok and f64 < 1.0\n$env.ok and ok\n$env.ok in $env?.[nil]\n$env.ok in keys($env)\n$env.ok not in $env?.$env\n$env.ok not in [false]\n$env.ok or $env?.String.String\n$env.ok or $env?.[String]\n$env.ok or $env?.ok\n$env.ok or not $env\n$env.ok or ok\n$env.ok || $env?.foobar\n$env.ok || array ?? i\n$env.ok || ok\n$env.str != str\n$env.str + $env.str\n$env.str + str\n$env.str + type($env)\n$env.str + type(nil)\n$env.str < $env?.[str]\n$env.str < foo.Bar\n$env.str < str\n$env.str <= str\n$env.str <= toJSON(ok)\n$env.str == $env?.[Bar]\n$env.str == str\n$env.str > str\n$env.str > type(nil)\n$env.str >= greet(str)\n$env.str >= str\n$env.str ?? $env.foo\n$env.str ?? add\n$env.str ?? array\n$env.str ?? f64\n$env.str ?? foo\n$env.str ?? greet\n$env.str ?? greet($env)\n$env.str ?? i\n$env.str ?? list\n$env.str ?? ok\n$env.str ?? str\n$env.str contains $env?.String\n$env.str contains $env?.[Bar]\n$env.str contains str\n$env.str contains toJSON(foo)\n$env.str endsWith str\n$env.str endsWith str[:i]\n$env.str in foo\n$env.str matches str\n$env.str matches str ?: 1.0\n$env.str matches string(1.0)\n$env.str not contains $env.str\n$env.str not contains $env?.[str]\n$env.str not contains foo.String()\n$env.str not contains str\n$env.str not endsWith str\n$env.str not in $env ? foo : 0\n$env.str not in foo\n$env.str not matches foo?.Bar\n$env.str not matches str\n$env.str not startsWith foo?.Bar\n$env.str not startsWith str\n$env.str startsWith str\n$env.str | greet()\n$env.str | hasPrefix(str)\n$env.str | hasSuffix(str)\n$env.str | split(str)\n$env.str[:]\n$env.str[i:]\n$env; $env.add\n$env; $env.i\n$env; $env?.[Bar]\n$env; $env?.foo\n$env; $env?.i\n$env; $env?.ok\n$env; $env?.str\n$env; false; $env?.foo\n$env; list?.[i]\n$env?.$env != $env.array\n$env?.$env != foo\n$env?.$env != i\n$env?.$env != str\n$env?.$env == add\n$env?.$env == foo?.String()\n$env?.$env ?? $env ?? greet\n$env?.$env ?? array\n$env?.$env ?? greet\n$env?.$env and $env || true\n$env?.$env in foo || true\n$env?.$env in list\n$env?.$env not contains str\n$env?.$env not endsWith str\n$env?.$env?.Bar\n$env?.$env?.Bar()\n$env?.$env?.Bar()?.[foo]\n$env?.$env?.Bar?.foo\n$env?.$env?.String\n$env?.$env?.String()\n$env?.$env?.String(foobar)\n$env?.$env?.String(greet)\n$env?.$env?.[add]\n$env?.$env?.[array]\n$env?.$env?.[f64]\n$env?.$env?.[f64].list.greet\n$env?.$env?.[f64]?.str\n$env?.$env?.[foo]\n$env?.$env?.[foo].ok\n$env?.$env?.[greet]\n$env?.$env?.[greet].i\n$env?.$env?.[i]\n$env?.$env?.[i].f64\n$env?.$env?.[i].foo\n$env?.$env?.[i].str\n$env?.$env?.[i]?.[greet]?.greet()\n$env?.$env?.[i]?.[ok]\n$env?.$env?.[i]?.f64\n$env?.$env?.[list]\n$env?.$env?.[ok]\n$env?.$env?.[str]\n$env?.$env?.[str]?.[foo]?.str\n$env?.$env?.add\n$env?.$env?.add()\n$env?.$env?.add().Bar\n$env?.$env?.add(foobar?.[str])\n$env?.$env?.add(nil == Bar, add)\n$env?.$env?.add?.ok\n$env?.$env?.array\n$env?.$env?.array()\n$env?.$env?.array(foobar)\n$env?.$env?.array.i\n$env?.$env?.array?.[list]\n$env?.$env?.array?.[ok]\n$env?.$env?.array?.[str]\n$env?.$env?.array?.list\n$env?.$env?.count(String, foobar)\n$env?.$env?.f64\n$env?.$env?.f64()\n$env?.$env?.f64(foobar)\n$env?.$env?.f64.String\n$env?.$env?.filter(1.0, foo)\n$env?.$env?.findLast(i, i)\n$env?.$env?.foo\n$env?.$env?.foo.greet\n$env?.$env?.foobar.Bar\n$env?.$env?.foobar.i(foo)\n$env?.$env?.greet\n$env?.$env?.greet()\n$env?.$env?.greet.foo()\n$env?.$env?.greet.i\n$env?.$env?.greet?.i()\n$env?.$env?.i\n$env?.$env?.i()\n$env?.$env?.i()?.list\n$env?.$env?.i(foobar?.[f64])?.String\n$env?.$env?.i(str, foobar?.f64)\n$env?.$env?.i?.greet\n$env?.$env?.keys(Bar, foobar)\n$env?.$env?.list\n$env?.$env?.list()\n$env?.$env?.list.String\n$env?.$env?.list.list\n$env?.$env?.list?.foo\n$env?.$env?.list?.list\n$env?.$env?.ok\n$env?.$env?.ok()\n$env?.$env?.ok(String)\n$env?.$env?.ok.first(0)?.list\n$env?.$env?.ok?.String\n$env?.$env?.ok?.ok\n$env?.$env?.str\n$env?.$env?.str()\n$env?.$env?.str()?.[add]\n$env?.$env?.str(foobar)\n$env?.$env?.sum(0, list)\n$env?.$env?.uniq(foobar)\n$env?.Bar != $env.add\n$env?.Bar != add\n$env?.Bar != array\n$env?.Bar != f64\n$env?.Bar != filter(array, true)\n$env?.Bar != foo\n$env?.Bar != foo && true\n$env?.Bar != greet\n$env?.Bar != i\n$env?.Bar != list\n$env?.Bar != min(1)\n$env?.Bar != ok\n$env?.Bar != str\n$env?.Bar != type(1.0)\n$env?.Bar + 1.0 or true\n$env?.Bar == $env?.f64\n$env?.Bar == $env?.foobar\n$env?.Bar == 1.0 / f64\n$env?.Bar == add\n$env?.Bar == array\n$env?.Bar == f64\n$env?.Bar == foo\n$env?.Bar == foo.Bar\n$env?.Bar == greet\n$env?.Bar == greet(str)\n$env?.Bar == i\n$env?.Bar == list\n$env?.Bar == map(array, #)\n$env?.Bar == map(list, 1.0)\n$env?.Bar == nil ?? 1.0\n$env?.Bar == ok\n$env?.Bar == ok or true\n$env?.Bar == str\n$env?.Bar == string(list)\n$env?.Bar ?? $env?.str\n$env?.Bar ?? -f64\n$env?.Bar ?? [foo]\n$env?.Bar ?? add\n$env?.Bar ?? array\n$env?.Bar ?? f64\n$env?.Bar ?? foo\n$env?.Bar ?? greet\n$env?.Bar ?? i\n$env?.Bar ?? list\n$env?.Bar ?? not ok\n$env?.Bar ?? ok\n$env?.Bar ?? str\n$env?.Bar ?? type(array)\n$env?.Bar contains $env?.$env\n$env?.Bar contains str\n$env?.Bar endsWith $env?.String\n$env?.Bar endsWith str\n$env?.Bar endsWith str ? foo : 1\n$env?.Bar endsWith toJSON(0)\n$env?.Bar in array\n$env?.Bar matches $env?.[String]\n$env?.Bar matches str\n$env?.Bar matches string(i)\n$env?.Bar not contains mean(array)\n$env?.Bar not contains str\n$env?.Bar not endsWith $env.str\n$env?.Bar not endsWith foo.Bar\n$env?.Bar not in $env?.String\n$env?.Bar not in $env?.list\n$env?.Bar not in [f64, $env]\n$env?.Bar not in array\n$env?.Bar not in array ?? array\n$env?.Bar not in list\n$env?.Bar not in list and $env\n$env?.Bar not matches greet(str)\n$env?.Bar not matches str\n$env?.Bar not startsWith $env?.str\n$env?.Bar not startsWith 0 ?? array\n$env?.Bar not startsWith str\n$env?.Bar not startsWith str ?? $env\n$env?.Bar startsWith $env ?? foo\n$env?.Bar startsWith $env?.[String]\n$env?.Bar startsWith 1.0 ?? 0\n$env?.Bar startsWith str\n$env?.Bar | get(1.0)\n$env?.Bar | get(list)\n$env?.Bar | get(nil)\n$env?.Bar | get(true)\n$env?.Bar().foobar or true\n$env?.Bar(foobar)?.foobar && false\n$env?.Bar; array\n$env?.Bar?.$env?.ok()\n$env?.Bar?.Bar\n$env?.Bar?.Bar()\n$env?.Bar?.Bar() != !ok\n$env?.Bar?.Bar().Bar\n$env?.Bar?.Bar()?.[f64]\n$env?.Bar?.Bar(Bar)\n$env?.Bar?.Bar(String)\n$env?.Bar?.Bar(f64)\n$env?.Bar?.Bar(foo != foobar)\n$env?.Bar?.Bar(foobar)\n$env?.Bar?.Bar(foobar?.String)\n$env?.Bar?.Bar(foobar?.[greet])\n$env?.Bar?.Bar(foobar?.greet())\n$env?.Bar?.Bar(i)\n$env?.Bar?.Bar(list)\n$env?.Bar?.Bar.String\n$env?.Bar?.Bar.add\n$env?.Bar?.Bar.i\n$env?.Bar?.Bar.list()\n$env?.Bar?.Bar.ok\n$env?.Bar?.Bar.str()\n$env?.Bar?.Bar?.Bar\n$env?.Bar?.Bar?.Bar().greet\n$env?.Bar?.Bar?.String\n$env?.Bar?.Bar?.[f64]\n$env?.Bar?.Bar?.[i]\n$env?.Bar?.Bar?.[list]\n$env?.Bar?.Bar?.i\n$env?.Bar?.Bar?.list\n$env?.Bar?.Bar?.ok\n$env?.Bar?.Bar?.str\n$env?.Bar?.String\n$env?.Bar?.String()\n$env?.Bar?.String()?.[foo]\n$env?.Bar?.String(add(foobar, foobar))\n$env?.Bar?.String(foo)\n$env?.Bar?.String(foobar)\n$env?.Bar?.String(foobar)?.[add]\n$env?.Bar?.String(foobar)?.[ok]?.[str]\n$env?.Bar?.String(foobar)?.str\n$env?.Bar?.String(foobar?.Bar?.[f64])\n$env?.Bar?.String(foobar?.[true])\n$env?.Bar?.String(foobar?.f64(foobar))\n$env?.Bar?.String(greet(Bar))?.foobar\n$env?.Bar?.String(greet)\n$env?.Bar?.String(i)\n$env?.Bar?.String(str | toBase64(foobar), foobar)\n$env?.Bar?.String.f64\n$env?.Bar?.String.foo\n$env?.Bar?.String.i\n$env?.Bar?.String.ok\n$env?.Bar?.String?.String\n$env?.Bar?.String?.[array]\n$env?.Bar?.String?.[f64]\n$env?.Bar?.String?.[i]\n$env?.Bar?.String?.[str]\n$env?.Bar?.String?.add()\n$env?.Bar?.String?.date(foo)\n$env?.Bar?.String?.foo\n$env?.Bar?.String?.str()\n$env?.Bar?.[$env.i]\n$env?.Bar?.[$env?.Bar]\n$env?.Bar?.[$env?.[String]]\n$env?.Bar?.[$env?.[add]].Bar\n$env?.Bar?.[$env?.f64]\n$env?.Bar?.[add]\n$env?.Bar?.[add].Bar\n$env?.Bar?.[add].String\n$env?.Bar?.[add].add\n$env?.Bar?.[add].foo\n$env?.Bar?.[add].i\n$env?.Bar?.[add]?.Bar?.str\n$env?.Bar?.[add]?.[greet]\n$env?.Bar?.[add]?.[i]\n$env?.Bar?.[add]?.f64\n$env?.Bar?.[add]?.foo\n$env?.Bar?.[add]?.greet\n$env?.Bar?.[add]?.list\n$env?.Bar?.[add]?.ok\n$env?.Bar?.[add]?.str\n$env?.Bar?.[array]\n$env?.Bar?.[array].ok\n$env?.Bar?.[array].ok()\n$env?.Bar?.[array]?.Bar\n$env?.Bar?.[array]?.String\n$env?.Bar?.[array]?.[greet]\n$env?.Bar?.[array]?.[list]\n$env?.Bar?.[array]?.add\n$env?.Bar?.[array]?.foo\n$env?.Bar?.[array]?.list\n$env?.Bar?.[count($env)]\n$env?.Bar?.[f64]\n$env?.Bar?.[f64].Bar\n$env?.Bar?.[f64].f64\n$env?.Bar?.[f64].list\n$env?.Bar?.[f64].ok\n$env?.Bar?.[f64]?.Bar\n$env?.Bar?.[f64]?.[greet]\n$env?.Bar?.[f64]?.[list]\n$env?.Bar?.[f64]?.add()\n$env?.Bar?.[f64]?.array()\n$env?.Bar?.[f64]?.str(foobar)\n$env?.Bar?.[false != $env]\n$env?.Bar?.[foo?.String]\n$env?.Bar?.[foo]\n$env?.Bar?.[foo].add\n$env?.Bar?.[foo].array()\n$env?.Bar?.[foo].f64\n$env?.Bar?.[foo].greet\n$env?.Bar?.[foo].str\n$env?.Bar?.[foo]?.Bar\n$env?.Bar?.[foo]?.String\n$env?.Bar?.[foo]?.[array]\n$env?.Bar?.[foo]?.[greet]\n$env?.Bar?.[foo]?.[i]\n$env?.Bar?.[foo]?.[ok]\n$env?.Bar?.[foo]?.add\n$env?.Bar?.[foo]?.array(i)\n$env?.Bar?.[foo]?.f64\n$env?.Bar?.[foo]?.list\n$env?.Bar?.[foo]?.str\n$env?.Bar?.[greet]\n$env?.Bar?.[greet].Bar\n$env?.Bar?.[greet].Bar(add)?.greet\n$env?.Bar?.[greet].add\n$env?.Bar?.[greet].f64\n$env?.Bar?.[greet].foo\n$env?.Bar?.[greet].i\n$env?.Bar?.[greet].list\n$env?.Bar?.[greet].ok\n$env?.Bar?.[greet]?.Bar\n$env?.Bar?.[greet]?.[add]\n$env?.Bar?.[greet]?.[f64]\n$env?.Bar?.[greet]?.[i]\n$env?.Bar?.[greet]?.array\n$env?.Bar?.[greet]?.f64\n$env?.Bar?.[greet]?.foo()\n$env?.Bar?.[greet]?.greet\n$env?.Bar?.[greet]?.list.String\n$env?.Bar?.[groupBy(list, #)]\n$env?.Bar?.[i]\n$env?.Bar?.[i].Bar(foo, false, greet).array\n$env?.Bar?.[i].add\n$env?.Bar?.[i].foo\n$env?.Bar?.[i].list\n$env?.Bar?.[i].ok\n$env?.Bar?.[i]?.Bar\n$env?.Bar?.[i]?.String\n$env?.Bar?.[i]?.[add]\n$env?.Bar?.[i]?.[array]\n$env?.Bar?.[i]?.[greet]\n$env?.Bar?.[i]?.[i]\n$env?.Bar?.[i]?.[list]\n$env?.Bar?.[i]?.[ok]\n$env?.Bar?.[i]?.add\n$env?.Bar?.[i]?.f64\n$env?.Bar?.[i]?.foo\n$env?.Bar?.[i]?.ok\n$env?.Bar?.[i]?.str()\n$env?.Bar?.[list?.[i]]\n$env?.Bar?.[list]\n$env?.Bar?.[list].Bar\n$env?.Bar?.[list].add\n$env?.Bar?.[list].array()\n$env?.Bar?.[list].f64\n$env?.Bar?.[list].greet\n$env?.Bar?.[list].i(foobar)\n$env?.Bar?.[list].ok\n$env?.Bar?.[list].str\n$env?.Bar?.[list].str()\n$env?.Bar?.[list]?.String\n$env?.Bar?.[list]?.[add]\n$env?.Bar?.[list]?.[array]\n$env?.Bar?.[list]?.[f64]\n$env?.Bar?.[list]?.[foo]\n$env?.Bar?.[list]?.[i]\n$env?.Bar?.[list]?.[ok]\n$env?.Bar?.[list]?.[str]\n$env?.Bar?.[list]?.array.list\n$env?.Bar?.[list]?.f64\n$env?.Bar?.[list]?.list\n$env?.Bar?.[list]?.list()\n$env?.Bar?.[list]?.str()\n$env?.Bar?.[median(0)]\n$env?.Bar?.[nil | date(array)]\n$env?.Bar?.[none($env, #.i)]\n$env?.Bar?.[ok]\n$env?.Bar?.[ok] == greet\n$env?.Bar?.[ok].Bar\n$env?.Bar?.[ok].String\n$env?.Bar?.[ok].f64\n$env?.Bar?.[ok].i\n$env?.Bar?.[ok].ok()\n$env?.Bar?.[ok].str\n$env?.Bar?.[ok]?.Bar\n$env?.Bar?.[ok]?.String\n$env?.Bar?.[ok]?.[greet]\n$env?.Bar?.[ok]?.[i]\n$env?.Bar?.[ok]?.[str]\n$env?.Bar?.[ok]?.add\n$env?.Bar?.[ok]?.array\n$env?.Bar?.[ok]?.array()\n$env?.Bar?.[ok]?.f64()\n$env?.Bar?.[ok]?.foo\n$env?.Bar?.[ok]?.greet()\n$env?.Bar?.[ok]?.greet.array(foobar?.[str])\n$env?.Bar?.[ok]?.i()?.[ok]\n$env?.Bar?.[ok]?.ok\n$env?.Bar?.[ok]?.str\n$env?.Bar?.[str]\n$env?.Bar?.[str].f64\n$env?.Bar?.[str].foo()\n$env?.Bar?.[str].i\n$env?.Bar?.[str].list\n$env?.Bar?.[str].ok(foobar)\n$env?.Bar?.[str].str\n$env?.Bar?.[str]?.[array]\n$env?.Bar?.[str]?.[foo]\n$env?.Bar?.[str]?.[greet]\n$env?.Bar?.[str]?.[i]\n$env?.Bar?.[str]?.[ok]?.greet\n$env?.Bar?.[str]?.add\n$env?.Bar?.[str]?.array\n$env?.Bar?.[str]?.f64\n$env?.Bar?.add\n$env?.Bar?.add not contains $env\n$env?.Bar?.add($env.foo).String\n$env?.Bar?.add()\n$env?.Bar?.add().f64\n$env?.Bar?.add().f64(foobar)\n$env?.Bar?.add()?.[array]\n$env?.Bar?.add()?.greet()\n$env?.Bar?.add()?.i()\n$env?.Bar?.add(Bar)\n$env?.Bar?.add(add)\n$env?.Bar?.add(f64)\n$env?.Bar?.add(foo)\n$env?.Bar?.add(foobar != 1)\n$env?.Bar?.add(foobar)\n$env?.Bar?.add(foobar?.Bar?.[list])\n$env?.Bar?.add(list)\n$env?.Bar?.add(ok)\n$env?.Bar?.add.Bar\n$env?.Bar?.add.f64()\n$env?.Bar?.add.foo\n$env?.Bar?.add.greet\n$env?.Bar?.add.i\n$env?.Bar?.add.list\n$env?.Bar?.add.ok\n$env?.Bar?.add.ok()\n$env?.Bar?.add?.Bar\n$env?.Bar?.add?.String\n$env?.Bar?.add?.[add]\n$env?.Bar?.add?.[foo]\n$env?.Bar?.add?.[greet]\n$env?.Bar?.add?.[list]\n$env?.Bar?.add?.[str]\n$env?.Bar?.add?.array\n$env?.Bar?.add?.greet\n$env?.Bar?.all(greet)\n$env?.Bar?.any(foo)\n$env?.Bar?.any(str)\n$env?.Bar?.array\n$env?.Bar?.array($env)\n$env?.Bar?.array()\n$env?.Bar?.array().f64\n$env?.Bar?.array()?.[str]\n$env?.Bar?.array(array)\n$env?.Bar?.array(f64)\n$env?.Bar?.array(foobar)\n$env?.Bar?.array(foobar?.foo).ok\n$env?.Bar?.array(list)\n$env?.Bar?.array(ok)\n$env?.Bar?.array(reduce(list, foobar))?.Bar\n$env?.Bar?.array(str)\n$env?.Bar?.array.Bar\n$env?.Bar?.array.array\n$env?.Bar?.array.i?.foo\n$env?.Bar?.array.list\n$env?.Bar?.array.list(string(list) endsWith foobar?.String)\n$env?.Bar?.array.str\n$env?.Bar?.array?.[add]\n$env?.Bar?.array?.[array]\n$env?.Bar?.array?.[f64]\n$env?.Bar?.array?.[foo]\n$env?.Bar?.array?.[str]\n$env?.Bar?.array?.array\n$env?.Bar?.array?.f64\n$env?.Bar?.array?.foo\n$env?.Bar?.array?.ok\n$env?.Bar?.array?.str\n$env?.Bar?.array?.str?.[array]\n$env?.Bar?.bitand(foobar)\n$env?.Bar?.bitnand(i, f64)\n$env?.Bar?.bitshl(str, foobar)\n$env?.Bar?.bitshr(foobar)\n$env?.Bar?.bitushr(Bar, str)\n$env?.Bar?.count(nil, nil)\n$env?.Bar?.f64\n$env?.Bar?.f64()\n$env?.Bar?.f64().add()\n$env?.Bar?.f64(1)\n$env?.Bar?.f64(Bar?.[ok])\n$env?.Bar?.f64(f64)\n$env?.Bar?.f64(foobar)\n$env?.Bar?.f64(foobar, foobar?.str())\n$env?.Bar?.f64(i == foobar not in nil)\n$env?.Bar?.f64(list)\n$env?.Bar?.f64(ok, foobar)\n$env?.Bar?.f64(str, foobar)\n$env?.Bar?.f64.Bar(0)\n$env?.Bar?.f64.array()\n$env?.Bar?.f64.list\n$env?.Bar?.f64?.Bar()\n$env?.Bar?.f64?.[f64]\n$env?.Bar?.f64?.[greet]\n$env?.Bar?.f64?.[i]\n$env?.Bar?.f64?.f64\n$env?.Bar?.f64?.list()\n$env?.Bar?.f64?.str\n$env?.Bar?.false?.[foo]\n$env?.Bar?.false?.list\n$env?.Bar?.filter(Bar)\n$env?.Bar?.filter(Bar, foobar)\n$env?.Bar?.filter(foo)\n$env?.Bar?.find(false)\n$env?.Bar?.find(foobar)\n$env?.Bar?.findIndex($env, foobar)\n$env?.Bar?.findIndex(false)\n$env?.Bar?.findLast($env)\n$env?.Bar?.findLastIndex(1, foobar)\n$env?.Bar?.findLastIndex(foo, foo)\n$env?.Bar?.findLastIndex(foobar, ok)\n$env?.Bar?.floor(ok, 1.0)\n$env?.Bar?.foo\n$env?.Bar?.foo not contains $env\n$env?.Bar?.foo($env matches foobar)\n$env?.Bar?.foo()\n$env?.Bar?.foo().greet.str\n$env?.Bar?.foo().i\n$env?.Bar?.foo()?.[add]\n$env?.Bar?.foo(Bar not matches foobar)\n$env?.Bar?.foo(f64)\n$env?.Bar?.foo(foobar)\n$env?.Bar?.foo(foobar, foobar)\n$env?.Bar?.foo(foobar?.list(foobar, array))\n$env?.Bar?.foo(i)\n$env?.Bar?.foo(list)\n$env?.Bar?.foo(str)\n$env?.Bar?.foo.Bar\n$env?.Bar?.foo.add\n$env?.Bar?.foo.array\n$env?.Bar?.foo.f64\n$env?.Bar?.foo.greet(greet)\n$env?.Bar?.foo.greet.i\n$env?.Bar?.foo.i\n$env?.Bar?.foo.list\n$env?.Bar?.foo?.Bar\n$env?.Bar?.foo?.[array]\n$env?.Bar?.foo?.[foo]\n$env?.Bar?.foo?.[i]\n$env?.Bar?.foo?.[ok]\n$env?.Bar?.foo?.add\n$env?.Bar?.foo?.i\n$env?.Bar?.foo?.str\n$env?.Bar?.foobar\n$env?.Bar?.foobar ?? foo\n$env?.Bar?.foobar.String.greet?.ok\n$env?.Bar?.foobar.add\n$env?.Bar?.foobar.add(foobar)\n$env?.Bar?.foobar.array\n$env?.Bar?.foobar.f64\n$env?.Bar?.foobar.foobar\n$env?.Bar?.foobar.i\n$env?.Bar?.foobar.i()\n$env?.Bar?.foobar.list\n$env?.Bar?.foobar.ok\n$env?.Bar?.foobar.str()?.ok\n$env?.Bar?.foobar?.Bar(Bar)\n$env?.Bar?.foobar?.String\n$env?.Bar?.foobar?.[f64]\n$env?.Bar?.foobar?.[foo]\n$env?.Bar?.foobar?.[i].String\n$env?.Bar?.foobar?.[list]\n$env?.Bar?.foobar?.array\n$env?.Bar?.foobar?.array(foobar)\n$env?.Bar?.foobar?.foo\n$env?.Bar?.foobar?.i\n$env?.Bar?.foobar?.list\n$env?.Bar?.foobar?.str\n$env?.Bar?.fromBase64(ok)\n$env?.Bar?.fromPairs(0)\n$env?.Bar?.greet\n$env?.Bar?.greet()\n$env?.Bar?.greet()?.String\n$env?.Bar?.greet(String not contains foo, foo)\n$env?.Bar?.greet(String)\n$env?.Bar?.greet(array)\n$env?.Bar?.greet(foo)\n$env?.Bar?.greet(foobar ?? String)\n$env?.Bar?.greet(foobar startsWith foobar)\n$env?.Bar?.greet(foobar | greet())\n$env?.Bar?.greet(foobar)\n$env?.Bar?.greet(foobar?.ok())\n$env?.Bar?.greet(ok)\n$env?.Bar?.greet(str)\n$env?.Bar?.greet.add()\n$env?.Bar?.greet.f64\n$env?.Bar?.greet.foo\n$env?.Bar?.greet.greet\n$env?.Bar?.greet?.[add]\n$env?.Bar?.greet?.[array]\n$env?.Bar?.greet?.[f64]\n$env?.Bar?.greet?.[i]\n$env?.Bar?.greet?.[i]?.f64\n$env?.Bar?.greet?.[ok]\n$env?.Bar?.greet?.add\n$env?.Bar?.greet?.array\n$env?.Bar?.greet?.foo\n$env?.Bar?.greet?.foo(foobar)?.str\n$env?.Bar?.greet?.greet()\n$env?.Bar?.greet?.i()\n$env?.Bar?.greet?.list\n$env?.Bar?.groupBy(add)\n$env?.Bar?.groupBy(true, foo)\n$env?.Bar?.i\n$env?.Bar?.i == 1.0\n$env?.Bar?.i()\n$env?.Bar?.i().foo\n$env?.Bar?.i()?.array\n$env?.Bar?.i(Bar, ok)\n$env?.Bar?.i(String)\n$env?.Bar?.i(foo.Bar)\n$env?.Bar?.i(foobar)\n$env?.Bar?.i(foobar?.[str])\n$env?.Bar?.i(foobar?.str().str)\n$env?.Bar?.i(list)\n$env?.Bar?.i(nil matches foobar)\n$env?.Bar?.i(nil, false)\n$env?.Bar?.i.Bar(1, nil)\n$env?.Bar?.i.array()\n$env?.Bar?.i.i\n$env?.Bar?.i.ok\n$env?.Bar?.i?.String\n$env?.Bar?.i?.String(foobar)\n$env?.Bar?.i?.[add]\n$env?.Bar?.i?.[greet]?.[array]\n$env?.Bar?.i?.[ok]\n$env?.Bar?.i?.array\n$env?.Bar?.i?.foo\n$env?.Bar?.i?.foo()\n$env?.Bar?.i?.ok\n$env?.Bar?.last(foobar)\n$env?.Bar?.len(add)\n$env?.Bar?.len(greet)\n$env?.Bar?.list\n$env?.Bar?.list()\n$env?.Bar?.list().ok\n$env?.Bar?.list()?.ok\n$env?.Bar?.list(1.0 startsWith foobar, foobar?.list)\n$env?.Bar?.list(Bar | type(nil))\n$env?.Bar?.list(f64)\n$env?.Bar?.list(foobar)\n$env?.Bar?.list(foobar?.i)\n$env?.Bar?.list(list)?.str\n$env?.Bar?.list(nil)\n$env?.Bar?.list(type(foobar))\n$env?.Bar?.list.Bar\n$env?.Bar?.list.String\n$env?.Bar?.list.array\n$env?.Bar?.list.f64()\n$env?.Bar?.list.foobar\n$env?.Bar?.list?.Bar\n$env?.Bar?.list?.String\n$env?.Bar?.list?.[array]\n$env?.Bar?.list?.[foo]?.String()?.list\n$env?.Bar?.list?.[greet]\n$env?.Bar?.list?.[list]\n$env?.Bar?.list?.add\n$env?.Bar?.list?.f64\n$env?.Bar?.list?.foo\n$env?.Bar?.list?.i\n$env?.Bar?.list?.str\n$env?.Bar?.map(foobar)\n$env?.Bar?.map(foobar, greet, String)\n$env?.Bar?.median(true, $env)\n$env?.Bar?.nil.array()\n$env?.Bar?.nil?.ok()\n$env?.Bar?.none(false, foobar)\n$env?.Bar?.none(foo)\n$env?.Bar?.none(foobar)\n$env?.Bar?.ok\n$env?.Bar?.ok()\n$env?.Bar?.ok().array\n$env?.Bar?.ok().greet\n$env?.Bar?.ok()?.f64\n$env?.Bar?.ok()?.list\n$env?.Bar?.ok(add)\n$env?.Bar?.ok(f64)\n$env?.Bar?.ok(foobar)\n$env?.Bar?.ok(foobar?.[array])\n$env?.Bar?.ok(foobar?.[f64])\n$env?.Bar?.ok(foobar?.foo)\n$env?.Bar?.ok(greet)\n$env?.Bar?.ok(list)\n$env?.Bar?.ok(str)\n$env?.Bar?.ok.String()\n$env?.Bar?.ok.f64\n$env?.Bar?.ok.f64(foobar?.[add]?.f64())\n$env?.Bar?.ok.greet\n$env?.Bar?.ok.i(add)\n$env?.Bar?.ok.list\n$env?.Bar?.ok.ok\n$env?.Bar?.ok.str\n$env?.Bar?.ok?.Bar\n$env?.Bar?.ok?.String\n$env?.Bar?.ok?.[add]\n$env?.Bar?.ok?.[array]\n$env?.Bar?.ok?.[f64]\n$env?.Bar?.ok?.[foo]\n$env?.Bar?.ok?.add\n$env?.Bar?.ok?.f64\n$env?.Bar?.ok?.foo\n$env?.Bar?.ok?.greet\n$env?.Bar?.ok?.i\n$env?.Bar?.ok?.str\n$env?.Bar?.one(array)\n$env?.Bar?.one(list)\n$env?.Bar?.reduce(foobar, foobar)\n$env?.Bar?.reduce(str)\n$env?.Bar?.reduce(true)\n$env?.Bar?.replace(str)\n$env?.Bar?.round(array)\n$env?.Bar?.round(foobar)\n$env?.Bar?.round(foobar, nil)\n$env?.Bar?.sort(list)?.Bar\n$env?.Bar?.sortBy($env, false)\n$env?.Bar?.sortBy(nil)\n$env?.Bar?.split(false)\n$env?.Bar?.str\n$env?.Bar?.str != ok\n$env?.Bar?.str()\n$env?.Bar?.str() endsWith str\n$env?.Bar?.str()?.[str]\n$env?.Bar?.str()?.f64\n$env?.Bar?.str()?.greet\n$env?.Bar?.str(1, foobar)\n$env?.Bar?.str(Bar)\n$env?.Bar?.str(add)\n$env?.Bar?.str(f64 in nil)\n$env?.Bar?.str(foobar)\n$env?.Bar?.str(foobar?.[foobar])\n$env?.Bar?.str(foobar?.array(String))\n$env?.Bar?.str(greet)\n$env?.Bar?.str(ok)\n$env?.Bar?.str.f64\n$env?.Bar?.str.foo\n$env?.Bar?.str.i\n$env?.Bar?.str.list\n$env?.Bar?.str?.Bar\n$env?.Bar?.str?.Bar()\n$env?.Bar?.str?.[foo]\n$env?.Bar?.str?.[greet]\n$env?.Bar?.str?.[ok]\n$env?.Bar?.str?.[str]\n$env?.Bar?.str?.[str]?.Bar\n$env?.Bar?.str?.[str]?.array\n$env?.Bar?.str?.array\n$env?.Bar?.str?.greet(foobar)\n$env?.Bar?.str?.i()\n$env?.Bar?.str?.list\n$env?.Bar?.str?.str()\n$env?.Bar?.string(foobar)\n$env?.Bar?.sum(f64)\n$env?.Bar?.sum(false)\n$env?.Bar?.toJSON(true)\n$env?.Bar?.true?.add\n$env?.Bar?.type(i)\n$env?.String != $env ? ok : true\n$env?.String != add\n$env?.String != array\n$env?.String != f64\n$env?.String != float(i)\n$env?.String != foo\n$env?.String != foo?.String\n$env?.String != greet\n$env?.String != i\n$env?.String != list\n$env?.String != list != true\n$env?.String != ok\n$env?.String != str\n$env?.String == $env?.list\n$env?.String == -1.0\n$env?.String == add\n$env?.String == array\n$env?.String == f64\n$env?.String == foo\n$env?.String == greet\n$env?.String == i\n$env?.String == list\n$env?.String == str\n$env?.String ?? add\n$env?.String ?? array\n$env?.String ?? foo\n$env?.String ?? greet\n$env?.String ?? list\n$env?.String ?? str\n$env?.String ?? toJSON(1.0)\n$env?.String contains 0 ?? greet\n$env?.String contains str\n$env?.String endsWith $env && $env\n$env?.String endsWith str\n$env?.String in $env ? 1 : true\n$env?.String in $env ?? greet\n$env?.String in array\n$env?.String in list\n$env?.String matches $env ?: foo\n$env?.String matches $env?.nil\n$env?.String matches str\n$env?.String not contains str\n$env?.String not endsWith $env and $env\n$env?.String not endsWith $env.str\n$env?.String not endsWith str\n$env?.String not in $env?.Bar?.array\n$env?.String not in array\n$env?.String not in list\n$env?.String not in values($env)\n$env?.String not matches $env?.[String]\n$env?.String not matches foo.String()\n$env?.String not matches str\n$env?.String not startsWith str\n$env?.String startsWith str\n$env?.String startsWith toJSON(foo)\n$env?.String | get(1.0)\n$env?.String | get(false)\n$env?.String() == 1 || true\n$env?.String?.$env != true\n$env?.String?.$env.foo\n$env?.String?.Bar\n$env?.String?.Bar()\n$env?.String?.Bar(String)\n$env?.String?.Bar(add)\n$env?.String?.Bar(f64)\n$env?.String?.Bar(foo, ok)\n$env?.String?.Bar(foobar)\n$env?.String?.Bar(greet != foobar)\n$env?.String?.Bar(ok)\n$env?.String?.Bar.String\n$env?.String?.Bar.add\n$env?.String?.Bar.add()\n$env?.String?.Bar.i\n$env?.String?.Bar.list\n$env?.String?.Bar.ok\n$env?.String?.Bar.str\n$env?.String?.Bar?.Bar?.[ok]\n$env?.String?.Bar?.String\n$env?.String?.Bar?.[f64]\n$env?.String?.Bar?.[greet]\n$env?.String?.Bar?.[list]\n$env?.String?.Bar?.[ok]\n$env?.String?.Bar?.add\n$env?.String?.Bar?.greet\n$env?.String?.Bar?.greet()\n$env?.String?.Bar?.i\n$env?.String?.Bar?.ok\n$env?.String?.Bar?.str\n$env?.String?.String\n$env?.String?.String()\n$env?.String?.String().array\n$env?.String?.String(foobar not matches Bar)\n$env?.String?.String(foobar)\n$env?.String?.String(foobar, foobar)\n$env?.String?.String(i)\n$env?.String?.String(str)\n$env?.String?.String.add.f64\n$env?.String?.String.f64\n$env?.String?.String.i\n$env?.String?.String.list\n$env?.String?.String.ok\n$env?.String?.String?.[foo]\n$env?.String?.String?.[greet]\n$env?.String?.String?.[i]\n$env?.String?.String?.[list].ok\n$env?.String?.String?.add\n$env?.String?.String?.f64\n$env?.String?.String?.foo\n$env?.String?.String?.greet\n$env?.String?.String?.list\n$env?.String?.String?.one(foobar?.list)\n$env?.String?.[$env or $env]\n$env?.String?.[$env | count(true)]\n$env?.String?.[$env.f64]\n$env?.String?.[$env?.[f64]]\n$env?.String?.[add]\n$env?.String?.[add] != greet\n$env?.String?.[add].Bar\n$env?.String?.[add].array\n$env?.String?.[add].greet\n$env?.String?.[add].i\n$env?.String?.[add].ok\n$env?.String?.[add]?.Bar?.array\n$env?.String?.[add]?.[f64]\n$env?.String?.[add]?.[foo]\n$env?.String?.[add]?.[i]\n$env?.String?.[add]?.[list]\n$env?.String?.[array]\n$env?.String?.[array].Bar\n$env?.String?.[array].f64\n$env?.String?.[array].f64()\n$env?.String?.[array].greet\n$env?.String?.[array].str\n$env?.String?.[array]?.Bar\n$env?.String?.[array]?.String\n$env?.String?.[array]?.[add]\n$env?.String?.[array]?.[array]\n$env?.String?.[array]?.[f64]\n$env?.String?.[array]?.[list]\n$env?.String?.[array]?.add\n$env?.String?.[array]?.array\n$env?.String?.[array]?.foo\n$env?.String?.[array]?.foo()\n$env?.String?.[f64]\n$env?.String?.[f64].add\n$env?.String?.[f64].array\n$env?.String?.[f64].foobar\n$env?.String?.[f64].greet\n$env?.String?.[f64].i()\n$env?.String?.[f64]?.Bar\n$env?.String?.[f64]?.String\n$env?.String?.[f64]?.[f64]\n$env?.String?.[f64]?.[list]\n$env?.String?.[f64]?.[str]\n$env?.String?.[f64]?.array\n$env?.String?.[f64]?.greet\n$env?.String?.[f64]?.list\n$env?.String?.[f64]?.list()\n$env?.String?.[f64]?.ok\n$env?.String?.[f64]?.str()\n$env?.String?.[findLast($env, .list)]\n$env?.String?.[foo]\n$env?.String?.[foo].array\n$env?.String?.[foo].f64\n$env?.String?.[foo].f64()\n$env?.String?.[foo].i\n$env?.String?.[foo]?.String\n$env?.String?.[foo]?.[foo]\n$env?.String?.[foo]?.[i]\n$env?.String?.[foo]?.add\n$env?.String?.[foo]?.foo\n$env?.String?.[foo]?.i\n$env?.String?.[foo]?.list\n$env?.String?.[foo]?.ok\n$env?.String?.[foo]?.ok()\n$env?.String?.[foo]?.str\n$env?.String?.[greet]\n$env?.String?.[greet] not in array\n$env?.String?.[greet].add\n$env?.String?.[greet].any(foobar).str\n$env?.String?.[greet].array\n$env?.String?.[greet]?.[add]\n$env?.String?.[greet]?.[list]\n$env?.String?.[greet]?.f64\n$env?.String?.[greet]?.greet()\n$env?.String?.[greet]?.list\n$env?.String?.[greet]?.ok\n$env?.String?.[i]\n$env?.String?.[i].Bar\n$env?.String?.[i].f64\n$env?.String?.[i].f64()\n$env?.String?.[i].foo\n$env?.String?.[i].list\n$env?.String?.[i]?.String\n$env?.String?.[i]?.[array]\n$env?.String?.[i]?.[foo]\n$env?.String?.[i]?.[greet]\n$env?.String?.[i]?.add\n$env?.String?.[i]?.array\n$env?.String?.[i]?.foo\n$env?.String?.[i]?.list\n$env?.String?.[i]?.str\n$env?.String?.[i]?.str()\n$env?.String?.[list]\n$env?.String?.[list].array\n$env?.String?.[list].f64\n$env?.String?.[list].foo\n$env?.String?.[list].list\n$env?.String?.[list].ok\n$env?.String?.[list].ok()\n$env?.String?.[list].str\n$env?.String?.[list]?.[list]\n$env?.String?.[list]?.[str]\n$env?.String?.[list]?.add\n$env?.String?.[list]?.list(foobar)\n$env?.String?.[list]?.ok\n$env?.String?.[ok]\n$env?.String?.[ok].Bar\n$env?.String?.[ok].add\n$env?.String?.[ok].list()\n$env?.String?.[ok]?.Bar\n$env?.String?.[ok]?.Bar.str\n$env?.String?.[ok]?.[array]\n$env?.String?.[ok]?.[f64]?.foo\n$env?.String?.[ok]?.[i]\n$env?.String?.[ok]?.[ok]\n$env?.String?.[ok]?.[str]\n$env?.String?.[ok]?.add\n$env?.String?.[ok]?.add()\n$env?.String?.[ok]?.foo()\n$env?.String?.[ok]?.greet\n$env?.String?.[ok]?.ok\n$env?.String?.[str]\n$env?.String?.[str] != lower(str)\n$env?.String?.[str].foo\n$env?.String?.[str].str()\n$env?.String?.[str]?.[array]\n$env?.String?.[str]?.[list]\n$env?.String?.[str]?.array\n$env?.String?.[str]?.f64\n$env?.String?.[str]?.foo()\n$env?.String?.[str]?.str(str)\n$env?.String?.[sum($env)]\n$env?.String?.abs(1.0)\n$env?.String?.add\n$env?.String?.add()\n$env?.String?.add()?.[i]\n$env?.String?.add(Bar)\n$env?.String?.add(f64 not endsWith nil)\n$env?.String?.add(f64)\n$env?.String?.add(foobar)\n$env?.String?.add(foobar).i\n$env?.String?.add(foobar, ceil(abs(foobar, 1)))\n$env?.String?.add(ok)\n$env?.String?.add(str)\n$env?.String?.add.f64\n$env?.String?.add.ok\n$env?.String?.add.ok()\n$env?.String?.add?.Bar\n$env?.String?.add?.[array]\n$env?.String?.add?.[f64]\n$env?.String?.add?.[greet]\n$env?.String?.add?.[ok]\n$env?.String?.add?.[str]\n$env?.String?.add?.add\n$env?.String?.add?.array\n$env?.String?.add?.f64\n$env?.String?.add?.greet\n$env?.String?.add?.i(f64)\n$env?.String?.add?.list\n$env?.String?.add?.ok\n$env?.String?.add?.str?.array\n$env?.String?.all(1.0, true)\n$env?.String?.all(foobar)\n$env?.String?.all(nil, nil)\n$env?.String?.all(ok, nil)\n$env?.String?.any(f64)?.[foo]\n$env?.String?.any(foo)\n$env?.String?.any(foobar, foobar, foobar)\n$env?.String?.array\n$env?.String?.array not endsWith str\n$env?.String?.array()\n$env?.String?.array()?.[f64]\n$env?.String?.array(String)\n$env?.String?.array(add)\n$env?.String?.array(array matches nil)\n$env?.String?.array(foo)\n$env?.String?.array(foobar and true)\n$env?.String?.array(foobar)\n$env?.String?.array(i)\n$env?.String?.array(str not in String)\n$env?.String?.array.Bar\n$env?.String?.array.String\n$env?.String?.array.add\n$env?.String?.array.array\n$env?.String?.array.f64\n$env?.String?.array.foo\n$env?.String?.array.list\n$env?.String?.array.ok\n$env?.String?.array?.Bar\n$env?.String?.array?.Bar?.list\n$env?.String?.array?.String\n$env?.String?.array?.[array]\n$env?.String?.array?.[str]\n$env?.String?.array?.array()\n$env?.String?.array?.f64\n$env?.String?.array?.f64.list()\n$env?.String?.array?.i.foo\n$env?.String?.array?.ok\n$env?.String?.bitshl(String)\n$env?.String?.bitshr(nil, f64)\n$env?.String?.bitushr(str, foobar)\n$env?.String?.bitxor(String)\n$env?.String?.date(foobar, foobar)\n$env?.String?.duration(foobar)\n$env?.String?.f64\n$env?.String?.f64 == i\n$env?.String?.f64()\n$env?.String?.f64().f64\n$env?.String?.f64()?.String\n$env?.String?.f64()?.[i]\n$env?.String?.f64()?.[str]\n$env?.String?.f64(1.0 ?? nil)\n$env?.String?.f64(String)\n$env?.String?.f64(foobar)\n$env?.String?.f64(foobar)?.greet\n$env?.String?.f64(foobar, foobar)\n$env?.String?.f64(foobar?.[0])\n$env?.String?.f64(i)\n$env?.String?.f64(list)\n$env?.String?.f64(nil == f64)\n$env?.String?.f64.String?.greet\n$env?.String?.f64.f64\n$env?.String?.f64.greet\n$env?.String?.f64.list\n$env?.String?.f64.list()\n$env?.String?.f64.ok\n$env?.String?.f64.str(foobar, foobar)?.[add]\n$env?.String?.f64?.String\n$env?.String?.f64?.[array]\n$env?.String?.f64?.[greet]\n$env?.String?.f64?.[ok]\n$env?.String?.f64?.add\n$env?.String?.f64?.list?.[str]\n$env?.String?.f64?.ok\n$env?.String?.false?.add()\n$env?.String?.filter(str)\n$env?.String?.findIndex($env)\n$env?.String?.findIndex(f64, foobar)\n$env?.String?.findIndex(foobar)\n$env?.String?.findIndex(nil)\n$env?.String?.findLast(greet, nil)\n$env?.String?.flatten(f64)\n$env?.String?.flatten(foobar, foobar)\n$env?.String?.float($env)\n$env?.String?.foo\n$env?.String?.foo($env)\n$env?.String?.foo()\n$env?.String?.foo()?.[i]\n$env?.String?.foo(add)\n$env?.String?.foo(f64)\n$env?.String?.foo(false ?? add)\n$env?.String?.foo(foo)\n$env?.String?.foo(foobar)\n$env?.String?.foo(foobar?.greet)\n$env?.String?.foo(greet)\n$env?.String?.foo(list, 1)\n$env?.String?.foo(ok)\n$env?.String?.foo.array\n$env?.String?.foo.i\n$env?.String?.foo.ok()\n$env?.String?.foo?.Bar\n$env?.String?.foo?.[f64]\n$env?.String?.foo?.[i]\n$env?.String?.foo?.[ok]\n$env?.String?.foo?.[ok].f64()\n$env?.String?.foo?.[str]\n$env?.String?.foo?.add\n$env?.String?.foo?.f64\n$env?.String?.foo?.greet\n$env?.String?.foo?.i\n$env?.String?.foobar\n$env?.String?.foobar ?? add\n$env?.String?.foobar in array\n$env?.String?.foobar.String(greet)\n$env?.String?.foobar.add\n$env?.String?.foobar.f64\n$env?.String?.foobar.foo\n$env?.String?.foobar.greet\n$env?.String?.foobar.str()\n$env?.String?.foobar?.[add]\n$env?.String?.foobar?.[array]\n$env?.String?.foobar?.[list]\n$env?.String?.foobar?.add()\n$env?.String?.foobar?.foo()\n$env?.String?.foobar?.foo(i)\n$env?.String?.get(nil)\n$env?.String?.greet\n$env?.String?.greet($env)\n$env?.String?.greet()\n$env?.String?.greet().Bar\n$env?.String?.greet().foo\n$env?.String?.greet()?.String\n$env?.String?.greet()?.[i]\n$env?.String?.greet(0)\n$env?.String?.greet(String)\n$env?.String?.greet(foobar == String)\n$env?.String?.greet(foobar and true)\n$env?.String?.greet(foobar or true)\n$env?.String?.greet(foobar)\n$env?.String?.greet(foobar?.String)\n$env?.String?.greet(i)\n$env?.String?.greet(nil)\n$env?.String?.greet(ok)\n$env?.String?.greet(str)\n$env?.String?.greet.add\n$env?.String?.greet.i\n$env?.String?.greet?.[array]\n$env?.String?.greet?.[list]\n$env?.String?.greet?.[ok]\n$env?.String?.greet?.foo\n$env?.String?.greet?.greet()\n$env?.String?.greet?.i\n$env?.String?.greet?.list\n$env?.String?.groupBy(nil)\n$env?.String?.groupBy(str, foobar)\n$env?.String?.i\n$env?.String?.i()\n$env?.String?.i().add\n$env?.String?.i()?.add\n$env?.String?.i()?.i\n$env?.String?.i(0).f64\n$env?.String?.i(1)\n$env?.String?.i(Bar)?.[array]\n$env?.String?.i(String?.$env)\n$env?.String?.i(array)\n$env?.String?.i(f64)\n$env?.String?.i(foobar)\n$env?.String?.i.Bar\n$env?.String?.i.add\n$env?.String?.i.foo\n$env?.String?.i.foobar\n$env?.String?.i.str\n$env?.String?.i?.Bar\n$env?.String?.i?.String\n$env?.String?.i?.[f64]\n$env?.String?.i?.add\n$env?.String?.i?.foo\n$env?.String?.i?.ok\n$env?.String?.int(add, foobar, greet)\n$env?.String?.join(true, f64)\n$env?.String?.keys(0, 0)\n$env?.String?.last(foo)\n$env?.String?.list\n$env?.String?.list()\n$env?.String?.list()?.[i]\n$env?.String?.list(1.0, foobar, greet)\n$env?.String?.list(false)\n$env?.String?.list(foobar not endsWith greet)\n$env?.String?.list(foobar?.f64())\n$env?.String?.list(ok)\n$env?.String?.list.String()\n$env?.String?.list.array()\n$env?.String?.list.str\n$env?.String?.list?.[add]\n$env?.String?.list?.[i]\n$env?.String?.list?.[list]\n$env?.String?.list?.[str]\n$env?.String?.list?.add\n$env?.String?.list?.f64\n$env?.String?.list?.list\n$env?.String?.list?.str\n$env?.String?.lower(0)\n$env?.String?.map($env)\n$env?.String?.map(false)\n$env?.String?.map(foo)\n$env?.String?.map(nil, String)\n$env?.String?.mean(add)\n$env?.String?.nil endsWith str\n$env?.String?.nil?.foo\n$env?.String?.not\n$env?.String?.not .array\n$env?.String?.ok\n$env?.String?.ok()\n$env?.String?.ok()?.Bar\n$env?.String?.ok(array)\n$env?.String?.ok(foo)\n$env?.String?.ok(foobar not endsWith add)\n$env?.String?.ok(foobar)\n$env?.String?.ok(foobar?.[foo])\n$env?.String?.ok(nil)\n$env?.String?.ok.Bar()\n$env?.String?.ok.array\n$env?.String?.ok.f64\n$env?.String?.ok.foo\n$env?.String?.ok.foo()\n$env?.String?.ok.greet\n$env?.String?.ok.list\n$env?.String?.ok?.Bar\n$env?.String?.ok?.[array]\n$env?.String?.ok?.[list]\n$env?.String?.ok?.[ok]\n$env?.String?.ok?.[str]\n$env?.String?.ok?.f64\n$env?.String?.ok?.i\n$env?.String?.ok?.i(foobar)\n$env?.String?.ok?.str\n$env?.String?.reverse(greet)\n$env?.String?.round(foobar, foobar)\n$env?.String?.sortBy(foobar)\n$env?.String?.sortBy(true)\n$env?.String?.str\n$env?.String?.str($env)\n$env?.String?.str()\n$env?.String?.str().String\n$env?.String?.str()?.[f64]\n$env?.String?.str()?.add\n$env?.String?.str()?.ok\n$env?.String?.str(foo?.String)\n$env?.String?.str(foobar)\n$env?.String?.str(i)\n$env?.String?.str.Bar\n$env?.String?.str.add()\n$env?.String?.str.greet(foobar, foobar)\n$env?.String?.str.list\n$env?.String?.str.str\n$env?.String?.str?.Bar\n$env?.String?.str?.String\n$env?.String?.str?.[greet]\n$env?.String?.str?.[str]\n$env?.String?.str?.f64\n$env?.String?.str?.greet\n$env?.String?.str?.greet()\n$env?.String?.str?.i\n$env?.String?.str?.ok\n$env?.String?.sum(1.0)\n$env?.String?.toPairs(Bar)\n$env?.String?.true.array\n$env?.String?.true?.[list]\n$env?.[1.0]?.foobar and false\n$env?.[Bar] != $env.i\n$env?.[Bar] != $env?.list\n$env?.[Bar] != 1.0 && $env\n$env?.[Bar] != 1.0 + 1.0\n$env?.[Bar] != add\n$env?.[Bar] != array\n$env?.[Bar] != f64\n$env?.[Bar] != foo\n$env?.[Bar] != foo.Bar\n$env?.[Bar] != greet\n$env?.[Bar] != i\n$env?.[Bar] != i - 1.0\n$env?.[Bar] != list\n$env?.[Bar] != min(f64)\n$env?.[Bar] != not true\n$env?.[Bar] != ok\n$env?.[Bar] != str\n$env?.[Bar] != str != true\n$env?.[Bar] != string(false)\n$env?.[Bar] < i || true\n$env?.[Bar] == $env.array\n$env?.[Bar] == $env?.[str]\n$env?.[Bar] == add\n$env?.[Bar] == array\n$env?.[Bar] == count(array, ok)\n$env?.[Bar] == f64\n$env?.[Bar] == foo\n$env?.[Bar] == foo?.Bar\n$env?.[Bar] == greet ? 0 : true\n$env?.[Bar] == greet or ok\n$env?.[Bar] == i\n$env?.[Bar] == list\n$env?.[Bar] == ok\n$env?.[Bar] == str\n$env?.[Bar] ?? add\n$env?.[Bar] ?? array\n$env?.[Bar] ?? f64\n$env?.[Bar] ?? foo\n$env?.[Bar] ?? foo?.Bar\n$env?.[Bar] ?? greet ?? str\n$env?.[Bar] ?? i\n$env?.[Bar] ?? list\n$env?.[Bar] ?? ok\n$env?.[Bar] ?? str\n$env?.[Bar] and true and false\n$env?.[Bar] contains $env ?? nil\n$env?.[Bar] contains foo.Bar\n$env?.[Bar] contains last($env)\n$env?.[Bar] contains nil ?? $env\n$env?.[Bar] contains str\n$env?.[Bar] endsWith str\n$env?.[Bar] in $env?.nil?.add\n$env?.[Bar] in array\n$env?.[Bar] in list\n$env?.[Bar] matches $env?.str\n$env?.[Bar] matches str\n$env?.[Bar] not contains $env.str\n$env?.[Bar] not contains $env?.Bar\n$env?.[Bar] not contains $env?.String\n$env?.[Bar] not contains greet(str)\n$env?.[Bar] not contains str\n$env?.[Bar] not endsWith $env || false\n$env?.[Bar] not endsWith greet(str)\n$env?.[Bar] not endsWith str\n$env?.[Bar] not in $env?.[foobar]\n$env?.[Bar] not in array\n$env?.[Bar] not in list\n$env?.[Bar] not matches foo.Bar\n$env?.[Bar] not matches str\n$env?.[Bar] not matches string(1.0)\n$env?.[Bar] not startsWith $env?.[String]\n$env?.[Bar] not startsWith foo.Bar\n$env?.[Bar] not startsWith str\n$env?.[Bar] not startsWith str != nil\n$env?.[Bar] startsWith str\n$env?.[Bar] | get($env)\n$env?.[Bar] | get(1.0)\n$env?.[Bar] | get(list)\n$env?.[Bar]?.$env?.[f64]\n$env?.[Bar]?.$env?.[foo].Bar\n$env?.[Bar]?.$env?.array()\n$env?.[Bar]?.$env?.str\n$env?.[Bar]?.Bar\n$env?.[Bar]?.Bar($env)\n$env?.[Bar]?.Bar()\n$env?.[Bar]?.Bar().ok\n$env?.[Bar]?.Bar()?.[i]\n$env?.[Bar]?.Bar()?.greet()\n$env?.[Bar]?.Bar(0)?.foo\n$env?.[Bar]?.Bar(Bar not contains f64)\n$env?.[Bar]?.Bar(Bar?.ok)\n$env?.[Bar]?.Bar(String?.ok(foobar))\n$env?.[Bar]?.Bar(add)\n$env?.[Bar]?.Bar(foo)\n$env?.[Bar]?.Bar(foo, foobar)\n$env?.[Bar]?.Bar(foobar)\n$env?.[Bar]?.Bar(greet)\n$env?.[Bar]?.Bar(nil)\n$env?.[Bar]?.Bar(ok)\n$env?.[Bar]?.Bar.add\n$env?.[Bar]?.Bar.greet\n$env?.[Bar]?.Bar.str\n$env?.[Bar]?.Bar?.[add]\n$env?.[Bar]?.Bar?.[array]\n$env?.[Bar]?.Bar?.[list]?.array\n$env?.[Bar]?.Bar?.f64\n$env?.[Bar]?.Bar?.foo\n$env?.[Bar]?.Bar?.i\n$env?.[Bar]?.Bar?.list\n$env?.[Bar]?.Bar?.str\n$env?.[Bar]?.String\n$env?.[Bar]?.String()\n$env?.[Bar]?.String().foo\n$env?.[Bar]?.String().ok\n$env?.[Bar]?.String(f64)\n$env?.[Bar]?.String(foobar not contains foobar?.String)\n$env?.[Bar]?.String(foobar)\n$env?.[Bar]?.String(str)\n$env?.[Bar]?.String(str).i\n$env?.[Bar]?.String.foobar\n$env?.[Bar]?.String.greet\n$env?.[Bar]?.String.i\n$env?.[Bar]?.String?.Bar\n$env?.[Bar]?.String?.[f64]\n$env?.[Bar]?.String?.[foo]\n$env?.[Bar]?.String?.[greet]\n$env?.[Bar]?.String?.[str]\n$env?.[Bar]?.String?.add\n$env?.[Bar]?.String?.add(foobar)\n$env?.[Bar]?.String?.array\n$env?.[Bar]?.String?.foo\n$env?.[Bar]?.String?.greet?.String(foobar)?.greet\n$env?.[Bar]?.String?.i()\n$env?.[Bar]?.String?.i(false)\n$env?.[Bar]?.String?.list\n$env?.[Bar]?.String?.ok\n$env?.[Bar]?.String?.str\n$env?.[Bar]?.[$env % 1]?.[f64]\n$env?.[Bar]?.[$env | none(.array)]\n$env?.[Bar]?.[$env?.array]\n$env?.[Bar]?.[add ?? 1]\n$env?.[Bar]?.[add]\n$env?.[Bar]?.[add].Bar\n$env?.[Bar]?.[add].Bar()\n$env?.[Bar]?.[add].Bar()?.[list]\n$env?.[Bar]?.[add].f64\n$env?.[Bar]?.[add].foo\n$env?.[Bar]?.[add].greet\n$env?.[Bar]?.[add].list\n$env?.[Bar]?.[add].ok\n$env?.[Bar]?.[add].str\n$env?.[Bar]?.[add]?.[list]\n$env?.[Bar]?.[add]?.[ok]\n$env?.[Bar]?.[add]?.array\n$env?.[Bar]?.[add]?.i\n$env?.[Bar]?.[add]?.list\n$env?.[Bar]?.[add]?.ok\n$env?.[Bar]?.[array]\n$env?.[Bar]?.[array].Bar\n$env?.[Bar]?.[array].String\n$env?.[Bar]?.[array].String()\n$env?.[Bar]?.[array].add()\n$env?.[Bar]?.[array].f64\n$env?.[Bar]?.[array].f64()\n$env?.[Bar]?.[array].foo\n$env?.[Bar]?.[array].greet\n$env?.[Bar]?.[array].i\n$env?.[Bar]?.[array]?.Bar\n$env?.[Bar]?.[array]?.[array]\n$env?.[Bar]?.[array]?.[i]\n$env?.[Bar]?.[array]?.[ok]\n$env?.[Bar]?.[array]?.f64\n$env?.[Bar]?.[array]?.foo\n$env?.[Bar]?.[count($env)]\n$env?.[Bar]?.[count(list)]\n$env?.[Bar]?.[date(ok, false)]\n$env?.[Bar]?.[f64]\n$env?.[Bar]?.[f64] != i\n$env?.[Bar]?.[f64].Bar\n$env?.[Bar]?.[f64].array\n$env?.[Bar]?.[f64].array()?.list\n$env?.[Bar]?.[f64].f64\n$env?.[Bar]?.[f64].greet\n$env?.[Bar]?.[f64].str\n$env?.[Bar]?.[f64]?.Bar\n$env?.[Bar]?.[f64]?.[add]\n$env?.[Bar]?.[f64]?.[ok]\n$env?.[Bar]?.[f64]?.add(foobar, Bar)\n$env?.[Bar]?.[f64]?.array\n$env?.[Bar]?.[f64]?.f64()\n$env?.[Bar]?.[f64]?.foo()\n$env?.[Bar]?.[f64]?.i?.[f64]\n$env?.[Bar]?.[f64]?.none(foobar)\n$env?.[Bar]?.[f64]?.ok\n$env?.[Bar]?.[f64]?.str\n$env?.[Bar]?.[foo == foo]\n$env?.[Bar]?.[foo]\n$env?.[Bar]?.[foo].String\n$env?.[Bar]?.[foo].foo()\n$env?.[Bar]?.[foo].greet\n$env?.[Bar]?.[foo].i\n$env?.[Bar]?.[foo].ok\n$env?.[Bar]?.[foo]?.Bar(f64)\n$env?.[Bar]?.[foo]?.[f64]\n$env?.[Bar]?.[foo]?.[foo]\n$env?.[Bar]?.[foo]?.[list]\n$env?.[Bar]?.[foo]?.[list].greet\n$env?.[Bar]?.[foo]?.f64\n$env?.[Bar]?.[foo]?.findLast(list, foobar)\n$env?.[Bar]?.[foo]?.ok()\n$env?.[Bar]?.[foo]?.str\n$env?.[Bar]?.[greet]\n$env?.[Bar]?.[greet] == str\n$env?.[Bar]?.[greet].array\n$env?.[Bar]?.[greet].array()\n$env?.[Bar]?.[greet].i\n$env?.[Bar]?.[greet].i()\n$env?.[Bar]?.[greet].list\n$env?.[Bar]?.[greet].ok\n$env?.[Bar]?.[greet].str\n$env?.[Bar]?.[greet]?.String\n$env?.[Bar]?.[greet]?.[f64]\n$env?.[Bar]?.[greet]?.[str]\n$env?.[Bar]?.[greet]?.add()\n$env?.[Bar]?.[greet]?.array()\n$env?.[Bar]?.[greet]?.foo\n$env?.[Bar]?.[greet]?.i\n$env?.[Bar]?.[greet]?.str\n$env?.[Bar]?.[greet]?.str()\n$env?.[Bar]?.[groupBy($env, #)]?.[str]\n$env?.[Bar]?.[i]\n$env?.[Bar]?.[i].Bar\n$env?.[Bar]?.[i].Bar()\n$env?.[Bar]?.[i].array\n$env?.[Bar]?.[i].greet\n$env?.[Bar]?.[i].i()\n$env?.[Bar]?.[i].list\n$env?.[Bar]?.[i].str\n$env?.[Bar]?.[i]?.String\n$env?.[Bar]?.[i]?.[i]\n$env?.[Bar]?.[i]?.[list]\n$env?.[Bar]?.[i]?.[ok]\n$env?.[Bar]?.[i]?.array\n$env?.[Bar]?.[i]?.f64\n$env?.[Bar]?.[i]?.foo\n$env?.[Bar]?.[i]?.i\n$env?.[Bar]?.[i]?.str\n$env?.[Bar]?.[list]\n$env?.[Bar]?.[list] in list\n$env?.[Bar]?.[list].String\n$env?.[Bar]?.[list].add()\n$env?.[Bar]?.[list].array\n$env?.[Bar]?.[list].foo\n$env?.[Bar]?.[list].greet\n$env?.[Bar]?.[list].ok\n$env?.[Bar]?.[list].ok()\n$env?.[Bar]?.[list].str(foobar)\n$env?.[Bar]?.[list]?.String\n$env?.[Bar]?.[list]?.[array]\n$env?.[Bar]?.[list]?.[greet]?.list\n$env?.[Bar]?.[list]?.[i]\n$env?.[Bar]?.[list]?.[list]\n$env?.[Bar]?.[list]?.[ok]\n$env?.[Bar]?.[list]?.add()\n$env?.[Bar]?.[list]?.f64\n$env?.[Bar]?.[list]?.foo\n$env?.[Bar]?.[list]?.i\n$env?.[Bar]?.[list]?.str()\n$env?.[Bar]?.[nil != 0]\n$env?.[Bar]?.[ok]\n$env?.[Bar]?.[ok].f64\n$env?.[Bar]?.[ok].foo()\n$env?.[Bar]?.[ok]?.[greet]\n$env?.[Bar]?.[ok]?.[i]\n$env?.[Bar]?.[ok]?.foo\n$env?.[Bar]?.[ok]?.foo()\n$env?.[Bar]?.[ok]?.i\n$env?.[Bar]?.[ok]?.ok\n$env?.[Bar]?.[ok]?.str\n$env?.[Bar]?.[str]\n$env?.[Bar]?.[str].Bar\n$env?.[Bar]?.[str].String\n$env?.[Bar]?.[str].greet()\n$env?.[Bar]?.[str].i\n$env?.[Bar]?.[str].ok\n$env?.[Bar]?.[str]?.[array]\n$env?.[Bar]?.[str]?.[f64]\n$env?.[Bar]?.[str]?.[foo]?.ok\n$env?.[Bar]?.[str]?.i()\n$env?.[Bar]?.[str]?.ok()\n$env?.[Bar]?.[sum($env, str)]\n$env?.[Bar]?.abs(nil, ok)?.[ok]\n$env?.[Bar]?.add\n$env?.[Bar]?.add()\n$env?.[Bar]?.add() == add\n$env?.[Bar]?.add().str\n$env?.[Bar]?.add()?.[f64]\n$env?.[Bar]?.add(1)\n$env?.[Bar]?.add(Bar)\n$env?.[Bar]?.add(String, foo, 1.0 | int(String, 1.0))\n$env?.[Bar]?.add(add)\n$env?.[Bar]?.add(array)\n$env?.[Bar]?.add(foo)\n$env?.[Bar]?.add(foobar)\n$env?.[Bar]?.add(foobar?.[add])\n$env?.[Bar]?.add(list)\n$env?.[Bar]?.add(str == foobar?.greet(foobar))\n$env?.[Bar]?.add.Bar\n$env?.[Bar]?.add.String()\n$env?.[Bar]?.add.add\n$env?.[Bar]?.add.get(foobar?.str())\n$env?.[Bar]?.add.greet\n$env?.[Bar]?.add.i\n$env?.[Bar]?.add.not\n$env?.[Bar]?.add.ok\n$env?.[Bar]?.add.str\n$env?.[Bar]?.add?.Bar()\n$env?.[Bar]?.add?.[add]\n$env?.[Bar]?.add?.[foo]\n$env?.[Bar]?.add?.[ok]\n$env?.[Bar]?.add?.array\n$env?.[Bar]?.add?.join(foobar, str)\n$env?.[Bar]?.all($env)\n$env?.[Bar]?.any(foo)\n$env?.[Bar]?.any(foobar, foobar)\n$env?.[Bar]?.array\n$env?.[Bar]?.array()\n$env?.[Bar]?.array().ok\n$env?.[Bar]?.array()?.list\n$env?.[Bar]?.array(1 != foo)\n$env?.[Bar]?.array(Bar, array)\n$env?.[Bar]?.array(add) == greet\n$env?.[Bar]?.array(add, foobar)\n$env?.[Bar]?.array(f64)\n$env?.[Bar]?.array(foo)\n$env?.[Bar]?.array(foobar endsWith 1.0)\n$env?.[Bar]?.array(foobar)\n$env?.[Bar]?.array(foobar, f64, i)\n$env?.[Bar]?.array(foobar?.ok)\n$env?.[Bar]?.array(greet)\n$env?.[Bar]?.array(sort(foobar))\n$env?.[Bar]?.array.Bar\n$env?.[Bar]?.array.String()\n$env?.[Bar]?.array.add\n$env?.[Bar]?.array.f64\n$env?.[Bar]?.array.list()\n$env?.[Bar]?.array?.[add]\n$env?.[Bar]?.array?.[add]?.foo\n$env?.[Bar]?.array?.[array]\n$env?.[Bar]?.array?.[greet]\n$env?.[Bar]?.array?.[list]\n$env?.[Bar]?.array?.list\n$env?.[Bar]?.bitxor(ok)\n$env?.[Bar]?.concat(i, 0)\n$env?.[Bar]?.f64\n$env?.[Bar]?.f64()\n$env?.[Bar]?.f64().array\n$env?.[Bar]?.f64()?.f64?.[greet]\n$env?.[Bar]?.f64()?.ok\n$env?.[Bar]?.f64(1.0 != foo)\n$env?.[Bar]?.f64(Bar?.ok?.greet)\n$env?.[Bar]?.f64(add)\n$env?.[Bar]?.f64(foo)\n$env?.[Bar]?.f64(foobar in foobar)?.[add]\n$env?.[Bar]?.f64(foobar, ok)\n$env?.[Bar]?.f64(greet)\n$env?.[Bar]?.f64.String\n$env?.[Bar]?.f64.foo\n$env?.[Bar]?.f64.foo()\n$env?.[Bar]?.f64.greet\n$env?.[Bar]?.f64.i\n$env?.[Bar]?.f64.i()\n$env?.[Bar]?.f64.list\n$env?.[Bar]?.f64?.[add]\n$env?.[Bar]?.f64?.[greet]\n$env?.[Bar]?.f64?.[str]\n$env?.[Bar]?.f64?.f64\n$env?.[Bar]?.f64?.i\n$env?.[Bar]?.f64?.list()\n$env?.[Bar]?.false.foo\n$env?.[Bar]?.find($env, foo)\n$env?.[Bar]?.find(Bar)\n$env?.[Bar]?.findIndex(true)\n$env?.[Bar]?.findLast(1)\n$env?.[Bar]?.findLast(1, i)\n$env?.[Bar]?.findLastIndex(nil)\n$env?.[Bar]?.foo\n$env?.[Bar]?.foo($env)\n$env?.[Bar]?.foo()\n$env?.[Bar]?.foo().list\n$env?.[Bar]?.foo()?.[i]\n$env?.[Bar]?.foo(foobar)\n$env?.[Bar]?.foo(foobar)?.foo\n$env?.[Bar]?.foo(foobar, foobar)\n$env?.[Bar]?.foo(foobar?.true startsWith foobar contains foobar)\n$env?.[Bar]?.foo(let bar = array; let z = ok; let z = 1.0; bar)?.[f64]\n$env?.[Bar]?.foo.add\n$env?.[Bar]?.foo.array\n$env?.[Bar]?.foo.greet\n$env?.[Bar]?.foo.greet?.greet(foobar)\n$env?.[Bar]?.foo.i\n$env?.[Bar]?.foo.ok\n$env?.[Bar]?.foo.ok()\n$env?.[Bar]?.foo.str\n$env?.[Bar]?.foo?.Bar\n$env?.[Bar]?.foo?.String\n$env?.[Bar]?.foo?.[add]\n$env?.[Bar]?.foo?.[array]\n$env?.[Bar]?.foo?.[greet].list()\n$env?.[Bar]?.foo?.[i]\n$env?.[Bar]?.foo?.[list]\n$env?.[Bar]?.foo?.array\n$env?.[Bar]?.foo?.f64\n$env?.[Bar]?.foo?.foo()\n$env?.[Bar]?.foo?.greet\n$env?.[Bar]?.foo?.list\n$env?.[Bar]?.foo?.ok\n$env?.[Bar]?.foobar\n$env?.[Bar]?.foobar == add\n$env?.[Bar]?.foobar endsWith $env\n$env?.[Bar]?.foobar not endsWith str\n$env?.[Bar]?.foobar || false\n$env?.[Bar]?.foobar.String\n$env?.[Bar]?.foobar.String?.Bar\n$env?.[Bar]?.foobar.array\n$env?.[Bar]?.foobar.foo\n$env?.[Bar]?.foobar.list(nil)\n$env?.[Bar]?.foobar.str\n$env?.[Bar]?.foobar?.String\n$env?.[Bar]?.foobar?.[f64]\n$env?.[Bar]?.foobar?.[foo]\n$env?.[Bar]?.foobar?.[i]\n$env?.[Bar]?.foobar?.[ok]\n$env?.[Bar]?.foobar?.ok\n$env?.[Bar]?.fromPairs(foobar, foo)\n$env?.[Bar]?.greet\n$env?.[Bar]?.greet == ok\n$env?.[Bar]?.greet($env endsWith foobar)\n$env?.[Bar]?.greet()\n$env?.[Bar]?.greet().add\n$env?.[Bar]?.greet()?.[foo]\n$env?.[Bar]?.greet()?.[i]\n$env?.[Bar]?.greet()?.f64\n$env?.[Bar]?.greet(0)\n$env?.[Bar]?.greet(array)\n$env?.[Bar]?.greet(f64, foobar)\n$env?.[Bar]?.greet(foo endsWith foobar?.[String]).Bar\n$env?.[Bar]?.greet(foo)\n$env?.[Bar]?.greet(foobar)\n$env?.[Bar]?.greet(foobar)?.String\n$env?.[Bar]?.greet(foobar, str)\n$env?.[Bar]?.greet(greet)\n$env?.[Bar]?.greet(list)\n$env?.[Bar]?.greet(str)\n$env?.[Bar]?.greet.Bar()\n$env?.[Bar]?.greet.add\n$env?.[Bar]?.greet.array()\n$env?.[Bar]?.greet.f64\n$env?.[Bar]?.greet.f64(foobar)\n$env?.[Bar]?.greet?.[add]\n$env?.[Bar]?.greet?.[f64]\n$env?.[Bar]?.greet?.[i]\n$env?.[Bar]?.greet?.[list]\n$env?.[Bar]?.greet?.array\n$env?.[Bar]?.greet?.f64\n$env?.[Bar]?.greet?.i\n$env?.[Bar]?.greet?.ok\n$env?.[Bar]?.groupBy(0, $env, foobar)\n$env?.[Bar]?.i\n$env?.[Bar]?.i($env not matches foobar, Bar)?.foo\n$env?.[Bar]?.i($env)\n$env?.[Bar]?.i()\n$env?.[Bar]?.i()?.str\n$env?.[Bar]?.i(0 < i)\n$env?.[Bar]?.i(foobar)\n$env?.[Bar]?.i(foobar, str | reduce($env, f64))\n$env?.[Bar]?.i(greet, foobar)\n$env?.[Bar]?.i(list, foobar)\n$env?.[Bar]?.i.add\n$env?.[Bar]?.i.array()\n$env?.[Bar]?.i.ok\n$env?.[Bar]?.i.str\n$env?.[Bar]?.i?.Bar\n$env?.[Bar]?.i?.[add]\n$env?.[Bar]?.i?.[foo]\n$env?.[Bar]?.i?.[greet]\n$env?.[Bar]?.i?.add\n$env?.[Bar]?.i?.array\n$env?.[Bar]?.i?.foo()\n$env?.[Bar]?.i?.greet\n$env?.[Bar]?.i?.i\n$env?.[Bar]?.i?.i()\n$env?.[Bar]?.i?.ok()\n$env?.[Bar]?.i?.str\n$env?.[Bar]?.indexOf(nil, 1.0)\n$env?.[Bar]?.keys(Bar, false)\n$env?.[Bar]?.len(foo)\n$env?.[Bar]?.list\n$env?.[Bar]?.list()\n$env?.[Bar]?.list()?.[array]\n$env?.[Bar]?.list()?.[ok]\n$env?.[Bar]?.list()?.ok\n$env?.[Bar]?.list()?.str\n$env?.[Bar]?.list(array)\n$env?.[Bar]?.list(foo.String)\n$env?.[Bar]?.list(foobar ?? list)\n$env?.[Bar]?.list(foobar)\n$env?.[Bar]?.list(foobar).f64\n$env?.[Bar]?.list(foobar)?.[str]\n$env?.[Bar]?.list(foobar?.list)\n$env?.[Bar]?.list.Bar\n$env?.[Bar]?.list.String\n$env?.[Bar]?.list.add\n$env?.[Bar]?.list.f64\n$env?.[Bar]?.list.foobar\n$env?.[Bar]?.list.str\n$env?.[Bar]?.list?.Bar(foo, f64)\n$env?.[Bar]?.list?.[foo]\n$env?.[Bar]?.list?.[greet]\n$env?.[Bar]?.list?.[list]\n$env?.[Bar]?.list?.foo\n$env?.[Bar]?.list?.i\n$env?.[Bar]?.list?.str\n$env?.[Bar]?.list?.str()\n$env?.[Bar]?.lower(nil)\n$env?.[Bar]?.map(nil)\n$env?.[Bar]?.nil.str(Bar)\n$env?.[Bar]?.nil?.[ok]\n$env?.[Bar]?.nil?.i?.f64\n$env?.[Bar]?.none(list)\n$env?.[Bar]?.none(ok)\n$env?.[Bar]?.not .str\n$env?.[Bar]?.not.ok\n$env?.[Bar]?.now(f64, foo)\n$env?.[Bar]?.now(foobar, foobar, $env)\n$env?.[Bar]?.ok\n$env?.[Bar]?.ok()\n$env?.[Bar]?.ok().list\n$env?.[Bar]?.ok()?.add\n$env?.[Bar]?.ok(Bar)\n$env?.[Bar]?.ok(add)\n$env?.[Bar]?.ok(array)\n$env?.[Bar]?.ok(f64)\n$env?.[Bar]?.ok(foobar?.[f64])\n$env?.[Bar]?.ok(greet)\n$env?.[Bar]?.ok.String\n$env?.[Bar]?.ok.add\n$env?.[Bar]?.ok.f64\n$env?.[Bar]?.ok.foo\n$env?.[Bar]?.ok.list\n$env?.[Bar]?.ok.ok\n$env?.[Bar]?.ok?.[array]\n$env?.[Bar]?.ok?.[greet]\n$env?.[Bar]?.ok?.foo\n$env?.[Bar]?.ok?.list\n$env?.[Bar]?.one(foobar, foobar)?.[str]\n$env?.[Bar]?.reduce(1.0)\n$env?.[Bar]?.str\n$env?.[Bar]?.str($env == foobar)\n$env?.[Bar]?.str($env)\n$env?.[Bar]?.str()\n$env?.[Bar]?.str().add.i\n$env?.[Bar]?.str()?.[list]\n$env?.[Bar]?.str(0)\n$env?.[Bar]?.str(Bar)\n$env?.[Bar]?.str(f64)\n$env?.[Bar]?.str(f64, array)\n$env?.[Bar]?.str(foobar)\n$env?.[Bar]?.str(greet)\n$env?.[Bar]?.str(list | first(true, foobar))\n$env?.[Bar]?.str(list)\n$env?.[Bar]?.str(nil)\n$env?.[Bar]?.str.Bar\n$env?.[Bar]?.str.String\n$env?.[Bar]?.str.array\n$env?.[Bar]?.str.foo\n$env?.[Bar]?.str.greet\n$env?.[Bar]?.str.ok\n$env?.[Bar]?.str?.Bar\n$env?.[Bar]?.str?.[add]\n$env?.[Bar]?.str?.[array]\n$env?.[Bar]?.str?.[foo]\n$env?.[Bar]?.str?.[list]\n$env?.[Bar]?.str?.[str]\n$env?.[Bar]?.str?.f64\n$env?.[Bar]?.str?.i(greet)\n$env?.[Bar]?.str?.list\n$env?.[Bar]?.sum(foobar)\n$env?.[Bar]?.sum(list).ok\n$env?.[Bar]?.sum(ok)\n$env?.[Bar]?.toBase64(1.0)\n$env?.[Bar]?.true not contains $env\n$env?.[Bar]?.true?.[ok]\n$env?.[Bar]?.uniq(array, $env)\n$env?.[Bar]?.uniq(foobar, foo)\n$env?.[Bar]?.values(foobar, foobar)\n$env?.[String] != $env.ok\n$env?.[String] != 1 ? f64 : f64\n$env?.[String] != add\n$env?.[String] != array\n$env?.[String] != f64\n$env?.[String] != foo\n$env?.[String] != foo ? foo : 0\n$env?.[String] != i\n$env?.[String] != len(list)\n$env?.[String] != list\n$env?.[String] != nil ? add : foo\n$env?.[String] != ok\n$env?.[String] != str\n$env?.[String] == $env.i\n$env?.[String] == 0 != $env\n$env?.[String] == 1.0 / 1\n$env?.[String] == add\n$env?.[String] == array\n$env?.[String] == f64\n$env?.[String] == foo\n$env?.[String] == foo == $env\n$env?.[String] == foo?.Bar\n$env?.[String] == greet\n$env?.[String] == i\n$env?.[String] == i && $env\n$env?.[String] == list\n$env?.[String] == str\n$env?.[String] ?? -0\n$env?.[String] ?? add\n$env?.[String] ?? array\n$env?.[String] ?? f64\n$env?.[String] ?? foo\n$env?.[String] ?? i\n$env?.[String] ?? list\n$env?.[String] ?? str\n$env?.[String] contains $env?.[String]\n$env?.[String] contains $env?.[str]\n$env?.[String] contains 1.0 ?? greet\n$env?.[String] contains add ?? list\n$env?.[String] contains str\n$env?.[String] endsWith $env?.String\n$env?.[String] endsWith $env?.[str]\n$env?.[String] endsWith str\n$env?.[String] in [1]\n$env?.[String] in array\n$env?.[String] in list\n$env?.[String] matches str\n$env?.[String] not contains $env?.Bar\n$env?.[String] not contains false ?? greet\n$env?.[String] not contains str\n$env?.[String] not endsWith 1 ?? greet\n$env?.[String] not endsWith str\n$env?.[String] not in $env?.array\n$env?.[String] not in 0 .. 0\n$env?.[String] not in array\n$env?.[String] not in list\n$env?.[String] not matches str\n$env?.[String] not startsWith str\n$env?.[String] startsWith $env?.[Bar]\n$env?.[String] startsWith foo ?? add\n$env?.[String] startsWith min($env)\n$env?.[String] startsWith str\n$env?.[String] | get(i)\n$env?.[String]?.$env.list\n$env?.[String]?.$env?.[foo]\n$env?.[String]?.$env?.[ok]\n$env?.[String]?.$env?.array\n$env?.[String]?.Bar\n$env?.[String]?.Bar()\n$env?.[String]?.Bar().foo\n$env?.[String]?.Bar()?.str\n$env?.[String]?.Bar(1.0).String\n$env?.[String]?.Bar(array)\n$env?.[String]?.Bar(f64)\n$env?.[String]?.Bar(foo contains String)?.[foo]\n$env?.[String]?.Bar(foobar)\n$env?.[String]?.Bar(greet)\n$env?.[String]?.Bar.String\n$env?.[String]?.Bar.greet\n$env?.[String]?.Bar.i(ok)\n$env?.[String]?.Bar.ok()\n$env?.[String]?.Bar.ok?.[ok]\n$env?.[String]?.Bar.str\n$env?.[String]?.Bar?.Bar()\n$env?.[String]?.Bar?.[add]\n$env?.[String]?.Bar?.[foo]\n$env?.[String]?.Bar?.[greet]\n$env?.[String]?.Bar?.[str]\n$env?.[String]?.Bar?.add\n$env?.[String]?.Bar?.i\n$env?.[String]?.Bar?.list()\n$env?.[String]?.Bar?.str.f64\n$env?.[String]?.String\n$env?.[String]?.String($env)\n$env?.[String]?.String()\n$env?.[String]?.String().list\n$env?.[String]?.String().list(String)\n$env?.[String]?.String()?.add\n$env?.[String]?.String(String)\n$env?.[String]?.String(add)\n$env?.[String]?.String(foo)\n$env?.[String]?.String(foobar)\n$env?.[String]?.String(foobar, $env)\n$env?.[String]?.String(foobar?.[list])?.str()\n$env?.[String]?.String(greet)\n$env?.[String]?.String(last($env, String))\n$env?.[String]?.String(ok && foobar)\n$env?.[String]?.String.add\n$env?.[String]?.String.split(false, add).str.array\n$env?.[String]?.String?.Bar\n$env?.[String]?.String?.Bar?.greet\n$env?.[String]?.String?.String\n$env?.[String]?.String?.[$env]\n$env?.[String]?.String?.[foo]\n$env?.[String]?.String?.[greet]\n$env?.[String]?.String?.[i]\n$env?.[String]?.String?.[list]\n$env?.[String]?.String?.[ok]\n$env?.[String]?.String?.array\n$env?.[String]?.String?.f64(false)\n$env?.[String]?.String?.foo\n$env?.[String]?.String?.foo(foobar)\n$env?.[String]?.String?.foo?.foo\n$env?.[String]?.String?.greet.greet\n$env?.[String]?.String?.list\n$env?.[String]?.String?.str?.ok\n$env?.[String]?.[$env == true]\n$env?.[String]?.[$env | none($env)]\n$env?.[String]?.[$env.foo]\n$env?.[String]?.[$env?.[greet]]\n$env?.[String]?.[$env?.array]\n$env?.[String]?.[add]\n$env?.[String]?.[add].String\n$env?.[String]?.[add].foo\n$env?.[String]?.[add].greet\n$env?.[String]?.[add].str\n$env?.[String]?.[add]?.String\n$env?.[String]?.[add]?.[add]\n$env?.[String]?.[add]?.[list]\n$env?.[String]?.[add]?.[ok]\n$env?.[String]?.[add]?.add\n$env?.[String]?.[add]?.add(foo)\n$env?.[String]?.[add]?.greet\n$env?.[String]?.[add]?.list?.Bar\n$env?.[String]?.[array | reduce(#)]\n$env?.[String]?.[array]\n$env?.[String]?.[array] == list\n$env?.[String]?.[array].Bar\n$env?.[String]?.[array].String\n$env?.[String]?.[array].String()\n$env?.[String]?.[array].array\n$env?.[String]?.[array].foo\n$env?.[String]?.[array].i\n$env?.[String]?.[array].ok\n$env?.[String]?.[array]?.Bar()\n$env?.[String]?.[array]?.[add]\n$env?.[String]?.[array]?.[foo]\n$env?.[String]?.[array]?.[list]\n$env?.[String]?.[array]?.[ok]\n$env?.[String]?.[array]?.[str]\n$env?.[String]?.[array]?.add\n$env?.[String]?.[array]?.array()\n$env?.[String]?.[array]?.f64\n$env?.[String]?.[array]?.list?.[add]\n$env?.[String]?.[array]?.ok\n$env?.[String]?.[array]?.str\n$env?.[String]?.[f64]\n$env?.[String]?.[f64].add\n$env?.[String]?.[f64].foo\n$env?.[String]?.[f64].list\n$env?.[String]?.[f64].list()\n$env?.[String]?.[f64].ok\n$env?.[String]?.[f64].str\n$env?.[String]?.[f64]?.Bar\n$env?.[String]?.[f64]?.Bar()\n$env?.[String]?.[f64]?.[f64]\n$env?.[String]?.[f64]?.[foo]\n$env?.[String]?.[f64]?.[greet]\n$env?.[String]?.[f64]?.[i]\n$env?.[String]?.[f64]?.[str]\n$env?.[String]?.[f64]?.array()\n$env?.[String]?.[f64]?.greet\n$env?.[String]?.[f64]?.greet().foo\n$env?.[String]?.[f64]?.ok\n$env?.[String]?.[foo != nil]\n$env?.[String]?.[foo]\n$env?.[String]?.[foo].String\n$env?.[String]?.[foo].f64\n$env?.[String]?.[foo].foo\n$env?.[String]?.[foo].i\n$env?.[String]?.[foo].str.add?.[i]\n$env?.[String]?.[foo]?.String\n$env?.[String]?.[foo]?.[foo]\n$env?.[String]?.[foo]?.[ok]\n$env?.[String]?.[foo]?.[ok]?.[f64]\n$env?.[String]?.[foo]?.[str]\n$env?.[String]?.[foo]?.add\n$env?.[String]?.[foo]?.f64()\n$env?.[String]?.[foo]?.foo\n$env?.[String]?.[greet]\n$env?.[String]?.[greet].String\n$env?.[String]?.[greet].array\n$env?.[String]?.[greet].str\n$env?.[String]?.[greet]?.Bar\n$env?.[String]?.[greet]?.[greet]\n$env?.[String]?.[greet]?.[ok]\n$env?.[String]?.[greet]?.foo\n$env?.[String]?.[greet]?.i\n$env?.[String]?.[greet]?.list(foobar)\n$env?.[String]?.[greet]?.ok\n$env?.[String]?.[greet]?.str\n$env?.[String]?.[i | mean(1.0)]\n$env?.[String]?.[i]\n$env?.[String]?.[i].Bar\n$env?.[String]?.[i].add({foo: str})\n$env?.[String]?.[i].f64\n$env?.[String]?.[i].foo\n$env?.[String]?.[i].i\n$env?.[String]?.[i].list\n$env?.[String]?.[i].ok\n$env?.[String]?.[i]?.[add]\n$env?.[String]?.[i]?.[array]\n$env?.[String]?.[i]?.[foo]\n$env?.[String]?.[i]?.[greet]\n$env?.[String]?.[i]?.array\n$env?.[String]?.[i]?.greet\n$env?.[String]?.[i]?.ok\n$env?.[String]?.[list]\n$env?.[String]?.[list].array\n$env?.[String]?.[list].array()\n$env?.[String]?.[list].foobar\n$env?.[String]?.[list].greet\n$env?.[String]?.[list].i\n$env?.[String]?.[list].ok\n$env?.[String]?.[list].str\n$env?.[String]?.[list]?.String\n$env?.[String]?.[list]?.String()\n$env?.[String]?.[list]?.[add]\n$env?.[String]?.[list]?.[i]\n$env?.[String]?.[list]?.array()\n$env?.[String]?.[list]?.f64\n$env?.[String]?.[list]?.greet\n$env?.[String]?.[list]?.ok\n$env?.[String]?.[nil ?? array]\n$env?.[String]?.[ok and ok]\n$env?.[String]?.[ok not in $env]\n$env?.[String]?.[ok]\n$env?.[String]?.[ok].add\n$env?.[String]?.[ok].add?.array\n$env?.[String]?.[ok].f64\n$env?.[String]?.[ok].ok\n$env?.[String]?.[ok]?.Bar\n$env?.[String]?.[ok]?.[f64]\n$env?.[String]?.[ok]?.[list]\n$env?.[String]?.[ok]?.greet\n$env?.[String]?.[ok]?.i\n$env?.[String]?.[str matches str]\n$env?.[String]?.[str not endsWith $env]\n$env?.[String]?.[str]\n$env?.[String]?.[str] != f64\n$env?.[String]?.[str].array\n$env?.[String]?.[str].f64\n$env?.[String]?.[str].i.add\n$env?.[String]?.[str]?.Bar\n$env?.[String]?.[str]?.String\n$env?.[String]?.[str]?.[f64]\n$env?.[String]?.[str]?.[i]\n$env?.[String]?.[str]?.[ok]\n$env?.[String]?.[str]?.add\n$env?.[String]?.[str]?.array\n$env?.[String]?.[str]?.foo\n$env?.[String]?.add\n$env?.[String]?.add($env)\n$env?.[String]?.add()\n$env?.[String]?.add()?.[foo]\n$env?.[String]?.add()?.f64()\n$env?.[String]?.add()?.greet\n$env?.[String]?.add(1)\n$env?.[String]?.add(1.0, foobar)\n$env?.[String]?.add(foobar)\n$env?.[String]?.add(i == true)\n$env?.[String]?.add(str)\n$env?.[String]?.add.Bar\n$env?.[String]?.add.String\n$env?.[String]?.add.array()\n$env?.[String]?.add.greet\n$env?.[String]?.add.i\n$env?.[String]?.add.list()\n$env?.[String]?.add?.Bar\n$env?.[String]?.add?.String\n$env?.[String]?.add?.[add]\n$env?.[String]?.add?.[foo]\n$env?.[String]?.add?.[greet]\n$env?.[String]?.add?.[list]\n$env?.[String]?.add?.array\n$env?.[String]?.add?.f64\n$env?.[String]?.add?.foo\n$env?.[String]?.add?.greet\n$env?.[String]?.add?.greet()\n$env?.[String]?.add?.ok()\n$env?.[String]?.all(ok)\n$env?.[String]?.any(foobar, ok)\n$env?.[String]?.array\n$env?.[String]?.array()\n$env?.[String]?.array().array\n$env?.[String]?.array()?.[foo]\n$env?.[String]?.array()?.f64(list)\n$env?.[String]?.array(Bar?.foo())\n$env?.[String]?.array(String)\n$env?.[String]?.array(add)\n$env?.[String]?.array(f64)\n$env?.[String]?.array(foo)\n$env?.[String]?.array(foobar not startsWith foo)\n$env?.[String]?.array(foobar)\n$env?.[String]?.array(foobar?.[String].add)\n$env?.[String]?.array(i)\n$env?.[String]?.array(str)\n$env?.[String]?.array(toJSON(foobar))\n$env?.[String]?.array.String\n$env?.[String]?.array.array(String, foo)\n$env?.[String]?.array.f64\n$env?.[String]?.array.i\n$env?.[String]?.array.i()\n$env?.[String]?.array.list(foobar)\n$env?.[String]?.array.list.array\n$env?.[String]?.array.ok\n$env?.[String]?.array?.Bar\n$env?.[String]?.array?.Bar(list)\n$env?.[String]?.array?.[greet]\n$env?.[String]?.array?.f64\n$env?.[String]?.array?.foo\n$env?.[String]?.array?.greet\n$env?.[String]?.array?.i\n$env?.[String]?.array?.list(i)\n$env?.[String]?.bitor(foobar, 0)\n$env?.[String]?.bitshl(foobar)\n$env?.[String]?.bitshr(nil)\n$env?.[String]?.bitushr(foobar)\n$env?.[String]?.ceil(nil)\n$env?.[String]?.concat(1.0)\n$env?.[String]?.duration(foobar)\n$env?.[String]?.f64\n$env?.[String]?.f64()\n$env?.[String]?.f64().Bar\n$env?.[String]?.f64().Bar()\n$env?.[String]?.f64()?.f64\n$env?.[String]?.f64(String?.[array])\n$env?.[String]?.f64(foo.Bar)\n$env?.[String]?.f64(foobar)\n$env?.[String]?.f64(min(foobar))\n$env?.[String]?.f64.Bar\n$env?.[String]?.f64.Bar()\n$env?.[String]?.f64.add()\n$env?.[String]?.f64.greet.str\n$env?.[String]?.f64.i\n$env?.[String]?.f64.ok\n$env?.[String]?.f64?.String\n$env?.[String]?.f64?.[add]\n$env?.[String]?.f64?.[ok]?.str\n$env?.[String]?.f64?.foo()\n$env?.[String]?.f64?.greet()\n$env?.[String]?.f64?.i\n$env?.[String]?.f64?.ok()\n$env?.[String]?.f64?.str\n$env?.[String]?.false?.str\n$env?.[String]?.filter(1)\n$env?.[String]?.find(foobar)\n$env?.[String]?.findLastIndex(add, f64)\n$env?.[String]?.foo\n$env?.[String]?.foo()\n$env?.[String]?.foo().foo\n$env?.[String]?.foo().list\n$env?.[String]?.foo()?.foo\n$env?.[String]?.foo()?.str\n$env?.[String]?.foo(f64, foobar)\n$env?.[String]?.foo(foobar)\n$env?.[String]?.foo(true)\n$env?.[String]?.foo.String\n$env?.[String]?.foo.add\n$env?.[String]?.foo.add()\n$env?.[String]?.foo.add?.greet\n$env?.[String]?.foo.array()\n$env?.[String]?.foo.f64\n$env?.[String]?.foo.foo\n$env?.[String]?.foo.greet\n$env?.[String]?.foo.i\n$env?.[String]?.foo.ok\n$env?.[String]?.foo.str\n$env?.[String]?.foo?.Bar\n$env?.[String]?.foo?.String\n$env?.[String]?.foo?.[add]\n$env?.[String]?.foo?.[array]\n$env?.[String]?.foo?.[f64]\n$env?.[String]?.foo?.[foo]\n$env?.[String]?.foo?.add\n$env?.[String]?.foo?.array\n$env?.[String]?.foo?.greet\n$env?.[String]?.foo?.i\n$env?.[String]?.foo?.list\n$env?.[String]?.foo?.str\n$env?.[String]?.foo?.str()\n$env?.[String]?.foobar\n$env?.[String]?.foobar.Bar\n$env?.[String]?.foobar.array\n$env?.[String]?.foobar.f64\n$env?.[String]?.foobar.foo\n$env?.[String]?.foobar.i\n$env?.[String]?.foobar.list(foobar, add)\n$env?.[String]?.foobar.str\n$env?.[String]?.foobar.str()\n$env?.[String]?.foobar?.Bar\n$env?.[String]?.foobar?.[foo]\n$env?.[String]?.foobar?.[i]\n$env?.[String]?.foobar?.[list]\n$env?.[String]?.foobar?.[ok]\n$env?.[String]?.foobar?.array\n$env?.[String]?.foobar?.foo\n$env?.[String]?.foobar?.i\n$env?.[String]?.foobar?.i()\n$env?.[String]?.foobar?.ok()\n$env?.[String]?.fromJSON(foobar)\n$env?.[String]?.fromPairs(false)\n$env?.[String]?.get(String)\n$env?.[String]?.get(str)\n$env?.[String]?.greet\n$env?.[String]?.greet != str\n$env?.[String]?.greet()\n$env?.[String]?.greet().Bar\n$env?.[String]?.greet()?.[list]\n$env?.[String]?.greet()?.[str]\n$env?.[String]?.greet(add)\n$env?.[String]?.greet(foobar != str)\n$env?.[String]?.greet(foobar)\n$env?.[String]?.greet(greet)\n$env?.[String]?.greet.Bar\n$env?.[String]?.greet.add\n$env?.[String]?.greet.array()\n$env?.[String]?.greet.f64\n$env?.[String]?.greet.foo\n$env?.[String]?.greet.foobar\n$env?.[String]?.greet.i\n$env?.[String]?.greet.i()\n$env?.[String]?.greet.list\n$env?.[String]?.greet.ok\n$env?.[String]?.greet.ok()\n$env?.[String]?.greet?.Bar\n$env?.[String]?.greet?.[array]\n$env?.[String]?.greet?.[list]\n$env?.[String]?.greet?.[str]\n$env?.[String]?.greet?.array\n$env?.[String]?.greet?.f64\n$env?.[String]?.greet?.foo\n$env?.[String]?.greet?.greet()\n$env?.[String]?.greet?.list.str\n$env?.[String]?.groupBy(1.0)\n$env?.[String]?.groupBy(f64, foobar, array)?.[ok]\n$env?.[String]?.groupBy(foobar)\n$env?.[String]?.groupBy(str)\n$env?.[String]?.hasPrefix(nil)?.String\n$env?.[String]?.i\n$env?.[String]?.i in array\n$env?.[String]?.i()\n$env?.[String]?.i().ok\n$env?.[String]?.i()?.[add]\n$env?.[String]?.i()?.[array]\n$env?.[String]?.i()?.[greet]\n$env?.[String]?.i()?.f64\n$env?.[String]?.i(add)\n$env?.[String]?.i(array)\n$env?.[String]?.i(foo)\n$env?.[String]?.i(foobar ?? array)\n$env?.[String]?.i(foobar)\n$env?.[String]?.i(i)\n$env?.[String]?.i(ok)\n$env?.[String]?.i(str)\n$env?.[String]?.i(true)\n$env?.[String]?.i.Bar\n$env?.[String]?.i.String\n$env?.[String]?.i.f64(f64)\n$env?.[String]?.i.greet\n$env?.[String]?.i.list\n$env?.[String]?.i?.[array]\n$env?.[String]?.i?.[greet]\n$env?.[String]?.i?.[list]\n$env?.[String]?.i?.[ok]\n$env?.[String]?.i?.[str]\n$env?.[String]?.i?.add\n$env?.[String]?.i?.array\n$env?.[String]?.i?.f64?.String\n$env?.[String]?.i?.foo\n$env?.[String]?.i?.foo()\n$env?.[String]?.i?.greet\n$env?.[String]?.i?.list\n$env?.[String]?.i?.ok.f64\n$env?.[String]?.int(foo)\n$env?.[String]?.lastIndexOf(true, foobar, foo)\n$env?.[String]?.len(false)\n$env?.[String]?.list\n$env?.[String]?.list($env)\n$env?.[String]?.list()\n$env?.[String]?.list().i\n$env?.[String]?.list(0)\n$env?.[String]?.list(1.0)\n$env?.[String]?.list(Bar)\n$env?.[String]?.list(foo).f64\n$env?.[String]?.list(foobar)\n$env?.[String]?.list(foobar).greet\n$env?.[String]?.list(greet)\n$env?.[String]?.list(nil in foobar or foobar)\n$env?.[String]?.list(ok)\n$env?.[String]?.list(true, true)\n$env?.[String]?.list.add()\n$env?.[String]?.list.foo\n$env?.[String]?.list.foo($env)\n$env?.[String]?.list.list\n$env?.[String]?.list?.String()\n$env?.[String]?.list?.[array]\n$env?.[String]?.list?.[foo]\n$env?.[String]?.list?.[greet]\n$env?.[String]?.list?.[list]?.Bar\n$env?.[String]?.list?.[ok]\n$env?.[String]?.list?.add?.list\n$env?.[String]?.list?.array\n$env?.[String]?.list?.foo(0)\n$env?.[String]?.list?.foobar\n$env?.[String]?.list?.i\n$env?.[String]?.list?.list\n$env?.[String]?.map($env)\n$env?.[String]?.map($env, foo).add\n$env?.[String]?.map(String, foobar)\n$env?.[String]?.nil.String\n$env?.[String]?.nil.list\n$env?.[String]?.nil?.f64\n$env?.[String]?.nil?.ok()\n$env?.[String]?.none($env)\n$env?.[String]?.none(array)\n$env?.[String]?.none(foobar)\n$env?.[String]?.not\n$env?.[String]?.ok\n$env?.[String]?.ok()\n$env?.[String]?.ok().add\n$env?.[String]?.ok()?.[add]\n$env?.[String]?.ok()?.list\n$env?.[String]?.ok()?.str() == f64\n$env?.[String]?.ok(array)\n$env?.[String]?.ok(f64, foobar)\n$env?.[String]?.ok(foo contains foobar)\n$env?.[String]?.ok(foo)\n$env?.[String]?.ok(foobar)\n$env?.[String]?.ok(foobar?.[1.0])\n$env?.[String]?.ok(foobar?.[list])\n$env?.[String]?.ok(nil startsWith ok)\n$env?.[String]?.ok(toJSON(foo)).f64\n$env?.[String]?.ok.add\n$env?.[String]?.ok.f64\n$env?.[String]?.ok.foo\n$env?.[String]?.ok.i\n$env?.[String]?.ok.ok\n$env?.[String]?.ok.str\n$env?.[String]?.ok?.[array]\n$env?.[String]?.ok?.[f64]\n$env?.[String]?.ok?.[f64].list\n$env?.[String]?.ok?.[foo]\n$env?.[String]?.ok?.[list]\n$env?.[String]?.ok?.[ok]\n$env?.[String]?.ok?.add\n$env?.[String]?.ok?.f64\n$env?.[String]?.ok?.foo\n$env?.[String]?.ok?.ok\n$env?.[String]?.one($env)\n$env?.[String]?.one(array)\n$env?.[String]?.one(foobar)?.[f64]\n$env?.[String]?.reduce(1.0)\n$env?.[String]?.reduce(foobar)\n$env?.[String]?.sortBy(add)\n$env?.[String]?.splitAfter(true)\n$env?.[String]?.str\n$env?.[String]?.str not endsWith $env\n$env?.[String]?.str not startsWith str\n$env?.[String]?.str()\n$env?.[String]?.str().list\n$env?.[String]?.str().list?.[list]\n$env?.[String]?.str()?.array\n$env?.[String]?.str(add)\n$env?.[String]?.str(foo)\n$env?.[String]?.str(foobar)\n$env?.[String]?.str(foobar?.array)\n$env?.[String]?.str.String\n$env?.[String]?.str.add\n$env?.[String]?.str.array\n$env?.[String]?.str.foo\n$env?.[String]?.str.ok\n$env?.[String]?.str?.Bar\n$env?.[String]?.str?.String\n$env?.[String]?.str?.[add]\n$env?.[String]?.str?.[i]\n$env?.[String]?.str?.add\n$env?.[String]?.str?.f64()\n$env?.[String]?.str?.f64(false)?.greet\n$env?.[String]?.str?.list()\n$env?.[String]?.str?.str\n$env?.[String]?.string(foobar, foobar)\n$env?.[String]?.sum(String, foobar)\n$env?.[String]?.sum(add)\n$env?.[String]?.sum(foobar, foobar)\n$env?.[String]?.take(String)?.str\n$env?.[String]?.trimPrefix(add)\n$env?.[String]?.trimPrefix(foobar)\n$env?.[String]?.true not in array\n$env?.[String]?.true.foo\n$env?.[String]?.true?.[1]\n$env?.[String]?.true?.foobar\n$env?.[add] != 1.0 && false\n$env?.[add] * f64 && false\n$env?.[add] == nil and false\n$env?.[f64] == list || true\n$env?.[false] and not true\n$env?.[foo] != 1.0 || true\n$env?.[foo] endsWith $env && false\n$env?.[foobar] != $env.i\n$env?.[foobar] != $env.list\n$env?.[foobar] != f64\n$env?.[foobar] != foo\n$env?.[foobar] != greet\n$env?.[foobar] != i\n$env?.[foobar] != i ? true : $env\n$env?.[foobar] != list\n$env?.[foobar] != str\n$env?.[foobar] == add\n$env?.[foobar] == array\n$env?.[foobar] == f64\n$env?.[foobar] == foo\n$env?.[foobar] == greet\n$env?.[foobar] == list\n$env?.[foobar] == list != $env\n$env?.[foobar] == ok\n$env?.[foobar] ?? f64\n$env?.[foobar] ?? greet\n$env?.[foobar] ?? ok\n$env?.[foobar] contains str\n$env?.[foobar] endsWith $env?.[str]\n$env?.[foobar] endsWith str\n$env?.[foobar] in $env?.[String]\n$env?.[foobar] in list\n$env?.[foobar] in reverse(array)\n$env?.[foobar] matches str\n$env?.[foobar] not contains str\n$env?.[foobar] not endsWith str\n$env?.[foobar] not in array\n$env?.[foobar] not in list\n$env?.[foobar] not matches str\n$env?.[foobar] not startsWith foo?.String()\n$env?.[foobar] not startsWith str\n$env?.[foobar] not startsWith trim(str)\n$env?.[foobar] startsWith $env or $env\n$env?.[foobar] startsWith $env?.[str]\n$env?.[foobar] | get($env)\n$env?.[foobar] | get(foo)\n$env?.[foobar]?.$env == nil\n$env?.[foobar]?.$env.greet\n$env?.[foobar]?.Bar\n$env?.[foobar]?.Bar()\n$env?.[foobar]?.Bar().str\n$env?.[foobar]?.Bar()?.foobar\n$env?.[foobar]?.Bar(add)\n$env?.[foobar]?.Bar(foobar)\n$env?.[foobar]?.Bar(list)\n$env?.[foobar]?.Bar.foo()\n$env?.[foobar]?.Bar.foobar\n$env?.[foobar]?.Bar.i\n$env?.[foobar]?.Bar.str(foobar)\n$env?.[foobar]?.Bar?.[f64]\n$env?.[foobar]?.Bar?.[i]\n$env?.[foobar]?.Bar?.[str]\n$env?.[foobar]?.Bar?.[str]?.array\n$env?.[foobar]?.Bar?.f64\n$env?.[foobar]?.Bar?.foo\n$env?.[foobar]?.String\n$env?.[foobar]?.String()\n$env?.[foobar]?.String(Bar)\n$env?.[foobar]?.String(add).String\n$env?.[foobar]?.String(foobar)\n$env?.[foobar]?.String(foobar?.f64, Bar?.[foobar])\n$env?.[foobar]?.String(nil == foobar)\n$env?.[foobar]?.String.Bar\n$env?.[foobar]?.String.ok\n$env?.[foobar]?.String.str\n$env?.[foobar]?.String?.[i]\n$env?.[foobar]?.String?.[str]\n$env?.[foobar]?.String?.[str]?.[f64]?.ok\n$env?.[foobar]?.String?.array\n$env?.[foobar]?.String?.i\n$env?.[foobar]?.String?.list\n$env?.[foobar]?.String?.ok()\n$env?.[foobar]?.[!false]\n$env?.[foobar]?.[$env | groupBy(i)]\n$env?.[foobar]?.[$env[nil:]]\n$env?.[foobar]?.[add]\n$env?.[foobar]?.[add].f64\n$env?.[foobar]?.[add].greet\n$env?.[foobar]?.[add].i\n$env?.[foobar]?.[add]?.Bar\n$env?.[foobar]?.[add]?.[add]\n$env?.[foobar]?.[add]?.[foo]\n$env?.[foobar]?.[add]?.[greet]\n$env?.[foobar]?.[add]?.f64\n$env?.[foobar]?.[array]\n$env?.[foobar]?.[array].i\n$env?.[foobar]?.[array]?.Bar\n$env?.[foobar]?.[array]?.Bar()\n$env?.[foobar]?.[array]?.[i]\n$env?.[foobar]?.[array]?.[ok]\n$env?.[foobar]?.[array]?.add\n$env?.[foobar]?.[array]?.f64\n$env?.[foobar]?.[array]?.f64()\n$env?.[foobar]?.[array]?.foo\n$env?.[foobar]?.[array]?.list()?.[add]\n$env?.[foobar]?.[f64 ^ 1.0]\n$env?.[foobar]?.[f64]\n$env?.[foobar]?.[f64].array\n$env?.[foobar]?.[f64].f64\n$env?.[foobar]?.[f64].f64()\n$env?.[foobar]?.[f64].greet\n$env?.[foobar]?.[f64].ok()\n$env?.[foobar]?.[f64]?.[i]\n$env?.[foobar]?.[f64]?.[str]\n$env?.[foobar]?.[f64]?.greet\n$env?.[foobar]?.[foo]\n$env?.[foobar]?.[foo].Bar\n$env?.[foobar]?.[foo].String\n$env?.[foobar]?.[foo].String()\n$env?.[foobar]?.[foo].add()\n$env?.[foobar]?.[foo]?.[str]\n$env?.[foobar]?.[foo]?.i\n$env?.[foobar]?.[greet ?? 1.0]\n$env?.[foobar]?.[greet]\n$env?.[foobar]?.[greet].array.array\n$env?.[foobar]?.[greet].f64\n$env?.[foobar]?.[greet]?.[add]\n$env?.[foobar]?.[greet]?.[i].array\n$env?.[foobar]?.[greet]?.[ok]\n$env?.[foobar]?.[greet]?.str\n$env?.[foobar]?.[i]\n$env?.[foobar]?.[i].Bar\n$env?.[foobar]?.[i].array\n$env?.[foobar]?.[i].greet\n$env?.[foobar]?.[i].str\n$env?.[foobar]?.[i]?.[list]\n$env?.[foobar]?.[i]?.[ok]\n$env?.[foobar]?.[i]?.ok\n$env?.[foobar]?.[list]\n$env?.[foobar]?.[list].f64()\n$env?.[foobar]?.[list].foo\n$env?.[foobar]?.[list].ok\n$env?.[foobar]?.[list]?.[f64]\n$env?.[foobar]?.[list]?.[str]\n$env?.[foobar]?.[list]?.f64()\n$env?.[foobar]?.[list]?.ok\n$env?.[foobar]?.[ok]\n$env?.[foobar]?.[ok].Bar\n$env?.[foobar]?.[ok].list\n$env?.[foobar]?.[ok].str\n$env?.[foobar]?.[ok]?.[add]\n$env?.[foobar]?.[ok]?.[f64]\n$env?.[foobar]?.[ok]?.f64\n$env?.[foobar]?.[ok]?.ok\n$env?.[foobar]?.[sortBy($env, f64)]\n$env?.[foobar]?.[str]\n$env?.[foobar]?.[str].Bar\n$env?.[foobar]?.[str].foo?.[add]\n$env?.[foobar]?.[str].i\n$env?.[foobar]?.[str]?.[f64]\n$env?.[foobar]?.add\n$env?.[foobar]?.add()\n$env?.[foobar]?.add()?.[array]\n$env?.[foobar]?.add(foobar)\n$env?.[foobar]?.add(toJSON(foo), Bar)\n$env?.[foobar]?.add.add()\n$env?.[foobar]?.add.greet(foo)\n$env?.[foobar]?.add?.[add]\n$env?.[foobar]?.add?.array()\n$env?.[foobar]?.add?.greet\n$env?.[foobar]?.add?.i\n$env?.[foobar]?.all(foobar, greet, $env)\n$env?.[foobar]?.any(1, foobar)\n$env?.[foobar]?.any(f64, nil)\n$env?.[foobar]?.any(i).f64\n$env?.[foobar]?.array\n$env?.[foobar]?.array contains str\n$env?.[foobar]?.array()\n$env?.[foobar]?.array(foobar)\n$env?.[foobar]?.array.Bar\n$env?.[foobar]?.array.f64\n$env?.[foobar]?.array.f64()\n$env?.[foobar]?.array?.[add]\n$env?.[foobar]?.array?.[f64]\n$env?.[foobar]?.array?.[i]\n$env?.[foobar]?.array?.add()\n$env?.[foobar]?.array?.i\n$env?.[foobar]?.bitand(false)\n$env?.[foobar]?.count(0)\n$env?.[foobar]?.f64\n$env?.[foobar]?.f64()\n$env?.[foobar]?.f64()?.[ok]\n$env?.[foobar]?.f64()?.array\n$env?.[foobar]?.f64(String)\n$env?.[foobar]?.f64(foobar endsWith String)?.[greet]\n$env?.[foobar]?.f64(foobar)\n$env?.[foobar]?.f64(i)\n$env?.[foobar]?.f64.ok\n$env?.[foobar]?.f64?.Bar\n$env?.[foobar]?.f64?.[i]\n$env?.[foobar]?.f64?.list()\n$env?.[foobar]?.f64?.ok\n$env?.[foobar]?.false?.[add]\n$env?.[foobar]?.filter(foo)\n$env?.[foobar]?.find(foobar, 1)\n$env?.[foobar]?.findLast(foo).String()\n$env?.[foobar]?.foo\n$env?.[foobar]?.foo()\n$env?.[foobar]?.foo()?.array\n$env?.[foobar]?.foo()?.f64\n$env?.[foobar]?.foo(Bar)\n$env?.[foobar]?.foo(foobar)\n$env?.[foobar]?.foo(foobar, foobar)\n$env?.[foobar]?.foo.foobar\n$env?.[foobar]?.foo?.String\n$env?.[foobar]?.foo?.[array]\n$env?.[foobar]?.foo?.[foo]\n$env?.[foobar]?.foo?.[i]\n$env?.[foobar]?.foo?.foo\n$env?.[foobar]?.foo?.foo?.array\n$env?.[foobar]?.foobar\n$env?.[foobar]?.foobar not in $env\n$env?.[foobar]?.foobar.str\n$env?.[foobar]?.foobar?.[foo]\n$env?.[foobar]?.foobar?.greet\n$env?.[foobar]?.foobar?.ok(list, foobar)\n$env?.[foobar]?.foobar?.str\n$env?.[foobar]?.greet\n$env?.[foobar]?.greet == foo\n$env?.[foobar]?.greet()\n$env?.[foobar]?.greet()?.String\n$env?.[foobar]?.greet(Bar)\n$env?.[foobar]?.greet(String)\n$env?.[foobar]?.greet(foobar)\n$env?.[foobar]?.greet(foobar, foo)\n$env?.[foobar]?.greet(foobar?.list(), array)\n$env?.[foobar]?.greet(greet)\n$env?.[foobar]?.greet(list, Bar)\n$env?.[foobar]?.greet.foo\n$env?.[foobar]?.greet.i\n$env?.[foobar]?.greet?.add\n$env?.[foobar]?.greet?.add(nil)\n$env?.[foobar]?.greet?.array\n$env?.[foobar]?.greet?.ok\n$env?.[foobar]?.i\n$env?.[foobar]?.i()\n$env?.[foobar]?.i()?.greet\n$env?.[foobar]?.i(Bar)\n$env?.[foobar]?.i(foo)\n$env?.[foobar]?.i(foobar)\n$env?.[foobar]?.i.Bar\n$env?.[foobar]?.i.String\n$env?.[foobar]?.i.array\n$env?.[foobar]?.i.foo\n$env?.[foobar]?.i?.[array]\n$env?.[foobar]?.i?.[foo]\n$env?.[foobar]?.i?.[greet]\n$env?.[foobar]?.i?.f64\n$env?.[foobar]?.i?.ok\n$env?.[foobar]?.join(greet, nil)\n$env?.[foobar]?.lastIndexOf(nil, foobar)\n$env?.[foobar]?.list\n$env?.[foobar]?.list()\n$env?.[foobar]?.list(1)\n$env?.[foobar]?.list(f64)\n$env?.[foobar]?.list(foobar)\n$env?.[foobar]?.list(str)\n$env?.[foobar]?.list.i\n$env?.[foobar]?.list.i()\n$env?.[foobar]?.list.list\n$env?.[foobar]?.list.ok(foobar)\n$env?.[foobar]?.list?.[array]\n$env?.[foobar]?.list?.[i]\n$env?.[foobar]?.list?.[list]\n$env?.[foobar]?.list?.f64\n$env?.[foobar]?.list?.ok()\n$env?.[foobar]?.max(1, ok)\n$env?.[foobar]?.max(foo)\n$env?.[foobar]?.nil?.[foo]\n$env?.[foobar]?.nil?.str(foo, foobar)\n$env?.[foobar]?.none(foobar)\n$env?.[foobar]?.none(nil, foobar)\n$env?.[foobar]?.not .String\n$env?.[foobar]?.now(1)\n$env?.[foobar]?.ok\n$env?.[foobar]?.ok()\n$env?.[foobar]?.ok()?.i\n$env?.[foobar]?.ok(Bar?.[greet])?.greet\n$env?.[foobar]?.ok(foo not startsWith foobar)\n$env?.[foobar]?.ok(foo)\n$env?.[foobar]?.ok(list)\n$env?.[foobar]?.ok.add\n$env?.[foobar]?.ok.add()\n$env?.[foobar]?.ok.i\n$env?.[foobar]?.ok?.[greet]\n$env?.[foobar]?.ok?.greet()\n$env?.[foobar]?.ok?.i\n$env?.[foobar]?.reduce(nil, 1.0)\n$env?.[foobar]?.sortBy(foo, 0, foobar)\n$env?.[foobar]?.str\n$env?.[foobar]?.str($env)\n$env?.[foobar]?.str()\n$env?.[foobar]?.str()?.str\n$env?.[foobar]?.str(foobar)\n$env?.[foobar]?.str(foobar?.greet(nil))\n$env?.[foobar]?.str(i)\n$env?.[foobar]?.str.ok\n$env?.[foobar]?.str?.String\n$env?.[foobar]?.str?.[f64]\n$env?.[foobar]?.str?.[list]\n$env?.[foobar]?.str?.foo\n$env?.[foobar]?.str?.i\n$env?.[foobar]?.str?.i()\n$env?.[foobar]?.str?.list\n$env?.[foobar]?.sum($env)\n$env?.[foobar]?.trimSuffix(f64, foobar)\n$env?.[foobar]?.true?.ok\n$env?.[greet]?.foobar or true\n$env?.[i] and !true\n$env?.[i].i and false\n$env?.[list] contains str && false\n$env?.[list] || false or true\n$env?.[nil] != array\n$env?.[nil] != ok\n$env?.[nil] == array?.[0]\n$env?.[nil] == ok\n$env?.[nil] == str\n$env?.[nil] ?? add\n$env?.[nil] ?? map($env, foo)\n$env?.[nil] endsWith str\n$env?.[nil] in $env?.[String]\n$env?.[nil] not endsWith str\n$env?.[nil] not startsWith str\n$env?.[nil] | get(nil)\n$env?.[nil]?.Bar\n$env?.[nil]?.Bar()\n$env?.[nil]?.Bar?.[add]\n$env?.[nil]?.Bar?.[str]\n$env?.[nil]?.String\n$env?.[nil]?.String()\n$env?.[nil]?.String(Bar?.[str])\n$env?.[nil]?.String(f64)\n$env?.[nil]?.String(false ?? foobar)\n$env?.[nil]?.String.greet\n$env?.[nil]?.String?.[add]\n$env?.[nil]?.String?.[list]\n$env?.[nil]?.[add]\n$env?.[nil]?.[add].Bar\n$env?.[nil]?.[add]?.[add]\n$env?.[nil]?.[add]?.array\n$env?.[nil]?.[array]\n$env?.[nil]?.[array].count(i)\n$env?.[nil]?.[array]?.f64()\n$env?.[nil]?.[f64]\n$env?.[nil]?.[f64].list\n$env?.[nil]?.[f64]?.Bar\n$env?.[nil]?.[foo]\n$env?.[nil]?.[foo]?.i()\n$env?.[nil]?.[greet]\n$env?.[nil]?.[greet]?.Bar\n$env?.[nil]?.[greet]?.array()\n$env?.[nil]?.[i]\n$env?.[nil]?.[list]\n$env?.[nil]?.[ok]\n$env?.[nil]?.[str]\n$env?.[nil]?.[str]?.[array]\n$env?.[nil]?.[{foo: 1}]\n$env?.[nil]?.add\n$env?.[nil]?.add()\n$env?.[nil]?.array\n$env?.[nil]?.array()\n$env?.[nil]?.array(add)\n$env?.[nil]?.array(list)\n$env?.[nil]?.array?.[foo]\n$env?.[nil]?.array?.add\n$env?.[nil]?.f64\n$env?.[nil]?.f64()\n$env?.[nil]?.f64.add\n$env?.[nil]?.f64.f64\n$env?.[nil]?.f64.foo()\n$env?.[nil]?.f64.i\n$env?.[nil]?.flatten(0)\n$env?.[nil]?.foo\n$env?.[nil]?.foo()\n$env?.[nil]?.foo?.String\n$env?.[nil]?.foobar\n$env?.[nil]?.foobar.String()\n$env?.[nil]?.foobar.str\n$env?.[nil]?.foobar?.i\n$env?.[nil]?.greet\n$env?.[nil]?.greet()\n$env?.[nil]?.greet(foobar)\n$env?.[nil]?.greet.f64\n$env?.[nil]?.greet?.f64\n$env?.[nil]?.i\n$env?.[nil]?.i()\n$env?.[nil]?.i(true or $env >= ok)\n$env?.[nil]?.i?.f64\n$env?.[nil]?.list\n$env?.[nil]?.list($env?.foo)\n$env?.[nil]?.list()\n$env?.[nil]?.list?.array\n$env?.[nil]?.list?.f64\n$env?.[nil]?.list?.i\n$env?.[nil]?.map(foo)\n$env?.[nil]?.ok\n$env?.[nil]?.ok()\n$env?.[nil]?.ok(f64)\n$env?.[nil]?.ok?.[str]\n$env?.[nil]?.ok?.f64\n$env?.[nil]?.str\n$env?.[nil]?.str()\n$env?.[nil]?.str(String)\n$env?.[nil]?.str(foobar)\n$env?.[nil]?.str(str)?.[f64]\n$env?.[nil]?.str?.greet()\n$env?.[ok] - 1 or true\n$env?.[str] != 1 and false\n$env?.[str] != add\n$env?.[str] != add != $env\n$env?.[str] != array\n$env?.[str] != f64\n$env?.[str] != foo\n$env?.[str] != foo.Bar\n$env?.[str] != foo?.String()\n$env?.[str] != greet\n$env?.[str] != i\n$env?.[str] != list\n$env?.[str] != ok\n$env?.[str] != str\n$env?.[str] != string(1.0)\n$env?.[str] != type(str)\n$env?.[str] + str\n$env?.[str] < foo?.Bar\n$env?.[str] < foo?.String()\n$env?.[str] < str\n$env?.[str] <= $env.str\n$env?.[str] <= str\n$env?.[str] == 1.0 == $env\n$env?.[str] == add\n$env?.[str] == array\n$env?.[str] == f64\n$env?.[str] == first($env)\n$env?.[str] == foo\n$env?.[str] == greet\n$env?.[str] == i\n$env?.[str] == ok\n$env?.[str] == str\n$env?.[str] > str\n$env?.[str] >= str\n$env?.[str] ?? $env[:foobar]\n$env?.[str] ?? add\n$env?.[str] ?? array\n$env?.[str] ?? foo\n$env?.[str] ?? greet\n$env?.[str] ?? i\n$env?.[str] ?? list\n$env?.[str] ?? ok\n$env?.[str] ?? str\n$env?.[str] contains foo?.Bar\n$env?.[str] contains str\n$env?.[str] contains type(greet)\n$env?.[str] endsWith $env?.str\n$env?.[str] endsWith str\n$env?.[str] in $env.foo\n$env?.[str] in $env.list\n$env?.[str] in array\n$env?.[str] in list\n$env?.[str] matches foo?.Bar\n$env?.[str] matches str\n$env?.[str] not contains str\n$env?.[str] not endsWith str\n$env?.[str] not in $env == ok\n$env?.[str] not in $env.list\n$env?.[str] not in $env?.[Bar]\n$env?.[str] not in $env?.array\n$env?.[str] not in array\n$env?.[str] not in list\n$env?.[str] not in {foo: 1}\n$env?.[str] not matches $env?.[Bar]\n$env?.[str] not matches foo?.String()\n$env?.[str] not matches str\n$env?.[str] not startsWith str\n$env?.[str] startsWith $env?.[String]\n$env?.[str] startsWith foo?.Bar\n$env?.[str] startsWith str\n$env?.[str] | all(false)\n$env?.[str] | all(ok)\n$env?.[str] | all(true)\n$env?.[str] | any(any(list, true))\n$env?.[str] | any(false)\n$env?.[str] | any(ok)\n$env?.[str] | any(true)\n$env?.[str] | count(false)\n$env?.[str] | count(i != 0)\n$env?.[str] | count(ok)\n$env?.[str] | count(true)\n$env?.[str] | date(str)\n$env?.[str] | filter(false)\n$env?.[str] | filter(true != false)\n$env?.[str] | filter(true)\n$env?.[str] | find(0 >= #)\n$env?.[str] | find(false)\n$env?.[str] | find(ok)\n$env?.[str] | find(true)\n$env?.[str] | findIndex(1 != 0)\n$env?.[str] | findIndex(add != #)\n$env?.[str] | findIndex(false)\n$env?.[str] | findIndex(ok)\n$env?.[str] | findIndex(true)\n$env?.[str] | findLast(false)\n$env?.[str] | findLast(ok)\n$env?.[str] | findLast(true)\n$env?.[str] | findLastIndex(false)\n$env?.[str] | findLastIndex(true)\n$env?.[str] | greet()\n$env?.[str] | groupBy(#)\n$env?.[str] | groupBy(0)\n$env?.[str] | groupBy(1)\n$env?.[str] | groupBy(1.0)\n$env?.[str] | groupBy(f64)\n$env?.[str] | groupBy(false)\n$env?.[str] | groupBy(foo)\n$env?.[str] | groupBy(i)\n$env?.[str] | groupBy(ok)\n$env?.[str] | groupBy(str)\n$env?.[str] | groupBy(true)\n$env?.[str] | hasPrefix(str)\n$env?.[str] | indexOf(str)\n$env?.[str] | map(#)\n$env?.[str] | map($env)\n$env?.[str] | map(0)\n$env?.[str] | map(1)\n$env?.[str] | map(1.0)\n$env?.[str] | map(add)\n$env?.[str] | map(false)\n$env?.[str] | map(foo)\n$env?.[str] | map(greet)\n$env?.[str] | map(i)\n$env?.[str] | map(list)\n$env?.[str] | map(ok)\n$env?.[str] | map(str)\n$env?.[str] | map(true)\n$env?.[str] | none(false)\n$env?.[str] | none(ok)\n$env?.[str] | none(true)\n$env?.[str] | one(false)\n$env?.[str] | one(ok)\n$env?.[str] | one(true)\n$env?.[str] | reduce(#)\n$env?.[str] | reduce(#, add)\n$env?.[str] | reduce(#, array)\n$env?.[str] | reduce(#, false)\n$env?.[str] | reduce(#, ok)\n$env?.[str] | reduce(#, str)\n$env?.[str] | reduce(#acc)\n$env?.[str] | reduce($env)\n$env?.[str] | reduce($env, ok)\n$env?.[str] | reduce($env, true)\n$env?.[str] | reduce(0)\n$env?.[str] | reduce(0, nil)\n$env?.[str] | reduce(1, 1.0)\n$env?.[str] | reduce(1.0)\n$env?.[str] | reduce(1.0, $env)\n$env?.[str] | reduce(1.0, nil)\n$env?.[str] | reduce(add)\n$env?.[str] | reduce(add, nil)\n$env?.[str] | reduce(array)\n$env?.[str] | reduce(f64)\n$env?.[str] | reduce(false)\n$env?.[str] | reduce(false, greet)\n$env?.[str] | reduce(foo)\n$env?.[str] | reduce(foo, true)\n$env?.[str] | reduce(greet)\n$env?.[str] | reduce(greet, add)\n$env?.[str] | reduce(greet, foo)\n$env?.[str] | reduce(i)\n$env?.[str] | reduce(list)\n$env?.[str] | reduce(list, true)\n$env?.[str] | reduce(ok)\n$env?.[str] | reduce(ok, $env)\n$env?.[str] | reduce(str)\n$env?.[str] | reduce(true)\n$env?.[str] | reduce(true, f64)\n$env?.[str] | repeat(1)\n$env?.[str] | sortBy(#)\n$env?.[str] | sortBy(0)\n$env?.[str] | sortBy(1)\n$env?.[str] | sortBy(1.0)\n$env?.[str] | sortBy(f64)\n$env?.[str] | sortBy(i)\n$env?.[str] | sortBy(str)\n$env?.[str] | sum(#)\n$env?.[str] | sum(1)\n$env?.[str] | sum(1.0)\n$env?.[str] | sum(f64)\n$env?.[str] | sum(i)\n$env?.[str] | trimSuffix(str)\n$env?.[str].Bar or true\n$env?.[str]?.[-1.0]\n$env?.[str]?.[f64]\n$env?.[str]?.[f64] * f64\n$env?.[str]?.[i]\n$env?.[str][:-1]\n$env?.[str][:]\n$env?.[str][:f64]\n$env?.[str][:i]\n$env?.[str][array?.[f64]:]\n$env?.[str][f64:]\n$env?.add != 1.0 ?? 1\n$env?.add != add\n$env?.add == $env || ok\n$env?.add == add\n$env?.add ?? $env.i\n$env?.add ?? add\n$env?.add ?? array\n$env?.add ?? f64\n$env?.add ?? foo?.Bar\n$env?.add ?? greet\n$env?.add ?? i\n$env?.add ?? join($env)\n$env?.add ?? list\n$env?.add ?? ok\n$env?.add ?? reverse($env)\n$env?.add ?? str\n$env?.add ?? sum($env)\n$env?.add in $env?.Bar\n$env?.add not in $env?.[Bar]\n$env?.array != array\n$env?.array != array || $env\n$env?.array != list\n$env?.array == array\n$env?.array == list\n$env?.array ?? $env?.[add]\n$env?.array ?? ceil(1.0)\n$env?.array ?? f64\n$env?.array ?? false | groupBy(foo)\n$env?.array ?? fromBase64(str)\n$env?.array ?? i\n$env?.array ?? list\n$env?.array ?? ok\n$env?.array ?? str\n$env?.array ?? true | map(add)\n$env?.array in $env?.[Bar]\n$env?.array in sort($env)\n$env?.array | all(false)\n$env?.array | all(ok)\n$env?.array | all(true)\n$env?.array | any(# == 0)\n$env?.array | any(false)\n$env?.array | any(ok)\n$env?.array | any(true)\n$env?.array | count(ok)\n$env?.array | count(true)\n$env?.array | filter(false)\n$env?.array | filter(ok)\n$env?.array | filter(true)\n$env?.array | find(false)\n$env?.array | find(ok)\n$env?.array | find(true)\n$env?.array | findIndex(ok)\n$env?.array | findIndex(true)\n$env?.array | findLast(false ?? nil)\n$env?.array | findLast(false)\n$env?.array | findLast(ok)\n$env?.array | findLast(true)\n$env?.array | findLastIndex(false)\n$env?.array | findLastIndex(ok)\n$env?.array | findLastIndex(true)\n$env?.array | get(1)\n$env?.array | groupBy(#)\n$env?.array | groupBy(0)\n$env?.array | groupBy(1)\n$env?.array | groupBy(1.0)\n$env?.array | groupBy(false)\n$env?.array | groupBy(foo)\n$env?.array | groupBy(mean(1))\n$env?.array | groupBy(ok)\n$env?.array | groupBy(str)\n$env?.array | groupBy(true)\n$env?.array | map(#)\n$env?.array | map(#index)\n$env?.array | map($env)\n$env?.array | map(0)\n$env?.array | map(1)\n$env?.array | map(1.0)\n$env?.array | map(add)\n$env?.array | map(array)\n$env?.array | map(f64)\n$env?.array | map(false)\n$env?.array | map(foo)\n$env?.array | map(i)\n$env?.array | map(list)\n$env?.array | map(ok)\n$env?.array | map(str)\n$env?.array | map(true)\n$env?.array | mean(1)\n$env?.array | mean(1.0)\n$env?.array | mean(f64)\n$env?.array | min(array)\n$env?.array | min(i)\n$env?.array | none(false)\n$env?.array | none(ok)\n$env?.array | none(true)\n$env?.array | one(f64 != nil)\n$env?.array | one(false)\n$env?.array | one(ok)\n$env?.array | one(true)\n$env?.array | reduce(#)\n$env?.array | reduce(#, $env)\n$env?.array | reduce(#, 1)\n$env?.array | reduce(#, array)\n$env?.array | reduce(#, f64)\n$env?.array | reduce(#, foo)\n$env?.array | reduce(#, true)\n$env?.array | reduce(#acc)\n$env?.array | reduce(#index)\n$env?.array | reduce($env)\n$env?.array | reduce($env, $env)\n$env?.array | reduce($env, add)\n$env?.array | reduce($env, greet)\n$env?.array | reduce($env, nil)\n$env?.array | reduce(0)\n$env?.array | reduce(0, foo)\n$env?.array | reduce(1 == #)\n$env?.array | reduce(1)\n$env?.array | reduce(1, 1)\n$env?.array | reduce(1, list)\n$env?.array | reduce(1.0)\n$env?.array | reduce(1.0, array)\n$env?.array | reduce(add)\n$env?.array | reduce(add, 1.0)\n$env?.array | reduce(add, nil)\n$env?.array | reduce(array)\n$env?.array | reduce(f64)\n$env?.array | reduce(false)\n$env?.array | reduce(foo)\n$env?.array | reduce(foo, foo)\n$env?.array | reduce(greet, str)\n$env?.array | reduce(i)\n$env?.array | reduce(i, 1.0)\n$env?.array | reduce(ok)\n$env?.array | reduce(ok, true)\n$env?.array | reduce(str)\n$env?.array | reduce(true)\n$env?.array | reduce(true, 0)\n$env?.array | sortBy(#)\n$env?.array | sortBy(0)\n$env?.array | sortBy(1)\n$env?.array | sortBy(1.0)\n$env?.array | sortBy(f64)\n$env?.array | sortBy(i)\n$env?.array | sortBy(str)\n$env?.array | sum(#)\n$env?.array | sum(1)\n$env?.array | sum(1.0)\n$env?.array | sum(f64)\n$env?.array | sum(i)\n$env?.array | take(0)\n$env?.array; i\n$env?.array?.[-0]\n$env?.array?.[-1]\n$env?.array?.[first(array)]\n$env?.array?.[i]\n$env?.array[:$env.i]\n$env?.array[:]\n$env?.array[:i]\n$env?.f64 != $env?.String\n$env?.f64 != f64\n$env?.f64 != i\n$env?.f64 != nil ?? 1.0\n$env?.f64 * 1.0 == 1.0\n$env?.f64 * f64\n$env?.f64 * i\n$env?.f64 ** $env.f64\n$env?.f64 ** 0 / f64\n$env?.f64 ** f64\n$env?.f64 ** i\n$env?.f64 ** int(f64)\n$env?.f64 + 0 < 1.0\n$env?.f64 + 1 * 0\n$env?.f64 + f64\n$env?.f64 + i\n$env?.f64 - 1 / f64\n$env?.f64 - 1.0 == 1.0\n$env?.f64 - 1.0 > 0\n$env?.f64 - f64\n$env?.f64 / f64\n$env?.f64 / i\n$env?.f64 / len($env)\n$env?.f64 < 0 % i\n$env?.f64 < 1.0 - 1\n$env?.f64 < 1.0 - 1.0\n$env?.f64 < f64\n$env?.f64 < i\n$env?.f64 <= f64\n$env?.f64 <= i\n$env?.f64 == $env?.[Bar]\n$env?.f64 == $env?.[str]\n$env?.f64 == f64\n$env?.f64 == i\n$env?.f64 == max(array, 1.0)\n$env?.f64 > f64\n$env?.f64 > i\n$env?.f64 >= -1\n$env?.f64 >= f64\n$env?.f64 >= i\n$env?.f64 >= i == false\n$env?.f64 >= round(f64)\n$env?.f64 ?? 1.0 ?? i\n$env?.f64 ?? add\n$env?.f64 ?? array\n$env?.f64 ?? foo\n$env?.f64 ?? foo.String\n$env?.f64 ?? greet\n$env?.f64 ?? list\n$env?.f64 ?? list ?? foo\n$env?.f64 ?? ok\n$env?.f64 ?? str\n$env?.f64 ?? upper($env)\n$env?.f64 ^ $env?.f64\n$env?.f64 ^ f64\n$env?.f64 ^ i\n$env?.f64 in $env.array\n$env?.f64 in array\n$env?.f64 not in $env?.String\n$env?.f64 not in array\n$env?.f64 | max(1.0)\n$env?.f64 | mean(0)\n$env?.f64 | mean(1.0)\n$env?.f64 | median(0)\n$env?.f64 | median(1.0, f64)\n$env?.f64 | median(f64)\n$env?.f64 | min(1.0, 1.0)\n$env?.false != add\n$env?.false != ok\n$env?.false == add\n$env?.false ?? array\n$env?.false contains $env?.String\n$env?.false endsWith str\n$env?.false in list\n$env?.false?.Bar\n$env?.false?.Bar()\n$env?.false?.Bar()?.[i]\n$env?.false?.Bar.String\n$env?.false?.String\n$env?.false?.String([foobar contains String])\n$env?.false?.String?.list\n$env?.false?.[add]\n$env?.false?.[add].String()\n$env?.false?.[add].i\n$env?.false?.[array]\n$env?.false?.[array].String()\n$env?.false?.[array]?.String\n$env?.false?.[f64]\n$env?.false?.[foo]\n$env?.false?.[foo].String?.list\n$env?.false?.[greet]\n$env?.false?.[i]\n$env?.false?.[list]\n$env?.false?.[list]?.array()\n$env?.false?.[ok]\n$env?.false?.[ok]?.[foo]\n$env?.false?.[str]\n$env?.false?.add\n$env?.false?.add()\n$env?.false?.add?.[f64]\n$env?.false?.add?.[greet]\n$env?.false?.array\n$env?.false?.array()\n$env?.false?.array(f64)\n$env?.false?.array(foobar)\n$env?.false?.array?.array\n$env?.false?.f64\n$env?.false?.f64()\n$env?.false?.foo\n$env?.false?.foo()\n$env?.false?.foo(foobar, i .. f64)\n$env?.false?.foobar\n$env?.false?.foobar.array\n$env?.false?.foobar?.array()\n$env?.false?.foobar?.str\n$env?.false?.greet\n$env?.false?.greet()\n$env?.false?.groupBy(str)\n$env?.false?.i\n$env?.false?.i.str\n$env?.false?.list\n$env?.false?.list()\n$env?.false?.list(String == foobar?.[str])\n$env?.false?.list?.Bar\n$env?.false?.list?.[foo]\n$env?.false?.ok\n$env?.false?.ok()\n$env?.false?.ok?.[list]\n$env?.false?.ok?.foobar.foo\n$env?.false?.sortBy($env)\n$env?.false?.str\n$env?.false?.str()\n$env?.false?.str.foo\n$env?.false?.str?.add\n$env?.foo == foo\n$env?.foo ?? $env?.String\n$env?.foo ?? $env?.[f64]\n$env?.foo ?? array\n$env?.foo ?? f64\n$env?.foo ?? foo\n$env?.foo ?? ok\n$env?.foo ?? str\n$env?.foo ?? {foo: i}\n$env?.foo in $env?.[Bar]\n$env?.foo in list\n$env?.foo not in $env?.[String]\n$env?.foo not in [$env]\n$env?.foo not in list\n$env?.foo.Bar\n$env?.foo.String\n$env?.foo.String()\n$env?.foo?.Bar\n$env?.foo?.String\n$env?.foo?.String()\n$env?.foobar != -f64\n$env?.foobar != f64\n$env?.foobar != greet\n$env?.foobar != str\n$env?.foobar == $env.i\n$env?.foobar == $env.str\n$env?.foobar == $env?.add\n$env?.foobar == [1.0]\n$env?.foobar == add\n$env?.foobar == array\n$env?.foobar == f64\n$env?.foobar == foo\n$env?.foobar == greet\n$env?.foobar == list\n$env?.foobar == ok\n$env?.foobar == reduce(list, false)\n$env?.foobar == str\n$env?.foobar ?? $env?.[String]\n$env?.foobar ?? i\n$env?.foobar ?? list\n$env?.foobar ?? ok\n$env?.foobar contains greet(str)\n$env?.foobar contains str\n$env?.foobar endsWith str\n$env?.foobar in array\n$env?.foobar in groupBy(array, 1.0)\n$env?.foobar in list\n$env?.foobar matches str\n$env?.foobar not contains str\n$env?.foobar not endsWith str\n$env?.foobar not in array\n$env?.foobar not in array == $env\n$env?.foobar not matches str\n$env?.foobar startsWith str\n$env?.foobar | get(add)\n$env?.foobar | get(ok)\n$env?.foobar?.$env.array(foo)\n$env?.foobar?.$env?.[f64]\n$env?.foobar?.Bar\n$env?.foobar?.Bar()\n$env?.foobar?.Bar().str\n$env?.foobar?.Bar()?.[str]\n$env?.foobar?.Bar(foobar)\n$env?.foobar?.Bar(greet)\n$env?.foobar?.Bar(list)\n$env?.foobar?.Bar.str\n$env?.foobar?.Bar?.[list]\n$env?.foobar?.Bar?.list()\n$env?.foobar?.String\n$env?.foobar?.String()\n$env?.foobar?.String()?.Bar\n$env?.foobar?.String(array)\n$env?.foobar?.String(foo)\n$env?.foobar?.String(foobar)\n$env?.foobar?.String.i\n$env?.foobar?.String.ok\n$env?.foobar?.String?.[greet]\n$env?.foobar?.String?.add\n$env?.foobar?.[add]\n$env?.foobar?.[add].list\n$env?.foobar?.[add]?.[array]\n$env?.foobar?.[add]?.[f64]\n$env?.foobar?.[add]?.f64\n$env?.foobar?.[add]?.foo\n$env?.foobar?.[add]?.greet()\n$env?.foobar?.[array]\n$env?.foobar?.[array] in list\n$env?.foobar?.[array].ok()\n$env?.foobar?.[array].str\n$env?.foobar?.[array]?.[f64]\n$env?.foobar?.[array]?.[f64]?.list?.[i]\n$env?.foobar?.[array]?.i?.f64\n$env?.foobar?.[count($env)]\n$env?.foobar?.[f64]\n$env?.foobar?.[f64].add\n$env?.foobar?.[f64]?.Bar\n$env?.foobar?.[f64]?.[foo]\n$env?.foobar?.[f64]?.[i]\n$env?.foobar?.[f64]?.[list]\n$env?.foobar?.[f64]?.add\n$env?.foobar?.[f64]?.f64(foobar)\n$env?.foobar?.[f64]?.foo\n$env?.foobar?.[f64]?.greet\n$env?.foobar?.[f64]?.i\n$env?.foobar?.[foo]\n$env?.foobar?.[foo].Bar\n$env?.foobar?.[foo].str\n$env?.foobar?.[foo]?.[i]\n$env?.foobar?.[foo]?.[str]\n$env?.foobar?.[foo]?.ok\n$env?.foobar?.[greet]\n$env?.foobar?.[greet].ok().array\n$env?.foobar?.[greet].str\n$env?.foobar?.[greet]?.[greet]\n$env?.foobar?.[greet]?.add\n$env?.foobar?.[greet]?.array\n$env?.foobar?.[greet]?.ok\n$env?.foobar?.[i]\n$env?.foobar?.[i].add\n$env?.foobar?.[i].str()\n$env?.foobar?.[i]?.Bar\n$env?.foobar?.[i]?.[list]\n$env?.foobar?.[i]?.[ok]\n$env?.foobar?.[i]?.foo()\n$env?.foobar?.[i]?.i\n$env?.foobar?.[i]?.list\n$env?.foobar?.[i]?.ok\n$env?.foobar?.[list]\n$env?.foobar?.[list] != ok\n$env?.foobar?.[list].Bar\n$env?.foobar?.[list].greet()\n$env?.foobar?.[list].list\n$env?.foobar?.[list]?.[f64]\n$env?.foobar?.[list]?.add\n$env?.foobar?.[list]?.i\n$env?.foobar?.[nil ?? list]\n$env?.foobar?.[ok]\n$env?.foobar?.[ok].ok\n$env?.foobar?.[ok]?.ok\n$env?.foobar?.[ok]?.ok()\n$env?.foobar?.[ok]?.str\n$env?.foobar?.[str]\n$env?.foobar?.[str].String\n$env?.foobar?.[str].array\n$env?.foobar?.[str].foo\n$env?.foobar?.[str].list(foobar?.[i].ok)\n$env?.foobar?.[str].ok\n$env?.foobar?.[str]?.f64\n$env?.foobar?.[str]?.i\n$env?.foobar?.[str]?.list\n$env?.foobar?.add\n$env?.foobar?.add($env)\n$env?.foobar?.add()\n$env?.foobar?.add().f64()\n$env?.foobar?.add(1.0)\n$env?.foobar?.add(foobar)\n$env?.foobar?.add(foobar?.[add])\n$env?.foobar?.add.Bar()\n$env?.foobar?.add.add()\n$env?.foobar?.add.array\n$env?.foobar?.add.foo\n$env?.foobar?.add.ok\n$env?.foobar?.add.str\n$env?.foobar?.add?.[greet]\n$env?.foobar?.add?.[greet]?.foo\n$env?.foobar?.add?.[i]\n$env?.foobar?.add?.[str]\n$env?.foobar?.add?.add\n$env?.foobar?.add?.f64\n$env?.foobar?.add?.foo\n$env?.foobar?.add?.greet()\n$env?.foobar?.add?.i\n$env?.foobar?.add?.ok\n$env?.foobar?.all(str)\n$env?.foobar?.array\n$env?.foobar?.array()\n$env?.foobar?.array().list\n$env?.foobar?.array()?.foo\n$env?.foobar?.array(Bar)\n$env?.foobar?.array(foo)\n$env?.foobar?.array(foobar)\n$env?.foobar?.array(foobar, ok)\n$env?.foobar?.array(i)\n$env?.foobar?.array.array()\n$env?.foobar?.array.foo\n$env?.foobar?.array.list()\n$env?.foobar?.array.ok\n$env?.foobar?.array.str\n$env?.foobar?.array?.String(i)\n$env?.foobar?.array?.[add]\n$env?.foobar?.array?.array\n$env?.foobar?.array?.list\n$env?.foobar?.count($env)\n$env?.foobar?.count(foo, foo)\n$env?.foobar?.f64\n$env?.foobar?.f64 not matches $env\n$env?.foobar?.f64()\n$env?.foobar?.f64()?.greet\n$env?.foobar?.f64(add)?.String(list)\n$env?.foobar?.f64(false ? foobar : foobar)\n$env?.foobar?.f64(foobar)\n$env?.foobar?.f64(foobar?.[String])\n$env?.foobar?.f64.f64\n$env?.foobar?.f64.i\n$env?.foobar?.f64?.[array].Bar\n$env?.foobar?.f64?.[foo]?.[greet]\n$env?.foobar?.f64?.[i]\n$env?.foobar?.f64?.[ok]\n$env?.foobar?.f64?.array\n$env?.foobar?.f64?.array()\n$env?.foobar?.f64?.foo\n$env?.foobar?.false?.i()\n$env?.foobar?.filter(f64)\n$env?.foobar?.findIndex(array)\n$env?.foobar?.findLast($env, $env)\n$env?.foobar?.findLastIndex(foo, f64, array)\n$env?.foobar?.findLastIndex(true)\n$env?.foobar?.foo\n$env?.foobar?.foo()\n$env?.foobar?.foo(array)\n$env?.foobar?.foo(ceil(Bar, 1), foobar?.Bar())\n$env?.foobar?.foo(foobar | string($env))\n$env?.foobar?.foo(foobar)?.[i]\n$env?.foobar?.foo(i)\n$env?.foobar?.foo.f64\n$env?.foobar?.foo.ok\n$env?.foobar?.foo?.String\n$env?.foobar?.foo?.[add]\n$env?.foobar?.foo?.[foo]\n$env?.foobar?.foo?.[greet]\n$env?.foobar?.foo?.ok(str)\n$env?.foobar?.foo?.str\n$env?.foobar?.foobar\n$env?.foobar?.foobar?.[f64]\n$env?.foobar?.foobar?.[foo]\n$env?.foobar?.foobar?.[greet]\n$env?.foobar?.foobar?.[ok]\n$env?.foobar?.greet\n$env?.foobar?.greet()\n$env?.foobar?.greet(array)\n$env?.foobar?.greet(foobar)\n$env?.foobar?.greet(list)\n$env?.foobar?.greet.Bar\n$env?.foobar?.greet.array\n$env?.foobar?.greet?.add\n$env?.foobar?.greet?.array()\n$env?.foobar?.greet?.foo\n$env?.foobar?.i\n$env?.foobar?.i()\n$env?.foobar?.i(foobar)\n$env?.foobar?.i(list not endsWith foobar)\n$env?.foobar?.i.array\n$env?.foobar?.i?.Bar\n$env?.foobar?.i?.f64\n$env?.foobar?.i?.greet\n$env?.foobar?.i?.ok\n$env?.foobar?.list\n$env?.foobar?.list()\n$env?.foobar?.list().ok\n$env?.foobar?.list()?.f64\n$env?.foobar?.list(foobar)\n$env?.foobar?.list?.[greet]\n$env?.foobar?.list?.[list]\n$env?.foobar?.list?.foo\n$env?.foobar?.min(foobar, 1.0)\n$env?.foobar?.nil.foobar\n$env?.foobar?.none(1)\n$env?.foobar?.none(array)\n$env?.foobar?.not\n$env?.foobar?.not?.[ok]\n$env?.foobar?.ok\n$env?.foobar?.ok()\n$env?.foobar?.ok().String()\n$env?.foobar?.ok(foobar not contains foobar)\n$env?.foobar?.ok(foobar)\n$env?.foobar?.ok(ok)\n$env?.foobar?.ok(str, $env)\n$env?.foobar?.ok.array\n$env?.foobar?.ok.f64()\n$env?.foobar?.ok?.[array]\n$env?.foobar?.ok?.[f64]\n$env?.foobar?.ok?.[greet]\n$env?.foobar?.ok?.[str]\n$env?.foobar?.ok?.i\n$env?.foobar?.ok?.ok\n$env?.foobar?.one(foobar)\n$env?.foobar?.one(i)\n$env?.foobar?.reduce(1.0)\n$env?.foobar?.repeat(foobar)\n$env?.foobar?.replace(str)\n$env?.foobar?.reverse($env)\n$env?.foobar?.round(foo)\n$env?.foobar?.split(1.0)\n$env?.foobar?.str\n$env?.foobar?.str()\n$env?.foobar?.str().String\n$env?.foobar?.str()?.[foo]\n$env?.foobar?.str(1 ?? foobar)\n$env?.foobar?.str(String?.[i])\n$env?.foobar?.str(foo)\n$env?.foobar?.str(foobar)\n$env?.foobar?.str.array\n$env?.foobar?.str.i\n$env?.foobar?.str.str\n$env?.foobar?.str?.[f64]\n$env?.foobar?.str?.[i]\n$env?.foobar?.str?.[str]\n$env?.foobar?.str?.add\n$env?.foobar?.str?.i\n$env?.foobar?.string($env)\n$env?.foobar?.timezone(str)\n$env?.foobar?.trimSuffix(list, i)\n$env?.foobar?.true?.$env\n$env?.foobar?.true?.str\n$env?.foobar?.uniq(foobar).add\n$env?.foobar?.upper(list)\n$env?.greet != greet\n$env?.greet == $env?.[Bar]\n$env?.greet == find($env, false)\n$env?.greet == greet\n$env?.greet == list ?? 1.0\n$env?.greet ?? $env?.Bar(true)\n$env?.greet ?? $env?.[String]\n$env?.greet ?? add\n$env?.greet ?? array\n$env?.greet ?? f64\n$env?.greet ?? foo\n$env?.greet ?? greet\n$env?.greet ?? i\n$env?.greet ?? list\n$env?.greet ?? nil ?? foo\n$env?.greet ?? ok ?? foo\n$env?.greet ?? str\n$env?.greet($env?.[str])\n$env?.greet($env?.str)\n$env?.greet(foo.Bar)\n$env?.greet(foo.String())\n$env?.greet(foo?.Bar)\n$env?.greet(foo?.String())\n$env?.greet(greet(str))\n$env?.greet(str ?? str)\n$env?.greet(str)\n$env?.greet(str) startsWith str\n$env?.greet(str[:])\n$env?.greet(string(0))\n$env?.greet(toJSON(1.0))\n$env?.greet(toJSON(array))\n$env?.greet(toJSON(false))\n$env?.greet(toJSON(str))\n$env?.greet(trim(str))\n$env?.greet(type(greet))\n$env?.greet(type(ok))\n$env?.greet(type(true))\n$env?.greet(upper(str))\n$env?.i != $env?.foobar\n$env?.i != 1.0 ** i\n$env?.i != f64\n$env?.i != i\n$env?.i % $env.i\n$env?.i % 1 ?? foo\n$env?.i % i\n$env?.i * 1 != $env\n$env?.i * f64\n$env?.i * i\n$env?.i ** 1.0 >= i\n$env?.i ** f64\n$env?.i ** i\n$env?.i ** int(1.0)\n$env?.i + $env?.f64\n$env?.i + f64\n$env?.i + findIndex($env, ok)\n$env?.i + i\n$env?.i - ceil(i)\n$env?.i - i\n$env?.i .. 1 | groupBy(f64)\n$env?.i .. i\n$env?.i / 1.0 <= i\n$env?.i / f64\n$env?.i / i\n$env?.i / len(list)\n$env?.i / max(1.0)\n$env?.i < 1.0 - 0\n$env?.i < f64\n$env?.i < i\n$env?.i < i + 1\n$env?.i <= 0 ^ 1.0\n$env?.i <= f64\n$env?.i <= i\n$env?.i == 1 - 0\n$env?.i == f64\n$env?.i == first($env)\n$env?.i == i\n$env?.i == len($env)\n$env?.i == len(list)\n$env?.i == max($env)\n$env?.i > 0 * 1.0\n$env?.i > 1 ?? nil\n$env?.i > f64\n$env?.i > i\n$env?.i > i != true\n$env?.i >= $env?.f64\n$env?.i >= 0 or $env\n$env?.i >= 1.0 ** 1\n$env?.i >= f64\n$env?.i >= floor(1.0)\n$env?.i >= i\n$env?.i ?? add\n$env?.i ?? f64\n$env?.i ?? filter($env, #.f64)\n$env?.i ?? foo\n$env?.i ?? greet\n$env?.i ?? i\n$env?.i ?? str\n$env?.i ?? str ?? str\n$env?.i ?? sum($env)\n$env?.i ^ 1.0 * 1\n$env?.i ^ i\n$env?.i ^ i not in array\n$env?.i in array\n$env?.i not in $env?.String\n$env?.i not in $env?.[Bar]\n$env?.i not in array\n$env?.i | add(0)\n$env?.i | add(1)\n$env?.i | bitand(i)\n$env?.i | bitnand(0)\n$env?.i | bitnand(1)\n$env?.i | bitor(i)\n$env?.i | bitshl(0)\n$env?.i | bitushr(i)\n$env?.i | max(1.0)\n$env?.i | max(array)\n$env?.i | mean(i)\n$env?.i | median(0)\n$env?.i | median(1)\n$env?.i | median(1.0)\n$env?.i | median(f64)\n$env?.i | median(i)\n$env?.i | min(1, f64)\n$env?.i | min(f64, 1)\n$env?.i..i\n$env?.list != [1.0]\n$env?.list != array\n$env?.list != list\n$env?.list == [foo, 0]\n$env?.list == array\n$env?.list == list\n$env?.list == nil || $env\n$env?.list ?? $env?.add\n$env?.list ?? add\n$env?.list ?? array\n$env?.list ?? f64\n$env?.list ?? foo\n$env?.list ?? greet\n$env?.list ?? i\n$env?.list ?? nil ?? ok\n$env?.list ?? nil | groupBy(#)\n$env?.list ?? ok\n$env?.list ?? str\n$env?.list ?? toJSON(add)\n$env?.list ?? toPairs($env)\n$env?.list | all(false)\n$env?.list | all(nil == 1)\n$env?.list | all(ok)\n$env?.list | all(true)\n$env?.list | any(f64 >= f64)\n$env?.list | any(false)\n$env?.list | any(ok)\n$env?.list | any(true)\n$env?.list | concat(list)\n$env?.list | count(false)\n$env?.list | count(ok)\n$env?.list | count(true)\n$env?.list | filter(ok)\n$env?.list | filter(true)\n$env?.list | find(false)\n$env?.list | find(ok)\n$env?.list | find(true)\n$env?.list | findIndex(!ok)\n$env?.list | findIndex(false)\n$env?.list | findIndex(ok)\n$env?.list | findIndex(true)\n$env?.list | findIndex(true) not in array\n$env?.list | findLast(false)\n$env?.list | findLast(ok)\n$env?.list | findLast(true)\n$env?.list | findLastIndex(#.Bar in #)\n$env?.list | findLastIndex(false)\n$env?.list | findLastIndex(ok)\n$env?.list | findLastIndex(true)\n$env?.list | groupBy(#)\n$env?.list | groupBy(#.Bar)\n$env?.list | groupBy(.Bar)\n$env?.list | groupBy(0)\n$env?.list | groupBy(1)\n$env?.list | groupBy(1.0)\n$env?.list | groupBy(f64)\n$env?.list | groupBy(false)\n$env?.list | groupBy(foo)\n$env?.list | groupBy(i)\n$env?.list | groupBy(ok)\n$env?.list | groupBy(str)\n$env?.list | groupBy(true)\n$env?.list | map(#)\n$env?.list | map(#.Bar)\n$env?.list | map(#.String)\n$env?.list | map(#index)\n$env?.list | map($env)\n$env?.list | map(.Bar)\n$env?.list | map(.String)\n$env?.list | map(0)\n$env?.list | map(1)\n$env?.list | map(1.0)\n$env?.list | map(add)\n$env?.list | map(array)\n$env?.list | map(false)\n$env?.list | map(foo)\n$env?.list | map(greet)\n$env?.list | map(i)\n$env?.list | map(list)\n$env?.list | map(ok)\n$env?.list | map(str)\n$env?.list | map(true)\n$env?.list | none(.Bar not startsWith #.Bar)\n$env?.list | none(false)\n$env?.list | none(ok)\n$env?.list | none(true)\n$env?.list | one(false)\n$env?.list | one(ok)\n$env?.list | reduce(#)\n$env?.list | reduce(#, f64)\n$env?.list | reduce(#, false)\n$env?.list | reduce(#, foo)\n$env?.list | reduce(#, i)\n$env?.list | reduce(#.Bar)\n$env?.list | reduce(#.Bar, 0)\n$env?.list | reduce(#.String, $env)\n$env?.list | reduce(#acc)\n$env?.list | reduce(#acc, 1)\n$env?.list | reduce(#acc, true)\n$env?.list | reduce(#index)\n$env?.list | reduce($env)\n$env?.list | reduce($env, greet)\n$env?.list | reduce($env, true)\n$env?.list | reduce(.Bar)\n$env?.list | reduce(.String, $env)\n$env?.list | reduce(0)\n$env?.list | reduce(1)\n$env?.list | reduce(1.0)\n$env?.list | reduce(1.0, list)\n$env?.list | reduce(add)\n$env?.list | reduce(array)\n$env?.list | reduce(array, $env)\n$env?.list | reduce(f64 == 1)\n$env?.list | reduce(f64, $env)\n$env?.list | reduce(false)\n$env?.list | reduce(foo)\n$env?.list | reduce(foo, nil)\n$env?.list | reduce(foo, ok)\n$env?.list | reduce(foo, str)\n$env?.list | reduce(greet)\n$env?.list | reduce(greet, ok)\n$env?.list | reduce(list)\n$env?.list | reduce(ok)\n$env?.list | reduce(str)\n$env?.list | reduce(str, nil)\n$env?.list | reduce(true)\n$env?.list | reduce(true, i)\n$env?.list | sortBy(#.Bar)\n$env?.list | sortBy(.Bar)\n$env?.list | sortBy(0)\n$env?.list | sortBy(1)\n$env?.list | sortBy(1.0)\n$env?.list | sortBy(str)\n$env?.list | sum(0)\n$env?.list | sum(1)\n$env?.list | sum(1.0)\n$env?.list | sum(f64)\n$env?.list | sum(i)\n$env?.list | take(1)\n$env?.list?.[i]\n$env?.list?.[i].Bar\n$env?.list?.[i].String\n$env?.list[:]\n$env?.list[:i]\n$env?.list[i:]\n$env?.nil != $env?.[String]\n$env?.nil != array\n$env?.nil != greet\n$env?.nil == array\n$env?.nil == foo.Bar\n$env?.nil ?? foo.String\n$env?.nil ?? str\n$env?.nil contains $env?.[nil]\n$env?.nil in list\n$env?.nil matches str\n$env?.nil not in array\n$env?.nil startsWith str\n$env?.nil.Bar || true\n$env?.nil?.$env.foo\n$env?.nil?.Bar\n$env?.nil?.Bar()\n$env?.nil?.Bar(list)\n$env?.nil?.Bar?.String(Bar)\n$env?.nil?.Bar?.[i]\n$env?.nil?.Bar?.[list]\n$env?.nil?.String\n$env?.nil?.String()\n$env?.nil?.String(i)\n$env?.nil?.String.i\n$env?.nil?.String?.ok()\n$env?.nil?.[add]\n$env?.nil?.[add]?.[greet]\n$env?.nil?.[add]?.str\n$env?.nil?.[array]\n$env?.nil?.[array].Bar\n$env?.nil?.[array]?.String\n$env?.nil?.[f64]\n$env?.nil?.[f64]?.f64\n$env?.nil?.[foo]\n$env?.nil?.[foo]?.ok\n$env?.nil?.[greet]\n$env?.nil?.[greet]?.ok\n$env?.nil?.[i]\n$env?.nil?.[i]?.Bar\n$env?.nil?.[i]?.[foo]\n$env?.nil?.[list]\n$env?.nil?.[ok]\n$env?.nil?.[ok]?.str\n$env?.nil?.[str]\n$env?.nil?.[str]?.i\n$env?.nil?.[str]?.str\n$env?.nil?.add\n$env?.nil?.add()\n$env?.nil?.add(foobar)\n$env?.nil?.array\n$env?.nil?.array()\n$env?.nil?.array(str)\n$env?.nil?.array?.foo\n$env?.nil?.array?.list\n$env?.nil?.f64\n$env?.nil?.f64()\n$env?.nil?.f64(foobar != i)\n$env?.nil?.f64?.true?.greet?.foo\n$env?.nil?.filter(0)\n$env?.nil?.filter(1.0)\n$env?.nil?.findIndex(str)\n$env?.nil?.findLast(false)\n$env?.nil?.foo\n$env?.nil?.foo()\n$env?.nil?.foo.foo\n$env?.nil?.foo.i\n$env?.nil?.foo.str\n$env?.nil?.foo?.[add].array\n$env?.nil?.foo?.[f64]\n$env?.nil?.foo?.f64(Bar)\n$env?.nil?.foobar\n$env?.nil?.foobar.ok\n$env?.nil?.foobar?.Bar(foobar, $env)\n$env?.nil?.foobar?.i\n$env?.nil?.greet\n$env?.nil?.greet()\n$env?.nil?.greet?.array\n$env?.nil?.i\n$env?.nil?.i($env.foo)\n$env?.nil?.i()\n$env?.nil?.list\n$env?.nil?.list()\n$env?.nil?.map(foobar)\n$env?.nil?.median(foobar)\n$env?.nil?.ok\n$env?.nil?.ok()\n$env?.nil?.ok(add)\n$env?.nil?.ok(foobar?.[String].add)\n$env?.nil?.ok.add\n$env?.nil?.one(foobar, foobar)\n$env?.nil?.round(1.0)\n$env?.nil?.str\n$env?.nil?.str()\n$env?.nil?.str(foobar)\n$env?.ok && $env?.Bar\n$env?.ok && $env?.[str]\n$env?.ok && $env?.ok\n$env?.ok && nil not in $env\n$env?.ok && ok\n$env?.ok == ok\n$env?.ok ? add : foo\n$env?.ok ? foo == nil : i\n$env?.ok ?: array\n$env?.ok ?: foo\n$env?.ok ?? $env?.[Bar]\n$env?.ok ?? $env?.[add]\n$env?.ok ?? add\n$env?.ok ?? array\n$env?.ok ?? f64\n$env?.ok ?? foo\n$env?.ok ?? greet\n$env?.ok ?? i\n$env?.ok ?? keys($env)\n$env?.ok ?? list\n$env?.ok ?? str\n$env?.ok ?? str ?? $env\n$env?.ok and $env?.[String]\n$env?.ok and 1.0 == i\n$env?.ok and foo != foo\n$env?.ok and ok\n$env?.ok not in $env && false\n$env?.ok or !true\n$env?.ok or $env != $env\n$env?.ok or $env in str\n$env?.ok or i != 1.0\n$env?.ok or nil not in $env\n$env?.ok or ok\n$env?.ok || $env?.Bar()\n$env?.ok || ok\n$env?.ok || sum($env)\n$env?.str != 1.0 ?? foo\n$env?.str + str\n$env?.str < foo.Bar\n$env?.str < str\n$env?.str < type(add)\n$env?.str <= $env?.str\n$env?.str <= foo.Bar\n$env?.str <= str\n$env?.str <= string(str)\n$env?.str == str\n$env?.str > str\n$env?.str > str == nil\n$env?.str > toJSON(nil)\n$env?.str >= foo?.Bar\n$env?.str ?? $env.ok\n$env?.str ?? $env?.String()\n$env?.str ?? add\n$env?.str ?? array\n$env?.str ?? f64\n$env?.str ?? foo\n$env?.str ?? greet\n$env?.str ?? list\n$env?.str ?? not ok\n$env?.str ?? ok\n$env?.str ?? str\n$env?.str contains $env?.[Bar]\n$env?.str contains foo?.Bar\n$env?.str contains str\n$env?.str endsWith $env and false\n$env?.str endsWith str\n$env?.str endsWith toJSON(foo)\n$env?.str in $env ? 1.0 : nil\n$env?.str in $env?.[String]\n$env?.str in foo\n$env?.str matches $env?.[String]\n$env?.str matches str\n$env?.str not contains str\n$env?.str not endsWith str\n$env?.str not in $env?.[String]\n$env?.str not in foo\n$env?.str not in {foo: greet, foo: nil}\n$env?.str not matches foo.Bar\n$env?.str not matches str\n$env?.str not startsWith $env.str\n$env?.str not startsWith foo?.Bar\n$env?.str not startsWith str\n$env?.str startsWith $env?.Bar\n$env?.str | date(str)\n$env?.str | greet()\n$env?.str | trim(str)\n$env?.str | trimPrefix(str)\n$env?.str[:0 ?? false]\n$env?.str[:]\n$env?.str[:i]\n$env?.str[i:]\n$env?.true != i\n$env?.true != ok\n$env?.true == foo\n$env?.true == i\n$env?.true ?? foo.Bar\n$env?.true not endsWith str\n$env?.true not matches str\n$env?.true | get(array)\n$env?.true?.Bar\n$env?.true?.Bar()\n$env?.true?.Bar(false)\n$env?.true?.String\n$env?.true?.String()\n$env?.true?.String().add\n$env?.true?.String.foo(foobar)\n$env?.true?.String?.Bar.str\n$env?.true?.[add]\n$env?.true?.[array]\n$env?.true?.[array].Bar\n$env?.true?.[array].add()\n$env?.true?.[f64]\n$env?.true?.[f64]?.String()\n$env?.true?.[f64]?.[list]\n$env?.true?.[foo]\n$env?.true?.[greet]\n$env?.true?.[greet].Bar\n$env?.true?.[greet]?.ok\n$env?.true?.[i]\n$env?.true?.[list]\n$env?.true?.[ok]\n$env?.true?.[ok]?.[ok]\n$env?.true?.[str]\n$env?.true?.[str].foo\n$env?.true?.add\n$env?.true?.add(foobar matches foo)\n$env?.true?.add.foo\n$env?.true?.array\n$env?.true?.array()\n$env?.true?.f64\n$env?.true?.f64()\n$env?.true?.f64(foobar)\n$env?.true?.find(foobar, foobar)\n$env?.true?.foo\n$env?.true?.foo()\n$env?.true?.foo?.[ok]\n$env?.true?.foobar\n$env?.true?.foobar?.str\n$env?.true?.greet\n$env?.true?.greet()\n$env?.true?.greet().i\n$env?.true?.greet?.ok\n$env?.true?.i\n$env?.true?.i()\n$env?.true?.list\n$env?.true?.list()\n$env?.true?.list.foo\n$env?.true?.ok\n$env?.true?.ok()\n$env?.true?.reduce(array)\n$env?.true?.str\n$env?.true?.str()\n$env?.true?.true?.array\n$env[$env:] - f64 and false\n$env[:str] not in foo || true\n- + $env || true\n- + $env.f64\n- + $env.i\n- + $env?.f64\n- + $env?.i\n- + 1 != f64\n- + 1 < 1.0\n- + 1 ^ 1\n- + 1.0 != 1.0\n- + abs(i)\n- + ceil(0)\n- + f64\n- + f64 + f64\n- + f64 - 1.0\n- + f64 > 0\n- + i\n- + i < 1\n- + i in $env.array\n- + int(0)\n- + median(f64)\n- + min(f64)\n- + sum(array)\n- + {foo: 1}.foo\n- - $env?.f64\n- - $env?.i\n- - 0 <= 1.0\n- - 0 >= 1.0\n- - 0 ^ 0\n- - 0 ^ 1\n- - 1 == 1.0\n- - 1.0 != nil\n- - 1.0 ** 1.0\n- - 1.0 < 1\n- - 1.0 == 0\n- - abs(1)\n- - array?.[i]\n- - ceil(1.0)\n- - f64\n- - i\n- - i != $env\n- - len($env)\n- - max(1.0)\n- - sum(array)\n-$env && false\n-$env and false\n-$env in str && false\n-$env not in foo || true\n-$env or true\n-$env || true\n-$env.f64\n-$env.f64 - i\n-$env.f64 ?? i\n-$env.i\n-$env.i / i\n-$env.i ?? add\n-$env?.[str]?.[f64]\n-$env?.array?.[i]\n-$env?.f64\n-$env?.i\n-$env?.i != $env\n-$env?.i == f64\n--$env.f64\n--$env?.f64\n--$env?.i\n--0\n--0 .. i\n--0 ?? array\n--1\n--1 < 1.0\n--1.0\n--1.0 - 1.0\n--bitnot(0)\n--f64\n--f64 / f64\n--i\n--sum(array)\n-.0 ** 0\n-.0 / 1\n-0 != $env\n-0 != 0\n-0 != 1\n-0 != 1.0\n-0 != f64\n-0 != i\n-0 != mean(f64)\n-0 != min($env)\n-0 != nil\n-0 % 1\n-0 % i\n-0 % i + f64\n-0 * 0\n-0 * 1\n-0 * 1.0\n-0 * f64\n-0 * i\n-0 ** 0\n-0 ** 1\n-0 ** 1.0\n-0 ** 1.0 < i\n-0 ** 1.0 ?? list\n-0 ** i\n-0 + -f64\n-0 + 0\n-0 + 1\n-0 + 1.0\n-0 + f64\n-0 + f64 != 1.0\n-0 + i\n-0 - 0\n-0 - 1\n-0 - 1.0\n-0 - f64\n-0 - floor(f64)\n-0 - i\n-0 .. 0\n-0 .. 1\n-0 .. i\n-0 / 0\n-0 / 1\n-0 / 1.0\n-0 / f64\n-0 / i\n-0 < 0\n-0 < 1\n-0 < 1.0\n-0 < f64\n-0 < i\n-0 <= 0\n-0 <= 1\n-0 <= 1.0\n-0 <= f64\n-0 <= i\n-0 == $env\n-0 == $env?.Bar\n-0 == $env?.[Bar]\n-0 == 0\n-0 == 1\n-0 == 1.0\n-0 == f64\n-0 == i\n-0 == mean(1.0)\n-0 == nil\n-0 > 0\n-0 > 1\n-0 > 1.0\n-0 > f64\n-0 > i\n-0 >= 0\n-0 >= 0 || false\n-0 >= 1\n-0 >= 1.0\n-0 >= f64\n-0 >= i\n-0 ?? $env\n-0 ?? 0\n-0 ?? 1\n-0 ?? 1.0\n-0 ?? add\n-0 ?? array\n-0 ?? f64\n-0 ?? false\n-0 ?? foo\n-0 ?? foo.Bar\n-0 ?? foo?.Bar\n-0 ?? greet\n-0 ?? i\n-0 ?? list\n-0 ?? min(0, i)\n-0 ?? nil\n-0 ?? ok\n-0 ?? str\n-0 ?? true\n-0 ^ 0\n-0 ^ 0 | max(1)\n-0 ^ 1\n-0 ^ 1.0\n-0 ^ 1.0 <= 1\n-0 ^ f64\n-0 ^ i\n-0 in $env?.array\n-0 in array\n-0 not in array\n-0 | bitshl(i)\n-0 | bitushr(1)\n-0 | max(array)\n-0 | mean(0)\n-0 | mean(1.0)\n-0 | median(1.0)\n-0 | median(i)\n-0.0\n-0.1\n-1 != $env\n-1 != 0\n-1 != 1\n-1 != 1.0\n-1 != 1.0 || true\n-1 != f64\n-1 != i\n-1 != mean(array)\n-1 != nil\n-1 % 1\n-1 % i\n-1 * 0\n-1 * 1\n-1 * 1.0\n-1 * 1.0 - i\n-1 * f64\n-1 * i\n-1 ** 0\n-1 ** 1\n-1 ** 1.0\n-1 ** f64\n-1 ** i\n-1 + 0\n-1 + 1\n-1 + 1 ^ f64\n-1 + 1.0\n-1 + f64\n-1 + float(i)\n-1 + i\n-1 - 0\n-1 - 1\n-1 - 1.0\n-1 - f64\n-1 - i\n-1 .. 0\n-1 .. 1\n-1 .. i\n-1 / 0\n-1 / 1\n-1 / 1.0\n-1 / f64\n-1 / i\n-1 < 0\n-1 < 1\n-1 < 1.0\n-1 < f64\n-1 < i\n-1 <= -0\n-1 <= 0\n-1 <= 1\n-1 <= 1.0\n-1 <= f64\n-1 <= i\n-1 == $env\n-1 == 0\n-1 == 1\n-1 == 1.0\n-1 == 1.0 * 1\n-1 == f64\n-1 == i\n-1 == nil\n-1 == nil != false\n-1 > 0\n-1 > 1\n-1 > 1.0\n-1 > f64\n-1 > i\n-1 >= 0\n-1 >= 0 + i\n-1 >= 1\n-1 >= 1.0\n-1 >= f64\n-1 >= i\n-1 ?? $env\n-1 ?? $env.ok\n-1 ?? $env?.greet\n-1 ?? 0\n-1 ?? 1\n-1 ?? 1.0\n-1 ?? add\n-1 ?? array\n-1 ?? array ?? $env\n-1 ?? f64\n-1 ?? false\n-1 ?? foo\n-1 ?? greet\n-1 ?? i\n-1 ?? list\n-1 ?? nil\n-1 ?? ok\n-1 ?? str\n-1 ?? str && false\n-1 ?? sum($env, list)\n-1 ?? true\n-1 ?? type(i)\n-1 ^ $env?.i\n-1 ^ 0\n-1 ^ 1\n-1 ^ 1.0\n-1 ^ f64\n-1 ^ i\n-1 ^ i <= 1\n-1 in array\n-1 not in $env.array\n-1 not in array\n-1 | bitnand(0)\n-1 | bitnand(1)\n-1 | bitor(1)\n-1 | bitshr(1)\n-1 | bitushr(i)\n-1 | bitxor(i)\n-1 | max(1.0)\n-1 | max(array)\n-1 | mean(0)\n-1 | mean(1)\n-1 | mean(1.0)\n-1 | mean(f64)\n-1 | median(1, 0)\n-1 | min(f64)\n-1..i\n-1.0\n-1.0 != $env\n-1.0 != $env?.[Bar]\n-1.0 != $env?.i\n-1.0 != 0\n-1.0 != 1\n-1.0 != 1.0\n-1.0 != 1.0 == $env?.[String]\n-1.0 != f64\n-1.0 != i\n-1.0 != nil\n-1.0 * $env?.i\n-1.0 * -1\n-1.0 * 0\n-1.0 * 1\n-1.0 * 1.0\n-1.0 * f64\n-1.0 * i\n-1.0 ** 0\n-1.0 ** 1\n-1.0 ** 1.0\n-1.0 ** f64\n-1.0 ** i\n-1.0 + 0\n-1.0 + 1\n-1.0 + 1.0\n-1.0 + f64\n-1.0 + i\n-1.0 + i != 1.0\n-1.0 - $env?.i\n-1.0 - 0\n-1.0 - 1\n-1.0 - 1.0\n-1.0 - f64\n-1.0 - i\n-1.0 / $env.i\n-1.0 / 0\n-1.0 / 1\n-1.0 / 1.0\n-1.0 / f64\n-1.0 / i\n-1.0 < 0\n-1.0 < 0 ** 1.0\n-1.0 < 1\n-1.0 < 1.0\n-1.0 < f64\n-1.0 < i\n-1.0 < mean(i, 1.0)\n-1.0 <= 0\n-1.0 <= 1\n-1.0 <= 1.0\n-1.0 <= f64\n-1.0 <= f64 != $env\n-1.0 <= i\n-1.0 == $env\n-1.0 == $env?.[String]\n-1.0 == $env?.[str]\n-1.0 == 0\n-1.0 == 1\n-1.0 == 1 && false\n-1.0 == 1.0\n-1.0 == f64\n-1.0 == f64 ?? add\n-1.0 == i\n-1.0 == nil\n-1.0 > 0\n-1.0 > 1\n-1.0 > 1.0\n-1.0 > f64\n-1.0 > i\n-1.0 >= -f64\n-1.0 >= 0\n-1.0 >= 1\n-1.0 >= 1.0\n-1.0 >= 1.0 >= 1\n-1.0 >= f64\n-1.0 >= i\n-1.0 ?? !true\n-1.0 ?? $env\n-1.0 ?? $env?.add\n-1.0 ?? -f64\n-1.0 ?? 0\n-1.0 ?? 1\n-1.0 ?? 1.0\n-1.0 ?? add\n-1.0 ?? array\n-1.0 ?? f64\n-1.0 ?? false\n-1.0 ?? foo\n-1.0 ?? greet\n-1.0 ?? i\n-1.0 ?? list\n-1.0 ?? nil\n-1.0 ?? ok\n-1.0 ?? str\n-1.0 ?? true\n-1.0 ^ 0\n-1.0 ^ 1\n-1.0 ^ 1.0\n-1.0 ^ 1.0 <= 1.0\n-1.0 ^ array?.[i]\n-1.0 ^ f64\n-1.0 ^ i\n-1.0 in array\n-1.0 not in $env?.Bar\n-1.0 not in array\n-1.0 | max(f64)\n-1.0 | mean(1)\n-1.0 | mean(1.0, f64)\n-1.0 | median(1.0)\n-1.0 | median(i)\n-1.0 | min(0)\n-1.0 | min(1)\n-1.0 | min(1.0)\n-1.0 | min(array)\n-1.0 | min(array, 1.0)\n-1.0; false\n-1.1\n-abs(0)\n-abs(1 * i)\n-abs(1)\n-abs(1.0)\n-abs(f64)\n-abs(i)\n-abs(reduce(array, 0))\n-add(0, 1)\n-add(1, 1)\n-add(i, 0)\n-add(i, 1)\n-array?.[0]\n-array?.[1]\n-array?.[i]\n-bitnand(0, 1)\n-bitnand(1, i)\n-bitnot(0)\n-bitnot(1)\n-bitnot(i)\n-bitnot(min(array))\n-bitnot(sum(array))\n-bitshl(0, i)\n-bitshl(1, i)\n-bitshl(i, i)\n-bitshr(1, 0)\n-bitshr(1, i)\n-bitshr(i, 1)\n-bitxor(1, 1)\n-ceil(0)\n-ceil(1)\n-ceil(1.0)\n-ceil(f64)\n-ceil(i)\n-count($env, ok)\n-count($env, true)\n-count(array, false)\n-count(array, ok)\n-count(list, false)\n-count(list, ok)\n-count(list, true)\n-f64\n-f64 != $env\n-f64 != 0\n-f64 != 1\n-f64 != 1.0\n-f64 != f64\n-f64 != i\n-f64 != int(1)\n-f64 != nil\n-f64 * 0\n-f64 * 1\n-f64 * 1.0\n-f64 * f64\n-f64 * i\n-f64 ** 0\n-f64 ** 1\n-f64 ** 1.0\n-f64 ** f64\n-f64 ** i\n-f64 + 0\n-f64 + 1\n-f64 + 1.0\n-f64 + 1.0 / 1\n-f64 + f64\n-f64 + i\n-f64 + sum(array)\n-f64 - 0\n-f64 - 1\n-f64 - 1.0\n-f64 - f64\n-f64 - i\n-f64 / 1\n-f64 / 1.0\n-f64 / 1.0 ?? false\n-f64 / f64\n-f64 / i\n-f64 / i ** 0\n-f64 < 0\n-f64 < 1\n-f64 < 1.0\n-f64 < f64\n-f64 < i\n-f64 <= 0\n-f64 <= 1\n-f64 <= 1.0\n-f64 <= f64\n-f64 <= i\n-f64 == $env\n-f64 == 0\n-f64 == 1\n-f64 == 1.0\n-f64 == 1.0 || $env\n-f64 == f64\n-f64 == i\n-f64 == max(0)\n-f64 == nil\n-f64 > 0\n-f64 > 1\n-f64 > 1.0\n-f64 > f64\n-f64 > f64 <= f64\n-f64 > i\n-f64 >= $env?.i\n-f64 >= 0\n-f64 >= 0 > 0\n-f64 >= 1\n-f64 >= 1.0\n-f64 >= f64\n-f64 >= float(1.0)\n-f64 >= i\n-f64 ?? $env\n-f64 ?? 0\n-f64 ?? 1\n-f64 ?? 1.0\n-f64 ?? add\n-f64 ?? array\n-f64 ?? false\n-f64 ?? foo\n-f64 ?? greet\n-f64 ?? i\n-f64 ?? list\n-f64 ?? nil\n-f64 ?? nil ?? nil\n-f64 ?? ok\n-f64 ?? str\n-f64 ?? string(nil)\n-f64 ?? true\n-f64 ^ 1\n-f64 ^ 1.0\n-f64 ^ f64\n-f64 ^ i\n-f64 in array\n-f64 not in array\n-f64 | mean(0)\n-find(array, ok)\n-find(array, true)\n-findIndex($env, ok)\n-findIndex(list, true)\n-findLast(array, ok)\n-findLastIndex($env, ok)\n-findLastIndex($env, true)\n-findLastIndex(array, ok)\n-findLastIndex(array, true)\n-findLastIndex(list, true)\n-first($env | map(#index))\n-first(array)\n-float(0)\n-float(1)\n-float(1.0 ?? nil)\n-float(1.0)\n-float(f64)\n-float(i)\n-floor($env.i)\n-floor(0)\n-floor(1)\n-floor(1.0)\n-floor(f64)\n-floor(i)\n-i\n-i != $env\n-i != 0\n-i != 1\n-i != 1.0\n-i != ceil(f64)\n-i != f64\n-i != i\n-i != nil\n-i % 1\n-i % i\n-i * 1\n-i * 1.0\n-i * f64\n-i * i\n-i * nil ?? 1.0\n-i ** 0\n-i ** 1.0\n-i ** 1.0 ** f64\n-i ** 1.0 == nil\n-i ** f64\n-i ** i\n-i + 0\n-i + 1\n-i + 1.0\n-i + f64\n-i + i\n-i + median(1.0)\n-i - 0\n-i - 1\n-i - 1.0\n-i - array?.[i]\n-i - f64\n-i - i\n-i .. 0\n-i .. 1\n-i .. i\n-i .. min(1)\n-i / 0\n-i / 1\n-i / 1.0\n-i / f64\n-i / i\n-i < 0\n-i < 1\n-i < 1 and false\n-i < 1.0\n-i < f64\n-i < i\n-i < sum(array)\n-i <= 0\n-i <= 1\n-i <= 1.0\n-i <= f64\n-i <= i\n-i == $env\n-i == 0\n-i == 1.0\n-i == 1.0 * i\n-i == f64\n-i == i\n-i == nil\n-i > 0\n-i > 1\n-i > 1.0\n-i > f64\n-i > i\n-i >= 1\n-i >= 1.0\n-i >= 1.0 ?? foo\n-i >= f64\n-i >= i\n-i >= i || $env\n-i ?? $env\n-i ?? $env.array\n-i ?? $env?.String?.i\n-i ?? $env?.[i]\n-i ?? $env?.add\n-i ?? $env?.i\n-i ?? 0\n-i ?? 1\n-i ?? 1.0\n-i ?? add\n-i ?? array\n-i ?? f64\n-i ?? false\n-i ?? foo\n-i ?? foo?.Bar\n-i ?? greet\n-i ?? i\n-i ?? list\n-i ?? nil\n-i ?? ok\n-i ?? str\n-i ?? true\n-i ^ 0\n-i ^ 0 ?? foo\n-i ^ 1\n-i ^ 1.0\n-i ^ f64\n-i ^ i\n-i ^ i > 1.0\n-i in array\n-i not in array\n-i | add(i)\n-i | bitand(0)\n-i | bitor(0)\n-i | bitshr(1)\n-i | bitxor(1)\n-i | bitxor(i)\n-i | max(1)\n-i | max(f64)\n-i | min(1.0)\n-i..i\n-int($env?.i)\n-int(0)\n-int(1)\n-int(1.0)\n-int(array | max(1))\n-int(f64)\n-int(i)\n-last(array)\n-len($env)\n-len(array)\n-len(foo?.Bar)\n-len(list)\n-len(str)\n-max($env).i\n-max(0 * 1)\n-max(0)\n-max(1)\n-max(1, 1.0)\n-max(1, array)\n-max(1.0)\n-max(1.0, 0)\n-max(1.0, 1.0)\n-max(array)\n-max(array, 0)\n-max(array, i)\n-max(f64)\n-max(f64, 1.0)\n-max(i)\n-max(i, 0)\n-max(i, 1)\n-max(i, array)\n-mean(0)\n-mean(0, f64)\n-mean(1)\n-mean(1, 1)\n-mean(1, f64)\n-mean(1.0)\n-mean(1.0, 0, array)\n-mean(1.0, 1)\n-mean(1.0, 1.0)\n-mean(1.0, i)\n-mean(array)\n-mean(f64)\n-mean(f64, 1)\n-mean(i)\n-mean(i) > f64\n-mean(i, f64)\n-median(0)\n-median(1)\n-median(1) < i\n-median(1.0)\n-median(array)\n-median(array, 1.0)\n-median(f64)\n-median(f64, f64)\n-median(i)\n-median(i, 1)\n-median(min(0))\n-min(0)\n-min(0, 1)\n-min(1)\n-min(1.0)\n-min(1.0, i)\n-min(array)\n-min(array, 0, array)\n-min(array, i, 1.0)\n-min(f64)\n-min(f64, 0, 1.0)\n-min(i)\n-min(i, 1)\n-min(i, 1.0)\n-min(i, 1.0) + f64\n-nil ?? -f64\n-nil ?? 0\n-nil ?? 1\n-nil ?? 1 != nil\n-nil ?? 1.0\n-nil ?? f64\n-nil ?? i\n-nil ?? i / 0\n-reduce($env, 0, nil)\n-reduce($env, i, str)\n-reduce(array, #)\n-reduce(array, #acc)\n-reduce(array, #index, $env)\n-reduce(array, 0)\n-reduce(array, 1)\n-reduce(array, 1, f64)\n-reduce(array, 1.0)\n-reduce(array, f64)\n-reduce(array, i)\n-reduce(list, 1)\n-reduce(list, 1.0)\n-round(0)\n-round(1)\n-round(1.0)\n-round(f64)\n-round(i)\n-sum($env, 0)\n-sum($env, 1)\n-sum($env, 1.0)\n-sum($env, f64)\n-sum($env.array)\n-sum(array)\n-sum(array); str\n-sum(array, #)\n-sum(array, 0)\n-sum(array, 1)\n-sum(array, 1.0)\n-sum(array, i)\n-sum(list | reduce(array, greet))\n-sum(list, 0)\n-sum(list, 1)\n-sum(list, 1.0)\n-sum(list, f64)\n-sum(str ?? 0)\n0 != $env ?: $env?.[i]?.ok\n0 != $env ?: ok\n0 != $env ?? add\n0 != $env ?? array\n0 != $env.f64\n0 != $env.i\n0 != $env?.Bar\n0 != $env?.Bar?.foo()\n0 != $env?.String\n0 != $env?.[Bar]\n0 != $env?.[String]\n0 != $env?.[foobar]\n0 != $env?.[str]\n0 != $env?.f64\n0 != $env?.foobar?.foo\n0 != $env?.i\n0 != $env?.not\n0 != 0 % sum(array)\n0 != 0 && $env == foo\n0 != 0 - i\n0 != 0 ?: array\n0 != 0 ?? f64\n0 != 0 ^ 1.0 ^ 1\n0 != 0 or 0 != f64\n0 != 1.0 && ok ?? greet\n0 != 1.0 * $env.f64\n0 != 1.0 * i\n0 != 1.0 + f64 ** 1.0\n0 != 1.0 / i * 1.0\n0 != 1.0 ?? ok\n0 != 1.0 || $env - i\n0 != array?.[i]\n0 != f64 - $env?.i\n0 != f64 / f64\n0 != f64 == $env?.Bar\n0 != f64 ^ 1.0 or $env\n0 != f64 || $env?.[ok]\n0 != f64 || nil == str\n0 != f64 || ok\n0 != foo ?? list\n0 != i ** i\n0 != i ^ f64\n0 != nil != ok\n0 != nil || $env?.[String]\n0 != ok ?? $env?.Bar\n0 != ok ?? i\n0 != true ?? foo?.Bar\n0 % $env.i\n0 % $env?.i\n0 % 1 * i\n0 % 1 + i >= 0\n0 % 1 < array?.[i]\n0 % 1 > -1\n0 % 1 > count(array, false)\n0 % 1 >= i\n0 % 1 in array != $env\n0 % 1 | median(f64)\n0 % array?.[i]\n0 % i * i\n0 % i <= f64\n0 % i | mean(f64)\n0 * $env.f64\n0 * $env.i\n0 * $env?.f64\n0 * $env?.i\n0 * 0 != f64\n0 * 0 == i\n0 * 0 ?? foo\n0 * 1 != i\n0 * 1 + f64\n0 * 1 < f64\n0 * 1 | bitshl(0)\n0 * 1.0 != i\n0 * 1.0 != nil or ok\n0 * 1.0 ** i\n0 * 1.0 < f64\n0 * array?.[i]\n0 * f64 + i\n0 * f64 <= f64\n0 * f64 == f64 || ok\n0 * i != i\n0 * i ^ f64\n0 * i not in groupBy(array, foo)\n0 * i | max(0)\n0 ** $env.f64\n0 ** $env.i\n0 ** $env?.f64\n0 ** $env?.i\n0 ** 0 != $env?.i\n0 ** 0 + $env.i\n0 ** 0 >= i\n0 ** 0 | max(1.0)\n0 ** 1 > i\n0 ** 1 | max(1)\n0 ** 1.0 ** f64\n0 ** 1.0 / f64\n0 ** 1.0 < i\n0 ** 1.0 == i\n0 ** 1.0 > i\n0 ** 1.0 >= floor(i)\n0 ** 1.0 ?? f64\n0 ** 1.0 ^ i\n0 ** 1.0 | max(f64)\n0 ** array?.[i]\n0 ** f64 == nil || false\n0 ** f64 >= $env?.f64\n0 ** i != f64\n0 ** i ?? ok\n0 ** i ^ $env?.f64\n0 + $env.f64\n0 + $env.i\n0 + $env?.[str]?.[i]\n0 + $env?.f64\n0 + $env?.i\n0 + 0 != f64\n0 + 0 - f64\n0 + 0 / i\n0 + 0 >= f64 <= $env\n0 + 0 ^ i\n0 + 0 in array\n0 + 1 + i\n0 + 1 <= $env.i\n0 + 1 <= f64\n0 + 1 == $env.f64\n0 + 1 | min(0)\n0 + 1.0 + i\n0 + 1.0 <= f64\n0 + 1.0 > f64\n0 + 1.0 >= i\n0 + 1.0 ?? i\n0 + 1.0 ^ f64\n0 + array?.[i]\n0 + f64 > i\n0 + i != f64\n0 + i * f64\n0 + i ** i\n0 + i < $env?.f64\n0 - $env.f64\n0 - $env.i\n0 - $env?.f64\n0 - $env?.i\n0 - 0 != bitand(0, i)\n0 - 0 < f64\n0 - 0 == i\n0 - 1 ** f64\n0 - 1 + f64\n0 - 1 < $env.i\n0 - 1 < sum(array)\n0 - 1 >= -f64\n0 - 1 ?? array\n0 - 1 ?? str\n0 - 1.0 + i\n0 - array?.[i]\n0 - f64 <= f64\n0 - f64 > f64\n0 - f64 >= f64 * i\n0 - f64 >= i\n0 - i ?? f64\n0 - i ?? foo\n0 - nil ?? i\n0 .. $env.i\n0 .. $env?.i\n0 .. 0 ?? toJSON(i)\n0 .. 0 | find(ok)\n0 .. 0 | map(#)\n0 .. 0 | map(#index)\n0 .. 0 | map(true)\n0 .. 0 | max(1.0)\n0 .. 0 | reduce(#)\n0 .. 0 | reduce(str)\n0 .. 1 | get(1)\n0 .. 1 | map(#)\n0 .. 1 | map(array)\n0 .. 1 | map(foo)\n0 .. 1 | reduce(#)\n0 .. 1 | reduce($env)\n0 .. 1 | reduce(add)\n0 .. 1 | sortBy(#)\n0 .. 1 | sum(#)\n0 .. 1.0 ?? foo\n0 .. array?.[i]\n0 .. i | any(false)\n0 .. i | groupBy(foo)\n0 .. i | map(str)\n0 .. i | median(f64)\n0 .. i | one(false)\n0 .. i | reduce(list, add)\n0 .. i | sortBy(1)\n0 / $env != 1 and false\n0 / $env.f64\n0 / $env.f64 ** f64\n0 / $env.i\n0 / $env?.f64\n0 / $env?.i\n0 / 0 * i\n0 / 0 + ceil(1.0)\n0 / 0 / i\n0 / 0 > f64\n0 / 1 / f64\n0 / 1 == $env?.String\n0 / 1.0 * f64\n0 / 1.0 + $env.i\n0 / 1.0 > f64\n0 / 1.0 ?? $env ?? i\n0 / 1.0 ?? date(nil, foo)\n0 / 1.0 ?? foo\n0 / 1.0 ?? list ?? 1.0\n0 / array?.[i]\n0 / f64 - f64\n0 / f64 <= f64\n0 / f64 | median(f64)\n0 / i + i\n0 / i / 1.0 ?? 0\n0 / i <= 0 != nil\n0 / i == f64\n0 / i > f64\n0 / i ?? i\n0 / i not in concat(list)\n0 < $env.f64\n0 < $env.i\n0 < $env?.[str]?.[f64]\n0 < $env?.f64\n0 < $env?.i\n0 < 0 != ok\n0 < 0 + len(str)\n0 < 0 ?? date(1)\n0 < 0 ?? ok\n0 < 1 % i\n0 < 1 - i\n0 < 1 >= i\n0 < 1 ^ median(1.0)\n0 < 1 and foo ?? 1.0\n0 < 1.0 * 1 != false\n0 < 1.0 - f64\n0 < 1.0 / i\n0 < 1.0 <= i\n0 < 1.0 > i\n0 < array?.[i]\n0 < f64 + i\n0 < f64 - f64\n0 < f64 ? array : list\n0 < f64 ?? array\n0 < f64 ^ 0 / i\n0 < f64 || $env?.ok\n0 < i + i\n0 < i < i\n0 < i <= reduce(array, #)\n0 <= $env.f64\n0 <= $env.i\n0 <= $env?.f64\n0 <= $env?.i\n0 <= 0 ?? ok\n0 <= 1 * i\n0 <= 1 <= f64\n0 <= 1 ^ f64\n0 <= 1 or $env != 1\n0 <= 1.0 * f64\n0 <= array?.[i]\n0 <= f64 - f64 or $env\n0 <= f64 > f64\n0 <= f64 ?? add\n0 <= f64 or !$env\n0 <= i % i\n0 <= i ^ 1.0 <= 1.0\n0 <= i || ok\n0 <= nil ?? f64\n0 == $env == 0 ?? 1.0\n0 == $env or $env.ok\n0 == $env or ok\n0 == $env || ok\n0 == $env.f64\n0 == $env.i\n0 == $env?.Bar\n0 == $env?.Bar?.foo\n0 == $env?.String\n0 == $env?.String?.str\n0 == $env?.[Bar | get(foo)]\n0 == $env?.[Bar]\n0 == $env?.[String]\n0 == $env?.[first(0, ok)]\n0 == $env?.[foobar]\n0 == $env?.[foobar]?.add\n0 == $env?.[str]\n0 == $env?.f64\n0 == $env?.i\n0 == 0 * f64\n0 == 0 * i\n0 == 0 not in $env?.foobar\n0 == 1.0 && f64 + $env\n0 == 1.0 / i\n0 == add ?? f64\n0 == array?.[i]\n0 == f64 - 1 and false\n0 == f64 ?: add\n0 == f64 ?? ok\n0 == false ?? str\n0 == foo ?? $env?.add\n0 == i and $env?.[foo]\n0 == nil and $env matches str\n0 == str ?? greet\n0 == true ?? list\n0 > $env.f64\n0 > $env.i\n0 > $env?.[str]?.[f64]\n0 > $env?.f64\n0 > $env?.i\n0 > 0 * f64\n0 > 0 / i\n0 > 0 == ok\n0 > 0 > ceil($env)\n0 > 0 or foo == nil\n0 > 1 - i\n0 > 1.0 != str ?? i\n0 > 1.0 ** f64\n0 > 1.0 / f64\n0 > 1.0 >= f64 or ok\n0 > 1.0 ^ f64\n0 > array?.[i]\n0 > f64 > $env?.[Bar]\n0 > f64 > f64\n0 > f64 ?? f64\n0 > f64 and $env?.[greet]\n0 > i > i\n0 > i and foo == nil\n0 >= $env.f64\n0 >= $env.i\n0 >= $env?.f64\n0 >= $env?.i\n0 >= 0 ** i\n0 >= 0 ?? list\n0 >= 0 or str != nil\n0 >= 1 >= i\n0 >= 1 ?? add\n0 >= 1 ?? i\n0 >= 1.0 ** i\n0 >= 1.0 / 1 ** 1\n0 >= 1.0 ?? list\n0 >= 1.0 ?? ok\n0 >= 1.0 ^ i\n0 >= 1.0 and ok\n0 >= 1.0 or ok\n0 >= array?.[i]\n0 >= f64 ** f64\n0 >= f64 + f64\n0 >= f64 <= $env?.i\n0 >= f64 >= $env?.[foo]\n0 >= i > i\n0 >= i >= 1.0 - $env\n0 >= nil ?? f64\n0 ?? $env ?? str\n0 ?? $env | max(1.0)\n0 ?? $env.add\n0 ?? $env.array\n0 ?? $env.foo\n0 ?? $env.greet\n0 ?? $env.i\n0 ?? $env.list\n0 ?? $env.ok\n0 ?? $env.str\n0 ?? $env?.Bar\n0 ?? $env?.String\n0 ?? $env?.String()\n0 ?? $env?.String(greet())\n0 ?? $env?.[Bar]\n0 ?? $env?.[String]\n0 ?? $env?.[String].String\n0 ?? $env?.[add(0)]\n0 ?? $env?.[add]\n0 ?? $env?.[add]?.[array]\n0 ?? $env?.[array]\n0 ?? $env?.[date($env)]\n0 ?? $env?.[f64]\n0 ?? $env?.[foo]\n0 ?? $env?.[greet]\n0 ?? $env?.[i]\n0 ?? $env?.[list]\n0 ?? $env?.[nil | date(1, foobar)]\n0 ?? $env?.[ok]\n0 ?? $env?.[str]\n0 ?? $env?.add\n0 ?? $env?.array\n0 ?? $env?.f64\n0 ?? $env?.foo\n0 ?? $env?.foobar\n0 ?? $env?.greet\n0 ?? $env?.i\n0 ?? $env?.list\n0 ?? $env?.ok\n0 ?? $env?.str\n0 ?? $env[:String matches $env]\n0 ?? $env[:add(greet, str)]\n0 ?? $env[:count(foo)]\n0 ?? $env[:foo]\n0 ?? $env[:foobar and foobar]\n0 ?? $env[:foobar | filter(#.i)]\n0 ?? $env[:foobar.add]\n0 ?? $env[:greet.ok]\n0 ?? $env[String():add(list)]\n0 ?? $env[i:foobar]\n0 ?? 1 ?? i\n0 ?? 1 ?? str\n0 ?? 1.0 ?? i\n0 ?? add ?? i\n0 ?? array?.[array?.[i]]\n0 ?? array?.[i]\n0 ?? f64 | mean(0)\n0 ?? foo | get(foo)\n0 ?? foo.Bar\n0 ?? foo.String\n0 ?? foo.String()\n0 ?? foo?.Bar\n0 ?? foo?.String\n0 ?? foo?.String()\n0 ?? i ?? foo\n0 ?? list ?? greet\n0 ?? list?.[i]\n0 ?? ok ?? i\n0 ?? true ?? foo\n0 ^ $env.f64\n0 ^ $env.i\n0 ^ $env?.f64\n0 ^ $env?.i\n0 ^ 1 * i\n0 ^ 1 ** i\n0 ^ 1 / f64\n0 ^ 1.0 != $env?.f64\n0 ^ 1.0 != i\n0 ^ 1.0 + f64\n0 ^ 1.0 / f64\n0 ^ 1.0 >= f64\n0 ^ 1.0 ?? $env.ok\n0 ^ 1.0 ?? 1.0 > f64\n0 ^ 1.0 in array\n0 ^ array?.[i]\n0 ^ f64 == i\n0 ^ i == i\n0 ^ i ?? i\n0 in $env.array\n0 in $env?.Bar\n0 in $env?.Bar?.greet\n0 in $env?.String\n0 in $env?.[Bar]\n0 in $env?.[String]\n0 in $env?.[String]?.array\n0 in $env?.array\n0 in array != ok\n0 in nil ?? array\n0 not in $env.array\n0 not in $env?.Bar\n0 not in $env?.String\n0 not in $env?.String?.[array]\n0 not in $env?.[Bar]\n0 not in $env?.[String]\n0 not in $env?.[foobar]\n0 not in $env?.array\n0 not in $env?.foobar\n0 | add(0) ^ f64\n0 | bitnand(0) > i\n0 | bitor($env) == 1 and false\n0 | bitshl(1) / f64\n0 | bitshr(0); array; greet\n0 | bitxor(0) in array\n0 | max(0) in array\n0 | max(array, 1.0) - floor(i)\n0 | mean(i) ?? f64\n0 | min(0) | mean(1)\n0 | min(1) ** f64\n0..array?.[i]\n0..i | count(true)\n0..i | groupBy(#)\n0..i | groupBy(f64)\n0..i | map(1.0)\n0..i | map(list)\n0.0 != f64\n0.0 + 0 == $env\n0.1 != floor(1.0)\n0.1 | mean(f64)\n0.1 | min(1.0)\n0; $env.add\n0; $env?.add\n1 != $env not in [true]\n1 != $env.f64\n1 != $env.i\n1 != $env?.Bar\n1 != $env?.Bar?.array\n1 != $env?.String\n1 != $env?.String?.f64\n1 != $env?.[Bar]\n1 != $env?.[Bar]?.f64\n1 != $env?.[Bar]?.greet\n1 != $env?.[String]\n1 != $env?.[foobar]\n1 != $env?.[str]\n1 != $env?.f64\n1 != $env?.foobar\n1 != $env?.i\n1 != 0 * f64\n1 != 0 ?? list\n1 != 1 - f64\n1 != 1 ?? list\n1 != 1 ?? ok\n1 != 1.0 && 0 == 1.0\n1 != 1.0 + i\n1 != 1.0 ^ f64\n1 != array ?? list\n1 != array?.[i]\n1 != f64 && $env?.[str]\n1 != f64 ** f64\n1 != f64 || $env?.[ok]\n1 != f64 || ok\n1 != false ?? foo\n1 != foo ?? f64\n1 != i != ok\n1 != i + f64\n1 != i - f64\n1 != i ?? greet\n1 != i ^ f64\n1 != list ?? array ?: list\n1 != nil or ok\n1 % $env.i\n1 % $env?.i\n1 % 1 > f64\n1 % 1 ?? list\n1 % array?.[i]\n1 % i + f64\n1 % i < f64\n1 % i >= i\n1 * $env.f64\n1 * $env.i\n1 * $env.i + f64\n1 * $env?.f64\n1 * $env?.i\n1 * 0 / f64\n1 * 0 < f64\n1 * 0 == {foo: 1.0}?.array\n1 * 0 not in $env?.[Bar]\n1 * 0 | bitushr(0)\n1 * 1 == i\n1 * 1 | bitnand(0)\n1 * 1 | min(f64)\n1 * 1.0 * 1.0 * i\n1 * 1.0 ** $env.i\n1 * 1.0 < f64\n1 * 1.0 <= ceil(0)\n1 * 1.0 <= f64\n1 * 1.0 ?? foo\n1 * array?.[i]\n1 * f64 * f64\n1 * f64 * i\n1 * f64 / min(0)\n1 * f64 ^ f64 - 1\n1 * f64 | mean(1)\n1 * i + bitnot(0)\n1 * i - f64\n1 * i / i\n1 * i | bitxor(i)\n1 * nil ?? $env?.f64\n1 ** $env.f64\n1 ** $env.i\n1 ** $env?.f64\n1 ** $env?.f64 ?? list\n1 ** $env?.i\n1 ** 0 ** i\n1 ** 0 / i\n1 ** 0 == ceil(1)\n1 ** 0 > f64\n1 ** 0 ?? list\n1 ** 1 != i\n1 ** 1 ** i\n1 ** 1.0 != f64\n1 ** 1.0 ?? $env == f64\n1 ** 1.0 ?? groupBy(list, ok)\n1 ** 1.0 in array\n1 ** 1.0 | mean(array)\n1 ** array?.[i]\n1 ** f64 - array?.[i]\n1 ** f64 | median(i)\n1 ** i + f64\n1 ** i < 1.0 + 0\n1 ** i <= i\n1 ** nil ?? i\n1 ** nil ?? mean(0)\n1 + $env.f64\n1 + $env.i\n1 + $env?.f64\n1 + $env?.i\n1 + 0 ** i\n1 + 0 | bitor(i)\n1 + 1 % i\n1 + 1 >= f64 ^ 0\n1 + 1 not in array\n1 + 1.0 != i\n1 + 1.0 * f64\n1 + 1.0 - i\n1 + 1.0 < f64\n1 + 1.0 ?? foo\n1 + 1.0 ?? greet > f64\n1 + 1.0 ?? ok\n1 + 1.0 ^ i\n1 + 1.0 | max(1)\n1 + f64 ?? greet\n1 + f64 ^ i ** 1\n1 + f64 in array\n1 + f64 | max(array)\n1 + f64 | median(array)\n1 + i < f64\n1 + i < i\n1 + i..i\n1 - $env.f64\n1 - $env.i\n1 - $env?.f64\n1 - $env?.i\n1 - 0 > i\n1 - 0 ?? list\n1 - 1 == f64\n1 - 1 | median(1, 1.0)\n1 - 1.0 ** f64\n1 - 1.0 + f64\n1 - 1.0 / i\n1 - 1.0 == 1.0 == $env\n1 - 1.0 ?? i\n1 - 1.0 ?? not true\n1 - 1.0 in array\n1 - 1.0 not in array\n1 - array?.[i]\n1 - f64 / i\n1 - f64 > f64\n1 - f64 >= 1.0 < 1\n1 - f64 ?? add\n1 - f64 ^ f64\n1 - f64 | min(array)\n1 - i / f64\n1 - i > i\n1 - i ^ i\n1 - i | min(1.0)\n1 .. $env.i\n1 .. $env?.i\n1 .. 0 | all($env)\n1 .. 0 | filter(true)\n1 .. 0 | groupBy(#)\n1 .. 0 | groupBy(foo)\n1 .. 0 | one($env)\n1 .. 0 | sortBy(#)\n1 .. 0 | sortBy($env)\n1 .. 0 | sortBy(str)\n1 .. 0 | sum(greet)\n1 .. 1 ?? array\n1 .. 1 | filter(ok)\n1 .. 1 | findLast(true)\n1 .. 1 | map(#)\n1 .. 1 | map($env)\n1 .. 1 | map(foo)\n1 .. 1 | sum(1.0)\n1 .. array?.[i]\n1 .. i - i\n1 .. i ?? i\n1 .. i ?? ok\n1 .. i | groupBy(#)\n1 .. i | groupBy(foo)\n1 .. i | groupBy(ok)\n1 .. i | reduce(foo)\n1 / $env.array?.[i]\n1 / $env.f64\n1 / $env.i\n1 / $env?.f64\n1 / $env?.i\n1 / 0 ?? foo\n1 / 1 * f64\n1 / 1 > f64\n1 / 1 ^ i\n1 / 1 in [nil]\n1 / 1.0 * $env?.f64\n1 / 1.0 ** i\n1 / 1.0 <= f64\n1 / 1.0 == i || ok\n1 / 1.0 > 1.0 != nil\n1 / 1.0 ?? f64\n1 / array?.[i]\n1 / f64 - f64\n1 / f64 >= f64\n1 / i != i\n1 / i + 1.0 / 1\n1 / i + i\n1 / i ?? i\n1 < $env.f64\n1 < $env.i\n1 < $env?.f64\n1 < $env?.f64 && ok\n1 < $env?.i\n1 < 0 && ok\n1 < 0 - f64\n1 < 0 - f64 ?? foo\n1 < 0 <= $env?.[str]\n1 < 0 ?? i\n1 < 0 ^ i ** 1.0\n1 < 1 * f64\n1 < 1 < f64\n1 < 1 ?: array\n1 < 1 ?? f64\n1 < 1 ?? i\n1 < 1 ^ sum(array)\n1 < 1.0 < i\n1 < 1.0 > $env?.[false]\n1 < 1.0 ?? add\n1 < 1.0 ?? greet\n1 < 1.0 ?? str\n1 < array?.[i]\n1 < f64 / f64\n1 < f64 > 0 ** i\n1 < f64 >= $env?.i\n1 < i > i\n1 < i ? ok : ok\n1 < i ?? f64\n1 < i or min($env)\n1 <= $env.f64\n1 <= $env.i\n1 <= $env?.f64\n1 <= $env?.i\n1 <= 0 - i\n1 <= 0 ?: greet\n1 <= 0 and ok\n1 <= 1 * i\n1 <= 1 / f64\n1 <= 1 == true or true\n1 <= 1.0 == $env?.[Bar]\n1 <= 1.0 >= f64\n1 <= 1.0 ?? array\n1 <= array?.[i]\n1 <= f64 + i\n1 <= f64 - f64\n1 <= f64 or ok\n1 <= i / i\n1 <= i ^ i\n1 == $env || ok\n1 == $env.f64\n1 == $env.i\n1 == $env?.Bar\n1 == $env?.Bar?.Bar\n1 == $env?.String\n1 == $env?.String?.[greet]\n1 == $env?.[Bar]\n1 == $env?.[String]\n1 == $env?.[foobar]\n1 == $env?.[foobar]?.[greet]\n1 == $env?.[str]\n1 == $env?.f64\n1 == $env?.i\n1 == $env?.not\n1 == 1 ^ i\n1 == 1.0 - $env.i\n1 == 1.0 - f64\n1 == 1.0 - i\n1 == 1.0 ?? 1.0 ?? ok\n1 == 1.0 and ok\n1 == 1.0 or $env[:foobar]\n1 == array?.[i]\n1 == f64 && list == $env\n1 == f64 * f64 ** 1.0\n1 == f64 ?: greet\n1 == f64 ?? -$env\n1 == f64 ^ f64\n1 == foo ?? list\n1 == foo ?? str\n1 == i != $env?.String\n1 == i - f64\n1 == i || $env?.[add]\n1 == nil != ok\n1 == ok ?? foo\n1 == str ?? array\n1 > $env.f64\n1 > $env.i\n1 > $env?.f64\n1 > $env?.i\n1 > 0 != ok\n1 > 0 * f64\n1 > 0 <= i or $env\n1 > 0 ?? foo\n1 > 1 or nil != str\n1 > 1.0 / i\n1 > 1.0 <= -$env\n1 > 1.0 <= array?.[i]\n1 > 1.0 <= i\n1 > 1.0 >= $env.i\n1 > 1.0 >= $env[true:1]\n1 > 1.0 ^ min(array)\n1 > array?.[i]\n1 > f64 ** i\n1 > i % i\n1 > i - i\n1 > i / i\n1 > i <= f64\n1 > i ?? i\n1 >= $env.f64\n1 >= $env.i\n1 >= $env?.f64\n1 >= $env?.i\n1 >= 0 && $env?.String\n1 >= 0 * i\n1 >= 0 == ok\n1 >= 0 >= f64\n1 >= 1 <= f64\n1 >= 1 <= i\n1 >= 1 ?? greet\n1 >= 1.0 ** f64\n1 >= 1.0 > float(1)\n1 >= 1.0 >= i\n1 >= 1.0 ?: list\n1 >= 1.0 or $env.ok\n1 >= array?.[i]\n1 >= f64 > sum($env, 1)\n1 >= f64 ?? array\n1 >= i ** i\n1 >= i >= i\n1 ?? $env | get(ok)\n1 ?? $env | max(1.0)\n1 ?? $env.add\n1 ?? $env.array\n1 ?? $env.array?.[i]\n1 ?? $env.f64\n1 ?? $env.foo\n1 ?? $env.greet\n1 ?? $env.i\n1 ?? $env.list\n1 ?? $env.ok\n1 ?? $env.str\n1 ?? $env?.Bar\n1 ?? $env?.Bar()\n1 ?? $env?.Bar?.[f64]\n1 ?? $env?.String\n1 ?? $env?.String()\n1 ?? $env?.String(nil)\n1 ?? $env?.[Bar]\n1 ?? $env?.[Bar]?.[add]\n1 ?? $env?.[String]\n1 ?? $env?.[add]\n1 ?? $env?.[array]\n1 ?? $env?.[f64()]\n1 ?? $env?.[f64]\n1 ?? $env?.[f64].f64.greet\n1 ?? $env?.[foo(true)]\n1 ?? $env?.[foo]\n1 ?? $env?.[greet]\n1 ?? $env?.[greet]?.[str]\n1 ?? $env?.[i]\n1 ?? $env?.[i]?.[foo]\n1 ?? $env?.[list]\n1 ?? $env?.[list]?.Bar\n1 ?? $env?.[ok]\n1 ?? $env?.[ok].str\n1 ?? $env?.[ok]?.[str]\n1 ?? $env?.[str]\n1 ?? $env?.[str].Bar\n1 ?? $env?.add\n1 ?? $env?.array\n1 ?? $env?.f64\n1 ?? $env?.foo\n1 ?? $env?.foobar\n1 ?? $env?.foobar.greet\n1 ?? $env?.foobar?.[f64]?.array()\n1 ?? $env?.foobar?.list()\n1 ?? $env?.greet\n1 ?? $env?.i\n1 ?? $env?.list\n1 ?? $env?.ok\n1 ?? $env?.round(foobar)\n1 ?? $env?.str\n1 ?? $env[:String | ceil(foobar)]\n1 ?? $env[:foobar == foobar].foo\n1 ?? $env[:foobar?.array(foobar)]\n1 ?? $env[:str]\n1 ?? $env[String <= false:foobar < foo]\n1 ?? $env[String():]?.list\n1 ?? $env[list():]\n1 ?? $env[ok(foobar):]\n1 ?? $env[reverse(0):]\n1 ?? 1 ?? array\n1 ?? 1.0 ?? greet\n1 ?? 1.0 | bitnand(i)\n1 ?? 1.0 | mean(f64)\n1 ?? add ?? f64\n1 ?? array ?? f64\n1 ?? false ?? f64\n1 ?? foo ?? array\n1 ?? foo ?? str\n1 ?? foo | max(1)\n1 ?? foo.Bar\n1 ?? foo.String\n1 ?? foo.String()\n1 ?? foo?.Bar\n1 ?? foo?.String\n1 ?? foo?.String()\n1 ?? i ?? array\n1 ?? list?.[i]\n1 ?? ok | get(true)\n1 ^ $env.f64\n1 ^ $env.i\n1 ^ $env?.f64\n1 ^ $env?.i\n1 ^ 0 ** i\n1 ^ 0 >= i\n1 ^ 1 - i\n1 ^ 1 > f64\n1 ^ 1 ?? foo?.String\n1 ^ 1 in $env.array\n1 ^ 1 in array\n1 ^ 1 not in array\n1 ^ 1.0 + f64\n1 ^ 1.0 + i - 0\n1 ^ 1.0 == f64 ?? 1.0\n1 ^ 1.0 == i\n1 ^ 1.0 > i\n1 ^ 1.0 ?? array\n1 ^ 1.0 ?? foo\n1 ^ 1.0 ?? list\n1 ^ 1.0 ?? {foo: foo}\n1 ^ 1.0 ^ f64\n1 ^ 1.0 ^ int(1.0)\n1 ^ 1.0 ^ round(0)\n1 ^ array?.[i]\n1 ^ f64 != $env.f64\n1 ^ f64 - ceil(1.0)\n1 ^ f64 | min(1)\n1 ^ i ** i\n1 in $env.array\n1 in $env?.Bar\n1 in $env?.String\n1 in $env?.[Bar]\n1 in $env?.[Bar]?.[array]\n1 in $env?.[Bar]?.f64\n1 in $env?.[String]\n1 in $env?.array\n1 in $env?.foobar\n1 in array ?? foo\n1 in array || false ? 1 : foo\n1 in array || ok\n1 not in $env.array\n1 not in $env?.$env?.list\n1 not in $env?.Bar\n1 not in $env?.Bar?.[i]\n1 not in $env?.Bar?.add\n1 not in $env?.String\n1 not in $env?.String?.[foo]\n1 not in $env?.[Bar]\n1 not in $env?.[String]\n1 not in $env?.[String]?.f64\n1 not in $env?.[foobar]\n1 not in $env?.array\n1 not in $env?.foobar\n1 not in $env?.foobar?.String(foobar)\n1 not in $env?.foobar?.[array]\n1 not in list ?? add\n1 not in nil ?? array\n1 | bitand(i) ?? $env?.[foo]\n1 | bitshl(0) != f64\n1 | bitshl(1) != f64\n1 | bitxor(1) >= i\n1 | mean(1) < 0 ?? 1.0\n1 | min(1.0) + i\n1..array?.[i]\n1..i != array\n1..i | all(true)\n1..i | map(#)\n1..i | map(0)\n1..i | reduce(array)\n1.0 != $env ?? foo\n1.0 != $env.f64\n1.0 != $env.i\n1.0 != $env?.Bar\n1.0 != $env?.Bar?.[array]\n1.0 != $env?.Bar?.str\n1.0 != $env?.String\n1.0 != $env?.String?.[add]\n1.0 != $env?.String?.[i]\n1.0 != $env?.String?.[ok]\n1.0 != $env?.[Bar]\n1.0 != $env?.[String]\n1.0 != $env?.[String]?.greet()\n1.0 != $env?.[foobar?.add($env)]?.greet\n1.0 != $env?.[foobar?.add]\n1.0 != $env?.[foobar]\n1.0 != $env?.[foobar]?.[array]\n1.0 != $env?.[str]\n1.0 != $env?.f64\n1.0 != $env?.foobar\n1.0 != $env?.foobar?.list\n1.0 != $env?.i\n1.0 != $env?.not\n1.0 != 0 != ok\n1.0 != 0 - f64\n1.0 != 0 / abs(1.0)\n1.0 != 0 ?? add\n1.0 != 0 ?? str\n1.0 != 0.-1.0\n1.0 != 1 != ok\n1.0 != 1 / i\n1.0 != 1 ?: foo\n1.0 != 1.0 ** i\n1.0 != 1.0 / abs(1.0)\n1.0 != 1.0 == ok\n1.0 != 1.0 ^ $env.f64\n1.0 != 1.0 ^ f64\n1.0 != 1.0 and $env not endsWith $env\n1.0 != add ?? greet\n1.0 != add ?? {foo: 1}\n1.0 != array?.[i]\n1.0 != f64 && ok\n1.0 != false ?? $env?.[list]\n1.0 != foo ?? array?.[i]\n1.0 != foo ?? count($env, false)\n1.0 != foo ?? greet\n1.0 != i % i\n1.0 != i * f64\n1.0 != i / i\n1.0 != i ^ f64\n1.0 != i or ok\n1.0 != list ?? array\n1.0 != nil ?? 1 ?? foo\n1.0 != nil or reduce($env, #.str)?.[str]\n1.0 != str ?? array\n1.0 != true ?? $env.add\n1.0 != true ?? array\n1.0 != true ?? f64\n1.0 * $env.array?.[i]\n1.0 * $env.f64\n1.0 * $env.i\n1.0 * $env?.f64\n1.0 * $env?.i\n1.0 * 0 + f64\n1.0 * 0 / f64 != nil\n1.0 * 0 <= f64\n1.0 * 0 == f64\n1.0 * 0 >= i\n1.0 * 0 ^ f64\n1.0 * 1 != i\n1.0 * 1 != max($env)\n1.0 * 1 ** i\n1.0 * 1 ?? add\n1.0 * 1 ?? list\n1.0 * 1 ?? ok\n1.0 * 1 | max(f64)\n1.0 * 1.0 != i\n1.0 * 1.0 / f64\n1.0 * 1.0 <= f64\n1.0 * 1.0 > f64\n1.0 * 1.0 > i\n1.0 * 1.0 >= 0 == nil\n1.0 * 1.0 >= i\n1.0 * 1.0 ?? f64\n1.0 * 1.0 | mean(array)\n1.0 * 1.0 | median(1.0)\n1.0 * 1.0 | min(1.0)\n1.0 * array?.[i]\n1.0 * f64 * i\n1.0 * f64 - i\n1.0 * f64 - max(1, array)\n1.0 * f64 == f64\n1.0 * f64 == sum(array)\n1.0 * f64 ?? f64\n1.0 * f64 ?? greet\n1.0 * f64 | max(1.0)\n1.0 * i + f64\n1.0 * i >= 1.0 ^ 1\n1.0 * i ?? ok\n1.0 * i not in array\n1.0 * i | median(1.0)\n1.0 ** $env.f64\n1.0 ** $env.i\n1.0 ** $env?.f64\n1.0 ** $env?.i\n1.0 ** 0 - 1.0 in array\n1.0 ** 0 - i\n1.0 ** 0 / i\n1.0 ** 0 < i\n1.0 ** 0 <= f64\n1.0 ** 0 == f64\n1.0 ** 0 == i\n1.0 ** 0 > i\n1.0 ** 0 ?? str\n1.0 ** 0 ^ 0 ** 0\n1.0 ** 0 | median(1)\n1.0 ** 1 ** $env.i\n1.0 ** 1 / 1.0 ?? foo\n1.0 ** 1 ^ i\n1.0 ** 1.0 != i\n1.0 ** 1.0 * i\n1.0 ** 1.0 ** -1.0\n1.0 ** 1.0 < 0 != false\n1.0 ** 1.0 < i\n1.0 ** 1.0 ?? array\n1.0 ** 1.0 ?? foo\n1.0 ** 1.0 ?? greet\n1.0 ** 1.0 ?? list\n1.0 ** 1.0 ?? nil ?? foo\n1.0 ** 1.0 ?? upper($env)\n1.0 ** 1.0 | median(1.0)\n1.0 ** array?.[i]\n1.0 ** f64\n1.0 ** f64 != f64\n1.0 ** f64 * f64\n1.0 ** f64 * i\n1.0 ** f64 - f64\n1.0 ** f64 / i\n1.0 ** f64 >= f64\n1.0 ** f64 ?? ok\n1.0 ** f64 | median(i)\n1.0 ** f64 | min(1)\n1.0 ** i - -0\n1.0 ** i - float(f64)\n1.0 ** i / f64\n1.0 ** i <= i * 1.0\n1.0 ** nil ?? f64\n1.0 + $env.f64\n1.0 + $env.i\n1.0 + $env?.f64\n1.0 + $env?.i\n1.0 + 0 != i\n1.0 + 0 + f64\n1.0 + 0 / reduce(array, i)\n1.0 + 0 < round(1)\n1.0 + 0 ?? add\n1.0 + 1 ?? f64\n1.0 + 1 not in array\n1.0 + 1 | median(1.0)\n1.0 + 1.0 + i\n1.0 + 1.0 - i\n1.0 + 1.0 <= i\n1.0 + 1.0 ?? add\n1.0 + 1.0 ^ f64\n1.0 + 1.0 ^ i\n1.0 + 1.0 in $env?.Bar\n1.0 + 1.0 not in array\n1.0 + 1.0 | mean(1)\n1.0 + 1.0 | median(1.0)\n1.0 + array?.[i]\n1.0 + f64 / f64\n1.0 + f64 / i\n1.0 + f64 < i\n1.0 + f64 == i\n1.0 + f64 >= f64\n1.0 + i / f64\n1.0 + i < f64\n1.0 + i > i\n1.0 + i >= i\n1.0 + i ?? greet == foo\n1.0 - $env.f64\n1.0 - $env.i\n1.0 - $env?.f64\n1.0 - $env?.f64 == 1.0\n1.0 - $env?.i\n1.0 - 0 != f64\n1.0 - 0 * f64\n1.0 - 0 >= f64\n1.0 - 0 ?? str\n1.0 - 1 + 1.0 == nil\n1.0 - 1 - i\n1.0 - 1 - min(1.0)\n1.0 - 1 / i\n1.0 - 1 > i and $env\n1.0 - 1 not in array\n1.0 - 1.0 != f64\n1.0 - 1.0 ** f64\n1.0 - 1.0 + f64\n1.0 - 1.0 < f64\n1.0 - 1.0 <= i\n1.0 - 1.0 == f64\n1.0 - 1.0 == i\n1.0 - 1.0 > f64\n1.0 - 1.0 >= f64\n1.0 - 1.0 ?? ok\n1.0 - 1.0 in array\n1.0 - 1.0 in array ?: i\n1.0 - 1.0 | median(0)\n1.0 - array?.[i]\n1.0 - f64 != f64\n1.0 - f64 * i\n1.0 - f64 - f64\n1.0 - f64 / i\n1.0 - f64 in array\n1.0 - i * $env.i\n1.0 - i ** -i\n1.0 - i < i\n1.0 - i ^ f64\n1.0 - i ^ i\n1.0 / $env.f64\n1.0 / $env.i\n1.0 / $env?.f64\n1.0 / $env?.i\n1.0 / 0 != i\n1.0 / 0 * $env?.f64\n1.0 / 0 + f64\n1.0 / 0 - i\n1.0 / 0 < i\n1.0 / 0 <= 1 + f64\n1.0 / 0 == f64\n1.0 / 0 == i\n1.0 / 0 > $env?.f64\n1.0 / 0 ?? list\n1.0 / 0 | median(f64, i)\n1.0 / 0 | min(1.0)\n1.0 / 1 != find($env, false)\n1.0 / 1 * f64\n1.0 / 1 ** i\n1.0 / 1 > f64\n1.0 / 1 >= f64\n1.0 / 1.0 != f64\n1.0 / 1.0 + i\n1.0 / 1.0 + min(0)\n1.0 / 1.0 - f64\n1.0 / 1.0 / f64\n1.0 / 1.0 <= f64\n1.0 / 1.0 == i\n1.0 / 1.0 > f64\n1.0 / 1.0 > i\n1.0 / 1.0 >= f64\n1.0 / 1.0 ?? 0 + 1\n1.0 / 1.0 ?? i\n1.0 / 1.0 ^ f64\n1.0 / 1.0 ^ i\n1.0 / array?.[i]\n1.0 / f64 * i\n1.0 / f64 <= f64 || true\n1.0 / f64 ?? one($env, #.foo)\n1.0 / f64 ^ i\n1.0 / f64 in array\n1.0 / i ** i\n1.0 / i / i != nil\n1.0 / i < f64\n1.0 / i <= i\n1.0 / i == i\n1.0 < $env.add(0, i)\n1.0 < $env.f64\n1.0 < $env.i\n1.0 < $env?.f64\n1.0 < $env?.i\n1.0 < 1 <= f64\n1.0 < 1 > $env?.[greet]\n1.0 < 1 > f64\n1.0 < 1 >= i\n1.0 < 1 ?? ok\n1.0 < 1.0 != ok\n1.0 < 1.0 && $env?.String(foobar, i)\n1.0 < 1.0 && $env?.[ok]\n1.0 < 1.0 ** f64\n1.0 < 1.0 - i\n1.0 < 1.0 / round(1.0)\n1.0 < 1.0 <= $env?.String\n1.0 < 1.0 <= i\n1.0 < 1.0 == $env && true\n1.0 < 1.0 == ok\n1.0 < 1.0 > round($env)\n1.0 < 1.0 >= 1.0 == ok\n1.0 < 1.0 ? foo != nil : str\n1.0 < 1.0 ?? $env?.[greet]\n1.0 < 1.0 ?? f64\n1.0 < 1.0 ?? foo\n1.0 < 1.0 ^ f64\n1.0 < 1.0 ^ i\n1.0 < 1.0 || ok\n1.0 < array?.[i]\n1.0 < f64 + $env.i\n1.0 < f64 + i\n1.0 < f64 - f64\n1.0 < f64 - i ?? add\n1.0 < f64 < $env?.[ok]\n1.0 < f64 ?: i\n1.0 < f64 ^ f64\n1.0 < i != ok\n1.0 < i / f64\n1.0 < i > f64\n1.0 < i > i\n1.0 < i >= -1.0\n1.0 < i >= i\n1.0 < i ?: 1 == i\n1.0 < i ?: list\n1.0 < i ^ f64\n1.0 <= $env.f64\n1.0 <= $env.i\n1.0 <= $env?.f64\n1.0 <= $env?.i\n1.0 <= 0 % i\n1.0 <= 0 - f64\n1.0 <= 0 / f64\n1.0 <= 0 / i\n1.0 <= 0 < f64 <= f64\n1.0 <= 0 >= i\n1.0 <= 0 ? f64 : greet\n1.0 <= 0 ?? array\n1.0 <= 0 ?? duration($env)\n1.0 <= 0 or ok\n1.0 <= 1 ** f64 ^ 1\n1.0 <= 1 ** i\n1.0 <= 1 / $env?.i\n1.0 <= 1 / i\n1.0 <= 1 < -i\n1.0 <= 1 < f64 < f64\n1.0 <= 1 or none($env, $env)\n1.0 <= 1.0 != ok\n1.0 <= 1.0 && $env?.Bar\n1.0 <= 1.0 * f64\n1.0 <= 1.0 * i\n1.0 <= 1.0 ** 1 and false\n1.0 <= 1.0 - f64\n1.0 <= 1.0 / mean(f64)\n1.0 <= 1.0 < f64\n1.0 <= 1.0 <= i\n1.0 <= 1.0 == ok == $env\n1.0 <= 1.0 > i\n1.0 <= 1.0 >= f64\n1.0 <= 1.0 or ok\n1.0 <= 1.0 || ok\n1.0 <= array?.[i]\n1.0 <= f64\n1.0 <= f64 != ok\n1.0 <= f64 && ok\n1.0 <= f64 ** 1 ? 1.0 : ok\n1.0 <= f64 < $env.f64\n1.0 <= f64 < -0\n1.0 <= f64 <= f64\n1.0 <= f64 >= f64\n1.0 <= f64 ?? add\n1.0 <= i * $env.f64\n1.0 <= i * i\n1.0 <= i / i\n1.0 <= i or 1 != f64\n1.0 <= i or ok != false\n1.0 == $env && ok != false\n1.0 == $env ?? array\n1.0 == $env ^ $env or true\n1.0 == $env or ok\n1.0 == $env or true ?? nil\n1.0 == $env.f64\n1.0 == $env.i\n1.0 == $env?.Bar\n1.0 == $env?.String\n1.0 == $env?.[Bar]\n1.0 == $env?.[Bar]?.foo\n1.0 == $env?.[String]\n1.0 == $env?.[String]?.[array]\n1.0 == $env?.[String]?.[ok].greet\n1.0 == $env?.[foobar?.[f64]]\n1.0 == $env?.[foobar]\n1.0 == $env?.[greet(Bar)]\n1.0 == $env?.[str]\n1.0 == $env?.f64\n1.0 == $env?.foobar\n1.0 == $env?.foobar?.[ok]\n1.0 == $env?.i\n1.0 == $env?.true != $env\n1.0 == 0 != $env || false\n1.0 == 0 ?? -0\n1.0 == 0 ^ f64\n1.0 == 0 or $env?.ok\n1.0 == 1 != ok\n1.0 == 1 % i\n1.0 == 1 * f64\n1.0 == 1 - f64\n1.0 == 1 - i\n1.0 == 1 == ok\n1.0 == 1.0 != ok\n1.0 == 1.0 * f64\n1.0 == 1.0 ** i\n1.0 == 1.0 - i\n1.0 == 1.0 / f64\n1.0 == 1.0 ?? i\n1.0 == 1.0 and ok\n1.0 == 1.0 in [nil, 1]\n1.0 == 1.0 || any($env, true)\n1.0 == 1.0 || ok\n1.0 == array?.[i]\n1.0 == f64 != ok\n1.0 == f64 * 0 ?? 0\n1.0 == false ?? uniq(array)\n1.0 == foo ?? count(array)\n1.0 == foo ?? ok\n1.0 == i != ok\n1.0 == i != ok; nil\n1.0 == i * i\n1.0 == i + f64\n1.0 == i + sum(list, 1.0)\n1.0 == i / i\n1.0 == i ?? i\n1.0 == nil ?: array\n1.0 == nil and $env.ok\n1.0 == nil or ok\n1.0 == ok ?? f64\n1.0 == str ?? foo\n1.0 > $env * 1.0 || true\n1.0 > $env.f64\n1.0 > $env.i\n1.0 > $env?.f64\n1.0 > $env?.i\n1.0 > 0 / i\n1.0 > 0 < 1 ^ f64\n1.0 > 0 < f64\n1.0 > 0 < i\n1.0 > 0 >= last(array)\n1.0 > 0 || ok\n1.0 > 1 > find($env, #)\n1.0 > 1 >= $env?.[ok]\n1.0 > 1 ?: {foo: add, foo: ok}?.foo\n1.0 > 1 ?? $env?.str\n1.0 > 1 ?? f64\n1.0 > 1 ?? nil && $env\n1.0 > 1 ^ i\n1.0 > 1.0 * array?.[i]\n1.0 > 1.0 <= f64\n1.0 > 1.0 == ok\n1.0 > 1.0 > i\n1.0 > 1.0 >= len(str)\n1.0 > 1.0 ?? array\n1.0 > 1.0 ?? list\n1.0 > array?.[i]\n1.0 > f64 * f64\n1.0 > f64 ** i\n1.0 > f64 + f64\n1.0 > f64 / i\n1.0 > f64 < f64\n1.0 > f64 > round(1.0)\n1.0 > f64 ?? greet\n1.0 > f64 ?? map(list, true)\n1.0 > f64 or none($env, .f64)\n1.0 > i != str ?? foo\n1.0 > i && median($env, foo)\n1.0 > i && ok\n1.0 > i + 1.0\n1.0 > i >= $env?.[String]\n1.0 >= $env.f64\n1.0 >= $env.i\n1.0 >= $env?.[str]?.[f64]\n1.0 >= $env?.f64\n1.0 >= $env?.i\n1.0 >= 0 / i\n1.0 >= 1 <= f64\n1.0 >= 1 > i\n1.0 >= 1 > i >= i\n1.0 >= 1 ?? array < 0\n1.0 >= 1 in $env?.Bar\n1.0 >= 1.0 * f64\n1.0 >= 1.0 * f64 or ok\n1.0 >= 1.0 + f64\n1.0 >= 1.0 / i\n1.0 >= 1.0 / sum(array)\n1.0 >= 1.0 < f64\n1.0 >= 1.0 <= f64\n1.0 >= 1.0 == {foo: $env, foo: $env}.foo\n1.0 >= 1.0 > i\n1.0 >= 1.0 ?: list\n1.0 >= 1.0 ?? greet\n1.0 >= 1.0 ?? list\n1.0 >= 1.0 ^ f64\n1.0 >= 1.0 and f64 ?? foo\n1.0 >= array?.[i]\n1.0 >= f64 ** $env?.i\n1.0 >= f64 ** 0 > 1.0\n1.0 >= f64 + i\n1.0 >= f64 - i\n1.0 >= f64 / i\n1.0 >= f64 > f64\n1.0 >= f64 not in $env?.[String]\n1.0 >= i * f64\n1.0 >= i * i\n1.0 >= i + 1.0 >= $env\n1.0 >= i - i\n1.0 >= i < $env?.i\n1.0 >= i == $env?.[Bar]\n1.0 >= i == not false\n1.0 >= i ?? array\n1.0 >= i and not ok\n1.0 ?? $env ?? list\n1.0 ?? $env.add\n1.0 ?? $env.array\n1.0 ?? $env.f64\n1.0 ?? $env.foo\n1.0 ?? $env.greet\n1.0 ?? $env.i\n1.0 ?? $env.list\n1.0 ?? $env.ok\n1.0 ?? $env.str\n1.0 ?? $env?.$env?.$env\n1.0 ?? $env?.$env?.array\n1.0 ?? $env?.Bar\n1.0 ?? $env?.Bar()\n1.0 ?? $env?.String\n1.0 ?? $env?.String()\n1.0 ?? $env?.String?.f64\n1.0 ?? $env?.String?.ok()\n1.0 ?? $env?.[$env?.[foobar]]\n1.0 ?? $env?.[1.0 >= list]\n1.0 ?? $env?.[1.0 not in array]\n1.0 ?? $env?.[Bar]\n1.0 ?? $env?.[Bar]?.[list]\n1.0 ?? $env?.[String]\n1.0 ?? $env?.[String]?.[add]\n1.0 ?? $env?.[String]?.ok\n1.0 ?? $env?.[add]\n1.0 ?? $env?.[add].str\n1.0 ?? $env?.[array < array]\n1.0 ?? $env?.[array]\n1.0 ?? $env?.[array].greet\n1.0 ?? $env?.[count(1)]\n1.0 ?? $env?.[f64(ok)]\n1.0 ?? $env?.[f64]\n1.0 ?? $env?.[filter(foobar, foobar)]\n1.0 ?? $env?.[findIndex(ok, #acc)]\n1.0 ?? $env?.[flatten(add)]\n1.0 ?? $env?.[foo | floor(foobar)]\n1.0 ?? $env?.[foo?.str]\n1.0 ?? $env?.[foo]\n1.0 ?? $env?.[foobar | ok()]\n1.0 ?? $env?.[foobar?.add(foobar)]\n1.0 ?? $env?.[foobar?.add]\n1.0 ?? $env?.[foobar]\n1.0 ?? $env?.[greet startsWith String]\n1.0 ?? $env?.[greet()]\n1.0 ?? $env?.[greet?.add]\n1.0 ?? $env?.[greet]\n1.0 ?? $env?.[i]\n1.0 ?? $env?.[list(Bar)]?.[i]\n1.0 ?? $env?.[list]\n1.0 ?? $env?.[ok]\n1.0 ?? $env?.[str]\n1.0 ?? $env?.[str].foo\n1.0 ?? $env?.[str]?.[f64]\n1.0 ?? $env?.add\n1.0 ?? $env?.array\n1.0 ?? $env?.f64\n1.0 ?? $env?.false?.[f64]\n1.0 ?? $env?.foo\n1.0 ?? $env?.foo?.String\n1.0 ?? $env?.foobar.array\n1.0 ?? $env?.greet\n1.0 ?? $env?.i\n1.0 ?? $env?.list\n1.0 ?? $env?.ok\n1.0 ?? $env?.str\n1.0 ?? $env[$env || foobar:foobar ** f64]\n1.0 ?? $env[1.0 || true:]\n1.0 ?? $env[:$env && add]\n1.0 ?? $env[:$env | hasSuffix(false)]\n1.0 ?? $env[:findIndex(foobar, foobar)]\n1.0 ?? $env[:foobar?.[array]]\n1.0 ?? $env[:foobar]\n1.0 ?? $env[add not startsWith greet:]\n1.0 ?? $env[array():]\n1.0 ?? $env[f64 and ok:0 or 1.0]\n1.0 ?? $env[foo($env):str(foobar)]\n1.0 ?? $env[foo?.foo():]\n1.0 ?? $env[foobar | f64():]\n1.0 ?? $env[foobar:greet()]\n1.0 ?? $env[reduce(true, nil, foobar):foo and foobar]\n1.0 ?? 1.0 ?? f64\n1.0 ?? 1.0 ?? list\n1.0 ?? array ?? ok\n1.0 ?? array | mean(0)\n1.0 ?? array?.[i]\n1.0 ?? array[:$env ?? f64]\n1.0 ?? array[:i]\n1.0 ?? f64 | max(1.0)\n1.0 ?? foo.Bar\n1.0 ?? foo.String\n1.0 ?? foo.String()\n1.0 ?? foo?.Bar\n1.0 ?? foo?.String\n1.0 ?? foo?.String()\n1.0 ?? greet ?? add\n1.0 ?? greet ?? ok\n1.0 ?? list ?? greet\n1.0 ?? list?.[i]\n1.0 ?? nil | median(array)\n1.0 ?? ok ?? list\n1.0 ?? str ?? [true]\n1.0 ?? true ?? add\n1.0 ^ $env.f64\n1.0 ^ $env.i\n1.0 ^ $env?.f64\n1.0 ^ $env?.i\n1.0 ^ 0 - i\n1.0 ^ 0 / -i\n1.0 ^ 0 < f64\n1.0 ^ 0 <= i\n1.0 ^ 0 == $env ?? 1.0\n1.0 ^ 0 > i ? array : foo\n1.0 ^ 0 ?? f64\n1.0 ^ 0 ?? foo\n1.0 ^ 0 ^ f64\n1.0 ^ 1 * i\n1.0 ^ 1 ** f64\n1.0 ^ 1 - f64\n1.0 ^ 1 - sum(array)\n1.0 ^ 1 == i\n1.0 ^ 1 >= 1 || false\n1.0 ^ 1 ?? add\n1.0 ^ 1 ?? f64\n1.0 ^ 1 ?? foo\n1.0 ^ 1.0 * f64\n1.0 ^ 1.0 ** f64\n1.0 ^ 1.0 ** i\n1.0 ^ 1.0 + 1.0 in array\n1.0 ^ 1.0 == $env?.i\n1.0 ^ 1.0 > i\n1.0 ^ 1.0 >= f64\n1.0 ^ 1.0 ?? f64\n1.0 ^ 1.0 ?? foo\n1.0 ^ 1.0 ?? ok\n1.0 ^ 1.0 ^ i\n1.0 ^ 1.0 not in array\n1.0 ^ 1.0 | min(1.0 ?? $env)\n1.0 ^ 1.0 | min(f64)\n1.0 ^ array?.[i]\n1.0 ^ f64 * i\n1.0 ^ f64 <= f64\n1.0 ^ f64 <= i and $env\n1.0 ^ f64 == f64\n1.0 ^ f64 ^ i\n1.0 ^ i * i\n1.0 ^ i - i\n1.0 ^ i < f64 < 1.0\n1.0 ^ i <= int(1.0)\n1.0 ^ i > i\n1.0 ^ i ?? greet\n1.0 ^ i in array\n1.0 ^ i not in array\n1.0 in $env.array\n1.0 in $env?.Bar\n1.0 in $env?.String\n1.0 in $env?.String?.array\n1.0 in $env?.String?.f64\n1.0 in $env?.[Bar]\n1.0 in $env?.[Bar]?.[add]\n1.0 in $env?.[Bar]?.array\n1.0 in $env?.[String]\n1.0 in $env?.[String]?.[i]\n1.0 in $env?.[String]?.[str]\n1.0 in $env?.[foobar?.[foo]]\n1.0 in $env?.[foobar]\n1.0 in $env?.array\n1.0 in $env?.foobar\n1.0 in $env?.foobar?.Bar()\n1.0 in 0 .. i\n1.0 in array != ok\n1.0 in array == ok\n1.0 in array ?? i\n1.0 in array or ok\n1.0 in i..i\n1.0 not in $env.array\n1.0 not in $env?.Bar\n1.0 not in $env?.String\n1.0 not in $env?.[Bar]\n1.0 not in $env?.[String]\n1.0 not in $env?.[String]?.[array]\n1.0 not in $env?.[foobar?.str]\n1.0 not in $env?.[foobar]\n1.0 not in $env?.[foobar]?.list\n1.0 not in $env?.array\n1.0 not in $env?.foobar\n1.0 not in $env?.nil?.[list].array()\n1.0 not in array && ok\n1.0 not in array ?? $env?.[list]\n1.0 | max(1.0, f64) < f64\n1.0 | max(array) <= i\n1.0 | max(f64) != i\n1.0 | max(i) == f64\n1.0 | mean(1.0) * 1 ?? false\n1.0 | mean(f64) != i\n1.0 | median(0) ^ i\n1.0 | median(array) | get(foo)\n1.0 | min(1.0) != i\n1.0 | min(1.0) ** i\n1.0; $env.i\n1.0; $env?.Bar\n1.0; $env?.i\n1.0; $env?.list\n1.0; 1.0 < f64\n1.0; array | reduce(#)\n1.0; foo?.Bar\n1.1 * f64\n1.1 < i\n1.1 >= f64\n1; $env.i\n1; $env?.foo\n1; $env?.foobar\n1; $env?.i\n1; 1 ?? $env.array\n1; add ?? date(i)\n1; f64 < i\n[!false, -0]\n[!false, foo]\n[!false]\n[!ok, foo]\n[!ok, greet]\n[!ok]\n[!true, array]\n[!true]\n[$env != $env]\n[$env != 0]\n[$env != 1, f64]\n[$env != 1.0]\n[$env != 1]\n[$env != add]\n[$env != f64]\n[$env != false]\n[$env != foo]\n[$env != greet]\n[$env != i]\n[$env != list]\n[$env != nil]\n[$env != ok]\n[$env != str]\n[$env && false]\n[$env && true]\n[$env == $env, foo != foo]\n[$env == $env.add]\n[$env == $env]\n[$env == 0]\n[$env == 1.0]\n[$env == 1]\n[$env == add]\n[$env == false]\n[$env == foo, ok]\n[$env == foo]\n[$env == greet]\n[$env == i, f64]\n[$env == i]\n[$env == list]\n[$env == nil]\n[$env == ok]\n[$env == str]\n[$env == true]\n[$env ?? $env]\n[$env ?? 0]\n[$env ?? 1.0]\n[$env ?? 1]\n[$env ?? add]\n[$env ?? array]\n[$env ?? false]\n[$env ?? foo]\n[$env ?? i]\n[$env ?? nil]\n[$env ?? str]\n[$env ?? true]\n[$env and false]\n[$env and true]\n[$env in list]\n[$env not in array]\n[$env not in list, f64]\n[$env not in list]\n[$env or false, list]\n[$env or false]\n[$env | all(false)]\n[$env | all(true)]\n[$env | any(false)]\n[$env | any(ok)]\n[$env | any(true)]\n[$env | filter(false), f64]\n[$env | find(false)]\n[$env | findIndex(true)]\n[$env | findLast(false)]\n[$env | findLastIndex(false)]\n[$env | map(#index)]\n[$env | map(1.0)]\n[$env | map(add)]\n[$env | map(array)]\n[$env | map(false)]\n[$env | map(foo)]\n[$env | map(greet)]\n[$env | map(i)]\n[$env | map(list)]\n[$env | map(ok)]\n[$env | map(str)]\n[$env | map(true)]\n[$env | none(false)]\n[$env | one(false)]\n[$env | one(ok)]\n[$env | reduce(list, 0)]\n[$env | reduce(true, foo)]\n[$env | sum(0)]\n[$env | sum(1)]\n[$env | sum(1.0)]\n[$env | sum(f64)]\n[$env || false]\n[$env || true]\n[$env, $env]?.[i]\n[$env, 0] | any(.ok)\n[$env, 1.0] | find(true)\n[$env, 1.0] | map(#)\n[$env, 1.0] | map(true)\n[$env, 1.0]?.[i]\n[$env, 1] | reduce(i, nil)\n[$env, false, i]?.[i]\n[$env, false] | reduce(#)\n[$env, foo] | groupBy(f64)\n[$env, foo] | reduce($env)\n[$env, foo]?.[i]\n[$env, greet] | reduce(1)\n[$env, i] | reduce(false, $env)\n[$env, nil]?.[i]\n[$env, ok, $env]?.[i]\n[$env, ok] | findLastIndex(#)\n[$env, ok] | findLastIndex(false)\n[$env, ok] | reduce(f64)\n[$env, ok]?.[i]\n[$env, true] | groupBy(foo)\n[$env, true] | map(foo)\n[$env.add, foo]\n[$env.add, list]\n[$env.add]\n[$env.array, i]\n[$env.array?.[i]]\n[$env.array]\n[$env.f64, greet]\n[$env.f64, ok]\n[$env.f64, round(1.0)]\n[$env.f64, string($env)]\n[$env.f64]\n[$env.foo, foo]\n[$env.foo?.String()]\n[$env.foo]\n[$env.greet, 1 >= 1]\n[$env.greet, foo]\n[$env.greet]\n[$env.i, $env.i]\n[$env.i, greet]\n[$env.i, str]\n[$env.i]\n[$env.list, add]\n[$env.list]\n[$env.ok, foo]\n[$env.ok, i]\n[$env.ok, list]\n[$env.ok]\n[$env.str, max(1.0)]\n[$env.str, str]\n[$env.str]\n[$env?.$env]\n[$env?.Bar]\n[$env?.String, add]\n[$env?.String, f64]\n[$env?.String?.f64]\n[$env?.String]\n[$env?.[Bar], array]\n[$env?.[Bar], foo]\n[$env?.[Bar]?.f64]\n[$env?.[Bar]]\n[$env?.[String] == list]\n[$env?.[String], foo]\n[$env?.[String], list]\n[$env?.[String], str]\n[$env?.[String]?.[foo]]\n[$env?.[String]?.[list]]\n[$env?.[String]]\n[$env?.[foobar], i]\n[$env?.[foobar]?.add?.add]\n[$env?.[foobar]?.greet]\n[$env?.[foobar]]\n[$env?.[nil]?.add()]\n[$env?.[nil]]\n[$env?.[str] | groupBy(#)]\n[$env?.[str], f64]\n[$env?.[str]?.[i]]\n[$env?.[str]]\n[$env?.add, foo]\n[$env?.add, ok]\n[$env?.add]\n[$env?.array | map(str)]\n[$env?.array, $env?.list]\n[$env?.array, [true]]\n[$env?.array, add]\n[$env?.array, array != $env]\n[$env?.array, str]\n[$env?.array]\n[$env?.f64]\n[$env?.false]\n[$env?.foo]\n[$env?.foobar, $env.add]\n[$env?.foobar?.ok]\n[$env?.foobar]\n[$env?.greet, add]\n[$env?.greet, array]\n[$env?.greet]\n[$env?.i, i < f64]\n[$env?.i, ok]\n[$env?.i]\n[$env?.list | map(#)]\n[$env?.list]\n[$env?.nil]\n[$env?.ok]\n[$env?.str, str]\n[$env?.str]\n[$env] != list\n[$env] == 0 .. 1\n[$env] ?? duration($env)\n[$env] ?? str\n[$env] | all(false)\n[$env] | any(#.ok)\n[$env] | any(.ok)\n[$env] | any(false)\n[$env] | any(true)\n[$env] | concat(array)\n[$env] | count(#.ok)\n[$env] | count(ok)\n[$env] | filter(.ok)\n[$env] | filter(false)\n[$env] | filter(ok)\n[$env] | find(#.ok != .Bar)\n[$env] | find(#.ok)\n[$env] | findLast(ok)\n[$env] | findLast(true)\n[$env] | findLastIndex(#.ok)\n[$env] | findLastIndex(false)\n[$env] | groupBy(#.f64)\n[$env] | groupBy(.add == ok)\n[$env] | groupBy(1)\n[$env] | groupBy(i)\n[$env] | map(#.String)\n[$env] | map(#.ok)\n[$env] | map($env)\n[$env] | map(.greet)\n[$env] | map(.list)\n[$env] | map(.str)\n[$env] | map(1)\n[$env] | map(1.0)\n[$env] | map(array)\n[$env] | map(false)\n[$env] | map(foo)\n[$env] | map(true)\n[$env] | one(.ok)\n[$env] | reduce(#)\n[$env] | reduce(#.Bar)\n[$env] | reduce(#.add)\n[$env] | reduce(#.add?.[false])\n[$env] | reduce(#.f64 | map(#.str))\n[$env] | reduce(#.greet, greet)\n[$env] | reduce(#.greet?.[foo])\n[$env] | reduce(#.ok)\n[$env] | reduce(#index)\n[$env] | reduce($env)\n[$env] | reduce(.Bar)\n[$env] | reduce(.Bar, 0)\n[$env] | reduce(.String)\n[$env] | reduce(0)\n[$env] | reduce(1)\n[$env] | reduce(1.0)\n[$env] | reduce(array)\n[$env] | reduce(f64)\n[$env] | reduce(false)\n[$env] | reduce(false, 1.0)\n[$env] | reduce(foo)\n[$env] | reduce(greet, true)\n[$env] | reduce(i)\n[$env] | reduce(list, i)\n[$env] | reduce(ok)\n[$env] | reduce(str)\n[$env] | sortBy(#.list)\n[$env] | sortBy(#?.[.String])\n[$env] | sortBy(.array)\n[$env] | sortBy(.foo)\n[$env] | sortBy(1)\n[$env] | sortBy(array)\n[$env] | sortBy(false)\n[$env] | sortBy(foo)\n[$env] | sortBy(greet)\n[$env] | sortBy(list)\n[$env] | sum(#.f64)\n[$env] | sum(#.i)\n[$env] | sum(.f64)\n[$env] | sum(1)\n[$env] | sum(1.0)\n[$env]; i\n[$env][len(list):]\n[-$env.f64]\n[--1.0]\n[-0, list]\n[-0, ok]\n[-0]\n[-1.0, i ?? foo]\n[-1.0]\n[-1]\n[-f64]\n[-i, add]\n[-i, f64]\n[-i]\n[0 != $env]\n[0 != 0]\n[0 != 1.0]\n[0 != f64]\n[0 != i]\n[0 != nil]\n[0 % i]\n[0 * 0]\n[0 * 1.0]\n[0 * 1]\n[0 * f64]\n[0 ** 0]\n[0 ** 1.0, f64]\n[0 ** 1.0]\n[0 ** 1]\n[0 + 1.0]\n[0 + f64]\n[0 + i]\n[0 - 0]\n[0 - 1.0]\n[0 - 1]\n[0 - i]\n[0 .. 0]\n[0 .. i]\n[0 / 0]\n[0 / f64]\n[0 / i]\n[0 < 0]\n[0 < 1.0]\n[0 < 1]\n[0 < f64]\n[0 < i]\n[0 <= 0]\n[0 <= f64]\n[0 <= i]\n[0 == $env]\n[0 == 0]\n[0 == 1.0]\n[0 == 1]\n[0 == i]\n[0 == nil]\n[0 > 0]\n[0 > 1]\n[0 > f64]\n[0 > i]\n[0 >= 1.0]\n[0 >= 1]\n[0 >= f64]\n[0 ?? 0]\n[0 ?? 1.0]\n[0 ?? array]\n[0 ?? foo]\n[0 ?? greet]\n[0 ?? i]\n[0 ?? nil]\n[0 ?? ok]\n[0 ?? true]\n[0 ^ 1.0]\n[0 ^ 1]\n[0 ^ i]\n[0 in array]\n[0 not in array]\n[0 | bitor(1), list]\n[0 | median(1.0)]\n[0, $env] | count(false || true)\n[0, $env] | map(1)\n[0, $env] | reduce(str, 1.0)\n[0, $env] | sortBy(1.0)\n[0, $env]?.[i]\n[0, 0] | reduce(1.0, $env)\n[0, 1.0] | map(array)\n[0, 1.0]?.[i]\n[0, 1]?.[i]\n[0, add] | findLastIndex(ok)\n[0, add]?.[i]\n[0, false]?.[i]\n[0, foo] | findLast(true)\n[0, foo] | reduce(#, 1)\n[0, foo]?.[i]\n[0, foo][:]\n[0, greet]?.[i]\n[0, i] | any(false)\n[0, i]?.[i]\n[0, list, true] | map(#)\n[0, list] | sortBy(f64)\n[0, list]?.[i]\n[0, nil] | map(#)\n[0, nil]?.[i]\n[0, ok]?.[i]\n[0, str] | map(#)\n[0, true] ?? str\n[0, true]?.[i]\n[0.0]\n[0.1]\n[0] ?? $env?.String\n[0] ?? groupBy($env, .Bar)\n[0] | all(false)\n[0] | any(false)\n[0] | count(ok)\n[0] | findIndex(ok)\n[0] | groupBy(i)\n[0] | groupBy(true)\n[0] | map(#)\n[0] | map(array)\n[0] | map(f64)\n[0] | map(foo)\n[0] | map(greet)\n[0] | map(true)\n[0] | none(false)\n[0] | one(ok)\n[0] | one(true)\n[0] | reduce(#)\n[0] | reduce(0, nil)\n[0] | reduce(1)\n[0] | reduce(false)\n[0] | reduce(foo, $env)\n[0] | reduce(i)\n[0] | sortBy(#)\n[0] | sortBy(0)\n[0] | sortBy(1.0)\n[0] | sortBy(foo)\n[0] | sortBy(str)\n[0] | sum(#)\n[0] | sum(i)\n[1 != $env]\n[1 != 0]\n[1 != 1.0]\n[1 != 1]\n[1 != f64]\n[1 != i]\n[1 != nil]\n[1 % i]\n[1 * 0]\n[1 * 1.0]\n[1 * 1]\n[1 * f64]\n[1 ** 1.0]\n[1 ** 1]\n[1 ** f64]\n[1 ** i]\n[1 + 0]\n[1 + 1.0]\n[1 + 1]\n[1 + f64]\n[1 + i]\n[1 - 0]\n[1 - 1.0]\n[1 - f64]\n[1 - i]\n[1 .. 1]\n[1 / 1.0]\n[1 / f64]\n[1 / i]\n[1 < 0]\n[1 < 1.0, foo]\n[1 < 1.0]\n[1 < 1]\n[1 < f64]\n[1 <= 1.0]\n[1 <= 1]\n[1 <= i]\n[1 == $env]\n[1 == 1.0]\n[1 == 1]\n[1 == f64]\n[1 == i]\n[1 == nil]\n[1 > 1.0]\n[1 > 1]\n[1 > i]\n[1 >= 1.0]\n[1 >= 1]\n[1 >= i]\n[1 ?? 1, i]\n[1 ?? 1.0]\n[1 ?? 1]\n[1 ?? add]\n[1 ?? array]\n[1 ?? foo]\n[1 ?? list, greet]\n[1 ?? list]\n[1 ?? nil]\n[1 ?? str]\n[1 ?? true]\n[1 ^ f64]\n[1 ^ i]\n[1 | max(1.0)]\n[1 | median(1.0)]\n[1, $env]?.[i]\n[1, 1.0] | one(ok)\n[1, 1.0]?.[i]\n[1, 1] | reduce(true)\n[1, 1]?.[i]\n[1, false] | all(false)\n[1, false] | groupBy(true)\n[1, foo] | count(true)\n[1, foo]?.[i]\n[1, greet] | reduce(#, foo)\n[1, greet] | reduce(#acc, 0)\n[1, greet]?.[i]\n[1, nil] | reduce(add, array)\n[1, str, 0] | findLastIndex($env?.ok)\n[1, true] | findLastIndex(#)\n[1.0 != $env]\n[1.0 != $env] | all(ok)\n[1.0 != 0]\n[1.0 != 1.0]\n[1.0 != 1]\n[1.0 != f64]\n[1.0 != i]\n[1.0 != nil]\n[1.0 * 0]\n[1.0 * 1.0]\n[1.0 * 1]\n[1.0 * i]\n[1.0 ** 0]\n[1.0 ** 1, ok]\n[1.0 ** 1.0]\n[1.0 ** 1]\n[1.0 ** f64]\n[1.0 ** i]\n[1.0 + 0]\n[1.0 + 1.0]\n[1.0 + 1]\n[1.0 + f64]\n[1.0 + i]\n[1.0 - 0]\n[1.0 - 1.0]\n[1.0 - 1]\n[1.0 - i]\n[1.0 / 0]\n[1.0 / 1.0]\n[1.0 / 1]\n[1.0 / f64]\n[1.0 / i]\n[1.0 < 0]\n[1.0 < 1.0]\n[1.0 < 1]\n[1.0 < f64]\n[1.0 < i]\n[1.0 <= 0]\n[1.0 <= 1.0, foo]\n[1.0 <= 1.0]\n[1.0 <= 1]\n[1.0 <= f64]\n[1.0 <= i]\n[1.0 == $env]\n[1.0 == 0]\n[1.0 == 1.0]\n[1.0 == 1]\n[1.0 == f64]\n[1.0 == i]\n[1.0 == nil]\n[1.0 > 0]\n[1.0 > 1.0]\n[1.0 > 1]\n[1.0 > f64]\n[1.0 > i]\n[1.0 >= 0]\n[1.0 >= 1.0]\n[1.0 >= 1]\n[1.0 >= f64]\n[1.0 >= i]\n[1.0 ?? $env]\n[1.0 ?? 0]\n[1.0 ?? 1.0]\n[1.0 ?? add]\n[1.0 ?? array]\n[1.0 ?? f64]\n[1.0 ?? foo]\n[1.0 ?? greet]\n[1.0 ?? list]\n[1.0 ?? nil]\n[1.0 ?? str]\n[1.0 ^ 0]\n[1.0 ^ 1.0]\n[1.0 ^ 1]\n[1.0 ^ f64]\n[1.0 ^ i]\n[1.0 in array, list]\n[1.0 not in array]\n[1.0 | max(f64)]\n[1.0 | mean(array)]\n[1.0 | mean(f64)]\n[1.0 | min(1)]\n[1.0 | min(1.0, i)]\n[1.0, $env] | map(add)\n[1.0, $env] | map(str)\n[1.0, $env] | reduce(array)\n[1.0, $env]?.[i]\n[1.0, 0] | groupBy(#)\n[1.0, 0] | map(#)\n[1.0, 1.0] | findLast(true)\n[1.0, 1.0] | mean(i)\n[1.0, 1.0] | reduce(str)\n[1.0, 1.0] | sortBy(#)\n[1.0, 1.0]?.[i]\n[1.0, 1]?.[i]\n[1.0, add] | any(ok)\n[1.0, f64] | reduce(#)\n[1.0, f64]?.[i]\n[1.0, foo]?.[i]\n[1.0, greet] | reduce($env, list)\n[1.0, greet]?.[i]\n[1.0, i]?.[i]\n[1.0, list] ?? ok\n[1.0, nil] | reduce(true)\n[1.0, nil] | sortBy(1)\n[1.0, nil] | sum(f64)\n[1.0, ok] | findLastIndex(true)\n[1.0, ok]?.[i]\n[1.0, str] | map(array)\n[1.0, str] | reduce(greet)\n[1.0, true] | map($env)\n[1.0, true]?.[i]\n[1.0]\n[1.0] != array\n[1.0] != nil || ok\n[1.0] == list\n[1.0] ?? array\n[1.0] ?? count($env, $env)\n[1.0] ?? f64\n[1.0] | all(true)\n[1.0] | any(true)\n[1.0] | filter(ok)\n[1.0] | filter(true)\n[1.0] | find(false)\n[1.0] | findLastIndex(false)\n[1.0] | get(0)\n[1.0] | groupBy(#)\n[1.0] | groupBy(0)\n[1.0] | groupBy(1)\n[1.0] | groupBy(1.0)\n[1.0] | groupBy(f64)\n[1.0] | groupBy(foo)\n[1.0] | map(#)\n[1.0] | map(#index)\n[1.0] | map($env)\n[1.0] | map(1)\n[1.0] | map(1.0)\n[1.0] | map(add)\n[1.0] | map(array)\n[1.0] | map(foo)\n[1.0] | map(greet)\n[1.0] | map(i)\n[1.0] | map(str)\n[1.0] | median(1.0)\n[1.0] | one(false)\n[1.0] | one(ok)\n[1.0] | one(true)\n[1.0] | reduce(#)\n[1.0] | reduce(#acc)\n[1.0] | reduce(#acc, foo)\n[1.0] | reduce($env)\n[1.0] | reduce(0)\n[1.0] | reduce(1, foo)\n[1.0] | reduce(1.0)\n[1.0] | reduce(add)\n[1.0] | reduce(array)\n[1.0] | reduce(f64)\n[1.0] | reduce(false)\n[1.0] | reduce(greet)\n[1.0] | sortBy(0)\n[1.0] | sortBy(1)\n[1.0] | sortBy(false)\n[1.0] | sortBy(greet)\n[1.0] | sortBy(list)\n[1.0] | sum(0)\n[1.0] | sum(1.0)\n[1.0][:]\n[1.1]\n[1] != [1]\n[1] ?? f64\n[1] ?? ok\n[1] | all(true)\n[1] | filter(false)\n[1] | findIndex(ok)\n[1] | findIndex(true)\n[1] | findLast(ok)\n[1] | groupBy(#)\n[1] | groupBy(f64)\n[1] | groupBy(foo)\n[1] | groupBy(str)\n[1] | map(#)\n[1] | map($env)\n[1] | map(1.0)\n[1] | map(foo)\n[1] | mean(1.0)\n[1] | one(ok)\n[1] | reduce(#)\n[1] | reduce(#, foo)\n[1] | reduce(1.0, true)\n[1] | reduce(f64, foo)\n[1] | reduce(list)\n[1] | sortBy(#)\n[1] | sortBy($env)\n[1] | sortBy(1.0)\n[1] | sortBy(array)\n[1] | sortBy(true)\n[1] | sum(#)\n[1] | sum(1.0)\n[1] | sum(f64)\n[1]?.[f64 ?? $env]\n[[$env, greet, i]]\n[[$env, i, 1.0]]\n[[$env]]\n[[0]]\n[[1, add]]\n[[1, foo], greet]\n[[1, ok]]\n[[1, true, true]]\n[[1.0, foo]]\n[[1.0, true]]\n[[1.0], 1 / 1.0]\n[[1.0], foo]\n[[1.0], greet]\n[[1.0]]\n[[1]]\n[[add, ok]]\n[[add]]\n[[array, $env]]\n[[array]]\n[[f64, array]]\n[[f64, foo]]\n[[f64]]\n[[false, add]]\n[[false]]\n[[foo, 1]]\n[[foo, array]]\n[[foo, f64]]\n[[foo, true]]\n[[foo], i]\n[[foo]]\n[[greet], $env?.String]\n[[greet], add]\n[[greet]]\n[[i, foo]]\n[[i]]\n[[list, nil, foo]]\n[[list, nil]]\n[[list, ok, foo]]\n[[list]]\n[[nil, $env]]\n[[nil, ok]]\n[[nil], f64]\n[[nil], i]\n[[nil]]\n[[ok, 0]]\n[[ok, add]]\n[[ok]]\n[[str]]\n[[true]]\n[[{foo: false, foo: add}]]\n[abs(0)]\n[abs(1)]\n[abs(1.0)]\n[abs(f64)]\n[abs(i)]\n[add != $env]\n[add != nil]\n[add == $env]\n[add == nil]\n[add ?? $env]\n[add ?? 0]\n[add ?? 1.0]\n[add ?? array]\n[add ?? f64]\n[add ?? foo]\n[add ?? list]\n[add ?? nil]\n[add ?? str]\n[add ?? true]\n[add(1, i)]\n[add(i, 1)]\n[add(i, i)]\n[add, $env != 1]\n[add, $env.foo]\n[add, $env?.[String]]\n[add, $env?.[str]]\n[add, $env?.greet]\n[add, -1.0]\n[add, 0] | map(add)\n[add, 1.0, i] | count(true)\n[add, 1.0]?.[i]\n[add, 1] | reduce(true, nil)\n[add, [$env]]\n[add, add]\n[add, array]\n[add, f64]\n[add, f64]?.[i]\n[add, false]?.[i]\n[add, foo, list]\n[add, foo.Bar]\n[add, foo?.String]\n[add, foo]\n[add, foo] | groupBy(foo)\n[add, foo] | reduce(#index)\n[add, foo] | reduce(f64)\n[add, foo] | reduce(foo)\n[add, foo] | sortBy(i)\n[add, greet]\n[add, greet] | reduce(i, foo)\n[add, i]\n[add, list]\n[add, ok]\n[add, ok] | groupBy(foo)\n[add, ok] | none(ok)\n[add, ok]?.[i]\n[add, str]\n[add, str] | groupBy(f64)\n[add, string(i)]\n[add, toJSON(true)]\n[add, true]?.[i]\n[add]\n[add] ?? greet\n[add] ?? ok\n[add] | all(false)\n[add] | all(true)\n[add] | any(false)\n[add] | any(ok)\n[add] | findLast(ok)\n[add] | findLastIndex(false)\n[add] | groupBy(0)\n[add] | groupBy(true)\n[add] | map(#)\n[add] | map($env)\n[add] | map(0)\n[add] | map(1.0)\n[add] | map(add)\n[add] | map(greet)\n[add] | map(ok)\n[add] | none(ok)\n[add] | reduce(#)\n[add] | reduce(#, add)\n[add] | reduce(#acc)\n[add] | reduce(1)\n[add] | reduce(foo, foo)\n[add] | reduce(ok)\n[add] | sortBy($env)\n[add] | sortBy(list)\n[add] | sum(1)\n[add] | sum(1.0)\n[add][i:]\n[all($env, ok)]\n[all($env, true)]\n[all(array, false)]\n[all(list, ok)]\n[any(list, false)]\n[array != $env]\n[array != array]\n[array != list]\n[array != nil]\n[array == $env]\n[array == array]\n[array == list]\n[array == nil]\n[array ?? 1.0]\n[array ?? f64]\n[array ?? false]\n[array ?? foo]\n[array ?? greet]\n[array ?? true]\n[array | all(ok)]\n[array | findIndex(ok)]\n[array | findLast(false)]\n[array | groupBy(#)]\n[array | groupBy(foo)]\n[array | map(#)]\n[array | map($env)]\n[array | map(0)]\n[array | map(1)]\n[array | map(1.0)]\n[array | map(add)]\n[array | map(foo)]\n[array | map(i)]\n[array | map(ok)]\n[array | mean(1.0)]\n[array | one(false)]\n[array | one(true)]\n[array | reduce(#)]\n[array | reduce(#, false)]\n[array | reduce(#index)]\n[array | reduce($env)]\n[array | reduce(0)]\n[array | reduce(1.0)]\n[array | reduce(add)]\n[array | reduce(array)]\n[array | reduce(f64)]\n[array | reduce(false)]\n[array | reduce(foo)]\n[array | reduce(foo, true)]\n[array | reduce(ok)]\n[array | sortBy(#)]\n[array | sortBy(1)]\n[array | sortBy(1.0)]\n[array | sortBy(f64)]\n[array | sum(#), foo]\n[array | sum(#)]\n[array | sum(1)]\n[array | sum(1.0)]\n[array | sum(i)]\n[array, !ok]\n[array, !true]\n[array, $env.array]\n[array, $env?.[Bar]]\n[array, 0 == $env]\n[array, 1.0 == 1]\n[array, 1.0]?.[i]\n[array, 1] | findIndex(ok)\n[array, add, add]\n[array, add]\n[array, array]\n[array, array]?.[i]\n[array, f64]\n[array, f64] | findIndex(ok)\n[array, f64] | reduce(str)\n[array, f64]?.[i]\n[array, false, ok] | findLastIndex(#)\n[array, false] | sum(f64)\n[array, foo]\n[array, foo]?.[i]\n[array, greet]\n[array, greet] | reduce(foo)\n[array, i]\n[array, i]?.[i]\n[array, len($env)]\n[array, list]\n[array, nil] | map(#)\n[array, nil] | sum(0)\n[array, ok]\n[array, ok] | filter(false)\n[array, ok] | reduce(true)\n[array, ok]?.[i]\n[array, str, ok]\n[array, str]\n[array, str] | reduce(1.0)\n[array, true] ?? $env?.[str]\n[array, {foo: list}]\n[array?.[1]]\n[array?.[i]]\n[array[:1]]\n[array[i:]]\n[array]\n[array] ?? add\n[array] ?? f64\n[array] ?? ok\n[array] | all(false)\n[array] | any(false)\n[array] | count(false)\n[array] | count(ok)\n[array] | find(true)\n[array] | findLastIndex(true)\n[array] | groupBy(ok)\n[array] | map(#)\n[array] | map($env)\n[array] | map(1.0)\n[array] | map(greet)\n[array] | map(ok)\n[array] | map(str)\n[array] | mean(i)\n[array] | reduce(#)\n[array] | reduce(#, 1.0)\n[array] | reduce($env)\n[array] | reduce($env, 1.0)\n[array] | reduce(0)\n[array] | reduce(1.0)\n[array] | reduce(ok)\n[array] | sortBy(#)\n[array] | sortBy($env)\n[array] | sortBy(i)\n[array] | sum(0)\n[array] | sum(1)\n[array] | sum(1.0)\n[array][:i]\n[bitnot(0)]\n[bitnot(1)]\n[bitnot(i)]\n[ceil(0)]\n[ceil(1)]\n[ceil(1.0)]\n[ceil(f64), add]\n[ceil(f64)]\n[ceil(i)]\n[concat(array), i]\n[concat(array)]\n[concat(list)]\n[count($env, false)]\n[count(list, false)]\n[f64 != $env]\n[f64 != 0]\n[f64 != 1.0]\n[f64 != i]\n[f64 != nil]\n[f64 * 1.0]\n[f64 * 1]\n[f64 * f64]\n[f64 * i]\n[f64 ** 0]\n[f64 ** 1.0]\n[f64 ** 1]\n[f64 ** i]\n[f64 + 1.0]\n[f64 - 0]\n[f64 - 1]\n[f64 - f64]\n[f64 / 1.0]\n[f64 / 1]\n[f64 / f64]\n[f64 < 0]\n[f64 < 1.0]\n[f64 < 1]\n[f64 < f64]\n[f64 < i]\n[f64 <= 1.0]\n[f64 <= 1]\n[f64 <= f64]\n[f64 == $env]\n[f64 == 0]\n[f64 == 1.0]\n[f64 == 1]\n[f64 == f64]\n[f64 == i]\n[f64 == nil]\n[f64 > 1.0]\n[f64 > f64]\n[f64 > i]\n[f64 >= 0]\n[f64 >= 1.0]\n[f64 >= i]\n[f64 ?? $env]\n[f64 ?? array]\n[f64 ?? foo]\n[f64 ?? greet]\n[f64 ?? nil]\n[f64 ^ 0]\n[f64 ^ 1]\n[f64 ^ f64]\n[f64 not in array]\n[f64 | median(1.0)]\n[f64, $env == 1.0]\n[f64, $env.add]\n[f64, $env.foo]\n[f64, $env.list]\n[f64, $env?.String]\n[f64, $env] | map(ok)\n[f64, 1.0 ^ i]\n[f64, 1.0] | map(0)\n[f64, abs(f64)]\n[f64, add]\n[f64, array]\n[f64, f64]\n[f64, foo]\n[f64, foo] | reduce(#)\n[f64, foo]?.[i]\n[f64, greet]\n[f64, i ?? 1]\n[f64, i]\n[f64, i] | findLast(false)\n[f64, i] | groupBy(1)\n[f64, i] | take(i)\n[f64, list]\n[f64, nil != foo]\n[f64, nil]?.[i]\n[f64, not true]\n[f64, ok]\n[f64, str]\n[f64, str] | findLast(ok)\n[f64, {foo: 0}]\n[f64]\n[f64] | count(ok)\n[f64] | findLast(ok)\n[f64] | findLast(true)\n[f64] | groupBy(#)\n[f64] | groupBy(str)\n[f64] | map(#)\n[f64] | map(#index)\n[f64] | map(1)\n[f64] | map(1.0)\n[f64] | map(add)\n[f64] | map(false)\n[f64] | map(foo)\n[f64] | map(greet)\n[f64] | none(false)\n[f64] | reduce(#)\n[f64] | reduce(1)\n[f64] | reduce(1.0)\n[f64] | reduce(f64)\n[f64] | reduce(false)\n[f64] | reduce(greet, true)\n[f64] | reduce(true, foo)\n[f64] | sortBy($env)\n[f64] | sortBy(0)\n[f64] | sortBy(add)\n[f64] | sum(#)\n[f64] | sum(1.0)\n[f64] | sum(i)\n[f64][:]\n[false != $env]\n[false != false]\n[false != nil]\n[false != true]\n[false && $env]\n[false && false]\n[false && true]\n[false == $env]\n[false == false]\n[false == nil]\n[false == ok]\n[false == true]\n[false ? 1.0 : foo]\n[false ? foo : 1.0]\n[false ?: 1.0]\n[false ?: foo]\n[false ?? $env]\n[false ?? 0, greet]\n[false ?? 0]\n[false ?? 1.0]\n[false ?? false, greet]\n[false ?? false]\n[false ?? foo]\n[false ?? greet]\n[false ?? nil]\n[false ?? ok]\n[false ?? true]\n[false and $env]\n[false and ok]\n[false and true]\n[false or $env]\n[false or false]\n[false or true]\n[false || $env?.[Bar]]\n[false || $env]\n[false || false, list]\n[false || ok]\n[false || true]\n[false, $env] | findIndex(true)\n[false, $env] | groupBy(1.0)\n[false, $env]?.[i]\n[false, 0] | map(#)\n[false, 1.0]?.[i]\n[false, 1] != nil ? 1.0 : $env[add(false) == greet():]\n[false, 1] | groupBy(#)\n[false, 1]?.[i]\n[false, add] | all(false)\n[false, array] | reduce(0)\n[false, f64]?.[i]\n[false, foo]?.[i]\n[false, greet]?.[i]\n[false, i] | map(#)\n[false, i]?.[i]\n[false, str] | groupBy(foo)\n[false, true]?.[i]\n[false] == $env?.Bar\n[false] ?? f64\n[false] ?? foo\n[false] | all(#)\n[false] | all(true)\n[false] | any(#)\n[false] | count(false)\n[false] | find(#)\n[false] | findIndex(#)\n[false] | findLast(true)\n[false] | findLastIndex(#)\n[false] | findLastIndex(false)\n[false] | groupBy(#)\n[false] | groupBy(1.0)\n[false] | groupBy(foo)\n[false] | groupBy(i)\n[false] | map(#)\n[false] | map($env)\n[false] | map(foo)\n[false] | map(list)\n[false] | none(#)\n[false] | one(#)\n[false] | one(false)\n[false] | reduce(false, add)\n[false] | reduce(foo)\n[false] | reduce(greet)\n[false] | reduce(list, foo)\n[false] | reduce(true)\n[false] | sortBy(#)\n[false] | sortBy($env)\n[false] | sortBy(1.0)\n[false] | sortBy(array)\n[false] | sortBy(false)\n[false] | sortBy(true)\n[false] | sum(1)\n[false] | sum(1.0)\n[false][:]\n[false][i:]\n[filter($env, false)]\n[filter(array, false)]\n[find(array, false)]\n[find(array, true)]\n[find(list, false)]\n[find(list, true)]\n[findIndex($env, true)]\n[findIndex(array, false)]\n[findIndex(list, ok)]\n[findIndex(list, true)]\n[findLast(array, true)]\n[findLast(list, false), i]\n[findLastIndex($env, ok)]\n[findLastIndex(array, true)]\n[findLastIndex(list, true)]\n[first($env)]\n[first(array)]\n[first(list), string(foo)]\n[first(list)]\n[flatten(array)]\n[flatten(list)]\n[float(0)]\n[float(1)]\n[float(1.0)]\n[float(f64), ok]\n[float(f64)]\n[float(i)]\n[floor(0)]\n[floor(1), f64]\n[floor(1)]\n[floor(1.0)]\n[floor(f64)]\n[floor(i)]\n[foo != $env.foo]\n[foo != $env]\n[foo != foo, add]\n[foo != foo]\n[foo != nil]\n[foo == $env, list]\n[foo == $env]\n[foo == foo]\n[foo == nil]\n[foo ?? $env?.String()]\n[foo ?? $env]\n[foo ?? 0]\n[foo ?? 1.0]\n[foo ?? 1]\n[foo ?? add]\n[foo ?? array]\n[foo ?? f64]\n[foo ?? false]\n[foo ?? foo]\n[foo ?? i]\n[foo ?? list]\n[foo ?? str]\n[foo ?? true]\n[foo in list]\n[foo not in list]\n[foo, $env?.[str]]\n[foo, $env?.f64]\n[foo, $env?.false]\n[foo, $env?.ok]\n[foo, $env] | find(ok)\n[foo, $env] | map(1.0)\n[foo, $env] | sortBy(f64)\n[foo, $env]?.[i]\n[foo, -f64]\n[foo, 0] | groupBy(1.0)\n[foo, 0] | map(#)\n[foo, 1.0, $env]?.[i]\n[foo, 1.0] | groupBy(1)\n[foo, 1.0] | map(foo)\n[foo, 1.0] | one(ok)\n[foo, 1.0]?.[i]\n[foo, 1] | map(list)\n[foo, 1]?.[i]\n[foo, 1]?.[i] != greet\n[foo, abs(1.0)]\n[foo, add, $env] | findLastIndex(ok)\n[foo, add, f64]\n[foo, add]\n[foo, add]?.[i]\n[foo, array]\n[foo, array] | reduce(i)\n[foo, array]?.[i]\n[foo, f64, greet] | sortBy(1.0)\n[foo, f64]\n[foo, f64] | count(false)\n[foo, f64]?.[i]\n[foo, false, add] | none(true)\n[foo, false] | map(#)\n[foo, false]?.[i]\n[foo, foo != $env]\n[foo, foo.String]\n[foo, foo]\n[foo, foo] != list\n[foo, foo] | groupBy(1.0)\n[foo, foo] | reduce(1.0)\n[foo, foo]?.[i]\n[foo, greet(str)]\n[foo, greet]\n[foo, i, greet]\n[foo, i]\n[foo, i]?.[i]\n[foo, int(0)]\n[foo, list, foo] | reduce(list)\n[foo, list]\n[foo, list] != array\n[foo, list] | groupBy(f64)\n[foo, list]?.[i]\n[foo, mean(1)]\n[foo, nil != str]\n[foo, nil, list] | map(#)\n[foo, nil] | map(0)\n[foo, nil]?.[i]\n[foo, ok]\n[foo, ok] | all(true)\n[foo, round(1)]\n[foo, str]\n[foo, str] ?? f64\n[foo, str]?.[i]\n[foo, true]?.[i]\n[foo, values($env)]\n[foo.Bar, [foo]]\n[foo.Bar, greet]\n[foo.Bar, ok]\n[foo.Bar]\n[foo.String()]\n[foo.String, f64]\n[foo.String, list]\n[foo.String]\n[foo?.Bar]\n[foo?.String(), ok]\n[foo?.String()]\n[foo?.String, $env?.String]\n[foo?.String]\n[foo]\n[foo] != array\n[foo] == $env?.[Bar]\n[foo] ?? add\n[foo] ?? array\n[foo] ?? greet\n[foo] ?? list\n[foo] ?? ok\n[foo] in [nil]\n[foo] | all(ok)\n[foo] | all(true)\n[foo] | any(ok)\n[foo] | any(true)\n[foo] | count(false)\n[foo] | count(ok)\n[foo] | count(true)\n[foo] | filter(ok)\n[foo] | filter(true)\n[foo] | find(false)\n[foo] | find(ok)\n[foo] | findLast(false)\n[foo] | findLastIndex(ok)\n[foo] | groupBy(#)\n[foo] | groupBy(#.Bar)\n[foo] | groupBy(f64)\n[foo] | groupBy(false)\n[foo] | groupBy(foo)\n[foo] | groupBy(ok)\n[foo] | map(#)\n[foo] | map(.String)\n[foo] | map(1)\n[foo] | map(add)\n[foo] | map(f64)\n[foo] | map(foo)\n[foo] | map(i)\n[foo] | map(list)\n[foo] | map(ok)\n[foo] | none(!true)\n[foo] | none(ok)\n[foo] | none(true)\n[foo] | one(false)\n[foo] | one(ok)\n[foo] | reduce(#)\n[foo] | reduce(#, ok)\n[foo] | reduce(#.String, 0)\n[foo] | reduce(#index)\n[foo] | reduce(.Bar, 0)\n[foo] | reduce(.Bar, nil)\n[foo] | reduce(0)\n[foo] | reduce(1)\n[foo] | reduce(1, 1.0)\n[foo] | reduce(1.0)\n[foo] | reduce(1.0, foo)\n[foo] | reduce(add)\n[foo] | reduce(array)\n[foo] | reduce(false)\n[foo] | reduce(foo)\n[foo] | reduce(foo, list)\n[foo] | reduce(greet)\n[foo] | reduce(i, 0)\n[foo] | reduce(list)\n[foo] | reduce(ok)\n[foo] | reduce(true)\n[foo] | sortBy(#)\n[foo] | sortBy(#.String)\n[foo] | sortBy($env)\n[foo] | sortBy(.Bar)\n[foo] | sortBy(1)\n[foo] | sortBy(add)\n[foo] | sortBy(f64)\n[foo] | sortBy(false)\n[foo] | sortBy(greet)\n[foo] | sortBy(i)\n[foo] | sortBy(str)\n[foo] | sum(i)\n[foo][:]\n[foo][:i]\n[get($env, nil)]\n[get($env, str)]\n[greet != $env]\n[greet != nil]\n[greet == $env]\n[greet == nil, array]\n[greet == nil]\n[greet ?? 1.0, list]\n[greet ?? 1]\n[greet ?? f64]\n[greet ?? foo, foo]\n[greet ?? foo]\n[greet ?? i]\n[greet(str), array]\n[greet(str), greet]\n[greet(str)]\n[greet, $env.array]\n[greet, $env.greet]\n[greet, $env.i]\n[greet, $env?.greet]\n[greet, $env?.nil]\n[greet, $env] | none(false)\n[greet, $env] | reduce(true)\n[greet, $env]?.[i]\n[greet, -i]\n[greet, 0]?.[i]\n[greet, 1.0]?.[i]\n[greet, [array]]\n[greet, abs(1.0)]\n[greet, add]\n[greet, add] | reduce($env)\n[greet, array]\n[greet, array] | map(i)\n[greet, f64]\n[greet, f64] | reduce(f64)\n[greet, foo == $env]\n[greet, foo ?? $env]\n[greet, foo]\n[greet, foo] | none(true)\n[greet, foo]?.[i]\n[greet, greet]\n[greet, greet] | reduce(#)\n[greet, i]\n[greet, int(1)]\n[greet, list]\n[greet, list] | reduce(add)\n[greet, nil]?.[i]\n[greet, ok]\n[greet, str, f64]\n[greet, str]\n[greet, true]?.[i]\n[greet]\n[greet] == $env.array\n[greet] ?? add\n[greet] ?? array\n[greet] ?? false ?? i\n[greet] ?? i\n[greet] ?? list\n[greet] ?? median(1.0)\n[greet] ?? str\n[greet] | all(ok)\n[greet] | any(false)\n[greet] | count(false)\n[greet] | find(false)\n[greet] | find(ok)\n[greet] | groupBy(1)\n[greet] | groupBy(foo)\n[greet] | groupBy(true)\n[greet] | map($env)\n[greet] | map(1)\n[greet] | map(add)\n[greet] | map(i)\n[greet] | map(str)\n[greet] | reduce(#, array)\n[greet] | reduce(false, nil)\n[greet] | reduce(foo, $env)\n[greet] | reduce(greet)\n[greet] | reduce(ok)\n[greet] | sortBy(#)\n[greet] | sortBy(array)\n[greet] | sortBy(i)\n[greet] | sortBy(str)\n[greet] | sum(f64)\n[greet][:i]\n[greet][i:]\n[groupBy(array, #)]\n[groupBy(array, foo)]\n[groupBy(list, #)?.[foo]]\n[groupBy(list, #)]\n[groupBy(list, 1.0)?.[i]]\n[groupBy(list, f64)]\n[groupBy(list, false)]\n[groupBy(list, foo)]\n[i != $env]\n[i != 0, str]\n[i != 0]\n[i != 1.0]\n[i != 1]\n[i != f64]\n[i != i]\n[i != nil]\n[i % 1]\n[i % i]\n[i * 0]\n[i * 1.0]\n[i * 1]\n[i * i]\n[i ** 0]\n[i ** 1.0]\n[i ** 1]\n[i ** f64]\n[i + 1.0]\n[i + 1]\n[i + f64]\n[i - 1.0]\n[i - 1]\n[i - f64]\n[i .. 0]\n[i .. i]\n[i / 1.0 ?? $env]\n[i / 1.0]\n[i / 1]\n[i < 1.0]\n[i < 1]\n[i <= 1.0]\n[i <= 1]\n[i <= f64]\n[i == $env]\n[i == 0]\n[i == 1.0]\n[i == 1]\n[i == f64]\n[i == nil]\n[i > 1.0]\n[i > f64]\n[i >= 1.0]\n[i >= 1]\n[i >= f64]\n[i ?? $env]\n[i ?? array]\n[i ?? f64]\n[i ?? false]\n[i ?? foo]\n[i ?? true]\n[i ^ 1.0]\n[i ^ 1]\n[i | max(array, i)]\n[i | min(0)]\n[i, $env in list]\n[i, $env?.String]\n[i, $env?.[String]]\n[i, $env?.foobar]\n[i, -1.0]\n[i, 1.0 >= 1.0]\n[i, 1.0] | sortBy(1)\n[i, 1.0] | sum(#)\n[i, 1.0]?.[i]\n[i, 1]?.[i]\n[i, add]\n[i, array?.[i]]\n[i, array]\n[i, f64 > i]\n[i, f64 ?? str]\n[i, f64]\n[i, f64] != array\n[i, foo?.String]\n[i, foo]\n[i, foo] | groupBy(1.0)\n[i, greet]\n[i, i]\n[i, list]\n[i, nil ?? 1.0]\n[i, nil in $env]\n[i, nil] | filter(true)\n[i, nil] | groupBy(1.0)\n[i, nil]?.[i]\n[i, ok]\n[i, ok]?.[i]\n[i, str]\n[i, sum(array)]\n[i, toJSON(0)]\n[i, true] | groupBy(true)\n[i..i]\n[i]\n[i] != list\n[i] == array\n[i] == list\n[i] ?? $env?.[foo]\n[i] ?? f64\n[i] ?? greet\n[i] ?? i\n[i] ?? ok\n[i] | any(ok)\n[i] | find(false)\n[i] | findLast(ok)\n[i] | findLast(true)\n[i] | groupBy(1)\n[i] | groupBy(1.0)\n[i] | groupBy(foo)\n[i] | groupBy(ok)\n[i] | map(#)\n[i] | map(add)\n[i] | map(false)\n[i] | reduce(add, i)\n[i] | reduce(f64)\n[i] | reduce(foo)\n[i] | reduce(ok, nil)\n[i] | reduce(ok, true)\n[i] | reduce(str)\n[i] | reduce(str, str)\n[i] | sortBy(#)\n[i] | sortBy($env)\n[i] | sortBy(0)\n[i] | sortBy(1.0)\n[i] | sortBy(greet)\n[i] | sortBy(list)\n[i] | sortBy(str)\n[i] | sortBy(true)\n[i] | sum(#)\n[i] | sum(1.0)\n[i] | sum(f64)\n[i][i:]\n[if false { $env } else { 1.0 }]\n[if false { $env } else { greet }]\n[if false { 1.0 } else { true }]\n[if false { foo } else { 1 }]\n[if false { foo } else { true }]\n[if false { nil } else { $env }]\n[if false { true } else { false }]\n[if ok { 1.0 } else { foo }]\n[if ok { false } else { 1.0 }]\n[if ok { foo } else { $env }]\n[if ok { greet } else { nil }]\n[if ok { nil } else { nil }]\n[if ok { true } else { 1.0 }, $env.f64]\n[if true { $env } else { false }, list]\n[if true { 0 } else { ok }]\n[if true { 1 } else { 0 }]\n[if true { f64 } else { 1 }]\n[if true { foo } else { 1 }]\n[if true { foo } else { add }]\n[if true { foo } else { nil }]\n[if true { foo } else { ok }]\n[if true { nil } else { 1 }]\n[if true { nil } else { array }]\n[int(0), ok]\n[int(0)]\n[int(1)]\n[int(1.0)]\n[int(f64), foo]\n[int(f64)]\n[int(i)]\n[keys($env)]\n[last($env)]\n[last($env?.list)]\n[last(array)]\n[last(list), array]\n[last(list)]\n[len($env)]\n[len([nil, list])]\n[len(array), str]\n[len(array)]\n[len(list)]\n[len(str)]\n[len({foo: list})]\n[let foobar = $env; foobar]\n[let foobar = 1.0; foobar]\n[let z = 1.0; 0 + z]\n[list != $env]\n[list != array]\n[list != list]\n[list != nil]\n[list == $env]\n[list == nil]\n[list ?? 1.0]\n[list ?? add]\n[list ?? array]\n[list ?? foo]\n[list ?? greet]\n[list ?? i]\n[list ?? nil]\n[list ?? ok]\n[list | all(true)]\n[list | any(ok)]\n[list | find(false)]\n[list | findLast(false)]\n[list | groupBy(#)]\n[list | groupBy(1.0)]\n[list | groupBy(f64)]\n[list | groupBy(i)]\n[list | groupBy(str)]\n[list | map(#)]\n[list | map(foo)]\n[list | map(i), i]\n[list | reduce(#)]\n[list | reduce(#, 0)]\n[list | reduce(#, i)]\n[list | reduce(#, nil)]\n[list | reduce(#.String)]\n[list | reduce(#acc)]\n[list | reduce(#index)]\n[list | reduce(#index, greet)]\n[list | reduce($env)]\n[list | reduce($env, foo)]\n[list | reduce(1.0)]\n[list | reduce(1.0, greet)]\n[list | reduce(array)]\n[list | reduce(foo)]\n[list | reduce(i)]\n[list | reduce(list)]\n[list | sortBy(.Bar)]\n[list | sortBy(1)]\n[list | sortBy(1.0)]\n[list, $env, 1.0] | filter(ok)\n[list, $env.foo]\n[list, $env.i]\n[list, $env?.String]\n[list, $env?.list]\n[list, $env] | one(false)\n[list, 0 * i]\n[list, 0 ^ 1.0]\n[list, 0] | find(false)\n[list, 1.0 + 1.0]\n[list, 1.0]?.[i]\n[list, add]\n[list, add] | map(#)\n[list, add]?.[i]\n[list, array]\n[list, f64, ok]\n[list, f64]\n[list, f64]?.[i]\n[list, false, 1] | reduce(foo)\n[list, foo.String()]\n[list, foo]\n[list, foo] | groupBy(foo)\n[list, foo] | sum(1)\n[list, foo]?.[i]\n[list, greet]\n[list, greet] | map(#)\n[list, i ^ 1.0]\n[list, i, greet]\n[list, i]\n[list, list]\n[list, nil] | groupBy(foo)\n[list, ok]\n[list, ok]?.[i]\n[list, round(i)]\n[list, str, str]\n[list, str]\n[list, toJSON(nil)]\n[list, true != $env]\n[list, true] | reduce(f64)\n[list, true] | reduce(foo, ok)\n[list?.[0]]\n[list?.[i], add]\n[list?.[i]]\n[list[:1]]\n[list[i:]]\n[list]\n[list] != list\n[list] == $env?.String\n[list] == array\n[list] | filter(ok)\n[list] | findIndex(ok)\n[list] | findLast(false)\n[list] | findLastIndex(ok)\n[list] | get(i)\n[list] | groupBy($env.foo)\n[list] | map(#)\n[list] | map(1.0)\n[list] | map(add)\n[list] | map(i)\n[list] | map(ok)\n[list] | map(true)\n[list] | none(ok)\n[list] | one(true)\n[list] | reduce(1)\n[list] | reduce(foo)\n[list] | reduce(foo, false)\n[list] | reduce(foo, ok)\n[list] | sortBy(#)\n[list] | sortBy(add)\n[list] | sortBy(false)\n[list] | sortBy(foo)\n[list] | sortBy(i)\n[list] | sortBy(str)\n[list] | sum(1.0)\n[lower(str)]\n[map($env, #index)]\n[map($env, $env)]\n[map($env, 1.0)]\n[map($env, array)]\n[map($env, foo)]\n[map($env, greet)]\n[map($env, list)]\n[map($env, str)]\n[map(array, #)]\n[map(array, $env)]\n[map(array, 1)]\n[map(array, 1.0), foo]\n[map(array, 1.0)]\n[map(array, array)]\n[map(array, f64)]\n[map(array, false)]\n[map(array, foo)]\n[map(array, str), ok]\n[map(array, str)]\n[map(array, true)]\n[map(list, #)]\n[map(list, #index)]\n[map(list, $env)]\n[map(list, 0)]\n[map(list, f64)]\n[map(list, foo)]\n[map(list, list)]\n[map(list, ok)]\n[map(list, str)]\n[max($env), f64]\n[max($env)]\n[max(0)]\n[max(0, 1.0)]\n[max(1)]\n[max(1.0)]\n[max(1.0, 1)]\n[max(array) ^ f64]\n[max(array)]\n[max(array, 1.0)]\n[max(f64)]\n[max(i)]\n[mean(0)]\n[mean(1)]\n[mean(1, 1.0)]\n[mean(1.0)]\n[mean(array)]\n[mean(f64)]\n[mean(i)]\n[median(0)]\n[median(1)]\n[median(1, 1.0)]\n[median(1.0)]\n[median(1.0, 1.0)]\n[median(array)]\n[median(f64)]\n[median(floor(0))]\n[median(i)]\n[min($env ?? foo)]\n[min($env)]\n[min(0)]\n[min(1)]\n[min(1.0)]\n[min(array)]\n[min(f64)]\n[min(i)]\n[nil != $env?.f64]\n[nil != $env]\n[nil != 0]\n[nil != 1.0]\n[nil != add]\n[nil != array]\n[nil != f64]\n[nil != foo, greet]\n[nil != foo]\n[nil != greet]\n[nil != i]\n[nil != list, add]\n[nil != list]\n[nil != nil, ok]\n[nil != nil]\n[nil != ok]\n[nil != str]\n[nil != true]\n[nil == $env, foo]\n[nil == $env]\n[nil == 0]\n[nil == 1.0]\n[nil == add]\n[nil == array]\n[nil == f64]\n[nil == false, str]\n[nil == false]\n[nil == foo]\n[nil == greet]\n[nil == list, f64]\n[nil == list]\n[nil == nil]\n[nil == ok]\n[nil == str]\n[nil == true]\n[nil ?? $env]\n[nil ?? 1]\n[nil ?? add]\n[nil ?? false]\n[nil ?? foo, greet]\n[nil ?? foo]\n[nil ?? greet]\n[nil ?? list]\n[nil ?? nil]\n[nil ?? str]\n[nil in $env]\n[nil in list]\n[nil not in $env]\n[nil not in array]\n[nil not in list]\n[nil, $env] | reduce(0)\n[nil, $env]?.[i]\n[nil, 0] | reduce(i, greet)\n[nil, 0]?.[i]\n[nil, 1.0, 0] | all(true)\n[nil, 1.0] ?? add\n[nil, 1.0] | none(true)\n[nil, 1.0] | reduce(#)\n[nil, 1.0] | sum(f64)\n[nil, 1.0]?.[i]\n[nil, 1]?.[i]\n[nil, add] | none(false)\n[nil, add]?.[i]\n[nil, f64] | groupBy(str)\n[nil, false] | map($env)\n[nil, foo] | findLast(ok)\n[nil, foo] | map(ok)\n[nil, foo]?.[i]\n[nil, i] | filter(true)\n[nil, i]?.[i]\n[nil, nil, $env]?.[i]\n[nil, nil, array]?.[i]\n[nil, str, 1.0] | map(#)\n[nil, true]?.[i]\n[nil] == array\n[nil] == list\n[nil] == nil ? 1 : foo\n[nil] ?? i\n[nil] ?? ok\n[nil] | count(ok)\n[nil] | count(true)\n[nil] | filter(false)\n[nil] | filter(ok)\n[nil] | find(false)\n[nil] | find(true)\n[nil] | findIndex(true)\n[nil] | findLast(false)\n[nil] | findLastIndex(false)\n[nil] | findLastIndex(true)\n[nil] | groupBy(0)\n[nil] | groupBy(1)\n[nil] | groupBy(str)\n[nil] | groupBy(string(nil))\n[nil] | groupBy(true)\n[nil] | map($env)\n[nil] | map(1.0)\n[nil] | map(f64)\n[nil] | map(foo)\n[nil] | map(greet)\n[nil] | map(i)\n[nil] | map(true)\n[nil] | one(ok)\n[nil] | reduce(#index)\n[nil] | reduce(0)\n[nil] | reduce(array)\n[nil] | reduce(array, array)\n[nil] | reduce(false)\n[nil] | reduce(foo)\n[nil] | reduce(i)\n[nil] | reduce(ok)\n[nil] | reduce(true)\n[nil] | sortBy($env)\n[nil] | sortBy(0)\n[nil] | sortBy(false)\n[nil] | sortBy(foo)\n[nil] | sortBy(true)\n[nil] | sum(1)\n[nil] | sum(1.0)\n[nil] | sum(i)\n[nil][:]\n[nil][i:]\n[none($env, false)]\n[none($env, true)]\n[none(array, false)]\n[not false, add]\n[not false]\n[not ok]\n[not ok] != array\n[not true]\n[ok != $env]\n[ok != nil]\n[ok != true]\n[ok && $env]\n[ok && false, foo?.Bar]\n[ok && ok]\n[ok && true]\n[ok == $env]\n[ok == false]\n[ok == nil]\n[ok == true]\n[ok ? 0 : false]\n[ok ? 1 : greet]\n[ok ? str : i, add]\n[ok ?: 0]\n[ok ?: nil]\n[ok ?? $env]\n[ok ?? 0]\n[ok ?? 1.0]\n[ok ?? add]\n[ok ?? array]\n[ok ?? foo]\n[ok ?? greet]\n[ok ?? nil, $env in array]\n[ok ?? nil]\n[ok ?? true]\n[ok and $env]\n[ok and false]\n[ok and ok, ok]\n[ok and ok]\n[ok and true]\n[ok or $env]\n[ok or false]\n[ok or ok]\n[ok or true]\n[ok || $env]\n[ok || false]\n[ok, $env.greet]\n[ok, $env?.[foobar]]\n[ok, $env?.[str]]\n[ok, $env?.i]\n[ok, $env?.str]\n[ok, $env] | find(#)\n[ok, $env] | map(false)\n[ok, $env]?.[i]\n[ok, 0]?.[i]\n[ok, 1 / 0]\n[ok, 1.0 == 1.0]\n[ok, 1] == array\n[ok, 1] | groupBy(#)\n[ok, 1] | map(1.0)\n[ok, add]\n[ok, array]\n[ok, array]?.[i]\n[ok, f64]\n[ok, false] not in uniq(list)\n[ok, false] | map(foo)\n[ok, floor(0)]\n[ok, foo not in list]\n[ok, foo?.String]\n[ok, foo]\n[ok, foo] | any(#)\n[ok, foo] | map(f64)\n[ok, foo]?.[i]\n[ok, greet]\n[ok, i]\n[ok, int(f64)]\n[ok, list]\n[ok, list] | findIndex(false)\n[ok, list]?.[i]\n[ok, nil == 1.0]\n[ok, nil] | find(#)\n[ok, nil]?.[i]\n[ok, ok]\n[ok, ok]?.[i]\n[ok, reduce(list, str)]\n[ok, str]\n[ok, str] | reduce(foo)\n[ok, string(add)]\n[ok]\n[ok] != $env?.list\n[ok] != array\n[ok] != list\n[ok] == nil and ok\n[ok] ?? f64\n[ok] ?? foo\n[ok] | all(#)\n[ok] | any(#)\n[ok] | count(#)\n[ok] | filter(#)\n[ok] | findIndex(#)\n[ok] | findLast(#)\n[ok] | findLast(false)\n[ok] | groupBy(#)\n[ok] | groupBy(1)\n[ok] | groupBy(foo)\n[ok] | groupBy(true)\n[ok] | map(#)\n[ok] | map(0)\n[ok] | map(str)\n[ok] | none(#)\n[ok] | none(false)\n[ok] | one(#)\n[ok] | reduce($env)\n[ok] | reduce(1.0)\n[ok] | reduce(foo)\n[ok] | reduce(string(greet))\n[ok] | sortBy(#)\n[ok] | sortBy($env)\n[ok] | sortBy(array)\n[ok] | sortBy(f64)\n[ok] | sortBy(foo)\n[ok] | sortBy(greet)\n[ok] | sortBy(str)\n[ok] | sum(1.0)\n[ok] | sum(f64)\n[one($env, false)]\n[one($env, ok)]\n[one(array, ok)]\n[one(list, true)]\n[reduce(array, #)]\n[reduce(array, $env), add]\n[reduce(array, $env)]\n[reduce(array, $env, f64)]\n[reduce(array, 1.0)]\n[reduce(array, add)]\n[reduce(array, array)]\n[reduce(array, false)]\n[reduce(array, foo)]\n[reduce(array, i)]\n[reduce(array, true)]\n[reduce(list, #.String)]\n[reduce(list, .String)]\n[reduce(list, add)]\n[reduce(list, f64)]\n[reduce(list, foo)]\n[reduce(list, greet)]\n[reduce(list, i)]\n[reduce(list, list)]\n[reverse(array)]\n[reverse(list)]\n[round(0), ok]\n[round(0)]\n[round(1)]\n[round(1.0)]\n[round(f64)]\n[round(i)]\n[sort($env)?.[i], foo]\n[sort($env)]\n[sort(array)]\n[sort(last($env)), list]\n[sortBy(array, #)]\n[sortBy(array, 1.0)]\n[sortBy(array, i)]\n[sortBy(list, .Bar)]\n[sortBy(list, 1)]\n[sortBy(list, 1.0)]\n[sortBy(list, i)]\n[str != nil]\n[str < str]\n[str <= str]\n[str == nil]\n[str >= str]\n[str ?? $env]\n[str ?? 1.0]\n[str ?? 1]\n[str ?? array]\n[str ?? f64]\n[str ?? false]\n[str ?? foo]\n[str ?? nil, ok]\n[str ?? str]\n[str ?? true]\n[str contains str]\n[str in $env]\n[str in foo, foo]\n[str in foo]\n[str matches str]\n[str not contains str]\n[str not endsWith str]\n[str not in $env]\n[str not in foo]\n[str not matches str]\n[str not startsWith str]\n[str startsWith str]\n[str | greet()]\n[str | splitAfter(str)]\n[str, $env == false]\n[str, $env ?? foo]\n[str, $env | count(true)]\n[str, $env.f64]\n[str, $env.str]\n[str, $env?.[Bar]]\n[str, $env?.[str]]\n[str, $env?.array]\n[str, $env?.nil]\n[str, $env?.ok]\n[str, $env] | map(add)\n[str, 0] | reduce(false, foo)\n[str, 1.0] | map(#)\n[str, 1]?.[i]\n[str, add]\n[str, array]\n[str, f64 ** 1]\n[str, f64 > i]\n[str, f64]\n[str, false != nil]\n[str, false]?.[i]\n[str, foo.Bar]\n[str, foo]\n[str, foo] | findIndex(ok)\n[str, foo] | map(greet)\n[str, greet]\n[str, i, array] | reduce(1.0)\n[str, i]\n[str, list | findLastIndex(true)]\n[str, list]\n[str, list] | any(false)\n[str, map(list, $env)]\n[str, nil in array]\n[str, nil] | map(str)\n[str, nil]?.[i]\n[str, ok, greet]\n[str, ok]\n[str, str, 0]?.[i]\n[str, str]\n[str, str]?.[i]\n[str[1:]]\n[str[:i]]\n[str]\n[str] == array\n[str] ?? f64\n[str] ?? i\n[str] ?? str\n[str] | all(false)\n[str] | all(ok)\n[str] | any(ok)\n[str] | count(true)\n[str] | filter(ok)\n[str] | find(false)\n[str] | findLast(ok)\n[str] | findLastIndex(false)\n[str] | groupBy(#)\n[str] | groupBy(false)\n[str] | map(1)\n[str] | map(false)\n[str] | map(foo)\n[str] | none(false)\n[str] | one(ok)\n[str] | one(true)\n[str] | reduce(#)\n[str] | reduce(#acc)\n[str] | reduce(1.0, ok)\n[str] | reduce(false)\n[str] | reduce(str, i)\n[str] | sortBy(#)\n[str] | sortBy($env)\n[str] | sortBy(1.0)\n[str] | sortBy(add)\n[str] | sortBy(array)\n[str] | sortBy(foo)\n[str] | sum(abs(0))\n[str][i:]\n[string($env)]\n[string($env.f64)]\n[string($env.greet)]\n[string(0)]\n[string(1)]\n[string(1.0)]\n[string(add)]\n[string(array), any(array, true)]\n[string(array), str]\n[string(array)]\n[string(f64)]\n[string(false)]\n[string(floor(0))]\n[string(foo), add]\n[string(foo), f64]\n[string(foo), foo]\n[string(foo)]\n[string(greet)]\n[string(i)]\n[string(list) not in $env?.foobar]\n[string(list)]\n[string(nil)]\n[string(str)]\n[string(true)]\n[sum($env, 1)]\n[sum($env.array)]\n[sum($env?.[str])]\n[sum([i])]\n[sum(array) - i]\n[sum(array), i]\n[sum(array)]\n[sum(array, #)]\n[sum(array, 1)]\n[sum(array, 1.0)]\n[sum(array, f64)]\n[sum(array, i)]\n[sum(list, 0)]\n[sum(list, 1.0)]\n[toBase64(str)]\n[toBase64(string(1.0))]\n[toJSON($env.foo)]\n[toJSON($env?.[String])]\n[toJSON(0)]\n[toJSON(1)]\n[toJSON(1.0)]\n[toJSON(array)]\n[toJSON(f64)]\n[toJSON(false), str]\n[toJSON(false)]\n[toJSON(foo)]\n[toJSON(foo?.Bar)]\n[toJSON(i)]\n[toJSON(list)]\n[toJSON(nil), foo.Bar]\n[toJSON(nil)]\n[toJSON(ok), array]\n[toJSON(ok)]\n[toJSON(true)]\n[toPairs($env)]\n[trim(str)]\n[trimPrefix(str)]\n[true != $env]\n[true != false]\n[true != nil]\n[true && $env, list]\n[true && $env]\n[true && false, array]\n[true && false]\n[true && true]\n[true == $env]\n[true == false]\n[true == nil]\n[true == true]\n[true ? $env : 1.0]\n[true ? f64 : foo]\n[true ? i : false, list]\n[true ?: 1]\n[true ?: array]\n[true ?: f64]\n[true ?: list]\n[true ?: ok]\n[true ?? $env?.i]\n[true ?? $env]\n[true ?? 0]\n[true ?? 1.0]\n[true ?? 1]\n[true ?? array, sum(array)]\n[true ?? f64]\n[true ?? foo]\n[true ?? list]\n[true ?? true]\n[true and $env]\n[true and false]\n[true and ok]\n[true and true]\n[true or true]\n[true || $env]\n[true || ok]\n[true || true]\n[true, $env] | groupBy(foo)\n[true, $env] | map(foo)\n[true, 0] | map(ok)\n[true, 1.0]?.[i]\n[true, 1] == $env?.array\n[true, 1] | any(ok)\n[true, add, foo] | findLastIndex(false)\n[true, add] | findLast(true)\n[true, add] | reduce(array, greet)\n[true, add]?.[i]\n[true, f64]?.[i]\n[true, false] == list\n[true, foo] | find(#)\n[true, foo] | groupBy(foo)\n[true, foo] | sum(1.0)\n[true, foo]?.[i]\n[true, list]?.[i]\n[true, nil, greet]?.[i]?.foo\n[true, nil] | none(#)\n[true, nil] | reduce(f64)\n[true, nil]?.[i]\n[true, ok] | find(true)\n[true, ok]?.[i]\n[true, str] ?? add\n[true, str] | groupBy(1.0)\n[true, str][i:]\n[true] != [array]\n[true] != array\n[true] ?? i\n[true] in $env?.foobar\n[true] | all(#)\n[true] | all(ok)\n[true] | any(#)\n[true] | any(false)\n[true] | count(#)\n[true] | filter(#)\n[true] | findIndex(#)\n[true] | findLastIndex(#)\n[true] | findLastIndex(false)\n[true] | groupBy(#)\n[true] | groupBy($env != $env)\n[true] | groupBy(1.0)\n[true] | groupBy(foo)\n[true] | groupBy(str)\n[true] | groupBy(true)\n[true] | map(#)\n[true] | map(1.0)\n[true] | map(true)\n[true] | none(true)\n[true] | one(#)\n[true] | one(false)\n[true] | reduce(#)\n[true] | reduce($env)\n[true] | reduce($env, str)\n[true] | reduce(1.0)\n[true] | reduce(true, $env)\n[true] | sortBy(#)\n[true] | sortBy($env)\n[true] | sortBy(0)\n[true] | sortBy(foo)\n[true] | sortBy(greet)\n[true] | sortBy(true)\n[true] | sum(1)\n[true] | sum(1.0)\n[true][:0 ?? str]\n[type($env)]\n[type(0)]\n[type(1)]\n[type(1.0), $env?.foo]\n[type(1.0)]\n[type(add)]\n[type(array)]\n[type(f64)]\n[type(false), str]\n[type(false)]\n[type(foo)]\n[type(greet)]\n[type(i)]\n[type(list), array]\n[type(list)]\n[type(nil)]\n[type(ok) not endsWith str, ok]\n[type(ok)]\n[type(str), foo]?.[i]\n[type(str)]\n[type(true)]\n[uniq(array)]\n[uniq(list)]\n[upper(str)]\n[values($env)]\n[{foo: $env, foo: 1.0, foo: 0}]\n[{foo: $env, foo: nil}]\n[{foo: $env}]\n[{foo: 0, foo: 1.0}]\n[{foo: 0, foo: nil}]\n[{foo: 0, foo: true}]\n[{foo: 0}]\n[{foo: 1.0, foo: 0}]\n[{foo: 1.0}.add]\n[{foo: 1.0}?.str]\n[{foo: 1.0}]\n[{foo: 1}]\n[{foo: add, foo: i}]\n[{foo: add, foo: str}]\n[{foo: add}]\n[{foo: array, foo: nil}]\n[{foo: array}]\n[{foo: f64, foo: foo}]\n[{foo: f64}?.f64]\n[{foo: f64}]\n[{foo: false, foo: 0}]\n[{foo: false}]\n[{foo: foo, foo: $env}.String]\n[{foo: foo, foo: false}]\n[{foo: foo, foo: nil}]\n[{foo: foo}]\n[{foo: greet, foo: f64, foo: 0}]\n[{foo: greet, foo: foo}]\n[{foo: greet}]\n[{foo: i, foo: $env}]\n[{foo: i, foo: greet, foo: foo}]\n[{foo: i}]\n[{foo: list, foo: foo}]\n[{foo: list}?.Bar]\n[{foo: list}]\n[{foo: nil, foo: 1.0}]\n[{foo: nil, foo: i}]\n[{foo: nil, foo: nil}]\n[{foo: nil, foo: str}]\n[{foo: nil}]\n[{foo: ok}?.foo]\n[{foo: ok}]\n[{foo: str, foo: true}]\n[{foo: str}]\n[{foo: true}]\nabs($env | count(ok))\nabs($env | count(true))\nabs($env | findLastIndex(ok))\nabs($env | sum(1))\nabs($env | sum(1.0))\nabs($env.f64)\nabs($env.i)\nabs($env?.f64)\nabs($env?.i)\nabs(-0)\nabs(-1)\nabs(-1.0)\nabs(-f64)\nabs(-i)\nabs(0 % i)\nabs(0 * 1.0)\nabs(0 ** 1.0)\nabs(0 ** f64)\nabs(0 ** i)\nabs(0 + 0)\nabs(0 + 1.0)\nabs(0 + i)\nabs(0 - 0)\nabs(0 - 1)\nabs(0 - 1.0)\nabs(0 - f64)\nabs(0 - i)\nabs(0 / 0)\nabs(0 / 1)\nabs(0 / 1.0)\nabs(0 / f64)\nabs(0 ?? 1)\nabs(0 ?? add)\nabs(0 ?? array)\nabs(0 ?? false)\nabs(0 ?? foo)\nabs(0 ?? i)\nabs(0 ?? nil)\nabs(0 ^ 1.0)\nabs(0 ^ i)\nabs(0 | mean(i, i))\nabs(0 | min(f64))\nabs(0) * f64\nabs(0) ** $env?.i\nabs(0) - f64\nabs(0) - i\nabs(0) / f64\nabs(0) ?? add\nabs(0) ?? array\nabs(0) ^ f64\nabs(0) in array\nabs(0.1)\nabs(1 % 1)\nabs(1 % i)\nabs(1 * f64)\nabs(1 ** 1)\nabs(1 ** 1.0)\nabs(1 ** f64)\nabs(1 + 0)\nabs(1 + 1.0)\nabs(1 - 1)\nabs(1 - 1.0)\nabs(1 - f64)\nabs(1 / 1)\nabs(1 / 1.0)\nabs(1 / i)\nabs(1 ?? 1.0)\nabs(1 ?? add)\nabs(1 ?? f64)\nabs(1 ?? false)\nabs(1 ?? foo)\nabs(1 ?? greet)\nabs(1 ?? i)\nabs(1 ^ 0)\nabs(1 ^ 1)\nabs(1 ^ f64)\nabs(1 ^ i)\nabs(1 | bitshr(i))\nabs(1 | max(array))\nabs(1) != i\nabs(1) * i\nabs(1) + f64\nabs(1) < f64\nabs(1) < i\nabs(1) <= nil ?? i\nabs(1) >= i\nabs(1) ?? array\nabs(1) ^ float(1.0)\nabs(1) not in $env?.foobar\nabs(1) | mean(i)\nabs(1.0 * 0)\nabs(1.0 * 1)\nabs(1.0 * 1.0)\nabs(1.0 * f64)\nabs(1.0 * i)\nabs(1.0 ** 0)\nabs(1.0 ** 1)\nabs(1.0 ** 1.0)\nabs(1.0 ** i)\nabs(1.0 + 0)\nabs(1.0 + 1)\nabs(1.0 + 1.0)\nabs(1.0 + f64)\nabs(1.0 + i)\nabs(1.0 - 1)\nabs(1.0 - 1.0)\nabs(1.0 - f64)\nabs(1.0 - i)\nabs(1.0 / 0)\nabs(1.0 / 1)\nabs(1.0 / 1.0)\nabs(1.0 ?? $env[count(foobar):findLast(str, .list)])\nabs(1.0 ?? 1)\nabs(1.0 ?? 1.0)\nabs(1.0 ?? f64)\nabs(1.0 ?? foo)\nabs(1.0 ?? list)\nabs(1.0 ?? nil)\nabs(1.0 ?? true)\nabs(1.0 ^ 0)\nabs(1.0 ^ 1)\nabs(1.0 ^ 1.0)\nabs(1.0 ^ f64)\nabs(1.0 ^ i)\nabs(1.0 | mean(array))\nabs(1.0 | min(f64))\nabs(1.0)\nabs(1.0) != $env?.[Bar]\nabs(1.0) != f64\nabs(1.0) * i\nabs(1.0) ** f64\nabs(1.0) + count(list, false)\nabs(1.0) - f64\nabs(1.0) / 0 in array\nabs(1.0) / f64\nabs(1.0) < 1.0 ?? 1\nabs(1.0) <= reduce(array, #)\nabs(1.0) == i\nabs(1.0) > i\nabs(1.0) ?? f64\nabs(1.0) ^ f64 > 0\nabs(1.0) ^ i\nabs(1.0) in $env?.[String]\nabs(1.0) in array\nabs(1.0) | max(0)\nabs(1.0) | median(array)\nabs(1.1)\nabs(abs(1))\nabs(abs(1.0))\nabs(abs(f64))\nabs(abs(i))\nabs(abs(int(1.0)))\nabs(add(1, 1))\nabs(array | count(true))\nabs(array | find(ok))\nabs(array | findLast(true))\nabs(array | findLastIndex(ok))\nabs(array | reduce(#))\nabs(array | reduce(#acc))\nabs(array | reduce(#index))\nabs(array | reduce(0))\nabs(array | reduce(0, array))\nabs(array | reduce(1, nil))\nabs(array | reduce(1.0))\nabs(array | reduce(1.0, foo))\nabs(array | sum(1.0))\nabs(array?.[1])\nabs(array?.[i])\nabs(bitnot(0))\nabs(bitnot(1))\nabs(bitnot(i))\nabs(bitor(0, 0))\nabs(ceil(0))\nabs(ceil(1))\nabs(ceil(1.0))\nabs(ceil(f64))\nabs(ceil(i))\nabs(count($env, false))\nabs(count($env, true))\nabs(f64 * 1)\nabs(f64 * 1.0)\nabs(f64 * f64)\nabs(f64 * i)\nabs(f64 ** 0)\nabs(f64 ** 1)\nabs(f64 ** 1.0)\nabs(f64 + 0)\nabs(f64 + 1)\nabs(f64 + 1.0)\nabs(f64 + f64)\nabs(f64 - 1)\nabs(f64 - i)\nabs(f64 / 1)\nabs(f64 / 1.0)\nabs(f64 / f64)\nabs(f64 ?? 0)\nabs(f64 ?? 1)\nabs(f64 ?? add)\nabs(f64 ?? foo)\nabs(f64 ?? nil)\nabs(f64 ^ 0)\nabs(f64 ^ 1)\nabs(f64 ^ 1.0)\nabs(f64 ^ i)\nabs(f64)\nabs(f64) != f64\nabs(f64) != i\nabs(f64) ** i\nabs(f64) + i\nabs(f64) - f64\nabs(f64) - i\nabs(f64) / i\nabs(f64) == f64\nabs(f64) > f64\nabs(f64) ?? array\nabs(f64) ?? f64\nabs(f64) ?? i\nabs(f64) ?? str\nabs(findIndex($env, true))\nabs(findIndex(array, true))\nabs(findLastIndex($env, true))\nabs(findLastIndex(list, true))\nabs(first(array))\nabs(float(0))\nabs(float(1))\nabs(float(1.0))\nabs(float(f64))\nabs(float(i))\nabs(floor(0))\nabs(floor(1))\nabs(floor(1.0))\nabs(floor(f64))\nabs(floor(i))\nabs(i % i)\nabs(i * 0)\nabs(i * 1)\nabs(i * 1.0)\nabs(i * f64)\nabs(i * i)\nabs(i ** 0)\nabs(i ** 1.0)\nabs(i ** i)\nabs(i + 0)\nabs(i + 1)\nabs(i + i)\nabs(i - 1.0)\nabs(i - f64)\nabs(i - i)\nabs(i / 1.0)\nabs(i / i)\nabs(i ?? $env)\nabs(i ?? 1.0)\nabs(i ?? add)\nabs(i ?? i)\nabs(i ?? list)\nabs(i ?? true)\nabs(i ^ 1)\nabs(i ^ 1.0)\nabs(i ^ i)\nabs(i | bitshl(0))\nabs(i | bitushr(0))\nabs(i)\nabs(i) * i\nabs(i) + f64\nabs(i) < i\nabs(i) ^ i\nabs(i) not in array\nabs(i) | bitshr(0)\nabs(if false { array } else { 1 })\nabs(if false { array } else { i })\nabs(if ok { 1.0 } else { i })\nabs(if true { f64 } else { list })\nabs(if true { i } else { i })\nabs(int(0))\nabs(int(1))\nabs(int(1.0))\nabs(int(i))\nabs(last(array))\nabs(len($env))\nabs(len(str))\nabs(list | findIndex(ok))\nabs(list | findIndex(true))\nabs(list | reduce(1))\nabs(list | sum(1.0))\nabs(max($env)?.f64)\nabs(max(0))\nabs(max(1))\nabs(max(1.0))\nabs(max(array))\nabs(max(f64))\nabs(max(f64, f64))\nabs(max(i))\nabs(mean(0))\nabs(mean(1))\nabs(mean(1.0))\nabs(mean(1.0, i))\nabs(mean(array))\nabs(mean(array, 0))\nabs(mean(f64))\nabs(mean(f64, array))\nabs(mean(i))\nabs(median(0))\nabs(median(0, 1.0))\nabs(median(1))\nabs(median(1, 0))\nabs(median(1.0))\nabs(median(1.0, 1.0))\nabs(median(array))\nabs(median(f64))\nabs(median(f64, array))\nabs(median(i))\nabs(min(0))\nabs(min(1))\nabs(min(1.0))\nabs(min(array))\nabs(min(f64))\nabs(min(i))\nabs(nil ?? 0)\nabs(nil ?? 1)\nabs(nil ?? 1.0)\nabs(nil ?? f64)\nabs(reduce(array, #))\nabs(reduce(array, #, nil))\nabs(reduce(array, i))\nabs(reduce(list, 0))\nabs(reduce(list, 1))\nabs(round(0))\nabs(round(1))\nabs(round(1.0))\nabs(round(f64))\nabs(round(i))\nabs(round(median(f64)))\nabs(sum($env, 1.0))\nabs(sum($env, i))\nabs(sum(array))\nabs(sum(array, #))\nabs(sum(array, 0))\nabs(sum(array, f64))\nabs(sum(list, 1))\nabs(sum(list, 1.0))\nabs(sum(list, f64))\nabs(sum(list, i))\nadd\nadd != $env && $env?.ok\nadd != $env && ok\nadd != $env == $env\nadd != $env ?? f64\nadd != $env ?? false\nadd != $env ?? list\nadd != $env ?? str\nadd != $env and ok\nadd != $env or $env?.[array]\nadd != $env or ok\nadd != $env.add\nadd != $env?.$env?.greet\nadd != $env?.Bar\nadd != $env?.Bar?.ok\nadd != $env?.String\nadd != $env?.String?.str(foo)\nadd != $env?.[Bar]\nadd != $env?.[String]\nadd != $env?.[String]?.[array]\nadd != $env?.[String]?.str()\nadd != $env?.[foobar?.[foobar]]\nadd != $env?.[foobar?.f64]\nadd != $env?.[foobar]\nadd != $env?.[str]\nadd != $env?.add\nadd != $env?.add ?: foo\nadd != $env?.foobar\nadd != $env?.foobar?.[array]\nadd != 1 ?? foo\nadd != 1.0 ?? foo\nadd != add\nadd != add ?? count(array)\nadd != add ?? true\nadd != array ?? 1\nadd != array ?? 1.0\nadd != f64 ?? ok\nadd != false ?? list\nadd != foo ?? $env\nadd != i ?? foo\nadd != list ?? greet\nadd != max(array)\nadd != min($env)\nadd != nil && $env\nadd != nil == true\nadd != nil ?: 1\nadd != nil ?: false\nadd != nil and false\nadd != nil || ok\nadd != nil || true\nadd != ok ?? str\nadd == $env == false\nadd == $env ? 0 : 1\nadd == $env ? array : ok\nadd == $env ?? foo\nadd == $env ?? greet\nadd == $env or false\nadd == $env or true\nadd == $env.add\nadd == $env?.Bar\nadd == $env?.Bar?.[str]\nadd == $env?.String\nadd == $env?.String?.ok()\nadd == $env?.[Bar]\nadd == $env?.[String]\nadd == $env?.[foobar]\nadd == $env?.[str]\nadd == $env?.add\nadd == $env?.foobar\nadd == $env?.foobar?.[greet]\nadd == 0 ?? $env\nadd == 0 ?? array\nadd == 1 ?? foo\nadd == 1 ?? str\nadd == 1.0 ?? foo\nadd == 1.0 ?? greet\nadd == 1.0 ?? i\nadd == 1.0 ?? str\nadd == add\nadd == add && $env\nadd == add == true\nadd == add ?? 1.0\nadd == add and $env?.[foo]\nadd == add or $env\nadd == false ?? 0\nadd == foo ?? 1\nadd == foo ?? array\nadd == foo ?? f64\nadd == foo ?? i\nadd == greet ?? $env\nadd == i ?? str\nadd == last($env)\nadd == max($env)\nadd == mean(array)\nadd == nil != $env?.[Bar]\nadd == nil && $env[foobar:foobar]\nadd == nil == ok\nadd == nil ?? add\nadd == nil || $env\nadd == nil || false\nadd == str ?? list\nadd == str ?? ok\nadd ?? !false\nadd ?? $env ?? nil\nadd ?? $env.add\nadd ?? $env.array\nadd ?? $env.f64\nadd ?? $env.foo\nadd ?? $env.greet\nadd ?? $env.i\nadd ?? $env.list\nadd ?? $env.ok\nadd ?? $env.str\nadd ?? $env?.Bar\nadd ?? $env?.Bar()\nadd ?? $env?.Bar(f64 not endsWith foobar ^ true)\nadd ?? $env?.Bar(foobar?.[i])\nadd ?? $env?.String\nadd ?? $env?.String()\nadd ?? $env?.String(add)\nadd ?? $env?.String(array.i())\nadd ?? $env?.String?.f64\nadd ?? $env?.[Bar]\nadd ?? $env?.[String]\nadd ?? $env?.[add]\nadd ?? $env?.[array]\nadd ?? $env?.[array]?.[str]\nadd ?? $env?.[array]?.foo\nadd ?? $env?.[f64]\nadd ?? $env?.[f64]?.[str]\nadd ?? $env?.[f64]?.greet\nadd ?? $env?.[foo]\nadd ?? $env?.[foobar and String]\nadd ?? $env?.[foobar]\nadd ?? $env?.[greet]\nadd ?? $env?.[i]\nadd ?? $env?.[last(Bar, foobar, foobar)]\nadd ?? $env?.[list]\nadd ?? $env?.[list].String\nadd ?? $env?.[ok]\nadd ?? $env?.[str]\nadd ?? $env?.add\nadd ?? $env?.array\nadd ?? $env?.f64\nadd ?? $env?.findIndex(foobar)\nadd ?? $env?.foo\nadd ?? $env?.greet\nadd ?? $env?.i\nadd ?? $env?.list\nadd ?? $env?.ok\nadd ?? $env?.str\nadd ?? $env[$env != list:]\nadd ?? $env[:String?.add]\nadd ?? $env[:foobar]\nadd ?? $env[f64(Bar):]\nadd ?? $env[foo.ok():]\nadd ?? $env[foobar != 1.0:]\nadd ?? $env[foobar:1.0]\nadd ?? $env[greet && Bar:foobar]\nadd ?? -$env\nadd ?? -0\nadd ?? -1\nadd ?? -f64\nadd ?? -i\nadd ?? 0 ?? array\nadd ?? 1 ?? i\nadd ?? 1 ?? str\nadd ?? 1.0 ?? add\nadd ?? [1]\nadd ?? [add]\nadd ?? [foo]\nadd ?? [i]\nadd ?? [ok]\nadd ?? abs(0)\nadd ?? add\nadd ?? add ?? foo\nadd ?? add ?? true\nadd ?? array\nadd ?? array?.[i]\nadd ?? bitnot(0)\nadd ?? ceil(0)\nadd ?? ceil(1)\nadd ?? ceil(f64)\nadd ?? count($env)\nadd ?? count(array)\nadd ?? count(list)\nadd ?? date(false)\nadd ?? date(nil)\nadd ?? duration($env)\nadd ?? duration(str)\nadd ?? f64\nadd ?? false ?? foo\nadd ?? false ?? i\nadd ?? filter($env, #)\nadd ?? filter($env, true)\nadd ?? findIndex($env, #.array)\nadd ?? findIndex($env, #.foo)\nadd ?? findLast($env, #)\nadd ?? findLast($env, false)\nadd ?? findLast(list, true)\nadd ?? flatten(array)\nadd ?? float(1.0)\nadd ?? floor(0)\nadd ?? foo\nadd ?? foo ?? f64\nadd ?? foo ?? foo\nadd ?? foo ?? nil\nadd ?? foo ?? true\nadd ?? foo.Bar\nadd ?? foo.String\nadd ?? foo.String()\nadd ?? foo?.Bar\nadd ?? foo?.String\nadd ?? foo?.String()\nadd ?? fromBase64(str)\nadd ?? fromPairs(list)\nadd ?? greet\nadd ?? greet ?? 1.0\nadd ?? greet($env)\nadd ?? groupBy($env, 1)\nadd ?? groupBy($env, foo)\nadd ?? i\nadd ?? i ?? $env\nadd ?? i ?? $env?.Bar()\nadd ?? int(1)\nadd ?? list\nadd ?? list ?? greet\nadd ?? list ?? ok\nadd ?? list | get(ok)\nadd ?? list?.[i]\nadd ?? list[:bitshr($env, i)]\nadd ?? list[:i]\nadd ?? lower($env)\nadd ?? map($env, #index)\nadd ?? map($env, greet)\nadd ?? max($env)\nadd ?? max(i)\nadd ?? mean(1.0)\nadd ?? mean(array)\nadd ?? nil ?? false\nadd ?? nil ?? foo\nadd ?? nil ?? ok\nadd ?? not $env\nadd ?? not ok\nadd ?? not true\nadd ?? ok\nadd ?? reduce($env, #)\nadd ?? reduce($env, .Bar)?.array\nadd ?? reverse(array)\nadd ?? sortBy($env, $env).list(i)\nadd ?? sortBy(array, #)\nadd ?? sortBy(array, foo)\nadd ?? str\nadd ?? str ?? max(array)\nadd ?? string(1.0)\nadd ?? string(foo)\nadd ?? string(greet)\nadd ?? string(nil)\nadd ?? sum($env)\nadd ?? sum($env, 1)\nadd ?? sum($env, array)\nadd ?? sum($env, str)\nadd ?? sum(array, f64)\nadd ?? sum(list)\nadd ?? timezone(str)\nadd ?? toBase64($env)\nadd ?? trim($env)\nadd ?? true ?? 1.0\nadd ?? true | get(foo)\nadd ?? type(1.0)\nadd ?? type(array)\nadd ?? upper($env)\nadd ?? values($env)\nadd ?? {foo: foo, foo: greet}\nadd ?? {foo: foo}\nadd ?? {foo: str}\nadd in $env?.Bar\nadd in $env?.Bar?.[f64]\nadd in $env?.String\nadd in $env?.[Bar]\nadd in $env?.[String]\nadd in $env?.[String]?.add\nadd in $env?.[String]?.array\nadd in $env?.[foobar]\nadd in $env?.foobar\nadd in $env?.foobar?.str()?.greet\nadd in [$env, $env]\nadd in keys($env)\nadd in list ?? add\nadd in map(array, $env)\nadd in values($env)\nadd in {foo: add}?.add\nadd not in $env?.$env\nadd not in $env?.Bar\nadd not in $env?.Bar?.Bar\nadd not in $env?.String\nadd not in $env?.[Bar]\nadd not in $env?.[String]\nadd not in $env?.[foobar]\nadd not in $env?.[nil]\nadd not in $env?.foobar\nadd not in $env?.foobar == false\nadd not in $env?.foobar?.[str]\nadd not in $env?.true?.[greet]\nadd not in [array, foo]\nadd not in [foo, nil]\nadd not in [nil]\nadd not in find($env, false)\nadd not in first($env)\nadd not in keys($env)\nadd not in list ?? false\nadd not in list ?? str\nadd not in reverse(list)\nadd not in toPairs($env)\nadd not in {foo: 1}?.array\nadd($env.i, i)\nadd($env?.i, i)\nadd(-i, i)\nadd(0, 0) != i\nadd(0, 0) ** ceil(i)\nadd(0, 1) * f64\nadd(0, i) ?? array\nadd(abs(1), sum(array, #))\nadd(i, -i)\nadd(i, 1) >= f64 > i\nadd(i, array?.[i])\nadd(i, i)\nadd(i, list | sum(i))\nadd(int(0), i)\nadd(min(0, i), i)\nadd(sum(array), i)\nadd; $env.add\nadd; $env.array\nadd; add\nadd; add ?? f64\nadd; array\nadd; greet\nadd; list\nadd; ok\nadd; {foo: f64}\nall($env | filter(false), #[.ok:$env])\nall($env, false) and $env?.[add].f64\nall($env, false) and f64 <= 0\nall($env, ok) ?? add\nall($env, ok) ?? str\nall($env, true) ?: greet\nall($env, true) and ok\nall($env.array, 1 > #)\nall($env.list, # != foo)\nall($env.list, $env == #)\nall($env?.[str], str != #)\nall($env?.array, ok)\nall($env?.list, nil == $env)\nall($env?.list, ok)\nall([$env], ok)\nall([add], ok)\nall([false], #)\nall([list], 1.0 < 1.0)\nall([ok], #)\nall(array, # != $env)\nall(array, # < #)\nall(array, # < f64)\nall(array, # <= #)\nall(array, # <= i)\nall(array, # == #)\nall(array, # == $env)\nall(array, # == 0)\nall(array, # == 1.0)\nall(array, # > #)\nall(array, # >= #)\nall(array, $env != #)\nall(array, $env != f64)\nall(array, $env == #)\nall(array, 0 == i)\nall(array, 1 <= 1.0)\nall(array, 1 == 0)\nall(array, 1.0 <= #)\nall(array, 1.0 > 0)\nall(array, add == $env)\nall(array, f64 | min(#, 1.0) >= #)\nall(array, false and ok)\nall(array, false) or 1.0 ?? i\nall(array, foo == nil)\nall(array, i >= 0)\nall(array, i >= 1)\nall(array, list | one(true))\nall(array, nil != #)\nall(array, nil != nil)\nall(array, nil == 1)\nall(array, nil == true)\nall(array, ok ?? $env)\nall(array, ok)\nall(array, ok) || $env?.Bar\nall(array, str == nil)\nall(array, str startsWith str)\nall(array, true or $env)\nall(array, true) ?? greet\nall(list | map(true), #)\nall(list, !false)\nall(list, # != #)\nall(list, # in list)\nall(list, #.Bar >= str)\nall(list, $env != #)\nall(list, $env != 0)\nall(list, $env == #)\nall(list, $env?.ok)\nall(list, 0 < 1.0)\nall(list, 0 <= 1.0)\nall(list, 1.0 <= 0)\nall(list, add != $env)\nall(list, array | any(ok))\nall(list, f64 != $env)\nall(list, f64 <= 1.0)\nall(list, false != false)\nall(list, false) != ok\nall(list, false) == $env == nil\nall(list, foo != #)\nall(list, foo == #)\nall(list, nil == nil)\nall(list, nil not in $env)\nall(list, not true)\nall(list, ok)\nall(list, true && ok)\nall(list, true and ok)\nall(list, true or true)\nall(map(list, 1.0), i < 1.0)\nall(nil ?? $env, ok)\nall(sort($env), #)\nall(sort($env), #.foo)\nall(sort($env), .f64 | reduce(#, foo))\nall(sort($env), .f64)\nall(sort($env), .ok)\nall(sort($env), .ok?.array)\nall(sort($env), .str <= #)\nall(sort($env), 1.0 >= #)\nall(sort($env), sortBy(#, ok))\nall(sort($env), str == #)\nall(toPairs($env), ok)\nall(uniq(list), ok)\nany($env ?? 1.0, ok)\nany($env, false) or $env?.[String]\nany($env, ok) || $env == foo\nany($env, true) ?? f64\nany($env, true) || $env?.[str]\nany($env.list, ok)\nany($env?.[str], true and true)\nany($env?.array, # == #)\nany($env?.array, ok)\nany($env?.list, ok)\nany([$env], ok)\nany([0], foo == nil)\nany([1.0], not true)\nany(array ?? $env, true or #)\nany(array, # != #)\nany(array, # != $env)\nany(array, # < 0)\nany(array, # <= #)\nany(array, # > #)\nany(array, # >= 1)\nany(array, $env != #)\nany(array, $env != add)\nany(array, $env == 0)\nany(array, $env | all(true))\nany(array, $env.ok)\nany(array, $env?.ok)\nany(array, 0 <= 1)\nany(array, 0 == #)\nany(array, 1 == 1.0)\nany(array, 1.0 != 0)\nany(array, 1.0 <= #)\nany(array, array == array)\nany(array, f64 != f64)\nany(array, false) ?? list\nany(array, false) || $env != 0\nany(array, foo == nil)\nany(array, i != #)\nany(array, i <= i)\nany(array, nil != #)\nany(array, nil == greet)\nany(array, ok != ok)\nany(array, ok ?? $env)\nany(array, ok ?? 0)\nany(array, ok or $env)\nany(array, ok)\nany(array, str >= str)\nany(filter(list, false), ok)\nany(keys($env), ok)\nany(list ?? list, ok)\nany(list, !true)\nany(list, # != #)\nany(list, # == #)\nany(list, # in list)\nany(list, $env != false)\nany(list, $env && false)\nany(list, $env == 1.0)\nany(list, $env == list)\nany(list, $env == ok)\nany(list, $env == str)\nany(list, $env.ok)\nany(list, $env?.ok)\nany(list, 0 <= 1.0)\nany(list, 1 < 0)\nany(list, 1.0 < 1.0)\nany(list, false && true)\nany(list, false) && 1.0 ?? $env\nany(list, foo != #)\nany(list, foo == nil)\nany(list, i ^ i == 1.0)\nany(list, list != array)\nany(list, nil != 1)\nany(list, nil == nil)\nany(list, not true)\nany(list, ok or $env)\nany(list, ok)\nany(map(array, add), ok)\nany(nil ?? $env, ok)\nany(sort($env), #)\nany(sort($env), -#)\nany(sort($env), .String)\nany(sort($env), .list)\nany(sort($env), f64 == #)\nany(sort(array), # == ok)\nany(sortBy(list, i), ok)\nany(values($env), # != 1.0)\narray\narray != $env != $env\narray != $env && false\narray != $env == false\narray != $env == ok\narray != $env ?: str\narray != $env and $env\narray != $env and $env?.[Bar]\narray != $env or true\narray != $env.array\narray != $env.list\narray != $env?.Bar\narray != $env?.Bar?.i\narray != $env?.String\narray != $env?.String?.foo()\narray != $env?.[Bar]\narray != $env?.[String]\narray != $env?.[String]?.[greet]\narray != $env?.[foobar]\narray != $env?.[str]\narray != $env?.array\narray != $env?.foobar\narray != $env?.list\narray != $env?.true\narray != 0 ?? $env\narray != 0 ?? list\narray != 1.0 ?? array\narray != [1.0 + f64]\narray != [f64]\narray != [foo]\narray != [list]\narray != [median(1.0)]\narray != [true]\narray != array\narray != array != nil\narray != array && ok\narray != array && true\narray != array ?? false\narray != array or ok\narray != false ?? $env\narray != false ?? f64\narray != false ?? greet\narray != flatten(array)\narray != foo ?? f64\narray != i .. 1\narray != i ?? foo\narray != list\narray != list != false\narray != list != true\narray != list && 1.0 > 0\narray != list || ok\narray != map($env, 1.0)\narray != map(array, $env)\narray != map(list, #)\narray != map(list, 1.0)\narray != min($env)\narray != nil == $env\narray != nil ? list : greet\narray != nil and ok\narray != nil and true\narray != nil or $env\narray != nil or false\narray != nil or ok\narray != str ?? greet\narray != values($env)\narray != {foo: $env}?.str\narray != {foo: 0}.add\narray == $env != ok\narray == $env && false\narray == $env ?? i\narray == $env ?? nil\narray == $env ?? str\narray == $env and $env\narray == $env or $env?.Bar\narray == $env or false\narray == $env.array\narray == $env.list\narray == $env?.Bar\narray == $env?.Bar?.ok\narray == $env?.String\narray == $env?.String?.[greet]\narray == $env?.String?.greet\narray == $env?.[Bar]\narray == $env?.[Bar]?.[add]\narray == $env?.[Bar]?.add\narray == $env?.[String]\narray == $env?.[foobar]\narray == $env?.[greet(nil)]\narray == $env?.[str]\narray == $env?.array\narray == $env?.foobar\narray == $env?.list\narray == 0 ?? array\narray == 1.0 ?? find($env, #.list)\narray == [$env]\narray == [1.0]\narray == [1]\narray == [foo]\narray == [nil]\narray == [ok, 1.0]\narray == [ok]\narray == [str]\narray == [true]\narray == add ?? foo\narray == array\narray == array != ok\narray == f64 ?? $env\narray == false ?? $env\narray == false ?? i\narray == foo ?? add\narray == foo ?? true\narray == greet ?? array\narray == greet ?? ok\narray == keys($env)\narray == list\narray == list != $env\narray == list != false\narray == list[:]\narray == map(array, #)\narray == map(list, true)\narray == max($env)?.greet\narray == min($env)\narray == min(array)\narray == nil != nil\narray == nil != ok\narray == nil && $env\narray == nil && foo == $env\narray == nil == $env\narray == nil ?? nil\narray == ok ?? foo\narray == ok ?? list\narray ?? !$env\narray ?? !false\narray ?? !ok\narray ?? $env ?? foo\narray ?? $env ?? i\narray ?? $env | count(true)\narray ?? $env | findLast(ok)\narray ?? $env | groupBy(false)\narray ?? $env | map(f64)\narray ?? $env | map(foo)\narray ?? $env | map(ok)\narray ?? $env | median(i, f64)\narray ?? $env | reduce(#)\narray ?? $env | reduce(add)\narray ?? $env | reduce(foo)\narray ?? $env | sortBy(1.0)\narray ?? $env.add\narray ?? $env.array\narray ?? $env.f64\narray ?? $env.foo\narray ?? $env.greet\narray ?? $env.i\narray ?? $env.list\narray ?? $env.ok\narray ?? $env.str\narray ?? $env?.Bar\narray ?? $env?.Bar()\narray ?? $env?.Bar(foobar)\narray ?? $env?.String\narray ?? $env?.String()\narray ?? $env?.String(Bar, 0)\narray ?? $env?.[Bar]\narray ?? $env?.[String]\narray ?? $env?.[add]\narray ?? $env?.[add].str\narray ?? $env?.[array]\narray ?? $env?.[f64]\narray ?? $env?.[f64]?.[add]\narray ?? $env?.[f64]?.greet()\narray ?? $env?.[foo?.[array]]\narray ?? $env?.[foo]\narray ?? $env?.[foobar.Bar]\narray ?? $env?.[foobar]\narray ?? $env?.[greet()]\narray ?? $env?.[greet]\narray ?? $env?.[i]\narray ?? $env?.[list | fromJSON(nil)]\narray ?? $env?.[list]\narray ?? $env?.[list]?.f64\narray ?? $env?.[list]?.foo\narray ?? $env?.[nil or $env]\narray ?? $env?.[ok]\narray ?? $env?.[ok].foo()\narray ?? $env?.[str]\narray ?? $env?.[str].str\narray ?? $env?.add\narray ?? $env?.array\narray ?? $env?.f64\narray ?? $env?.foo\narray ?? $env?.greet\narray ?? $env?.i\narray ?? $env?.list\narray ?? $env?.ok\narray ?? $env?.sort(foobar, nil)\narray ?? $env?.str\narray ?? $env[1.0:foobar]\narray ?? $env[:1.0]\narray ?? $env[:foobar]\narray ?? $env[:fromPairs(ok)]\narray ?? $env[:str .. false]\narray ?? $env[f64():]\narray ?? $env[findLastIndex(foo, greet):]\narray ?? $env[foobar .. foobar:]\narray ?? $env[foobar:]\narray ?? $env[str:]\narray ?? $env[true != foobar:]\narray ?? -$env\narray ?? -0\narray ?? -1\narray ?? -1.0\narray ?? -1.0 ^ 1.0 | map(foo)\narray ?? 0 ?? f64\narray ?? 0 | filter(false)\narray ?? 0 | map(#)\narray ?? 0 | map(add)\narray ?? 0 | one(false)\narray ?? 0 | one(ok)\narray ?? 0 | reduce(#)\narray ?? 0 | sum(i)\narray ?? 1 | map(1)\narray ?? 1 | map(false)\narray ?? 1 | reduce($env, $env)\narray ?? 1 | reduce(greet)\narray ?? 1 | reduce(i)\narray ?? 1.0 ?? add\narray ?? 1.0 ?? foo\narray ?? 1.0 | findLast(false)\narray ?? 1.0 | groupBy(1)\narray ?? 1.0 | map(#)\narray ?? 1.0 | sortBy(#)\narray ?? 1.0 | sortBy(1.0)\narray ?? 1.0 | sum(#)\narray ?? [1]\narray ?? [add]\narray ?? [list]\narray ?? [ok, add]\narray ?? abs(1.0)\narray ?? abs(f64)\narray ?? add\narray ?? add | findLastIndex(ok)\narray ?? add | groupBy(true)\narray ?? add | map(#)\narray ?? add | reduce($env)\narray ?? add | reduce(i)\narray ?? add($env, 1)\narray ?? array\narray ?? array ?? 0\narray ?? array ?? f64\narray ?? array | map(true)\narray ?? array | one(true)\narray ?? array | reduce($env)\narray ?? array | reduce(str)\narray ?? array?.[i]\narray ?? bitnot(1)\narray ?? bitushr($env, 0)\narray ?? ceil(1.0)\narray ?? concat(list)\narray ?? count($env)\narray ?? count($env, #)\narray ?? count(list)\narray ?? count(str ?? 1.0)\narray ?? date(foo)\narray ?? date(i)\narray ?? date(str)\narray ?? duration($env)\narray ?? f64\narray ?? f64 ?? 1.0\narray ?? f64 | map(#)\narray ?? f64 | map(foo)\narray ?? f64 | sortBy(f64)\narray ?? f64 | sum(#)\narray ?? false ?? false\narray ?? false | findLastIndex(true)\narray ?? false | groupBy(#)\narray ?? false | map($env)\narray ?? false | one(ok)\narray ?? filter($env, .str)\narray ?? findIndex($env, #)\narray ?? findLast($env, #.String)\narray ?? findLast($env, .add)\narray ?? findLastIndex($env, #)\narray ?? findLastIndex($env, #.i)\narray ?? floor(1.0)\narray ?? foo\narray ?? foo | all(ok)\narray ?? foo | all(true)\narray ?? foo | any(false)\narray ?? foo | filter(true)\narray ?? foo | groupBy(1)\narray ?? foo | map(#)\narray ?? foo | map(1.0)\narray ?? foo | map(foo)\narray ?? foo | reduce(#)\narray ?? foo | reduce(#acc, true)\narray ?? foo | reduce(#index * #)\narray ?? foo | reduce(1)\narray ?? foo | reduce(1.0)\narray ?? foo | reduce(foo)\narray ?? foo | reduce(foo, true)\narray ?? foo | sortBy(1)\narray ?? foo | sortBy(str)\narray ?? foo | sum(1.0)\narray ?? foo.Bar\narray ?? foo.String\narray ?? foo.String()\narray ?? foo?.Bar\narray ?? foo?.String\narray ?? foo?.String()\narray ?? fromBase64(str)\narray ?? greet\narray ?? greet ?? $env\narray ?? greet | all(ok)\narray ?? greet | map(true)\narray ?? greet | reduce(foo)\narray ?? greet | sortBy(f64)\narray ?? greet | sum(0)\narray ?? greet($env)\narray ?? i\narray ?? i ?? add\narray ?? i | map(#)\narray ?? i | max(0)\narray ?? i | sortBy(#)\narray ?? i | sum(1)\narray ?? last($env)?.Bar\narray ?? list\narray ?? list ?? str\narray ?? list | find(true)\narray ?? list | findIndex(ok)\narray ?? list | findIndex(true)\narray ?? list | map($env)\narray ?? list | map(foo)\narray ?? list?.[i]\narray ?? list[:]\narray ?? map($env, array)\narray ?? map($env?.[String], bitshr(#, #))\narray ?? max(f64)\narray ?? mean(f64)\narray ?? min(i)\narray ?? nil ?? $env?.f64\narray ?? nil ?? add\narray ?? nil ?? f64\narray ?? nil ?? i\narray ?? nil | filter(false)\narray ?? nil | map(#)\narray ?? nil | map(false)\narray ?? nil | reduce(#)\narray ?? nil | reduce(foo, $env)\narray ?? nil | reduce(foo, foo)\narray ?? nil | sortBy(#)\narray ?? not ok\narray ?? not true\narray ?? ok\narray ?? ok | findIndex(ok)\narray ?? ok | findLastIndex(true)\narray ?? ok | map(i)\narray ?? ok | reduce(i, 1.0)\narray ?? ok | sum(#)\narray ?? one($env, #)\narray ?? reduce($env, #.greet)\narray ?? reduce($env, list)\narray ?? round(1)\narray ?? round(i)\narray ?? sortBy($env, 0)\narray ?? sortBy($env, 1)\narray ?? sortBy($env, foo)\narray ?? str\narray ?? str | map(foo)\narray ?? str | none(false)\narray ?? str | reduce(#, f64)\narray ?? str | sortBy(#)\narray ?? str | sum(#)\narray ?? string($env)\narray ?? string(array)\narray ?? string(nil)\narray ?? string(ok)\narray ?? sum($env)\narray ?? sum($env, list)\narray ?? sum(array)\narray ?? sum(array, true)\narray ?? toJSON(add)\narray ?? true | groupBy(ok)\narray ?? true | reduce(0)\narray ?? true | reduce(foo)\narray ?? true | sum(#)\narray ?? type(array)\narray ?? type(foo)\narray ?? type(list)\narray ?? uniq($env)\narray ?? uniq(array)\narray ?? {foo: 1}\narray ?? {foo: add}\narray ?? {foo: i}\narray in $env?.Bar\narray in $env?.Bar?.[array]\narray in $env?.String\narray in $env?.String?.array\narray in $env?.String?.foo\narray in $env?.[Bar]\narray in $env?.[String]\narray in $env?.[String]?.[greet]\narray in $env?.[String]?.list\narray in $env?.[foobar]\narray in $env?.[foobar]?.[i]\narray in $env?.foobar\narray in [$env?.foobar]\narray in [array]\narray in [f64, list]\narray in [list]\narray in [nil]\narray in [str, $env]\narray in array ?? add\narray in array ?? greet\narray in flatten(array)\narray in keys($env)\narray in last($env)\narray in reverse(list)\narray in uniq(array)\narray in values($env)\narray not in $env and false\narray not in $env?.Bar\narray not in $env?.String\narray not in $env?.[Bar]\narray not in $env?.[Bar]?.add\narray not in $env?.[String]\narray not in $env?.[String]?.[add]\narray not in $env?.[String]?.f64\narray not in $env?.[String]?.list\narray not in $env?.[foobar?.String]\narray not in $env?.[foobar]\narray not in $env?.false\narray not in $env?.foobar\narray not in [1, 1.0]\narray not in [array]\narray not in [list]\narray not in first($env)\narray not in last($env)\narray not in list ?? none($env, #.Bar)\narray not in map(array, array)\narray not in toPairs($env)\narray not in uniq(array)\narray not in uniq(list)\narray not in {foo: foo}.add\narray | all(# != #)\narray | all(# != nil)\narray | all(# <= 1.0)\narray | all(# == f64)\narray | all(# >= i)\narray | all($env == #)\narray | all($env == $env)\narray | all($env == foo)\narray | all(0 < 1.0)\narray | all(0 == #)\narray | all(1.0 != nil)\narray | all(1.0 <= #)\narray | all(f64 < #)\narray | all(false)\narray | all(foo == foo)\narray | all(foo not in list)\narray | all(i != f64)\narray | all(i > #)\narray | all(ok)\narray | all(one(list, true))\narray | all(true && true)\narray | all(true)\narray | any(# != #)\narray | any(# < #)\narray | any(# <= #)\narray | any(# == $env.i)\narray | any(# > #)\narray | any(# >= f64)\narray | any($env != #)\narray | any($env != nil)\narray | any($env == foo)\narray | any($env?.ok)\narray | any(1 < #)\narray | any(1.0 <= 1)\narray | any(false)\narray | any(i <= #)\narray | any(not ok)\narray | any(ok ?: nil)\narray | any(ok)\narray | any(true)\narray | concat(array)\narray | concat(array) | find(ok)\narray | concat(array) | sortBy(1)\narray | concat(array, array)\narray | concat(list)\narray | concat(list) | reduce(f64)\narray | count(# != #)\narray | count(# != $env)\narray | count(# != nil)\narray | count(# <= 0)\narray | count(# > #)\narray | count($env != foo)\narray | count($env == #)\narray | count($env == array)\narray | count($env.ok)\narray | count($env?.ok)\narray | count(0 < 1)\narray | count(0 <= #)\narray | count(0 > #)\narray | count(1.0 == #)\narray | count(false)\narray | count(i >= #)\narray | count(nil not in $env)\narray | count(not true)\narray | count(ok)\narray | count(ok) not in array\narray | count(true)\narray | count(true) ** i\narray | filter(!true)\narray | filter(# < 1.0)\narray | filter(# <= #)\narray | filter(# <= f64)\narray | filter(# >= #)\narray | filter(# >= 0)\narray | filter($env == #)\narray | filter($env == i)\narray | filter($env == ok)\narray | filter($env == str)\narray | filter($env.ok)\narray | filter(1 != #)\narray | filter(f64 < #)\narray | filter(f64 == #)\narray | filter(false)\narray | filter(false) | map(#)\narray | filter(false) | map(array)\narray | filter(false) | sortBy(#)\narray | filter(false) | sortBy(foo)\narray | filter(foo != foo)\narray | filter(foo != nil)\narray | filter(greet == $env)\narray | filter(nil == #)\narray | filter(nil == foo)\narray | filter(ok)\narray | filter(ok) | find(1.0 > #)\narray | filter(ok) | map(foo)\narray | filter(ok) | mean(1.0)\narray | filter(ok) | sum(1)\narray | filter(true)\narray | filter(true) != list\narray | filter(true) | groupBy(#)\narray | filter(true) | take(0)\narray | find(# < #)\narray | find(# >= 1.0)\narray | find($env != $env)\narray | find($env == i)\narray | find($env not in array)\narray | find($env not in list)\narray | find(-1 < #)\narray | find(0 < 1)\narray | find(1.0 != 1.0)\narray | find(1.0 < #)\narray | find(1.0 == 0)\narray | find(1.0 == 1.0)\narray | find(false)\narray | find(foo in list)\narray | find(i == i)\narray | find(ok)\narray | find(true)\narray | find(true) == i\narray | find(true) >= float(f64)\narray | find(true) ?? ok\narray | find(true) | mean(1.0)\narray | find(type(true) contains str[0:])\narray | findIndex(!false)\narray | findIndex(# != 0)\narray | findIndex(# == #)\narray | findIndex(# > 1.0)\narray | findIndex(# > f64)\narray | findIndex(# >= 1.0)\narray | findIndex($env != false)\narray | findIndex($env != nil)\narray | findIndex($env.ok)\narray | findIndex($env?.ok)\narray | findIndex(0 != #)\narray | findIndex(1 not in array)\narray | findIndex(1.0 < 1.0)\narray | findIndex(1.0 <= #)\narray | findIndex(f64 == $env)\narray | findIndex(f64 >= 1.0)\narray | findIndex(false and false)\narray | findIndex(false)\narray | findIndex(i != $env)\narray | findIndex(ok ?? ok)\narray | findIndex(ok)\narray | findIndex(true)\narray | findIndex(true) + i\narray | findIndex(true) | bitshl(0)\narray | findLast(# <= i)\narray | findLast(# > #)\narray | findLast(# >= 1.0)\narray | findLast($env or true)\narray | findLast(0 >= #)\narray | findLast(1.0 < #)\narray | findLast(1.0 >= i)\narray | findLast(f64 + f64 != nil)\narray | findLast(f64 <= #)\narray | findLast(f64 >= #)\narray | findLast(false)\narray | findLast(greet != nil)\narray | findLast(nil != #)\narray | findLast(nil not in $env)\narray | findLast(none($env, true))\narray | findLast(ok)\narray | findLast(ok) ?? $env[false:]\narray | findLast(ok) | mean(i)\narray | findLast(true ?: add)\narray | findLast(true)\narray | findLastIndex(!true)\narray | findLastIndex(# != $env)\narray | findLastIndex(# < #)\narray | findLastIndex(# <= #)\narray | findLastIndex($env != 0)\narray | findLastIndex($env != 1.0)\narray | findLastIndex($env | any(false))\narray | findLastIndex(0 <= 0)\narray | findLastIndex(1 <= i)\narray | findLastIndex(1.0 < #)\narray | findLastIndex(1.0 <= #)\narray | findLastIndex(1.0 <= 1.0)\narray | findLastIndex(false ?: ok)\narray | findLastIndex(false)\narray | findLastIndex(foo in list)\narray | findLastIndex(nil == nil)\narray | findLastIndex(nil ?? true)\narray | findLastIndex(ok)\narray | findLastIndex(ok) < f64\narray | findLastIndex(ok) ?? i\narray | findLastIndex(str endsWith str)\narray | findLastIndex(true)\narray | findLastIndex(true) - i\narray | get(0)\narray | get(1)\narray | get(i)\narray | get(mean(1.0, array))\narray | get(sum(array))\narray | groupBy(# != #)\narray | groupBy(# - #)\narray | groupBy(# / 1.0)\narray | groupBy(# / i)\narray | groupBy(# == #)\narray | groupBy(# == nil)\narray | groupBy(# > #)\narray | groupBy(# >= #)\narray | groupBy(# ^ #)\narray | groupBy(#)\narray | groupBy($env != 0)\narray | groupBy($env && false)\narray | groupBy($env.foo)\narray | groupBy($env?.[Bar])\narray | groupBy($env?.[String])\narray | groupBy($env?.[str])\narray | groupBy($env?.foo)\narray | groupBy($env?.foobar)\narray | groupBy($env?.str)\narray | groupBy(-#)\narray | groupBy(0 ** 1.0)\narray | groupBy(0)\narray | groupBy(1)\narray | groupBy(1.0 != #)\narray | groupBy(1.0 != f64)\narray | groupBy(1.0 ** 1)\narray | groupBy(1.0 ** f64)\narray | groupBy(1.0 == 1.0)\narray | groupBy(1.0 ?? foo)\narray | groupBy(1.0 ^ #)\narray | groupBy(1.0)\narray | groupBy(add(#, 0))\narray | groupBy(array?.[i])\narray | groupBy(bitnot(i))\narray | groupBy(f64)\narray | groupBy(false != false)\narray | groupBy(false ?? false)\narray | groupBy(false)\narray | groupBy(first(array))\narray | groupBy(foo)\narray | groupBy(foo.Bar)\narray | groupBy(foo.String())\narray | groupBy(i)\narray | groupBy(len(list))\narray | groupBy(list?.[i])\narray | groupBy(mean(1.0 ?? 1.0))\narray | groupBy(not false)\narray | groupBy(ok ?? str)\narray | groupBy(ok)\narray | groupBy(round(#))\narray | groupBy(round(0))\narray | groupBy(round(1.0))\narray | groupBy(str)\narray | groupBy(str[0:])\narray | groupBy(string(1))\narray | groupBy(sum(array))\narray | groupBy(trimPrefix(str))\narray | groupBy(true)\narray | map(!ok)\narray | map(# != 0)\narray | map(# * #)\narray | map(# ** i)\narray | map(# + #)\narray | map(# - #)\narray | map(# .. #index)\narray | map(# < #)\narray | map(# == 0)\narray | map(# > #)\narray | map(# >= #)\narray | map(# >= i)\narray | map(# ?? #)\narray | map(# ?? 0)\narray | map(# ^ #)\narray | map(#)\narray | map(#) | any(ok)\narray | map(#) | groupBy(foo)\narray | map(#) | map($env?.foobar)\narray | map(#) | map(1.0)\narray | map(#) | map(foo)\narray | map(#) | map(ok)\narray | map(#) | one(ok)\narray | map(#) | one(true)\narray | map(#) | reduce(#)\narray | map(#) | reduce(foo)\narray | map(#) | reduce(ok)\narray | map(#) | sum(1.0)\narray | map(#) | take(0)\narray | map(#index % i)\narray | map(#index - 1.0)\narray | map(#index / #)\narray | map(#index)\narray | map(#index) | filter(ok)\narray | map(#index) | groupBy(#)\narray | map(#index) | map(false)\narray | map(#index) | map(list)\narray | map($env != str)\narray | map($env)\narray | map($env) | any(.ok)\narray | map($env) | map(#)\narray | map($env.foo)\narray | map($env.greet)\narray | map($env.i)\narray | map($env.list)\narray | map($env.ok)\narray | map($env.str)\narray | map($env?.Bar)\narray | map($env?.[Bar])\narray | map($env?.[foobar])\narray | map($env?.i)\narray | map($env?.list)\narray | map($env?.str)\narray | map(-1)\narray | map(0 - i)\narray | map(0)\narray | map(0) | reduce(#)\narray | map(0) | sum(#)\narray | map(0) | sum(f64)\narray | map(1 ** #)\narray | map(1 >= 1)\narray | map(1)\narray | map(1) ?? greet\narray | map(1) | find(ok)\narray | map(1) | groupBy(#)\narray | map(1) | map(list)\narray | map(1) | one(ok)\narray | map(1) | reduce($env, array)\narray | map(1.0 ** #)\narray | map(1.0 + #index)\narray | map(1.0 - 1.0)\narray | map(1.0 <= #)\narray | map(1.0 > #)\narray | map(1.0)\narray | map(1.0) | groupBy(false)\narray | map(1.0) | groupBy(foo)\narray | map(1.0) | map(0)\narray | map(1.0) | reduce(foo)\narray | map(1.0) | sortBy(#)\narray | map([#])\narray | map([$env])\narray | map([foo])\narray | map([list])\narray | map(add(#, #))\narray | map(add)\narray | map(add) | map(greet)\narray | map(add) | reduce(#)\narray | map(array | findLast(true))\narray | map(array)\narray | map(array) == array\narray | map(array) | any(false)\narray | map(array) | findIndex(true)\narray | map(bitshl(#, #))\narray | map(f64 < 1.0)\narray | map(f64 ^ #)\narray | map(f64)\narray | map(f64) ?? $env?.f64\narray | map(f64) | findLastIndex(false)\narray | map(f64) | one(array == $env)\narray | map(f64) | reduce(#)\narray | map(f64) | reduce(foo)\narray | map(f64) | reduce(str, ok)\narray | map(f64) | sortBy(i)\narray | map(false && true)\narray | map(false)\narray | map(false) != list\narray | map(false) | none(#)\narray | map(foo)\narray | map(foo) != array\narray | map(foo) ?? greet\narray | map(foo) | map(#)\narray | map(foo) | reduce(#)\narray | map(foo) | reduce(1.0)\narray | map(foo) | sum(1.0)\narray | map(foo.Bar)\narray | map(foo.String)\narray | map(foo?.Bar)\narray | map(foo?.String())\narray | map(foo?.String)\narray | map(greet)\narray | map(greet) | groupBy(true)\narray | map(greet) | map(#)\narray | map(i != $env)\narray | map(i <= 1)\narray | map(i ^ #)\narray | map(i)\narray | map(i) | filter(ok)\narray | map(i) | groupBy(f64)\narray | map(i) | reduce(add)\narray | map(i) | sum(#)\narray | map(if false { 0 } else { foo })\narray | map(len($env))\narray | map(let foobar = greet; foobar)\narray | map(list)\narray | map(list) | get(i)\narray | map(max(#))\narray | map(mean(#))\narray | map(median(#))\narray | map(nil == greet)\narray | map(ok)\narray | map(ok) | all(ok)\narray | map(ok) | any(#)\narray | map(ok) | groupBy(ok)\narray | map(str)\narray | map(str) | groupBy(#)\narray | map(str) | map(#)\narray | map(sum(array))\narray | map(toJSON(f64))\narray | map(toJSON(foo))\narray | map(true != nil)\narray | map(true ?? nil)\narray | map(true)\narray | map(true) | findLastIndex(#)\narray | map(true) | reduce(foo)\narray | map(type(foo))\narray | max($env.f64)\narray | max(0)\narray | max(0, 0)\narray | max(0, 1)\narray | max(0, 1.0)\narray | max(1)\narray | max(1, 0)\narray | max(1, 1.0)\narray | max(1.0)\narray | max(array)\narray | max(f64)\narray | max(f64, 1.0)\narray | max(f64, f64)\narray | max(i)\narray | max(i, i)\narray | max(map($env, #index))\narray | mean(-1.0)\narray | mean(0 / 1)\narray | mean(0)\narray | mean(0, 1.0, array)\narray | mean(1)\narray | mean(1, 0)\narray | mean(1, 1)\narray | mean(1, 1.0)\narray | mean(1.0)\narray | mean(1.0) * f64\narray | mean(1.0, 1)\narray | mean(1.0, 1.0)\narray | mean(array)\narray | mean(array, 0) <= i\narray | mean(array, array)\narray | mean(f64)\narray | mean(f64, 1)\narray | mean(f64, 1.0)\narray | mean(i)\narray | mean(i, 0)\narray | mean(i, f64)\narray | median($env.array)\narray | median($env?.array)\narray | median(0)\narray | median(0, i)\narray | median(1 - 1.0)\narray | median(1)\narray | median(1, 1)\narray | median(1.0)\narray | median(1.0, 1.0)\narray | median(1.0, 1.0) ** f64\narray | median(1.0, f64)\narray | median([array])\narray | median(array)\narray | median(f64)\narray | median(f64) == $env?.ok\narray | median(f64, 1.0)\narray | median(i)\narray | min(-0)\narray | min(0)\narray | min(0, 1.0)\narray | min(0, array)\narray | min(0, f64)\narray | min(1)\narray | min(1, 1)\narray | min(1.0)\narray | min(1.0, 1.0)\narray | min(1.0, i)\narray | min(array)\narray | min(array, i)\narray | min(f64 ?? f64)\narray | min(f64)\narray | min(f64) | max(1.0, f64)\narray | min(f64, 0)\narray | min(i)\narray | min(i, 1.0)\narray | min(i, i)\narray | min(list | map(#index))\narray | none(!true)\narray | none(# != $env)\narray | none(# != 1)\narray | none(# != 1.0)\narray | none(# != nil)\narray | none(# < #)\narray | none(# <= #)\narray | none(# == #)\narray | none(# == $env)\narray | none(# == nil)\narray | none($env != 1.0)\narray | none($env.ok)\narray | none(1 in array)\narray | none(1.0 < #)\narray | none(1.0 == i)\narray | none(1.0 > #)\narray | none(false ?? foo)\narray | none(false)\narray | none(i == #)\narray | none(ok)\narray | none(true == $env)\narray | none(true)\narray | one(# == #)\narray | one(# > #)\narray | one(# > 1.0)\narray | one(# not in array)\narray | one($env != $env)\narray | one($env != foo)\narray | one($env.ok)\narray | one(false != false)\narray | one(false)\narray | one(false) || ok\narray | one(i == nil)\narray | one(list | reduce(true, ok))\narray | one(nil != f64)\narray | one(nil == #)\narray | one(nil == 1)\narray | one(nil == foo)\narray | one(ok)\narray | one(true)\narray | one(true) ?? f64\narray | reduce(# != #)\narray | reduce(# * #)\narray | reduce(# * i)\narray | reduce(# + #)\narray | reduce(# - f64)\narray | reduce(# / #acc)\narray | reduce(# == 1)\narray | reduce(# == 1.0)\narray | reduce(# > #index)\narray | reduce(# >= 1.0)\narray | reduce(# | bitshl(0))\narray | reduce(#)\narray | reduce(#) != f64\narray | reduce(#) / f64\narray | reduce(#) > f64\narray | reduce(#) ?? array\narray | reduce(#) ^ f64\narray | reduce(#, $env)\narray | reduce(#, 0 ^ 0)\narray | reduce(#, 0)\narray | reduce(#, 1 / 0)\narray | reduce(#, 1)\narray | reduce(#, 1.0)\narray | reduce(#, add)\narray | reduce(#, array)\narray | reduce(#, f64)\narray | reduce(#, false)\narray | reduce(#, foo)\narray | reduce(#, foo) > i\narray | reduce(#, greet)\narray | reduce(#, i)\narray | reduce(#, list)\narray | reduce(#, nil)\narray | reduce(#, ok)\narray | reduce(#, str)\narray | reduce(#, true)\narray | reduce(#acc != 1)\narray | reduce(#acc * 1)\narray | reduce(#acc ?? nil)\narray | reduce(#acc)\narray | reduce(#acc) - f64\narray | reduce(#acc) == greet\narray | reduce(#acc) == {foo: f64, foo: 1}\narray | reduce(#acc, $env)\narray | reduce(#acc, 0)\narray | reduce(#acc, 1.0) in [str, foo]\narray | reduce(#acc, add)\narray | reduce(#acc, array)\narray | reduce(#acc, f64)\narray | reduce(#acc, foo)\narray | reduce(#acc, greet)\narray | reduce(#acc, i)\narray | reduce(#acc, nil)\narray | reduce(#acc, true)\narray | reduce(#index <= f64)\narray | reduce(#index >= 1)\narray | reduce(#index)\narray | reduce(#index, $env)\narray | reduce(#index, array)\narray | reduce(#index, f64)\narray | reduce(#index, false)\narray | reduce(#index, foo)\narray | reduce(#index, greet) >= i\narray | reduce(#index, i)\narray | reduce(#index, list)\narray | reduce(#index, nil)\narray | reduce(#index, ok)\narray | reduce(#index, str)\narray | reduce($env != #)\narray | reduce($env != array)\narray | reduce($env == greet)\narray | reduce($env)\narray | reduce($env) | findLastIndex(true)\narray | reduce($env) | reduce($env, nil)\narray | reduce($env, $env)\narray | reduce($env, 0)\narray | reduce($env, 1)\narray | reduce($env, 1.0)\narray | reduce($env, add)\narray | reduce($env, array)\narray | reduce($env, f64)\narray | reduce($env, false)\narray | reduce($env, foo)\narray | reduce($env, greet)\narray | reduce($env, i)\narray | reduce($env, list)\narray | reduce($env, nil)\narray | reduce($env, ok)\narray | reduce($env, ok) | map(array)\narray | reduce($env, str)\narray | reduce($env, true)\narray | reduce($env.ok)\narray | reduce($env?.Bar)\narray | reduce($env?.[Bar])\narray | reduce($env?.[String])\narray | reduce($env?.[String]?.foo())\narray | reduce($env?.array)\narray | reduce($env?.f64)\narray | reduce($env?.foo)\narray | reduce($env?.i)\narray | reduce($env?.list, foo?.String)\narray | reduce(-#)\narray | reduce(-1.0, str)\narray | reduce(0 + i)\narray | reduce(0 .. #)\narray | reduce(0 <= #index)\narray | reduce(0 == #)\narray | reduce(0 > #)\narray | reduce(0)\narray | reduce(0) ?? add\narray | reduce(0, $env)\narray | reduce(0, 0)\narray | reduce(0, 1.0)\narray | reduce(0, array)\narray | reduce(0, foo)\narray | reduce(0, i)\narray | reduce(0, list)\narray | reduce(0, ok)\narray | reduce(0, str)\narray | reduce(0, true)\narray | reduce(1 ** #acc)\narray | reduce(1 ?? str)\narray | reduce(1)\narray | reduce(1, 0)\narray | reduce(1, 1)\narray | reduce(1, 1.0)\narray | reduce(1, add)\narray | reduce(1, array)\narray | reduce(1, f64)\narray | reduce(1, false)\narray | reduce(1, foo)\narray | reduce(1, greet)\narray | reduce(1, nil)\narray | reduce(1, ok)\narray | reduce(1, str)\narray | reduce(1.0 * 1)\narray | reduce(1.0 ** #)\narray | reduce(1.0 > 1.0)\narray | reduce(1.0 ?? $env)\narray | reduce(1.0)\narray | reduce(1.0) != f64\narray | reduce(1.0) / f64\narray | reduce(1.0) < i <= f64\narray | reduce(1.0, $env)\narray | reduce(1.0, 0)\narray | reduce(1.0, 1)\narray | reduce(1.0, 1.0)\narray | reduce(1.0, array)\narray | reduce(1.0, f64)\narray | reduce(1.0, false)\narray | reduce(1.0, foo)\narray | reduce(1.0, greet)\narray | reduce(1.0, i)\narray | reduce(1.0, list)\narray | reduce(1.0, nil)\narray | reduce(1.0, ok)\narray | reduce(1.0, str)\narray | reduce(1.0, true)\narray | reduce(add)\narray | reduce(add, $env)\narray | reduce(add, 0)\narray | reduce(add, 1.0)\narray | reduce(add, array)\narray | reduce(add, f64)\narray | reduce(add, false)\narray | reduce(add, foo)\narray | reduce(add, greet)\narray | reduce(add, i)\narray | reduce(add, list)\narray | reduce(add, nil)\narray | reduce(add, ok)\narray | reduce(add, str)\narray | reduce(all($env, true))\narray | reduce(array)\narray | reduce(array) | map(#)\narray | reduce(array) | none(true)\narray | reduce(array) | reduce(false)\narray | reduce(array) | sortBy(#)\narray | reduce(array, $env)\narray | reduce(array, 0)\narray | reduce(array, 1)\narray | reduce(array, 1.0)\narray | reduce(array, f64)\narray | reduce(array, false)\narray | reduce(array, foo)\narray | reduce(array, greet)\narray | reduce(array, list)\narray | reduce(array, nil)\narray | reduce(array, ok)\narray | reduce(bitnot(#))\narray | reduce(concat(list), $env.greet)\narray | reduce(f64 ^ 0)\narray | reduce(f64)\narray | reduce(f64, $env)\narray | reduce(f64, 0)\narray | reduce(f64, 1)\narray | reduce(f64, 1.0)\narray | reduce(f64, array)\narray | reduce(f64, f64)\narray | reduce(f64, false)\narray | reduce(f64, foo)\narray | reduce(f64, i)\narray | reduce(f64, list)\narray | reduce(f64, nil)\narray | reduce(f64, true)\narray | reduce(false)\narray | reduce(false, $env)\narray | reduce(false, 0)\narray | reduce(false, 1)\narray | reduce(false, 1.0)\narray | reduce(false, add)\narray | reduce(false, false)\narray | reduce(false, foo)\narray | reduce(false, greet)\narray | reduce(false, i)\narray | reduce(false, list)\narray | reduce(false, nil)\narray | reduce(false, ok)\narray | reduce(false, true)\narray | reduce(foo)\narray | reduce(foo) ?? list\narray | reduce(foo, $env)\narray | reduce(foo, 0)\narray | reduce(foo, 1)\narray | reduce(foo, 1.0)\narray | reduce(foo, add)\narray | reduce(foo, array)\narray | reduce(foo, f64)\narray | reduce(foo, false)\narray | reduce(foo, foo)\narray | reduce(foo, i)\narray | reduce(foo, list)\narray | reduce(foo, nil)\narray | reduce(foo, ok)\narray | reduce(foo, str)\narray | reduce(foo, true)\narray | reduce(foo.String, $env?.[Bar])\narray | reduce(foo?.Bar)\narray | reduce(greet != $env)\narray | reduce(greet(str), int(1.0))\narray | reduce(greet)\narray | reduce(greet, $env)\narray | reduce(greet, 0)\narray | reduce(greet, 1)\narray | reduce(greet, 1.0)\narray | reduce(greet, add)\narray | reduce(greet, array)\narray | reduce(greet, f64)\narray | reduce(greet, false)\narray | reduce(greet, foo)\narray | reduce(greet, greet)\narray | reduce(greet, i)\narray | reduce(greet, nil)\narray | reduce(greet, str)\narray | reduce(greet, true)\narray | reduce(i * #)\narray | reduce(i > 1)\narray | reduce(i >= 1)\narray | reduce(i)\narray | reduce(i, $env)\narray | reduce(i, 0)\narray | reduce(i, 1)\narray | reduce(i, 1.0)\narray | reduce(i, array)\narray | reduce(i, false)\narray | reduce(i, foo)\narray | reduce(i, greet)\narray | reduce(i, i)\narray | reduce(i, list)\narray | reduce(i, nil)\narray | reduce(i, ok)\narray | reduce(i, true)\narray | reduce(int(#))\narray | reduce(list)\narray | reduce(list, $env)\narray | reduce(list, 0)\narray | reduce(list, 1)\narray | reduce(list, 1.0)\narray | reduce(list, add)\narray | reduce(list, array)\narray | reduce(list, false)\narray | reduce(list, foo)\narray | reduce(list, greet)\narray | reduce(list, i)\narray | reduce(list, list)\narray | reduce(list, nil)\narray | reduce(list, ok)\narray | reduce(list, ok) | all(true)\narray | reduce(list, true)\narray | reduce(median(#))\narray | reduce(median(0))\narray | reduce(nil != #)\narray | reduce(not false)\narray | reduce(not true)\narray | reduce(ok ?? 1.0)\narray | reduce(ok)\narray | reduce(ok) ?? array\narray | reduce(ok, $env)\narray | reduce(ok, 0)\narray | reduce(ok, 1.0)\narray | reduce(ok, add)\narray | reduce(ok, array)\narray | reduce(ok, false)\narray | reduce(ok, foo)\narray | reduce(ok, greet)\narray | reduce(ok, i)\narray | reduce(ok, list)\narray | reduce(ok, nil)\narray | reduce(ok, true)\narray | reduce(str)\narray | reduce(str) | greet()\narray | reduce(str, $env)\narray | reduce(str, -1.0)\narray | reduce(str, 1)\narray | reduce(str, 1.0)\narray | reduce(str, abs(1))\narray | reduce(str, add)\narray | reduce(str, array)\narray | reduce(str, false)\narray | reduce(str, foo)\narray | reduce(str, greet)\narray | reduce(str, i)\narray | reduce(str, list)\narray | reduce(str, nil)\narray | reduce(str, ok)\narray | reduce(string(1.0))\narray | reduce(string(add))\narray | reduce(toJSON(array))\narray | reduce(true and true)\narray | reduce(true)\narray | reduce(true, $env)\narray | reduce(true, 0)\narray | reduce(true, 1)\narray | reduce(true, 1.0)\narray | reduce(true, add)\narray | reduce(true, array)\narray | reduce(true, foo)\narray | reduce(true, i)\narray | reduce(true, nil)\narray | reduce(true, ok)\narray | reduce(true, str)\narray | reduce(true, true)\narray | reduce(type(greet))\narray | sortBy(# + #)\narray | sortBy(# + 1.0)\narray | sortBy(# + i)\narray | sortBy(# / #)\narray | sortBy(# / 1.0)\narray | sortBy(# ?? ok)\narray | sortBy(# ^ 1.0)\narray | sortBy(# ^ f64)\narray | sortBy(# | bitushr(#))\narray | sortBy(#)\narray | sortBy(#) ?? [0, $env]\narray | sortBy(#) | all(ok)\narray | sortBy(#) | groupBy(#)\narray | sortBy(#) | groupBy(f64)\narray | sortBy(#) | map(#)\narray | sortBy(#) | map(#index)\narray | sortBy(#) | map(foo)\narray | sortBy(#) | reduce(#)\narray | sortBy(#) | reduce(1.0)\narray | sortBy(#) | reduce(ok)\narray | sortBy(#) | sum(1)\narray | sortBy($env.add(#, 1))\narray | sortBy($env?.[str])\narray | sortBy($env?.i)\narray | sortBy(-#)\narray | sortBy(-0)\narray | sortBy(0 / #)\narray | sortBy(0 ^ #)\narray | sortBy(0)\narray | sortBy(0) | median(1.0)\narray | sortBy(0) | reduce(0)\narray | sortBy(0) | reduce(foo, foo)\narray | sortBy(1)\narray | sortBy(1.0 ^ #)\narray | sortBy(1.0)\narray | sortBy(1.0) != list\narray | sortBy(1.0) ?? i\narray | sortBy(1.0) | findLastIndex(ok)\narray | sortBy(1.0) | one(true)\narray | sortBy(1.0) | reduce($env)\narray | sortBy(1.0) | sortBy(#)\narray | sortBy(array | reduce(1.0))\narray | sortBy(array?.[i])\narray | sortBy(bitnot(i))\narray | sortBy(f64)\narray | sortBy(f64) | map(#)\narray | sortBy(f64) | sortBy(1.0)\narray | sortBy(f64) | sortBy(i)\narray | sortBy(floor(#))\narray | sortBy(foo.String())\narray | sortBy(i - 1)\narray | sortBy(i)\narray | sortBy(i) | sortBy(#)\narray | sortBy(max(#))\narray | sortBy(mean(#))\narray | sortBy(median(#))\narray | sortBy(reduce(array, str, foo))\narray | sortBy(str + str)\narray | sortBy(str)\narray | sortBy(str) | reduce(#)\narray | sortBy(sum(array))\narray | sortBy(true ? # : $env)\narray | sortBy(type(f64))\narray | sortBy(type(true))\narray | sum(# ** #)\narray | sum(# + #)\narray | sum(# - #)\narray | sum(# ?? 0)\narray | sum(# ^ 1)\narray | sum(# ^ i)\narray | sum(#)\narray | sum(#) < 1.0 ^ 1.0\narray | sum(#) <= f64\narray | sum(#) ^ f64\narray | sum($env.f64)\narray | sum($env.i)\narray | sum(-0)\narray | sum(-1)\narray | sum(-i)\narray | sum(0 ** 1.0)\narray | sum(0)\narray | sum(0.1)\narray | sum(1 * f64)\narray | sum(1 + 1.0)\narray | sum(1 | max(1.0))\narray | sum(1)\narray | sum(1) not in array\narray | sum(1.0 * #)\narray | sum(1.0 ** #)\narray | sum(1.0 - 1.0)\narray | sum(1.0)\narray | sum(1.0) < i\narray | sum(1.0) > 1.0 ^ i\narray | sum(array?.[i])\narray | sum(bitnot(1))\narray | sum(bitshl(#, #))\narray | sum(ceil(#))\narray | sum(f64)\narray | sum(f64) ?? str\narray | sum(float(f64))\narray | sum(i + 0)\narray | sum(i | bitshr(1))\narray | sum(i)\narray | sum(i) > -0\narray | sum(int(#))\narray | sum(max(#, 1))\narray | sum(median(#))\narray | sum(round(1.0))\narray | take(0)\narray | take(0) | one(ok)\narray | take(1)\narray | take(i)\narray; $env.ok\narray; add\narray; array\narray; f64\narray; f64; array\narray; foo\narray; foo.String\narray; greet\narray; i\narray; list\narray; ok\narray?.[$env.i]\narray?.[$env?.i]\narray?.[-0]\narray?.[-i]\narray?.[0 % i]\narray?.[1.0 ?? foo]\narray?.[1] % i\narray?.[1] .. i\narray?.[1] / f64\narray?.[array?.[i]]\narray?.[bitnot(i)]\narray?.[i]\narray?.[i] != 1.0 ?: 1.0\narray?.[i] != f64\narray?.[i] != i * 1.0\narray?.[i] != i ?? f64\narray?.[i] % i\narray?.[i] * f64\narray?.[i] * i\narray?.[i] ** 0 ?? ok\narray?.[i] ** i\narray?.[i] + f64\narray?.[i] - f64\narray?.[i] - i\narray?.[i] .. i\narray?.[i] .. i ?? 1.0\narray?.[i] / ceil(f64)\narray?.[i] / f64\narray?.[i] / float(0)\narray?.[i] / i\narray?.[i] < 0 + 1.0\narray?.[i] < f64\narray?.[i] < i\narray?.[i] <= 1.0 <= $env\narray?.[i] <= f64\narray?.[i] <= i\narray?.[i] == $env.i\narray?.[i] == -f64\narray?.[i] == array ?? $env\narray?.[i] == f64\narray?.[i] == i\narray?.[i] > f64\narray?.[i] > i\narray?.[i] >= f64\narray?.[i] >= i\narray?.[i] ?? $env?.Bar.greet\narray?.[i] ?? f64\narray?.[i] ?? foo?.String()\narray?.[i] ?? greet\narray?.[i] ?? ok\narray?.[i] ?? str\narray?.[i] ^ f64\narray?.[i] ^ f64 <= 1\narray?.[i] ^ i\narray?.[i] in array\narray?.[i] not in array\narray?.[i] | add(i)\narray?.[i] | bitand(1)\narray?.[i] | bitshr(0)\narray?.[i] | max(1)\narray?.[i] | mean(1)\narray?.[i] | min(0)\narray?.[i] | min(array)\narray?.[int(1.0)]\narray?.[len(list)]\narray?.[list | count(ok)]\narray?.[max(0)]\narray?.[mean(1)]\narray?.[mean(i)]\narray?.[median(1)]\narray[$env | count(true):]\narray[$env.i:]\narray[$env?.i:]\narray[-i:]\narray[0:] | any(ok)\narray[0:] | map(greet)\narray[0:] | reduce(#)\narray[0:] | reduce(add)\narray[0:] | reduce(str)\narray[0:] | sortBy(#)\narray[0:]?.[i]\narray[1:] == list\narray[1:] | any(ok)\narray[1:] | findLast(false)\narray[1:] | reduce(#)\narray[1:] | reduce(foo)\narray[1:] | reduce(list, nil)\narray[1:] | sum(#)\narray[1:] | sum(1.0)\narray[1:]?.[i]\narray[:$env.i]\narray[:-1]\narray[:-i]\narray[:0 ?? foo]\narray[:0] ?? ok\narray[:0] | groupBy(str)\narray[:0] | sortBy(#)\narray[:0] | sum(str)\narray[:1 ?? 0]\narray[:1 ?? false]\narray[:1 ?? greet]\narray[:1] | findLastIndex(false)\narray[:1] | sortBy(#)\narray[:1] | sum(#)\narray[:]\narray[:] | map(f64)\narray[:] | reduce(f64)\narray[:]?.[i]\narray[:i]\narray[:i] ?? !ok\narray[:i] | map(#)\narray[:i] | map(f64)\narray[:i] | reduce($env)\narray[:i] | reduce(0)\narray[:i] | sortBy(array)\narray[:i] | sortBy(ok)\narray[:int(1.0)]\narray[:max(i)]\narray[:nil ?? 0]\narray[:reduce(array, 1)]\narray[:sum(array)]\narray[array?.[i]:]\narray[bitnot(1):]\narray[i % 1:]\narray[i:]\narray[i:] ?? list\narray[i:] | findIndex(false)\narray[i:] | groupBy(1)\narray[i:]?.[i]\narray[int(1):]\narray[len($env):]\narray[max(0):]\narray[sum(array):]\nbitand($env.i, i)\nbitand(1, 1) | median(0)\nbitand(1, i) * i\nbitand(i, 0) + f64\nbitand(i, 0) > i\nbitand(i, i)\nbitand(i, sum(array))\nbitnand($env.i, i)\nbitnand(-i, i)\nbitnand(i + i, i)\nbitnand(i, i)\nbitnand(i, i) % i\nbitnand(sum(array), i)\nbitnot($env | findIndex(true))\nbitnot($env | findLastIndex(ok))\nbitnot($env | findLastIndex(true))\nbitnot($env.i)\nbitnot($env?.[str]?.[i])\nbitnot($env?.i)\nbitnot(-$env.i)\nbitnot(-0 ?? 1)\nbitnot(-0)\nbitnot(-1)\nbitnot(-i)\nbitnot(-min(array, 1.0))\nbitnot(0 * 1)\nbitnot(0 * i)\nbitnot(0 + 1)\nbitnot(0 - 0)\nbitnot(0 - 1)\nbitnot(0 - i)\nbitnot(0 ?? $env)\nbitnot(0 ?? 1.0)\nbitnot(0 ?? foo)\nbitnot(0 ?? greet)\nbitnot(0 ?? i)\nbitnot(0 ?? str)\nbitnot(0 | min(0))\nbitnot(0) + f64\nbitnot(0) + i\nbitnot(0) - $env.i\nbitnot(0) < f64\nbitnot(0) <= f64\nbitnot(0) == $env?.[Bar]\nbitnot(0) > $env?.i\nbitnot(0) ?? array\nbitnot(0) ?? ok\nbitnot(0) in array\nbitnot(0) not in array\nbitnot(0) | min(array, 0)\nbitnot(1 % 1)\nbitnot(1 % i)\nbitnot(1 * 0)\nbitnot(1 + 1)\nbitnot(1 - i)\nbitnot(1 ?? $env)\nbitnot(1 ?? 0)\nbitnot(1 ?? 1)\nbitnot(1 ?? foo)\nbitnot(1 ?? list)\nbitnot(1 ?? ok)\nbitnot(1 ?? true)\nbitnot(1 | bitshr(i))\nbitnot(1 | min(i))\nbitnot(1) != i\nbitnot(1) != i && false\nbitnot(1) * i\nbitnot(1) - f64\nbitnot(1) == f64\nbitnot(1) > i\nbitnot(1) ?? list\nbitnot(1) ^ f64\nbitnot(1) | bitand(1)\nbitnot(abs(0))\nbitnot(abs(1))\nbitnot(abs(i))\nbitnot(array | count(false))\nbitnot(array | count(ok))\nbitnot(array | findIndex(ok))\nbitnot(array | findLast(true))\nbitnot(array | reduce(#))\nbitnot(array | reduce(i))\nbitnot(array | sum(#))\nbitnot(array | sum(i))\nbitnot(array?.[0])\nbitnot(array?.[i])\nbitnot(bitand(1, 0))\nbitnot(bitnot(0 ?? foo))\nbitnot(bitnot(0))\nbitnot(bitnot(1))\nbitnot(bitnot(i))\nbitnot(count(array, false))\nbitnot(count(array, true))\nbitnot(count(list, false))\nbitnot(count(list, ok))\nbitnot(false ? nil : 1)\nbitnot(false ?: 1)\nbitnot(findIndex($env, ok))\nbitnot(findIndex(array, ok))\nbitnot(findIndex(list, ok))\nbitnot(findLastIndex(array, true))\nbitnot(findLastIndex(list, ok))\nbitnot(first(array))\nbitnot(i % i)\nbitnot(i * 0)\nbitnot(i * 1)\nbitnot(i + 0)\nbitnot(i - 0)\nbitnot(i - 1)\nbitnot(i ?? $env)\nbitnot(i ?? 0)\nbitnot(i ?? array)\nbitnot(i ?? foo)\nbitnot(i ?? list)\nbitnot(i ?? ok)\nbitnot(i ?? str)\nbitnot(i ?? true)\nbitnot(i | add(i))\nbitnot(i | min(1.0))\nbitnot(i)\nbitnot(i) != f64\nbitnot(i) != i\nbitnot(i) * -1.0\nbitnot(i) + i\nbitnot(i) - i\nbitnot(i) > f64\nbitnot(i) ?? $env.str\nbitnot(i) ?? ok\nbitnot(i) | bitshr(0)\nbitnot(i) | median(array)\nbitnot(if false { f64 } else { 0 })\nbitnot(if true { 1 } else { 0 })\nbitnot(if true { 1 } else { foo })\nbitnot(int(0))\nbitnot(int(1))\nbitnot(int(1.0))\nbitnot(int(f64))\nbitnot(int(f64)) ** i\nbitnot(int(i))\nbitnot(last(array))\nbitnot(len($env))\nbitnot(len(array))\nbitnot(len(list))\nbitnot(len(str))\nbitnot(list | count(true))\nbitnot(list | findIndex(ok))\nbitnot(list | findLastIndex(ok))\nbitnot(list | findLastIndex(true))\nbitnot(list | reduce(1))\nbitnot(list | sum(1))\nbitnot(max(0))\nbitnot(max(1))\nbitnot(max(1, 0))\nbitnot(max(array))\nbitnot(max(array, 0))\nbitnot(max(i))\nbitnot(min(0))\nbitnot(min(1))\nbitnot(min(array))\nbitnot(min(i))\nbitnot(min(i, 0))\nbitnot(nil ?? 1)\nbitnot(nil ?? i)\nbitnot(reduce(array, #))\nbitnot(reduce(array, 0))\nbitnot(reduce(list, i))\nbitnot(reduce(reverse(list), #index))\nbitnot(sum($env, 0))\nbitnot(sum($env, 1))\nbitnot(sum(array))\nbitnot(sum(array, #))\nbitnot(sum(list, 0))\nbitnot(sum(list, 1))\nbitnot(sum(list, i))\nbitor($env.i, i)\nbitor(1, i) > f64\nbitor(i, 1) ?? add\nbitor(i, array?.[i])\nbitor(i, i)\nbitor(i, len(list))\nbitor(i, list | count(true))\nbitshl(i, $env?.i)\nbitshl(i, i)\nbitshl(int(f64), i)\nbitshr(0, 1) + f64\nbitshr(1, 0) + i\nbitshr(i, $env?.i)\nbitshr(i, i)\nbitshr(i, sum(array))\nbitushr(1, 0) .. i\nbitushr(array | count(ok), i)\nbitushr(i, $env?.i)\nbitushr(i, i)\nbitxor(i, 1 ?? array)\nbitxor(i, i)\nbitxor(i, i) ?? $env?.f64\nceil($env | findIndex(true))\nceil($env | reduce(1.0, nil))\nceil($env | sum(0))\nceil($env | sum(1))\nceil($env | sum(1.0))\nceil($env | sum(f64))\nceil($env | sum(i))\nceil($env.f64)\nceil($env.f64) not in array\nceil($env.i)\nceil($env?.[str] | sum(1.0))\nceil($env?.array | findLast(ok))\nceil($env?.array?.[i])\nceil($env?.f64)\nceil($env?.i)\nceil($env?.i) < f64\nceil(--i)\nceil(-0)\nceil(-1)\nceil(-1.0)\nceil(-f64)\nceil(-i)\nceil(0 * 0)\nceil(0 * 1)\nceil(0 * 1.0)\nceil(0 * f64)\nceil(0 ** 1)\nceil(0 ** 1.0)\nceil(0 ** f64)\nceil(0 + 0)\nceil(0 + 1)\nceil(0 + 1.0)\nceil(0 + i)\nceil(0 - 0)\nceil(0 - 1.0)\nceil(0 - f64)\nceil(0 - i)\nceil(0 / 0)\nceil(0 / 1)\nceil(0 / 1.0)\nceil(0 / f64)\nceil(0 / i)\nceil(0 ?? $env)\nceil(0 ?? 0)\nceil(0 ?? 1)\nceil(0 ?? array)\nceil(0 ?? f64)\nceil(0 ?? false)\nceil(0 ?? foo)\nceil(0 ?? greet)\nceil(0 ?? list)\nceil(0 ?? nil)\nceil(0 ?? ok)\nceil(0 ?? true)\nceil(0 ^ 0)\nceil(0 ^ 1.0)\nceil(0 ^ f64)\nceil(0 ^ i)\nceil(0 | add(i))\nceil(0 | bitshl(i))\nceil(0 | median(1.0))\nceil(0) != $env?.[String]\nceil(0) != f64\nceil(0) * f64\nceil(0) ** 0 ^ 1.0\nceil(0) ** i\nceil(0) / i\nceil(0) <= f64\nceil(0) ?? list\nceil(0) ?? type(1.0)\nceil(0) in {foo: greet}?.str\nceil(0.0)\nceil(0.1)\nceil(1 % 1)\nceil(1 * 0)\nceil(1 * f64)\nceil(1 ** 1)\nceil(1 ** 1.0)\nceil(1 ** f64)\nceil(1 + 0)\nceil(1 + 1.0)\nceil(1 + f64)\nceil(1 + i)\nceil(1 - 0)\nceil(1 - 1.0)\nceil(1 / 1.0)\nceil(1 ?? $env)\nceil(1 ?? f64)\nceil(1 ?? greet)\nceil(1 ?? i)\nceil(1 ?? nil)\nceil(1 ?? true)\nceil(1 ^ 1.0)\nceil(1 ^ i)\nceil(1 | bitor(0))\nceil(1 | min(1.0))\nceil(1) != i\nceil(1) - i\nceil(1) / i\nceil(1) > f64\nceil(1) ?? i\nceil(1) ^ i\nceil(1) | median(1.0, 1)\nceil(1) | min(array)\nceil(1); f64\nceil(1.0 * 0)\nceil(1.0 * 1)\nceil(1.0 * 1.0)\nceil(1.0 * f64)\nceil(1.0 * i)\nceil(1.0 ** 1)\nceil(1.0 ** 1.0)\nceil(1.0 ** i)\nceil(1.0 + 0)\nceil(1.0 + 1)\nceil(1.0 + 1.0)\nceil(1.0 + f64)\nceil(1.0 + i)\nceil(1.0 - 0)\nceil(1.0 - 1)\nceil(1.0 - 1.0)\nceil(1.0 - f64)\nceil(1.0 - i)\nceil(1.0 / 0)\nceil(1.0 / 1)\nceil(1.0 / 1.0)\nceil(1.0 / f64)\nceil(1.0 ?? $env)\nceil(1.0 ?? 0)\nceil(1.0 ?? 1)\nceil(1.0 ?? add)\nceil(1.0 ?? array)\nceil(1.0 ?? f64)\nceil(1.0 ?? false)\nceil(1.0 ?? foo)\nceil(1.0 ?? greet)\nceil(1.0 ?? i)\nceil(1.0 ?? list)\nceil(1.0 ?? nil)\nceil(1.0 ?? ok)\nceil(1.0 ?? true)\nceil(1.0 ^ 0)\nceil(1.0 ^ 1)\nceil(1.0 ^ 1.0)\nceil(1.0 ^ f64)\nceil(1.0 ^ i)\nceil(1.0 | max(array))\nceil(1.0 | mean(1, 1.0))\nceil(1.0 | mean(1.0))\nceil(1.0 | median(array))\nceil(1.0 | min(1))\nceil(1.0) != $env or $env\nceil(1.0) != f64\nceil(1.0) ** f64\nceil(1.0) <= f64\nceil(1.0) <= i\nceil(1.0) == nil ? foo : str\nceil(1.0) > i\nceil(1.0) >= f64\nceil(1.0) ?? add\nceil(1.0) ?? list\nceil(1.0) not in array\nceil(1.0) | mean(1)\nceil(1.1)\nceil(abs(0))\nceil(abs(1.0))\nceil(abs(f64))\nceil(abs(i))\nceil(array | count(ok))\nceil(array | mean(1.0))\nceil(array | reduce(#))\nceil(array | reduce(#, greet))\nceil(array | reduce(i, f64))\nceil(array | sum(#))\nceil(array | sum(0))\nceil(array | sum(f64))\nceil(array?.[0])\nceil(array?.[i])\nceil(bitnot(0))\nceil(bitnot(1))\nceil(ceil(0))\nceil(ceil(1))\nceil(ceil(1.0))\nceil(ceil(f64))\nceil(ceil(i))\nceil(count($env, false))\nceil(count($env, true))\nceil(f64 * 0)\nceil(f64 * 1)\nceil(f64 * 1.0)\nceil(f64 * f64)\nceil(f64 ** 0)\nceil(f64 ** 1)\nceil(f64 ** 1.0)\nceil(f64 ** i)\nceil(f64 + 1)\nceil(f64 + 1.0)\nceil(f64 + f64)\nceil(f64 - 1)\nceil(f64 - 1.0)\nceil(f64 / 0)\nceil(f64 / 1)\nceil(f64 / 1.0)\nceil(f64 / f64)\nceil(f64 / i)\nceil(f64 ?? $env)\nceil(f64 ?? 0)\nceil(f64 ?? 1.0)\nceil(f64 ?? array)\nceil(f64 ?? f64)\nceil(f64 ?? false)\nceil(f64 ?? greet)\nceil(f64 ?? i)\nceil(f64 ?? true)\nceil(f64 ^ 0)\nceil(f64 ^ 1.0)\nceil(f64 ^ i)\nceil(f64 | max(1))\nceil(f64 | median(1))\nceil(f64 | min(1.0))\nceil(f64)\nceil(f64) != -f64\nceil(f64) != i\nceil(f64) * f64\nceil(f64) * i\nceil(f64) - i\nceil(f64) / 1 + i\nceil(f64) == f64\nceil(f64) == i\nceil(f64) ^ f64\nceil(f64) ^ i\nceil(f64) | median(1)\nceil(f64) | median(1.0, i, i)\nceil(false ? 1.0 : 1)\nceil(false ?: 0)\nceil(false ?: 1)\nceil(false ?: i)\nceil(findIndex($env, true))\nceil(findIndex(array, true))\nceil(findLast(array, ok))\nceil(findLastIndex($env, true))\nceil(findLastIndex(array, true))\nceil(first(array))\nceil(float(0))\nceil(float(1))\nceil(float(1.0))\nceil(float(f64))\nceil(float(i))\nceil(floor(0))\nceil(floor(1))\nceil(floor(1.0))\nceil(floor(f64))\nceil(floor(f64)) ?? list\nceil(floor(i))\nceil(i % 1) not in array\nceil(i % i)\nceil(i * 1)\nceil(i * 1.0)\nceil(i * i)\nceil(i ** 0)\nceil(i ** 1)\nceil(i ** 1.0)\nceil(i ** f64)\nceil(i + 1)\nceil(i + 1.0)\nceil(i + i)\nceil(i - 0)\nceil(i - 1.0)\nceil(i - i)\nceil(i / 0)\nceil(i / 1)\nceil(i / 1.0)\nceil(i / f64)\nceil(i / i)\nceil(i ?? 0)\nceil(i ?? add)\nceil(i ?? array)\nceil(i ?? foo)\nceil(i ?? true)\nceil(i ^ 0)\nceil(i ^ 1)\nceil(i ^ 1.0)\nceil(i ^ f64)\nceil(i ^ i)\nceil(i | min(0))\nceil(i | min(1.0))\nceil(i | min(array))\nceil(i)\nceil(i) != 0 ?: 1.0\nceil(i) != i\nceil(i) - i\nceil(i) == i\nceil(i) > i\nceil(i) >= f64\nceil(i) >= min(1)\nceil(i) ?? -1.0\nceil(if false { false } else { f64 })\nceil(if false { str } else { 1.0 })\nceil(if false { true } else { 0 })\nceil(if ok { 0 } else { 0 })\nceil(if true { 1.0 } else { 1.0 })\nceil(if true { 1.0 } else { f64 })\nceil(if true { i } else { foo })\nceil(indexOf(str, str))\nceil(int(0))\nceil(int(1))\nceil(int(1.0))\nceil(int(f64))\nceil(int(i))\nceil(last(array))\nceil(len($env))\nceil(len(array))\nceil(len(list))\nceil(len(str))\nceil(let foobar = 1.0; foobar)\nceil(let foobar = f64; foobar + foobar)\nceil(list | reduce(0))\nceil(list | reduce(0, 1.0))\nceil(list | reduce(f64))\nceil(list | sum(i))\nceil(max(0))\nceil(max(1))\nceil(max(1.0))\nceil(max(array))\nceil(max(array, 1.0))\nceil(max(f64))\nceil(max(f64, f64))\nceil(max(i))\nceil(mean(0))\nceil(mean(1))\nceil(mean(1.0 ^ 1.0))\nceil(mean(1.0))\nceil(mean(array))\nceil(mean(f64))\nceil(mean(f64, 1))\nceil(mean(i))\nceil(mean(i, i, 0))\nceil(mean(mean(1.0)))\nceil(median(0))\nceil(median(1))\nceil(median(1.0))\nceil(median(1.0, 0))\nceil(median(1.0, array))\nceil(median(1.0, i))\nceil(median(array))\nceil(median(f64))\nceil(median(i))\nceil(median(i, 1.0))\nceil(min(0))\nceil(min(1))\nceil(min(1.0))\nceil(min(1.0, f64))\nceil(min(1.0, i))\nceil(min(array))\nceil(min(f64))\nceil(min(i))\nceil(nil ?? 1)\nceil(nil ?? i)\nceil(reduce($env, 1, $env))\nceil(reduce(array, #))\nceil(reduce(array, #acc))\nceil(reduce(array, 1.0))\nceil(reduce(array, f64))\nceil(reduce(list, 0))\nceil(reduce(list, 1))\nceil(round(0))\nceil(round(1))\nceil(round(1.0))\nceil(round(f64))\nceil(round(i))\nceil(sum($env, f64))\nceil(sum($env.array))\nceil(sum(array))\nceil(sum(array, #))\nceil(sum(list, 1.0))\nceil(sum(list, f64))\nceil({foo: 1.0}?.foo)\nconcat($env | map(1.0))\nconcat($env | map(1.0))[:i]\nconcat($env | map(add))\nconcat($env | map(array))\nconcat($env | map(foo))\nconcat($env | map(greet))\nconcat($env.array)\nconcat($env.list)\nconcat($env?.array | sortBy(#))\nconcat($env?.array)\nconcat($env?.list)\nconcat(0 .. 1)\nconcat(0 .. i)\nconcat(1 .. 0)\nconcat(1 .. 1)\nconcat(1 .. i)\nconcat(1..i)\nconcat([$env, $env])\nconcat([$env, 1])\nconcat([$env, add])\nconcat([$env, nil])\nconcat([$env])\nconcat([0])\nconcat([1, foo])\nconcat([1.0 - 1.0])\nconcat([1.0, $env])\nconcat([1.0])\nconcat([1])\nconcat([add, $env])\nconcat([add])\nconcat([array, 1.0])\nconcat([array, 1])\nconcat([array])\nconcat([f64, foo])\nconcat([f64])\nconcat([false, $env])\nconcat([false])\nconcat([foo, 1.0])\nconcat([foo, array])\nconcat([foo])\nconcat([greet, 0])\nconcat([greet])\nconcat([i, 1.0])\nconcat([i])\nconcat([list])\nconcat([nil])\nconcat([ok, $env])\nconcat([ok])\nconcat([str])\nconcat([true, list])\nconcat([true, str])\nconcat([true])\nconcat([true], array)\nconcat(array ?? $env)\nconcat(array ?? 1)\nconcat(array ?? add)\nconcat(array ?? f64)\nconcat(array ?? greet)\nconcat(array ?? nil)\nconcat(array ?? true)\nconcat(array | map(#))\nconcat(array | map($env))\nconcat(array | map(foo))\nconcat(array | sortBy(#))\nconcat(array | sortBy(f64))\nconcat(array | sortBy(i))\nconcat(array | take(0))\nconcat(array)\nconcat(array) == array\nconcat(array) == list\nconcat(array) | all(ok)\nconcat(array) | any(false)\nconcat(array) | any(ok)\nconcat(array) | count(1.0 >= f64)\nconcat(array) | count(ok)\nconcat(array) | groupBy(#)\nconcat(array) | groupBy(0)\nconcat(array) | groupBy(1.0)\nconcat(array) | groupBy(true)\nconcat(array) | map(0)\nconcat(array) | map(1.0)\nconcat(array) | map(f64)\nconcat(array) | map(list)\nconcat(array) | map(ok)\nconcat(array) | max(1.0)\nconcat(array) | reduce(#)\nconcat(array) | reduce(1, foo)\nconcat(array) | reduce(str)\nconcat(array) | sortBy(f64)\nconcat(array) | sum(#)\nconcat(array)?.[i]\nconcat(array, [greet])\nconcat(array, array)\nconcat(array, array)?.[i]\nconcat(array, array, [list])\nconcat(array, list)\nconcat(array[0:])\nconcat(array[1:])\nconcat(array[:0])\nconcat(array[:1])\nconcat(array[:])\nconcat(array[i:])\nconcat(concat(array))\nconcat(concat(array, array))\nconcat(concat(list))\nconcat(false ?: array)\nconcat(false ?: list)\nconcat(filter($env, false))\nconcat(flatten($env.array))\nconcat(flatten(array))\nconcat(flatten(list))\nconcat(i .. 0)\nconcat(i..i)\nconcat(keys($env))\nconcat(keys({foo: array, foo: i}))\nconcat(list ?? $env)\nconcat(list ?? 1)\nconcat(list ?? 1.0)\nconcat(list ?? foo)\nconcat(list ?? i)\nconcat(list ?? str)\nconcat(list ?? true)\nconcat(list | filter(ok))\nconcat(list | map(#))\nconcat(list | map($env))\nconcat(list | map(.String))\nconcat(list | map(1))\nconcat(list | map(1.0))\nconcat(list | map(foo))\nconcat(list | map(list), array)\nconcat(list | sortBy(1.0))\nconcat(list | sortBy(i))\nconcat(list)\nconcat(list) == [1, str]\nconcat(list) | any(ok)\nconcat(list) | count(false)\nconcat(list) | findIndex(true)\nconcat(list) | groupBy(#)\nconcat(list) | groupBy(0)\nconcat(list) | groupBy(1)\nconcat(list) | groupBy(1.0)\nconcat(list) | groupBy(foo)\nconcat(list) | map(0)\nconcat(list) | map(add)\nconcat(list) | map(f64)\nconcat(list) | map(foo)\nconcat(list) | none(ok)\nconcat(list) | reduce(#)\nconcat(list) | reduce(1.0, foo)\nconcat(list) | reduce(f64)\nconcat(list) | reduce(foo)\nconcat(list) | reduce(i, str)\nconcat(list) | sum(1)\nconcat(list) | sum(i)\nconcat(list)?.[i]\nconcat(list, $env.array)\nconcat(list, array)\nconcat(list, array)?.[i]\nconcat(list, list | sortBy(i))\nconcat(list, list)\nconcat(list, list) | any(true)\nconcat(list, list)?.[i]\nconcat(list[1:])\nconcat(map($env, #index))\nconcat(map($env, $env))\nconcat(map($env, 1.0))\nconcat(map($env, array))\nconcat(map($env, array), list)\nconcat(map($env, f64))\nconcat(map($env, foo))\nconcat(map($env, list))\nconcat(map($env, ok))\nconcat(map(array, #))\nconcat(map(array, $env))\nconcat(map(array, 1))\nconcat(map(array, 1.0))\nconcat(map(array, f64))\nconcat(map(array, foo))\nconcat(map(list, #))\nconcat(map(list, $env))\nconcat(map(list, 0))\nconcat(map(list, 1.0))\nconcat(map(list, add))\nconcat(map(list, greet))\nconcat(map(list, i))\nconcat(map(list, str))\nconcat(reduce(list, array))\nconcat(reverse(array))\nconcat(reverse(list))\nconcat(sort($env))\nconcat(sort(array))\nconcat(sortBy(array, #))\nconcat(sortBy(array, 1.0))\nconcat(sortBy(list, 1.0))\nconcat(sortBy(list, i))\nconcat(toPairs($env))\nconcat(toPairs({foo: false, foo: add}))\nconcat(uniq(array))\nconcat(values($env))\ncount($env ?? f64, .greet and false)\ncount($env | filter(false))\ncount($env | map(false))\ncount($env | map(foo), ok)\ncount($env | map(ok))\ncount($env | map(true))\ncount($env, false) ^ i\ncount($env, ok) | bitushr(0)\ncount($env, true) ** i\ncount($env, true) <= 1.0 == $env\ncount($env, true) <= f64\ncount($env, true) > i\ncount($env.list, foo != foo)\ncount($env.list, ok)\ncount($env?.[str], true != nil)\ncount($env?.array, ok)\ncount($env?.list, ok)\ncount(0 .. 0, $env == list)\ncount(1 .. 0)\ncount([$env && false])\ncount([$env, true], 1 == $env)\ncount([false, false])\ncount([false, true])\ncount([false])\ncount([false], #)\ncount([foo] | filter(false))\ncount([nil], 1.0 >= 1.0)\ncount([ok])\ncount([ok], #)\ncount([true])\ncount(array ?? 0, 1.0 not in array)\ncount(array | filter(false))\ncount(array | filter(nil == #))\ncount(array | map(false))\ncount(array | map(ok))\ncount(array, !false)\ncount(array, # != #)\ncount(array, # != i)\ncount(array, # <= #)\ncount(array, # == nil)\ncount(array, # > #)\ncount(array, # >= 1)\ncount(array, # >= f64)\ncount(array, # >= i)\ncount(array, # not in array)\ncount(array, $env != #)\ncount(array, $env.ok)\ncount(array, $env?.false != nil and ok)\ncount(array, 0 <= 1.0)\ncount(array, 0 == #)\ncount(array, 0 == $env)\ncount(array, 1 != nil)\ncount(array, 1 == f64)\ncount(array, 1 > #)\ncount(array, 1.0 != #)\ncount(array, 1.0 != nil)\ncount(array, 1.0 == $env)\ncount(array, 1.0 == nil)\ncount(array, array | none(true))\ncount(array, f64 < #)\ncount(array, false and $env)\ncount(array, false) <= 1 ^ i\ncount(array, false) ^ f64\ncount(array, foo in list)\ncount(array, i >= #)\ncount(array, nil == $env)\ncount(array, nil == 1.0)\ncount(array, nil == nil)\ncount(array, nil ?? false)\ncount(array, ok != false)\ncount(array, ok)\ncount(array, ok) ?? ok\ncount(array, ok) ^ f64\ncount(array, true == ok)\ncount(array, true) in array\ncount(array[:0])\ncount(filter($env, false))\ncount(filter(list, # != #))\ncount(filter(list, false))\ncount(groupBy(list, 1.0).str)\ncount(i .. 0)\ncount(keys($env), ok || #)\ncount(list ?? $env, $env?.ok)\ncount(list | filter(false))\ncount(list | map(false))\ncount(list | map(true))\ncount(list, # != foo)\ncount(list, # != nil)\ncount(list, # == foo)\ncount(list, #.Bar == nil)\ncount(list, #.Bar matches .Bar)\ncount(list, $env == $env)\ncount(list, $env in array)\ncount(list, $env?.ok)\ncount(list, 0 != nil)\ncount(list, 0 <= f64)\ncount(list, 0 == i)\ncount(list, 1 < i)\ncount(list, 1.0 < 1.0)\ncount(list, 1.0 == nil)\ncount(list, [#] | all(true))\ncount(list, add == $env)\ncount(list, f64 == nil)\ncount(list, false) ?? i\ncount(list, foo != $env)\ncount(list, greet != $env)\ncount(list, i == nil)\ncount(list, nil != 1.0)\ncount(list, nil != true)\ncount(list, not ok)\ncount(list, ok ?: .String)\ncount(list, ok)\ncount(list, ok) .. 1 | take(1)\ncount(list, str != $env)\ncount(list, true != nil)\ncount(list, true) >= f64\ncount(list[:0])\ncount(list[:i], ok)\ncount(list[array?.[i]:])\ncount(map($env, $env), ok == $env)\ncount(map($env, false))\ncount(map($env, ok))\ncount(map($env, true))\ncount(map($env, true)) >= f64\ncount(map(array, false))\ncount(map(array, ok))\ncount(map(list, false))\ncount(map(list, ok))\ncount(map(list, true))\ncount(sort($env))\ncount(sort($env), # < #.str)\ncount(sort($env), #)\ncount(sort($env), #.str && #)\ncount(sort($env), -#.add)\ncount(sort($env), .greet?.[greet])\ncount(toPairs($env), 0 in #)\ndate(str, str)\nduration(string(0))\nduration(toJSON(0))\nf64\nf64 != $env == false\nf64 != $env ?: false\nf64 != $env ?? f64\nf64 != $env ?? foo\nf64 != $env and $env\nf64 != $env or $env\nf64 != $env or ok\nf64 != $env || $env\nf64 != $env || false\nf64 != $env.f64\nf64 != $env.i\nf64 != $env?.$env\nf64 != $env?.Bar\nf64 != $env?.Bar?.String\nf64 != $env?.Bar?.[ok]\nf64 != $env?.Bar?.list()\nf64 != $env?.String\nf64 != $env?.[Bar]\nf64 != $env?.[Bar]?.String\nf64 != $env?.[Bar]?.add\nf64 != $env?.[String]\nf64 != $env?.[foobar]\nf64 != $env?.[str]\nf64 != $env?.f64\nf64 != $env?.foobar\nf64 != $env?.i\nf64 != $env?.nil\nf64 != $env?.true\nf64 != -0\nf64 != -1.0\nf64 != 0 != nil\nf64 != 0 != ok\nf64 != 0 != true\nf64 != 0 ** i\nf64 != 0 + i\nf64 != 0 - i\nf64 != 0 == $env\nf64 != 0 == false\nf64 != 0 == nil\nf64 != 0 ?: 1.0\nf64 != 0 || $env\nf64 != 1 ** i\nf64 != 1 + 1.0\nf64 != 1 / i\nf64 != 1 == $env\nf64 != 1 ?? $env\nf64 != 1 and $env\nf64 != 1 || $env\nf64 != 1.0 != $env\nf64 != 1.0 != nil\nf64 != 1.0 * 1.0\nf64 != 1.0 ** 0\nf64 != 1.0 ** i\nf64 != 1.0 + 1.0\nf64 != 1.0 - 0\nf64 != 1.0 - 1\nf64 != 1.0 - i\nf64 != 1.0 == true\nf64 != 1.0 ?: add\nf64 != 1.0 ?? $env?.[greet]\nf64 != 1.0 ?? i\nf64 != 1.0 ^ 1.0\nf64 != 1.0 ^ i\nf64 != 1.0 and $env\nf64 != 1.0 and false\nf64 != 1.0 or $env\nf64 != 1.0 or true\nf64 != abs(1.0)\nf64 != abs(i)\nf64 != array?.[i]\nf64 != bitxor(i, i)\nf64 != f64\nf64 != f64 != $env\nf64 != f64 && $env\nf64 != f64 + 0\nf64 != f64 == ok\nf64 != f64 ?? foo\nf64 != f64 ?? greet\nf64 != f64 ^ f64 && false\nf64 != f64 and true\nf64 != false ?? foo\nf64 != false ?? list\nf64 != findIndex(list, true)\nf64 != first($env)\nf64 != float(i)\nf64 != floor(f64)\nf64 != floor(i)\nf64 != foo ?? 0\nf64 != greet ?? 1\nf64 != greet ?? foo\nf64 != greet ?? true\nf64 != i\nf64 != i != false\nf64 != i && $env\nf64 != i * f64\nf64 != i + 1\nf64 != i / 1\nf64 != i == nil\nf64 != i ?? 0\nf64 != i ?? f64\nf64 != i ^ 0\nf64 != i ^ f64\nf64 != i and $env\nf64 != i and nil not in array\nf64 != i and true\nf64 != i or ok\nf64 != int(1.0)\nf64 != last($env)\nf64 != last(array)\nf64 != len($env)\nf64 != len(array)\nf64 != max(f64)\nf64 != max(i)\nf64 != mean(0)\nf64 != mean(1.0)\nf64 != mean(array)\nf64 != mean(f64)\nf64 != median(1.0)\nf64 != median(array)\nf64 != median(f64)\nf64 != min(0)\nf64 != min(1.0)\nf64 != min(array, 1)\nf64 != nil != $env\nf64 != nil != false\nf64 != nil != nil\nf64 != nil && $env\nf64 != nil ?: greet\nf64 != nil ?? 1.0\nf64 != nil ?? nil\nf64 != nil or $env\nf64 != nil || false\nf64 != ok ?? $env\nf64 != round(1)\nf64 != round(1.0)\nf64 != str ?? $env\nf64 != sum($env, 0)\nf64 != sum(array)\nf64 * $env.f64\nf64 * $env.i\nf64 * $env?.f64\nf64 * $env?.i\nf64 * -f64\nf64 * -i\nf64 * 0 * 1.0\nf64 * 0 + 1\nf64 * 0 - 1.0\nf64 * 0 - f64\nf64 * 0 == $env\nf64 * 0 ?? str\nf64 * 0 ^ f64\nf64 * 0 ^ max(i)\nf64 * 0 in array\nf64 * 1 != nil\nf64 * 1 * 0\nf64 * 1 * i\nf64 * 1 < 1.0\nf64 * 1 <= 0\nf64 * 1 <= i\nf64 * 1 == nil\nf64 * 1 ?? $env?.String\nf64 * 1 ?? false\nf64 * 1 ?? i\nf64 * 1 in array\nf64 * 1.0\nf64 * 1.0 != $env\nf64 * 1.0 != i\nf64 * 1.0 * 1.0\nf64 * 1.0 * f64\nf64 * 1.0 ** f64\nf64 * 1.0 < 0\nf64 * 1.0 < 1\nf64 * 1.0 <= f64\nf64 * 1.0 == $env\nf64 * 1.0 == 1\nf64 * 1.0 == nil\nf64 * 1.0 > 0\nf64 * 1.0 ?? str\nf64 * 1.0 ^ f64\nf64 * 1.0 | max(0)\nf64 * abs(1.0)\nf64 * array?.[1]\nf64 * array?.[i]\nf64 * bitnot(0)\nf64 * ceil(1.0)\nf64 * ceil(f64)\nf64 * f64\nf64 * f64 * i\nf64 * f64 + $env.f64\nf64 * f64 - f64\nf64 * f64 / i\nf64 * f64 > 1\nf64 * f64 ?? true\nf64 * f64 ^ 1.0\nf64 * float(0)\nf64 * float(f64)\nf64 * float(i)\nf64 * floor(f64)\nf64 * i\nf64 * i != $env?.i\nf64 * i != sum(array)\nf64 * i ** 1.0\nf64 * i == i\nf64 * i == nil\nf64 * i > $env?.f64\nf64 * i ?? $env\nf64 * i ?? groupBy($env, .greet)\nf64 * i ?? str\nf64 * i | max(array)\nf64 * int(0)\nf64 * int(1)\nf64 * int(1.0)\nf64 * int(i)\nf64 * len($env)\nf64 * len(foo.Bar)\nf64 * len(str)\nf64 * max(map(array, #))\nf64 * median(1.0)\nf64 * median(f64)\nf64 * min(1.0, 0)\nf64 * min(array)\nf64 * reduce(array, #)\nf64 * round(1.0)\nf64 * sum($env, 1)\nf64 * sum(array | sortBy(#))\nf64 * sum(array)\nf64 ** $env.f64\nf64 ** $env.i\nf64 ** $env?.array?.[i]\nf64 ** $env?.f64\nf64 ** $env?.i\nf64 ** -1\nf64 ** -1.0\nf64 ** -f64\nf64 ** -i\nf64 ** 0 * i\nf64 ** 0 ** f64\nf64 ** 0 < f64\nf64 ** 0 <= i\nf64 ** 0 > i\nf64 ** 0 >= 1.0\nf64 ** 0 ?? i\nf64 ** 0 ?? list / 0\nf64 ** 0 ?? ok\nf64 ** 1 != nil\nf64 ** 1 - i\nf64 ** 1 / 0\nf64 ** 1 < f64\nf64 ** 1 == i\nf64 ** 1 > len($env)\nf64 ** 1 ^ 1\nf64 ** 1.0 != $env\nf64 ** 1.0 != f64\nf64 ** 1.0 * 1.0\nf64 ** 1.0 + 0\nf64 ** 1.0 / i\nf64 ** 1.0 > 1\nf64 ** 1.0 > 1.0\nf64 ** 1.0 >= 1.0\nf64 ** 1.0 ?? f64\nf64 ** 1.0 ?? list\nf64 ** 1.0 ^ 1.0\nf64 ** 1.0 ^ f64\nf64 ** 1.0 not in array\nf64 ** abs(mean(1.0))\nf64 ** array?.[i]\nf64 ** bitnot(0)\nf64 ** f64\nf64 ** f64 != $env || $env\nf64 ** f64 * 0\nf64 ** f64 * i\nf64 ** f64 + 1.0\nf64 ** f64 - 1.0\nf64 ** f64 ?? $env?.[i]\nf64 ** f64 ^ i\nf64 ** f64 | median(0)\nf64 ** float(0)\nf64 ** float(1.0)\nf64 ** floor(1.0)\nf64 ** floor(i)\nf64 ** i\nf64 ** i + $env?.f64\nf64 ** i == nil\nf64 ** i >= i\nf64 ** i ?? $env\nf64 ** i ?? true\nf64 ** i ^ i\nf64 ** int(i)\nf64 ** mean(1.0)\nf64 ** mean(f64)\nf64 ** min(1.0)\nf64 ** min(f64)\nf64 ** round(f64)\nf64 ** sum(array)\nf64 + $env or true\nf64 + $env.f64\nf64 + $env.i\nf64 + $env?.f64\nf64 + $env?.i\nf64 + -0\nf64 + -1\nf64 + -1.0\nf64 + -f64\nf64 + -i\nf64 + 0 * f64\nf64 + 0 + array?.[i]\nf64 + 0 - 1.0\nf64 + 0 - f64\nf64 + 0 ?? !false\nf64 + 0 ^ 1.0\nf64 + 0 ^ f64\nf64 + 0.1\nf64 + 1 * 0\nf64 + 1 * f64\nf64 + 1 * i\nf64 + 1 ** 1.0\nf64 + 1 / 1.0\nf64 + 1 < 1.0\nf64 + 1 <= 1.0\nf64 + 1 > $env and false\nf64 + 1 > 0\nf64 + 1 ?? foo\nf64 + 1 ^ f64\nf64 + 1.0 != f64\nf64 + 1.0 - f64\nf64 + 1.0 < 1.0\nf64 + 1.0 < int(0)\nf64 + 1.0 <= $env.i\nf64 + 1.0 <= 0\nf64 + 1.0 <= 1.0\nf64 + 1.0 == 0\nf64 + 1.0 == i\nf64 + 1.0 == nil\nf64 + 1.0 > 0\nf64 + 1.0 > i\nf64 + 1.0 >= 1\nf64 + 1.0 ?? 1\nf64 + 1.0 ^ 0\nf64 + 1.0 ^ 1.0\nf64 + 1.0 not in array\nf64 + 1.0 | max(1.0)\nf64 + abs(f64)\nf64 + abs(i)\nf64 + array?.[i]\nf64 + bitnot(i)\nf64 + ceil(0)\nf64 + ceil(1)\nf64 + ceil(1.0)\nf64 + count($env, true)\nf64 + f64\nf64 + f64 ** 1.0\nf64 + f64 ?? 1\nf64 + f64 ^ i\nf64 + floor(0)\nf64 + floor(i)\nf64 + i\nf64 + i != 0\nf64 + i ** 1\nf64 + i - 1\nf64 + i / i\nf64 + i == f64\nf64 + i == i\nf64 + i > 1.0\nf64 + i > f64\nf64 + i in array\nf64 + i not in array\nf64 + int(i)\nf64 + mean(1.0)\nf64 + median(f64)\nf64 + min(f64)\nf64 + min(i)\nf64 + nil ?? i ?? greet\nf64 + round(1.0)\nf64 + sum(array)\nf64 + sum(list, 1)\nf64 - $env.f64\nf64 - $env.i\nf64 - $env?.f64\nf64 - $env?.i\nf64 - -0\nf64 - -1\nf64 - -1.0\nf64 - -i\nf64 - 0 % i\nf64 - 0 ** 1.0\nf64 - 0 / 1\nf64 - 0 / f64\nf64 - 0 < 0\nf64 - 0 < 1\nf64 - 0 > 0\nf64 - 0 > f64\nf64 - 0 in array\nf64 - 1 != $env\nf64 - 1 * $env.f64\nf64 - 1 <= -1\nf64 - 1 <= 1\nf64 - 1 <= 1 + f64\nf64 - 1 > i\nf64 - 1 ?? $env.ok\nf64 - 1 ^ i\nf64 - 1 not in $env?.[Bar]\nf64 - 1 | mean(1.0)\nf64 - 1.0 * 1\nf64 - 1.0 ** i\nf64 - 1.0 - 0\nf64 - 1.0 - 1\nf64 - 1.0 - 1.0\nf64 - 1.0 / i\nf64 - 1.0 < f64 + 0\nf64 - 1.0 <= i\nf64 - 1.0 == f64\nf64 - 1.0 == nil\nf64 - 1.0 > 1\nf64 - 1.0 ?? list\nf64 - 1.0 ^ f64\nf64 - 1.0 | mean(array)\nf64 - abs(0)\nf64 - array?.[i]\nf64 - bitnot(i)\nf64 - bitxor(i, i)\nf64 - ceil(f64)\nf64 - count(list, true)\nf64 - f64\nf64 - f64 < i\nf64 - f64 <= f64\nf64 - f64 > 0\nf64 - float(1.0)\nf64 - floor(0)\nf64 - floor(f64)\nf64 - floor(i)\nf64 - i\nf64 - i % 1\nf64 - i >= 1\nf64 - i >= i\nf64 - i ^ 1.0\nf64 - i | median(1.0)\nf64 - int(0)\nf64 - int(1.0)\nf64 - last(array)\nf64 - len(str)\nf64 - max(array)\nf64 - max(f64)\nf64 - median(1.0)\nf64 - median(array)\nf64 - min(1.0, array)\nf64 - reduce(array, i)\nf64 - sum(array)\nf64 / $env.f64\nf64 / $env.i\nf64 / $env?.f64\nf64 / $env?.i\nf64 / -0\nf64 / -1\nf64 / -1.0\nf64 / -i\nf64 / 0 != 1.0\nf64 / 0 + i\nf64 / 0 - 1.0\nf64 / 0 < f64\nf64 / 0 ^ $env?.i\nf64 / 0 ^ 1.0\nf64 / 0 not in array\nf64 / 1 * f64\nf64 / 1 * i ?? 1.0\nf64 / 1 / 1.0\nf64 / 1 / i\nf64 / 1 <= 0\nf64 / 1 == 0\nf64 / 1 == int(f64)\nf64 / 1 ?? array\nf64 / 1.0 != 1\nf64 / 1.0 != f64\nf64 / 1.0 ** 1.0\nf64 / 1.0 - 1\nf64 / 1.0 / $env?.i\nf64 / 1.0 / 1.0\nf64 / 1.0 <= 1.0\nf64 / 1.0 == 1.0\nf64 / 1.0 > 1\nf64 / 1.0 >= 0\nf64 / 1.0 >= 1.0\nf64 / 1.0 ?? list\nf64 / 1.0 ?? nil + 1.0\nf64 / 1.0 ?? true >= 1.0\nf64 / 1.0 ^ 1.0\nf64 / 1.0 ^ f64\nf64 / 1.0 ^ i\nf64 / abs(1.0)\nf64 / abs(i)\nf64 / add(i, 1)\nf64 / array?.[i]\nf64 / ceil(1.0)\nf64 / f64\nf64 / f64 != 1\nf64 / f64 ** i\nf64 / f64 + 0\nf64 / f64 / 1.0\nf64 / f64 <= f64\nf64 / f64 ?? 0\nf64 / f64 ?? ok\nf64 / f64 not in array\nf64 / first(array)\nf64 / float(1.0)\nf64 / i\nf64 / i * i\nf64 / i - sum(array)\nf64 / i == 0\nf64 / i >= 1.0\nf64 / i ?? i\nf64 / i ?? nil\nf64 / i ^ 0 * 1.0\nf64 / i ^ 1.0\nf64 / int(f64)\nf64 / len($env)\nf64 / len(array)\nf64 / max(1)\nf64 / max(f64, f64)\nf64 / max(i)\nf64 / mean(0)\nf64 / mean(1)\nf64 / mean(1.0)\nf64 / mean(1.0, array)\nf64 / mean(array)\nf64 / min(array)\nf64 / nil ?? 1.0\nf64 / reduce(list, i)\nf64 / round(1.0)\nf64 / sum(array)\nf64 / sum(array, 0)\nf64 < $env.f64\nf64 < $env.i\nf64 < $env?.f64\nf64 < $env?.i\nf64 < -1.0\nf64 < -f64\nf64 < 0 % 1\nf64 < 0 * 1\nf64 < 0 ** f64\nf64 < 0 + 0\nf64 < 0 + 1\nf64 < 0 + 1.0\nf64 < 0 + i\nf64 < 0 < $env > $env\nf64 < 0 <= $env?.[array]\nf64 < 0 == false\nf64 < 0 == true\nf64 < 0 ?? array\nf64 < 0 ?? nil\nf64 < 0 ?? str\nf64 < 0 or true\nf64 < 1 % 1\nf64 < 1 ** 1.0\nf64 < 1 / 0\nf64 < 1 / 1.0\nf64 < 1 <= f64\nf64 < 1 > 1.0\nf64 < 1 >= 1\nf64 < 1 >= 1.0\nf64 < 1 ?? i\nf64 < 1 or ok\nf64 < 1 or true\nf64 < 1.0 != true\nf64 < 1.0 && $env\nf64 < 1.0 * 1.0\nf64 < 1.0 * i\nf64 < 1.0 ** 0\nf64 < 1.0 + f64\nf64 < 1.0 - 1.0\nf64 < 1.0 - f64\nf64 < 1.0 / 1\nf64 < 1.0 / 1.0\nf64 < 1.0 / f64\nf64 < 1.0 < 1.0\nf64 < 1.0 <= i\nf64 < 1.0 == false\nf64 < 1.0 >= 1.0 == true\nf64 < 1.0 >= i\nf64 < 1.0 ?: true\nf64 < 1.0 ?? ok\nf64 < 1.0 and false\nf64 < abs(1)\nf64 < abs(1.0)\nf64 < array?.[i]\nf64 < bitnot(i)\nf64 < ceil(1.0)\nf64 < count(list, true)\nf64 < f64\nf64 < f64 < 1.0\nf64 < f64 <= 1.0\nf64 < f64 > 0\nf64 < f64 >= 1.0\nf64 < f64 ?: ok\nf64 < f64 ?? 1.0\nf64 < f64 ?? greet\nf64 < f64 and $env\nf64 < f64 in $env?.String\nf64 < findIndex($env, ok)\nf64 < float(1)\nf64 < float(f64)\nf64 < floor(1)\nf64 < floor(f64)\nf64 < i\nf64 < i != nil\nf64 < i % 1\nf64 < i % i\nf64 < i && $env\nf64 < i < $env.i\nf64 < i < max(0)\nf64 < i == nil\nf64 < i >= f64\nf64 < i ?? f64\nf64 < i ?? greet\nf64 < i || true\nf64 < len($env)\nf64 < max(array)\nf64 < max(f64)\nf64 < mean(f64)\nf64 < median(array)\nf64 < min(0)\nf64 < min(1.0)\nf64 < min(i)\nf64 < nil ?? i\nf64 < round(1.0)\nf64 < sum($env, 1)\nf64 < sum(array)\nf64 <= $env.f64\nf64 <= $env.i\nf64 <= $env?.f64\nf64 <= $env?.i\nf64 <= -0\nf64 <= 0 ** 1.0\nf64 <= 0 - f64\nf64 <= 0 <= 1.0\nf64 <= 0 > i\nf64 <= 0 >= mean(1.0)\nf64 <= 0.1\nf64 <= 1 != true and $env\nf64 <= 1 && true\nf64 <= 1 * i\nf64 <= 1 - i\nf64 <= 1 / 1\nf64 <= 1 / f64\nf64 <= 1 >= 1.0\nf64 <= 1 >= f64\nf64 <= 1 ?? $env.f64\nf64 <= 1 ?? foo\nf64 <= 1 ^ 0\nf64 <= 1 ^ i\nf64 <= 1 or true\nf64 <= 1 || $env\nf64 <= 1.0\nf64 <= 1.0 != nil\nf64 <= 1.0 != true\nf64 <= 1.0 && $env\nf64 <= 1.0 && true\nf64 <= 1.0 * $env?.i\nf64 <= 1.0 * min(i)\nf64 <= 1.0 + 1.0\nf64 <= 1.0 / 1.0\nf64 <= 1.0 < 1.0 ^ i\nf64 <= 1.0 <= f64\nf64 <= 1.0 <= i\nf64 <= 1.0 <= mean(1.0)\nf64 <= 1.0 > 1\nf64 <= 1.0 > i\nf64 <= 1.0 ?? add\nf64 <= 1.0 ?? greet\nf64 <= 1.0 ?? str\nf64 <= 1.0 ^ 0\nf64 <= 1.0 ^ 1.0\nf64 <= 1.0 ^ f64\nf64 <= 1.0 and $env\nf64 <= 1.0 and ok\nf64 <= 1.0 || true\nf64 <= 1.1 <= 1\nf64 <= abs(0)\nf64 <= abs(1)\nf64 <= abs(f64)\nf64 <= add(i, i)\nf64 <= array?.[i]\nf64 <= bitnand(i, 1)\nf64 <= f64\nf64 <= f64 && $env\nf64 <= f64 * i\nf64 <= f64 - 0\nf64 <= f64 == false\nf64 <= f64 ?? $env\nf64 <= f64 and $env\nf64 <= f64 || $env\nf64 <= findIndex(list, ok)\nf64 <= floor(1.0)\nf64 <= i\nf64 <= i + f64\nf64 <= i - 0\nf64 <= i == $env?.Bar\nf64 <= i > i\nf64 <= i ?? ok\nf64 <= int(1.0)\nf64 <= last(array)\nf64 <= len(list)\nf64 <= mean(1)\nf64 <= mean(1.0)\nf64 <= mean(i)\nf64 <= median(1.0)\nf64 <= median(f64)\nf64 <= min(f64)\nf64 <= reduce(array, 1.0, true)\nf64 <= sum(array)\nf64 <= sum(array, #)\nf64 == $env && true\nf64 == $env == $env\nf64 == $env ? add : $env\nf64 == $env ?? add\nf64 == $env ?? greet\nf64 == $env or $env\nf64 == $env or ok\nf64 == $env.f64\nf64 == $env.i\nf64 == $env?.Bar\nf64 == $env?.String\nf64 == $env?.[Bar]\nf64 == $env?.[String]\nf64 == $env?.[String]?.[greet]\nf64 == $env?.[foobar]\nf64 == $env?.[str]\nf64 == $env?.f64\nf64 == $env?.foobar\nf64 == $env?.foobar?.str\nf64 == $env?.i\nf64 == -1\nf64 == -1.0\nf64 == 0 % i\nf64 == 0 && $env?.[add]\nf64 == 0 && 0 == nil\nf64 == 0 && sum($env)\nf64 == 0 ** 1.0\nf64 == 0 - 1.0\nf64 == 0 / $env.i\nf64 == 0 == nil\nf64 == 0 or ok\nf64 == 1 != ok\nf64 == 1 * i\nf64 == 1 + 1.0\nf64 == 1 - 1.0\nf64 == 1 - f64\nf64 == 1 ?: 1.0\nf64 == 1 ?? f64\nf64 == 1 || i <= 0\nf64 == 1.0 != false\nf64 == 1.0 ** 0\nf64 == 1.0 + f64\nf64 == 1.0 == nil\nf64 == 1.0 == ok\nf64 == 1.0 ?: nil\nf64 == 1.0 ?? 1\nf64 == 1.0 ?? ok\nf64 == 1.0 ^ 1.0\nf64 == 1.0 and ok\nf64 == 1.0 and true\nf64 == 1.0 || $env\nf64 == abs(1.0)\nf64 == abs(i)\nf64 == add ?? false\nf64 == add ?? greet\nf64 == add ?? list\nf64 == array ?? greet\nf64 == array?.[i]\nf64 == bitnot(i)\nf64 == bitor(i, 1)\nf64 == ceil(1)\nf64 == ceil(1.0)\nf64 == count(array, ok)\nf64 == f64\nf64 == f64 * 1\nf64 == f64 * f64\nf64 == f64 / 0\nf64 == f64 ?? false\nf64 == f64 ^ i\nf64 == f64 || false\nf64 == findLastIndex($env, true)\nf64 == floor(1)\nf64 == foo ?? f64\nf64 == foo ?? list\nf64 == greet ?? add\nf64 == i\nf64 == i % 1\nf64 == i - i\nf64 == i / f64\nf64 == i / i\nf64 == i ?? [foo]\nf64 == i ?? any($env, false)\nf64 == i ^ 0\nf64 == i or ok\nf64 == i || false\nf64 == int(f64)\nf64 == len(string(nil))\nf64 == list ?? $env\nf64 == list ?? array\nf64 == max(0)\nf64 == mean(1.0)\nf64 == median(1.0)\nf64 == median(i)\nf64 == min($env)\nf64 == min(1.0)\nf64 == nil != nil\nf64 == nil != ok\nf64 == nil ?: list\nf64 == nil or $env\nf64 == nil || max(array)\nf64 == nil || true\nf64 == ok ?? foo\nf64 == ok ?? str\nf64 == round(f64)\nf64 == str ?? 0\nf64 == str ?? i\nf64 == sum(array)\nf64 > $env.f64\nf64 > $env.i\nf64 > $env?.[str]?.[f64]\nf64 > $env?.f64\nf64 > $env?.i\nf64 > -0\nf64 > -1\nf64 > -1.0\nf64 > 0 + 1.0\nf64 > 0 / 1.0\nf64 > 0 / i\nf64 > 0 >= 0\nf64 > 0 >= 1.0\nf64 > 0 ? 1 : 1.0\nf64 > 0 ?? $env.f64\nf64 > 0 ?? false\nf64 > 0 ?? foo\nf64 > 0 and $env?.String\nf64 > 0 or true\nf64 > 0 || $env\nf64 > 1 != ok\nf64 > 1 && $env\nf64 > 1 * i\nf64 > 1 ** i\nf64 > 1 / 1.0\nf64 > 1 / f64\nf64 > 1 / i\nf64 > 1 <= i\nf64 > 1 >= f64\nf64 > 1 >= i\nf64 > 1 ? array : false\nf64 > 1 ?? list\nf64 > 1 or true\nf64 > 1.0 != nil\nf64 > 1.0 != ok\nf64 > 1.0 && $env\nf64 > 1.0 * 1.0\nf64 > 1.0 * i\nf64 > 1.0 ** f64\nf64 > 1.0 - nil ?? i\nf64 > 1.0 / 0\nf64 > 1.0 <= f64\nf64 > 1.0 <= i\nf64 > 1.0 == true\nf64 > 1.0 > $env\nf64 > 1.0 > median(list, 1)\nf64 > 1.0 ? i : false\nf64 > 1.0 ?? 1.0\nf64 > 1.0 ?? add\nf64 > 1.0 ?? foo\nf64 > 1.0 ^ f64\nf64 > 1.0 and true\nf64 > 1.0 or ok\nf64 > 1.0 || $env?.[Bar]\nf64 > array?.[i]\nf64 > bitnot(1)\nf64 > ceil(0)\nf64 > ceil(f64)\nf64 > ceil(i)\nf64 > f64\nf64 > f64 != true\nf64 > f64 * f64\nf64 > f64 - 1\nf64 > f64 >= 1.0\nf64 > f64 and true\nf64 > f64 or ok\nf64 > first(array)\nf64 > float(1.0)\nf64 > i\nf64 > i - f64\nf64 > i < f64 ?: $env\nf64 > i == $env\nf64 > i >= max($env)\nf64 > i ^ 1\nf64 > i and ok\nf64 > max(array)\nf64 > mean(1)\nf64 > mean(1.0)\nf64 > median(f64)\nf64 > round(1)\nf64 > round(1.0)\nf64 > round(i)\nf64 > sum($env | filter(false))\nf64 > sum($env, f64)\nf64 >= $env && false\nf64 >= $env ^ 1 and false\nf64 >= $env or true\nf64 >= $env || true\nf64 >= $env.f64\nf64 >= $env.i\nf64 >= $env?.f64\nf64 >= $env?.i\nf64 >= -1.0\nf64 >= -i\nf64 >= 0 != $env\nf64 >= 0 - 0\nf64 >= 0 == true\nf64 >= 0 >= f64\nf64 >= 0 ? add : 0\nf64 >= 0 ? greet : 1\nf64 >= 0 ?? i\nf64 >= 0 || ok\nf64 >= 1 != nil\nf64 >= 1 != true\nf64 >= 1 / f64\nf64 >= 1 < i\nf64 >= 1 == false\nf64 >= 1 >= f64\nf64 >= 1 ? 0 : foo\nf64 >= 1 ? foo : str\nf64 >= 1 ^ 1.0\nf64 >= 1.0 != add ?? foo\nf64 >= 1.0 != nil\nf64 >= 1.0 && ok\nf64 >= 1.0 ** i < f64\nf64 >= 1.0 + $env.f64\nf64 >= 1.0 + 1.0\nf64 >= 1.0 / i\nf64 >= 1.0 > i\nf64 >= 1.0 ?: greet\nf64 >= 1.0 ?: list\nf64 >= 1.0 ?? nil\nf64 >= 1.0 and $env in str\nf64 >= 1.0 and $env?.[str]\nf64 >= 1.0 and not ok\nf64 >= 1.0 || ok\nf64 >= 1.1\nf64 >= array?.[i]\nf64 >= bitnot(i)\nf64 >= ceil(0)\nf64 >= ceil(i)\nf64 >= f64\nf64 >= f64 * 1.0\nf64 >= f64 == ok\nf64 >= f64 >= i\nf64 >= f64 ?? str\nf64 >= f64 ^ f64\nf64 >= f64 || 1.0 == 1.0\nf64 >= f64 || true\nf64 >= float(0)\nf64 >= float(1)\nf64 >= float(1.0)\nf64 >= floor(-0)\nf64 >= floor(1.0)\nf64 >= floor(f64)\nf64 >= floor(i)\nf64 >= i\nf64 >= i != $env\nf64 >= i * f64\nf64 >= i + 1.0\nf64 >= i / f64\nf64 >= i < f64\nf64 >= i ?: true\nf64 >= i ?? $env\nf64 >= i ?? $env.list\nf64 >= i ?? false\nf64 >= i || $env\nf64 >= int(1.0)\nf64 >= mean(0)\nf64 >= mean(1)\nf64 >= mean(1.0)\nf64 >= min(0)\nf64 >= min(i)\nf64 >= nil ?? f64\nf64 >= nil ?? i\nf64 >= round(1)\nf64 >= sum(array)\nf64 ?? !$env\nf64 ?? !false\nf64 ?? !ok\nf64 ?? $env ?? $env\nf64 ?? $env ?? add\nf64 ?? $env ?? f64\nf64 ?? $env ?? nil\nf64 ?? $env ?? ok\nf64 ?? $env | get(greet)\nf64 ?? $env | max(1)\nf64 ?? $env.add\nf64 ?? $env.array\nf64 ?? $env.f64\nf64 ?? $env.foo\nf64 ?? $env.greet\nf64 ?? $env.i\nf64 ?? $env.list\nf64 ?? $env.ok\nf64 ?? $env.str\nf64 ?? $env?.Bar\nf64 ?? $env?.Bar($env < 1.0)\nf64 ?? $env?.Bar()\nf64 ?? $env?.String\nf64 ?? $env?.String()\nf64 ?? $env?.[$env?.String()]\nf64 ?? $env?.[Bar]\nf64 ?? $env?.[String]\nf64 ?? $env?.[String].str()\nf64 ?? $env?.[add]\nf64 ?? $env?.[add]?.[greet]\nf64 ?? $env?.[array]\nf64 ?? $env?.[array].list()\nf64 ?? $env?.[f64]\nf64 ?? $env?.[false - 1]\nf64 ?? $env?.[foo]\nf64 ?? $env?.[foobar.Bar]\nf64 ?? $env?.[foobar?.[f64]]\nf64 ?? $env?.[foobar]\nf64 ?? $env?.[greet(foo)]\nf64 ?? $env?.[greet]\nf64 ?? $env?.[greet].array()\nf64 ?? $env?.[i]\nf64 ?? $env?.[i]?.[str]\nf64 ?? $env?.[list]\nf64 ?? $env?.[not foo]\nf64 ?? $env?.[ok]\nf64 ?? $env?.[ok].array()\nf64 ?? $env?.[str]\nf64 ?? $env?.[str][:i(i < foobar)]\nf64 ?? $env?.add\nf64 ?? $env?.all(foobar)\nf64 ?? $env?.array\nf64 ?? $env?.f64\nf64 ?? $env?.foo\nf64 ?? $env?.foobar\nf64 ?? $env?.foobar?.list\nf64 ?? $env?.greet\nf64 ?? $env?.i\nf64 ?? $env?.list\nf64 ?? $env?.ok\nf64 ?? $env?.str\nf64 ?? $env[0:foobar]\nf64 ?? $env[:1]\nf64 ?? $env[:add[:]]\nf64 ?? $env[:foo]\nf64 ?? $env[:foobar]\nf64 ?? $env[:nil]\nf64 ?? $env[:sum(0, foobar)].ok\nf64 ?? $env[Bar | none(#):]\nf64 ?? $env[Bar():i(1)]\nf64 ?? $env[f64 / foo:]\nf64 ?? $env[f64:replace(foobar, 1.0)]\nf64 ?? $env[false > Bar:]\nf64 ?? $env[foo - 1:foobar].ok\nf64 ?? $env[foobar:]\nf64 ?? $env[foobar:foobar and array]\nf64 ?? $env[list:greet]\nf64 ?? -$env\nf64 ?? -$env?.[1]\nf64 ?? -0\nf64 ?? -1\nf64 ?? -1.0\nf64 ?? -f64\nf64 ?? 0 ?? $env?.nil\nf64 ?? 0 ?? [1.0]\nf64 ?? 0 ?? true\nf64 ?? 1 ?? foo\nf64 ?? 1.0 ?? date(f64)\nf64 ?? [$env]\nf64 ?? [f64, f64]\nf64 ?? abs(1.0)\nf64 ?? add\nf64 ?? add(i, $env)\nf64 ?? array\nf64 ?? array ?? array\nf64 ?? array ?? true\nf64 ?? array | mean(1.0)\nf64 ?? array?.[i]\nf64 ?? bitnot(i)\nf64 ?? count($env | map(#.add))\nf64 ?? count($env)\nf64 ?? count($env, #)\nf64 ?? count($env?.[i])\nf64 ?? count(array)\nf64 ?? count(list)\nf64 ?? date($env, 1)\nf64 ?? date(foo)\nf64 ?? date(sum(list))\nf64 ?? f64\nf64 ?? f64 ?? ok\nf64 ?? false ?? 1.0\nf64 ?? false | max(0)\nf64 ?? findLast($env, #.f64)\nf64 ?? findLast(array, false)\nf64 ?? first($env)?.ok()\nf64 ?? floor($env)\nf64 ?? foo\nf64 ?? foo ?? $env\nf64 ?? foo ?? foo\nf64 ?? foo | get(1.0)\nf64 ?? foo | max(0)\nf64 ?? foo.Bar\nf64 ?? foo.String\nf64 ?? foo.String()\nf64 ?? foo?.Bar\nf64 ?? foo?.String\nf64 ?? foo?.String()\nf64 ?? fromBase64($env)\nf64 ?? greet\nf64 ?? greet($env)\nf64 ?? groupBy($env, #)\nf64 ?? groupBy($env, true)\nf64 ?? groupBy(list, #)\nf64 ?? i\nf64 ?? i ?? add\nf64 ?? int(1)\nf64 ?? int(f64)\nf64 ?? int(str)\nf64 ?? len(str)\nf64 ?? list\nf64 ?? list?.[i]\nf64 ?? lower($env)\nf64 ?? map($env, #)\nf64 ?? map($env, #.Bar)\nf64 ?? map(array, #index)\nf64 ?? max(1.0)\nf64 ?? mean($env)\nf64 ?? median(1.0)\nf64 ?? min($env?.[add])\nf64 ?? min(0)\nf64 ?? min(list)\nf64 ?? nil ?? 0\nf64 ?? not $env\nf64 ?? not ok\nf64 ?? not true\nf64 ?? ok\nf64 ?? ok ?? 1.0\nf64 ?? ok ?? greet\nf64 ?? reduce($env, add)\nf64 ?? reduce($env, foo)\nf64 ?? reduce(array, #, $env)\nf64 ?? reduce(list, str)\nf64 ?? reverse($env)\nf64 ?? reverse(array)\nf64 ?? round(i)\nf64 ?? sortBy(list, ok)\nf64 ?? str\nf64 ?? str[$env:i]\nf64 ?? string(f64)\nf64 ?? string(str)\nf64 ?? string(true)\nf64 ?? sum($env, #.foo)\nf64 ?? sum($env, .str)\nf64 ?? sum($env, foo)\nf64 ?? sum($env?.[list])\nf64 ?? sum(array)\nf64 ?? toJSON(0)\nf64 ?? toJSON(1.0)\nf64 ?? true ?? 0\nf64 ?? type(1)\nf64 ?? uniq($env)\nf64 ?? {foo: 1.0, foo: list}\nf64 ?? {foo: 1}\nf64 ?? {foo: greet}\nf64 ?? {foo: i, foo: str}\nf64 ?? {foo: list}\nf64 ^ $env.f64\nf64 ^ $env.i\nf64 ^ $env?.f64\nf64 ^ $env?.i\nf64 ^ -1\nf64 ^ -1.0\nf64 ^ -f64\nf64 ^ 0 - 1.0\nf64 ^ 0 - i\nf64 ^ 0 / i\nf64 ^ 0 < 0\nf64 ^ 0 >= 1.0 ?: greet\nf64 ^ 1 != 1\nf64 ^ 1 * 1.0\nf64 ^ 1 + 1\nf64 ^ 1 + 1.0\nf64 ^ 1 + f64\nf64 ^ 1 > 1\nf64 ^ 1 > f64\nf64 ^ 1 ?? nil\nf64 ^ 1 in [1.0]\nf64 ^ 1.0\nf64 ^ 1.0 != $env\nf64 ^ 1.0 != 1.0\nf64 ^ 1.0 != f64\nf64 ^ 1.0 != i\nf64 ^ 1.0 ** 1.0\nf64 ^ 1.0 / i\nf64 ^ 1.0 > 1\nf64 ^ 1.0 >= i\nf64 ^ 1.0 ?? str\nf64 ^ array?.[i]\nf64 ^ bitand(0, 0)\nf64 ^ bitnot(1)\nf64 ^ ceil(0)\nf64 ^ f64\nf64 ^ f64 != $env\nf64 ^ f64 != 0\nf64 ^ f64 != 1\nf64 ^ f64 * 1.0\nf64 ^ f64 ** i\nf64 ^ f64 + 1.0\nf64 ^ f64 == i\nf64 ^ f64 > f64\nf64 ^ f64 ?? greet\nf64 ^ f64 ^ f64\nf64 ^ f64 in array\nf64 ^ find(array, ok)\nf64 ^ float(i)\nf64 ^ floor(i)\nf64 ^ i\nf64 ^ i ** 1.0\nf64 ^ i ** i\nf64 ^ i / $env.i\nf64 ^ i <= 1.0\nf64 ^ i >= 0 || $env\nf64 ^ i not in array\nf64 ^ int(0)\nf64 ^ int(1.0)\nf64 ^ int(f64)\nf64 ^ len($env)\nf64 ^ mean(0)\nf64 ^ mean(i)\nf64 ^ median(0)\nf64 ^ min(0)\nf64 ^ nil ?? 1\nf64 ^ round(1.0)\nf64 ^ sum(array)\nf64 in $env && false\nf64 in $env.array\nf64 in $env?.Bar\nf64 in $env?.Bar?.[str]\nf64 in $env?.String\nf64 in $env?.[$env?.[String]]\nf64 in $env?.[Bar]\nf64 in $env?.[String]\nf64 in $env?.[foobar]\nf64 in $env?.array\nf64 in $env?.foobar\nf64 in $env?.foobar?.[add]\nf64 in $env?.nil\nf64 in [1.0]\nf64 in [foo, 1.0]\nf64 in [foo, i]\nf64 in [foo, nil]\nf64 in [i]\nf64 in [list, 1.0]\nf64 in [nil]\nf64 in [true, $env]\nf64 in array\nf64 in array != nil\nf64 in array ? foo : foo\nf64 in array ? type(false) : foo\nf64 in array ?? 0\nf64 in array ?? nil\nf64 in array and $env\nf64 in array or false\nf64 in last($env)\nf64 in list ?? foo\nf64 in list ?? i\nf64 in reverse(array)\nf64 in sort($env)\nf64 in uniq(array)\nf64 in uniq(list)\nf64 not in $env or true\nf64 not in $env.array\nf64 not in $env?.Bar\nf64 not in $env?.String\nf64 not in $env?.[Bar]\nf64 not in $env?.[String]\nf64 not in $env?.[String]?.foo\nf64 not in $env?.[foobar]\nf64 not in $env?.array\nf64 not in $env?.foobar\nf64 not in $env?.foobar?.String\nf64 not in 0..i\nf64 not in [$env]\nf64 not in [1.0]\nf64 not in [array | groupBy(#), i]\nf64 not in array\nf64 not in array ?? 0\nf64 not in array ?? foo or false\nf64 not in array || sum($env)\nf64 not in i .. i\nf64 not in keys($env)\nf64 not in list ?? str\nf64 not in map($env, $env)\nf64 not in map(array, 1)\nf64 | max(0)\nf64 | max(0, 1)\nf64 | max(1)\nf64 | max(1, array)\nf64 | max(1.0)\nf64 | max(1.0, 1)\nf64 | max(1.0, 1.0)\nf64 | max(1.0, f64)\nf64 | max(1.0, i)\nf64 | max([1.0])\nf64 | max(array)\nf64 | max(array, 0)\nf64 | max(array, 1)\nf64 | max(bitnot(1))\nf64 | max(f64)\nf64 | max(f64, i)\nf64 | max(i)\nf64 | max(i, 1)\nf64 | max(i, 1.0)\nf64 | max(i, i)\nf64 | max(sortBy(array, #))\nf64 | mean($env?.i)\nf64 | mean(0)\nf64 | mean(0, 0)\nf64 | mean(0, 1.0)\nf64 | mean(0, array)\nf64 | mean(1)\nf64 | mean(1) > f64\nf64 | mean(1.0 ?? 1.0)\nf64 | mean(1.0)\nf64 | mean(1.0, 0)\nf64 | mean(1.0, 1.0)\nf64 | mean(1.0, array)\nf64 | mean(array)\nf64 | mean(array, 0)\nf64 | mean(f64)\nf64 | mean(f64, 1.0)\nf64 | mean(f64, array)\nf64 | mean(f64, array) != add\nf64 | mean(f64, f64)\nf64 | mean(f64, i)\nf64 | mean(i)\nf64 | mean(i, 1)\nf64 | median($env?.i)\nf64 | median(-i)\nf64 | median(0)\nf64 | median(0, 0)\nf64 | median(0, array)\nf64 | median(0, i)\nf64 | median(1)\nf64 | median(1.0)\nf64 | median(1.0, 1)\nf64 | median(1.0, 1.0)\nf64 | median(array)\nf64 | median(array) >= f64\nf64 | median(array, 0)\nf64 | median(array, 1.0)\nf64 | median(array, i)\nf64 | median(f64)\nf64 | median(f64, 1.0)\nf64 | median(i)\nf64 | median(i, 1.0)\nf64 | min($env?.array)\nf64 | min($env?.f64)\nf64 | min(0)\nf64 | min(0, 1)\nf64 | min(0, i)\nf64 | min(1)\nf64 | min(1, f64)\nf64 | min(1, i, 1.0, 1.0)\nf64 | min(1.0)\nf64 | min(1.0, 0)\nf64 | min(array)\nf64 | min(array, 1)\nf64 | min(array, array)\nf64 | min(array, i)\nf64 | min(f64)\nf64 | min(f64, 1.0)\nf64 | min(i)\nf64 | min(i, i)\nf64 | min(mean(f64))\nf64; $env?.list\nf64; array\nf64; f64\nf64; foo?.String\nf64; greet\nf64; i\nf64; min(foo ?? true)\nf64; ok\nf64; str\nfalse != $env ?? -1\nfalse != $env and ok\nfalse != $env.ok\nfalse != $env?.Bar\nfalse != $env?.Bar?.greet()\nfalse != $env?.String\nfalse != $env?.[Bar]\nfalse != $env?.[String]\nfalse != $env?.[foobar]\nfalse != $env?.[str]\nfalse != $env?.foobar\nfalse != $env?.ok\nfalse != $env?.true?.[list].i\nfalse != 0 ?? str\nfalse != 1.0 ?? i\nfalse != add ?? f64 ?: foo\nfalse != array ?? list\nfalse != greet ?? $env?.[ok]\nfalse != greet ?? str\nfalse != i ?? array\nfalse != nil == nil ?: list\nfalse != nil == ok\nfalse != nil ?: add\nfalse != nil ?: f64 != $env\nfalse != nil or sum($env)\nfalse != str ?? filter($env, true)\nfalse && $env + i\nfalse && $env == add\nfalse && $env == count(array)\nfalse && $env > findLastIndex($env, #)\nfalse && $env >= sum($env)?.[array]\nfalse && $env ?? ok\nfalse && $env ^ f64 <= 1\nfalse && $env contains array ?? list\nfalse && $env in list\nfalse && $env in str\nfalse && $env not contains str\nfalse && $env not in list\nfalse && $env or ok\nfalse && $env.ok\nfalse && $env?.Bar\nfalse && $env?.Bar()\nfalse && $env?.Bar(ok(), f64(), foobar)[foobar?.add.str:]\nfalse && $env?.Bar.add()\nfalse && $env?.String\nfalse && $env?.String()\nfalse && $env?.String(foobar.Bar)\nfalse && $env?.String?.[str]\nfalse && $env?.[0 in foobar]\nfalse && $env?.[Bar]\nfalse && $env?.[Bar]?.[f64]\nfalse && $env?.[String]\nfalse && $env?.[add]\nfalse && $env?.[add].array\nfalse && $env?.[array()]\nfalse && $env?.[array]\nfalse && $env?.[array]?.[ok]\nfalse && $env?.[f64 > str]\nfalse && $env?.[f64()]\nfalse && $env?.[f64]\nfalse && $env?.[f64]?.array\nfalse && $env?.[findLastIndex(greet, #.ok)]\nfalse && $env?.[foo]\nfalse && $env?.[foobar - foobar]\nfalse && $env?.[foobar >= foobar]\nfalse && $env?.[foobar.add]\nfalse && $env?.[foobar]\nfalse && $env?.[greet]\nfalse && $env?.[greet].i\nfalse && $env?.[i]\nfalse && $env?.[i].foo\nfalse && $env?.[list]\nfalse && $env?.[ok]\nfalse && $env?.[ok].add\nfalse && $env?.[str]\nfalse && $env?.[str].String\nfalse && $env?.[str]?.list()\nfalse && $env?.[type($env, foobar, 1)]\nfalse && $env?.foobar\nfalse && $env?.min(foobar)\nfalse && $env?.ok\nfalse && $env[:$env | toPairs(foobar)]\nfalse && $env[:Bar < 0]\nfalse && $env[:Bar()]\nfalse && $env[:add(1.0)]\nfalse && $env[:ok()]\nfalse && $env[:trimPrefix(foobar)]\nfalse && $env[String():str(foobar)]\nfalse && $env[count(foo):]\nfalse && $env[foobar < true:]\nfalse && $env[foobar | toPairs(foobar, false):]\nfalse && $env[foobar.list(foobar):ok endsWith foobar]\nfalse && $env[foobar:Bar]\nfalse && $env[foobar:foobar?.[String]]\nfalse && $env[foobar?.ok(foobar):]\nfalse && $env[hasPrefix(i):foobar[$env:true]].ok\nfalse && $env[i:-foobar]\nfalse && $env[i:]\nfalse && $env[i?.str:]\nfalse && $env[ok.String:all(foobar, #.foo)]\nfalse && 0 >= i\nfalse && 0 not in map($env, i)\nfalse && 1 - findLast($env, #)\nfalse && 1 == 1 ** $env\nfalse && 1 > 1.0 ** $env\nfalse && 1.0 <= f64 > $env\nfalse && 1.0 == i\nfalse && 1.0 == int(1)\nfalse && 1.0 > $env[:ok]\nfalse && 1.0 > i\nfalse && 1.0 >= f64\nfalse && 1.0 >= false ?? 1.0\nfalse && array == [$env]\nfalse && f64 - $env?.[foobar]\nfalse && f64 < i\nfalse && false ?? ok\nfalse && foo != foo\nfalse && foo ?? array\nfalse && foo ?? greet\nfalse && greet ?? array\nfalse && i < f64\nfalse && i in $env.array\nfalse && i in array\nfalse && nil != greet\nfalse && nil == add\nfalse && nil == greet\nfalse && nil == ok\nfalse && nil in reduce($env, #)\nfalse && ok || ok\nfalse && str ?? ok\nfalse && true ?? foo\nfalse == $env && ok\nfalse == $env ?? reverse($env)\nfalse == $env.ok\nfalse == $env?.Bar\nfalse == $env?.String\nfalse == $env?.String?.list\nfalse == $env?.[Bar]\nfalse == $env?.[String]\nfalse == $env?.[String]?.[f64]\nfalse == $env?.[String]?.greet\nfalse == $env?.[foobar]\nfalse == $env?.[foobar]?.[str]\nfalse == $env?.[str]\nfalse == $env?.[str]?.[f64]\nfalse == $env?.ok\nfalse == 1.0 ?? $env?.foo\nfalse == 1.0 ?? add\nfalse == false && $env == str\nfalse == foo ?? i\nfalse == i ?? ok\nfalse == nil && ok\nfalse == nil and foo in $env\nfalse == nil || $env in list\nfalse == true ? $env | map(.array) : array\nfalse == true ?? greet\nfalse == true ?? list\nfalse ? $env : $env | map($env)\nfalse ? $env : $env.array\nfalse ? $env : $env.greet\nfalse ? $env : $env.list\nfalse ? $env : $env?.[str]\nfalse ? $env : $env?.add\nfalse ? $env : $env?.f64\nfalse ? $env : foo.Bar\nfalse ? $env : foo?.Bar\nfalse ? 0 : array?.[i]\nfalse ? 0 : foo?.Bar\nfalse ? 1 : $env.foo\nfalse ? 1 : $env.list\nfalse ? 1 : $env?.f64\nfalse ? 1 : $env?.i\nfalse ? 1 : $env?.ok\nfalse ? 1.0 : $env.greet\nfalse ? 1.0 : $env?.[Bar]\nfalse ? 1.0 : $env?.greet\nfalse ? 1.0 : $env?.list\nfalse ? 1.0 : $env?.ok\nfalse ? 1.0 : foo.Bar\nfalse ? 1.0 : foo?.Bar\nfalse ? 1.0 : foo?.String()\nfalse ? 1.0 : str contains str\nfalse ? add : $env not matches $env?.String\nfalse ? add : $env.array\nfalse ? add : $env?.String\nfalse ? add : foo.Bar\nfalse ? add : list | map($env.add)\nfalse ? add : list | reduce(true)\nfalse ? add : list?.[i]\nfalse ? add : nil not in array\nfalse ? array : $env.f64\nfalse ? array : $env?.f64\nfalse ? array : $env?.foo\nfalse ? array : $env?.list\nfalse ? array : 1 * f64\nfalse ? array : nil != str\nfalse ? f64 : $env.array\nfalse ? f64 : $env.f64\nfalse ? f64 : $env.list\nfalse ? f64 : $env.ok\nfalse ? f64 : $env.str\nfalse ? f64 : $env?.[String]\nfalse ? f64 : $env?.greet\nfalse ? f64 : $env?.str\nfalse ? f64 : foo.Bar\nfalse ? f64 : list | groupBy(#)\nfalse ? false : $env?.list\nfalse ? false : foo ?? greet\nfalse ? false : foo?.Bar\nfalse ? foo : $env?.String\nfalse ? foo : $env?.[Bar]\nfalse ? foo : $env?.[String]\nfalse ? foo : $env?.add\nfalse ? foo : $env?.f64\nfalse ? foo : $env?.i\nfalse ? foo : $env?.list\nfalse ? foo : $env?.ok\nfalse ? foo : array | map(0)\nfalse ? foo : array?.[i]\nfalse ? foo : foo.Bar\nfalse ? foo : foo.String\nfalse ? foo : foo?.Bar\nfalse ? foo : foo?.String\nfalse ? foo : i ^ i\nfalse ? greet : $env | map(1.0)\nfalse ? greet : $env?.greet\nfalse ? greet : foo.String\nfalse ? i : $env.str\nfalse ? i : $env?.[String]\nfalse ? i : $env?.foo\nfalse ? i : foo.Bar\nfalse ? list : $env ?? list\nfalse ? list : $env.array\nfalse ? list : $env.i\nfalse ? list : $env?.foo\nfalse ? list : foo.Bar\nfalse ? nil : $env.f64\nfalse ? nil : $env.foo\nfalse ? nil : $env.ok\nfalse ? nil : $env?.Bar\nfalse ? nil : $env?.[foobar]\nfalse ? nil : $env?.greet\nfalse ? nil : $env?.ok\nfalse ? nil : $env?.str\nfalse ? nil : 1.0 / f64\nfalse ? nil : foo.String\nfalse ? nil : foo.String()\nfalse ? ok : $env.str\nfalse ? ok : $env?.[Bar]\nfalse ? ok : $env?.array\nfalse ? ok : list | groupBy(i)\nfalse ? str : $env != str\nfalse ? str : $env | map(add)\nfalse ? str : $env.add\nfalse ? str : $env.f64\nfalse ? str : $env.list\nfalse ? str : $env?.Bar\nfalse ? str : foo?.Bar\nfalse ? true : $env.add\nfalse ? true : $env.i\nfalse ? true : $env?.String\nfalse ? true : foo.Bar\nfalse ? true : foo?.Bar\nfalse ? true : list != $env?.[str]\nfalse ?: $env.add\nfalse ?: $env.foo\nfalse ?: $env.greet\nfalse ?: $env.i\nfalse ?: $env.ok\nfalse ?: $env.str\nfalse ?: $env?.Bar\nfalse ?: $env?.String\nfalse ?: $env?.[foobar]\nfalse ?: $env?.add\nfalse ?: $env?.array\nfalse ?: $env?.f64\nfalse ?: $env?.foo\nfalse ?: $env?.i\nfalse ?: $env?.list\nfalse ?: $env?.str\nfalse ?: array | sum(1.0)\nfalse ?: array?.[i]\nfalse ?: f64 - i\nfalse ?: foo.Bar\nfalse ?: foo.String\nfalse ?: foo?.Bar\nfalse ?: foo?.String\nfalse ?: foo?.String()\nfalse ?: i | mean(1)\nfalse ?: list | map(foo)\nfalse ?? $env ?? $env?.[foo]\nfalse ?? $env.add\nfalse ?? $env.array\nfalse ?? $env.f64\nfalse ?? $env.foo\nfalse ?? $env.greet\nfalse ?? $env.i\nfalse ?? $env.list\nfalse ?? $env.ok\nfalse ?? $env.str\nfalse ?? $env?.Bar\nfalse ?? $env?.Bar().String\nfalse ?? $env?.String\nfalse ?? $env?.String()\nfalse ?? $env?.String?.ok\nfalse ?? $env?.[!String]\nfalse ?? $env?.[0 .. greet]\nfalse ?? $env?.[1.0 | any(String)]\nfalse ?? $env?.[Bar]\nfalse ?? $env?.[String]\nfalse ?? $env?.[add | groupBy(1)]\nfalse ?? $env?.[add]\nfalse ?? $env?.[add]?.[f64]?.[foo]\nfalse ?? $env?.[array]\nfalse ?? $env?.[f64]\nfalse ?? $env?.[foo]\nfalse ?? $env?.[foobar.list]\nfalse ?? $env?.[greet]\nfalse ?? $env?.[greet]?.add()\nfalse ?? $env?.[greet]?.f64\nfalse ?? $env?.[i != foobar]\nfalse ?? $env?.[i]\nfalse ?? $env?.[list()]\nfalse ?? $env?.[list]\nfalse ?? $env?.[list]?.[i]\nfalse ?? $env?.[ok]\nfalse ?? $env?.[str ^ String]\nfalse ?? $env?.[str]\nfalse ?? $env?.add\nfalse ?? $env?.all(array)\nfalse ?? $env?.array\nfalse ?? $env?.f64\nfalse ?? $env?.foo\nfalse ?? $env?.foobar\nfalse ?? $env?.foobar?.f64\nfalse ?? $env?.greet\nfalse ?? $env?.i\nfalse ?? $env?.list\nfalse ?? $env?.none(i)\nfalse ?? $env?.ok\nfalse ?? $env?.str\nfalse ?? $env[1.0 | trimPrefix(1):foobar < true]\nfalse ?? $env[:String.f64]\nfalse ?? $env[:array || foo]\nfalse ?? $env[:array()]\nfalse ?? $env[:foo?.str]\nfalse ?? $env[Bar matches foobar:]\nfalse ?? $env[date(str, true):]\nfalse ?? 1.0 ?: f64\nfalse ?? array?.[i]\nfalse ?? foo ?? ok ?: greet\nfalse ?? foo.Bar\nfalse ?? foo.String\nfalse ?? foo.String()\nfalse ?? foo?.Bar\nfalse ?? foo?.String\nfalse ?? foo?.String()\nfalse ?? nil ?? [$env, 1.0]\nfalse ?? nil ?? list\nfalse ?? nil ?? ok\nfalse ?? ok ?? foo\nfalse ?? true ?? $env?.String\nfalse and $env != f64\nfalse and $env + $env?.[f64]\nfalse and $env + str\nfalse and $env <= $env[foobar:foobar]\nfalse and $env == add\nfalse and $env == str\nfalse and $env >= str\nfalse and $env ?? $env?.[Bar]\nfalse and $env not contains str\nfalse and $env not in array\nfalse and $env not in foo || true\nfalse and $env || ok\nfalse and $env.ok\nfalse and $env?.$env.Bar\nfalse and $env?.$env?.ok\nfalse and $env?.Bar\nfalse and $env?.Bar != foo\nfalse and $env?.Bar()\nfalse and $env?.Bar(1 | filter(list)) || ok\nfalse and $env?.Bar(array, foobar)\nfalse and $env?.Bar.f64()\nfalse and $env?.String\nfalse and $env?.String()\nfalse and $env?.String?.greet(str)\nfalse and $env?.[Bar]\nfalse and $env?.[Bar]?.[add]\nfalse and $env?.[String]\nfalse and $env?.[add]\nfalse and $env?.[array]\nfalse and $env?.[array]?.[array]\nfalse and $env?.[f64()] not matches str\nfalse and $env?.[f64]\nfalse and $env?.[findLast(String, $env)]\nfalse and $env?.[foo.list]\nfalse and $env?.[foo]\nfalse and $env?.[foo].greet\nfalse and $env?.[foobar?.[add]]\nfalse and $env?.[foobar]\nfalse and $env?.[greet]\nfalse and $env?.[i]\nfalse and $env?.[i].array\nfalse and $env?.[i]?.list\nfalse and $env?.[len(foo, Bar, foo)]\nfalse and $env?.[list]\nfalse and $env?.[list].array\nfalse and $env?.[ok(foobar)]\nfalse and $env?.[ok]\nfalse and $env?.[str]\nfalse and $env?.[str]?.[f64].array\nfalse and $env?.[str]?.list(filter(String / foobar, f64 >= 1.0))\nfalse and $env?.[trim(foobar)]\nfalse and $env?.[true | findLast(foobar)]\nfalse and $env?.all(foobar, foo)\nfalse and $env?.concat(Bar, 1, foobar)\nfalse and $env?.foobar\nfalse and $env?.none(foobar)\nfalse and $env?.ok\nfalse and $env?.repeat(nil)\nfalse and $env?.type(foobar, str)\nfalse and $env[$env .. add:foo ? true : foobar]?.greet\nfalse and $env[$env[array:foo]:]\nfalse and $env[:Bar]\nfalse and $env[:String($env, ok)]\nfalse and $env[:add()]\nfalse and $env[:false > nil]?.[greet]\nfalse and $env[:foo.foobar]\nfalse and $env[:foo]?.list(first(foobar ?? String), array && foobar >= String, foobar && list?.[1])\nfalse and $env[:foobar?.Bar]\nfalse and $env[Bar(foo):]\nfalse and $env[array():]\nfalse and $env[bitshr(foobar, array):foobar | reduce(.String)]\nfalse and $env[foobar:]\nfalse and $env[greet(str):true in list]\nfalse and $env[i():]\nfalse and $env[i:nil ^ 1.0]\nfalse and 0 == i\nfalse and 0 > count(array, false)\nfalse and 0 >= -1\nfalse and 0 ?? $env[:nil]\nfalse and 1 != f64\nfalse and 1 <= f64\nfalse and 1 not in $env?.array\nfalse and 1.0 ** 1.0 == nil\nfalse and 1.0 + $env?.Bar\nfalse and 1.0 <= f64\nfalse and 1.0 <= f64 / f64\nfalse and 1.0 == i\nfalse and 1.0 > 0 ?? 0\nfalse and 1.0 > sum($env)\nfalse and 1.0 ?? greet\nfalse and f64 >= i\nfalse and f64 in array\nfalse and false != $env?.[i]\nfalse and foo != foo\nfalse and foo ?? greet\nfalse and foo ?? i\nfalse and greet ?? ok\nfalse and greet not in $env?.[Bar]\nfalse and i != $env?.[add]\nfalse and i == median(list)\nfalse and nil == str\nfalse and ok and ok\nfalse and str > str\nfalse and str >= foo?.Bar\nfalse and str not in foo\nfalse and true ?: add\nfalse and true ?? sum($env)\nfalse and true || ok\nfalse in $env?.Bar\nfalse in $env?.String\nfalse in $env?.[Bar]\nfalse in $env?.[String]\nfalse in $env?.[foobar?.[foo]]\nfalse in $env?.[foobar]\nfalse in $env?.[foobar]?.[array]\nfalse in $env?.foobar\nfalse in $env?.foobar?.String\nfalse in list ?? foo\nfalse not in $env?.Bar\nfalse not in $env?.String\nfalse not in $env?.[Bar]\nfalse not in $env?.[String]\nfalse not in $env?.[String]?.Bar\nfalse not in $env?.[String]?.String\nfalse not in $env?.[String]?.[list]\nfalse not in $env?.[first(foobar)]\nfalse not in $env?.[foobar?.list]\nfalse not in $env?.[foobar]\nfalse not in $env?.foobar\nfalse not in array ?? {foo: $env}\nfalse or $env in $env?.[foobar]\nfalse or $env startsWith $env?.[Bar]\nfalse or $env.ok\nfalse or $env?.Bar\nfalse or $env?.Bar?.[i]\nfalse or $env?.String\nfalse or $env?.[Bar]\nfalse or $env?.[Bar]?.list\nfalse or $env?.[String]\nfalse or $env?.[String]?.[list]\nfalse or $env?.[foobar | toJSON(nil)]\nfalse or $env?.[foobar?.[0]]\nfalse or $env?.[foobar]\nfalse or $env?.[str]\nfalse or $env?.foobar\nfalse or $env?.ok\nfalse or 0 < 1.0 ^ 1\nfalse or 0 == i\nfalse or 0 >= i || true\nfalse or 0 not in array\nfalse or 1 > i\nfalse or 1 ?? list\nfalse or 1 in array\nfalse or 1.0 >= i\nfalse or 1.0 ?? foo\nfalse or array == list\nfalse or f64 ?? $env?.ok\nfalse or false ?: ok\nfalse or false ?? foo\nfalse or foo ?? i\nfalse or foo ?? ok\nfalse or foo in list\nfalse or greet == greet\nfalse or i == i\nfalse or i ?? foo\nfalse or i ?? list\nfalse or list ?? ok\nfalse or nil != array\nfalse or nil != f64\nfalse or nil == array\nfalse or nil == foo\nfalse or ok == ok\nfalse or str != str\nfalse or str >= string(0)\nfalse or str in foo == $env\nfalse or str not matches str\nfalse || $env != f64 and $env\nfalse || $env == [foo]\nfalse || $env == array ? foo : foo\nfalse || $env == i\nfalse || $env ?? f64\nfalse || $env in list\nfalse || $env.ok\nfalse || $env?.Bar\nfalse || $env?.Bar?.[ok]\nfalse || $env?.Bar?.foo\nfalse || $env?.String\nfalse || $env?.String?.foo()\nfalse || $env?.[Bar]\nfalse || $env?.[String]\nfalse || $env?.[str]\nfalse || $env?.false?.array\nfalse || $env?.foobar\nfalse || $env?.ok\nfalse || 0 != $env?.String\nfalse || 1 == $env?.[foobar]\nfalse || 1 == array?.[i]\nfalse || 1 > f64\nfalse || 1 in array\nfalse || 1.0 <= 1.0 ?: 1\nfalse || 1.0 <= i\nfalse || 1.0 >= f64\nfalse || 1.0 ?? array\nfalse || add != add\nfalse || array != list\nfalse || f64 != i\nfalse || false ?? foo\nfalse || foo ?? array\nfalse || foo ?? str\nfalse || foo in list\nfalse || foo.Bar matches str\nfalse || i == i\nfalse || i > median(f64)\nfalse || i >= i\nfalse || i ?? greet($env)\nfalse || i ?? str\nfalse || nil != f64\nfalse || nil != i\nfalse || nil == greet\nfalse || str not endsWith str\nfalse || true == ok\nfalse; $env?.Bar\nfalse; $env?.String\nfalse; $env?.[Bar]\nfalse; $env?.foo\nfilter($env | map(0), !true)\nfilter($env, #.list) | filter(false)\nfilter($env, .f64) | filter(false)\nfilter($env, .ok) | filter(false)\nfilter($env, .str) | filter(false)\nfilter($env, false) | all(#)\nfilter($env, false) | all(#.str not matches .str)\nfilter($env, false) | all(false)\nfilter($env, false) | find(#)\nfilter($env, false) | find(true)\nfilter($env, false) | findIndex(#)\nfilter($env, false) | findLastIndex(.f64 not contains #)\nfilter($env, false) | groupBy(#)\nfilter($env, false) | reduce(#.list, str)\nfilter($env, false) | reduce(true, nil)\nfilter($env, false) | sortBy(foo)\nfilter($env, false) | sum(.Bar)\nfilter($env, false) | sum(.i)\nfilter($env, false) | sum(foo)\nfilter($env, false) | sum(greet)\nfilter($env, ok) | map(foo)\nfilter($env.array, foo != foo)\nfilter($env.array, i == 1)\nfilter($env.array, ok)\nfilter($env.list, ok)\nfilter($env.list, true || true)\nfilter($env?.[str], false && $env)\nfilter($env?.[str], ok)\nfilter($env?.array, # <= #)\nfilter($env?.array, ok)\nfilter($env?.list, ok)\nfilter([0], ok)\nfilter([1], # != 1.0)\nfilter([greet], ok)\nfilter([i], ok)\nfilter([true, $env], 1 < 1)\nfilter(array, !ok)\nfilter(array, # != #)\nfilter(array, # != 1)\nfilter(array, # < #)\nfilter(array, # <= #)\nfilter(array, # not in array)\nfilter(array, $env != $env)\nfilter(array, $env == $env)\nfilter(array, $env and false)\nfilter(array, $env.ok)\nfilter(array, 0 <= #)\nfilter(array, 1 != f64)\nfilter(array, 1 <= #)\nfilter(array, 1 >= #)\nfilter(array, 1.0 != #)\nfilter(array, 1.0 <= f64)\nfilter(array, 1.0 == $env)\nfilter(array, 1.0 > #)\nfilter(array, 1.0 > 1.0)\nfilter(array, f64 <= #)\nfilter(array, false != $env)\nfilter(array, false) | all($env[1.0:])\nfilter(array, false) | groupBy(#)\nfilter(array, false) | sortBy($env)\nfilter(array, false) | sortBy(add)\nfilter(array, false) | sum(f64)\nfilter(array, foo == foo)\nfilter(array, i > #)\nfilter(array, list == nil)\nfilter(array, nil != #)\nfilter(array, nil != list)\nfilter(array, nil ?? false)\nfilter(array, not true)\nfilter(array, ok && i != #)\nfilter(array, ok ?? i)\nfilter(array, ok and true)\nfilter(array, ok)\nfilter(array, ok) | findIndex(false)\nfilter(array, ok) | groupBy(foo)\nfilter(array, ok) | sortBy(0)\nfilter(array, ok)?.[i]\nfilter(array, str in foo)\nfilter(array, true) | findLast(ok)\nfilter(array, true) | map(foo)\nfilter(array, true) | none(true)\nfilter(array, true)?.[i]\nfilter(concat(array), #.greet || true)\nfilter(keys($env), ok)\nfilter(list | map($env), ok == nil)\nfilter(list, !false)\nfilter(list, # != #)\nfilter(list, # == $env)\nfilter(list, # not in list)\nfilter(list, #.Bar in #)\nfilter(list, #.Bar not in foo)\nfilter(list, $env != #)\nfilter(list, $env != str)\nfilter(list, $env == #)\nfilter(list, $env == str)\nfilter(list, $env?.ok)\nfilter(list, 1 > 1.0)\nfilter(list, 1.0 < 1)\nfilter(list, 1.0 == nil)\nfilter(list, 1.0 > f64)\nfilter(list, 1.0 not in array)\nfilter(list, array != array)\nfilter(list, f64 <= 1.0)\nfilter(list, false != nil)\nfilter(list, false && $env)\nfilter(list, false ?? 1.0)\nfilter(list, false) | groupBy(#)\nfilter(list, false) | groupBy(ok)\nfilter(list, false) | map(array)\nfilter(list, false) | sum($env)\nfilter(list, false) | sum(foo)\nfilter(list, foo != nil)\nfilter(list, greet == nil)\nfilter(list, nil == nil)\nfilter(list, nil in $env)\nfilter(list, not true)\nfilter(list, ok)\nfilter(list, ok) | findIndex(true)\nfilter(list, ok) | reduce(add)\nfilter(list, ok)?.[i]\nfilter(list, one(array, true))\nfilter(list, str != $env)\nfilter(list, true) | all(true)\nfilter(list, true) | groupBy(#)\nfilter(list, true) | groupBy(1.0)\nfilter(list, true) | reduce(#acc)\nfilter(list, true) | reduce(i)\nfilter(list, true)?.[i]\nfilter(map($env, foo), # != #)\nfilter(sort($env), #.String?.list)\nfilter(sort($env), #.foo?.String)\nfilter(sort($env), #.i || #)\nfilter(sort($env), nil not in .list)\nfind($env ?? ok, $env == 1.0)\nfind($env | filter(false), # endsWith .Bar)\nfind($env | map(greet), not true)\nfind($env, false) != f64\nfind($env, false) ?? ok\nfind($env, false)?.Bar\nfind($env, false)?.Bar()\nfind($env, false)?.String\nfind($env, false)?.String?.foo\nfind($env, false)?.[add]\nfind($env, false)?.[array]\nfind($env, false)?.[f64]\nfind($env, false)?.[foo]\nfind($env, false)?.[greet]\nfind($env, false)?.[greet].i()\nfind($env, false)?.[greet].str\nfind($env, false)?.[i]\nfind($env, false)?.[i]?.foo\nfind($env, false)?.[list]\nfind($env, false)?.[ok]\nfind($env, false)?.[str]\nfind($env, false)?.[str]?.greet\nfind($env, false)?.[{foo: false}]\nfind($env, false)?.add\nfind($env, false)?.array\nfind($env, false)?.bitxor(ok, nil, 1)\nfind($env, false)?.f64\nfind($env, false)?.f64?.[array]\nfind($env, false)?.foo\nfind($env, false)?.foo()\nfind($env, false)?.greet\nfind($env, false)?.greet()\nfind($env, false)?.greet(foobar)\nfind($env, false)?.i\nfind($env, false)?.i()\nfind($env, false)?.list\nfind($env, false)?.ok\nfind($env, false)?.ok()\nfind($env, false)?.str\nfind($env.array, # > #)\nfind($env.array, $env.ok)\nfind($env.array, i != 1.0)\nfind($env.array, ok)\nfind($env.list, $env != .String)\nfind($env.list, ok)\nfind($env?.[str], 1 > 0)\nfind($env?.[str], ok or .ok)\nfind($env?.[str], ok)\nfind($env?.list, f64 != 0)\nfind($env?.list, ok)\nfind([$env], .ok)\nfind([1, greet], f64 < 1.0)\nfind([array], nil in $env)\nfind([array], ok)\nfind([false], #)\nfind([ok], #)\nfind([str, true], ok)\nfind([str], ok)\nfind(array, !false)\nfind(array, # != 0)\nfind(array, # != nil)\nfind(array, # < #)\nfind(array, # < 0)\nfind(array, # <= #)\nfind(array, # <= 0)\nfind(array, # <= i)\nfind(array, # == 1)\nfind(array, # > #)\nfind(array, $env != $env)\nfind(array, $env == foo)\nfind(array, $env | any(false))\nfind(array, $env.ok)\nfind(array, $env?.ok)\nfind(array, 0 != f64)\nfind(array, 0 <= 1)\nfind(array, 0 >= #)\nfind(array, 1 != f64)\nfind(array, 1 > i)\nfind(array, 1.0 != #)\nfind(array, 1.0 != nil)\nfind(array, 1.0 <= #)\nfind(array, 1.0 == nil)\nfind(array, 1.0 >= 1.0)\nfind(array, array != list)\nfind(array, array | one(true))\nfind(array, f64 != #)\nfind(array, false == nil)\nfind(array, i != nil)\nfind(array, nil != ok)\nfind(array, nil != true)\nfind(array, not false)\nfind(array, ok or false)\nfind(array, ok)\nfind(array, str not contains str)\nfind(array, true ?? #)\nfind(array, true ?? 1)\nfind(array, true) - i\nfind(array, true) | max(array)\nfind(filter($env, false), .list in #.list)\nfind(list ?? list, ok)\nfind(list, # != #)\nfind(list, #.String == .String)\nfind(list, $env != list)\nfind(list, $env == nil)\nfind(list, $env == ok)\nfind(list, $env not in array)\nfind(list, $env.ok)\nfind(list, $env?.ok)\nfind(list, 0 > i)\nfind(list, 1 == 1.0)\nfind(list, 1.0 != 1)\nfind(list, 1.0 <= i)\nfind(list, 1.0 > f64)\nfind(list, array != $env)\nfind(list, array == list)\nfind(list, false != nil)\nfind(list, false) ?? list\nfind(list, false)?.Bar\nfind(list, foo != #)\nfind(list, foo != $env)\nfind(list, foo != nil)\nfind(list, nil != #.Bar)\nfind(list, nil == str)\nfind(list, nil == true)\nfind(list, ok)\nfind(list, ok).Bar\nfind(list, ok).String\nfind(list, ok)?.Bar\nfind(list, ok)?.String\nfind(list, str == $env)\nfind(list, true ?? $env)\nfind(list, true).Bar\nfind(list, true).String\nfind(list, true)?.Bar\nfind(list, true)?.String\nfind(map($env, $env), foo == #)\nfind(map(array, 1.0), i != 1.0)\nfind(map(list, #), ok)\nfind(map(list, 0), ok)\nfind(max($env), $env == i)\nfind(nil ?? array, # > #)\nfind(nil ?? list, # == #)\nfind(sort($env), #.array.f64)\nfind(sort($env), #.f64 not startsWith .String)\nfind(sort($env), #.foo)\nfind(sort($env), .foo?.[greet])\nfind(sort($env), .greet.Bar)\nfind(sort($env), .list?.foobar)\nfind(sort($env), .str?.ok)?.[ok]\nfind(toPairs($env), $env.ok)\nfind(toPairs($env), ok)\nfind(values($env), ok ?? 1)\nfindIndex($env | map(i), # > f64)\nfindIndex($env, ok) > -f64\nfindIndex($env, ok) >= f64\nfindIndex($env, ok) ?? f64\nfindIndex($env, ok) ?? foo\nfindIndex($env, true) <= f64\nfindIndex($env, true) ?? 1.0 ?? $env\nfindIndex($env.array, ok)\nfindIndex($env.list, ok)\nfindIndex($env?.[str], 1.0 == nil)\nfindIndex($env?.array, # < #)\nfindIndex($env?.array, nil == greet)\nfindIndex($env?.list, ok)\nfindIndex([0], # <= 1)\nfindIndex([1.0, foo], not ok)\nfindIndex([1.0], # > 1.0)\nfindIndex([add], ok)\nfindIndex([array], ok)\nfindIndex([f64], ok)\nfindIndex([false], #)\nfindIndex([false], ok)\nfindIndex([foo], ok)\nfindIndex([list], $env == add)\nfindIndex([ok], #)\nfindIndex([str], $env?.ok)\nfindIndex([true], #)\nfindIndex(array | sortBy(1.0), ok)\nfindIndex(array, !false)\nfindIndex(array, !true)\nfindIndex(array, # != #)\nfindIndex(array, # != nil)\nfindIndex(array, # <= #)\nfindIndex(array, # == 1.0)\nfindIndex(array, # > #)\nfindIndex(array, # >= #)\nfindIndex(array, $env != $env)\nfindIndex(array, $env != 0)\nfindIndex(array, $env != true)\nfindIndex(array, $env == #)\nfindIndex(array, $env.ok)\nfindIndex(array, $env?.ok)\nfindIndex(array, 0 == #)\nfindIndex(array, 0 == i)\nfindIndex(array, 1 <= #)\nfindIndex(array, 1.0 != $env)\nfindIndex(array, 1.0 < #)\nfindIndex(array, 1.0 == $env)\nfindIndex(array, 1.0 >= #)\nfindIndex(array, add == nil)\nfindIndex(array, f64 > f64)\nfindIndex(array, false || ok)\nfindIndex(array, foo == nil)\nfindIndex(array, nil != #)\nfindIndex(array, nil != foo)\nfindIndex(array, not true)\nfindIndex(array, ok)\nfindIndex(array, ok) ^ f64\nfindIndex(array, reduce(list, true))\nfindIndex(array, true || $env)\nfindIndex(array, true || false)\nfindIndex(array, true) / i\nfindIndex(array, true) == $env != nil\nfindIndex(array, true) | min(array)\nfindIndex(filter($env, false), #.list(foobar))\nfindIndex(flatten(list), # != list)\nfindIndex(flatten(list), .String != ok)\nfindIndex(list | map(add), not ok)\nfindIndex(list, !ok)\nfindIndex(list, !true)\nfindIndex(list, # != nil)\nfindIndex(list, # == #)\nfindIndex(list, # == nil)\nfindIndex(list, $env != .String)\nfindIndex(list, $env != true)\nfindIndex(list, $env == false)\nfindIndex(list, $env == i)\nfindIndex(list, .Bar == $env)\nfindIndex(list, all($env, true))\nfindIndex(list, f64 <= f64)\nfindIndex(list, f64 == 1.0)\nfindIndex(list, foo != $env)\nfindIndex(list, foo == foo)\nfindIndex(list, greet == nil)\nfindIndex(list, nil != $env)\nfindIndex(list, none(array, ok))\nfindIndex(list, not false)\nfindIndex(list, ok ?? ok)\nfindIndex(list, ok)\nfindIndex(list, ok) * f64\nfindIndex(list, str in #)\nfindIndex(list, str not contains str)\nfindIndex(list, true) | min(1.0)\nfindIndex(map($env, $env), #.String contains #)\nfindIndex(map($env, $env), ok) ?? add\nfindIndex(max($env), i > f64)\nfindIndex(nil ?? $env, ok)\nfindIndex(sort($env), #.String?.list(foobar))\nfindIndex(sort($env), #.f64 - #.i)\nfindIndex(sort($env), #.str && #.f64)\nfindIndex(sort($env), .array)\nfindIndex(sort($env), list not in .Bar)\nfindIndex(sort(array), # == false)\nfindIndex(values($env), 1 != 1.0)\nfindLast($env, false) == greet\nfindLast($env, false)?.Bar\nfindLast($env, false)?.String\nfindLast($env, false)?.String?.str\nfindLast($env, false)?.[add]\nfindLast($env, false)?.[array]\nfindLast($env, false)?.[f64]\nfindLast($env, false)?.[foo]\nfindLast($env, false)?.[greet]\nfindLast($env, false)?.[greet]?.Bar\nfindLast($env, false)?.[i]\nfindLast($env, false)?.[i].array\nfindLast($env, false)?.[list]\nfindLast($env, false)?.[ok]\nfindLast($env, false)?.[str]\nfindLast($env, false)?.add()\nfindLast($env, false)?.array\nfindLast($env, false)?.array()\nfindLast($env, false)?.f64\nfindLast($env, false)?.f64()\nfindLast($env, false)?.f64?.[str]\nfindLast($env, false)?.foo\nfindLast($env, false)?.fromPairs(i)\nfindLast($env, false)?.greet\nfindLast($env, false)?.greet()\nfindLast($env, false)?.i\nfindLast($env, false)?.i()\nfindLast($env, false)?.list\nfindLast($env, false)?.list()\nfindLast($env, false)?.list(foobar?.f64)\nfindLast($env, false)?.ok\nfindLast($env, false)?.ok()\nfindLast($env, false)?.reduce(String)\nfindLast($env, false)?.str\nfindLast($env.array, # >= #)\nfindLast($env.array, ok)\nfindLast($env.array, str in $env)\nfindLast($env.list, !false)\nfindLast($env.list, ok)\nfindLast($env?.[str], # not in array)\nfindLast($env?.[str], 1 == 1.0)\nfindLast($env?.[str], false == #)\nfindLast($env?.array, $env.ok)\nfindLast($env?.array, i in array)\nfindLast($env?.array, ok)\nfindLast($env?.list, ok)\nfindLast([$env], $env != nil).array\nfindLast([$env], .Bar != str)\nfindLast([1.0], ok)\nfindLast([f64, true], if # { # } else { # })\nfindLast([f64], 1 != $env)\nfindLast([false], $env | none(true))\nfindLast([foo], ok)\nfindLast([list], ok)\nfindLast([ok], #)\nfindLast([ok], ok)\nfindLast([true], ok)\nfindLast(array ?? 0, # != 1.0)\nfindLast(array | map(#index), ok)\nfindLast(array | sortBy(0), 1 < 1)\nfindLast(array, # != #)\nfindLast(array, # < #)\nfindLast(array, # < f64)\nfindLast(array, # <= #)\nfindLast(array, # > 1)\nfindLast(array, # > 1.0)\nfindLast(array, # >= #)\nfindLast(array, # >= 1.0)\nfindLast(array, # >= i)\nfindLast(array, $env != 1)\nfindLast(array, $env == $env)\nfindLast(array, $env == true)\nfindLast(array, $env?.ok)\nfindLast(array, 0 >= 1.0)\nfindLast(array, 0 in array)\nfindLast(array, 1 != #)\nfindLast(array, 1 < 1)\nfindLast(array, 1 > 1.0)\nfindLast(array, 1.0 == nil)\nfindLast(array, 1.0 >= 1.0)\nfindLast(array, f64 < 0)\nfindLast(array, f64 < 1.0)\nfindLast(array, f64 < f64)\nfindLast(array, f64 > #)\nfindLast(array, f64 >= 1.0)\nfindLast(array, f64 >= i)\nfindLast(array, false || true)\nfindLast(array, i < #)\nfindLast(array, nil != #)\nfindLast(array, nil != nil)\nfindLast(array, none($env, false))\nfindLast(array, not ok)\nfindLast(array, ok ?: 1.0)\nfindLast(array, ok ?? #)\nfindLast(array, ok)\nfindLast(array, ok) + i\nfindLast(array, ok) >= f64\nfindLast(array, ok) in array\nfindLast(array, str not in foo)\nfindLast(concat(list), !true)\nfindLast(filter(list, false), $env?.[array])\nfindLast(flatten(array), true ?? .ok)\nfindLast(flatten(list), ok)\nfindLast(keys($env), foo == foo)\nfindLast(list ?? list, ok)\nfindLast(list | sortBy(0), # == #)\nfindLast(list, # != #)\nfindLast(list, # != $env)\nfindLast(list, # != nil)\nfindLast(list, # == $env)\nfindLast(list, # == foo)\nfindLast(list, #.Bar in #)\nfindLast(list, #.String != nil)\nfindLast(list, $env != nil)\nfindLast(list, $env != true)\nfindLast(list, $env == false)\nfindLast(list, $env == foo.String())\nfindLast(list, $env or true)\nfindLast(list, $env.ok)\nfindLast(list, .Bar matches str)\nfindLast(list, 0 != 1.0)\nfindLast(list, 1 != f64)\nfindLast(list, 1 >= 1.0)\nfindLast(list, 1.0 <= f64)\nfindLast(list, 1.0 == 1)\nfindLast(list, 1.0 >= 1.0)\nfindLast(list, f64 == f64)\nfindLast(list, f64 > i)\nfindLast(list, false)?.Bar\nfindLast(list, foo != #)\nfindLast(list, foo == #)\nfindLast(list, i == $env)\nfindLast(list, i > 0)\nfindLast(list, nil == #)\nfindLast(list, nil == greet)\nfindLast(list, ok)\nfindLast(list, ok).Bar\nfindLast(list, ok).String\nfindLast(list, ok).String()\nfindLast(list, ok)?.Bar\nfindLast(list, str != nil)\nfindLast(list, str not contains str)\nfindLast(list, str startsWith str)\nfindLast(list, true && false)\nfindLast(list, true ?? add)\nfindLast(list, true) ?? i\nfindLast(list, true).Bar\nfindLast(list, true).String\nfindLast(list, true).String()\nfindLast(list, true)?.Bar\nfindLast(map(list, ok), #)\nfindLast(min($env), .array and false)\nfindLast(sort($env), #)\nfindLast(sort($env), .array)\nfindLast(sort($env), .f64 != #.i)\nfindLast(sort($env), .greet.array)?.list\nfindLast(sort($env), .list?.list)\nfindLast(sort($env), 1.0 != #.list)\nfindLast(uniq(array), ok)\nfindLast(values($env), # != foo)\nfindLast(values($env), ok)\nfindLastIndex($env ?? 1, true || #)\nfindLastIndex($env ?? foo, ok)\nfindLastIndex($env | filter(false), #.add)\nfindLastIndex($env, ok) > i\nfindLastIndex($env, ok) ^ f64\nfindLastIndex($env, true) + i\nfindLastIndex($env, true) <= f64\nfindLastIndex($env, true) ^ i\nfindLastIndex($env, true) | bitor(1)\nfindLastIndex($env, true) | bitshl(1)\nfindLastIndex($env.array, # >= 1)\nfindLastIndex($env.array, ok)\nfindLastIndex($env.array, true == ok)\nfindLastIndex($env?.[str], 1.0 > #)\nfindLastIndex($env?.[str], ok)\nfindLastIndex($env?.array, # != #)\nfindLastIndex($env?.array, $env != $env)\nfindLastIndex($env?.array, ok)\nfindLastIndex([$env], #.f64 == true)\nfindLastIndex([$env], #.f64 not endsWith .String)\nfindLastIndex([false, 0], ok)\nfindLastIndex([false, true, $env], #.greet != true)\nfindLastIndex([list], foo not in #)\nfindLastIndex([true], #)\nfindLastIndex([true], str < str)\nfindLastIndex(array ?? 1.0, ok)\nfindLastIndex(array ?? foo, ok)\nfindLastIndex(array, !false)\nfindLastIndex(array, # != 0)\nfindLastIndex(array, # < #)\nfindLastIndex(array, # < i)\nfindLastIndex(array, # <= #)\nfindLastIndex(array, # == $env)\nfindLastIndex(array, # == f64)\nfindLastIndex(array, # > #)\nfindLastIndex(array, $env != false)\nfindLastIndex(array, $env == 1.0)\nfindLastIndex(array, $env.ok)\nfindLastIndex(array, $env?.ok)\nfindLastIndex(array, 0 == $env)\nfindLastIndex(array, 1 >= 1.0)\nfindLastIndex(array, 1.0 == #)\nfindLastIndex(array, add == nil)\nfindLastIndex(array, any($env, false))\nfindLastIndex(array, false && $env)\nfindLastIndex(array, false) != 1.0 + 1.0\nfindLastIndex(array, i >= # != false)\nfindLastIndex(array, nil != 1.0)\nfindLastIndex(array, nil != array)\nfindLastIndex(array, nil == ok)\nfindLastIndex(array, not false)\nfindLastIndex(array, ok ?? false)\nfindLastIndex(array, ok)\nfindLastIndex(array, str in foo)\nfindLastIndex(array, str not in $env)\nfindLastIndex(array, true ?? ok)\nfindLastIndex(array, true || $env)\nfindLastIndex(array, true) * 1.0 + 1\nfindLastIndex(array, true) * f64\nfindLastIndex(array, true) ?? sortBy(array, 1.0)\nfindLastIndex(array, true) | bitushr(i)\nfindLastIndex(false ? nil : $env, ok)\nfindLastIndex(flatten(array), ok)\nfindLastIndex(flatten(list), ok)\nfindLastIndex(list, !true)\nfindLastIndex(list, # == #)\nfindLastIndex(list, #.Bar == nil)\nfindLastIndex(list, #.Bar matches str)\nfindLastIndex(list, $env.ok)\nfindLastIndex(list, .Bar in foo)\nfindLastIndex(list, 0 != 1)\nfindLastIndex(list, 0 > 1.0)\nfindLastIndex(list, 0 >= 1.0)\nfindLastIndex(list, 1.0 >= f64)\nfindLastIndex(list, false ? foo : ok)\nfindLastIndex(list, foo != #)\nfindLastIndex(list, foo != $env)\nfindLastIndex(list, foo == #)\nfindLastIndex(list, foo not in list)\nfindLastIndex(list, i > f64)\nfindLastIndex(list, nil != #)\nfindLastIndex(list, nil != foo)\nfindLastIndex(list, nil != nil)\nfindLastIndex(list, nil == 1)\nfindLastIndex(list, nil in $env)\nfindLastIndex(list, not false)\nfindLastIndex(list, ok != false)\nfindLastIndex(list, ok)\nfindLastIndex(list, ok) < i\nfindLastIndex(list, one(list, false))\nfindLastIndex(list, str == $env)\nfindLastIndex(list, str not in #)\nfindLastIndex(list, str not startsWith .Bar)\nfindLastIndex(list, true) > f64\nfindLastIndex(list, true) ?? greet\nfindLastIndex(map($env, str), ok)\nfindLastIndex(map(array, ok), #)\nfindLastIndex(map(list, add), ok)\nfindLastIndex(sort($env), # contains #)\nfindLastIndex(sort($env), #.foo?.greet)\nfindLastIndex(sort($env), $env ?: #.i)\nfindLastIndex(sort($env), ok)\nfirst($env ?? $env)\nfirst($env ?? 0)\nfirst($env ?? 1)\nfirst($env ?? 1.0)\nfirst($env ?? foo)\nfirst($env ?? foo) not in list\nfirst($env ?? greet)\nfirst($env ?? i)\nfirst($env ?? str)\nfirst($env ?? true)\nfirst($env ?? true)?.i\nfirst($env | findLast(false))\nfirst($env | map(#index))\nfirst($env | map($env))\nfirst($env | map($env))?.foo\nfirst($env | map(1))\nfirst($env) != $env?.f64\nfirst($env) != foo\nfirst($env) != i\nfirst($env) == i\nfirst($env) == str\nfirst($env) ?? array\nfirst($env) ?? list\nfirst($env) not contains str\nfirst($env) not in array\nfirst($env) not matches str\nfirst($env) not startsWith str\nfirst($env) startsWith str\nfirst($env) | get(1.0)\nfirst($env)?.$env?.array()\nfirst($env)?.Bar\nfirst($env)?.Bar()\nfirst($env)?.Bar(add)\nfirst($env)?.Bar?.add\nfirst($env)?.String\nfirst($env)?.String()\nfirst($env)?.String?.array\nfirst($env)?.String?.foo\nfirst($env)?.[add]\nfirst($env)?.[add].list()\nfirst($env)?.[add]?.[foo]\nfirst($env)?.[add]?.i\nfirst($env)?.[array]\nfirst($env)?.[f64]\nfirst($env)?.[f64].String\nfirst($env)?.[f64].list\nfirst($env)?.[f64]?.String\nfirst($env)?.[foo]\nfirst($env)?.[foo]?.[greet].String\nfirst($env)?.[greet]\nfirst($env)?.[greet]?.[greet]\nfirst($env)?.[greet]?.f64\nfirst($env)?.[greet]?.str\nfirst($env)?.[i]\nfirst($env)?.[i]?.String\nfirst($env)?.[i]?.[foo]\nfirst($env)?.[i]?.add\nfirst($env)?.[i]?.i\nfirst($env)?.[i]?.str\nfirst($env)?.[list]\nfirst($env)?.[list].Bar?.str().ok?.[str]\nfirst($env)?.[list].list\nfirst($env)?.[ok]\nfirst($env)?.[ok].add()\nfirst($env)?.[ok].list\nfirst($env)?.[str]\nfirst($env)?.[str].String\nfirst($env)?.[str].f64\nfirst($env)?.[str]?.[str]\nfirst($env)?.[str]?.f64\nfirst($env)?.[str]?.ok\nfirst($env)?.[str]?.str\nfirst($env)?.add\nfirst($env)?.add()\nfirst($env)?.add()?.add()\nfirst($env)?.add.String\nfirst($env)?.add.f64\nfirst($env)?.add.greet()\nfirst($env)?.add?.String\nfirst($env)?.add?.[greet]\nfirst($env)?.add?.[i]\nfirst($env)?.add?.[list]\nfirst($env)?.any(foobar)\nfirst($env)?.any(foobar, ok)\nfirst($env)?.array\nfirst($env)?.array()\nfirst($env)?.array(foobar)\nfirst($env)?.array.ok\nfirst($env)?.f64\nfirst($env)?.f64()\nfirst($env)?.f64(f64)\nfirst($env)?.f64(foobar)\nfirst($env)?.f64.String\nfirst($env)?.findIndex(add)\nfirst($env)?.foo\nfirst($env)?.foo()\nfirst($env)?.foo()?.Bar\nfirst($env)?.foo(foo)?.[list]\nfirst($env)?.foo(foobar not contains foobar)\nfirst($env)?.foo(foobar)\nfirst($env)?.foo?.[greet]\nfirst($env)?.foobar\nfirst($env)?.foobar not in $env\nfirst($env)?.foobar.greet\nfirst($env)?.foobar.list\nfirst($env)?.foobar?.[greet]\nfirst($env)?.greet\nfirst($env)?.greet()\nfirst($env)?.greet(foobar not startsWith foobar)\nfirst($env)?.greet(foobar, foobar)\nfirst($env)?.greet(true)\nfirst($env)?.greet?.Bar\nfirst($env)?.greet?.[f64]\nfirst($env)?.greet?.[i]\nfirst($env)?.greet?.[str]\nfirst($env)?.greet?.str\nfirst($env)?.i\nfirst($env)?.i()\nfirst($env)?.i.i\nfirst($env)?.i?.add\nfirst($env)?.indexOf(foobar)\nfirst($env)?.list\nfirst($env)?.list()\nfirst($env)?.list().Bar\nfirst($env)?.list(Bar)\nfirst($env)?.list(foo)\nfirst($env)?.list(foobar)\nfirst($env)?.list(foobar).String\nfirst($env)?.list(foobar?.[Bar])\nfirst($env)?.list.str\nfirst($env)?.list?.[foo]\nfirst($env)?.list?.[str]\nfirst($env)?.list?.add\nfirst($env)?.map(add)\nfirst($env)?.ok\nfirst($env)?.ok()\nfirst($env)?.ok()?.[ok]\nfirst($env)?.ok(foobar)\nfirst($env)?.str\nfirst($env)?.str()\nfirst($env)?.str(f64)\nfirst($env)?.toJSON(String)\nfirst($env.array)\nfirst($env.list)\nfirst($env?.$env)\nfirst($env?.$env?.f64)\nfirst($env?.Bar)\nfirst($env?.Bar)?.array\nfirst($env?.Bar?.[array])\nfirst($env?.Bar?.[foo])\nfirst($env?.Bar?.f64)\nfirst($env?.String)\nfirst($env?.String)?.String\nfirst($env?.String)?.String()\nfirst($env?.String)?.i\nfirst($env?.[Bar])\nfirst($env?.[Bar])?.[i]\nfirst($env?.[Bar])?.[str]\nfirst($env?.[Bar])?.str\nfirst($env?.[Bar]?.String)\nfirst($env?.[Bar]?.f64)\nfirst($env?.[String])\nfirst($env?.[String])?.String()\nfirst($env?.[String])?.str\nfirst($env?.[String]?.f64)\nfirst($env?.[String]?.foo)\nfirst($env?.[foobar])\nfirst($env?.[foobar])?.Bar\nfirst($env?.[nil])\nfirst($env?.[nil]?.ok)\nfirst($env?.[str])\nfirst($env?.array)\nfirst($env?.false)\nfirst($env?.foobar)\nfirst($env?.foobar)?.Bar()\nfirst($env?.foobar)?.i()\nfirst($env?.foobar?.str)\nfirst($env?.greet ?? ok)\nfirst($env?.list)\nfirst($env?.nil)\nfirst($env?.nil)?.f64\nfirst($env?.true)\nfirst(0 .. 0)\nfirst(0 .. i)\nfirst(0 ?? $env)\nfirst(0 ?? array)\nfirst(0 ?? false)\nfirst(0 ?? foo)\nfirst(0 ?? greet)\nfirst(0 ?? str)\nfirst(0 ?? true)\nfirst(0..i)\nfirst(1 .. 0)\nfirst(1 .. i)\nfirst(1 ?? $env)\nfirst(1 ?? 1.0)\nfirst(1 ?? foo)\nfirst(1 ?? ok)\nfirst(1 ?? true)\nfirst(1 | median(array))\nfirst(1.0 ?? $env)\nfirst(1.0 ?? $env.list)\nfirst(1.0 ?? 0)\nfirst(1.0 ?? 1)\nfirst(1.0 ?? add)\nfirst(1.0 ?? false)\nfirst(1.0 ?? foo)\nfirst(1.0 ?? greet)\nfirst(1.0 ?? i)\nfirst(1.0 ?? list)\nfirst(1.0 | min(array))\nfirst([$env, array])\nfirst([$env?.array])\nfirst([$env])\nfirst([0, array])\nfirst([0])\nfirst([1 > 1.0])\nfirst([1, add])\nfirst([1.0, 1.0])\nfirst([1.0])\nfirst([1])\nfirst([add, $env, greet])\nfirst([add])\nfirst([array])\nfirst([f64])\nfirst([false, $env])\nfirst([false, str])\nfirst([false])\nfirst([floor(f64)])\nfirst([foo ?? foo])\nfirst([foo])\nfirst([greet])\nfirst([i])\nfirst([list])\nfirst([nil, array])\nfirst([nil])\nfirst([ok])\nfirst([str])\nfirst([true])\nfirst([type(greet)])\nfirst(add ?? $env)?.f64\nfirst(add ?? 0)\nfirst(add ?? 1)\nfirst(add ?? foo)\nfirst(add ?? list)\nfirst(add ?? str)\nfirst(add ?? true)\nfirst(array ?? $env)\nfirst(array ?? add)\nfirst(array ?? array)\nfirst(array ?? i)\nfirst(array ?? nil)\nfirst(array ?? ok)\nfirst(array | map(#))\nfirst(array | map($env))\nfirst(array | map(0))\nfirst(array | map(1.0))\nfirst(array | map(foo))\nfirst(array | reduce($env, foo))\nfirst(array | reduce(list, nil))\nfirst(array | sortBy(#))\nfirst(array | sortBy(1.0))\nfirst(array | take(1))\nfirst(array)\nfirst(array) != i\nfirst(array) * $env?.i\nfirst(array) / i != nil\nfirst(array) == i\nfirst(array) > 1.0 > $env\nfirst(array) > f64\nfirst(array) >= $env.f64\nfirst(array) ?? $env?.String()\nfirst(array) ?? foo\nfirst(array) ?? list\nfirst(array) | bitand(1)\nfirst(array) | bitshr(1)\nfirst(array[:0])\nfirst(array[:1])\nfirst(concat(array) | reduce(#))\nfirst(concat(array))\nfirst(concat(list))\nfirst(f64 ?? $env)?.[foo]\nfirst(f64 ?? 1)\nfirst(f64 ?? array)\nfirst(f64 ?? greet)\nfirst(f64 ?? i)\nfirst(f64 ?? list)\nfirst(f64 ?? str)\nfirst(f64 | mean(array, 1))\nfirst(false ? i : list)\nfirst(false ?? $env)\nfirst(false ?? 1)\nfirst(false ?? 1.0)\nfirst(false ?? add)\nfirst(false ?? foo)\nfirst(false ?? str)\nfirst(filter($env, false))\nfirst(filter(list, ok))\nfirst(find($env, false))\nfirst(find($env, false))?.foo\nfirst(first($env))\nfirst(first($env))?.[add]\nfirst(flatten(array))\nfirst(flatten(list))\nfirst(foo ?? $env)\nfirst(foo ?? $env.add)\nfirst(foo ?? 0)\nfirst(foo ?? 1)\nfirst(foo ?? 1.0)\nfirst(foo ?? add)\nfirst(foo ?? array)\nfirst(foo ?? f64)\nfirst(foo ?? false)\nfirst(foo ?? greet)\nfirst(foo ?? i)\nfirst(foo ?? list)\nfirst(foo ?? ok)\nfirst(foo ?? str)\nfirst(foo ?? true)\nfirst(greet ?? 1)\nfirst(greet ?? 1.0)\nfirst(greet ?? f64)\nfirst(greet ?? foo.Bar)\nfirst(greet ?? i)\nfirst(greet ?? list)\nfirst(greet ?? true)\nfirst(i .. 1)\nfirst(i ?? $env)\nfirst(i ?? f64)\nfirst(i ?? false)\nfirst(i ?? greet)\nfirst(i ?? ok)\nfirst(i..i)\nfirst(if false { 0 } else { foo })\nfirst(if false { foo } else { greet })\nfirst(if false { foo } else { str })\nfirst(if ok { foo } else { false })\nfirst(if true { 0 } else { foo })?.add\nfirst(if true { ok } else { 1 })\nfirst(if true { ok } else { 1.0 })\nfirst(keys($env))\nfirst(last($env))\nfirst(let foobar = list; foobar)\nfirst(list ?? add)\nfirst(list ?? f64)\nfirst(list ?? false)\nfirst(list ?? str)\nfirst(list | map(#))\nfirst(list | map(#.Bar))\nfirst(list | map(0))\nfirst(list | map(add))\nfirst(list | map(false))\nfirst(list | map(true))\nfirst(list | reduce(list))\nfirst(list | sortBy(#.Bar))\nfirst(list)\nfirst(list) == $env?.String\nfirst(list) ?? $env?.[add]\nfirst(list) ?? f64\nfirst(list) ?? foo\nfirst(list) ?? greet\nfirst(list).Bar\nfirst(list).String\nfirst(list).String()\nfirst(list)?.Bar\nfirst(list)?.String\nfirst(list)?.String()\nfirst(list[:0])\nfirst(list[:1])\nfirst(list[:i])\nfirst(map($env, $env))\nfirst(map($env, 0))\nfirst(map($env, 1))\nfirst(map($env, array))\nfirst(map($env, f64))\nfirst(map($env, false))\nfirst(map($env, i))\nfirst(map($env, ok))\nfirst(map(array, #))\nfirst(map(array, #index))\nfirst(map(array, $env))\nfirst(map(array, 0))\nfirst(map(array, 1))\nfirst(map(array, 1.0))\nfirst(map(array, false))\nfirst(map(array, greet))\nfirst(map(array, list))\nfirst(map(array, str))\nfirst(map(array, true))\nfirst(map(list, #))\nfirst(map(list, $env) | findLast(true))\nfirst(map(list, 0))\nfirst(map(list, array))\nfirst(map(list, f64))\nfirst(map(list, foo))\nfirst(max($env))\nfirst(max(array))\nfirst(mean(array))\nfirst(median(array))\nfirst(min($env))\nfirst(min($env))?.add\nfirst(min($env)?.f64)\nfirst(min(array))\nfirst(min(array, 1, 1))\nfirst(nil ?? $env)\nfirst(nil ?? array)\nfirst(ok ? 0 : 1.0)\nfirst(ok ? add : false)\nfirst(ok ? ok : $env)\nfirst(ok ?: $env)\nfirst(ok ?: add)\nfirst(ok ?: list)\nfirst(ok ?? $env)\nfirst(ok ?? 0)\nfirst(ok ?? 1.0)\nfirst(ok ?? foo)\nfirst(ok ?? foo)?.[list]\nfirst(ok ?? greet)\nfirst(reduce(array, $env))\nfirst(reduce(list, list, $env))\nfirst(reverse(array))\nfirst(reverse(list))\nfirst(sort($env))\nfirst(sort(array))\nfirst(sortBy(array, #))\nfirst(sortBy(array, 1))\nfirst(sortBy(array, f64))\nfirst(sortBy(list, .Bar))\nfirst(str ?? 0)\nfirst(str ?? 1)\nfirst(str ?? 1.0)\nfirst(str ?? add)\nfirst(str ?? i)\nfirst(str ?? ok)\nfirst(take(array, i))\nfirst(toPairs($env))\nfirst(true ? 1.0 : foo)\nfirst(true ?: 1.0)?.str\nfirst(true ?: str)\nfirst(true ?? add)\nfirst(true ?? foo)\nfirst(true ?? list)\nfirst(uniq(array))\nfirst(uniq(list))\nfirst(values($env))\nfirst({foo: 1.0}.f64)\nfirst({foo: greet, foo: nil}.ok)\nfirst({foo: i, foo: f64}.String)\nflatten($env | map($env))\nflatten($env | map(1.0))\nflatten($env | map(add))\nflatten($env | map(array))\nflatten($env | map(foo))\nflatten($env | map(i))\nflatten($env | map(list))\nflatten($env.array)\nflatten($env.list)\nflatten($env?.array)\nflatten($env?.list)\nflatten($env?.list)?.[i]\nflatten(0 .. i)\nflatten(1 .. 0)\nflatten(1 .. 1)\nflatten(1 .. i)\nflatten([$env])\nflatten([0 <= 1])\nflatten([0, 1.0])\nflatten([0])\nflatten([1.0, foo])\nflatten([1.0])\nflatten([1])\nflatten([add, greet])\nflatten([add, i])\nflatten([add])\nflatten([array, f64])\nflatten([array, ok])\nflatten([array])\nflatten([f64, $env, 1])\nflatten([f64, nil])\nflatten([f64])\nflatten([false, list])\nflatten([false])\nflatten([foo, 0])\nflatten([foo, 1.0])\nflatten([foo, str])\nflatten([foo])\nflatten([greet, foo])\nflatten([greet])\nflatten([i, list])\nflatten([i])\nflatten([list])\nflatten([nil == ok])\nflatten([nil])\nflatten([ok, array])\nflatten([ok, true])\nflatten([ok])\nflatten([str, list])\nflatten([str])\nflatten([true])\nflatten(array ?? 0)\nflatten(array ?? 1)\nflatten(array ?? add)\nflatten(array ?? f64)\nflatten(array ?? foo)\nflatten(array ?? list)\nflatten(array ?? nil)\nflatten(array ?? true)\nflatten(array | map(#))\nflatten(array | map(1.0))\nflatten(array | map(array))\nflatten(array | map(false))\nflatten(array | reduce(array, false))\nflatten(array | sortBy(#))\nflatten(array | sortBy(1.0))\nflatten(array | sortBy(i))\nflatten(array)\nflatten(array) != array\nflatten(array) == array\nflatten(array) == list\nflatten(array) ?? greet\nflatten(array) ?? i\nflatten(array) | filter(ok)\nflatten(array) | groupBy(#)\nflatten(array) | groupBy(1.0)\nflatten(array) | groupBy(f64)\nflatten(array) | map(#)\nflatten(array) | map(ok)\nflatten(array) | min(1.0)\nflatten(array) | one(true)\nflatten(array) | reduce(#)\nflatten(array) | reduce(1.0)\nflatten(array) | reduce(foo)\nflatten(array) | reduce(true)\nflatten(array) | sum(#)\nflatten(array)?.[i]\nflatten(array)[i:]\nflatten(array[0:])\nflatten(array[:1])\nflatten(concat(array))\nflatten(concat(list))\nflatten(filter(list, false))\nflatten(flatten(array))\nflatten(flatten(list))\nflatten(groupBy(array, #).String)\nflatten(groupBy(list, #).i)\nflatten(i .. 0)\nflatten(i..i)\nflatten(if ok { array } else { foo })\nflatten(if ok { list } else { array })\nflatten(if true { array } else { add })\nflatten(keys($env))\nflatten(let z = array; z)\nflatten(list ?? $env)\nflatten(list ?? 1)\nflatten(list ?? 1.0)\nflatten(list ?? nil)\nflatten(list | map(#))\nflatten(list | map(i))\nflatten(list | sortBy(0))\nflatten(list | sortBy(f64))\nflatten(list | sortBy(str))\nflatten(list)\nflatten(list) == list\nflatten(list) | filter(true)\nflatten(list) | findLast(ok)\nflatten(list) | findLastIndex(false)\nflatten(list) | groupBy(!ok)\nflatten(list) | groupBy(#)\nflatten(list) | groupBy(foo)\nflatten(list) | groupBy(i)\nflatten(list) | map(1.0)\nflatten(list) | map(add)\nflatten(list) | map(f64)\nflatten(list) | map(false)\nflatten(list) | map(foo)\nflatten(list) | map(ok)\nflatten(list) | none(true)\nflatten(list) | reduce(#)\nflatten(list) | reduce($env, $env)\nflatten(list) | reduce(1.0)\nflatten(list) | sortBy(0)\nflatten(list) | sortBy(1.0)\nflatten(list) | sortBy(str)\nflatten(list) | sum(1)\nflatten(list)?.[i]\nflatten(list)[:]\nflatten(list[0:])\nflatten(list[1:])\nflatten(list[:])\nflatten(map($env, $env))\nflatten(map($env, 0))\nflatten(map($env, 1.0))\nflatten(map($env, f64))\nflatten(map($env, false))\nflatten(map(array, f64))\nflatten(map(array, i))\nflatten(map(array, true))\nflatten(map(list, #))\nflatten(map(list, $env))\nflatten(map(list, .Bar))\nflatten(map(list, f64))\nflatten(map(list, ok))\nflatten(nil ?? array)\nflatten(nil ?? list)\nflatten(reduce(array, array))\nflatten(reverse(array))\nflatten(reverse(list))\nflatten(sort($env))\nflatten(sort(array))\nflatten(sortBy(array, #))\nflatten(sortBy(array, 1))\nflatten(sortBy(array, 1.0))\nflatten(sortBy(array, f64))\nflatten(sortBy(list, 1.0))\nflatten(sortBy(list, i))\nflatten(toPairs($env))\nflatten(true ? list : list)\nflatten(uniq(array))\nflatten(uniq(list))\nflatten(values($env))\nfloat($env | findIndex(true))\nfloat($env | findLastIndex(ok))\nfloat($env | findLastIndex(true))\nfloat($env | sum(0))\nfloat($env | sum(1.0))\nfloat($env | sum(f64))\nfloat($env | sum(i))\nfloat($env.f64)\nfloat($env.i)\nfloat($env?.f64)\nfloat($env?.i)\nfloat(-0)\nfloat(-1)\nfloat(-1.0)\nfloat(-f64)\nfloat(-i)\nfloat(0 % 1)\nfloat(0 % i)\nfloat(0 * 1)\nfloat(0 * 1.0)\nfloat(0 * f64)\nfloat(0 ** 1)\nfloat(0 ** 1.0)\nfloat(0 ** f64)\nfloat(0 ** i)\nfloat(0 + 1)\nfloat(0 + i)\nfloat(0 - 1)\nfloat(0 - 1.0)\nfloat(0 - i)\nfloat(0 / 0)\nfloat(0 / 1.0)\nfloat(0 / f64)\nfloat(0 / i)\nfloat(0 ?? $env)\nfloat(0 ?? $env?.[i])\nfloat(0 ?? false)\nfloat(0 ?? greet)\nfloat(0 ?? nil)\nfloat(0 ?? true)\nfloat(0 ^ 0)\nfloat(0 ^ 1)\nfloat(0 ^ 1.0)\nfloat(0 ^ f64)\nfloat(0 ^ i)\nfloat(0 | median(1.0))\nfloat(0) != $env && ok\nfloat(0) != 1.0 && false\nfloat(0) ** f64\nfloat(0) + $env?.f64\nfloat(0) - float(0)\nfloat(0) > f64\nfloat(0) > i\nfloat(0) >= -1\nfloat(0) ^ f64\nfloat(1 % 1)\nfloat(1 % i)\nfloat(1 * 1)\nfloat(1 * 1.0)\nfloat(1 * f64)\nfloat(1 * i)\nfloat(1 ** 1)\nfloat(1 ** 1.0)\nfloat(1 ** f64)\nfloat(1 ** i)\nfloat(1 + 1)\nfloat(1 + 1.0)\nfloat(1 + i)\nfloat(1 - 1.0)\nfloat(1 - f64)\nfloat(1 / 0)\nfloat(1 / 1)\nfloat(1 / 1.0)\nfloat(1 ?? $env)\nfloat(1 ?? $env?.array)\nfloat(1 ?? 0)\nfloat(1 ?? 1.0)\nfloat(1 ?? add)\nfloat(1 ?? nil)\nfloat(1 ?? ok)\nfloat(1 ^ 0)\nfloat(1 ^ 1)\nfloat(1 ^ 1.0)\nfloat(1 ^ i)\nfloat(1) + i\nfloat(1) - f64\nfloat(1) < f64\nfloat(1) == f64\nfloat(1) == i\nfloat(1) ?? f64\nfloat(1) ?? foo ?? $env\nfloat(1) ?? str\nfloat(1) ^ i\nfloat(1) in [add, true]\nfloat(1.0 * 0)\nfloat(1.0 * 1)\nfloat(1.0 * 1.0)\nfloat(1.0 * f64)\nfloat(1.0 * i)\nfloat(1.0 ** 0)\nfloat(1.0 ** 1)\nfloat(1.0 ** 1.0)\nfloat(1.0 ** f64)\nfloat(1.0 ** i)\nfloat(1.0 + 0)\nfloat(1.0 + 1.0)\nfloat(1.0 + f64)\nfloat(1.0 + i)\nfloat(1.0 - 0)\nfloat(1.0 - 1)\nfloat(1.0 - 1.0)\nfloat(1.0 - f64)\nfloat(1.0 - i)\nfloat(1.0 / 0)\nfloat(1.0 / 1)\nfloat(1.0 / 1.0)\nfloat(1.0 / f64)\nfloat(1.0 / i)\nfloat(1.0 ?? $env)\nfloat(1.0 ?? 0)\nfloat(1.0 ?? 1)\nfloat(1.0 ?? 1.0)\nfloat(1.0 ?? add)\nfloat(1.0 ?? array)\nfloat(1.0 ?? f64)\nfloat(1.0 ?? false)\nfloat(1.0 ?? foo)\nfloat(1.0 ?? i)\nfloat(1.0 ?? list)\nfloat(1.0 ?? nil)\nfloat(1.0 ?? str)\nfloat(1.0 ^ 0)\nfloat(1.0 ^ 1)\nfloat(1.0 ^ 1.0)\nfloat(1.0 ^ f64)\nfloat(1.0 ^ i)\nfloat(1.0 | min(f64))\nfloat(1.0) != $env?.[str]\nfloat(1.0) * max(f64)\nfloat(1.0) ** i\nfloat(1.0) - f64\nfloat(1.0) - i\nfloat(1.0) / i\nfloat(1.0) < i\nfloat(1.0) <= i\nfloat(1.0) == 0 % 1\nfloat(1.0) == i\nfloat(1.0) == i != false\nfloat(1.0) > f64\nfloat(1.0) >= last(array)\nfloat(1.0) | median(1.0)\nfloat(abs(0))\nfloat(abs(1))\nfloat(abs(1.0))\nfloat(abs(f64))\nfloat(abs(i))\nfloat(add(0, i))\nfloat(add(1, 1))\nfloat(array | findLastIndex(true))\nfloat(array | max(1))\nfloat(array | reduce(#acc))\nfloat(array | reduce(#index, 1.0))\nfloat(array | reduce(1))\nfloat(array | sum(#))\nfloat(array | sum(0))\nfloat(array | sum(1.0))\nfloat(array?.[i])\nfloat(bitand(0, i))\nfloat(bitnot(0))\nfloat(bitnot(1))\nfloat(bitnot(i))\nfloat(bitor(0, i))\nfloat(bitshl(i, 0))\nfloat(bitshr(0, 0))\nfloat(bitshr(i, 1))\nfloat(ceil(0))\nfloat(ceil(1))\nfloat(ceil(1.0))\nfloat(ceil(f64))\nfloat(ceil(i))\nfloat(count($env, false))\nfloat(count($env, ok))\nfloat(count(array, true))\nfloat(count(list, false))\nfloat(count(list, ok))\nfloat(f64 * 1)\nfloat(f64 * 1.0)\nfloat(f64 * f64)\nfloat(f64 ** 0)\nfloat(f64 ** 1)\nfloat(f64 ** 1.0)\nfloat(f64 + 0)\nfloat(f64 + 1.0)\nfloat(f64 + f64)\nfloat(f64 + i)\nfloat(f64 - 1.0)\nfloat(f64 / 0)\nfloat(f64 / 1)\nfloat(f64 / 1.0)\nfloat(f64 / f64)\nfloat(f64 / i)\nfloat(f64 ?? 1)\nfloat(f64 ?? 1.0)\nfloat(f64 ?? add)\nfloat(f64 ?? f64)\nfloat(f64 ?? greet)\nfloat(f64 ?? true)\nfloat(f64 ^ 0)\nfloat(f64 ^ 1)\nfloat(f64 ^ 1.0)\nfloat(f64)\nfloat(f64) != f64\nfloat(f64) * 1.0 ** i\nfloat(f64) ** f64\nfloat(f64) / max(1)\nfloat(f64) == i\nfloat(f64) ?? greet\nfloat(f64) ?? upper(str)\nfloat(false ? i : 1.0)\nfloat(false ? str : 1.0)\nfloat(false ?: 1.0)\nfloat(false ?: i)\nfloat(findIndex($env, ok))\nfloat(findIndex(array, true))\nfloat(findLastIndex($env, ok))\nfloat(findLastIndex($env, true))\nfloat(findLastIndex(array, ok))\nfloat(first(array))\nfloat(float(0))\nfloat(float(1))\nfloat(float(1.0))\nfloat(float(f64))\nfloat(float(i))\nfloat(floor(0))\nfloat(floor(1))\nfloat(floor(1.0))\nfloat(floor(f64))\nfloat(floor(i))\nfloat(i % 1)\nfloat(i * 0)\nfloat(i * 1.0)\nfloat(i * f64)\nfloat(i ** 1.0)\nfloat(i ** i)\nfloat(i + 0)\nfloat(i + 1)\nfloat(i + 1.0)\nfloat(i - 0)\nfloat(i - 1)\nfloat(i - 1.0)\nfloat(i - f64)\nfloat(i - i)\nfloat(i / 0)\nfloat(i / 1)\nfloat(i / 1.0)\nfloat(i ?? $env)\nfloat(i ?? 1)\nfloat(i ?? 1.0)\nfloat(i ?? add)\nfloat(i ?? foo)\nfloat(i ?? nil)\nfloat(i ?? true)\nfloat(i ^ i)\nfloat(i | bitor(0))\nfloat(i)\nfloat(i) + first(array)\nfloat(i) == i\nfloat(i) > f64\nfloat(i) in $env?.[String]\nfloat(i) | max(f64)\nfloat(if false { 1.0 } else { 1 })\nfloat(if false { greet } else { 1 })\nfloat(if false { greet } else { 1.0 })\nfloat(if false { ok } else { 1.0 })\nfloat(if true { 0 } else { $env })\nfloat(if true { 1.0 } else { $env })\nfloat(if true { 1.0 } else { i })\nfloat(int(0))\nfloat(int(1))\nfloat(int(1.0))\nfloat(int(f64))\nfloat(int(i))\nfloat(last(array))\nfloat(lastIndexOf(str, str))\nfloat(len($env))\nfloat(len(array))\nfloat(len(list))\nfloat(len(str))\nfloat(let foobar = i; foobar)\nfloat(list | findIndex(ok))\nfloat(list | reduce(i))\nfloat(list | sum(1.0))\nfloat(list | sum(f64))\nfloat(max($env?.f64))\nfloat(max(0))\nfloat(max(1))\nfloat(max(1.0))\nfloat(max(f64, 1))\nfloat(max(f64, 1.0))\nfloat(max(i))\nfloat(mean(0))\nfloat(mean(1))\nfloat(mean(1.0 - 1.0))\nfloat(mean(1.0))\nfloat(mean(array))\nfloat(mean(f64))\nfloat(mean(f64, 1))\nfloat(mean(i))\nfloat(median(0))\nfloat(median(1))\nfloat(median(1.0))\nfloat(median(1.0, 0, 0))\nfloat(median(1.0, i))\nfloat(median(array))\nfloat(median(array, f64))\nfloat(median(f64))\nfloat(median(i))\nfloat(min($env).f64)\nfloat(min($env?.array))\nfloat(min(0))\nfloat(min(0, 1))\nfloat(min(1))\nfloat(min(1.0))\nfloat(min(array))\nfloat(min(f64))\nfloat(min(i))\nfloat(nil ?? 1.0)\nfloat(reduce($env, 1.0, 1.0))\nfloat(reduce(array, #))\nfloat(reduce(list, 0))\nfloat(reduce(list, 1))\nfloat(reduce(list, i))\nfloat(round(0))\nfloat(round(1))\nfloat(round(1.0))\nfloat(round(f64))\nfloat(round(i))\nfloat(string(0))\nfloat(string(1))\nfloat(string(1.0))\nfloat(string(f64))\nfloat(string(i))\nfloat(sum($env, 0))\nfloat(sum($env, 1))\nfloat(sum($env, 1.0))\nfloat(sum($env.array))\nfloat(sum($env?.array))\nfloat(sum(array))\nfloat(sum(array, #))\nfloat(sum(array, 1))\nfloat(sum(array, i))\nfloat(sum(list, 1))\nfloat(toJSON(0))\nfloat(toJSON(1))\nfloat(toJSON(1.0))\nfloat(toJSON(f64))\nfloat(toJSON(i))\nfloat(toJSON(min(1.0)))\nfloat(true ? 1.0 : ok)\nfloat(true ? f64 : foo)\nfloat(true ? f64 : str)\nfloor($env | count(true))\nfloor($env | findIndex(ok))\nfloor($env | findLastIndex(true))\nfloor($env | reduce(f64, f64))\nfloor($env.array?.[i])\nfloor($env.f64)\nfloor($env.i)\nfloor($env?.add(i, 1))\nfloor($env?.f64)\nfloor($env?.i ^ f64)\nfloor($env?.i)\nfloor(-0)\nfloor(-1)\nfloor(-1.0)\nfloor(-f64)\nfloor(-i)\nfloor(0 % i)\nfloor(0 * 1)\nfloor(0 * 1.0)\nfloor(0 * f64)\nfloor(0 * i)\nfloor(0 ** 0)\nfloor(0 ** 1.0)\nfloor(0 ** f64)\nfloor(0 ** i)\nfloor(0 + 1.0)\nfloor(0 + f64)\nfloor(0 - 0)\nfloor(0 - 1)\nfloor(0 - 1.0)\nfloor(0 - f64)\nfloor(0 - i)\nfloor(0 / 0)\nfloor(0 / 1)\nfloor(0 / f64)\nfloor(0 / i)\nfloor(0 ?? add)\nfloor(0 ?? array)\nfloor(0 ?? foo)\nfloor(0 ?? greet)\nfloor(0 ?? i)\nfloor(0 ?? str)\nfloor(0 ?? true)\nfloor(0 ^ 0)\nfloor(0 ^ 1.0)\nfloor(0 ^ f64)\nfloor(0 | bitxor(i))\nfloor(0 | min(1.0))\nfloor(0) * i\nfloor(0) * reduce(array, #)\nfloor(0) < array?.[i]\nfloor(0) < f64\nfloor(0) < i\nfloor(0) <= f64\nfloor(0) >= i\nfloor(0) ?? f64\nfloor(0) ?? greet(str)\nfloor(0) ?? list\nfloor(0.0)\nfloor(1 % 1)\nfloor(1 % i)\nfloor(1 * 1)\nfloor(1 * 1.0)\nfloor(1 * f64)\nfloor(1 * i)\nfloor(1 ** 0)\nfloor(1 ** 1)\nfloor(1 ** 1.0)\nfloor(1 ** i)\nfloor(1 + 1)\nfloor(1 + 1.0)\nfloor(1 + f64)\nfloor(1 + i)\nfloor(1 - 1)\nfloor(1 - i)\nfloor(1 / 0)\nfloor(1 / 1.0)\nfloor(1 / f64)\nfloor(1 ?? $env?.[array])\nfloor(1 ?? 0)\nfloor(1 ?? 1)\nfloor(1 ?? false)\nfloor(1 ?? foo)\nfloor(1 ?? greet)\nfloor(1 ?? i)\nfloor(1 ?? nil)\nfloor(1 ?? str)\nfloor(1 ?? true)\nfloor(1 ^ 0)\nfloor(1 ^ 1.0)\nfloor(1 ^ f64)\nfloor(1 ^ i)\nfloor(1) != f64\nfloor(1) * f64\nfloor(1) * i\nfloor(1) ** f64\nfloor(1) + $env?.f64\nfloor(1) - i\nfloor(1) <= i\nfloor(1) ?? str\nfloor(1) in array\nfloor(1) | mean(1.0)\nfloor(1) | min(1.0)\nfloor(1.0 * 0)\nfloor(1.0 * 1)\nfloor(1.0 * 1.0)\nfloor(1.0 * f64)\nfloor(1.0 * i)\nfloor(1.0 ** 0)\nfloor(1.0 ** 1)\nfloor(1.0 ** 1.0)\nfloor(1.0 ** f64)\nfloor(1.0 ** i)\nfloor(1.0 + 0)\nfloor(1.0 + 1)\nfloor(1.0 + 1.0)\nfloor(1.0 + f64)\nfloor(1.0 - 0)\nfloor(1.0 - 1.0)\nfloor(1.0 - f64)\nfloor(1.0 - i)\nfloor(1.0 / 0)\nfloor(1.0 / 1)\nfloor(1.0 / 1.0)\nfloor(1.0 / f64)\nfloor(1.0 ?? $env)\nfloor(1.0 ?? 0)\nfloor(1.0 ?? 1)\nfloor(1.0 ?? 1.0)\nfloor(1.0 ?? add)\nfloor(1.0 ?? false)\nfloor(1.0 ?? foo)\nfloor(1.0 ?? greet)\nfloor(1.0 ?? i)\nfloor(1.0 ?? nil)\nfloor(1.0 ?? str)\nfloor(1.0 ^ 0)\nfloor(1.0 ^ 1.0)\nfloor(1.0 ^ i)\nfloor(1.0 | max(f64))\nfloor(1.0 | mean(array))\nfloor(1.0 | min(f64))\nfloor(1.0) != $env?.f64\nfloor(1.0) + f64\nfloor(1.0) - $env.i\nfloor(1.0) <= i\nfloor(1.0) == f64\nfloor(1.0) > i\nfloor(1.0) ?? array\nfloor(1.0) | mean(1.0)\nfloor(1.0) | median(0)\nfloor(1.0) | min(f64)\nfloor(abs(0))\nfloor(abs(1))\nfloor(abs(1.0))\nfloor(abs(f64))\nfloor(abs(i))\nfloor(add(i, i))\nfloor(array | findLast(ok))\nfloor(array | findLastIndex(ok))\nfloor(array | findLastIndex(true))\nfloor(array | mean(1))\nfloor(array | mean(f64))\nfloor(array | reduce(#))\nfloor(array | reduce(#index))\nfloor(array | sum(#))\nfloor(array | sum(f64))\nfloor(array | sum(i))\nfloor(array?.[0])\nfloor(array?.[1])\nfloor(array?.[i])\nfloor(bitand(i, 1))\nfloor(bitnot(-0))\nfloor(bitnot(0))\nfloor(bitnot(1))\nfloor(bitnot(i))\nfloor(bitshr(1, i))\nfloor(bitxor(0, 1))\nfloor(ceil(0))\nfloor(ceil(1))\nfloor(ceil(1.0))\nfloor(ceil(f64 + 0))\nfloor(ceil(f64))\nfloor(ceil(i))\nfloor(count($env, true))\nfloor(count(list, ok))\nfloor(f64 * 1)\nfloor(f64 * 1.0)\nfloor(f64 * i)\nfloor(f64 ** 1.0)\nfloor(f64 ** i)\nfloor(f64 + 0)\nfloor(f64 + 1)\nfloor(f64 + 1.0)\nfloor(f64 + f64)\nfloor(f64 + i)\nfloor(f64 - 1)\nfloor(f64 - 1.0)\nfloor(f64 - f64)\nfloor(f64 - i)\nfloor(f64 / 1.0)\nfloor(f64 / f64)\nfloor(f64 ?? $env)\nfloor(f64 ?? 0)\nfloor(f64 ?? 1)\nfloor(f64 ?? 1.0)\nfloor(f64 ?? foo)\nfloor(f64 ?? greet)\nfloor(f64 ^ 0)\nfloor(f64 ^ 1.0)\nfloor(f64 ^ i)\nfloor(f64)\nfloor(f64) ** f64\nfloor(f64) / i\nfloor(f64) < f64\nfloor(f64) >= f64\nfloor(f64) >= i ^ f64\nfloor(f64) in array\nfloor(false ? $env : i)\nfloor(false ?: 1)\nfloor(findIndex($env, ok))\nfloor(findIndex(list, true))\nfloor(findLast(array, ok))\nfloor(findLastIndex(array, true))\nfloor(findLastIndex(list, ok))\nfloor(first(array))\nfloor(float(0))\nfloor(float(1))\nfloor(float(1.0))\nfloor(float(f64))\nfloor(float(i))\nfloor(floor(0))\nfloor(floor(1))\nfloor(floor(1.0))\nfloor(floor(f64))\nfloor(floor(i))\nfloor(i * 1.0)\nfloor(i * i)\nfloor(i ** 0)\nfloor(i ** 1)\nfloor(i ** 1.0)\nfloor(i ** f64)\nfloor(i ** i)\nfloor(i + 1)\nfloor(i + 1.0)\nfloor(i + i)\nfloor(i - 0)\nfloor(i - 1.0)\nfloor(i - f64)\nfloor(i / 0)\nfloor(i / 1)\nfloor(i / 1.0)\nfloor(i / f64)\nfloor(i ?? 0)\nfloor(i ?? foo)\nfloor(i ?? greet)\nfloor(i ?? i)\nfloor(i ?? ok)\nfloor(i ?? str)\nfloor(i ?? true)\nfloor(i ^ 0)\nfloor(i ^ 1)\nfloor(i ^ 1.0)\nfloor(i ^ f64)\nfloor(i ^ i)\nfloor(i | add(1))\nfloor(i | median(array))\nfloor(i | min(0))\nfloor(i)\nfloor(i) * f64 < 1.0\nfloor(i) ** 1.0 >= 1.0\nfloor(i) ** i\nfloor(i) - f64\nfloor(i) / 1.0 >= 1.0\nfloor(i) / sum(array)\nfloor(i) == $env != ok\nfloor(i) == f64\nfloor(i) == i\nfloor(i) > f64\nfloor(i) ^ f64\nfloor(i) | max(1.0)\nfloor(if ok { f64 } else { nil })\nfloor(if ok { i } else { $env })\nfloor(if true { 1.0 } else { f64 })\nfloor(int(0))\nfloor(int(1))\nfloor(int(1.0))\nfloor(int(f64))\nfloor(int(i))\nfloor(last(array))\nfloor(len($env))\nfloor(len(array))\nfloor(len(list))\nfloor(len(str))\nfloor(let foobar = 1.0; foobar)\nfloor(let x = f64; x)\nfloor(list | sum(1))\nfloor(max(0 ^ 0))\nfloor(max(0))\nfloor(max(1))\nfloor(max(1.0))\nfloor(max(f64))\nfloor(max(i))\nfloor(mean(0))\nfloor(mean(0, 1.0))\nfloor(mean(1))\nfloor(mean(1, 1))\nfloor(mean(1.0))\nfloor(mean(array))\nfloor(mean(f64))\nfloor(mean(i))\nfloor(median(0))\nfloor(median(0, 1.0))\nfloor(median(1))\nfloor(median(1.0))\nfloor(median(array))\nfloor(median(f64))\nfloor(median(i))\nfloor(min(0))\nfloor(min(1))\nfloor(min(1.0))\nfloor(min(1.0, 0))\nfloor(min(array))\nfloor(min(array, 1))\nfloor(min(f64))\nfloor(min(i))\nfloor(nil ?? 0)\nfloor(nil ?? 1.0)\nfloor(nil ?? f64)\nfloor(ok ? 1.0 : nil)\nfloor(ok ? i : greet)\nfloor(reduce(array, #))\nfloor(reduce(array, #, list))\nfloor(reduce(array, 1))\nfloor(reduce(list, 1))\nfloor(reduce(list, f64))\nfloor(round(0))\nfloor(round(1))\nfloor(round(1.0))\nfloor(round(add(0, i)))\nfloor(round(f64))\nfloor(round(i))\nfloor(sum($env, 0))\nfloor(sum($env, 1.0))\nfloor(sum(array))\nfloor(sum(array, #))\nfloor(sum(array, 1.0))\nfloor(sum(list, 0))\nfloor(sum(list, 1.0))\nfoo\nfoo != $env != ok\nfoo != $env && ok and ok\nfoo != $env == ok\nfoo != $env == true\nfoo != $env ? $env : nil\nfoo != $env ?? greet\nfoo != $env ?? list\nfoo != $env and ok\nfoo != $env or $env[foobar:]\nfoo != $env || false\nfoo != $env || ok\nfoo != $env.foo\nfoo != $env?.Bar\nfoo != $env?.Bar?.[i]\nfoo != $env?.Bar?.array\nfoo != $env?.Bar?.list\nfoo != $env?.String\nfoo != $env?.String?.[greet]\nfoo != $env?.String?.array\nfoo != $env?.String?.greet\nfoo != $env?.[Bar?.[greet]]\nfoo != $env?.[Bar]\nfoo != $env?.[String]\nfoo != $env?.[String]?.add\nfoo != $env?.[String]?.list\nfoo != $env?.[foobar?.[foo]]\nfoo != $env?.[foobar]\nfoo != $env?.[str]\nfoo != $env?.foo\nfoo != $env?.foobar\nfoo != $env?.not\nfoo != 0 ?? ok\nfoo != 1 ?? f64\nfoo != 1.0 ?? add\nfoo != 1.0 ?? greet\nfoo != 1.0 ?? ok\nfoo != add ?? array\nfoo != array ?? ok\nfoo != array ?? str\nfoo != first($env)\nfoo != first(list)\nfoo != foo\nfoo != foo != $env\nfoo != foo && $env.ok\nfoo != foo && f64 == 0\nfoo != foo && get($env, 1)\nfoo != foo == $env || false\nfoo != foo == false\nfoo != foo == true\nfoo != foo ?: i\nfoo != foo ?? $env.array\nfoo != foo ?? add\nfoo != foo ?? foo\nfoo != foo ?? list\nfoo != foo ?? nil\nfoo != foo and find($env, .f64)\nfoo != foo and true\nfoo != foo or 0 ?? false\nfoo != foo or ok\nfoo != foo || ok\nfoo != greet ?? add\nfoo != greet ?? false\nfoo != i ?? false\nfoo != i ?? ok\nfoo != last(list)\nfoo != list ?? $env\nfoo != list ?? greet(str)\nfoo != list?.[i]\nfoo != mean(array)\nfoo != nil != $env\nfoo != nil == $env.ok\nfoo != nil ? 1.0 : $env\nfoo != nil ? str : foo\nfoo != nil ?: $env\nfoo != nil ?? foo\nfoo != nil || sum($env, $env)\nfoo != str ?? f64\nfoo == $env != nil\nfoo == $env != ok\nfoo == $env && ok\nfoo == $env ?: $env | map(foo)\nfoo == $env ?? array\nfoo == $env ?? greet\nfoo == $env and $env\nfoo == $env in $env?.foobar\nfoo == $env or $env.ok\nfoo == $env || $env\nfoo == $env.foo\nfoo == $env?.Bar\nfoo == $env?.Bar?.[i]\nfoo == $env?.Bar?.[list]\nfoo == $env?.String\nfoo == $env?.String?.[array]\nfoo == $env?.[Bar]\nfoo == $env?.[String]\nfoo == $env?.[String]?.[f64]\nfoo == $env?.[foo?.Bar]\nfoo == $env?.[foobar?.[foobar]]\nfoo == $env?.[foobar?.greet]\nfoo == $env?.[foobar]\nfoo == $env?.[str]\nfoo == $env?.foo\nfoo == $env?.foobar\nfoo == $env?.foobar?.array()\nfoo == $env?.foobar?.ok\nfoo == $env?.nil\nfoo == $env?.not\nfoo == 0 ?? foo?.String\nfoo == 0 ?? i ?? $env\nfoo == 1 ?? f64\nfoo == 1.0 ?? $env\nfoo == 1.0 ?? false\nfoo == 1.0 ?? foo == false\nfoo == add ?? 0\nfoo == add ?? 1\nfoo == array ?? foo\nfoo == f64 ?? str\nfoo == false ?? 1.0\nfoo == false ?? i\nfoo == foo\nfoo == foo != ok\nfoo == foo && 0 ?? true\nfoo == foo == false\nfoo == foo == ok\nfoo == foo ? $env : $env\nfoo == foo ?: f64\nfoo == foo ?: i\nfoo == foo ?? 0\nfoo == foo ?? 1.0\nfoo == foo ?? greet\nfoo == foo ?? ok\nfoo == foo ?? str\nfoo == foo or $env?.[greet]\nfoo == foo or ok\nfoo == foo || $env?.[array]\nfoo == foo || false\nfoo == foo || ok\nfoo == i ?? add\nfoo == last($env)\nfoo == last(list)\nfoo == list?.[i]\nfoo == nil != $env\nfoo == nil != nil\nfoo == nil && $env or $env\nfoo == nil && f64 >= 1.0\nfoo == nil && nil != foo\nfoo == nil == $env\nfoo == nil ? foo : i\nfoo == nil ? true : i\nfoo == nil ?: str\nfoo == nil and ok\nfoo == nil || false\nfoo == ok ?? $env?.[foo]\nfoo == ok ?? f64\nfoo == ok ?? foo\nfoo == true ?? foo\nfoo == true ?? str\nfoo ?? !$env\nfoo ?? !ok\nfoo ?? $env ?? f64\nfoo ?? $env ?? foo\nfoo ?? $env ?? list\nfoo ?? $env ?? str\nfoo ?? $env.add\nfoo ?? $env.array\nfoo ?? $env.f64\nfoo ?? $env.foo\nfoo ?? $env.greet\nfoo ?? $env.i\nfoo ?? $env.list\nfoo ?? $env.ok\nfoo ?? $env.str\nfoo ?? $env?.Bar\nfoo ?? $env?.Bar()\nfoo ?? $env?.Bar()?.list\nfoo ?? $env?.Bar.Bar()\nfoo ?? $env?.String\nfoo ?? $env?.String()\nfoo ?? $env?.[$env?.list()]\nfoo ?? $env?.[$env][:Bar].list\nfoo ?? $env?.[Bar]\nfoo ?? $env?.[String]\nfoo ?? $env?.[String].String\nfoo ?? $env?.[add(ok)]\nfoo ?? $env?.[add?.f64]\nfoo ?? $env?.[add]\nfoo ?? $env?.[add]?.ok\nfoo ?? $env?.[array]\nfoo ?? $env?.[array]?.[array]\nfoo ?? $env?.[f64]\nfoo ?? $env?.[f64]?.[i]\nfoo ?? $env?.[f64]?.count(foobar)?.foobar?.i()\nfoo ?? $env?.[f64]?.i()\nfoo ?? $env?.[foo ?? nil]\nfoo ?? $env?.[foo]\nfoo ?? $env?.[foo]?.str\nfoo ?? $env?.[foobar not contains ok]\nfoo ?? $env?.[foobar | none(#)]\nfoo ?? $env?.[foobar.str()]\nfoo ?? $env?.[foobar?.i]\nfoo ?? $env?.[foobar]\nfoo ?? $env?.[foobar]?.array\nfoo ?? $env?.[greet]\nfoo ?? $env?.[i]\nfoo ?? $env?.[i]?.ok()\nfoo ?? $env?.[lastIndexOf(foo)]\nfoo ?? $env?.[list]\nfoo ?? $env?.[list].array(foobar)\nfoo ?? $env?.[nil | sortBy(.Bar, foo)]\nfoo ?? $env?.[nil]\nfoo ?? $env?.[ok]\nfoo ?? $env?.[ok]?.String\nfoo ?? $env?.[one(f64, foo)]\nfoo ?? $env?.[sort($env, list)]\nfoo ?? $env?.[str]\nfoo ?? $env?.[str]?.[str]\nfoo ?? $env?.[str]?.array\nfoo ?? $env?.[str]?.foo\nfoo ?? $env?.add\nfoo ?? $env?.array\nfoo ?? $env?.f64\nfoo ?? $env?.foo\nfoo ?? $env?.foobar\nfoo ?? $env?.greet\nfoo ?? $env?.groupBy(nil, str, nil)?.i\nfoo ?? $env?.i\nfoo ?? $env?.list\nfoo ?? $env?.nil\nfoo ?? $env?.nil?.[greet]\nfoo ?? $env?.ok\nfoo ?? $env?.str\nfoo ?? $env[$env < ok:]\nfoo ?? $env[:$env]\nfoo ?? $env[:array]\nfoo ?? $env[:false].array\nfoo ?? $env[:foo]\nfoo ?? $env[:foobar]\nfoo ?? $env[:i]\nfoo ?? $env[:list]\nfoo ?? $env[Bar?.str(foobar):]\nfoo ?? $env[add:]\nfoo ?? $env[foo.greet(ok):add | find(0)]\nfoo ?? $env[foobar - true:]\nfoo ?? $env[foobar.ok(foo):foobar?.foo]\nfoo ?? $env[foobar:]\nfoo ?? $env[foobar:true]\nfoo ?? $env[get(greet, foobar):]\nfoo ?? $env[i || nil:i($env, 1.0)]\nfoo ?? $env[sortBy(foo, .greet):]\nfoo ?? -$env\nfoo ?? -1\nfoo ?? -1.0\nfoo ?? -i\nfoo ?? 1 ?? add\nfoo ?? 1.0 ?? sortBy(array, 1)\nfoo ?? [0]\nfoo ?? [1]\nfoo ?? [f64]\nfoo ?? [foo, str]\nfoo ?? [i]\nfoo ?? [true, foo]\nfoo ?? add\nfoo ?? add ?? add\nfoo ?? add ?? str\nfoo ?? all($env, #)\nfoo ?? all($env, #.Bar)\nfoo ?? any($env, $env)\nfoo ?? array\nfoo ?? array ?? f64\nfoo ?? array ?? greet\nfoo ?? array?.[i]\nfoo ?? array[:0]\nfoo ?? array[:]\nfoo ?? array[:count($env)]\nfoo ?? concat(list)\nfoo ?? concat(map(list, str))?.[i]\nfoo ?? count($env)\nfoo ?? count(array)\nfoo ?? count(list)\nfoo ?? date(1)\nfoo ?? date(array)\nfoo ?? date(array, list, ok)\nfoo ?? date(foo)\nfoo ?? date(true)\nfoo ?? duration(str)\nfoo ?? f64\nfoo ?? f64 ?? add\nfoo ?? false ?? list\nfoo ?? false ?? nil\nfoo ?? filter($env, #)\nfoo ?? find($env, #.add)\nfoo ?? findLastIndex($env, .add)\nfoo ?? findLastIndex(list, $env)\nfoo ?? float(1.0)\nfoo ?? floor(0)\nfoo ?? floor(i)\nfoo ?? foo\nfoo ?? foo ?? 1.0\nfoo ?? foo ?? add\nfoo ?? foo ?? f64\nfoo ?? foo ?? foo\nfoo ?? foo ?? greet\nfoo ?? foo ?? i\nfoo ?? foo ?? list\nfoo ?? foo ?? str\nfoo ?? foo.Bar\nfoo ?? foo.String\nfoo ?? foo.String()\nfoo ?? foo?.Bar\nfoo ?? foo?.String\nfoo ?? foo?.String()\nfoo ?? fromPairs($env)\nfoo ?? greet\nfoo ?? greet($env)\nfoo ?? greet(str)\nfoo ?? groupBy($env, #.add)\nfoo ?? groupBy(array, i)\nfoo ?? i\nfoo ?? i ?? i\nfoo ?? int(1)\nfoo ?? list\nfoo ?? list?.[1]\nfoo ?? list?.[i]\nfoo ?? lower($env)\nfoo ?? map($env, i)\nfoo ?? mean(array)\nfoo ?? mean(i)\nfoo ?? mean(list, str)\nfoo ?? median($env .. $env)\nfoo ?? median(0)\nfoo ?? median(array)\nfoo ?? median(f64)\nfoo ?? min(array, 1.0)\nfoo ?? nil ?? 1.0\nfoo ?? nil ?? add\nfoo ?? nil ?? array\nfoo ?? nil ?? str\nfoo ?? not $env\nfoo ?? not false\nfoo ?? not ok\nfoo ?? ok\nfoo ?? ok ?? foo?.String\nfoo ?? ok ?? i\nfoo ?? reduce($env, #.i)\nfoo ?? reduce($env, .array)\nfoo ?? reverse(list)\nfoo ?? sort($env)\nfoo ?? sortBy(array, ok)\nfoo ?? str\nfoo ?? string($env)\nfoo ?? string(add)\nfoo ?? string(greet)\nfoo ?? sum($env ?? foo).ok\nfoo ?? sum($env).array\nfoo ?? sum($env, true)\nfoo ?? sum(list)\nfoo ?? toJSON(1)\nfoo ?? toJSON(array)\nfoo ?? trimPrefix(str)\nfoo ?? true ?? list\nfoo ?? type(false)\nfoo ?? uniq($env)\nfoo ?? {foo: 0, foo: foo}\nfoo ?? {foo: array}\nfoo ?? {foo: f64}\nfoo ?? {foo: foo}\nfoo ?? {foo: ok}\nfoo in $env and false\nfoo in $env.list\nfoo in $env?.Bar\nfoo in $env?.Bar?.[add]?.[str]\nfoo in $env?.String\nfoo in $env?.String?.[greet]\nfoo in $env?.String?.[i]\nfoo in $env?.String?.[ok]\nfoo in $env?.String?.add\nfoo in $env?.String?.ok()\nfoo in $env?.[Bar]\nfoo in $env?.[Bar]?.[i]\nfoo in $env?.[String]\nfoo in $env?.[String]?.[array]\nfoo in $env?.[String]?.[foo]\nfoo in $env?.[String]?.i\nfoo in $env?.[foobar?.foo]\nfoo in $env?.[foobar]\nfoo in $env?.[foobar]?.i\nfoo in $env?.[foobar]?.list\nfoo in $env?.foobar\nfoo in $env?.foobar?.list()\nfoo in $env?.list\nfoo in $env?.true?.[greet]\nfoo in [foo, 0]\nfoo in [foo]\nfoo in [list, 1]\nfoo in [nil]\nfoo in array ?? 0\nfoo in array ?? 1.0 != nil\nfoo in array ?? f64\nfoo in flatten(array)\nfoo in keys($env)\nfoo in list\nfoo in list != nil && $env\nfoo in list != ok\nfoo in list == $env?.ok\nfoo in list ?? add\nfoo in list ?? greet\nfoo in list or $env\nfoo in list || false\nfoo in list[0:]\nfoo in map(list, foo)\nfoo in nil ?? list\nfoo in toPairs($env)\nfoo in uniq(list)\nfoo in values($env)\nfoo in {foo: 1.0}.f64\nfoo not in $env.list\nfoo not in $env?.Bar\nfoo not in $env?.String\nfoo not in $env?.String?.[greet]\nfoo not in $env?.[Bar]\nfoo not in $env?.[Bar]?.String\nfoo not in $env?.[String]\nfoo not in $env?.[String]?.[list]\nfoo not in $env?.[String]?.greet\nfoo not in $env?.[foobar?.[add]]\nfoo not in $env?.[foobar?.f64]\nfoo not in $env?.[foobar?.foo]\nfoo not in $env?.[foobar]\nfoo not in $env?.[foobar]?.[greet]\nfoo not in $env?.[nil | last(foobar)]\nfoo not in $env?.[nil]\nfoo not in $env?.foobar\nfoo not in $env?.foobar?.greet(foobar)\nfoo not in $env?.list\nfoo not in $env?.nil?.[ok]\nfoo not in [$env]\nfoo not in [foo]\nfoo not in [nil]\nfoo not in array ?? foo\nfoo not in find($env, false)?.[i]\nfoo not in first($env)\nfoo not in flatten(array)\nfoo not in groupBy(list, #)\nfoo not in keys($env)\nfoo not in list\nfoo not in list != false\nfoo not in list && ok\nfoo not in list ?? 1\nfoo not in list ?? foo\nfoo not in list || ok\nfoo not in toPairs($env)\nfoo not in {foo: 1}?.array\nfoo not in {foo: str}.str\nfoo.Bar\nfoo.Bar != $env == nil\nfoo.Bar != foo?.Bar\nfoo.Bar != str\nfoo.Bar + str\nfoo.Bar < foo.Bar\nfoo.Bar < str\nfoo.Bar <= str\nfoo.Bar == $env ?? 0\nfoo.Bar == $env.str\nfoo.Bar == $env?.Bar\nfoo.Bar == foo?.Bar\nfoo.Bar == str\nfoo.Bar > foo.String()\nfoo.Bar > str\nfoo.Bar >= str\nfoo.Bar >= string(foo)\nfoo.Bar >= type(ok)\nfoo.Bar ?? $env ?? true\nfoo.Bar ?? $env?.Bar\nfoo.Bar ?? $env?.f64\nfoo.Bar ?? add\nfoo.Bar ?? array\nfoo.Bar ?? foo\nfoo.Bar ?? greet\nfoo.Bar ?? i\nfoo.Bar ?? list\nfoo.Bar ?? round(f64)\nfoo.Bar ?? str\nfoo.Bar ?? {foo: foo}\nfoo.Bar contains $env?.String\nfoo.Bar contains $env?.[str]\nfoo.Bar contains str\nfoo.Bar endsWith $env?.Bar\nfoo.Bar endsWith str\nfoo.Bar in $env\nfoo.Bar in $env?.String\nfoo.Bar in foo\nfoo.Bar matches foo.Bar\nfoo.Bar matches greet(str)\nfoo.Bar matches str\nfoo.Bar not contains $env?.Bar\nfoo.Bar not contains str\nfoo.Bar not contains type(0)\nfoo.Bar not endsWith str\nfoo.Bar not endsWith type(list)\nfoo.Bar not in foo\nfoo.Bar not in foo == $env\nfoo.Bar not in {foo: nil, foo: 1}\nfoo.Bar not matches str\nfoo.Bar not matches toJSON(i)\nfoo.Bar not startsWith foo?.Bar\nfoo.Bar not startsWith foo?.String()\nfoo.Bar not startsWith str\nfoo.Bar startsWith $env?.String?.f64()\nfoo.Bar startsWith $env?.[Bar]\nfoo.Bar startsWith str\nfoo.Bar | greet()\nfoo.Bar | hasPrefix(str)\nfoo.Bar | indexOf(str)\nfoo.Bar | lastIndexOf(str)\nfoo.Bar | repeat(0)\nfoo.Bar | split($env?.str)\nfoo.Bar | trimSuffix(str)\nfoo.Bar[:]\nfoo.Bar[:i]\nfoo.Bar[:int(1)]\nfoo.Bar[i:]\nfoo.String\nfoo.String != $env?.foobar\nfoo.String != ok ?? $env\nfoo.String == $env?.[String]\nfoo.String ?? $env?.[Bar]\nfoo.String ?? $env?.array\nfoo.String ?? $env?.list\nfoo.String ?? add\nfoo.String ?? array\nfoo.String ?? ceil(f64)\nfoo.String ?? first(list)\nfoo.String ?? foo\nfoo.String ?? greet\nfoo.String ?? i\nfoo.String ?? len(array)\nfoo.String ?? ok\nfoo.String ?? str\nfoo.String()\nfoo.String() != max(array)\nfoo.String() != str\nfoo.String() + str\nfoo.String() < $env.str\nfoo.String() < str\nfoo.String() <= $env.str\nfoo.String() <= str\nfoo.String() <= type(0 != 1.0)\nfoo.String() == str\nfoo.String() > foo.Bar\nfoo.String() > str\nfoo.String() >= $env?.[str]\nfoo.String() >= str\nfoo.String() ?? $env.i\nfoo.String() ?? add\nfoo.String() ?? array\nfoo.String() ?? f64\nfoo.String() ?? foo\nfoo.String() ?? greet\nfoo.String() ?? i\nfoo.String() contains str\nfoo.String() endsWith str\nfoo.String() in $env?.[Bar]\nfoo.String() in foo\nfoo.String() matches str\nfoo.String() not contains str\nfoo.String() not in foo\nfoo.String() not in foo == false\nfoo.String() not startsWith str\nfoo.String() startsWith str\nfoo.String() | greet()\nfoo.String() | lastIndexOf(str)\nfoo.String() | trimPrefix(str)\nfoo.String()[0 ?? 1.0:]\nfoo.String()[:]\nfoo.String()[i:]\nfoo; $env?.foo\nfoo; $env?.ok\nfoo; $env?.str\nfoo; 1.0; $env?.add\nfoo; 1.0; $env?.ok\nfoo; array\nfoo; f64\nfoo; foo; nil != ok\nfoo; foo?.Bar\nfoo; greet\nfoo; i\nfoo; list\nfoo; str\nfoo?.Bar\nfoo?.Bar != list ?? 0\nfoo?.Bar != nil == $env\nfoo?.Bar != str\nfoo?.Bar != type(f64)\nfoo?.Bar + foo.Bar\nfoo?.Bar + str\nfoo?.Bar + string(foo)\nfoo?.Bar + toJSON(1)\nfoo?.Bar + type(i)\nfoo?.Bar < $env?.str\nfoo?.Bar < str\nfoo?.Bar < string(0)\nfoo?.Bar <= str\nfoo?.Bar == $env.str\nfoo?.Bar == foo?.Bar\nfoo?.Bar == nil and false\nfoo?.Bar == str\nfoo?.Bar > str\nfoo?.Bar > trimPrefix(str)\nfoo?.Bar > type(false)\nfoo?.Bar > type(list)\nfoo?.Bar >= $env.str\nfoo?.Bar >= str\nfoo?.Bar >= toJSON(foo)\nfoo?.Bar ?? !true\nfoo?.Bar ?? $env?.[add].greet\nfoo?.Bar ?? $env?.[str]\nfoo?.Bar ?? $env[foobar:]\nfoo?.Bar ?? add\nfoo?.Bar ?? array\nfoo?.Bar ?? f64\nfoo?.Bar ?? flatten(array)\nfoo?.Bar ?? foo\nfoo?.Bar ?? greet\nfoo?.Bar ?? i\nfoo?.Bar ?? list\nfoo?.Bar ?? map($env, 0)\nfoo?.Bar ?? ok\nfoo?.Bar ?? str\nfoo?.Bar ?? toJSON(f64)\nfoo?.Bar contains $env?.Bar\nfoo?.Bar contains $env?.[Bar]\nfoo?.Bar contains str\nfoo?.Bar contains str ?? list\nfoo?.Bar endsWith $env?.String\nfoo?.Bar endsWith first($env)\nfoo?.Bar endsWith str\nfoo?.Bar in $env?.[Bar]\nfoo?.Bar in foo\nfoo?.Bar in list?.[i]\nfoo?.Bar in uniq(list)\nfoo?.Bar in {foo: array}\nfoo?.Bar in {foo: str}\nfoo?.Bar matches $env.str\nfoo?.Bar matches str\nfoo?.Bar matches str and true\nfoo?.Bar matches toJSON(array)\nfoo?.Bar not contains str\nfoo?.Bar not contains type(nil)\nfoo?.Bar not endsWith $env?.[String]\nfoo?.Bar not endsWith $env?.foobar\nfoo?.Bar not endsWith str\nfoo?.Bar not in $env\nfoo?.Bar not in $env?.[Bar]\nfoo?.Bar not in foo\nfoo?.Bar not matches $env?.[foobar]\nfoo?.Bar not matches $env?.[str]\nfoo?.Bar not matches str\nfoo?.Bar not startsWith $env.str\nfoo?.Bar not startsWith $env?.Bar\nfoo?.Bar not startsWith str\nfoo?.Bar not startsWith toJSON(0)\nfoo?.Bar not startsWith toJSON(nil)\nfoo?.Bar not startsWith type(str)\nfoo?.Bar startsWith $env?.[Bar]\nfoo?.Bar startsWith str\nfoo?.Bar | greet()\nfoo?.Bar | hasSuffix(str)\nfoo?.Bar | lastIndexOf(str)\nfoo?.Bar | repeat(i)\nfoo?.Bar | splitAfter(str)\nfoo?.Bar[:]\nfoo?.Bar[i:]\nfoo?.String\nfoo?.String != $env && $env\nfoo?.String != $env?.[Bar]\nfoo?.String != $env?.[str]\nfoo?.String != nil && $env\nfoo?.String == $env or $env\nfoo?.String == $env?.[String]\nfoo?.String == nil || true\nfoo?.String ?? $env?.list\nfoo?.String ?? -$env\nfoo?.String ?? add\nfoo?.String ?? array\nfoo?.String ?? f64\nfoo?.String ?? findLast($env, #)\nfoo?.String ?? foo\nfoo?.String ?? greet\nfoo?.String ?? groupBy($env, 0)\nfoo?.String ?? i\nfoo?.String ?? list\nfoo?.String ?? ok\nfoo?.String ?? str\nfoo?.String ?? str ?? foo\nfoo?.String ?? string(foo)\nfoo?.String()\nfoo?.String() != str\nfoo?.String() + foo.String()\nfoo?.String() < str\nfoo?.String() == str\nfoo?.String() > foo?.Bar\nfoo?.String() > str\nfoo?.String() >= str\nfoo?.String() >= toJSON(f64)\nfoo?.String() ?? foo\nfoo?.String() ?? greet\nfoo?.String() ?? keys($env)\nfoo?.String() ?? list\nfoo?.String() ?? reverse($env)\nfoo?.String() ?? str\nfoo?.String() contains str\nfoo?.String() endsWith str\nfoo?.String() in foo\nfoo?.String() matches str\nfoo?.String() not contains $env?.[str]\nfoo?.String() not contains str\nfoo?.String() not endsWith $env?.Bar\nfoo?.String() not endsWith $env?.[foobar]\nfoo?.String() not in foo\nfoo?.String() not startsWith str\nfoo?.String() not startsWith type(foo)\nfoo?.String() | greet()\nfoo?.String() | hasSuffix(str)\nfoo?.String()[:]\nfromBase64(string(ok))\nfromBase64(string(true))\nfromBase64(toBase64(str))\nfromBase64(toJSON(nil))\nfromBase64(toJSON(ok))\nfromBase64(toJSON(true))\nfromBase64(type(add))\nfromBase64(type(false))\nfromBase64(type(greet))\nfromBase64(type(ok))\nfromBase64(type(true))\nfromJSON(string(0))\nfromJSON(string(1))\nfromJSON(string(1.0))\nfromJSON(string(f64))\nfromJSON(string(false))\nfromJSON(string(i))\nfromJSON(string(ok))\nfromJSON(string(true))\nfromJSON(toJSON(0))\nfromJSON(toJSON(1))\nfromJSON(toJSON(1.0))\nfromJSON(toJSON(array))\nfromJSON(toJSON(f64))\nfromJSON(toJSON(false))\nfromJSON(toJSON(foo))\nfromJSON(toJSON(foo)).add\nfromJSON(toJSON(i))\nfromJSON(toJSON(list))\nfromJSON(toJSON(nil))\nfromJSON(toJSON(nil))?.[i].i()\nfromJSON(toJSON(ok))\nfromJSON(toJSON(str))\nfromJSON(toJSON(str)) contains str\nfromJSON(toJSON(true))\nfromJSON(toJSON(type(ok)))\nfromPairs($env).true && false\nfromPairs([list])\nfromPairs(array | take(0))\nfromPairs(array[:0])\nfromPairs(filter($env, false))\nfromPairs(filter(list, false))\nfromPairs(list[:0])\nfromPairs(map($env, list))\nfromPairs(sort($env))\nfromPairs(take(array, 0))\nfromPairs(toPairs($env))\nfromPairs(toPairs($env)).ok\nfromPairs(toPairs($env))?.[f64]\nget($env, nil) != array\nget($env, nil) == add\nget($env, nil)?.String\nget($env, nil)?.[add]\nget($env, nil)?.[add].add\nget($env, nil)?.[array]\nget($env, nil)?.[f64]\nget($env, nil)?.[foo]\nget($env, nil)?.[i]\nget($env, nil)?.[ok]\nget($env, nil)?.[str]\nget($env, nil)?.add\nget($env, nil)?.array()\nget($env, nil)?.f64\nget($env, nil)?.foo\nget($env, nil)?.foo(foobar)\nget($env, nil)?.greet().add\nget($env, nil)?.list()\nget($env, nil)?.ok\nget($env, nil)?.ok(foobar)\nget($env, nil)?.str()\nget($env, str) | reduce($env)\nget($env, str)?.[f64]\nget($env?.[Bar], foo)\nget($env?.[String], foo.String)\nget(0 ?? list, add)\nget(1.0 ?? $env, false ?? list)\nget(add ?? f64, add)\nget(add ?? str, i)\nget(array, $env.i)\nget(array, i)\nget(array, i) < i\nget(false ? false : add, foo)\nget(i ?? $env, foo ?? $env)\nget(if ok { i } else { array }, list)\nget(list ?? add, i)\nget(list, -0)\nget(list, 1)?.String\nget(list, i)\nget(list, i).String\nget(mean(array), foo.String)\nget(median(array), true && $env)\nget(str ?? $env, i)\ngreet\ngreet != $env != nil\ngreet != $env && $env\ngreet != $env == nil\ngreet != $env ?: add\ngreet != $env ?? array\ngreet != $env ?? list\ngreet != $env and $env\ngreet != $env or sum(array, true)\ngreet != $env || ok\ngreet != $env || true\ngreet != $env.greet\ngreet != $env?.Bar\ngreet != $env?.String\ngreet != $env?.String?.add()\ngreet != $env?.[Bar]\ngreet != $env?.[String]\ngreet != $env?.[String]?.[greet]\ngreet != $env?.[foobar?.String($env)]\ngreet != $env?.[foobar]\ngreet != $env?.[str]\ngreet != $env?.foobar\ngreet != $env?.greet\ngreet != $env?.true\ngreet != 0 ?? 1.0\ngreet != 0 ?? greet\ngreet != 1 ?? str\ngreet != 1.0 ?? add\ngreet != array ?? !true\ngreet != array ?? ok\ngreet != first($env)\ngreet != foo ?? array\ngreet != foo ?? f64\ngreet != foo ?? list\ngreet != get($env, str)\ngreet != greet\ngreet != greet != nil\ngreet != greet != ok\ngreet != greet && true\ngreet != greet ?: greet\ngreet != greet or ok\ngreet != greet || $env\ngreet != greet || false\ngreet != max($env)\ngreet != nil == nil\ngreet != nil ? foo : true\ngreet != nil ?? $env\ngreet != nil and $env\ngreet != nil || $env?.[i]\ngreet != ok ?? i\ngreet != ok ?? str\ngreet != reduce(array, $env, 0)\ngreet != str ?? $env\ngreet != {foo: nil}.Bar?.list\ngreet != {foo: str}.foobar\ngreet != {foo: true}?.list\ngreet == $env && $env\ngreet == $env ?? foo\ngreet == $env ?? true\ngreet == $env and false\ngreet == $env or ok\ngreet == $env.greet\ngreet == $env?.Bar\ngreet == $env?.Bar?.array()\ngreet == $env?.String\ngreet == $env?.[Bar]\ngreet == $env?.[Bar]?.[foo]\ngreet == $env?.[String]\ngreet == $env?.[String]?.ok\ngreet == $env?.[foobar]\ngreet == $env?.[str]\ngreet == $env?.foobar\ngreet == $env?.foobar?.String\ngreet == $env?.greet\ngreet == 0 ?? f64\ngreet == 1.0 ?? array\ngreet == 1.0 ?? i\ngreet == add ?? f64\ngreet == array ?? add\ngreet == foo ?? 1.0\ngreet == foo ?? true\ngreet == greet\ngreet == greet && $env\ngreet == greet == ok\ngreet == greet ? 1.0 : foo\ngreet == greet and $env\ngreet == min($env)\ngreet == nil != nil\ngreet == nil != ok\ngreet == nil == true\ngreet == nil or $env\ngreet == nil or ok\ngreet == nil || true\ngreet == ok ?? 1.0\ngreet == str ?? greet\ngreet == str ?? true\ngreet ?? !$env\ngreet ?? !false\ngreet ?? !ok\ngreet ?? !true\ngreet ?? $env ?? f64\ngreet ?? $env ?? foo\ngreet ?? $env ?? str\ngreet ?? $env.add\ngreet ?? $env.array\ngreet ?? $env.f64\ngreet ?? $env.foo\ngreet ?? $env.greet\ngreet ?? $env.i\ngreet ?? $env.list\ngreet ?? $env.ok\ngreet ?? $env.str\ngreet ?? $env?.Bar\ngreet ?? $env?.Bar()\ngreet ?? $env?.Bar()?.i\ngreet ?? $env?.Bar(foobar)\ngreet ?? $env?.Bar.array\ngreet ?? $env?.Bar?.foo\ngreet ?? $env?.String\ngreet ?? $env?.String()\ngreet ?? $env?.String?.[array]\ngreet ?? $env?.String?.[i]\ngreet ?? $env?.String?.greet\ngreet ?? $env?.[Bar]\ngreet ?? $env?.[String not in foobar]\ngreet ?? $env?.[String]\ngreet ?? $env?.[add]\ngreet ?? $env?.[add]?.[add]\ngreet ?? $env?.[array]\ngreet ?? $env?.[f64]\ngreet ?? $env?.[foo.f64()].filter(get(foobar))\ngreet ?? $env?.[foo.f64]\ngreet ?? $env?.[foo]\ngreet ?? $env?.[foobar.f64]\ngreet ?? $env?.[foobar]\ngreet ?? $env?.[greet]\ngreet ?? $env?.[i]\ngreet ?? $env?.[list]\ngreet ?? $env?.[ok()]\ngreet ?? $env?.[ok]\ngreet ?? $env?.[str]\ngreet ?? $env?.[str]?.[add]\ngreet ?? $env?.add\ngreet ?? $env?.array\ngreet ?? $env?.f64\ngreet ?? $env?.foo\ngreet ?? $env?.foobar\ngreet ?? $env?.greet\ngreet ?? $env?.i\ngreet ?? $env?.list\ngreet ?? $env?.nil?.String\ngreet ?? $env?.ok\ngreet ?? $env?.str\ngreet ?? $env[$env:]\ngreet ?? $env[:bitor(f64)]\ngreet ?? $env[:foobar?.[add]]\ngreet ?? $env[:foobar]\ngreet ?? $env[:foobar].i()\ngreet ?? $env[Bar(list):count(foobar)]\ngreet ?? $env[array():]\ngreet ?? $env[foo ^ foo:]\ngreet ?? $env[foobar < foo:]\ngreet ?? $env[foobar?.list:String]\ngreet ?? $env[list(0):foo[:$env]]\ngreet ?? -$env\ngreet ?? -0\ngreet ?? -i\ngreet ?? 0 ?? 1\ngreet ?? 0 ?? str\ngreet ?? [1]\ngreet ?? [false]\ngreet ?? [list]\ngreet ?? [true]\ngreet ?? abs($env)\ngreet ?? abs(i)\ngreet ?? add\ngreet ?? array\ngreet ?? array ?? add\ngreet ?? array ?? true\ngreet ?? array?.[i]\ngreet ?? count($env)\ngreet ?? date($env)\ngreet ?? date(false)\ngreet ?? date(foo)\ngreet ?? f64\ngreet ?? f64 ?? foo\ngreet ?? findLast($env, #.foo)\ngreet ?? findLastIndex(list, ok)\ngreet ?? flatten($env)\ngreet ?? float(i)\ngreet ?? foo\ngreet ?? foo ?? $env\ngreet ?? foo ?? array\ngreet ?? foo ?? greet\ngreet ?? foo ?? i\ngreet ?? foo | get(array)\ngreet ?? foo | get(foo)\ngreet ?? foo.Bar\ngreet ?? foo.String\ngreet ?? foo.String()\ngreet ?? foo?.Bar\ngreet ?? foo?.String\ngreet ?? foo?.String()\ngreet ?? fromJSON($env)\ngreet ?? fromPairs(list)\ngreet ?? greet\ngreet ?? greet ?? array\ngreet ?? groupBy($env, add)\ngreet ?? groupBy(list, $env)\ngreet ?? groupBy(list, list)\ngreet ?? i\ngreet ?? i ?? foo\ngreet ?? i ?? list\ngreet ?? int(1.0)\ngreet ?? int(f64)\ngreet ?? keys($env)\ngreet ?? list\ngreet ?? list ?? 0\ngreet ?? list ?? array\ngreet ?? list ?? str\ngreet ?? list?.[i]\ngreet ?? lower($env)\ngreet ?? map($env, #.ok)\ngreet ?? map(list, #index * 1.0)\ngreet ?? map(list, #index)\ngreet ?? max(1.0, $env)\ngreet ?? mean(1.0)\ngreet ?? median(0)\ngreet ?? min($env)\ngreet ?? min(1.0)\ngreet ?? min(i)\ngreet ?? nil ?? 1.0\ngreet ?? nil ?? add\ngreet ?? not false\ngreet ?? not true\ngreet ?? ok\ngreet ?? one($env, .str)\ngreet ?? reduce($env, true)\ngreet ?? round(i)\ngreet ?? sortBy(list, #)\ngreet ?? str\ngreet ?? str[:$env]\ngreet ?? string($env)\ngreet ?? string(array)\ngreet ?? string(nil)\ngreet ?? sum($env)\ngreet ?? sum($env, #.ok)\ngreet ?? sum(array)\ngreet ?? sum(list)\ngreet ?? sum(list, $env)\ngreet ?? toJSON(add)\ngreet ?? toJSON(foo)\ngreet ?? toJSON(list)\ngreet ?? toPairs($env)\ngreet ?? trimSuffix($env)\ngreet ?? type(1.0)\ngreet ?? type(add)\ngreet ?? type(str)\ngreet ?? type(true)\ngreet ?? {foo: foo}.i()\ngreet in $env?.Bar\ngreet in $env?.String\ngreet in $env?.[Bar]\ngreet in $env?.[Bar] && ok\ngreet in $env?.[String]\ngreet in $env?.[foobar?.[f64]]\ngreet in $env?.[foobar?.[i]]\ngreet in $env?.[foobar]\ngreet in $env?.foobar\ngreet in $env?.foobar?.[foo]\ngreet in $env?.nil\ngreet in $env?.true\ngreet in [$env, foo]\ngreet in [nil]\ngreet in array ?? foo\ngreet in first($env)\ngreet in flatten(list)\ngreet in list ?? $env?.[array]\ngreet in list ?? $env?.[i]\ngreet in map($env, $env)\ngreet in reverse(list)\ngreet in sort($env)\ngreet in toPairs($env)\ngreet in uniq(list)\ngreet not in $env and false\ngreet not in $env?.Bar\ngreet not in $env?.String\ngreet not in $env?.String?.str\ngreet not in $env?.[Bar]\ngreet not in $env?.[Bar]?.list()\ngreet not in $env?.[String]\ngreet not in $env?.[foobar?.[add]]\ngreet not in $env?.[foobar]\ngreet not in $env?.foobar\ngreet not in [foo, 1.0]\ngreet not in array ?? add\ngreet not in array ?? i\ngreet not in first($env)\ngreet not in flatten(array)\ngreet not in flatten(list)\ngreet not in last($env)\ngreet not in list ?? str\ngreet not in toPairs($env)\ngreet not in {foo: foo}.list and ok\ngreet($env) != $env or true\ngreet($env.foo?.Bar)\ngreet($env.greet(str))\ngreet($env.str)\ngreet($env?.[foobar] ?? str)\ngreet($env?.[str])\ngreet($env?.foo?.Bar)\ngreet($env?.greet(str))\ngreet($env?.str)\ngreet(false ? foo : str)\ngreet(foo.Bar)\ngreet(foo.String())\ngreet(foo?.Bar)\ngreet(foo?.Bar) not endsWith str\ngreet(foo?.Bar) | repeat(nil ?? i)\ngreet(foo?.String())\ngreet(get($env, str))\ngreet(greet($env?.[str]))\ngreet(greet(foo.String()))\ngreet(greet(greet(str)))\ngreet(greet(str ?? foo?.Bar))\ngreet(greet(str))\ngreet(greet(str[:i]))\ngreet(greet(string($env)))\ngreet(greet(string(0)))\ngreet(greet(type($env)))\ngreet(greet(type(add)))\ngreet(greet(type(true)))\ngreet(if false { 1.0 } else { str })\ngreet(if ok { str } else { nil })\ngreet(if true { str } else { $env })\ngreet(join($env | map(str)))\ngreet(keys($env)?.[i])\ngreet(last(list).Bar)\ngreet(let x = str; x)\ngreet(list | reduce(#.Bar))\ngreet(list | reduce(str))\ngreet(list | reduce(str, str))\ngreet(list?.[i].Bar)\ngreet(list?.[i].String())\ngreet(lower(greet(str)))\ngreet(lower(str))\ngreet(min($env)?.str)\ngreet(nil ?? str)\ngreet(ok ? str : 1)\ngreet(reduce(array, str))\ngreet(reduce(list, str))\ngreet(str + str)\ngreet(str ?? $env)\ngreet(str ?? 0)\ngreet(str ?? 1)\ngreet(str ?? 1.0)\ngreet(str ?? add)\ngreet(str ?? array)\ngreet(str ?? f64)\ngreet(str ?? false)\ngreet(str ?? foo)\ngreet(str ?? greet)\ngreet(str ?? i)\ngreet(str ?? list)\ngreet(str ?? nil)\ngreet(str ?? ok)\ngreet(str ?? str)\ngreet(str ?? true)\ngreet(str | greet())\ngreet(str | repeat(0))\ngreet(str | trim(str))\ngreet(str | trimPrefix(str))\ngreet(str)\ngreet(str) != $env && $env\ngreet(str) != list ?? 0\ngreet(str) != str\ngreet(str) + str\ngreet(str) < lower(str)\ngreet(str) < str\ngreet(str) <= $env?.str\ngreet(str) <= str\ngreet(str) <= type(i)\ngreet(str) == nil ? foo : nil\ngreet(str) == str\ngreet(str) > str\ngreet(str) > type(0)\ngreet(str) >= $env.str\ngreet(str) >= foo?.String()\ngreet(str) >= str\ngreet(str) ?? [array]\ngreet(str) ?? f64\ngreet(str) ?? list\ngreet(str) ?? str\ngreet(str) contains str\ngreet(str) contains string(true)\ngreet(str) endsWith $env?.[str]\ngreet(str) endsWith str\ngreet(str) in $env == $env\ngreet(str) in foo\ngreet(str) matches str\ngreet(str) not contains str\ngreet(str) not endsWith $env?.str\ngreet(str) not endsWith string(foo)\ngreet(str) not endsWith type(nil)\ngreet(str) not in foo\ngreet(str) not matches str\ngreet(str) not startsWith $env?.Bar\ngreet(str) not startsWith $env?.String\ngreet(str) not startsWith foo.Bar\ngreet(str) not startsWith str\ngreet(str) startsWith foo.Bar\ngreet(str) startsWith str\ngreet(str) startsWith toJSON(1)\ngreet(str) | greet()\ngreet(str)[:]\ngreet(str)[:i]\ngreet(str)[i:]\ngreet(str[0:])\ngreet(str[1:0])\ngreet(str[1:])\ngreet(str[:0])\ngreet(str[:1])\ngreet(str[:])\ngreet(str[:i])\ngreet(str[i:1])\ngreet(str[i:])\ngreet(str[i:i])\ngreet(string($env))\ngreet(string($env?.Bar))\ngreet(string($env?.i))\ngreet(string(0))\ngreet(string(1))\ngreet(string(1.0 * f64))\ngreet(string(1.0))\ngreet(string(abs(0)))\ngreet(string(add))\ngreet(string(array | sortBy(str)))\ngreet(string(array))\ngreet(string(f64))\ngreet(string(false))\ngreet(string(foo))\ngreet(string(greet))\ngreet(string(groupBy(list, ok)))\ngreet(string(i))\ngreet(string(last(array)))\ngreet(string(list))\ngreet(string(nil != add))\ngreet(string(nil))\ngreet(string(ok))\ngreet(string(str))\ngreet(string(true))\ngreet(toBase64(str))\ngreet(toJSON($env.array))\ngreet(toJSON($env.foo))\ngreet(toJSON(0))\ngreet(toJSON(1))\ngreet(toJSON(1.0 + 1.0))\ngreet(toJSON(1.0))\ngreet(toJSON(array | sum(#)))\ngreet(toJSON(array))\ngreet(toJSON(f64))\ngreet(toJSON(false))\ngreet(toJSON(foo) | greet())\ngreet(toJSON(foo))\ngreet(toJSON(foo?.Bar))\ngreet(toJSON(i % i))\ngreet(toJSON(i))\ngreet(toJSON(list))\ngreet(toJSON(max(0)))\ngreet(toJSON(nil))\ngreet(toJSON(ok))\ngreet(toJSON(str))\ngreet(toJSON(true))\ngreet(trim(str))\ngreet(trim(trimSuffix(str)))\ngreet(trimPrefix(str ?? nil))\ngreet(trimPrefix(str))\ngreet(trimSuffix(foo.String()))\ngreet(trimSuffix(str))\ngreet(trimSuffix(str, str))\ngreet(true ? str : add)\ngreet(true ? str : i)\ngreet(true ? str : nil)\ngreet(true ? str : ok)\ngreet(type($env != 1.0))\ngreet(type($env))\ngreet(type($env.ok))\ngreet(type($env?.foo))\ngreet(type(0))\ngreet(type(1))\ngreet(type(1.0))\ngreet(type([list]))\ngreet(type([ok]))\ngreet(type(add))\ngreet(type(array))\ngreet(type(f64))\ngreet(type(false))\ngreet(type(foo))\ngreet(type(foo.String))\ngreet(type(greet))\ngreet(type(i * f64))\ngreet(type(i))\ngreet(type(list))\ngreet(type(map(array, ok)))\ngreet(type(nil == f64))\ngreet(type(nil))\ngreet(type(not ok))\ngreet(type(ok))\ngreet(type(str))\ngreet(type(true))\ngreet(upper(str))\ngreet; $env?.[Bar]\ngreet; $env?.add\ngreet; $env?.foobar\ngreet; add\ngreet; array\ngreet; array | sum(0)\ngreet; f64\ngreet; float(f64)\ngreet; foo\ngreet; foo; i\ngreet; greet\ngreet; i\ngreet; ok\ngreet; ok ?? i\ngreet; {foo: nil}\ngroupBy($env | map(false), i)?.ok\ngroupBy($env | map(i), ok)\ngroupBy($env.array, # >= #)\ngroupBy($env.array, #)\ngroupBy($env.array, -#)?.f64\ngroupBy($env.array, 0 * 1.0)\ngroupBy($env.array, f64)\ngroupBy($env.array, foo)\ngroupBy($env.array, i / #)\ngroupBy($env.list, #)\ngroupBy($env.list, f64)\ngroupBy($env.list, foo)\ngroupBy($env.list, i)\ngroupBy($env.list, nil != #.String)\ngroupBy($env.list, not ok)\ngroupBy($env.list, str)\ngroupBy($env?.[str], #)\ngroupBy($env?.[str], 1.0 <= i)\ngroupBy($env?.[str], 1.0 > 1.0)\ngroupBy($env?.[str], any($env, true))\ngroupBy($env?.[str], f64)\ngroupBy($env?.[str], i)\ngroupBy($env?.[str], mean(#))\ngroupBy($env?.[str], ok)\ngroupBy($env?.[str], ok)?.add\ngroupBy($env?.[str], str)\ngroupBy($env?.array, #)\ngroupBy($env?.array, #)?.[i]\ngroupBy($env?.array, $env?.i)\ngroupBy($env?.array, -#)\ngroupBy($env?.array, 0 <= #)\ngroupBy($env?.array, f64)\ngroupBy($env?.array, foo)?.ok\ngroupBy($env?.array, i)\ngroupBy($env?.array, ok)\ngroupBy($env?.array, str)\ngroupBy($env?.list, #)\ngroupBy($env?.list, #.Bar)\ngroupBy($env?.list, $env?.i)\ngroupBy($env?.list, 0 == $env)\ngroupBy($env?.list, int(1.0))\ngroupBy($env?.list, ok)\ngroupBy($env?.list, str)\ngroupBy(1 .. 0, #)\ngroupBy(1 .. 1, ok)\ngroupBy([$env], .String startsWith .str)\ngroupBy([$env], i)\ngroupBy([0, 0], #)\ngroupBy([0], #)\ngroupBy([1.0], # / f64)\ngroupBy([1.0], #)\ngroupBy([1.0], foo)\ngroupBy([1.0], ok)\ngroupBy([1], #)\ngroupBy([1], i)\ngroupBy([f64], ok)\ngroupBy([f64], str)\ngroupBy([false, str], ok)\ngroupBy([false], #)\ngroupBy([foo], .Bar not matches #.Bar)\ngroupBy([foo], 0 >= i)\ngroupBy([foo], foo)?.[ok]\ngroupBy([foo], i)\ngroupBy([greet], i)\ngroupBy([i], foo)\ngroupBy([list], abs(1.0))\ngroupBy([ok], #)\ngroupBy([str], str)\ngroupBy(array ?? $env, foo)\ngroupBy(array ?? add, 1.0 ?? foo)\ngroupBy(array ?? array, foo)\ngroupBy(array ?? foo, str == #)\ngroupBy(array ?? greet, #)\ngroupBy(array ?? greet, ok)\ngroupBy(array | filter(false), greet)\ngroupBy(array | map(#), ok)\ngroupBy(array | map($env), #.ok)\ngroupBy(array | map(0), str)\ngroupBy(array | map(1), #)\ngroupBy(array | sortBy(#), 1 + #)\ngroupBy(array | sortBy(1.0), #)\ngroupBy(array, !false)\ngroupBy(array, # != 1.0)\ngroupBy(array, # % #)\ngroupBy(array, # % #)?.[str]\ngroupBy(array, # * i)\ngroupBy(array, # ** 0)\ngroupBy(array, # + #)\ngroupBy(array, # - 1.0)\ngroupBy(array, # / #)\ngroupBy(array, # < 1)\ngroupBy(array, # <= f64)\ngroupBy(array, # == #)\ngroupBy(array, # > #)\ngroupBy(array, # >= #).String\ngroupBy(array, # >= 0)\ngroupBy(array, # >= f64)\ngroupBy(array, # ?? 1.0)\ngroupBy(array, # ?? array)\ngroupBy(array, # ?? nil)\ngroupBy(array, # ?? str)\ngroupBy(array, # ^ #)\ngroupBy(array, # ^ 1.0)\ngroupBy(array, # | bitor(#))\ngroupBy(array, #)\ngroupBy(array, #).Bar\ngroupBy(array, #).String\ngroupBy(array, #).add\ngroupBy(array, #).array\ngroupBy(array, #).f64\ngroupBy(array, #).foo\ngroupBy(array, #).foobar\ngroupBy(array, #).foobar | any(true)\ngroupBy(array, #).greet\ngroupBy(array, #).i\ngroupBy(array, #).i | any(#.ok.array)\ngroupBy(array, #).list\ngroupBy(array, #).ok\ngroupBy(array, #).str\ngroupBy(array, #)?.Bar\ngroupBy(array, #)?.String\ngroupBy(array, #)?.[f64]\ngroupBy(array, #)?.[foo]\ngroupBy(array, #)?.[i]\ngroupBy(array, #)?.[ok]\ngroupBy(array, #)?.[str]\ngroupBy(array, #)?.add\ngroupBy(array, #)?.array\ngroupBy(array, #)?.f64\ngroupBy(array, #)?.foo\ngroupBy(array, #)?.foobar\ngroupBy(array, #)?.greet\ngroupBy(array, #)?.i\ngroupBy(array, #)?.list\ngroupBy(array, #)?.ok\ngroupBy(array, #)?.str\ngroupBy(array, $env != i)?.[ok]\ngroupBy(array, $env == array).str\ngroupBy(array, $env == foo)\ngroupBy(array, $env | sum(1.0))\ngroupBy(array, $env.f64)\ngroupBy(array, $env.foo)\ngroupBy(array, $env.i)\ngroupBy(array, $env.ok)\ngroupBy(array, $env.str)\ngroupBy(array, $env?.[String])\ngroupBy(array, $env?.[foobar])\ngroupBy(array, $env?.[str])\ngroupBy(array, $env?.f64)\ngroupBy(array, $env?.i)\ngroupBy(array, $env?.nil)\ngroupBy(array, $env?.ok)\ngroupBy(array, $env?.str)\ngroupBy(array, -#)\ngroupBy(array, -#)?.str\ngroupBy(array, -0)\ngroupBy(array, -1.0)\ngroupBy(array, -i)\ngroupBy(array, 0 + #)\ngroupBy(array, 0 == 1.0)\ngroupBy(array, 0) ?? foo\ngroupBy(array, 0).Bar\ngroupBy(array, 0).String\ngroupBy(array, 0).add\ngroupBy(array, 0).array\ngroupBy(array, 0).foo\ngroupBy(array, 0).foobar\ngroupBy(array, 0).greet\ngroupBy(array, 0).i\ngroupBy(array, 0).list\ngroupBy(array, 0).str\ngroupBy(array, 0)?.Bar\ngroupBy(array, 0)?.String\ngroupBy(array, 0)?.[f64]\ngroupBy(array, 0)?.[foo]\ngroupBy(array, 0)?.[i]\ngroupBy(array, 0)?.[str]\ngroupBy(array, 0)?.add\ngroupBy(array, 0)?.array\ngroupBy(array, 0)?.f64\ngroupBy(array, 0)?.foo\ngroupBy(array, 0)?.foobar\ngroupBy(array, 0)?.greet\ngroupBy(array, 0)?.i\ngroupBy(array, 0)?.list\ngroupBy(array, 0)?.str\ngroupBy(array, 1 >= #)\ngroupBy(array, 1).Bar\ngroupBy(array, 1).String\ngroupBy(array, 1).add\ngroupBy(array, 1).array\ngroupBy(array, 1).f64\ngroupBy(array, 1).foo\ngroupBy(array, 1).greet\ngroupBy(array, 1).i\ngroupBy(array, 1).list\ngroupBy(array, 1)?.Bar\ngroupBy(array, 1)?.String\ngroupBy(array, 1)?.[foo]\ngroupBy(array, 1)?.[i]\ngroupBy(array, 1)?.[ok]\ngroupBy(array, 1)?.[str]\ngroupBy(array, 1)?.add\ngroupBy(array, 1)?.array\ngroupBy(array, 1)?.f64\ngroupBy(array, 1)?.foo\ngroupBy(array, 1)?.greet\ngroupBy(array, 1)?.i\ngroupBy(array, 1)?.list\ngroupBy(array, 1)?.ok\ngroupBy(array, 1)?.str\ngroupBy(array, 1.0 != $env)\ngroupBy(array, 1.0 != 1.0)\ngroupBy(array, 1.0 ** #)\ngroupBy(array, 1.0 - 1.0)\ngroupBy(array, 1.0 < #)\ngroupBy(array, 1.0 < 0)?.ok\ngroupBy(array, 1.0 <= 0)\ngroupBy(array, 1.0 <= f64)\ngroupBy(array, 1.0 ?? str)\ngroupBy(array, 1.0 ^ #)\ngroupBy(array, 1.0) == $env?.Bar\ngroupBy(array, 1.0).Bar\ngroupBy(array, 1.0).add\ngroupBy(array, 1.0).array\ngroupBy(array, 1.0).f64\ngroupBy(array, 1.0).foo\ngroupBy(array, 1.0).foobar\ngroupBy(array, 1.0).greet\ngroupBy(array, 1.0).i\ngroupBy(array, 1.0).list\ngroupBy(array, 1.0).ok\ngroupBy(array, 1.0).ok?.[i]\ngroupBy(array, 1.0).str\ngroupBy(array, 1.0)?.Bar\ngroupBy(array, 1.0)?.String\ngroupBy(array, 1.0)?.[f64]\ngroupBy(array, 1.0)?.[foo]\ngroupBy(array, 1.0)?.[i]\ngroupBy(array, 1.0)?.[ok]\ngroupBy(array, 1.0)?.[str]\ngroupBy(array, 1.0)?.add\ngroupBy(array, 1.0)?.array\ngroupBy(array, 1.0)?.f64\ngroupBy(array, 1.0)?.foo\ngroupBy(array, 1.0)?.greet\ngroupBy(array, 1.0)?.i\ngroupBy(array, 1.0)?.list\ngroupBy(array, 1.0)?.ok\ngroupBy(array, 1.0)?.str\ngroupBy(array, abs(#))\ngroupBy(array, array | sum(#))\ngroupBy(array, bitand(#, #))\ngroupBy(array, bitshr(#, 0))\ngroupBy(array, ceil(#))\ngroupBy(array, ceil(floor(1.0)))\ngroupBy(array, f64 ** i)\ngroupBy(array, f64 - 1)\ngroupBy(array, f64 / #)\ngroupBy(array, f64 < #)\ngroupBy(array, f64 >= #)\ngroupBy(array, f64 ?? #)\ngroupBy(array, f64)\ngroupBy(array, f64).Bar\ngroupBy(array, f64).String\ngroupBy(array, f64).add\ngroupBy(array, f64).array\ngroupBy(array, f64).f64\ngroupBy(array, f64).foo\ngroupBy(array, f64).foobar\ngroupBy(array, f64).greet\ngroupBy(array, f64).i\ngroupBy(array, f64).list\ngroupBy(array, f64).ok\ngroupBy(array, f64).str\ngroupBy(array, f64)?.Bar\ngroupBy(array, f64)?.String\ngroupBy(array, f64)?.[f64]\ngroupBy(array, f64)?.[foo]\ngroupBy(array, f64)?.[i]\ngroupBy(array, f64)?.[ok]\ngroupBy(array, f64)?.[str]\ngroupBy(array, f64)?.add\ngroupBy(array, f64)?.array\ngroupBy(array, f64)?.foo\ngroupBy(array, f64)?.greet\ngroupBy(array, f64)?.i\ngroupBy(array, f64)?.list\ngroupBy(array, f64)?.ok\ngroupBy(array, f64)?.str\ngroupBy(array, false and $env)\ngroupBy(array, false or true)\ngroupBy(array, false).Bar\ngroupBy(array, false).String\ngroupBy(array, false).add\ngroupBy(array, false).f64\ngroupBy(array, false).foo\ngroupBy(array, false).greet\ngroupBy(array, false).i\ngroupBy(array, false).list\ngroupBy(array, false).ok\ngroupBy(array, false).str\ngroupBy(array, false)?.Bar\ngroupBy(array, false)?.String\ngroupBy(array, false)?.[f64]\ngroupBy(array, false)?.[foo]\ngroupBy(array, false)?.[i]\ngroupBy(array, false)?.[ok]\ngroupBy(array, false)?.[str]\ngroupBy(array, false)?.add\ngroupBy(array, false)?.array\ngroupBy(array, false)?.f64\ngroupBy(array, false)?.foo\ngroupBy(array, false)?.greet\ngroupBy(array, false)?.i\ngroupBy(array, false)?.list\ngroupBy(array, false)?.ok\ngroupBy(array, false)?.str\ngroupBy(array, float(1.0))\ngroupBy(array, float(i))\ngroupBy(array, floor(#))\ngroupBy(array, foo == $env)\ngroupBy(array, foo ?? #)\ngroupBy(array, foo in list)\ngroupBy(array, foo not in list)\ngroupBy(array, foo)\ngroupBy(array, foo) ?? ok\ngroupBy(array, foo).Bar\ngroupBy(array, foo).String\ngroupBy(array, foo).add\ngroupBy(array, foo).array\ngroupBy(array, foo).f64\ngroupBy(array, foo).foo\ngroupBy(array, foo).foobar\ngroupBy(array, foo).foobar | groupBy(0)\ngroupBy(array, foo).greet\ngroupBy(array, foo).i\ngroupBy(array, foo).list\ngroupBy(array, foo).ok\ngroupBy(array, foo).str\ngroupBy(array, foo)?.Bar\ngroupBy(array, foo)?.String\ngroupBy(array, foo)?.[f64]\ngroupBy(array, foo)?.[foo]\ngroupBy(array, foo)?.[i]\ngroupBy(array, foo)?.[ok]\ngroupBy(array, foo)?.[str]\ngroupBy(array, foo)?.add\ngroupBy(array, foo)?.array\ngroupBy(array, foo)?.f64\ngroupBy(array, foo)?.foo\ngroupBy(array, foo)?.greet\ngroupBy(array, foo)?.i\ngroupBy(array, foo)?.list\ngroupBy(array, foo)?.ok\ngroupBy(array, foo)?.str\ngroupBy(array, foo.Bar)\ngroupBy(array, greet == $env)\ngroupBy(array, greet(str))\ngroupBy(array, i - 1.0)\ngroupBy(array, i / 1.0)\ngroupBy(array, i > #)\ngroupBy(array, i ^ #)\ngroupBy(array, i | bitand(#))?.list\ngroupBy(array, i)\ngroupBy(array, i) ?? $env.f64\ngroupBy(array, i).Bar\ngroupBy(array, i).add\ngroupBy(array, i).array\ngroupBy(array, i).f64\ngroupBy(array, i).foo\ngroupBy(array, i).greet\ngroupBy(array, i).i\ngroupBy(array, i).ok\ngroupBy(array, i).str\ngroupBy(array, i)?.Bar\ngroupBy(array, i)?.String\ngroupBy(array, i)?.[f64]\ngroupBy(array, i)?.[foo]\ngroupBy(array, i)?.[ok]\ngroupBy(array, i)?.[str]\ngroupBy(array, i)?.add\ngroupBy(array, i)?.array\ngroupBy(array, i)?.f64\ngroupBy(array, i)?.foo\ngroupBy(array, i)?.foobar\ngroupBy(array, i)?.greet\ngroupBy(array, i)?.i\ngroupBy(array, i)?.list\ngroupBy(array, i)?.ok\ngroupBy(array, i)?.str\ngroupBy(array, if true { nil } else { f64 })\ngroupBy(array, max(#))\ngroupBy(array, max(i))\ngroupBy(array, mean(1.0))\ngroupBy(array, nil == $env)\ngroupBy(array, nil == 0)\ngroupBy(array, not false)\ngroupBy(array, not ok)\ngroupBy(array, ok ?? #)\ngroupBy(array, ok or true)\ngroupBy(array, ok)\ngroupBy(array, ok).Bar\ngroupBy(array, ok).String\ngroupBy(array, ok).add\ngroupBy(array, ok).array\ngroupBy(array, ok).f64\ngroupBy(array, ok).foo\ngroupBy(array, ok).greet\ngroupBy(array, ok).i\ngroupBy(array, ok).list\ngroupBy(array, ok).str\ngroupBy(array, ok)?.Bar\ngroupBy(array, ok)?.String\ngroupBy(array, ok)?.[f64]\ngroupBy(array, ok)?.[foo]\ngroupBy(array, ok)?.[i]\ngroupBy(array, ok)?.[ok]\ngroupBy(array, ok)?.[str]\ngroupBy(array, ok)?.add\ngroupBy(array, ok)?.array\ngroupBy(array, ok)?.foo\ngroupBy(array, ok)?.list\ngroupBy(array, ok)?.ok\ngroupBy(array, ok)?.str\ngroupBy(array, one(array, true))\ngroupBy(array, round(i))\ngroupBy(array, str endsWith str)\ngroupBy(array, str)\ngroupBy(array, str).Bar\ngroupBy(array, str).String\ngroupBy(array, str).add\ngroupBy(array, str).array\ngroupBy(array, str).foo\ngroupBy(array, str).greet\ngroupBy(array, str).i\ngroupBy(array, str).list\ngroupBy(array, str).ok\ngroupBy(array, str).str\ngroupBy(array, str)?.Bar\ngroupBy(array, str)?.String\ngroupBy(array, str)?.[f64]\ngroupBy(array, str)?.[i]\ngroupBy(array, str)?.[ok]\ngroupBy(array, str)?.[str]\ngroupBy(array, str)?.add\ngroupBy(array, str)?.array\ngroupBy(array, str)?.f64\ngroupBy(array, str)?.foo\ngroupBy(array, str)?.greet\ngroupBy(array, str)?.i\ngroupBy(array, str)?.list\ngroupBy(array, str)?.not\ngroupBy(array, str)?.ok\ngroupBy(array, str)?.str\ngroupBy(array, sum(array))\ngroupBy(array, toJSON(array))\ngroupBy(array, toJSON(nil))\ngroupBy(array, toJSON(ok))\ngroupBy(array, true && true)\ngroupBy(array, true || ok)\ngroupBy(array, true).Bar\ngroupBy(array, true).String\ngroupBy(array, true).add\ngroupBy(array, true).array\ngroupBy(array, true).f64\ngroupBy(array, true).foo\ngroupBy(array, true).greet\ngroupBy(array, true).i\ngroupBy(array, true).list\ngroupBy(array, true).ok\ngroupBy(array, true).str\ngroupBy(array, true)?.Bar\ngroupBy(array, true)?.[f64]\ngroupBy(array, true)?.[foo]\ngroupBy(array, true)?.[i]\ngroupBy(array, true)?.[ok]\ngroupBy(array, true)?.[str]\ngroupBy(array, true)?.add\ngroupBy(array, true)?.array\ngroupBy(array, true)?.f64\ngroupBy(array, true)?.foo\ngroupBy(array, true)?.i\ngroupBy(array, true)?.list\ngroupBy(array, true)?.ok\ngroupBy(array, true)?.str\ngroupBy(array, type(#))\ngroupBy(array, type(i))\ngroupBy(array, type(nil))\ngroupBy(concat(array), #)\ngroupBy(concat(list), true ?? #).array\ngroupBy(false ? nil : array, f64)\ngroupBy(filter($env, false), .ok.greet())\ngroupBy(filter(array, false), #)\ngroupBy(flatten(array), #)\ngroupBy(flatten(list), #)\ngroupBy(flatten(list), .Bar)\ngroupBy(groupBy(array, ok).i, #?.[ok][.f64:])\ngroupBy(i..i, #)\ngroupBy(if false { ok } else { list }, ok)\ngroupBy(keys($env), #)\ngroupBy(list | map(#), f64)\ngroupBy(list | map(#), ok)\ngroupBy(list | map(array), $env?.f64)\ngroupBy(list | map(false), #)\ngroupBy(list | map(list), ok)\ngroupBy(list, # != foo)\ngroupBy(list, # == #)\ngroupBy(list, # ?? nil)\ngroupBy(list, #)\ngroupBy(list, #) ?? foo\ngroupBy(list, #) ?? str\ngroupBy(list, #).Bar\ngroupBy(list, #).String\ngroupBy(list, #).add\ngroupBy(list, #).array\ngroupBy(list, #).f64\ngroupBy(list, #).foo\ngroupBy(list, #).foobar\ngroupBy(list, #).greet\ngroupBy(list, #).i\ngroupBy(list, #).list\ngroupBy(list, #).ok\ngroupBy(list, #).str\ngroupBy(list, #)?.Bar\ngroupBy(list, #)?.String\ngroupBy(list, #)?.[$env?.[str]]\ngroupBy(list, #)?.[f64]\ngroupBy(list, #)?.[foo]\ngroupBy(list, #)?.[i]\ngroupBy(list, #)?.[ok]\ngroupBy(list, #)?.[str]\ngroupBy(list, #)?.add\ngroupBy(list, #)?.array\ngroupBy(list, #)?.f64\ngroupBy(list, #)?.foo\ngroupBy(list, #)?.greet\ngroupBy(list, #)?.i\ngroupBy(list, #)?.list\ngroupBy(list, #)?.ok\ngroupBy(list, #)?.str\ngroupBy(list, #.Bar not in $env)\ngroupBy(list, #.Bar)\ngroupBy(list, #.Bar).Bar\ngroupBy(list, #.Bar).array\ngroupBy(list, #.Bar).f64\ngroupBy(list, #.Bar).foo\ngroupBy(list, #.Bar).list\ngroupBy(list, #.Bar).ok\ngroupBy(list, #.Bar).str\ngroupBy(list, #.Bar)?.String\ngroupBy(list, #.Bar)?.[f64]\ngroupBy(list, #.Bar)?.[ok]\ngroupBy(list, #.Bar)?.add\ngroupBy(list, #.Bar)?.array\ngroupBy(list, #.Bar)?.f64\ngroupBy(list, #.Bar)?.foo\ngroupBy(list, #.Bar)?.greet\ngroupBy(list, #.Bar)?.i\ngroupBy(list, #.Bar)?.list\ngroupBy(list, #.Bar)?.ok\ngroupBy(list, #.String == $env)\ngroupBy(list, #?.Bar)\ngroupBy(list, #?.Bar)?.[f64]\ngroupBy(list, #?.String())\ngroupBy(list, $env != f64)\ngroupBy(list, $env != greet)\ngroupBy(list, $env != true)\ngroupBy(list, $env == add)\ngroupBy(list, $env == greet)\ngroupBy(list, $env.f64)\ngroupBy(list, $env.foo)\ngroupBy(list, $env.i)\ngroupBy(list, $env.str)\ngroupBy(list, $env?.[String])\ngroupBy(list, $env?.[str])\ngroupBy(list, $env?.f64)\ngroupBy(list, $env?.foo)\ngroupBy(list, $env?.foobar)\ngroupBy(list, $env?.nil)\ngroupBy(list, $env?.str)\ngroupBy(list, -i)\ngroupBy(list, .Bar)\ngroupBy(list, .Bar) ?? str\ngroupBy(list, .Bar).Bar\ngroupBy(list, .Bar).String\ngroupBy(list, .Bar).add\ngroupBy(list, .Bar).array\ngroupBy(list, .Bar).f64\ngroupBy(list, .Bar).greet\ngroupBy(list, .Bar).i\ngroupBy(list, .Bar).list\ngroupBy(list, .Bar)?.Bar\ngroupBy(list, .Bar)?.[f64]\ngroupBy(list, .Bar)?.[foo]\ngroupBy(list, .Bar)?.[ok]\ngroupBy(list, .Bar)?.[str]\ngroupBy(list, .Bar)?.f64\ngroupBy(list, .Bar)?.greet\ngroupBy(list, .Bar)?.i\ngroupBy(list, .Bar)?.ok\ngroupBy(list, .Bar)?.str\ngroupBy(list, 0 + 1)\ngroupBy(list, 0 == 1)\ngroupBy(list, 0).Bar\ngroupBy(list, 0).String\ngroupBy(list, 0).f64\ngroupBy(list, 0).foo\ngroupBy(list, 0).greet\ngroupBy(list, 0).i\ngroupBy(list, 0).list\ngroupBy(list, 0).str\ngroupBy(list, 0)?.Bar\ngroupBy(list, 0)?.String\ngroupBy(list, 0)?.[f64]\ngroupBy(list, 0)?.[foo]\ngroupBy(list, 0)?.[i]\ngroupBy(list, 0)?.[str]\ngroupBy(list, 0)?.add\ngroupBy(list, 0)?.array\ngroupBy(list, 0)?.f64\ngroupBy(list, 0)?.foo\ngroupBy(list, 0)?.greet\ngroupBy(list, 0)?.i\ngroupBy(list, 0)?.list\ngroupBy(list, 0)?.ok\ngroupBy(list, 0)?.str\ngroupBy(list, 0.1)\ngroupBy(list, 1 * 0)\ngroupBy(list, 1 * i)\ngroupBy(list, 1 not in array)\ngroupBy(list, 1).Bar\ngroupBy(list, 1).String\ngroupBy(list, 1).add\ngroupBy(list, 1).array\ngroupBy(list, 1).f64\ngroupBy(list, 1).foo\ngroupBy(list, 1).foobar\ngroupBy(list, 1).greet\ngroupBy(list, 1).i\ngroupBy(list, 1).str\ngroupBy(list, 1)?.Bar\ngroupBy(list, 1)?.String\ngroupBy(list, 1)?.[f64]\ngroupBy(list, 1)?.[foo]\ngroupBy(list, 1)?.[ok]\ngroupBy(list, 1)?.[str]\ngroupBy(list, 1)?.add\ngroupBy(list, 1)?.array\ngroupBy(list, 1)?.f64\ngroupBy(list, 1)?.foo\ngroupBy(list, 1)?.greet\ngroupBy(list, 1)?.i\ngroupBy(list, 1.0 > 1.0)?.[f64]\ngroupBy(list, 1.0 >= f64)\ngroupBy(list, 1.0 ?? foo)\ngroupBy(list, 1.0 ^ 1.0)\ngroupBy(list, 1.0) ?? list\ngroupBy(list, 1.0) | get(1)\ngroupBy(list, 1.0).String\ngroupBy(list, 1.0).add\ngroupBy(list, 1.0).array\ngroupBy(list, 1.0).f64\ngroupBy(list, 1.0).foo\ngroupBy(list, 1.0).foobar\ngroupBy(list, 1.0).greet\ngroupBy(list, 1.0).i\ngroupBy(list, 1.0).list\ngroupBy(list, 1.0).ok\ngroupBy(list, 1.0).str\ngroupBy(list, 1.0)?.Bar\ngroupBy(list, 1.0)?.String\ngroupBy(list, 1.0)?.[f64]\ngroupBy(list, 1.0)?.[foo]\ngroupBy(list, 1.0)?.[i]\ngroupBy(list, 1.0)?.[ok]\ngroupBy(list, 1.0)?.[str]\ngroupBy(list, 1.0)?.add\ngroupBy(list, 1.0)?.array\ngroupBy(list, 1.0)?.f64\ngroupBy(list, 1.0)?.foo\ngroupBy(list, 1.0)?.greet\ngroupBy(list, 1.0)?.i\ngroupBy(list, 1.0)?.list\ngroupBy(list, 1.0)?.ok\ngroupBy(list, 1.0)?.str\ngroupBy(list, abs(1))\ngroupBy(list, add != add)\ngroupBy(list, array | sum(1))\ngroupBy(list, bitor(i, i))\ngroupBy(list, ceil(0))\ngroupBy(list, f64 - 1.0)\ngroupBy(list, f64)\ngroupBy(list, f64).Bar\ngroupBy(list, f64).String\ngroupBy(list, f64).add\ngroupBy(list, f64).array\ngroupBy(list, f64).f64\ngroupBy(list, f64).foo\ngroupBy(list, f64).greet\ngroupBy(list, f64).i\ngroupBy(list, f64).list\ngroupBy(list, f64).ok\ngroupBy(list, f64)?.Bar\ngroupBy(list, f64)?.[f64]\ngroupBy(list, f64)?.[foo]\ngroupBy(list, f64)?.[i]\ngroupBy(list, f64)?.[ok]\ngroupBy(list, f64)?.[str]\ngroupBy(list, f64)?.add\ngroupBy(list, f64)?.array\ngroupBy(list, f64)?.f64\ngroupBy(list, f64)?.foo\ngroupBy(list, f64)?.greet\ngroupBy(list, f64)?.i\ngroupBy(list, f64)?.list\ngroupBy(list, f64)?.ok\ngroupBy(list, f64)?.str\ngroupBy(list, false).Bar\ngroupBy(list, false).String\ngroupBy(list, false).add\ngroupBy(list, false).array\ngroupBy(list, false).f64\ngroupBy(list, false).foo\ngroupBy(list, false).foobar\ngroupBy(list, false).greet\ngroupBy(list, false).i\ngroupBy(list, false).list\ngroupBy(list, false).str\ngroupBy(list, false)?.String\ngroupBy(list, false)?.[f64]\ngroupBy(list, false)?.[i]\ngroupBy(list, false)?.[i]?.[i]\ngroupBy(list, false)?.[ok]\ngroupBy(list, false)?.[str]\ngroupBy(list, false)?.add\ngroupBy(list, false)?.array\ngroupBy(list, false)?.f64\ngroupBy(list, false)?.greet\ngroupBy(list, false)?.i\ngroupBy(list, false)?.list\ngroupBy(list, false)?.ok\ngroupBy(list, false)?.str\ngroupBy(list, float(0))\ngroupBy(list, foo != foo)\ngroupBy(list, foo != nil)\ngroupBy(list, foo == #)\ngroupBy(list, foo == foo)\ngroupBy(list, foo ?? #)\ngroupBy(list, foo)\ngroupBy(list, foo).Bar\ngroupBy(list, foo).String\ngroupBy(list, foo).add\ngroupBy(list, foo).array\ngroupBy(list, foo).f64\ngroupBy(list, foo).foo\ngroupBy(list, foo).foobar\ngroupBy(list, foo).greet\ngroupBy(list, foo).i\ngroupBy(list, foo).list\ngroupBy(list, foo).ok\ngroupBy(list, foo).str\ngroupBy(list, foo)?.Bar\ngroupBy(list, foo)?.String\ngroupBy(list, foo)?.[f64]\ngroupBy(list, foo)?.[foo]\ngroupBy(list, foo)?.[i]\ngroupBy(list, foo)?.[ok]\ngroupBy(list, foo)?.[str]\ngroupBy(list, foo)?.add\ngroupBy(list, foo)?.array\ngroupBy(list, foo)?.f64\ngroupBy(list, foo)?.foo\ngroupBy(list, foo)?.greet\ngroupBy(list, foo)?.i\ngroupBy(list, foo)?.list\ngroupBy(list, foo)?.ok\ngroupBy(list, foo)?.str\ngroupBy(list, foo.Bar)\ngroupBy(list, foo?.Bar)\ngroupBy(list, foo?.String())\ngroupBy(list, greet(.Bar))\ngroupBy(list, i + i)\ngroupBy(list, i == i)\ngroupBy(list, i)\ngroupBy(list, i).Bar\ngroupBy(list, i).String\ngroupBy(list, i).add\ngroupBy(list, i).array\ngroupBy(list, i).f64\ngroupBy(list, i).foo\ngroupBy(list, i).i\ngroupBy(list, i).list\ngroupBy(list, i).ok\ngroupBy(list, i).str\ngroupBy(list, i)?.Bar\ngroupBy(list, i)?.String\ngroupBy(list, i)?.[f64]\ngroupBy(list, i)?.[foo]\ngroupBy(list, i)?.[i]\ngroupBy(list, i)?.[ok]\ngroupBy(list, i)?.[str]\ngroupBy(list, i)?.add\ngroupBy(list, i)?.array\ngroupBy(list, i)?.f64\ngroupBy(list, i)?.foo\ngroupBy(list, i)?.greet\ngroupBy(list, i)?.i\ngroupBy(list, i)?.list\ngroupBy(list, i)?.ok\ngroupBy(list, i)?.str\ngroupBy(list, if false { # } else { #.Bar })\ngroupBy(list, if true { # } else { false })\ngroupBy(list, nil != 0)\ngroupBy(list, nil == $env)\ngroupBy(list, nil == 1.0)\ngroupBy(list, nil == true)\ngroupBy(list, nil ?? #)\ngroupBy(list, none($env, true))\ngroupBy(list, ok and ok)\ngroupBy(list, ok)\ngroupBy(list, ok).String\ngroupBy(list, ok).add\ngroupBy(list, ok).array\ngroupBy(list, ok).f64\ngroupBy(list, ok).foo\ngroupBy(list, ok).i\ngroupBy(list, ok).list\ngroupBy(list, ok).ok\ngroupBy(list, ok).ok?.[i]\ngroupBy(list, ok).str\ngroupBy(list, ok)?.Bar\ngroupBy(list, ok)?.String\ngroupBy(list, ok)?.[f64]\ngroupBy(list, ok)?.[foo]\ngroupBy(list, ok)?.[i]\ngroupBy(list, ok)?.[ok]\ngroupBy(list, ok)?.add\ngroupBy(list, ok)?.f64\ngroupBy(list, ok)?.foo\ngroupBy(list, ok)?.greet\ngroupBy(list, ok)?.i\ngroupBy(list, ok)?.list\ngroupBy(list, ok)?.ok\ngroupBy(list, ok)?.str\ngroupBy(list, reduce(list, false)).ok\ngroupBy(list, str == nil)\ngroupBy(list, str ?? true)\ngroupBy(list, str)\ngroupBy(list, str).Bar\ngroupBy(list, str).String\ngroupBy(list, str).add\ngroupBy(list, str).array\ngroupBy(list, str).f64\ngroupBy(list, str).foo\ngroupBy(list, str).greet\ngroupBy(list, str).i\ngroupBy(list, str).list\ngroupBy(list, str).ok\ngroupBy(list, str).str\ngroupBy(list, str)?.Bar\ngroupBy(list, str)?.String\ngroupBy(list, str)?.[f64]\ngroupBy(list, str)?.[foo]\ngroupBy(list, str)?.[i]\ngroupBy(list, str)?.[ok]\ngroupBy(list, str)?.[str]\ngroupBy(list, str)?.add\ngroupBy(list, str)?.f64\ngroupBy(list, str)?.foo\ngroupBy(list, str)?.foobar\ngroupBy(list, str)?.greet\ngroupBy(list, str)?.i\ngroupBy(list, str)?.list\ngroupBy(list, str)?.ok\ngroupBy(list, string(#))\ngroupBy(list, string(add)).str\ngroupBy(list, string(false))\ngroupBy(list, sum(array))\ngroupBy(list, toJSON(list))\ngroupBy(list, toJSON(ok))\ngroupBy(list, trimSuffix(str))\ngroupBy(list, true ?? str)\ngroupBy(list, true).Bar\ngroupBy(list, true).String\ngroupBy(list, true).add\ngroupBy(list, true).array\ngroupBy(list, true).f64\ngroupBy(list, true).foo\ngroupBy(list, true).greet\ngroupBy(list, true).i\ngroupBy(list, true).list\ngroupBy(list, true).ok\ngroupBy(list, true)?.Bar\ngroupBy(list, true)?.String\ngroupBy(list, true)?.[f64]\ngroupBy(list, true)?.[i]\ngroupBy(list, true)?.[ok]\ngroupBy(list, true)?.[str]\ngroupBy(list, true)?.add\ngroupBy(list, true)?.array\ngroupBy(list, true)?.f64\ngroupBy(list, true)?.greet\ngroupBy(list, true)?.list\ngroupBy(list, true)?.ok\ngroupBy(list, true)?.str\ngroupBy(list, type(0))\ngroupBy(list, type(1.0))?.i\ngroupBy(list, type(foo))\ngroupBy(map($env, 1.0), f64)\ngroupBy(map($env, 1.0), sum(array))\ngroupBy(map($env, foo), min(1.0))\ngroupBy(map(array, list), $env?.[str])\ngroupBy(map(list, #index), #)\ngroupBy(reverse(array), # <= 1)\ngroupBy(reverse(array), foo)\ngroupBy(reverse(array), i + f64)\ngroupBy(reverse(array), ok)\ngroupBy(sort($env), # != .array)\ngroupBy(sort($env), #.Bar)\ngroupBy(sort($env), #.add not contains str)\ngroupBy(sort($env), #.foo.str)\ngroupBy(sort($env), #.greet)\ngroupBy(sort($env), #.greet?.[i])\ngroupBy(sort($env), #.list.Bar(1.0))\ngroupBy(sort($env), 1.0 <= .array)\ngroupBy(sort($env), 1.0 | min(#.f64, str))\ngroupBy(sort($env), i)\ngroupBy(sort($env), max(#))\ngroupBy(sort(array), foo)\ngroupBy(str ?? $env, toJSON(false))\ngroupBy(str ?? 1, foo)\ngroupBy(str ?? add, str)\ngroupBy(str ?? f64, # ^ #)\ngroupBy(str ?? foo, str)\ngroupBy(str ?? i, f64)\ngroupBy(toPairs($env), 1 <= 1.0)\ngroupBy(values($env), foo)\ngroupBy(values($env), i)\ngroupBy(values($env), str)\nhasPrefix(str, foo?.String())\nhasPrefix(str, str)\nhasPrefix(str, string(i))\nhasSuffix(foo.Bar, str)\nhasSuffix(foo.String(), str)\nhasSuffix(str, greet(str))\nhasSuffix(str, str)\nhasSuffix(string(1), str)\nhasSuffix(string(nil), foo?.Bar)\ni\ni != $env != $env\ni != $env != true\ni != $env && false\ni != $env ?? 1.0\ni != $env ?? f64\ni != $env ?? str\ni != $env and false\ni != $env || $env\ni != $env.f64\ni != $env.i\ni != $env?.$env?.list(add, nil)\ni != $env?.Bar\ni != $env?.Bar?.[f64]\ni != $env?.Bar?.[greet]\ni != $env?.String\ni != $env?.[Bar]\ni != $env?.[Bar]?.[i]\ni != $env?.[String]\ni != $env?.[String]?.[array]\ni != $env?.[foobar]\ni != $env?.[str]\ni != $env?.f64\ni != $env?.foobar\ni != $env?.i\ni != $env?.true\ni != $env?.true?.str()\ni != -0\ni != -1.0\ni != -f64\ni != 0 != $env\ni != 0 - 1.0 + 1.0\ni != 0 == ok\ni != 0 == true != true\ni != 0 ?? i\ni != 0 ^ 0\ni != 0 or $env\ni != 0 or ok\ni != 0 or true\ni != 0 || $env\ni != 1 && ok\ni != 1 / 1\ni != 1 == nil\ni != 1 ?? list\ni != 1 ^ f64\ni != 1 or ok\ni != 1.0 != $env\ni != 1.0 && str not endsWith str\ni != 1.0 * 1.0\ni != 1.0 * array?.[i]\ni != 1.0 ** 0\ni != 1.0 ** 1.0\ni != 1.0 + 1.0\ni != 1.0 + i\ni != 1.0 - 1.0\ni != 1.0 == false\ni != 1.0 == nil\ni != 1.0 == ok\ni != 1.0 == true\ni != 1.0 ?: $env\ni != 1.0 ?? false\ni != 1.0 ?? nil\ni != 1.0 ^ i\ni != 1.0 and false\ni != 1.0 or $env\ni != 1.0 || $env\ni != abs(f64)\ni != abs(i)\ni != add ?? [foo]\ni != add ?? i\ni != array?.[i]\ni != f64\ni != f64 && $env\ni != f64 && false\ni != f64 && true\ni != f64 + 1.0\ni != f64 + f64\ni != f64 ^ i\ni != f64 and $env\ni != false ?? list\ni != first($env)\ni != float(1.0)\ni != floor(0)\ni != floor(1)\ni != floor(1.0)\ni != floor(i)\ni != foo ?? greet\ni != foo ?? list\ni != i\ni != i != $env.ok\ni != i * f64\ni != i ?: greet\ni != i ?? 1.0\ni != i ^ 0 || true\ni != int(i)\ni != last($env)\ni != len($env)\ni != list ?? str\ni != max(1.0)\ni != mean(f64)\ni != median(1.0)\ni != min($env)\ni != min(0)\ni != min(i)\ni != nil != $env\ni != nil != false\ni != nil != ok\ni != nil && ok\ni != nil or ok\ni != sum(array)\ni != {foo: foo}.foo\ni % $env.i\ni % $env?.i\ni % -1\ni % -i\ni % 1 != 1.0\ni % 1 * f64\ni % 1 - 1\ni % 1 <= i\ni % 1 == i\ni % 1 > 0\ni % add(i, i)\ni % array?.[i]\ni % i\ni % i != $env\ni % i - 1\ni % i < i\ni % i <= 1\ni % i <= 1.0\ni % i == i ^ i\ni % i > 1.0\ni % len(str)\ni % min(i)\ni % nil ?? i\ni % sum(array)\ni * $env or true\ni * $env || true\ni * $env.f64\ni * $env.i\ni * $env?.f64\ni * $env?.i\ni * - - f64\ni * -1\ni * -1.0\ni * -i\ni * 0 != f64\ni * 0 != nil\ni * 0 + i\ni * 0 - i\ni * 0 == i\ni * 0 ?? i\ni * 0 | min(array)\ni * 1 != 0\ni * 1 != 1.0\ni * 1 % i\ni * 1 - i\ni * 1 < f64\ni * 1 | bitshl(i)\ni * 1.0 != 1.0\ni * 1.0 != nil\ni * 1.0 * 1.0\ni * 1.0 * f64\ni * 1.0 * i\ni * 1.0 + 1.0\ni * 1.0 + f64\ni * 1.0 - i\ni * 1.0 < 1\ni * 1.0 < i / 0\ni * 1.0 <= 0\ni * 1.0 <= 1.0\ni * 1.0 == $env?.[String]\ni * 1.0 == 0\ni * 1.0 ?? str\ni * 1.0 | min(i)\ni * abs(i)\ni * array?.[i]\ni * f64\ni * f64 ** 1\ni * f64 + f64\ni * f64 / f64\ni * f64 == i\ni * f64 ?? nil\ni * f64 ^ f64\ni * f64 ^ i\ni * floor(0)\ni * floor(f64)\ni * i\ni * i != i\ni * i % i\ni * i ** 1.0\ni * i / 1.0\ni * i / i\ni * i <= i\ni * i == $env\ni * i == 0\ni * i > i\ni * i ?? list\ni * i in array\ni * i | median(1)\ni * int(0)\ni * int(1.0)\ni * len(array)\ni * len(str)\ni * max(i)\ni * mean(array)\ni * mean(i)\ni * median(f64)\ni * median(i)\ni * min(0, f64)\ni * min(i)\ni * round(1.0)\ni * sum($env, 0)\ni * sum(array)\ni ** $env.f64\ni ** $env.i\ni ** $env?.f64\ni ** $env?.i\ni ** -0\ni ** -1.0\ni ** -f64\ni ** -i\ni ** 0 != nil\ni ** 0 - abs(i)\ni ** 0 in array\ni ** 1 != $env\ni ** 1 + i\ni ** 1 <= 1\ni ** 1 > 1.0\ni ** 1 ?? true\ni ** 1 ^ 1.0\ni ** 1.0 != i\ni ** 1.0 ** i\ni ** 1.0 + 1.0\ni ** 1.0 - 1\ni ** 1.0 - i\ni ** 1.0 / i\ni ** 1.0 == $env\ni ** 1.0 == nil\ni ** 1.0 >= f64 <= f64\ni ** 1.0 ?? foo\ni ** 1.0 ?? list\ni ** 1.0 ^ 1\ni ** 1.0 ^ i\ni ** 1.0 | max(1)\ni ** abs(1.0)\ni ** array?.[i]\ni ** bitshl(1, 0)\ni ** ceil(f64)\ni ** count($env, true)\ni ** f64\ni ** f64 * 1.0\ni ** f64 + 0\ni ** f64 < 1\ni ** f64 == nil\ni ** f64 ^ i\ni ** float(1.0)\ni ** float(i)\ni ** floor(f64)\ni ** i\ni ** i ** 1.0\ni ** i + f64\ni ** i / 1.0\ni ** i < 1\ni ** i == 1.0\ni ** i > 0\ni ** i >= i\ni ** i ^ 1\ni ** i | max(array, i)\ni ** int(i)\ni ** len($env)\ni ** len(list)\ni ** max(0)\ni ** max(1)\ni ** mean(1, array)\ni ** min(0)\ni ** min(1)\ni ** min(1.0)\ni ** min(1.0, array)\ni ** min(array)\ni ** min(f64)\ni ** nil ?? 1\ni ** sum($env, 1.0)\ni ** sum($env?.[str])\ni ** sum(array)\ni + $env != str || true\ni + $env.f64\ni + $env.i\ni + $env?.f64\ni + $env?.i\ni + -1\ni + -i\ni + 0 ** f64\ni + 0 - 0\ni + 0 - i\ni + 0 / 1\ni + 0 <= 1.0\ni + 0 ?? i\ni + 0 ?? ok\ni + 0 ?? true\ni + 1 != 1\ni + 1 != 1.0\ni + 1 - 1.0\ni + 1 .. i\ni + 1 < 0\ni + 1 ^ $env.f64\ni + 1 in array\ni + 1 | min(1.0, 1.0)\ni + 1.0 != nil\ni + 1.0 * len(array)\ni + 1.0 ** f64\ni + 1.0 - 1\ni + 1.0 < f64\ni + 1.0 < i\ni + 1.0 <= 1.0\ni + 1.0 == f64\ni + 1.0 > 1.0\ni + 1.0 >= 1.0 && $env\ni + 1.0 ?? $env\ni + 1.0 ?? false\ni + 1.0 ?? nil\ni + abs(1)\ni + abs(1.0)\ni + abs(i)\ni + array?.[i]\ni + bitnot(0)\ni + ceil($env.i)\ni + ceil(0)\ni + f64\ni + f64 != nil\ni + f64 ** i\ni + f64 <= i\ni + f64 > 1.0\ni + f64 ?? nil < 1.0\ni + first(array)\ni + float(1)\ni + float(1.0)\ni + floor(1.0)\ni + floor(i)\ni + i\ni + i ** f64\ni + i .. i\ni + i / 0\ni + i <= i\ni + i == $env\ni + i > 1.0\ni + i > i <= 0\ni + i | add(1)\ni + i | bitand(0)\ni + len($env)\ni + len(str)\ni + max(1)\ni + max(array)\ni + max(array, array)\ni + max(f64)\ni + max(i)\ni + mean(0)\ni + mean(1)\ni + mean(1.0)\ni + mean(i)\ni + reduce(list, 1.0)\ni + sum(array)\ni + sum(list, 0)\ni - $env and false and ok\ni - $env.f64\ni - $env.i\ni - $env?.f64\ni - $env?.i\ni - -0\ni - -1.0\ni - -f64\ni - -i\ni - 0 != 1.0\ni - 0 % i\ni - 0 * 1.0\ni - 0 ** 1\ni - 0 ** 1.0\ni - 0 ** f64\ni - 0 ** i\ni - 0 / 1.0\ni - 0 == f64\ni - 0 >= 0\ni - 0 | mean(1.0)\ni - 1 ** 1.0 ^ 1\ni - 1 / f64\ni - 1 < i\ni - 1 ?? array\ni - 1 ?? nil\ni - 1 ^ f64\ni - 1 in array\ni - 1.0 != $env?.String\ni - 1.0 != 1.0\ni - 1.0 * 0\ni - 1.0 ** 1.0\ni - 1.0 ** i\ni - 1.0 + 1\ni - 1.0 - 1.0\ni - 1.0 < 0\ni - 1.0 < f64\ni - 1.0 <= 0\ni - 1.0 <= f64\ni - 1.0 == $env\ni - 1.0 == i\ni - 1.0 > f64\ni - 1.0 >= 1\ni - 1.0 >= f64\ni - 1.0 ?? list\ni - 1.0 ^ i\ni - 1.0 ^ round(f64)\ni - 1.0 not in array\ni - 1.0 | min(1.0)\ni - array?.[0]\ni - array?.[i]\ni - ceil(0)\ni - ceil(1)\ni - ceil(1.0)\ni - f64\ni - f64 != 1\ni - f64 != 1.0\ni - f64 - i\ni - f64 >= f64\ni - f64 >= i\ni - f64 ^ 1.0 == 0\ni - f64 in array\ni - float(f64)\ni - floor(1.0)\ni - floor(f64)\ni - floor(i)\ni - i\ni - i != 1.0\ni - i != i\ni - i % i < 0\ni - i ** i\ni - i + i\ni - i / i\ni - i < f64\ni - i == 1.0\ni - i > 0\ni - i >= i\ni - i ?? $env\ni - i ?? array\ni - i ^ 1.0\ni - i not in $env?.String\ni - i | min(array)\ni - i..i\ni - int(0)\ni - int(1.0)\ni - len(array)\ni - len(list)\ni - max(1.0)\ni - max(array)\ni - mean(1.0)\ni - median(array, 1)\ni - min(0)\ni - min(1)\ni - min(1.0)\ni - min(f64)\ni - min(i)\ni - nil ?? f64\ni - reduce($env, #acc, i)\ni - reduce(array, #index)\ni - sum($env, f64)\ni .. $env.i\ni .. $env?.i\ni .. -i\ni .. 0 != $env\ni .. 0 * i\ni .. 0 == list\ni .. 0 ?? $env\ni .. 0 ?? list\ni .. 0 | all($env[.Bar:])\ni .. 0 | count($env)\ni .. 0 | groupBy($env)\ni .. 0 | groupBy(greet)\ni .. 0 | map(#)\ni .. 0 | median(f64)\ni .. 0 | reduce(#, $env)\ni .. 0 | sum(1)\ni .. 0 | sum(foo)\ni .. 0 | sum(str)\ni .. 1 - i\ni .. 1 ?? f64\ni .. 1 | filter(false)\ni .. 1 | groupBy(#)\ni .. 1 | groupBy(1.0)\ni .. 1 | map(#)\ni .. 1 | reduce(true)\ni .. 1 | sortBy(#)\ni .. 1 | sortBy(1)\ni .. 1 | sortBy(foo.Bar)\ni .. 1.0 ?? i\ni .. 1.0 ?? list\ni .. abs(i)\ni .. array?.[i]\ni .. bitnot(1)\ni .. f64 * 1.0 ?? 0\ni .. f64 ?? array\ni .. f64 ?? true\ni .. i\ni .. i != nil\ni .. i % 1\ni .. i ?? 1.0\ni .. i | filter(ok)\ni .. i | groupBy(#)\ni .. i | map(#)\ni .. i | reduce(#)\ni .. i | reduce($env)\ni .. i | reduce(1.0)\ni .. i | reduce(false)\ni .. i | reduce(foo)\ni .. i | sortBy(1)\ni .. i | sortBy(false)\ni .. int(0)\ni .. len(array)\ni .. max(0)\ni .. max(i)\ni .. median(i)\ni .. min(1)\ni .. sum(array)\ni / $env.f64\ni / $env.i\ni / $env?.f64\ni / $env?.i\ni / -0\ni / -1\ni / -1.0\ni / -f64\ni / -i\ni / 0 + f64 == i\ni / 0 - f64\ni / 0 < 1\ni / 0 <= i\ni / 0 == 1.0\ni / 0 not in array\ni / 1 != i\ni / 1 * i\ni / 1 ** f64\ni / 1 + f64\ni / 1 / 1\ni / 1 ?? foo\ni / 1 not in array\ni / 1 | median(f64, 1.0)\ni / 1.0 != 1\ni / 1.0 != 1.0\ni / 1.0 * ceil(1.0)\ni / 1.0 ** i\ni / 1.0 + f64\ni / 1.0 - 0\ni / 1.0 - f64\ni / 1.0 / i\ni / 1.0 < 0\ni / 1.0 < i\ni / 1.0 <= 1.0\ni / 1.0 > 1.0\ni / 1.0 ?? 1\ni / 1.0 ?? add\ni / 1.0 ?? foo\ni / 1.0 ?? greet\ni / 1.0 ?? list\ni / 1.0 ?? str\ni / 1.0 in array\ni / abs(1.0)\ni / array?.[i]\ni / bitnot(0)\ni / ceil(0)\ni / count(array, false)\ni / f64\ni / f64 * 1.0\ni / f64 / 1.0\ni / f64 < 1.0\ni / f64 == $env\ni / f64 > i\ni / f64 ?? 1\ni / f64 ^ i\ni / f64 in list ?? str\ni / float(1)\ni / floor(1.0)\ni / i\ni / i ** f64\ni / i + 1.0\ni / i < 0\ni / i < f64 ?? foo\ni / i <= 0\ni / i == 1.0\ni / i == i\ni / i == nil\ni / i ?? add\ni / i in array\ni / len($env)\ni / mean(1.0, 1.0)\ni / median(1)\ni / median(1.0)\ni / min(i)\ni / nil ?? i\ni / reduce(array, 0)\ni / sum(array)\ni / sum(list, f64)\ni < $env && false\ni < $env || true\ni < $env.f64\ni < $env.i\ni < $env?.f64\ni < $env?.i\ni < -0\ni < -f64\ni < -i\ni < 0 != ok\ni < 0 && false\ni < 0 / i\ni < 0 < i\ni < 0 <= f64\ni < 0 > 0\ni < 0 ?? $env?.[Bar]\ni < 0 and ok\ni < 0 || $env\ni < 1 != $env\ni < 1 ** i\ni < 1 + 1.0\ni < 1 / 1.0\ni < 1 < f64\ni < 1 <= $env?.[foo]\ni < 1 <= 1\ni < 1 <= sum($env, #)\ni < 1 ? array : add\ni < 1 ?? foo\ni < 1 ?? i\ni < 1 ?? nil\ni < 1 || $env\ni < 1.0 != nil\ni < 1.0 != ok\ni < 1.0 * f64\ni < 1.0 ** 0\ni < 1.0 / i\ni < 1.0 < $env?.f64\ni < 1.0 < 0\ni < 1.0 < 1.0\ni < 1.0 < i\ni < 1.0 <= 1\ni < 1.0 <= 1.0\ni < 1.0 <= f64\ni < 1.0 == $env\ni < 1.0 == nil\ni < 1.0 == true\ni < 1.0 > 1.0\ni < 1.0 ?? 0\ni < 1.0 ?? greet\ni < 1.0 || ok\ni < abs(1)\ni < abs(1.0)\ni < abs(i)\ni < array?.[i]\ni < bitnot(i)\ni < ceil(1.0)\ni < ceil(f64)\ni < f64\ni < f64 != ok\ni < f64 != true\ni < f64 ** ceil(1.0)\ni < f64 + 1.0\ni < f64 < 0\ni < f64 < f64 < i\ni < f64 == $env\ni < f64 >= $env\ni < f64 ? 1 : foo\ni < f64 or $env\ni < f64 || true\ni < findIndex($env, ok)\ni < first(array)\ni < float(0)\ni < float(i)\ni < floor(0)\ni < floor(f64)\ni < i\ni < i + i\ni < i / 0\ni < i <= i\ni < i == $env\ni < i >= i\ni < i ^ 0\ni < i || $env\ni < int(0)\ni < len($env)\ni < max(array)\ni < max(f64)\ni < mean(0, array)\ni < min(1.0)\ni < reduce(array, 1.0)\ni < round(1.0)\ni < sum(array)\ni < sum(array, 1.0)\ni <= $env.f64\ni <= $env.i\ni <= $env?.f64\ni <= $env?.i\ni <= -0\ni <= -1.0\ni <= -f64\ni <= 0 && $env\ni <= 0 * i\ni <= 0 + f64\ni <= 0 < $env\ni <= 0 >= 0\ni <= 0 >= f64\ni <= 0 ?? 0\ni <= 0 ?? nil\ni <= 0 and $env\ni <= 0 or false\ni <= 1 / 1\ni <= 1 / 1.0\ni <= 1 == nil\ni <= 1 >= 1\ni <= 1 || ok\ni <= 1.0 && ok\ni <= 1.0 * i\ni <= 1.0 - 1.0\ni <= 1.0 / f64\ni <= 1.0 / i\ni <= 1.0 < 0\ni <= 1.0 < f64\ni <= 1.0 <= 1\ni <= 1.0 == nil\ni <= 1.0 > 1.0\ni <= 1.0 > i\ni <= 1.0 ?? greet\ni <= 1.0 ^ i\ni <= 1.0 or $env\ni <= 1.0 or ok\ni <= 1.0 || $env.ok\ni <= 1.0 || ok\ni <= abs(f64)\ni <= array?.[i]\ni <= bitnot(1)\ni <= ceil(1.0)\ni <= f64\ni <= f64 * 1.0\ni <= f64 < 1.0\ni <= f64 > $env\ni <= f64 and false\ni <= f64 and true\ni <= f64 in $env?.String\ni <= f64 || $env\ni <= float(i)\ni <= floor(0)\ni <= floor(1)\ni <= floor(1.0)\ni <= i\ni <= i && true\ni <= i + i\ni <= i - 0\ni <= i / 1\ni <= i <= 1\ni <= i == nil\ni <= i >= i\ni <= i ?: add\ni <= i ?? f64\ni <= i ^ i\ni <= len(array)\ni <= max(1)\ni <= max(1.0)\ni <= max(array)\ni <= mean(1.0)\ni <= mean(i)\ni <= mean(i, i)\ni <= median(1.0)\ni <= median(array)\ni <= nil ?? 1.0\ni <= round(0)\ni <= sum(array, #)\ni == $env != $env\ni == $env != ok\ni == $env && ok\ni == $env == $env\ni == $env ? array : array\ni == $env ?: 1.0\ni == $env ?: f64\ni == $env ?? 0 ?? array\ni == $env ?? array\ni == $env and $env?.[String]\ni == $env and nil == 1.0\ni == $env || false\ni == $env.f64\ni == $env.i\ni == $env?.Bar\ni == $env?.String\ni == $env?.String?.[f64]?.foo\ni == $env?.[Bar]\ni == $env?.[Bar]?.String()\ni == $env?.[Bar]?.add\ni == $env?.[String]\ni == $env?.[foobar]\ni == $env?.[str]\ni == $env?.f64\ni == $env?.false?.[str]\ni == $env?.foobar\ni == $env?.i\ni == -0 ** 0\ni == -1\ni == -1.0\ni == -i\ni == 0 != ok\ni == 0 ** i\ni == 0 + i\ni == 0 - 1.0\ni == 0 - f64 && false\ni == 0 ?: $env\ni == 0 or $env\ni == 0 or ok\ni == 0 || $env\ni == 1 != false\ni == 1 && true\ni == 1 * 0\ni == 1 ** 1.0\ni == 1 - 1.0\ni == 1 / f64\ni == 1 / max(array)\ni == 1 == false\ni == 1 ?? 0\ni == 1 ?? true\ni == 1 ^ i\ni == 1 and true\ni == 1 || ok\ni == 1.0 != $env\ni == 1.0 != ok ?: foo\ni == 1.0 != true\ni == 1.0 * 1.0\ni == 1.0 ** 1.0\ni == 1.0 + 1.0\ni == 1.0 - 1\ni == 1.0 == nil\ni == 1.0 == true\ni == 1.0 ?? 1.0\ni == 1.0 ?? foo\ni == 1.0 ?? nil\ni == 1.0 ^ 1\ni == 1.0 ^ 1.0\ni == 1.0 || $env\ni == 1.0 || max($env)\ni == abs(f64)\ni == abs(i)\ni == add ?? ok\ni == array?.[i]\ni == bitnot(1)\ni == bitor(1, 0)\ni == ceil(1.0)\ni == count(list, false)\ni == f64\ni == f64 != $env\ni == f64 && $env\ni == f64 * 0\ni == f64 * 1\ni == f64 * f64\ni == f64 / f64\ni == f64 ? f64 : foo\ni == f64 ?: array\ni == f64 ?? foo\ni == float(1.0)\ni == floor(1)\ni == floor(i)\ni == foo ?? 1\ni == foo ?? ok\ni == i\ni == i + $env?.i\ni == i + 0\ni == i + f64\ni == i == $env\ni == i == nil\ni == i ?? 1.0\ni == i ?? false\ni == i ^ 0\ni == i ^ 1.0\ni == i or $env\ni == int(1.0)\ni == int(i)\ni == len(array)\ni == len(list)\ni == len(str)\ni == list ?? 1\ni == list ?? str\ni == max(array)\ni == max(i)\ni == mean(1.0)\ni == median(f64)\ni == min($env)\ni == min(f64)\ni == nil == $env\ni == nil ? $env?.[i] : list\ni == nil ?: foo\ni == nil ?? $env\ni == nil ?? 1\ni == nil or false\ni == nil || $env\ni == ok ?? 0\ni == round(1)\ni == round(f64)\ni == sum(array)\ni == sum(array, 1.0)\ni == true ?? add\ni > $env.f64\ni > $env.i\ni > $env?.f64\ni > $env?.i\ni > -1.0\ni > 0 + 1\ni > 0 + i\ni > 0 / f64\ni > 0 <= 1.0\ni > 0 == nil\ni > 0 > 1.0\ni > 0 > f64\ni > 0 ?: ok\ni > 0 and $env\ni > 0 or false\ni > 0.0\ni > 1 && ok\ni > 1 * 0\ni > 1 * f64\ni > 1 - 0\ni > 1 - 1.0\ni > 1 < 1.0\ni > 1 == ok\ni > 1 >= $env\ni > 1 >= $env[:0]\ni > 1 >= 0\ni > 1 ?? 1.0\ni > 1 or ok\ni > 1 || $env\ni > 1.0\ni > 1.0 ** 0\ni > 1.0 ** f64\ni > 1.0 - $env?.i\ni > 1.0 - 1\ni > 1.0 / 1\ni > 1.0 / i\ni > 1.0 < $env\ni > 1.0 < $env == nil\ni > 1.0 < -$env\ni > 1.0 == $env\ni > 1.0 == ok\ni > 1.0 > $env\ni > 1.0 > 1.0\ni > 1.0 >= 1.0\ni > 1.0 ?: array\ni > 1.0 ?? f64\ni > 1.0 ?? nil\ni > 1.0 or $env\ni > 1.0 or ok\ni > abs(i)\ni > array?.[i]\ni > ceil(1)\ni > ceil(1.0)\ni > f64\ni > f64 != nil\ni > f64 != ok\ni > f64 && $env\ni > f64 ** i\ni > f64 + 1\ni > f64 / 1.0\ni > f64 <= i\ni > f64 >= 1\ni > f64 >= 1.0\ni > f64 ?? $env.foo\ni > f64 ?? i\ni > find(array, ok)\ni > float(0)\ni > floor(1)\ni > floor(1.0)\ni > get(array, 0)\ni > i\ni > i ** f64\ni > i + 0\ni > i - 1.0\ni > i <= 1\ni > i ?? greet\ni > i and $env\ni > last(array)\ni > len($env)\ni > max(1.0)\ni > max(i)\ni > mean(1.0)\ni > median(f64)\ni > min(0)\ni > min(i)\ni > round(-1.0)\ni > sum(array)\ni >= $env or true\ni >= $env || true\ni >= $env.f64\ni >= $env.i\ni >= $env?.f64\ni >= $env?.i\ni >= -1\ni >= -f64\ni >= -i\ni >= 0 != nil\ni >= 0 != ok\ni >= 0 - f64\ni >= 0 - i\ni >= 0 / max(1.0)\ni >= 0 <= i\ni >= 0 >= 1\ni >= 0 >= f64\ni >= 0 >= i\ni >= 0 ^ 1\ni >= 0 ^ f64\ni >= 0 or $env\ni >= 0 || $env\ni >= 0.0\ni >= 1 && ok\ni >= 1 ** f64\ni >= 1 - 1.0\ni >= 1 < f64\ni >= 1 > 1.0\ni >= 1 ?? $env?.[add]\ni >= 1 and $env\ni >= 1 and $env?.[str]\ni >= 1.0 != $env\ni >= 1.0 != nil\ni >= 1.0 && true\ni >= 1.0 * 0\ni >= 1.0 ** i\ni >= 1.0 + 1.0\ni >= 1.0 + i\ni >= 1.0 - sum($env, 0)\ni >= 1.0 ?? 1.0\ni >= 1.0 ^ i\ni >= 1.0 and $env\ni >= 1.0 or $env\ni >= 1.0 or false\ni >= abs(1)\ni >= array?.[i]\ni >= ceil(0)\ni >= f64\ni >= f64 != $env\ni >= f64 * 0\ni >= f64 * 1\ni >= f64 * 1.0\ni >= f64 ** f64\ni >= f64 ** i\ni >= f64 + 1\ni >= f64 - 0\ni >= f64 < i\ni >= f64 > 1.0\ni >= f64 ?? foo\ni >= f64 ?? ok\ni >= f64 and $env\ni >= f64 || $env\ni >= float(1)\ni >= float(1.0)\ni >= float(f64)\ni >= floor(i)\ni >= i\ni >= i != $env\ni >= i != ok\ni >= i * 0\ni >= i ** 0\ni >= i - i\ni >= i / 1.0\ni >= i ?? list\ni >= i ?? nil == nil\ni >= i || $env\ni >= i || false\ni >= int(1)\ni >= int(1.0)\ni >= last(array)\ni >= max(array)\ni >= mean(1.0)\ni >= mean(f64)\ni >= median(0)\ni >= median(1.0)\ni >= median(array)\ni >= min(1)\ni >= min(1.0)\ni >= min(array)\ni >= reduce($env, 0, 0)\ni >= round(f64)\ni >= round(i)\ni >= sum(array)\ni ?? !$env\ni ?? !ok\ni ?? !true\ni ?? $env.add\ni ?? $env.array\ni ?? $env.f64\ni ?? $env.foo\ni ?? $env.greet\ni ?? $env.i\ni ?? $env.list\ni ?? $env.ok\ni ?? $env.str\ni ?? $env?.Bar\ni ?? $env?.Bar()\ni ?? $env?.String\ni ?? $env?.String()\ni ?? $env?.String(foobar, foobar startsWith foobar?.list)\ni ?? $env?.String?.[i]\ni ?? $env?.[Bar]\ni ?? $env?.[String]\ni ?? $env?.[add]\ni ?? $env?.[array]\ni ?? $env?.[f64]\ni ?? $env?.[f64].str\ni ?? $env?.[foo]\ni ?? $env?.[foobar and foobar]\ni ?? $env?.[foobar]\ni ?? $env?.[greet]\ni ?? $env?.[i.f64]\ni ?? $env?.[i]\ni ?? $env?.[i].Bar()\ni ?? $env?.[list | median(true)]\ni ?? $env?.[list]\ni ?? $env?.[list]?.[list]\ni ?? $env?.[list]?.str()\ni ?? $env?.[ok]\ni ?? $env?.[str]\ni ?? $env?.add\ni ?? $env?.array\ni ?? $env?.f64\ni ?? $env?.foo\ni ?? $env?.foobar\ni ?? $env?.foobar?.[list]\ni ?? $env?.i\ni ?? $env?.list\ni ?? $env?.ok\ni ?? $env?.str\ni ?? $env?.true.foobar\ni ?? $env[$env.greet():]\ni ?? $env[:find(i, #acc)]\ni ?? $env[:foobar]\ni ?? $env[add:]\ni ?? $env[any(foo, i):]\ni ?? $env[f64?.String():]\ni ?? $env[false:foobar]\ni ?? $env[find(f64, 1.0):]?.[f64]\ni ?? $env[foo:foobar]\ni ?? $env[foobar:]\ni ?? $env[nil:1]\ni ?? -$env\ni ?? -0\ni ?? -1.0\ni ?? -abs($env?.String(foobar))?.ok\ni ?? -i\ni ?? 0 ?? foo\ni ?? 0 ?? nil\ni ?? 1.0 ?? $env.greet\ni ?? 1.0 ?? ok\ni ?? 1.0 ?? str\ni ?? 1.0 | bitand(0)\ni ?? 1.0 | max(0)\ni ?? [1.0]\ni ?? [false]\ni ?? [nil]\ni ?? [ok]\ni ?? abs($env - $env)?.[f64]\ni ?? abs($env)\ni ?? add\ni ?? add ?? 1\ni ?? all($env, #.add)\ni ?? array\ni ?? array ?? ok\ni ?? array?.[i]\ni ?? bitand(i, $env)\ni ?? ceil(i)\ni ?? count(array)\ni ?? count(list)\ni ?? date(false)\ni ?? date(foo)\ni ?? date(foo, array)\ni ?? date(nil)\ni ?? date(true, true)\ni ?? f64\ni ?? f64 ?? nil\ni ?? false ?? str\ni ?? findLast($env, .f64)\ni ?? findLastIndex($env, #)\ni ?? findLastIndex($env, $env)\ni ?? first($env)\ni ?? first(array)\ni ?? foo\ni ?? foo ?? foo\ni ?? foo | bitshl(0)\ni ?? foo | get(true)\ni ?? foo.Bar\ni ?? foo.String\ni ?? foo.String()\ni ?? foo?.Bar\ni ?? foo?.String\ni ?? foo?.String()\ni ?? fromBase64(str)\ni ?? fromJSON($env)\ni ?? fromPairs($env)\ni ?? greet\ni ?? greet ?? f64\ni ?? greet($env - 1.0)\ni ?? greet($env)\ni ?? greet(str)\ni ?? groupBy($env, i)\ni ?? hasSuffix($env, $env)\ni ?? i\ni ?? i ?? add\ni ?? join($env)\ni ?? list\ni ?? list ?? f64\ni ?? list ?? ok\ni ?? list?.[i]\ni ?? map($env, 0)\ni ?? map($env, 1)\ni ?? max($env)\ni ?? max(1.0)\ni ?? max(array)\ni ?? max(array)?.[f64]\ni ?? median(f64)\ni ?? median(list, list)\ni ?? min($env)\ni ?? nil ?? $env\ni ?? not $env\ni ?? not $env?.String(false)\ni ?? not $env?.[greet]\ni ?? not false\ni ?? not true\ni ?? ok\ni ?? ok ?? greet\ni ?? reduce(array, #acc)\ni ?? reduce(array, ok)\ni ?? round(0)\ni ?? sort(array)\ni ?? sortBy(list, #)\ni ?? str\ni ?? string(1)\ni ?? string(1.0)\ni ?? string(list)\ni ?? string(str)\ni ?? sum($env)\ni ?? sum($env, #.greet)\ni ?? sum($env, array)\ni ?? sum(array, #)\ni ?? sum(array, $env)\ni ?? sum(list)\ni ?? sum(list)?.String\ni ?? toBase64(str)\ni ?? toJSON(1.0)\ni ?? toJSON(ok)\ni ?? true ?? i\ni ?? true | get(0)\ni ?? type(greet)\ni ?? upper($env)\ni ?? {foo: 0}\ni ?? {foo: 1, foo: nil, foo: nil}\ni ?? {foo: 1.0}\ni ?? {foo: array}\ni ?? {foo: foo, foo: greet}.Bar\ni ?? {foo: foo}\ni ?? {foo: list}\ni ?? {foo: nil, foo: str}\ni ?? {foo: true}\ni ^ $env.f64\ni ^ $env.i\ni ^ $env?.f64\ni ^ $env?.i\ni ^ -1\ni ^ -1.0\ni ^ -f64\ni ^ -i\ni ^ 0 != 1.0\ni ^ 0 * abs(1)\ni ^ 0 + 1\ni ^ 0 < 1.0\ni ^ 0 < i\ni ^ 0 > f64\ni ^ 0 not in array\ni ^ 1 != $env\ni ^ 1 - f64\ni ^ 1 < i\ni ^ 1 == 0\ni ^ 1 >= i\ni ^ 1 | median(1, i, 0)\ni ^ 1.-0\ni ^ 1.0 != $env\ni ^ 1.0 != i\ni ^ 1.0 != nil\ni ^ 1.0 - 0\ni ^ 1.0 - 1\ni ^ 1.0 / i\ni ^ 1.0 < 1\ni ^ 1.0 < 1.0\ni ^ 1.0 < f64\ni ^ 1.0 <= 0\ni ^ 1.0 == 0\ni ^ 1.0 > 0\ni ^ 1.0 > 1.0\ni ^ 1.0 > f64\ni ^ 1.0 > i\ni ^ 1.0 > max(0)\ni ^ 1.0 ?? 1.0\ni ^ 1.0 ?? add\ni ^ 1.0 | max(0)\ni ^ abs(0)\ni ^ array?.[i]\ni ^ bitnot(1)\ni ^ ceil(1)\ni ^ ceil(1.0)\ni ^ count($env, false)\ni ^ f64\ni ^ f64 * 0\ni ^ f64 ** f64\ni ^ f64 + i\ni ^ f64 == $env\ni ^ f64 == 1\ni ^ f64 == float(1.0)\ni ^ f64 >= 1\ni ^ f64 ?? 1\ni ^ f64 ^ 1.0\ni ^ findIndex($env, true)\ni ^ findIndex(array, true)\ni ^ first(array)\ni ^ float(1.0)\ni ^ floor(1)\ni ^ floor(1.0)\ni ^ i\ni ^ i != f64\ni ^ i * i\ni ^ i / f64\ni ^ i < i\ni ^ i == nil\ni ^ i > f64\ni ^ i >= i\ni ^ i ?? $env?.i\ni ^ i ?? array\ni ^ i ^ 0 ?? list\ni ^ i ^ 1.0\ni ^ i in array\ni ^ i not in array\ni ^ int(1)\ni ^ int(1.0)\ni ^ int(i)\ni ^ len($env)\ni ^ max(array)\ni ^ mean(1.0)\ni ^ mean(array)\ni ^ mean(f64)\ni ^ median(1.0)\ni ^ min(0)\ni ^ min(1.0)\ni ^ min(i)\ni ^ sum(array)\ni in $env and false\ni in $env.array\ni in $env?.Bar\ni in $env?.Bar?.[list]\ni in $env?.String\ni in $env?.[Bar]\ni in $env?.[String]\ni in $env?.[String]?.foo\ni in $env?.[foobar?.[list]]\ni in $env?.array\ni in $env?.nil\ni in [0]\ni in array\ni in array != $env\ni in array ?? ok\ni in array and $env\ni in array and ok\ni in array or ok\ni in concat(array)\ni in concat(list, list)\ni in flatten(list)\ni in groupBy(list, #)?.i\ni in i .. 0\ni in last($env)\ni in list ?? str\ni in map($env, f64)\ni in sort(array)\ni in toPairs($env)\ni in {foo: 1.0}.greet\ni in {foo: nil}?.greet\ni not in $env or true\ni not in $env.array\ni not in $env?.Bar\ni not in $env?.String\ni not in $env?.[Bar]\ni not in $env?.[Bar]?.array\ni not in $env?.[String]\ni not in $env?.[String]?.[list]\ni not in $env?.[String]?.str\ni not in $env?.[foobar]\ni not in $env?.array\ni not in $env?.foobar?.[i]\ni not in $env?.nil?.[add]\ni not in 1 .. i\ni not in [1.0]\ni not in [1]\ni not in [true, nil]\ni not in array\ni not in array == ok\ni not in array == true\ni not in concat(array)\ni not in flatten(array)\ni not in flatten(list)\ni not in groupBy(array, #)\ni not in groupBy(list, i)\ni not in last($env)\ni not in map(list, 1)\ni not in map(list, f64)\ni not in values($env)\ni | add(0)\ni | add(0) ?? foo\ni | add(1)\ni | add(i)\ni | bitand(0)\ni | bitand(1)\ni | bitand(1) + i\ni | bitand(i)\ni | bitnand(0)\ni | bitnand(1)\ni | bitnand(array?.[i])\ni | bitnand(i)\ni | bitor(0)\ni | bitor(1 % 1)\ni | bitor(1)\ni | bitor(i)\ni | bitor(sum(array))\ni | bitshl($env.i)\ni | bitshl(0)\ni | bitshl(1)\ni | bitshl(i)\ni | bitshl(sum(array))\ni | bitshr(0)\ni | bitshr(0) != 1.0 || false\ni | bitshr(1)\ni | bitshr(i)\ni | bitushr(0)\ni | bitushr(1)\ni | bitushr(i)\ni | bitxor(0)\ni | bitxor(1)\ni | bitxor(i)\ni | max($env.i)\ni | max(0)\ni | max(0, 1.0)\ni | max(1)\ni | max(1.0)\ni | max(1.0, array)\ni | max(1.0, f64)\ni | max(array)\ni | max(array, 0)\ni | max(array, 1)\ni | max(f64)\ni | max(f64, 0)\ni | max(f64, f64)\ni | max(i)\ni | max(i, array)\ni | mean(0 / 1.0)\ni | mean(0)\ni | mean(0, array, 0)\ni | mean(1)\ni | mean(1, array)\ni | mean(1.0)\ni | mean(array)\ni | mean(f64 * 1)\ni | mean(f64)\ni | mean(f64, 1)\ni | mean(i)\ni | mean(i, f64)\ni | median(0)\ni | median(0, 0)\ni | median(0, 1.0)\ni | median(0, array, array)\ni | median(1)\ni | median(1) / f64\ni | median(1, 1)\ni | median(1, f64)\ni | median(1.0)\ni | median(1.0, 0)\ni | median(1.0, 1)\ni | median(1.0, i)\ni | median(array)\ni | median(f64)\ni | median(i)\ni | median(i) != f64\ni | median(i, 1.0)\ni | median(i, i)\ni | min(0)\ni | min(0) <= i\ni | min(0) | median(1.0)\ni | min(0, array)\ni | min(0, f64)\ni | min(1)\ni | min(1.0 ?? add)\ni | min(1.0)\ni | min(1.0, 0)\ni | min(array)\ni | min(array, f64)\ni | min(array, i, f64)\ni | min(f64)\ni | min(f64, 1)\ni | min(f64, array)\ni | min(i)\ni | min(i, 1)\ni | min(i, 1.0)\ni..array?.[i]\ni..i\ni..i - 0\ni..i == $env\ni..i == nil\ni..i | map(#)\ni..i | map(ok)\ni..i | reduce(foo)\ni..i | sortBy(ok)\ni; 1.0; $env.foo\ni; add\ni; array\ni; ceil(1.0)\ni; f64\ni; foo\ni; greet\ni; i\ni; i; greet(str)\ni; list\ni; str\ni; {foo: false}\nif $env != f64 { add } else { foo }\nif $env != foo { greet } else { str }\nif $env == 1.0 { list } else { add }\nif $env?.ok { foo?.String } else { greet }\nif $env?.ok { greet } else { foo }\nif 0 > 1 { list } else { false ? ok : ok }\nif 0 > f64 { f64 } else { array }\nif 1.0 != $env { ok } else { $env <= $env }\nif 1.0 >= 0 { foo } else { ok }\nif array == $env { i } else { median(0) }\nif f64 > 1.0 { array } else { round(1.0) }\nif f64 not in array { map(list, list) } else { add }\nif foo == foo { true != true } else { list | groupBy(1) }\nif i < 0 { str } else { str }\nif i > $env?.i { greet } else { list }\nif nil != nil { $env | bitshl(i) } else { 0 != $env }\nif nil != str { greet } else { array }\nif nil == nil { greet } else { array }\nif nil == ok { ok } else { greet }\nif nil not in list { array } else { f64 }\nif ok or false { str } else { greet }\nif ok { $env.foo } else { foo.Bar }\nif ok { 0 != i } else { ok }\nif ok { 1 > 1.0 } else { f64 }\nif ok { 1.0 ?? 0 } else { $env != $env }\nif ok { add } else { add }\nif ok { add } else { array }\nif ok { add } else { f64 }\nif ok { add } else { foo != $env }\nif ok { add } else { foo }\nif ok { add } else { greet }\nif ok { add } else { i }\nif ok { add } else { ok }\nif ok { array } else { foo }\nif ok { array } else { foo?.Bar }\nif ok { array } else { i }\nif ok { array } else { str }\nif ok { ceil(i) } else { list }\nif ok { f64 } else { array }\nif ok { f64 } else { f64 }\nif ok { f64 } else { findLastIndex($env, $env) }\nif ok { f64 } else { foo }\nif ok { f64 } else { list }\nif ok { f64 } else { ok }\nif ok { false && true } else { false == nil }\nif ok { foo } else { $env ?: f64 }\nif ok { foo } else { $env?.str }\nif ok { foo } else { f64 }\nif ok { foo } else { foo }\nif ok { foo } else { greet }\nif ok { foo } else { i }\nif ok { foo } else { ok }\nif ok { foo.Bar } else { 1 == 1.0 }\nif ok { greet } else { array }\nif ok { greet } else { f64 }\nif ok { greet } else { greet }\nif ok { greet } else { i }\nif ok { greet } else { str }\nif ok { i } else { $env | filter($env) }\nif ok { i } else { add }\nif ok { i } else { array }\nif ok { i } else { date($env) }\nif ok { i } else { str }\nif ok { i } else { type(nil) }\nif ok { list } else { i }\nif ok { list } else { nil == true }\nif ok { list } else { ok }\nif ok { list } else { str }\nif ok { nil == false } else { greet }\nif ok { ok } else { $env.add }\nif ok { ok } else { add }\nif ok { ok } else { array }\nif ok { ok } else { date(1.0) }\nif ok { ok } else { foo }\nif ok { ok } else { greet }\nif ok { ok } else { ok }\nif ok { str } else { array }\nif ok { str } else { foo }\nif ok { str } else { i }\nif ok { str } else { list }\nif ok { str } else { ok }\nif ok { str } else { str }\nif ok { type(f64) } else { foo }\nif str == $env { foo?.String() } else { $env.foo }\nif str > str { str } else { find(array, ok) }\nif true != true { i } else { array }\nif true && ok { array } else { greet }\nindexOf($env?.[str], str)\nindexOf($env?.str, $env?.str)\nindexOf(str, str)\nindexOf(toJSON(1.0), toJSON(true))\nint($env | count(ok))\nint($env | findIndex(ok))\nint($env | findIndex(true))\nint($env | findLastIndex(true))\nint($env | reduce(1, f64))\nint($env | sum(f64))\nint($env | sum(i))\nint($env.f64)\nint($env.i)\nint($env?.f64)\nint($env?.i)\nint(-$env?.i)\nint(-0)\nint(-1)\nint(-1.0)\nint(-f64)\nint(-i)\nint(0 % 1)\nint(0 % i)\nint(0 * 1)\nint(0 * 1.0)\nint(0 * f64)\nint(0 * i)\nint(0 ** 0)\nint(0 ** 1)\nint(0 ** 1.0)\nint(0 + 1)\nint(0 + 1.0)\nint(0 + f64)\nint(0 - $env.i)\nint(0 - 1.0)\nint(0 - f64)\nint(0 - i)\nint(0 / 0)\nint(0 / 1)\nint(0 / 1.0)\nint(0 / i)\nint(0 ?? 0)\nint(0 ?? 1)\nint(0 ?? 1.0)\nint(0 ?? array)\nint(0 ?? list)\nint(0 ?? true)\nint(0 ^ 0)\nint(0 ^ 1.0)\nint(0 ^ i)\nint(0 | bitshl(0))\nint(0 | bitshr(i))\nint(0 | bitxor(i))\nint(0 | min(1.0, 1))\nint(0) % count(array, true)\nint(0) * i\nint(0) + i\nint(0) - i\nint(0) .. i\nint(0) == i\nint(0) > 0 + i\nint(0) > 1.0 > 1\nint(0) ^ i\nint(0) | bitshl(0)\nint(0) | mean(i)\nint(0) | median(array)\nint(0)..i\nint(0.0)\nint(1 % 1)\nint(1 * 0)\nint(1 * 1.0)\nint(1 * i)\nint(1 ** 1.0)\nint(1 ** f64)\nint(1 ** i)\nint(1 + f64)\nint(1 - 0)\nint(1 - 1)\nint(1 - 1.0)\nint(1 - f64)\nint(1 - i)\nint(1 / 1.0)\nint(1 / f64)\nint(1 ?? 1)\nint(1 ?? 1.0)\nint(1 ?? add)\nint(1 ?? false)\nint(1 ?? foo)\nint(1 ?? ok)\nint(1 ?? true)\nint(1 ^ 0)\nint(1 ^ 1.0)\nint(1 ^ f64)\nint(1 ^ i)\nint(1 | bitxor(i))\nint(1 | max(i))\nint(1 | median(f64))\nint(1) != i\nint(1) * f64\nint(1) - f64\nint(1) <= f64\nint(1) == f64\nint(1) == i\nint(1) ?? add\nint(1) ?? str\nint(1) ^ f64\nint(1) not in array\nint(1.0 * 1)\nint(1.0 * 1.0)\nint(1.0 * f64)\nint(1.0 ** 0)\nint(1.0 ** 1.0)\nint(1.0 ** f64)\nint(1.0 ** i)\nint(1.0 + 0)\nint(1.0 + 1)\nint(1.0 + 1.0)\nint(1.0 + f64)\nint(1.0 + i)\nint(1.0 - 0)\nint(1.0 - 1)\nint(1.0 - 1.0)\nint(1.0 - f64)\nint(1.0 / 0)\nint(1.0 / 1)\nint(1.0 / 1.0)\nint(1.0 / f64)\nint(1.0 / i)\nint(1.0 ?? $env)\nint(1.0 ?? 0)\nint(1.0 ?? 1.0)\nint(1.0 ?? add)\nint(1.0 ?? array)\nint(1.0 ?? f64)\nint(1.0 ?? foo)\nint(1.0 ?? foo?.Bar)\nint(1.0 ?? i)\nint(1.0 ?? list)\nint(1.0 ?? nil)\nint(1.0 ?? ok)\nint(1.0 ?? str)\nint(1.0 ?? true)\nint(1.0 ^ 0)\nint(1.0 ^ 1)\nint(1.0 ^ 1.0)\nint(1.0 ^ f64)\nint(1.0 ^ i)\nint(1.0 | median(1))\nint(1.0 | min(f64))\nint(1.0)\nint(1.0) != 1.0 ^ i\nint(1.0) != f64\nint(1.0) != i\nint(1.0) * f64\nint(1.0) * i\nint(1.0) ** f64\nint(1.0) ** i\nint(1.0) + i / 1\nint(1.0) .. i\nint(1.0) / i\nint(1.0) < f64\nint(1.0) == f64\nint(1.0) == i\nint(1.0) > 1 > 1.0\nint(1.0) >= f64\nint(1.0) ?? foo\nint(1.0) ?? greet\nint(1.0) ?? greet($env)\nint(1.0) in array\nint(1.0) | bitushr(i)\nint(1.0) | median(array)\nint(1.0)..i\nint(abs(0))\nint(abs(1))\nint(abs(1.0))\nint(abs(f64))\nint(abs(i))\nint(array | count(false))\nint(array | count(ok))\nint(array | find(not false))\nint(array | max(f64, array, 0))\nint(array | median(f64, i))\nint(array | min(1.0))\nint(array | reduce(#))\nint(array | reduce(#index))\nint(array | reduce(0))\nint(array | sum(#))\nint(array | sum(0))\nint(array?.[1])\nint(array?.[i])\nint(bitnot(0))\nint(bitnot(1))\nint(bitnot(i))\nint(bitshr(0, i))\nint(ceil($env?.i))\nint(ceil(0))\nint(ceil(1))\nint(ceil(1.0))\nint(ceil(f64))\nint(ceil(i))\nint(count($env, true))\nint(count(list, false))\nint(count(list, ok))\nint(f64 * 0)\nint(f64 * 1)\nint(f64 * 1.0)\nint(f64 * f64)\nint(f64 ** 1)\nint(f64 ** i)\nint(f64 + 1.0)\nint(f64 + i)\nint(f64 - 0)\nint(f64 - 1)\nint(f64 - 1.0)\nint(f64 - f64)\nint(f64 - i)\nint(f64 / 0)\nint(f64 / 1)\nint(f64 / 1.0)\nint(f64 ?? $env)\nint(f64 ?? 0)\nint(f64 ?? 1.0)\nint(f64 ?? false)\nint(f64 ?? foo)\nint(f64 ?? i)\nint(f64 ^ 0)\nint(f64 ^ 1.0)\nint(f64 ^ f64)\nint(f64 ^ i)\nint(f64 | mean(i))\nint(f64 | min(1.0))\nint(f64)\nint(f64) != f64\nint(f64) / i\nint(f64) <= ceil(1.0)\nint(f64) <= f64\nint(f64) == i\nint(f64) in array\nint(f64) not in array ?? nil\nint(f64)..i\nint(false ?: 1.0)\nint(findIndex(array, true))\nint(findIndex(list, ok))\nint(findLast(array, true))\nint(findLastIndex($env, ok))\nint(findLastIndex(list, true))\nint(first(array))\nint(float(0))\nint(float(1))\nint(float(1.0))\nint(float(f64))\nint(float(i))\nint(floor(1))\nint(floor(1.0))\nint(floor(f64))\nint(floor(i))\nint(i % i)\nint(i * i)\nint(i ** 1)\nint(i ** 1.0)\nint(i ** i)\nint(i + 0)\nint(i + 1)\nint(i + 1.0)\nint(i + f64)\nint(i - 1)\nint(i - 1.0)\nint(i - f64)\nint(i - i)\nint(i / 0)\nint(i / 1.0)\nint(i / i)\nint(i ?? 1.0)\nint(i ?? add)\nint(i ?? false)\nint(i ?? foo)\nint(i ?? i)\nint(i ?? nil)\nint(i ^ 1.0)\nint(i | bitxor(1))\nint(i)\nint(i) != f64\nint(i) * i\nint(i) ** f64\nint(i) .. i\nint(i) < i\nint(i) == sum(array)\nint(i) ?? array\nint(i) ?? foo\nint(i) ?? foo ?? list\nint(i) | min(array)\nint(if ok { 1 } else { f64 })\nint(if true { 1.0 } else { $env })\nint(int(0))\nint(int(1))\nint(int(1.0))\nint(int(f64))\nint(int(i))\nint(last(array))\nint(len($env))\nint(len(0 .. i))\nint(len(array))\nint(len(list))\nint(len(str))\nint(let foobar = 1.0; foobar)\nint(list | findLastIndex(ok))\nint(list | reduce(#index))\nint(list | reduce(0))\nint(list | reduce(1, false))\nint(list | reduce(1.0))\nint(list | reduce(i))\nint(list | sum(1))\nint(list | sum(f64))\nint(max(0))\nint(max(1))\nint(max(1.0))\nint(max(array))\nint(max(f64))\nint(max(i))\nint(mean(0))\nint(mean(1))\nint(mean(1.0))\nint(mean(1.0, f64))\nint(mean(array))\nint(median(0))\nint(median(1))\nint(median(1.0))\nint(median(array))\nint(median(f64))\nint(median(i))\nint(min(0))\nint(min(1))\nint(min(1.0))\nint(min(1.0, i))\nint(min(array))\nint(min(f64))\nint(min(i))\nint(min(i, array))\nint(nil ?? 0)\nint(nil ?? 1.0)\nint(nil ?? i)\nint(ok ? 1.0 : greet)\nint(ok ? f64 : list)\nint(reduce($env, 1.0, i))\nint(reduce(array, #))\nint(reduce(array, f64))\nint(reduce(list, 1.0))\nint(round(1))\nint(round(1.0))\nint(round(f64))\nint(round(i))\nint(string(0))\nint(string(1))\nint(string(1.0))\nint(string(i))\nint(sum($env, 0))\nint(sum($env, 1))\nint(sum($env, i))\nint(sum(array))\nint(sum(array, #))\nint(sum(array, f64))\nint(toJSON(0))\nint(toJSON(1))\nint(toJSON(1.0))\nint(toJSON(i))\nint(toPairs($env) | reduce(i))\nint(true ? 1 : array)\nint(true ? 1.0 : $env)\nint(true ? f64 : foo)\nint(true ? i : nil)\njoin($env | filter(false))\njoin([str])\njoin(array | map(str))\njoin(keys($env))\njoin(list | map(str))\njoin(map(list, #.Bar))\njoin(sort($env))\nkeys($env ?? 0)\nkeys($env ?? 1)\nkeys($env ?? 1.0)\nkeys($env ?? array)\nkeys($env ?? f64)\nkeys($env ?? false)\nkeys($env ?? foo)\nkeys($env ?? greet)\nkeys($env ?? nil)\nkeys($env ?? true)\nkeys($env | reduce($env, add))\nkeys($env) != array\nkeys($env) != foo ?? 1.0\nkeys($env) == foo ?? f64\nkeys($env) == list\nkeys($env) == nil && true\nkeys($env) | any(ok)\nkeys($env) | count(ok)\nkeys($env) | count(true)\nkeys($env) | filter(true)\nkeys($env) | find(false)\nkeys($env) | findLast(true)\nkeys($env) | findLastIndex(false)\nkeys($env) | groupBy(#)\nkeys($env) | groupBy($env?.i)\nkeys($env) | groupBy(sum(#))\nkeys($env) | map(#)\nkeys($env) | map(1)\nkeys($env) | map(1.0)\nkeys($env) | map(add)\nkeys($env) | map(f64)\nkeys($env) | map(greet)\nkeys($env) | map(str)\nkeys($env) | none(false)\nkeys($env) | one(false)\nkeys($env) | one(ok)\nkeys($env) | one(true)\nkeys($env) | reduce(#)\nkeys($env) | reduce(#index)\nkeys($env) | reduce($env)\nkeys($env) | reduce(1.0)\nkeys($env) | reduce(f64, ok)\nkeys($env) | reduce(greet, $env)\nkeys($env) | reduce(i)\nkeys($env) | reduce(ok)\nkeys($env) | sortBy(#)\nkeys($env) | sortBy(str)\nkeys($env)?.[i]\nkeys(array | reduce($env))\nkeys(groupBy(array, #))\nkeys(groupBy(array, 1))\nkeys(groupBy(array, 1.0))\nkeys(groupBy(array, false))\nkeys(groupBy(array, foo))\nkeys(groupBy(list, #))\nkeys(groupBy(list, #.Bar))\nkeys(groupBy(list, foo))\nkeys(groupBy(list, ok))\nkeys(if true { $env } else { str })\nkeys(list | groupBy(#))\nkeys(list | groupBy(1))\nkeys(max($env))\nkeys(min($env))\nkeys(nil ?? $env)\nkeys(reduce(list, $env))\nkeys({foo: $env})\nkeys({foo: 0})\nkeys({foo: 1, foo: 0})\nkeys({foo: 1, foo: false})\nkeys({foo: 1, foo: i})\nkeys({foo: 1.0})\nkeys({foo: 1})\nkeys({foo: add})\nkeys({foo: array, foo: i})\nkeys({foo: array})\nkeys({foo: f64})\nkeys({foo: false})\nkeys({foo: foo, foo: $env?.f64})\nkeys({foo: foo, foo: 0})\nkeys({foo: foo, foo: 1.0})\nkeys({foo: foo, foo: i})\nkeys({foo: foo})\nkeys({foo: greet, foo: $env})\nkeys({foo: greet})\nkeys({foo: i, foo: true})\nkeys({foo: i})\nkeys({foo: list})\nkeys({foo: nil, foo: 0})\nkeys({foo: nil})\nkeys({foo: ok, foo: str})\nkeys({foo: ok})\nkeys({foo: str, foo: $env})\nkeys({foo: str, foo: f64})\nkeys({foo: str, foo: nil})\nkeys({foo: str})\nkeys({foo: true, foo: $env})\nkeys({foo: true, foo: list})\nkeys({foo: true})\nlast($env ?? $env)\nlast($env ?? $env.greet)\nlast($env ?? 1)\nlast($env ?? 1.0)\nlast($env ?? false)\nlast($env ?? foo)\nlast($env ?? greet)\nlast($env ?? i)\nlast($env ?? nil)\nlast($env ?? str)\nlast($env | map(#index))\nlast($env | map(1))\nlast($env | map(add))\nlast($env | map(array))\nlast($env | map(f64))\nlast($env | map(foo))\nlast($env | map(greet))\nlast($env | map(ok))\nlast($env | reduce($env, add))\nlast($env) != array\nlast($env) != list\nlast($env) == i\nlast($env) == ok\nlast($env) contains foo.Bar\nlast($env) contains str\nlast($env) in array\nlast($env) matches foo?.Bar\nlast($env) not contains foo.Bar\nlast($env) not in array\nlast($env) not matches str\nlast($env) not startsWith str\nlast($env) startsWith str\nlast($env)?.Bar\nlast($env)?.Bar()\nlast($env)?.Bar()?.[f64]\nlast($env)?.Bar()?.foo\nlast($env)?.Bar()?.str()\nlast($env)?.Bar(foobar)\nlast($env)?.Bar?.[array]\nlast($env)?.Bar?.[i]\nlast($env)?.Bar?.greet\nlast($env)?.String\nlast($env)?.String()\nlast($env)?.String().add\nlast($env)?.String()?.ok\nlast($env)?.String(foobar)\nlast($env)?.String(greet)\nlast($env)?.String?.[add]\nlast($env)?.String?.[array]\nlast($env)?.[add]\nlast($env)?.[add].Bar\nlast($env)?.[add]?.String\nlast($env)?.[array]\nlast($env)?.[array].foo\nlast($env)?.[array].i\nlast($env)?.[f64]\nlast($env)?.[f64] == i\nlast($env)?.[f64].add()\nlast($env)?.[f64]?.[list]\nlast($env)?.[f64]?.f64(foobar, greet)\nlast($env)?.[f64]?.foo()\nlast($env)?.[foo]\nlast($env)?.[foo].Bar\nlast($env)?.[foo].list\nlast($env)?.[foo]?.foo\nlast($env)?.[greet]\nlast($env)?.[greet]?.[i]\nlast($env)?.[greet]?.[ok]\nlast($env)?.[greet]?.list\nlast($env)?.[i]\nlast($env)?.[list]\nlast($env)?.[list].greet\nlast($env)?.[list].ok\nlast($env)?.[ok]\nlast($env)?.[ok] != i\nlast($env)?.[ok].ok()\nlast($env)?.[str]\nlast($env)?.[str]?.[foo]\nlast($env)?.[str]?.i\nlast($env)?.[str]?.ok\nlast($env)?.[{foo: add}]\nlast($env)?.add\nlast($env)?.add()\nlast($env)?.add(f64)\nlast($env)?.add(foobar)\nlast($env)?.add.add()\nlast($env)?.add.i\nlast($env)?.add?.[ok]\nlast($env)?.add?.f64\nlast($env)?.array\nlast($env)?.array()\nlast($env)?.array.list()\nlast($env)?.array?.[add]\nlast($env)?.array?.[greet]\nlast($env)?.f64\nlast($env)?.f64($env?.[String])\nlast($env)?.f64()\nlast($env)?.f64() == array\nlast($env)?.f64(greet(foobar))\nlast($env)?.f64(list)\nlast($env)?.f64?.[list]\nlast($env)?.f64?.greet\nlast($env)?.false != 0\nlast($env)?.findLast(foo, foobar)\nlast($env)?.foo\nlast($env)?.foo()\nlast($env)?.foo()?.greet()\nlast($env)?.foo(String, foobar?.greet)\nlast($env)?.foo(add)\nlast($env)?.foo.String\nlast($env)?.foo?.[foo]\nlast($env)?.foo?.[greet]\nlast($env)?.foo?.array\nlast($env)?.foobar\nlast($env)?.foobar.str()\nlast($env)?.foobar?.[str]\nlast($env)?.foobar?.ok()\nlast($env)?.fromPairs(foobar, foobar)\nlast($env)?.greet\nlast($env)?.greet()\nlast($env)?.greet?.Bar\nlast($env)?.greet?.[add]\nlast($env)?.greet?.[foo].foo()\nlast($env)?.greet?.array\nlast($env)?.greet?.i\nlast($env)?.i\nlast($env)?.i()\nlast($env)?.i(foobar endsWith add)\nlast($env)?.i.Bar(foobar)\nlast($env)?.i.foo\nlast($env)?.i.foo(foobar, f64)\nlast($env)?.i?.greet\nlast($env)?.i?.i\nlast($env)?.int(String)\nlast($env)?.join(1.0)\nlast($env)?.list\nlast($env)?.list()\nlast($env)?.list(foobar)\nlast($env)?.list.array\nlast($env)?.list?.[list]\nlast($env)?.none(foobar)?.String()\nlast($env)?.ok\nlast($env)?.ok()\nlast($env)?.ok?.add\nlast($env)?.str\nlast($env)?.str()\nlast($env)?.str(foobar)\nlast($env)?.str?.[list]\nlast($env)?.str?.array?.[ok]\nlast($env)?.str?.foo\nlast($env)?.toJSON(str)\nlast($env.array)\nlast($env.list)\nlast($env?.$env)\nlast($env?.Bar)\nlast($env?.Bar)?.[add]\nlast($env?.Bar)?.[f64]\nlast($env?.Bar)?.[ok]\nlast($env?.Bar)?.add\nlast($env?.Bar)?.add()\nlast($env?.Bar?.String)\nlast($env?.Bar?.[list])\nlast($env?.Bar?.[ok])\nlast($env?.String)\nlast($env?.String)?.[ok]\nlast($env?.String)?.greet()\nlast($env?.String?.[add])\nlast($env?.String?.[f64])\nlast($env?.[Bar])\nlast($env?.[Bar])?.foo.add\nlast($env?.[Bar]?.[foo])\nlast($env?.[Bar]?.[str])\nlast($env?.[Bar]?.array)\nlast($env?.[String])\nlast($env?.[String])?.Bar\nlast($env?.[String])?.[add]\nlast($env?.[String])?.[foo]\nlast($env?.[String]?.[foo])\nlast($env?.[String]?.ok)\nlast($env?.[foobar])\nlast($env?.[foobar])?.String\nlast($env?.[foobar])?.[f64]\nlast($env?.[foobar])?.f64()\nlast($env?.[foobar]?.str)\nlast($env?.[nil])\nlast($env?.[str])\nlast($env?.array)\nlast($env?.false)\nlast($env?.false)?.[greet]\nlast($env?.foobar)\nlast($env?.foobar)?.ok\nlast($env?.foobar?.[greet])\nlast($env?.list)\nlast($env?.nil)\nlast($env?.true)\nlast(0 .. 0)\nlast(0 .. 1)\nlast(0 ?? 1.0)\nlast(0 ?? false)\nlast(0 ?? greet)\nlast(0 ?? str)\nlast(0 ?? true)\nlast(0..i)\nlast(1 .. 0)\nlast(1 .. 1)\nlast(1 .. i)\nlast(1 ?? foo)\nlast(1 ?? greet)\nlast(1.0 ?? $env)\nlast(1.0 ?? $env?.i)\nlast(1.0 ?? 0)\nlast(1.0 ?? array)\nlast(1.0 ?? false)\nlast(1.0 ?? foo)\nlast(1.0 ?? greet)\nlast(1.0 ?? true)\nlast(1.0 | min(array))\nlast([$env, true])\nlast([$env.ok, array])\nlast([$env])\nlast([$env]).i\nlast([0])\nlast([1, 0])\nlast([1, add])\nlast([1, nil])\nlast([1.0, str])\nlast([1.0])\nlast([1])\nlast([add, $env])\nlast([add, 1])\nlast([add])\nlast([array, 0])\nlast([array, false])\nlast([array])\nlast([f64])\nlast([false, 0])\nlast([false, foo])\nlast([false])\nlast([foo, $env])\nlast([foo, str])\nlast([foo])\nlast([greet, 1])\nlast([greet, false])\nlast([greet, nil])\nlast([greet])\nlast([i])\nlast([list])\nlast([nil])\nlast([ok])\nlast([str, $env])\nlast([str])\nlast([true, 1.0])\nlast(add ?? 1)\nlast(add ?? 1.0)\nlast(add ?? foo)\nlast(add ?? foo)?.add\nlast(add ?? true)\nlast(array ?? 0)\nlast(array ?? 1)\nlast(array ?? array)\nlast(array ?? greet)\nlast(array ?? i)\nlast(array ?? nil)\nlast(array ?? str)\nlast(array | map(#))\nlast(array | map(f64))\nlast(array | map(false))\nlast(array | map(foo))\nlast(array | map(list))\nlast(array | min(1.0))\nlast(array | reduce(#acc))\nlast(array | sortBy(1.0))\nlast(array)\nlast(array) != i\nlast(array) % i\nlast(array) >= i\nlast(array) ?? -0\nlast(array) ?? add\nlast(array) in array != false\nlast(array) | mean(1.0)\nlast(array[:])\nlast(array[:i])\nlast(concat(array))\nlast(concat(list))\nlast(f64 ?? $env)\nlast(f64 ?? add)?.f64()\nlast(f64 ?? false)\nlast(f64 ?? i)\nlast(f64 ?? list)\nlast(f64 ?? str)\nlast(false ? $env : $env)\nlast(false ? $env : greet)\nlast(false ? add : greet)\nlast(false ? false : 1)\nlast(false ? foo : greet)\nlast(false ?: $env)\nlast(false ?: add)\nlast(false ?? $env?.f64)\nlast(false ?? 1.0)\nlast(false ?? array)?.list()\nlast(false ?? str)\nlast(filter($env, false))\nlast(filter(array, true))\nlast(filter(list, false))\nlast(filter(list, true))\nlast(first($env))\nlast(first($env)?.[list])\nlast(first({foo: greet}?.list))\nlast(flatten(array))\nlast(flatten(list))\nlast(foo ?? $env)\nlast(foo ?? $env.greet)\nlast(foo ?? 0)\nlast(foo ?? 1.0)\nlast(foo ?? add)\nlast(foo ?? add)?.[array]\nlast(foo ?? array)\nlast(foo ?? f64)\nlast(foo ?? false)\nlast(foo ?? greet)\nlast(foo ?? i)\nlast(foo ?? ok)\nlast(foo ?? str)\nlast(foo ?? true)\nlast(greet ?? 1.0)\nlast(greet ?? foo)\nlast(greet ?? str)\nlast(greet ?? true)\nlast(groupBy(list, f64)?.[ok])\nlast(i ?? $env)\nlast(i ?? foo)\nlast(i ?? ok)\nlast(if false { $env } else { i })\nlast(if false { nil } else { list })\nlast(if ok { $env } else { 1 })\nlast(if ok { false } else { $env })\nlast(if ok { foo } else { true })\nlast(if ok { list } else { $env })\nlast(if ok { list } else { true })\nlast(if true { $env } else { 1.0 })\nlast(if true { 1.0 } else { 1 })\nlast(if true { add } else { ok })\nlast(if true { list } else { array })\nlast(if true { ok } else { 1.0 })\nlast(keys($env))\nlast(keys($env)) | all(ok)\nlast(last($env))\nlast(last($env)?.[list])\nlast(list ?? array)\nlast(list ?? greet)\nlast(list ?? true)\nlast(list | map(#))\nlast(list | map(#.Bar))\nlast(list | map(foo))\nlast(list | map(greet))\nlast(list | map(list))\nlast(list | map(ok))\nlast(list | map(str))\nlast(list | reduce(array))\nlast(list | reduce(array, foo))\nlast(list | sortBy(0))\nlast(list)\nlast(list) != $env != ok\nlast(list) == foo\nlast(list) ?? foo\nlast(list) in list\nlast(list).Bar\nlast(list).String\nlast(list).String()\nlast(list)?.Bar\nlast(list)?.String\nlast(list)?.String()\nlast(list[1:])\nlast(list[:1])\nlast(map($env, $env))\nlast(map($env, $env)).ok\nlast(map($env, 1))\nlast(map($env, 1.0))\nlast(map($env, f64))\nlast(map($env, foo))\nlast(map($env, greet))\nlast(map($env, str))\nlast(map(array, #))\nlast(map(array, false))\nlast(map(array, foo))\nlast(map(array, true))\nlast(map(list, #))\nlast(map(list, 1))\nlast(map(list, 1.0))\nlast(map(list, array))\nlast(map(list, foo))\nlast(map(list, i))\nlast(max($env))\nlast(max($env?.Bar))\nlast(max(0, array))\nlast(max(array))\nlast(mean(array))\nlast(median(array))\nlast(median(i, array))\nlast(min($env))\nlast(min(array))\nlast(min(array, 1.0))\nlast(min(if true { $env } else { f64 }))\nlast(nil ?? $env)\nlast(nil ?? array)\nlast(ok ? list : ok)\nlast(ok ? true : list)\nlast(ok ?? $env)\nlast(ok ?? 1)\nlast(ok ?? array)\nlast(ok ?? foo)\nlast(ok ?? i)\nlast(ok ?? str)\nlast(reduce(list, #acc))\nlast(reduce(list, $env))\nlast(reduce(list, list, foo))\nlast(reverse(array))\nlast(reverse(list))\nlast(sort($env))\nlast(sort(array))\nlast(sortBy(array, #))\nlast(sortBy(array, 0))\nlast(sortBy(array, f64))\nlast(sortBy(list, .Bar))\nlast(sortBy(list, 1.0))\nlast(sortBy(list, str))\nlast(str ?? 0)\nlast(str ?? false)\nlast(str ?? foo)\nlast(str ?? i)\nlast(toPairs($env))\nlast(true ? 1.0 : greet)\nlast(true ? array : 0)\nlast(true ? foo : array)\nlast(true ? list : 1)\nlast(true ? str : 1.0)\nlast(true ? true : array)\nlast(true ?: greet)\nlast(true ?? 0)\nlast(true ?? array)\nlast(true ?? f64)\nlast(true ?? foo)\nlast(true ?? list)\nlast(uniq(array))\nlast(uniq(list))\nlast(values($env))\nlast({foo: $env}.str)\nlast({foo: $env}?.foobar?.add)\nlast({foo: f64, foo: str}.foo)\nlast({foo: foo, foo: 1}?.[str])\nlast({foo: foo}.greet)\nlast({foo: ok, foo: foo}?.str)\nlast({foo: str}?.f64)\nlastIndexOf(foo.Bar, str)\nlastIndexOf(foo?.Bar, str)\nlastIndexOf(str, false ? $env : str)\nlastIndexOf(str, str)\nlastIndexOf(str, str) ?? ok\nlen($env ?? 0)\nlen($env ?? 1)\nlen($env ?? 1.0)\nlen($env ?? add)\nlen($env ?? false)\nlen($env ?? foo)\nlen($env ?? greet)\nlen($env ?? list)\nlen($env ?? nil)\nlen($env ?? ok)\nlen($env ?? str)\nlen($env | filter(false))\nlen($env | filter(ok))\nlen($env | filter(true))\nlen($env | get(str))\nlen($env | map(0))\nlen($env | map(1.0))\nlen($env | map(false))\nlen($env | map(foo))\nlen($env | map(i))\nlen($env | map(true))\nlen($env | reduce(str, i))\nlen($env) != f64\nlen($env) * i\nlen($env) ** int(f64)\nlen($env) + i\nlen($env) == $env || $env\nlen($env) == add ?? false\nlen($env) >= i\nlen($env) ?? add\nlen($env) ?? list\nlen($env) ^ 1.0 < f64\nlen($env) ^ max(f64)\nlen($env) ^ min(f64)\nlen($env) not in array\nlen($env) | bitand(1)\nlen($env.array | groupBy(1))\nlen($env.array)\nlen($env.list)\nlen($env.str)\nlen($env?.[str] | map(add))\nlen($env?.[str])\nlen($env?.array)\nlen($env?.list)\nlen($env?.str)\nlen(0 .. 0)\nlen(0 .. i)\nlen(1 .. 0)\nlen([$env, 1.0])\nlen([$env, add])\nlen([$env])\nlen([0, str])\nlen([0])\nlen([1.0, false, f64])\nlen([1.0])\nlen([1])\nlen([add, i])\nlen([add])\nlen([array, foo])\nlen([array])\nlen([f64, 0])\nlen([f64])\nlen([false])\nlen([foo, 1.0])\nlen([foo, 1])\nlen([foo, array])\nlen([foo, foo])\nlen([foo, i])\nlen([foo])\nlen([greet])\nlen([i, foo])\nlen([i])\nlen([list, f64])\nlen([list])\nlen([nil, 1])\nlen([nil, foo, add])\nlen([nil, nil])\nlen([nil])\nlen([ok, 1.0])\nlen([ok])\nlen([str, nil])\nlen([str])\nlen([true, list])\nlen([true])\nlen(array ?? 1)\nlen(array ?? 1.0)\nlen(array ?? array)\nlen(array ?? greet)\nlen(array ?? nil)\nlen(array | filter(false))\nlen(array | groupBy(#))\nlen(array | groupBy(1))\nlen(array | groupBy(1.0))\nlen(array | groupBy(false))\nlen(array | groupBy(true))\nlen(array | map(#))\nlen(array | map(1.0))\nlen(array | map(array))\nlen(array | map(f64))\nlen(array | map(foo))\nlen(array | reduce($env))\nlen(array | reduce(array, 0))\nlen(array | sortBy(#))\nlen(array)\nlen(array) % i\nlen(array) * i\nlen(array) - i\nlen(array) .. i\nlen(array) == nil && false\nlen(array) > findIndex(list, true)\nlen(array) | bitshr(1)\nlen(array[0:])\nlen(array[1:])\nlen(array[:0])\nlen(array[:1])\nlen(array[:i])\nlen(concat(array))\nlen(concat(list))\nlen(false ? array : list)\nlen(false ?: str)\nlen(filter($env, ok))\nlen(flatten(array))\nlen(flatten(list))\nlen(flatten(map($env, $env)))\nlen(foo.Bar)\nlen(foo.String())\nlen(foo?.Bar)\nlen(foo?.String())\nlen(greet(foo?.Bar))\nlen(greet(greet(str)))\nlen(greet(str))\nlen(groupBy(array, 0))\nlen(groupBy(array, 1.0))\nlen(groupBy(array, f64))\nlen(groupBy(array, false))\nlen(groupBy(array, foo))\nlen(groupBy(array, i))\nlen(groupBy(array, true))\nlen(groupBy(list, #))\nlen(groupBy(list, .Bar))\nlen(groupBy(list, foo))\nlen(groupBy(list, str))\nlen(i .. 0)\nlen(if true { str } else { nil })\nlen(keys($env))\nlen(let y = $env; y)\nlen(list ?? $env)\nlen(list ?? array)\nlen(list ?? f64)\nlen(list ?? foo)\nlen(list ?? list)\nlen(list ?? nil)\nlen(list ?? ok)\nlen(list ?? true)\nlen(list | filter(false))\nlen(list | filter(true))\nlen(list | groupBy(#))\nlen(list | groupBy(foo))\nlen(list | groupBy(str))\nlen(list | map(#))\nlen(list | map(#.String))\nlen(list | map($env))\nlen(list | map(1))\nlen(list | map(1.0))\nlen(list | map(false))\nlen(list | map(foo))\nlen(list | map(list))\nlen(list | map(str))\nlen(list | reduce(#.Bar))\nlen(list | reduce(.Bar))\nlen(list)\nlen(list) % i\nlen(list) ** i\nlen(list) < 1 and true\nlen(list) < i\nlen(list) <= i\nlen(list) == f64\nlen(list) > i\nlen(list) ^ f64\nlen(list) in $env?.array\nlen(list)..i\nlen(list[:0])\nlen(list[:1])\nlen(list[:])\nlen(lower(str))\nlen(map($env, #index))\nlen(map($env, 1))\nlen(map($env, 1.0))\nlen(map($env, add))\nlen(map($env, array))\nlen(map($env, f64))\nlen(map($env, foo))\nlen(map($env, greet))\nlen(map($env, i))\nlen(map($env, list))\nlen(map($env, str))\nlen(map(array, #))\nlen(map(array, $env))\nlen(map(array, 1))\nlen(map(array, foo))\nlen(map(array, list))\nlen(map(list, #))\nlen(map(list, #.String))\nlen(map(list, #index))\nlen(map(list, add))\nlen(map(list, f64))\nlen(map(list, true))\nlen(max($env))\nlen(min($env))\nlen(nil ?? array)\nlen(nil ?? str)\nlen(ok ? list : $env)\nlen(reduce($env, $env, 1))\nlen(reduce($env, array, 0))\nlen(reduce(array, $env))\nlen(reduce(array, array))\nlen(reduce(list, $env, foo))\nlen(reduce(list, list))\nlen(reduce(list, str, f64))\nlen(reverse(array))\nlen(reverse(list))\nlen(sort($env))\nlen(sort(array))\nlen(sortBy(list, #.Bar))\nlen(sortBy(list, .Bar))\nlen(sortBy(list, 1))\nlen(sortBy(list, i))\nlen(sortBy(list, str))\nlen(str ?? $env)\nlen(str ?? 1.0)\nlen(str ?? greet)\nlen(str ?? i)\nlen(str ?? list)\nlen(str ?? nil)\nlen(str ?? ok)\nlen(str ?? true)\nlen(str | trimSuffix(str))\nlen(str)\nlen(str) * i\nlen(str) + 1.0 - i\nlen(str) .. 0 | find($env)\nlen(str) .. i\nlen(str) / f64 ^ f64\nlen(str) <= i\nlen(str) == i\nlen(str) >= f64\nlen(str) ?? add\nlen(str) ^ f64\nlen(str) | bitnand(1)\nlen(str) | bitor(1)\nlen(str) | mean(i)\nlen(str) | median(1.0)\nlen(str) | min(1.0)\nlen(str[0:])\nlen(str[1:])\nlen(str[:1])\nlen(string($env))\nlen(string(0))\nlen(string(1))\nlen(string(1.0))\nlen(string(add))\nlen(string(array))\nlen(string(f64))\nlen(string(false))\nlen(string(foo))\nlen(string(greet))\nlen(string(i))\nlen(string(list))\nlen(string(nil))\nlen(string(ok))\nlen(string(str))\nlen(string(true))\nlen(toBase64(str))\nlen(toJSON($env.ok))\nlen(toJSON(0))\nlen(toJSON(1))\nlen(toJSON(1.0))\nlen(toJSON(array))\nlen(toJSON(f64))\nlen(toJSON(false))\nlen(toJSON(foo))\nlen(toJSON(i))\nlen(toJSON(list))\nlen(toJSON(nil))\nlen(toJSON(ok))\nlen(toJSON(str))\nlen(toJSON(true != false))\nlen(toJSON(true))\nlen(toPairs($env))\nlen(trim(str))\nlen(trimPrefix(str))\nlen(trimSuffix(str))\nlen(type($env))\nlen(type(0))\nlen(type(1))\nlen(type(1.0))\nlen(type(add))\nlen(type(array))\nlen(type(f64))\nlen(type(false))\nlen(type(foo))\nlen(type(greet))\nlen(type(i))\nlen(type(list))\nlen(type(nil))\nlen(type(ok))\nlen(type(str))\nlen(type(true))\nlen(uniq(array))\nlen(uniq(list))\nlen(upper(str))\nlen(values($env))\nlen({foo: $env ?? $env})\nlen({foo: $env, foo: $env})\nlen({foo: $env, foo: 0})\nlen({foo: $env, foo: 1.0})\nlen({foo: $env, foo: true})\nlen({foo: $env})\nlen({foo: 0, foo: nil})\nlen({foo: 0, foo: str, foo: str})\nlen({foo: 0})\nlen({foo: 1, foo: false})\nlen({foo: 1, foo: nil})\nlen({foo: 1.0, foo: f64})\nlen({foo: 1.0})\nlen({foo: 1})\nlen({foo: add})\nlen({foo: array, foo: 1.0})\nlen({foo: array, foo: greet})\nlen({foo: array, foo: str})\nlen({foo: array})\nlen({foo: f64})\nlen({foo: false})\nlen({foo: foo, foo: $env})\nlen({foo: foo, foo: 1.0})\nlen({foo: foo, foo: foo})\nlen({foo: foo, foo: nil})\nlen({foo: foo, foo: ok})\nlen({foo: foo})\nlen({foo: greet, foo: str})\nlen({foo: greet})\nlen({foo: i, foo: $env})\nlen({foo: i})\nlen({foo: list, foo: foo})\nlen({foo: list})\nlen({foo: nil, foo: 1.0})\nlen({foo: nil, foo: add})\nlen({foo: nil, foo: array})\nlen({foo: nil})\nlen({foo: ok, foo: $env})\nlen({foo: ok})\nlen({foo: str, foo: $env})\nlen({foo: str, foo: f64, foo: f64})\nlen({foo: str, foo: greet})\nlen({foo: str, foo: str})\nlen({foo: str})\nlen({foo: true})\nlet bar = $env == f64; bar\nlet bar = $env.f64; bar\nlet bar = $env.str; bar\nlet bar = $env; bar.array\nlet bar = $env; bar.foo\nlet bar = $env?.list; bar\nlet bar = 0 == $env; bar\nlet bar = 1 == $env; bar\nlet bar = [1.0]; bar\nlet bar = add; bar\nlet bar = array == list; bar\nlet bar = array ?? foo; bar\nlet bar = array; bar\nlet bar = f64; bar\nlet bar = f64; bar + f64\nlet bar = f64; let tmp = add; bar\nlet bar = foo ?? f64; bar\nlet bar = foo.Bar; bar\nlet bar = foo.Bar; let x = add; bar\nlet bar = foo.String(); bar\nlet bar = foo; bar\nlet bar = foo; bar.String\nlet bar = greet ?? i; bar\nlet bar = greet; bar\nlet bar = i; bar\nlet bar = i; let z = !ok; bar\nlet bar = list; bar\nlet bar = list; let foobar = greet; bar\nlet bar = list[1:]; bar\nlet bar = nil != add; bar\nlet bar = ok == true; bar\nlet bar = ok; bar\nlet bar = str; bar\nlet bar = str; let foobar = greet; bar\nlet bar = string($env); bar\nlet bar = type(f64); bar\nlet foobar = $env not in array; foobar\nlet foobar = $env.f64; i < foobar\nlet foobar = $env.list; foobar\nlet foobar = $env.str; foobar\nlet foobar = $env; foobar == foobar\nlet foobar = $env; foobar.Bar\nlet foobar = $env; foobar.String\nlet foobar = $env; foobar.add\nlet foobar = $env; foobar.foo\nlet foobar = $env; foobar.greet\nlet foobar = $env; foobar.list\nlet foobar = $env; foobar.ok\nlet foobar = $env; foobar.str\nlet foobar = $env; foobar?.[str]\nlet foobar = $env; foobar?.add\nlet foobar = $env; foobar?.foobar\nlet foobar = $env; foobar?.greet\nlet foobar = $env; foobar?.i\nlet foobar = $env; foobar?.list\nlet foobar = $env; foobar?.str\nlet foobar = $env?.Bar; foobar\nlet foobar = $env?.String; foobar\nlet foobar = $env?.[Bar]; foobar?.list\nlet foobar = $env?.[String]; foobar\nlet foobar = $env?.[String]; foobar?.[str]\nlet foobar = $env?.[str]; foobar\nlet foobar = $env?.f64; foobar > foobar\nlet foobar = $env?.true; foobar\nlet foobar = 0 + f64; foobar\nlet foobar = 0; foobar != foobar\nlet foobar = 0; foobar <= foobar\nlet foobar = 1 * 1.0; foobar\nlet foobar = 1.0 != 1.0; foobar\nlet foobar = 1.0; foobar * foobar\nlet foobar = 1; foobar != f64\nlet foobar = 1; foobar % foobar\nlet foobar = 1; foobar < float(foobar)\nlet foobar = add; $env != foobar\nlet foobar = add; foobar\nlet foobar = array | sortBy(1.0); foobar\nlet foobar = array; foobar\nlet foobar = array; foobar?.[0]\nlet foobar = array; foobar?.[i]\nlet foobar = array; let bar = foobar; foobar\nlet foobar = array?.[i]; f64 + foobar\nlet foobar = f64 ?? nil; foobar\nlet foobar = f64; foobar\nlet foobar = f64; foobar ** f64\nlet foobar = f64; foobar + foobar\nlet foobar = f64; foobar == foobar\nlet foobar = false; foobar != foobar\nlet foobar = false; foobar == $env and foobar\nlet foobar = flatten(list); foobar\nlet foobar = foo != nil; foobar || false\nlet foobar = foo; foobar\nlet foobar = foo; foobar.Bar\nlet foobar = foo; foobar?.Bar\nlet foobar = foo; foobar?.String\nlet foobar = foo?.Bar; foobar\nlet foobar = foo?.String; foobar\nlet foobar = greet; foobar\nlet foobar = greet; let z = foobar; foobar\nlet foobar = greet; {foo: foobar}\nlet foobar = i <= i; foobar\nlet foobar = i; 1.0 == foobar\nlet foobar = i; floor(foobar) + foobar\nlet foobar = i; foobar\nlet foobar = i; foobar != 0\nlet foobar = i; foobar % foobar\nlet foobar = i; foobar ** foobar / foobar\nlet foobar = i; foobar + foobar\nlet foobar = i; foobar == f64\nlet foobar = i; foobar ^ foobar\nlet foobar = i; {foo: foobar, foo: nil}\nlet foobar = last(array); foobar\nlet foobar = len(array); foobar\nlet foobar = list; foobar\nlet foobar = list; foobar != list\nlet foobar = list; foobar?.[i]\nlet foobar = list; reduce(foobar, foobar, $env)\nlet foobar = map($env, 1); foobar\nlet foobar = nil != nil; foobar\nlet foobar = not true; foobar\nlet foobar = ok ? nil : $env; foobar?.Bar\nlet foobar = ok; foobar\nlet foobar = ok; foobar == foobar\nlet foobar = ok; let bar = foo; foobar\nlet foobar = str != $env; foobar\nlet foobar = str != nil; foobar\nlet foobar = str; foobar\nlet foobar = str; {foo: foobar}\nlet foobar = sum(array); foobar\nlet foobar = toPairs($env); foobar\nlet foobar = trimSuffix(str); foobar\nlet foobar = {foo: 0}; foobar.ok\nlet foobar = {foo: nil}; foobar\nlet tmp = $env.add; tmp\nlet tmp = $env; tmp.greet\nlet tmp = $env; tmp.str\nlet tmp = $env?.array; tmp\nlet tmp = 1.0 < 1; tmp\nlet tmp = [$env]; tmp\nlet tmp = add; tmp\nlet tmp = array; tmp\nlet tmp = f64 ?? $env; tmp\nlet tmp = f64; tmp\nlet tmp = foo; let y = foo; tmp\nlet tmp = foo; tmp\nlet tmp = greet; tmp\nlet tmp = i; tmp\nlet tmp = list; tmp\nlet tmp = min(i, f64); tmp\nlet tmp = ok; let y = foo; tmp\nlet tmp = ok; tmp\nlet tmp = str endsWith $env?.String; tmp\nlet tmp = str; tmp\nlet x = $env != true; x\nlet x = $env; let tmp = 1.0; x?.ok\nlet x = $env; x.add\nlet x = $env; x.str\nlet x = $env; x?.add\nlet x = $env; x?.f64\nlet x = $env; x?.str\nlet x = $env?.[foobar]; x\nlet x = add; x\nlet x = array; x\nlet x = f64; x\nlet x = foo.Bar; x\nlet x = foo; x\nlet x = foo; x.Bar\nlet x = foo; x?.String\nlet x = greet; x\nlet x = i; let y = ok; x\nlet x = i; x\nlet x = list; let bar = foo; x\nlet x = list; x\nlet x = ok and $env; x\nlet x = ok; x\nlet x = str; x\nlet x = trimSuffix(str); x\nlet x = {foo: 1.0}; x\nlet y = $env ?? $env; y\nlet y = $env.array; y\nlet y = $env; let tmp = i; y?.[str]\nlet y = $env; y.greet\nlet y = $env; y.list\nlet y = $env; y?.String\nlet y = $env; y?.add\nlet y = $env; y?.greet\nlet y = $env?.[String]; y\nlet y = $env?.add; y\nlet y = -1.0; y\nlet y = 1.0 * i; y\nlet y = add; y\nlet y = array; y\nlet y = concat(list); y\nlet y = f64; y\nlet y = false != ok; y\nlet y = findLastIndex($env, true); y\nlet y = foo.Bar; y\nlet y = foo; y\nlet y = foo?.String; y\nlet y = greet; y\nlet y = i; let bar = foo; y\nlet y = i; y\nlet y = list; y\nlet y = nil ?? false; y\nlet y = not false; y\nlet y = ok; y\nlet y = sort($env); y\nlet y = str; y\nlet z = $env != nil; z\nlet z = $env == greet; z\nlet z = $env.i; z\nlet z = $env.ok; z\nlet z = $env; z.Bar\nlet z = $env; z.String\nlet z = $env; z.array\nlet z = $env; z.f64\nlet z = $env; z.greet\nlet z = $env; z?.greet\nlet z = $env?.ok; z\nlet z = [foo]; z\nlet z = add; z\nlet z = array == list; z\nlet z = array; z\nlet z = array; z | groupBy(foo)\nlet z = f64 != $env; z\nlet z = f64; z\nlet z = foo.String; z\nlet z = foo; z\nlet z = greet; z\nlet z = i; z\nlet z = list; let x = f64; z\nlet z = list; z\nlet z = map($env, add); z\nlet z = ok or true; z\nlet z = ok; z\nlet z = str != $env; z\nlet z = str; let tmp = array; z\nlet z = str; z\nlet z = {foo: ok, foo: nil}; z\nlist\nlist != $env != false\nlist != $env != nil\nlist != $env && ok\nlist != $env ? list : i\nlist != $env ?? $env?.add\nlist != $env ?? 1\nlist != $env ?? f64\nlist != $env ?? i\nlist != $env and ok\nlist != $env or 1.0 > f64\nlist != $env or false\nlist != $env or ok\nlist != $env.array\nlist != $env.list\nlist != $env?.Bar\nlist != $env?.String\nlist != $env?.[Bar]\nlist != $env?.[Bar]?.list\nlist != $env?.[String]\nlist != $env?.[foobar?.[foo]]\nlist != $env?.[foobar]\nlist != $env?.[str]\nlist != $env?.array\nlist != $env?.foobar\nlist != $env?.list\nlist != $env?.nil\nlist != 0 ?? ok\nlist != 1 ?? false\nlist != 1..i\nlist != 1.0 ?? add\nlist != 1.0 ?? foo\nlist != [0]\nlist != [foo]\nlist != [nil]\nlist != [str]\nlist != array\nlist != array and ok\nlist != array or $env\nlist != array or false\nlist != array || $env\nlist != false ?? foo\nlist != flatten(list)\nlist != foo ?? f64\nlist != foo ?? ok\nlist != foo ?? true\nlist != greet ?? list\nlist != i .. i\nlist != i ?? foo\nlist != keys($env)\nlist != list\nlist != list != ok\nlist != list && $env\nlist != list && true\nlist != list == false\nlist != list ?? 0\nlist != list ?? date(list)\nlist != list ?? greet\nlist != list and false\nlist != list or false\nlist != map(list, #)\nlist != map(list, str)\nlist != max($env)\nlist != median(array)\nlist != min(array)\nlist != nil ? 1.0 : f64\nlist != nil ? ok : 1.0\nlist != nil ?: list\nlist != nil ?? nil\nlist != nil || false\nlist != nil || true\nlist != ok ?? 1.0\nlist != reverse($env.list)\nlist != reverse(array)\nlist != str ?? ok\nlist != true ?? str\nlist == $env == nil\nlist == $env == ok\nlist == $env == true\nlist == $env ? foo : i\nlist == $env ?: list == nil\nlist == $env ?? 0\nlist == $env ?? f64\nlist == $env ?? i\nlist == $env and false\nlist == $env || $env\nlist == $env.array\nlist == $env.list\nlist == $env?.$env\nlist == $env?.Bar\nlist == $env?.Bar?.add\nlist == $env?.String\nlist == $env?.[Bar]\nlist == $env?.[String]\nlist == $env?.[foobar?.list]\nlist == $env?.[foobar?.str()]\nlist == $env?.[foobar]\nlist == $env?.[nil]\nlist == $env?.[str]\nlist == $env?.array\nlist == $env?.foobar\nlist == $env?.list\nlist == 0 .. 1\nlist == 0 ?? foo\nlist == 1 ?? add\nlist == 1.0 ?? $env\nlist == 1.0 ?? $env && $env\nlist == 1.0 ?? greet\nlist == 1.0 ?? str\nlist == [$env]\nlist == [0]\nlist == [add]\nlist == [false]\nlist == [foo]\nlist == [greet, 0]\nlist == [greet]\nlist == [list]\nlist == [nil]\nlist == [str]\nlist == [true]\nlist == add ?? array\nlist == add ?? false\nlist == array\nlist == array == $env == true\nlist == array == nil\nlist == array ? nil : foo\nlist == array ?: list\nlist == array or ok\nlist == array[:i]\nlist == concat(array)\nlist == f64 ?? $env ?? 1.0\nlist == false ?? greet\nlist == flatten(array)\nlist == foo ?? true\nlist == i ?? f64\nlist == keys($env)\nlist == list\nlist == list != $env\nlist == list != nil\nlist == list == true\nlist == list and true\nlist == list[:i]\nlist == map($env, str)\nlist == map(list, $env)\nlist == nil != false\nlist == nil && false\nlist == nil == nil\nlist == nil ? add : $env\nlist == nil ?: $env\nlist == nil ?: nil\nlist == nil or $env\nlist == ok ?? greet\nlist == ok ?? str\nlist == reverse(array)\nlist == str ?? array\nlist == toPairs($env)\nlist == values($env)\nlist ?? !$env\nlist ?? !false\nlist ?? !true\nlist ?? $env ?? $env\nlist ?? $env ?? add\nlist ?? $env ?? nil\nlist ?? $env | count(ok)\nlist ?? $env | filter(true)\nlist ?? $env | findIndex(false)\nlist ?? $env | findLast(false)\nlist ?? $env | groupBy(1)\nlist ?? $env | map(0)\nlist ?? $env | reduce(#)\nlist ?? $env | reduce($env)\nlist ?? $env | reduce(.String)\nlist ?? $env | reduce(ok)\nlist ?? $env | sortBy(1)\nlist ?? $env.add\nlist ?? $env.array\nlist ?? $env.f64\nlist ?? $env.foo\nlist ?? $env.greet\nlist ?? $env.i\nlist ?? $env.list\nlist ?? $env.ok\nlist ?? $env.str\nlist ?? $env?.Bar\nlist ?? $env?.Bar()\nlist ?? $env?.Bar()?.[list]\nlist ?? $env?.String\nlist ?? $env?.String()\nlist ?? $env?.String(foobar)?.ok()\nlist ?? $env?.String(ok | filter(String))\nlist ?? $env?.[$env]\nlist ?? $env?.[Bar]\nlist ?? $env?.[Bar].foo()\nlist ?? $env?.[Bar]?.[array]\nlist ?? $env?.[String]\nlist ?? $env?.[add]\nlist ?? $env?.[add].Bar\nlist ?? $env?.[array]\nlist ?? $env?.[f64]\nlist ?? $env?.[f64]?.add()\nlist ?? $env?.[foo]\nlist ?? $env?.[foobar | keys(foobar)]\nlist ?? $env?.[foobar]\nlist ?? $env?.[greet]\nlist ?? $env?.[i]\nlist ?? $env?.[list]\nlist ?? $env?.[list]?.[ok]\nlist ?? $env?.[list]?.i()?.String\nlist ?? $env?.[ok]\nlist ?? $env?.[ok][add:foobar]\nlist ?? $env?.[str]\nlist ?? $env?.[true]\nlist ?? $env?.add\nlist ?? $env?.array\nlist ?? $env?.f64\nlist ?? $env?.foo\nlist ?? $env?.foobar\nlist ?? $env?.greet\nlist ?? $env?.i\nlist ?? $env?.list\nlist ?? $env?.nil\nlist ?? $env?.ok\nlist ?? $env?.str\nlist ?? $env[:count(1.0)]\nlist ?? $env[:foo.foo]\nlist ?? $env[:str(nil)]\nlist ?? $env[foobar:]\nlist ?? -$env?.[nil]\nlist ?? --1.0\nlist ?? -f64\nlist ?? 0 ?? $env\nlist ?? 0 ?? array\nlist ?? 0 | map(foo)\nlist ?? 0 | none(true)\nlist ?? 0 | sortBy(0)\nlist ?? 0 | sortBy(str)\nlist ?? 1 | groupBy(foo)\nlist ?? 1 | map(1.0)\nlist ?? 1.0\nlist ?? 1.0 ?? foo\nlist ?? 1.0 | count(true)\nlist ?? 1.0 | groupBy(0)\nlist ?? 1.0 | groupBy(str)\nlist ?? 1.0 | map(0)\nlist ?? 1.0 | one(true)\nlist ?? 1.0 | reduce(.Bar)\nlist ?? [array]\nlist ?? [list]\nlist ?? [ok]\nlist ?? [str]\nlist ?? abs($env).greet\nlist ?? add\nlist ?? add | groupBy(#)\nlist ?? add | groupBy(ok)\nlist ?? add | reduce(1.0)\nlist ?? add | sum(0)\nlist ?? any($env, #)\nlist ?? any($env, $env)\nlist ?? array\nlist ?? array ?? $env?.[greet]\nlist ?? array | reduce($env)\nlist ?? array?.[i]\nlist ?? bitnot($env)\nlist ?? bitshr($env, $env)\nlist ?? ceil($env)\nlist ?? count($env)\nlist ?? count(array)\nlist ?? count(foo ?? $env)\nlist ?? date(greet)\nlist ?? date(list)\nlist ?? date(nil)\nlist ?? f64\nlist ?? f64 ?? str\nlist ?? f64 | count(true)\nlist ?? f64 | groupBy(foo)\nlist ?? f64 | map(#)\nlist ?? f64 | map(ok)\nlist ?? f64 | reduce(#, i)\nlist ?? f64 | reduce(#acc, $env)\nlist ?? false ?? greet\nlist ?? false | filter(ok)\nlist ?? false | find(true)\nlist ?? false | map(1.0)\nlist ?? false | map(false)\nlist ?? false | map(foo)\nlist ?? false | reduce(i)\nlist ?? false | sortBy(1)\nlist ?? filter(list, false)\nlist ?? find($env, .add)\nlist ?? find(array, ok)\nlist ?? findIndex($env, .i)\nlist ?? findLast($env, #)\nlist ?? findLastIndex($env, #.ok)\nlist ?? flatten($env)\nlist ?? float(1.0)\nlist ?? foo\nlist ?? foo ?? foo\nlist ?? foo ?? sortBy($env, 0)\nlist ?? foo | all(false)\nlist ?? foo | any(true)\nlist ?? foo | findIndex(ok)\nlist ?? foo | groupBy(i)\nlist ?? foo | map(#)\nlist ?? foo | map(#index)\nlist ?? foo | map(ok)\nlist ?? foo | reduce(#)\nlist ?? foo | reduce(#) ?? foo\nlist ?? foo | reduce($env)\nlist ?? foo | reduce(1.0)\nlist ?? foo | sum(0)\nlist ?? foo | sum(1)\nlist ?? foo.Bar\nlist ?? foo.String\nlist ?? foo.String()\nlist ?? foo?.Bar\nlist ?? foo?.String\nlist ?? foo?.String()\nlist ?? fromBase64($env)\nlist ?? greet\nlist ?? greet ?? list\nlist ?? greet | all(false)\nlist ?? greet | any(true)\nlist ?? greet | findLastIndex(true)\nlist ?? greet | map(#)\nlist ?? greet | map(1)\nlist ?? greet | reduce(foo, foo)\nlist ?? greet | sum(1.0)\nlist ?? greet($env)\nlist ?? greet(str)\nlist ?? i\nlist ?? i | groupBy(1.0)\nlist ?? i | groupBy(false)\nlist ?? i | reduce($env)\nlist ?? i | reduce(.Bar)\nlist ?? int($env)\nlist ?? len($env)\nlist ?? list\nlist ?? list | one(true)\nlist ?? list | sum(1)\nlist ?? map($env, $env)\nlist ?? max($env)\nlist ?? max(1, $env)?.list\nlist ?? max(list)\nlist ?? mean(1.0)\nlist ?? mean(array)\nlist ?? mean(i)\nlist ?? median($env)\nlist ?? min(f64)\nlist ?? nil ?? str\nlist ?? nil | all(true)\nlist ?? nil | count(ok)\nlist ?? nil | groupBy(#)\nlist ?? nil | groupBy(1.0)\nlist ?? nil | groupBy(foo)\nlist ?? nil | map(#)\nlist ?? nil | map(#index)\nlist ?? nil | reduce(str)\nlist ?? nil | reduce(true)\nlist ?? nil | sortBy(f64)\nlist ?? nil | sum(0)\nlist ?? not $env\nlist ?? not $env?.[array]\nlist ?? not foo ?? str\nlist ?? ok\nlist ?? ok ?? 0\nlist ?? ok ?? false\nlist ?? ok ?? i\nlist ?? ok | all(true)\nlist ?? ok | findLastIndex(ok)\nlist ?? ok | map(#)\nlist ?? ok | none(true)\nlist ?? ok | reduce(list)\nlist ?? ok | sortBy(str)\nlist ?? ok | sum(i)\nlist ?? one($env, #.Bar)\nlist ?? reduce($env, #.String, add)\nlist ?? reduce($env?.String(false, 1.0), #.foo[str:])\nlist ?? repeat($env, i)\nlist ?? reverse($env)\nlist ?? reverse(list)\nlist ?? round($env)\nlist ?? sortBy($env, .add)\nlist ?? str\nlist ?? str | any(true)\nlist ?? str | findLast(true)\nlist ?? str | map(foo)\nlist ?? str | reduce(#)\nlist ?? str | reduce(1.0)\nlist ?? string($env)\nlist ?? string(1)\nlist ?? string(i)\nlist ?? string(nil)\nlist ?? sum($env)\nlist ?? sum($env)?.[add]\nlist ?? sum(array)\nlist ?? sum(array, $env)\nlist ?? sum(list)\nlist ?? sum(list, add)\nlist ?? toJSON(add)\nlist ?? true ?? $env?.array\nlist ?? true | count(false)\nlist ?? true | groupBy(#)\nlist ?? true | map(#)\nlist ?? true | map(str)\nlist ?? true | reduce(#)\nlist ?? type(1)\nlist ?? type(nil)\nlist ?? upper($env)\nlist ?? {foo: 1.0}\nlist ?? {foo: 1}\nlist ?? {foo: add}\nlist in $env?.Bar\nlist in $env?.String\nlist in $env?.String?.[foo]\nlist in $env?.String?.f64\nlist in $env?.[Bar]\nlist in $env?.[Bar]?.Bar\nlist in $env?.[Bar]?.[array]\nlist in $env?.[String]\nlist in $env?.[String]?.[ok]\nlist in $env?.[String]?.[str]\nlist in $env?.[foobar?.[Bar]]\nlist in $env?.[foobar]\nlist in $env?.foobar\nlist in [$env, 1.0]\nlist in [$env, nil]\nlist in [array]\nlist in [nil, $env]\nlist in [nil]\nlist in array ?? $env\nlist in array ?? i\nlist in concat(list)\nlist in last($env)\nlist in sort($env)\nlist in {foo: 0}.array\nlist not in $env?.$env?.list\nlist not in $env?.Bar\nlist not in $env?.String\nlist not in $env?.String?.[add]\nlist not in $env?.String?.add\nlist not in $env?.[Bar]\nlist not in $env?.[String]\nlist not in $env?.[foobar?.[ok]]\nlist not in $env?.[foobar]\nlist not in $env?.foobar\nlist not in [array, true]\nlist not in [list]\nlist not in array ?? 1\nlist not in last($env)\nlist not in list ?? $env?.[f64]\nlist not in list ?? array\nlist not in list ?? i\nlist not in toPairs($env)\nlist | all(!true)\nlist | all(# != $env)\nlist | all(# == nil)\nlist | all($env | any(true))\nlist | all($env?.ok)\nlist | all(.Bar not in #)\nlist | all(0 == nil)\nlist | all(1.0 != f64)\nlist | all(false && $env)\nlist | all(false or false)\nlist | all(false)\nlist | all(false) ?: f64\nlist | all(foo != #)\nlist | all(list != array)\nlist | all(nil != 1.0)\nlist | all(ok)\nlist | all(ok) ?? f64\nlist | all(str >= .Bar)\nlist | all(true)\nlist | any(# == $env)\nlist | any($env != #)\nlist | any($env != 1.0)\nlist | any($env == $env)\nlist | any($env == foo)\nlist | any($env.ok)\nlist | any($env?.ok)\nlist | any(.Bar in foo)\nlist | any(array | any(ok))\nlist | any(f64 != 1.0)\nlist | any(false)\nlist | any(false) ?? list\nlist | any(i == nil)\nlist | any(i >= 1.0)\nlist | any(nil == i)\nlist | any(ok != nil)\nlist | any(ok)\nlist | any(true ?: nil)\nlist | any(true)\nlist | concat(array)\nlist | concat(array) ?? i\nlist | concat(i .. i)\nlist | concat(list)\nlist | concat(list) | any(true)\nlist | concat(sortBy(array, #))\nlist | count(!false)\nlist | count(# != nil)\nlist | count($env != foo)\nlist | count($env == #)\nlist | count($env.ok)\nlist | count(1.0 != $env)\nlist | count(1.0 != nil)\nlist | count(1.0 <= i)\nlist | count(false)\nlist | count(false) | bitxor(i)\nlist | count(nil != ok)\nlist | count(ok)\nlist | count(ok) ?? $env?.String?.Bar\nlist | count(ok) | median(f64)\nlist | count(true != true)\nlist | count(true and false)\nlist | count(true or false)\nlist | count(true)\nlist | filter(!ok)\nlist | filter(# != $env)\nlist | filter(# == #)\nlist | filter(#.String != nil)\nlist | filter($env != false)\nlist | filter($env.ok)\nlist | filter(0 <= 1)\nlist | filter(1.0 > 0)\nlist | filter(false)\nlist | filter(false) | find(true)\nlist | filter(false) | findLast(true)\nlist | filter(false) | map(1.0)\nlist | filter(i <= 1)\nlist | filter(list == $env)\nlist | filter(nil != #.String)\nlist | filter(nil == foo)\nlist | filter(not false)\nlist | filter(ok == nil)\nlist | filter(ok)\nlist | filter(ok) | reduce(1.0)\nlist | filter(ok) | sum(1.0)\nlist | filter(str not startsWith .Bar)\nlist | filter(true)\nlist | filter(true) ?? !$env\nlist | filter(true) | groupBy(foo)\nlist | filter(true) | groupBy(ok)\nlist | filter(true) | map(#)\nlist | filter(true) | sum(1.0)\nlist | find(# != $env)\nlist | find(# == #)\nlist | find(# == $env)\nlist | find($env != i)\nlist | find(0 < 0)\nlist | find(1.0 > 0)\nlist | find(array | one(true))\nlist | find(f64 == 0)\nlist | find(f64 > 1.0)\nlist | find(false)\nlist | find(foo == #)\nlist | find(foo == $env)\nlist | find(foo == foo)\nlist | find(nil != $env?.f64)\nlist | find(nil != foo)\nlist | find(nil == foo)\nlist | find(not ok)\nlist | find(ok)\nlist | find(true)\nlist | findIndex(!ok)\nlist | findIndex(# != #)\nlist | findIndex(# != foo)\nlist | findIndex(#.Bar in #)\nlist | findIndex(#.String != $env)\nlist | findIndex($env.ok)\nlist | findIndex(1.0 >= 1)\nlist | findIndex(false && $env)\nlist | findIndex(false)\nlist | findIndex(list != nil)\nlist | findIndex(nil != greet)\nlist | findIndex(nil == .Bar)\nlist | findIndex(nil not in $env)\nlist | findIndex(ok == true)\nlist | findIndex(ok)\nlist | findIndex(ok) ?? foo\nlist | findIndex(ok) not in array\nlist | findIndex(true == ok)\nlist | findIndex(true)\nlist | findLast(# == #)\nlist | findLast($env == $env)\nlist | findLast($env == 0)\nlist | findLast($env.ok)\nlist | findLast(.Bar in foo)\nlist | findLast(0 > 1.0)\nlist | findLast(1.0 <= 1)\nlist | findLast(f64 < 0)\nlist | findLast(false)\nlist | findLast(nil != str)\nlist | findLast(not false)\nlist | findLast(ok ?? .String)\nlist | findLast(ok)\nlist | findLast(ok) ?? foo\nlist | findLast(true)\nlist | findLastIndex(!false)\nlist | findLastIndex(!true)\nlist | findLastIndex(# == #)\nlist | findLastIndex(# == $env)\nlist | findLastIndex(#.Bar == #.Bar)\nlist | findLastIndex($env != nil)\nlist | findLastIndex(all(array, true))\nlist | findLastIndex(array == $env)\nlist | findLastIndex(false or true)\nlist | findLastIndex(false)\nlist | findLastIndex(foo == #)\nlist | findLastIndex(greet != $env)\nlist | findLastIndex(i <= 0)\nlist | findLastIndex(nil not in list)\nlist | findLastIndex(ok)\nlist | findLastIndex(true)\nlist | get(0)\nlist | get(1)\nlist | get(1.0 ?? $env)\nlist | get(i)\nlist | groupBy(# != #)\nlist | groupBy(# != nil)\nlist | groupBy(# == #)\nlist | groupBy(# == nil)\nlist | groupBy(# in list)\nlist | groupBy(#)\nlist | groupBy(#.Bar)\nlist | groupBy(#.String())\nlist | groupBy($env != #)\nlist | groupBy($env != 0)\nlist | groupBy($env == 0)\nlist | groupBy($env.f64)\nlist | groupBy($env.i)\nlist | groupBy($env.ok)\nlist | groupBy($env?.Bar)\nlist | groupBy($env?.String)\nlist | groupBy($env?.f64)\nlist | groupBy($env?.i)\nlist | groupBy(-0)\nlist | groupBy(.Bar)\nlist | groupBy(0 > i)\nlist | groupBy(0 ?? $env)\nlist | groupBy(0)\nlist | groupBy(1 ** 1.0)\nlist | groupBy(1 / 1.0)\nlist | groupBy(1)\nlist | groupBy(1.0 != $env)\nlist | groupBy(1.0 + i)\nlist | groupBy(1.0 <= 1.0)\nlist | groupBy(1.0 >= 1.0)\nlist | groupBy(1.0 in array)\nlist | groupBy(1.0)\nlist | groupBy(f64 + 1)\nlist | groupBy(f64)\nlist | groupBy(false && $env)\nlist | groupBy(false ?? #)\nlist | groupBy(false)\nlist | groupBy(foo)\nlist | groupBy(foo.Bar)\nlist | groupBy(greet(.Bar))\nlist | groupBy(i)\nlist | groupBy(i) | get(true)\nlist | groupBy(let foobar = true; foobar)\nlist | groupBy(list?.[i])\nlist | groupBy(mean(f64))\nlist | groupBy(nil != #)\nlist | groupBy(nil != $env)\nlist | groupBy(ok)\nlist | groupBy(ok) | get(str)\nlist | groupBy(str)\nlist | groupBy(string(#))\nlist | groupBy(string(str))\nlist | groupBy(toJSON(array))\nlist | groupBy(toJSON(foo))\nlist | groupBy(true && ok)\nlist | groupBy(true && true)\nlist | groupBy(true)\nlist | groupBy(type(#))\nlist | groupBy(type(#?.Bar))\nlist | groupBy(type(1.0))\nlist | map(# != foo)\nlist | map(# != nil)\nlist | map(# == #)\nlist | map(#)\nlist | map(#) == array\nlist | map(#) | all(true)\nlist | map(#) | findIndex(false)\nlist | map(#) | get(0)\nlist | map(#) | groupBy(#)\nlist | map(#) | groupBy(foo)\nlist | map(#) | map(#)\nlist | map(#) | map(#.Bar)\nlist | map(#) | map(foo)\nlist | map(#) | map(greet)\nlist | map(#) | none(ok)\nlist | map(#) | one(false)\nlist | map(#) | reduce(#)\nlist | map(#.Bar)\nlist | map(#.Bar) | reduce(#, nil)\nlist | map(#.Bar) | sortBy(#)\nlist | map(#.String())\nlist | map(#.String)\nlist | map(#.String) | reduce(#)\nlist | map(#?.Bar)\nlist | map(#?.String())\nlist | map(#?.String)\nlist | map(#index)\nlist | map($env)\nlist | map($env) == list\nlist | map($env) | all(#.ok)\nlist | map($env) | all(.ok)\nlist | map($env) | any(true)\nlist | map($env) | findLastIndex(#.ok)\nlist | map($env) | groupBy(0)\nlist | map($env) | map(#.i)\nlist | map($env) | map(.ok)\nlist | map($env) | map(0)\nlist | map($env) | reduce(greet(.str))\nlist | map($env) | reduce(str)\nlist | map($env.ok)\nlist | map($env?.Bar)\nlist | map($env?.String)\nlist | map($env?.[Bar])\nlist | map($env?.[String])\nlist | map($env?.f64)\nlist | map($env?.i)\nlist | map($env?.list)\nlist | map($env?.nil)\nlist | map($env?.str)\nlist | map(-0)\nlist | map(-i)\nlist | map(.Bar)\nlist | map(.Bar) ?? i\nlist | map(.String)\nlist | map(.String) == array\nlist | map(0)\nlist | map(0) ?? list\nlist | map(0) | all(ok)\nlist | map(0) | map(array)\nlist | map(0) | none(ok)\nlist | map(0) | reduce(#)\nlist | map(0) | reduce(0)\nlist | map(1 > 1)\nlist | map(1 >= 0)\nlist | map(1)\nlist | map(1.0 * f64)\nlist | map(1.0 + 1)\nlist | map(1.0)\nlist | map(1.0) | any(true)\nlist | map(1.0) | findLastIndex(true)\nlist | map(1.0) | map(str)\nlist | map(1.0) | reduce(1.0)\nlist | map(1.0) | reduce(foo)\nlist | map(1.0) | sortBy(#)\nlist | map([#])\nlist | map([.Bar, str])\nlist | map([false])\nlist | map(add)\nlist | map(add) | find(ok)\nlist | map(add) | reduce(add)\nlist | map(array == nil)\nlist | map(array)\nlist | map(array) == array\nlist | map(bitnot(i))\nlist | map(concat(list))\nlist | map(f64 < 1.0)\nlist | map(f64)\nlist | map(f64) | sum(#)\nlist | map(f64); f64\nlist | map(false or $env)\nlist | map(false)\nlist | map(false) ?? greet\nlist | map(false) | all(#)\nlist | map(false) | map(#)\nlist | map(false) | reduce(0)\nlist | map(false) | sortBy(str)\nlist | map(false) | sum(f64)\nlist | map(foo == #)\nlist | map(foo == $env)\nlist | map(foo ?? 0)\nlist | map(foo ?? i)\nlist | map(foo)\nlist | map(foo) != list\nlist | map(foo) | count(ok)\nlist | map(foo) | groupBy(#)\nlist | map(foo) | groupBy(true)\nlist | map(foo) | reduce(#acc)\nlist | map(foo.Bar)\nlist | map(foo?.String)\nlist | map(get($env, str))\nlist | map(greet(.Bar))\nlist | map(greet)\nlist | map(greet) != array\nlist | map(greet) | sortBy(i)\nlist | map(i != 1.0)\nlist | map(i / f64)\nlist | map(i)\nlist | map(if true { 1.0 } else { # })\nlist | map(last($env))\nlist | map(let foobar = str; foobar)\nlist | map(let x = array; x)\nlist | map(list ?? 0)\nlist | map(list)\nlist | map(list) | map(#)\nlist | map(list) | none(ok)\nlist | map(map(array, list))\nlist | map(nil != 1)\nlist | map(nil != nil)\nlist | map(nil ?? $env)\nlist | map(not true)\nlist | map(ok or $env)\nlist | map(ok)\nlist | map(ok) | findLast(ok)\nlist | map(ok) | reduce(1.0, 0)\nlist | map(sortBy(array, #))\nlist | map(str <= .Bar)\nlist | map(str)\nlist | map(str) | groupBy(foo)\nlist | map(str) | sortBy(f64)\nlist | map(string(#.Bar))\nlist | map(string(greet))\nlist | map(true || ok)\nlist | map(true)\nlist | map(true) | find(true)\nlist | map(true) | groupBy(0)\nlist | map(type(#))\nlist | map(type(.String))\nlist | map(type(ok))\nlist | none(# != #)\nlist | none(# == $env)\nlist | none(#.Bar in foo)\nlist | none($env != $env)\nlist | none($env == #)\nlist | none($env == i)\nlist | none($env.ok)\nlist | none($env?.f64 <= f64)\nlist | none($env?.ok)\nlist | none(.String == .String)\nlist | none(1 < 0)\nlist | none(1.0 <= 1)\nlist | none(all(array, true))\nlist | none(f64 <= f64)\nlist | none(false)\nlist | none(false) || ok\nlist | none(foo != #)\nlist | none(foo == #)\nlist | none(i == 0)\nlist | none(list | any(ok))\nlist | none(nil == add)\nlist | none(ok == $env)\nlist | none(ok)\nlist | none(true == nil)\nlist | none(true)\nlist | one(# != foo)\nlist | one(# != nil)\nlist | one(# == foo)\nlist | one($env == $env)\nlist | one($env == false)\nlist | one($env.ok)\nlist | one($env?.ok)\nlist | one(.Bar not endsWith str)\nlist | one(0 != 1.0)\nlist | one(1 >= 1)\nlist | one(add != nil)\nlist | one(add == nil)\nlist | one(f64 != 0)\nlist | one(false)\nlist | one(foo == $env)\nlist | one(i == i)\nlist | one(nil ?? false)\nlist | one(ok ?: 0)\nlist | one(ok)\nlist | one(str == str)\nlist | one(true)\nlist | reduce(!ok)\nlist | reduce(# ?? #)\nlist | reduce(# ?? $env)\nlist | reduce(# ?? 1.0)\nlist | reduce(#)\nlist | reduce(#, $env)\nlist | reduce(#, 0)\nlist | reduce(#, 1)\nlist | reduce(#, 1.0)\nlist | reduce(#, add)\nlist | reduce(#, array)\nlist | reduce(#, f64)\nlist | reduce(#, false)\nlist | reduce(#, foo ?? array)\nlist | reduce(#, foo)\nlist | reduce(#, greet)\nlist | reduce(#, i)\nlist | reduce(#, list)\nlist | reduce(#, nil)\nlist | reduce(#, ok)\nlist | reduce(#, str)\nlist | reduce(#, true)\nlist | reduce(#.Bar)\nlist | reduce(#.Bar, $env)\nlist | reduce(#.Bar, 0)\nlist | reduce(#.Bar, 1)\nlist | reduce(#.Bar, add)\nlist | reduce(#.Bar, array)\nlist | reduce(#.Bar, f64)\nlist | reduce(#.Bar, foo)\nlist | reduce(#.Bar, greet)\nlist | reduce(#.Bar, i)\nlist | reduce(#.Bar, list)\nlist | reduce(#.Bar, nil)\nlist | reduce(#.Bar, ok)\nlist | reduce(#.String == nil)\nlist | reduce(#.String ?? nil)\nlist | reduce(#.String)\nlist | reduce(#.String, $env)\nlist | reduce(#.String, 1)\nlist | reduce(#.String, 1.0)\nlist | reduce(#.String, f64)\nlist | reduce(#.String, foo)\nlist | reduce(#.String, greet)\nlist | reduce(#.String, i)\nlist | reduce(#.String, nil)\nlist | reduce(#.String, true)\nlist | reduce(#?.Bar)\nlist | reduce(#?.String)\nlist | reduce(#acc)\nlist | reduce(#acc, $env)\nlist | reduce(#acc, 1)\nlist | reduce(#acc, 1.0)\nlist | reduce(#acc, add)\nlist | reduce(#acc, array)\nlist | reduce(#acc, array) | map($env)\nlist | reduce(#acc, f64)\nlist | reduce(#acc, foo)\nlist | reduce(#acc, i)\nlist | reduce(#acc, nil)\nlist | reduce(#acc, str)\nlist | reduce(#acc, true)\nlist | reduce(#index - 0)\nlist | reduce(#index <= 1)\nlist | reduce(#index)\nlist | reduce(#index, $env)\nlist | reduce(#index, 1.0)\nlist | reduce(#index, add)\nlist | reduce(#index, false)\nlist | reduce(#index, foo)\nlist | reduce(#index, list)\nlist | reduce(#index, nil)\nlist | reduce(#index, ok)\nlist | reduce(#index, str)\nlist | reduce(#index, true)\nlist | reduce($env != #)\nlist | reduce($env == #.Bar)\nlist | reduce($env not in array)\nlist | reduce($env)\nlist | reduce($env, $env)\nlist | reduce($env, 0)\nlist | reduce($env, 1)\nlist | reduce($env, 1.0)\nlist | reduce($env, add)\nlist | reduce($env, array)\nlist | reduce($env, f64)\nlist | reduce($env, false)\nlist | reduce($env, foo)\nlist | reduce($env, greet)\nlist | reduce($env, i)\nlist | reduce($env, list)\nlist | reduce($env, nil)\nlist | reduce($env, ok)\nlist | reduce($env, str)\nlist | reduce($env, true)\nlist | reduce($env.i)\nlist | reduce($env.ok)\nlist | reduce($env?.String)\nlist | reduce($env?.[Bar])\nlist | reduce($env?.[String])\nlist | reduce($env?.[foobar])\nlist | reduce($env?.[str])\nlist | reduce($env?.add)\nlist | reduce($env?.add, ok)\nlist | reduce($env?.greet, max(1))\nlist | reduce(-1)\nlist | reduce(.Bar not in $env)\nlist | reduce(.Bar)\nlist | reduce(.Bar, $env)\nlist | reduce(.Bar, 0)\nlist | reduce(.Bar, 1.0)\nlist | reduce(.Bar, add)\nlist | reduce(.Bar, array)\nlist | reduce(.Bar, i)\nlist | reduce(.Bar, nil)\nlist | reduce(.Bar, ok)\nlist | reduce(.Bar, true)\nlist | reduce(.String)\nlist | reduce(.String, $env)\nlist | reduce(.String, 0)\nlist | reduce(.String, 1)\nlist | reduce(.String, 1.0)\nlist | reduce(.String, array)\nlist | reduce(.String, f64)\nlist | reduce(.String, foo)\nlist | reduce(.String, greet)\nlist | reduce(.String, i)\nlist | reduce(.String, list)\nlist | reduce(.String, nil)\nlist | reduce(.String, ok)\nlist | reduce(0 == f64)\nlist | reduce(0)\nlist | reduce(0) == sum(array)\nlist | reduce(0) ^ f64\nlist | reduce(0) | median(1.0)\nlist | reduce(0, $env)\nlist | reduce(0, 1.0)\nlist | reduce(0, add)\nlist | reduce(0, array)\nlist | reduce(0, false)\nlist | reduce(0, foo)\nlist | reduce(0, i)\nlist | reduce(0, list)\nlist | reduce(0, nil)\nlist | reduce(0, ok)\nlist | reduce(0, true)\nlist | reduce(1 ** #index) <= i\nlist | reduce(1)\nlist | reduce(1, $env)\nlist | reduce(1, 1)\nlist | reduce(1, 1.0)\nlist | reduce(1, add)\nlist | reduce(1, array)\nlist | reduce(1, false)\nlist | reduce(1, foo)\nlist | reduce(1, foo) | max(array)\nlist | reduce(1, greet)\nlist | reduce(1, i)\nlist | reduce(1, list)\nlist | reduce(1, nil)\nlist | reduce(1, ok)\nlist | reduce(1, str)\nlist | reduce(1, true)\nlist | reduce(1.0 <= i)\nlist | reduce(1.0 == 0)\nlist | reduce(1.0)\nlist | reduce(1.0, $env)\nlist | reduce(1.0, 0)\nlist | reduce(1.0, 1)\nlist | reduce(1.0, 1.0)\nlist | reduce(1.0, add)\nlist | reduce(1.0, array)\nlist | reduce(1.0, f64)\nlist | reduce(1.0, false)\nlist | reduce(1.0, foo)\nlist | reduce(1.0, greet)\nlist | reduce(1.0, i)\nlist | reduce(1.0, list)\nlist | reduce(1.0, nil)\nlist | reduce(1.0, ok)\nlist | reduce(1.0, str)\nlist | reduce(1.0, true)\nlist | reduce([1.0])\nlist | reduce([ok, foo])\nlist | reduce([true, #])\nlist | reduce(add ?? #)\nlist | reduce(add)\nlist | reduce(add, $env)\nlist | reduce(add, 1)\nlist | reduce(add, 1.0)\nlist | reduce(add, add)\nlist | reduce(add, array)\nlist | reduce(add, f64)\nlist | reduce(add, false)\nlist | reduce(add, foo)\nlist | reduce(add, nil)\nlist | reduce(add, ok)\nlist | reduce(array ?? .String)\nlist | reduce(array)\nlist | reduce(array) | groupBy(0)\nlist | reduce(array) | groupBy(ok)\nlist | reduce(array) | map(#)\nlist | reduce(array) | map($env)\nlist | reduce(array) | none(ok)\nlist | reduce(array) | reduce(0, list)\nlist | reduce(array) | reduce(array)\nlist | reduce(array, $env)\nlist | reduce(array, 0)\nlist | reduce(array, 1)\nlist | reduce(array, 1.0)\nlist | reduce(array, add)\nlist | reduce(array, array)\nlist | reduce(array, f64)\nlist | reduce(array, false)\nlist | reduce(array, foo)\nlist | reduce(array, greet)\nlist | reduce(array, i)\nlist | reduce(array, list)\nlist | reduce(array, nil)\nlist | reduce(array, ok)\nlist | reduce(array, str)\nlist | reduce(array, true)\nlist | reduce(f64 != $env)\nlist | reduce(f64 != nil)\nlist | reduce(f64 <= 1.0)\nlist | reduce(f64)\nlist | reduce(f64) < f64\nlist | reduce(f64) ?? $env?.foo\nlist | reduce(f64, $env)\nlist | reduce(f64, 0)\nlist | reduce(f64, 1)\nlist | reduce(f64, 1.0)\nlist | reduce(f64, add)\nlist | reduce(f64, array)\nlist | reduce(f64, f64)\nlist | reduce(f64, false)\nlist | reduce(f64, foo)\nlist | reduce(f64, greet)\nlist | reduce(f64, list)\nlist | reduce(f64, nil)\nlist | reduce(f64, str)\nlist | reduce(false != nil)\nlist | reduce(false ? # : foo)\nlist | reduce(false || $env)\nlist | reduce(false)\nlist | reduce(false, $env)\nlist | reduce(false, 0)\nlist | reduce(false, 1)\nlist | reduce(false, 1.0)\nlist | reduce(false, array)\nlist | reduce(false, f64)\nlist | reduce(false, false)\nlist | reduce(false, foo)\nlist | reduce(false, greet)\nlist | reduce(false, i)\nlist | reduce(false, nil)\nlist | reduce(false, ok)\nlist | reduce(false, true)\nlist | reduce(first($env))\nlist | reduce(float(1.0))\nlist | reduce(foo == foo)\nlist | reduce(foo ?? #)\nlist | reduce(foo ?? 1)\nlist | reduce(foo)\nlist | reduce(foo, $env)\nlist | reduce(foo, $env.array)\nlist | reduce(foo, 0)\nlist | reduce(foo, 1)\nlist | reduce(foo, 1.0)\nlist | reduce(foo, add)\nlist | reduce(foo, array)\nlist | reduce(foo, f64)\nlist | reduce(foo, foo)\nlist | reduce(foo, greet)\nlist | reduce(foo, i)\nlist | reduce(foo, list)\nlist | reduce(foo, nil)\nlist | reduce(foo, ok)\nlist | reduce(foo, str)\nlist | reduce(foo, true)\nlist | reduce(foo.Bar)\nlist | reduce(foo?.Bar)\nlist | reduce(greet ?? 1)\nlist | reduce(greet)\nlist | reduce(greet) != greet\nlist | reduce(greet, $env)\nlist | reduce(greet, 1.0)\nlist | reduce(greet, add)\nlist | reduce(greet, array)\nlist | reduce(greet, f64)\nlist | reduce(greet, false)\nlist | reduce(greet, foo)\nlist | reduce(greet, greet)\nlist | reduce(greet, i)\nlist | reduce(greet, list)\nlist | reduce(greet, nil)\nlist | reduce(greet, str)\nlist | reduce(greet, true)\nlist | reduce(groupBy(list, f64)?.[foo])\nlist | reduce(i ^ i)\nlist | reduce(i)\nlist | reduce(i, 0)\nlist | reduce(i, 1.0)\nlist | reduce(i, add)\nlist | reduce(i, array)\nlist | reduce(i, f64)\nlist | reduce(i, false)\nlist | reduce(i, foo)\nlist | reduce(i, greet)\nlist | reduce(i, i)\nlist | reduce(i, list)\nlist | reduce(i, list) != $env?.String\nlist | reduce(i, nil)\nlist | reduce(i, ok)\nlist | reduce(i, str)\nlist | reduce(i, true)\nlist | reduce(list)\nlist | reduce(list) ?? not $env\nlist | reduce(list) | groupBy(0)\nlist | reduce(list, $env)\nlist | reduce(list, 1.0)\nlist | reduce(list, add)\nlist | reduce(list, array)\nlist | reduce(list, false)\nlist | reduce(list, foo)\nlist | reduce(list, greet)\nlist | reduce(list, i)\nlist | reduce(list, nil)\nlist | reduce(list, ok)\nlist | reduce(list, str)\nlist | reduce(map(list, greet))\nlist | reduce(mean([1]))\nlist | reduce(nil ?? foo)\nlist | reduce(ok and #acc)\nlist | reduce(ok)\nlist | reduce(ok) == ok\nlist | reduce(ok, $env)\nlist | reduce(ok, add)\nlist | reduce(ok, array)\nlist | reduce(ok, false)\nlist | reduce(ok, foo)\nlist | reduce(ok, i)\nlist | reduce(ok, list)\nlist | reduce(ok, nil)\nlist | reduce(ok, ok)\nlist | reduce(ok, true)\nlist | reduce(reduce(list, .Bar), ok)\nlist | reduce(str)\nlist | reduce(str) >= foo.Bar\nlist | reduce(str) contains str\nlist | reduce(str, $env)\nlist | reduce(str, 0)\nlist | reduce(str, 1)\nlist | reduce(str, 1.0)\nlist | reduce(str, add)\nlist | reduce(str, array)\nlist | reduce(str, f64)\nlist | reduce(str, false)\nlist | reduce(str, foo)\nlist | reduce(str, i)\nlist | reduce(str, list)\nlist | reduce(str, nil)\nlist | reduce(str, ok)\nlist | reduce(str, str)\nlist | reduce(str, true)\nlist | reduce(trim(str))\nlist | reduce(true ?? #index)\nlist | reduce(true and ok)\nlist | reduce(true)\nlist | reduce(true, $env)\nlist | reduce(true, 0)\nlist | reduce(true, array)\nlist | reduce(true, f64)\nlist | reduce(true, false)\nlist | reduce(true, foo)\nlist | reduce(true, greet)\nlist | reduce(true, i)\nlist | reduce(true, ok)\nlist | reduce(true, str)\nlist | reduce(type(#))\nlist | reduce(values($env))\nlist | sortBy(#.Bar)\nlist | sortBy(#.Bar) | groupBy(foo)\nlist | sortBy(#.String())\nlist | sortBy(#?.Bar)\nlist | sortBy($env?.i)\nlist | sortBy(-0)\nlist | sortBy(-1.0)\nlist | sortBy(-i)\nlist | sortBy(.Bar)\nlist | sortBy(.Bar) | groupBy(f64)\nlist | sortBy(.Bar) | reduce($env)\nlist | sortBy(0)\nlist | sortBy(0) | one(ok)\nlist | sortBy(0) | sortBy(str)\nlist | sortBy(1)\nlist | sortBy(1) | map(greet)\nlist | sortBy(1) | map(str)\nlist | sortBy(1) | sum(0)\nlist | sortBy(1.0 ** 0)\nlist | sortBy(1.0)\nlist | sortBy(1.0) ?? i\nlist | sortBy(1.0) | filter(false)\nlist | sortBy(1.0) | groupBy(true)\nlist | sortBy(1.0) | map(.String)\nlist | sortBy(1.0) | reduce($env)\nlist | sortBy(1.0) | sum(i)\nlist | sortBy(ceil(1.0))\nlist | sortBy(f64 ** 0)\nlist | sortBy(f64)\nlist | sortBy(f64) == array\nlist | sortBy(float(1))\nlist | sortBy(foo.String())\nlist | sortBy(foo?.Bar)\nlist | sortBy(greet(.Bar))\nlist | sortBy(i)\nlist | sortBy(i) | groupBy(0)\nlist | sortBy(last(array))\nlist | sortBy(str)\nlist | sortBy(str) | count(ok)\nlist | sortBy(str) | reduce(ok, true)\nlist | sortBy(string(true))\nlist | sum($env.i)\nlist | sum($env?.f64)\nlist | sum(-f64)\nlist | sum(-i)\nlist | sum(0 * 0)\nlist | sum(0 - 1.0)\nlist | sum(0)\nlist | sum(0) != i\nlist | sum(0) >= 1.0 == false\nlist | sum(0) >= bitnot(i)\nlist | sum(1)\nlist | sum(1) / 0 ** 1\nlist | sum(1) <= f64\nlist | sum(1) | median(array)\nlist | sum(1.0 ^ 1)\nlist | sum(1.0)\nlist | sum(array | findLastIndex(true))\nlist | sum(ceil(1.0))\nlist | sum(f64 * 1.0)\nlist | sum(f64)\nlist | sum(f64) ?? i\nlist | sum(f64) in array\nlist | sum(i)\nlist | sum(int(i))\nlist | sum(round(1))\nlist | take(0)\nlist | take(0) | sortBy(#)\nlist | take(1)\nlist | take(1) | sum(0)\nlist | take(i)\nlist; $env.i\nlist; $env; $env?.ok\nlist; $env?.ok\nlist; add\nlist; f64\nlist; foo\nlist; foo; $env.array\nlist; foo?.Bar\nlist; foo?.String\nlist; greet\nlist; i\nlist; list\nlist; nil == nil\nlist; nil; foo?.String\nlist; ok\nlist; str\nlist; toJSON(i)\nlist?.[$env | count(false)]\nlist?.[$env.i]\nlist?.[$env?.i]\nlist?.[-0]\nlist?.[-1]\nlist?.[-i]\nlist?.[0 % 1]\nlist?.[0 ?? nil]\nlist?.[0]\nlist?.[0].Bar\nlist?.[0].String\nlist?.[0]?.Bar\nlist?.[0]?.String\nlist?.[1 + 0]\nlist?.[1 ?? 1.0]\nlist?.[1 ?? foo]\nlist?.[1.0 ?? greet]\nlist?.[1]\nlist?.[1] != f64 ?? ok\nlist?.[1].Bar\nlist?.[1].String\nlist?.[1].String()\nlist?.[1]?.Bar\nlist?.[1]?.String\nlist?.[1]?.String()\nlist?.[array?.[0]]\nlist?.[f64 ?? $env?.[add]]\nlist?.[i ?? add]\nlist?.[i ?? f64]\nlist?.[i]\nlist?.[i] != foo\nlist?.[i] != foo && $env\nlist?.[i] == foo\nlist?.[i] == nil && $env\nlist?.[i] ?? $env?.ok\nlist?.[i] ?? add\nlist?.[i] ?? array\nlist?.[i] ?? f64\nlist?.[i] ?? greet\nlist?.[i] ?? ok\nlist?.[i] ?? str\nlist?.[i] ?? type(foo)\nlist?.[i] not in list\nlist?.[i] not in list ?? f64\nlist?.[i].Bar\nlist?.[i].Bar ?? foo\nlist?.[i].String\nlist?.[i].String()\nlist?.[i]?.Bar\nlist?.[i]?.String\nlist?.[i]?.String()\nlist?.[int(1.0)]\nlist?.[max(i)]\nlist?.[mean(i)]\nlist?.[median(0)]\nlist[$env.i:]\nlist[$env?.i:]\nlist[-1:]\nlist[-i:]\nlist[0:] | map(foo)\nlist[0:] | reduce(#.Bar)\nlist[0:] | reduce(1.0)\nlist[0:] | reduce(str)\nlist[0:]?.[i]\nlist[1 + 0:]\nlist[1 ?? 0:]\nlist[1:] | findLast(true)\nlist[1:] | map(0)\nlist[1:] | map(ok)\nlist[1:] | reduce(foo)\nlist[1:][:i]\nlist[:$env.i]\nlist[:$env?.i]\nlist[:-i]\nlist[:0 * 0]\nlist[:0] | findIndex(nil != foo)\nlist[:0] | map(str)\nlist[:1] ?? list\nlist[:1] | groupBy(ok)\nlist[:1] | one(ok)\nlist[:1] | sortBy(foo)\nlist[:]\nlist[:] | map(#index)\nlist[:]?.[i]\nlist[:array?.[i]]\nlist[:bitnot(1)]\nlist[:bitnot(i)]\nlist[:count(array, ok)]\nlist[:i]\nlist[:i] | any(ok)\nlist[:i] | filter(true)\nlist[:i] | groupBy(ok)\nlist[:i] | sum(f64)\nlist[:mean(i)]\nlist[:median(0)]\nlist[:median(array)]\nlist[:min(i)]\nlist[:sum(array)]\nlist[add(1, 0):]\nlist[array?.[i]:]\nlist[f64 ?? false:]\nlist[i:]\nlist[i:] ?? greet\nlist[i:] | findIndex(ok)\nlist[i:] | groupBy(true)\nlist[i:] | sortBy(0)\nlist[i:i]\nlist[int(1.0):]\nlist[len($env):]\nlist[min(array):]\nlist[sum(array):]\nlower($env | reduce(str, 1.0))\nlower($env.str)\nlower($env?.[str])\nlower($env?.str)\nlower(false ? array : str)\nlower(foo.Bar)\nlower(foo.String())\nlower(foo?.Bar)\nlower(foo?.String())\nlower(greet($env?.str))\nlower(greet(str))\nlower(greet(string(nil)))\nlower(greet(toJSON(array)))\nlower(list?.[i]?.Bar)\nlower(lower(str))\nlower(reduce(array, str))\nlower(repeat(str, 0))\nlower(str + str)\nlower(str ?? $env)\nlower(str ?? 0)\nlower(str ?? 1.0)\nlower(str ?? array)\nlower(str ?? f64)\nlower(str ?? foo)\nlower(str ?? foo?.Bar)\nlower(str ?? ok)\nlower(str ?? true)\nlower(str | greet())\nlower(str)\nlower(str) < str\nlower(str) == $env != false\nlower(str) == str\nlower(str) > str\nlower(str) ?? add\nlower(str) ?? f64\nlower(str) ?? trim(str)\nlower(str) endsWith str\nlower(str) | greet()\nlower(str[1:])\nlower(string($env))\nlower(string(0))\nlower(string(1))\nlower(string(1.0))\nlower(string(add))\nlower(string(array))\nlower(string(f64))\nlower(string(false))\nlower(string(foo))\nlower(string(i))\nlower(string(list))\nlower(string(nil))\nlower(string(ok))\nlower(string(str))\nlower(string(true))\nlower(toBase64(str))\nlower(toJSON(0))\nlower(toJSON(1.0))\nlower(toJSON(array))\nlower(toJSON(f64))\nlower(toJSON(false))\nlower(toJSON(foo))\nlower(toJSON(i))\nlower(toJSON(list))\nlower(toJSON(nil))\nlower(toJSON(ok))\nlower(toJSON(str))\nlower(toJSON(true))\nlower(trim(foo?.Bar))\nlower(trim(str))\nlower(trimPrefix(str))\nlower(trimSuffix(str))\nlower(type($env))\nlower(type(0))\nlower(type(1))\nlower(type(1.0))\nlower(type(add))\nlower(type(array))\nlower(type(f64))\nlower(type(false))\nlower(type(foo))\nlower(type(greet))\nlower(type(i))\nlower(type(list))\nlower(type(nil))\nlower(type(ok))\nlower(type(str))\nlower(type(true))\nlower(upper(str))\nmap($env ?? $env, ok)\nmap($env ?? 1.0, ok)\nmap($env | filter(false), #.add)\nmap($env | filter(false), $env - #.str)\nmap($env | map(#index), f64)\nmap($env | map(foo), #.String)\nmap($env, #index) | filter(false)\nmap($env, #index) | map(greet)\nmap($env, #index) | reduce($env)\nmap($env, #index) | reduce(0, $env)\nmap($env, #index)?.[i]\nmap($env, $env) ?? timezone(str)\nmap($env, $env) in last($env)\nmap($env, $env) | any(f64 == .foo)\nmap($env, $env) | count(ok)\nmap($env, $env) | findLast(ok)\nmap($env, $env) | map(array)\nmap($env, $env) | map(foo)\nmap($env, $env) | reduce($env)\nmap($env, $env) | reduce(.f64, false)\nmap($env, $env) | reduce(0)\nmap($env, $env) | sum(1)\nmap($env, $env)?.[i]\nmap($env, 0) != i .. 0\nmap($env, 0) ?? greet\nmap($env, 0) ?? list\nmap($env, 0) | map($env)\nmap($env, 0) | map(str)\nmap($env, 0) | reduce(ok, i)\nmap($env, 0) | sortBy(1.0)\nmap($env, 0)?.[i]\nmap($env, 1) | any(ok)\nmap($env, 1) | count(ok)\nmap($env, 1) | groupBy(foo)\nmap($env, 1) | map(#)\nmap($env, 1) | none(ok)\nmap($env, 1) | reduce(foo)\nmap($env, 1) | sum(#)\nmap($env, 1)?.[i]\nmap($env, 1.0) ?? f64\nmap($env, 1.0) | all(true)\nmap($env, 1.0) | filter(ok)\nmap($env, 1.0) | find(true)\nmap($env, 1.0) | groupBy(#)\nmap($env, 1.0) | map(str)\nmap($env, 1.0) | reduce(ok, add)\nmap($env, 1.0)?.[i]\nmap($env, add) | groupBy(i)\nmap($env, add) | map(false)\nmap($env, add) | reduce(1.0)\nmap($env, add) | reduce(add, false)\nmap($env, add) | sum(f64)\nmap($env, add)?.[i]\nmap($env, array) | findIndex(ok)\nmap($env, array) | map(0)\nmap($env, array) | reduce(f64)\nmap($env, array)?.[i]\nmap($env, f64) | count(ok)\nmap($env, f64) | count(true)\nmap($env, f64) | groupBy(#)\nmap($env, f64) | reduce(#)\nmap($env, f64) | reduce(foo)\nmap($env, f64) | reduce(greet)\nmap($env, f64) | sortBy(#)\nmap($env, f64) | sortBy(i)\nmap($env, f64) | sum(#)\nmap($env, f64)?.[i]\nmap($env, f64)[:]\nmap($env, false) | filter(false)\nmap($env, false) | find(#)\nmap($env, false) | map(#)\nmap($env, false) | map(1.0)\nmap($env, false) | map(greet)\nmap($env, false) | reduce(str, nil)\nmap($env, false)?.[i]\nmap($env, foo) == list\nmap($env, foo) ?? list\nmap($env, foo) ?? str\nmap($env, foo) not in [add, f64]\nmap($env, foo) | all(.Bar not startsWith .Bar)\nmap($env, foo) | findLastIndex(true)\nmap($env, foo) | get(1)\nmap($env, foo) | groupBy(#)\nmap($env, foo) | map($env)\nmap($env, foo) | map(f64)\nmap($env, foo) | map(foo)\nmap($env, foo) | map(greet)\nmap($env, foo) | map(list)\nmap($env, foo) | none(true)\nmap($env, foo) | reduce(#)\nmap($env, foo) | reduce(list)\nmap($env, foo) | sortBy(.Bar)\nmap($env, foo) | sortBy(str)\nmap($env, foo)?.[i]\nmap($env, greet) ?? list\nmap($env, greet) | all(ok)\nmap($env, greet) | findLast(false)\nmap($env, greet) | map(1)\nmap($env, greet) | map(greet)\nmap($env, greet) | reduce(list)\nmap($env, greet) | sortBy(i)\nmap($env, greet)?.[i]\nmap($env, i) == list\nmap($env, i) | any(true)\nmap($env, i) | groupBy(f64)\nmap($env, i) | one(ok)\nmap($env, i) | sortBy(1.0)\nmap($env, i)?.[i]\nmap($env, list) ?? str\nmap($env, list) | filter(false)\nmap($env, list) | map($env)\nmap($env, list) | map(greet)\nmap($env, list) | map(str)\nmap($env, list) | reduce(1.0)\nmap($env, list) | reduce(foo)\nmap($env, list) | reduce(list)\nmap($env, list)?.[i]\nmap($env, ok) | findLastIndex(#)\nmap($env, ok) | findLastIndex(false)\nmap($env, ok) | one(1.0 == nil)\nmap($env, ok) | reduce(false)\nmap($env, ok)?.[i]\nmap($env, str) | find(ok)\nmap($env, str) | find(true)\nmap($env, str) | findIndex(false)\nmap($env, str) | groupBy(#)\nmap($env, str) | map(1)\nmap($env, str) | sortBy(str)\nmap($env, str)?.[i]\nmap($env, true) ?? ok\nmap($env, true) | any(#)\nmap($env, true) | filter(true)\nmap($env, true) | find(#)\nmap($env, true) | groupBy(0)\nmap($env, true) | map(#)\nmap($env, true) | map(f64)\nmap($env, true) | reduce(foo)\nmap($env, true) | sortBy(1.0)\nmap($env, true)?.[i]\nmap($env.array, #)\nmap($env.array, #index - 1.0)\nmap($env.array, #index)\nmap($env.array, add)\nmap($env.array, foo)\nmap($env.array, list)\nmap($env.array, mean(0))\nmap($env.array, not true)\nmap($env.array, ok)\nmap($env.array, str)\nmap($env.list, #)\nmap($env.list, #index)\nmap($env.list, .String)\nmap($env.list, 0 >= 1.0)\nmap($env.list, array)\nmap($env.list, f64 ^ f64)\nmap($env.list, greet)\nmap($env.list, i)\nmap($env.list, list)\nmap($env.list, ok)\nmap($env.list, sortBy(array, 1.0))?.[i]\nmap($env.list, str)\nmap($env?.[str], # ** #)\nmap($env?.[str], #)\nmap($env?.[str], #index != #)\nmap($env?.[str], #index)\nmap($env?.[str], 0 <= 1.0)\nmap($env?.[str], array)\nmap($env?.[str], f64 - 1.0)\nmap($env?.[str], foo ?? #.array)\nmap($env?.[str], foo)\nmap($env?.[str], greet)\nmap($env?.[str], i != f64)\nmap($env?.[str], i)\nmap($env?.[str], list)\nmap($env?.[str], median(0))\nmap($env?.[str], nil != false)\nmap($env?.[str], ok)\nmap($env?.[str], str)\nmap($env?.array, #)\nmap($env?.array, $env?.i)\nmap($env?.array, add)\nmap($env?.array, all(list, true))\nmap($env?.array, array)\nmap($env?.array, f64)\nmap($env?.array, foo)\nmap($env?.array, greet == greet)\nmap($env?.array, list)\nmap($env?.array, str)\nmap($env?.list, # != $env)\nmap($env?.list, #)\nmap($env?.list, $env?.[String])\nmap($env?.list, add)\nmap($env?.list, count($env, false))\nmap($env?.list, foo)\nmap($env?.list, greet)\nmap($env?.list, i)\nmap($env?.list, list[1:])\nmap($env?.list, median(i))\nmap($env?.list, ok)\nmap($env?.list, trimSuffix(str))\nmap(1 .. 1, list)\nmap([$env], #)\nmap([$env], #.Bar not in #.array)\nmap([$env], #?.f64)\nmap([$env], 1 ^ 1.0)\nmap([$env], add)\nmap([$env], false != #)\nmap([$env], greet)\nmap([$env], true || .array)\nmap([0], #)\nmap([1.0], #)\nmap([1.0], greet)\nmap([1.0], ok)\nmap([1], greet)\nmap([add, i], array)\nmap([array], #)\nmap([false], -1)\nmap([false], list)\nmap([false], ok)\nmap([foo, 1.0], #index)\nmap([foo, true], #)\nmap([foo], #)\nmap([foo], #?.Bar)\nmap([foo], .String)\nmap([foo], 1.0 < 0)\nmap([foo], add)\nmap([foo], f64)\nmap([foo], foo)\nmap([foo], str)\nmap([greet], #)\nmap([greet], array)\nmap([greet], foo)\nmap([i / 1.0], #)\nmap([i, 1.0], #)\nmap([i], #)\nmap([i], ok)\nmap([i], str)\nmap([list], array)\nmap([list], f64 + 1.0)\nmap([list], f64)\nmap([nil], 1.0 <= 1)\nmap([nil], foo)\nmap([nil], list)\nmap([nil], ok)\nmap([nil], str ?? f64)\nmap([ok], #)\nmap([ok], array)\nmap([str], greet)\nmap([true], #)\nmap([true], foo)\nmap([true], i ^ 1.0)\nmap(array ?? 1, i)\nmap(array ?? 1, ok)\nmap(array ?? 1.0, false ? #.add : #)\nmap(array ?? array, add)\nmap(array ?? foo, # > #)\nmap(array ?? foo, add)\nmap(array | map(#), 1.1)\nmap(array | reduce($env), list)\nmap(array | sortBy(#), ok)\nmap(array, !false)\nmap(array, !true)\nmap(array, # != #)\nmap(array, # % i)\nmap(array, # ** #)\nmap(array, # ** 1.0)\nmap(array, # + #)\nmap(array, # + 1)\nmap(array, # .. #)\nmap(array, # .. 0)\nmap(array, # < f64)\nmap(array, # <= #)\nmap(array, # <= 1.0)\nmap(array, # == #)\nmap(array, # > #)\nmap(array, # > 0)\nmap(array, # >= #)\nmap(array, # >= 0)\nmap(array, # ?? #)\nmap(array, # ?? i)\nmap(array, # ^ #)\nmap(array, # ^ 1.0)\nmap(array, # | bitshr(#))\nmap(array, #)\nmap(array, #) ?? add\nmap(array, #) ?? greet\nmap(array, #) | filter(false)\nmap(array, #) | findLastIndex(ok)\nmap(array, #) | findLastIndex(true)\nmap(array, #) | groupBy(#)\nmap(array, #) | map($env)\nmap(array, #) | map(bitnot(1))\nmap(array, #) | map(foo)\nmap(array, #) | map(greet)\nmap(array, #) | reduce($env?.foobar)\nmap(array, #) | reduce(1.0)\nmap(array, #) | sortBy(#)\nmap(array, #)?.[i]\nmap(array, #..i)\nmap(array, #index < 1.0)\nmap(array, #index)\nmap(array, #index) | groupBy(ok)\nmap(array, #index)?.[i]\nmap(array, $env && true)\nmap(array, $env == #)\nmap(array, $env == true)\nmap(array, $env) | all(#.list || true)\nmap(array, $env) | count(#.ok)\nmap(array, $env) | none(.String matches #)\nmap(array, $env) | reduce(1.0)\nmap(array, $env) | reduce(add)\nmap(array, $env) | sortBy(1)\nmap(array, $env)?.[i]\nmap(array, $env.array)\nmap(array, $env.f64)\nmap(array, $env.foo)\nmap(array, $env.greet)\nmap(array, $env.list)\nmap(array, $env.str)\nmap(array, $env?.String)\nmap(array, $env?.[String])\nmap(array, $env?.[foobar])\nmap(array, $env?.[str])\nmap(array, $env?.add)\nmap(array, $env?.array)\nmap(array, $env?.f64)\nmap(array, $env?.greet)\nmap(array, $env?.list)\nmap(array, $env?.ok)\nmap(array, -1)\nmap(array, -1.0)\nmap(array, -f64)\nmap(array, -i)\nmap(array, 0 != #)\nmap(array, 0 % #)\nmap(array, 0 - #)\nmap(array, 0 - 1)\nmap(array, 0 <= #)\nmap(array, 0 | bitxor(#))\nmap(array, 0) | find(false)\nmap(array, 0) | map(array)\nmap(array, 0) | reduce(#)\nmap(array, 0) | sortBy(f64)\nmap(array, 0)?.[i]\nmap(array, 1 != #)\nmap(array, 1 - #)\nmap(array, 1 ^ #)\nmap(array, 1) | map(1)\nmap(array, 1) | one(ok)\nmap(array, 1) | reduce($env)\nmap(array, 1)?.[i]\nmap(array, 1.0 != #)\nmap(array, 1.0 != 1.0)\nmap(array, 1.0 ** #)\nmap(array, 1.0 + #)\nmap(array, 1.0 + 1.0)\nmap(array, 1.0 / 0)\nmap(array, 1.0 <= #)\nmap(array, 1.0 == #)\nmap(array, 1.0 == nil)\nmap(array, 1.0 ?? nil)\nmap(array, 1.0 ^ f64)\nmap(array, 1.0) != array\nmap(array, 1.0) != f64 ?? greet\nmap(array, 1.0) == list\nmap(array, 1.0) | groupBy(#)\nmap(array, 1.0) | groupBy(1.0)\nmap(array, 1.0) | groupBy(ok)\nmap(array, 1.0) | map(#)\nmap(array, 1.0) | map(foo)\nmap(array, 1.0) | reduce($env)\nmap(array, 1.0) | reduce(1.0)\nmap(array, 1.0) | reduce(true)\nmap(array, 1.0) | take(1)\nmap(array, 1.0)?.[i]\nmap(array, [#])\nmap(array, [0, $env])\nmap(array, [f64])\nmap(array, [i])\nmap(array, [nil])\nmap(array, add)\nmap(array, add) | groupBy(foo)\nmap(array, add)?.[i]\nmap(array, array | map(1.0))\nmap(array, array)\nmap(array, array) | all(true)\nmap(array, array) | sum(i)\nmap(array, array)?.[i]\nmap(array, array?.[1])\nmap(array, bitnot(#))\nmap(array, f64 - 1.0)\nmap(array, f64 <= f64)\nmap(array, f64 >= i)\nmap(array, f64)\nmap(array, f64) != list\nmap(array, f64) ?? -1.0\nmap(array, f64) | groupBy(foo)\nmap(array, f64) | reduce(#)\nmap(array, f64)?.[i]\nmap(array, false) | any(#)\nmap(array, false) | count(false)\nmap(array, false) | reduce(greet)\nmap(array, false) | sortBy(str)\nmap(array, false)?.[i]\nmap(array, findIndex($env, ok))\nmap(array, flatten(array))\nmap(array, flatten(list))\nmap(array, float(#))\nmap(array, float(1))\nmap(array, foo != $env)\nmap(array, foo != foo)\nmap(array, foo == foo)\nmap(array, foo ?? ok)\nmap(array, foo)\nmap(array, foo) != array\nmap(array, foo) | count(true)\nmap(array, foo) | findLastIndex(false)\nmap(array, foo) | map(#.Bar)\nmap(array, foo) | map(ok)\nmap(array, foo) | reduce(#)\nmap(array, foo) | reduce(list)\nmap(array, foo) | reduce(str, f64)\nmap(array, foo) | reduce(true)\nmap(array, foo) | sum(0 + 1)\nmap(array, foo)?.[i]\nmap(array, foo)[:]\nmap(array, foo.Bar)\nmap(array, foo.String)\nmap(array, foo?.Bar)\nmap(array, foo?.String)\nmap(array, greet)\nmap(array, greet) | sum(f64)\nmap(array, greet)?.[i]\nmap(array, i * f64)\nmap(array, i < 0)\nmap(array, i == #index)\nmap(array, i)\nmap(array, i) | find(ok)\nmap(array, i)?.[i]\nmap(array, if ok { $env } else { i })\nmap(array, int(#index))\nmap(array, len($env))\nmap(array, list == $env)\nmap(array, list == list)\nmap(array, list)\nmap(array, list)?.[i]\nmap(array, list?.[i])\nmap(array, median(#))\nmap(array, median(1.0))\nmap(array, min(0))\nmap(array, nil != 1.0)\nmap(array, nil != array)\nmap(array, nil == 1.0)\nmap(array, nil ?? list)\nmap(array, not false)\nmap(array, not true)\nmap(array, ok != true)\nmap(array, ok == nil)\nmap(array, ok ?? str)\nmap(array, ok || false)\nmap(array, ok)\nmap(array, ok) ?? float($env)\nmap(array, ok) | count(1 >= 1.0)\nmap(array, ok) | map(1)\nmap(array, ok) | one(true)\nmap(array, ok) | sum(1.0)\nmap(array, ok)?.[i]\nmap(array, reduce(array, foo, #index))\nmap(array, reverse(list))\nmap(array, round(1))\nmap(array, sort(array))\nmap(array, str == nil)\nmap(array, str in foo)\nmap(array, str)\nmap(array, str) == list\nmap(array, str) | groupBy(#)\nmap(array, str) | map(list)\nmap(array, str) | reduce(#)\nmap(array, str)?.[i]\nmap(array, sum(array))\nmap(array, true ? 1 : #)\nmap(array, true ?? #)\nmap(array, true ?? foo)\nmap(array, true) != array\nmap(array, true) | findLast(#)\nmap(array, true)?.[i]\nmap(array, type(1.0))\nmap(array, type(list))\nmap(array[i:], $env?.ok)\nmap(concat(array), # == f64)\nmap(concat(array), greet)\nmap(concat(list), foo)\nmap(false ? foo : list, $env.ok)\nmap(filter(array, true), greet)\nmap(flatten(array), #)\nmap(flatten(array), i)\nmap(flatten(array), str)\nmap(i .. i, array)\nmap(if false { $env } else { list }, #index)\nmap(keys($env), #)\nmap(keys($env), str)\nmap(list ?? 0, # == str)\nmap(list ?? false, f64)\nmap(list ?? true, list)\nmap(list | map($env), #)\nmap(list | map(.Bar), #)\nmap(list | map(.Bar), greet)\nmap(list | sortBy(1.0), .String)\nmap(list | sortBy(1.0), string(#))\nmap(list | sortBy(str), f64)\nmap(list, # != #)\nmap(list, # == #)\nmap(list, # == foo)\nmap(list, # ?? #)\nmap(list, # ?? #index)\nmap(list, # ?? $env)\nmap(list, # ?? .Bar)\nmap(list, # ?? greet)\nmap(list, #)\nmap(list, #) == array\nmap(list, #) ?? greet\nmap(list, #) | any(false)\nmap(list, #) | any(ok)\nmap(list, #) | findIndex(ok)\nmap(list, #) | findIndex(true)\nmap(list, #) | findLastIndex(ok)\nmap(list, #) | groupBy(#)\nmap(list, #) | groupBy(1.0)\nmap(list, #) | groupBy(foo)\nmap(list, #) | map(#)\nmap(list, #) | map(1.0)\nmap(list, #) | map(true)\nmap(list, #) | one(false)\nmap(list, #) | one(true)\nmap(list, #) | reduce(#.String, foo)\nmap(list, #) | reduce(#acc, 1)\nmap(list, #) | reduce(1.0, nil)\nmap(list, #) | reduce(f64, list)\nmap(list, #) | sortBy(1.0)\nmap(list, #) | take(1)\nmap(list, #)?.[i]\nmap(list, #.Bar <= #.Bar)\nmap(list, #.Bar)\nmap(list, #.String)\nmap(list, #.String) ?? i\nmap(list, #.String)?.[i]\nmap(list, #?.Bar)\nmap(list, #?.String)\nmap(list, #index + i)\nmap(list, #index - 1)\nmap(list, #index | add(i))\nmap(list, #index)\nmap(list, #index) ?? $env ?? nil\nmap(list, #index)?.[i]\nmap(list, $env != #)\nmap(list, $env != foo)\nmap(list, $env != greet)\nmap(list, $env != nil)\nmap(list, $env ?? 1.0)\nmap(list, $env) ?? $env.ok\nmap(list, $env) ?? array\nmap(list, $env) | findIndex(.ok)\nmap(list, $env) | findLastIndex(#.foo != #)\nmap(list, $env) | map(1.0)\nmap(list, $env) | map(foo)\nmap(list, $env) | reduce(#.ok)\nmap(list, $env) | reduce(1.0)\nmap(list, $env)?.[i]\nmap(list, $env.add)\nmap(list, $env.f64)\nmap(list, $env.foo)\nmap(list, $env.greet)\nmap(list, $env?.[.Bar])\nmap(list, $env?.[Bar])\nmap(list, $env?.[String])\nmap(list, $env?.[str])\nmap(list, $env?.add)\nmap(list, $env?.array)\nmap(list, $env?.f64)\nmap(list, $env?.foo)\nmap(list, $env?.foobar)\nmap(list, $env?.greet)\nmap(list, $env?.i)\nmap(list, $env?.ok)\nmap(list, $env?.str)\nmap(list, -#index)\nmap(list, .Bar)\nmap(list, .Bar) | sum(1)\nmap(list, .String)\nmap(list, .String) | filter(true)\nmap(list, .String) | map(#)\nmap(list, .String) | sum(i)\nmap(list, .String)?.[i]\nmap(list, 0 <= 1.0)\nmap(list, 0 > 1)\nmap(list, 0) | groupBy(foo)\nmap(list, 0) | sortBy(#)\nmap(list, 0) | sum(#)\nmap(list, 1 == 1.0)\nmap(list, 1) | all(false)\nmap(list, 1) | groupBy(#)\nmap(list, 1) | map(list)\nmap(list, 1)?.[i]\nmap(list, 1.0 / i)\nmap(list, 1.0 >= 1.0)\nmap(list, 1.0 ?? #.Bar)\nmap(list, 1.0 ?? list)\nmap(list, 1.0) != array\nmap(list, 1.0) ?? array\nmap(list, 1.0) | any(# < i)\nmap(list, 1.0) | findLast(true)\nmap(list, 1.0) | groupBy(#)\nmap(list, 1.0) | reduce(foo)\nmap(list, 1.0) | sortBy(#)\nmap(list, 1.0)?.[i]\nmap(list, [$env, nil, add])\nmap(list, [foo])\nmap(list, [ok])\nmap(list, abs(1))\nmap(list, abs(1.0))\nmap(list, add ?? #)\nmap(list, add ?? list)\nmap(list, add)\nmap(list, add)?.[i]\nmap(list, array)\nmap(list, array) ?? list\nmap(list, array) | one(ok)\nmap(list, array) | one(true)\nmap(list, array)?.[i]\nmap(list, array?.[i])\nmap(list, bitnot(0))\nmap(list, bitnot(i))\nmap(list, ceil(1.0))\nmap(list, f64 != 1.0)\nmap(list, f64 * 0)\nmap(list, f64 / 1.0)\nmap(list, f64)\nmap(list, f64) | groupBy(#)\nmap(list, f64) | map($env)\nmap(list, f64) | none(true)\nmap(list, f64) | reduce(1)\nmap(list, false ?? foo)\nmap(list, false) | groupBy(foo)\nmap(list, false) | map(#)\nmap(list, float(0))\nmap(list, floor(1.0))\nmap(list, foo == #)\nmap(list, foo ?? #)\nmap(list, foo ?? foo)\nmap(list, foo not in list)\nmap(list, foo)\nmap(list, foo) ?? f64\nmap(list, foo) | none(false)\nmap(list, foo) | reduce(#, add)\nmap(list, foo) | reduce(#.String)\nmap(list, foo) | reduce(1)\nmap(list, foo) | reduce(array)\nmap(list, foo) | sum(0)\nmap(list, foo)?.[i]\nmap(list, foo.Bar)\nmap(list, foo.String)\nmap(list, foo?.Bar)\nmap(list, foo?.String())\nmap(list, greet ?? nil)\nmap(list, greet(#.Bar))\nmap(list, greet(str))\nmap(list, greet)\nmap(list, greet) | findIndex(true)\nmap(list, greet)?.[i]\nmap(list, i == $env)\nmap(list, i >= 0)\nmap(list, i)\nmap(list, i) != list\nmap(list, i) != nil or true\nmap(list, i) | groupBy(# < #)\nmap(list, i) | reduce(#)\nmap(list, i) | sortBy(#)\nmap(list, i)?.[i]\nmap(list, list)\nmap(list, list) | map(str)\nmap(list, list) | sum(f64)\nmap(list, list)?.[i]\nmap(list, max(1))\nmap(list, max(f64))\nmap(list, mean(array))\nmap(list, nil != add)\nmap(list, nil ?? #)\nmap(list, nil in $env)\nmap(list, none($env, true))\nmap(list, not true)\nmap(list, ok ? str : foo)\nmap(list, ok ?? 0)\nmap(list, ok or ok)\nmap(list, ok)\nmap(list, ok) | map(false)\nmap(list, ok)?.[i]\nmap(list, reverse(list))\nmap(list, round(f64))\nmap(list, sort(array))\nmap(list, str ?? 0)\nmap(list, str not in #)\nmap(list, str)\nmap(list, str) | findLast(false)\nmap(list, str) | map(#)\nmap(list, str) | reduce(#)\nmap(list, string(#))\nmap(list, string(f64))\nmap(list, sum(array))\nmap(list, toJSON(1))\nmap(list, trim(str))\nmap(list, true ? array : f64)\nmap(list, true ?? #index)\nmap(list, true)?.[i]\nmap(list, type(#))\nmap(list, type($env))\nmap(list, upper(#.Bar))\nmap(list[:1], f64)\nmap(map($env, $env), greet)\nmap(map($env, 0), str == str)\nmap(map(array, #), #)\nmap(map(array, array), greet)\nmap(map(array, list), str)\nmap(map(list, 1), list)\nmap(map(list, f64), ok)\nmap(map(list, str), map($env, 1.0))\nmap(max($env), greet)\nmap(min($env), f64)\nmap(nil ?? $env, str)\nmap(nil ?? array, 1.0 != 1.0)\nmap(reduce($env, list, $env), foo)\nmap(reduce(array, $env), foo.String())\nmap(reverse(array), str)\nmap(sort($env), #.String contains #.list)\nmap(sort($env), #.String.i)\nmap(sort($env), #.array.greet)\nmap(sort($env), #.greet.foo)\nmap(sort($env), #.greet?.Bar(Bar))\nmap(sort($env), add)\nmap(sort($env), array?.[#])\nmap(sort($env), lower(#))\nmap(sort($env), ok)\nmap(sort($env), str not matches $env)\nmap(sort($env), str)\nmap(sort(array), list?.[i])\nmap(sort(array), ok)\nmap(sortBy(array, 1.0), #)\nmap(sortBy(array, str), # >= #index)\nmap(str ?? foo, #)\nmap(str ?? foo, f64)\nmap(str ?? foo, i)\nmap(toPairs($env), f64)\nmap(toPairs($env), list | sortBy(1))\nmap(true ? array : false, $env?.greet)\nmap(uniq(list), ok)\nmap(uniq(list), reduce(list, foo))\nmap(values($env), #)\nmax($env ?? $env)\nmax($env ?? 1)\nmax($env ?? add)\nmax($env ?? array)\nmax($env ?? f64)\nmax($env ?? foo)\nmax($env ?? list)\nmax($env ?? nil)\nmax($env ?? str)\nmax($env ?? true)\nmax($env | count(ok))\nmax($env | count(true))\nmax($env | find(false))\nmax($env | findIndex(ok))\nmax($env | findLast(false))\nmax($env | findLastIndex(false))\nmax($env | findLastIndex(ok))\nmax($env | findLastIndex(true))\nmax($env | map(#index))\nmax($env | map(0))\nmax($env | map(1))\nmax($env | sum(i))\nmax($env) != $env?.array\nmax($env) != greet\nmax($env) == $env?.foo\nmax($env) == f64\nmax($env) == list\nmax($env) == ok\nmax($env) ?? i\nmax($env) ?? list\nmax($env) not in list\nmax($env) | all(ok)\nmax($env) | count($env.ok)\nmax($env) | count(false)\nmax($env) | count(true)\nmax($env) | find(false)\nmax($env) | map(1.0)\nmax($env) | map(add)\nmax($env) | map(f64)\nmax($env) | map(greet)\nmax($env) | map(i)\nmax($env) | map(str)\nmax($env) | none(ok)\nmax($env) | sum(0)\nmax($env) | sum(1.0)\nmax($env).Bar\nmax($env).Bar?.i().str\nmax($env).Bar?.str\nmax($env).String\nmax($env).String?.[array]\nmax($env).String?.[str]\nmax($env).add\nmax($env).array\nmax($env).f64\nmax($env).foo\nmax($env).foobar\nmax($env).foobar?.[add]\nmax($env).foobar?.[greet]\nmax($env).foobar?.foo\nmax($env).foobar?.str\nmax($env).greet\nmax($env).greet(foobar)\nmax($env).i\nmax($env).list\nmax($env).not\nmax($env).ok\nmax($env).str\nmax($env)?.$env?.Bar\nmax($env)?.$env?.foo(1.0)\nmax($env)?.Bar\nmax($env)?.String\nmax($env)?.String?.[str]\nmax($env)?.[str]\nmax($env)?.[str]?.[i]\nmax($env)?.add\nmax($env)?.array\nmax($env)?.array not in list\nmax($env)?.f64\nmax($env)?.foo\nmax($env)?.foobar?.[add]\nmax($env)?.foobar?.[greet]\nmax($env)?.greet\nmax($env)?.greet(foobar)\nmax($env)?.i\nmax($env)?.list\nmax($env)?.list?.[f64]\nmax($env)?.not\nmax($env)?.ok\nmax($env)?.str\nmax($env)?.str?.[f64]\nmax($env.array ?? array)\nmax($env.array)\nmax($env.array, array)\nmax($env.f64)\nmax($env.f64, sum(array))\nmax($env.i)\nmax($env?.$env)\nmax($env?.Bar)\nmax($env?.Bar)?.[foo]\nmax($env?.Bar)?.foo\nmax($env?.Bar)?.list\nmax($env?.String)\nmax($env?.String)?.[foo]\nmax($env?.String)?.[i]\nmax($env?.String?.[array])\nmax($env?.String?.foo())\nmax($env?.String?.i())\nmax($env?.[Bar])\nmax($env?.[Bar])?.[ok]\nmax($env?.[String])\nmax($env?.[String])?.[i]\nmax($env?.[String])?.foo\nmax($env?.[String]?.[f64])\nmax($env?.[String]?.[str])\nmax($env?.[String]?.ok)\nmax($env?.[foobar])\nmax($env?.[nil])\nmax($env?.[str])\nmax($env?.[str]) | reduce(ceil(#))\nmax($env?.[str]?.[f64])\nmax($env?.array)\nmax($env?.f64 ^ i)\nmax($env?.f64)\nmax($env?.f64, i)\nmax($env?.false)\nmax($env?.foobar)\nmax($env?.i)\nmax($env?.nil)\nmax($env?.true)\nmax(-0)\nmax(-1)\nmax(-1.0)\nmax(-f64)\nmax(-i)\nmax(-median(1, 0))\nmax(0 % 1)\nmax(0 % i)\nmax(0 * 0)\nmax(0 * 1)\nmax(0 * 1.0)\nmax(0 ** 1)\nmax(0 ** f64)\nmax(0 + 0)\nmax(0 + 1)\nmax(0 + 1.0)\nmax(0 + f64)\nmax(0 - 0)\nmax(0 - 1)\nmax(0 - 1.0)\nmax(0 - f64)\nmax(0 - i)\nmax(0 .. 1)\nmax(0 .. 1, i)\nmax(0 .. i)\nmax(0 / 0)\nmax(0 / 1)\nmax(0 ?? $env)\nmax(0 ?? 1)\nmax(0 ?? add)\nmax(0 ?? array)\nmax(0 ?? f64)\nmax(0 ?? false)\nmax(0 ?? greet)\nmax(0 ?? ok)\nmax(0 ^ 0)\nmax(0 ^ 1)\nmax(0 ^ 1.0)\nmax(0 ^ f64)\nmax(0 ^ i)\nmax(0 | min(1.0, 1.0))\nmax(0) != 0 || ok\nmax(0) - i\nmax(0) < i\nmax(0) == f64\nmax(0) ?? -f64\nmax(0) ?? f64\nmax(0) not in array\nmax(0..i)\nmax(0.0)\nmax(0.1)\nmax(1 * 0)\nmax(1 * 1.0)\nmax(1 * i)\nmax(1 ** 0)\nmax(1 ** 1.0)\nmax(1 + 0)\nmax(1 + 1)\nmax(1 + f64)\nmax(1 + i)\nmax(1 - 1)\nmax(1 - 1.0)\nmax(1 - f64)\nmax(1 - i)\nmax(1 .. 1)\nmax(1 / 1.0)\nmax(1 / f64)\nmax(1 / i)\nmax(1 ?? 1.0)\nmax(1 ?? f64)\nmax(1 ?? false)\nmax(1 ?? foo)\nmax(1 ?? list)\nmax(1 ?? list, array)\nmax(1 ?? ok)\nmax(1 ^ $env?.i)\nmax(1 ^ 0)\nmax(1 ^ 1.0)\nmax(1 ^ i)\nmax(1 | bitshr(1))\nmax(1 | max(1.0))\nmax(1) * i\nmax(1) ** f64\nmax(1) ** i\nmax(1) .. i\nmax(1) / i\nmax(1) < f64\nmax(1) < i\nmax(1) ?? $env.ok\nmax(1, 1.0) < f64\nmax(1, 1.0) in array\nmax(1.0 * 0)\nmax(1.0 * 1)\nmax(1.0 * 1.0)\nmax(1.0 * f64)\nmax(1.0 * i)\nmax(1.0 ** 0)\nmax(1.0 ** 1)\nmax(1.0 ** 1.0)\nmax(1.0 ** f64)\nmax(1.0 ** i)\nmax(1.0 + 0)\nmax(1.0 + 1)\nmax(1.0 + 1.0)\nmax(1.0 + f64)\nmax(1.0 + i)\nmax(1.0 - 0)\nmax(1.0 - 1)\nmax(1.0 - 1.0)\nmax(1.0 - f64)\nmax(1.0 - i)\nmax(1.0 / 0)\nmax(1.0 / 1.0)\nmax(1.0 / i)\nmax(1.0 ?? $env)\nmax(1.0 ?? 1.0)\nmax(1.0 ?? array)\nmax(1.0 ?? f64)\nmax(1.0 ?? false)\nmax(1.0 ?? false, i)\nmax(1.0 ?? foo)\nmax(1.0 ?? greet)\nmax(1.0 ?? i)\nmax(1.0 ?? nil)\nmax(1.0 ?? ok)\nmax(1.0 ^ 0)\nmax(1.0 ^ 1)\nmax(1.0 ^ 1.0)\nmax(1.0 ^ f64)\nmax(1.0 ^ i)\nmax(1.0)\nmax(1.0) ** i\nmax(1.0) - i\nmax(1.0) < i\nmax(1.0) <= $env.f64\nmax(1.0) <= i\nmax(1.0) > 1 - i\nmax(1.0) > f64\nmax(1.0) >= i\nmax(1.0) ?? i\nmax(1.0) ?? list\nmax(1.0) ?? ok\nmax(1.0) ^ f64\nmax(1.0) | min(array)\nmax(1.0, 1.0) ?? greet\nmax(1.0, array) >= floor(1.0)\nmax([0])\nmax([1.0])\nmax([1])\nmax([array, 1.0])\nmax([array])\nmax([f64, 1.0] ?? add)\nmax([f64])\nmax([i])\nmax(abs(0))\nmax(abs(1))\nmax(abs(1.0))\nmax(abs(f64))\nmax(abs(i))\nmax(add ?? $env)\nmax(add ?? f64)\nmax(add ?? i)\nmax(add(0, 0))\nmax(array ?? false)\nmax(array ?? greet)\nmax(array ?? i)\nmax(array | find(false))\nmax(array | findLast(ok))\nmax(array | findLast(true))\nmax(array | get(i))\nmax(array | map(1.0))\nmax(array | map(i))\nmax(array | reduce(#index))\nmax(array | reduce($env))\nmax(array | reduce($env, 0))\nmax(array | reduce(0))\nmax(array | reduce(1.0, foo))\nmax(array | reduce(i))\nmax(array | sortBy(#))\nmax(array | sortBy(0))\nmax(array | sortBy(1))\nmax(array | sortBy(1.0))\nmax(array | sortBy(f64))\nmax(array | sum(0))\nmax(array | sum(i))\nmax(array)\nmax(array) != array\nmax(array) != i\nmax(array) ** f64\nmax(array) ** i\nmax(array) - f64\nmax(array) / median(1)\nmax(array) == i\nmax(array) == str\nmax(array) > f64\nmax(array) ?? greet\nmax(array) ?? ok\nmax(array, abs(i))\nmax(array, array)\nmax(array, f64)\nmax(array, i)\nmax(array, int(0))\nmax(array?.[1])\nmax(array?.[i])\nmax(array[:])\nmax(bitnand(i, i))\nmax(bitnot(0))\nmax(bitnot(1))\nmax(bitnot(i))\nmax(bitor(1, 1))\nmax(bitushr(0, 1))\nmax(bitxor(0, 0))\nmax(bitxor(1, 0))\nmax(ceil(0))\nmax(ceil(1))\nmax(ceil(1.0))\nmax(ceil(f64))\nmax(ceil(i))\nmax(concat(array))\nmax(count(array, true))\nmax(count(list, false))\nmax(count(list, ok))\nmax(f64 * 1.0)\nmax(f64 * f64)\nmax(f64 * i)\nmax(f64 ** 0)\nmax(f64 ** 1)\nmax(f64 ** 1.0)\nmax(f64 ** i)\nmax(f64 + 0)\nmax(f64 + 1)\nmax(f64 + 1.0)\nmax(f64 - 1.0)\nmax(f64 - i)\nmax(f64 / 0)\nmax(f64 / 1)\nmax(f64 / 1.0)\nmax(f64 ?? $env)\nmax(f64 ?? 0)\nmax(f64 ?? 1.0)\nmax(f64 ?? foo)\nmax(f64 ?? greet)\nmax(f64 ?? i)\nmax(f64 ?? nil)\nmax(f64 ?? ok)\nmax(f64 ^ 1)\nmax(f64 ^ 1.0)\nmax(f64 ^ i)\nmax(f64)\nmax(f64) != f64\nmax(f64) ** f64\nmax(f64) / f64\nmax(f64) < i\nmax(f64) <= 0 * f64\nmax(f64) <= f64\nmax(f64) == f64\nmax(f64) >= f64\nmax(f64) ?? add\nmax(f64) ^ f64\nmax(f64) not in array\nmax(f64, $env?.array)\nmax(f64, 1.0 ** 1.0)\nmax(f64, array)\nmax(f64, array, array)\nmax(f64, f64)\nmax(f64, i)\nmax(f64, median(0))\nmax(f64, min(1, 1))\nmax(false ? foo : 0)\nmax(false ? nil : $env)\nmax(false ? nil : array)\nmax(false ? str : 0)\nmax(false ?: foo)\nmax(false ?? $env)\nmax(false ?? 1.0)\nmax(false ?? foo)\nmax(findLast($env, false))\nmax(findLastIndex($env, true))\nmax(findLastIndex(array, false))\nmax(findLastIndex(array, ok))\nmax(findLastIndex(array, true))\nmax(findLastIndex(list, false))\nmax(first($env))\nmax(first(array))\nmax(first(array), array)\nmax(flatten(array))\nmax(float(0))\nmax(float(1))\nmax(float(1.0))\nmax(float(f64))\nmax(float(i))\nmax(floor(1))\nmax(floor(1.0))\nmax(floor(i))\nmax(foo ?? $env)\nmax(foo ?? $env[foo:])\nmax(foo ?? 0)\nmax(foo ?? 1)\nmax(foo ?? 1.0)\nmax(foo ?? add)\nmax(foo ?? array)\nmax(foo ?? f64)\nmax(foo ?? false)\nmax(foo ?? greet)\nmax(foo ?? i)\nmax(foo ?? list)\nmax(foo ?? ok)\nmax(foo ?? true)\nmax(get($env, nil))\nmax(greet ?? $env)\nmax(greet ?? 0)\nmax(greet ?? 1)\nmax(greet ?? add)\nmax(greet ?? array)\nmax(greet ?? false)\nmax(greet ?? foo)\nmax(greet ?? list)\nmax(i % 1)\nmax(i % i)\nmax(i * 0)\nmax(i * 1)\nmax(i * 1.0)\nmax(i * i, i)\nmax(i ** 0)\nmax(i ** 1)\nmax(i ** 1.0)\nmax(i ** f64)\nmax(i ** i)\nmax(i + 0)\nmax(i + 1.0)\nmax(i + f64)\nmax(i - 1)\nmax(i - 1.0)\nmax(i - i)\nmax(i .. 0)\nmax(i .. 1)\nmax(i / 1)\nmax(i / 1.0)\nmax(i / i)\nmax(i ?? 0)\nmax(i ?? 1.0)\nmax(i ?? add)\nmax(i ?? list)\nmax(i ?? nil)\nmax(i ?? ok)\nmax(i ?? true)\nmax(i ^ 0)\nmax(i ^ i)\nmax(i | bitor(i))\nmax(i | bitshl(0))\nmax(i | max(1))\nmax(i | min(f64))\nmax(i)\nmax(i) + f64\nmax(i) - f64\nmax(i) < f64\nmax(i) <= f64\nmax(i) >= i\nmax(i) ?? str\nmax(i) not in array\nmax(i) | bitushr(i)\nmax(i) | bitxor(0)\nmax(i) | min(1.0)\nmax(i, array)\nmax(i, array, i)\nmax(i, f64)\nmax(i, i)\nmax(i, min(1.0))\nmax(i..i)\nmax(if false { 0 } else { nil })\nmax(if false { array } else { nil })\nmax(if false { ok } else { 1.0 })\nmax(if ok { $env } else { 1.0 })\nmax(if ok { foo } else { 1.0 })\nmax(if ok { ok } else { 0 })\nmax(if true { $env } else { f64 })\nmax(int(0))\nmax(int(1))\nmax(int(1.0))\nmax(int(f64))\nmax(int(i))\nmax(int(sum(array, 1.0)))\nmax(last($env))\nmax(last($env)?.ok)\nmax(last(array))\nmax(len($env))\nmax(len(array))\nmax(len(list))\nmax(len(str))\nmax(let foobar = f64; foobar)\nmax(let tmp = $env; tmp)\nmax(list | count(ok))\nmax(list | count(true))\nmax(list | filter(false))\nmax(list | map(f64))\nmax(list | reduce($env))\nmax(list) startsWith str and false\nmax(map($env, #index))\nmax(map($env, 0))\nmax(map($env, 1.0))\nmax(map($env, array))\nmax(map(array, #index))\nmax(map(array, 1))\nmax(map(array, array))\nmax(map(array, f64))\nmax(map(list, 1))\nmax(map(list, i))\nmax(max($env))\nmax(max($env.array))\nmax(max($env?.Bar))\nmax(max(0))\nmax(max(1))\nmax(max(1.0))\nmax(max(array))\nmax(max(array?.[i]))\nmax(max(f64))\nmax(max(f64, 1))\nmax(max(i))\nmax(mean(0))\nmax(mean(0, f64))\nmax(mean(1))\nmax(mean(1.0))\nmax(mean(1.0, 1.0))\nmax(mean(array))\nmax(mean(f64))\nmax(mean(i))\nmax(mean(i), array)\nmax(median(0))\nmax(median(1))\nmax(median(1.0))\nmax(median(1.0, array))\nmax(median(array))\nmax(median(array, 1))\nmax(median(f64))\nmax(median(i))\nmax(min($env))\nmax(min(0))\nmax(min(1))\nmax(min(1.0))\nmax(min(1.0, array))\nmax(min(1.0, f64, i))\nmax(min(array))\nmax(min(f64))\nmax(min(i))\nmax(nil ?? $env)\nmax(nil ?? 0)\nmax(nil ?? 1)\nmax(nil ?? 1.0)\nmax(nil ?? f64)\nmax(ok ? 1 : nil)\nmax(ok ? 1.0 : 1)\nmax(ok ? 1.0 : nil)\nmax(ok ? add : $env)\nmax(ok ? f64 : $env)\nmax(ok ?? 1.0)\nmax(ok ?? f64)\nmax(ok ?? foo)\nmax(ok ?? i)\nmax(reduce($env, i, foo))\nmax(reduce(array, #))\nmax(reduce(array, #acc))\nmax(reduce(array, $env))\nmax(reduce(array, $env).String)\nmax(reduce(array, 1.0))\nmax(reduce(list, 0))\nmax(reduce(list, 1.0))\nmax(reduce(list, f64))\nmax(reverse(array))\nmax(round(0))\nmax(round(1))\nmax(round(1.0))\nmax(round(f64))\nmax(round(i))\nmax(sort($env))\nmax(sort(array))\nmax(sortBy(array, #))\nmax(sortBy(array, 1))\nmax(str ?? 0)\nmax(str ?? 1.0)\nmax(str ?? array)\nmax(str ?? foo)\nmax(str ?? i)\nmax(str ?? list)\nmax(sum($env, 1))\nmax(sum($env, 1), i)\nmax(sum($env, 1.0))\nmax(sum($env, f64))\nmax(sum($env?.[str]))\nmax(sum(array))\nmax(sum(array, #))\nmax(sum(array, 1.0))\nmax(sum(list, f64))\nmax(sum(list, i))\nmax(true ? array : false)\nmax(true ?: list)\nmax(true ?? $env?.[str])\nmax(true ?? 1)\nmax(true ?? add)\nmax(true ?? foo)\nmax(uniq(array))\nmax({foo: $env}?.add)\nmax({foo: true, foo: str}?.list)\nmean($env | count(ok))\nmean($env | filter(false))\nmean($env | map(0))\nmean($env | map(1.0))\nmean($env | reduce(1, 1.0))\nmean($env | reduce(1.0, greet))\nmean($env | reduce(array, foo))\nmean($env | reduce(i, nil))\nmean($env | sum(0))\nmean($env.array)\nmean($env.array, median(0))\nmean($env.f64)\nmean($env.i)\nmean($env.i, i)\nmean($env.i, sort(array))\nmean($env?.array)\nmean($env?.f64)\nmean($env?.f64, array)\nmean($env?.f64, f64)\nmean($env?.i)\nmean($env?.i, mean(f64))\nmean(-0)\nmean(-1)\nmean(-1.0)\nmean(-f64)\nmean(-i)\nmean(0 % 1)\nmean(0 * 0)\nmean(0 * 1)\nmean(0 * 1.0)\nmean(0 * i)\nmean(0 ** 0)\nmean(0 ** 1)\nmean(0 ** f64)\nmean(0 ** f64, i)\nmean(0 + 0)\nmean(0 + f64)\nmean(0 + i)\nmean(0 - 0)\nmean(0 - 1.0)\nmean(0 - f64)\nmean(0 .. 0)\nmean(0 / 0)\nmean(0 / 1)\nmean(0 / 1, i)\nmean(0 / 1.0)\nmean(0 / i)\nmean(0 ?? $env)\nmean(0 ?? 0)\nmean(0 ?? 1)\nmean(0 ?? add)\nmean(0 ?? foo)\nmean(0 ?? foo, $env?.array)\nmean(0 ?? i)\nmean(0 ^ 0)\nmean(0 ^ f64)\nmean(0 ^ i)\nmean(0 | bitand(0))\nmean(0) * f64\nmean(0) .. i\nmean(0) / f64\nmean(0) <= i\nmean(0) == f64\nmean(0) | max(f64)\nmean(0, 1.0) >= 1 == nil\nmean(0..i)\nmean(0.1)\nmean(1 % 1)\nmean(1 % i)\nmean(1 * 0)\nmean(1 * 1.0, i)\nmean(1 * i)\nmean(1 ** 0)\nmean(1 + 1)\nmean(1 + 1.0)\nmean(1 + f64)\nmean(1 + i)\nmean(1 - i)\nmean(1 .. 0)\nmean(1 / 0)\nmean(1 / 1)\nmean(1 / 1.0)\nmean(1 / i)\nmean(1 ?? $env)\nmean(1 ?? 0)\nmean(1 ?? 1)\nmean(1 ?? 1.0)\nmean(1 ?? add)\nmean(1 ?? f64)\nmean(1 ?? false)\nmean(1 ?? foo)\nmean(1 ?? ok)\nmean(1 ?? str)\nmean(1 ?? true)\nmean(1 ^ 1)\nmean(1 ^ 1.0)\nmean(1 ^ f64)\nmean(1 ^ i)\nmean(1) * 1.0 ?? add\nmean(1) * i\nmean(1) ** i\nmean(1) <= f64\nmean(1) == f64\nmean(1) == i + 0 ^ f64\nmean(1) ?? array\nmean(1) ?? i\nmean(1) ?? ok\nmean(1) ^ bitnot(1)\nmean(1) not in array\nmean(1, 1) * f64\nmean(1, 1.0) < i\nmean(1, f64) / f64\nmean(1..i)\nmean(1.0 * 0)\nmean(1.0 * 1)\nmean(1.0 * 1.0)\nmean(1.0 * i)\nmean(1.0 ** 0)\nmean(1.0 ** 1)\nmean(1.0 ** 1.0)\nmean(1.0 ** f64)\nmean(1.0 ** i)\nmean(1.0 + 1)\nmean(1.0 + 1.0)\nmean(1.0 + f64)\nmean(1.0 + i)\nmean(1.0 - 0)\nmean(1.0 - 1)\nmean(1.0 - 1.0)\nmean(1.0 - i)\nmean(1.0 / 1)\nmean(1.0 / 1.0)\nmean(1.0 / f64)\nmean(1.0 / i)\nmean(1.0 ?? $env)\nmean(1.0 ?? 1.0)\nmean(1.0 ?? add)\nmean(1.0 ?? array)\nmean(1.0 ?? false)\nmean(1.0 ?? foo)\nmean(1.0 ?? i)\nmean(1.0 ?? list)\nmean(1.0 ?? nil)\nmean(1.0 ?? str)\nmean(1.0 ^ 0)\nmean(1.0 ^ 1)\nmean(1.0 ^ 1.0)\nmean(1.0 ^ f64)\nmean(1.0 ^ i)\nmean(1.0 | max(1.0))\nmean(1.0 | median(array))\nmean(1.0)\nmean(1.0) * i\nmean(1.0) + i\nmean(1.0) / f64\nmean(1.0) == $env or $env\nmean(1.0) > f64\nmean(1.0) >= i\nmean(1.0) >= i || true\nmean(1.0) ?? findIndex($env, $env)\nmean(1.0) ?? greet\nmean(1.0) ?? list\nmean(1.0) ^ i\nmean(1.0) | max(1.0)\nmean(1.0) | max(array)\nmean(1.0, 1.0) < f64\nmean(1.0, 1.0) ?? i\nmean(1.1)\nmean([0, 1.0])\nmean([0, array])\nmean([0])\nmean([1.0])\nmean([1])\nmean([array, 0])\nmean([array])\nmean([f64, i])\nmean([f64])\nmean([i, 1.0])\nmean([i])\nmean(abs(-f64))\nmean(abs(0))\nmean(abs(1))\nmean(abs(1.0))\nmean(abs(f64))\nmean(abs(i))\nmean(abs(i), f64)\nmean(array ?? $env)\nmean(array ?? f64)\nmean(array ?? f64, array)\nmean(array ?? foo)\nmean(array ?? nil)\nmean(array | count(false))\nmean(array | count(true))\nmean(array | filter(ok))\nmean(array | findLastIndex(ok))\nmean(array | map(#index))\nmean(array | map(array))\nmean(array | map(i))\nmean(array | max(0))\nmean(array | max(1.0))\nmean(array | mean(array))\nmean(array | sortBy(#))\nmean(array | sortBy(1))\nmean(array | sum(#))\nmean(array | sum(1.0))\nmean(array)\nmean(array) != add\nmean(array) * f64\nmean(array) .. i\nmean(array) < f64\nmean(array) <= f64\nmean(array) == list\nmean(array) >= f64\nmean(array) >= f64 or ok\nmean(array) ?? i\nmean(array) not in array\nmean(array) | median(array)\nmean(array, -1.0)\nmean(array, array)\nmean(array, f64)\nmean(array, f64, i)\nmean(array, i)\nmean(array, int(1.0))\nmean(array?.[0])\nmean(array?.[1])\nmean(array?.[i])\nmean(array?.[i], i)\nmean(array[:0])\nmean(array[i:0])\nmean(bitand(0, i))\nmean(bitnot(0))\nmean(bitnot(1))\nmean(bitnot(1)) ** f64\nmean(bitnot(i))\nmean(bitor(0, 0))\nmean(bitushr(1, 1))\nmean(ceil(0))\nmean(ceil(1))\nmean(ceil(1.0))\nmean(ceil(abs(f64)))\nmean(ceil(f64))\nmean(ceil(i))\nmean(concat(array))\nmean(f64 * 0)\nmean(f64 * 1)\nmean(f64 * 1.0)\nmean(f64 * i)\nmean(f64 ** 0)\nmean(f64 ** 1.0)\nmean(f64 ** i)\nmean(f64 + 1.0)\nmean(f64 + f64)\nmean(f64 - 1.0)\nmean(f64 - i)\nmean(f64 / 1.0)\nmean(f64 / f64)\nmean(f64 / i)\nmean(f64 ?? $env)\nmean(f64 ?? 1.0)\nmean(f64 ?? greet)\nmean(f64 ?? list)\nmean(f64 ^ 0)\nmean(f64 ^ 1.0)\nmean(f64 | min(1.0))\nmean(f64)\nmean(f64) * i\nmean(f64) ** f64\nmean(f64) - f64\nmean(f64) > f64\nmean(f64) > i\nmean(f64) in $env?.array\nmean(f64, 0) | median(1)\nmean(f64, 1) <= f64\nmean(f64, array)\nmean(f64, f64)\nmean(f64, i)\nmean(f64, reduce(array, 1.0, nil))\nmean(f64, round(i))\nmean(f64, sum(array))\nmean(false ? add : 1.0)\nmean(false ? i : f64)\nmean(false ?: 1)\nmean(filter($env, false))\nmean(filter(array, ok))\nmean(find(array, ok))\nmean(findIndex($env, true))\nmean(findIndex(array, true))\nmean(findLastIndex($env, ok))\nmean(findLastIndex($env, true))\nmean(findLastIndex(array, true))\nmean(findLastIndex(list, ok))\nmean(first(array))\nmean(first(array), i * i)\nmean(flatten(array))\nmean(float(0))\nmean(float(1))\nmean(float(1.0))\nmean(float(f64))\nmean(float(float(f64)))\nmean(float(i))\nmean(floor(0))\nmean(floor(1))\nmean(floor(1.0))\nmean(floor(f64))\nmean(floor(i))\nmean(floor(len(str)))\nmean(i % 1)\nmean(i * 1)\nmean(i * 1.0)\nmean(i ** 0)\nmean(i ** 1.0)\nmean(i ** f64)\nmean(i ** i)\nmean(i + 0)\nmean(i + 1)\nmean(i + 1.0)\nmean(i + i)\nmean(i - 1.0)\nmean(i - f64)\nmean(i .. $env?.i)\nmean(i .. 1)\nmean(i .. i)\nmean(i / 1)\nmean(i / f64)\nmean(i / i)\nmean(i ?? $env)\nmean(i ?? 1.0)\nmean(i ?? array)\nmean(i ?? f64, i)\nmean(i ?? foo)\nmean(i ?? greet)\nmean(i ?? list)\nmean(i ?? nil)\nmean(i ?? str)\nmean(i ?? true)\nmean(i ^ 1.0)\nmean(i | bitxor(i))\nmean(i | max(1, 1.0))\nmean(i | mean(1.0))\nmean(i)\nmean(i) / 1.0 ^ 1.0\nmean(i) <= f64\nmean(i) >= i\nmean(i) ?? $env?.[String]\nmean(i) ^ $env?.i\nmean(i) ^ f64\nmean(i) in array\nmean(i, $env.f64)\nmean(i, -1.0)\nmean(i, 0) + f64\nmean(i, 1 ** f64)\nmean(i, array)\nmean(i, f64)\nmean(i, float(f64))\nmean(i, i)\nmean(i, int(0))\nmean(if false { 1 } else { 0 })\nmean(if ok { 0 } else { foo })\nmean(if ok { 0 } else { nil })\nmean(if ok { f64 } else { 1.0 })\nmean(if true { 1.0 } else { foo })\nmean(if true { f64 } else { false })\nmean(int(0))\nmean(int(1))\nmean(int(1.0))\nmean(int(f64))\nmean(int(i))\nmean(last(array))\nmean(lastIndexOf(str, str))\nmean(len($env))\nmean(len(array))\nmean(len(list))\nmean(let z = f64; 1.0 + z)\nmean(let z = f64; z)\nmean(list | filter(false))\nmean(list | map(1.0))\nmean(list | reduce(1))\nmean(list | reduce(array))\nmean(list | reduce(f64))\nmean(list | sum(1))\nmean(map($env, 1))\nmean(map($env, 1.0))\nmean(map($env, array))\nmean(map($env, f64))\nmean(map(array, #))\nmean(map(array, 0))\nmean(map(array, f64))\nmean(map(list, 0))\nmean(map(list, array))\nmean(map(list, f64))\nmean(max(0))\nmean(max(1.0))\nmean(max(array))\nmean(max(f64))\nmean(max(i))\nmean(max(i), i)\nmean(mean(0))\nmean(mean(1))\nmean(mean(1.0))\nmean(mean(1.0, 0))\nmean(mean(1.0, f64, i))\nmean(mean(array))\nmean(mean(f64))\nmean(mean(f64, f64))\nmean(mean(i))\nmean(median(0))\nmean(median(0, f64))\nmean(median(1))\nmean(median(1, 0))\nmean(median(1, 1.0))\nmean(median(1.0))\nmean(median(1.0, f64))\nmean(median(array))\nmean(median(array, 0))\nmean(median(array, 1))\nmean(median(array, f64))\nmean(median(f64))\nmean(median(i))\nmean(min(0))\nmean(min(1))\nmean(min(1, 1.0))\nmean(min(1.0))\nmean(min(1.0, array))\nmean(min(array))\nmean(min(f64))\nmean(min(f64, array))\nmean(min(i))\nmean(nil ?? 0)\nmean(nil ?? 1)\nmean(nil ?? 1.0)\nmean(nil ?? array)\nmean(nil ?? f64)\nmean(reduce($env, 1.0, 1.0))\nmean(reduce($env, i, greet))\nmean(reduce(array, #))\nmean(reduce(array, 1.0))\nmean(reduce(array, array))\nmean(reduce(array, f64, array))\nmean(reduce(list, 1))\nmean(reduce(list, array))\nmean(reverse(array))\nmean(round(0))\nmean(round(1))\nmean(round(1.0))\nmean(round(f64))\nmean(round(i))\nmean(sort($env))\nmean(sort(array))\nmean(sortBy(array, #))\nmean(sortBy(array, 0))\nmean(sortBy(array, 1.0))\nmean(sum($env, 1))\nmean(sum($env, 1.0))\nmean(sum($env, f64))\nmean(sum(array))\nmean(sum(array, #))\nmean(sum(array, 0))\nmean(sum(array, 1.0))\nmean(true ? 0 : ok)\nmean(true ? 0 : str)\nmean(true ? 1.0 : 1)\nmean(uniq(array ?? 1.0))\nmean(uniq(array))\nmedian($env | count(false))\nmedian($env | findIndex(true))\nmedian($env | findLastIndex(ok))\nmedian($env | map(1))\nmedian($env | map(1.0))\nmedian($env | map(i))\nmedian($env | reduce(f64, greet))\nmedian($env | sum(0))\nmedian($env | sum(1.0))\nmedian($env.array)\nmedian($env.array, f64)\nmedian($env.f64)\nmedian($env.f64, i)\nmedian($env.i)\nmedian($env.i, i)\nmedian($env?.array)\nmedian($env?.array, array)\nmedian($env?.f64)\nmedian($env?.i)\nmedian($env?.i, $env.i)\nmedian(-0)\nmedian(-1)\nmedian(-1.0 ?? true)\nmedian(-1.0)\nmedian(-f64)\nmedian(-i ?? {foo: foo})\nmedian(-i)\nmedian(0 % 1)\nmedian(0 % i)\nmedian(0 * 0)\nmedian(0 * 1)\nmedian(0 * 1.0)\nmedian(0 * f64)\nmedian(0 * i)\nmedian(0 ** 0)\nmedian(0 ** 1.0)\nmedian(0 ** i)\nmedian(0 + 1)\nmedian(0 + 1.0)\nmedian(0 + i)\nmedian(0 - 0)\nmedian(0 - 1)\nmedian(0 - 1.0)\nmedian(0 .. 0)\nmedian(0 .. 1)\nmedian(0 .. i)\nmedian(0 / 0)\nmedian(0 / 1.0)\nmedian(0 / i)\nmedian(0 ?? $env)\nmedian(0 ?? f64)\nmedian(0 ?? false)\nmedian(0 ?? foo)\nmedian(0 ?? greet)\nmedian(0 ?? list)\nmedian(0 ?? nil)\nmedian(0 ^ $env.i)\nmedian(0 ^ 1)\nmedian(0 ^ 1.0)\nmedian(0 | max(1))\nmedian(0) * i\nmedian(0) - f64\nmedian(0) / f64\nmedian(0) == f64\nmedian(0) >= f64\nmedian(0) >= i\nmedian(0) ?? trim($env)\nmedian(0) not in [nil]\nmedian(0, 0) ?? i\nmedian(0.0)\nmedian(0.1)\nmedian(1 % 1)\nmedian(1 * 0)\nmedian(1 * 1)\nmedian(1 * 1.0)\nmedian(1 * i)\nmedian(1 ** 0)\nmedian(1 ** 1)\nmedian(1 ** 1.0)\nmedian(1 ** i)\nmedian(1 + 0)\nmedian(1 + 1)\nmedian(1 + 1.0)\nmedian(1 + f64)\nmedian(1 + i)\nmedian(1 - 0)\nmedian(1 - 1)\nmedian(1 - 1.0)\nmedian(1 - f64)\nmedian(1 .. 0)\nmedian(1 / 1.0)\nmedian(1 / f64)\nmedian(1 / i)\nmedian(1 ?? $env)\nmedian(1 ?? array)\nmedian(1 ?? f64)\nmedian(1 ?? false)\nmedian(1 ?? foo)\nmedian(1 ?? greet)\nmedian(1 ?? str)\nmedian(1 ^ 0)\nmedian(1 ^ 0, f64)\nmedian(1 ^ 1.0)\nmedian(1 ^ f64)\nmedian(1 ^ i)\nmedian(1 | max(array), i)\nmedian(1 | min(array))\nmedian(1) != 1.0 && ok\nmedian(1) != f64\nmedian(1) ^ $env?.f64\nmedian(1.0 * 0)\nmedian(1.0 * 1)\nmedian(1.0 * 1.0)\nmedian(1.0 * f64)\nmedian(1.0 * f64, array | sortBy(1))\nmedian(1.0 * i)\nmedian(1.0 ** 0)\nmedian(1.0 ** 1.0)\nmedian(1.0 ** f64)\nmedian(1.0 ** i)\nmedian(1.0 + 0)\nmedian(1.0 + 1)\nmedian(1.0 + 1.0)\nmedian(1.0 + f64)\nmedian(1.0 + i)\nmedian(1.0 - 1)\nmedian(1.0 - 1.0)\nmedian(1.0 - f64)\nmedian(1.0 - i)\nmedian(1.0 / 0)\nmedian(1.0 / 1)\nmedian(1.0 / 1.0)\nmedian(1.0 / f64)\nmedian(1.0 / i)\nmedian(1.0 ?? $env)\nmedian(1.0 ?? 0, 1.0)\nmedian(1.0 ?? 1)\nmedian(1.0 ?? 1.0)\nmedian(1.0 ?? add)\nmedian(1.0 ?? false)\nmedian(1.0 ?? foo)\nmedian(1.0 ?? greet)\nmedian(1.0 ?? nil)\nmedian(1.0 ?? str)\nmedian(1.0 ^ 1)\nmedian(1.0 ^ f64)\nmedian(1.0 ^ i)\nmedian(1.0 | mean(i))\nmedian(1.0) * 0 ?? nil\nmedian(1.0) * 1 + 1\nmedian(1.0) * f64\nmedian(1.0) ** f64\nmedian(1.0) + 1.0 != f64\nmedian(1.0) + i\nmedian(1.0) - f64\nmedian(1.0) / f64\nmedian(1.0) / i\nmedian(1.0) <= f64\nmedian(1.0) <= i\nmedian(1.0) <= i / 0\nmedian(1.0) == $env == false\nmedian(1.0) > 1.0 ? greet : list\nmedian(1.0) >= f64\nmedian(1.0) ?? $env.ok\nmedian(1.0) ?? 1 ?? true\nmedian(1.0) ?? add\nmedian(1.0) ?? foo\nmedian(1.0) ?? greet\nmedian(1.0) ?? str\nmedian(1.0) in array\nmedian(1.0) not in array\nmedian(1.0) | max(f64)\nmedian(1.0) | max(i)\nmedian(1.0, 0) ** f64\nmedian(1.0, 0) ** i\nmedian(1.0, 1.0) | mean(i, 0)\nmedian(1.1)\nmedian([0])\nmedian([1 % i])\nmedian([1, 1.0])\nmedian([1.0])\nmedian([1])\nmedian([1], $env.f64)\nmedian([array])\nmedian([f64])\nmedian([i, 1.0])\nmedian([i])\nmedian(abs(0))\nmedian(abs(1))\nmedian(abs(1.0))\nmedian(abs(f64))\nmedian(abs(i))\nmedian(add(1, 0))\nmedian(array ?? add)\nmedian(array ?? array)\nmedian(array ?? f64)\nmedian(array ?? false)\nmedian(array ?? foo)\nmedian(array ?? nil)\nmedian(array ?? str)\nmedian(array | find(ok))\nmedian(array | findLast(true))\nmedian(array | map(#))\nmedian(array | map(1.0))\nmedian(array | reduce(1.0))\nmedian(array | reduce(i, 1.0))\nmedian(array | reduce(i, foo))\nmedian(array | sortBy(#))\nmedian(array | sortBy(i))\nmedian(array | sum(#))\nmedian(array)\nmedian(array) != add\nmedian(array) != ok\nmedian(array) ** f64\nmedian(array) ** i\nmedian(array) + i\nmedian(array) - 1.0 + i\nmedian(array) / f64\nmedian(array) < 0 >= 1.0\nmedian(array) < i\nmedian(array) >= i\nmedian(array) ?? f64\nmedian(array) ?? not ok\nmedian(array) ?? ok\nmedian(array) ^ f64\nmedian(array) | get(nil)\nmedian(array, $env?.i)\nmedian(array, -0)\nmedian(array, -i)\nmedian(array, 1 ^ 1)\nmedian(array, array)\nmedian(array, array) not endsWith $env?.[Bar]\nmedian(array, f64)\nmedian(array, i % i)\nmedian(array, i .. 0)\nmedian(array, i)\nmedian(array?.[i])\nmedian(array[0:])\nmedian(array[1:])\nmedian(bitand(1, 1))\nmedian(bitnot(0))\nmedian(bitnot(1))\nmedian(bitnot(i))\nmedian(bitxor(0, 0))\nmedian(ceil($env.i))\nmedian(ceil(0))\nmedian(ceil(1.0))\nmedian(ceil(f64))\nmedian(ceil(i))\nmedian(concat(array))\nmedian(count($env, false))\nmedian(count(array, ok))\nmedian(count(array[0:0]))\nmedian(count(list, ok))\nmedian(f64 * $env?.f64)\nmedian(f64 * 1.0)\nmedian(f64 * f64)\nmedian(f64 ** $env?.i)\nmedian(f64 ** 0)\nmedian(f64 ** 1)\nmedian(f64 ** 1.0)\nmedian(f64 + 0)\nmedian(f64 + 1.0)\nmedian(f64 + f64)\nmedian(f64 + i)\nmedian(f64 - 0)\nmedian(f64 - 1)\nmedian(f64 - 1.0)\nmedian(f64 - i)\nmedian(f64 / 0)\nmedian(f64 / 1.0)\nmedian(f64 / f64)\nmedian(f64 / i)\nmedian(f64 ?? 1)\nmedian(f64 ?? 1.0)\nmedian(f64 ?? array)\nmedian(f64 ?? date(foo))\nmedian(f64 ?? false)\nmedian(f64 ?? i)\nmedian(f64 ?? str)\nmedian(f64 ^ 0)\nmedian(f64 ^ 1)\nmedian(f64 ^ 1.0)\nmedian(f64 ^ f64)\nmedian(f64 ^ i)\nmedian(f64 | min(1.0))\nmedian(f64)\nmedian(f64) + i\nmedian(f64) < f64\nmedian(f64) == 1.0 and ok\nmedian(f64) > i\nmedian(f64) ?? array\nmedian(f64, array)\nmedian(f64, array) / 0 == 0\nmedian(f64, f64)\nmedian(f64, i)\nmedian(f64, i) + i\nmedian(f64, i, 1 - 0)\nmedian(f64, list | sum(i))\nmedian(f64, min(f64))\nmedian(filter(list, false))\nmedian(find(array, ok))\nmedian(findIndex($env, true))\nmedian(findLastIndex($env, ok))\nmedian(findLastIndex($env, true))\nmedian(findLastIndex(list, true))\nmedian(first(array))\nmedian(flatten(array))\nmedian(float(0))\nmedian(float(1))\nmedian(float(1.0))\nmedian(float(f64))\nmedian(float(i))\nmedian(floor(0))\nmedian(floor(1))\nmedian(floor(1.0))\nmedian(floor(f64))\nmedian(floor(i))\nmedian(i % i)\nmedian(i * 0)\nmedian(i * 1)\nmedian(i * 1.0)\nmedian(i * f64)\nmedian(i * i)\nmedian(i ** 0)\nmedian(i ** 1.0)\nmedian(i ** i)\nmedian(i + 0)\nmedian(i + 1)\nmedian(i - 1.0)\nmedian(i - i)\nmedian(i .. i)\nmedian(i / 0)\nmedian(i / 1.0)\nmedian(i ?? $env?.ok)\nmedian(i ?? 0)\nmedian(i ?? 1.0)\nmedian(i ?? foo?.Bar)\nmedian(i ?? i)\nmedian(i ?? ok)\nmedian(i ?? str)\nmedian(i ^ 0)\nmedian(i ^ 1.0)\nmedian(i ^ f64)\nmedian(i ^ i)\nmedian(i | bitnand(i))\nmedian(i | bitshr(1))\nmedian(i | min(f64))\nmedian(i)\nmedian(i) * i\nmedian(i) ?? f64\nmedian(i) ?? list\nmedian(i) ^ i\nmedian(i) in $env?.array\nmedian(i) | mean(array)\nmedian(i) | median(array)\nmedian(i) | min(f64)\nmedian(i, $env.i)\nmedian(i, -i)\nmedian(i, 1.0) < i\nmedian(i, array)\nmedian(i, f64)\nmedian(i, floor(1))\nmedian(i, i)\nmedian(i..i)\nmedian(if false { $env } else { 1 })\nmedian(if false { 1.0 } else { i })\nmedian(if false { str } else { i })\nmedian(int(1))\nmedian(int(1.0))\nmedian(int(1.0), array)\nmedian(int(f64))\nmedian(int(i))\nmedian(last(array))\nmedian(len($env))\nmedian(len(list))\nmedian(len(str))\nmedian(let bar = 1.0; let foobar = 0; bar)\nmedian(let bar = 1; bar)\nmedian(let foobar = 0; foobar)\nmedian(let z = 1; z)\nmedian(list | count(ok))\nmedian(list | map(#index))\nmedian(list | map(array))\nmedian(list | reduce(i))\nmedian(list | sum(0))\nmedian(map($env, 0))\nmedian(map($env, 1))\nmedian(map($env, 1.0))\nmedian(map($env, f64))\nmedian(map(array, 1))\nmedian(map(list, 0))\nmedian(map(list, 1.0))\nmedian(max(0))\nmedian(max(1))\nmedian(max(1.0))\nmedian(max(1.0, i))\nmedian(max(array))\nmedian(max(i))\nmedian(max(i), array)\nmedian(mean(0))\nmedian(mean(1))\nmedian(mean(1.0))\nmedian(mean(1.0, i))\nmedian(mean(array))\nmedian(mean(f64))\nmedian(mean(i))\nmedian(median(0))\nmedian(median(1))\nmedian(median(1, 1.0))\nmedian(median(1.0))\nmedian(median(array))\nmedian(median(f64))\nmedian(median(f64, i))\nmedian(median(i))\nmedian(min(0 * 1))\nmedian(min(0))\nmedian(min(1))\nmedian(min(1.0, array, 1))\nmedian(min(array))\nmedian(min(f64))\nmedian(min(f64, 1.0))\nmedian(min(i))\nmedian(nil ?? 0)\nmedian(nil ?? 1)\nmedian(nil ?? 1.0)\nmedian(nil ?? f64)\nmedian(ok ? 1.0 : greet)\nmedian(reduce(array, #))\nmedian(reduce(array, #index))\nmedian(reduce(array, i))\nmedian(reduce(list, #index))\nmedian(reduce(list, 1.0))\nmedian(reverse(array))\nmedian(round(0))\nmedian(round(1))\nmedian(round(1.0))\nmedian(round(f64))\nmedian(round(i))\nmedian(sort($env))\nmedian(sort(array))\nmedian(sortBy(array, 1))\nmedian(sortBy(array, f64))\nmedian(sum($env, 0))\nmedian(sum($env, 1.0))\nmedian(sum($env, f64))\nmedian(sum($env, i))\nmedian(sum(array))\nmedian(sum(array), f64)\nmedian(sum(array), i)\nmedian(sum(array, #))\nmedian(sum(array, 1.0))\nmedian(sum(list, i))\nmedian(true ? 0 : 1.0, f64)\nmedian(true ? 0 : ok)\nmedian(true ? i : foo)\nmedian(uniq(array))\nmedian({foo: 1.0}?.foo)\nmin($env ?? 0)\nmin($env ?? 1)?.ok\nmin($env ?? add)\nmin($env ?? f64)\nmin($env ?? false)\nmin($env ?? foo)\nmin($env ?? greet)\nmin($env ?? i)\nmin($env ?? ok)\nmin($env ?? true)\nmin($env | filter(false))\nmin($env | findIndex(false))\nmin($env | findIndex(true))\nmin($env | findLast(false))\nmin($env | get(str))\nmin($env | map(0))\nmin($env | map(1))\nmin($env | map(1.0))\nmin($env | reduce(array, 1))\nmin($env | sum(1.0))\nmin($env | sum(f64))\nmin($env | sum(i))\nmin($env) != array\nmin($env) == greet\nmin($env) == i\nmin($env) == ok\nmin($env) ?? uniq($env)\nmin($env) matches $env?.foobar\nmin($env) not contains $env || true\nmin($env) not in list\nmin($env) | all(false)\nmin($env) | any(false)\nmin($env) | count(ok)\nmin($env) | map(1)\nmin($env) | map(add)\nmin($env) | map(f64)\nmin($env) | map(false)\nmin($env) | map(foo)\nmin($env) | map(ok)\nmin($env) | reduce(0, 1)\nmin($env) | reduce(1.0, $env)\nmin($env) | sum(0)\nmin($env) | sum(1.0)\nmin($env).Bar\nmin($env).Bar?.greet()\nmin($env).String\nmin($env).String?.[greet]\nmin($env).add\nmin($env).array\nmin($env).f64\nmin($env).false?.add\nmin($env).false?.f64\nmin($env).foo\nmin($env).foobar\nmin($env).foobar?.i(foobar, foobar)\nmin($env).foobar?.ok\nmin($env).greet\nmin($env).i\nmin($env).i && false\nmin($env).list\nmin($env).nil?.foobar\nmin($env).ok\nmin($env).str\nmin($env)?.$env?.Bar()\nmin($env)?.Bar\nmin($env)?.Bar?.foobar.foo().list\nmin($env)?.String\nmin($env)?.String?.foo\nmin($env)?.[str]\nmin($env)?.[str] not startsWith str\nmin($env)?.add\nmin($env)?.array\nmin($env)?.f64\nmin($env)?.foo\nmin($env)?.foobar\nmin($env)?.foobar?.String()\nmin($env)?.foobar?.foo.i\nmin($env)?.foobar?.list\nmin($env)?.foobar?.str\nmin($env)?.greet\nmin($env)?.greet(foobar)\nmin($env)?.i\nmin($env)?.list\nmin($env)?.not\nmin($env)?.ok\nmin($env)?.str\nmin($env)?.true?.f64(foobar)\nmin($env.array)\nmin($env.array, sum(array))\nmin($env.f64)\nmin($env.i)\nmin($env.i, i)\nmin($env?.$env)\nmin($env?.Bar)\nmin($env?.Bar?.array())\nmin($env?.Bar?.foo)\nmin($env?.Bar?.greet())\nmin($env?.String)\nmin($env?.String)?.[i]\nmin($env?.String?.list)\nmin($env?.[Bar])\nmin($env?.[Bar])?.add()\nmin($env?.[Bar]?.Bar)\nmin($env?.[Bar]?.[greet])\nmin($env?.[Bar]?.i())\nmin($env?.[String])\nmin($env?.[String])?.f64\nmin($env?.[foobar])\nmin($env?.[foobar])?.[str]\nmin($env?.[nil])\nmin($env?.[str])\nmin($env?.array)\nmin($env?.f64)\nmin($env?.f64, i)\nmin($env?.false)\nmin($env?.foobar)\nmin($env?.i)\nmin($env?.nil)\nmin($env?.true)\nmin(-0)\nmin(-1)\nmin(-1.0 ** 1)\nmin(-1.0 + i)\nmin(-1.0)\nmin(-f64)\nmin(-i)\nmin(0 % 1)\nmin(0 % i)\nmin(0 * 0)\nmin(0 * 1)\nmin(0 * 1.0)\nmin(0 * f64)\nmin(0 * i)\nmin(0 ** 0)\nmin(0 ** 1.0)\nmin(0 ** i)\nmin(0 + 1)\nmin(0 + 1.0)\nmin(0 + f64)\nmin(0 - 1)\nmin(0 - 1.0)\nmin(0 - f64)\nmin(0 - i)\nmin(0 .. 0)\nmin(0 .. 1)\nmin(0 .. i)\nmin(0 / 0)\nmin(0 / 1)\nmin(0 ?? 1.0)\nmin(0 ?? false)\nmin(0 ?? foo)\nmin(0 ?? true)\nmin(0 ^ 0)\nmin(0 ^ 1)\nmin(0 | bitshl(1))\nmin(0 | median(1))\nmin(0) != $env?.i\nmin(0) * 0 < f64\nmin(0) * f64\nmin(0) ** f64\nmin(0) + i\nmin(0) - ceil(i)\nmin(0) / f64\nmin(0) ^ f64\nmin(0) in array\nmin(0) | max(0)\nmin(0, array) != str\nmin(0.0)\nmin(1 % 1)\nmin(1 * 1)\nmin(1 * 1.0)\nmin(1 ** 0)\nmin(1 ** 1)\nmin(1 ** 1.0)\nmin(1 ** f64)\nmin(1 ** i)\nmin(1 + 0)\nmin(1 + 1.0)\nmin(1 - 1)\nmin(1 - f64)\nmin(1 .. i)\nmin(1 / 0)\nmin(1 / 1)\nmin(1 / 1.0)\nmin(1 / i)\nmin(1 ?? 0)\nmin(1 ?? 1.0)\nmin(1 ?? add)\nmin(1 ?? foo)\nmin(1 ?? greet)\nmin(1 ?? nil)\nmin(1 ?? ok)\nmin(1 ^ 0)\nmin(1 ^ 1.0)\nmin(1 ^ i)\nmin(1 | min(1.0))\nmin(1) % i\nmin(1) + f64\nmin(1) - i\nmin(1) < f64\nmin(1) < i\nmin(1) <= i\nmin(1) ?? i\nmin(1) not in array\nmin(1) | median(array)\nmin(1, 1) - i\nmin(1, 1.0) in array\nmin(1, array) | get(ok)\nmin(1..i)\nmin(1.0 * 0)\nmin(1.0 * 1)\nmin(1.0 * 1.0)\nmin(1.0 * f64)\nmin(1.0 ** 0)\nmin(1.0 ** 1)\nmin(1.0 ** 1.0)\nmin(1.0 ** i)\nmin(1.0 + 0)\nmin(1.0 + 1)\nmin(1.0 + 1.0)\nmin(1.0 + i)\nmin(1.0 - 0)\nmin(1.0 - 1)\nmin(1.0 - f64)\nmin(1.0 - i)\nmin(1.0 / 1)\nmin(1.0 / 1.0)\nmin(1.0 / f64)\nmin(1.0 ?? $env?.[greet])\nmin(1.0 ?? 0)\nmin(1.0 ?? 1)\nmin(1.0 ?? add)\nmin(1.0 ?? array)\nmin(1.0 ?? f64)\nmin(1.0 ?? foo)\nmin(1.0 ?? list)\nmin(1.0 ?? nil)\nmin(1.0 ?? ok)\nmin(1.0 ?? ok, array)\nmin(1.0 ?? str)\nmin(1.0 ?? true)\nmin(1.0 ^ 0)\nmin(1.0 ^ 1)\nmin(1.0 ^ 1.0)\nmin(1.0 ^ f64)\nmin(1.0 ^ i)\nmin(1.0 | max(0))\nmin(1.0 | max(1))\nmin(1.0 | max(array))\nmin(1.0 | mean(1.0))\nmin(1.0 | min(1.0))\nmin(1.0) * bitand(i, i)\nmin(1.0) * f64\nmin(1.0) ** f64\nmin(1.0) ** i\nmin(1.0) - f64\nmin(1.0) <= 1.0 + 0\nmin(1.0) > i\nmin(1.0) >= i\nmin(1.0) ?? add\nmin(1.0) ?? f64\nmin(1.0) ?? greet\nmin(1.0) ?? list\nmin(1.0) ?? str\nmin(1.0) ^ i\nmin(1.0) not in array\nmin(1.0) | max(array, 1.0)\nmin(1.0) | median(array)\nmin(1.0, 0) + i\nmin(1.0, 0) ?? ok\nmin(1.0, 1) - f64\nmin(1.0, 1.0) ** f64 ?? true\nmin(1.0, 1.0) + i\nmin(1.0, 1.0) - 0 < 1.0\nmin(1.0, 1.0) ^ f64\nmin(1.1)\nmin([$env] | reduce(.f64))\nmin([0])\nmin([1.0])\nmin([1])\nmin([array])\nmin([f64, 0])\nmin([f64])\nmin([i])\nmin(abs(0))\nmin(abs(1))\nmin(abs(1.0))\nmin(abs(f64))\nmin(abs(i))\nmin(add ?? 1.0)\nmin(add ?? array)\nmin(add ?? f64)\nmin(add ?? foo)\nmin(add(0, 0))\nmin(add(1, 1))\nmin(array ?? $env?.[greet(f64)])\nmin(array ?? 0)\nmin(array ?? nil)\nmin(array | count(true))\nmin(array | filter(true))\nmin(array | find(ok))\nmin(array | findIndex(false))\nmin(array | findIndex(ok))\nmin(array | map(#))\nmin(array | map(i))\nmin(array | max(1.0, 0))\nmin(array | reduce(#))\nmin(array | reduce(0))\nmin(array | reduce(1.0))\nmin(array | sortBy(0))\nmin(array | sortBy(1.0))\nmin(array | sum(#))\nmin(array | sum(1.0))\nmin(array | sum(f64))\nmin(array)\nmin(array) + f64\nmin(array) - i\nmin(array) .. i\nmin(array) / i\nmin(array) < 1.0 - i\nmin(array) == i\nmin(array) ?? f64\nmin(array) ?? ok\nmin(array) | bitushr(0)\nmin(array) | get(0)\nmin(array) | get(str)\nmin(array) | median(0)\nmin(array, 1 - 0)\nmin(array, 1.0 ?? 0)\nmin(array, array)\nmin(array, array, 1) == f64\nmin(array, ceil(0))\nmin(array, f64 * i)\nmin(array, f64)\nmin(array, float(1.0))\nmin(array, i ?? 1.0)\nmin(array, i)\nmin(array, int(0))\nmin(array, sortBy(array, #))\nmin(array?.[0])\nmin(array?.[1])\nmin(array?.[i])\nmin(array[0:])\nmin(array[:0])?.[greet]\nmin(array[min(1):])\nmin(bitnot(0))\nmin(bitnot(1))\nmin(bitnot(i))\nmin(ceil(0))\nmin(ceil(1))\nmin(ceil(1.0))\nmin(ceil(f64))\nmin(ceil(i))\nmin(ceil(sum(array)), i)\nmin(count($env, false))\nmin(count($env, ok))\nmin(count([true]))\nmin(count(array, false))\nmin(f64 * 0)\nmin(f64 * 1)\nmin(f64 * f64)\nmin(f64 * i)\nmin(f64 ** 1)\nmin(f64 ** 1.0)\nmin(f64 ** f64)\nmin(f64 ** i)\nmin(f64 + 0)\nmin(f64 + 1.0)\nmin(f64 + f64)\nmin(f64 - 0)\nmin(f64 - 1.0)\nmin(f64 - i)\nmin(f64 / 0)\nmin(f64 / 1)\nmin(f64 / 1.0)\nmin(f64 ?? $env)\nmin(f64 ?? 1)\nmin(f64 ?? 1.0)\nmin(f64 ?? add, i)\nmin(f64 ?? array)\nmin(f64 ?? false)\nmin(f64 ?? foo)\nmin(f64 ?? ok)\nmin(f64 ?? true)\nmin(f64 ^ 0)\nmin(f64 ^ 1)\nmin(f64 ^ 1.0)\nmin(f64 ^ f64)\nmin(f64 ^ i)\nmin(f64 | min(0))\nmin(f64)\nmin(f64) * i\nmin(f64) / f64\nmin(f64) < i\nmin(f64) <= $env.i\nmin(f64) >= i\nmin(f64) ?? greet\nmin(f64) not in array\nmin(f64) | median(1.0)\nmin(f64, $env.array)\nmin(f64, $env.f64)\nmin(f64, -1)\nmin(f64, 0) == f64\nmin(f64, 1.0 / 1.0)\nmin(f64, abs(f64))\nmin(f64, array)\nmin(f64, f64)\nmin(f64, i)\nmin(f64, min(1.0))\nmin(false ? 0 : greet)\nmin(false ? 0 : nil)\nmin(false ? 1 : 1.0)\nmin(false ? array : nil)\nmin(false ? foo : $env).i\nmin(false ? greet : foo)\nmin(false ?: 0)\nmin(false ?? 1.0)\nmin(false ?? add)\nmin(false ?? array)\nmin(false ?? list)\nmin(findIndex($env, false))\nmin(findIndex($env, true))\nmin(findIndex(array, true))\nmin(findIndex(list, false))\nmin(findLast(array, false))\nmin(findLast(array, true))\nmin(findLastIndex($env, false))\nmin(findLastIndex($env, true))\nmin(first($env))\nmin(first(array))\nmin(first(str ?? add))\nmin(flatten(array))\nmin(flatten(array), f64)\nmin(float(0))\nmin(float(1))\nmin(float(1.0))\nmin(float(f64))\nmin(float(i))\nmin(floor(1.0 + i))\nmin(floor(1.0))\nmin(floor(f64))\nmin(floor(i))\nmin(foo ?? $env)\nmin(foo ?? 0)\nmin(foo ?? 1)\nmin(foo ?? add)\nmin(foo ?? f64)\nmin(foo ?? false)\nmin(foo ?? greet)\nmin(foo ?? list)\nmin(foo ?? ok)\nmin(foo ?? str)\nmin(foo ?? true)\nmin(greet ?? 1.0)\nmin(greet ?? add)\nmin(greet ?? f64)\nmin(greet ?? foo)\nmin(groupBy(array, #)?.array)\nmin(i % 1)\nmin(i % i)\nmin(i * 0)\nmin(i * f64)\nmin(i * i)\nmin(i + 1.0)\nmin(i + f64)\nmin(i + i)\nmin(i - 0)\nmin(i - 1.0)\nmin(i - f64)\nmin(i - i)\nmin(i .. 0)\nmin(i / 1.0)\nmin(i ?? $env)\nmin(i ?? f64)\nmin(i ?? false)\nmin(i ?? foo)\nmin(i ?? ok)\nmin(i ?? str)\nmin(i ?? true)\nmin(i ^ 1.0)\nmin(i ^ i)\nmin(i | bitor(0))\nmin(i | bitshr(1))\nmin(i | min(0))\nmin(i)\nmin(i) != $env?.i\nmin(i) != f64\nmin(i) % i\nmin(i) < f64\nmin(i) < i\nmin(i) <= f64\nmin(i) == f64\nmin(i) ?? [0]\nmin(i) ?? foo\nmin(i) ?? foo.Bar\nmin(i) ?? foo?.Bar\nmin(i, $env.i)\nmin(i, 1 ?? 0)\nmin(i, [1])\nmin(i, array)\nmin(i, array) .. i\nmin(i, array) ^ i <= 1.0\nmin(i, f64 ** 1)\nmin(i, f64 / i)\nmin(i, f64)\nmin(i, i)\nmin(i, max(sum(array)))\nmin(if false { nil } else { 0 })\nmin(if false { ok } else { array })\nmin(if true { 1 } else { $env })\nmin(if true { 1.0 } else { true })\nmin(if true { false } else { foo })\nmin(if true { greet } else { 1.0 })\nmin(int(0))\nmin(int(1))\nmin(int(1.0))\nmin(int(f64))\nmin(int(i))\nmin(last($env))\nmin(last(array))\nmin(len($env))\nmin(len(array))\nmin(len(list))\nmin(len(str))\nmin(list | count(false))\nmin(list | count(true))\nmin(list | findIndex(false))\nmin(list | map(1))\nmin(list | map(1.0))\nmin(list | map(i))\nmin(list | reduce($env))\nmin(list | reduce(1))\nmin(list | reduce(1.0))\nmin(list | reduce(array))\nmin(list | sum(1))\nmin(list[1:1])\nmin(map($env, 0))\nmin(map($env, 1.0))\nmin(map($env, array))\nmin(map(array, #))\nmin(map(array, #index))\nmin(map(array, 1.0))\nmin(map(list, #index))\nmin(map(list, f64))\nmin(max($env))\nmin(max(0))\nmin(max(0, 1))\nmin(max(0, 1.0, 0))\nmin(max(0, i))\nmin(max(1))\nmin(max(1.0))\nmin(max(1.0, 1.0))\nmin(max(array))\nmin(max(f64))\nmin(max(i))\nmin(mean(0))\nmin(mean(1))\nmin(mean(1.0))\nmin(mean(1.0, 1.0))\nmin(mean(array))\nmin(mean(f64))\nmin(mean(i))\nmin(median(0))\nmin(median(1))\nmin(median(1.0))\nmin(median(array))\nmin(median(f64))\nmin(median(i))\nmin(min($env))\nmin(min(0))\nmin(min(1))\nmin(min(1.0))\nmin(min(1.0, 1))\nmin(min(f64))\nmin(min(f64, 1.0))\nmin(min(f64, 1.0, 1.0))\nmin(min(i))\nmin(nil ?? $env)\nmin(nil ?? f64)\nmin(nil ?? i)\nmin(ok ? array : true)\nmin(ok ?: 1.0)\nmin(ok ?? 1)\nmin(ok ?? i)\nmin(ok ?? toJSON(list))\nmin(reduce(array, #))\nmin(reduce(array, $env))?.str\nmin(reduce(array, 1.0))\nmin(reduce(array, i))\nmin(reduce(list, 1.0))\nmin(reduce(list, f64))\nmin(reduce(list, f64), $env?.array)\nmin(reverse(array))\nmin(round(0))\nmin(round(0), array)\nmin(round(1))\nmin(round(1.0))\nmin(round(f64))\nmin(round(i))\nmin(sort($env))\nmin(sort(array))\nmin(sortBy(array, #))\nmin(sortBy(array, 1))\nmin(sortBy(array, f64))\nmin(sortBy(array, str), i)\nmin(sortBy(array, toJSON(foo)))\nmin(str ?? $env)\nmin(str ?? 1.0)\nmin(str ?? false)\nmin(str ?? foo)\nmin(str ?? i)\nmin(str ?? list)\nmin(sum($env, 1))\nmin(sum($env, 1.0))\nmin(sum($env?.array))\nmin(sum(array))\nmin(sum(array), array)\nmin(sum(array, #))\nmin(sum(array, 1.0))\nmin(sum(list, 1))\nmin(sum(list, f64))\nmin(true ? 0 : foo)\nmin(true ? 1.0 : str)\nmin(true ? nil : $env)\nmin(true ? nil : i)\nmin(true ?: add)\nmin(true ?: foo)\nmin(true ?? 1)\nmin(true ?? foo)\nmin(true ?? list)\nmin(true ?? str)\nmin(uniq(array))\nmin({foo: 0}.foo)\nmin({foo: 1.0}.array)\nmin({foo: add}.i)\nmin({foo: i}?.i)\nmin({foo: nil}?.i)\nmin({foo: str}?.list)\nmin({foo: sum(array)}.array)\nnil != $env ?? add\nnil != $env.add\nnil != $env.array\nnil != $env.f64\nnil != $env.foo\nnil != $env.greet\nnil != $env.i\nnil != $env.list\nnil != $env.ok\nnil != $env.str\nnil != $env?.Bar\nnil != $env?.Bar?.[i]\nnil != $env?.Bar?.list()\nnil != $env?.Bar?.str()\nnil != $env?.String\nnil != $env?.String?.[i]\nnil != $env?.[1.0 | first(nil)]\nnil != $env?.[Bar]\nnil != $env?.[Bar]?.Bar\nnil != $env?.[String]\nnil != $env?.[String]?.foo\nnil != $env?.[foobar]\nnil != $env?.[greet(foobar)]\nnil != $env?.[str]\nnil != $env?.add\nnil != $env?.array\nnil != $env?.array && true\nnil != $env?.f64\nnil != $env?.false?.[str]\nnil != $env?.foo\nnil != $env?.foobar\nnil != $env?.foobar?.greet(1.0)\nnil != $env?.greet\nnil != $env?.i\nnil != $env?.list\nnil != $env?.ok\nnil != $env?.str\nnil != 0 && ok\nnil != 0 ** i\nnil != 0 - i\nnil != 0 / f64\nnil != 0 ?: array\nnil != 0 ^ $env?.i\nnil != 1 % i\nnil != 1 + f64\nnil != 1 + i\nnil != 1 ?? foo\nnil != 1 ^ i\nnil != 1.0 && ok\nnil != 1.0 + f64\nnil != 1.0 - f64\nnil != 1.0 ?: reduce($env, #.String, true)\nnil != 1.0 ?? ok\nnil != 1.0 ^ f64\nnil != 1.0 and ok\nnil != 1.0 or 1.0 == 1\nnil != add ?? ok\nnil != add and ok\nnil != array ?: i ^ 1.0\nnil != array ?? i\nnil != array?.[i]\nnil != f64 + i\nnil != f64 - f64 == nil\nnil != f64 / f64 && ok\nnil != f64 ?? -1\nnil != f64 ?? foo\nnil != f64 not in $env?.String\nnil != f64 or i == i\nnil != false == ok\nnil != false ?? add\nnil != false ?? foo\nnil != false || $env > $env\nnil != foo == ok\nnil != foo ?: greet\nnil != foo ?: list\nnil != foo ?? foo\nnil != foo or $env?.[add]\nnil != foo || 1 == $env?.[ok]\nnil != foo || i == f64\nnil != foo.Bar\nnil != foo.String\nnil != foo.String()\nnil != foo?.Bar\nnil != foo?.String\nnil != foo?.String()\nnil != greet && false != nil\nnil != greet == ok\nnil != greet ?: i\nnil != greet ?? add\nnil != i && f64 < 1.0\nnil != i + i\nnil != i .. $env?.i\nnil != i ?? greet\nnil != list or one($env, #.f64)\nnil != list?.[-i]\nnil != list?.[i]\nnil != list?.[i]?.Bar\nnil != list?.[i]?.String\nnil != list[:]\nnil != nil && $env?.[array]\nnil != nil && ok\nnil != nil ?? array\nnil != nil ?? i\nnil != nil ?? str\nnil != ok || abs($env)\nnil != str && get($env, nil)\nnil != str ?? foo\nnil != str or $env * i\nnil != str[:]\nnil != true ?? i\nnil != true || $env == 1.0\nnil == $env ?? add\nnil == $env ?? array\nnil == $env ?? ok\nnil == $env ?? str == false\nnil == $env or f64 < 1.0\nnil == $env.add\nnil == $env.array\nnil == $env.f64\nnil == $env.foo\nnil == $env.greet\nnil == $env.i\nnil == $env.list\nnil == $env.ok\nnil == $env.str\nnil == $env?.Bar\nnil == $env?.String\nnil == $env?.String?.[list]\nnil == $env?.String?.ok\nnil == $env?.[Bar]\nnil == $env?.[String]\nnil == $env?.[foo.Bar]\nnil == $env?.[foobar?.[i]]\nnil == $env?.[foobar?.array]\nnil == $env?.[foobar]\nnil == $env?.[str]\nnil == $env?.add\nnil == $env?.array\nnil == $env?.f64\nnil == $env?.foo\nnil == $env?.foobar\nnil == $env?.foobar?.add(foobar, foobar)\nnil == $env?.foobar?.i\nnil == $env?.greet\nnil == $env?.i\nnil == $env?.list\nnil == $env?.nil?.[foo]\nnil == $env?.ok\nnil == $env?.str\nnil == 0 != foo ?? greet\nnil == 0 ** 1.0 ? nil : nil\nnil == 0 ?? $env?.add\nnil == 0 || ok\nnil == 1 * i\nnil == 1 + f64\nnil == 1 / i\nnil == 1 and find($env, #.add)?.[i]\nnil == 1 || 0 > i\nnil == 1..i\nnil == 1.0 ** f64\nnil == 1.0 + f64\nnil == 1.0 ?: i\nnil == 1.0 ?: str\nnil == 1.0 ?? string(nil)\nnil == 1.0 ^ f64\nnil == 1.0 and ok\nnil == add ?: i\nnil == add and ok\nnil == add or foo ?? f64\nnil == array ?? add\nnil == array?.[i]\nnil == f64 * f64\nnil == f64 + f64\nnil == f64 - f64\nnil == f64 ?: ok\nnil == f64 ?? greet\nnil == false && list != $env\nnil == false ?? array\nnil == foo != foo ?? greet\nnil == foo != ok\nnil == foo ?: i\nnil == foo ?? 1.0 ?? true\nnil == foo ?? add\nnil == foo ?? greet($env)\nnil == foo and ok\nnil == foo.Bar\nnil == foo.String\nnil == foo.String()\nnil == foo?.Bar\nnil == foo?.String\nnil == foo?.String()\nnil == greet != $env?.Bar\nnil == greet ?? map($env, #.f64)\nnil == greet and $env?.[list]\nnil == greet or ok\nnil == i != ok\nnil == i + i\nnil == i and ok\nnil == i in $env?.[String]\nnil == list ?? list\nnil == list?.[i]\nnil == list[:]\nnil == nil != $env?.[String]\nnil == nil != nil || false\nnil == nil and ok\nnil == ok != ok\nnil == str != false || true\nnil == str ?? add\nnil == true ?? ok\nnil ?? $env ?? $env?.[array][foobar:]\nnil ?? $env ?? str\nnil ?? $env | findLastIndex(true)\nnil ?? $env | map(0)\nnil ?? $env | map(1)\nnil ?? $env | map(1.0)\nnil ?? $env | map(add)\nnil ?? $env | map(list)\nnil ?? $env | one(ok)\nnil ?? $env | sum(f64)\nnil ?? $env.add\nnil ?? $env.array\nnil ?? $env.f64\nnil ?? $env.foo\nnil ?? $env.greet\nnil ?? $env.i\nnil ?? $env.list\nnil ?? $env.ok\nnil ?? $env.str\nnil ?? $env?.Bar\nnil ?? $env?.String\nnil ?? $env?.[Bar]\nnil ?? $env?.[String]\nnil ?? $env?.[foobar]\nnil ?? $env?.[str]\nnil ?? $env?.add\nnil ?? $env?.array\nnil ?? $env?.f64\nnil ?? $env?.foo\nnil ?? $env?.foobar\nnil ?? $env?.foobar?.i\nnil ?? $env?.greet\nnil ?? $env?.i\nnil ?? $env?.list\nnil ?? $env?.ok\nnil ?? $env?.str\nnil ?? 0 | min(1.0)\nnil ?? 1 ?? array\nnil ?? 1.0 ?? trimSuffix(str)\nnil ?? array ?? str\nnil ?? array | groupBy(1.0)\nnil ?? array | map(#)\nnil ?? array | map(true)\nnil ?? array | one(ok)\nnil ?? array | reduce(#, false)\nnil ?? array | reduce(greet, $env)\nnil ?? array | reduce(list)\nnil ?? array | sortBy(1.0)\nnil ?? array | sum(i)\nnil ?? array?.[i]\nnil ?? f64 ?? i\nnil ?? foo ?? $env.list\nnil ?? foo.Bar\nnil ?? foo.String\nnil ?? foo.String()\nnil ?? foo?.Bar\nnil ?? foo?.String\nnil ?? foo?.String()\nnil ?? greet ?? add\nnil ?? i | median(f64)\nnil ?? list ?? add\nnil ?? list ?? {foo: foo}\nnil ?? list | groupBy(#)\nnil ?? list | groupBy(ok)\nnil ?? list | groupBy(true)\nnil ?? list | map(f64)\nnil ?? list | map(str)\nnil ?? list | reduce(#acc)\nnil ?? list | reduce(1.0, $env)\nnil ?? list | sortBy(.Bar)\nnil ?? list | sum(0)\nnil ?? list?.[i]\nnil ?? nil ?? foo\nnil ?? ok ?? ok\nnil ?? str ?? str\nnil ?? str | repeat(0)\nnil in $env != ok\nnil in $env ?? str\nnil in $env or ok\nnil in $env.array\nnil in $env.list\nnil in $env?.Bar\nnil in $env?.Bar?.[greet]\nnil in $env?.String\nnil in $env?.[Bar]\nnil in $env?.[Bar]?.[array]\nnil in $env?.[String]\nnil in $env?.[String]?.list\nnil in $env?.[foobar?.f64]\nnil in $env?.[foobar]\nnil in $env?.array\nnil in $env?.foobar?.i(false)\nnil in $env?.list\nnil in array ?? greet\nnil in array ?? toJSON(str)\nnil in list && ok\nnil in list and $env == foo\nnil in list and ok\nnil in list or ok\nnil not in $env ?: str\nnil not in $env or ok\nnil not in $env || 0 <= $env\nnil not in $env.array\nnil not in $env.list\nnil not in $env?.$env?.ok\nnil not in $env?.Bar\nnil not in $env?.Bar?.str\nnil not in $env?.String\nnil not in $env?.String?.greet\nnil not in $env?.[Bar]\nnil not in $env?.[String]\nnil not in $env?.[foobar]\nnil not in $env?.array\nnil not in $env?.foobar?.[list]\nnil not in $env?.foobar?.add(nil, f64)\nnil not in $env?.list\nnil not in array != ok\nnil not in array ?: i\nnil not in list[i:]\nnil; $env.greet\nnil; $env.ok\nnil; array | reduce(1.0, 1.0)\nnone($env | map($env), .f64 != foo)\nnone($env, false) != ok\nnone($env, false) && ok == true\nnone($env.array, # == 1.0)\nnone($env.array, str not in $env)\nnone($env.list, 1.0 <= 1.0)\nnone($env?.[str], 1 > f64)\nnone($env?.[str], ok)\nnone($env?.list, f64 == $env)\nnone($env?.list, ok)\nnone(1 .. 0, $env < $env)\nnone(1 .. 0, $env | all(ok))\nnone(1 .. i, !false)\nnone([$env, foo], false != #)\nnone([$env], .f64 in #.String)\nnone([1.0], ok)\nnone([array, false], true and ok)\nnone([f64, nil], ok)\nnone([false], #)\nnone([greet, 1.0], ok)\nnone([nil, foo], ok)\nnone(array | map(0), ok)\nnone(array, !true)\nnone(array, # != #)\nnone(array, # != 0)\nnone(array, # != nil)\nnone(array, # < #)\nnone(array, # < 1)\nnone(array, # <= #)\nnone(array, # == 0)\nnone(array, # == nil)\nnone(array, # > #)\nnone(array, # >= #)\nnone(array, # >= f64)\nnone(array, # >= i)\nnone(array, $env == foo)\nnone(array, $env || true)\nnone(array, $env.ok)\nnone(array, 0 <= 0)\nnone(array, 1 == #)\nnone(array, 1.0 != 1.0)\nnone(array, 1.0 < #)\nnone(array, 1.0 <= #)\nnone(array, 1.0 == $env)\nnone(array, add == add)\nnone(array, f64 == #)\nnone(array, false ?? add)\nnone(array, foo != nil)\nnone(array, i != #)\nnone(array, i != nil)\nnone(array, i < #)\nnone(array, i >= #)\nnone(array, nil != 1)\nnone(array, nil == add)\nnone(array, nil == false)\nnone(array, nil == i)\nnone(array, not false)\nnone(array, ok && false)\nnone(array, ok ?? i)\nnone(array, ok)\nnone(concat(array), f64 >= #)\nnone(flatten(array), ok)\nnone(if true { list } else { greet }, list != list)\nnone(list ?? ok, ok)\nnone(list | map($env), #.ok)\nnone(list | map(str), ok)\nnone(list, # != foo)\nnone(list, # == #)\nnone(list, $env != $env)\nnone(list, $env != i)\nnone(list, $env != nil)\nnone(list, $env.ok)\nnone(list, $env?.ok)\nnone(list, .Bar not in #)\nnone(list, .Bar startsWith str)\nnone(list, 1 == f64)\nnone(list, 1.0 > 1.0)\nnone(list, array == $env)\nnone(list, f64 != $env)\nnone(list, f64 == 1.0)\nnone(list, false != true)\nnone(list, false ?? #)\nnone(list, false and false)\nnone(list, foo != #)\nnone(list, foo != foo)\nnone(list, foo == #)\nnone(list, foo == foo)\nnone(list, i == 1)\nnone(list, nil == list)\nnone(list, not true)\nnone(list, ok == $env)\nnone(list, ok)\nnone(list, ok) || ok\nnone(list, str < .Bar)\nnone(list, true == $env)\nnone(list, true || true) ?? i\nnone(list, true) != ok\nnone(map($env, 1.0), ok)\nnone(map(list, $env), ok)\nnone(reverse(array), not false)\nnone(sort($env), #.add?.greet(foo))\nnone(sort($env), #.f64 != 1.0)\nnone(sort($env), #.ok not in #)\nnone(sort($env), not #.f64)\nnone(sort($env), sortBy(.Bar, #.greet))\nnone(str ?? $env, ok)\nnone(str ?? ok, f64 >= #)\nnone(toPairs($env), # in #)\nnot !$env.ok\nnot !false\nnot !ok\nnot !true\nnot !true or true\nnot $env && false\nnot $env and false\nnot $env or true\nnot $env || true\nnot $env.ok\nnot $env?.ok\nnot all($env, false)\nnot all($env, ok)\nnot all($env, true)\nnot all(array, false)\nnot all(array, true)\nnot all(list, ok)\nnot all(list, true)\nnot any($env, false)\nnot any($env, ok)\nnot any($env, true)\nnot any(array, ok)\nnot any(array, true)\nnot any(list, ok)\nnot false != $env\nnot false != false\nnot false != nil\nnot false != ok\nnot false != true\nnot false && $env\nnot false && false\nnot false && ok\nnot false && true\nnot false == $env\nnot false == false\nnot false == nil\nnot false == true\nnot false ? 0 / 1 : ok\nnot false ? 1.0 : foo\nnot false ? add : foo\nnot false ? foo : foo\nnot false ? greet : nil\nnot false ? list : 1.0\nnot false ? nil : 1.0\nnot false ? ok : i\nnot false ? ok : nil\nnot false ?: 1.0\nnot false ?: add\nnot false ?: nil\nnot false ?: ok\nnot false ?? $env\nnot false ?? 0\nnot false ?? 1\nnot false ?? 1.0\nnot false ?? add\nnot false ?? array\nnot false ?? f64\nnot false ?? false\nnot false ?? findLastIndex($env, #.foo)\nnot false ?? foo\nnot false ?? greet\nnot false ?? i\nnot false ?? list\nnot false ?? nil\nnot false ?? not $env\nnot false ?? ok\nnot false ?? one(list, ok)\nnot false ?? str\nnot false ?? true\nnot false and $env\nnot false and false\nnot false and ok\nnot false not in $env or true\nnot false not in $env?.Bar\nnot false or $env\nnot false or false\nnot false or false != $env\nnot false or not true\nnot false or ok\nnot false or true\nnot false || $env\nnot false || false\nnot false || last($env)\nnot false || ok\nnot false || true\nnot max($env).ok\nnot nil ?? false\nnot nil ?? ok\nnot nil ?? true\nnot none($env, false)\nnot none($env, ok)\nnot none($env, true)\nnot none(array, false)\nnot none(array, ok)\nnot none(array, true)\nnot none(list, false)\nnot none(list, ok)\nnot not !false\nnot not $env.ok\nnot not $env?.ok\nnot not false\nnot not not false\nnot not ok\nnot not ok != false\nnot not true\nnot not true and ok\nnot ok\nnot ok != $env\nnot ok != 1.0 ?? i\nnot ok != false\nnot ok != nil\nnot ok != ok\nnot ok != true\nnot ok && $env\nnot ok && $env?.[list]\nnot ok && 1.0 ?? split($env, str)\nnot ok && false\nnot ok && ok\nnot ok && true\nnot ok == $env\nnot ok == false\nnot ok == false != $env\nnot ok == foo ?? $env\nnot ok == nil\nnot ok == ok\nnot ok == true\nnot ok ? $env : str\nnot ok ? 1 : $env\nnot ok ? 1.0 : 1.0\nnot ok ? 1.0 : add\nnot ok ? 1.0 : foo\nnot ok ? 1.0 : ok\nnot ok ? f64 : 1.0\nnot ok ? f64 : foo\nnot ok ? foo : nil\nnot ok ? i : 1.0\nnot ok ? list : 1\nnot ok ? nil : 0\nnot ok ? nil : array\nnot ok ? nil : foo\nnot ok ? ok : $env\nnot ok ? ok : $env?.add\nnot ok ? ok : foo\nnot ok ? true : $env\nnot ok ? true : 0\nnot ok ?: $env\nnot ok ?: 1.0\nnot ok ?: array\nnot ok ?: foo\nnot ok ?: list\nnot ok ?? $env.f64\nnot ok ?? $env?.[foo]\nnot ok ?? 0\nnot ok ?? 0 == $env\nnot ok ?? 1\nnot ok ?? 1.0\nnot ok ?? [$env, list]\nnot ok ?? add\nnot ok ?? array\nnot ok ?? f64\nnot ok ?? f64 ?: greet\nnot ok ?? false\nnot ok ?? foo\nnot ok ?? foo.String\nnot ok ?? greet\nnot ok ?? i\nnot ok ?? list\nnot ok ?? nil\nnot ok ?? nil || ok\nnot ok ?? ok\nnot ok ?? str\nnot ok ?? true\nnot ok and $env\nnot ok and false\nnot ok and foo in list\nnot ok and ok\nnot ok and true\nnot ok not in $env?.[String]\nnot ok or $env\nnot ok or $env?.[str]\nnot ok or false\nnot ok or ok\nnot ok or true\nnot ok || $env\nnot ok || false\nnot ok || ok\nnot ok || true\nnot ok; nil\nnot one($env, false)\nnot one($env, ok)\nnot one($env, true)\nnot one(array, false)\nnot one(array, true)\nnot one(list, false)\nnot one(list, ok)\nnot one(list, true)\nnot reduce(array, false)\nnot reduce(array, ok)\nnot reduce(array, true)\nnot reduce(list, true)\nnot true != $env\nnot true != false\nnot true != nil\nnot true != nil or $env\nnot true != ok\nnot true != true\nnot true && $env\nnot true && $env == $env\nnot true && 0 * $env\nnot true && false\nnot true && not true\nnot true && ok\nnot true && true\nnot true == $env\nnot true == false\nnot true == nil\nnot true == ok\nnot true == true\nnot true ? 0 : foo\nnot true ? 1.0 : $env\nnot true ? 1.0 : nil\nnot true ? f64 : 1\nnot true ? greet : list\nnot true ? str : array\nnot true ?: $env\nnot true ?: 0\nnot true ?: 1\nnot true ?: 1.0\nnot true ?: add\nnot true ?: greet\nnot true ?: nil\nnot true ?: ok\nnot true ?? $env\nnot true ?? $env.add\nnot true ?? $env.list\nnot true ?? $env?.[Bar]\nnot true ?? $env?.ok\nnot true ?? $env[:$env | now(greet)]\nnot true ?? $env[:foobar].i\nnot true ?? 0\nnot true ?? 1\nnot true ?? 1.0\nnot true ?? add\nnot true ?? array\nnot true ?? f64\nnot true ?? false\nnot true ?? floor($env)\nnot true ?? foo\nnot true ?? greet\nnot true ?? i\nnot true ?? list\nnot true ?? nil\nnot true ?? ok\nnot true ?? str\nnot true ?? str && true\nnot true ?? true\nnot true and $env\nnot true and false\nnot true and ok\nnot true and true\nnot true in $env?.[foobar]\nnot true or $env\nnot true or $env?.String\nnot true or $env?.[Bar]\nnot true or false\nnot true or ok\nnot true or true\nnot true || $env\nnot true || $env?.String\nnot true || $env?.[String]\nnot true || false\nnot true || ok\nnot true || true\nok\nok != !false\nok != !ok\nok != !true\nok != $env != $env\nok != $env != ok\nok != $env && $env\nok != $env == ok\nok != $env ?? foo\nok != $env ?? ok\nok != $env and $env\nok != $env or nil not in $env\nok != $env.ok\nok != $env?.Bar\nok != $env?.String\nok != $env?.String?.[i]\nok != $env?.[Bar]\nok != $env?.[String]\nok != $env?.[foobar]\nok != $env?.[nil]\nok != $env?.[str]\nok != $env?.foobar\nok != $env?.foobar?.greet\nok != $env?.ok\nok != any($env, ok)\nok != any(array, false)\nok != array ?? f64\nok != false && $env\nok != false ? 1.0 : foo\nok != false ? list : 0\nok != false ?? findLastIndex($env, #)\nok != false or false\nok != false or true\nok != false; false\nok != greet ?? foo\nok != i ?? sum($env, #)\nok != nil && ok\nok != nil == ok\nok != nil == ok and ok\nok != nil ? f64 : 1\nok != nil ?? false\nok != nil ?? true\nok != nil and $env\nok != nil and 1 <= 1\nok != nil or false\nok != not false\nok != not true\nok != ok\nok != ok != nil\nok != ok == nil\nok != ok ? str : str\nok != reduce(list, ok)\nok != str ?? f64\nok != str ?? i\nok != sum($env?.[str])\nok != true != nil\nok != true != true\nok != true && $env\nok != true && ok\nok != true == $env\nok != true ? 1.0 : $env\nok != true ?? foo\nok != true and $env?.Bar\nok && !true\nok && $env != $env\nok && $env != array\nok && $env != nil\nok && $env != str\nok && $env == foo\nok && $env == greet\nok && $env ?? greet\nok && $env ?? ok\nok && $env not in $env?.array\nok && $env not in array\nok && $env.ok\nok && $env?.Bar\nok && $env?.String\nok && $env?.String?.String\nok && $env?.String?.list\nok && $env?.[Bar]\nok && $env?.[Bar]?.[array]\nok && $env?.[Bar]?.add\nok && $env?.[String]\nok && $env?.[String]?.foo\nok && $env?.[foobar?.Bar]\nok && $env?.[foobar]\nok && $env?.[str]\nok && $env?.foobar\nok && $env?.ok\nok && 0 < 0\nok && 0 < 1\nok && 0 == 0\nok && 0 >= f64\nok && 0 ?? add\nok && 1 != i\nok && 1 <= 1.0\nok && 1 == 1\nok && 1 == f64\nok && 1 ?? foo\nok && 1.0 != $env\nok && 1.0 != 1.0\nok && 1.0 != f64\nok && 1.0 < f64\nok && 1.0 == f64\nok && 1.0 > 1\nok && 1.0 >= f64\nok && 1.0 ?? 0\nok && 1.0 ?? foo\nok && 1.0 ?? list\nok && add != $env\nok && add != $env?.String\nok && add == nil\nok && add ?? list\nok && add ?? true\nok && all(list, false)\nok && array == array\nok && array ?? !$env\nok && array ?? f64\nok && array ?? false\nok && array ?? greet\nok && f64 != nil\nok && f64 > 1 or $env\nok && f64 > 1.0\nok && foo != foo\nok && foo != nil\nok && foo == $env\nok && foo ?? $env\nok && foo ?? i\nok && foo ?? ok\nok && greet == nil\nok && i < 1\nok && i <= f64\nok && i == i\nok && i >= 1\nok && i not in array\nok && list == $env\nok && list ?? greet\nok && max($env)\nok && max(array)\nok && mean(array)\nok && median(array)\nok && min(array)\nok && nil != $env\nok && nil != add\nok && nil == i\nok && nil == nil\nok && nil == true\nok && nil ?? $env\nok && nil in array\nok && not $env?.ok\nok && not true\nok && ok\nok && ok && $env?.[str]\nok && ok == $env\nok && ok == ok\nok && ok == true\nok && ok ?? 1.0\nok && ok and $env\nok && ok or false\nok && ok || false\nok && one(list, false)\nok && str == nil\nok && str endsWith str\nok && str not in $env\nok && str not startsWith str\nok && str startsWith str\nok && true != ok\nok && true ?? 0\nok && true ?? foo\nok && true ?? max(i, 1.0)\nok && true ?? true\nok && true or false\nok && true || $env?.String\nok == !true\nok == $env && $env\nok == $env && ok\nok == $env ? nil : foo\nok == $env ?? 0\nok == $env ?? 1\nok == $env ?? 1.0 == false\nok == $env ?? ok\nok == $env and ok\nok == $env and true\nok == $env || false\nok == $env || ok\nok == $env.ok\nok == $env?.Bar\nok == $env?.Bar?.[str]\nok == $env?.String\nok == $env?.String?.[greet]\nok == $env?.[Bar]\nok == $env?.[Bar]?.[array]\nok == $env?.[String]\nok == $env?.[foobar]\nok == $env?.[str]\nok == $env?.false\nok == $env?.foobar\nok == $env?.nil\nok == $env?.ok\nok == 1.0 ?? $env\nok == 1.0 ?? array\nok == any($env, false)\nok == array ?? $env\nok == array ?? 0\nok == f64 ?? array\nok == f64 ?? i\nok == false != nil\nok == first($env)\nok == foo ?? i\nok == foo ?? ok\nok == i ?? f64\nok == i ?? min($env)\nok == list ?? greet\nok == list ?? ok\nok == max(array)\nok == mean(array)\nok == min($env)\nok == nil != false\nok == nil != ok\nok == nil != true\nok == nil == nil\nok == nil ? 1.0 : $env\nok == not false\nok == not ok\nok == not true\nok == ok\nok == ok != $env\nok == ok ? nil : $env\nok == ok || true\nok == str ?? true\nok == true != ok\nok == true && $env\nok == true == $env\nok == true ?? false\nok == true and ok\nok == true in find($env, false)\nok ? $env : $env * $env | map(i)\nok ? $env : $env >= 1.0 | date(ok, true)\nok ? $env : $env | find(.f64)\nok ? $env : $env | map(1.0)\nok ? $env : $env?.Bar\nok ? $env : $env?.String()\nok ? $env : $env?.[Bar]\nok ? $env : $env?.[String]\nok ? $env : $env?.[add]\nok ? $env : $env?.[str]\nok ? $env : $env?.array\nok ? $env : $env?.ok\nok ? $env : 0 not in array\nok ? $env : foo.Bar\nok ? $env : foo?.Bar\nok ? $env?.String : str\nok ? $env?.[String] : add\nok ? 0 : $env.list\nok ? 0 : $env?.f64\nok ? 0 : $env?.foo\nok ? 0 : $env?.ok\nok ? 0 : foo?.Bar\nok ? 1 : $env.add\nok ? 1 : $env?.[f64]\nok ? 1 : $env[timezone(array):]\nok ? 1.0 : $env | groupBy(#.str)\nok ? 1.0 : $env.add\nok ? 1.0 : $env.array\nok ? 1.0 : $env.list\nok ? 1.0 : $env?.Bar\nok ? 1.0 : $env?.[array]\nok ? 1.0 : $env?.array\nok ? 1.0 : $env?.greet\nok ? 1.0 : $env?.i\nok ? 1.0 : $env?.list\nok ? 1.0 : 1.0 * f64\nok ? 1.0 : f64 ?? list\nok ? 1.0 : list | groupBy($env)\nok ? add : $env | groupBy(#.list)\nok ? add : $env | map(foo)\nok ? add : $env | none(#)\nok ? add : $env.array\nok ? add : $env.f64\nok ? add : $env.greet\nok ? add : $env?.Bar()\nok ? add : $env?.[String]\nok ? add : $env?.[greet]\nok ? add : $env?.ok\nok ? add : add\nok ? add : array | reduce(1.0)\nok ? add : f64\nok ? add : foo.Bar\nok ? add : foo?.String\nok ? add : greet\nok ? add : i\nok ? add : list | find($env?.Bar)\nok ? add : list | reduce(#)\nok ? add : nil in -$env\nok ? add : nil in array\nok ? add : str\nok ? array : $env | sum(#)\nok ? array : $env?.add\nok ? array : add\nok ? array : foo\nok ? array : list | min(i)\nok ? array : ok\nok ? array : sum(array)\nok ? f64 - 0 : $env not contains $env\nok ? f64 : $env.foo\nok ? f64 : $env.i\nok ? f64 : $env.ok\nok ? f64 : $env[bitxor(foobar):]\nok ? f64 : f64\nok ? f64 : foo\nok ? f64 : foo?.String\nok ? f64 : foo?.String()\nok ? f64 : keys($env)\nok ? f64 : list ?? str\nok ? f64 : str\nok ? f64 : uniq($env)\nok ? false : $env.foo\nok ? false : $env?.[Bar]\nok ? false : $env?.[add]\nok ? false : $env?.[i]\nok ? false : $env?.list\nok ? false : foo.Bar\nok ? false : list?.[i]\nok ? foo : $env endsWith str\nok ? foo : $env not endsWith $env?.true\nok ? foo : $env | groupBy(.list)\nok ? foo : $env | groupBy(i)\nok ? foo : $env | sum(#.foo)\nok ? foo : $env.add\nok ? foo : $env.greet\nok ? foo : $env.i\nok ? foo : $env?.Bar()\nok ? foo : $env?.String\nok ? foo : $env?.[f64]\nok ? foo : $env?.[find(foobar, .f64)]\nok ? foo : $env?.[foo]\nok ? foo : $env?.add\nok ? foo : $env?.array\nok ? foo : $env?.foobar?.String()\nok ? foo : $env?.greet\nok ? foo : add\nok ? foo : array\nok ? foo : array | reduce(false)\nok ? foo : array?.[i]\nok ? foo : foo\nok ? foo : foo?.Bar\nok ? foo : foo?.String\nok ? foo : list\nok ? foo not in list : array\nok ? foo.String : str\nok ? greet : $env.str\nok ? greet : $env?.f64\nok ? greet : array\nok ? greet : f64\nok ? greet : foo\nok ? greet : foo?.String()\nok ? greet : groupBy($env, greet)?.[i]\nok ? greet : i\nok ? greet : list | mean(nil)\nok ? greet : sortBy($env, 1)\nok ? greet : str\nok ? greet : string($env)\nok ? greet : {foo: true}\nok ? i : $env?.[greet]\nok ? i : $env?.i\nok ? i : foo\nok ? i : foo.Bar\nok ? i : list\nok ? i : list?.[i]\nok ? i : str\nok ? list : $env.i\nok ? list : $env[fromBase64(foo, foo):]\nok ? list : add\nok ? list : f64\nok ? list : foo\nok ? list : foo.String\nok ? list : i\nok ? list : nil ?? list\nok ? list : ok\nok ? list : str\nok ? nil != $env : str\nok ? nil : $env not matches $env?.[i]\nok ? nil : $env | mean($env)\nok ? nil : $env.foo\nok ? nil : $env.ok\nok ? nil : $env?.String\nok ? nil : $env?.[String]\nok ? nil : $env?.[f64]\nok ? nil : $env?.[greet]\nok ? nil : $env?.[list]\nok ? nil : $env?.[ok]\nok ? nil : $env?.greet\nok ? nil : $env?.i\nok ? nil : $env?.ok\nok ? nil : $env?.str\nok ? nil : foo.Bar\nok ? nil : foo.String\nok ? ok != $env : 1 < 1.0\nok ? ok : $env | filter(one(array, ok))\nok ? ok : $env.list\nok ? ok : $env?.[array]\nok ? ok : $env?.greet\nok ? ok : false and ok\nok ? ok : foo\nok ? ok : foo | date(list)\nok ? ok : foo?.String\nok ? ok : i\nok ? ok : list?.[i]\nok ? ok : ok\nok ? reduce($env, $env, true) : foo?.Bar\nok ? str : $env | findLastIndex(#)\nok ? str : $env?.String(i)?.ok\nok ? str : $env?.[Bar]\nok ? str : $env?.foo\nok ? str : $env?.ok\nok ? str : add\nok ? str : f64\nok ? str : foo\nok ? str : ok\nok ? true : $env | groupBy(sortBy(#, 1))\nok ? true : array?.[i]\nok ? true : foo?.String\nok ? true : foo?.String()\nok ? true ?: 0 : str\nok ?: $env ?? $env\nok ?: $env not endsWith str\nok ?: $env not matches $env\nok ?: $env | any(.Bar)\nok ?: $env | filter(.Bar)\nok ?: $env | find(#.str)\nok ?: $env | map(#.Bar)\nok ?: $env | max(add)\nok ?: $env | one(#.Bar)\nok ?: $env | reduce(#)\nok ?: $env | sortBy(.i != #)\nok ?: $env | sortBy(foo)\nok ?: $env.add\nok ?: $env.array\nok ?: $env.f64\nok ?: $env.foo\nok ?: $env.ok\nok ?: $env.str\nok ?: $env?.Bar\nok ?: $env?.[Bar]\nok ?: $env?.[Bar]?.str\nok ?: $env?.[String]\nok ?: $env?.[add]\nok ?: $env?.[array]\nok ?: $env?.[f64]\nok ?: $env?.[foo]\nok ?: $env?.[greet]\nok ?: $env?.[i]\nok ?: $env?.[ok]\nok ?: $env?.[str]\nok ?: $env?.add\nok ?: $env?.array\nok ?: $env?.f64\nok ?: $env?.foo\nok ?: $env?.greet\nok ?: $env?.i\nok ?: $env?.list\nok ?: $env?.str\nok ?: $env[foobar not in list:]\nok ?: $env[foobar:]\nok ?: 1 % 1\nok ?: 1.0 | date($env)\nok ?: 1.0 | date(1)\nok ?: add\nok ?: all($env, .f64)\nok ?: array\nok ?: array | sum(greet)\nok ?: array?.[i]\nok ?: ceil(f64)\nok ?: count($env)\nok ?: count(array)\nok ?: count(list)\nok ?: date(array)\nok ?: date(false)\nok ?: date(list)\nok ?: f64\nok ?: foo\nok ?: foo not in $env\nok ?: foo?.Bar\nok ?: foo?.String\nok ?: foo?.String()\nok ?: fromJSON(str)\nok ?: greet\nok ?: greet($env)\nok ?: i\nok ?: i == 1\nok ?: i >= i\nok ?: int(1.0)\nok ?: list\nok ?: list | findIndex($env)\nok ?: list | none(true)\nok ?: max(list)\nok ?: nil != str\nok ?: nil in $env\nok ?: ok\nok ?: ok | date(add, f64)\nok ?: str\nok ?: str matches findLast($env, #)\nok ?: str startsWith $env\nok ?: sum($env)\nok ?: sum(array, 0)\nok ?: {foo: list}\nok ?? !$env\nok ?? !false\nok ?? !ok\nok ?? !true\nok ?? $env ?: list | min(add, add)\nok ?? $env ?? f64\nok ?? $env ?? true\nok ?? $env | get(f64)\nok ?? $env.add\nok ?? $env.array\nok ?? $env.f64\nok ?? $env.foo\nok ?? $env.greet\nok ?? $env.i\nok ?? $env.list\nok ?? $env.ok\nok ?? $env.str\nok ?? $env?.Bar\nok ?? $env?.Bar()\nok ?? $env?.String\nok ?? $env?.String($env)\nok ?? $env?.String(str)\nok ?? $env?.String.Bar\nok ?? $env?.String.add\nok ?? $env?.String?.[ok]\nok ?? $env?.String?.list()\nok ?? $env?.[0 + foo]\nok ?? $env?.[1 ** foobar]\nok ?? $env?.[1.0 < list]\nok ?? $env?.[Bar]\nok ?? $env?.[Bar]?.array\nok ?? $env?.[String]\nok ?? $env?.[String].f64\nok ?? $env?.[String].ok\nok ?? $env?.[String]?.ok\nok ?? $env?.[add]\nok ?? $env?.[array]\nok ?? $env?.[array]?.f64\nok ?? $env?.[f64]\nok ?? $env?.[foo and i]\nok ?? $env?.[foo]\nok ?? $env?.[foo]?.[i]\nok ?? $env?.[foobar?.[greet]]\nok ?? $env?.[foobar?.array()]\nok ?? $env?.[greet]\nok ?? $env?.[i]\nok ?? $env?.[list]\nok ?? $env?.[list]?.ok\nok ?? $env?.[ok]\nok ?? $env?.[ok]?.[i]\nok ?? $env?.[str]\nok ?? $env?.[true ** 0]\nok ?? $env?.add\nok ?? $env?.all(foobar, nil, list)\nok ?? $env?.array\nok ?? $env?.f64\nok ?? $env?.foo\nok ?? $env?.greet\nok ?? $env?.i\nok ?? $env?.list\nok ?? $env?.ok\nok ?? $env?.str\nok ?? $env[:f64]\nok ?? $env[array not matches foobar:]\nok ?? $env[array.list:foo(String)]\nok ?? $env[foobar not matches false:foobar]\nok ?? $env[foobar.ok:]\nok ?? $env[greet:foobar?.[greet]]\nok ?? $env[i:]\nok ?? $env[nil:Bar]\nok ?? $env[str():]\nok ?? $env[str(foobar):]\nok ?? -$env\nok ?? -$env?.[ok]\nok ?? -0\nok ?? -1\nok ?? -1.0\nok ?? -f64\nok ?? -i\nok ?? 0 ?? $env\nok ?? 0 ?? foo\nok ?? 1 ?: f64\nok ?? 1 ?? $env\nok ?? 1.0 ?? $env.add\nok ?? 1.0 ?? ok\nok ?? 1.0 | get($env)\nok ?? [1.0]\nok ?? add\nok ?? add ?? i\nok ?? add(i, 1)\nok ?? all($env, #.str)\nok ?? all($env, .Bar)\nok ?? any($env, .str)\nok ?? array\nok ?? array ?? str\nok ?? bitnot($env)\nok ?? bitnot(i)\nok ?? ceil(1.0)\nok ?? concat($env)\nok ?? count($env)\nok ?? count($env, #.add)\nok ?? count(array)\nok ?? count(list)\nok ?? date(1.0)\nok ?? date(ok)\nok ?? f64\nok ?? f64 ?? false\nok ?? f64 ?? i\nok ?? false ? $env : f64\nok ?? find($env, #.foo)\nok ?? find($env, .ok)\nok ?? find(array, ok)\nok ?? findIndex($env, .array)\nok ?? findLastIndex($env, #)\nok ?? findLastIndex($env, #.list)\nok ?? findLastIndex($env, .list)\nok ?? first($env)\nok ?? flatten($env)\nok ?? float(0)\nok ?? float(1.0)\nok ?? float(str)\nok ?? foo\nok ?? foo ?? $env?.Bar()\nok ?? foo ?? array\nok ?? foo ?? list\nok ?? foo ?? lower($env)\nok ?? foo.Bar\nok ?? foo.String\nok ?? foo.String()\nok ?? foo?.Bar\nok ?? foo?.String\nok ?? foo?.String()\nok ?? greet\nok ?? greet ? greet : greet\nok ?? greet ?? nil\nok ?? greet ?? str\nok ?? greet($env)\nok ?? greet(str)\nok ?? groupBy($env, $env)?.i\nok ?? groupBy($env, .foo)\nok ?? groupBy($env, .greet)\nok ?? groupBy($env, .list)\nok ?? groupBy($env, i)\nok ?? groupBy(array, #)\nok ?? groupBy(array, foo)\nok ?? i\nok ?? i ?? ok\nok ?? i ?? str\nok ?? int(i)\nok ?? len(list)\nok ?? list\nok ?? list ? ok : 1.0\nok ?? list?.[i]\nok ?? max(0, $env)?.[add]\nok ?? min(array)\nok ?? nil ? false : foo\nok ?? nil ?? 1\nok ?? nil ?? add\nok ?? nil ?? array\nok ?? none($env, #)\nok ?? none(list, $env)\nok ?? not $env\nok ?? not 1.0 ?? foo\nok ?? not false\nok ?? not ok\nok ?? not true\nok ?? ok\nok ?? round($env)\nok ?? sort($env)\nok ?? sortBy($env, #)\nok ?? sortBy(array, #)\nok ?? str\nok ?? str ?? array\nok ?? str ?? f64\nok ?? str ?? ok\nok ?? str | get(false)\nok ?? string(add)\nok ?? string(ok)\nok ?? sum($env)\nok ?? sum($env, #)\nok ?? sum($env, #.f64)?.[add]\nok ?? sum(array)\nok ?? sum(list)\nok ?? sum(uniq($env))\nok ?? timezone($env)\nok ?? toBase64($env)\nok ?? toJSON(0)\nok ?? toJSON(1.0)\nok ?? toJSON(foo)\nok ?? toJSON(true)\nok ?? toPairs($env)\nok ?? trimPrefix($env)\nok ?? true ?? list\nok ?? type($env)\nok ?? type(f64)\nok ?? type(greet)\nok ?? type(ok)\nok ?? {foo: 1}\nok ?? {foo: i}\nok ?? {foo: nil}\nok ?? {foo: ok}\nok and !true\nok and $env != 0\nok and $env != 1.0\nok and $env != false\nok and $env != list\nok and $env == f64\nok and $env == list\nok and $env ?? f64\nok and $env in array\nok and $env || false\nok and $env.ok\nok and $env?.Bar\nok and $env?.Bar?.f64\nok and $env?.Bar?.foobar\nok and $env?.String\nok and $env?.[Bar]\nok and $env?.[Bar]?.[foo]\nok and $env?.[Bar]?.array\nok and $env?.[String]\nok and $env?.[String]?.[add]\nok and $env?.[foobar]\nok and $env?.[str]\nok and $env?.foobar\nok and $env?.foobar?.[foo]\nok and $env?.nil?.f64\nok and $env?.ok\nok and 0 != nil\nok and 0 < i\nok and 0 <= f64\nok and 1 < 1.0\nok and 1 < i\nok and 1 <= f64\nok and 1.0 != f64\nok and 1.0 != i\nok and 1.0 <= i\nok and 1.0 ?? $env\nok and 1.0 ?? $env.foo\nok and 1.0 not in array\nok and add == $env\nok and array != array\nok and array ?? f64\nok and f64 not in array\nok and false && $env\nok and false == $env\nok and false ? $env : $env\nok and false ?? 1.0\nok and first($env)\nok and foo != foo\nok and foo == nil\nok and foo ?? $env.ok\nok and foo ?? $env?.String()\nok and foo ?? true\nok and greet == nil\nok and greet not in $env?.[Bar]\nok and i < i\nok and i == f64\nok and i >= 1.0\nok and i ?? add\nok and i ^ 1 != 1.0\nok and last($env)\nok and list ?? [i]\nok and list ?? foo\nok and nil != false\nok and nil != foo\nok and nil != ok\nok and nil == $env\nok and nil == add\nok and nil == f64\nok and nil == true\nok and nil not in array\nok and not ok\nok and not true\nok and ok\nok and ok ? add : i\nok and ok ?? $env\nok and one(list, ok)\nok and str == string(foo)\nok and str matches toJSON(1.0)\nok and str not endsWith str\nok and str not startsWith str\nok and true != false\nok and true && $env\nok and true ?? add\nok and true ?? str\nok and true and $env\nok and true || $env.ok\nok and {foo: i}?.foo\nok in $env && false\nok in $env?.Bar\nok in $env?.String\nok in $env?.[Bar]\nok in $env?.[String]\nok in $env?.[foobar]\nok in $env?.foobar\nok in $env?.foobar?.[add]\nok in [$env, 1]\nok in [false]\nok in [ok]\nok in concat(array)\nok in first($env)\nok in flatten(array)\nok in last($env)\nok in sort(array)\nok not in $env || true\nok not in $env?.Bar\nok not in $env?.Bar?.list\nok not in $env?.String\nok not in $env?.String?.greet\nok not in $env?.[Bar]\nok not in $env?.[Bar]?.[foo]\nok not in $env?.[Bar]?.ok()\nok not in $env?.[String]\nok not in $env?.[String]?.String\nok not in $env?.[foobar]\nok not in $env?.false?.[i]\nok not in $env?.foobar?.[array]\nok not in $env?.foobar?.[list]\nok not in $env?.true || false\nok not in [0, nil]\nok not in [false]\nok not in [ok]\nok not in [true]\nok not in array ?? greet\nok not in groupBy(list, i)\nok not in last($env)\nok not in list ?? add\nok not in list ?? greet\nok not in map($env, false)\nok not in values($env)\nok or !false\nok or !ok\nok or !true\nok or $env != 1\nok or $env != nil\nok or $env * 1.0\nok or $env * f64\nok or $env + $env?.str\nok or $env - $env\nok or $env - 1\nok or $env - 1.0\nok or $env < i\nok or $env <= $env.f64\nok or $env <= $env?.[f64]\nok or $env == $env\nok or $env == $env?.foo\nok or $env == 1\nok or $env == array\nok or $env == list\nok or $env == ok\nok or $env > str\nok or $env >= i\nok or $env >= str\nok or $env ?: ok\nok or $env and $env?.String\nok or $env and 1 != $env\nok or $env endsWith str\nok or $env in $env\nok or $env in list\nok or $env not in foo\nok or $env not in str\nok or $env not startsWith str\nok or $env or $env\nok or $env or ok\nok or $env || true\nok or $env.ok\nok or $env?.Bar\nok or $env?.Bar()\nok or $env?.Bar(list())\nok or $env?.Bar(list)\nok or $env?.Bar(one(foobar, false))\nok or $env?.String\nok or $env?.String()\nok or $env?.String(1, f64)\nok or $env?.String(1.0, i)?.f64\nok or $env?.[$env]?.ok(foobar?.str)\nok or $env?.[1.0 not matches f64]\nok or $env?.[1]\nok or $env?.[Bar]\nok or $env?.[Bar].array\nok or $env?.[Bar]?.[list]\nok or $env?.[Bar]?.greet\nok or $env?.[String]\nok or $env?.[String].list\nok or $env?.[add]\nok or $env?.[add]?.array\nok or $env?.[add]?.ok\nok or $env?.[array($env)]\nok or $env?.[array]\nok or $env?.[array].ok\nok or $env?.[f64]\nok or $env?.[f64].i\nok or $env?.[foo not in foobar]\nok or $env?.[foo]\nok or $env?.[foobar or 1]\nok or $env?.[foobar]\nok or $env?.[foobar]?.add\nok or $env?.[greet()]\nok or $env?.[greet]\nok or $env?.[greet] < str\nok or $env?.[i]\nok or $env?.[i].String\nok or $env?.[list]\nok or $env?.[list]?.add()\nok or $env?.[ok | reduce(foo)]\nok or $env?.[ok()]\nok or $env?.[ok]\nok or $env?.[ok]?.add\nok or $env?.[sortBy(foobar, $env)]\nok or $env?.[str]\nok or $env?.[str]?.[f64]\nok or $env?.[str]?.list\nok or $env?.ok\nok or $env?.upper(1.0, 0, foo)\nok or $env[$env:foobar]?.[foo]?.[foo]\nok or $env[:1.0 ^ false].str\nok or $env[:foo?.list]\nok or $env[:foo]\nok or $env[:greet?.f64]\nok or $env[:indexOf(greet)]\nok or $env[:nil .. add]\nok or $env[:str]\nok or $env[add.Bar():]\nok or $env[foo:]\nok or $env[foobar.foo(nil):f64?.[foo]]\nok or $env[foobar:]\nok or $env[list:]\nok or $env[nil matches i:foobar not startsWith foobar]\nok or $env[not foobar:ok]\nok or $env[ok():]\nok or $env[ok:]\nok or -$env\nok or -i ?? add\nok or 0 < $env\nok or 0 == nil\nok or 0 == nil ? 0 : array\nok or 0 >= $env?.[array]\nok or 0 >= 1.0\nok or 1 + $env?.[i]\nok or 1 <= 1.0\nok or 1 <= i\nok or 1 > $env?.[String]\nok or 1 > 0\nok or 1 >= 1.0\nok or 1 ?? ok\nok or 1.0 != $env\nok or 1.0 != nil\nok or 1.0 < 0\nok or 1.0 < 1.0\nok or 1.0 < f64\nok or 1.0 <= $env\nok or 1.0 <= f64\nok or 1.0 <= f64 + 1\nok or 1.0 == $env\nok or 1.0 >= $env\nok or 1.0 >= 1\nok or 1.0 ?? 1\nok or 1.0 ?? list\nok or 1.0 in $env\nok or abs($env)\nok or add == $env.add\nok or add ?? array\nok or array != nil\nok or array ?? 0\nok or f64 < 1\nok or f64 <= i\nok or f64 == nil\nok or f64 > $env\nok or f64 > $env?.[array]\nok or f64 > 1\nok or f64 > f64\nok or f64 >= 0\nok or f64 ?? $env\nok or false && ok\nok or false ? foo : foo\nok or false ?: foo\nok or false ?? 1.0\nok or false or ok\nok or false || false\nok or find($env, #)\nok or find($env, .greet)\nok or find($env, .str)\nok or foo != $env.foo\nok or foo != foo\nok or foo == foo\nok or foo ?? $env\nok or foo ?? list\nok or foo in $env\nok or foo in list\nok or foo in sum($env)\nok or foo not in groupBy($env, 1)\nok or fromJSON($env)\nok or fromJSON(str)\nok or greet != $env\nok or greet == $env\nok or greet not in $env\nok or i != nil\nok or i < i\nok or i == nil\nok or i ?? foo\nok or last($env)\nok or list ?? true\nok or mean(array)\nok or nil != $env\nok or nil != add\nok or nil != foo\nok or nil != i\nok or nil != str\nok or nil == add\nok or nil == array\nok or nil == str\nok or nil in array\nok or nil not in $env?.[Bar]\nok or none($env, #)\nok or not $env\nok or not $env?.Bar()?.String\nok or not $env?.[str]\nok or not ok\nok or ok\nok or ok != true\nok or ok == false\nok or ok ?? nil\nok or ok ?? not ok\nok or ok or ok\nok or reduce($env, ok)\nok or sortBy($env, 1.0)\nok or sortBy($env, true)?.array?.[array]\nok or str + $env\nok or str == $env\nok or str == $env?.[str]?.String\nok or str not endsWith $env\nok or str not in foo\nok or sum($env)\nok or true && false\nok or true == $env?.[String]\nok or true == nil\nok or true ?? $env\nok or true ?? list\nok or true ?? true\nok or true or $env?.String(i)\nok or true || ok\nok or {foo: nil}?.i\nok || !$env\nok || !false\nok || !ok\nok || !true\nok || $env != f64\nok || $env != false\nok || $env != i\nok || $env != nil ? foo : array\nok || $env && $env\nok || $env + 1.0\nok || $env + i\nok || $env < $env\nok || $env < -1.0\nok || $env < false ?? 1.0\nok || $env <= 0\nok || $env <= i\nok || $env == $env\nok || $env == 1.0\nok || $env == list\nok || $env >= $env.f64\nok || $env >= str\nok || $env contains $env?.[Bar].Bar\nok || $env contains str\nok || $env endsWith $env?.[list]\nok || $env matches $env\nok || $env matches str\nok || $env not contains str\nok || $env not in str\nok || $env not matches $env\nok || $env or false\nok || $env || $env\nok || $env || ok\nok || $env.ok\nok || $env?.$env\nok || $env?.$env.str\nok || $env?.Bar\nok || $env?.Bar()\nok || $env?.String\nok || $env?.String()\nok || $env?.String()[:ok]?.foo\nok || $env?.String(all(foobar, #.list))\nok || $env?.String(first(foobar))\nok || $env?.String(foo())\nok || $env?.String.greet\nok || $env?.String?.ok()?.array\nok || $env?.[Bar]\nok || $env?.[String?.Bar]\nok || $env?.[String]\nok || $env?.[String]?.Bar\nok || $env?.[add]\nok || $env?.[add]?.[i]\nok || $env?.[add]?.i\nok || $env?.[all(foobar, foobar)]\nok || $env?.[array]\nok || $env?.[array].list\nok || $env?.[f64]\nok || $env?.[f64].str(list?.[ok])\nok || $env?.[findLastIndex(i, .String)]\nok || $env?.[foo]\nok || $env?.[foo].f64\nok || $env?.[foo]?.str\nok || $env?.[foobar startsWith foobar]\nok || $env?.[foobar | take(foobar)]\nok || $env?.[foobar?.i]\nok || $env?.[foobar]\nok || $env?.[greet]\nok || $env?.[greet]?.String\nok || $env?.[greet]?.f64\nok || $env?.[i]\nok || $env?.[i].str\nok || $env?.[i]?.[foo]\nok || $env?.[list]\nok || $env?.[list].add\nok || $env?.[list]?.[greet]\nok || $env?.[nil endsWith list]\nok || $env?.[ok]\nok || $env?.[str()]\nok || $env?.[str]\nok || $env?.[str].list\nok || $env?.foobar\nok || $env?.foobar.String\nok || $env?.ok\nok || $env?.sortBy(nil)\nok || $env?.toPairs(add, true)\nok || $env[$env:Bar]\nok || $env[1.0:]\nok || $env[:String()]\nok || $env[:add()]\nok || $env[:array | none(false)]\nok || $env[:foo]\nok || $env[:foobar]\nok || $env[Bar(foo):add and foobar]\nok || $env[Bar?.[str]:date($env)]\nok || $env[add():]\nok || $env[add:foobar]\nok || $env[f64.ok:array(foobar, foobar, String)]\nok || $env[f64:ok(true)]\nok || $env[false .. String:]\nok || $env[foo:foobar]\nok || $env[foobar:]\nok || $env[foobar?.list:]\nok || $env[greet:$env?.Bar]\nok || $env[i(foobar):Bar .. foo]\nok || $env[map(foo, foobar):]\nok || $env[str?.add:groupBy(i, foobar)]\nok || 0 - $env\nok || 0 == $env\nok || 0 == 1\nok || 0 == 1.0\nok || 0 > 1.0\nok || 0 ?? $env[:String()]\nok || 0 ?? ok\nok || 1 < findLast($env, #.ok)\nok || 1 > 1\nok || 1 >= $env?.[foo]\nok || 1.0 != 1.0\nok || 1.0 != f64\nok || 1.0 * $env\nok || 1.0 - $env?.[ok]\nok || 1.0 <= 0\nok || 1.0 <= 1\nok || 1.0 <= i\nok || 1.0 == 1\nok || 1.0 == 1.0\nok || 1.0 ?? add\nok || 1.0 ?? array\nok || 1.0 ?? i\nok || 1.0 in $env\nok || 1.0 in $env?.String\nok || add == $env?.[foo]\nok || add ?? str\nok || add not in $env\nok || any($env, #)\nok || any($env, .list)\nok || any($env, false)\nok || array != nil\nok || array ?? 1.0\nok || f64 != $env\nok || f64 != f64\nok || f64 + $env\nok || f64 < $env\nok || f64 < 1.0\nok || f64 < i\nok || f64 <= 1\nok || f64 == f64\nok || f64 > $env\nok || f64 > 1\nok || false ?: foo\nok || false and false\nok || false not in sum(list, $env)\nok || findLast($env, #.String)\nok || findLast($env, $env)\nok || foo != nil\nok || foo == $env\nok || foo == $env[:false]\nok || foo == foo\nok || foo == nil\nok || foo ?? array\nok || foo ?? list\nok || foo ?? not true\nok || foo not in list\nok || fromJSON($env)\nok || greet != nil\nok || greet == $env\nok || greet ?? array\nok || greet ?? i\nok || i * $env\nok || i + $env\nok || i < f64\nok || i == 1\nok || i > i\nok || i >= $env\nok || i >= 1.0\nok || last($env)\nok || list != list\nok || list ?? i\nok || list ?? str\nok || max(i, list)\nok || max(list, greet)\nok || mean(list | sortBy(greet))\nok || mean(list)\nok || median($env)?.greet\nok || median(array)\nok || median(array, 1)\nok || median(array, str)\nok || min($env)\nok || nil != -1.0\nok || nil != 1\nok || nil != add\nok || nil != greet\nok || nil != i\nok || nil != nil\nok || nil != true\nok || nil == $env.array\nok || nil == 1.0\nok || nil == false\nok || nil == nil ?? 1\nok || nil ?? $env?.[f64]\nok || nil in $env?.String\nok || nil in array\nok || nil not in array\nok || none(array, $env)\nok || not $env\nok || not ok\nok || ok\nok || ok == nil\nok || ok == ok\nok || ok ?: foo\nok || ok ?? [nil]\nok || ok || $env\nok || one($env, .add)\nok || reduce($env, .foo)\nok || sortBy($env, array).str\nok || sortBy($env, i, str)\nok || str != $env\nok || str != nil\nok || str != str\nok || str + $env\nok || str <= str\nok || str ?? array\nok || str contains $env\nok || str contains str\nok || str endsWith $env\nok || str endsWith str\nok || str in $env\nok || str matches $env\nok || str not in foo\nok || sum($env)\nok || sum($env, .list)\nok || true != nil\nok || true && $env\nok || true ?? add\nok || true and $env\nok || true and true\nok || true || $env?.[greet]\nok || {foo: nil}?.add\nok; 0 ?? 1\nok; add\nok; f64\nok; foo\nok; foo.String\nok; foo?.String; groupBy(list, #)\nok; greet\nok; list\nok; list | sortBy(i)\nok; list?.[i]\nok; ok\nok; str\nok; true != $env\none($env ?? nil, false == $env)\none($env | map(true), ok)\none($env, true) ?: greet\none($env, true) || $env?.Bar\none($env.array, nil != true)\none($env?.[str], # in list)\none($env?.[str], list == #)\none($env?.[str], ok)\none($env?.array, $env == #)\none($env?.array, ok)\none($env?.list, 0 <= 1.0)\none($env?.list, ok)\none([$env], #.ok)\none([$env], .array != add)\none([false], 0 <= f64)\none([foo], ok)\none([i], ok)\none([ok], #)\none([str], none($env, false))\none([true, foo], ok)\none(array ?? nil, ok)\none(array, !ok)\none(array, # != #)\none(array, # < #)\none(array, # <= 0)\none(array, # <= 1)\none(array, # == 1)\none(array, # > #)\none(array, # > 0)\none(array, # >= #)\none(array, # not in array)\none(array, $env != #)\none(array, $env != ok)\none(array, $env && false)\none(array, $env == list)\none(array, $env.ok)\none(array, $env?.ok)\none(array, 0 == 0)\none(array, 0 >= 0)\none(array, 1 == 1.0)\none(array, 1 >= #)\none(array, 1.0 < #)\none(array, 1.0 <= #)\none(array, 1.0 > #)\none(array, 1.0 >= #)\none(array, f64 != nil)\none(array, f64 == i)\none(array, false and $env?.[ok])\none(array, false) != $env?.ok\none(array, false) != ok\none(array, foo == foo)\none(array, greet == nil)\none(array, i != $env)\none(array, i <= f64)\none(array, list != $env)\none(array, nil != #)\none(array, nil != add)\none(array, nil in $env)\none(array, nil not in list)\none(array, ok)\none(array, ok) and $env[greet:]\none(array, ok) or ok\none(array, str == str)\none(array, str > str)\none(array, true ?? i)\none(array, true and true)\none(array, true or $env)\none(array, true) == ok\none(if ok { $env } else { add }, ok)\none(list ?? ok, ok)\none(list, # != $env)\none(list, # != foo)\none(list, # == #)\none(list, # == $env)\none(list, # == foo)\none(list, $env != .String)\none(list, $env != i)\none(list, $env == foo)\none(list, $env == nil)\none(list, $env.ok)\none(list, $env?.ok)\none(list, .Bar in foo)\none(list, 1 <= f64)\none(list, 1 > 1.0)\none(list, 1.0 != i)\none(list, 1.0 < i)\none(list, 1.0 == $env)\none(list, 1.0 >= 0)\none(list, any(list, ok))\none(list, f64 == 1)\none(list, f64 > 1.0)\none(list, false and ok)\none(list, foo != #)\none(list, greet == nil)\none(list, i == 0)\none(list, list != $env)\none(list, nil != 1.0)\none(list, nil == #)\none(list, nil == list)\none(list, nil not in $env)\none(list, none(list, false))\none(list, not ok)\none(list, ok)\none(list, ok) and ok\none(list, str < #.Bar)\none(list, str >= str)\none(list, true != $env)\none(list, true ?? foo)\none(min($env), ok)\none(sort($env), $env == nil)\none(sort($env), .String.list(nil))\none(sort($env), .greet[:.i])\none(sort($env), .list?.array(foobar))\none(sort($env), 1.0 != $env)\none(sort($env), i >= .f64)\none(sort($env), ok)\none(uniq(array), ok)\nreduce($env | map($env), #.foo)\nreduce($env | map(0), str)\nreduce($env | map(1.0), str)\nreduce($env | map(f64), #)\nreduce($env | map(foo), greet)\nreduce($env | map(str), str)\nreduce($env, #.list) == 1 && false\nreduce($env, $env, $env).foo\nreduce($env, $env, $env).greet\nreduce($env, $env, $env)?.add\nreduce($env, $env, $env)?.f64\nreduce($env, $env, $env)?.greet\nreduce($env, $env, $env)?.ok\nreduce($env, $env, 1)?.f64\nreduce($env, $env, 1.0)?.add\nreduce($env, $env, 1.0)?.greet\nreduce($env, $env, 1.0)?.list\nreduce($env, $env, add).ok\nreduce($env, $env, array)?.i\nreduce($env, $env, false).str\nreduce($env, $env, foo)?.Bar\nreduce($env, $env, foo)?.str\nreduce($env, $env, greet).String\nreduce($env, $env, greet).greet\nreduce($env, $env, greet)?.String\nreduce($env, $env, greet)?.greet\nreduce($env, $env, i)?.[str]\nreduce($env, $env, i)?.f64\nreduce($env, $env, list).foo\nreduce($env, $env, list).ok\nreduce($env, $env, list)?.add\nreduce($env, $env, nil).Bar\nreduce($env, $env, nil)?.str\nreduce($env, $env, true)?.list\nreduce($env, 1.0, false) ?? array\nreduce($env, array, $env) | reduce(str)\nreduce($env, array, 1.0) | all(false)\nreduce($env, array, false)?.[i]\nreduce($env, foo, 1).Bar\nreduce($env, foo, add)?.Bar\nreduce($env, foo, false).Bar\nreduce($env, foo, nil)?.Bar\nreduce($env, foo, ok).String\nreduce($env, foo, ok)?.String()\nreduce($env, i, 1.0) ?? add\nreduce($env, list, 1.0)?.[i]\nreduce($env, str, false) ?? array\nreduce($env.array, #)\nreduce($env.array, #index / #)\nreduce($env.array, add)\nreduce($env.array, f64)\nreduce($env.array, greet)\nreduce($env.array, i)\nreduce($env.array, last($env))\nreduce($env.array, list)\nreduce($env.array, mean(f64, #))\nreduce($env.array, ok)\nreduce($env.array, str)\nreduce($env.list, #)\nreduce($env.list, #.Bar)\nreduce($env.list, #?.Bar)\nreduce($env.list, #acc)\nreduce($env.list, 1.0 + 1.0)\nreduce($env.list, [#, 1])\nreduce($env.list, [nil])\nreduce($env.list, add)\nreduce($env.list, array)\nreduce($env.list, f64 ^ 1)\nreduce($env.list, greet ?? $env, str ?? add)\nreduce($env.list, greet)\nreduce($env.list, list)\nreduce($env.list, ok)\nreduce($env.list, ok, {foo: nil})\nreduce($env.list, str)\nreduce($env?.[str], # != foo)\nreduce($env?.[str], #)\nreduce($env?.[str], #acc)\nreduce($env?.[str], #index != #)\nreduce($env?.[str], #index == #)\nreduce($env?.[str], -0)\nreduce($env?.[str], 1 <= 1)\nreduce($env?.[str], f64)\nreduce($env?.[str], foo)\nreduce($env?.[str], greet)\nreduce($env?.[str], list)\nreduce($env?.[str], nil != list)\nreduce($env?.[str], ok)\nreduce($env?.[str], str)\nreduce($env?.array, # != f64)\nreduce($env?.array, # < #)\nreduce($env?.array, # >= 1.0)\nreduce($env?.array, #)\nreduce($env?.array, #acc ** #)\nreduce($env?.array, #acc)\nreduce($env?.array, $env.greet)\nreduce($env?.array, add)\nreduce($env?.array, array)\nreduce($env?.array, f64)\nreduce($env?.array, foo)\nreduce($env?.array, greet)\nreduce($env?.array, i != #)\nreduce($env?.array, i)\nreduce($env?.array, list | groupBy(foo))\nreduce($env?.array, list)\nreduce($env?.array, ok)\nreduce($env?.array, str)\nreduce($env?.list, #)\nreduce($env?.list, #.String)\nreduce($env?.list, #.String, array)\nreduce($env?.list, #acc)\nreduce($env?.list, .Bar in #)\nreduce($env?.list, .Bar)\nreduce($env?.list, add)\nreduce($env?.list, f64)\nreduce($env?.list, false != ok)\nreduce($env?.list, foo)\nreduce($env?.list, foo, $env?.i)\nreduce($env?.list, foo?.Bar)\nreduce($env?.list, greet)\nreduce($env?.list, i ^ 0)\nreduce($env?.list, i in array)\nreduce($env?.list, i)\nreduce($env?.list, ok)\nreduce(1 .. 1, #acc?.[foo])\nreduce([$env], #)\nreduce([$env], #.Bar)\nreduce([$env], #.String != $env)\nreduce([$env], #.add < #.greet)\nreduce([$env], #.foo?.[list])\nreduce([$env], #acc)\nreduce([$env], .Bar)\nreduce([$env], .str)\nreduce([$env], add)\nreduce([$env], f64 <= #.f64)\nreduce([$env], foo)\nreduce([$env], greet)\nreduce([$env], i)\nreduce([$env], if true { .greet } else { foo })\nreduce([$env], round($env))\nreduce([$env], upper(.foo))\nreduce([0, $env], array)\nreduce([0], #)\nreduce([0], array)\nreduce([1, greet], add)\nreduce([1.0, 1], # - #)\nreduce([1.0, foo], #)\nreduce([1.0], # - 1)\nreduce([1.0], #)\nreduce([1.0], $env[:#])\nreduce([1.0], list)\nreduce([1], add)\nreduce([1], foo)\nreduce([add], $env[foobar:])\nreduce([f64, add], #)\nreduce([f64], i)\nreduce([false, add], i)\nreduce([false], #acc)\nreduce([false], foo)\nreduce([foo, add], #)\nreduce([foo], #)\nreduce([foo], #.Bar + #acc)\nreduce([foo], #index)\nreduce([foo], $env?.[f64])\nreduce([foo], foo).String\nreduce([foo], greet)\nreduce([foo], ok)\nreduce([greet, greet], str)\nreduce([greet], f64)\nreduce([i, 1.0], # != #)\nreduce([i, i], foo)\nreduce([i], list)\nreduce([list], #)\nreduce([list], add)\nreduce([list], greet)\nreduce([nil != true], list)\nreduce([nil, add], foo)\nreduce([nil, foo], # ?? .add)\nreduce([nil], array)\nreduce([nil], i)\nreduce([ok], #)\nreduce([ok], add)\nreduce([ok], foo)\nreduce([str, 1.0], $env.i)\nreduce([str], i)\nreduce([true, greet], #)\nreduce([true], foo.Bar)\nreduce(array ?? add, str)\nreduce(array ?? str, #index)\nreduce(array | map(#), f64)\nreduce(array | map(#), foo)\nreduce(array | map($env), #index)\nreduce(array | map(foo), f64)\nreduce(array | sortBy(#), ok)\nreduce(array | sortBy(1), #acc)\nreduce(array, # != #)\nreduce(array, # != i)\nreduce(array, # % #)\nreduce(array, # % i)\nreduce(array, # * #)\nreduce(array, # + #)\nreduce(array, # + 0)\nreduce(array, # - #acc)\nreduce(array, # .. #)\nreduce(array, # / #)\nreduce(array, # / 0)\nreduce(array, # < #)\nreduce(array, # <= #)\nreduce(array, # <= 1)\nreduce(array, # == #)\nreduce(array, # == 0)\nreduce(array, # > i)\nreduce(array, # >= #)\nreduce(array, # >= 0)\nreduce(array, # ?? foo)\nreduce(array, # ^ #)\nreduce(array, # in array)\nreduce(array, #)\nreduce(array, #) * f64\nreduce(array, #, add)\nreduce(array, #, array)\nreduce(array, #, greet)\nreduce(array, #, i)\nreduce(array, #, i) | mean(array)\nreduce(array, #, ok)\nreduce(array, #..i)\nreduce(array, #acc)\nreduce(array, #acc, nil)?.[greet]\nreduce(array, #acc, nil)?.i\nreduce(array, #acc, nil)?.list\nreduce(array, #index != f64)\nreduce(array, #index ** 1.0)\nreduce(array, #index ** f64)\nreduce(array, #index == 1.0)\nreduce(array, #index ?? foo)\nreduce(array, #index ^ #)\nreduce(array, #index)\nreduce(array, #index, foo)\nreduce(array, $env != foo)\nreduce(array, $env != ok)\nreduce(array, $env == #)\nreduce(array, $env == ok)\nreduce(array, $env ?? ok)\nreduce(array, $env and true)\nreduce(array, $env) == ok\nreduce(array, $env) | count(false)\nreduce(array, $env) | find(false)\nreduce(array, $env) | map(false)\nreduce(array, $env).Bar\nreduce(array, $env).String\nreduce(array, $env).add\nreduce(array, $env).array\nreduce(array, $env).f64\nreduce(array, $env).foo\nreduce(array, $env).foobar\nreduce(array, $env).greet\nreduce(array, $env).greet(foobar)\nreduce(array, $env).i\nreduce(array, $env).list\nreduce(array, $env).str\nreduce(array, $env)?.Bar\nreduce(array, $env)?.String\nreduce(array, $env)?.String?.str\nreduce(array, $env)?.[str]\nreduce(array, $env)?.add\nreduce(array, $env)?.array\nreduce(array, $env)?.f64\nreduce(array, $env)?.false?.foo\nreduce(array, $env)?.foo\nreduce(array, $env)?.foobar\nreduce(array, $env)?.greet\nreduce(array, $env)?.i\nreduce(array, $env)?.list\nreduce(array, $env)?.ok\nreduce(array, $env)?.str\nreduce(array, $env, $env) | sum(1)\nreduce(array, $env, $env)?.str\nreduce(array, $env, 0)?.String\nreduce(array, $env, 1.0).Bar\nreduce(array, $env, f64)?.[str]\nreduce(array, $env, f64)?.list\nreduce(array, $env, foo)?.ok\nreduce(array, $env, ok)?.Bar\nreduce(array, $env, str)?.greet\nreduce(array, $env, true).array\nreduce(array, $env.array)\nreduce(array, $env.f64)\nreduce(array, $env.foo)\nreduce(array, $env.greet)\nreduce(array, $env.i)\nreduce(array, $env.list)\nreduce(array, $env.ok)\nreduce(array, $env.str)\nreduce(array, $env?.add)\nreduce(array, $env?.array)\nreduce(array, $env?.f64)\nreduce(array, $env?.foo)\nreduce(array, $env?.foo.Bar)\nreduce(array, $env?.greet)\nreduce(array, $env?.i)\nreduce(array, $env?.list, greet)\nreduce(array, $env?.str)\nreduce(array, -#)\nreduce(array, -0)\nreduce(array, -1)\nreduce(array, 0 * 1)\nreduce(array, 0) ^ i\nreduce(array, 0) | min(1.0)\nreduce(array, 1 != $env)\nreduce(array, 1 != nil)\nreduce(array, 1 | max(#acc))\nreduce(array, 1) ** f64\nreduce(array, 1.0 != #)\nreduce(array, 1.0 != 1)\nreduce(array, 1.0 * #)\nreduce(array, 1.0 ** #)\nreduce(array, 1.0 ** #index)\nreduce(array, 1.0 ** 1.0)\nreduce(array, 1.0 - #acc)\nreduce(array, 1.0 - f64)\nreduce(array, 1.0 - i)\nreduce(array, 1.0 / #)\nreduce(array, 1.0 < #)\nreduce(array, 1.0 == i)\nreduce(array, 1.0 > #)\nreduce(array, 1.0 >= f64)\nreduce(array, 1.0 ?? #)\nreduce(array, 1.0 ?? $env)\nreduce(array, 1.0 ^ #)\nreduce(array, 1.0) / $env?.i\nreduce(array, 1.0) == $env?.[str]\nreduce(array, 1.0) ^ $env?.f64\nreduce(array, [#])\nreduce(array, [1.0])\nreduce(array, [add])\nreduce(array, [flatten(list)])\nreduce(array, [foo])\nreduce(array, abs(#))\nreduce(array, add == nil)\nreduce(array, add)\nreduce(array, add, f64)\nreduce(array, array | reduce($env))\nreduce(array, array)\nreduce(array, array) | mean(1, i)\nreduce(array, array)?.[i]\nreduce(array, array, foo)\nreduce(array, array, i)\nreduce(array, array?.[i])\nreduce(array, array[1:])\nreduce(array, bitnand(1, #acc))\nreduce(array, bitnot(#))\nreduce(array, bitnot(#)) % i\nreduce(array, bitnot(i))\nreduce(array, bitor(i, #))\nreduce(array, ceil(#))\nreduce(array, concat(list))\nreduce(array, f64 + #)\nreduce(array, f64)\nreduce(array, f64) ?? f64\nreduce(array, false ?? #)\nreduce(array, false) == $env?.String\nreduce(array, false) and ok\nreduce(array, float(#))\nreduce(array, float(i))\nreduce(array, foo == $env)\nreduce(array, foo ?? $env)\nreduce(array, foo)\nreduce(array, foo).Bar\nreduce(array, foo).String\nreduce(array, foo).String()\nreduce(array, foo)?.Bar\nreduce(array, foo)?.String\nreduce(array, foo)?.String()\nreduce(array, foo, 1.0).Bar\nreduce(array, foo, array)\nreduce(array, foo, foo).String\nreduce(array, foo, greet)?.String()\nreduce(array, foo, i).Bar\nreduce(array, foo, list).Bar\nreduce(array, foo, str)\nreduce(array, foo, str).Bar\nreduce(array, foo.Bar)\nreduce(array, foo.String())\nreduce(array, foo.String)\nreduce(array, foo?.Bar)\nreduce(array, foo?.String())\nreduce(array, foo?.String)\nreduce(array, greet(str))\nreduce(array, greet)\nreduce(array, greet, [array])\nreduce(array, greet, foo)\nreduce(array, i ** #acc)\nreduce(array, i .. #, greet)\nreduce(array, i <= #)\nreduce(array, i ^ #acc)\nreduce(array, i)\nreduce(array, i) != i\nreduce(array, i, array) % i\nreduce(array, i, f64) not in $env?.array\nreduce(array, i, list)\nreduce(array, keys($env))\nreduce(array, list ?? #, i)\nreduce(array, list ?? str)\nreduce(array, list)\nreduce(array, list)?.[i]\nreduce(array, list, {foo: nil})\nreduce(array, list[:#])\nreduce(array, mean(#))\nreduce(array, median(#))\nreduce(array, median(0))\nreduce(array, ok ? ok : #index)\nreduce(array, ok)\nreduce(array, ok, $env.ok)\nreduce(array, ok, 1.0) == ok\nreduce(array, reduce(array, #))\nreduce(array, reduce(array, #, i))\nreduce(array, round(#))\nreduce(array, round(1))\nreduce(array, str ?? 1.0)\nreduce(array, str not in foo)\nreduce(array, str)\nreduce(array, str) + str\nreduce(array, str) | greet()\nreduce(array, str, $env.f64)\nreduce(array, str, array) not in foo\nreduce(array, str, f64)\nreduce(array, string(#))\nreduce(array, string(i))\nreduce(array, sum(array, 1.0))\nreduce(array, toJSON(#))\nreduce(array, toJSON(1.0))\nreduce(array, true and ok)\nreduce(array, true or $env)\nreduce(array, true) ?? add\nreduce(array, type(#))\nreduce(array, type(true))\nreduce(array, uniq(list))\nreduce(array[0:], list)\nreduce(concat(list), #)\nreduce(flatten(array), array)\nreduce(flatten(array), foo)\nreduce(flatten(list), #)\nreduce(keys($env), #acc)\nreduce(keys($env), $env?.[String])\nreduce(keys($env), abs(0))\nreduce(keys($env), greet)\nreduce(keys($env), max(#))\nreduce(keys($env), sum(#))\nreduce(let foobar = array; foobar, #)\nreduce(list ?? 1.0, foo)\nreduce(list ?? array, #)\nreduce(list | map(1), $env?.f64)\nreduce(list | map(1.0), array)\nreduce(list | map(false), true != #)\nreduce(list | reduce(array), #)\nreduce(list | sortBy(1.0), greet)\nreduce(list, # == #)\nreduce(list, # == $env)\nreduce(list, # ?? false)\nreduce(list, # ?? foo)\nreduce(list, # in list)\nreduce(list, #)\nreduce(list, #) ?? foo\nreduce(list, #).Bar\nreduce(list, #).String\nreduce(list, #).String()\nreduce(list, #)?.Bar\nreduce(list, #)?.String\nreduce(list, #)?.String()\nreduce(list, #, 1.0)?.Bar\nreduce(list, #, 1.0)?.String\nreduce(list, #, add)\nreduce(list, #, array)?.String\nreduce(list, #, f64).String\nreduce(list, #, nil).String\nreduce(list, #, ok)?.Bar\nreduce(list, #.Bar != nil)\nreduce(list, #.Bar >= .Bar)\nreduce(list, #.Bar)\nreduce(list, #.String())\nreduce(list, #.String)\nreduce(list, #?.Bar)\nreduce(list, #?.String())\nreduce(list, #?.String)\nreduce(list, #acc == 0)\nreduce(list, #acc ?? $env)\nreduce(list, #acc ?? 1)\nreduce(list, #acc)\nreduce(list, #acc).Bar\nreduce(list, #acc)?.Bar\nreduce(list, #acc, foo).String\nreduce(list, #index)\nreduce(list, $env && true)\nreduce(list, $env == ok)\nreduce(list, $env ?? array)\nreduce(list, $env and true)\nreduce(list, $env | map(add))\nreduce(list, $env) | map(i)\nreduce(list, $env).Bar\nreduce(list, $env).String\nreduce(list, $env).add\nreduce(list, $env).array\nreduce(list, $env).array?.[i]\nreduce(list, $env).f64\nreduce(list, $env).foo\nreduce(list, $env).greet\nreduce(list, $env).i\nreduce(list, $env).list\nreduce(list, $env).ok\nreduce(list, $env).str\nreduce(list, $env)?.Bar\nreduce(list, $env)?.String\nreduce(list, $env)?.[str]\nreduce(list, $env)?.add\nreduce(list, $env)?.f64\nreduce(list, $env)?.foo\nreduce(list, $env)?.foobar\nreduce(list, $env)?.foobar?.i\nreduce(list, $env)?.greet\nreduce(list, $env)?.i\nreduce(list, $env)?.list\nreduce(list, $env)?.ok\nreduce(list, $env)?.str\nreduce(list, $env, $env)?.i\nreduce(list, $env, add).array\nreduce(list, $env, add).foo\nreduce(list, $env, add)?.list\nreduce(list, $env, array)?.greet\nreduce(list, $env, false).f64\nreduce(list, $env, false).ok\nreduce(list, $env, foo).ok\nreduce(list, $env, greet)?.Bar?.str\nreduce(list, $env, i).ok\nreduce(list, $env, nil)?.greet\nreduce(list, $env.add)\nreduce(list, $env.f64)\nreduce(list, $env.list)\nreduce(list, $env.str)\nreduce(list, $env?.[#.Bar])\nreduce(list, $env?.[String])\nreduce(list, $env?.[foobar])\nreduce(list, $env?.add)\nreduce(list, $env?.f64)\nreduce(list, $env?.foo)\nreduce(list, $env?.list)\nreduce(list, $env?.nil?.[greet])\nreduce(list, $env?.ok)\nreduce(list, $env?.str)\nreduce(list, -i)\nreduce(list, .Bar not contains str)\nreduce(list, .Bar not in foo, {foo: str})\nreduce(list, .Bar)\nreduce(list, .String ?? foo)\nreduce(list, .String)\nreduce(list, .String, greet)\nreduce(list, 0 .. 0)\nreduce(list, 0 == 1)\nreduce(list, 0) != i\nreduce(list, 0) | mean(1.0)\nreduce(list, 1 <= 1)\nreduce(list, 1) * i\nreduce(list, 1) / i\nreduce(list, 1.0 * f64)\nreduce(list, 1.0 * i)\nreduce(list, 1.0 + 1)\nreduce(list, 1.0 <= 1.0)\nreduce(list, 1.0) * i\nreduce(list, 1.0) == i\nreduce(list, 1.0, array) <= i\nreduce(list, [$env, 0])\nreduce(list, [f64, false])\nreduce(list, [foo])\nreduce(list, [nil, #])\nreduce(list, [str])\nreduce(list, abs(#index))\nreduce(list, add == $env)\nreduce(list, add)\nreduce(list, add, foo)\nreduce(list, add, ok)\nreduce(list, array != array)\nreduce(list, array | one(ok))\nreduce(list, array)\nreduce(list, array) | map(foo)\nreduce(list, array) | sum(#)\nreduce(list, array)?.[i]\nreduce(list, array, add)\nreduce(list, bitnot(1))\nreduce(list, f64 != $env)\nreduce(list, f64 * #index)\nreduce(list, f64 * f64)\nreduce(list, f64 / f64)\nreduce(list, f64 >= 1)\nreduce(list, f64)\nreduce(list, f64, f64)\nreduce(list, f64, str)\nreduce(list, false == ok)\nreduce(list, false ?: foo)\nreduce(list, false) ? f64 : [false]\nreduce(list, false) in uniq(list)\nreduce(list, first(#acc))\nreduce(list, foo != foo)\nreduce(list, foo ?? f64)\nreduce(list, foo ?? nil)\nreduce(list, foo)\nreduce(list, foo).Bar\nreduce(list, foo).String\nreduce(list, foo).String()\nreduce(list, foo)?.Bar\nreduce(list, foo)?.String\nreduce(list, foo)?.String()\nreduce(list, foo, $env) not in list\nreduce(list, foo, array).String\nreduce(list, foo, foo)\nreduce(list, foo, i)?.String\nreduce(list, foo, str)\nreduce(list, foo.Bar, list)\nreduce(list, foo.String)\nreduce(list, foo?.String())\nreduce(list, foo?.String)\nreduce(list, greet == #acc)\nreduce(list, greet ?? $env)\nreduce(list, greet(#.Bar))\nreduce(list, greet(.Bar))\nreduce(list, greet)\nreduce(list, greet) ?? greet\nreduce(list, greet, greet)\nreduce(list, i / 1.0)\nreduce(list, i ^ 0)\nreduce(list, i)\nreduce(list, i, $env?.list[:])\nreduce(list, i, 1.0) == i\nreduce(list, i, list)\nreduce(list, i, ok)\nreduce(list, int(#index))\nreduce(list, int(0))\nreduce(list, len($env))\nreduce(list, list | any(ok))\nreduce(list, list | map($env))\nreduce(list, list)\nreduce(list, list)?.[i]\nreduce(list, list, f64) | map(array)\nreduce(list, list, i)\nreduce(list, list?.[i])\nreduce(list, max(f64))\nreduce(list, mean(1.0))\nreduce(list, median(i))\nreduce(list, nil != $env)\nreduce(list, nil != 0)\nreduce(list, nil == $env)\nreduce(list, ok == false)\nreduce(list, ok ?? #)\nreduce(list, ok ?? #acc)\nreduce(list, ok ?? $env)\nreduce(list, ok)\nreduce(list, ok) || $env?.[greet]\nreduce(list, ok, $env.foo)\nreduce(list, ok, 1 * i)\nreduce(list, ok, f64)\nreduce(list, reduce(array, greet, foo))\nreduce(list, sort($env), ok)\nreduce(list, str > #.Bar)\nreduce(list, str ?? f64)\nreduce(list, str)\nreduce(list, str) == str\nreduce(list, string(ok))\nreduce(list, sum(list, 1.0))\nreduce(list, toBase64(#.Bar))\nreduce(list, trimSuffix(#.Bar))\nreduce(list, trimSuffix(.Bar))\nreduce(list, true != $env)\nreduce(list, true != ok)\nreduce(list, true ? # : false)\nreduce(list, true || false)\nreduce(list, true || true)\nreduce(list, true) and ok\nreduce(list, type($env))\nreduce(list, type(i))\nreduce(list, type(list))\nreduce(list[:1], [$env])\nreduce(list[:1], str)\nreduce(list[:], greet)\nreduce(map($env, 1.0), #)\nreduce(map($env, false), i)\nreduce(map($env, foo), str)\nreduce(map($env, greet), #)\nreduce(map($env, greet), i)\nreduce(map($env, list), $env.str)\nreduce(map(array, foo), foo?.Bar)\nreduce(map(array, list), list)\nreduce(map(array, ok), greet)\nreduce(map(list, #), #)\nreduce(map(list, #), $env?.add)\nreduce(map(list, .Bar), list)\nreduce(map(list, i), #)\nreduce(max($env).array, ok)\nreduce(nil ?? list, add)\nreduce(reduce(array, list), #index)\nreduce(reduce(list, array), i)\nreduce(reverse(array), $env.ok)\nreduce(reverse(array), $env?.ok)\nreduce(reverse(list), str)\nreduce(sort(array), str)\nreduce(sortBy(array, #), #)\nreduce(sortBy(array, #), array)\nreduce(sortBy(array, 1.0), ok)\nreduce(sortBy(list, 1.0), i)\nreduce(str ?? $env, #)\nreduce(uniq(array), greet)\nreduce(values($env), # == $env)\nreduce(values($env), #)\nrepeat(nil ?? str, i)\nrepeat(str, 0 ?? false)\nrepeat(str, i)\nrepeat(str, i) not startsWith str\nrepeat(str, max(1.0, array))\nrepeat(type(1), i)\nreverse($env | filter(false))\nreverse($env | map($env))\nreverse($env | map(0))\nreverse($env | map(1.0))\nreverse($env | map(false))\nreverse($env | map(foo))\nreverse($env | map(ok))\nreverse($env | map(true))\nreverse($env.array)\nreverse($env.list)\nreverse($env?.array)\nreverse($env?.list)\nreverse(0 .. 1)\nreverse(0 .. i)\nreverse(1 .. 0)\nreverse(1 .. 1)\nreverse(1 .. i)\nreverse([$env, 0])\nreverse([$env, f64])\nreverse([$env, ok])\nreverse([$env])\nreverse([0, $env, foo])\nreverse([0, foo])\nreverse([0, nil])\nreverse([0])\nreverse([1 .. 1])\nreverse([1, true])\nreverse([1.0, list])\nreverse([1.0])\nreverse([1])\nreverse([add, list])\nreverse([add])\nreverse([array, array])\nreverse([array, greet])\nreverse([array])\nreverse([f64, nil])\nreverse([f64])\nreverse([false, true])\nreverse([false])\nreverse([foo, 1.0])\nreverse([foo, array])\nreverse([foo, f64])\nreverse([foo, list])\nreverse([foo, str])\nreverse([foo])\nreverse([greet])\nreverse([i, 1])\nreverse([i])\nreverse([list])\nreverse([nil, 1])\nreverse([nil, i])\nreverse([nil, list])\nreverse([nil, nil])\nreverse([nil, true])\nreverse([nil])\nreverse([ok])\nreverse([str, ok])\nreverse([str])\nreverse([true])\nreverse(array ?? 1)\nreverse(array ?? 1.0)\nreverse(array ?? add)\nreverse(array ?? f64)\nreverse(array ?? foo)\nreverse(array | map(#))\nreverse(array | map($env))\nreverse(array | map(1.0))\nreverse(array | map(ok))\nreverse(array | map(str))\nreverse(array | reduce(array, foo))\nreverse(array | sortBy(1))\nreverse(array)\nreverse(array) ?? list\nreverse(array) not in sort(array)\nreverse(array) | findIndex(ok)\nreverse(array) | findLastIndex(false)\nreverse(array) | groupBy(#)\nreverse(array) | groupBy(0)\nreverse(array) | groupBy(i)\nreverse(array) | map(#)\nreverse(array) | map($env)\nreverse(array) | one(ok)\nreverse(array) | reduce(#)\nreverse(array) | reduce(#, greet)\nreverse(array) | reduce($env)\nreverse(array) | reduce(array)\nreverse(array) | reduce(foo)\nreverse(array) | reduce(str)\nreverse(array) | sortBy(1)\nreverse(array) | sortBy(i)\nreverse(array) | sum(#)\nreverse(array) | sum(f64)\nreverse(array)?.[i]\nreverse(array[i:1])\nreverse(concat(array))\nreverse(concat(list))\nreverse(false ? array : list)\nreverse(filter($env, false))\nreverse(filter(list, ok))\nreverse(flatten(array))\nreverse(flatten(list))\nreverse(i .. i)\nreverse(if false { $env } else { array })\nreverse(if false { 1.0 } else { list })\nreverse(keys($env))\nreverse(let foobar = array; foobar)\nreverse(let foobar = list; foobar)\nreverse(list ?? 1.0)\nreverse(list ?? add)\nreverse(list ?? f64)\nreverse(list ?? false)\nreverse(list ?? foo)\nreverse(list ?? ok)\nreverse(list ?? str)\nreverse(list ?? true)\nreverse(list | filter(true))\nreverse(list | map(#))\nreverse(list | map(1.0))\nreverse(list | map(array))\nreverse(list | map(foo))\nreverse(list | map(i))\nreverse(list | map(ok))\nreverse(list | map(str))\nreverse(list | map(true))\nreverse(list | sortBy(0))\nreverse(list | sortBy(1.0))\nreverse(list | sortBy(str))\nreverse(list)\nreverse(list) != list\nreverse(list) == array\nreverse(list) ?? list\nreverse(list) | any(true)\nreverse(list) | count(true)\nreverse(list) | find(false)\nreverse(list) | findIndex(false)\nreverse(list) | groupBy(#)\nreverse(list) | groupBy(foo)\nreverse(list) | groupBy(true)\nreverse(list) | map(#index)\nreverse(list) | map(list)\nreverse(list) | one(false)\nreverse(list) | reduce(#, false)\nreverse(list) | reduce(0)\nreverse(list) | reduce(1.0)\nreverse(list) | reduce(f64)\nreverse(list) | reduce(foo)\nreverse(list) | reduce(greet)\nreverse(list) | reduce(ok)\nreverse(list) | reduce(true)\nreverse(list) | sum(f64)\nreverse(list)?.[i]\nreverse(list[:i])\nreverse(map($env, $env))\nreverse(map($env, 0))\nreverse(map($env, 1.0))\nreverse(map($env, add))\nreverse(map($env, array))\nreverse(map($env, f64))\nreverse(map($env, foo))\nreverse(map($env, list))\nreverse(map($env, str))\nreverse(map($env, true))\nreverse(map(array, #))\nreverse(map(array, #index))\nreverse(map(array, 1.0))\nreverse(map(array, foo))\nreverse(map(array, i))\nreverse(map(list, #))\nreverse(map(list, #.Bar))\nreverse(map(list, $env))\nreverse(reduce(array, list))\nreverse(reduce(list, list, ok))\nreverse(reverse(array))\nreverse(reverse(list))\nreverse(sort($env))\nreverse(sort(array))\nreverse(sortBy(array, #))\nreverse(sortBy(array, 1.0))\nreverse(sortBy(array, str))\nreverse(sortBy(list, 1.0))\nreverse(sortBy(list, i))\nreverse(toPairs($env))\nreverse(uniq(array))\nreverse(uniq(list))\nreverse(values($env))\nround($env | count(ok))\nround($env | findIndex(true))\nround($env | reduce(0, foo))\nround($env | reduce(1.0, f64))\nround($env | sum(1.0))\nround($env | sum(f64))\nround($env.f64)\nround($env.f64) != i\nround($env.i)\nround($env?.f64)\nround($env?.f64) - f64\nround($env?.i)\nround(-0)\nround(-1)\nround(-1.0)\nround(-f64)\nround(-i)\nround(0 * 0)\nround(0 * 1.0)\nround(0 * f64)\nround(0 ** 0)\nround(0 ** 1)\nround(0 ** 1.0)\nround(0 ** f64)\nround(0 ** i)\nround(0 + 0)\nround(0 + 1)\nround(0 + 1.0)\nround(0 + i)\nround(0 - 0)\nround(0 - 1)\nround(0 - f64)\nround(0 / 0)\nround(0 / 1.0)\nround(0 / f64)\nround(0 / i)\nround(0 ?? f64)\nround(0 ?? false)\nround(0 ?? true)\nround(0 ^ 1.0)\nround(0 ^ f64)\nround(0 | max(array))\nround(0) != i\nround(0) - i\nround(0) / f64\nround(0) < i\nround(0) == max($env)\nround(0) ?? foo\nround(0) ^ f64\nround(0) ^ i\nround(0.1)\nround(1 % i)\nround(1 * 0)\nround(1 * 1)\nround(1 ** 0)\nround(1 ** 1)\nround(1 ** 1.0)\nround(1 ** i)\nround(1 + 0)\nround(1 + 1)\nround(1 + 1.0)\nround(1 + i)\nround(1 - 0)\nround(1 - 1)\nround(1 - 1.0)\nround(1 - i)\nround(1 / 1)\nround(1 / f64)\nround(1 / i)\nround(1 ?? 0)\nround(1 ?? 1.0)\nround(1 ?? array)\nround(1 ?? f64)\nround(1 ?? foo)\nround(1 ?? i)\nround(1 ?? nil)\nround(1 ^ 0)\nround(1 ^ 1)\nround(1 ^ 1.0)\nround(1 ^ f64)\nround(1 ^ i)\nround(1 | bitnand(0))\nround(1) * f64\nround(1) * i\nround(1) / f64\nround(1) ?? array ?? foo\nround(1) ?? greet\nround(1) ?? ok\nround(1) ^ sum(array)\nround(1) not in array\nround(1.0 * 0)\nround(1.0 * 1)\nround(1.0 * 1.0)\nround(1.0 * f64)\nround(1.0 * i)\nround(1.0 ** 0)\nround(1.0 ** 1)\nround(1.0 ** 1.0)\nround(1.0 ** f64)\nround(1.0 ** i)\nround(1.0 + 0)\nround(1.0 + 1.0)\nround(1.0 + f64)\nround(1.0 + i)\nround(1.0 - 0)\nround(1.0 - 1)\nround(1.0 - 1.0)\nround(1.0 - f64)\nround(1.0 - i)\nround(1.0 / 0)\nround(1.0 / 1)\nround(1.0 / 1.0)\nround(1.0 / f64)\nround(1.0 / i)\nround(1.0 ?? $env)\nround(1.0 ?? 0)\nround(1.0 ?? 1)\nround(1.0 ?? add)\nround(1.0 ?? f64)\nround(1.0 ?? false)\nround(1.0 ?? foo)\nround(1.0 ?? i)\nround(1.0 ?? list)\nround(1.0 ?? nil)\nround(1.0 ?? ok)\nround(1.0 ?? str)\nround(1.0 ^ $env.i)\nround(1.0 ^ 0)\nround(1.0 ^ 1)\nround(1.0 ^ 1.0)\nround(1.0 ^ f64)\nround(1.0 ^ i)\nround(1.0 | max(i))\nround(1.0 | mean(0))\nround(1.0)\nround(1.0) != f64\nround(1.0) * $env and false\nround(1.0) * f64\nround(1.0) ** 1.0 != 1\nround(1.0) ** 1.0 / f64\nround(1.0) ** f64\nround(1.0) + f64\nround(1.0) + mean(1.0, f64)\nround(1.0) + min(1.0)\nround(1.0) - f64\nround(1.0) / i\nround(1.0) / int(1.0)\nround(1.0) <= i\nround(1.0) == 1 / i\nround(1.0) == i\nround(1.0) > i\nround(1.0) >= f64\nround(1.0) >= i\nround(1.0) ?? f64\nround(1.0) ?? foo\nround(1.0) ^ f64\nround(1.0) ^ i\nround(1.0) ^ sum($env, 1)\nround(1.0) in $env.array\nround(1.0) | median(array)\nround(1.0) | median(f64)\nround(1.1)\nround(abs(-1.0))\nround(abs(1.0))\nround(abs(f64))\nround(abs(i))\nround(array | max(array))\nround(array | median(1.0))\nround(array | reduce(#))\nround(array | sum(#))\nround(array | sum(0))\nround(array | sum(1))\nround(array | sum(f64))\nround(array?.[0])\nround(array?.[i])\nround(bitand(0, i))\nround(bitnand(1, 1))\nround(bitnand(i, 1))\nround(bitnot(0))\nround(bitnot(1))\nround(bitnot(i))\nround(ceil(0))\nround(ceil(1))\nround(ceil(1.0))\nround(ceil(f64))\nround(ceil(i))\nround(count($env, ok))\nround(count($env, true))\nround(f64 * 0)\nround(f64 * 1)\nround(f64 * 1.0)\nround(f64 * i)\nround(f64 ** $env.f64)\nround(f64 ** 0)\nround(f64 + 0)\nround(f64 + 1.0)\nround(f64 - 0)\nround(f64 - 1.0)\nround(f64 - f64)\nround(f64 - i)\nround(f64 / 0)\nround(f64 / 1.0)\nround(f64 / f64)\nround(f64 ?? $env)\nround(f64 ?? 0)\nround(f64 ?? add)\nround(f64 ?? array)\nround(f64 ?? foo)\nround(f64 ?? greet)\nround(f64 ?? list)\nround(f64 ?? nil)\nround(f64 ?? ok)\nround(f64 ^ 1)\nround(f64 ^ 1.0)\nround(f64 ^ f64)\nround(f64 ^ i)\nround(f64 | median(0))\nround(f64)\nround(f64) != $env?.f64\nround(f64) != f64\nround(f64) + f64\nround(f64) + f64 < 0\nround(f64) < i\nround(f64) <= i\nround(f64) >= i\nround(false ? 0 : 1.0)\nround(false ?: 1)\nround(find(array, true))\nround(findIndex(array, true))\nround(findIndex(list, ok))\nround(findLast(array, ok))\nround(findLastIndex($env, true))\nround(findLastIndex(array, ok))\nround(first(array))\nround(float(0))\nround(float(1))\nround(float(1.0))\nround(float(f64))\nround(float(i))\nround(floor(0))\nround(floor(1))\nround(floor(1.0))\nround(floor(f64))\nround(floor(i))\nround(i % 1)\nround(i * 1)\nround(i * 1.0)\nround(i * i)\nround(i ** 0)\nround(i ** 1)\nround(i ** 1.0)\nround(i + 1)\nround(i + f64)\nround(i - 0)\nround(i - 1)\nround(i - 1.0)\nround(i - f64)\nround(i / 1)\nround(i / 1.0)\nround(i / f64)\nround(i / i)\nround(i ?? $env)\nround(i ?? 1.0)\nround(i ?? add)\nround(i ?? false)\nround(i ?? list)\nround(i ?? nil)\nround(i ^ 0)\nround(i ^ 1)\nround(i ^ 1.0)\nround(i ^ f64)\nround(i)\nround(i) ** i\nround(i) + i\nround(i) / i\nround(i) < 1.0 != $env\nround(i) <= 1.0 ? foo : add\nround(i) == i\nround(i) > $env?.i\nround(i) > f64\nround(i) ?? add\nround(i) ?? f64\nround(i) ?? foo\nround(i) ?? str\nround(i) ^ i\nround(i) | median(f64)\nround(if false { foo } else { 0 })\nround(if true { 0 } else { greet })\nround(int(0))\nround(int(1))\nround(int(1.0))\nround(int(f64))\nround(int(i))\nround(int(string(1.0)))\nround(last(array))\nround(len($env))\nround(len(array))\nround(len(list))\nround(len(str))\nround(list | count(ok))\nround(list | reduce(1))\nround(list | reduce(1.0, $env))\nround(list | reduce(1.0, 1.0))\nround(list | reduce(f64))\nround(map(list, 1.0) | max(1))\nround(max(0))\nround(max(1))\nround(max(1.0 * 0))\nround(max(1.0))\nround(max(array))\nround(max(array, array))\nround(max(f64))\nround(max(i))\nround(mean(0))\nround(mean(1))\nround(mean(1, 1.0))\nround(mean(1.0))\nround(mean(array))\nround(mean(array, i, array))\nround(mean(f64))\nround(mean(f64, f64))\nround(mean(i))\nround(median($env.array))\nround(median(0))\nround(median(1))\nround(median(1.0))\nround(median(array))\nround(median(array, 1.0))\nround(median(f64))\nround(median(f64, i))\nround(median(i))\nround(min(0))\nround(min(1))\nround(min(1.0))\nround(min(1.0, 1.0))\nround(min(array))\nround(min(array, 0))\nround(min(array, array, array))\nround(min(f64))\nround(min(i))\nround(nil ?? 1)\nround(nil ?? 1.0)\nround(nil ?? f64)\nround(ok ? i : 0)\nround(reduce(array, #))\nround(reduce(array, #, nil))\nround(reduce(array, 1.0))\nround(reduce(array, i))\nround(reduce(list, #index, nil))\nround(round(0))\nround(round(1))\nround(round(1.0))\nround(sum($env, 0))\nround(sum($env, 1))\nround(sum($env, f64))\nround(sum($env, i))\nround(sum(array))\nsort($env ?? $env)\nsort($env ?? add)\nsort($env ?? array)\nsort($env ?? f64)\nsort($env ?? false)\nsort($env ?? foo)\nsort($env ?? greet)\nsort($env ?? list)\nsort($env ?? nil)\nsort($env ?? ok)\nsort($env | filter(false))\nsort($env | find(false))\nsort($env | map(#index))\nsort($env | map(0))\nsort($env) != $env?.String\nsort($env) != array\nsort($env) ?? $env?.array\nsort($env) ?? greet\nsort($env) ?? type(list)\nsort($env) | all(#)\nsort($env) | all(#.Bar)\nsort($env) | all(#.String)\nsort($env) | all(#.add)\nsort($env) | all(#.array)\nsort($env) | all(#.foo?.Bar)\nsort($env) | all(#.ok)\nsort($env) | all($env)\nsort($env) | all(.foo?.[array])\nsort($env) | all(.str)\nsort($env) | all(true)\nsort($env) | any(#)\nsort($env) | any(#.f64)\nsort($env) | any(#.i)\nsort($env) | any(.String)\nsort($env) | any(.array)\nsort($env) | concat(list)\nsort($env) | count(#)\nsort($env) | count(#.Bar)\nsort($env) | count(#.foo)\nsort($env) | count(#.i == 0)\nsort($env) | count($env)\nsort($env) | count(.f64)\nsort($env) | count(false)\nsort($env) | filter(#)\nsort($env) | filter(#.String)\nsort($env) | filter(#.i)\nsort($env) | filter(#.list)\nsort($env) | find(#)\nsort($env) | find(#.Bar)\nsort($env) | find(#.list)\nsort($env) | find($env)\nsort($env) | find(.String[#.array:true])\nsort($env) | find(.array)\nsort($env) | find(.i)\nsort($env) | find(false)\nsort($env) | findIndex(#)\nsort($env) | findIndex(#.add)\nsort($env) | findIndex(#.array)\nsort($env) | findIndex(.String)\nsort($env) | findIndex(.array)\nsort($env) | findIndex(.foo)\nsort($env) | findIndex(.ok)\nsort($env) | findIndex(false)\nsort($env) | findIndex(ok)\nsort($env) | findLast(#)\nsort($env) | findLast(#.array)\nsort($env) | findLast(#.list?.foo(#))\nsort($env) | findLast(#.str)\nsort($env) | findLast(false)\nsort($env) | findLastIndex(#)\nsort($env) | findLastIndex(#.add)\nsort($env) | findLastIndex(#.list)\nsort($env) | findLastIndex($env)\nsort($env) | findLastIndex(.Bar)\nsort($env) | findLastIndex(.foo)\nsort($env) | groupBy(#)\nsort($env) | groupBy(#.Bar)\nsort($env) | groupBy(#.add)\nsort($env) | groupBy(#.greet / #)\nsort($env) | groupBy(#.greet)\nsort($env) | groupBy(#?.foo(i))\nsort($env) | groupBy(.array)\nsort($env) | groupBy(.greet)\nsort($env) | groupBy(0)\nsort($env) | groupBy(1.0)\nsort($env) | groupBy(add)\nsort($env) | groupBy(f64)\nsort($env) | groupBy(i)\nsort($env) | groupBy(list)\nsort($env) | groupBy(ok)\nsort($env) | map(#)\nsort($env) | map(#.Bar)\nsort($env) | map(#.f64)\nsort($env) | map($env)\nsort($env) | map(.array)\nsort($env) | map(.foo)\nsort($env) | map(.list)\nsort($env) | map(1)\nsort($env) | map(1.0)\nsort($env) | map(f64 ?? 0)\nsort($env) | map(foo)\nsort($env) | map(i)\nsort($env) | map(true)\nsort($env) | mean(1.0)\nsort($env) | none(#)\nsort($env) | none(#.add[foobar:])\nsort($env) | none(#.list)\nsort($env) | none(#.ok)\nsort($env) | none($env)\nsort($env) | none(.String)\nsort($env) | none(.add)\nsort($env) | none(.array)\nsort($env) | none(.foo)\nsort($env) | none(.list)\nsort($env) | one(#.add)\nsort($env) | one(#.f64)\nsort($env) | one(#.greet)\nsort($env) | one(#.list)\nsort($env) | one(#.ok)\nsort($env) | one(#.ok.nil)\nsort($env) | one(#.str)\nsort($env) | one($env)\nsort($env) | one(.Bar)\nsort($env) | one(.f64)\nsort($env) | one(.f64?.[.greet])\nsort($env) | one(.list)\nsort($env) | one(false)\nsort($env) | one(ok)\nsort($env) | reduce(#.String, nil)\nsort($env) | reduce(#.greet, str)\nsort($env) | reduce(false, 0)\nsort($env) | reduce(foo, foo)\nsort($env) | sortBy(#)\nsort($env) | sortBy(#.String)\nsort($env) | sortBy(.add)\nsort($env) | sortBy(.f64)\nsort($env) | sortBy(1.0)\nsort($env) | sortBy(foo)\nsort($env) | sortBy(i)\nsort($env) | sortBy(str)\nsort($env) | sum(#.foo)\nsort($env) | sum(#.greet)\nsort($env) | sum(#.str?.String)\nsort($env) | sum($env)\nsort($env) | sum(.array)\nsort($env) | sum(1.0)\nsort($env) | sum(array)\nsort($env) | sum(false)\nsort($env) | sum(foo)\nsort($env) | sum(not #.array)\nsort($env)?.[i]\nsort($env)?.[i].add()\nsort($env)?.[i]?.[array]\nsort($env)[:]\nsort($env.array)\nsort($env?.$env)\nsort($env?.Bar)\nsort($env?.Bar?.[ok])\nsort($env?.Bar?.greet)\nsort($env?.String)\nsort($env?.String) | one(.str.add(foobar))\nsort($env?.[Bar])\nsort($env?.[Bar]) ?? array\nsort($env?.[Bar]?.[array])\nsort($env?.[Bar]?.foo())\nsort($env?.[String])\nsort($env?.[foobar])\nsort($env?.[foobar]?.[add])\nsort($env?.[nil])\nsort($env?.[nil]?.String().array)\nsort($env?.[str])\nsort($env?.array)\nsort($env?.false)\nsort($env?.foobar)\nsort($env?.foobar?.greet)\nsort($env?.list | reduce(#acc))\nsort($env?.nil)\nsort(0 .. i)\nsort(0 ?? 1.0)\nsort(0 ?? foo)\nsort(0 ?? foo.Bar)\nsort(0 ?? ok)\nsort(1 .. 1)\nsort(1 ?? 1.0)\nsort(1 ?? array)\nsort(1 ?? false)\nsort(1 ?? foo)\nsort(1 ?? greet)\nsort(1 ?? ok)\nsort(1..i)\nsort(1.0 ?? $env)\nsort(1.0 ?? 0)\nsort(1.0 ?? false)\nsort(1.0 ?? foo)\nsort(1.0 ?? greet)\nsort(1.0 ?? i)\nsort(1.0 ?? ok)\nsort(1.0 ?? str)\nsort(1.0 ?? true)\nsort([$env])\nsort([0 .. 0])\nsort([0])\nsort([1 ?? 0])\nsort([1.0])\nsort([1])\nsort([add])\nsort([array])\nsort([f64])\nsort([false])\nsort([foo])\nsort([greet])\nsort([i])\nsort([list])\nsort([nil])\nsort([ok])\nsort([str])\nsort([true])\nsort(add ?? $env)\nsort(add ?? 0)\nsort(add ?? 1.0)\nsort(add ?? array)\nsort(add ?? greet)\nsort(add ?? i)\nsort(add ?? ok)\nsort(array ?? 0)\nsort(array ?? array)\nsort(array ?? foo)\nsort(array ?? nil)\nsort(array ?? true)\nsort(array | filter(ok))\nsort(array | map(#))\nsort(array | map(1))\nsort(array | mean(1))\nsort(array | median(1, i))\nsort(array | sortBy(#))\nsort(array | sortBy(f64))\nsort(array | sortBy(str))\nsort(array | sum(#)..i)\nsort(array)\nsort(array) != list\nsort(array) == list\nsort(array) ?? mean(f64)\nsort(array) ?? not ok\nsort(array) | filter(true)\nsort(array) | find(true)\nsort(array) | findIndex($env?.ok)\nsort(array) | findLast(ok)\nsort(array) | findLastIndex(false)\nsort(array) | get(i)\nsort(array) | groupBy(#)\nsort(array) | groupBy(foo)\nsort(array) | groupBy(str)\nsort(array) | map(#)\nsort(array) | map(0)\nsort(array) | map(1.0)\nsort(array) | map(foo)\nsort(array) | map(list)\nsort(array) | map(ok)\nsort(array) | one(false)\nsort(array) | reduce(#)\nsort(array) | reduce(#index)\nsort(array) | reduce($env)\nsort(array) | reduce(foo)\nsort(array) | reduce(list, greet)\nsort(array) | reduce(true, 1.0)\nsort(array) | sortBy(#)\nsort(array) | sortBy(1)\nsort(array)?.[i]\nsort(array[0:])\nsort(array[:0])\nsort(concat(array))\nsort(f64 ?? $env)\nsort(f64 ?? foo)\nsort(false ? true : 0)\nsort(false ?: $env)\nsort(false ?: 1.0)\nsort(false ?: i)\nsort(false ?: list)\nsort(false ?? $env)\nsort(false ?? add)\nsort(false ?? array)\nsort(false ?? foo)\nsort(false ?? greet)\nsort(false ?? list)\nsort(filter($env, false))\nsort(filter(list, false))\nsort(first($env))\nsort(flatten(array))\nsort(foo ?? $env)\nsort(foo ?? 0)\nsort(foo ?? 1)\nsort(foo ?? 1.0)\nsort(foo ?? add)\nsort(foo ?? array)\nsort(foo ?? f64)\nsort(foo ?? false)\nsort(foo ?? i)\nsort(foo ?? ok)\nsort(foo ?? true)\nsort(greet ?? $env)\nsort(greet ?? foo)\nsort(i .. 0)\nsort(i .. 1)\nsort(i ?? $env)\nsort(i ?? 1.0)\nsort(i ?? f64)\nsort(i ?? list)\nsort(if false { 1 } else { 1.0 })\nsort(if false { 1.0 } else { 1 })\nsort(if false { false } else { f64 })\nsort(if false { foo } else { 1.0 })\nsort(if false { nil } else { $env })\nsort(if ok { ok } else { 1.0 })\nsort(if true { add } else { str })\nsort(if true { array } else { i })\nsort(if true { f64 } else { $env })\nsort(if true { foo } else { 1.0 })\nsort(if true { greet } else { 1 })\nsort(keys($env))\nsort(last($env))\nsort(list ?? 1)\nsort(list ?? 1.0)\nsort(list ?? add)\nsort(list ?? str)\nsort(list ?? true)\nsort(list | map(#.Bar))\nsort(list | reduce(array))\nsort(map($env, #index))\nsort(map($env, i))\nsort(map(array, #))\nsort(map(array, 0))\nsort(map(array, 1.0))\nsort(map(list, #.Bar))\nsort(map(list, 1.0))\nsort(map(list, str))\nsort(max($env))\nsort(max(array))\nsort(max(array, 1.0))\nsort(mean(array))\nsort(median(array))\nsort(min($env))\nsort(min(array))\nsort(min(array, 1.0))\nsort(nil ?? $env)\nsort(ok ? 1.0 : $env)\nsort(ok ? list : str)\nsort(ok ?: 1.0)\nsort(ok ?: list)\nsort(ok ?? 0)\nsort(ok ?? add)\nsort(ok ?? f64)\nsort(ok ?? foo)\nsort(ok ?? list)\nsort(reduce(array, $env))\nsort(reduce(array, array))\nsort(reduce(list, $env))\nsort(reverse(array))\nsort(sort($env))\nsort(sort([str]))\nsort(sort(array))\nsort(sortBy(array, 1.0))\nsort(str ?? $env)\nsort(str ?? $env.list)\nsort(str ?? 0)\nsort(str ?? 1.0)\nsort(str ?? foo)\nsort(str ?? greet)\nsort(str ?? true)\nsort(toPairs($env))\nsort(true ? 0 : $env)\nsort(true ? i : 1.0)\nsort(true ? list : 1)\nsort(true ?? 1.0)\nsort(true ?? f64)\nsort(true ?? foo)\nsort(true ?? greet)\nsort(true ?? str)\nsort({foo: 1.0}.add)\nsort({foo: foo, foo: add}.Bar)\nsort({foo: nil, foo: foo}.add)\nsort({foo: nil}.i)\nsort({foo: str}.greet)\nsort({foo: true}.Bar)\nsortBy($env, #) == $env || true\nsortBy($env.array, #)\nsortBy($env.array, f64)\nsortBy($env.array, str)\nsortBy($env.list, #.Bar)\nsortBy($env.list, f64)\nsortBy($env.list, i)\nsortBy($env.list, str)\nsortBy($env?.[str], #)\nsortBy($env?.[str], $env?.i)\nsortBy($env?.[str], f64)\nsortBy($env?.[str], str)\nsortBy($env?.array, #)\nsortBy($env?.array, str)\nsortBy($env?.list, .Bar)\nsortBy($env?.list, f64)\nsortBy($env?.list, i)\nsortBy(0 .. 0, #)\nsortBy(0 .. 0, str)\nsortBy(0 .. 1, #)\nsortBy(0 .. i, # ^ i)\nsortBy([$env], #)\nsortBy([$env], #.String?.[foo])\nsortBy([$env], #?.add)\nsortBy([$env], .list)\nsortBy([$env], f64 ?? .array)\nsortBy([$env], greet)\nsortBy([$env], str)\nsortBy([0], $env.ok)\nsortBy([0], $env?.Bar)\nsortBy([0], add)\nsortBy([0], greet)\nsortBy([1.0], $env?.ok)\nsortBy([1.0], f64)\nsortBy([1], 0 >= #)\nsortBy([array], f64)\nsortBy([f64], # + #)\nsortBy([f64], add)\nsortBy([f64], array)\nsortBy([f64], f64)\nsortBy([f64], i)\nsortBy([false], list)\nsortBy([foo], #)\nsortBy([foo], #?.Bar)\nsortBy([foo], add)\nsortBy([foo], array)\nsortBy([foo], foo)\nsortBy([greet], #)\nsortBy([groupBy(array, #)], #)\nsortBy([i], array)\nsortBy([list], #)\nsortBy([nil], add)\nsortBy([nil], array)\nsortBy([ok], add)\nsortBy([str], #)\nsortBy([str], findIndex(list, ok))\nsortBy([true], f64)\nsortBy([true], i)\nsortBy(array ?? 1.0, #)\nsortBy(array ?? f64, f64)\nsortBy(array | sortBy(#), #)\nsortBy(array, # * #)\nsortBy(array, # ** #)\nsortBy(array, # + #)\nsortBy(array, # - 1)\nsortBy(array, # / #)\nsortBy(array, # / f64)\nsortBy(array, # ?? #)\nsortBy(array, # ?? foo)\nsortBy(array, # ?? str)\nsortBy(array, # ^ #)\nsortBy(array, # ^ 1)\nsortBy(array, # | bitshl(#))\nsortBy(array, # | mean(#, #))\nsortBy(array, #)\nsortBy(array, #) | any(ok)\nsortBy(array, #) | findIndex(false)\nsortBy(array, #) | groupBy(true)\nsortBy(array, #) | map(#)\nsortBy(array, #) | map($env)\nsortBy(array, #) | map(0)\nsortBy(array, #) | map(foo)\nsortBy(array, #) | min(array, 1)\nsortBy(array, #) | reduce(#)\nsortBy(array, #) | reduce(#, 1)\nsortBy(array, #) | reduce($env)\nsortBy(array, #) | reduce(1.0, nil)\nsortBy(array, #) | reduce(true, 1.0)\nsortBy(array, #)?.[i]\nsortBy(array, $env.f64)\nsortBy(array, $env.i)\nsortBy(array, $env.str)\nsortBy(array, $env?.[str])\nsortBy(array, $env?.i)\nsortBy(array, -#)\nsortBy(array, -0)\nsortBy(array, -1.0)\nsortBy(array, 0 * #)\nsortBy(array, 0 ** #)\nsortBy(array, 0 - 1)\nsortBy(array, 0) | map(#)\nsortBy(array, 0) | sortBy(#)\nsortBy(array, 0)?.[i]\nsortBy(array, 1 ** f64)\nsortBy(array, 1 + #)\nsortBy(array, 1 / #)\nsortBy(array, 1 ?? false)\nsortBy(array, 1 ^ #)\nsortBy(array, 1) | all(ok)\nsortBy(array, 1) | groupBy(#)\nsortBy(array, 1) | reduce($env)\nsortBy(array, 1) | reduce(foo)\nsortBy(array, 1)?.[i]\nsortBy(array, 1.0 ^ #)\nsortBy(array, 1.0) | findLast(false)\nsortBy(array, 1.0) | max(1.0)\nsortBy(array, 1.0)?.[i]\nsortBy(array, abs(#))\nsortBy(array, bitnand(#, #))\nsortBy(array, bitnot(#))\nsortBy(array, f64 ** #)\nsortBy(array, f64)\nsortBy(array, f64) | groupBy(1.0)\nsortBy(array, f64) | reduce(#, 1.0)\nsortBy(array, f64)?.[i]\nsortBy(array, findLast(array, ok))\nsortBy(array, findLastIndex($env, ok))\nsortBy(array, float(1))\nsortBy(array, foo.Bar)\nsortBy(array, foo?.Bar)\nsortBy(array, i ** #)\nsortBy(array, i + 1)\nsortBy(array, i - #)\nsortBy(array, i)\nsortBy(array, i) | find(false)\nsortBy(array, i) | map(list)\nsortBy(array, i)?.[i]\nsortBy(array, max(#))\nsortBy(array, mean(#))\nsortBy(array, median(1.0))\nsortBy(array, min(#))\nsortBy(array, round(#))\nsortBy(array, round(i))\nsortBy(array, str)\nsortBy(array, str) | groupBy(1.0)\nsortBy(array, str) | map(list)\nsortBy(array, str) | none(ok)\nsortBy(array, str) | reduce(#)\nsortBy(array, str) | reduce(ok)\nsortBy(array, str) | sortBy(0)\nsortBy(array, str)?.[i]\nsortBy(array, string(1.0))\nsortBy(array, toJSON(f64))\nsortBy(array, toJSON(foo))\nsortBy(array, toJSON(nil))\nsortBy(array[:i], str)\nsortBy(concat(array), #)\nsortBy(concat(array), round(i))\nsortBy(filter($env, false), #.foo)\nsortBy(filter($env, false), .add)\nsortBy(filter($env, false), findLast($env, #.greet))\nsortBy(flatten(array), #)\nsortBy(flatten(list), f64)\nsortBy(flatten(list), str)\nsortBy(let foobar = array; foobar, # * 1.0)\nsortBy(list | map(i), # ^ #)\nsortBy(list, #.Bar)\nsortBy(list, #.Bar) | map(#)\nsortBy(list, #.Bar)?.[i]\nsortBy(list, #.String())\nsortBy(list, #?.Bar)\nsortBy(list, $env.f64)\nsortBy(list, $env.i)\nsortBy(list, $env.str)\nsortBy(list, $env?.[str])\nsortBy(list, $env?.i)\nsortBy(list, -0)\nsortBy(list, -1.0)\nsortBy(list, -f64)\nsortBy(list, .Bar)\nsortBy(list, .Bar) != list\nsortBy(list, .Bar) | sum(f64)\nsortBy(list, 0 ^ 0)\nsortBy(list, 0) ?? greet\nsortBy(list, 0)?.[i]\nsortBy(list, 1 ?? #)\nsortBy(list, 1 ?? greet)\nsortBy(list, 1)?.[i]\nsortBy(list, 1.0 ** f64)\nsortBy(list, 1.0 + i)\nsortBy(list, 1.0) | groupBy(true)\nsortBy(list, 1.0) | map(list)\nsortBy(list, 1.0) | reduce(greet)\nsortBy(list, 1.0) | sortBy(i)\nsortBy(list, 1.0)?.[$env?.i]\nsortBy(list, 1.0)?.[i]\nsortBy(list, abs(0))\nsortBy(list, abs(f64))\nsortBy(list, bitnand(0, 1))\nsortBy(list, bitnot(1))\nsortBy(list, f64)\nsortBy(list, f64) | filter(true)\nsortBy(list, f64) | map($env)\nsortBy(list, f64) | reduce(#)\nsortBy(list, f64) | sum(0)\nsortBy(list, f64)?.[i]\nsortBy(list, foo.String())\nsortBy(list, foo?.Bar)\nsortBy(list, greet(#.Bar))\nsortBy(list, greet(.Bar))\nsortBy(list, greet(str))\nsortBy(list, i ?? #)\nsortBy(list, i ?? $env)\nsortBy(list, i)\nsortBy(list, i) == list\nsortBy(list, i) | one(false)\nsortBy(list, i) | reduce($env)\nsortBy(list, i) | reduce(add)\nsortBy(list, i)?.[i]\nsortBy(list, len(#.Bar))\nsortBy(list, len(list))\nsortBy(list, reduce(array, i))\nsortBy(list, round(1))\nsortBy(list, round(1.0))\nsortBy(list, str)\nsortBy(list, str) | map(0)\nsortBy(list, str) | map(array)\nsortBy(list, str) | reduce(true)\nsortBy(list, str)?.[i]\nsortBy(list, string(#.Bar))\nsortBy(list, string(1.0))\nsortBy(list, string(greet))\nsortBy(list, string(ok))\nsortBy(list, sum(array))\nsortBy(list, toBase64(#.Bar))\nsortBy(list, toBase64(str))\nsortBy(list, toJSON(#.Bar))\nsortBy(list, toJSON(i))\nsortBy(list, trimPrefix(str))\nsortBy(list, type(1.0))\nsortBy(list, type(add))\nsortBy(list, type(false))\nsortBy(list, type(list))\nsortBy(map($env, greet), type(f64))\nsortBy(map(array, #), #)\nsortBy(map(array, add), bitnot(1))\nsortBy(sort($env), #)\nsortBy(sort($env), #.array .. .f64)\nsortBy(sort($env), f64)\nsortBy(sort($env), map(#.list, array))\nsortBy(sort($env), ok)\nsortBy(sortBy(array, i), #)\nsortBy(take(list, 1), #)\nsortBy(uniq(array), #)\nsplit($env.str, str)\nsplit(str, $env?.[str])\nsplit(str, $env?.str)\nsplit(str, str)\nsplit(str, str)?.[i]\nsplit(str, string($env))\nsplit(str, toBase64(str))\nsplitAfter(foo?.Bar, str)\nsplitAfter(str, foo?.String())\nsplitAfter(str, str)\nsplitAfter(str, toJSON(nil))\nstr\nstr != $env == $env\nstr != $env ? 1.0 : $env\nstr != $env ?? $env\nstr != $env ?? 1.0\nstr != $env ?? i\nstr != $env and false\nstr != $env and ok\nstr != $env or $env\nstr != $env or false\nstr != $env.str\nstr != $env?.Bar\nstr != $env?.String\nstr != $env?.[Bar]\nstr != $env?.[String]\nstr != $env?.[foobar]\nstr != $env?.[nil]\nstr != $env?.[str]\nstr != $env?.foobar\nstr != $env?.foobar?.[greet]\nstr != $env?.str\nstr != 0 ?? array\nstr != 1 ?? f64\nstr != 1 ?? foo\nstr != 1.0 ?? 1\nstr != 1.0 ?? concat($env, $env)\nstr != 1.0 ?? list\nstr != add ?? foo\nstr != array ?? $env?.[String]\nstr != f64 ?? array\nstr != first($env)\nstr != foo ?? $env?.greet\nstr != foo ?? 1.0\nstr != foo ?? array\nstr != foo ?? f64\nstr != foo ?? false\nstr != foo ?? greet\nstr != foo ?? greet and $env\nstr != foo.Bar\nstr != foo.String()\nstr != foo?.Bar\nstr != foo?.String()\nstr != greet ?? $env?.[String]\nstr != greet ?? array\nstr != greet ?? ok\nstr != greet(str)\nstr != i ?? array\nstr != list ?? 1\nstr != list ?? false\nstr != list ?? true\nstr != lower(str)\nstr != median(array)\nstr != min(array, array)\nstr != nil != nil\nstr != nil && $env\nstr != nil == true\nstr != nil ? foo : f64\nstr != nil ?? $env\nstr != nil or $env\nstr != nil or $env?.[Bar]\nstr != nil or ok\nstr != nil || $env\nstr != nil || false\nstr != nil || ok\nstr != ok ?? 1\nstr != reduce(array, #acc, foo)\nstr != reduce(list, .Bar, false)\nstr != str\nstr != str != false\nstr != str && $env?.String.i()\nstr != str && true\nstr != str ? 0 : 1.0\nstr != str ? foo : true\nstr != str ?? 1.0\nstr != str ?? i\nstr != str ?? ok\nstr != str and $env\nstr != str || $env\nstr != str || false\nstr != string(1.0)\nstr != string(f64)\nstr != string(false)\nstr != string(list)\nstr != toJSON(1.0)\nstr != toJSON(false)\nstr != toJSON(foo)\nstr != trim(str)\nstr != true ?? f64\nstr != true ?? str\nstr != type($env)\nstr != type(false)\nstr != type(foo)\nstr != type(str)\nstr + $env not endsWith $env and false\nstr + $env.str\nstr + $env?.[str]\nstr + $env?.str\nstr + foo.Bar\nstr + foo.String()\nstr + foo?.Bar\nstr + foo?.String()\nstr + greet(str)\nstr + repeat(str, 1)\nstr + str\nstr + str != $env\nstr + str ?? foo\nstr + str in max($env)\nstr + str not in $env\nstr + string($env)\nstr + string(add)\nstr + string(f64)\nstr + string(list)\nstr + string(nil)\nstr + string(str)\nstr + toBase64(str)\nstr + toJSON(1.0)\nstr + toJSON(false)\nstr + toJSON(i)\nstr + toJSON(list)\nstr + toJSON(nil)\nstr + toJSON(ok)\nstr + toJSON(str)\nstr + type($env)\nstr + type(foo)\nstr < $env && false\nstr < $env.str\nstr < $env?.[str]\nstr < $env?.str\nstr < -$env or true\nstr < foo.Bar\nstr < foo.String()\nstr < foo?.Bar\nstr < foo?.String()\nstr < greet(str)\nstr < nil ?? str\nstr < str\nstr < str && false\nstr < str and ok\nstr < str || ok\nstr < string($env)\nstr < string(add)\nstr < string(foo)\nstr < string(greet)\nstr < string(str)\nstr < toJSON(foo)\nstr < type(array)\nstr < type(nil)\nstr < type(str)\nstr < type(true)\nstr <= $env or true\nstr <= $env.str\nstr <= $env?.[str]\nstr <= $env?.foobar and false\nstr <= $env?.str\nstr <= foo.Bar\nstr <= foo.String()\nstr <= foo?.Bar\nstr <= foo?.String()\nstr <= greet(str)\nstr <= str\nstr <= str != $env\nstr <= str != nil\nstr <= str ?: str\nstr <= str ?? f64\nstr <= str[:i]\nstr <= string($env)\nstr <= string(0)\nstr <= string(i)\nstr <= string(list)\nstr <= string(nil)\nstr <= string(true)\nstr <= toJSON(1.0)\nstr <= toJSON(f64)\nstr <= toJSON(foo)\nstr <= toJSON(nil)\nstr <= toJSON(ok)\nstr <= type(1.0)\nstr <= type(add)\nstr <= type(foo)\nstr <= type(list)\nstr <= type(str)\nstr <= type(true)\nstr == $env != nil\nstr == $env && ok\nstr == $env ?? 1\nstr == $env or $env\nstr == $env || $env?.[Bar]\nstr == $env.str\nstr == $env?.Bar\nstr == $env?.String\nstr == $env?.[Bar]\nstr == $env?.[Bar]?.[array]\nstr == $env?.[Bar]?.[list]\nstr == $env?.[String]\nstr == $env?.[String]?.add\nstr == $env?.[String]?.array\nstr == $env?.[foobar]\nstr == $env?.[str]\nstr == $env?.foo.Bar\nstr == $env?.foobar\nstr == $env?.foobar?.String\nstr == $env?.not\nstr == $env?.str\nstr == $env?.true\nstr == 0 ?? 1.0\nstr == 1 ?? add\nstr == 1.0 ?? foo\nstr == add ?? list\nstr == f64 ?? 0\nstr == false ?? str\nstr == first($env)\nstr == foo ?? add\nstr == foo ?? str\nstr == foo.Bar\nstr == foo.String()\nstr == foo?.Bar\nstr == foo?.String()\nstr == greet(str)\nstr == i ?? array\nstr == list ?? foo\nstr == max($env)\nstr == nil == ok\nstr == nil ?: list\nstr == nil or true || $env\nstr == reduce(array, str)\nstr == str\nstr == str || $env[true:]\nstr == str || true\nstr == string(add)\nstr == string(foo)\nstr == string(ok)\nstr == toBase64(str | repeat(0))\nstr == toJSON(0)\nstr == toJSON(1.0)\nstr == toJSON(f64)\nstr == toJSON(nil)\nstr == trim(str)\nstr == true ?? foo\nstr == type(add)\nstr == type(foo)\nstr == type(greet)\nstr == upper(str)\nstr == {foo: 1}.array\nstr > $env or true\nstr > $env || true\nstr > $env.str\nstr > $env?.[str]\nstr > $env?.foo?.String()\nstr > $env?.str\nstr > foo.Bar\nstr > foo.Bar < foo.Bar\nstr > foo.String()\nstr > foo?.Bar\nstr > foo?.String()\nstr > str\nstr > str + $env.str\nstr > str + str\nstr > str < $env?.str\nstr > str > $env?.Bar\nstr > str > $env?.[list]\nstr > str ?: 1\nstr > str ?: str\nstr > str and true\nstr > str[1:]\nstr > str[int(0):]\nstr > string($env)\nstr > string(nil)\nstr > string(true)\nstr > toJSON(1.0)\nstr > toJSON(foo)\nstr > toJSON(ok)\nstr > trimSuffix(str)\nstr > type(1)\nstr > type(1.0)\nstr > type(add)\nstr > type(false)\nstr > type(nil)\nstr > upper(toJSON(false))\nstr >= $env && false\nstr >= $env or true\nstr >= $env.str\nstr >= $env?.[str]\nstr >= $env?.[str] ?? list\nstr >= $env?.foo.Bar\nstr >= $env?.str\nstr >= foo.Bar\nstr >= foo.String()\nstr >= foo?.Bar\nstr >= foo?.String()\nstr >= greet(str)\nstr >= str\nstr >= str != $env\nstr >= str ?? nil\nstr >= string(1)\nstr >= string(1.0)\nstr >= string(add)\nstr >= string(str)\nstr >= toJSON(false)\nstr >= toJSON(str)\nstr >= type(1)\nstr >= type(list)\nstr ?? !$env\nstr ?? !ok\nstr ?? $env ?? f64\nstr ?? $env ?? foo\nstr ?? $env ?? foo?.String\nstr ?? $env ?? list\nstr ?? $env ?? ok\nstr ?? $env ?? str\nstr ?? $env | any(false)\nstr ?? $env | greet()\nstr ?? $env | groupBy(#)\nstr ?? $env | map(#)\nstr ?? $env | reduce(#)\nstr ?? $env | reduce($env, false)\nstr ?? $env | reduce(0)\nstr ?? $env | reduce(foo, foo)\nstr ?? $env | reduce(true, 1.0)\nstr ?? $env | sum(#)\nstr ?? $env.add\nstr ?? $env.array\nstr ?? $env.f64\nstr ?? $env.foo\nstr ?? $env.greet\nstr ?? $env.i\nstr ?? $env.list\nstr ?? $env.ok\nstr ?? $env.str\nstr ?? $env?.Bar\nstr ?? $env?.Bar()\nstr ?? $env?.Bar(foo)\nstr ?? $env?.Bar(list)\nstr ?? $env?.String\nstr ?? $env?.String()\nstr ?? $env?.String(foo contains foobar)\nstr ?? $env?.[1.0]\nstr ?? $env?.[Bar | any(1)]\nstr ?? $env?.[Bar()]\nstr ?? $env?.[Bar]\nstr ?? $env?.[Bar].String()\nstr ?? $env?.[String]\nstr ?? $env?.[String].list\nstr ?? $env?.[[foo]]\nstr ?? $env?.[add]\nstr ?? $env?.[add].greet\nstr ?? $env?.[add]?.[f64]\nstr ?? $env?.[array]\nstr ?? $env?.[array].f64()\nstr ?? $env?.[f64]\nstr ?? $env?.[f64].f64\nstr ?? $env?.[foo]\nstr ?? $env?.[foobar]\nstr ?? $env?.[greet]\nstr ?? $env?.[i]\nstr ?? $env?.[i]?.foo\nstr ?? $env?.[list]\nstr ?? $env?.[list]?.add?.[array]\nstr ?? $env?.[list]?.i\nstr ?? $env?.[nil]\nstr ?? $env?.[ok]\nstr ?? $env?.[ok]?.Bar\nstr ?? $env?.[str]\nstr ?? $env?.add\nstr ?? $env?.array\nstr ?? $env?.f64\nstr ?? $env?.foo\nstr ?? $env?.foobar\nstr ?? $env?.greet\nstr ?? $env?.i\nstr ?? $env?.list\nstr ?? $env?.nil\nstr ?? $env?.ok\nstr ?? $env?.str\nstr ?? $env[:foobar]\nstr ?? $env[:list?.f64()]\nstr ?? $env[f64:]\nstr ?? $env[ok:]\nstr ?? -$env\nstr ?? -0\nstr ?? -1\nstr ?? -1.0\nstr ?? -i\nstr ?? 0 | all(false)\nstr ?? 0 | groupBy(foo)\nstr ?? 0 | map(greet)\nstr ?? 0 | map(ok)\nstr ?? 0 | sum(f64)\nstr ?? 1 ?? foo\nstr ?? 1 | greet()\nstr ?? 1 | map(foo)\nstr ?? 1 | map(i)\nstr ?? 1.0 ?? foo\nstr ?? 1.0 | findLast(true)\nstr ?? 1.0 | findLastIndex(ok)\nstr ?? 1.0 | groupBy(#)\nstr ?? 1.0 | groupBy(0)\nstr ?? 1.0 | map(#)\nstr ?? 1.0 | map(1)\nstr ?? 1.0 | map(1.0)\nstr ?? 1.0 | reduce(#)\nstr ?? 1.0 | reduce(false == #)\nstr ?? 1.0 | sum(#)\nstr ?? [0, i]\nstr ?? [1.0]\nstr ?? [f64]\nstr ?? [foo]\nstr ?? [nil]\nstr ?? [true]\nstr ?? add\nstr ?? add ?? $env\nstr ?? add | count(true)\nstr ?? add | map(add)\nstr ?? add | reduce(foo)\nstr ?? add | reduce(greet)\nstr ?? all($env, #)\nstr ?? all(list, $env)\nstr ?? array\nstr ?? array | findIndex(true)\nstr ?? array | map(array)\nstr ?? array | none(true)\nstr ?? array?.[i]\nstr ?? concat(array)\nstr ?? count($env)\nstr ?? date(array)\nstr ?? date(greet)\nstr ?? date(ok, foo)\nstr ?? duration(str)\nstr ?? f64\nstr ?? f64 | groupBy(#)\nstr ?? false | count(false)\nstr ?? false | findLastIndex(# not in list)\nstr ?? false | groupBy(#)\nstr ?? false | map(0)\nstr ?? false | map(foo)\nstr ?? false | reduce(#)\nstr ?? findIndex($env, #)\nstr ?? first($env)\nstr ?? float(1.0)\nstr ?? floor(1)\nstr ?? foo\nstr ?? foo ?? $env\nstr ?? foo ?? 1.0\nstr ?? foo ?? f64\nstr ?? foo ?? list\nstr ?? foo ?? nil\nstr ?? foo ?? ok\nstr ?? foo ?? str\nstr ?? foo | any(ok)\nstr ?? foo | count(ok)\nstr ?? foo | findLastIndex(false)\nstr ?? foo | findLastIndex(ok)\nstr ?? foo | groupBy(1.0)\nstr ?? foo | map(#)\nstr ?? foo | map(ok)\nstr ?? foo | none(ok)\nstr ?? foo | none(true)\nstr ?? foo | one(false)\nstr ?? foo | reduce(#, 1)\nstr ?? foo | reduce(add)\nstr ?? foo | reduce(greet, foo)\nstr ?? foo | reduce(i, nil)\nstr ?? foo | sortBy(0)\nstr ?? foo | sum(#)\nstr ?? foo.Bar\nstr ?? foo.String\nstr ?? foo.String()\nstr ?? foo?.Bar\nstr ?? foo?.String\nstr ?? fromJSON($env)\nstr ?? greet\nstr ?? greet | greet()\nstr ?? greet | groupBy(1.0)\nstr ?? greet | groupBy(i)\nstr ?? greet | groupBy(ok)\nstr ?? greet | none(true)\nstr ?? greet | reduce(#)\nstr ?? greet | reduce(str)\nstr ?? greet($env)\nstr ?? greet(str)\nstr ?? groupBy($env, 1.0)\nstr ?? i\nstr ?? i ?? 1\nstr ?? i ?? ok\nstr ?? i | map(true)\nstr ?? i | reduce(#)\nstr ?? i | reduce($env)\nstr ?? i | reduce($env, greet)\nstr ?? i | reduce(false)\nstr ?? i | sortBy(#)\nstr ?? i | sum(#)\nstr ?? indexOf($env, str)\nstr ?? len(list)\nstr ?? list\nstr ?? list ?? $env | reduce(#)\nstr ?? list ?? true\nstr ?? list | any(ok)\nstr ?? list | map(list)\nstr ?? list | map(str)\nstr ?? list | sortBy(f64)\nstr ?? list?.[i]\nstr ?? map($env, add)\nstr ?? map(array, 1)\nstr ?? max($env)\nstr ?? max(0, 1)\nstr ?? max(1.0)\nstr ?? mean(array).i()\nstr ?? min(1.0)\nstr ?? min(list)\nstr ?? nil ?? list\nstr ?? nil | greet()\nstr ?? not $env\nstr ?? not false\nstr ?? not true\nstr ?? ok\nstr ?? ok ?? array\nstr ?? ok ?? toJSON(1)\nstr ?? ok | all(ok)\nstr ?? ok | find(ok)\nstr ?? ok | findIndex(false)\nstr ?? ok | groupBy(foo)\nstr ?? ok | map(#)\nstr ?? ok | map($env)\nstr ?? ok | map(list)\nstr ?? one($env, .greet)\nstr ?? reduce($env, #)\nstr ?? round(0)\nstr ?? sortBy(array, f64)\nstr ?? str\nstr ?? str ?? str\nstr ?? str[:sum(array)]\nstr ?? string(1)\nstr ?? string(array)\nstr ?? string(true)\nstr ?? sum($env)\nstr ?? sum($env, #.f64)\nstr ?? sum($env, .String)\nstr ?? sum(array, foo)\nstr ?? toJSON(0)\nstr ?? toJSON(foo)\nstr ?? toJSON(nil)\nstr ?? toJSON(str)\nstr ?? toPairs($env)\nstr ?? toPairs($env?.String)\nstr ?? trim($env)\nstr ?? trimSuffix($env)\nstr ?? true ?? greet\nstr ?? true | all(true)\nstr ?? true | find(false)\nstr ?? true | greet()\nstr ?? true | reduce(#)\nstr ?? true | reduce($env)\nstr ?? true | sum(1.0)\nstr ?? type(1)\nstr ?? type(1.0)\nstr ?? type(nil)\nstr ?? {foo: 1.0}\nstr ?? {foo: 1}\nstr ?? {foo: array}\nstr ?? {foo: nil}\nstr ?? {foo: true}\nstr contains $env.str\nstr contains $env?.Bar\nstr contains $env?.String\nstr contains $env?.String?.[i]\nstr contains $env?.String?.list\nstr contains $env?.[Bar]\nstr contains $env?.[Bar]?.foo\nstr contains $env?.[String]\nstr contains $env?.[String]?.[i]\nstr contains $env?.[foobar]\nstr contains $env?.[str]\nstr contains $env?.false\nstr contains $env?.foobar\nstr contains $env?.str\nstr contains foo.Bar\nstr contains foo.String()\nstr contains foo?.Bar\nstr contains foo?.String()\nstr contains greet(str)\nstr contains last($env)\nstr contains str\nstr contains str && ok\nstr contains str == ok\nstr contains str ?? $env\nstr contains str ?? list\nstr contains str ?? str\nstr contains str or $env?.[foo]\nstr contains str[:i]\nstr contains string(greet)\nstr contains string(ok)\nstr contains string(str)\nstr contains toJSON(f64)\nstr contains toJSON(foo)\nstr contains toJSON(nil)\nstr contains toJSON(ok)\nstr contains trimSuffix(str)\nstr contains type(foo)\nstr contains type(nil)\nstr contains type(ok)\nstr endsWith $env.str\nstr endsWith $env?.Bar\nstr endsWith $env?.Bar?.foo(foo)\nstr endsWith $env?.String\nstr endsWith $env?.[Bar]\nstr endsWith $env?.[Bar]?.add\nstr endsWith $env?.[String]\nstr endsWith $env?.[String]?.[add]\nstr endsWith $env?.[foobar]\nstr endsWith $env?.[str]\nstr endsWith $env?.foobar\nstr endsWith $env?.str\nstr endsWith first($env)\nstr endsWith foo.Bar\nstr endsWith foo.String()\nstr endsWith foo?.Bar\nstr endsWith foo?.String()\nstr endsWith greet(str)\nstr endsWith str\nstr endsWith str == nil\nstr endsWith str ?? foo\nstr endsWith str ?? ok\nstr endsWith string(foo)\nstr endsWith string(nil)\nstr endsWith string(ok)\nstr endsWith toJSON(0)\nstr endsWith toJSON(foo)\nstr endsWith toJSON(i)\nstr endsWith toJSON(nil)\nstr endsWith toJSON(str)\nstr endsWith toJSON(true)\nstr endsWith trimPrefix($env.str)\nstr endsWith trimSuffix(str)\nstr endsWith type($env)\nstr endsWith type(add)\nstr endsWith type(i)\nstr endsWith type(list)\nstr endsWith type(str)\nstr endsWith {foo: f64}.f64\nstr endsWith {foo: nil, foo: $env}?.f64\nstr in $env != $env\nstr in $env && $env\nstr in $env == ok\nstr in $env ?? $env?.[i]\nstr in $env ?? str\nstr in $env and $env\nstr in $env and false\nstr in $env and ok\nstr in $env || $env\nstr in $env || ok\nstr in $env.foo\nstr in $env?.Bar\nstr in $env?.String\nstr in $env?.String?.[f64]\nstr in $env?.[Bar]\nstr in $env?.[Bar]?.[ok]\nstr in $env?.[Bar]?.[str]\nstr in $env?.[String]\nstr in $env?.[String]?.str()\nstr in $env?.[foobar?.[str]]\nstr in $env?.[foobar]\nstr in $env?.foo\nstr in $env?.foobar\nstr in $env?.foobar?.greet\nstr in [$env, nil]\nstr in [nil]\nstr in array ?? foo\nstr in concat(array)\nstr in find($env, false)\nstr in find(list, true)\nstr in foo\nstr in foo != false\nstr in foo ?? greet\nstr in foo and array != array\nstr in foo and false\nstr in foo || $env\nstr in list?.[i]\nstr in min($env)\nstr in sort(array)\nstr in {foo: $env?.[Bar]}\nstr in {foo: 1}\nstr in {foo: f64}\nstr in {foo: foo}\nstr in {foo: i, foo: 1}\nstr in {foo: nil, foo: 1.0}\nstr in {foo: nil}\nstr matches $env and false\nstr matches $env.str\nstr matches $env?.Bar\nstr matches $env?.String\nstr matches $env?.String?.list\nstr matches $env?.[Bar]\nstr matches $env?.[Bar]?.f64\nstr matches $env?.[String]\nstr matches $env?.[foobar]\nstr matches $env?.[foobar]?.str\nstr matches $env?.[str]\nstr matches $env?.foobar\nstr matches $env?.foobar?.[ok]\nstr matches $env?.str\nstr matches foo.Bar\nstr matches foo.String()\nstr matches foo?.Bar\nstr matches foo?.String()\nstr matches last($env)\nstr matches lower(str)\nstr matches str\nstr matches str == nil\nstr matches str ?? 1.0\nstr matches str ?? foo\nstr matches str ?? i\nstr matches str || $env\nstr matches string($env)\nstr matches string($env?.[String])\nstr matches string(1)\nstr matches string(1.0)\nstr matches string(add)\nstr matches toBase64(str)\nstr matches toJSON(1.0)\nstr matches toJSON(nil)\nstr matches toJSON(ok)\nstr matches trimSuffix(str)\nstr matches type(0)\nstr matches type(1)\nstr matches type(f64)\nstr matches type(foo)\nstr matches type(greet)\nstr matches type(i)\nstr matches type(str)\nstr matches type(true)\nstr matches {foo: i}?.foobar\nstr not contains $env.str\nstr not contains $env?.Bar\nstr not contains $env?.Bar?.[f64]\nstr not contains $env?.String\nstr not contains $env?.String?.String\nstr not contains $env?.[Bar]\nstr not contains $env?.[Bar]?.Bar()\nstr not contains $env?.[String]\nstr not contains $env?.[foobar]\nstr not contains $env?.[nil]\nstr not contains $env?.[str]\nstr not contains $env?.foobar\nstr not contains $env?.nil\nstr not contains $env?.str\nstr not contains $env?.true?.[greet]\nstr not contains foo.Bar\nstr not contains foo.String()\nstr not contains foo?.Bar\nstr not contains foo?.String()\nstr not contains greet(str)\nstr not contains last($env)\nstr not contains last($env)?.add\nstr not contains lower(str)\nstr not contains str\nstr not contains str && $env\nstr not contains str + str\nstr not contains str[:1]\nstr not contains string($env)\nstr not contains string(add)\nstr not contains string(nil)\nstr not contains string(str)\nstr not contains toJSON(0)\nstr not contains toJSON(array)\nstr not contains trim(str)\nstr not contains trimPrefix(str)\nstr not contains trimSuffix(str)\nstr not contains type(0)\nstr not contains type(foo)\nstr not contains type(greet)\nstr not contains type(list)\nstr not contains type(str)\nstr not contains upper(str)\nstr not contains {foo: foo}.String\nstr not endsWith $env and false\nstr not endsWith $env.str\nstr not endsWith $env?.Bar\nstr not endsWith $env?.Bar?.[list]\nstr not endsWith $env?.String\nstr not endsWith $env?.[Bar]\nstr not endsWith $env?.[Bar]?.String\nstr not endsWith $env?.[String]\nstr not endsWith $env?.[String]?.String\nstr not endsWith $env?.[String]?.[add]?.[add]\nstr not endsWith $env?.[String]?.[greet]\nstr not endsWith $env?.[foobar?.foo($env)]\nstr not endsWith $env?.[str]\nstr not endsWith $env?.false\nstr not endsWith $env?.foobar\nstr not endsWith $env?.greet(str)\nstr not endsWith $env?.not\nstr not endsWith $env?.str\nstr not endsWith first($env)\nstr not endsWith first($env)?.[greet]\nstr not endsWith foo.Bar\nstr not endsWith foo.String()\nstr not endsWith foo?.Bar\nstr not endsWith foo?.String()\nstr not endsWith greet(str)\nstr not endsWith str\nstr not endsWith str && $env?.String\nstr not endsWith str ?? array\nstr not endsWith str ?? nil\nstr not endsWith str || $env.ok\nstr not endsWith str || true\nstr not endsWith string(1)\nstr not endsWith toBase64(str)\nstr not endsWith toJSON(foo)\nstr not endsWith trimSuffix(str)\nstr not endsWith type(i)\nstr not endsWith type(list)\nstr not endsWith upper(foo?.String())\nstr not endsWith {foo: foo}.i\nstr not in $env && $env\nstr not in $env == $env\nstr not in $env ? $env : $env\nstr not in $env ? 1.0 : false\nstr not in $env ?? list\nstr not in $env and false\nstr not in $env.foo\nstr not in $env?.Bar\nstr not in $env?.Bar?.add\nstr not in $env?.String\nstr not in $env?.String?.[ok]\nstr not in $env?.[Bar]\nstr not in $env?.[Bar]?.String\nstr not in $env?.[Bar]?.list\nstr not in $env?.[String]\nstr not in $env?.[String]?.[array]\nstr not in $env?.[String]?.add()\nstr not in $env?.[foobar]\nstr not in $env?.[foobar]?.[ok]\nstr not in $env?.[foobar]?.ok\nstr not in $env?.[nil]\nstr not in $env?.foo\nstr not in $env?.foobar\nstr not in $env?.foobar?.[ok]\nstr not in [greet, $env]\nstr not in [nil, add]\nstr not in [nil, greet]\nstr not in [nil]\nstr not in array ?? 1\nstr not in foo\nstr not in foo != false\nstr not in foo && $env\nstr not in foo && $env || true\nstr not in foo && false\nstr not in foo ? 1.0 : i\nstr not in foo ?? $env\nstr not in foo ?? f64\nstr not in foo ?? foo\nstr not in foo and false\nstr not in foo and ok\nstr not in foo or $env?.[f64]\nstr not in foo || $env\nstr not in foo || ok\nstr not in foo || true\nstr not in groupBy(array, 1)\nstr not in groupBy(list, #)\nstr not in list ?? foo\nstr not in list?.[i]\nstr not in map(list, #.Bar)\nstr not in nil ?? $env\nstr not in reduce($env, $env, list)\nstr not in reverse(array)\nstr not in reverse(list)\nstr not in toPairs($env)\nstr not in {foo: $env}\nstr not in {foo: 0, foo: add}\nstr not in {foo: 1.0}\nstr not in {foo: add}\nstr not in {foo: array}\nstr not in {foo: foo, foo: list, foo: $env}\nstr not in {foo: foo}\nstr not in {foo: nil}\nstr not matches $env.str\nstr not matches $env?.Bar\nstr not matches $env?.String\nstr not matches $env?.[Bar]\nstr not matches $env?.[String]\nstr not matches $env?.[foobar]\nstr not matches $env?.[str]\nstr not matches $env?.foobar\nstr not matches $env?.foobar?.[str]\nstr not matches $env?.nil\nstr not matches $env?.str\nstr not matches foo.Bar\nstr not matches foo.String()\nstr not matches foo?.Bar\nstr not matches foo?.String()\nstr not matches greet(str)\nstr not matches lower(str)\nstr not matches str\nstr not matches str == $env\nstr not matches str ?: {foo: $env}\nstr not matches str || ok\nstr not matches string(1)\nstr not matches string(foo)\nstr not matches toJSON(1.0)\nstr not matches toJSON(f64)\nstr not matches toJSON(foo)\nstr not matches toJSON(i)\nstr not matches toJSON(nil)\nstr not matches toJSON(ok)\nstr not matches trimSuffix(str)\nstr not matches type(false)\nstr not matches type(true)\nstr not startsWith $env.str\nstr not startsWith $env?.$env?.[add]\nstr not startsWith $env?.Bar\nstr not startsWith $env?.String\nstr not startsWith $env?.[Bar]\nstr not startsWith $env?.[Bar]?.[i]\nstr not startsWith $env?.[Bar]?.i\nstr not startsWith $env?.[String]\nstr not startsWith $env?.[String]?.list\nstr not startsWith $env?.[foobar]?.[str]\nstr not startsWith $env?.[nil]\nstr not startsWith $env?.[str]\nstr not startsWith $env?.false?.[add]\nstr not startsWith $env?.nil\nstr not startsWith $env?.str\nstr not startsWith findLast($env, false)\nstr not startsWith foo.Bar\nstr not startsWith foo.String()\nstr not startsWith foo?.Bar\nstr not startsWith foo?.String()\nstr not startsWith greet(str)\nstr not startsWith last($env)\nstr not startsWith lower(str)\nstr not startsWith str\nstr not startsWith str ?: 1.0\nstr not startsWith str ?: ok\nstr not startsWith str and $env\nstr not startsWith string(false)\nstr not startsWith string(foo)\nstr not startsWith string(i)\nstr not startsWith string(nil)\nstr not startsWith string(ok)\nstr not startsWith toJSON(foo)\nstr not startsWith toJSON(true)\nstr not startsWith trimSuffix(string(foo))\nstr not startsWith type(0)\nstr not startsWith type(add)\nstr not startsWith type(f64)\nstr not startsWith type(i)\nstr not startsWith type(ok)\nstr not startsWith {foo: i}?.greet\nstr startsWith $env.str\nstr startsWith $env?.Bar\nstr startsWith $env?.String\nstr startsWith $env?.String?.[greet]\nstr startsWith $env?.String?.array\nstr startsWith $env?.[Bar]\nstr startsWith $env?.[String]\nstr startsWith $env?.[foobar]\nstr startsWith $env?.[str]\nstr startsWith $env?.foobar\nstr startsWith $env?.str\nstr startsWith first($env)\nstr startsWith foo.Bar\nstr startsWith foo.String()\nstr startsWith foo?.Bar\nstr startsWith foo?.String()\nstr startsWith greet(str)\nstr startsWith lower(type(array))\nstr startsWith str\nstr startsWith str && ok\nstr startsWith str ?? nil\nstr startsWith str[1:]\nstr startsWith string($env)\nstr startsWith string(1.0)\nstr startsWith string(add)\nstr startsWith toBase64(str)\nstr startsWith toJSON(1.0)\nstr startsWith toJSON(foo)\nstr startsWith toJSON(list)\nstr startsWith toJSON(true)\nstr startsWith type($env)\nstr startsWith type(add)\nstr startsWith type(foo)\nstr startsWith type(i)\nstr startsWith type(true)\nstr | date(str)\nstr | greet()\nstr | greet() != $env?.$env\nstr | greet() < str\nstr | greet() not in foo\nstr | hasPrefix($env?.[str])\nstr | hasPrefix(str)\nstr | hasSuffix(str)\nstr | indexOf(str)\nstr | indexOf(toJSON(foo))\nstr | lastIndexOf(str)\nstr | repeat(0)\nstr | repeat(1)\nstr | repeat(i)\nstr | split(str)\nstr | split(str, i)\nstr | splitAfter($env?.[str])\nstr | splitAfter($env?.str)\nstr | splitAfter(foo?.Bar)\nstr | splitAfter(str)\nstr | splitAfter(str, 1)\nstr | trim(nil ?? str)\nstr | trim(str)\nstr | trim(type(1.0))\nstr | trimPrefix(str)\nstr | trimPrefix(toJSON(ok))\nstr | trimPrefix(type(i))\nstr | trimSuffix(str)\nstr; $env | count(false)\nstr; $env?.[Bar]\nstr; $env?.add\nstr; $env?.ok\nstr; add\nstr; array\nstr; f64\nstr; foo\nstr; greet\nstr; i\nstr; ok\nstr; str\nstr; uniq(array)\nstr[$env?.i:]\nstr[-0:]\nstr[-1:]\nstr[0:] + str ?? i\nstr[1 ?? add:]\nstr[1.0 ?? foo:]\nstr[1:] endsWith str\nstr[1:] not contains str\nstr[1:] | greet()\nstr[:$env.i]\nstr[:$env?.i]\nstr[:-1]\nstr[:-i]\nstr[:0 % i]\nstr[:0] matches str\nstr[:]\nstr[:] <= str\nstr[:array | reduce(#)]\nstr[:array?.[i]]\nstr[:i]\nstr[:int(i)]\nstr[:last(array)]\nstr[:median(1, 1.0)]\nstr[:min(0)]\nstr[:nil ?? 0]\nstr[:sum(array)]\nstr[f64 ?? str:]\nstr[first(array):]\nstr[i:]\nstr[i:] endsWith str\nstr[i:] not endsWith str\nstr[i:i]\nstr[len(str):]\nstr[nil ?? 0:]\nstr[sum(array):]\nstring(!false)\nstring(!ok)\nstring(!true)\nstring($env != 0)\nstring($env != 1)\nstring($env != 1.0)\nstring($env != add)\nstring($env != f64)\nstring($env != false)\nstring($env != foo)\nstring($env != foo?.String())\nstring($env != greet)\nstring($env != i)\nstring($env != nil)\nstring($env != ok)\nstring($env != str)\nstring($env != true)\nstring($env && false)\nstring($env && true)\nstring($env == $env)\nstring($env == 1.0)\nstring($env == array)\nstring($env == f64)\nstring($env == false)\nstring($env == foo)\nstring($env == greet)\nstring($env == nil)\nstring($env == str)\nstring($env ?? $env)\nstring($env ?? 1)\nstring($env ?? 1.0)\nstring($env ?? add)\nstring($env ?? f64)\nstring($env ?? false)\nstring($env ?? foo)\nstring($env ?? list)\nstring($env ?? nil)\nstring($env ?? ok)\nstring($env ?? true)\nstring($env and true)\nstring($env in $env?.[Bar])\nstring($env in array)\nstring($env in list)\nstring($env not in array)\nstring($env or true)\nstring($env | all(false))\nstring($env | all(ok))\nstring($env | count(false))\nstring($env | count(ok))\nstring($env | count(true))\nstring($env | findIndex(ok))\nstring($env | findIndex(true))\nstring($env | findLastIndex(true))\nstring($env | map(#index))\nstring($env | map($env))\nstring($env | map(1))\nstring($env | map(array))\nstring($env | map(greet))\nstring($env | map(true))\nstring($env | none(ok))\nstring($env | one(ok))\nstring($env | one(true))\nstring($env | reduce($env, ok))\nstring($env | reduce(1, array))\nstring($env | reduce(f64, 1.0))\nstring($env | sum(0))\nstring($env | sum(1))\nstring($env | sum(1.0))\nstring($env | sum(f64))\nstring($env || false)\nstring($env || true)\nstring($env) ?? f64\nstring($env) ?? i\nstring($env) matches str\nstring($env) not in foo\nstring($env) not matches $env?.Bar\nstring($env) not matches str\nstring($env) not startsWith str\nstring($env) | greet()\nstring($env) | trimPrefix(str)\nstring($env)[:]\nstring($env)[i:]\nstring($env.add)\nstring($env.array)\nstring($env.f64)\nstring($env.foo)\nstring($env.greet)\nstring($env.i)\nstring($env.list)\nstring($env.ok)\nstring($env.str)\nstring($env?.$env)\nstring($env?.Bar)\nstring($env?.Bar?.[list])\nstring($env?.Bar?.[str])\nstring($env?.Bar?.greet)\nstring($env?.String)\nstring($env?.String?.Bar)\nstring($env?.String?.String)\nstring($env?.String?.list)\nstring($env?.[Bar])\nstring($env?.[Bar]?.Bar)\nstring($env?.[Bar]?.[i])\nstring($env?.[Bar]?.foobar)\nstring($env?.[String])\nstring($env?.[String]?.array)\nstring($env?.[String]?.str)\nstring($env?.[foobar])\nstring($env?.[nil])\nstring($env?.[str])\nstring($env?.add)\nstring($env?.array)\nstring($env?.f64)\nstring($env?.false)\nstring($env?.foo)\nstring($env?.foobar)\nstring($env?.greet)\nstring($env?.i)\nstring($env?.list)\nstring($env?.nil)\nstring($env?.ok)\nstring($env?.str)\nstring($env?.str[:])\nstring($env?.true)\nstring(-0)\nstring(-1 == nil)\nstring(-1)\nstring(-1.0)\nstring(-f64)\nstring(-i)\nstring(0 != 0)\nstring(0 != 1.0)\nstring(0 != i)\nstring(0 != nil)\nstring(0 % 1)\nstring(0 * 0)\nstring(0 * 1)\nstring(0 * f64)\nstring(0 * i)\nstring(0 ** 0)\nstring(0 ** 1)\nstring(0 ** 1.0)\nstring(0 ** f64)\nstring(0 ** i)\nstring(0 + 0)\nstring(0 + 1.0)\nstring(0 - 1)\nstring(0 - i)\nstring(0 .. 0)\nstring(0 .. i)\nstring(0 / $env.f64)\nstring(0 / 1)\nstring(0 < 0)\nstring(0 < 1)\nstring(0 < 1.0)\nstring(0 < f64)\nstring(0 <= 0)\nstring(0 <= 1.0)\nstring(0 <= f64)\nstring(0 <= i)\nstring(0 == $env)\nstring(0 == 1)\nstring(0 == f64)\nstring(0 == i)\nstring(0 == nil)\nstring(0 > 1)\nstring(0 > f64)\nstring(0 > i)\nstring(0 >= 1)\nstring(0 >= 1.0)\nstring(0 >= f64)\nstring(0 >= i)\nstring(0 ?? 1)\nstring(0 ?? 1.0)\nstring(0 ?? array)\nstring(0 ?? f64)\nstring(0 ?? foo)\nstring(0 ?? i)\nstring(0 ?? list)\nstring(0 ?? str)\nstring(0 ?? true)\nstring(0 ^ i)\nstring(0 | mean(f64))\nstring(0) >= str\nstring(0) ?? $env?.list\nstring(0) ?? 0 | find(true)\nstring(0) contains string(str)\nstring(0) not startsWith str\nstring(0) | greet()\nstring(0)[:]\nstring(0)[i:]\nstring(0..i)\nstring(1 != 1)\nstring(1 != 1.0)\nstring(1 != f64)\nstring(1 != nil)\nstring(1 % 1)\nstring(1 * 0)\nstring(1 * 0) ?? add\nstring(1 * 1.0)\nstring(1 * f64)\nstring(1 * i)\nstring(1 ** 0)\nstring(1 ** 1)\nstring(1 ** 1.0)\nstring(1 ** f64)\nstring(1 ** i)\nstring(1 + 1)\nstring(1 + i)\nstring(1 - 0)\nstring(1 - 1)\nstring(1 - 1.0)\nstring(1 - f64)\nstring(1 .. 0)\nstring(1 .. 1)\nstring(1 .. i)\nstring(1 / 0)\nstring(1 / 1)\nstring(1 / 1.0)\nstring(1 / f64)\nstring(1 < 0)\nstring(1 < 1.0)\nstring(1 < i)\nstring(1 <= 1.0)\nstring(1 <= f64)\nstring(1 <= i)\nstring(1 == $env)\nstring(1 == i)\nstring(1 == nil)\nstring(1 > $env?.i)\nstring(1 > 0)\nstring(1 > 1)\nstring(1 >= 1)\nstring(1 >= 1.0)\nstring(1 >= f64)\nstring(1 >= i)\nstring(1 ?? $env)\nstring(1 ?? 0)\nstring(1 ?? 1.0)\nstring(1 ?? array)\nstring(1 ?? f64)\nstring(1 ?? false)\nstring(1 ?? foo)\nstring(1 ?? i)\nstring(1 ?? nil)\nstring(1 ?? str)\nstring(1 ^ 1)\nstring(1 ^ 1.0)\nstring(1 ^ i)\nstring(1 not in array)\nstring(1 | min(1.0))\nstring(1) != str\nstring(1) + str\nstring(1) < foo?.Bar\nstring(1) == $env?.[Bar]\nstring(1) > foo?.Bar\nstring(1) ?? i\nstring(1) ?? list\nstring(1) ?? str\nstring(1) matches toJSON(false)\nstring(1) not in foo\nstring(1) not startsWith toJSON(1)\nstring(1) | greet()\nstring(1..i)\nstring(1.0 != $env)\nstring(1.0 != 0)\nstring(1.0 != 1.0)\nstring(1.0 != f64)\nstring(1.0 != nil)\nstring(1.0 * 0)\nstring(1.0 * 1)\nstring(1.0 * 1.0)\nstring(1.0 * f64)\nstring(1.0 * i)\nstring(1.0 ** 0)\nstring(1.0 ** 1)\nstring(1.0 ** 1.0)\nstring(1.0 ** f64)\nstring(1.0 ** i)\nstring(1.0 + 0)\nstring(1.0 + 1)\nstring(1.0 + 1.0)\nstring(1.0 + f64)\nstring(1.0 + i)\nstring(1.0 - 0)\nstring(1.0 - 1)\nstring(1.0 - 1.0)\nstring(1.0 - f64)\nstring(1.0 - i)\nstring(1.0 / 0)\nstring(1.0 / 1)\nstring(1.0 / 1.0)\nstring(1.0 / f64)\nstring(1.0 / i)\nstring(1.0 < 0)\nstring(1.0 < 1)\nstring(1.0 < 1.0)\nstring(1.0 <= 0)\nstring(1.0 <= 1)\nstring(1.0 <= 1.0)\nstring(1.0 <= i)\nstring(1.0 == $env)\nstring(1.0 == 0)\nstring(1.0 == 1)\nstring(1.0 == 1.0)\nstring(1.0 == f64)\nstring(1.0 == i)\nstring(1.0 == nil)\nstring(1.0 > 0)\nstring(1.0 > 1)\nstring(1.0 > 1.0)\nstring(1.0 > f64)\nstring(1.0 > i)\nstring(1.0 >= 0)\nstring(1.0 >= 1)\nstring(1.0 >= 1.0)\nstring(1.0 >= i)\nstring(1.0 ?? $env)\nstring(1.0 ?? 0)\nstring(1.0 ?? 1.0)\nstring(1.0 ?? array)\nstring(1.0 ?? false)\nstring(1.0 ?? foo)\nstring(1.0 ?? foo) not endsWith str\nstring(1.0 ?? list)\nstring(1.0 ?? nil)\nstring(1.0 ?? ok)\nstring(1.0 ?? true)\nstring(1.0 ^ 0)\nstring(1.0 ^ 1)\nstring(1.0 ^ 1.0)\nstring(1.0 ^ f64)\nstring(1.0 ^ i)\nstring(1.0 in array)\nstring(1.0 not in array)\nstring(1.0 | median(array))\nstring(1.0)\nstring(1.0) != str\nstring(1.0) >= str\nstring(1.0) >= string(i)\nstring(1.0) ?? add\nstring(1.0) endsWith str\nstring(1.0) in first($env)\nstring(1.0) not startsWith toJSON(false)\nstring(1.0) startsWith str\nstring(1.0) startsWith type(foo)\nstring(1.0) | greet()\nstring([$env, 0])\nstring([$env, foo])\nstring([$env, ok])\nstring([$env])\nstring([0, nil])\nstring([0])\nstring([1, true])\nstring([1.0, $env])\nstring([1.0])\nstring([1])\nstring([add, 1.0])\nstring([add])\nstring([array, i])\nstring([array])\nstring([f64, f64])\nstring([f64])\nstring([false, 1])\nstring([false])\nstring([foo])\nstring([greet, i])\nstring([greet])\nstring([i])\nstring([list, false])\nstring([list, list])\nstring([list])\nstring([nil, list])\nstring([nil])\nstring([ok, 1])\nstring([ok, list])\nstring([ok, nil])\nstring([ok])\nstring([str])\nstring([true, greet])\nstring([true, list])\nstring([true])\nstring(abs(0))\nstring(abs(1))\nstring(abs(1.0))\nstring(abs(f64))\nstring(abs(i))\nstring(add != $env)\nstring(add == add)\nstring(add == nil)\nstring(add ?? 1.0)\nstring(add ?? add)\nstring(add ?? f64)\nstring(add ?? foo)\nstring(add(1, 0))\nstring(add(1, 1))\nstring(add(1, i))\nstring(add)\nstring(add) ?? ok\nstring(add) in foo\nstring(add) matches str\nstring(add) | greet()\nstring(any($env, false))\nstring(any($env, ok))\nstring(any(array, false))\nstring(any(array, ok))\nstring(array != $env)\nstring(array != array)\nstring(array != list)\nstring(array != nil)\nstring(array == $env)\nstring(array == array)\nstring(array == list)\nstring(array == nil)\nstring(array ?? $env)\nstring(array ?? 1.0)\nstring(array ?? add)\nstring(array ?? f64)\nstring(array ?? foo)\nstring(array ?? i)\nstring(array | any(ok))\nstring(array | count(false))\nstring(array | findIndex(false))\nstring(array | findLast(false))\nstring(array | groupBy(i))\nstring(array | map(#))\nstring(array | map($env))\nstring(array | map(f64))\nstring(array | one(true))\nstring(array | reduce(#))\nstring(array | reduce(#acc))\nstring(array | reduce(add))\nstring(array | reduce(foo))\nstring(array | reduce(i))\nstring(array | reduce(list))\nstring(array | sortBy(#))\nstring(array | sortBy(i))\nstring(array | sum(#))\nstring(array | sum(1))\nstring(array | sum(f64))\nstring(array)\nstring(array) > str\nstring(array) >= foo.Bar\nstring(array) in map(array, $env)\nstring(array) matches str\nstring(array) not in foo\nstring(array) not startsWith str\nstring(array) startsWith str\nstring(array) | greet()\nstring(array)[:i]\nstring(array?.[i])\nstring(array[0:])\nstring(array[1:])\nstring(array[i:])\nstring(bitnot(0))\nstring(bitnot(1))\nstring(bitnot(i))\nstring(ceil(0))\nstring(ceil(1))\nstring(ceil(1.0))\nstring(ceil(f64))\nstring(ceil(i))\nstring(concat(array))\nstring(concat(list))\nstring(count($env, false))\nstring(count($env, ok))\nstring(count(list, ok))\nstring(f64 != $env)\nstring(f64 != f64)\nstring(f64 != nil)\nstring(f64 * 1)\nstring(f64 * 1.0)\nstring(f64 * f64)\nstring(f64 * i)\nstring(f64 ** 0)\nstring(f64 ** 1.0)\nstring(f64 ** i)\nstring(f64 + 1)\nstring(f64 + 1.0)\nstring(f64 + f64)\nstring(f64 + i)\nstring(f64 - 1)\nstring(f64 - i)\nstring(f64 / 0)\nstring(f64 / 1.0)\nstring(f64 < 1)\nstring(f64 < 1.0)\nstring(f64 < f64)\nstring(f64 <= f64)\nstring(f64 == $env)\nstring(f64 == 0)\nstring(f64 == 1)\nstring(f64 == 1.0)\nstring(f64 == nil)\nstring(f64 > 0)\nstring(f64 > 1)\nstring(f64 > 1.0)\nstring(f64 > f64)\nstring(f64 > i)\nstring(f64 >= 0)\nstring(f64 >= 1)\nstring(f64 >= 1.0)\nstring(f64 >= i)\nstring(f64 ?? $env)\nstring(f64 ?? add)\nstring(f64 ?? array)\nstring(f64 ?? f64)\nstring(f64 ?? false)\nstring(f64 ?? foo)\nstring(f64 ?? i)\nstring(f64 ?? nil)\nstring(f64 ^ 1.0)\nstring(f64 ^ i)\nstring(f64 not in array)\nstring(f64)\nstring(f64) + str\nstring(f64) < str\nstring(f64) <= str\nstring(f64) >= str\nstring(f64) ?? $env.ok\nstring(f64) ?? [foo]\nstring(false != $env)\nstring(false != false)\nstring(false != nil)\nstring(false != true)\nstring(false && $env)\nstring(false && ok)\nstring(false == $env)\nstring(false == false)\nstring(false == nil)\nstring(false == true)\nstring(false ? foo : 1)\nstring(false ?: i)\nstring(false ?? $env)\nstring(false ?? 1.0)\nstring(false ?? f64)\nstring(false ?? foo)\nstring(false ?? nil)\nstring(false and $env)\nstring(false and false)\nstring(false or $env)\nstring(false or false)\nstring(false or ok)\nstring(false || $env)\nstring(false) + foo?.Bar\nstring(false) < str\nstring(false) == foo.Bar\nstring(false) in $env?.[String]\nstring(false) not contains str\nstring(false) startsWith str\nstring(false) | greet()\nstring(find(array, false))\nstring(find(list, ok))\nstring(find(list, true))\nstring(findIndex($env, true))\nstring(findIndex(list, false))\nstring(findLast(list, false))\nstring(findLast(list, ok))\nstring(findLastIndex($env, false))\nstring(findLastIndex(list, false))\nstring(findLastIndex(list, ok))\nstring(first($env))\nstring(first(array))\nstring(first(list))\nstring(first(list)?.Bar)\nstring(flatten(array))\nstring(flatten(list))\nstring(float(0))\nstring(float(1))\nstring(float(1.0))\nstring(float(f64 * 1.0))\nstring(float(f64))\nstring(float(i))\nstring(floor(0))\nstring(floor(1))\nstring(floor(1.0))\nstring(floor(f64))\nstring(floor(i))\nstring(foo != $env)\nstring(foo != foo)\nstring(foo != nil)\nstring(foo == $env)\nstring(foo == foo)\nstring(foo == nil)\nstring(foo ?? $env)\nstring(foo ?? 0)\nstring(foo ?? 1.0)\nstring(foo ?? add)\nstring(foo ?? array)\nstring(foo ?? f64)\nstring(foo ?? false)\nstring(foo ?? foo)\nstring(foo ?? foo) ?? list\nstring(foo ?? greet)\nstring(foo ?? i)\nstring(foo ?? list)\nstring(foo ?? ok)\nstring(foo ?? true)\nstring(foo in list)\nstring(foo not in list)\nstring(foo)\nstring(foo) != $env?.Bar\nstring(foo) != $env?.foobar\nstring(foo) < str\nstring(foo) == str\nstring(foo) > str\nstring(foo) >= str\nstring(foo) ?? array\nstring(foo) ?? i\nstring(foo) ?? list\nstring(foo) ?? ok\nstring(foo) contains str\nstring(foo) contains toJSON(foo)\nstring(foo) in list?.[i]\nstring(foo) matches str\nstring(foo) not endsWith type(str)\nstring(foo) not in foo\nstring(foo) not matches greet(str)\nstring(foo) startsWith str\nstring(foo) | greet()\nstring(foo)[:]\nstring(foo.Bar)\nstring(foo.String())\nstring(foo.String)\nstring(foo?.Bar)\nstring(foo?.Bar) not in foo\nstring(foo?.String())\nstring(foo?.String)\nstring(get(list, 1))\nstring(greet != $env)\nstring(greet != greet)\nstring(greet != nil)\nstring(greet == greet)\nstring(greet ?? 0)\nstring(greet ?? 1.0)\nstring(greet ?? add)\nstring(greet ?? f64)\nstring(greet ?? foo)\nstring(greet ?? greet)\nstring(greet(str))\nstring(greet)\nstring(greet) + str\nstring(greet) ?? {foo: 0}\nstring(greet) not in foo\nstring(greet) not matches str\nstring(greet) startsWith $env?.[str]\nstring(greet) | greet()\nstring(groupBy(array, #))\nstring(groupBy(array, 0))\nstring(groupBy(list, 1.0))\nstring(groupBy(list, false))\nstring(groupBy(list, ok)?.greet)\nstring(groupBy(list, str))\nstring(i != $env)\nstring(i != 0)\nstring(i != 1)\nstring(i != 1.0)\nstring(i != nil)\nstring(i % 1)\nstring(i * 0)\nstring(i * 1.0)\nstring(i ** 0)\nstring(i ** 1.0)\nstring(i ** f64)\nstring(i ** i)\nstring(i + 0)\nstring(i + 1)\nstring(i + 1.0)\nstring(i + f64)\nstring(i + i)\nstring(i - 1)\nstring(i - 1.0)\nstring(i - f64)\nstring(i - i)\nstring(i .. 0)\nstring(i .. 1)\nstring(i / 0)\nstring(i / f64)\nstring(i / i)\nstring(i < 0)\nstring(i <= f64)\nstring(i == $env)\nstring(i == 1)\nstring(i == 1.0)\nstring(i == f64)\nstring(i == nil)\nstring(i > 0)\nstring(i > 1)\nstring(i > f64)\nstring(i >= 1.0)\nstring(i >= i)\nstring(i ?? $env)\nstring(i ?? f64)\nstring(i ?? false)\nstring(i ?? foo)\nstring(i ?? i)\nstring(i ?? list)\nstring(i ?? ok)\nstring(i ?? true)\nstring(i ^ 1)\nstring(i ^ 1.0)\nstring(i ^ f64)\nstring(i ^ i)\nstring(i in array)\nstring(i not in array)\nstring(i | bitshr(i))\nstring(i | min(1.0, 1.0))\nstring(i)\nstring(i) ?? i\nstring(i) ?? toJSON(array)\nstring(i) not endsWith str\nstring(i) not in foo\nstring(i) | greet()\nstring(i) | indexOf(str)\nstring(i)[:]\nstring(if false ?? list { $env?.f64 } else { f64 })\nstring(if false { foo } else { false })\nstring(if false { ok } else { i })\nstring(if ok { 0 } else { str })\nstring(if ok { 1 } else { 1.0 })\nstring(if true { 1 } else { $env })\nstring(if true { 1.0 } else { foo })\nstring(if true { list } else { 0 })\nstring(if true { str } else { 1.0 })\nstring(int(0))\nstring(int(1))\nstring(int(1.0))\nstring(int(f64))\nstring(int(i))\nstring(keys($env))\nstring(last($env))\nstring(last(array))\nstring(last(list))\nstring(len($env))\nstring(len(array))\nstring(len(list))\nstring(len(str))\nstring(let foobar = 1.0; foobar + foobar)\nstring(let x = foo; x)\nstring(let z = 0; let x = foo; z)\nstring(list != $env)\nstring(list != array)\nstring(list != list)\nstring(list != nil)\nstring(list == $env)\nstring(list == array)\nstring(list == list)\nstring(list == nil)\nstring(list ?? $env)\nstring(list ?? 1.0)\nstring(list ?? false)\nstring(list ?? foo)\nstring(list ?? greet)\nstring(list ?? i)\nstring(list ?? list)\nstring(list ?? nil)\nstring(list ?? true)\nstring(list | concat(array))\nstring(list | count(true))\nstring(list | findIndex(ok))\nstring(list | groupBy(#))\nstring(list | groupBy(0))\nstring(list | groupBy(1))\nstring(list | groupBy(1.0))\nstring(list | groupBy(ok))\nstring(list | map(.Bar))\nstring(list | map(.String))\nstring(list | map(greet))\nstring(list | map(i))\nstring(list | one(false))\nstring(list | reduce(#))\nstring(list | reduce(#.String))\nstring(list | reduce(#index))\nstring(list | reduce(.String))\nstring(list | reduce(1))\nstring(list | reduce(false))\nstring(list | sortBy(1.0))\nstring(list)\nstring(list) != str ?? true\nstring(list) > str\nstring(list) ?? add\nstring(list) not contains str\nstring(list) not contains str ?? add\nstring(list) not startsWith str\nstring(list) startsWith str\nstring(list) | greet()\nstring(list) | split(str)\nstring(list?.[0])\nstring(list?.[i])\nstring(list?.[i]?.String)\nstring(list[1:])\nstring(list[:0])\nstring(list[i:])\nstring(lower(str))\nstring(map($env, $env))\nstring(map($env, 1.0))\nstring(map($env, add))\nstring(map($env, f64))\nstring(map($env, false))\nstring(map($env, foo))\nstring(map($env, i))\nstring(map($env, true))\nstring(map(array, #index))\nstring(map(array, add))\nstring(map(array, f64))\nstring(map(array, greet))\nstring(map(array, str))\nstring(map(list, $env))\nstring(map(list, greet))\nstring(map(list, list))\nstring(map(list, true))\nstring(max($env))\nstring(max(0))\nstring(max(1))\nstring(max(1.0))\nstring(max(array))\nstring(max(f64))\nstring(max(f64, 0))\nstring(max(i))\nstring(mean(0))\nstring(mean(1))\nstring(mean(1.0))\nstring(mean(array))\nstring(mean(f64))\nstring(mean(i))\nstring(median(0))\nstring(median(1))\nstring(median(1.0))\nstring(median(1.0, 0))\nstring(median(array))\nstring(median(f64))\nstring(median(i))\nstring(median(i, 0))\nstring(median(round(i)))\nstring(min($env))\nstring(min(0))\nstring(min(0, 1.0))\nstring(min(1))\nstring(min(1, f64))\nstring(min(1.0))\nstring(min(1.0, 0))\nstring(min(1.0, array))\nstring(min(array))\nstring(min(f64))\nstring(min(i))\nstring(min(i, 1.0))\nstring(nil != $env)\nstring(nil != 0)\nstring(nil != 1.0)\nstring(nil != foo)\nstring(nil != list)\nstring(nil != nil)\nstring(nil != ok)\nstring(nil != str)\nstring(nil == $env)\nstring(nil == 0)\nstring(nil == 1.0)\nstring(nil == add)\nstring(nil == array)\nstring(nil == f64)\nstring(nil == foo)\nstring(nil == greet)\nstring(nil == i)\nstring(nil == list)\nstring(nil == nil)\nstring(nil == nil) <= str\nstring(nil == ok)\nstring(nil == true)\nstring(nil ?? 0)\nstring(nil ?? 1.0)\nstring(nil ?? add)\nstring(nil ?? array)\nstring(nil ?? foo)\nstring(nil ?? i)\nstring(nil ?? nil)\nstring(nil ?? true)\nstring(nil in $env)\nstring(nil in array)\nstring(nil in list)\nstring(nil not in $env)\nstring(nil not in $env?.array)\nstring(nil not in array)\nstring(nil not in list)\nstring(nil) != $env?.[String]\nstring(nil) != str\nstring(nil) == toJSON(nil)\nstring(nil) > str\nstring(nil) >= str\nstring(nil) ?? f64\nstring(nil) ?? greet\nstring(nil) ?? list\nstring(nil) contains str\nstring(nil) in foo\nstring(nil) not matches greet(str)\nstring(nil) not matches str\nstring(nil) not startsWith str\nstring(nil) | greet()\nstring(nil) | trimSuffix(str)\nstring(nil)[:i]\nstring(nil)[i:]\nstring(none($env, ok))\nstring(none(list, true))\nstring(not false)\nstring(not ok)\nstring(not true)\nstring(ok != $env)\nstring(ok != ok)\nstring(ok && $env)\nstring(ok && ok)\nstring(ok && true)\nstring(ok == $env)\nstring(ok == false)\nstring(ok == nil)\nstring(ok == ok)\nstring(ok ? $env : $env)\nstring(ok ? $env : str)\nstring(ok ? foo : nil)\nstring(ok ? foo : ok)\nstring(ok ? true : $env)\nstring(ok ?: add)\nstring(ok ?: f64)\nstring(ok ?: foo)\nstring(ok ?: list)\nstring(ok ?? $env)\nstring(ok ?? $env?.[i])\nstring(ok ?? foo)\nstring(ok ?? i)\nstring(ok and $env)\nstring(ok and $env?.[Bar])\nstring(ok and ok)\nstring(ok and true)\nstring(ok or $env)\nstring(ok or ok)\nstring(ok or true)\nstring(ok || $env)\nstring(ok || false)\nstring(ok)\nstring(ok) >= str\nstring(ok) contains str\nstring(ok) in foo\nstring(ok) matches str\nstring(ok) matches trimPrefix(str)\nstring(ok) | greet()\nstring(ok) | indexOf(str)\nstring(ok); ok\nstring(ok)[1.0 ?? 1:]\nstring(ok)[:]\nstring(one($env, false))\nstring(reduce(array, #))\nstring(reduce(array, 1.0))\nstring(reduce(array, add))\nstring(reduce(array, foo))\nstring(reduce(array, greet))\nstring(reduce(array, i))\nstring(reduce(array, list))\nstring(reduce(list, #))\nstring(reduce(list, .Bar))\nstring(reduce(list, foo))\nstring(reduce(list, greet))\nstring(reduce(list, ok, 1.0))\nstring(reverse(array))\nstring(round(0))\nstring(round(1))\nstring(round(1.0))\nstring(round(f64))\nstring(round(i))\nstring(sort($env))\nstring(sort(array))\nstring(sort(ok ? foo : 1.0))\nstring(sortBy(array, #))\nstring(sortBy(list, .Bar))\nstring(sortBy(list, f64))\nstring(str != $env)\nstring(str < str)\nstring(str <= str)\nstring(str == $env)\nstring(str == $env?.[Bar])\nstring(str == nil)\nstring(str == str)\nstring(str > foo.Bar)\nstring(str ?? add)\nstring(str ?? ok)\nstring(str ?? true)\nstring(str contains str)\nstring(str in $env)\nstring(str in $env?.Bar)\nstring(str in foo)\nstring(str not contains $env?.[str])\nstring(str not in $env)\nstring(str not in foo)\nstring(str not matches str)\nstring(str | greet())\nstring(str)\nstring(str) != str\nstring(str) + str\nstring(str) contains str\nstring(str) in foo\nstring(str) matches str\nstring(str) not contains str\nstring(str) | greet()\nstring(str)[:]\nstring(str[:0])\nstring(str[:1])\nstring(str[:i])\nstring(string($env))\nstring(string(0))\nstring(string(1))\nstring(string(1.0))\nstring(string(add))\nstring(string(array))\nstring(string(f64))\nstring(string(false))\nstring(string(foo))\nstring(string(greet))\nstring(string(i))\nstring(string(list))\nstring(string(nil))\nstring(string(ok))\nstring(string(str))\nstring(string(true))\nstring(sum($env, 0))\nstring(sum($env, 1.0))\nstring(sum(array))\nstring(sum(array, #))\nstring(sum(list, 0))\nstring(toBase64(str))\nstring(toJSON(0))\nstring(toJSON(1))\nstring(toJSON(1.0))\nstring(toJSON(array))\nstring(toJSON(f64))\nstring(toJSON(false))\nstring(toJSON(foo))\nstring(toJSON(list))\nstring(toJSON(nil))\nstring(toJSON(ok))\nstring(toJSON(str))\nstring(toJSON(true))\nstring(toPairs($env))\nstring(trim(str))\nstring(trimPrefix(str))\nstring(trimSuffix(str))\nstring(true != $env)\nstring(true != false)\nstring(true != nil)\nstring(true != ok)\nstring(true != true)\nstring(true && $env)\nstring(true && false)\nstring(true == $env)\nstring(true == false)\nstring(true == nil)\nstring(true == true)\nstring(true ? $env : f64)\nstring(true ? add : nil)\nstring(true ? false : greet)\nstring(true ? false : i)\nstring(true ? foo : $env)\nstring(true ? str : add)\nstring(true ?: $env)\nstring(true ?: nil)\nstring(true ?: ok)\nstring(true ?? 0)\nstring(true ?? array)\nstring(true ?? foo)\nstring(true ?? i)\nstring(true ?? list)\nstring(true and $env)\nstring(true and false)\nstring(true and ok)\nstring(true or false)\nstring(true or ok)\nstring(true || $env)\nstring(true || ok)\nstring(true || true)\nstring(true) + str\nstring(true) ?? array | groupBy(foo)\nstring(type($env))\nstring(type(0))\nstring(type(1))\nstring(type(1.0))\nstring(type(add))\nstring(type(array))\nstring(type(f64))\nstring(type(false))\nstring(type(foo))\nstring(type(greet))\nstring(type(list))\nstring(type(nil))\nstring(type(ok))\nstring(type(str))\nstring(type(true))\nstring(uniq(array))\nstring(uniq(list))\nstring(upper(str))\nstring(values($env))\nstring({foo: $env, foo: $env}?.f64)\nstring({foo: $env, foo: nil})\nstring({foo: $env})\nstring({foo: 0})\nstring({foo: 1.0, foo: list})\nstring({foo: 1.0})\nstring({foo: 1})\nstring({foo: add ?? $env})\nstring({foo: add, foo: 1.0})\nstring({foo: add})\nstring({foo: array, foo: 1.0, foo: list})\nstring({foo: array})\nstring({foo: f64, foo: 1.0, foo: foo})\nstring({foo: f64, foo: 1.0})\nstring({foo: f64})\nstring({foo: false, foo: array})\nstring({foo: false})\nstring({foo: foo, foo: 1})\nstring({foo: foo, foo: array})\nstring({foo: foo, foo: list})\nstring({foo: foo, foo: str})\nstring({foo: foo})\nstring({foo: greet, foo: 1.0})\nstring({foo: greet, foo: foo})\nstring({foo: greet})\nstring({foo: i, foo: $env})\nstring({foo: i})\nstring({foo: list})\nstring({foo: nil, foo: $env})\nstring({foo: nil, foo: 1})\nstring({foo: nil, foo: foo})\nstring({foo: nil, foo: list})\nstring({foo: nil, foo: ok})\nstring({foo: nil})\nstring({foo: ok, foo: false, foo: list})\nstring({foo: ok, foo: ok, foo: array})\nstring({foo: ok, foo: str})\nstring({foo: ok})\nstring({foo: str})\nstring({foo: true})\nstring({foo: true}?.array)\nsum($env ?? greet, f64)\nsum($env | filter(false))\nsum($env | filter(false), reduce(#, #))\nsum($env | map(#index))\nsum($env | map(0))\nsum($env | map(1))\nsum($env | map(1.0))\nsum($env | map(f64))\nsum($env | map(i))\nsum($env | map(str), f64)\nsum($env | reduce(#acc, str))\nsum($env | reduce(array, 0))\nsum($env) or true ? foo : array\nsum($env, 0) in array\nsum($env, 0) | max(i)\nsum($env, 0) | median(1.0)\nsum($env, 1) != f64\nsum($env, 1) >= 1.0 >= 1.0\nsum($env, 1) >= i\nsum($env, 1.0) ** 1 ^ 1\nsum($env, 1.0) / -0\nsum($env, 1.0) >= f64\nsum($env, 1.0) ?? add\nsum($env, 1.0) ?? str\nsum($env, f64) != sum(array)\nsum($env, f64) ** f64 + f64\nsum($env, f64) ?? add\nsum($env, f64) | max(i)\nsum($env, i) <= abs(1.0)\nsum($env, i) ^ i\nsum($env, ok) or not false\nsum($env.array | sortBy(#))\nsum($env.array | sortBy(i))\nsum($env.array)\nsum($env.array, # ** #)\nsum($env.array, #)\nsum($env.array, f64)\nsum($env.array, i)\nsum($env.list, abs(1.0))\nsum($env.list, f64)\nsum($env.list, i)\nsum($env?.[str])\nsum($env?.[str]) != ok\nsum($env?.[str], #)\nsum($env?.[str], f64)\nsum($env?.[str], i)\nsum($env?.array)\nsum($env?.array) ?? add\nsum($env?.array, #)\nsum($env?.array, i)\nsum($env?.array, i) <= i\nsum($env?.list, f64 + 1.0)\nsum(0 .. 0)\nsum(0 .. 1)\nsum(0 .. i)\nsum(0..i)\nsum(1 .. 0)\nsum(1 .. 0, #)\nsum(1 .. 1)\nsum(1 .. i)\nsum(1..i)\nsum(1..i, # + #)\nsum(1..i, f64)\nsum([$env, add], f64)\nsum([-1])\nsum([0, 0])\nsum([0])\nsum([1, 0])\nsum([1, 1.0])\nsum([1.0, 0])\nsum([1.0, 1.0])\nsum([1.0, 1.0], #)\nsum([1.0, 1])\nsum([1.0, 1], f64)\nsum([1.0, f64])\nsum([1.0])\nsum([1.0], #)\nsum([1.0], i)\nsum([1])\nsum([1], 1 / #)\nsum([f64, 0])\nsum([f64, 1.0])\nsum([f64])\nsum([f64], i)\nsum([foo], f64)\nsum([i])\nsum([nil], 1.0 + i)\nsum([ok], f64)\nsum([ok], i)\nsum([str, str])\nsum([true], i)\nsum(array ?? 0, min(1))\nsum(array ?? 1)\nsum(array ?? 1.0)\nsum(array ?? add)\nsum(array ?? add, #)\nsum(array ?? array)\nsum(array ?? f64)\nsum(array ?? false)\nsum(array ?? foo)\nsum(array ?? greet)\nsum(array ?? i)\nsum(array ?? list)\nsum(array ?? nil)\nsum(array ?? str)\nsum(array ?? true)\nsum(array | filter(false))\nsum(array | filter(ok))\nsum(array | filter(true))\nsum(array | map(#))\nsum(array | map(#index))\nsum(array | map(0))\nsum(array | map(1))\nsum(array | map(1.0))\nsum(array | map(f64))\nsum(array | map(i))\nsum(array | map(i), i)\nsum(array | sortBy(#))\nsum(array | sortBy(0))\nsum(array | sortBy(1))\nsum(array | sortBy(1.0))\nsum(array | sortBy(i))\nsum(array | sortBy(str))\nsum(array | take(0))\nsum(array)\nsum(array) != f64\nsum(array) != i\nsum(array) != i ** 1.0\nsum(array) % i\nsum(array) * f64\nsum(array) * i\nsum(array) ** f64\nsum(array) ** i\nsum(array) + $env.f64\nsum(array) + f64\nsum(array) + i\nsum(array) - 0 > 1.0\nsum(array) - ceil(0)\nsum(array) - f64\nsum(array) - i\nsum(array) .. i\nsum(array) / f64\nsum(array) < f64\nsum(array) < i\nsum(array) <= f64\nsum(array) <= i\nsum(array) <= i || $env\nsum(array) <= max(array)\nsum(array) == f64\nsum(array) == i\nsum(array) > f64\nsum(array) > reduce(array, i)\nsum(array) >= f64 != true\nsum(array) >= i\nsum(array) ?? all($env, #)\nsum(array) ?? f64\nsum(array) ?? foo\nsum(array) ?? list\nsum(array) ?? ok\nsum(array) ?? str\nsum(array) ?? {foo: true}\nsum(array) ^ f64\nsum(array) ^ i\nsum(array) ^ round(1)\nsum(array) not in $env.array\nsum(array) not in array\nsum(array) | bitnand(i)\nsum(array) | bitor(i)\nsum(array) | bitushr(0)\nsum(array) | bitxor(0)\nsum(array) | max(array)\nsum(array) | mean(1)\nsum(array) | mean(1.0)\nsum(array) | min(i)\nsum(array)..i\nsum(array); f64\nsum(array, # % #)\nsum(array, # ** #)\nsum(array, # ** i)\nsum(array, # + #)\nsum(array, # - 0)\nsum(array, # / f64)\nsum(array, #)\nsum(array, #) * i\nsum(array, #) ** f64\nsum(array, #) <= i\nsum(array, #) <= i ?? 1.0\nsum(array, #) ?? foo\nsum(array, #) not in array\nsum(array, $env.f64)\nsum(array, $env.i)\nsum(array, $env?.f64)\nsum(array, $env?.i)\nsum(array, -#)\nsum(array, -0)\nsum(array, -1)\nsum(array, -1.0)\nsum(array, 0 ** f64)\nsum(array, 1 - #)\nsum(array, 1 ?? i)\nsum(array, 1) != i\nsum(array, 1) .. array?.[i]\nsum(array, 1) ?? i\nsum(array, 1) ^ i\nsum(array, 1.0 ** #)\nsum(array, 1.0 / #)\nsum(array, 1.0 ?? foo)\nsum(array, 1.0) * mean(i, 0)\nsum(array, 1.0) - f64\nsum(array, 1.0) == f64\nsum(array, abs(#))\nsum(array, array | reduce(f64))\nsum(array, array?.[i])\nsum(array, bitnot(#))\nsum(array, bitshr(#, #))\nsum(array, bitushr(#, #))\nsum(array, ceil(f64))\nsum(array, f64)\nsum(array, f64) + int(i)\nsum(array, f64) == i\nsum(array, f64) > i\nsum(array, f64) ^ i\nsum(array, float(# | bitxor(#)))\nsum(array, float(#))\nsum(array, float(1.0))\nsum(array, floor(0))\nsum(array, floor(f64))\nsum(array, i + 1.0)\nsum(array, i)\nsum(array, int(i))\nsum(array, max(#, #))\nsum(array, mean(array))\nsum(array, nil ?? #)\nsum(array, round(#))\nsum(array, round(1.0))\nsum(array, sum($env, 1))\nsum(array, sum(array, #))\nsum(array, true ? 0 : 0)\nsum(array[0:])\nsum(array[1:])\nsum(array[:0])\nsum(array[:1])\nsum(array[:i])\nsum(array[i:])\nsum(concat(array))\nsum(concat(array), #)\nsum(concat(array, array))\nsum(false ? $env : $env, f64)\nsum(false ? $env : array)\nsum(false ? i : str)\nsum(false ? nil : array)\nsum(false ? str : array)\nsum(false ?: array)\nsum(false ?: str)\nsum(filter($env, false))\nsum(filter($env, false), .add?.str(false, false))\nsum(filter(array, false))\nsum(filter(array, ok), f64)\nsum(filter(array, ok), i)\nsum(filter(array, true))\nsum(filter(list, false))\nsum(flatten(array))\nsum(flatten(array), max(#))\nsum(flatten(sort(str ?? 1)))\nsum(get($env, str))\nsum(i .. 0)\nsum(i .. 1)\nsum(i .. i)\nsum(i..i)\nsum(if false { 1 } else { array })\nsum(if false { array } else { array })\nsum(if false { foo } else { str })\nsum(if ok { array } else { 1 })\nsum(if ok { str } else { f64 })\nsum(if true { array } else { 1.0 })\nsum(if true { array } else { list })\nsum(let foobar = array; foobar)\nsum(let y = array; y)\nsum(list | filter(false))\nsum(list | map(#index))\nsum(list | map(0))\nsum(list | map(1))\nsum(list | map(1.0))\nsum(list | map(f64))\nsum(list | map(greet), i)\nsum(list | map(i))\nsum(list | reduce($env), i)\nsum(list | reduce(array))\nsum(list | sortBy(str), f64)\nsum(list, $env.f64)\nsum(list, $env.i)\nsum(list, $env?.f64)\nsum(list, $env?.i)\nsum(list, -1.0)\nsum(list, 0 * 1.0)\nsum(list, 0 ?? #)\nsum(list, 0 ?? str)\nsum(list, 0) ** f64\nsum(list, 0) ?? array\nsum(list, 1 ^ 0)\nsum(list, 1) | bitxor(0)\nsum(list, 1.0 ** i)\nsum(list, 1.0 / 1.0)\nsum(list, 1.0 ?? str)\nsum(list, f64 * 0)\nsum(list, f64 ** 0)\nsum(list, f64 - 1.0)\nsum(list, f64 - f64)\nsum(list, f64)\nsum(list, f64) ?? 1.0 ?? list\nsum(list, f64) | mean(f64)\nsum(list, i + 0)\nsum(list, i / 0)\nsum(list, i ?? true)\nsum(list, i)\nsum(list, i) ** i\nsum(list, int(i))\nsum(list, len($env))\nsum(list, len(str))\nsum(list, list | sum(1.0))\nsum(list, max(0))\nsum(list, mean(i))\nsum(list, round(1.0))\nsum(list[i:0])\nsum(list[i:i])\nsum(map($env, #index))\nsum(map($env, $env), i)\nsum(map($env, 0) | sortBy(1.0))\nsum(map($env, 0))\nsum(map($env, 1))\nsum(map($env, 1.0))\nsum(map($env, f64))\nsum(map($env, i))\nsum(map(array, #))\nsum(map(array, #index))\nsum(map(array, 0))\nsum(map(array, 1))\nsum(map(array, 1.0))\nsum(map(array, f64))\nsum(map(list, #index))\nsum(map(list, 0))\nsum(map(list, 1))\nsum(map(list, 1.0))\nsum(map(list, f64))\nsum(map(list, i))\nsum(max($env).array)\nsum(max($env?.[str]))\nsum(min($env), f64)\nsum(nil ?? array)\nsum(ok ? array : false)\nsum(ok ? array : foo)\nsum(reduce($env, array, $env))\nsum(reduce($env, array, nil))\nsum(reduce(array, array))\nsum(reduce(array, array, false))\nsum(reduce(list, array))\nsum(reverse(array))\nsum(sort($env))\nsum(sort($env), #.Bar)\nsum(sort($env), #.add % 1)\nsum(sort($env), #.add not in #.add)\nsum(sort($env), $env == #)\nsum(sort($env), .array?.foobar)\nsum(sort($env), .list)\nsum(sort($env), 1.0 ?? #.greet)\nsum(sort($env), any(#, #.String))\nsum(sort($env?.String))\nsum(sort(array))\nsum(sort(ok ? i : 1.0))\nsum(sortBy(array, #))\nsum(sortBy(array, 0))\nsum(sortBy(array, 1))\nsum(sortBy(array, 1.0))\nsum(sortBy(array, f64))\nsum(sortBy(array, i))\nsum(sortBy(array, str))\nsum(str ?? $env)\nsum(str ?? 0)\nsum(str ?? 1)\nsum(str ?? 1, #)\nsum(str ?? 1.0)\nsum(str ?? add)\nsum(str ?? array)\nsum(str ?? f64)\nsum(str ?? false)\nsum(str ?? false, #)\nsum(str ?? false, f64)\nsum(str ?? foo)\nsum(str ?? greet)\nsum(str ?? i)\nsum(str ?? list)\nsum(str ?? ok)\nsum(str ?? true)\nsum(string($env) ?? array)\nsum(take(array, i))\nsum(toPairs($env), i)\nsum(true ? str : 1.0)\nsum(true ? str : add)\nsum(true ? str : foo)\nsum(uniq(array))\nsum(uniq(array), 1.0 - 0)\ntake(array, $env?.i)\ntake(array, i)\ntake(list, i)\ntoBase64($env.foo?.Bar)\ntoBase64($env.str)\ntoBase64($env?.[str])\ntoBase64($env?.str)\ntoBase64(foo.Bar)\ntoBase64(foo.String())\ntoBase64(foo?.Bar ?? foo)\ntoBase64(foo?.Bar)\ntoBase64(foo?.Bar)[:]\ntoBase64(foo?.String())\ntoBase64(greet(str))\ntoBase64(lower(str))\ntoBase64(reduce(list, str))\ntoBase64(str + str)\ntoBase64(str ?? $env)\ntoBase64(str ?? 1)\ntoBase64(str ?? array)\ntoBase64(str ?? i)\ntoBase64(str ?? nil)\ntoBase64(str ?? ok)\ntoBase64(str | greet())\ntoBase64(str)\ntoBase64(str) < str\ntoBase64(str) > str\ntoBase64(str) >= str\ntoBase64(str) ?? array\ntoBase64(str) endsWith first($env)\ntoBase64(str) in foo ?? 0\ntoBase64(str) not contains $env?.str\ntoBase64(str) not matches $env?.Bar\ntoBase64(str) not startsWith str\ntoBase64(str) | greet()\ntoBase64(str) | repeat(i)\ntoBase64(str)[i:]\ntoBase64(str[:0])\ntoBase64(str[:1])\ntoBase64(str[:i])\ntoBase64(str[i:])\ntoBase64(string($env))\ntoBase64(string(0))\ntoBase64(string(1))\ntoBase64(string(1.0))\ntoBase64(string(add))\ntoBase64(string(array))\ntoBase64(string(f64))\ntoBase64(string(false))\ntoBase64(string(foo))\ntoBase64(string(foo?.Bar))\ntoBase64(string(greet))\ntoBase64(string(i))\ntoBase64(string(list))\ntoBase64(string(nil))\ntoBase64(string(ok))\ntoBase64(string(str))\ntoBase64(toBase64(str))\ntoBase64(toJSON(0))\ntoBase64(toJSON(1.0))\ntoBase64(toJSON(array))\ntoBase64(toJSON(f64))\ntoBase64(toJSON(false))\ntoBase64(toJSON(foo))\ntoBase64(toJSON(i / 1))\ntoBase64(toJSON(i))\ntoBase64(toJSON(list))\ntoBase64(toJSON(nil))\ntoBase64(toJSON(ok))\ntoBase64(toJSON(true))\ntoBase64(trim(str))\ntoBase64(trimPrefix(str))\ntoBase64(trimSuffix(str))\ntoBase64(type($env))\ntoBase64(type(0))\ntoBase64(type(1))\ntoBase64(type(1.0 < 1.0))\ntoBase64(type(1.0))\ntoBase64(type(add))\ntoBase64(type(array))\ntoBase64(type(f64))\ntoBase64(type(false))\ntoBase64(type(foo))\ntoBase64(type(greet))\ntoBase64(type(i))\ntoBase64(type(list))\ntoBase64(type(nil))\ntoBase64(type(ok))\ntoBase64(type(str))\ntoBase64(type(true))\ntoBase64(upper(str))\ntoJSON(!false)\ntoJSON(!ok)\ntoJSON(!true)\ntoJSON($env != 0)\ntoJSON($env != 1)\ntoJSON($env != 1.0)\ntoJSON($env != add)\ntoJSON($env != array)\ntoJSON($env != f64)\ntoJSON($env != false)\ntoJSON($env != foo)\ntoJSON($env != greet)\ntoJSON($env != i)\ntoJSON($env != list)\ntoJSON($env != nil)\ntoJSON($env != str)\ntoJSON($env != true)\ntoJSON($env && false)\ntoJSON($env == $env)\ntoJSON($env == 0)\ntoJSON($env == 1)\ntoJSON($env == array)\ntoJSON($env == f64)\ntoJSON($env == false)\ntoJSON($env == foo)\ntoJSON($env == i)\ntoJSON($env == list)\ntoJSON($env == nil)\ntoJSON($env == str)\ntoJSON($env == true)\ntoJSON($env in list)\ntoJSON($env not in array)\ntoJSON($env not in list)\ntoJSON($env or true)\ntoJSON($env | all(false))\ntoJSON($env | any(false))\ntoJSON($env | any(true))\ntoJSON($env | count(false))\ntoJSON($env | findIndex(ok))\ntoJSON($env | findLastIndex(ok))\ntoJSON($env | get(nil))\ntoJSON($env | map(array))\ntoJSON($env | map(f64))\ntoJSON($env | map(list))\ntoJSON($env | map(str))\ntoJSON($env | map(true))\ntoJSON($env | none(false))\ntoJSON($env | reduce(#index, $env))\ntoJSON($env | reduce(#index, nil))\ntoJSON($env | reduce(false, 1))\ntoJSON($env | sum(0))\ntoJSON($env | sum(1))\ntoJSON($env | sum(1.0))\ntoJSON($env || true)\ntoJSON($env.array)\ntoJSON($env.f64)\ntoJSON($env.foo)\ntoJSON($env.i)\ntoJSON($env.list)\ntoJSON($env.ok)\ntoJSON($env.str)\ntoJSON($env?.$env)\ntoJSON($env?.Bar)\ntoJSON($env?.Bar?.Bar())\ntoJSON($env?.Bar?.[greet])\ntoJSON($env?.Bar?.[list])\ntoJSON($env?.Bar?.f64)\ntoJSON($env?.String)\ntoJSON($env?.[Bar])\ntoJSON($env?.[String])\ntoJSON($env?.[foobar])\ntoJSON($env?.[foobar]?.i())\ntoJSON($env?.[foobar]?.list)\ntoJSON($env?.[nil])\ntoJSON($env?.[str])\ntoJSON($env?.array)\ntoJSON($env?.f64)\ntoJSON($env?.false)\ntoJSON($env?.foo)\ntoJSON($env?.foobar)\ntoJSON($env?.i)\ntoJSON($env?.list)\ntoJSON($env?.nil)\ntoJSON($env?.ok)\ntoJSON($env?.str)\ntoJSON($env?.true)\ntoJSON(-$env?.i)\ntoJSON(-0 < 1.0)\ntoJSON(-0)\ntoJSON(-1)\ntoJSON(-1.0)\ntoJSON(-f64)\ntoJSON(-i)\ntoJSON(0 != $env)\ntoJSON(0 != 1)\ntoJSON(0 != 1.0)\ntoJSON(0 != i)\ntoJSON(0 != nil)\ntoJSON(0 % 1)\ntoJSON(0 % i)\ntoJSON(0 * 1.0)\ntoJSON(0 ** 1)\ntoJSON(0 ** 1.0)\ntoJSON(0 ** f64)\ntoJSON(0 + 0)\ntoJSON(0 + 1)\ntoJSON(0 + 1.0)\ntoJSON(0 + f64)\ntoJSON(0 - 1)\ntoJSON(0 - 1.0)\ntoJSON(0 - f64)\ntoJSON(0 - i)\ntoJSON(0 .. 1)\ntoJSON(0 .. i)\ntoJSON(0 / 1.0)\ntoJSON(0 / f64)\ntoJSON(0 / i)\ntoJSON(0 < 0)\ntoJSON(0 < 1.0)\ntoJSON(0 <= 0)\ntoJSON(0 <= 1)\ntoJSON(0 <= 1.0)\ntoJSON(0 <= f64)\ntoJSON(0 <= i)\ntoJSON(0 == $env?.[foobar])\ntoJSON(0 == 1)\ntoJSON(0 == 1.0)\ntoJSON(0 == f64)\ntoJSON(0 == nil)\ntoJSON(0 > 1)\ntoJSON(0 > 1.0)\ntoJSON(0 > i)\ntoJSON(0 >= 0)\ntoJSON(0 >= 1)\ntoJSON(0 >= 1.0)\ntoJSON(0 ?? 1.0)\ntoJSON(0 ?? f64)\ntoJSON(0 ?? greet)\ntoJSON(0 ?? list)\ntoJSON(0 ?? nil)\ntoJSON(0 ^ 1.0)\ntoJSON(0 ^ f64)\ntoJSON(0 ^ i)\ntoJSON(0 in array)\ntoJSON(0 not in array)\ntoJSON(0 | bitor(i))\ntoJSON(0 | bitshl(0))\ntoJSON(0 | bitshr(0))\ntoJSON(0 | min(1.0))\ntoJSON(0) != greet(str)\ntoJSON(0) + str\ntoJSON(0) > str\ntoJSON(0) >= str\ntoJSON(0) ?? array\ntoJSON(0) ?? not true\ntoJSON(0) contains $env?.[String]\ntoJSON(0) in foo\ntoJSON(0) | greet()\ntoJSON(0..i)\ntoJSON(0.0)\ntoJSON(0.1)\ntoJSON(1 != $env)\ntoJSON(1 != 0)\ntoJSON(1 != 1.0)\ntoJSON(1 != i)\ntoJSON(1 != nil)\ntoJSON(1 % i)\ntoJSON(1 * 1.0)\ntoJSON(1 * i)\ntoJSON(1 ** 0)\ntoJSON(1 ** 1)\ntoJSON(1 ** i)\ntoJSON(1 + 0)\ntoJSON(1 + 1)\ntoJSON(1 + 1.0)\ntoJSON(1 + f64)\ntoJSON(1 - 1.0)\ntoJSON(1 - f64)\ntoJSON(1 - i)\ntoJSON(1 .. 0)\ntoJSON(1 .. 1)\ntoJSON(1 .. i)\ntoJSON(1 / 1)\ntoJSON(1 / f64)\ntoJSON(1 / i)\ntoJSON(1 < 0)\ntoJSON(1 < 1.0)\ntoJSON(1 <= 0)\ntoJSON(1 <= 1)\ntoJSON(1 <= f64)\ntoJSON(1 <= i)\ntoJSON(1 == $env)\ntoJSON(1 == 0)\ntoJSON(1 == 1.0)\ntoJSON(1 == nil)\ntoJSON(1 > 0)\ntoJSON(1 > 1)\ntoJSON(1 > 1.0)\ntoJSON(1 > i)\ntoJSON(1 >= 0)\ntoJSON(1 >= 1)\ntoJSON(1 >= 1.0)\ntoJSON(1 >= f64)\ntoJSON(1 >= i)\ntoJSON(1 ?? $env?.[foo])\ntoJSON(1 ?? 1)\ntoJSON(1 ?? false)\ntoJSON(1 ?? foo)\ntoJSON(1 ?? nil)\ntoJSON(1 ^ 1.0)\ntoJSON(1 not in array)\ntoJSON(1 | min(f64))\ntoJSON(1) != str\ntoJSON(1) > str\ntoJSON(1) ?? $env.ok\ntoJSON(1) ?? array\ntoJSON(1) endsWith str\ntoJSON(1) not contains str\ntoJSON(1) not endsWith str\ntoJSON(1) not in $env?.true\ntoJSON(1) | greet()\ntoJSON(1.0 != $env)\ntoJSON(1.0 != 0)\ntoJSON(1.0 != 1)\ntoJSON(1.0 != 1.0)\ntoJSON(1.0 != i)\ntoJSON(1.0 != nil)\ntoJSON(1.0 * 0)\ntoJSON(1.0 * 1)\ntoJSON(1.0 * 1.0)\ntoJSON(1.0 * f64)\ntoJSON(1.0 * i)\ntoJSON(1.0 ** 0)\ntoJSON(1.0 ** 1)\ntoJSON(1.0 ** 1.0)\ntoJSON(1.0 ** f64)\ntoJSON(1.0 ** i)\ntoJSON(1.0 + 0)\ntoJSON(1.0 + 1)\ntoJSON(1.0 + 1.0)\ntoJSON(1.0 + f64)\ntoJSON(1.0 + i)\ntoJSON(1.0 - 0)\ntoJSON(1.0 - 1)\ntoJSON(1.0 - 1.0)\ntoJSON(1.0 - f64)\ntoJSON(1.0 - i)\ntoJSON(1.0 / 1)\ntoJSON(1.0 / 1.0)\ntoJSON(1.0 / i)\ntoJSON(1.0 < 0)\ntoJSON(1.0 < 1.0)\ntoJSON(1.0 < f64)\ntoJSON(1.0 < i)\ntoJSON(1.0 <= 0)\ntoJSON(1.0 <= 1.0)\ntoJSON(1.0 <= f64)\ntoJSON(1.0 <= i)\ntoJSON(1.0 == $env)\ntoJSON(1.0 == 1)\ntoJSON(1.0 == 1.0)\ntoJSON(1.0 == f64)\ntoJSON(1.0 == i)\ntoJSON(1.0 > 0)\ntoJSON(1.0 > 1.0)\ntoJSON(1.0 > f64)\ntoJSON(1.0 > i)\ntoJSON(1.0 >= 0)\ntoJSON(1.0 >= 1)\ntoJSON(1.0 >= 1.0)\ntoJSON(1.0 >= f64)\ntoJSON(1.0 >= i)\ntoJSON(1.0 ?? $env)\ntoJSON(1.0 ?? 1)\ntoJSON(1.0 ?? add)\ntoJSON(1.0 ?? array)\ntoJSON(1.0 ?? f64)\ntoJSON(1.0 ?? foo)\ntoJSON(1.0 ?? greet)\ntoJSON(1.0 ?? i)\ntoJSON(1.0 ?? nil)\ntoJSON(1.0 ^ 0)\ntoJSON(1.0 ^ 1)\ntoJSON(1.0 ^ 1.0)\ntoJSON(1.0 ^ f64)\ntoJSON(1.0 ^ f64) + str\ntoJSON(1.0 ^ i)\ntoJSON(1.0 in $env?.[String])\ntoJSON(1.0 in array)\ntoJSON(1.0 not in array)\ntoJSON(1.0 | median(array))\ntoJSON(1.0)\ntoJSON(1.0) + str\ntoJSON(1.0) <= str\ntoJSON(1.0) ?? add\ntoJSON(1.0) ?? foo\ntoJSON(1.0) contains str\ntoJSON(1.0) matches str\ntoJSON(1.0) not endsWith str\ntoJSON(1.0) not in foo\ntoJSON(1.0) startsWith str\ntoJSON(1.0) | greet()\ntoJSON(1.0) | indexOf(str)\ntoJSON([0])\ntoJSON([1, 1])\ntoJSON([1, foo])\ntoJSON([1, i])\ntoJSON([1, str])\ntoJSON([1.0])\ntoJSON([1])\ntoJSON([array, 0])\ntoJSON([array])\ntoJSON([f64, nil])\ntoJSON([f64])\ntoJSON([false])\ntoJSON([foo, list])\ntoJSON([foo])\ntoJSON([i])\ntoJSON([nil])\ntoJSON([not true])\ntoJSON([ok])\ntoJSON([str, 1.0])\ntoJSON([str])\ntoJSON([true])\ntoJSON(abs(0))\ntoJSON(abs(1))\ntoJSON(abs(1.0))\ntoJSON(abs(f64 / 1.0))\ntoJSON(abs(f64))\ntoJSON(abs(i))\ntoJSON(add != $env)\ntoJSON(add != add)\ntoJSON(add == $env)\ntoJSON(add == add)\ntoJSON(add == nil)\ntoJSON(add(i, 0))\ntoJSON(all(list, false))\ntoJSON(all(list, true))\ntoJSON(any(array, false))\ntoJSON(any(array, true))\ntoJSON(any(list, ok))\ntoJSON(array != $env)\ntoJSON(array != array)\ntoJSON(array != list)\ntoJSON(array != nil)\ntoJSON(array == array)\ntoJSON(array == list)\ntoJSON(array == nil)\ntoJSON(array ?? 0)\ntoJSON(array ?? 1)\ntoJSON(array ?? 1.0)\ntoJSON(array ?? array)\ntoJSON(array ?? f64)\ntoJSON(array ?? list)\ntoJSON(array ?? str)\ntoJSON(array | count(false))\ntoJSON(array | count(ok))\ntoJSON(array | count(true))\ntoJSON(array | filter(ok))\ntoJSON(array | find(true))\ntoJSON(array | findLast(true))\ntoJSON(array | map(#))\ntoJSON(array | map(array))\ntoJSON(array | max(i))\ntoJSON(array | min(i))\ntoJSON(array | none(false))\ntoJSON(array | one(ok))\ntoJSON(array | reduce(1))\ntoJSON(array | reduce(ok))\ntoJSON(array | sortBy(#))\ntoJSON(array | sortBy(0))\ntoJSON(array | sum(#))\ntoJSON(array | sum(1.0))\ntoJSON(array | sum(i))\ntoJSON(array)\ntoJSON(array) != $env?.[Bar]\ntoJSON(array) != str\ntoJSON(array) + str\ntoJSON(array) < str\ntoJSON(array) == greet(str)\ntoJSON(array) endsWith str\ntoJSON(array) matches str\ntoJSON(array) not contains str\ntoJSON(array) | greet()\ntoJSON(array?.[0])\ntoJSON(array?.[1])\ntoJSON(array?.[i])\ntoJSON(array[1:])\ntoJSON(bitand(0, 0))\ntoJSON(bitnand(1, 1))\ntoJSON(bitnot(0))\ntoJSON(bitnot(1))\ntoJSON(bitnot(i))\ntoJSON(ceil(0))\ntoJSON(ceil(1))\ntoJSON(ceil(1.0))\ntoJSON(ceil(f64))\ntoJSON(ceil(i))\ntoJSON(concat(array))\ntoJSON(concat(list))\ntoJSON(count(array, false))\ntoJSON(count(array, ok))\ntoJSON(count(array, true))\ntoJSON(count(list, false))\ntoJSON(count(list, true))\ntoJSON(f64 != 0)\ntoJSON(f64 != 1)\ntoJSON(f64 != 1.0)\ntoJSON(f64 != f64)\ntoJSON(f64 != nil)\ntoJSON(f64 * 0)\ntoJSON(f64 * 1.0)\ntoJSON(f64 * f64)\ntoJSON(f64 ** 1)\ntoJSON(f64 ** f64)\ntoJSON(f64 + 1.0)\ntoJSON(f64 - 1.0)\ntoJSON(f64 / 1)\ntoJSON(f64 / 1.0)\ntoJSON(f64 / i)\ntoJSON(f64 < 0)\ntoJSON(f64 < 1)\ntoJSON(f64 < 1.0)\ntoJSON(f64 <= 0)\ntoJSON(f64 <= 1)\ntoJSON(f64 <= 1.0)\ntoJSON(f64 <= i)\ntoJSON(f64 == $env)\ntoJSON(f64 == 0)\ntoJSON(f64 == 1.0)\ntoJSON(f64 == nil)\ntoJSON(f64 > 0)\ntoJSON(f64 > 1.0)\ntoJSON(f64 >= 1.0)\ntoJSON(f64 >= i)\ntoJSON(f64 ?? $env)\ntoJSON(f64 ?? 1.0)\ntoJSON(f64 ?? add)\ntoJSON(f64 ?? array)\ntoJSON(f64 ?? i)\ntoJSON(f64 ?? nil)\ntoJSON(f64 ?? ok)\ntoJSON(f64 ^ 0)\ntoJSON(f64 ^ 1.0)\ntoJSON(f64 ^ f64)\ntoJSON(f64 ^ i)\ntoJSON(f64 in array)\ntoJSON(f64 not in array)\ntoJSON(f64 | mean(1.0))\ntoJSON(f64 | median(i))\ntoJSON(f64)\ntoJSON(f64) > str\ntoJSON(f64) ?? add\ntoJSON(f64) in reduce(array, $env, array)\ntoJSON(f64) not contains str ?? 0\ntoJSON(f64) not in foo\ntoJSON(false != $env)\ntoJSON(false != false)\ntoJSON(false != nil)\ntoJSON(false != ok)\ntoJSON(false && $env)\ntoJSON(false && $env?.[greet])\ntoJSON(false && ok)\ntoJSON(false == $env)\ntoJSON(false == nil)\ntoJSON(false == ok)\ntoJSON(false == true)\ntoJSON(false ? ok : true)\ntoJSON(false ?: f64)\ntoJSON(false ?? 1.0)\ntoJSON(false ?? add)\ntoJSON(false ?? f64)\ntoJSON(false ?? foo)\ntoJSON(false ?? greet)\ntoJSON(false ?? i)\ntoJSON(false ?? nil)\ntoJSON(false ?? ok)\ntoJSON(false and $env)\ntoJSON(false not in $env?.[String])\ntoJSON(false or false)\ntoJSON(false || false)\ntoJSON(false || ok)\ntoJSON(false) <= $env.str\ntoJSON(false) <= str\ntoJSON(false) ?? f64\ntoJSON(false) ?? len(array)\ntoJSON(false) not endsWith str\ntoJSON(false) startsWith first($env)\ntoJSON(false) | lastIndexOf(str)\ntoJSON(find(array, true))\ntoJSON(find(list, false))\ntoJSON(find(list, ok))\ntoJSON(findIndex($env, false))\ntoJSON(findIndex($env, true))\ntoJSON(findIndex(list, false))\ntoJSON(findLastIndex($env, false))\ntoJSON(findLastIndex($env, ok))\ntoJSON(first($env))\ntoJSON(first(array))\ntoJSON(first(list))\ntoJSON(flatten(array))\ntoJSON(flatten(list))\ntoJSON(float(0))\ntoJSON(float(1))\ntoJSON(float(1.0))\ntoJSON(float(f64))\ntoJSON(float(i))\ntoJSON(floor(0))\ntoJSON(floor(1))\ntoJSON(floor(1.0))\ntoJSON(floor(f64))\ntoJSON(floor(i))\ntoJSON(foo != $env)\ntoJSON(foo != foo)\ntoJSON(foo != nil)\ntoJSON(foo == $env)\ntoJSON(foo == foo)\ntoJSON(foo == nil)\ntoJSON(foo ?? $env)\ntoJSON(foo ?? $env?.[f64 >= foobar])\ntoJSON(foo ?? 0)\ntoJSON(foo ?? 1)\ntoJSON(foo ?? add)\ntoJSON(foo ?? f64)\ntoJSON(foo ?? foo)\ntoJSON(foo ?? list)\ntoJSON(foo ?? ok)\ntoJSON(foo ?? str)\ntoJSON(foo ?? true)\ntoJSON(foo in list)\ntoJSON(foo not in list)\ntoJSON(foo)\ntoJSON(foo) + str\ntoJSON(foo) < str\ntoJSON(foo) > str\ntoJSON(foo) > toJSON(1.0)\ntoJSON(foo) >= string(nil)\ntoJSON(foo) ?? $env?.greet\ntoJSON(foo) ?? i\ntoJSON(foo) ?? ok\ntoJSON(foo) not in $env?.String\ntoJSON(foo) not matches $env?.[foobar]\ntoJSON(foo) not matches str\ntoJSON(foo) | greet()\ntoJSON(foo) | repeat(i)\ntoJSON(foo.Bar)\ntoJSON(foo.String())\ntoJSON(foo?.Bar)\ntoJSON(foo?.String())\ntoJSON(greet != $env)\ntoJSON(greet != greet)\ntoJSON(greet != nil)\ntoJSON(greet == $env)\ntoJSON(greet == nil)\ntoJSON(greet(str))\ntoJSON(groupBy(array, 1.0)?.Bar)\ntoJSON(i != 1.0)\ntoJSON(i != f64)\ntoJSON(i != i)\ntoJSON(i != nil)\ntoJSON(i % 1)\ntoJSON(i * 0)\ntoJSON(i * 1)\ntoJSON(i * 1.0)\ntoJSON(i * f64)\ntoJSON(i * i)\ntoJSON(i ** 1.0) | greet()\ntoJSON(i ** f64)\ntoJSON(i + 1 .. 0)\ntoJSON(i + 1.0)\ntoJSON(i - 1)\ntoJSON(i - i)\ntoJSON(i .. 1)\ntoJSON(i / 1.0)\ntoJSON(i / f64)\ntoJSON(i / i)\ntoJSON(i < 1)\ntoJSON(i < 1.0)\ntoJSON(i <= 1)\ntoJSON(i == 0)\ntoJSON(i == 1)\ntoJSON(i == 1.0)\ntoJSON(i == nil)\ntoJSON(i == nil) <= str\ntoJSON(i > 1)\ntoJSON(i > f64)\ntoJSON(i > i)\ntoJSON(i >= 0)\ntoJSON(i >= 1.0)\ntoJSON(i >= f64)\ntoJSON(i >= i)\ntoJSON(i ?? $env)\ntoJSON(i ?? 0)\ntoJSON(i ?? 1.0)\ntoJSON(i ?? add)\ntoJSON(i ?? array)\ntoJSON(i ?? foo)\ntoJSON(i ?? greet)\ntoJSON(i ?? list?.[i])\ntoJSON(i ?? nil)\ntoJSON(i ?? str)\ntoJSON(i ?? true)\ntoJSON(i ^ 0)\ntoJSON(i ^ 1.0)\ntoJSON(i ^ f64)\ntoJSON(i in array)\ntoJSON(i not in array)\ntoJSON(i | bitand(0))\ntoJSON(i)\ntoJSON(i) + str\ntoJSON(i) < foo.String()\ntoJSON(i) <= str\ntoJSON(i) ?? array\ntoJSON(i) ?? i\ntoJSON(i) not contains string(0)\ntoJSON(i) not in foo ? 1.0 : foo\ntoJSON(i) | greet()\ntoJSON(if false { $env } else { nil })\ntoJSON(if false { add } else { ok })\ntoJSON(if false { nil } else { list })\ntoJSON(if false { str } else { str })\ntoJSON(if ok { foo } else { 1.0 })\ntoJSON(if true { foo } else { 1 })\ntoJSON(if true { ok } else { f64 })\ntoJSON(if true { true } else { i })\ntoJSON(int(0))\ntoJSON(int(1))\ntoJSON(int(1.0))\ntoJSON(int(f64))\ntoJSON(keys($env))\ntoJSON(last($env))\ntoJSON(last($env?.[foobar]))\ntoJSON(last(array))\ntoJSON(last(list))\ntoJSON(len($env))\ntoJSON(len(list))\ntoJSON(len(str))\ntoJSON(let foobar = array; foobar)\ntoJSON(let foobar = false; foobar)\ntoJSON(list != list)\ntoJSON(list != nil)\ntoJSON(list == $env)\ntoJSON(list == $env.list)\ntoJSON(list == array)\ntoJSON(list == list)\ntoJSON(list == nil)\ntoJSON(list ?? 0)\ntoJSON(list ?? 1.0)\ntoJSON(list ?? add)\ntoJSON(list ?? array)\ntoJSON(list ?? false)\ntoJSON(list ?? foo)\ntoJSON(list ?? nil)\ntoJSON(list ?? ok)\ntoJSON(list ?? true)\ntoJSON(list | all(false))\ntoJSON(list | find(false))\ntoJSON(list | find(ok))\ntoJSON(list | findIndex(true))\ntoJSON(list | findLast(ok))\ntoJSON(list | map(#))\ntoJSON(list | map(#.Bar))\ntoJSON(list | map(0))\ntoJSON(list | map(1))\ntoJSON(list | map(foo))\ntoJSON(list | map(true))\ntoJSON(list | none(true))\ntoJSON(list | reduce(#))\ntoJSON(list | reduce(0))\ntoJSON(list | reduce(foo))\ntoJSON(list | sortBy(f64))\ntoJSON(list | sortBy(i))\ntoJSON(list | sum(1.0))\ntoJSON(list | sum(i))\ntoJSON(list)\ntoJSON(list) + str\ntoJSON(list) <= str\ntoJSON(list) == str\ntoJSON(list) > str\ntoJSON(list) > string($env)\ntoJSON(list) not in foo\ntoJSON(list) startsWith str\ntoJSON(list) | greet()\ntoJSON(list?.[0])\ntoJSON(list?.[i])\ntoJSON(list[0:])\ntoJSON(list[:1])\ntoJSON(lower(str))\ntoJSON(map($env, 0))\ntoJSON(map($env, array))\ntoJSON(map($env, false))\ntoJSON(map($env, foo))\ntoJSON(map($env, i))\ntoJSON(map($env, list))\ntoJSON(map(array, #))\ntoJSON(map(array, 0))\ntoJSON(map(array, list))\ntoJSON(map(array, ok))\ntoJSON(map(array, str))\ntoJSON(map(list, #))\ntoJSON(map(list, #index))\ntoJSON(map(list, .Bar))\ntoJSON(map(list, array))\ntoJSON(map(list, f64))\ntoJSON(map(list, list))\ntoJSON(max(0))\ntoJSON(max(1))\ntoJSON(max(1.0))\ntoJSON(max(1.0, 0))\ntoJSON(max(1.0, 1))\ntoJSON(max(1.0, array))\ntoJSON(max(array))\ntoJSON(max(f64))\ntoJSON(max(i))\ntoJSON(mean(0))\ntoJSON(mean(1))\ntoJSON(mean(1.0))\ntoJSON(mean(array))\ntoJSON(mean(f64))\ntoJSON(mean(i))\ntoJSON(median(0))\ntoJSON(median(1))\ntoJSON(median(1, 0))\ntoJSON(median(1.0))\ntoJSON(median(array))\ntoJSON(median(array, array))\ntoJSON(median(f64))\ntoJSON(median(f64, i))\ntoJSON(median(i))\ntoJSON(min($env)?.list)\ntoJSON(min(0))\ntoJSON(min(1))\ntoJSON(min(1, f64))\ntoJSON(min(1.0))\ntoJSON(min(array))\ntoJSON(min(f64))\ntoJSON(min(i))\ntoJSON(nil != $env)\ntoJSON(nil != 0)\ntoJSON(nil != 1)\ntoJSON(nil != 1.0)\ntoJSON(nil != add)\ntoJSON(nil != array)\ntoJSON(nil != f64)\ntoJSON(nil != false)\ntoJSON(nil != foo)\ntoJSON(nil != greet)\ntoJSON(nil != i)\ntoJSON(nil != list)\ntoJSON(nil != nil)\ntoJSON(nil != ok)\ntoJSON(nil != str)\ntoJSON(nil != true or ok)\ntoJSON(nil != true)\ntoJSON(nil == $env)\ntoJSON(nil == 0)\ntoJSON(nil == 1)\ntoJSON(nil == 1.0)\ntoJSON(nil == array)\ntoJSON(nil == foo)\ntoJSON(nil == greet)\ntoJSON(nil == i)\ntoJSON(nil == list)\ntoJSON(nil == nil)\ntoJSON(nil == ok)\ntoJSON(nil ?? 0)\ntoJSON(nil ?? 1)\ntoJSON(nil ?? array)\ntoJSON(nil ?? f64)\ntoJSON(nil ?? foo)\ntoJSON(nil ?? i)\ntoJSON(nil ?? list)\ntoJSON(nil ?? nil)\ntoJSON(nil ?? true)\ntoJSON(nil in $env)\ntoJSON(nil in array)\ntoJSON(nil in list)\ntoJSON(nil not in $env)\ntoJSON(nil not in list)\ntoJSON(nil) < str\ntoJSON(nil) <= str\ntoJSON(nil) > toJSON(true)\ntoJSON(nil) >= str\ntoJSON(nil) ?? str\ntoJSON(nil) in $env?.String\ntoJSON(nil) in foo\ntoJSON(nil) matches str\ntoJSON(nil) not contains $env?.[str]\ntoJSON(nil) not in foo\ntoJSON(nil) not matches foo?.Bar\ntoJSON(nil) not startsWith str\ntoJSON(nil) | greet()\ntoJSON(nil)[:i]\ntoJSON(none($env, false))\ntoJSON(none($env, true))\ntoJSON(none(list, false))\ntoJSON(none(list, ok))\ntoJSON(not false)\ntoJSON(not ok)\ntoJSON(not true)\ntoJSON(ok != false)\ntoJSON(ok != nil)\ntoJSON(ok != ok)\ntoJSON(ok && false)\ntoJSON(ok && ok)\ntoJSON(ok && true)\ntoJSON(ok == $env)\ntoJSON(ok == false)\ntoJSON(ok == nil)\ntoJSON(ok == nil) < foo?.String()\ntoJSON(ok == true)\ntoJSON(ok ? 1.0 : 0)\ntoJSON(ok ? foo : ok)\ntoJSON(ok ?: foo)\ntoJSON(ok ?? $env)\ntoJSON(ok ?? 1)\ntoJSON(ok ?? 1.0)\ntoJSON(ok ?? array)\ntoJSON(ok ?? f64)\ntoJSON(ok ?? false)\ntoJSON(ok ?? foo)\ntoJSON(ok ?? ok)\ntoJSON(ok and true)\ntoJSON(ok or false)\ntoJSON(ok or true)\ntoJSON(ok || false)\ntoJSON(ok)\ntoJSON(ok) != string(true)\ntoJSON(ok) == trimSuffix(str)\ntoJSON(ok) ?? i\ntoJSON(ok) matches foo.Bar\ntoJSON(ok) not startsWith str\ntoJSON(ok) | greet()\ntoJSON(one($env, true))\ntoJSON(one(list, ok))\ntoJSON(reduce($env, 1.0, 0))\ntoJSON(reduce(array, #index))\ntoJSON(reduce(array, 0))\ntoJSON(reduce(array, 1))\ntoJSON(reduce(array, f64))\ntoJSON(reduce(array, foo))\ntoJSON(reduce(array, str))\ntoJSON(reduce(list, #))\ntoJSON(reduce(list, #.Bar))\ntoJSON(reduce(list, 0))\ntoJSON(reduce(list, 1.0))\ntoJSON(reduce(list, f64))\ntoJSON(reduce(list, foo))\ntoJSON(reduce(list, ok))\ntoJSON(reverse(array))\ntoJSON(reverse(list))\ntoJSON(round(0))\ntoJSON(round(1))\ntoJSON(round(1.0))\ntoJSON(round(f64))\ntoJSON(round(i))\ntoJSON(sort($env))\ntoJSON(sort(array))\ntoJSON(sortBy(array, #))\ntoJSON(sortBy(array, 0))\ntoJSON(sortBy(array, 1))\ntoJSON(sortBy(array, f64))\ntoJSON(sortBy(list, 0))\ntoJSON(sortBy(list, i))\ntoJSON(str != nil)\ntoJSON(str <= str)\ntoJSON(str == nil)\ntoJSON(str > str)\ntoJSON(str >= str)\ntoJSON(str ?? $env)\ntoJSON(str ?? 0)\ntoJSON(str ?? array)\ntoJSON(str ?? false)\ntoJSON(str ?? foo)\ntoJSON(str ?? list)\ntoJSON(str ?? ok)\ntoJSON(str contains str)\ntoJSON(str endsWith str)\ntoJSON(str in $env)\ntoJSON(str in foo)\ntoJSON(str in list?.[i])\ntoJSON(str matches str)\ntoJSON(str not contains str)\ntoJSON(str not endsWith str)\ntoJSON(str not in $env)\ntoJSON(str not in [add, array, foo])\ntoJSON(str not in foo)\ntoJSON(str startsWith str)\ntoJSON(str)\ntoJSON(str) ?? array\ntoJSON(str) endsWith str\ntoJSON(str) matches str\ntoJSON(str) matches str || ok\ntoJSON(str) | greet()\ntoJSON(str[0:])\ntoJSON(str[:0])\ntoJSON(str[:])\ntoJSON(string($env | one(true)))\ntoJSON(string($env))\ntoJSON(string($env?.[str]))\ntoJSON(string(0))\ntoJSON(string(1))\ntoJSON(string(1.0 - 1))\ntoJSON(string(1.0))\ntoJSON(string(add))\ntoJSON(string(array))\ntoJSON(string(f64))\ntoJSON(string(false))\ntoJSON(string(foo))\ntoJSON(string(greet))\ntoJSON(string(i))\ntoJSON(string(list))\ntoJSON(string(nil))\ntoJSON(string(ok))\ntoJSON(string(str))\ntoJSON(string(true))\ntoJSON(string(values($env)))\ntoJSON(sum($env, 1.0))\ntoJSON(sum(array))\ntoJSON(sum(array, #))\ntoJSON(sum(array, i))\ntoJSON(sum(i .. i))\ntoJSON(sum(list, i))\ntoJSON(toBase64(str))\ntoJSON(toJSON(1))\ntoJSON(toJSON(1.0))\ntoJSON(toJSON(array))\ntoJSON(toJSON(f64))\ntoJSON(toJSON(false))\ntoJSON(toJSON(foo))\ntoJSON(toJSON(i))\ntoJSON(toJSON(list))\ntoJSON(toJSON(nil))\ntoJSON(toJSON(ok))\ntoJSON(toJSON(str))\ntoJSON(toJSON(true))\ntoJSON(trim(greet(str)))\ntoJSON(trim(str))\ntoJSON(trimPrefix($env?.[str]))\ntoJSON(trimPrefix(str))\ntoJSON(trimSuffix($env?.str))\ntoJSON(trimSuffix(str))\ntoJSON(true != $env)\ntoJSON(true != false)\ntoJSON(true != nil)\ntoJSON(true != ok)\ntoJSON(true != true)\ntoJSON(true && false)\ntoJSON(true && ok)\ntoJSON(true && true)\ntoJSON(true == $env)\ntoJSON(true == true)\ntoJSON(true ? foo : 1.0)\ntoJSON(true ? foo : f64)\ntoJSON(true ? nil : false)\ntoJSON(true ?: greet)\ntoJSON(true ?: nil)\ntoJSON(true ?? $env)\ntoJSON(true ?? foo)\ntoJSON(true ?? nil)\ntoJSON(true ?? str)\ntoJSON(true and ok)\ntoJSON(true and true)\ntoJSON(true or $env)\ntoJSON(true or false)\ntoJSON(true or ok)\ntoJSON(true or true)\ntoJSON(true || $env)\ntoJSON(true || ok)\ntoJSON(true || true)\ntoJSON(true) + str | trimPrefix(str)\ntoJSON(true) < str\ntoJSON(true) > str\ntoJSON(true) ?? $env.greet\ntoJSON(true) ?? 1 | groupBy(true)\ntoJSON(true) ?? f64\ntoJSON(true) ?? foo | filter(true)\ntoJSON(true) in foo\ntoJSON(true) not endsWith greet(str)\ntoJSON(true) not startsWith str\ntoJSON(true) | greet()\ntoJSON(true) | repeat(i)\ntoJSON(true); f64\ntoJSON(type($env))\ntoJSON(type(0))\ntoJSON(type(1.0))\ntoJSON(type(add))\ntoJSON(type(array))\ntoJSON(type(f64 + 1.0))\ntoJSON(type(f64))\ntoJSON(type(false))\ntoJSON(type(foo))\ntoJSON(type(greet))\ntoJSON(type(i))\ntoJSON(type(list))\ntoJSON(type(nil))\ntoJSON(type(ok))\ntoJSON(type(str))\ntoJSON(type(true))\ntoJSON(uniq(array))\ntoJSON(uniq(list))\ntoJSON(upper(str))\ntoJSON({foo: $env}?.list)\ntoJSON({foo: 0, foo: f64}.i)\ntoJSON({foo: 0})\ntoJSON({foo: 1, foo: 1.0, foo: $env})\ntoJSON({foo: 1, foo: true})\ntoJSON({foo: 1.0})\ntoJSON({foo: 1.0}.f64)\ntoJSON({foo: 1})\ntoJSON({foo: array})\ntoJSON({foo: f64})\ntoJSON({foo: false})\ntoJSON({foo: foo, foo: array})\ntoJSON({foo: foo, foo: f64})\ntoJSON({foo: foo, foo: str})\ntoJSON({foo: foo, foo: true})\ntoJSON({foo: foo})\ntoJSON({foo: foo}.Bar)\ntoJSON({foo: foo}?.array)\ntoJSON({foo: i, foo: foo})\ntoJSON({foo: i})\ntoJSON({foo: list})\ntoJSON({foo: nil != 1.0})\ntoJSON({foo: nil, foo: $env, foo: 0})\ntoJSON({foo: nil, foo: 1.0})\ntoJSON({foo: nil, foo: i})\ntoJSON({foo: nil})\ntoJSON({foo: ok})\ntoJSON({foo: str, foo: 0})\ntoJSON({foo: str})\ntoJSON({foo: true})\ntoPairs($env ?? $env)\ntoPairs($env ?? 0)\ntoPairs($env ?? 1)\ntoPairs($env ?? 1.0)\ntoPairs($env ?? add)\ntoPairs($env ?? array)\ntoPairs($env ?? foo)\ntoPairs($env ?? i)\ntoPairs($env ?? ok)\ntoPairs($env ?? str)\ntoPairs($env ?? true)\ntoPairs($env) != array\ntoPairs($env) != list\ntoPairs($env) == array\ntoPairs($env) == list\ntoPairs($env) ?? array\ntoPairs($env) ?? foo\ntoPairs($env) ?? greet\ntoPairs($env) ?? list\ntoPairs($env) ?? str\ntoPairs($env) not in $env?.Bar\ntoPairs($env) | concat(array)\ntoPairs($env) | count(false)\ntoPairs($env) | count(ok)\ntoPairs($env) | findIndex(false)\ntoPairs($env) | findLast(ok)\ntoPairs($env) | findLastIndex(true)\ntoPairs($env) | groupBy(1.0)\ntoPairs($env) | groupBy(false)\ntoPairs($env) | groupBy(foo)\ntoPairs($env) | groupBy(i)\ntoPairs($env) | map(#)\ntoPairs($env) | map(1.0)\ntoPairs($env) | one(false)\ntoPairs($env) | one(true)\ntoPairs($env) | reduce(#)\ntoPairs($env) | reduce(#, foo)\ntoPairs($env) | reduce($env)\ntoPairs($env) | reduce(1.0)\ntoPairs($env) | reduce(add)\ntoPairs($env) | reduce(false)\ntoPairs($env) | reduce(foo)\ntoPairs($env) | reduce(greet)\ntoPairs($env) | reduce(i)\ntoPairs($env) | sortBy(0)\ntoPairs($env) | sortBy(i)\ntoPairs($env)?.[i]\ntoPairs(array | groupBy(1.0))\ntoPairs(array | groupBy(f64))\ntoPairs(array | groupBy(ok))\ntoPairs(false ? $env : $env)\ntoPairs(groupBy(array, 1.0))\ntoPairs(groupBy(array, str))\ntoPairs(groupBy(array, true))\ntoPairs(groupBy(list, #))\ntoPairs(groupBy(list, 1.0))\ntoPairs(list | groupBy(#))\ntoPairs(list | groupBy(false))\ntoPairs(list | groupBy(foo))\ntoPairs(list | groupBy(i))\ntoPairs(max($env))\ntoPairs(min($env))\ntoPairs(nil ?? $env)\ntoPairs(reduce(array, $env))\ntoPairs({foo: $env, foo: true})\ntoPairs({foo: $env})\ntoPairs({foo: 0, foo: $env})\ntoPairs({foo: 0})\ntoPairs({foo: 1, foo: $env})\ntoPairs({foo: 1, foo: foo})\ntoPairs({foo: 1.0 - 1.0})\ntoPairs({foo: 1.0, foo: $env})\ntoPairs({foo: 1.0, foo: 1})\ntoPairs({foo: 1.0})\ntoPairs({foo: 1})\ntoPairs({foo: add, foo: add})\ntoPairs({foo: add})\ntoPairs({foo: array, foo: f64})\ntoPairs({foo: array})\ntoPairs({foo: f64})\ntoPairs({foo: false})\ntoPairs({foo: foo, foo: greet})\ntoPairs({foo: foo, foo: list})\ntoPairs({foo: foo, foo: ok})\ntoPairs({foo: foo, foo: str})\ntoPairs({foo: foo})\ntoPairs({foo: greet})\ntoPairs({foo: i})\ntoPairs({foo: list})\ntoPairs({foo: nil, foo: str})\ntoPairs({foo: nil})\ntoPairs({foo: ok})\ntoPairs({foo: str})\ntoPairs({foo: true})\ntrim($env.str)\ntrim($env?.[str])\ntrim($env?.[str], str)\ntrim($env?.str)\ntrim(false ? foo : str)\ntrim(foo.Bar)\ntrim(foo.Bar, str)\ntrim(foo.String())\ntrim(foo?.Bar)\ntrim(foo?.String())\ntrim(greet(foo?.Bar))\ntrim(greet(str))\ntrim(last(list).Bar)\ntrim(list | reduce(.Bar))\ntrim(lower(str))\ntrim(nil ?? str)\ntrim(reduce($env, str, greet))\ntrim(reduce(array, str))\ntrim(str + str)\ntrim(str ?? 1.0)\ntrim(str ?? add)\ntrim(str ?? list)\ntrim(str | greet())\ntrim(str)\ntrim(str) == str\ntrim(str) >= str\ntrim(str) ?? array\ntrim(str) in foo\ntrim(str) matches str\ntrim(str) not endsWith $env?.[str]\ntrim(str) not in list?.[i]\ntrim(str) not matches foo.String()\ntrim(str) not matches str\ntrim(str) | greet()\ntrim(str)[:]\ntrim(str, foo.Bar)\ntrim(str, str)\ntrim(str, toJSON(ok))\ntrim(str[0:])\ntrim(str[:0])\ntrim(str[:1])\ntrim(str[:i])\ntrim(string($env))\ntrim(string($env.ok))\ntrim(string($env?.Bar))\ntrim(string(0))\ntrim(string(1))\ntrim(string(1.0))\ntrim(string(add))\ntrim(string(array))\ntrim(string(f64))\ntrim(string(false))\ntrim(string(foo))\ntrim(string(greet))\ntrim(string(i))\ntrim(string(list))\ntrim(string(nil))\ntrim(string(ok))\ntrim(string(str))\ntrim(string(true))\ntrim(string(upper(str)))\ntrim(toBase64(str))\ntrim(toJSON($env.list))\ntrim(toJSON($env?.foo))\ntrim(toJSON(0))\ntrim(toJSON(1))\ntrim(toJSON(1.0))\ntrim(toJSON(array))\ntrim(toJSON(f64))\ntrim(toJSON(false))\ntrim(toJSON(foo != foo))\ntrim(toJSON(foo))\ntrim(toJSON(i))\ntrim(toJSON(list))\ntrim(toJSON(nil))\ntrim(toJSON(ok))\ntrim(toJSON(str))\ntrim(toJSON(true))\ntrim(trim(str))\ntrim(trimPrefix(str))\ntrim(trimSuffix(str))\ntrim(type($env))\ntrim(type(0))\ntrim(type(1))\ntrim(type(1.0))\ntrim(type(add))\ntrim(type(array))\ntrim(type(f64))\ntrim(type(false))\ntrim(type(foo))\ntrim(type(greet))\ntrim(type(i))\ntrim(type(list))\ntrim(type(nil))\ntrim(type(ok))\ntrim(type(str))\ntrim(type(true))\ntrim(upper(str))\ntrimPrefix($env) == nil || true\ntrimPrefix($env.str)\ntrimPrefix($env?.[str])\ntrimPrefix($env?.str)\ntrimPrefix($env?.str, str)\ntrimPrefix(array | reduce(str, add))\ntrimPrefix(false ? greet : str)\ntrimPrefix(foo.Bar)\ntrimPrefix(foo.String())\ntrimPrefix(foo?.Bar)\ntrimPrefix(foo?.String())\ntrimPrefix(greet(foo?.String()))\ntrimPrefix(greet(str))\ntrimPrefix(greet(toJSON(false)))\ntrimPrefix(lower(str))\ntrimPrefix(nil ?? str)\ntrimPrefix(reduce(array, str))\ntrimPrefix(reduce(list, str))\ntrimPrefix(str + foo?.Bar)\ntrimPrefix(str ?? $env)\ntrimPrefix(str ?? 0)\ntrimPrefix(str ?? array)\ntrimPrefix(str ?? false)\ntrimPrefix(str ?? foo)\ntrimPrefix(str ?? greet)\ntrimPrefix(str ?? i)\ntrimPrefix(str ?? str)\ntrimPrefix(str | greet())\ntrimPrefix(str)\ntrimPrefix(str) < type(nil)\ntrimPrefix(str) <= str\ntrimPrefix(str) == str\ntrimPrefix(str) > str\ntrimPrefix(str) ?? f64\ntrimPrefix(str) endsWith str\ntrimPrefix(str) not contains str\ntrimPrefix(str) not startsWith str\ntrimPrefix(str) startsWith str\ntrimPrefix(str, false ? i : str)\ntrimPrefix(str, foo?.Bar)\ntrimPrefix(str, str)\ntrimPrefix(str, string(foo))\ntrimPrefix(str, toJSON(nil))\ntrimPrefix(str, type(false))\ntrimPrefix(str, type(true))\ntrimPrefix(str[0:])\ntrimPrefix(str[1:])\ntrimPrefix(str[:i])\ntrimPrefix(string($env))\ntrimPrefix(string(0))\ntrimPrefix(string(1))\ntrimPrefix(string(1.0))\ntrimPrefix(string(add))\ntrimPrefix(string(array))\ntrimPrefix(string(f64))\ntrimPrefix(string(false))\ntrimPrefix(string(foo))\ntrimPrefix(string(greet))\ntrimPrefix(string(i))\ntrimPrefix(string(list))\ntrimPrefix(string(nil))\ntrimPrefix(string(ok))\ntrimPrefix(string(str))\ntrimPrefix(string(true))\ntrimPrefix(toBase64(str))\ntrimPrefix(toJSON(0))\ntrimPrefix(toJSON(1))\ntrimPrefix(toJSON(1.0))\ntrimPrefix(toJSON(array))\ntrimPrefix(toJSON(f64))\ntrimPrefix(toJSON(false))\ntrimPrefix(toJSON(foo))\ntrimPrefix(toJSON(i))\ntrimPrefix(toJSON(nil))\ntrimPrefix(toJSON(ok))\ntrimPrefix(toJSON(str))\ntrimPrefix(toJSON(true))\ntrimPrefix(trim(str))\ntrimPrefix(trimPrefix(str))\ntrimPrefix(trimPrefix(str, str))\ntrimPrefix(trimPrefix(type($env)))\ntrimPrefix(trimSuffix(str))\ntrimPrefix(type($env))\ntrimPrefix(type($env.ok))\ntrimPrefix(type(0))\ntrimPrefix(type(1))\ntrimPrefix(type(1.0))\ntrimPrefix(type(add))\ntrimPrefix(type(array))\ntrimPrefix(type(f64))\ntrimPrefix(type(false))\ntrimPrefix(type(foo))\ntrimPrefix(type(greet))\ntrimPrefix(type(i))\ntrimPrefix(type(list))\ntrimPrefix(type(nil))\ntrimPrefix(type(ok))\ntrimPrefix(type(str))\ntrimPrefix(type(true))\ntrimPrefix(upper(foo?.String()))\ntrimPrefix(upper(str))\ntrimSuffix($env.str)\ntrimSuffix($env?.[str])\ntrimSuffix($env?.str)\ntrimSuffix(array | reduce(str, foo))\ntrimSuffix(foo.Bar)\ntrimSuffix(foo.String())\ntrimSuffix(foo?.Bar)\ntrimSuffix(foo?.Bar, str)\ntrimSuffix(foo?.String())\ntrimSuffix(greet(foo?.String()))\ntrimSuffix(greet(str))\ntrimSuffix(greet(str), str)\ntrimSuffix(greet(string(add)))\ntrimSuffix(list | reduce(#.Bar))\ntrimSuffix(lower(str))\ntrimSuffix(str ?? $env)\ntrimSuffix(str ?? foo)\ntrimSuffix(str ?? list)\ntrimSuffix(str | greet())\ntrimSuffix(str)\ntrimSuffix(str) != str\ntrimSuffix(str) + str\ntrimSuffix(str) <= greet(str)\ntrimSuffix(str) ?? add\ntrimSuffix(str) ?? foo\ntrimSuffix(str) ?? ok\ntrimSuffix(str) | greet()\ntrimSuffix(str, $env?.[str])\ntrimSuffix(str, str)\ntrimSuffix(string($env))\ntrimSuffix(string($env), str)\ntrimSuffix(string(0))\ntrimSuffix(string(1))\ntrimSuffix(string(1.0))\ntrimSuffix(string(add))\ntrimSuffix(string(array))\ntrimSuffix(string(f64))\ntrimSuffix(string(false))\ntrimSuffix(string(foo))\ntrimSuffix(string(foo.Bar))\ntrimSuffix(string(greet))\ntrimSuffix(string(i))\ntrimSuffix(string(list))\ntrimSuffix(string(nil))\ntrimSuffix(string(ok))\ntrimSuffix(string(str))\ntrimSuffix(string(sum($env, 0)))\ntrimSuffix(string(true))\ntrimSuffix(toBase64($env?.[str]))\ntrimSuffix(toBase64($env?.str))\ntrimSuffix(toBase64(str))\ntrimSuffix(toJSON(0))\ntrimSuffix(toJSON(1.0))\ntrimSuffix(toJSON(array))\ntrimSuffix(toJSON(f64))\ntrimSuffix(toJSON(false))\ntrimSuffix(toJSON(foo))\ntrimSuffix(toJSON(i))\ntrimSuffix(toJSON(list))\ntrimSuffix(toJSON(nil))\ntrimSuffix(toJSON(ok))\ntrimSuffix(toJSON(str))\ntrimSuffix(toJSON(true))\ntrimSuffix(trim(str))\ntrimSuffix(trimPrefix(str))\ntrimSuffix(trimSuffix(str))\ntrimSuffix(type($env))\ntrimSuffix(type(0))\ntrimSuffix(type(1))\ntrimSuffix(type(1.0))\ntrimSuffix(type(add))\ntrimSuffix(type(array))\ntrimSuffix(type(f64))\ntrimSuffix(type(false))\ntrimSuffix(type(foo))\ntrimSuffix(type(greet))\ntrimSuffix(type(i))\ntrimSuffix(type(list))\ntrimSuffix(type(nil))\ntrimSuffix(type(ok))\ntrimSuffix(type(str))\ntrimSuffix(type(true))\ntrimSuffix(upper(str))\ntrue != $env != 1 ?? foo\ntrue != $env || $env >= 1.0\ntrue != $env || ok\ntrue != $env.ok\ntrue != $env?.Bar\ntrue != $env?.String\ntrue != $env?.String?.String\ntrue != $env?.String?.[str]\ntrue != $env?.[Bar]\ntrue != $env?.[String]\ntrue != $env?.[String]?.Bar\ntrue != $env?.[foobar?.[greet]]\ntrue != $env?.[foobar]\ntrue != $env?.[str]\ntrue != $env?.ok\ntrue != f64 - 0 ?? $env\ntrue != false == ok\ntrue != false ?? i\ntrue != i ?? f64\ntrue != list ?? array\ntrue != list ?? not ok\ntrue != nil and foo ?? ok\ntrue != nil and ok\ntrue != ok != $env?.String\ntrue != ok ?? array\ntrue != str ?? add\ntrue != str ?? greet\ntrue != str ?? i\ntrue != true ?: foo\ntrue != true ?? array\ntrue != true ?? greet\ntrue && $env != list\ntrue && $env == list?.[i]\ntrue && $env == str\ntrue && $env ?? $env[:foo]\ntrue && $env ?? foo\ntrue && $env ?? groupBy(list, foo)?.f64\ntrue && $env ?? not $env\ntrue && $env ?? ok\ntrue && $env.ok\ntrue && $env?.Bar\ntrue && $env?.String\ntrue && $env?.[Bar]\ntrue && $env?.[Bar]?.[str]\ntrue && $env?.[Bar]?.str\ntrue && $env?.[String]\ntrue && $env?.[foobar]\ntrue && $env?.[str]\ntrue && $env?.foobar\ntrue && $env?.i != f64\ntrue && $env?.ok\ntrue && 0 * i < 1\ntrue && 0 ?? add\ntrue && 1 < len($env)\ntrue && 1.0 == f64\ntrue && 1.0 > 0 and true\ntrue && 1.0 >= f64\ntrue && add ?? list\ntrue && false != false || true\ntrue && false && ok\ntrue && greet == greet\ntrue && nil != foo\ntrue && nil == ok\ntrue && nil == str\ntrue && ok ?: str\ntrue && str != str\ntrue && str ?? $env?.[ok]\ntrue && str ?? f64\ntrue && str ?? i\ntrue && str startsWith $env?.String\ntrue && true ?? ok\ntrue == $env == ok\ntrue == $env || $env != ok\ntrue == $env || 1.0 >= f64\ntrue == $env.ok\ntrue == $env?.Bar\ntrue == $env?.String\ntrue == $env?.[Bar]\ntrue == $env?.[String]\ntrue == $env?.[foobar]\ntrue == $env?.[str]\ntrue == $env?.foobar\ntrue == $env?.ok\ntrue == 1.0 ?? foo || ok\ntrue == f64 ?? greet\ntrue == false and ok\ntrue == foo ?? f64\ntrue == nil && false != nil\ntrue == nil && foo in $env\ntrue == nil == ok\ntrue == ok && ok\ntrue == true ?: add\ntrue == true or !true\ntrue ? $env : $env.f64\ntrue ? $env : $env.foo\ntrue ? $env : $env.str\ntrue ? $env : $env?.Bar\ntrue ? $env : $env?.String\ntrue ? $env : $env?.[array]\ntrue ? $env : $env?.[list]\ntrue ? $env : $env?.[ok]\ntrue ? $env : $env?.greet\ntrue ? $env : foo.String\ntrue ? $env : i | date(i)\ntrue ? 0 : $env.i\ntrue ? 0 : $env?.Bar\ntrue ? 0 : $env?.Bar?.greet\ntrue ? 0 : $env?.String\ntrue ? 0 : $env?.[Bar]\ntrue ? 0 : $env?.[add]?.[f64]\ntrue ? 0 : $env?.[sortBy(1, foobar)]\ntrue ? 0 : $env?.foobar\ntrue ? 0 : $env[:list(foobar)]\ntrue ? 0 : 1 < 1.0 ** 1.0\ntrue ? 0 : foo.String()\ntrue ? 0 : i > f64\ntrue ? 1 : $env | max(0, f64)\ntrue ? 1 : $env.f64\ntrue ? 1 : $env?.[ok]\ntrue ? 1 : $env?.i\ntrue ? 1 : 1.0 / 1 == f64\ntrue ? 1 : list | sortBy(add)\ntrue ? 1.0 : $env | sortBy(add)\ntrue ? 1.0 : $env.foo\ntrue ? 1.0 : $env.greet\ntrue ? 1.0 : $env.ok\ntrue ? 1.0 : $env.str\ntrue ? 1.0 : $env?.[Bar]\ntrue ? 1.0 : $env?.[i]\ntrue ? 1.0 : $env?.[str]\ntrue ? 1.0 : $env?.list\ntrue ? 1.0 : $env?.ok\ntrue ? 1.0 : str >= $env?.[Bar]\ntrue ? add : $env ^ 0 != $env\ntrue ? add : $env.f64\ntrue ? add : $env?.Bar\ntrue ? add : $env?.[add]\ntrue ? add : $env?.[ok]\ntrue ? add : foo.String\ntrue ? add : i != i\ntrue ? array : $env.array\ntrue ? array : $env?.[str]\ntrue ? array : $env?.foo\ntrue ? array : foo.String\ntrue ? f64 : $env.add\ntrue ? f64 : $env?.[f64]\ntrue ? f64 : $env?.[i]\ntrue ? f64 : $env?.greet\ntrue ? f64 : $env?.i\ntrue ? f64 : $env[foo?.[String]:]\ntrue ? false : $env | count($env)\ntrue ? false : $env.list\ntrue ? false : $env?.[array]\ntrue ? false : $env?.[i]\ntrue ? false : $env?.f64\ntrue ? false : $env[:Bar not matches $env]\ntrue ? false : array != array\ntrue ? foo : $env | greet()\ntrue ? foo : $env | one(ok)\ntrue ? foo : $env | sortBy(1.0)\ntrue ? foo : $env.array\ntrue ? foo : $env.foo\ntrue ? foo : $env?.[String]\ntrue ? foo : $env?.[foo]?.greet\ntrue ? foo : $env?.[str]\ntrue ? foo : $env?.array\ntrue ? foo : $env?.i\ntrue ? foo : $env?.str\ntrue ? foo : 1.0 + i\ntrue ? foo : array | sortBy(f64)\ntrue ? foo : foo ?? list\ntrue ? foo : foo.Bar\ntrue ? foo : foo.String\ntrue ? foo : foo?.Bar\ntrue ? foo : i .. i\ntrue ? greet : $env | sum(.greet)\ntrue ? greet : $env.greet\ntrue ? greet : $env?.[add].foo\ntrue ? greet : $env?.str\ntrue ? greet : foo?.Bar\ntrue ? greet : nil != none($env, #)\ntrue ? i : $env?.[Bar]\ntrue ? i : array | map(i)\ntrue ? list : $env | all(#.foo)\ntrue ? list : $env?.String\ntrue ? list : $env?.[f64]\ntrue ? list : $env?.[greet]\ntrue ? list : $env?.[ok]\ntrue ? list : $env?.ok\ntrue ? list : foo.Bar\ntrue ? list : foo?.Bar\ntrue ? list : foo?.String\ntrue ? nil : $env | bitxor(0)\ntrue ? nil : $env.str\ntrue ? nil : $env?.[f64]\ntrue ? nil : $env?.foo\ntrue ? nil : $env?.str\ntrue ? nil : $env[str(1.0):] | all(.list?.i(foobar))\ntrue ? nil : foo.Bar\ntrue ? nil : nil != greet\ntrue ? ok : $env.foo\ntrue ? ok : $env?.[str]\ntrue ? ok : $env?.array\ntrue ? ok : foo.String\ntrue ? str : $env?.array\ntrue ? str : $env?.f64\ntrue ? str : array | max(i)\ntrue ? str : foo.Bar\ntrue ? str : foo?.Bar\ntrue ? str : i + i\ntrue ? true : $env?.String.str\ntrue ? true : $env?.[array]\ntrue ? true : $env?.[array].greet\ntrue ? true : $env?.greet\ntrue ? true : $env?.str\ntrue ? true : 1.0 == $env?.Bar\ntrue ? true : array | date(false, foo)\ntrue ? true : foo?.Bar\ntrue ? true : list | sum(#)\ntrue ? true : str != str\ntrue ?: $env != 0 ^ $env\ntrue ?: $env % i\ntrue ?: $env or ok\ntrue ?: $env | any(.i)\ntrue ?: $env | count(.list)\ntrue ?: $env | find(#)\ntrue ?: $env | groupBy(.foo)\ntrue ?: $env | groupBy(1.0)\ntrue ?: $env | reduce(#.list)\ntrue ?: $env | reduce(1.0)\ntrue ?: $env.add\ntrue ?: $env.array\ntrue ?: $env.foo\ntrue ?: $env.greet\ntrue ?: $env.i\ntrue ?: $env.i ?? $env\ntrue ?: $env.list\ntrue ?: $env.ok\ntrue ?: $env.str\ntrue ?: $env?.Bar\ntrue ?: $env?.String\ntrue ?: $env?.[Bar]\ntrue ?: $env?.[String()]\ntrue ?: $env?.[array]\ntrue ?: $env?.[f64]\ntrue ?: $env?.[foo]\ntrue ?: $env?.[i]\ntrue ?: $env?.[list]\ntrue ?: $env?.add\ntrue ?: $env?.array\ntrue ?: $env?.f64\ntrue ?: $env?.foo\ntrue ?: $env?.greet\ntrue ?: $env?.i\ntrue ?: $env?.ok\ntrue ?: $env?.str\ntrue ?: $env[:foobar]\ntrue ?: 0 != 0 ? true : false\ntrue ?: 1.0 - f64\ntrue ?: 1.0 == f64\ntrue ?: 1.0 >= f64\ntrue ?: 1.0 | max($env)\ntrue ?: array | map(1.0)\ntrue ?: array?.[$env?.String()]\ntrue ?: foo ?? f64\ntrue ?: foo.Bar\ntrue ?: foo.String\ntrue ?: foo?.Bar\ntrue ?: foo?.String\ntrue ?: nil != f64\ntrue ?: nil == $env?.str\ntrue ?? $env.add\ntrue ?? $env.array\ntrue ?? $env.f64\ntrue ?? $env.foo\ntrue ?? $env.greet\ntrue ?? $env.i\ntrue ?? $env.list\ntrue ?? $env.ok\ntrue ?? $env.str\ntrue ?? $env?.Bar\ntrue ?? $env?.String\ntrue ?? $env?.String()\ntrue ?? $env?.String?.f64\ntrue ?? $env?.[1.0 not endsWith foobar]\ntrue ?? $env?.[Bar]\ntrue ?? $env?.[Bar]?.[str]\ntrue ?? $env?.[String]\ntrue ?? $env?.[abs(foobar)]\ntrue ?? $env?.[add]\ntrue ?? $env?.[array]\ntrue ?? $env?.[f64]\ntrue ?? $env?.[foo?.greet]\ntrue ?? $env?.[foo]\ntrue ?? $env?.[foo].array\ntrue ?? $env?.[foobar | one(#)]\ntrue ?? $env?.[foobar.f64(1, foobar, ok)]\ntrue ?? $env?.[greet]\ntrue ?? $env?.[i]\ntrue ?? $env?.[list]\ntrue ?? $env?.[ok]\ntrue ?? $env?.[ok]?.[greet]\ntrue ?? $env?.[str]\ntrue ?? $env?.add\ntrue ?? $env?.array\ntrue ?? $env?.f64\ntrue ?? $env?.foo\ntrue ?? $env?.foobar\ntrue ?? $env?.foobar.String\ntrue ?? $env?.greet\ntrue ?? $env?.i\ntrue ?? $env?.list\ntrue ?? $env?.ok\ntrue ?? $env?.str\ntrue ?? $env[$env?.[str]:]\ntrue ?? $env[:String.greet].greet\ntrue ?? $env[:array[:f64]]\ntrue ?? $env[f64():]\ntrue ?? $env[false == str:]\ntrue ?? $env[foobar ^ foobar:findIndex($env, #index)]\ntrue ?? $env[foobar:foobar]\ntrue ?? 0 ?? greet\ntrue ?? 1 ?? groupBy($env, .str)\ntrue ?? 1.0 ?? i\ntrue ?? array?.[i]\ntrue ?? foo ?? i\ntrue ?? foo.Bar\ntrue ?? foo.String\ntrue ?? foo?.Bar\ntrue ?? foo?.String\ntrue ?? foo?.String()\ntrue ?? i | get(false)\ntrue ?? list?.[i]\ntrue ?? nil ?? greet\ntrue and $env != greet\ntrue and $env == f64\ntrue and $env == last(array)\ntrue and $env ?? $env ?? add\ntrue and $env ?? count($env, #)\ntrue and $env ?? str\ntrue and $env startsWith $env?.Bar\ntrue and $env.ok\ntrue and $env?.Bar\ntrue and $env?.Bar?.Bar\ntrue and $env?.String\ntrue and $env?.String?.Bar\ntrue and $env?.String?.[array]\ntrue and $env?.String?.ok\ntrue and $env?.[Bar]\ntrue and $env?.[Bar]?.i\ntrue and $env?.[String]\ntrue and $env?.[str]\ntrue and $env?.foobar\ntrue and $env?.foobar?.array()\ntrue and $env?.ok\ntrue and 0 != f64\ntrue and 0 < i\ntrue and 1 > f64\ntrue and 1 > i\ntrue and 1 >= i\ntrue and 1 in sort($env)\ntrue and 1.0 > f64\ntrue and 1.0 in array\ntrue and add ?? array\ntrue and array != list\ntrue and f64 < f64\ntrue and f64 <= f64\ntrue and f64 ?? foo\ntrue and false ?? ok\ntrue and false || ok\ntrue and foo != foo\ntrue and foo == foo\ntrue and i == i\ntrue and nil != greet\ntrue and nil != list\ntrue and nil == greet\ntrue and str != str\ntrue and str ?? greet\ntrue and true || $env >= $env\ntrue in $env?.Bar\ntrue in $env?.Bar?.foo\ntrue in $env?.String\ntrue in $env?.[Bar]\ntrue in $env?.[String]\ntrue in $env?.[first(foobar)]\ntrue in $env?.[foobar | last(nil)]\ntrue in $env?.[foobar]\ntrue not in $env?.Bar\ntrue not in $env?.String\ntrue not in $env?.String?.Bar(foo)\ntrue not in $env?.[Bar]\ntrue not in $env?.[Bar]?.String\ntrue not in $env?.[Bar]?.foo\ntrue not in $env?.[String]\ntrue not in $env?.[String]?.[list]\ntrue not in $env?.[foobar]\ntrue not in array ?? add\ntrue not in array ?? foo\ntrue not in list ?? i\ntrue or $env != array\ntrue or $env != ok\ntrue or $env && ok\ntrue or $env * findIndex(list, true)\ntrue or $env - f64\ntrue or $env - list ?? false\ntrue or $env ?? $env?.[Bar]\ntrue or $env ?? foo\ntrue or $env endsWith $env?.greet($env)\ntrue or $env in str\ntrue or $env not in [i]\ntrue or $env startsWith str\ntrue or $env.ok\ntrue or $env?.Bar\ntrue or $env?.Bar()\ntrue or $env?.Bar(add not matches foobar)\ntrue or $env?.Bar(f64?.String() in count(greet))\ntrue or $env?.Bar?.array\ntrue or $env?.String\ntrue or $env?.String()\ntrue or $env?.String(add())\ntrue or $env?.String(true | findLastIndex(1))\ntrue or $env?.String?.ok\ntrue or $env?.[0 | one(1.0)]\ntrue or $env?.[Bar]\ntrue or $env?.[Bar].ok\ntrue or $env?.[String]\ntrue or $env?.[add]\ntrue or $env?.[add]?.[add]\ntrue or $env?.[add]?.str\ntrue or $env?.[array(ok, foobar)]\ntrue or $env?.[array]\ntrue or $env?.[array]?.greet?.Bar\ntrue or $env?.[array]?.str()\ntrue or $env?.[f64]\ntrue or $env?.[float(array, foobar)]\ntrue or $env?.[foo | findLastIndex(#)]\ntrue or $env?.[foo]\ntrue or $env?.[foobar != foo]\ntrue or $env?.[foobar | concat(true)]\ntrue or $env?.[greet]\ntrue or $env?.[greet]?.[add]\ntrue or $env?.[i.f64]\ntrue or $env?.[i]\ntrue or $env?.[i] == ok\ntrue or $env?.[list(foobar, foobar)]?.foo\ntrue or $env?.[list]\ntrue or $env?.[list]?.list\ntrue or $env?.[ok(foobar)]\ntrue or $env?.[ok]\ntrue or $env?.[str.greet]\ntrue or $env?.[str]\ntrue or $env?.[str].ok\ntrue or $env?.foobar\ntrue or $env?.min(1.0)\ntrue or $env?.ok\ntrue or $env?.sortBy(foo, 1.0)?.foo()\ntrue or $env[:1.0 or list]\ntrue or $env[:Bar]\ntrue or $env[:array ?: foo]\ntrue or $env[:bitnand(greet, foobar)]\ntrue or $env[:foobar?.String(foobar, foobar)]\ntrue or $env[:greet]\ntrue or $env[:i]\ntrue or $env[:nil | filter(false)]\ntrue or $env[:str]\ntrue or $env[:true || foobar]\ntrue or $env[foobar:]\ntrue or $env[foobar?.[array]:]\ntrue or $env[none($env, .String):]\ntrue or $env[ok:]\ntrue or $env[trimSuffix(foobar, nil, 1.0, array):]\ntrue or 0 < f64\ntrue or 0 < f64 ** 1\ntrue or 0 <= $env?.[f64]?.[foo]\ntrue or 0 <= i\ntrue or 0 ?? foo?.Bar\ntrue or 1 > f64\ntrue or 1 >= $env in $env\ntrue or 1.0 != i\ntrue or 1.0 <= $env ^ i\ntrue or 1.0 > i\ntrue or 1.0 >= f64\ntrue or array == list\ntrue or f64 + $env?.[add]\ntrue or f64 ?? foo\ntrue or f64 ?? i\ntrue or f64 ?? list\ntrue or false ?: sum($env, .Bar)\ntrue or false or ok\ntrue or foo != foo && true\ntrue or greet == greet\ntrue or i > $env[:foobar]\ntrue or i not in $env * f64\ntrue or list != list\ntrue or nil == add\ntrue or nil == str in $env\ntrue or nil not in $env?.[String]\ntrue or nil not in list\ntrue or ok && ok\ntrue or ok and foo == $env?.[String]\ntrue or ok in sum($env)\ntrue or str == toJSON(f64)\ntrue or str contains $env?.str\ntrue or str in $env[list:]\ntrue or str not in foo\ntrue || $env != 1.0 - $env\ntrue || $env != i\ntrue || $env <= foo?.Bar\ntrue || $env == greet\ntrue || $env > f64\ntrue || $env >= f64 - 0\ntrue || $env ?? add\ntrue || $env ?? array\ntrue || $env ?? f64\ntrue || $env ?? foo\ntrue || $env ?? ok\ntrue || $env contains str\ntrue || $env in str\ntrue || $env not contains $env?.[foo]\ntrue || $env not contains str\ntrue || $env or ok\ntrue || $env.ok\ntrue || $env?.Bar\ntrue || $env?.Bar()\ntrue || $env?.Bar?.i()\ntrue || $env?.String\ntrue || $env?.String($env | bitshl(str)).str\ntrue || $env?.String()\ntrue || $env?.String(false > foobar, array(foobar))\ntrue || $env?.String(foobar?.greet(foobar))\ntrue || $env?.String(map(foobar | findIndex(#.str), .greet))\ntrue || $env?.String(reduce(foobar, #.list).i)\ntrue || $env?.String?.list\ntrue || $env?.[$env > list]\ntrue || $env?.[Bar(nil, 0)]\ntrue || $env?.[Bar]\ntrue || $env?.[String]\ntrue || $env?.[add(String)]\ntrue || $env?.[add]\ntrue || $env?.[add].f64\ntrue || $env?.[add].f64.list\ntrue || $env?.[array?.array()]\ntrue || $env?.[array]\ntrue || $env?.[f64]\ntrue || $env?.[foo.i]\ntrue || $env?.[foo]\ntrue || $env?.[foobar | findIndex(add)]\ntrue || $env?.[foobar | findLastIndex(.ok)]\ntrue || $env?.[foobar]\ntrue || $env?.[greet]\ntrue || $env?.[i]\ntrue || $env?.[i]?.[ok]\ntrue || $env?.[list]\ntrue || $env?.[list]?.String\ntrue || $env?.[ok not startsWith 1.0]\ntrue || $env?.[ok]\ntrue || $env?.[ok]?.[ok]\ntrue || $env?.[str]\ntrue || $env?.[{foo: nil}]\ntrue || $env?.any($env)\ntrue || $env?.foobar\ntrue || $env?.ok\ntrue || $env?.reduce($env)\ntrue || $env[:String == foo]\ntrue || $env[:array($env)]\ntrue || $env[:foobar]\ntrue || $env[:ok ? false : add]\ntrue || $env[:str]\ntrue || $env[Bar | map(1):foobar]\ntrue || $env[String.Bar(foobar):add()]\ntrue || $env[duration(String):]\ntrue || $env[false | bitand(str):]\ntrue || $env[foo(foobar):f64 contains list]\ntrue || $env[foobar:]\ntrue || $env[foobar?.[str]:str()]\ntrue || $env[list endsWith str:foobar]\ntrue || $env[list:]\ntrue || $env[ok + foobar:]\ntrue || $env[ok not in foobar:]\ntrue || 0 != $env?.f64\ntrue || 0 != f64\ntrue || 0 <= $env?.String(str)\ntrue || 0 > 1.0 != true\ntrue || 0 >= median(0, $env)\ntrue || 1 > f64\ntrue || 1.0 ** f64 >= f64\ntrue || 1.0 + 1.0 > 1.0\ntrue || 1.0 < $env?.[str]\ntrue || 1.0 < find($env, #)\ntrue || 1.0 <= i\ntrue || 1.0 > f64\ntrue || 1.0 > f64 == true\ntrue || 1.0 >= f64\ntrue || 1.0 >= i\ntrue || 1.0 in $env?.[add]\ntrue || add != add\ntrue || add ?? f64\ntrue || array != list\ntrue || array ?? !true\ntrue || array not in $env?.[f64]\ntrue || false == $env?.[add]\ntrue || false ?: f64\ntrue || false ?: foo ?? f64\ntrue || false ?? $env?.[array]\ntrue || foo == $env || ok\ntrue || foo ?? array\ntrue || foo ?? ok\ntrue || i == $env?.[f64]\ntrue || i > f64\ntrue || i >= $env ?? $env\ntrue || i in array\ntrue || nil != f64\ntrue || nil != greet ?? $env\ntrue || nil != i\ntrue || nil == foo\ntrue || nil == ok\ntrue || ok ?? greet\ntrue || true && f64 != 1.0\ntrue || true and ok\ntrue; $env?.[str]\ntrue; foo?.String\ntype(!false)\ntype(!ok)\ntype(!true)\ntype($env != $env)\ntype($env != 0)\ntype($env != 1.0)\ntype($env != add)\ntype($env != f64)\ntype($env != foo)\ntype($env != greet)\ntype($env != list)\ntype($env != nil)\ntype($env != str)\ntype($env != true)\ntype($env && true)\ntype($env == $env)\ntype($env == 1)\ntype($env == 1.0)\ntype($env == add)\ntype($env == array)\ntype($env == f64)\ntype($env == false)\ntype($env == foo)\ntype($env == greet)\ntype($env == nil)\ntype($env == ok)\ntype($env == str)\ntype($env ?? $env)\ntype($env ?? 1)\ntype($env ?? 1.0)\ntype($env ?? array)\ntype($env ?? false)\ntype($env ?? foo)\ntype($env ?? greet)\ntype($env ?? i)\ntype($env ?? list)\ntype($env ?? nil)\ntype($env and false)\ntype($env and true)\ntype($env in array)\ntype($env in list)\ntype($env not in array)\ntype($env not in list)\ntype($env or false)\ntype($env or true)\ntype($env | all(true))\ntype($env | any(false))\ntype($env | any(ok))\ntype($env | any(true))\ntype($env | count(false))\ntype($env | count(ok))\ntype($env | count(true))\ntype($env | find(false))\ntype($env | findIndex(true))\ntype($env | findLastIndex(ok))\ntype($env | map(#index))\ntype($env | map($env))\ntype($env | map(1.0))\ntype($env | map(false))\ntype($env | map(foo))\ntype($env | map(ok))\ntype($env | map(str))\ntype($env | none(true))\ntype($env | one(false))\ntype($env | sum(0))\ntype($env | sum(1.0))\ntype($env || false)\ntype($env || true)\ntype($env) != foo?.Bar\ntype($env) != str\ntype($env) <= str\ntype($env) contains str\ntype($env) endsWith str\ntype($env) in foo\ntype($env) not contains toJSON(true)\ntype($env) not in foo\ntype($env) not matches str\ntype($env) startsWith type($env)\ntype($env) | greet()\ntype($env) | indexOf(str)\ntype($env.add)\ntype($env.array)\ntype($env.f64)\ntype($env.foo)\ntype($env.foo?.Bar)\ntype($env.greet)\ntype($env.i)\ntype($env.list)\ntype($env.ok)\ntype($env.str)\ntype($env?.$env)\ntype($env?.Bar)\ntype($env?.String)\ntype($env?.String?.add)\ntype($env?.String?.greet)\ntype($env?.[Bar])\ntype($env?.[Bar]) | trimPrefix(str)\ntype($env?.[String])\ntype($env?.[String]?.[i])\ntype($env?.[String]?.i)\ntype($env?.[foobar])\ntype($env?.[nil])\ntype($env?.[str])\ntype($env?.add)\ntype($env?.add) | greet()\ntype($env?.array)\ntype($env?.f64)\ntype($env?.false)\ntype($env?.foo)\ntype($env?.foo?.String)\ntype($env?.foobar)\ntype($env?.greet)\ntype($env?.i)\ntype($env?.list ?? foo)\ntype($env?.list)\ntype($env?.nil)\ntype($env?.ok)\ntype($env?.str)\ntype($env?.true)\ntype(-0)\ntype(-1)\ntype(-1.0)\ntype(-f64)\ntype(-i)\ntype(0 != $env)\ntype(0 != 0)\ntype(0 != 1.0)\ntype(0 != f64)\ntype(0 != i)\ntype(0 != nil)\ntype(0 % i)\ntype(0 * 0)\ntype(0 * 1)\ntype(0 ** 0)\ntype(0 + 0)\ntype(0 + 1)\ntype(0 + i)\ntype(0 - 0)\ntype(0 - 1)\ntype(0 - f64)\ntype(0 - i)\ntype(0 .. 0)\ntype(0 .. 1)\ntype(0 .. i)\ntype(0 / 1)\ntype(0 / 1.0)\ntype(0 / i)\ntype(0 < 0)\ntype(0 < 1)\ntype(0 < 1.0)\ntype(0 < f64)\ntype(0 <= 1)\ntype(0 <= 1.0)\ntype(0 <= i)\ntype(0 == $env)\ntype(0 == 1)\ntype(0 == 1.0)\ntype(0 == i)\ntype(0 == nil)\ntype(0 > 0)\ntype(0 > 1.0)\ntype(0 > i)\ntype(0 >= 1.0)\ntype(0 ?? $env)\ntype(0 ?? $env?.ok)\ntype(0 ?? 1)\ntype(0 ?? 1.0)\ntype(0 ?? foo)\ntype(0 ?? greet)\ntype(0 ?? list)\ntype(0 ?? nil)\ntype(0 ?? ok)\ntype(0 ?? str)\ntype(0 ^ 1)\ntype(0 ^ 1.0)\ntype(0 ^ f64)\ntype(0 ^ i)\ntype(0 | bitshr(0))\ntype(0 | bitxor(1))\ntype(0 | median(1, 1.0))\ntype(0 | min(0))\ntype(0 | min(i))\ntype(0) != str\ntype(0) ?? array\ntype(0) ?? i\ntype(0) ?? ok\ntype(0) in foo\ntype(0) not startsWith str\ntype(0) | greet()\ntype(0) | splitAfter(str)\ntype(0) | trim(str)\ntype(0)[i:]\ntype(0..i)\ntype(0.0)\ntype(0.1)\ntype(1 != $env)\ntype(1 != 1.0)\ntype(1 != f64)\ntype(1 != nil)\ntype(1 % 1)\ntype(1 * 0)\ntype(1 * 1)\ntype(1 * 1.0)\ntype(1 * f64)\ntype(1 * i)\ntype(1 ** 1.0)\ntype(1 ** f64)\ntype(1 + 0)\ntype(1 + 1)\ntype(1 + 1.0)\ntype(1 + i)\ntype(1 - 1.0)\ntype(1 .. 0)\ntype(1 .. 1)\ntype(1 / 0)\ntype(1 / 1)\ntype(1 / 1.0)\ntype(1 / f64)\ntype(1 / i)\ntype(1 < 1.0)\ntype(1 <= 0)\ntype(1 <= 1)\ntype(1 <= 1.0)\ntype(1 <= i)\ntype(1 == $env)\ntype(1 == 1.0)\ntype(1 == f64)\ntype(1 == i)\ntype(1 == nil)\ntype(1 > 0)\ntype(1 > 1)\ntype(1 > 1.0)\ntype(1 > f64)\ntype(1 > i)\ntype(1 >= 0)\ntype(1 >= 1.0)\ntype(1 >= f64)\ntype(1 >= i)\ntype(1 ?? $env)\ntype(1 ?? 0)\ntype(1 ?? add)\ntype(1 ?? foo)\ntype(1 ?? ok)\ntype(1 ?? str)\ntype(1 ^ 0)\ntype(1 ^ 1)\ntype(1 ^ 1.0)\ntype(1 in array)\ntype(1 not in array)\ntype(1) != str\ntype(1) < str\ntype(1) <= str\ntype(1) >= type(ok)\ntype(1) in $env?.Bar\ntype(1) not in foo\ntype(1) not matches str\ntype(1) startsWith reduce(list, #.Bar)\ntype(1) | greet()\ntype(1.0 != $env)\ntype(1.0 != $env?.i)\ntype(1.0 != 1)\ntype(1.0 != 1.0)\ntype(1.0 != f64)\ntype(1.0 != i)\ntype(1.0 != nil)\ntype(1.0 * 0)\ntype(1.0 * 1)\ntype(1.0 * 1.0)\ntype(1.0 * f64)\ntype(1.0 * i)\ntype(1.0 * i) | greet()\ntype(1.0 ** 1)\ntype(1.0 ** 1.0)\ntype(1.0 ** f64)\ntype(1.0 + 0)\ntype(1.0 + 1)\ntype(1.0 + 1.0)\ntype(1.0 + f64)\ntype(1.0 + i)\ntype(1.0 - 0)\ntype(1.0 - 1.0)\ntype(1.0 - f64)\ntype(1.0 - i)\ntype(1.0 / 1)\ntype(1.0 / 1.0)\ntype(1.0 / f64)\ntype(1.0 / i)\ntype(1.0 < 0)\ntype(1.0 < 1)\ntype(1.0 < 1.0)\ntype(1.0 < f64)\ntype(1.0 < i)\ntype(1.0 <= 0)\ntype(1.0 <= 1)\ntype(1.0 <= 1.0)\ntype(1.0 <= i)\ntype(1.0 == $env)\ntype(1.0 == 0)\ntype(1.0 == 1.0)\ntype(1.0 == f64)\ntype(1.0 == i)\ntype(1.0 == nil)\ntype(1.0 > 1.0)\ntype(1.0 > f64)\ntype(1.0 > i)\ntype(1.0 >= 0)\ntype(1.0 >= 1)\ntype(1.0 >= 1.0)\ntype(1.0 >= f64)\ntype(1.0 >= i)\ntype(1.0 ?? $env)\ntype(1.0 ?? 0)\ntype(1.0 ?? add)\ntype(1.0 ?? f64)\ntype(1.0 ?? foo)\ntype(1.0 ?? greet)\ntype(1.0 ?? i)\ntype(1.0 ?? nil)\ntype(1.0 ?? ok)\ntype(1.0 ?? str)\ntype(1.0 ^ 0)\ntype(1.0 ^ 1.0)\ntype(1.0 ^ f64)\ntype(1.0 ^ i)\ntype(1.0 in array)\ntype(1.0 | max(0))\ntype(1.0 | mean(1.0))\ntype(1.0)\ntype(1.0) + foo.Bar\ntype(1.0) + str\ntype(1.0) < str\ntype(1.0) >= str\ntype(1.0) ?? array\ntype(1.0) ?? f64\ntype(1.0) ?? greet($env)\ntype(1.0) contains str\ntype(1.0) not endsWith foo.Bar\ntype(1.0) not endsWith str\ntype(1.0) not matches str\ntype(1.0) not startsWith foo?.Bar\ntype(1.0) startsWith str\ntype(1.0) | greet()\ntype(1.0)[:i]\ntype([$env, $env])\ntype([$env, 0])\ntype([$env, f64])\ntype([$env])\ntype([0])\ntype([1.0, 0])\ntype([1.0, foo])\ntype([1.0])\ntype([1])\ntype([add])\ntype([array])\ntype([f64])\ntype([false, $env])\ntype([false])\ntype([foo, foo])\ntype([foo, i])\ntype([foo, nil])\ntype([foo])\ntype([greet])\ntype([i, array])\ntype([i, foo, nil])\ntype([i])\ntype([list, 1.0, true])\ntype([list, ok])\ntype([list])\ntype([nil, foo])\ntype([nil])\ntype([ok, f64])\ntype([ok, nil])\ntype([ok])\ntype([str])\ntype([true, foo])\ntype([true])\ntype(abs(0))\ntype(abs(1))\ntype(abs(1.0))\ntype(abs(f64))\ntype(abs(i))\ntype(add != $env)\ntype(add != add)\ntype(add == nil)\ntype(add ?? $env)\ntype(add ?? $env?.[i])\ntype(add ?? 0)\ntype(add ?? foo)\ntype(add ?? i)\ntype(add ?? list)\ntype(add ?? ok)\ntype(add ?? true)\ntype(add(1, 0))\ntype(add(i, 0))\ntype(add)\ntype(add) != str\ntype(add) == foo.Bar\ntype(add) > str\ntype(add) ?? max(array)\ntype(add) matches str\ntype(add) not matches str\ntype(add) | greet()\ntype(add)[:]\ntype(all($env, true))\ntype(all(array, false))\ntype(all(array, true))\ntype(all(list, true))\ntype(any($env, false))\ntype(any($env, ok))\ntype(any(array, 1 > #))\ntype(any(array, false))\ntype(any(array, ok))\ntype(any(list, false))\ntype(array != nil)\ntype(array == $env)\ntype(array == array)\ntype(array == nil)\ntype(array ?? $env)\ntype(array ?? 1.0)\ntype(array ?? add)\ntype(array ?? array)\ntype(array ?? f64)\ntype(array ?? false)\ntype(array ?? i)\ntype(array ?? nil)\ntype(array ?? str)\ntype(array ?? true)\ntype(array | find(false))\ntype(array | findIndex(false))\ntype(array | findIndex(ok))\ntype(array | groupBy(#))\ntype(array | groupBy(foo))\ntype(array | groupBy(ok))\ntype(array | map(#))\ntype(array | map(1))\ntype(array | map(greet))\ntype(array | min(array))\ntype(array | none(false))\ntype(array | none(ok))\ntype(array | reduce(#))\ntype(array | reduce(#, foo))\ntype(array | reduce(#index))\ntype(array | reduce(1.0, list))\ntype(array | reduce(1.0, ok))\ntype(array | reduce(false))\ntype(array | reduce(false, add))\ntype(array | reduce(foo))\ntype(array | reduce(true))\ntype(array | sortBy(#))\ntype(array | sum(#))\ntype(array | sum(1))\ntype(array | sum(1.0))\ntype(array | sum(i))\ntype(array)\ntype(array) != false ?? i\ntype(array) + str\ntype(array) < str\ntype(array) == str\ntype(array) ?? f64\ntype(array) ?? greet\ntype(array) ?? str\ntype(array) endsWith $env?.[Bar]?.[str]\ntype(array) in foo\ntype(array) not in foo\ntype(array) | repeat(1)\ntype(array?.[0])\ntype(array?.[i])\ntype(array[1:])\ntype(array[:0])\ntype(array[:])\ntype(array[:i])\ntype(bitnand(i, 0))\ntype(bitnot(0))\ntype(bitnot(1))\ntype(bitnot(i))\ntype(bitshr(i, 1))\ntype(bitxor(i, i))\ntype(ceil(0))\ntype(ceil(1 - f64))\ntype(ceil(1))\ntype(ceil(1.0))\ntype(ceil(f64))\ntype(ceil(floor(i)))\ntype(ceil(i))\ntype(concat(array))\ntype(concat(list))\ntype(count($env, ok))\ntype(count($env, true))\ntype(count([true]))\ntype(f64 != 0)\ntype(f64 != 1)\ntype(f64 != 1.0)\ntype(f64 != nil)\ntype(f64 * 0)\ntype(f64 * 1.0)\ntype(f64 * f64)\ntype(f64 * i)\ntype(f64 ** 0)\ntype(f64 ** 1.0)\ntype(f64 ** i)\ntype(f64 + 1)\ntype(f64 + 1.0)\ntype(f64 + f64)\ntype(f64 + i)\ntype(f64 - 0)\ntype(f64 - 1.0)\ntype(f64 / 0)\ntype(f64 / 1.0)\ntype(f64 / i)\ntype(f64 < 1)\ntype(f64 < 1.0)\ntype(f64 <= 1)\ntype(f64 <= 1.0)\ntype(f64 <= i)\ntype(f64 == 0)\ntype(f64 == 1)\ntype(f64 == f64)\ntype(f64 == nil)\ntype(f64 > 0 != $env)\ntype(f64 > 1)\ntype(f64 > 1.0)\ntype(f64 > f64)\ntype(f64 > i)\ntype(f64 >= 1)\ntype(f64 >= 1.0)\ntype(f64 >= f64)\ntype(f64 ?? $env?.[nil == nil])\ntype(f64 ?? array)\ntype(f64 ?? false)\ntype(f64 ?? foo)\ntype(f64 ?? str)\ntype(f64 ?? true)\ntype(f64 ^ 1)\ntype(f64 ^ 1.0)\ntype(f64 ^ f64)\ntype(f64 ^ i)\ntype(f64 not in array)\ntype(f64)\ntype(f64) == str\ntype(f64) > str\ntype(f64) >= str\ntype(f64) matches toJSON(1.0)\ntype(f64) not startsWith str\ntype(f64) startsWith str\ntype(f64) | greet()\ntype(false != false)\ntype(false != nil)\ntype(false != ok)\ntype(false != true)\ntype(false && $env)\ntype(false && ok)\ntype(false == $env)\ntype(false == false)\ntype(false == ok)\ntype(false ? f64 : 1)\ntype(false ? foo : add)\ntype(false ? foo : list)\ntype(false ? list : foo)\ntype(false ?? $env)\ntype(false ?? 1.0)\ntype(false ?? add)\ntype(false ?? f64)\ntype(false ?? i)\ntype(false ?? list)\ntype(false ?? nil)\ntype(false ?? ok)\ntype(false ?? str)\ntype(false ?? true)\ntype(false and $env)\ntype(false and true)\ntype(false or $env)\ntype(false or ok)\ntype(false or true)\ntype(false || $env)\ntype(false || false)\ntype(false || ok)\ntype(false || true)\ntype(false) == str\ntype(false) > str\ntype(false) ?? $env?.[i]\ntype(false) ?? greet\ntype(false) | greet()\ntype(false) | splitAfter(str)\ntype(filter($env, false))\ntype(find(array, false))\ntype(find(array, true))\ntype(findIndex($env, ok))\ntype(findIndex(list, ok))\ntype(findLast($env, false))\ntype(findLast(array, ok))\ntype(findLast(list, false))\ntype(findLast(list, ok))\ntype(findLastIndex(array, ok))\ntype(first($env))\ntype(first(array))\ntype(first(list))\ntype(flatten(array))\ntype(flatten(list))\ntype(float(0))\ntype(float(1))\ntype(float(1.0))\ntype(float(f64))\ntype(float(i))\ntype(floor(0))\ntype(floor(1))\ntype(floor(1.0))\ntype(floor(f64))\ntype(floor(i))\ntype(foo != $env)\ntype(foo != $env?.foo)\ntype(foo != foo)\ntype(foo != nil)\ntype(foo == $env)\ntype(foo == foo)\ntype(foo == nil)\ntype(foo ?? $env)\ntype(foo ?? 0)\ntype(foo ?? 1)\ntype(foo ?? 1.0)\ntype(foo ?? add)\ntype(foo ?? array)\ntype(foo ?? f64)\ntype(foo ?? false)\ntype(foo ?? foo)\ntype(foo ?? greet)\ntype(foo ?? i)\ntype(foo ?? list)\ntype(foo ?? nil)\ntype(foo ?? ok)\ntype(foo ?? true)\ntype(foo in list)\ntype(foo not in list)\ntype(foo)\ntype(foo) != $env?.foobar\ntype(foo) <= str\ntype(foo) > str\ntype(foo) ?? add\ntype(foo) ?? array\ntype(foo) contains $env?.Bar?.[add]\ntype(foo) matches $env?.String?.[greet]\ntype(foo) matches str\ntype(foo) not endsWith str\ntype(foo) not in $env and false\ntype(foo) not in foo and $env\ntype(foo) not matches str\ntype(foo) not startsWith str\ntype(foo) startsWith $env?.[Bar]\ntype(foo) | greet()\ntype(foo)[:]\ntype(foo.Bar)\ntype(foo.Bar) matches str\ntype(foo.String())\ntype(foo.String)\ntype(foo?.Bar)\ntype(foo?.String())\ntype(foo?.String)\ntype(greet != $env)\ntype(greet != greet)\ntype(greet == $env)\ntype(greet == greet)\ntype(greet == nil)\ntype(greet ?? $env)\ntype(greet ?? 1)\ntype(greet ?? 1.0)\ntype(greet ?? add)\ntype(greet ?? array)\ntype(greet ?? f64)\ntype(greet ?? false)\ntype(greet ?? greet)\ntype(greet ?? list)\ntype(greet ?? nil)\ntype(greet ?? str)\ntype(greet(str))\ntype(greet(toJSON(false)))\ntype(greet)\ntype(greet) ?? foo\ntype(greet) contains foo.Bar\ntype(greet) startsWith str\ntype(greet) | greet()\ntype(groupBy(array, #))\ntype(groupBy(array, 0))\ntype(groupBy(array, 1.0))\ntype(groupBy(array, false))\ntype(groupBy(array, foo))\ntype(groupBy(array, ok))\ntype(groupBy(list, #))\ntype(groupBy(list, .Bar))\ntype(groupBy(list, 0))\ntype(groupBy(list, 1.0))\ntype(groupBy(list, false))\ntype(i != $env)\ntype(i != 1.0)\ntype(i != array?.[i])\ntype(i != f64)\ntype(i != i)\ntype(i != nil)\ntype(i * 0)\ntype(i * 1)\ntype(i * 1.0)\ntype(i * f64)\ntype(i ** 0)\ntype(i ** 1.0)\ntype(i ** f64)\ntype(i + 0)\ntype(i + 1)\ntype(i + 1.0)\ntype(i + f64)\ntype(i + i)\ntype(i - 0)\ntype(i - 1)\ntype(i - 1.0)\ntype(i - f64)\ntype(i .. 0)\ntype(i .. i)\ntype(i / 1.0)\ntype(i < 1.0)\ntype(i < i)\ntype(i <= 0)\ntype(i <= 1)\ntype(i <= 1.0 + 1.0 == $env)\ntype(i <= 1.0)\ntype(i <= f64)\ntype(i <= i)\ntype(i == $env)\ntype(i == 1)\ntype(i == 1.0)\ntype(i == nil)\ntype(i > 1.0)\ntype(i > f64)\ntype(i >= 1.0)\ntype(i >= f64)\ntype(i >= i)\ntype(i ?? $env)\ntype(i ?? 1.0)\ntype(i ?? add)\ntype(i ?? false)\ntype(i ?? foo)\ntype(i ?? list)\ntype(i ?? nil)\ntype(i ^ 0)\ntype(i ^ 1)\ntype(i ^ i)\ntype(i | bitushr(i))\ntype(i)\ntype(i) <= str\ntype(i) ?? foo\ntype(i) ?? greet\ntype(i) matches string(ok)\ntype(i) not in foo\ntype(i) not startsWith str\ntype(i) | greet()\ntype(i) | splitAfter(str)\ntype(if false { $env } else { $env })\ntype(if false { f64 } else { 0 })\ntype(if false { nil } else { foo })\ntype(if false { nil } else { nil })\ntype(if false { nil } else { ok })\ntype(if false { str } else { add })\ntype(if false { true } else { array })\ntype(if ok { 1 } else { false })\ntype(if ok { array } else { ok })\ntype(if ok { foo } else { foo })\ntype(if ok { nil } else { str })\ntype(if true { i } else { 0 })\ntype(int(0))\ntype(int(1))\ntype(int(1.0))\ntype(int(f64))\ntype(int(i))\ntype(keys($env))\ntype(last($env))\ntype(last($env)?.String)\ntype(last($env)?.[i])\ntype(last($env?.Bar))\ntype(last(array))\ntype(last(list))\ntype(len($env))\ntype(len(array))\ntype(len(list))\ntype(len(str))\ntype(let bar = $env; bar)\ntype(let bar = true; bar)\ntype(let foobar = 1; foobar)\ntype(let y = list; let bar = i; y)\ntype(list != $env)\ntype(list != array)\ntype(list != list)\ntype(list != nil)\ntype(list == $env)\ntype(list == nil)\ntype(list ?? $env)\ntype(list ?? 0)\ntype(list ?? 1.0)\ntype(list ?? add)\ntype(list ?? foo)\ntype(list ?? greet)\ntype(list | any(ok))\ntype(list | count(true))\ntype(list | filter(true))\ntype(list | find(false))\ntype(list | findLast(ok))\ntype(list | groupBy(#))\ntype(list | groupBy(0))\ntype(list | groupBy(1.0))\ntype(list | map(#))\ntype(list | map(#index))\ntype(list | map(0))\ntype(list | map(1.0))\ntype(list | map(foo))\ntype(list | map(greet))\ntype(list | one(false))\ntype(list | one(ok))\ntype(list | reduce(#))\ntype(list | reduce(#, 0))\ntype(list | reduce(#, nil))\ntype(list | reduce(#.Bar))\ntype(list | reduce(#acc))\ntype(list | reduce($env))\ntype(list | reduce(i))\ntype(list | reduce(ok, add))\ntype(list | sortBy(#.Bar))\ntype(list)\ntype(list) == str\ntype(list) >= string(0)\ntype(list) ?? foo | reduce(foo, 1.0)\ntype(list) ?? greet\ntype(list) contains toBase64(str)\ntype(list) | hasSuffix(str)\ntype(list?.[i])\ntype(list?.[i].Bar)\ntype(list[0:])\ntype(list[:i])\ntype(lower($env?.[str]))\ntype(lower(str))\ntype(map($env, #index))\ntype(map($env, $env))\ntype(map($env, 1))\ntype(map($env, 1.0))\ntype(map($env, add))\ntype(map($env, f64))\ntype(map($env, foo))\ntype(map($env, greet))\ntype(map($env, i))\ntype(map(array, # == i))\ntype(map(array, #))\ntype(map(array, 0))\ntype(map(array, 1))\ntype(map(array, false))\ntype(map(list, #))\ntype(map(list, 1.0))\ntype(map(list, false))\ntype(map(list, foo))\ntype(max($env))\ntype(max(0))\ntype(max(0, array))\ntype(max(0, f64))\ntype(max(1))\ntype(max(1.0))\ntype(max(array))\ntype(max(f64))\ntype(max(i))\ntype(mean(0))\ntype(mean(1))\ntype(mean(1.0))\ntype(mean(array))\ntype(mean(array, 1.0))\ntype(mean(f64))\ntype(mean(i))\ntype(median($env.i))\ntype(median(0))\ntype(median(0, 1))\ntype(median(1.0))\ntype(median(array))\ntype(median(f64))\ntype(median(f64, 1.0))\ntype(median(i))\ntype(median(min(f64)))\ntype(min($env))\ntype(min(0))\ntype(min(1))\ntype(min(1.0))\ntype(min(array))\ntype(min(f64))\ntype(min(f64, 1.0))\ntype(min(i))\ntype(nil != $env)\ntype(nil != 0)\ntype(nil != 1)\ntype(nil != 1.0)\ntype(nil != add)\ntype(nil != array)\ntype(nil != false)\ntype(nil != foo)\ntype(nil != greet)\ntype(nil != i)\ntype(nil != list)\ntype(nil != nil)\ntype(nil != str)\ntype(nil == $env)\ntype(nil == 0)\ntype(nil == 1)\ntype(nil == 1.0)\ntype(nil == add)\ntype(nil == array)\ntype(nil == f64)\ntype(nil == false)\ntype(nil == foo)\ntype(nil == greet)\ntype(nil == i)\ntype(nil == list)\ntype(nil == nil)\ntype(nil == ok)\ntype(nil == str)\ntype(nil ?? $env)\ntype(nil ?? 0)\ntype(nil ?? 1.0)\ntype(nil ?? add)\ntype(nil ?? array)\ntype(nil ?? foo)\ntype(nil ?? i)\ntype(nil ?? nil)\ntype(nil ?? ok)\ntype(nil ?? str)\ntype(nil ?? true)\ntype(nil in $env)\ntype(nil in array)\ntype(nil in list)\ntype(nil not in $env)\ntype(nil not in array)\ntype(nil not in list)\ntype(nil) < str\ntype(nil) <= str\ntype(nil) >= str\ntype(nil) ?? toJSON($env)\ntype(nil) matches str\ntype(nil) matches string(foo)\ntype(nil) not endsWith str\ntype(nil) not in foo\ntype(nil) not in {foo: false}\ntype(nil) startsWith str\ntype(nil) | greet()\ntype(nil)[:]\ntype(none(array, false))\ntype(none(array, ok))\ntype(none(list, false))\ntype(none(list, ok))\ntype(not !false)\ntype(not false)\ntype(not ok)\ntype(not true)\ntype(ok != $env)\ntype(ok != nil)\ntype(ok && true)\ntype(ok == $env)\ntype(ok == false)\ntype(ok == nil)\ntype(ok == true)\ntype(ok ? 1 : 1.0)\ntype(ok ? 1 : foo)\ntype(ok ? list : foo)\ntype(ok ?: array)\ntype(ok ?: greet)\ntype(ok ?? 0)\ntype(ok ?? 1)\ntype(ok ?? 1.0)\ntype(ok ?? add)\ntype(ok ?? f64)\ntype(ok ?? foo)\ntype(ok ?? i)\ntype(ok ?? list)\ntype(ok ?? ok)\ntype(ok ?? str)\ntype(ok ?? true)\ntype(ok and $env)\ntype(ok and false)\ntype(ok and ok)\ntype(ok and true)\ntype(ok or $env)\ntype(ok or false)\ntype(ok or true)\ntype(ok || $env)\ntype(ok || false)\ntype(ok || ok)\ntype(ok || true)\ntype(ok)\ntype(ok) <= str\ntype(ok) ?? array\ntype(ok) ?? f64\ntype(ok) ?? foo\ntype(ok) contains str\ntype(ok) in foo\ntype(ok) in {foo: true}\ntype(ok) | greet()\ntype(one($env, false))\ntype(one($env, true))\ntype(reduce(array, #))\ntype(reduce(array, $env))\ntype(reduce(array, 0))\ntype(reduce(array, add))\ntype(reduce(array, array))\ntype(reduce(array, f64))\ntype(reduce(array, foo))\ntype(reduce(array, greet, false))\ntype(reduce(array, ok))\ntype(reduce(list, #))\ntype(reduce(list, #.String))\ntype(reduce(list, #index))\ntype(reduce(list, $env))\ntype(reduce(list, 0))\ntype(reduce(list, add))\ntype(reduce(list, false))\ntype(reduce(list, ok))\ntype(reverse([ok]))\ntype(reverse(array))\ntype(reverse(list))\ntype(round(0))\ntype(round(1))\ntype(round(1.0))\ntype(round(f64))\ntype(round(i))\ntype(sort($env))\ntype(sort(array))\ntype(sortBy(array, #))\ntype(sortBy(array, 0))\ntype(sortBy(array, 1.0))\ntype(sortBy(list, 0))\ntype(sortBy(list, i))\ntype(str != $env)\ntype(str != str)\ntype(str <= str)\ntype(str == $env)\ntype(str == str)\ntype(str > str)\ntype(str >= str)\ntype(str ?? $env)\ntype(str ?? 1.0)\ntype(str ?? f64)\ntype(str ?? foo)\ntype(str ?? i)\ntype(str ?? list)\ntype(str ?? nil)\ntype(str ?? ok)\ntype(str ?? str)\ntype(str contains str)\ntype(str in $env)\ntype(str in foo)\ntype(str not in $env)\ntype(str not in foo)\ntype(str)\ntype(str) <= trim(str)\ntype(str) == str\ntype(str) >= str\ntype(str) ?? -f64\ntype(str) ?? foo\ntype(str) contains $env?.String\ntype(str) matches str\ntype(str) not endsWith str\ntype(str) not in list?.[i]\ntype(str)[:]\ntype(str[:])\ntype(str[i:])\ntype(string($env))\ntype(string(0))\ntype(string(1))\ntype(string(1.0))\ntype(string(add))\ntype(string(array))\ntype(string(f64))\ntype(string(false != nil))\ntype(string(false))\ntype(string(foo))\ntype(string(greet))\ntype(string(list))\ntype(string(map($env, 1)))\ntype(string(nil))\ntype(string(ok))\ntype(string(str))\ntype(string(true))\ntype(sum($env, f64))\ntype(sum(array))\ntype(sum(array, #))\ntype(sum(array, 1))\ntype(sum(list, 1.0))\ntype(toBase64(str))\ntype(toJSON(0))\ntype(toJSON(1))\ntype(toJSON(1.0))\ntype(toJSON(array))\ntype(toJSON(f64))\ntype(toJSON(false))\ntype(toJSON(foo))\ntype(toJSON(i))\ntype(toJSON(list))\ntype(toJSON(median(i)))\ntype(toJSON(nil))\ntype(toJSON(ok))\ntype(toJSON(str))\ntype(toJSON(true))\ntype(toPairs($env))\ntype(trim(str))\ntype(trimPrefix(str))\ntype(trimSuffix(str))\ntype(true != $env)\ntype(true != nil)\ntype(true != ok)\ntype(true && $env)\ntype(true && ok)\ntype(true && true)\ntype(true == $env)\ntype(true == false)\ntype(true == ok)\ntype(true == true)\ntype(true ? $env : add)\ntype(true ? foo : 1)\ntype(true ? greet : 1.0)\ntype(true ?: 1)\ntype(true ?? 0)\ntype(true ?? 1)\ntype(true ?? 1.0)\ntype(true ?? array)\ntype(true ?? foo)\ntype(true and false)\ntype(true or $env)\ntype(true or false)\ntype(true or ok)\ntype(true || $env)\ntype(true || false)\ntype(true || true)\ntype(true) < foo?.String()\ntype(true) <= str\ntype(true) in foo\ntype(true) not in [add, false]\ntype(true) | greet()\ntype(type($env))\ntype(type($env.foo))\ntype(type(0))\ntype(type(1))\ntype(type(1.0))\ntype(type(add))\ntype(type(array))\ntype(type(f64))\ntype(type(false))\ntype(type(foo))\ntype(type(greet))\ntype(type(i))\ntype(type(list))\ntype(type(nil))\ntype(type(ok))\ntype(type(str))\ntype(type(true))\ntype(uniq(array))\ntype(uniq(list))\ntype(upper(str))\ntype(values($env))\ntype({foo: $env})\ntype({foo: $env}?.ok)\ntype({foo: -0})\ntype({foo: 0, foo: 1.0})\ntype({foo: 0, foo: add})\ntype({foo: 0, foo: false})\ntype({foo: 0, foo: foo})\ntype({foo: 0, foo: i})\ntype({foo: 0})\ntype({foo: 0}.greet)\ntype({foo: 1, foo: str})\ntype({foo: 1.0, foo: $env})\ntype({foo: 1.0, foo: greet, foo: ok})\ntype({foo: 1.0, foo: greet})\ntype({foo: 1.0})\ntype({foo: 1})\ntype({foo: add})\ntype({foo: array, foo: array | reduce(#, i)})\ntype({foo: array, foo: foo})\ntype({foo: array})\ntype({foo: f64, foo: $env})\ntype({foo: f64, foo: add})\ntype({foo: f64, foo: true})\ntype({foo: f64})\ntype({foo: false, foo: 1.0})\ntype({foo: false, foo: foo})\ntype({foo: false, foo: nil})\ntype({foo: false})\ntype({foo: foo, foo: $env})\ntype({foo: foo, foo: 1})\ntype({foo: foo, foo: foo})\ntype({foo: foo, foo: i})\ntype({foo: foo, foo: list})\ntype({foo: foo})\ntype({foo: foo}.Bar)\ntype({foo: greet, foo: i})\ntype({foo: greet})\ntype({foo: i, foo: ok})\ntype({foo: i})\ntype({foo: list})\ntype({foo: nil})\ntype({foo: ok, foo: 0})\ntype({foo: ok})\ntype({foo: str, foo: str})\ntype({foo: str})\ntype({foo: toJSON(foo)})\ntype({foo: true})\nuniq($env | filter(false))\nuniq($env | map(#index))\nuniq($env | map(0))\nuniq($env | map(1.0))\nuniq($env | map(add))\nuniq($env | map(f64))\nuniq($env | map(foo))\nuniq($env | map(ok))\nuniq($env | map(str))\nuniq($env | reduce(array, foo))\nuniq($env.array)\nuniq($env.list)\nuniq($env?.array)\nuniq($env?.list)\nuniq($env?.list[i:])\nuniq(0 .. 0)\nuniq(0 .. i)\nuniq(1 .. 0)\nuniq([$env, add])\nuniq([$env])\nuniq([0, 1.0])\nuniq([0])\nuniq([1 == nil])\nuniq([1.0, $env, foo])\nuniq([1.0, $env])\nuniq([1.0, array])\nuniq([1.0, ok])\nuniq([1.0, str])\nuniq([1.0])\nuniq([1])\nuniq([add, 1.0])\nuniq([add])\nuniq([array, true])\nuniq([array])\nuniq([f64])\nuniq([false, str])\nuniq([false, true])\nuniq([false])\nuniq([foo, foo])\nuniq([foo])\nuniq([greet, $env])\nuniq([greet])\nuniq([i])\nuniq([list])\nuniq([nil, $env])\nuniq([nil, nil])\nuniq([nil])\nuniq([ok])\nuniq([str, 1.0])\nuniq([str, true])\nuniq([str])\nuniq([true, $env])\nuniq([true, true])\nuniq([true])\nuniq(array ?? 0)\nuniq(array ?? 1)\nuniq(array ?? 1.0)\nuniq(array ?? add)\nuniq(array ?? false)\nuniq(array ?? i)\nuniq(array ?? list)\nuniq(array | filter(ok))\nuniq(array | map(#))\nuniq(array | map(1.0))\nuniq(array | sortBy(#))\nuniq(array | sortBy(1))\nuniq(array)\nuniq(array) != array\nuniq(array) == array\nuniq(array) | all(ok)\nuniq(array) | count(false)\nuniq(array) | filter(false)\nuniq(array) | filter(true)\nuniq(array) | groupBy(1)\nuniq(array) | groupBy(1.0)\nuniq(array) | groupBy(ok)\nuniq(array) | map(1)\nuniq(array) | map(add)\nuniq(array) | map(true)\nuniq(array) | min(i)\nuniq(array) | one(false)\nuniq(array) | reduce(#)\nuniq(array) | reduce(1.0)\nuniq(array) | reduce(false)\nuniq(array) | reduce(foo)\nuniq(array) | reduce(greet)\nuniq(array) | reduce(i)\nuniq(array) | sortBy(#)\nuniq(array) | sortBy(1)\nuniq(array) | sum(#)\nuniq(array); str\nuniq(array)?.[i]\nuniq(array)[:]\nuniq(array)[:i]\nuniq(array)[i:]\nuniq(array[1:i])\nuniq(array[:1])\nuniq(array[:])\nuniq(array[:i])\nuniq(concat(array))\nuniq(concat(list))\nuniq(false ? 0 : array)\nuniq(filter(array, ok))\nuniq(filter(array, true))\nuniq(filter(list, false))\nuniq(flatten(array))\nuniq(flatten(list))\nuniq(keys($env))\nuniq(list ?? 1.0)\nuniq(list ?? f64)\nuniq(list ?? false)\nuniq(list ?? foo | map(#))\nuniq(list ?? foo)\nuniq(list ?? str)\nuniq(list ?? true)\nuniq(list | map(#))\nuniq(list | map(.String))\nuniq(list | map(1.0))\nuniq(list | map(add))\nuniq(list | map(false))\nuniq(list | map(foo))\nuniq(list | map(greet))\nuniq(list | reduce(list))\nuniq(list | sortBy(#.Bar))\nuniq(list | sortBy(1.0))\nuniq(list)\nuniq(list) != array\nuniq(list) ?? ok\nuniq(list) | all(false)\nuniq(list) | all(true)\nuniq(list) | find(false)\nuniq(list) | findIndex(false)\nuniq(list) | findLast(false)\nuniq(list) | groupBy(#)\nuniq(list) | groupBy(1.0)\nuniq(list) | groupBy(i)\nuniq(list) | groupBy(ok)\nuniq(list) | map(#)\nuniq(list) | map(.String)\nuniq(list) | map(false)\nuniq(list) | map(greet)\nuniq(list) | one(true)\nuniq(list) | reduce(#.String)\nuniq(list) | reduce(foo, foo)\nuniq(list) | reduce(ok)\nuniq(list) | reduce(true, 1.0)\nuniq(list) | sortBy(0)\nuniq(list) | sortBy(1)\nuniq(list) | sum(0)\nuniq(list)?.[i]\nuniq(list)[$env.i:]\nuniq(list[1:])\nuniq(list[:i])\nuniq(list[i:])\nuniq(map($env, 1.0))\nuniq(map($env, array))\nuniq(map($env, foo))\nuniq(map($env, i))\nuniq(map($env, list))\nuniq(map($env, ok))\nuniq(map($env, str))\nuniq(map($env, true))\nuniq(map(array, #))\nuniq(map(array, 1.0))\nuniq(map(array, array))\nuniq(map(array, greet))\nuniq(map(array, i))\nuniq(map(array, ok))\nuniq(map(list, #))\nuniq(map(list, f64))\nuniq(map(list, ok))\nuniq(reduce(array, array))\nuniq(reverse(array))\nuniq(reverse(list))\nuniq(sort($env))\nuniq(sort(array))\nuniq(sortBy(array, #))\nuniq(sortBy(array, 0))\nuniq(sortBy(list, #.Bar))\nuniq(sortBy(list, 1))\nuniq(sortBy(list, 1.0))\nuniq(toPairs($env))\nuniq(uniq(array))\nuniq(uniq(list))\nuniq(values($env))\nupper($env | reduce(str, nil))\nupper($env.str)\nupper($env?.[str])\nupper($env?.str)\nupper(array | reduce(str, list))\nupper(foo.Bar)\nupper(foo.Bar) > str\nupper(foo.Bar) ?? add\nupper(foo.String())\nupper(foo?.Bar)\nupper(foo?.String())\nupper(greet(str))\nupper(list | reduce(#.Bar))\nupper(list?.[i]?.Bar)\nupper(lower(str))\nupper(nil ?? $env?.str)\nupper(reduce(array, str))\nupper(str ?? 0)\nupper(str ?? 1.0)\nupper(str ?? array)\nupper(str ?? greet)\nupper(str ?? list)\nupper(str | greet())\nupper(str)\nupper(str) <= string($env)\nupper(str) ?? add\nupper(str) in foo\nupper(str) matches str\nupper(str) not contains str\nupper(str) not endsWith str\nupper(str) not in foo\nupper(str) | greet()\nupper(str[1:])\nupper(str[:0])\nupper(str[i:])\nupper(string($env))\nupper(string(0))\nupper(string(1))\nupper(string(1.0))\nupper(string(add))\nupper(string(array))\nupper(string(f64))\nupper(string(foo))\nupper(string(foo.Bar))\nupper(string(greet))\nupper(string(i))\nupper(string(list))\nupper(string(nil))\nupper(string(ok))\nupper(string(str))\nupper(string(true))\nupper(toBase64(str))\nupper(toJSON(0))\nupper(toJSON(1))\nupper(toJSON(1.0))\nupper(toJSON(array))\nupper(toJSON(f64))\nupper(toJSON(false))\nupper(toJSON(foo))\nupper(toJSON(i))\nupper(toJSON(list))\nupper(toJSON(nil))\nupper(toJSON(ok))\nupper(toJSON(reduce(list, ok)))\nupper(toJSON(str))\nupper(toJSON(true))\nupper(trim(str))\nupper(trimPrefix(str))\nupper(trimSuffix(str))\nupper(type($env))\nupper(type(0))\nupper(type(1))\nupper(type(1.0))\nupper(type(add))\nupper(type(array))\nupper(type(f64))\nupper(type(false))\nupper(type(foo))\nupper(type(foo?.Bar))\nupper(type(greet))\nupper(type(i))\nupper(type(list))\nupper(type(nil))\nupper(type(ok))\nupper(type(str))\nupper(type(true))\nupper(upper(str))\nvalues($env ?? $env)\nvalues($env ?? 0)\nvalues($env ?? 1)\nvalues($env ?? 1.0)\nvalues($env ?? false)\nvalues($env ?? foo)\nvalues($env ?? greet)\nvalues($env ?? ok)\nvalues($env ?? true)\nvalues($env | reduce($env, 1))\nvalues($env) ?? add\nvalues($env) ?? foo\nvalues($env) ?? i\nvalues($env) | all(ok)\nvalues($env) | find(false)\nvalues($env) | findIndex(ok)\nvalues($env) | findIndex(true)\nvalues($env) | findLast(ok)\nvalues($env) | findLastIndex(ok)\nvalues($env) | groupBy(1)\nvalues($env) | groupBy(f64)\nvalues($env) | groupBy(foo)\nvalues($env) | groupBy(str)\nvalues($env) | map(#)\nvalues($env) | map(1.0)\nvalues($env) | map(add)\nvalues($env) | map(f64)\nvalues($env) | map(foo)\nvalues($env) | map(greet)\nvalues($env) | one(true)\nvalues($env) | reduce(#)\nvalues($env) | reduce(#index)\nvalues($env) | reduce(1)\nvalues($env) | reduce(1.0, 0)\nvalues($env) | reduce(add, nil)\nvalues($env) | reduce(array)\nvalues($env) | reduce(foo, nil)\nvalues($env) | reduce(i)\nvalues($env) | sortBy(i)\nvalues($env) | sum(1)\nvalues($env) | sum(1.0)\nvalues($env)?.[i]\nvalues(array | groupBy(#))\nvalues(array | groupBy(0))\nvalues(array | groupBy(1))\nvalues(array | groupBy(false))\nvalues(false ? add : $env)\nvalues(groupBy(array, 0))\nvalues(groupBy(array, 1.0))\nvalues(groupBy(array, foo))\nvalues(groupBy(array, ok))\nvalues(groupBy(list, #))\nvalues(groupBy(list, 1.0))\nvalues(groupBy(list, f64))\nvalues(groupBy(list, false))\nvalues(groupBy(list, ok))\nvalues(if ok { $env } else { str })\nvalues(list | groupBy(#))\nvalues(list | groupBy(.Bar))\nvalues(list | groupBy(false))\nvalues(max($env))\nvalues(min($env))\nvalues(nil ?? $env)\nvalues(ok ? $env : nil)\nvalues(reduce(array, $env))\nvalues(reduce(list, $env))\nvalues({foo: $env})\nvalues({foo: $env}?.foo)\nvalues({foo: 0, foo: 0})\nvalues({foo: 0})\nvalues({foo: 1, foo: 0})\nvalues({foo: 1.0 * 0})\nvalues({foo: 1.0, foo: 1.0})\nvalues({foo: 1.0, foo: f64})\nvalues({foo: 1.0})\nvalues({foo: 1})\nvalues({foo: add, foo: i})\nvalues({foo: array, foo: foo})\nvalues({foo: array, foo: nil, foo: foo})\nvalues({foo: array})\nvalues({foo: f64})\nvalues({foo: false, foo: false})\nvalues({foo: false})\nvalues({foo: foo, foo: list})\nvalues({foo: foo})\nvalues({foo: greet, foo: 0})\nvalues({foo: greet, foo: 1.0, foo: false})\nvalues({foo: greet, foo: foo})\nvalues({foo: greet})\nvalues({foo: i, foo: true})\nvalues({foo: i})\nvalues({foo: last($env)})\nvalues({foo: list})\nvalues({foo: nil, foo: list})\nvalues({foo: nil, foo: ok})\nvalues({foo: nil})\nvalues({foo: ok, foo: $env})\nvalues({foo: ok, foo: 1.0})\nvalues({foo: ok, foo: list})\nvalues({foo: ok})\nvalues({foo: str})\nvalues({foo: true, foo: 1.0})\nvalues({foo: true, foo: false})\nvalues({foo: true})\n{foo: !false}\n{foo: !ok, foo: greet}\n{foo: !ok}\n{foo: !true, foo: greet}\n{foo: !true}\n{foo: $env != $env}\n{foo: $env != $env}.f64\n{foo: $env != 0}\n{foo: $env != 1.0}\n{foo: $env != 1}\n{foo: $env != add}\n{foo: $env != array}\n{foo: $env != f64, foo: foo}\n{foo: $env != false}\n{foo: $env != foo}\n{foo: $env != greet}\n{foo: $env != greet}.Bar\n{foo: $env != i}\n{foo: $env != list}\n{foo: $env != nil, foo: array}\n{foo: $env != nil}\n{foo: $env != ok}\n{foo: $env != str}\n{foo: $env && false}\n{foo: $env && true}\n{foo: $env == $env}\n{foo: $env == 0}\n{foo: $env == 0}.array\n{foo: $env == 1.0}\n{foo: $env == 1}\n{foo: $env == 1}?.greet\n{foo: $env == add}\n{foo: $env == array}\n{foo: $env == f64}\n{foo: $env == false}\n{foo: $env == foo}\n{foo: $env == foo}.i\n{foo: $env == greet}\n{foo: $env == i}\n{foo: $env == list}\n{foo: $env == nil}\n{foo: $env == ok}\n{foo: $env == str}\n{foo: $env == true}\n{foo: $env ?? $env}\n{foo: $env ?? 1, foo: list}\n{foo: $env ?? 1.0}\n{foo: $env ?? 1}\n{foo: $env ?? array}\n{foo: $env ?? f64}\n{foo: $env ?? f64}.Bar\n{foo: $env ?? foo}\n{foo: $env ?? greet}\n{foo: $env ?? i}\n{foo: $env ?? list}\n{foo: $env ?? nil}\n{foo: $env ?? str}\n{foo: $env and false}\n{foo: $env and true}\n{foo: $env in array}\n{foo: $env in list}\n{foo: $env not in list}\n{foo: $env or false}\n{foo: $env or true}\n{foo: $env | all(ok)}\n{foo: $env | any(ok)}\n{foo: $env | any(true)}\n{foo: $env | find(false)}\n{foo: $env | map(#index)}\n{foo: $env | map($env)}\n{foo: $env | map(0)}\n{foo: $env | map(1)}\n{foo: $env | map(add), foo: i}\n{foo: $env | map(add)}\n{foo: $env | map(f64)}\n{foo: $env | map(foo)}\n{foo: $env | map(i)}\n{foo: $env | map(list)}\n{foo: $env | none(false)}\n{foo: $env | none(true)}\n{foo: $env | one(true)}\n{foo: $env | reduce($env, foo)}?.f64\n{foo: $env | reduce(1, $env)}\n{foo: $env | reduce(foo, 1.0)}\n{foo: $env | reduce(greet, i)}\n{foo: $env | sum(0)}\n{foo: $env | sum(1.0)}\n{foo: $env || false}\n{foo: $env || true}\n{foo: $env, foo: $env, foo: true}?.add\n{foo: $env, foo: $env}.Bar\n{foo: $env, foo: $env}.String\n{foo: $env, foo: $env}.add\n{foo: $env, foo: $env}.array\n{foo: $env, foo: $env}.f64\n{foo: $env, foo: $env}.foo\n{foo: $env, foo: $env}.greet\n{foo: $env, foo: $env}.i\n{foo: $env, foo: $env}.i?.[ok]\n{foo: $env, foo: $env}.ok\n{foo: $env, foo: $env}.str\n{foo: $env, foo: $env}?.String\n{foo: $env, foo: $env}?.[str]\n{foo: $env, foo: $env}?.add\n{foo: $env, foo: $env}?.array\n{foo: $env, foo: $env}?.f64\n{foo: $env, foo: $env}?.foo\n{foo: $env, foo: $env}?.foobar\n{foo: $env, foo: $env}?.greet\n{foo: $env, foo: $env}?.i\n{foo: $env, foo: $env}?.list\n{foo: $env, foo: $env}?.ok\n{foo: $env, foo: $env}?.str\n{foo: $env, foo: 0}.Bar\n{foo: $env, foo: 0}.add\n{foo: $env, foo: 0}.foo\n{foo: $env, foo: 0}.greet\n{foo: $env, foo: 0}.list\n{foo: $env, foo: 0}.ok\n{foo: $env, foo: 0}?.Bar\n{foo: $env, foo: 0}?.false?.ok\n{foo: $env, foo: 0}?.i\n{foo: $env, foo: 0}?.list\n{foo: $env, foo: 1, foo: foo}?.foo\n{foo: $env, foo: 1.0, foo: foo}.ok\n{foo: $env, foo: 1.0, foo: greet}.str\n{foo: $env, foo: 1.0}.Bar\n{foo: $env, foo: 1.0}.String\n{foo: $env, foo: 1.0}.add\n{foo: $env, foo: 1.0}.f64\n{foo: $env, foo: 1.0}.foo\n{foo: $env, foo: 1.0}.greet\n{foo: $env, foo: 1.0}.i\n{foo: $env, foo: 1.0}.list\n{foo: $env, foo: 1.0}.ok\n{foo: $env, foo: 1.0}.str\n{foo: $env, foo: 1.0}?.Bar\n{foo: $env, foo: 1.0}?.array\n{foo: $env, foo: 1.0}?.foo\n{foo: $env, foo: 1.0}?.greet\n{foo: $env, foo: 1.0}?.i\n{foo: $env, foo: 1.0}?.ok\n{foo: $env, foo: 1.0}?.str\n{foo: $env, foo: 1}.Bar\n{foo: $env, foo: 1}.String\n{foo: $env, foo: 1}.add\n{foo: $env, foo: 1}.f64\n{foo: $env, foo: 1}.foo\n{foo: $env, foo: 1}.list\n{foo: $env, foo: 1}.ok\n{foo: $env, foo: 1}?.String\n{foo: $env, foo: 1}?.[str]\n{foo: $env, foo: 1}?.array\n{foo: $env, foo: 1}?.f64\n{foo: $env, foo: 1}?.greet\n{foo: $env, foo: 1}?.i\n{foo: $env, foo: add, foo: $env}?.foo\n{foo: $env, foo: add}.Bar\n{foo: $env, foo: add}.foo?.list\n{foo: $env, foo: add}.i\n{foo: $env, foo: add}.list\n{foo: $env, foo: add}.str\n{foo: $env, foo: add}.str?.array\n{foo: $env, foo: add}?.Bar\n{foo: $env, foo: add}?.add\n{foo: $env, foo: add}?.foo\n{foo: $env, foo: add}?.list\n{foo: $env, foo: add}?.ok\n{foo: $env, foo: array}.array\n{foo: $env, foo: array}.foo\n{foo: $env, foo: array}.greet\n{foo: $env, foo: array}.i\n{foo: $env, foo: array}.list\n{foo: $env, foo: array}?.Bar\n{foo: $env, foo: array}?.array\n{foo: $env, foo: array}?.f64\n{foo: $env, foo: array}?.foo\n{foo: $env, foo: array}?.greet\n{foo: $env, foo: array}?.str\n{foo: $env, foo: f64}.String\n{foo: $env, foo: f64}.String?.array\n{foo: $env, foo: f64}.add\n{foo: $env, foo: f64}.f64\n{foo: $env, foo: f64}?.foo\n{foo: $env, foo: f64}?.i\n{foo: $env, foo: false, foo: foo}?.str\n{foo: $env, foo: false, foo: str}.array\n{foo: $env, foo: false}.add\n{foo: $env, foo: false}.array\n{foo: $env, foo: false}.i\n{foo: $env, foo: false}.list\n{foo: $env, foo: false}.str\n{foo: $env, foo: false}?.[str]\n{foo: $env, foo: false}?.array\n{foo: $env, foo: false}?.greet\n{foo: $env, foo: false}?.i\n{foo: $env, foo: foo, foo: $env}?.greet\n{foo: $env, foo: foo, foo: foo}?.i\n{foo: $env, foo: foo, foo: list}.String\n{foo: $env, foo: foo, foo: nil}.ok\n{foo: $env, foo: foo, foo: ok}?.ok\n{foo: $env, foo: foo}.String\n{foo: $env, foo: foo}.array\n{foo: $env, foo: foo}.foo\n{foo: $env, foo: foo}.foobar\n{foo: $env, foo: foo}.greet\n{foo: $env, foo: foo}.i\n{foo: $env, foo: foo}.list\n{foo: $env, foo: foo}.ok\n{foo: $env, foo: foo}.str\n{foo: $env, foo: foo}?.Bar\n{foo: $env, foo: foo}?.String\n{foo: $env, foo: foo}?.add\n{foo: $env, foo: foo}?.array\n{foo: $env, foo: foo}?.greet\n{foo: $env, foo: foo}?.i?.[array]\n{foo: $env, foo: foo}?.list\n{foo: $env, foo: foo}?.ok\n{foo: $env, foo: foo}?.str\n{foo: $env, foo: greet, foo: 0}.greet\n{foo: $env, foo: greet, foo: foo}.f64\n{foo: $env, foo: greet, foo: nil}?.foo\n{foo: $env, foo: greet}.Bar?.[list]?.greet\n{foo: $env, foo: greet}.add\n{foo: $env, foo: greet}.f64\n{foo: $env, foo: greet}.foo\n{foo: $env, foo: greet}.i\n{foo: $env, foo: greet}.str\n{foo: $env, foo: greet}?.Bar\n{foo: $env, foo: greet}?.[str]\n{foo: $env, foo: greet}?.add\n{foo: $env, foo: greet}?.f64\n{foo: $env, foo: greet}?.greet\n{foo: $env, foo: greet}?.list\n{foo: $env, foo: i, foo: nil}.greet\n{foo: $env, foo: i}.greet\n{foo: $env, foo: i}?.Bar\n{foo: $env, foo: i}?.String\n{foo: $env, foo: i}?.add\n{foo: $env, foo: i}?.foo\n{foo: $env, foo: list, foo: 1}?.[str]\n{foo: $env, foo: list}.Bar\n{foo: $env, foo: list}.array\n{foo: $env, foo: list}.greet\n{foo: $env, foo: list}.ok\n{foo: $env, foo: list}?.Bar?.greet\n{foo: $env, foo: list}?.[str]\n{foo: $env, foo: list}?.add\n{foo: $env, foo: list}?.array\n{foo: $env, foo: list}?.greet\n{foo: $env, foo: list}?.list\n{foo: $env, foo: list}?.str\n{foo: $env, foo: nil}.Bar\n{foo: $env, foo: nil}.String\n{foo: $env, foo: nil}.array\n{foo: $env, foo: nil}.foo\n{foo: $env, foo: nil}.foobar?.i\n{foo: $env, foo: nil}.greet\n{foo: $env, foo: nil}.ok\n{foo: $env, foo: nil}.ok?.ok(ok)\n{foo: $env, foo: nil}.str\n{foo: $env, foo: nil}?.[str]\n{foo: $env, foo: nil}?.add\n{foo: $env, foo: nil}?.array\n{foo: $env, foo: nil}?.f64\n{foo: $env, foo: nil}?.foobar\n{foo: $env, foo: nil}?.list\n{foo: $env, foo: nil}?.ok\n{foo: $env, foo: nil}?.str\n{foo: $env, foo: ok}.Bar\n{foo: $env, foo: ok}.String\n{foo: $env, foo: ok}.array\n{foo: $env, foo: ok}.f64\n{foo: $env, foo: ok}.i\n{foo: $env, foo: ok}?.greet\n{foo: $env, foo: str, foo: f64}?.i\n{foo: $env, foo: str, foo: nil}?.array\n{foo: $env, foo: str}.array\n{foo: $env, foo: str}.f64\n{foo: $env, foo: str}.ok\n{foo: $env, foo: str}?.Bar\n{foo: $env, foo: str}?.[str]\n{foo: $env, foo: str}?.f64\n{foo: $env, foo: str}?.foo\n{foo: $env, foo: str}?.greet\n{foo: $env, foo: str}?.ok\n{foo: $env, foo: true, foo: 1.0}?.list\n{foo: $env, foo: true, foo: nil}?.greet\n{foo: $env, foo: true}.Bar\n{foo: $env, foo: true}.String?.list\n{foo: $env, foo: true}.array\n{foo: $env, foo: true}.foo\n{foo: $env, foo: true}.foobar\n{foo: $env, foo: true}.list\n{foo: $env, foo: true}.ok\n{foo: $env, foo: true}.str?.list\n{foo: $env, foo: true}?.String\n{foo: $env, foo: true}?.[str]\n{foo: $env, foo: true}?.array\n{foo: $env, foo: true}?.greet\n{foo: $env, foo: true}?.ok\n{foo: $env.add, foo: $env.ok}\n{foo: $env.add}\n{foo: $env.add}.String\n{foo: $env.add}.array\n{foo: $env.add}?.[str]\n{foo: $env.add}?.f64\n{foo: $env.array, foo: $env != i}?.str\n{foo: $env.array, foo: add}\n{foo: $env.array, foo: greet}\n{foo: $env.array, foo: {foo: array}}\n{foo: $env.array}\n{foo: $env.array}.i\n{foo: $env.f64, foo: array}\n{foo: $env.f64, foo: str}\n{foo: $env.f64}\n{foo: $env.f64}.foo\n{foo: $env.f64}?.add\n{foo: $env.f64}?.array\n{foo: $env.foo, foo: f64}?.list\n{foo: $env.foo}\n{foo: $env.foo}.greet\n{foo: $env.foo}?.String\n{foo: $env.greet, foo: array}\n{foo: $env.greet, foo: i}\n{foo: $env.greet}\n{foo: $env.greet}.array\n{foo: $env.i, foo: add}\n{foo: $env.i, foo: array}\n{foo: $env.i, foo: ok != $env}\n{foo: $env.i}\n{foo: $env.i}?.str\n{foo: $env.list != list}\n{foo: $env.list, foo: 1.0 == 1.0}\n{foo: $env.list, foo: array}\n{foo: $env.list}\n{foo: $env.list}.foo\n{foo: $env.ok, foo: add}\n{foo: $env.ok, foo: ok}\n{foo: $env.ok}\n{foo: $env.ok}.String\n{foo: $env.ok}?.str\n{foo: $env.str}\n{foo: $env.str}.ok\n{foo: $env?.$env}\n{foo: $env?.Bar, foo: array}\n{foo: $env?.Bar, foo: if false { foo } else { 0 }}\n{foo: $env?.Bar, foo: ok}\n{foo: $env?.Bar?.Bar()}\n{foo: $env?.Bar?.Bar}\n{foo: $env?.Bar?.[greet]}\n{foo: $env?.Bar?.greet()}\n{foo: $env?.Bar?.list}\n{foo: $env?.Bar}\n{foo: $env?.Bar}.Bar\n{foo: $env?.Bar}.String\n{foo: $env?.Bar}.list\n{foo: $env?.Bar}?.list\n{foo: $env?.Bar}?.ok\n{foo: $env?.Bar}?.str\n{foo: $env?.String, foo: ok}\n{foo: $env?.String, foo: str}\n{foo: $env?.String}\n{foo: $env?.String}?.ok\n{foo: $env?.[Bar], foo: f64}\n{foo: $env?.[Bar], foo: i}\n{foo: $env?.[Bar], foo: list}\n{foo: $env?.[Bar], foo: str}\n{foo: $env?.[Bar]?.Bar}\n{foo: $env?.[Bar]?.[add]}\n{foo: $env?.[Bar]}\n{foo: $env?.[Bar]}?.greet\n{foo: $env?.[Bar]}?.ok\n{foo: $env?.[String], foo: $env.greet}\n{foo: $env?.[String], foo: ok}\n{foo: $env?.[String]?.array}\n{foo: $env?.[String]}\n{foo: $env?.[String]}.f64\n{foo: $env?.[String]}.greet\n{foo: $env?.[foobar]?.add}\n{foo: $env?.[foobar]?.list}\n{foo: $env?.[foobar]}\n{foo: $env?.[foobar]}?.add\n{foo: $env?.[nil]}\n{foo: $env?.[str]}\n{foo: $env?.[str]}.str\n{foo: $env?.[str]}?.add\n{foo: $env?.add, foo: add}\n{foo: $env?.add}\n{foo: $env?.add}.greet\n{foo: $env?.add}?.array\n{foo: $env?.add}?.foo\n{foo: $env?.add}?.str\n{foo: $env?.array, foo: add}\n{foo: $env?.array}\n{foo: $env?.array}.ok\n{foo: $env?.array}?.Bar\n{foo: $env?.f64, foo: add}\n{foo: $env?.f64}\n{foo: $env?.f64}.ok?.add\n{foo: $env?.f64}.str\n{foo: $env?.f64}?.greet\n{foo: $env?.false}\n{foo: $env?.foo.String()}\n{foo: $env?.foobar, foo: greet}\n{foo: $env?.foobar}\n{foo: $env?.foobar}?.list\n{foo: $env?.foo}\n{foo: $env?.foo}.f64\n{foo: $env?.foo}.str\n{foo: $env?.foo}?.ok\n{foo: $env?.greet, foo: first(array)}\n{foo: $env?.greet, foo: i}\n{foo: $env?.greet}\n{foo: $env?.greet}.foo\n{foo: $env?.greet}?.add\n{foo: $env?.greet}?.foo\n{foo: $env?.i, foo: foo?.Bar}\n{foo: $env?.i, foo: i}\n{foo: $env?.i, foo: ok}\n{foo: $env?.i, foo: string(i)}\n{foo: $env?.i, foo: str}\n{foo: $env?.i}\n{foo: $env?.i}.String\n{foo: $env?.i}?.f64\n{foo: $env?.i}?.greet\n{foo: $env?.list, foo: [1.0]}\n{foo: $env?.list}\n{foo: $env?.list}.f64\n{foo: $env?.nil?.[add]}\n{foo: $env?.nil?.[i]}\n{foo: $env?.nil}\n{foo: $env?.ok, foo: greet}\n{foo: $env?.ok}\n{foo: $env?.ok}.f64\n{foo: $env?.ok}?.add\n{foo: $env?.ok}?.foo\n{foo: $env?.ok}?.list\n{foo: $env?.str, foo: $env?.ok}\n{foo: $env?.str, foo: array}\n{foo: $env?.str, foo: f64}\n{foo: $env?.str}\n{foo: $env?.str}.f64\n{foo: $env?.str}?.Bar\n{foo: $env?.str}?.i\n{foo: $env?.true}\n{foo: $env} == nil or false\n{foo: $env} ?? $env.array\n{foo: $env} ?? add\n{foo: $env} ?? list\n{foo: $env}.Bar\n{foo: $env}.Bar?.[str]\n{foo: $env}.Bar?.add\n{foo: $env}.String\n{foo: $env}.String?.foo\n{foo: $env}.add\n{foo: $env}.add?.String\n{foo: $env}.add?.[add]\n{foo: $env}.add?.[array]\n{foo: $env}.add?.[foo]\n{foo: $env}.add?.[ok]\n{foo: $env}.add?.array\n{foo: $env}.add?.list\n{foo: $env}.array\n{foo: $env}.array?.Bar()\n{foo: $env}.array?.i\n{foo: $env}.array?.str\n{foo: $env}.f64\n{foo: $env}.f64?.[foo]\n{foo: $env}.foo\n{foo: $env}.foo.array\n{foo: $env}.foo?.foo\n{foo: $env}.foo?.i\n{foo: $env}.foobar\n{foo: $env}.foobar?.[f64]\n{foo: $env}.foobar?.[list]\n{foo: $env}.greet\n{foo: $env}.greet?.Bar\n{foo: $env}.greet?.[ok]\n{foo: $env}.i\n{foo: $env}.i?.add()\n{foo: $env}.i?.greet()\n{foo: $env}.list\n{foo: $env}.list?.[f64]\n{foo: $env}.list?.greet\n{foo: $env}.ok\n{foo: $env}.ok?.[greet]\n{foo: $env}.ok?.[ok]\n{foo: $env}.ok?.array\n{foo: $env}.str\n{foo: $env}.str?.Bar\n{foo: $env}.str?.[f64]\n{foo: $env}.str?.str\n{foo: $env}?.$env?.Bar(1.0)\n{foo: $env}?.$env?.add()\n{foo: $env}?.Bar\n{foo: $env}?.Bar?.[add]\n{foo: $env}?.Bar?.foo\n{foo: $env}?.Bar?.i\n{foo: $env}?.String\n{foo: $env}?.String != str\n{foo: $env}?.String?.[add]\n{foo: $env}?.String?.[f64]\n{foo: $env}?.String?.list\n{foo: $env}?.String?.str()\n{foo: $env}?.[$env?.Bar]\n{foo: $env}?.[str]\n{foo: $env}?.add\n{foo: $env}?.array\n{foo: $env}?.array?.Bar(1.0)\n{foo: $env}?.array?.[array]\n{foo: $env}?.array?.[greet]\n{foo: $env}?.array?.[ok]\n{foo: $env}?.f64\n{foo: $env}?.f64?.[f64]\n{foo: $env}?.foo\n{foo: $env}?.foo ?? ok\n{foo: $env}?.foo.Bar\n{foo: $env}?.foo.f64\n{foo: $env}?.foo.ok\n{foo: $env}?.foobar\n{foo: $env}?.foobar?.[list]?.[list]\n{foo: $env}?.foobar?.array\n{foo: $env}?.foobar?.greet(nil)\n{foo: $env}?.greet\n{foo: $env}?.greet?.[f64]\n{foo: $env}?.greet?.f64\n{foo: $env}?.greet?.list()\n{foo: $env}?.greet?.ok\n{foo: $env}?.i\n{foo: $env}?.i?.[array]\n{foo: $env}?.i?.add\n{foo: $env}?.list\n{foo: $env}?.list?.[foo]\n{foo: $env}?.list?.f64\n{foo: $env}?.list?.greet?.[i]\n{foo: $env}?.list?.i\n{foo: $env}?.ok\n{foo: $env}?.ok?.[array]?.ok\n{foo: $env}?.ok?.[ok]\n{foo: $env}?.ok?.[str]\n{foo: $env}?.str\n{foo: $env}?.str?.[ok]\n{foo: $env}?.str?.array\n{foo: $env}?.str?.foo\n{foo: -$env?.f64}\n{foo: -0}\n{foo: -1.0 / i}\n{foo: -1.0, foo: $env?.f64}\n{foo: -1.0, foo: i}\n{foo: -1.0}\n{foo: -1}\n{foo: -f64}\n{foo: -i, foo: !ok}\n{foo: -i, foo: add}\n{foo: -i}\n{foo: -i}.list\n{foo: 0 != $env.i}\n{foo: 0 != $env}\n{foo: 0 != 0}\n{foo: 0 != 1.0}\n{foo: 0 != 1}\n{foo: 0 != f64}\n{foo: 0 != i}\n{foo: 0 != nil}\n{foo: 0 % i}\n{foo: 0 * 0}\n{foo: 0 * 1.0}\n{foo: 0 * 1}\n{foo: 0 * i}\n{foo: 0 * i}.add\n{foo: 0 ** 0}\n{foo: 0 ** 1}\n{foo: 0 ** f64}\n{foo: 0 ** i}\n{foo: 0 + 0}\n{foo: 0 + 1.0}\n{foo: 0 + f64}\n{foo: 0 - 0}\n{foo: 0 - 1.0, foo: array}\n{foo: 0 - 1.0}\n{foo: 0 - 1}\n{foo: 0 - f64}\n{foo: 0 - i}\n{foo: 0 .. 0}\n{foo: 0 .. 1}\n{foo: 0 .. i}\n{foo: 0 / 0}\n{foo: 0 / 1.0}\n{foo: 0 < $env.i}\n{foo: 0 < 0, foo: i}\n{foo: 0 < 0}\n{foo: 0 < 1.0}\n{foo: 0 < 1.0}?.f64\n{foo: 0 < 1}\n{foo: 0 < f64}\n{foo: 0 <= 0}\n{foo: 0 <= 1.0}\n{foo: 0 <= f64}\n{foo: 0 == 0}\n{foo: 0 == 1.0}\n{foo: 0 == f64}\n{foo: 0 == i}\n{foo: 0 == nil}\n{foo: 0 > 0, foo: ok}\n{foo: 0 > 1.0}\n{foo: 0 > 1}\n{foo: 0 > i}\n{foo: 0 >= 0}\n{foo: 0 >= 1}\n{foo: 0 >= i}\n{foo: 0 ?? $env?.[ok]}\n{foo: 0 ?? $env}\n{foo: 0 ?? array}\n{foo: 0 ?? foo}\n{foo: 0 ?? i}\n{foo: 0 ?? str}\n{foo: 0 ?? true}\n{foo: 0 ^ 0}\n{foo: 0 ^ 1.0}\n{foo: 0 ^ i}\n{foo: 0 in array}\n{foo: 0 | add(i)}\n{foo: 0 | bitshl(i)}\n{foo: 0, foo: $env, foo: 1.0}?.greet\n{foo: 0, foo: $env}.String\n{foo: 0, foo: $env}.foo\n{foo: 0, foo: $env}.i\n{foo: 0, foo: $env}.list\n{foo: 0, foo: $env}.str\n{foo: 0, foo: $env}?.String\n{foo: 0, foo: $env}?.[str]\n{foo: 0, foo: $env}?.add\n{foo: 0, foo: $env}?.array\n{foo: 0, foo: $env}?.f64\n{foo: 0, foo: $env}?.greet\n{foo: 0, foo: $env}?.ok\n{foo: 0, foo: $env}?.str\n{foo: 0, foo: 0, foo: false}?.list\n{foo: 0, foo: 0}.String\n{foo: 0, foo: 0}.add\n{foo: 0, foo: 0}.array\n{foo: 0, foo: 0}.foobar\n{foo: 0, foo: 0}?.f64\n{foo: 0, foo: 0}?.ok\n{foo: 0, foo: 1, foo: 0} ?? i\n{foo: 0, foo: 1.0, foo: array}?.i\n{foo: 0, foo: 1.0, foo: ok}.str\n{foo: 0, foo: 1.0} ?? ok\n{foo: 0, foo: 1.0}.Bar\n{foo: 0, foo: 1.0}.array\n{foo: 0, foo: 1.0}.ok\n{foo: 0, foo: 1.0}.str\n{foo: 0, foo: 1.0}?.[str]\n{foo: 0, foo: 1.0}?.f64\n{foo: 0, foo: 1.0}?.foo\n{foo: 0, foo: 1.0}?.i\n{foo: 0, foo: 1.0}?.list\n{foo: 0, foo: 1.0}?.str\n{foo: 0, foo: 1.0}?.str?.max(foo)?.ok\n{foo: 0, foo: 1}.Bar\n{foo: 0, foo: 1}.add\n{foo: 0, foo: 1}.array\n{foo: 0, foo: 1}.foo\n{foo: 0, foo: 1}.greet\n{foo: 0, foo: 1}?.add\n{foo: 0, foo: 1}?.i\n{foo: 0, foo: 1}?.ok\n{foo: 0, foo: add}.String?.[greet]\n{foo: 0, foo: add}.array\n{foo: 0, foo: add}?.[str]\n{foo: 0, foo: add}?.foobar\n{foo: 0, foo: add}?.greet\n{foo: 0, foo: array}.Bar\n{foo: 0, foo: array}.array\n{foo: 0, foo: array}.f64\n{foo: 0, foo: array}.greet\n{foo: 0, foo: array}.list\n{foo: 0, foo: array}?.foo\n{foo: 0, foo: array}?.i\n{foo: 0, foo: array}?.not\n{foo: 0, foo: f64}.foo\n{foo: 0, foo: f64}.greet\n{foo: 0, foo: f64}?.foo\n{foo: 0, foo: false, foo: 1}.add\n{foo: 0, foo: false}?.f64\n{foo: 0, foo: false}?.foo\n{foo: 0, foo: false}?.list\n{foo: 0, foo: false}?.list?.foo\n{foo: 0, foo: foo, foo: 1}?.String\n{foo: 0, foo: foo, foo: add}.array\n{foo: 0, foo: foo, foo: false}?.greet\n{foo: 0, foo: foo}.Bar\n{foo: 0, foo: foo}.String\n{foo: 0, foo: foo}.add\n{foo: 0, foo: foo}.foo\n{foo: 0, foo: foo}.foobar\n{foo: 0, foo: foo}.greet?.add\n{foo: 0, foo: foo}.i\n{foo: 0, foo: foo}.str\n{foo: 0, foo: foo}?.add\n{foo: 0, foo: foo}?.array\n{foo: 0, foo: foo}?.f64\n{foo: 0, foo: foo}?.foo\n{foo: 0, foo: foo}?.ok\n{foo: 0, foo: greet, foo: i}?.array\n{foo: 0, foo: greet}.f64\n{foo: 0, foo: greet}.foobar\n{foo: 0, foo: greet}.greet\n{foo: 0, foo: greet}.ok\n{foo: 0, foo: greet}?.add\n{foo: 0, foo: greet}?.greet\n{foo: 0, foo: greet}?.str\n{foo: 0, foo: i}.add\n{foo: 0, foo: i}.array\n{foo: 0, foo: i}.f64\n{foo: 0, foo: i}?.foobar\n{foo: 0, foo: i}?.str\n{foo: 0, foo: list}?.Bar\n{foo: 0, foo: list}?.[str]\n{foo: 0, foo: list}?.greet\n{foo: 0, foo: nil, foo: foo}?.add\n{foo: 0, foo: nil}.Bar\n{foo: 0, foo: nil}.String?.i()\n{foo: 0, foo: nil}.array\n{foo: 0, foo: nil}.greet\n{foo: 0, foo: nil}.list\n{foo: 0, foo: nil}.ok\n{foo: 0, foo: nil}?.Bar\n{foo: 0, foo: nil}?.String\n{foo: 0, foo: ok}.add\n{foo: 0, foo: ok}.array\n{foo: 0, foo: ok}.f64\n{foo: 0, foo: ok}.ok\n{foo: 0, foo: ok}.str\n{foo: 0, foo: ok}?.[str]\n{foo: 0, foo: ok}?.add\n{foo: 0, foo: ok}?.foo\n{foo: 0, foo: ok}?.ok\n{foo: 0, foo: str, foo: f64}.Bar\n{foo: 0, foo: str}.Bar\n{foo: 0, foo: str}?.f64\n{foo: 0, foo: str}?.foo\n{foo: 0, foo: str}?.greet\n{foo: 0, foo: str}?.i\n{foo: 0, foo: str}?.ok\n{foo: 0, foo: true, foo: i}.list\n{foo: 0, foo: true}?.ok\n{foo: 0, foo: true}?.str\n{foo: 0..i}\n{foo: 0.0}\n{foo: 0.1}\n{foo: 0} ?? array\n{foo: 0} ?? list\n{foo: 0} ?? sum(array)\n{foo: 0}.Bar\n{foo: 0}.String\n{foo: 0}.String?.[f64]\n{foo: 0}.String?.[i]\n{foo: 0}.String?.ok()\n{foo: 0}.add\n{foo: 0}.array\n{foo: 0}.array?.ok\n{foo: 0}.f64\n{foo: 0}.foo\n{foo: 0}.greet\n{foo: 0}.greet?.String\n{foo: 0}.greet?.[list]\n{foo: 0}.i\n{foo: 0}.i?.foo(nil)\n{foo: 0}.list\n{foo: 0}.list?.[add]\n{foo: 0}.list?.[foo].String\n{foo: 0}.nil?.[add]\n{foo: 0}.ok\n{foo: 0}.ok?.[array]\n{foo: 0}.ok?.f64\n{foo: 0}.ok?.foo?.[i]\n{foo: 0}.str\n{foo: 0}.str?.String\n{foo: 0}.str?.[add]?.[add]\n{foo: 0}?.Bar\n{foo: 0}?.Bar?.foo\n{foo: 0}?.String\n{foo: 0}?.[str]\n{foo: 0}?.add\n{foo: 0}?.add?.ok\n{foo: 0}?.array\n{foo: 0}?.array?.[i]\n{foo: 0}?.f64\n{foo: 0}?.foo\n{foo: 0}?.foobar\n{foo: 0}?.foobar == foo\n{foo: 0}?.foobar?.[array]\n{foo: 0}?.greet\n{foo: 0}?.i\n{foo: 0}?.list\n{foo: 0}?.ok\n{foo: 0}?.ok?.[str]\n{foo: 0}?.str\n{foo: 0}?.str?.Bar\n{foo: 0}?.str?.str\n{foo: 1 != $env}\n{foo: 1 != 0}\n{foo: 1 != 1.0}\n{foo: 1 != 1}\n{foo: 1 != f64}\n{foo: 1 != f64}.f64\n{foo: 1 != i}\n{foo: 1 != nil}\n{foo: 1 % 1}\n{foo: 1 * 0}\n{foo: 1 * 1.0}\n{foo: 1 * 1}\n{foo: 1 * f64}\n{foo: 1 * i}\n{foo: 1 ** 0}\n{foo: 1 ** 1.0}\n{foo: 1 ** 1.0}.f64\n{foo: 1 ** 1.0}.i\n{foo: 1 ** 1.0}?.[str]\n{foo: 1 ** 1}\n{foo: 1 ** f64}\n{foo: 1 ** i}\n{foo: 1 + 0}\n{foo: 1 + 1.0}\n{foo: 1 + 1}\n{foo: 1 + f64}\n{foo: 1 + i}\n{foo: 1 - 0}\n{foo: 1 - 1.0}\n{foo: 1 - 1}\n{foo: 1 - f64}\n{foo: 1 - i}\n{foo: 1 .. 0}\n{foo: 1 .. i}\n{foo: 1 / 0}?.String\n{foo: 1 / 1.0}\n{foo: 1 / 1}\n{foo: 1 / f64}\n{foo: 1 / i}\n{foo: 1 < 1.0}\n{foo: 1 < 1}\n{foo: 1 < f64}\n{foo: 1 < i}\n{foo: 1 <= 0}\n{foo: 1 <= 1.0}\n{foo: 1 <= 1}\n{foo: 1 <= f64, foo: array}\n{foo: 1 == $env}\n{foo: 1 == 0}\n{foo: 1 == 1.0}\n{foo: 1 == 1}\n{foo: 1 == f64}\n{foo: 1 == nil}\n{foo: 1 > 0}\n{foo: 1 > 1.0}\n{foo: 1 > 1}\n{foo: 1 > i}\n{foo: 1 >= 1.0}\n{foo: 1 >= 1}\n{foo: 1 >= f64}\n{foo: 1 >= i}\n{foo: 1 ?? $env, foo: str}\n{foo: 1 ?? $env}\n{foo: 1 ?? 1}\n{foo: 1 ?? greet}\n{foo: 1 ?? list}\n{foo: 1 ?? nil}\n{foo: 1 ?? ok}\n{foo: 1 ?? str}\n{foo: 1 ^ 0}\n{foo: 1 ^ 1.0}\n{foo: 1 ^ f64}\n{foo: 1 in array}\n{foo: 1 not in $env?.array}\n{foo: 1 | bitand(i)}\n{foo: 1, foo: $env, foo: add}?.ok\n{foo: 1, foo: $env}.Bar\n{foo: 1, foo: $env}.String\n{foo: 1, foo: $env}.array\n{foo: 1, foo: $env}.greet\n{foo: 1, foo: $env}.i\n{foo: 1, foo: $env}.list\n{foo: 1, foo: $env}.str\n{foo: 1, foo: $env}?.f64\n{foo: 1, foo: $env}?.greet\n{foo: 1, foo: $env}?.str\n{foo: 1, foo: 0, foo: add}?.array\n{foo: 1, foo: 0} ?? foo?.Bar\n{foo: 1, foo: 0}.add\n{foo: 1, foo: 0}.f64\n{foo: 1, foo: 0}.foo\n{foo: 1, foo: 0}.greet\n{foo: 1, foo: 0}.list\n{foo: 1, foo: 0}?.list\n{foo: 1, foo: 0}?.ok\n{foo: 1, foo: 1.0}.String\n{foo: 1, foo: 1.0}.f64\n{foo: 1, foo: 1.0}.i\n{foo: 1, foo: 1.0}?.Bar\n{foo: 1, foo: 1.0}?.add\n{foo: 1, foo: 1.0}?.foobar\n{foo: 1, foo: 1.0}?.greet\n{foo: 1, foo: 1.0}?.str?.array()\n{foo: 1, foo: 1}.f64\n{foo: 1, foo: 1}.greet\n{foo: 1, foo: 1}?.f64\n{foo: 1, foo: 1}?.ok\n{foo: 1, foo: add, foo: 1.0}?.Bar\n{foo: 1, foo: add}.Bar\n{foo: 1, foo: add}.array\n{foo: 1, foo: add}.greet\n{foo: 1, foo: add}.i\n{foo: 1, foo: add}?.Bar\n{foo: 1, foo: add}?.i\n{foo: 1, foo: add}?.list\n{foo: 1, foo: array}?.String\n{foo: 1, foo: array}?.add\n{foo: 1, foo: array}?.i\n{foo: 1, foo: array}?.ok\n{foo: 1, foo: f64}.Bar\n{foo: 1, foo: f64}.array\n{foo: 1, foo: f64}.foo\n{foo: 1, foo: f64}.greet\n{foo: 1, foo: f64}?.f64\n{foo: 1, foo: f64}?.i\n{foo: 1, foo: false}.array\n{foo: 1, foo: false}.f64\n{foo: 1, foo: false}.foo\n{foo: 1, foo: false}.foobar?.foo()\n{foo: 1, foo: false}?.add\n{foo: 1, foo: false}?.f64\n{foo: 1, foo: false}?.f64?.[f64]\n{foo: 1, foo: false}?.ok\n{foo: 1, foo: foo, foo: $env}?.[str]\n{foo: 1, foo: foo, foo: 1.0}.list\n{foo: 1, foo: foo, foo: nil}.foo\n{foo: 1, foo: foo}.Bar\n{foo: 1, foo: foo}.f64\n{foo: 1, foo: foo}.foo\n{foo: 1, foo: foo}?.[str]\n{foo: 1, foo: foo}?.[str]?.greet\n{foo: 1, foo: foo}?.f64\n{foo: 1, foo: foo}?.foo\n{foo: 1, foo: foo}?.foobar\n{foo: 1, foo: foo}?.greet\n{foo: 1, foo: foo}?.list\n{foo: 1, foo: greet, foo: 0}?.add\n{foo: 1, foo: greet, foo: i}.foobar\n{foo: 1, foo: greet, foo: list}?.ok\n{foo: 1, foo: greet}.String\n{foo: 1, foo: greet}.greet\n{foo: 1, foo: greet}.i\n{foo: 1, foo: greet}.ok?.String\n{foo: 1, foo: greet}?.[str]\n{foo: 1, foo: greet}?.add\n{foo: 1, foo: greet}?.array\n{foo: 1, foo: greet}?.greet\n{foo: 1, foo: i, foo: list}?.[str]\n{foo: 1, foo: i}.String\n{foo: 1, foo: i}?.greet\n{foo: 1, foo: list} ?? i\n{foo: 1, foo: list}.f64\n{foo: 1, foo: list}.foo\n{foo: 1, foo: list}.list\n{foo: 1, foo: list}.str\n{foo: 1, foo: list}?.Bar\n{foo: 1, foo: list}?.String\n{foo: 1, foo: list}?.[str]\n{foo: 1, foo: list}?.add\n{foo: 1, foo: list}?.ok\n{foo: 1, foo: nil, foo: 1}.add\n{foo: 1, foo: nil, foo: greet}.foo\n{foo: 1, foo: nil}.add\n{foo: 1, foo: nil}.i\n{foo: 1, foo: nil}.list\n{foo: 1, foo: nil}.ok\n{foo: 1, foo: nil}?.Bar\n{foo: 1, foo: nil}?.String\n{foo: 1, foo: nil}?.[str]\n{foo: 1, foo: nil}?.add\n{foo: 1, foo: nil}?.f64\n{foo: 1, foo: nil}?.list\n{foo: 1, foo: nil}?.str\n{foo: 1, foo: ok}.foo\n{foo: 1, foo: ok}.list\n{foo: 1, foo: ok}?.Bar\n{foo: 1, foo: ok}?.String\n{foo: 1, foo: ok}?.[str]\n{foo: 1, foo: ok}?.array\n{foo: 1, foo: ok}?.ok\n{foo: 1, foo: ok}?.str\n{foo: 1, foo: str, foo: 0}.i\n{foo: 1, foo: str}.f64\n{foo: 1, foo: str}.list\n{foo: 1, foo: str}?.i\n{foo: 1, foo: str}?.str\n{foo: 1, foo: true}.String\n{foo: 1, foo: true}.array\n{foo: 1, foo: true}.ok\n{foo: 1.0 != $env?.String}\n{foo: 1.0 != 0}\n{foo: 1.0 != 1.0}\n{foo: 1.0 != 1}\n{foo: 1.0 != f64}\n{foo: 1.0 != i}\n{foo: 1.0 * 1.0}\n{foo: 1.0 * 1}\n{foo: 1.0 * f64}\n{foo: 1.0 * i}\n{foo: 1.0 * i}?.f64\n{foo: 1.0 ** 0}\n{foo: 1.0 ** 1.0}\n{foo: 1.0 ** 1}\n{foo: 1.0 ** f64}\n{foo: 1.0 ** i}\n{foo: 1.0 + 1.0}\n{foo: 1.0 + 1}\n{foo: 1.0 + f64}\n{foo: 1.0 + f64}?.f64\n{foo: 1.0 + i}\n{foo: 1.0 - 0}\n{foo: 1.0 - 1.0}\n{foo: 1.0 - 1}\n{foo: 1.0 - f64}\n{foo: 1.0 - i}\n{foo: 1.0 / 0}\n{foo: 1.0 / 1.0}\n{foo: 1.0 / 1}\n{foo: 1.0 / f64}\n{foo: 1.0 / i}\n{foo: 1.0 < 0}\n{foo: 1.0 < 1.0}\n{foo: 1.0 < 1.0}.String\n{foo: 1.0 < 1}\n{foo: 1.0 < f64}\n{foo: 1.0 < i}\n{foo: 1.0 <= 0}\n{foo: 1.0 <= 1.0, foo: str}\n{foo: 1.0 <= 1.0}\n{foo: 1.0 <= 1}\n{foo: 1.0 <= f64}\n{foo: 1.0 <= i}\n{foo: 1.0 == $env}\n{foo: 1.0 == 0}\n{foo: 1.0 == 1.0}\n{foo: 1.0 == 1}\n{foo: 1.0 == f64}\n{foo: 1.0 == f64}.foo\n{foo: 1.0 == i}\n{foo: 1.0 == nil}\n{foo: 1.0 == nil}?.String\n{foo: 1.0 > 0}\n{foo: 1.0 > 0}.list\n{foo: 1.0 > 1.0}\n{foo: 1.0 > 1}\n{foo: 1.0 > f64}\n{foo: 1.0 > f64}.array\n{foo: 1.0 > i}\n{foo: 1.0 >= 0}\n{foo: 1.0 >= 1.0}\n{foo: 1.0 >= 1}\n{foo: 1.0 >= f64}\n{foo: 1.0 >= i, foo: greet}\n{foo: 1.0 >= i}\n{foo: 1.0 ?? $env}\n{foo: 1.0 ?? 0}\n{foo: 1.0 ?? 1.0, foo: i}\n{foo: 1.0 ?? 1.0, foo: str}\n{foo: 1.0 ?? 1.0}\n{foo: 1.0 ?? 1}\n{foo: 1.0 ?? f64}\n{foo: 1.0 ?? foo}\n{foo: 1.0 ?? i}\n{foo: 1.0 ?? list}\n{foo: 1.0 ?? nil}\n{foo: 1.0 ?? ok}\n{foo: 1.0 ?? str}\n{foo: 1.0 ^ 0}\n{foo: 1.0 ^ 1.0}\n{foo: 1.0 ^ 1}\n{foo: 1.0 ^ i}\n{foo: 1.0 in array, foo: i}\n{foo: 1.0 in array}\n{foo: 1.0 not in array}\n{foo: 1.0 | max(1.0)}\n{foo: 1.0 | median(f64)}\n{foo: 1.0 | min(1)}\n{foo: 1.0, foo: $env, foo: foo}.f64\n{foo: 1.0, foo: $env, foo: foo}.greet\n{foo: 1.0, foo: $env, foo: str}?.i?.[add]\n{foo: 1.0, foo: $env}.add\n{foo: 1.0, foo: $env}.array\n{foo: 1.0, foo: $env}.f64\n{foo: 1.0, foo: $env}.foo\n{foo: 1.0, foo: $env}.foobar\n{foo: 1.0, foo: $env}.greet\n{foo: 1.0, foo: $env}.i\n{foo: 1.0, foo: $env}.ok\n{foo: 1.0, foo: $env}?.Bar\n{foo: 1.0, foo: $env}?.String\n{foo: 1.0, foo: $env}?.add\n{foo: 1.0, foo: $env}?.array\n{foo: 1.0, foo: $env}?.f64\n{foo: 1.0, foo: $env}?.greet\n{foo: 1.0, foo: $env}?.list\n{foo: 1.0, foo: $env}?.ok\n{foo: 1.0, foo: 0, foo: $env}?.i\n{foo: 1.0, foo: 0, foo: 0}?.array\n{foo: 1.0, foo: 0, foo: array}.String\n{foo: 1.0, foo: 0}.Bar\n{foo: 1.0, foo: 0}.String\n{foo: 1.0, foo: 0}.String?.String\n{foo: 1.0, foo: 0}.i\n{foo: 1.0, foo: 0}.list\n{foo: 1.0, foo: 0}?.[str]\n{foo: 1.0, foo: 0}?.f64\n{foo: 1.0, foo: 0}?.foo\n{foo: 1.0, foo: 0}?.str\n{foo: 1.0, foo: 1.0}.Bar\n{foo: 1.0, foo: 1.0}.add\n{foo: 1.0, foo: 1.0}.array\n{foo: 1.0, foo: 1.0}.f64\n{foo: 1.0, foo: 1.0}.foo\n{foo: 1.0, foo: 1.0}.greet\n{foo: 1.0, foo: 1.0}.i\n{foo: 1.0, foo: 1.0}.list\n{foo: 1.0, foo: 1.0}.ok\n{foo: 1.0, foo: 1.0}.str\n{foo: 1.0, foo: 1.0}?.[str]\n{foo: 1.0, foo: 1.0}?.add\n{foo: 1.0, foo: 1.0}?.array\n{foo: 1.0, foo: 1.0}?.f64\n{foo: 1.0, foo: 1.0}?.greet\n{foo: 1.0, foo: 1.0}?.i\n{foo: 1.0, foo: 1.0}?.ok\n{foo: 1.0, foo: 1}.add\n{foo: 1.0, foo: 1}.array\n{foo: 1.0, foo: 1}.foo\n{foo: 1.0, foo: 1}.list\n{foo: 1.0, foo: 1}?.Bar\n{foo: 1.0, foo: 1}?.String\n{foo: 1.0, foo: 1}?.[str]\n{foo: 1.0, foo: 1}?.add\n{foo: 1.0, foo: 1}?.foo\n{foo: 1.0, foo: 1}?.greet\n{foo: 1.0, foo: 1}?.i\n{foo: 1.0, foo: 1}?.list\n{foo: 1.0, foo: 1}?.ok\n{foo: 1.0, foo: add}.Bar\n{foo: 1.0, foo: add}.add\n{foo: 1.0, foo: add}?.String\n{foo: 1.0, foo: add}?.f64\n{foo: 1.0, foo: add}?.f64?.str?.[array]\n{foo: 1.0, foo: add}?.greet\n{foo: 1.0, foo: add}?.list\n{foo: 1.0, foo: add}?.ok\n{foo: 1.0, foo: add}?.str\n{foo: 1.0, foo: array}.foo\n{foo: 1.0, foo: array}.greet\n{foo: 1.0, foo: array}.list\n{foo: 1.0, foo: array}.str\n{foo: 1.0, foo: array}?.Bar\n{foo: 1.0, foo: array}?.[str]\n{foo: 1.0, foo: array}?.add\n{foo: 1.0, foo: array}?.f64\n{foo: 1.0, foo: array}?.list\n{foo: 1.0, foo: f64}.add\n{foo: 1.0, foo: f64}.foobar\n{foo: 1.0, foo: f64}.greet\n{foo: 1.0, foo: f64}.i\n{foo: 1.0, foo: f64}.list\n{foo: 1.0, foo: f64}.ok\n{foo: 1.0, foo: f64}.str\n{foo: 1.0, foo: f64}?.add\n{foo: 1.0, foo: f64}?.greet\n{foo: 1.0, foo: false, foo: $env}?.ok\n{foo: 1.0, foo: false, foo: 1.0}?.greet\n{foo: 1.0, foo: false}.String\n{foo: 1.0, foo: false}.array\n{foo: 1.0, foo: false}.array?.add\n{foo: 1.0, foo: false}.i\n{foo: 1.0, foo: false}.str\n{foo: 1.0, foo: false}?.[str]\n{foo: 1.0, foo: false}?.array\n{foo: 1.0, foo: false}?.list\n{foo: 1.0, foo: foo, foo: 1}.add\n{foo: 1.0, foo: foo, foo: foo}?.list\n{foo: 1.0, foo: foo, foo: list}?.f64\n{foo: 1.0, foo: foo, foo: true}.Bar\n{foo: 1.0, foo: foo}.Bar\n{foo: 1.0, foo: foo}.array\n{foo: 1.0, foo: foo}.f64\n{foo: 1.0, foo: foo}.f64?.[ok]\n{foo: 1.0, foo: foo}.foo\n{foo: 1.0, foo: foo}.greet\n{foo: 1.0, foo: foo}.list\n{foo: 1.0, foo: foo}.ok\n{foo: 1.0, foo: foo}.str\n{foo: 1.0, foo: foo}?.Bar\n{foo: 1.0, foo: foo}?.String\n{foo: 1.0, foo: foo}?.add\n{foo: 1.0, foo: foo}?.f64\n{foo: 1.0, foo: foo}?.foo\n{foo: 1.0, foo: foo}?.greet\n{foo: 1.0, foo: foo}?.i\n{foo: 1.0, foo: foo}?.list\n{foo: 1.0, foo: foo}?.ok\n{foo: 1.0, foo: greet}.Bar\n{foo: 1.0, foo: greet}.array\n{foo: 1.0, foo: greet}.f64\n{foo: 1.0, foo: greet}.i\n{foo: 1.0, foo: greet}.list\n{foo: 1.0, foo: greet}.ok\n{foo: 1.0, foo: greet}?.[str]\n{foo: 1.0, foo: greet}?.array\n{foo: 1.0, foo: greet}?.foo\n{foo: 1.0, foo: greet}?.greet\n{foo: 1.0, foo: greet}?.i?.[i]\n{foo: 1.0, foo: greet}?.ok\n{foo: 1.0, foo: greet}?.str\n{foo: 1.0, foo: i} ?? f64\n{foo: 1.0, foo: i}.Bar\n{foo: 1.0, foo: i}.String\n{foo: 1.0, foo: i}.add\n{foo: 1.0, foo: i}.f64\n{foo: 1.0, foo: i}.ok\n{foo: 1.0, foo: i}?.Bar\n{foo: 1.0, foo: i}?.String\n{foo: 1.0, foo: i}?.add\n{foo: 1.0, foo: i}?.f64\n{foo: 1.0, foo: i}?.foobar\n{foo: 1.0, foo: i}?.greet\n{foo: 1.0, foo: i}?.i\n{foo: 1.0, foo: i}?.ok\n{foo: 1.0, foo: list}.f64\n{foo: 1.0, foo: list}.foobar\n{foo: 1.0, foo: list}.i\n{foo: 1.0, foo: list}.list\n{foo: 1.0, foo: list}.ok\n{foo: 1.0, foo: list}?.String\n{foo: 1.0, foo: list}?.array\n{foo: 1.0, foo: list}?.ok\n{foo: 1.0, foo: nil}.Bar\n{foo: 1.0, foo: nil}.String\n{foo: 1.0, foo: nil}.add\n{foo: 1.0, foo: nil}.array\n{foo: 1.0, foo: nil}.foo\n{foo: 1.0, foo: nil}.greet\n{foo: 1.0, foo: nil}.i\n{foo: 1.0, foo: nil}.ok\n{foo: 1.0, foo: nil}?.Bar\n{foo: 1.0, foo: nil}?.Bar?.list\n{foo: 1.0, foo: nil}?.String\n{foo: 1.0, foo: nil}?.[str]\n{foo: 1.0, foo: nil}?.add\n{foo: 1.0, foo: nil}?.array\n{foo: 1.0, foo: nil}?.f64\n{foo: 1.0, foo: nil}?.foo\n{foo: 1.0, foo: nil}?.foobar\n{foo: 1.0, foo: nil}?.greet\n{foo: 1.0, foo: nil}?.str\n{foo: 1.0, foo: ok, foo: str}.f64\n{foo: 1.0, foo: ok}.String\n{foo: 1.0, foo: ok}.add\n{foo: 1.0, foo: ok}.f64\n{foo: 1.0, foo: ok}.greet\n{foo: 1.0, foo: ok}.i\n{foo: 1.0, foo: ok}.str\n{foo: 1.0, foo: ok}?.String\n{foo: 1.0, foo: ok}?.[str]\n{foo: 1.0, foo: ok}?.f64\n{foo: 1.0, foo: ok}?.greet\n{foo: 1.0, foo: ok}?.list\n{foo: 1.0, foo: ok}?.list?.ok\n{foo: 1.0, foo: ok}?.str\n{foo: 1.0, foo: str, foo: 1} != true ?? add\n{foo: 1.0, foo: str, foo: str}.list\n{foo: 1.0, foo: str}.array\n{foo: 1.0, foo: str}.str\n{foo: 1.0, foo: str}?.String\n{foo: 1.0, foo: str}?.f64\n{foo: 1.0, foo: str}?.greet\n{foo: 1.0, foo: str}?.i\n{foo: 1.0, foo: str}?.str\n{foo: 1.0, foo: true, foo: foo}?.Bar\n{foo: 1.0, foo: true, foo: true}?.[str]\n{foo: 1.0, foo: true}.String\n{foo: 1.0, foo: true}.add\n{foo: 1.0, foo: true}.greet\n{foo: 1.0, foo: true}.i\n{foo: 1.0, foo: true}?.Bar\n{foo: 1.0, foo: true}?.String\n{foo: 1.0, foo: true}?.[str]\n{foo: 1.0, foo: true}?.add\n{foo: 1.0, foo: true}?.array\n{foo: 1.0, foo: true}?.f64\n{foo: 1.0, foo: true}?.ok\n{foo: 1.0}\n{foo: 1.0} ?? foo\n{foo: 1.0} not in $env?.[String]\n{foo: 1.0} | get(str)\n{foo: 1.0}.Bar\n{foo: 1.0}.Bar?.str\n{foo: 1.0}.String\n{foo: 1.0}.String?.[foo]\n{foo: 1.0}.String?.array\n{foo: 1.0}.String?.foo\n{foo: 1.0}.add\n{foo: 1.0}.add?.Bar\n{foo: 1.0}.add?.f64\n{foo: 1.0}.add?.list\n{foo: 1.0}.add?.ok\n{foo: 1.0}.array\n{foo: 1.0}.array?.array()\n{foo: 1.0}.f64\n{foo: 1.0}.f64?.[add]\n{foo: 1.0}.f64?.foo\n{foo: 1.0}.f64?.greet()\n{foo: 1.0}.foo\n{foo: 1.0}.foobar\n{foo: 1.0}.foobar == 1.0\n{foo: 1.0}.foobar?.String\n{foo: 1.0}.foobar?.i\n{foo: 1.0}.greet\n{foo: 1.0}.greet?.[ok]\n{foo: 1.0}.greet?.foo\n{foo: 1.0}.i\n{foo: 1.0}.i == ok\n{foo: 1.0}.i?.[str]\n{foo: 1.0}.list\n{foo: 1.0}.list?.[list]?.i\n{foo: 1.0}.list?.i\n{foo: 1.0}.ok\n{foo: 1.0}.ok?.[foo]\n{foo: 1.0}.ok?.ok()\n{foo: 1.0}.str\n{foo: 1.0}.str?.[f64]\n{foo: 1.0}.str?.[list]?.foo\n{foo: 1.0}.str?.str\n{foo: 1.0}?.$env?.String()\n{foo: 1.0}?.$env?.[add]\n{foo: 1.0}?.$env?.f64\n{foo: 1.0}?.Bar\n{foo: 1.0}?.Bar?.[greet]\n{foo: 1.0}?.Bar?.[ok]\n{foo: 1.0}?.Bar?.add\n{foo: 1.0}?.Bar?.list(array, ok)\n{foo: 1.0}?.Bar?.list(foobar)\n{foo: 1.0}?.String\n{foo: 1.0}?.String?.[f64]\n{foo: 1.0}?.String?.[f64].str\n{foo: 1.0}?.[greet(str)]\n{foo: 1.0}?.[str]\n{foo: 1.0}?.add\n{foo: 1.0}?.add?.[i]\n{foo: 1.0}?.add?.list\n{foo: 1.0}?.array\n{foo: 1.0}?.array?.greet\n{foo: 1.0}?.array?.ok\n{foo: 1.0}?.array?.str(foobar)\n{foo: 1.0}?.f64\n{foo: 1.0}?.f64?.[list]\n{foo: 1.0}?.f64?.foo\n{foo: 1.0}?.false?.[list]\n{foo: 1.0}?.foo\n{foo: 1.0}?.foobar\n{foo: 1.0}?.foobar?.String\n{foo: 1.0}?.greet\n{foo: 1.0}?.greet?.array()\n{foo: 1.0}?.greet?.list\n{foo: 1.0}?.i\n{foo: 1.0}?.i?.[foo]\n{foo: 1.0}?.list\n{foo: 1.0}?.list?.[i]\n{foo: 1.0}?.list?.[str]\n{foo: 1.0}?.not\n{foo: 1.0}?.ok\n{foo: 1.0}?.ok?.[ok]\n{foo: 1.0}?.str\n{foo: 1} == $env?.[String]\n{foo: 1} ?? array\n{foo: 1} ?? ok\n{foo: 1}.Bar\n{foo: 1}.Bar?.Bar()\n{foo: 1}.Bar?.foo?.i\n{foo: 1}.String\n{foo: 1}.String?.[array]\n{foo: 1}.String?.[greet]\n{foo: 1}.add\n{foo: 1}.add?.array\n{foo: 1}.add?.str()\n{foo: 1}.array\n{foo: 1}.array?.[list]\n{foo: 1}.f64\n{foo: 1}.foo\n{foo: 1}.foobar\n{foo: 1}.greet\n{foo: 1}.greet?.[list]\n{foo: 1}.i\n{foo: 1}.list\n{foo: 1}.list != add\n{foo: 1}.list?.foo\n{foo: 1}.ok\n{foo: 1}.ok?.add\n{foo: 1}.ok?.greet\n{foo: 1}.str\n{foo: 1}.str?.[f64]\n{foo: 1}?.Bar\n{foo: 1}?.String\n{foo: 1}?.String not startsWith $env\n{foo: 1}?.String?.Bar\n{foo: 1}?.String?.[f64]\n{foo: 1}?.String?.add\n{foo: 1}?.String?.greet\n{foo: 1}?.[str]\n{foo: 1}?.[str] startsWith str\n{foo: 1}?.[str]?.String\n{foo: 1}?.add\n{foo: 1}?.add?.[str]\n{foo: 1}?.array\n{foo: 1}?.f64\n{foo: 1}?.f64?.String\n{foo: 1}?.f64?.[ok]\n{foo: 1}?.foo\n{foo: 1}?.foobar\n{foo: 1}?.foobar?.foo.foobar?.[foo]\n{foo: 1}?.foobar?.greet(add)\n{foo: 1}?.foobar?.i.array\n{foo: 1}?.greet\n{foo: 1}?.i\n{foo: 1}?.i?.[add]\n{foo: 1}?.list\n{foo: 1}?.list?.[ok]\n{foo: 1}?.nil?.str(nil)\n{foo: 1}?.ok\n{foo: 1}?.ok?.str\n{foo: 1}?.str\n{foo: 1}?.str?.[i]\n{foo: 1}?.str?.[ok]\n{foo: [$env, 1.0]}\n{foo: [$env, false], foo: f64}\n{foo: [$env, nil]}\n{foo: [$env, ok]}\n{foo: [$env]}\n{foo: [$env]}?.String\n{foo: [0 + 0, list]}\n{foo: [0, 1.0]}\n{foo: [0]}\n{foo: [1, 1.0]}\n{foo: [1.0, $env]}\n{foo: [1.0, greet, 1.0]}\n{foo: [1.0], foo: greet}\n{foo: [1.0]}\n{foo: [1.0]}?.f64\n{foo: [1], foo: foo?.String}\n{foo: [1]}\n{foo: [1]}.list\n{foo: [add, $env]}\n{foo: [add, 1]}\n{foo: [add, str]}\n{foo: [add]}\n{foo: [array, 1]}\n{foo: [array, list, foo]}\n{foo: [array]}\n{foo: [ceil(f64)]}\n{foo: [f64]}\n{foo: [f64]}.array\n{foo: [false, f64]}\n{foo: [false]}\n{foo: [foo, $env]}\n{foo: [foo, false]}\n{foo: [foo, i]}\n{foo: [foo, nil]}\n{foo: [foo, ok]}\n{foo: [foo]}\n{foo: [foo]}?.Bar\n{foo: [greet, array]}\n{foo: [greet]}\n{foo: [greet]}.Bar\n{foo: [i, 1, array]}\n{foo: [i, 1]}\n{foo: [i, str]}\n{foo: [i], foo: f64}\n{foo: [i]}\n{foo: [i]}?.[str]\n{foo: [list]}\n{foo: [nil, 1.0]}\n{foo: [nil, array]}\n{foo: [nil, nil]}\n{foo: [nil, true]}\n{foo: [nil]}\n{foo: [ok, foo]}\n{foo: [ok]}\n{foo: [str, ok]}\n{foo: [str, true]}\n{foo: [str]}\n{foo: [true, add], foo: foo}\n{foo: [true, false]}\n{foo: [true, nil]}.i\n{foo: [true]}\n{foo: abs(0)}\n{foo: abs(1)}\n{foo: abs(1.0)}\n{foo: abs(1.0)}?.str\n{foo: abs(f64)}\n{foo: abs(i)}\n{foo: add != $env}\n{foo: add != add}\n{foo: add != nil, foo: $env.list}.greet\n{foo: add != nil}\n{foo: add == $env}\n{foo: add == add}\n{foo: add ?? $env}\n{foo: add ?? 0}\n{foo: add ?? 1.0}\n{foo: add ?? add}\n{foo: add ?? false}\n{foo: add ?? foo}\n{foo: add ?? foo}?.list\n{foo: add ?? i}\n{foo: add ?? nil}\n{foo: add ?? str}\n{foo: add ?? true}\n{foo: add(1, 0)}\n{foo: add(i, 0)}\n{foo: add(i, i)}\n{foo: add, foo: $env in array}\n{foo: add, foo: $env.add}\n{foo: add, foo: $env.f64}\n{foo: add, foo: $env.i}\n{foo: add, foo: $env?.foobar}\n{foo: add, foo: $env?.list}\n{foo: add, foo: $env}.$env == f64\n{foo: add, foo: $env}.Bar\n{foo: add, foo: $env}.array\n{foo: add, foo: $env}.f64\n{foo: add, foo: $env}.ok\n{foo: add, foo: $env}?.Bar\n{foo: add, foo: $env}?.String\n{foo: add, foo: $env}?.foo\n{foo: add, foo: $env}?.i\n{foo: add, foo: $env}?.list\n{foo: add, foo: $env}?.ok\n{foo: add, foo: 0, foo: 0}.ok\n{foo: add, foo: 0, foo: nil}.String\n{foo: add, foo: 0}.f64\n{foo: add, foo: 0}.list\n{foo: add, foo: 0}?.Bar\n{foo: add, foo: 0}?.f64\n{foo: add, foo: 0}?.i\n{foo: add, foo: 1 ** i}\n{foo: add, foo: 1 < f64}\n{foo: add, foo: 1.0 / 1.0}\n{foo: add, foo: 1.0 > f64}\n{foo: add, foo: 1.0}.String\n{foo: add, foo: 1.0}.f64\n{foo: add, foo: 1.0}.greet\n{foo: add, foo: 1.0}.i\n{foo: add, foo: 1.0}.list\n{foo: add, foo: 1.0}.str\n{foo: add, foo: 1.0}?.Bar\n{foo: add, foo: 1.0}?.greet\n{foo: add, foo: 1.0}?.list\n{foo: add, foo: 1.0}?.ok\n{foo: add, foo: 1} ?? f64\n{foo: add, foo: 1}.Bar\n{foo: add, foo: 1}.String\n{foo: add, foo: 1}.add\n{foo: add, foo: 1}.foo\n{foo: add, foo: 1}.list\n{foo: add, foo: 1}?.foo\n{foo: add, foo: add}\n{foo: add, foo: add}.String\n{foo: add, foo: add}.add\n{foo: add, foo: add}.array\n{foo: add, foo: add}.foo\n{foo: add, foo: add}?.f64\n{foo: add, foo: add}?.i\n{foo: add, foo: add}?.list\n{foo: add, foo: add}?.ok\n{foo: add, foo: add}?.str\n{foo: add, foo: array}\n{foo: add, foo: array}.String\n{foo: add, foo: array}.i\n{foo: add, foo: array}?.Bar\n{foo: add, foo: array}?.array\n{foo: add, foo: array}?.i?.Bar\n{foo: add, foo: f64, foo: $env}.foo\n{foo: add, foo: f64}\n{foo: add, foo: f64}.array\n{foo: add, foo: f64}.foo\n{foo: add, foo: f64}.greet\n{foo: add, foo: f64}.i\n{foo: add, foo: f64}.nil?.f64(foobar)\n{foo: add, foo: f64}?.Bar\n{foo: add, foo: f64}?.[str]\n{foo: add, foo: f64}?.greet?.[array]\n{foo: add, foo: f64}?.list\n{foo: add, foo: f64}?.ok\n{foo: add, foo: false}.array\n{foo: add, foo: false}.foo\n{foo: add, foo: false}.i\n{foo: add, foo: false}?.Bar\n{foo: add, foo: false}?.String\n{foo: add, foo: false}?.[str]\n{foo: add, foo: false}?.f64\n{foo: add, foo: false}?.list\n{foo: add, foo: false}?.ok\n{foo: add, foo: false}?.str\n{foo: add, foo: foo.String()}\n{foo: add, foo: foo.String}\n{foo: add, foo: foo}\n{foo: add, foo: foo}.array\n{foo: add, foo: foo}.f64\n{foo: add, foo: foo}.foo\n{foo: add, foo: foo}.greet\n{foo: add, foo: foo}.ok\n{foo: add, foo: foo}?.Bar\n{foo: add, foo: foo}?.add\n{foo: add, foo: foo}?.array\n{foo: add, foo: foo}?.f64\n{foo: add, foo: foo}?.foo\n{foo: add, foo: foo}?.i\n{foo: add, foo: foo}?.list\n{foo: add, foo: foo}?.ok\n{foo: add, foo: greet}\n{foo: add, foo: greet}.Bar?.String\n{foo: add, foo: greet}.String\n{foo: add, foo: greet}.add\n{foo: add, foo: greet}.array\n{foo: add, foo: greet}.greet\n{foo: add, foo: greet}?.Bar\n{foo: add, foo: greet}?.f64\n{foo: add, foo: greet}?.greet\n{foo: add, foo: greet}?.str\n{foo: add, foo: i}\n{foo: add, foo: i}.array\n{foo: add, foo: i}.f64\n{foo: add, foo: i}.greet\n{foo: add, foo: i}.str\n{foo: add, foo: i}?.Bar\n{foo: add, foo: i}?.f64\n{foo: add, foo: i}?.str\n{foo: add, foo: list?.[i]}\n{foo: add, foo: list}\n{foo: add, foo: list}.str\n{foo: add, foo: list}?.Bar\n{foo: add, foo: list}?.greet\n{foo: add, foo: list}?.list\n{foo: add, foo: mean(1.0)}\n{foo: add, foo: nil, foo: nil}?.f64\n{foo: add, foo: nil}.array\n{foo: add, foo: nil}.foo\n{foo: add, foo: nil}.greet\n{foo: add, foo: nil}.str\n{foo: add, foo: nil}?.Bar\n{foo: add, foo: nil}?.[str]\n{foo: add, foo: nil}?.[str]?.str\n{foo: add, foo: nil}?.add\n{foo: add, foo: nil}?.f64\n{foo: add, foo: nil}?.greet\n{foo: add, foo: nil}?.list\n{foo: add, foo: nil}?.ok\n{foo: add, foo: nil}?.ok?.Bar\n{foo: add, foo: ok}\n{foo: add, foo: ok}?.String\n{foo: add, foo: ok}?.list\n{foo: add, foo: str}\n{foo: add, foo: str}.String\n{foo: add, foo: str}.add\n{foo: add, foo: str}.foo\n{foo: add, foo: str}.greet\n{foo: add, foo: str}?.String\n{foo: add, foo: str}?.foo\n{foo: add, foo: str}?.ok\n{foo: add, foo: str}?.str\n{foo: add, foo: true}.foo\n{foo: add, foo: true}.i\n{foo: add, foo: true}.list\n{foo: add, foo: true}?.f64\n{foo: add, foo: true}?.foo\n{foo: add, foo: true}?.i\n{foo: add, foo: true}?.list\n{foo: add}\n{foo: add} ?? greet\n{foo: add}.Bar\n{foo: add}.String\n{foo: add}.add\n{foo: add}.array\n{foo: add}.f64\n{foo: add}.foo\n{foo: add}.foobar\n{foo: add}.greet\n{foo: add}.greet?.i\n{foo: add}.i\n{foo: add}.i?.[foo]\n{foo: add}.i?.[greet]\n{foo: add}.i?.greet\n{foo: add}.list\n{foo: add}.list?.add()?.Bar\n{foo: add}.nil?.[greet]\n{foo: add}.ok\n{foo: add}.ok?.Bar(ok)\n{foo: add}.str\n{foo: add}.str?.[ok]\n{foo: add}.true?.[str]\n{foo: add}?.$env?.array\n{foo: add}?.Bar\n{foo: add}?.Bar?.i(foobar)\n{foo: add}?.Bar?.list\n{foo: add}?.String\n{foo: add}?.String?.String\n{foo: add}?.String?.[str]\n{foo: add}?.[str]\n{foo: add}?.[str]?.[f64]\n{foo: add}?.add\n{foo: add}?.add?.String()\n{foo: add}?.array\n{foo: add}?.array?.[f64]\n{foo: add}?.array?.[list]\n{foo: add}?.array?.find(nil, true).String\n{foo: add}?.f64\n{foo: add}?.f64?.[add]\n{foo: add}?.f64?.[greet]\n{foo: add}?.f64?.[str]\n{foo: add}?.f64?.i\n{foo: add}?.foo\n{foo: add}?.foobar\n{foo: add}?.foobar?.[array]\n{foo: add}?.foobar?.[ok]\n{foo: add}?.greet\n{foo: add}?.greet?.[f64]\n{foo: add}?.greet?.[foo]\n{foo: add}?.i\n{foo: add}?.list\n{foo: add}?.list?.[array].list\n{foo: add}?.list?.[ok]\n{foo: add}?.list?.add\n{foo: add}?.list?.list\n{foo: add}?.ok\n{foo: add}?.ok?.i\n{foo: add}?.str\n{foo: all($env, true)}\n{foo: all(array, ok)}.Bar\n{foo: all(array, true)}\n{foo: all(list, true)}\n{foo: any($env, false)}\n{foo: any($env, ok)}\n{foo: any($env, true)}\n{foo: any(array, false)}\n{foo: any(array, ok)}\n{foo: any(list, ok)}\n{foo: array != $env}\n{foo: array != list}\n{foo: array != nil}\n{foo: array == $env}\n{foo: array == array}\n{foo: array == list}\n{foo: array == nil}\n{foo: array ?? $env}\n{foo: array ?? 0}\n{foo: array ?? 1.0}\n{foo: array ?? 1}\n{foo: array ?? add}\n{foo: array ?? array}\n{foo: array ?? foo}\n{foo: array ?? greet}\n{foo: array ?? i}\n{foo: array ?? list}\n{foo: array ?? str}\n{foo: array ?? true}\n{foo: array | all(false)}\n{foo: array | filter(true)}\n{foo: array | find(true)}\n{foo: array | findIndex(true)}\n{foo: array | groupBy(0)}\n{foo: array | groupBy(1.0)}\n{foo: array | groupBy(foo)}\n{foo: array | groupBy(str)}\n{foo: array | map(#)}\n{foo: array | map($env)}\n{foo: array | map(1)}?.list\n{foo: array | map(false)}\n{foo: array | map(foo)}\n{foo: array | map(greet)}\n{foo: array | map(list)}\n{foo: array | map(ok)}\n{foo: array | map(str)}\n{foo: array | mean(i)}\n{foo: array | min(f64)}\n{foo: array | none(false)}\n{foo: array | one(ok)}\n{foo: array | reduce(#)}\n{foo: array | reduce($env, 1.0)}\n{foo: array | reduce(0)}\n{foo: array | reduce(1.0)}\n{foo: array | reduce(foo)}\n{foo: array | reduce(i)}\n{foo: array | reduce(i, f64)}\n{foo: array | sortBy(#)}\n{foo: array | sum(#)}\n{foo: array | sum(1.0)}\n{foo: array | sum(i)}\n{foo: array, foo: !false}?.greet\n{foo: array, foo: $env, foo: nil}.i\n{foo: array, foo: $env.add}\n{foo: array, foo: $env?.nil}\n{foo: array, foo: $env}.String\n{foo: array, foo: $env}.array?.[add]\n{foo: array, foo: $env}.foo\n{foo: array, foo: $env}.greet\n{foo: array, foo: $env}.list\n{foo: array, foo: $env}?.Bar\n{foo: array, foo: $env}?.[str]\n{foo: array, foo: $env}?.array\n{foo: array, foo: $env}?.f64\n{foo: array, foo: $env}?.foo\n{foo: array, foo: $env}?.greet\n{foo: array, foo: $env}?.i\n{foo: array, foo: $env}?.ok\n{foo: array, foo: 0}.Bar\n{foo: array, foo: 0}?.ok\n{foo: array, foo: 0}?.str\n{foo: array, foo: 1.0 <= 0}\n{foo: array, foo: 1.0, foo: ok}?.String\n{foo: array, foo: 1.0}.String\n{foo: array, foo: 1.0}.add\n{foo: array, foo: 1.0}.list\n{foo: array, foo: 1.0}.str\n{foo: array, foo: 1.0}?.Bar\n{foo: array, foo: 1.0}?.[str]\n{foo: array, foo: 1.0}?.array\n{foo: array, foo: 1.0}?.f64\n{foo: array, foo: 1.0}?.greet\n{foo: array, foo: 1.0}?.list\n{foo: array, foo: 1.0}?.ok\n{foo: array, foo: 1.0}?.str\n{foo: array, foo: 1}.Bar\n{foo: array, foo: 1}.add\n{foo: array, foo: 1}.f64\n{foo: array, foo: 1}.i?.ok\n{foo: array, foo: 1}.ok\n{foo: array, foo: 1}?.String\n{foo: array, foo: 1}?.[str]\n{foo: array, foo: 1}?.array\n{foo: array, foo: 1}?.str\n{foo: array, foo: [$env, nil]}\n{foo: array, foo: add}\n{foo: array, foo: add}.ok\n{foo: array, foo: add}?.foo\n{foo: array, foo: add}?.list\n{foo: array, foo: array, foo: $env}.ok\n{foo: array, foo: array}\n{foo: array, foo: array}.Bar\n{foo: array, foo: array}.add?.list()\n{foo: array, foo: array}.array?.Bar(nil)\n{foo: array, foo: array}.f64\n{foo: array, foo: array}.list\n{foo: array, foo: array}.str\n{foo: array, foo: array}?.str\n{foo: array, foo: f64, foo: 1.0}?.f64\n{foo: array, foo: f64}\n{foo: array, foo: f64}.Bar\n{foo: array, foo: f64}.String\n{foo: array, foo: f64}.f64\n{foo: array, foo: f64}.list\n{foo: array, foo: f64}.str\n{foo: array, foo: f64}?.foo\n{foo: array, foo: false}.add\n{foo: array, foo: false}.f64\n{foo: array, foo: false}.foo\n{foo: array, foo: false}?.f64\n{foo: array, foo: false}?.list\n{foo: array, foo: false}?.str\n{foo: array, foo: float(0)}\n{foo: array, foo: foo != foo}\n{foo: array, foo: foo, foo: foo}.i\n{foo: array, foo: foo.Bar}\n{foo: array, foo: foo.String}\n{foo: array, foo: foo}\n{foo: array, foo: foo}.Bar\n{foo: array, foo: foo}.String\n{foo: array, foo: foo}.add\n{foo: array, foo: foo}.array\n{foo: array, foo: foo}.greet\n{foo: array, foo: foo}.i\n{foo: array, foo: foo}.list\n{foo: array, foo: foo}.str\n{foo: array, foo: foo}?.Bar\n{foo: array, foo: foo}?.String\n{foo: array, foo: foo}?.array\n{foo: array, foo: foo}?.foobar?.array()\n{foo: array, foo: foo}?.greet\n{foo: array, foo: foo}?.i\n{foo: array, foo: foo}?.list\n{foo: array, foo: foo}?.ok\n{foo: array, foo: greet}\n{foo: array, foo: greet}.String\n{foo: array, foo: greet}?.f64\n{foo: array, foo: greet}?.foo\n{foo: array, foo: greet}?.greet\n{foo: array, foo: greet}?.str\n{foo: array, foo: groupBy(list, false)}\n{foo: array, foo: i, foo: 1.0}?.f64\n{foo: array, foo: i}\n{foo: array, foo: i}.String\n{foo: array, foo: i}.array\n{foo: array, foo: i}.i\n{foo: array, foo: i}.list\n{foo: array, foo: i}?.String\n{foo: array, foo: i}?.add\n{foo: array, foo: list}\n{foo: array, foo: list}.String\n{foo: array, foo: list}.array\n{foo: array, foo: list}.false?.[i]\n{foo: array, foo: list}.greet\n{foo: array, foo: list}.list\n{foo: array, foo: list}.ok\n{foo: array, foo: list}?.Bar\n{foo: array, foo: list}?.String\n{foo: array, foo: list}?.add\n{foo: array, foo: list}?.foo\n{foo: array, foo: list}?.greet\n{foo: array, foo: list}?.list\n{foo: array, foo: list}?.ok\n{foo: array, foo: nil}.Bar\n{foo: array, foo: nil}.Bar?.[f64]\n{foo: array, foo: nil}.add\n{foo: array, foo: nil}.array\n{foo: array, foo: nil}.greet\n{foo: array, foo: nil}.list\n{foo: array, foo: nil}.str\n{foo: array, foo: nil}?.[str]\n{foo: array, foo: nil}?.add\n{foo: array, foo: nil}?.foo\n{foo: array, foo: nil}?.greet\n{foo: array, foo: nil}?.i\n{foo: array, foo: nil}?.list\n{foo: array, foo: nil}?.ok\n{foo: array, foo: nil}?.str\n{foo: array, foo: ok, foo: 1.0}.ok\n{foo: array, foo: ok, foo: false}?.String?.String()\n{foo: array, foo: ok}\n{foo: array, foo: ok}.ok\n{foo: array, foo: ok}?.Bar\n{foo: array, foo: ok}?.String\n{foo: array, foo: ok}?.ok\n{foo: array, foo: reduce(array, #)}?.ok\n{foo: array, foo: str, foo: foo}?.array\n{foo: array, foo: str}\n{foo: array, foo: str}.Bar\n{foo: array, foo: str}.f64\n{foo: array, foo: str}.i\n{foo: array, foo: str}.list\n{foo: array, foo: str}.ok\n{foo: array, foo: str}.str\n{foo: array, foo: toJSON(1.0)}\n{foo: array, foo: true}.greet\n{foo: array, foo: true}.str\n{foo: array, foo: true}?.Bar\n{foo: array, foo: true}?.foo\n{foo: array, foo: {foo: $env}}\n{foo: array?.[1]}\n{foo: array?.[i], foo: list}\n{foo: array?.[i]}\n{foo: array[0:]}\n{foo: array[1:]}\n{foo: array[:0]}\n{foo: array[:1]}\n{foo: array[:]}\n{foo: array[:i]}?.list\n{foo: array}\n{foo: array} ?? add\n{foo: array} ?? groupBy(list, 1)\n{foo: array} ?? list\n{foo: array}.Bar\n{foo: array}.Bar?.String\n{foo: array}.Bar?.[array]\n{foo: array}.Bar?.[i]\n{foo: array}.Bar?.[ok]\n{foo: array}.String\n{foo: array}.String?.[f64]\n{foo: array}.String?.list\n{foo: array}.add\n{foo: array}.add?.[add]\n{foo: array}.array\n{foo: array}.array?.add\n{foo: array}.array?.list\n{foo: array}.f64\n{foo: array}.f64?.[i]\n{foo: array}.f64?.add\n{foo: array}.f64?.f64()\n{foo: array}.foo\n{foo: array}.foobar\n{foo: array}.greet\n{foo: array}.greet?.greet\n{foo: array}.i\n{foo: array}.i?.[list]\n{foo: array}.i?.[ok]\n{foo: array}.i?.array\n{foo: array}.i?.foo\n{foo: array}.list\n{foo: array}.list?.[f64]\n{foo: array}.ok\n{foo: array}.str\n{foo: array}.str?.[greet]\n{foo: array}.str?.add\n{foo: array}?.Bar\n{foo: array}?.Bar?.[array]\n{foo: array}?.String\n{foo: array}?.String?.[list]\n{foo: array}?.[str]\n{foo: array}?.[str]?.String()\n{foo: array}?.[str]?.[add]\n{foo: array}?.[str]?.[array]\n{foo: array}?.[type(nil)]\n{foo: array}?.add\n{foo: array}?.array\n{foo: array}?.array?.foobar\n{foo: array}?.f64\n{foo: array}?.f64?.add\n{foo: array}?.f64?.ok\n{foo: array}?.foo\n{foo: array}?.foobar\n{foo: array}?.foobar?.array\n{foo: array}?.greet\n{foo: array}?.i\n{foo: array}?.list\n{foo: array}?.list?.add\n{foo: array}?.list?.f64\n{foo: array}?.ok\n{foo: array}?.ok?.ok()\n{foo: array}?.str\n{foo: array}?.str?.[f64]\n{foo: array}?.str?.[greet]\n{foo: bitnand(i, 1)}\n{foo: bitnot(0)}\n{foo: bitnot(1)}\n{foo: bitnot(i)}\n{foo: bitor(0, 0)}\n{foo: bitor(i, i)}\n{foo: bitshr(1, i)}\n{foo: bitxor(0, i)}\n{foo: bitxor(i, 1)}\n{foo: ceil(0), foo: array}\n{foo: ceil(0)}\n{foo: ceil(1)}\n{foo: ceil(1.0), foo: ok}\n{foo: ceil(1.0)}\n{foo: ceil(f64)}\n{foo: ceil(f64)}.array\n{foo: ceil(i)}\n{foo: concat(array)}\n{foo: concat(list)}\n{foo: count($env, ok)}\n{foo: count($env, true), foo: f64}\n{foo: count($env, true)}\n{foo: count(array, false)}\n{foo: count(array, ok)}\n{foo: count(list, ok)}\n{foo: f64 != $env}\n{foo: f64 != 1.0}\n{foo: f64 != 1}\n{foo: f64 != f64}\n{foo: f64 != i}\n{foo: f64 != nil}\n{foo: f64 * 0}\n{foo: f64 * 1.0}\n{foo: f64 * f64}\n{foo: f64 * i}\n{foo: f64 * i}?.Bar\n{foo: f64 ** 1.0}\n{foo: f64 ** f64}\n{foo: f64 ** i}\n{foo: f64 + 1.0}\n{foo: f64 + 1}\n{foo: f64 + f64}\n{foo: f64 + i}\n{foo: f64 - 0}\n{foo: f64 / 0}\n{foo: f64 / f64}\n{foo: f64 / i}\n{foo: f64 < 0}\n{foo: f64 < 0}.f64\n{foo: f64 < i}\n{foo: f64 <= 1.0}\n{foo: f64 <= f64}\n{foo: f64 <= i}\n{foo: f64 == $env}\n{foo: f64 == 0}\n{foo: f64 == 1.0}\n{foo: f64 == 1}\n{foo: f64 == i}\n{foo: f64 == nil}\n{foo: f64 > 0, foo: floor(1.0)}\n{foo: f64 > 0}\n{foo: f64 > f64}\n{foo: f64 >= 0}\n{foo: f64 >= 1.0}\n{foo: f64 >= 1}\n{foo: f64 ?? $env}\n{foo: f64 ?? 1.0}\n{foo: f64 ?? f64}\n{foo: f64 ?? foo}\n{foo: f64 ?? list}\n{foo: f64 ?? nil}\n{foo: f64 ?? str}\n{foo: f64 ^ 1.0}\n{foo: f64 ^ i}\n{foo: f64 in array}\n{foo: f64 not in array}\n{foo: f64 not in array}.f64\n{foo: f64, foo: $env == array}\n{foo: f64, foo: $env.foo}\n{foo: f64, foo: $env?.[foobar]}\n{foo: f64, foo: $env?.list}\n{foo: f64, foo: $env?.ok}\n{foo: f64, foo: $env}.String\n{foo: f64, foo: $env}.greet\n{foo: f64, foo: $env}.i\n{foo: f64, foo: $env}.ok\n{foo: f64, foo: $env}.str\n{foo: f64, foo: $env}?.i\n{foo: f64, foo: $env}?.list\n{foo: f64, foo: $env}?.ok\n{foo: f64, foo: 0, foo: 1.0}.f64\n{foo: f64, foo: 0}.Bar\n{foo: f64, foo: 0}.add\n{foo: f64, foo: 0}.array\n{foo: f64, foo: 0}.list\n{foo: f64, foo: 0}.ok\n{foo: f64, foo: 0}.str\n{foo: f64, foo: 0}?.foo\n{foo: f64, foo: 0}?.list\n{foo: f64, foo: 1 != $env}\n{foo: f64, foo: 1 / 0}\n{foo: f64, foo: 1, foo: $env}?.i\n{foo: f64, foo: 1, foo: nil}.String\n{foo: f64, foo: 1.0, foo: true}.foo\n{foo: f64, foo: 1.0}.f64\n{foo: f64, foo: 1.0}.i\n{foo: f64, foo: 1.0}?.Bar\n{foo: f64, foo: 1.0}?.[str]\n{foo: f64, foo: 1.0}?.array\n{foo: f64, foo: 1.0}?.f64\n{foo: f64, foo: 1.0}?.greet\n{foo: f64, foo: 1.0}?.i\n{foo: f64, foo: 1.0}?.ok\n{foo: f64, foo: 1.0}?.str\n{foo: f64, foo: 1}.ok\n{foo: f64, foo: 1}?.String\n{foo: f64, foo: 1}?.[str]\n{foo: f64, foo: 1}?.greet\n{foo: f64, foo: 1}?.list\n{foo: f64, foo: 1}?.str\n{foo: f64, foo: add}\n{foo: f64, foo: add}.Bar\n{foo: f64, foo: add}.add\n{foo: f64, foo: add}.foo\n{foo: f64, foo: add}.greet\n{foo: f64, foo: add}.str\n{foo: f64, foo: add}?.String\n{foo: f64, foo: add}?.f64\n{foo: f64, foo: add}?.foo\n{foo: f64, foo: add}?.greet\n{foo: f64, foo: add}?.i\n{foo: f64, foo: array}\n{foo: f64, foo: array}.Bar\n{foo: f64, foo: array}.add\n{foo: f64, foo: array}?.Bar\n{foo: f64, foo: array}?.foo\n{foo: f64, foo: array}?.list\n{foo: f64, foo: array}?.str\n{foo: f64, foo: f64}\n{foo: f64, foo: f64}.String\n{foo: f64, foo: f64}.ok\n{foo: f64, foo: f64}.str\n{foo: f64, foo: f64}?.Bar\n{foo: f64, foo: f64}?.f64\n{foo: f64, foo: f64}?.foo\n{foo: f64, foo: f64}?.str\n{foo: f64, foo: false != nil}\n{foo: f64, foo: false}.f64\n{foo: f64, foo: false}.greet\n{foo: f64, foo: false}.ok?.[array]\n{foo: f64, foo: foo, foo: 0}.ok\n{foo: f64, foo: foo, foo: foo}.Bar\n{foo: f64, foo: foo, foo: foo}?.add\n{foo: f64, foo: foo, foo: foo}?.greet\n{foo: f64, foo: foo}\n{foo: f64, foo: foo}.Bar\n{foo: f64, foo: foo}.add\n{foo: f64, foo: foo}.array\n{foo: f64, foo: foo}.f64\n{foo: f64, foo: foo}.foo\n{foo: f64, foo: foo}.greet\n{foo: f64, foo: foo}.i\n{foo: f64, foo: foo}.list\n{foo: f64, foo: foo}.ok\n{foo: f64, foo: foo}?.String\n{foo: f64, foo: foo}?.[str]\n{foo: f64, foo: foo}?.add\n{foo: f64, foo: foo}?.array\n{foo: f64, foo: foo}?.foo\n{foo: f64, foo: foo}?.greet\n{foo: f64, foo: foo}?.i\n{foo: f64, foo: foo}?.str\n{foo: f64, foo: greet(str)}.str\n{foo: f64, foo: greet, foo: i}?.str\n{foo: f64, foo: greet}\n{foo: f64, foo: greet}.add\n{foo: f64, foo: greet}.array\n{foo: f64, foo: greet}.i\n{foo: f64, foo: greet}?.foo\n{foo: f64, foo: greet}?.greet\n{foo: f64, foo: greet}?.ok\n{foo: f64, foo: i, foo: add}.ok\n{foo: f64, foo: i, foo: foo}?.greet\n{foo: f64, foo: if ok { foo } else { nil }}.foo\n{foo: f64, foo: i}\n{foo: f64, foo: i}.array\n{foo: f64, foo: i}.greet\n{foo: f64, foo: i}?.[str]\n{foo: f64, foo: list}\n{foo: f64, foo: list}.String\n{foo: f64, foo: list}.add\n{foo: f64, foo: list}.array\n{foo: f64, foo: list}.foo\n{foo: f64, foo: list}.list\n{foo: f64, foo: list}?.Bar\n{foo: f64, foo: list}?.String\n{foo: f64, foo: list}?.i?.[i]\n{foo: f64, foo: nil, foo: $env}?.f64\n{foo: f64, foo: nil, foo: $env}?.ok\n{foo: f64, foo: nil, foo: 1.0}.array\n{foo: f64, foo: nil}.String\n{foo: f64, foo: nil}.array\n{foo: f64, foo: nil}.f64\n{foo: f64, foo: nil}.foobar\n{foo: f64, foo: nil}.greet\n{foo: f64, foo: nil}?.[str]\n{foo: f64, foo: nil}?.add?.[f64]\n{foo: f64, foo: nil}?.array\n{foo: f64, foo: nil}?.f64\n{foo: f64, foo: nil}?.foobar\n{foo: f64, foo: nil}?.i\n{foo: f64, foo: nil}?.str\n{foo: f64, foo: ok ?? f64}\n{foo: f64, foo: ok, foo: 1.0}?.str\n{foo: f64, foo: ok}\n{foo: f64, foo: ok}?.Bar\n{foo: f64, foo: ok}?.String\n{foo: f64, foo: ok}?.f64?.[i]\n{foo: f64, foo: ok}?.ok\n{foo: f64, foo: round(1)}\n{foo: f64, foo: str, foo: 0}?.[str]\n{foo: f64, foo: str}\n{foo: f64, foo: str}.array\n{foo: f64, foo: str}.f64\n{foo: f64, foo: str}.i\n{foo: f64, foo: str}?.[str]\n{foo: f64, foo: str}?.add\n{foo: f64, foo: str}?.f64\n{foo: f64, foo: str}?.list\n{foo: f64, foo: sum(array)}\n{foo: f64, foo: toJSON(1)}\n{foo: f64, foo: true != nil}\n{foo: f64, foo: true}.add\n{foo: f64, foo: true}?.foo\n{foo: f64, foo: true}?.str\n{foo: f64, foo: {foo: nil}}\n{foo: f64}\n{foo: f64} ?? abs(0)\n{foo: f64} ?? add\n{foo: f64} ?? greet\n{foo: f64} not in first($env)\n{foo: f64}.Bar\n{foo: f64}.String\n{foo: f64}.String?.foo\n{foo: f64}.add\n{foo: f64}.array\n{foo: f64}.array?.foo?.[ok]\n{foo: f64}.f64\n{foo: f64}.f64 != array\n{foo: f64}.f64?.greet\n{foo: f64}.foo\n{foo: f64}.foobar\n{foo: f64}.foobar?.[add]\n{foo: f64}.greet\n{foo: f64}.i\n{foo: f64}.i?.add(foo)\n{foo: f64}.i?.array\n{foo: f64}.list\n{foo: f64}.list?.list()\n{foo: f64}.ok\n{foo: f64}.ok?.list\n{foo: f64}.str\n{foo: f64}.str?.array\n{foo: f64}?.Bar\n{foo: f64}?.String\n{foo: f64}?.[str]\n{foo: f64}?.[str]?.Bar?.f64.String\n{foo: f64}?.[str]?.list\n{foo: f64}?.[str]?.list()\n{foo: f64}?.add\n{foo: f64}?.add?.[array]\n{foo: f64}?.add?.add\n{foo: f64}?.array\n{foo: f64}?.array?.Bar()\n{foo: f64}?.f64\n{foo: f64}?.f64?.[f64]\n{foo: f64}?.f64?.[ok]\n{foo: f64}?.f64?.array\n{foo: f64}?.foo\n{foo: f64}?.foobar\n{foo: f64}?.greet\n{foo: f64}?.i\n{foo: f64}?.i?.[foo]\n{foo: f64}?.i?.add\n{foo: f64}?.list\n{foo: f64}?.list?.[list]\n{foo: f64}?.ok\n{foo: f64}?.ok?.foo\n{foo: f64}?.str\n{foo: f64}?.str?.i\n{foo: false != $env}\n{foo: false != false}\n{foo: false != nil}\n{foo: false != ok}\n{foo: false != true}\n{foo: false && $env}\n{foo: false == false}\n{foo: false == nil}\n{foo: false == ok}\n{foo: false == true}\n{foo: false ? foo : i}\n{foo: false ? foo : ok}\n{foo: false ? greet : nil}\n{foo: false ? list : 1}\n{foo: false ? list : f64}\n{foo: false ? ok : f64}\n{foo: false ?: foo}\n{foo: false ?: greet}\n{foo: false ?? $env}\n{foo: false ?? 0}\n{foo: false ?? 1.0}\n{foo: false ?? 1}\n{foo: false ?? array}\n{foo: false ?? f64}.str\n{foo: false ?? false}\n{foo: false ?? foo}\n{foo: false ?? i}\n{foo: false ?? list}\n{foo: false ?? nil, foo: array}\n{foo: false ?? nil}\n{foo: false and $env}\n{foo: false and false}\n{foo: false and ok}\n{foo: false and true}\n{foo: false or $env}\n{foo: false or false}\n{foo: false or ok}\n{foo: false or true}\n{foo: false || $env}\n{foo: false || true}\n{foo: false, foo: $env, foo: foo}?.str\n{foo: false, foo: $env, foo: true}.foo\n{foo: false, foo: $env}.Bar\n{foo: false, foo: $env}.String\n{foo: false, foo: $env}.f64\n{foo: false, foo: $env}.foo\n{foo: false, foo: $env}.greet\n{foo: false, foo: $env}.list\n{foo: false, foo: $env}.ok\n{foo: false, foo: $env}?.Bar\n{foo: false, foo: $env}?.String\n{foo: false, foo: $env}?.[str]\n{foo: false, foo: $env}?.greet\n{foo: false, foo: $env}?.list\n{foo: false, foo: $env}?.str\n{foo: false, foo: 0, foo: $env}?.list\n{foo: false, foo: 0, foo: 0}.str\n{foo: false, foo: 0}.f64\n{foo: false, foo: 0}.greet\n{foo: false, foo: 0}?.array\n{foo: false, foo: 0}?.list\n{foo: false, foo: 1.0, foo: $env}.add\n{foo: false, foo: 1.0}.Bar\n{foo: false, foo: 1.0}.String\n{foo: false, foo: 1.0}.array\n{foo: false, foo: 1.0}.foo\n{foo: false, foo: 1.0}.greet\n{foo: false, foo: 1.0}.str\n{foo: false, foo: 1.0}?.String\n{foo: false, foo: 1.0}?.[str]\n{foo: false, foo: 1.0}?.ok\n{foo: false, foo: 1.0}?.str\n{foo: false, foo: 1.0}?.str?.[f64]\n{foo: false, foo: 1}.String\n{foo: false, foo: 1}.add\n{foo: false, foo: 1}.foo\n{foo: false, foo: 1}.i\n{foo: false, foo: 1}.list?.[greet]\n{foo: false, foo: 1}.ok\n{foo: false, foo: 1}?.String\n{foo: false, foo: 1}?.i\n{foo: false, foo: add}.array\n{foo: false, foo: add}?.String\n{foo: false, foo: add}?.f64\n{foo: false, foo: add}?.foo\n{foo: false, foo: add}?.greet\n{foo: false, foo: array, foo: foo}?.Bar\n{foo: false, foo: array}.Bar?.[greet]\n{foo: false, foo: array}.foo\n{foo: false, foo: array}.ok\n{foo: false, foo: array}?.Bar\n{foo: false, foo: array}?.greet\n{foo: false, foo: array}?.i\n{foo: false, foo: array}?.ok\n{foo: false, foo: array}?.str?.greet\n{foo: false, foo: f64, foo: 1.0}.list\n{foo: false, foo: f64}.Bar\n{foo: false, foo: f64}.greet\n{foo: false, foo: f64}.i\n{foo: false, foo: f64}?.str\n{foo: false, foo: f64}?.str?.f64\n{foo: false, foo: false, foo: foo}?.Bar\n{foo: false, foo: false}.Bar\n{foo: false, foo: false}?.f64\n{foo: false, foo: false}?.foo\n{foo: false, foo: false}?.greet?.[foo]?.str\n{foo: false, foo: false}?.ok\n{foo: false, foo: foo, foo: add}.Bar\n{foo: false, foo: foo, foo: foo}.str\n{foo: false, foo: foo, foo: greet}.f64\n{foo: false, foo: foo}.Bar\n{foo: false, foo: foo}.array\n{foo: false, foo: foo}.f64\n{foo: false, foo: foo}.foo\n{foo: false, foo: foo}.greet\n{foo: false, foo: foo}.i\n{foo: false, foo: foo}.list\n{foo: false, foo: foo}.ok\n{foo: false, foo: foo}.str\n{foo: false, foo: foo}?.Bar\n{foo: false, foo: foo}?.[str]\n{foo: false, foo: foo}?.add\n{foo: false, foo: foo}?.array\n{foo: false, foo: foo}?.foo\n{foo: false, foo: foo}?.i\n{foo: false, foo: foo}?.str\n{foo: false, foo: greet}.Bar\n{foo: false, foo: greet}.add\n{foo: false, foo: greet}.array\n{foo: false, foo: greet}.greet\n{foo: false, foo: greet}.i\n{foo: false, foo: greet}.str\n{foo: false, foo: greet}?.array\n{foo: false, foo: greet}?.foobar\n{foo: false, foo: greet}?.ok\n{foo: false, foo: greet}?.str\n{foo: false, foo: i}.list\n{foo: false, foo: i}.ok\n{foo: false, foo: i}.str\n{foo: false, foo: i}?.Bar\n{foo: false, foo: i}?.foo\n{foo: false, foo: i}?.greet\n{foo: false, foo: i}?.i\n{foo: false, foo: i}?.list\n{foo: false, foo: list, foo: f64}?.str\n{foo: false, foo: list, foo: list}?.array\n{foo: false, foo: list}.foobar\n{foo: false, foo: list}?.[str]\n{foo: false, foo: list}?.add\n{foo: false, foo: list}?.array?.foo\n{foo: false, foo: nil}.Bar\n{foo: false, foo: nil}.String\n{foo: false, foo: nil}.add\n{foo: false, foo: nil}.foo\n{foo: false, foo: nil}.foobar?.str\n{foo: false, foo: nil}.greet\n{foo: false, foo: nil}?.String?.array\n{foo: false, foo: nil}?.add\n{foo: false, foo: nil}?.foo\n{foo: false, foo: nil}?.list\n{foo: false, foo: nil}?.ok\n{foo: false, foo: nil}?.str\n{foo: false, foo: ok}.add\n{foo: false, foo: ok}.list\n{foo: false, foo: ok}?.String\n{foo: false, foo: ok}?.[str]\n{foo: false, foo: ok}?.array\n{foo: false, foo: ok}?.greet\n{foo: false, foo: ok}?.i\n{foo: false, foo: str}.array\n{foo: false, foo: str}?.Bar\n{foo: false, foo: str}?.String\n{foo: false, foo: str}?.[str]\n{foo: false, foo: true}.Bar\n{foo: false, foo: true}.add\n{foo: false, foo: true}.array\n{foo: false, foo: true}.ok\n{foo: false, foo: true}?.array\n{foo: false, foo: true}?.list\n{foo: false, foo: true}?.ok\n{foo: false} ?? list\n{foo: false}.Bar\n{foo: false}.String\n{foo: false}.String?.[i]\n{foo: false}.add\n{foo: false}.array\n{foo: false}.array?.greet(foobar)\n{foo: false}.f64\n{foo: false}.f64?.Bar\n{foo: false}.f64?.[ok]\n{foo: false}.f64?.list\n{foo: false}.foo\n{foo: false}.foobar\n{foo: false}.greet\n{foo: false}.i\n{foo: false}.i?.Bar\n{foo: false}.list\n{foo: false}.list?.str\n{foo: false}.ok\n{foo: false}.ok == i\n{foo: false}.ok?.f64\n{foo: false}.str\n{foo: false}.str?.array\n{foo: false}?.$env?.array\n{foo: false}?.Bar\n{foo: false}?.String\n{foo: false}?.[str]\n{foo: false}?.add\n{foo: false}?.array\n{foo: false}?.f64\n{foo: false}?.f64?.Bar\n{foo: false}?.f64?.array()\n{foo: false}?.foo\n{foo: false}?.foobar\n{foo: false}?.foobar?.foo\n{foo: false}?.greet\n{foo: false}?.greet?.greet\n{foo: false}?.i\n{foo: false}?.i?.[foo]\n{foo: false}?.list\n{foo: false}?.ok\n{foo: false}?.ok?.[foo]\n{foo: false}?.str\n{foo: false}?.str?.[f64]\n{foo: false}?.str?.[list]\n{foo: filter($env, false)}\n{foo: filter(array, ok)}\n{foo: filter(list, ok)}\n{foo: filter(list, true)}\n{foo: find(array, false)}\n{foo: find(array, ok)}\n{foo: find(array, true)}\n{foo: find(list, false)}.str\n{foo: find(list, true), foo: foo}\n{foo: findIndex($env, ok)}\n{foo: findIndex($env, true)}\n{foo: findIndex(array, ok)}\n{foo: findIndex(list, ok)}\n{foo: findIndex(list, true)}\n{foo: first($env)}\n{foo: first($env)}?.foo\n{foo: first(array)}\n{foo: first(list)}\n{foo: flatten(array)}\n{foo: flatten(list)}\n{foo: float(0)}\n{foo: float(1)}\n{foo: float(1.0)}\n{foo: float(1.0)}.i\n{foo: float(1.0)}?.String\n{foo: float(f64), foo: f64}\n{foo: float(f64)}\n{foo: float(i)}\n{foo: floor(0)}\n{foo: floor(1), foo: nil == foo}\n{foo: floor(1)}\n{foo: floor(1.0)}\n{foo: floor(f64)}\n{foo: floor(f64)}.add\n{foo: floor(i)}\n{foo: foo != $env}\n{foo: foo != $env}.list\n{foo: foo != foo, foo: greet}\n{foo: foo != foo}\n{foo: foo != foo}?.greet\n{foo: foo != nil}\n{foo: foo == $env}\n{foo: foo == foo}\n{foo: foo == nil}\n{foo: foo ?? $env.foo}\n{foo: foo ?? $env}\n{foo: foo ?? 0}\n{foo: foo ?? 1.0}\n{foo: foo ?? 1}\n{foo: foo ?? add}\n{foo: foo ?? array}\n{foo: foo ?? f64}\n{foo: foo ?? foo}\n{foo: foo ?? greet}\n{foo: foo ?? i}\n{foo: foo ?? list}\n{foo: foo ?? nil, foo: ok}\n{foo: foo ?? nil}\n{foo: foo ?? ok}\n{foo: foo in list}\n{foo: foo not in list, foo: f64}.i\n{foo: foo not in list}\n{foo: foo, foo: $env, foo: 1}?.str\n{foo: foo, foo: $env, foo: add}.foo\n{foo: foo, foo: $env, foo: nil}?.f64\n{foo: foo, foo: $env, foo: ok}?.array\n{foo: foo, foo: $env.f64}.greet\n{foo: foo, foo: $env.greet}\n{foo: foo, foo: $env?.[foobar]}\n{foo: foo, foo: $env?.f64}\n{foo: foo, foo: $env}.Bar\n{foo: foo, foo: $env}.String?.str\n{foo: foo, foo: $env}.add\n{foo: foo, foo: $env}.array\n{foo: foo, foo: $env}.f64\n{foo: foo, foo: $env}.foo\n{foo: foo, foo: $env}.greet\n{foo: foo, foo: $env}.list\n{foo: foo, foo: $env}.nil?.[foo]\n{foo: foo, foo: $env}.ok\n{foo: foo, foo: $env}.str\n{foo: foo, foo: $env}?.Bar\n{foo: foo, foo: $env}?.String\n{foo: foo, foo: $env}?.[str]\n{foo: foo, foo: $env}?.add\n{foo: foo, foo: $env}?.array\n{foo: foo, foo: $env}?.f64\n{foo: foo, foo: $env}?.foo\n{foo: foo, foo: $env}?.greet\n{foo: foo, foo: $env}?.i\n{foo: foo, foo: $env}?.list\n{foo: foo, foo: $env}?.ok\n{foo: foo, foo: $env}?.str != foo\n{foo: foo, foo: 0, foo: add}?.str\n{foo: foo, foo: 0} ?? greet\n{foo: foo, foo: 0}.Bar\n{foo: foo, foo: 0}.String\n{foo: foo, foo: 0}.foo\n{foo: foo, foo: 0}.foobar\n{foo: foo, foo: 0}.greet\n{foo: foo, foo: 0}.ok\n{foo: foo, foo: 0}.str\n{foo: foo, foo: 0}?.$env?.[list]\n{foo: foo, foo: 0}?.Bar\n{foo: foo, foo: 0}?.String\n{foo: foo, foo: 0}?.[str]\n{foo: foo, foo: 0}?.add\n{foo: foo, foo: 0}?.f64\n{foo: foo, foo: 0}?.foo\n{foo: foo, foo: 0}?.greet\n{foo: foo, foo: 0}?.list\n{foo: foo, foo: 1, foo: greet}?.str\n{foo: foo, foo: 1, foo: list}?.str\n{foo: foo, foo: 1.0 - 1.0}\n{foo: foo, foo: 1.0, foo: array}.str\n{foo: foo, foo: 1.0}.Bar\n{foo: foo, foo: 1.0}.String\n{foo: foo, foo: 1.0}.add\n{foo: foo, foo: 1.0}.array\n{foo: foo, foo: 1.0}.f64\n{foo: foo, foo: 1.0}.foo\n{foo: foo, foo: 1.0}.greet\n{foo: foo, foo: 1.0}.i\n{foo: foo, foo: 1.0}.i?.list\n{foo: foo, foo: 1.0}.list\n{foo: foo, foo: 1.0}.ok\n{foo: foo, foo: 1.0}.str\n{foo: foo, foo: 1.0}?.Bar\n{foo: foo, foo: 1.0}?.String\n{foo: foo, foo: 1.0}?.[str]\n{foo: foo, foo: 1.0}?.add\n{foo: foo, foo: 1.0}?.add?.ok\n{foo: foo, foo: 1.0}?.array\n{foo: foo, foo: 1.0}?.f64\n{foo: foo, foo: 1.0}?.foo\n{foo: foo, foo: 1.0}?.greet\n{foo: foo, foo: 1.0}?.list\n{foo: foo, foo: 1.0}?.ok?.[add]\n{foo: foo, foo: 1.0}?.str\n{foo: foo, foo: 1}.Bar\n{foo: foo, foo: 1}.String\n{foo: foo, foo: 1}.add\n{foo: foo, foo: 1}.f64\n{foo: foo, foo: 1}.foo\n{foo: foo, foo: 1}.i\n{foo: foo, foo: 1}.list\n{foo: foo, foo: 1}.ok\n{foo: foo, foo: 1}.str\n{foo: foo, foo: 1}?.add\n{foo: foo, foo: 1}?.f64\n{foo: foo, foo: 1}?.foo\n{foo: foo, foo: 1}?.list\n{foo: foo, foo: 1}?.ok\n{foo: foo, foo: 1}?.str\n{foo: foo, foo: [$env?.add]}\n{foo: foo, foo: add, foo: foo}?.add\n{foo: foo, foo: add, foo: nil}.f64\n{foo: foo, foo: add}\n{foo: foo, foo: add}.array\n{foo: foo, foo: add}.f64\n{foo: foo, foo: add}.foo\n{foo: foo, foo: add}.greet\n{foo: foo, foo: add}.i\n{foo: foo, foo: add}.list\n{foo: foo, foo: add}.str\n{foo: foo, foo: add}?.String\n{foo: foo, foo: add}?.add\n{foo: foo, foo: add}?.f64\n{foo: foo, foo: add}?.list\n{foo: foo, foo: add}?.ok\n{foo: foo, foo: add}?.str\n{foo: foo, foo: array, foo: false}?.greet\n{foo: foo, foo: array, foo: i}.f64\n{foo: foo, foo: array}\n{foo: foo, foo: array}.Bar\n{foo: foo, foo: array}.String\n{foo: foo, foo: array}.f64\n{foo: foo, foo: array}.foo\n{foo: foo, foo: array}.greet\n{foo: foo, foo: array}.i\n{foo: foo, foo: array}.list\n{foo: foo, foo: array}.ok\n{foo: foo, foo: array}.str\n{foo: foo, foo: array}?.String\n{foo: foo, foo: array}?.[str]\n{foo: foo, foo: array}?.add\n{foo: foo, foo: array}?.array\n{foo: foo, foo: array}?.foo\n{foo: foo, foo: array}?.greet\n{foo: foo, foo: array}?.greet?.list\n{foo: foo, foo: array}?.i\n{foo: foo, foo: array}?.ok\n{foo: foo, foo: f64, foo: 1.0}?.array\n{foo: foo, foo: f64}\n{foo: foo, foo: f64}.String\n{foo: foo, foo: f64}.add\n{foo: foo, foo: f64}.array\n{foo: foo, foo: f64}.f64\n{foo: foo, foo: f64}.i\n{foo: foo, foo: f64}.list\n{foo: foo, foo: f64}.list?.[i]\n{foo: foo, foo: f64}?.Bar\n{foo: foo, foo: f64}?.String\n{foo: foo, foo: f64}?.add\n{foo: foo, foo: f64}?.f64\n{foo: foo, foo: f64}?.foo\n{foo: foo, foo: f64}?.ok\n{foo: foo, foo: f64}?.str\n{foo: foo, foo: false, foo: list}?.str?.add\n{foo: foo, foo: false}.Bar\n{foo: foo, foo: false}.String\n{foo: foo, foo: false}.array\n{foo: foo, foo: false}.f64\n{foo: foo, foo: false}.foo\n{foo: foo, foo: false}.greet\n{foo: foo, foo: false}.i\n{foo: foo, foo: false}.list\n{foo: foo, foo: false}.ok\n{foo: foo, foo: false}.str\n{foo: foo, foo: false}?.[str]\n{foo: foo, foo: false}?.add\n{foo: foo, foo: false}?.foo\n{foo: foo, foo: false}?.i\n{foo: foo, foo: false}?.ok\n{foo: foo, foo: false}?.str\n{foo: foo, foo: foo, foo: $env}.String\n{foo: foo, foo: foo, foo: add}?.f64\n{foo: foo, foo: foo, foo: foo}.greet\n{foo: foo, foo: foo, foo: greet}\n{foo: foo, foo: foo, foo: nil}.Bar\n{foo: foo, foo: foo, foo: ok}?.str\n{foo: foo, foo: foo.Bar}\n{foo: foo, foo: foo}\n{foo: foo, foo: foo}.Bar\n{foo: foo, foo: foo}.Bar?.[f64]\n{foo: foo, foo: foo}.String\n{foo: foo, foo: foo}.add\n{foo: foo, foo: foo}.array\n{foo: foo, foo: foo}.f64\n{foo: foo, foo: foo}.foo\n{foo: foo, foo: foo}.greet\n{foo: foo, foo: foo}.list\n{foo: foo, foo: foo}.ok\n{foo: foo, foo: foo}.str\n{foo: foo, foo: foo}?.Bar\n{foo: foo, foo: foo}?.String\n{foo: foo, foo: foo}?.[str]\n{foo: foo, foo: foo}?.add\n{foo: foo, foo: foo}?.array\n{foo: foo, foo: foo}?.f64\n{foo: foo, foo: foo}?.foo\n{foo: foo, foo: foo}?.foobar\n{foo: foo, foo: foo}?.greet\n{foo: foo, foo: foo}?.list\n{foo: foo, foo: foo}?.list?.f64\n{foo: foo, foo: foo}?.ok\n{foo: foo, foo: foo}?.str\n{foo: foo, foo: greet, foo: 1.0}.list\n{foo: foo, foo: greet, foo: foo}?.i\n{foo: foo, foo: greet}\n{foo: foo, foo: greet}.Bar\n{foo: foo, foo: greet}.String\n{foo: foo, foo: greet}.add\n{foo: foo, foo: greet}.array\n{foo: foo, foo: greet}.foo\n{foo: foo, foo: greet}.greet\n{foo: foo, foo: greet}.i\n{foo: foo, foo: greet}.str\n{foo: foo, foo: greet}?.Bar\n{foo: foo, foo: greet}?.array\n{foo: foo, foo: greet}?.f64\n{foo: foo, foo: greet}?.foo\n{foo: foo, foo: greet}?.greet\n{foo: foo, foo: greet}?.list\n{foo: foo, foo: i / f64}\n{foo: foo, foo: i, foo: 0}.ok\n{foo: foo, foo: i, foo: 1.0}.array\n{foo: foo, foo: i}\n{foo: foo, foo: i}.Bar\n{foo: foo, foo: i}.String\n{foo: foo, foo: i}.String?.String\n{foo: foo, foo: i}.add\n{foo: foo, foo: i}.foo\n{foo: foo, foo: i}.str\n{foo: foo, foo: i}?.String\n{foo: foo, foo: i}?.[str]\n{foo: foo, foo: i}?.array\n{foo: foo, foo: i}?.f64\n{foo: foo, foo: i}?.foo\n{foo: foo, foo: i}?.foobar\n{foo: foo, foo: i}?.greet\n{foo: foo, foo: i}?.ok\n{foo: foo, foo: i}?.str\n{foo: foo, foo: list != list}\n{foo: foo, foo: list, foo: false and false}\n{foo: foo, foo: list, foo: greet}?.f64\n{foo: foo, foo: list}\n{foo: foo, foo: list}.String\n{foo: foo, foo: list}.add?.[i]\n{foo: foo, foo: list}.array\n{foo: foo, foo: list}.array?.Bar\n{foo: foo, foo: list}.f64\n{foo: foo, foo: list}.greet\n{foo: foo, foo: list}.ok\n{foo: foo, foo: list}.str\n{foo: foo, foo: list}?.Bar\n{foo: foo, foo: list}?.[str]\n{foo: foo, foo: list}?.add\n{foo: foo, foo: list}?.array\n{foo: foo, foo: list}?.f64\n{foo: foo, foo: list}?.greet\n{foo: foo, foo: list}?.i\n{foo: foo, foo: list}?.list\n{foo: foo, foo: list}?.str\n{foo: foo, foo: list}?.str?.array(1.0)\n{foo: foo, foo: median(0)}\n{foo: foo, foo: nil in $env}\n{foo: foo, foo: nil, foo: 0}.f64\n{foo: foo, foo: nil, foo: 0}?.f64?.i()\n{foo: foo, foo: nil, foo: 1}.greet\n{foo: foo, foo: nil, foo: nil}.f64\n{foo: foo, foo: nil, foo: nil}.list\n{foo: foo, foo: nil, foo: ok}?.list\n{foo: foo, foo: nil}.Bar\n{foo: foo, foo: nil}.String\n{foo: foo, foo: nil}.add\n{foo: foo, foo: nil}.array\n{foo: foo, foo: nil}.f64\n{foo: foo, foo: nil}.foo\n{foo: foo, foo: nil}.foobar?.[array]\n{foo: foo, foo: nil}.foobar?.[list]\n{foo: foo, foo: nil}.i\n{foo: foo, foo: nil}.i?.array\n{foo: foo, foo: nil}.list\n{foo: foo, foo: nil}.ok\n{foo: foo, foo: nil}.ok?.array()\n{foo: foo, foo: nil}.str\n{foo: foo, foo: nil}?.String\n{foo: foo, foo: nil}?.[str]\n{foo: foo, foo: nil}?.add\n{foo: foo, foo: nil}?.array\n{foo: foo, foo: nil}?.f64\n{foo: foo, foo: nil}?.foo\n{foo: foo, foo: nil}?.greet\n{foo: foo, foo: nil}?.i\n{foo: foo, foo: nil}?.list\n{foo: foo, foo: nil}?.ok\n{foo: foo, foo: nil}?.str\n{foo: foo, foo: ok, foo: 1}.Bar?.i(foobar)\n{foo: foo, foo: ok, foo: f64}.foo\n{foo: foo, foo: ok}\n{foo: foo, foo: ok}.String\n{foo: foo, foo: ok}.add\n{foo: foo, foo: ok}.array\n{foo: foo, foo: ok}.i\n{foo: foo, foo: ok}.list\n{foo: foo, foo: ok}?.String\n{foo: foo, foo: ok}?.[str]\n{foo: foo, foo: ok}?.add\n{foo: foo, foo: ok}?.array\n{foo: foo, foo: ok}?.f64\n{foo: foo, foo: ok}?.foo\n{foo: foo, foo: ok}?.i\n{foo: foo, foo: ok}?.list\n{foo: foo, foo: ok}?.str\n{foo: foo, foo: str, foo: 1.0}.Bar\n{foo: foo, foo: str, foo: foo}?.f64\n{foo: foo, foo: str, foo: list}?.String\n{foo: foo, foo: str}\n{foo: foo, foo: str}.String\n{foo: foo, foo: str}.f64\n{foo: foo, foo: str}.i\n{foo: foo, foo: str}.ok\n{foo: foo, foo: str}?.Bar\n{foo: foo, foo: str}?.add\n{foo: foo, foo: str}?.array\n{foo: foo, foo: str}?.f64\n{foo: foo, foo: str}?.f64?.ok\n{foo: foo, foo: str}?.foo\n{foo: foo, foo: str}?.greet\n{foo: foo, foo: str}?.greet?.[i]\n{foo: foo, foo: str}?.i\n{foo: foo, foo: str}?.str\n{foo: foo, foo: true, foo: $env}?.add\n{foo: foo, foo: true, foo: array}.ok\n{foo: foo, foo: true, foo: nil}?.Bar\n{foo: foo, foo: true, foo: nil}?.i\n{foo: foo, foo: true}.Bar\n{foo: foo, foo: true}.add\n{foo: foo, foo: true}.add?.[array]\n{foo: foo, foo: true}.foo\n{foo: foo, foo: true}.greet?.Bar\n{foo: foo, foo: true}.i\n{foo: foo, foo: true}.str\n{foo: foo, foo: true}?.Bar\n{foo: foo, foo: true}?.String\n{foo: foo, foo: true}?.[str]\n{foo: foo, foo: true}?.add\n{foo: foo, foo: true}?.array\n{foo: foo, foo: true}?.f64\n{foo: foo, foo: true}?.list\n{foo: foo, foo: true}?.list?.[i].Bar()\n{foo: foo, foo: true}?.ok\n{foo: foo, foo: true}?.str?.i\n{foo: foo, foo: {foo: foo}}\n{foo: foo.Bar, foo: false ? foo : str}?.ok\n{foo: foo.Bar, foo: greet}\n{foo: foo.Bar, foo: list}\n{foo: foo.Bar}\n{foo: foo.Bar}.greet\n{foo: foo.Bar}.list\n{foo: foo.Bar}?.f64\n{foo: foo.String() not matches str}\n{foo: foo.String()}\n{foo: foo.String()}?.ok\n{foo: foo.String, foo: ok}\n{foo: foo.String, foo: str}\n{foo: foo.String}\n{foo: foo.String}.String\n{foo: foo.String}.add\n{foo: foo.String}.array\n{foo: foo.String}.greet\n{foo: foo.String}.str\n{foo: foo.String}?.add\n{foo: foo.String}?.str\n{foo: foo?.Bar, foo: add}\n{foo: foo?.Bar}\n{foo: foo?.Bar}?.list\n{foo: foo?.String(), foo: i}\n{foo: foo?.String()}\n{foo: foo?.String()}.Bar\n{foo: foo?.String()}?.list\n{foo: foo?.String, foo: f64}\n{foo: foo?.String, foo: greet}\n{foo: foo?.String, foo: str}\n{foo: foo?.String}\n{foo: foo?.String}.array\n{foo: foo?.String}?.Bar\n{foo: foo}\n{foo: foo} ?? $env?.f64\n{foo: foo} ?? add\n{foo: foo} ?? greet\n{foo: foo} ?? ok\n{foo: foo}.Bar\n{foo: foo}.String\n{foo: foo}.String != str\n{foo: foo}.String?.[i]\n{foo: foo}.add\n{foo: foo}.add?.add()\n{foo: foo}.array\n{foo: foo}.array?.[str]\n{foo: foo}.array?.foo\n{foo: foo}.array?.greet()\n{foo: foo}.array?.i\n{foo: foo}.f64\n{foo: foo}.f64?.Bar\n{foo: foo}.f64?.[array]\n{foo: foo}.f64?.[f64]\n{foo: foo}.f64?.add\n{foo: foo}.f64?.i\n{foo: foo}.f64?.ok\n{foo: foo}.f64?.str\n{foo: foo}.false?.f64\n{foo: foo}.foo\n{foo: foo}.foobar\n{foo: foo}.foobar?.greet\n{foo: foo}.greet\n{foo: foo}.greet != f64\n{foo: foo}.greet?.[f64]\n{foo: foo}.greet?.[i]\n{foo: foo}.greet?.[ok]\n{foo: foo}.greet?.array()\n{foo: foo}.i\n{foo: foo}.i?.[f64]\n{foo: foo}.i?.add\n{foo: foo}.list\n{foo: foo}.list?.[f64]\n{foo: foo}.list?.[str]?.foobar\n{foo: foo}.list?.str\n{foo: foo}.ok\n{foo: foo}.ok?.[add].add()\n{foo: foo}.ok?.f64\n{foo: foo}.ok?.ok\n{foo: foo}.str\n{foo: foo}.str?.String\n{foo: foo}.str?.[array]\n{foo: foo}.str?.greet\n{foo: foo}?.Bar\n{foo: foo}?.String\n{foo: foo}?.String?.Bar\n{foo: foo}?.String?.String()\n{foo: foo}?.String?.array.str\n{foo: foo}?.[str]\n{foo: foo}?.[str]?.String\n{foo: foo}?.add\n{foo: foo}?.add?.f64(foobar, foobar)\n{foo: foo}?.add?.i\n{foo: foo}?.add?.ok\n{foo: foo}?.add?.str\n{foo: foo}?.array\n{foo: foo}?.array?.String?.[foo]\n{foo: foo}?.array?.[foo]\n{foo: foo}?.array?.i\n{foo: foo}?.f64\n{foo: foo}?.f64?.[add]\n{foo: foo}?.f64?.[list]\n{foo: foo}?.f64?.[ok]\n{foo: foo}?.f64?.str\n{foo: foo}?.foo\n{foo: foo}?.foobar\n{foo: foo}?.foobar == foo\n{foo: foo}?.foobar?.[add]\n{foo: foo}?.foobar?.[array]\n{foo: foo}?.foobar?.array\n{foo: foo}?.foobar?.foo\n{foo: foo}?.foobar?.greet(foobar)\n{foo: foo}?.greet\n{foo: foo}?.greet?.String?.[greet]\n{foo: foo}?.greet?.[f64]\n{foo: foo}?.greet?.[i]\n{foo: foo}?.greet?.[str]\n{foo: foo}?.i\n{foo: foo}?.i?.[add]\n{foo: foo}?.i?.ok\n{foo: foo}?.list\n{foo: foo}?.list?.[add]?.str\n{foo: foo}?.list?.add\n{foo: foo}?.list?.foo\n{foo: foo}?.list?.list\n{foo: foo}?.ok\n{foo: foo}?.ok?.Bar\n{foo: foo}?.ok?.String\n{foo: foo}?.ok?.[i]\n{foo: foo}?.ok?.f64()\n{foo: foo}?.ok?.greet()?.f64()\n{foo: foo}?.ok?.ok\n{foo: foo}?.str\n{foo: foo}?.str?.add\n{foo: foo}?.str?.f64\n{foo: greet != $env}\n{foo: greet != greet}.foo\n{foo: greet != nil}\n{foo: greet == $env}\n{foo: greet == greet}\n{foo: greet ?? $env}\n{foo: greet ?? 0}\n{foo: greet ?? 1.0}\n{foo: greet ?? 1}\n{foo: greet ?? add}\n{foo: greet ?? f64, foo: i}\n{foo: greet ?? f64}\n{foo: greet ?? false}\n{foo: greet ?? foo}\n{foo: greet ?? greet}\n{foo: greet ?? nil}\n{foo: greet($env?.[str])}\n{foo: greet(str), foo: array}\n{foo: greet(str)}\n{foo: greet(str)}.String\n{foo: greet(str)}.ok\n{foo: greet(str)}.str\n{foo: greet, foo: !false}\n{foo: greet, foo: $env.array}\n{foo: greet, foo: $env.f64}\n{foo: greet, foo: $env.ok}\n{foo: greet, foo: $env.str}\n{foo: greet, foo: $env?.ok}\n{foo: greet, foo: $env?.str}\n{foo: greet, foo: $env}.Bar\n{foo: greet, foo: $env}.Bar?.add\n{foo: greet, foo: $env}.String\n{foo: greet, foo: $env}.add\n{foo: greet, foo: $env}.greet\n{foo: greet, foo: $env}.str\n{foo: greet, foo: $env}?.String\n{foo: greet, foo: $env}?.add\n{foo: greet, foo: $env}?.array\n{foo: greet, foo: $env}?.greet\n{foo: greet, foo: $env}?.list\n{foo: greet, foo: $env}?.ok\n{foo: greet, foo: 0, foo: foo}?.String\n{foo: greet, foo: 0}.String\n{foo: greet, foo: 0}.foo\n{foo: greet, foo: 0}.i\n{foo: greet, foo: 0}?.Bar\n{foo: greet, foo: 0}?.add\n{foo: greet, foo: 0}?.f64\n{foo: greet, foo: 0}?.ok\n{foo: greet, foo: 1 ** f64}\n{foo: greet, foo: 1, foo: $env}?.Bar\n{foo: greet, foo: 1.0}.Bar\n{foo: greet, foo: 1.0}.String\n{foo: greet, foo: 1.0}.i\n{foo: greet, foo: 1.0}.ok\n{foo: greet, foo: 1.0}.str\n{foo: greet, foo: 1.0}?.Bar\n{foo: greet, foo: 1.0}?.String\n{foo: greet, foo: 1.0}?.array\n{foo: greet, foo: 1.0}?.f64?.[i]\n{foo: greet, foo: 1.0}?.list\n{foo: greet, foo: 1.0}?.str\n{foo: greet, foo: 1}.Bar\n{foo: greet, foo: 1}.foo\n{foo: greet, foo: 1}.list\n{foo: greet, foo: 1}?.[str]\n{foo: greet, foo: 1}?.i\n{foo: greet, foo: 1}?.ok\n{foo: greet, foo: [$env]}\n{foo: greet, foo: add}\n{foo: greet, foo: add}.array\n{foo: greet, foo: add}.foo\n{foo: greet, foo: add}?.add\n{foo: greet, foo: add}?.add?.[add]\n{foo: greet, foo: add}?.f64\n{foo: greet, foo: add}?.foo\n{foo: greet, foo: add}?.i\n{foo: greet, foo: array}\n{foo: greet, foo: array} ?? add\n{foo: greet, foo: array}.String\n{foo: greet, foo: array}.array\n{foo: greet, foo: array}.foo\n{foo: greet, foo: array}?.array\n{foo: greet, foo: f64}\n{foo: greet, foo: f64}.String\n{foo: greet, foo: f64}.greet\n{foo: greet, foo: f64}.i\n{foo: greet, foo: f64}?.Bar\n{foo: greet, foo: f64}?.String\n{foo: greet, foo: f64}?.i\n{foo: greet, foo: f64}?.list\n{foo: greet, foo: false == nil}\n{foo: greet, foo: false, foo: add}.Bar\n{foo: greet, foo: false, foo: foo}.String\n{foo: greet, foo: false}.add\n{foo: greet, foo: false}.array\n{foo: greet, foo: false}.f64\n{foo: greet, foo: false}.greet\n{foo: greet, foo: false}.ok\n{foo: greet, foo: false}.str\n{foo: greet, foo: false}?.[str]\n{foo: greet, foo: false}?.f64\n{foo: greet, foo: false}?.str\n{foo: greet, foo: float(f64)}\n{foo: greet, foo: foo != foo}\n{foo: greet, foo: foo ?? f64}\n{foo: greet, foo: foo, foo: array}\n{foo: greet, foo: foo, foo: greet}?.add\n{foo: greet, foo: foo.Bar}\n{foo: greet, foo: foo}\n{foo: greet, foo: foo}.String\n{foo: greet, foo: foo}.add\n{foo: greet, foo: foo}.f64\n{foo: greet, foo: foo}.foo\n{foo: greet, foo: foo}.greet\n{foo: greet, foo: foo}.i\n{foo: greet, foo: foo}.list\n{foo: greet, foo: foo}.ok\n{foo: greet, foo: foo}.ok?.list\n{foo: greet, foo: foo}?.Bar\n{foo: greet, foo: foo}?.Bar?.[ok]\n{foo: greet, foo: foo}?.String\n{foo: greet, foo: foo}?.[str]\n{foo: greet, foo: foo}?.add\n{foo: greet, foo: foo}?.f64\n{foo: greet, foo: foo}?.foo\n{foo: greet, foo: foo}?.greet\n{foo: greet, foo: foo}?.i\n{foo: greet, foo: foo}?.list\n{foo: greet, foo: foo}?.list?.str\n{foo: greet, foo: foo}?.ok\n{foo: greet, foo: foo}?.str\n{foo: greet, foo: greet(str)}\n{foo: greet, foo: greet}\n{foo: greet, foo: greet}?.str\n{foo: greet, foo: i == 1.0}\n{foo: greet, foo: i}\n{foo: greet, foo: i}.list\n{foo: greet, foo: i}?.String\n{foo: greet, foo: list}\n{foo: greet, foo: list}.Bar\n{foo: greet, foo: list}.list\n{foo: greet, foo: list}.str\n{foo: greet, foo: list}.true?.f64(false)\n{foo: greet, foo: list}?.add\n{foo: greet, foo: list}?.f64\n{foo: greet, foo: nil == str}\n{foo: greet, foo: nil}.add\n{foo: greet, foo: nil}.array\n{foo: greet, foo: nil}.f64\n{foo: greet, foo: nil}.f64?.[foo]\n{foo: greet, foo: nil}.foo(foobar?.[ok])\n{foo: greet, foo: nil}.greet\n{foo: greet, foo: nil}?.[str]\n{foo: greet, foo: nil}?.foo\n{foo: greet, foo: nil}?.greet\n{foo: greet, foo: nil}?.ok\n{foo: greet, foo: ok}\n{foo: greet, foo: ok}.foo\n{foo: greet, foo: ok}.i\n{foo: greet, foo: ok}?.array\n{foo: greet, foo: ok}?.f64\n{foo: greet, foo: ok}?.list\n{foo: greet, foo: ok}?.ok\n{foo: greet, foo: ok}?.str\n{foo: greet, foo: str}\n{foo: greet, foo: str}.Bar\n{foo: greet, foo: str}.String\n{foo: greet, foo: str}.add\n{foo: greet, foo: str}.foo\n{foo: greet, foo: str}.ok\n{foo: greet, foo: str}?.f64\n{foo: greet, foo: trimPrefix(str)}\n{foo: greet, foo: true}.Bar\n{foo: greet, foo: true}?.String\n{foo: greet, foo: true}?.greet\n{foo: greet, foo: true}?.ok\n{foo: greet, foo: true}?.str\n{foo: greet}\n{foo: greet} ?? 1 ?? 1.0\n{foo: greet} ?? add\n{foo: greet}.Bar\n{foo: greet}.Bar?.String\n{foo: greet}.Bar?.ok\n{foo: greet}.String\n{foo: greet}.String?.str()\n{foo: greet}.add\n{foo: greet}.add?.ok\n{foo: greet}.array\n{foo: greet}.array?.i\n{foo: greet}.f64\n{foo: greet}.f64?.String\n{foo: greet}.f64?.f64\n{foo: greet}.foo\n{foo: greet}.foobar\n{foo: greet}.foobar?.[1.0]\n{foo: greet}.foobar?.[foo]\n{foo: greet}.foobar?.foo()\n{foo: greet}.foobar?.str?.f64\n{foo: greet}.greet\n{foo: greet}.greet?.i\n{foo: greet}.greet?.str\n{foo: greet}.i\n{foo: greet}.list\n{foo: greet}.list?.Bar()\n{foo: greet}.list?.[f64]\n{foo: greet}.list?.list?.[f64]\n{foo: greet}.ok\n{foo: greet}.ok?.Bar\n{foo: greet}.ok?.add\n{foo: greet}.str\n{foo: greet}?.Bar\n{foo: greet}?.String\n{foo: greet}?.String?.String\n{foo: greet}?.[str]\n{foo: greet}?.add\n{foo: greet}?.add?.String\n{foo: greet}?.array\n{foo: greet}?.array?.[array]\n{foo: greet}?.f64\n{foo: greet}?.f64?.foo(array)\n{foo: greet}?.foo\n{foo: greet}?.foobar\n{foo: greet}?.foobar?.[foo]\n{foo: greet}?.foobar?.[ok]\n{foo: greet}?.greet\n{foo: greet}?.i\n{foo: greet}?.i?.[str]\n{foo: greet}?.list\n{foo: greet}?.list?.f64()\n{foo: greet}?.list?.i\n{foo: greet}?.ok\n{foo: greet}?.ok?.[foo]\n{foo: greet}?.ok?.list\n{foo: greet}?.str\n{foo: groupBy(array, #)}\n{foo: groupBy(array, 0), foo: min($env)}\n{foo: groupBy(array, 1.0)}\n{foo: groupBy(array, f64)}\n{foo: groupBy(array, false)}\n{foo: groupBy(array, foo)}\n{foo: groupBy(list, #)}\n{foo: groupBy(list, #.Bar)}\n{foo: groupBy(list, 0)}\n{foo: groupBy(list, 1)}\n{foo: groupBy(list, foo)}\n{foo: groupBy(list, foo.String())}\n{foo: groupBy(list, i)}\n{foo: groupBy(list, ok)}\n{foo: groupBy(list, true)}\n{foo: i != $env}?.String\n{foo: i != 0}\n{foo: i != 1.0}\n{foo: i != f64}\n{foo: i != f64}?.ok\n{foo: i != i, foo: greet(str)}\n{foo: i % 1}\n{foo: i * 0}\n{foo: i * 1.0}\n{foo: i * 1}\n{foo: i * f64}\n{foo: i * i}\n{foo: i ** 1, foo: ok}.f64\n{foo: i ** 1.0}\n{foo: i ** 1}\n{foo: i ** f64}\n{foo: i + 0}\n{foo: i + 1.0}\n{foo: i + 1}\n{foo: i + 1}?.i\n{foo: i + f64}\n{foo: i + i}\n{foo: i - 0}\n{foo: i - 1}\n{foo: i .. 0}\n{foo: i .. 1, foo: i}\n{foo: i .. 1}\n{foo: i .. i}\n{foo: i / 0}\n{foo: i / 1, foo: string(false)}\n{foo: i / 1.0}\n{foo: i < 0}\n{foo: i < 1.0}\n{foo: i < 1}\n{foo: i < f64}\n{foo: i < i}\n{foo: i <= 0}\n{foo: i <= 1.0}\n{foo: i <= f64}\n{foo: i <= i}\n{foo: i == $env}\n{foo: i == $env}?.Bar\n{foo: i == 1.0}\n{foo: i == nil}\n{foo: i > 0, foo: 1 >= f64}\n{foo: i >= 0}\n{foo: i >= 1.0}\n{foo: i >= 1}\n{foo: i >= f64}\n{foo: i >= f64}.str\n{foo: i ?? $env}\n{foo: i ?? 0}\n{foo: i ?? 1.0}\n{foo: i ?? array}\n{foo: i ?? foo}\n{foo: i ?? greet}\n{foo: i ?? str}\n{foo: i ^ 0}\n{foo: i ^ 1.0}\n{foo: i ^ 1}\n{foo: i ^ f64}\n{foo: i ^ i, foo: array}\n{foo: i ^ i}\n{foo: i not in array}\n{foo: i not in array}?.greet\n{foo: i | bitnand(1)}\n{foo: i | bitor(i)}\n{foo: i | bitushr(i)}\n{foo: i | bitxor(i)}\n{foo: i | median(i)}\n{foo: i, foo: $env != foo}\n{foo: i, foo: $env != ok}\n{foo: i, foo: $env, foo: nil}?.add\n{foo: i, foo: $env?.[Bar]}\n{foo: i, foo: $env}.add\n{foo: i, foo: $env}.foo\n{foo: i, foo: $env}.ok\n{foo: i, foo: $env}?.[str]\n{foo: i, foo: $env}?.list\n{foo: i, foo: 0 ?? f64}\n{foo: i, foo: 0}.String\n{foo: i, foo: 0}.greet\n{foo: i, foo: 0}?.Bar\n{foo: i, foo: 0}?.f64\n{foo: i, foo: 0}?.ok?.str\n{foo: i, foo: 1 - f64}\n{foo: i, foo: 1.0 < 0}\n{foo: i, foo: 1.0, foo: foo}?.[str]\n{foo: i, foo: 1.0, foo: foo}?.str\n{foo: i, foo: 1.0}.Bar\n{foo: i, foo: 1.0}.String\n{foo: i, foo: 1.0}.array\n{foo: i, foo: 1.0}.f64\n{foo: i, foo: 1.0}.f64?.ok\n{foo: i, foo: 1.0}.foobar?.ok\n{foo: i, foo: 1.0}.i\n{foo: i, foo: 1.0}.ok\n{foo: i, foo: 1.0}.str\n{foo: i, foo: 1.0}?.String\n{foo: i, foo: 1.0}?.add\n{foo: i, foo: 1.0}?.f64\n{foo: i, foo: 1.0}?.ok\n{foo: i, foo: 1.0}?.str\n{foo: i, foo: 1}.f64\n{foo: i, foo: 1}?.array\n{foo: i, foo: 1}?.list\n{foo: i, foo: 1}?.ok\n{foo: i, foo: add}\n{foo: i, foo: add}.i\n{foo: i, foo: add}.str\n{foo: i, foo: add}?.String\n{foo: i, foo: add}?.foo\n{foo: i, foo: add}?.i\n{foo: i, foo: add}?.str\n{foo: i, foo: array}\n{foo: i, foo: array}.f64\n{foo: i, foo: array}.greet\n{foo: i, foo: array}.i\n{foo: i, foo: array}.list\n{foo: i, foo: array}.str\n{foo: i, foo: f64}\n{foo: i, foo: f64}.f64\n{foo: i, foo: f64}.foo\n{foo: i, foo: f64}.foobar?.f64(foo)\n{foo: i, foo: f64}?.i\n{foo: i, foo: f64}?.list\n{foo: i, foo: f64}?.ok\n{foo: i, foo: false}.array\n{foo: i, foo: false}.f64?.array\n{foo: i, foo: false}.str\n{foo: i, foo: false}?.Bar\n{foo: i, foo: false}?.String\n{foo: i, foo: false}?.i\n{foo: i, foo: false}?.str\n{foo: i, foo: foo, foo: $env}.ok\n{foo: i, foo: foo?.String}\n{foo: i, foo: foo}\n{foo: i, foo: foo}.Bar\n{foo: i, foo: foo}.String\n{foo: i, foo: foo}.String?.array\n{foo: i, foo: foo}.array\n{foo: i, foo: foo}.f64\n{foo: i, foo: foo}.f64?.foo\n{foo: i, foo: foo}.greet\n{foo: i, foo: foo}.list\n{foo: i, foo: foo}?.String\n{foo: i, foo: foo}?.array\n{foo: i, foo: foo}?.greet\n{foo: i, foo: foo}?.i\n{foo: i, foo: foo}?.list\n{foo: i, foo: foo}?.list == foo\n{foo: i, foo: foo}?.ok\n{foo: i, foo: foo}?.str\n{foo: i, foo: greet(str)}\n{foo: i, foo: greet, foo: nil}?.Bar\n{foo: i, foo: greet}\n{foo: i, foo: greet}.Bar\n{foo: i, foo: greet}.foo\n{foo: i, foo: greet}.ok\n{foo: i, foo: greet}?.String\n{foo: i, foo: greet}?.f64\n{foo: i, foo: greet}?.list\n{foo: i, foo: greet}?.str\n{foo: i, foo: i >= 1}\n{foo: i, foo: i, foo: 0}?.ok\n{foo: i, foo: i}\n{foo: i, foo: i}.String\n{foo: i, foo: i}.f64\n{foo: i, foo: i}.foo\n{foo: i, foo: i}?.Bar\n{foo: i, foo: i}?.[str]\n{foo: i, foo: i}?.i\n{foo: i, foo: list | reduce(greet)}\n{foo: i, foo: list}\n{foo: i, foo: list}?.String\n{foo: i, foo: list}?.[str]\n{foo: i, foo: list}?.array\n{foo: i, foo: list}?.list\n{foo: i, foo: map(list, foo)}\n{foo: i, foo: nil, foo: true}.array\n{foo: i, foo: nil}.array\n{foo: i, foo: nil}.array?.f64\n{foo: i, foo: nil}.foo\n{foo: i, foo: nil}.list\n{foo: i, foo: nil}?.Bar\n{foo: i, foo: nil}?.[str]\n{foo: i, foo: nil}?.add\n{foo: i, foo: nil}?.foo\n{foo: i, foo: nil}?.list\n{foo: i, foo: ok, foo: 1.0}?.ok\n{foo: i, foo: ok, foo: ok}.greet?.list(array)\n{foo: i, foo: ok}\n{foo: i, foo: sortBy(array, #)}.i\n{foo: i, foo: str}\n{foo: i, foo: str}.array\n{foo: i, foo: str}.f64\n{foo: i, foo: str}.foo\n{foo: i, foo: str}.foobar?.i()\n{foo: i, foo: str}.i\n{foo: i, foo: str}?.Bar\n{foo: i, foo: str}?.add\n{foo: i, foo: str}?.add?.[str]\n{foo: i, foo: str}?.f64\n{foo: i, foo: str}?.greet\n{foo: i, foo: str}?.list\n{foo: i, foo: true, foo: add}.str\n{foo: i, foo: true, foo: foo}.Bar\n{foo: i, foo: true}.foo\n{foo: i, foo: true}?.f64\n{foo: i, foo: true}?.list\n{foo: i, foo: true}?.ok\n{foo: i, foo: true}?.str\n{foo: i, foo: {foo: add, foo: true}}\n{foo: i, foo: {foo: str}}\n{foo: i, foo: {foo: true}}?.foo\n{foo: i..i}\n{foo: if false { 1 } else { 1.0 }}\n{foo: if false { foo } else { $env }}\n{foo: if false { str } else { array }}\n{foo: if false { true } else { greet }}\n{foo: if ok { 1 } else { foo }}\n{foo: if true { $env } else { array }}\n{foo: if true { 0 } else { 1.0 }}\n{foo: if true { 1.0 } else { foo }}\n{foo: if true { f64 } else { add }}\n{foo: if true { foo } else { greet }}\n{foo: if true { ok } else { foo }}\n{foo: int(0)}\n{foo: int(1)}\n{foo: int(1.0)}\n{foo: int(f64)}\n{foo: int(f64)}?.foobar?.list()\n{foo: int(i)}\n{foo: i}\n{foo: i} ?? add\n{foo: i} not in [nil]\n{foo: i}.$env?.Bar(Bar)\n{foo: i}.Bar\n{foo: i}.Bar?.list\n{foo: i}.String\n{foo: i}.String?.i\n{foo: i}.add\n{foo: i}.add?.[list]?.[greet]\n{foo: i}.add?.add\n{foo: i}.add?.list()\n{foo: i}.array\n{foo: i}.array?.Bar\n{foo: i}.array?.[str]\n{foo: i}.f64\n{foo: i}.f64?.[foo]\n{foo: i}.f64?.[list]\n{foo: i}.f64?.foo\n{foo: i}.foo\n{foo: i}.foo ?? 1\n{foo: i}.foobar\n{foo: i}.greet\n{foo: i}.greet?.add\n{foo: i}.greet?.greet\n{foo: i}.i\n{foo: i}.i?.ok()\n{foo: i}.list\n{foo: i}.list?.greet()\n{foo: i}.nil?.array\n{foo: i}.not\n{foo: i}.ok\n{foo: i}.ok?.f64\n{foo: i}.str\n{foo: i}.str?.[nil]\n{foo: i}?.Bar\n{foo: i}?.Bar?.String\n{foo: i}?.String\n{foo: i}?.String?.[str]\n{foo: i}?.[str]\n{foo: i}?.[str]?.[add]\n{foo: i}?.add\n{foo: i}?.add?.String()\n{foo: i}?.array\n{foo: i}?.array?.[foo]\n{foo: i}?.array?.greet\n{foo: i}?.f64\n{foo: i}?.f64?.greet\n{foo: i}?.foo\n{foo: i}?.foo == add\n{foo: i}?.foobar\n{foo: i}?.greet\n{foo: i}?.greet?.[greet]\n{foo: i}?.greet?.ok\n{foo: i}?.i\n{foo: i}?.i?.f64\n{foo: i}?.list\n{foo: i}?.list?.ok\n{foo: i}?.nil not contains $env\n{foo: i}?.ok\n{foo: i}?.ok?.array\n{foo: i}?.str\n{foo: i}?.str?.str\n{foo: keys($env), foo: list}\n{foo: keys($env)}\n{foo: keys($env)}?.i\n{foo: keys($env)}?.list\n{foo: keys($env)}?.ok\n{foo: last($env)?.String}\n{foo: last($env)}\n{foo: last(array)}\n{foo: last(list), foo: ok}\n{foo: last(list)}\n{foo: len($env)}\n{foo: len($env)}.foo\n{foo: len(array)}\n{foo: len(list)}\n{foo: len({foo: true})}\n{foo: let foobar = false; foobar}\n{foo: let foobar = str; foobar}\n{foo: let tmp = ok; tmp}\n{foo: list != $env}\n{foo: list != array}\n{foo: list != list}\n{foo: list != nil}\n{foo: list == $env?.[str]}\n{foo: list == $env}\n{foo: list == list}\n{foo: list == list}.array\n{foo: list == nil}\n{foo: list ?? $env}\n{foo: list ?? 0}\n{foo: list ?? 1.0}\n{foo: list ?? f64}\n{foo: list ?? foo}\n{foo: list ?? greet}\n{foo: list ?? list}\n{foo: list ?? nil}\n{foo: list ?? str}\n{foo: list | all(ok)}\n{foo: list | all(true)}\n{foo: list | count(false)}\n{foo: list | findIndex(false)}\n{foo: list | findIndex(true)}.add\n{foo: list | groupBy(#)}\n{foo: list | groupBy(1.0)}\n{foo: list | groupBy(foo)}\n{foo: list | groupBy(ok)}\n{foo: list | groupBy(str)}\n{foo: list | map(#)}\n{foo: list | map(1.0)}\n{foo: list | map(i)}\n{foo: list | one(false)}\n{foo: list | reduce(#)}\n{foo: list | reduce(#.Bar, nil)}\n{foo: list | reduce(#.String, nil)}\n{foo: list | reduce($env)}\n{foo: list | reduce(0)}\n{foo: list | reduce(f64)}\n{foo: list | reduce(false)}\n{foo: list | reduce(foo)}\n{foo: list | reduce(ok)}\n{foo: list | reduce(str)}\n{foo: list | sortBy(.Bar)}\n{foo: list | sortBy(0)}\n{foo: list | sortBy(1), foo: str}.foo\n{foo: list | sortBy(1.0)}\n{foo: list | sortBy(i)}\n{foo: list | sum(1.0)}\n{foo: list, foo: $env ?? list}\n{foo: list, foo: $env.f64}\n{foo: list, foo: $env.ok}\n{foo: list, foo: $env?.array}\n{foo: list, foo: $env?.f64}\n{foo: list, foo: $env}.String\n{foo: list, foo: $env}.add\n{foo: list, foo: $env}.foo\n{foo: list, foo: $env}.i\n{foo: list, foo: $env}.list\n{foo: list, foo: $env}.ok\n{foo: list, foo: $env}.str\n{foo: list, foo: $env}?.Bar\n{foo: list, foo: $env}?.add\n{foo: list, foo: $env}?.ok\n{foo: list, foo: $env}?.str\n{foo: list, foo: 0, foo: 0}?.add\n{foo: list, foo: 0, foo: nil}.add\n{foo: list, foo: 0}.list\n{foo: list, foo: 0}?.Bar\n{foo: list, foo: 0}?.list\n{foo: list, foo: 1, foo: false}?.list\n{foo: list, foo: 1.0 == 1.0}\n{foo: list, foo: 1.0, foo: true}?.i\n{foo: list, foo: 1.0}.f64\n{foo: list, foo: 1.0}.foo\n{foo: list, foo: 1.0}.list\n{foo: list, foo: 1.0}?.String\n{foo: list, foo: 1.0}?.[str]\n{foo: list, foo: 1.0}?.add\n{foo: list, foo: 1.0}?.greet\n{foo: list, foo: 1.0}?.i\n{foo: list, foo: 1.0}?.ok\n{foo: list, foo: 1}.list\n{foo: list, foo: 1}?.String\n{foo: list, foo: 1}?.foo\n{foo: list, foo: 1}?.greet\n{foo: list, foo: 1}?.i\n{foo: list, foo: 1}?.list\n{foo: list, foo: add}\n{foo: list, foo: add}.array\n{foo: list, foo: add}.f64\n{foo: list, foo: add}.greet\n{foo: list, foo: add}.i\n{foo: list, foo: add}?.[str]\n{foo: list, foo: add}?.array\n{foo: list, foo: add}?.f64\n{foo: list, foo: array}\n{foo: list, foo: array}.f64\n{foo: list, foo: array}.greet\n{foo: list, foo: array}.i\n{foo: list, foo: array}.ok\n{foo: list, foo: array}.str\n{foo: list, foo: array}?.array\n{foo: list, foo: array}?.f64\n{foo: list, foo: array}?.ok\n{foo: list, foo: f64 - f64}\n{foo: list, foo: f64}\n{foo: list, foo: f64}.foo\n{foo: list, foo: f64}.greet\n{foo: list, foo: f64}?.Bar\n{foo: list, foo: false || $env}\n{foo: list, foo: false}.f64\n{foo: list, foo: false}.foobar\n{foo: list, foo: false}?.[str]\n{foo: list, foo: false}?.add\n{foo: list, foo: false}?.f64\n{foo: list, foo: false}?.foo\n{foo: list, foo: false}?.greet\n{foo: list, foo: false}?.i\n{foo: list, foo: false}?.ok\n{foo: list, foo: foo, foo: list}.Bar\n{foo: list, foo: foo, foo: true}.String\n{foo: list, foo: foo?.String()}\n{foo: list, foo: foo}\n{foo: list, foo: foo}.add\n{foo: list, foo: foo}.array\n{foo: list, foo: foo}.f64\n{foo: list, foo: foo}.i\n{foo: list, foo: foo}.ok\n{foo: list, foo: foo}?.Bar\n{foo: list, foo: foo}?.[str]\n{foo: list, foo: foo}?.add\n{foo: list, foo: foo}?.foo\n{foo: list, foo: foo}?.foobar?.[str]\n{foo: list, foo: greet}\n{foo: list, foo: greet}.list\n{foo: list, foo: greet}.str\n{foo: list, foo: greet}?.greet\n{foo: list, foo: i, foo: 1.0}?.list\n{foo: list, foo: i}\n{foo: list, foo: i}.array\n{foo: list, foo: i}?.String?.add()\n{foo: list, foo: i}?.foo\n{foo: list, foo: i}?.list\n{foo: list, foo: list, foo: i}.foobar?.array\n{foo: list, foo: list}\n{foo: list, foo: list}.Bar\n{foo: list, foo: list}.String\n{foo: list, foo: list}.foo\n{foo: list, foo: list}.list\n{foo: list, foo: list}?.String\n{foo: list, foo: list}?.foo\n{foo: list, foo: list}?.greet\n{foo: list, foo: list}?.list\n{foo: list, foo: list}?.ok\n{foo: list, foo: max(0)}\n{foo: list, foo: median(array)}\n{foo: list, foo: nil} ?? f64\n{foo: list, foo: nil}.String\n{foo: list, foo: nil}.add\n{foo: list, foo: nil}.foo\n{foo: list, foo: nil}.greet\n{foo: list, foo: nil}.list\n{foo: list, foo: nil}.str?.list\n{foo: list, foo: nil}?.String\n{foo: list, foo: nil}?.[str]\n{foo: list, foo: nil}?.i\n{foo: list, foo: nil}?.str\n{foo: list, foo: ok}\n{foo: list, foo: ok}.add\n{foo: list, foo: ok}.ok\n{foo: list, foo: ok}?.Bar\n{foo: list, foo: ok}?.[str]\n{foo: list, foo: ok}?.array\n{foo: list, foo: ok}?.foo\n{foo: list, foo: ok}?.i\n{foo: list, foo: str, foo: abs(f64)}\n{foo: list, foo: str}\n{foo: list, foo: str}.String\n{foo: list, foo: str}.array\n{foo: list, foo: str}.list\n{foo: list, foo: str}?.String\n{foo: list, foo: str}?.i\n{foo: list, foo: str}?.list\n{foo: list, foo: str}?.ok\n{foo: list, foo: sum(array)}\n{foo: list, foo: true, foo: add}?.ok\n{foo: list, foo: true, foo: foo}.list\n{foo: list, foo: true}.ok\n{foo: list, foo: true}?.array\n{foo: list?.[0]}\n{foo: list?.[1]}?.add\n{foo: list?.[i], foo: list}\n{foo: list?.[i], foo: ok}\n{foo: list?.[i]}\n{foo: list?.[i]}.greet?.[array]\n{foo: list?.[i]}.ok\n{foo: list[0:]}\n{foo: list[:0]}\n{foo: list[i:]}\n{foo: list}\n{foo: list} ?? reduce($env, 1.0, 1)\n{foo: list}.Bar\n{foo: list}.String\n{foo: list}.add\n{foo: list}.add?.str\n{foo: list}.array\n{foo: list}.array?.f64\n{foo: list}.f64\n{foo: list}.f64?.greet().list()\n{foo: list}.foo\n{foo: list}.foobar\n{foo: list}.foobar != true\n{foo: list}.greet\n{foo: list}.greet?.[str]\n{foo: list}.i\n{foo: list}.i?.[array]\n{foo: list}.i?.[foo]\n{foo: list}.list\n{foo: list}.list?.[f64]\n{foo: list}.list?.[greet]\n{foo: list}.ok\n{foo: list}.ok?.Bar\n{foo: list}.ok?.[f64]\n{foo: list}.str\n{foo: list}?.Bar\n{foo: list}?.Bar?.[foo]\n{foo: list}?.Bar?.[greet]\n{foo: list}?.Bar?.[list]\n{foo: list}?.Bar?.add\n{foo: list}?.String\n{foo: list}?.String?.[array]\n{foo: list}?.String?.list()\n{foo: list}?.[str]\n{foo: list}?.[str]?.[i]\n{foo: list}?.[str]?.list\n{foo: list}?.add\n{foo: list}?.array\n{foo: list}?.f64\n{foo: list}?.f64?.array\n{foo: list}?.f64?.greet\n{foo: list}?.f64?.ok\n{foo: list}?.foo\n{foo: list}?.foobar\n{foo: list}?.greet\n{foo: list}?.greet?.list\n{foo: list}?.i\n{foo: list}?.i?.[greet]\n{foo: list}?.i?.[i]\n{foo: list}?.i?.array\n{foo: list}?.list\n{foo: list}?.ok\n{foo: list}?.ok?.[ok]\n{foo: list}?.str\n{foo: list}?.str?.[list]\n{foo: list}?.str?.[str]\n{foo: lower(str)}\n{foo: lower(str)}?.[str]\n{foo: map($env, $env)}\n{foo: map($env, 0)}\n{foo: map($env, 1)}\n{foo: map($env, 1.0), foo: i}\n{foo: map($env, 1.0)}\n{foo: map($env, array)}\n{foo: map($env, f64)}\n{foo: map($env, foo)}\n{foo: map($env, greet)}\n{foo: map($env, i)}\n{foo: map($env, i)}?.add\n{foo: map($env, list)}\n{foo: map($env, ok)}\n{foo: map($env, str)}\n{foo: map(array, #)}\n{foo: map(array, $env)}\n{foo: map(array, 1)}\n{foo: map(array, array)}\n{foo: map(array, foo)}\n{foo: map(list, #)}\n{foo: map(list, #.Bar)}\n{foo: map(list, $env)}\n{foo: map(list, .String)}\n{foo: map(list, add)}\n{foo: map(list, foo)}\n{foo: map(list, greet)}\n{foo: map(list, ok)}\n{foo: max($env), foo: array}\n{foo: max($env)}\n{foo: max($env)}.i\n{foo: max(0)}\n{foo: max(1)}\n{foo: max(1.0)}\n{foo: max(1.0, 1.0)}\n{foo: max(array)}\n{foo: max(f64)}\n{foo: max(f64)}?.str\n{foo: max(i)}\n{foo: mean(0)}\n{foo: mean(1)}\n{foo: mean(1, 0)}\n{foo: mean(1.0 * 1.0)}\n{foo: mean(1.0), foo: array}\n{foo: mean(1.0)}\n{foo: mean(1.0)}.ok\n{foo: mean(array)}\n{foo: mean(array, array)}\n{foo: mean(array, i)}\n{foo: mean(f64)}\n{foo: mean(i)}\n{foo: mean(i, 1)}\n{foo: median(0)}\n{foo: median(0)}?.ok\n{foo: median(1)}\n{foo: median(1.0)}\n{foo: median(array)}\n{foo: median(array, 1.0)}\n{foo: median(f64), foo: i}\n{foo: median(f64)}\n{foo: median(f64, i)}.i\n{foo: median(flatten(array))}\n{foo: median(i)}\n{foo: median(i, array)}.Bar\n{foo: min($env)?.String}\n{foo: min($env)}\n{foo: min(0)}\n{foo: min(1), foo: ok}\n{foo: min(1)}\n{foo: min(1, 1.0)}\n{foo: min(1.0)}\n{foo: min(1.0)}?.String\n{foo: min(array)}\n{foo: min(f64)}\n{foo: min(i)}\n{foo: min(i)}.list\n{foo: nil != $env, foo: foo}\n{foo: nil != $env}\n{foo: nil != 0}\n{foo: nil != 1.0}\n{foo: nil != 1}\n{foo: nil != 1}.ok\n{foo: nil != add}\n{foo: nil != array}\n{foo: nil != f64}\n{foo: nil != false, foo: i}\n{foo: nil != false}\n{foo: nil != foo?.String()}\n{foo: nil != foo}\n{foo: nil != foo}.str\n{foo: nil != greet}\n{foo: nil != i, foo: list}\n{foo: nil != list}\n{foo: nil != nil, foo: list}\n{foo: nil != nil}\n{foo: nil != ok}\n{foo: nil != str}\n{foo: nil != true}\n{foo: nil == $env}\n{foo: nil == 0}\n{foo: nil == 1.0}\n{foo: nil == 1}\n{foo: nil == add}\n{foo: nil == array}\n{foo: nil == f64}\n{foo: nil == false}\n{foo: nil == foo}\n{foo: nil == greet}\n{foo: nil == list}?.Bar\n{foo: nil == nil}\n{foo: nil == ok}\n{foo: nil == true}\n{foo: nil ?? $env}\n{foo: nil ?? 0}\n{foo: nil ?? 1.0}\n{foo: nil ?? 1}\n{foo: nil ?? add}\n{foo: nil ?? array}\n{foo: nil ?? f64}\n{foo: nil ?? false, foo: i}\n{foo: nil ?? false}\n{foo: nil ?? foo}\n{foo: nil ?? greet}\n{foo: nil ?? i}\n{foo: nil ?? list, foo: f64}\n{foo: nil ?? nil, foo: f64}\n{foo: nil ?? nil}\n{foo: nil ?? ok}\n{foo: nil in $env}\n{foo: nil in array}\n{foo: nil in list}\n{foo: nil not in $env}\n{foo: nil not in array}\n{foo: nil not in list}\n{foo: nil, foo: $env}.Bar\n{foo: nil, foo: $env}.String\n{foo: nil, foo: $env}.add\n{foo: nil, foo: $env}.array\n{foo: nil, foo: $env}.f64\n{foo: nil, foo: $env}.foo\n{foo: nil, foo: $env}.foobar\n{foo: nil, foo: $env}.greet\n{foo: nil, foo: $env}.list\n{foo: nil, foo: $env}?.Bar\n{foo: nil, foo: $env}?.Bar?.[f64]\n{foo: nil, foo: $env}?.String\n{foo: nil, foo: $env}?.add\n{foo: nil, foo: $env}?.foo\n{foo: nil, foo: $env}?.i\n{foo: nil, foo: $env}?.list\n{foo: nil, foo: $env}?.str\n{foo: nil, foo: 0, foo: 0}.greet\n{foo: nil, foo: 0, foo: true}?.[str]\n{foo: nil, foo: 0}.Bar\n{foo: nil, foo: 0}.String\n{foo: nil, foo: 0}.f64\n{foo: nil, foo: 0}.list\n{foo: nil, foo: 0}.ok\n{foo: nil, foo: 0}?.Bar\n{foo: nil, foo: 0}?.String?.[f64]\n{foo: nil, foo: 0}?.add\n{foo: nil, foo: 0}?.array\n{foo: nil, foo: 0}?.f64\n{foo: nil, foo: 0}?.greet\n{foo: nil, foo: 0}?.ok\n{foo: nil, foo: 1, foo: false}?.String\n{foo: nil, foo: 1, foo: foo}.ok\n{foo: nil, foo: 1.0, foo: 1}.f64\n{foo: nil, foo: 1.0, foo: array}?.str\n{foo: nil, foo: 1.0}.Bar\n{foo: nil, foo: 1.0}.String\n{foo: nil, foo: 1.0}.add\n{foo: nil, foo: 1.0}.array\n{foo: nil, foo: 1.0}.foo\n{foo: nil, foo: 1.0}.greet\n{foo: nil, foo: 1.0}.i\n{foo: nil, foo: 1.0}.list\n{foo: nil, foo: 1.0}.nil?.[greet]\n{foo: nil, foo: 1.0}.str\n{foo: nil, foo: 1.0}?.String\n{foo: nil, foo: 1.0}?.[str]\n{foo: nil, foo: 1.0}?.array\n{foo: nil, foo: 1.0}?.f64\n{foo: nil, foo: 1.0}?.greet\n{foo: nil, foo: 1.0}?.i\n{foo: nil, foo: 1.0}?.list\n{foo: nil, foo: 1.0}?.ok\n{foo: nil, foo: 1.0}?.str\n{foo: nil, foo: 1}.Bar\n{foo: nil, foo: 1}.String\n{foo: nil, foo: 1}.add\n{foo: nil, foo: 1}.array\n{foo: nil, foo: 1}.f64\n{foo: nil, foo: 1}.i\n{foo: nil, foo: 1}.list\n{foo: nil, foo: 1}?.[str]\n{foo: nil, foo: 1}?.add\n{foo: nil, foo: 1}?.f64\n{foo: nil, foo: 1}?.foo\n{foo: nil, foo: add}.Bar\n{foo: nil, foo: add}.f64\n{foo: nil, foo: add}.i\n{foo: nil, foo: add}.list\n{foo: nil, foo: add}?.Bar\n{foo: nil, foo: add}?.String\n{foo: nil, foo: add}?.add\n{foo: nil, foo: add}?.foo\n{foo: nil, foo: add}?.i\n{foo: nil, foo: add}?.ok\n{foo: nil, foo: array, foo: add}?.add\n{foo: nil, foo: array}.foo\n{foo: nil, foo: array}.str\n{foo: nil, foo: array}?.[str]\n{foo: nil, foo: array}?.array\n{foo: nil, foo: array}?.array?.[foo]\n{foo: nil, foo: array}?.f64\n{foo: nil, foo: array}?.foobar\n{foo: nil, foo: array}?.greet\n{foo: nil, foo: array}?.i\n{foo: nil, foo: f64}.String\n{foo: nil, foo: f64}.add\n{foo: nil, foo: f64}.f64\n{foo: nil, foo: f64}.greet\n{foo: nil, foo: f64}?.Bar\n{foo: nil, foo: f64}?.array\n{foo: nil, foo: f64}?.greet\n{foo: nil, foo: f64}?.ok\n{foo: nil, foo: false}.Bar\n{foo: nil, foo: false}.f64\n{foo: nil, foo: false}.foo\n{foo: nil, foo: false}.list\n{foo: nil, foo: false}?.f64\n{foo: nil, foo: false}?.greet\n{foo: nil, foo: false}?.i\n{foo: nil, foo: false}?.list\n{foo: nil, foo: false}?.ok\n{foo: nil, foo: foo, foo: 1}.foo\n{foo: nil, foo: foo, foo: 1}.i\n{foo: nil, foo: foo, foo: false}?.array\n{foo: nil, foo: foo, foo: i}?.i\n{foo: nil, foo: foo, foo: list}.Bar\n{foo: nil, foo: foo, foo: true}.ok\n{foo: nil, foo: foo}.String\n{foo: nil, foo: foo}.add\n{foo: nil, foo: foo}.array\n{foo: nil, foo: foo}.foo\n{foo: nil, foo: foo}.greet\n{foo: nil, foo: foo}.i\n{foo: nil, foo: foo}.ok\n{foo: nil, foo: foo}.str\n{foo: nil, foo: foo}?.Bar\n{foo: nil, foo: foo}?.[str]\n{foo: nil, foo: foo}?.add\n{foo: nil, foo: foo}?.f64\n{foo: nil, foo: foo}?.foo\n{foo: nil, foo: foo}?.greet\n{foo: nil, foo: foo}?.i\n{foo: nil, foo: foo}?.list in list\n{foo: nil, foo: foo}?.ok\n{foo: nil, foo: foo}?.ok?.Bar()\n{foo: nil, foo: foo}?.str\n{foo: nil, foo: greet, foo: nil}.add\n{foo: nil, foo: greet}.String\n{foo: nil, foo: greet}.array\n{foo: nil, foo: greet}.i\n{foo: nil, foo: greet}.ok\n{foo: nil, foo: greet}?.f64\n{foo: nil, foo: greet}?.foo\n{foo: nil, foo: greet}?.greet\n{foo: nil, foo: greet}?.i\n{foo: nil, foo: greet}?.str\n{foo: nil, foo: i, foo: $env}.f64\n{foo: nil, foo: i, foo: foo}?.i\n{foo: nil, foo: i, foo: greet}?.String\n{foo: nil, foo: i}.f64\n{foo: nil, foo: i}.foo\n{foo: nil, foo: i}.greet\n{foo: nil, foo: i}.i\n{foo: nil, foo: i}.list\n{foo: nil, foo: i}.ok\n{foo: nil, foo: i}?.String\n{foo: nil, foo: i}?.array\n{foo: nil, foo: list, foo: add}.Bar\n{foo: nil, foo: list, foo: nil}.f64\n{foo: nil, foo: list}.Bar\n{foo: nil, foo: list}.f64\n{foo: nil, foo: list}.f64?.str\n{foo: nil, foo: list}.ok\n{foo: nil, foo: list}?.Bar\n{foo: nil, foo: list}?.f64\n{foo: nil, foo: list}?.foo\n{foo: nil, foo: list}?.i\n{foo: nil, foo: list}?.str\n{foo: nil, foo: nil, foo: 1.0}?.array\n{foo: nil, foo: nil, foo: greet}?.[str]\n{foo: nil, foo: nil, foo: i}?.String\n{foo: nil, foo: nil, foo: true}?.greet\n{foo: nil, foo: nil}.array\n{foo: nil, foo: nil}.foo\n{foo: nil, foo: nil}.greet\n{foo: nil, foo: nil}.i\n{foo: nil, foo: nil}.ok\n{foo: nil, foo: nil}.str\n{foo: nil, foo: nil}?.Bar\n{foo: nil, foo: nil}?.String\n{foo: nil, foo: nil}?.add\n{foo: nil, foo: nil}?.array\n{foo: nil, foo: nil}?.array?.array(foobar)\n{foo: nil, foo: nil}?.f64\n{foo: nil, foo: nil}?.foo\n{foo: nil, foo: nil}?.i\n{foo: nil, foo: nil}?.list\n{foo: nil, foo: nil}?.ok\n{foo: nil, foo: nil}?.str\n{foo: nil, foo: ok, foo: nil}.String\n{foo: nil, foo: ok}.Bar\n{foo: nil, foo: ok}.String\n{foo: nil, foo: ok}.add\n{foo: nil, foo: ok}.array\n{foo: nil, foo: ok}.f64\n{foo: nil, foo: ok}.foo\n{foo: nil, foo: ok}.i\n{foo: nil, foo: ok}?.Bar?.[add]\n{foo: nil, foo: ok}?.array\n{foo: nil, foo: ok}?.f64\n{foo: nil, foo: ok}?.foo\n{foo: nil, foo: ok}?.str?.[greet]\n{foo: nil, foo: str}.String\n{foo: nil, foo: str}.add\n{foo: nil, foo: str}.array\n{foo: nil, foo: str}.f64\n{foo: nil, foo: str}.foo\n{foo: nil, foo: str}.greet\n{foo: nil, foo: str}.i\n{foo: nil, foo: str}.ok\n{foo: nil, foo: str}.str\n{foo: nil, foo: str}?.add\n{foo: nil, foo: str}?.f64\n{foo: nil, foo: true, foo: str}.list\n{foo: nil, foo: true}.String\n{foo: nil, foo: true}.f64\n{foo: nil, foo: true}.ok\n{foo: nil, foo: true}.str\n{foo: nil, foo: true}?.String\n{foo: nil, foo: true}?.i\n{foo: nil, foo: true}?.ok\n{foo: nil} ?? array\n{foo: nil} ?? foo\n{foo: nil} ?? ok\n{foo: nil} not in $env?.[String]\n{foo: nil}.Bar\n{foo: nil}.Bar?.add?.list\n{foo: nil}.Bar?.f64\n{foo: nil}.String\n{foo: nil}.String?.[i]\n{foo: nil}.String?.array\n{foo: nil}.String?.greet\n{foo: nil}.add\n{foo: nil}.add?.[ok]\n{foo: nil}.add?.[str]\n{foo: nil}.array\n{foo: nil}.array?.[array]\n{foo: nil}.array?.[foo]\n{foo: nil}.array?.[i]\n{foo: nil}.array?.[ok]\n{foo: nil}.array?.[str]\n{foo: nil}.array?.str\n{foo: nil}.f64\n{foo: nil}.f64?.[list].ok\n{foo: nil}.f64?.f64\n{foo: nil}.f64?.i\n{foo: nil}.foo\n{foo: nil}.foo?.[list]\n{foo: nil}.foo?.ok\n{foo: nil}.foobar\n{foo: nil}.foobar?.i\n{foo: nil}.greet\n{foo: nil}.greet?.[add]\n{foo: nil}.greet?.[f64]\n{foo: nil}.greet?.[foo]\n{foo: nil}.greet?.greet(foo)\n{foo: nil}.i\n{foo: nil}.list\n{foo: nil}.list?.String\n{foo: nil}.list?.String()\n{foo: nil}.list?.list\n{foo: nil}.not\n{foo: nil}.ok\n{foo: nil}.ok?.String\n{foo: nil}.ok?.greet\n{foo: nil}.str\n{foo: nil}.str?.ok\n{foo: nil}?.$env?.str\n{foo: nil}?.Bar\n{foo: nil}?.Bar?.String\n{foo: nil}?.String\n{foo: nil}?.String?.add\n{foo: nil}?.String?.greet\n{foo: nil}?.[str]\n{foo: nil}?.[str]?.[list]\n{foo: nil}?.[str]?.[str]\n{foo: nil}?.[str]?.ok\n{foo: nil}?.add\n{foo: nil}?.add?.Bar\n{foo: nil}?.add?.add\n{foo: nil}?.array\n{foo: nil}?.array?.Bar\n{foo: nil}?.f64\n{foo: nil}?.f64?.[i]\n{foo: nil}?.foo\n{foo: nil}?.foo != f64\n{foo: nil}?.foo?.[f64]\n{foo: nil}?.foo?.[ok]\n{foo: nil}?.foo?.i\n{foo: nil}?.foo?.str\n{foo: nil}?.foobar\n{foo: nil}?.foobar or true\n{foo: nil}?.foobar?.add\n{foo: nil}?.greet\n{foo: nil}?.greet?.ok\n{foo: nil}?.i\n{foo: nil}?.i?.[greet]\n{foo: nil}?.i?.[str]\n{foo: nil}?.list\n{foo: nil}?.list?.[list]\n{foo: nil}?.list?.f64(foobar)\n{foo: nil}?.ok\n{foo: nil}?.ok?.[f64]\n{foo: nil}?.ok?.add\n{foo: nil}?.str\n{foo: nil}?.str?.f64()\n{foo: nil}?.str?.list\n{foo: nil}?.str?.ok\n{foo: none($env, false)}\n{foo: none($env, ok)}\n{foo: none($env, true)}\n{foo: none(list, ok)}\n{foo: none(list, true)}\n{foo: not false}\n{foo: not false}?.add\n{foo: not false}?.ok\n{foo: not ok && $env}\n{foo: not ok}\n{foo: not true, foo: add}\n{foo: not true, foo: array}\n{foo: not true, foo: str}\n{foo: not true}\n{foo: not true}.f64\n{foo: not true}?.str\n{foo: ok != $env}\n{foo: ok != false}\n{foo: ok != nil}\n{foo: ok != ok}\n{foo: ok != true}\n{foo: ok && $env}\n{foo: ok && false}\n{foo: ok && ok}\n{foo: ok == $env}\n{foo: ok == $env}.String\n{foo: ok == false}\n{foo: ok == nil}\n{foo: ok == ok}\n{foo: ok == true}\n{foo: ok == true}.f64\n{foo: ok ? 1.0 : 1}\n{foo: ok ? 1.0 : greet}\n{foo: ok ? add : f64}\n{foo: ok ? foo : 0}\n{foo: ok ? greet : add}\n{foo: ok ? greet : list}\n{foo: ok ? nil : foo}\n{foo: ok ?: array}\n{foo: ok ?: nil}\n{foo: ok ?? $env}\n{foo: ok ?? 0}\n{foo: ok ?? 1.0}\n{foo: ok ?? 1}\n{foo: ok ?? array}\n{foo: ok ?? false}\n{foo: ok ?? foo}\n{foo: ok ?? i}\n{foo: ok ?? list}\n{foo: ok ?? true, foo: $env.list}\n{foo: ok and $env}\n{foo: ok and true}\n{foo: ok or $env}\n{foo: ok or false}\n{foo: ok || $env}\n{foo: ok || ok}\n{foo: ok || true}\n{foo: ok, foo: $env, foo: foo}?.array\n{foo: ok, foo: $env.add}\n{foo: ok, foo: $env.str}\n{foo: ok, foo: $env?.array}\n{foo: ok, foo: $env?.i, foo: str}\n{foo: ok, foo: $env}.foo\n{foo: ok, foo: $env}.i\n{foo: ok, foo: $env}.ok\n{foo: ok, foo: $env}?.Bar\n{foo: ok, foo: $env}?.String\n{foo: ok, foo: $env}?.[str]\n{foo: ok, foo: $env}?.add\n{foo: ok, foo: $env}?.f64\n{foo: ok, foo: $env}?.str\n{foo: ok, foo: 0 > i}\n{foo: ok, foo: 0, foo: 1.0}.String\n{foo: ok, foo: 0, foo: array}?.String\n{foo: ok, foo: 0}.Bar\n{foo: ok, foo: 0}.String\n{foo: ok, foo: 0}.ok\n{foo: ok, foo: 0}?.list\n{foo: ok, foo: 0}?.ok\n{foo: ok, foo: 0}?.str\n{foo: ok, foo: 1, foo: nil}?.str\n{foo: ok, foo: 1.0 - i}\n{foo: ok, foo: 1.0}.Bar\n{foo: ok, foo: 1.0}.f64\n{foo: ok, foo: 1.0}.foo\n{foo: ok, foo: 1.0}.greet\n{foo: ok, foo: 1.0}.i\n{foo: ok, foo: 1.0}.list\n{foo: ok, foo: 1.0}.ok\n{foo: ok, foo: 1.0}.str\n{foo: ok, foo: 1.0}?.Bar\n{foo: ok, foo: 1.0}?.f64\n{foo: ok, foo: 1.0}?.foo\n{foo: ok, foo: 1.0}?.greet\n{foo: ok, foo: 1.0}?.i\n{foo: ok, foo: 1.0}?.ok\n{foo: ok, foo: 1}.array\n{foo: ok, foo: 1}.greet\n{foo: ok, foo: 1}?.[str]\n{foo: ok, foo: 1}?.add?.String\n{foo: ok, foo: 1}?.greet\n{foo: ok, foo: add ?? 1.0}\n{foo: ok, foo: add, foo: 1.0}?.greet\n{foo: ok, foo: add}\n{foo: ok, foo: add}.greet\n{foo: ok, foo: add}.i\n{foo: ok, foo: add}?.foo\n{foo: ok, foo: add}?.greet?.ok\n{foo: ok, foo: array | map(1.0)}\n{foo: ok, foo: array}\n{foo: ok, foo: array}.String\n{foo: ok, foo: array}.greet\n{foo: ok, foo: array}.str\n{foo: ok, foo: array}?.String\n{foo: ok, foo: array}?.String?.[f64]\n{foo: ok, foo: array}?.add\n{foo: ok, foo: array}?.f64\n{foo: ok, foo: array}?.foo\n{foo: ok, foo: array}?.list\n{foo: ok, foo: f64 <= i}\n{foo: ok, foo: f64, foo: $env}?.foo\n{foo: ok, foo: f64}\n{foo: ok, foo: f64}.foo\n{foo: ok, foo: f64}.greet\n{foo: ok, foo: f64}.i\n{foo: ok, foo: f64}?.Bar\n{foo: ok, foo: f64}?.array\n{foo: ok, foo: f64}?.f64\n{foo: ok, foo: f64}?.foo\n{foo: ok, foo: f64}?.greet\n{foo: ok, foo: f64}?.i\n{foo: ok, foo: false}?.String\n{foo: ok, foo: false}?.f64\n{foo: ok, foo: false}?.ok\n{foo: ok, foo: false}?.str\n{foo: ok, foo: foo?.Bar}\n{foo: ok, foo: foo}\n{foo: ok, foo: foo}.Bar\n{foo: ok, foo: foo}.add\n{foo: ok, foo: foo}.array\n{foo: ok, foo: foo}.f64\n{foo: ok, foo: foo}.foo\n{foo: ok, foo: foo}.greet\n{foo: ok, foo: foo}.i\n{foo: ok, foo: foo}.list\n{foo: ok, foo: foo}.ok\n{foo: ok, foo: foo}.str\n{foo: ok, foo: foo}?.Bar\n{foo: ok, foo: foo}?.array\n{foo: ok, foo: foo}?.f64\n{foo: ok, foo: foo}?.foo\n{foo: ok, foo: foo}?.list\n{foo: ok, foo: foo}?.ok\n{foo: ok, foo: foo}?.str\n{foo: ok, foo: greet}\n{foo: ok, foo: greet}.greet\n{foo: ok, foo: greet}.i\n{foo: ok, foo: greet}?.greet\n{foo: ok, foo: greet}?.list\n{foo: ok, foo: i <= f64}\n{foo: ok, foo: i, foo: true}.foo\n{foo: ok, foo: i}\n{foo: ok, foo: i}.Bar\n{foo: ok, foo: i}.list\n{foo: ok, foo: i}?.list\n{foo: ok, foo: list, foo: 0}.i\n{foo: ok, foo: list}\n{foo: ok, foo: list}.i\n{foo: ok, foo: list}.str\n{foo: ok, foo: list}?.array\n{foo: ok, foo: list}?.foo\n{foo: ok, foo: list}?.greet\n{foo: ok, foo: list}?.ok\n{foo: ok, foo: list}?.str\n{foo: ok, foo: mean(0)}\n{foo: ok, foo: nil == ok}\n{foo: ok, foo: nil, foo: $env}?.ok\n{foo: ok, foo: nil, foo: greet}.i\n{foo: ok, foo: nil, foo: greet}?.add\n{foo: ok, foo: nil} ?? i\n{foo: ok, foo: nil}.Bar\n{foo: ok, foo: nil}.String\n{foo: ok, foo: nil}.add\n{foo: ok, foo: nil}.array\n{foo: ok, foo: nil}.foo\n{foo: ok, foo: nil}.greet\n{foo: ok, foo: nil}.i\n{foo: ok, foo: nil}.list\n{foo: ok, foo: nil}?.foo\n{foo: ok, foo: nil}?.ok\n{foo: ok, foo: nil}?.str\n{foo: ok, foo: nil}?.str?.i()\n{foo: ok, foo: ok}\n{foo: ok, foo: ok}.f64\n{foo: ok, foo: ok}.i?.greet\n{foo: ok, foo: ok}?.list\n{foo: ok, foo: str}\n{foo: ok, foo: str}.f64\n{foo: ok, foo: str}.greet\n{foo: ok, foo: str}?.f64\n{foo: ok, foo: str}?.list\n{foo: ok, foo: true, foo: str}?.String\n{foo: ok, foo: true}.Bar\n{foo: ok, foo: true}.array\n{foo: ok, foo: true}.greet\n{foo: ok, foo: true}.true?.add\n{foo: ok, foo: true}?.Bar\n{foo: ok, foo: true}?.[str]\n{foo: ok, foo: true}?.add\n{foo: ok, foo: true}?.array?.greet\n{foo: ok, foo: true}?.f64\n{foo: ok, foo: true}?.list\n{foo: ok, foo: true}?.ok\n{foo: ok, foo: true}?.str\n{foo: ok}\n{foo: ok} ?? str\n{foo: ok}.Bar\n{foo: ok}.String\n{foo: ok}.add\n{foo: ok}.add?.greet()\n{foo: ok}.array\n{foo: ok}.array?.String\n{foo: ok}.f64\n{foo: ok}.f64?.[greet]\n{foo: ok}.foo\n{foo: ok}.foobar\n{foo: ok}.greet\n{foo: ok}.greet?.add\n{foo: ok}.i\n{foo: ok}.i?.[list]\n{foo: ok}.i?.[ok]\n{foo: ok}.list\n{foo: ok}.ok\n{foo: ok}.ok matches $env\n{foo: ok}.ok?.greet\n{foo: ok}.str\n{foo: ok}?.Bar\n{foo: ok}?.Bar?.[greet]\n{foo: ok}?.Bar?.[list]\n{foo: ok}?.Bar?.[str]\n{foo: ok}?.String\n{foo: ok}?.String?.[i]\n{foo: ok}?.String?.[str]\n{foo: ok}?.[str]\n{foo: ok}?.[str]?.[array]\n{foo: ok}?.add\n{foo: ok}?.add?.String?.ok\n{foo: ok}?.array\n{foo: ok}?.array?.i\n{foo: ok}?.array?.str\n{foo: ok}?.f64\n{foo: ok}?.foo\n{foo: ok}?.foo != foo\n{foo: ok}?.foobar\n{foo: ok}?.foobar?.ok(foo)\n{foo: ok}?.greet\n{foo: ok}?.i\n{foo: ok}?.i?.ok\n{foo: ok}?.list\n{foo: ok}?.nil?.greet\n{foo: ok}?.ok\n{foo: ok}?.str\n{foo: one($env, false)}\n{foo: one($env, true)}\n{foo: one(array, ok)}\n{foo: one(array, true)}\n{foo: one(list, false)}\n{foo: one(list, ok)}\n{foo: one(list, true)}\n{foo: reduce($env, #acc, foo)}\n{foo: reduce(array, #)}\n{foo: reduce(array, $env, $env)}\n{foo: reduce(array, 0)}\n{foo: reduce(array, add)}\n{foo: reduce(array, array)}\n{foo: reduce(array, f64)}\n{foo: reduce(array, list)}\n{foo: reduce(array, ok, $env)}\n{foo: reduce(array, str)}\n{foo: reduce(list, #)}\n{foo: reduce(list, #.Bar)}\n{foo: reduce(list, #.String)}\n{foo: reduce(list, $env)}\n{foo: reduce(list, 1.0)}\n{foo: reduce(list, add)}\n{foo: reduce(list, array)}.str\n{foo: reduce(list, f64)}\n{foo: reduce(list, false), foo: 1.0 * f64}\n{foo: reduce(list, false)}\n{foo: reduce(list, foo)}\n{foo: reduce(list, ok)}\n{foo: reduce(list, str)}\n{foo: reduce(map(array, $env), #.list | reduce(foo))}\n{foo: reverse(array)}\n{foo: reverse(list)}\n{foo: round(0)}\n{foo: round(0)}?.Bar\n{foo: round(1)}\n{foo: round(1.0), foo: str}\n{foo: round(1.0)}\n{foo: round(f64)}\n{foo: round(i)}\n{foo: round(i)}?.ok\n{foo: sort($env)}\n{foo: sort(array), foo: str}\n{foo: sort(array)}\n{foo: sortBy(array, #)}\n{foo: sortBy(array, 0)}\n{foo: sortBy(array, 1)}\n{foo: sortBy(array, 1.0)}\n{foo: sortBy(array, f64)}\n{foo: sortBy(list, #.Bar)}\n{foo: sortBy(list, 1.0)}\n{foo: sortBy(list, i)}\n{foo: sortBy(list, str)}\n{foo: str != $env?.[Bar]}\n{foo: str != $env}\n{foo: str < str}\n{foo: str == $env}\n{foo: str == nil}\n{foo: str == str}\n{foo: str >= str, foo: str}\n{foo: str ?? 0}\n{foo: str ?? 1.0}\n{foo: str ?? add}\n{foo: str ?? array}\n{foo: str ?? f64}\n{foo: str ?? false}\n{foo: str ?? foo}\n{foo: str ?? true}\n{foo: str contains str}\n{foo: str endsWith str}\n{foo: str in $env}\n{foo: str in foo}\n{foo: str matches str}\n{foo: str not contains str}\n{foo: str not endsWith str}\n{foo: str not in $env}\n{foo: str not in foo}\n{foo: str not matches str}\n{foo: str not startsWith str}\n{foo: str startsWith str}\n{foo: str, foo: $env != 0}\n{foo: str, foo: $env, foo: 0}?.add\n{foo: str, foo: $env, foo: nil}.str\n{foo: str, foo: $env.f64}\n{foo: str, foo: $env.greet}\n{foo: str, foo: $env?.add}\n{foo: str, foo: $env?.foobar}\n{foo: str, foo: $env}.foo\n{foo: str, foo: $env}.foobar?.list()\n{foo: str, foo: $env}.greet\n{foo: str, foo: $env}.list\n{foo: str, foo: $env}.str\n{foo: str, foo: $env}?.[str]\n{foo: str, foo: $env}?.f64\n{foo: str, foo: $env}?.foo\n{foo: str, foo: $env}?.str\n{foo: str, foo: 0, foo: f64}?.foo\n{foo: str, foo: 0, foo: nil}?.add\n{foo: str, foo: 0}.add\n{foo: str, foo: 0}.foobar\n{foo: str, foo: 0}.ok\n{foo: str, foo: 0}?.add\n{foo: str, foo: 0}?.array\n{foo: str, foo: 0}?.ok\n{foo: str, foo: 1.0, foo: greet}?.add\n{foo: str, foo: 1.0}.String\n{foo: str, foo: 1.0}.f64\n{foo: str, foo: 1.0}.foo\n{foo: str, foo: 1.0}.greet\n{foo: str, foo: 1.0}.i\n{foo: str, foo: 1.0}.list\n{foo: str, foo: 1.0}.ok\n{foo: str, foo: 1.0}.str\n{foo: str, foo: 1.0}?.[str]\n{foo: str, foo: 1.0}?.add\n{foo: str, foo: 1.0}?.foo\n{foo: str, foo: 1.0}?.ok\n{foo: str, foo: 1.0}?.str\n{foo: str, foo: 1}.Bar\n{foo: str, foo: 1}.foo\n{foo: str, foo: 1}.ok\n{foo: str, foo: 1}.str\n{foo: str, foo: 1}?.String\n{foo: str, foo: 1}?.add\n{foo: str, foo: 1}?.i\n{foo: str, foo: 1}?.list\n{foo: str, foo: [f64]}\n{foo: str, foo: add, foo: f64}?.ok\n{foo: str, foo: add, foo: str}?.f64\n{foo: str, foo: add}\n{foo: str, foo: add}.Bar\n{foo: str, foo: add}.String\n{foo: str, foo: add}.f64\n{foo: str, foo: add}.greet\n{foo: str, foo: add}.i\n{foo: str, foo: add}?.[str]\n{foo: str, foo: add}?.array\n{foo: str, foo: array}\n{foo: str, foo: array}.greet\n{foo: str, foo: array}.i\n{foo: str, foo: array}.list\n{foo: str, foo: array}.ok\n{foo: str, foo: array}?.String\n{foo: str, foo: array}?.add\n{foo: str, foo: array}?.foo\n{foo: str, foo: array}?.i\n{foo: str, foo: ceil(1.0)}\n{foo: str, foo: f64}\n{foo: str, foo: f64} ?? foo\n{foo: str, foo: f64}.add\n{foo: str, foo: f64}?.String\n{foo: str, foo: f64}?.add\n{foo: str, foo: f64}?.add?.[add]\n{foo: str, foo: f64}?.list\n{foo: str, foo: false}.array\n{foo: str, foo: false}.f64\n{foo: str, foo: false}.i\n{foo: str, foo: false}?.[str]\n{foo: str, foo: false}?.greet?.[add]\n{foo: str, foo: false}?.i\n{foo: str, foo: false}?.str\n{foo: str, foo: foo, foo: array}?.str\n{foo: str, foo: foo.String}\n{foo: str, foo: foo}\n{foo: str, foo: foo}.Bar\n{foo: str, foo: foo}.array\n{foo: str, foo: foo}.f64?.foo\n{foo: str, foo: foo}.greet\n{foo: str, foo: foo}.i\n{foo: str, foo: foo}.list\n{foo: str, foo: foo}.ok\n{foo: str, foo: foo}.str\n{foo: str, foo: foo}?.[str]?.String()\n{foo: str, foo: foo}?.add\n{foo: str, foo: foo}?.f64\n{foo: str, foo: foo}?.f64?.f64\n{foo: str, foo: foo}?.greet\n{foo: str, foo: greet(str)}\n{foo: str, foo: greet}\n{foo: str, foo: greet}.Bar\n{foo: str, foo: greet}.String\n{foo: str, foo: greet}.greet?.[greet]\n{foo: str, foo: greet}.ok\n{foo: str, foo: greet}?.add\n{foo: str, foo: greet}?.array\n{foo: str, foo: i}\n{foo: str, foo: i}.Bar\n{foo: str, foo: i}.add\n{foo: str, foo: i}.array\n{foo: str, foo: i}.foo\n{foo: str, foo: i}?.Bar\n{foo: str, foo: i}?.list\n{foo: str, foo: last($env)}\n{foo: str, foo: list}\n{foo: str, foo: list}.String\n{foo: str, foo: list}.add\n{foo: str, foo: list}.f64\n{foo: str, foo: list}.ok\n{foo: str, foo: list}?.add\n{foo: str, foo: list}?.foo\n{foo: str, foo: list}?.str\n{foo: str, foo: map($env, 0)}\n{foo: str, foo: median(1.0)}\n{foo: str, foo: nil, foo: i}?.array\n{foo: str, foo: nil}.add\n{foo: str, foo: nil}.i\n{foo: str, foo: nil}?.Bar\n{foo: str, foo: nil}?.i\n{foo: str, foo: nil}?.list\n{foo: str, foo: ok, foo: $env}.add\n{foo: str, foo: ok, foo: array}\n{foo: str, foo: ok}\n{foo: str, foo: ok}.f64\n{foo: str, foo: ok}.list\n{foo: str, foo: ok}?.Bar\n{foo: str, foo: ok}?.String\n{foo: str, foo: ok}?.[str]\n{foo: str, foo: ok}?.foobar != foo\n{foo: str, foo: ok}?.greet\n{foo: str, foo: str, foo: true}?.add\n{foo: str, foo: str}\n{foo: str, foo: str}.add\n{foo: str, foo: str}.f64\n{foo: str, foo: str}.foo\n{foo: str, foo: str}?.array\n{foo: str, foo: str}?.greet\n{foo: str, foo: str}?.list\n{foo: str, foo: toJSON(0)}\n{foo: str, foo: true}.Bar\n{foo: str, foo: true}.array\n{foo: str, foo: true}.ok?.String\n{foo: str, foo: true}?.Bar\n{foo: str, foo: true}?.array\n{foo: str, foo: true}?.foo\n{foo: str, foo: true}?.i\n{foo: str, foo: true}?.ok\n{foo: str[:1]}\n{foo: str[:i]}\n{foo: string($env), foo: list}\n{foo: string($env)}\n{foo: string(0)}\n{foo: string(1)}\n{foo: string(1.0), foo: add}\n{foo: string(1.0)}\n{foo: string(add)}\n{foo: string(array)}\n{foo: string(array)}.foo\n{foo: string(f64)}\n{foo: string(false), foo: add}\n{foo: string(foo)}\n{foo: string(greet), foo: array}\n{foo: string(greet)}\n{foo: string(greet)}.greet\n{foo: string(i)}\n{foo: string(list), foo: i}\n{foo: string(list)}\n{foo: string(nil)}\n{foo: string(ok)}\n{foo: string(str)}\n{foo: string(str)}.i\n{foo: string(true)}\n{foo: str}\n{foo: str} != $env?.[Bar]\n{foo: str} != nil || $env\n{foo: str} ?? $env.i\n{foo: str} ?? str\n{foo: str}.Bar\n{foo: str}.String\n{foo: str}.String?.[ok]\n{foo: str}.add\n{foo: str}.array\n{foo: str}.f64\n{foo: str}.f64?.[list]\n{foo: str}.f64?.[str]\n{foo: str}.foo\n{foo: str}.foobar?.Bar\n{foo: str}.greet\n{foo: str}.greet?.array\n{foo: str}.greet?.array?.i\n{foo: str}.i\n{foo: str}.list\n{foo: str}.list?.[add]\n{foo: str}.ok\n{foo: str}.ok?.array\n{foo: str}.ok?.str\n{foo: str}.str\n{foo: str}?.Bar\n{foo: str}?.Bar?.String\n{foo: str}?.Bar?.[str]\n{foo: str}?.String\n{foo: str}?.String?.[i]\n{foo: str}?.[str]\n{foo: str}?.[str]?.greet\n{foo: str}?.add\n{foo: str}?.add?.add\n{foo: str}?.array\n{foo: str}?.array?.[i]\n{foo: str}?.array?.ok\n{foo: str}?.f64\n{foo: str}?.f64?.[f64]\n{foo: str}?.foo\n{foo: str}?.foobar\n{foo: str}?.greet\n{foo: str}?.greet?.Bar\n{foo: str}?.greet?.greet\n{foo: str}?.greet?.i\n{foo: str}?.i\n{foo: str}?.i in array\n{foo: str}?.i?.[ok]\n{foo: str}?.list\n{foo: str}?.list?.[array]\n{foo: str}?.nil?.Bar(true)\n{foo: str}?.ok\n{foo: str}?.ok not endsWith $env\n{foo: str}?.ok?.[ok]\n{foo: str}?.str\n{foo: str}?.str?.f64\n{foo: sum($env, 1)}\n{foo: sum($env, 1.0)}\n{foo: sum($env, f64)}\n{foo: sum($env, i)}\n{foo: sum(array), foo: list}\n{foo: sum(array), foo: ok}\n{foo: sum(array)}\n{foo: sum(array)}.String\n{foo: sum(array)}.foo\n{foo: sum(array)}?.array\n{foo: sum(array, #)}\n{foo: sum(array, 1.0)}\n{foo: sum(list, 1)}\n{foo: sum(list, 1.0)}\n{foo: take(list, 1)}\n{foo: toBase64(str)}\n{foo: toJSON(0)}\n{foo: toJSON(1)}\n{foo: toJSON(1.0), foo: f64}\n{foo: toJSON(1.0)}\n{foo: toJSON(array)}\n{foo: toJSON(f64), foo: array}\n{foo: toJSON(f64)}\n{foo: toJSON(false)}\n{foo: toJSON(false)}.list\n{foo: toJSON(foo), foo: foo?.String}\n{foo: toJSON(foo)}\n{foo: toJSON(i), foo: add}\n{foo: toJSON(i)}\n{foo: toJSON(list)}\n{foo: toJSON(nil)}\n{foo: toJSON(ok)}\n{foo: toJSON(str)}\n{foo: toJSON(true)}\n{foo: toPairs($env), foo: list}\n{foo: toPairs($env)}\n{foo: trim(foo?.Bar)}\n{foo: trim(str)}\n{foo: trimPrefix(foo.Bar)}\n{foo: trimPrefix(str)}\n{foo: trimSuffix(str)}\n{foo: trimSuffix(string(nil))}\n{foo: true != $env}\n{foo: true != false}\n{foo: true != nil}\n{foo: true != ok}\n{foo: true && $env}\n{foo: true && true}\n{foo: true && true}.String\n{foo: true == $env}\n{foo: true == false}\n{foo: true == nil, foo: i}\n{foo: true == nil}\n{foo: true == true}\n{foo: true ? 1 : 1.0}\n{foo: true ? add : i}\n{foo: true ? false : greet}\n{foo: true ? list : 1}\n{foo: true ? ok : 0}\n{foo: true ?: foo}\n{foo: true ?? 0}\n{foo: true ?? 1}\n{foo: true ?? f64}\n{foo: true ?? foo}\n{foo: true ?? greet}\n{foo: true ?? nil}\n{foo: true ?? str}\n{foo: true and ok}\n{foo: true or $env}\n{foo: true or $env}?.[str]\n{foo: true or false}\n{foo: true or ok}\n{foo: true or true}\n{foo: true || $env}\n{foo: true || false}\n{foo: true || ok}\n{foo: true || true}\n{foo: true, foo: $env, foo: 1.0}?.greet\n{foo: true, foo: $env} ?? foo.Bar\n{foo: true, foo: $env}.array\n{foo: true, foo: $env}.f64\n{foo: true, foo: $env}.greet\n{foo: true, foo: $env}.i\n{foo: true, foo: $env}.list\n{foo: true, foo: $env}?.String\n{foo: true, foo: $env}?.[str]\n{foo: true, foo: $env}?.add\n{foo: true, foo: $env}?.array\n{foo: true, foo: $env}?.foo\n{foo: true, foo: $env}?.i\n{foo: true, foo: $env}?.list\n{foo: true, foo: $env}?.ok\n{foo: true, foo: 0} != array ?? ok\n{foo: true, foo: 0}.$env?.[i]?.f64?.[add]\n{foo: true, foo: 0}.foo\n{foo: true, foo: 0}.str\n{foo: true, foo: 0}?.array\n{foo: true, foo: 0}?.i\n{foo: true, foo: 1.0, foo: nil}.list\n{foo: true, foo: 1.0, foo: true}?.[str]\n{foo: true, foo: 1.0}.Bar\n{foo: true, foo: 1.0}.array\n{foo: true, foo: 1.0}.i\n{foo: true, foo: 1.0}.i?.[str].add\n{foo: true, foo: 1.0}.ok\n{foo: true, foo: 1.0}?.String\n{foo: true, foo: 1.0}?.f64\n{foo: true, foo: 1.0}?.i\n{foo: true, foo: 1.0}?.list\n{foo: true, foo: 1.0}?.ok\n{foo: true, foo: 1.0}?.str\n{foo: true, foo: 1}.Bar\n{foo: true, foo: 1}.array\n{foo: true, foo: 1}.foo\n{foo: true, foo: 1}.i\n{foo: true, foo: 1}?.[str]\n{foo: true, foo: 1}?.foo\n{foo: true, foo: 1}?.greet\n{foo: true, foo: 1}?.ok\n{foo: true, foo: 1}?.str\n{foo: true, foo: add}.add\n{foo: true, foo: add}.f64\n{foo: true, foo: add}.i\n{foo: true, foo: add}?.Bar\n{foo: true, foo: add}?.String\n{foo: true, foo: add}?.array\n{foo: true, foo: add}?.f64\n{foo: true, foo: add}?.greet\n{foo: true, foo: add}?.str\n{foo: true, foo: array}.add\n{foo: true, foo: array}.f64\n{foo: true, foo: array}.i\n{foo: true, foo: array}?.add\n{foo: true, foo: array}?.greet\n{foo: true, foo: f64}.greet\n{foo: true, foo: f64}.i\n{foo: true, foo: f64}.ok\n{foo: true, foo: f64}?.foo\n{foo: true, foo: false}.Bar\n{foo: true, foo: false}.i?.[ok]\n{foo: true, foo: false}?.foo\n{foo: true, foo: false}?.greet\n{foo: true, foo: false}?.i\n{foo: true, foo: foo}.Bar\n{foo: true, foo: foo}.String\n{foo: true, foo: foo}.array\n{foo: true, foo: foo}.f64\n{foo: true, foo: foo}.greet\n{foo: true, foo: foo}.i\n{foo: true, foo: foo}.ok\n{foo: true, foo: foo}.str?.list()\n{foo: true, foo: foo}?.Bar\n{foo: true, foo: foo}?.String\n{foo: true, foo: foo}?.[str]\n{foo: true, foo: foo}?.add\n{foo: true, foo: foo}?.f64\n{foo: true, foo: foo}?.greet\n{foo: true, foo: foo}?.list\n{foo: true, foo: foo}?.ok\n{foo: true, foo: foo}?.str\n{foo: true, foo: greet}.Bar\n{foo: true, foo: greet}.array\n{foo: true, foo: greet}.f64\n{foo: true, foo: greet}.foo\n{foo: true, foo: greet}?.[str]\n{foo: true, foo: greet}?.f64\n{foo: true, foo: greet}?.str\n{foo: true, foo: i}.String\n{foo: true, foo: i}.add\n{foo: true, foo: i}.i\n{foo: true, foo: i}.str\n{foo: true, foo: i}?.Bar\n{foo: true, foo: i}?.[str]?.add\n{foo: true, foo: i}?.array\n{foo: true, foo: i}?.list\n{foo: true, foo: list}.String\n{foo: true, foo: list}.String?.Bar\n{foo: true, foo: list}.array\n{foo: true, foo: list}?.Bar\n{foo: true, foo: list}?.[str]\n{foo: true, foo: list}?.f64\n{foo: true, foo: list}?.foo\n{foo: true, foo: list}?.greet\n{foo: true, foo: nil, foo: i}?.i?.i\n{foo: true, foo: nil, foo: list}?.[str]\n{foo: true, foo: nil}.add\n{foo: true, foo: nil}?.Bar\n{foo: true, foo: nil}?.String\n{foo: true, foo: nil}?.add\n{foo: true, foo: nil}?.greet\n{foo: true, foo: ok, foo: 1.0}?.greet\n{foo: true, foo: ok}.Bar\n{foo: true, foo: ok}.add\n{foo: true, foo: ok}.array\n{foo: true, foo: ok}.foo\n{foo: true, foo: ok}.list\n{foo: true, foo: ok}?.[str]\n{foo: true, foo: str}.Bar\n{foo: true, foo: str}.array\n{foo: true, foo: str}.f64\n{foo: true, foo: str}.greet\n{foo: true, foo: str}.list\n{foo: true, foo: str}.ok\n{foo: true, foo: str}.str\n{foo: true, foo: str}?.array\n{foo: true, foo: str}?.array?.add\n{foo: true, foo: str}?.f64\n{foo: true, foo: str}?.greet\n{foo: true, foo: str}?.ok\n{foo: true, foo: true, foo: greet}?.f64\n{foo: true, foo: true}.add\n{foo: true, foo: true}.foo\n{foo: true, foo: true}.i\n{foo: true, foo: true}.list\n{foo: true, foo: true}?.array\n{foo: true} not in $env?.String\n{foo: true}.Bar\n{foo: true}.Bar?.[add]\n{foo: true}.String\n{foo: true}.String?.[foo]\n{foo: true}.add\n{foo: true}.add?.i\n{foo: true}.array\n{foo: true}.f64\n{foo: true}.f64?.add\n{foo: true}.f64?.array.i()\n{foo: true}.false == add\n{foo: true}.foo\n{foo: true}.foo ? ok : nil\n{foo: true}.foobar\n{foo: true}.greet\n{foo: true}.i\n{foo: true}.i == i\n{foo: true}.list\n{foo: true}.list?.[str]\n{foo: true}.ok\n{foo: true}.ok?.add\n{foo: true}.ok?.array\n{foo: true}.str\n{foo: true}.str?.[list]\n{foo: true}.str?.ok\n{foo: true}?.$env ?? i\n{foo: true}?.Bar\n{foo: true}?.Bar?.[list]\n{foo: true}?.Bar?.f64\n{foo: true}?.Bar?.list\n{foo: true}?.String\n{foo: true}?.String?.[greet]\n{foo: true}?.String?.[ok]\n{foo: true}?.[str]\n{foo: true}?.[str]?.foo?.[greet]\n{foo: true}?.add\n{foo: true}?.add?.[add]\n{foo: true}?.add?.[foo]\n{foo: true}?.add?.ok\n{foo: true}?.array\n{foo: true}?.array?.[ok]\n{foo: true}?.f64\n{foo: true}?.f64?.[add]\n{foo: true}?.foo\n{foo: true}?.foobar?.i()\n{foo: true}?.greet\n{foo: true}?.greet?.[greet]\n{foo: true}?.greet?.foo\n{foo: true}?.greet?.greet\n{foo: true}?.i\n{foo: true}?.i?.Bar\n{foo: true}?.i?.[ok]\n{foo: true}?.i?.foo\n{foo: true}?.list\n{foo: true}?.list?.[greet]\n{foo: true}?.ok\n{foo: true}?.ok?.Bar\n{foo: true}?.ok?.[greet]?.list\n{foo: true}?.str\n{foo: true}?.str?.[f64]\n{foo: true}?.str?.greet\n{foo: true}?.str?.i\n{foo: type($env)}\n{foo: type(0)}\n{foo: type(1)}\n{foo: type(1.0)}\n{foo: type(1.0)}?.[str]\n{foo: type(1.0)}?.f64\n{foo: type(add)}\n{foo: type(array)}\n{foo: type(f64)}\n{foo: type(false)}\n{foo: type(foo), foo: add}\n{foo: type(foo), foo: f64}\n{foo: type(foo)}\n{foo: type(greet)}\n{foo: type(i)}\n{foo: type(list)}\n{foo: type(nil)}\n{foo: type(ok), foo: add}\n{foo: type(ok)}\n{foo: type(str)}\n{foo: type(true)}\n{foo: uniq(array)}\n{foo: uniq(list)}\n{foo: upper(str)}\n{foo: values($env)}\n{foo: values($env)}.String\n{foo: {foo: $env, foo: i}}\n{foo: {foo: $env}}\n{foo: {foo: $env}}?.i\n{foo: {foo: 0, foo: $env}}\n{foo: {foo: 0, foo: 1.0}}\n{foo: {foo: 0, foo: foo, foo: $env}}\n{foo: {foo: 0, foo: foo}}\n{foo: {foo: 0, foo: nil}}\n{foo: {foo: 0}}\n{foo: {foo: 0}}?.array\n{foo: {foo: 0}}?.f64\n{foo: {foo: 1, foo: 0}}\n{foo: {foo: 1.0, foo: 1.0, foo: foo}}\n{foo: {foo: 1.0, foo: true}}\n{foo: {foo: 1.0}}\n{foo: {foo: 1}}\n{foo: {foo: add, foo: $env}}\n{foo: {foo: add, foo: foo}}\n{foo: {foo: add, foo: greet}}\n{foo: {foo: add}}\n{foo: {foo: array, foo: 1.0}}\n{foo: {foo: array}}\n{foo: {foo: f64, foo: $env}}\n{foo: {foo: f64}}\n{foo: {foo: false, foo: $env}?.foo}\n{foo: {foo: false}}\n{foo: {foo: false}}.Bar\n{foo: {foo: foo, foo: 1.0}}\n{foo: {foo: foo, foo: foo}}\n{foo: {foo: foo}, foo: $env?.greet}\n{foo: {foo: foo}?.String}\n{foo: {foo: foo}?.ok}\n{foo: {foo: foo}?.str}\n{foo: {foo: foo}}\n{foo: {foo: foo}}?.i\n{foo: {foo: greet, foo: 0}}\n{foo: {foo: greet, foo: i}}\n{foo: {foo: greet}}\n{foo: {foo: i, foo: array}}\n{foo: {foo: i}}\n{foo: {foo: list?.[0]}}\n{foo: {foo: list}, foo: f64}\n{foo: {foo: list}.String}\n{foo: {foo: list}}\n{foo: {foo: list}}?.String\n{foo: {foo: nil, foo: $env}}\n{foo: {foo: nil, foo: 1}}\n{foo: {foo: nil, foo: foo}}\n{foo: {foo: nil}, foo: $env?.String}\n{foo: {foo: nil}}\n{foo: {foo: ok, foo: nil}}\n{foo: {foo: ok, foo: true}}\n{foo: {foo: ok}, foo: ok}\n{foo: {foo: ok}?.[str], foo: f64}\n{foo: {foo: ok}}\n{foo: {foo: ok}}.list\n{foo: {foo: ok}}?.i\n{foo: {foo: str}}\n{foo: {foo: true, foo: foo}}\n{foo: {foo: true}}\n"
  },
  {
    "path": "types/types.go",
    "content": "package types\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t. \"github.com/expr-lang/expr/checker/nature\"\n)\n\n// Type is a type that can be used to represent a value.\ntype Type interface {\n\tNature() Nature\n\tEqual(Type) bool\n\tString() string\n}\n\nvar (\n\tInt     = TypeOf(0)\n\tInt8    = TypeOf(int8(0))\n\tInt16   = TypeOf(int16(0))\n\tInt32   = TypeOf(int32(0))\n\tInt64   = TypeOf(int64(0))\n\tUint    = TypeOf(uint(0))\n\tUint8   = TypeOf(uint8(0))\n\tUint16  = TypeOf(uint16(0))\n\tUint32  = TypeOf(uint32(0))\n\tUint64  = TypeOf(uint64(0))\n\tFloat   = TypeOf(float32(0))\n\tFloat64 = TypeOf(float64(0))\n\tString  = TypeOf(\"\")\n\tBool    = TypeOf(true)\n\tNil     = nilType{}\n\tAny     = anyType{}\n)\n\nfunc TypeOf(v any) Type {\n\tif v == nil {\n\t\treturn Nil\n\t}\n\treturn rtype{t: reflect.TypeOf(v)}\n}\n\ntype anyType struct{}\n\nfunc (anyType) Nature() Nature {\n\treturn FromType(nil)\n}\n\nfunc (anyType) Equal(t Type) bool {\n\treturn true\n}\n\nfunc (anyType) String() string {\n\treturn \"any\"\n}\n\ntype nilType struct{}\n\nfunc (nilType) Nature() Nature {\n\treturn NatureOf(nil)\n}\n\nfunc (nilType) Equal(t Type) bool {\n\tif t == Any {\n\t\treturn true\n\t}\n\treturn t == Nil\n}\n\nfunc (nilType) String() string {\n\treturn \"nil\"\n}\n\ntype rtype struct {\n\tt reflect.Type\n}\n\nfunc (r rtype) Nature() Nature {\n\treturn FromType(r.t)\n}\n\nfunc (r rtype) Equal(t Type) bool {\n\tif t == Any {\n\t\treturn true\n\t}\n\tif rt, ok := t.(rtype); ok {\n\t\treturn r.t.String() == rt.t.String()\n\t}\n\treturn false\n}\n\nfunc (r rtype) String() string {\n\treturn r.t.String()\n}\n\n// Map represents a map[string]any type with defined keys.\ntype Map map[string]Type\n\nconst Extra = \"[[__extra_keys__]]\"\n\nfunc (m Map) Nature() Nature {\n\tnt := NatureOf(map[string]any{})\n\tif nt.TypeData == nil {\n\t\tnt.TypeData = new(TypeData)\n\t}\n\tnt.Fields = make(map[string]Nature, len(m))\n\tnt.Strict = true\n\tfor k, v := range m {\n\t\tif k == Extra {\n\t\t\tnt.Strict = false\n\t\t\tnatureOfDefaultValue := v.Nature()\n\t\t\tnt.DefaultMapValue = &natureOfDefaultValue\n\t\t\tcontinue\n\t\t}\n\t\tnt.Fields[k] = v.Nature()\n\t}\n\treturn nt\n}\n\nfunc (m Map) Equal(t Type) bool {\n\tif t == Any {\n\t\treturn true\n\t}\n\tmt, ok := t.(Map)\n\tif !ok {\n\t\treturn false\n\t}\n\tif len(m) != len(mt) {\n\t\treturn false\n\t}\n\tfor k, v := range m {\n\t\tif !v.Equal(mt[k]) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc (m Map) String() string {\n\tpairs := make([]string, 0, len(m))\n\tfor k, v := range m {\n\t\tpairs = append(pairs, fmt.Sprintf(\"%s: %s\", k, v.String()))\n\t}\n\treturn fmt.Sprintf(\"Map{%s}\", strings.Join(pairs, \", \"))\n}\n\n// Array returns a type that represents an array of the given type.\nfunc Array(of Type) Type {\n\treturn array{of}\n}\n\ntype array struct {\n\tof Type\n}\n\nfunc (a array) Nature() Nature {\n\tof := a.of.Nature()\n\tnt := NatureOf([]any{})\n\tif nt.TypeData == nil {\n\t\tnt.TypeData = new(TypeData)\n\t}\n\tnt.Fields = make(map[string]Nature, 1)\n\tnt.Ref = &of\n\treturn nt\n}\n\nfunc (a array) Equal(t Type) bool {\n\tif t == Any {\n\t\treturn true\n\t}\n\tat, ok := t.(array)\n\tif !ok {\n\t\treturn false\n\t}\n\tif a.of.Equal(at.of) {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (a array) String() string {\n\treturn fmt.Sprintf(\"Array{%s}\", a.of.String())\n}\n"
  },
  {
    "path": "types/types_test.go",
    "content": "package types_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\t. \"github.com/expr-lang/expr/types\"\n)\n\nfunc TestType_Equal(t *testing.T) {\n\ttests := []struct {\n\t\tindex string // Index added for IDEA to show green test marker per test.\n\t\ta, b  Type\n\t\twant  bool\n\t}{\n\t\t{\"1\", Int, Int, true},\n\t\t{\"2\", Int, Int8, false},\n\t\t{\"3\", Int, Uint, false},\n\t\t{\"4\", Int, Float, false},\n\t\t{\"5\", Int, String, false},\n\t\t{\"6\", Int, Bool, false},\n\t\t{\"7\", Int, Nil, false},\n\t\t{\"8\", Int, Array(Int), false},\n\t\t{\"9\", Int, Map{\"foo\": Int}, false},\n\t\t{\"11\", Int, Array(Int), false},\n\t\t{\"12\", Array(Int), Array(Int), true},\n\t\t{\"13\", Array(Int), Array(Float), false},\n\t\t{\"14\", Map{\"foo\": Int}, Map{\"foo\": Int}, true},\n\t\t{\"15\", Map{\"foo\": Int}, Map{\"foo\": Float}, false},\n\t\t{\"19\", Map{\"foo\": Map{\"bar\": Int}}, Map{\"foo\": Map{\"bar\": Int}}, true},\n\t\t{\"20\", Map{\"foo\": Map{\"bar\": Int}}, Map{\"foo\": Map{\"bar\": Float}}, false},\n\t\t{\"21\", Any, Any, true},\n\t\t{\"22\", Any, Int, true},\n\t\t{\"23\", Int, Any, true},\n\t\t{\"24\", Any, Map{\"foo\": Int}, true},\n\t\t{\"25\", Map{\"foo\": Int}, Any, true},\n\t\t{\"28\", Any, Array(Int), true},\n\t\t{\"29\", Array(Int), Any, true},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.index, func(t *testing.T) {\n\t\t\tif tt.want {\n\t\t\t\trequire.True(t, tt.a.Equal(tt.b), tt.a.String()+\" == \"+tt.b.String())\n\t\t\t} else {\n\t\t\t\trequire.False(t, tt.a.Equal(tt.b), tt.a.String()+\" == \"+tt.b.String())\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "vm/debug.go",
    "content": "//go:build expr_debug\n// +build expr_debug\n\npackage vm\n\nconst debug = true\n"
  },
  {
    "path": "vm/debug_off.go",
    "content": "//go:build !expr_debug\n// +build !expr_debug\n\npackage vm\n\nconst debug = false\n"
  },
  {
    "path": "vm/debug_test.go",
    "content": "//go:build expr_debug\n// +build expr_debug\n\npackage vm_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr/compiler\"\n\t\"github.com/expr-lang/expr/parser\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\nfunc TestDebugger(t *testing.T) {\n\tinput := `[1, 2]`\n\n\tnode, err := parser.Parse(input)\n\trequire.NoError(t, err)\n\n\tprogram, err := compiler.Compile(node, nil)\n\trequire.NoError(t, err)\n\n\tdebug := vm.Debug()\n\tgo func() {\n\t\tdebug.Step()\n\t\tdebug.Step()\n\t\tdebug.Step()\n\t\tdebug.Step()\n\t}()\n\tgo func() {\n\t\tfor range debug.Position() {\n\t\t}\n\t}()\n\n\t_, err = debug.Run(program, nil)\n\trequire.NoError(t, err)\n\trequire.Len(t, debug.Stack, 0)\n\trequire.Nil(t, debug.Scopes)\n}\n"
  },
  {
    "path": "vm/func_types/main.go",
    "content": "package main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/format\"\n\t\"reflect\"\n\t\"strings\"\n\t\"text/template\"\n\t. \"time\"\n)\n\n// Keep sorted.\nvar types = []any{\n\tnil,\n\tnew(func() Duration),\n\tnew(func() Month),\n\tnew(func() Time),\n\tnew(func() Weekday),\n\tnew(func() []any),\n\tnew(func() []byte),\n\tnew(func() any),\n\tnew(func() bool),\n\tnew(func() byte),\n\tnew(func() float32),\n\tnew(func() float64),\n\tnew(func() int),\n\tnew(func() int16),\n\tnew(func() int32),\n\tnew(func() int64),\n\tnew(func() int8),\n\tnew(func() map[string]any),\n\tnew(func() rune),\n\tnew(func() string),\n\tnew(func() uint),\n\tnew(func() uint16),\n\tnew(func() uint32),\n\tnew(func() uint64),\n\tnew(func() uint8),\n\tnew(func(Duration) Duration),\n\tnew(func(Duration) Time),\n\tnew(func(Time) Duration),\n\tnew(func(Time) bool),\n\tnew(func([]any) []any),\n\tnew(func([]any) any),\n\tnew(func([]any) map[string]any),\n\tnew(func([]any, string) string),\n\tnew(func([]byte) string),\n\tnew(func([]string, string) string),\n\tnew(func(any) []any),\n\tnew(func(any) any),\n\tnew(func(any) bool),\n\tnew(func(any) float64),\n\tnew(func(any) int),\n\tnew(func(any) map[string]any),\n\tnew(func(any) string),\n\tnew(func(any, any) []any),\n\tnew(func(any, any) any),\n\tnew(func(any, any) bool),\n\tnew(func(any, any) string),\n\tnew(func(bool) bool),\n\tnew(func(bool) float64),\n\tnew(func(bool) int),\n\tnew(func(bool) string),\n\tnew(func(bool, bool) bool),\n\tnew(func(float32) float64),\n\tnew(func(float64) bool),\n\tnew(func(float64) float32),\n\tnew(func(float64) float64),\n\tnew(func(float64) int),\n\tnew(func(float64) string),\n\tnew(func(float64, float64) bool),\n\tnew(func(int) bool),\n\tnew(func(int) float64),\n\tnew(func(int) int),\n\tnew(func(int) string),\n\tnew(func(int, int) bool),\n\tnew(func(int, int) int),\n\tnew(func(int, int) string),\n\tnew(func(int16) int32),\n\tnew(func(int32) float64),\n\tnew(func(int32) int),\n\tnew(func(int32) int64),\n\tnew(func(int64) Time),\n\tnew(func(int8) int),\n\tnew(func(int8) int16),\n\tnew(func(string) []byte),\n\tnew(func(string) []string),\n\tnew(func(string) bool),\n\tnew(func(string) float64),\n\tnew(func(string) int),\n\tnew(func(string) string),\n\tnew(func(string, byte) int),\n\tnew(func(string, int) int),\n\tnew(func(string, rune) int),\n\tnew(func(string, string) bool),\n\tnew(func(string, string) string),\n\tnew(func(uint) float64),\n\tnew(func(uint) int),\n\tnew(func(uint) uint),\n\tnew(func(uint16) uint),\n\tnew(func(uint32) uint64),\n\tnew(func(uint64) float64),\n\tnew(func(uint64) int64),\n\tnew(func(uint8) byte),\n}\n\nfunc main() {\n\tdata := struct {\n\t\tIndex string\n\t\tCode  string\n\t}{}\n\n\tfor i, t := range types {\n\t\tif i == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tfn := reflect.ValueOf(t).Elem().Type()\n\t\tdata.Index += fmt.Sprintf(\"%v: new(%v),\\n\", i, fn)\n\t\tdata.Code += fmt.Sprintf(\"case %d:\\n\", i)\n\t\targs := make([]string, fn.NumIn())\n\t\tfor j := fn.NumIn() - 1; j >= 0; j-- {\n\t\t\tcast := fmt.Sprintf(\".(%v)\", fn.In(j))\n\t\t\tif fn.In(j).Kind() == reflect.Interface {\n\t\t\t\tcast = \"\"\n\t\t\t}\n\t\t\tdata.Code += fmt.Sprintf(\"arg%v := vm.pop()%v\\n\", j+1, cast)\n\t\t\targs[j] = fmt.Sprintf(\"arg%v\", j+1)\n\t\t}\n\t\tdata.Code += fmt.Sprintf(\"return fn.(%v)(%v)\\n\", fn, strings.Join(args, \", \"))\n\t}\n\n\tvar b bytes.Buffer\n\terr := template.Must(\n\t\ttemplate.New(\"func_types\").\n\t\t\tParse(source),\n\t).Execute(&b, data)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tformatted, err := format.Source(b.Bytes())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Print(string(formatted))\n}\n\nconst source = `// Code generated by vm/func_types/main.go. DO NOT EDIT.\n\npackage vm\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nvar FuncTypes = []any{\n\t{{ .Index }}\n}\n\nfunc (vm *VM) call(fn any, kind int) any {\n\tswitch kind {\n\t{{ .Code }}\n\t}\n\tpanic(fmt.Sprintf(\"unknown function kind (%v)\", kind))\n}\n`\n"
  },
  {
    "path": "vm/func_types[generated].go",
    "content": "// Code generated by vm/func_types/main.go. DO NOT EDIT.\n\npackage vm\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nvar FuncTypes = []any{\n\t1:  new(func() time.Duration),\n\t2:  new(func() time.Month),\n\t3:  new(func() time.Time),\n\t4:  new(func() time.Weekday),\n\t5:  new(func() []interface{}),\n\t6:  new(func() []uint8),\n\t7:  new(func() interface{}),\n\t8:  new(func() bool),\n\t9:  new(func() uint8),\n\t10: new(func() float32),\n\t11: new(func() float64),\n\t12: new(func() int),\n\t13: new(func() int16),\n\t14: new(func() int32),\n\t15: new(func() int64),\n\t16: new(func() int8),\n\t17: new(func() map[string]interface{}),\n\t18: new(func() int32),\n\t19: new(func() string),\n\t20: new(func() uint),\n\t21: new(func() uint16),\n\t22: new(func() uint32),\n\t23: new(func() uint64),\n\t24: new(func() uint8),\n\t25: new(func(time.Duration) time.Duration),\n\t26: new(func(time.Duration) time.Time),\n\t27: new(func(time.Time) time.Duration),\n\t28: new(func(time.Time) bool),\n\t29: new(func([]interface{}) []interface{}),\n\t30: new(func([]interface{}) interface{}),\n\t31: new(func([]interface{}) map[string]interface{}),\n\t32: new(func([]interface{}, string) string),\n\t33: new(func([]uint8) string),\n\t34: new(func([]string, string) string),\n\t35: new(func(interface{}) []interface{}),\n\t36: new(func(interface{}) interface{}),\n\t37: new(func(interface{}) bool),\n\t38: new(func(interface{}) float64),\n\t39: new(func(interface{}) int),\n\t40: new(func(interface{}) map[string]interface{}),\n\t41: new(func(interface{}) string),\n\t42: new(func(interface{}, interface{}) []interface{}),\n\t43: new(func(interface{}, interface{}) interface{}),\n\t44: new(func(interface{}, interface{}) bool),\n\t45: new(func(interface{}, interface{}) string),\n\t46: new(func(bool) bool),\n\t47: new(func(bool) float64),\n\t48: new(func(bool) int),\n\t49: new(func(bool) string),\n\t50: new(func(bool, bool) bool),\n\t51: new(func(float32) float64),\n\t52: new(func(float64) bool),\n\t53: new(func(float64) float32),\n\t54: new(func(float64) float64),\n\t55: new(func(float64) int),\n\t56: new(func(float64) string),\n\t57: new(func(float64, float64) bool),\n\t58: new(func(int) bool),\n\t59: new(func(int) float64),\n\t60: new(func(int) int),\n\t61: new(func(int) string),\n\t62: new(func(int, int) bool),\n\t63: new(func(int, int) int),\n\t64: new(func(int, int) string),\n\t65: new(func(int16) int32),\n\t66: new(func(int32) float64),\n\t67: new(func(int32) int),\n\t68: new(func(int32) int64),\n\t69: new(func(int64) time.Time),\n\t70: new(func(int8) int),\n\t71: new(func(int8) int16),\n\t72: new(func(string) []uint8),\n\t73: new(func(string) []string),\n\t74: new(func(string) bool),\n\t75: new(func(string) float64),\n\t76: new(func(string) int),\n\t77: new(func(string) string),\n\t78: new(func(string, uint8) int),\n\t79: new(func(string, int) int),\n\t80: new(func(string, int32) int),\n\t81: new(func(string, string) bool),\n\t82: new(func(string, string) string),\n\t83: new(func(uint) float64),\n\t84: new(func(uint) int),\n\t85: new(func(uint) uint),\n\t86: new(func(uint16) uint),\n\t87: new(func(uint32) uint64),\n\t88: new(func(uint64) float64),\n\t89: new(func(uint64) int64),\n\t90: new(func(uint8) uint8),\n}\n\nfunc (vm *VM) call(fn any, kind int) any {\n\tswitch kind {\n\tcase 1:\n\t\treturn fn.(func() time.Duration)()\n\tcase 2:\n\t\treturn fn.(func() time.Month)()\n\tcase 3:\n\t\treturn fn.(func() time.Time)()\n\tcase 4:\n\t\treturn fn.(func() time.Weekday)()\n\tcase 5:\n\t\treturn fn.(func() []interface{})()\n\tcase 6:\n\t\treturn fn.(func() []uint8)()\n\tcase 7:\n\t\treturn fn.(func() interface{})()\n\tcase 8:\n\t\treturn fn.(func() bool)()\n\tcase 9:\n\t\treturn fn.(func() uint8)()\n\tcase 10:\n\t\treturn fn.(func() float32)()\n\tcase 11:\n\t\treturn fn.(func() float64)()\n\tcase 12:\n\t\treturn fn.(func() int)()\n\tcase 13:\n\t\treturn fn.(func() int16)()\n\tcase 14:\n\t\treturn fn.(func() int32)()\n\tcase 15:\n\t\treturn fn.(func() int64)()\n\tcase 16:\n\t\treturn fn.(func() int8)()\n\tcase 17:\n\t\treturn fn.(func() map[string]interface{})()\n\tcase 18:\n\t\treturn fn.(func() int32)()\n\tcase 19:\n\t\treturn fn.(func() string)()\n\tcase 20:\n\t\treturn fn.(func() uint)()\n\tcase 21:\n\t\treturn fn.(func() uint16)()\n\tcase 22:\n\t\treturn fn.(func() uint32)()\n\tcase 23:\n\t\treturn fn.(func() uint64)()\n\tcase 24:\n\t\treturn fn.(func() uint8)()\n\tcase 25:\n\t\targ1 := vm.pop().(time.Duration)\n\t\treturn fn.(func(time.Duration) time.Duration)(arg1)\n\tcase 26:\n\t\targ1 := vm.pop().(time.Duration)\n\t\treturn fn.(func(time.Duration) time.Time)(arg1)\n\tcase 27:\n\t\targ1 := vm.pop().(time.Time)\n\t\treturn fn.(func(time.Time) time.Duration)(arg1)\n\tcase 28:\n\t\targ1 := vm.pop().(time.Time)\n\t\treturn fn.(func(time.Time) bool)(arg1)\n\tcase 29:\n\t\targ1 := vm.pop().([]interface{})\n\t\treturn fn.(func([]interface{}) []interface{})(arg1)\n\tcase 30:\n\t\targ1 := vm.pop().([]interface{})\n\t\treturn fn.(func([]interface{}) interface{})(arg1)\n\tcase 31:\n\t\targ1 := vm.pop().([]interface{})\n\t\treturn fn.(func([]interface{}) map[string]interface{})(arg1)\n\tcase 32:\n\t\targ2 := vm.pop().(string)\n\t\targ1 := vm.pop().([]interface{})\n\t\treturn fn.(func([]interface{}, string) string)(arg1, arg2)\n\tcase 33:\n\t\targ1 := vm.pop().([]uint8)\n\t\treturn fn.(func([]uint8) string)(arg1)\n\tcase 34:\n\t\targ2 := vm.pop().(string)\n\t\targ1 := vm.pop().([]string)\n\t\treturn fn.(func([]string, string) string)(arg1, arg2)\n\tcase 35:\n\t\targ1 := vm.pop()\n\t\treturn fn.(func(interface{}) []interface{})(arg1)\n\tcase 36:\n\t\targ1 := vm.pop()\n\t\treturn fn.(func(interface{}) interface{})(arg1)\n\tcase 37:\n\t\targ1 := vm.pop()\n\t\treturn fn.(func(interface{}) bool)(arg1)\n\tcase 38:\n\t\targ1 := vm.pop()\n\t\treturn fn.(func(interface{}) float64)(arg1)\n\tcase 39:\n\t\targ1 := vm.pop()\n\t\treturn fn.(func(interface{}) int)(arg1)\n\tcase 40:\n\t\targ1 := vm.pop()\n\t\treturn fn.(func(interface{}) map[string]interface{})(arg1)\n\tcase 41:\n\t\targ1 := vm.pop()\n\t\treturn fn.(func(interface{}) string)(arg1)\n\tcase 42:\n\t\targ2 := vm.pop()\n\t\targ1 := vm.pop()\n\t\treturn fn.(func(interface{}, interface{}) []interface{})(arg1, arg2)\n\tcase 43:\n\t\targ2 := vm.pop()\n\t\targ1 := vm.pop()\n\t\treturn fn.(func(interface{}, interface{}) interface{})(arg1, arg2)\n\tcase 44:\n\t\targ2 := vm.pop()\n\t\targ1 := vm.pop()\n\t\treturn fn.(func(interface{}, interface{}) bool)(arg1, arg2)\n\tcase 45:\n\t\targ2 := vm.pop()\n\t\targ1 := vm.pop()\n\t\treturn fn.(func(interface{}, interface{}) string)(arg1, arg2)\n\tcase 46:\n\t\targ1 := vm.pop().(bool)\n\t\treturn fn.(func(bool) bool)(arg1)\n\tcase 47:\n\t\targ1 := vm.pop().(bool)\n\t\treturn fn.(func(bool) float64)(arg1)\n\tcase 48:\n\t\targ1 := vm.pop().(bool)\n\t\treturn fn.(func(bool) int)(arg1)\n\tcase 49:\n\t\targ1 := vm.pop().(bool)\n\t\treturn fn.(func(bool) string)(arg1)\n\tcase 50:\n\t\targ2 := vm.pop().(bool)\n\t\targ1 := vm.pop().(bool)\n\t\treturn fn.(func(bool, bool) bool)(arg1, arg2)\n\tcase 51:\n\t\targ1 := vm.pop().(float32)\n\t\treturn fn.(func(float32) float64)(arg1)\n\tcase 52:\n\t\targ1 := vm.pop().(float64)\n\t\treturn fn.(func(float64) bool)(arg1)\n\tcase 53:\n\t\targ1 := vm.pop().(float64)\n\t\treturn fn.(func(float64) float32)(arg1)\n\tcase 54:\n\t\targ1 := vm.pop().(float64)\n\t\treturn fn.(func(float64) float64)(arg1)\n\tcase 55:\n\t\targ1 := vm.pop().(float64)\n\t\treturn fn.(func(float64) int)(arg1)\n\tcase 56:\n\t\targ1 := vm.pop().(float64)\n\t\treturn fn.(func(float64) string)(arg1)\n\tcase 57:\n\t\targ2 := vm.pop().(float64)\n\t\targ1 := vm.pop().(float64)\n\t\treturn fn.(func(float64, float64) bool)(arg1, arg2)\n\tcase 58:\n\t\targ1 := vm.pop().(int)\n\t\treturn fn.(func(int) bool)(arg1)\n\tcase 59:\n\t\targ1 := vm.pop().(int)\n\t\treturn fn.(func(int) float64)(arg1)\n\tcase 60:\n\t\targ1 := vm.pop().(int)\n\t\treturn fn.(func(int) int)(arg1)\n\tcase 61:\n\t\targ1 := vm.pop().(int)\n\t\treturn fn.(func(int) string)(arg1)\n\tcase 62:\n\t\targ2 := vm.pop().(int)\n\t\targ1 := vm.pop().(int)\n\t\treturn fn.(func(int, int) bool)(arg1, arg2)\n\tcase 63:\n\t\targ2 := vm.pop().(int)\n\t\targ1 := vm.pop().(int)\n\t\treturn fn.(func(int, int) int)(arg1, arg2)\n\tcase 64:\n\t\targ2 := vm.pop().(int)\n\t\targ1 := vm.pop().(int)\n\t\treturn fn.(func(int, int) string)(arg1, arg2)\n\tcase 65:\n\t\targ1 := vm.pop().(int16)\n\t\treturn fn.(func(int16) int32)(arg1)\n\tcase 66:\n\t\targ1 := vm.pop().(int32)\n\t\treturn fn.(func(int32) float64)(arg1)\n\tcase 67:\n\t\targ1 := vm.pop().(int32)\n\t\treturn fn.(func(int32) int)(arg1)\n\tcase 68:\n\t\targ1 := vm.pop().(int32)\n\t\treturn fn.(func(int32) int64)(arg1)\n\tcase 69:\n\t\targ1 := vm.pop().(int64)\n\t\treturn fn.(func(int64) time.Time)(arg1)\n\tcase 70:\n\t\targ1 := vm.pop().(int8)\n\t\treturn fn.(func(int8) int)(arg1)\n\tcase 71:\n\t\targ1 := vm.pop().(int8)\n\t\treturn fn.(func(int8) int16)(arg1)\n\tcase 72:\n\t\targ1 := vm.pop().(string)\n\t\treturn fn.(func(string) []uint8)(arg1)\n\tcase 73:\n\t\targ1 := vm.pop().(string)\n\t\treturn fn.(func(string) []string)(arg1)\n\tcase 74:\n\t\targ1 := vm.pop().(string)\n\t\treturn fn.(func(string) bool)(arg1)\n\tcase 75:\n\t\targ1 := vm.pop().(string)\n\t\treturn fn.(func(string) float64)(arg1)\n\tcase 76:\n\t\targ1 := vm.pop().(string)\n\t\treturn fn.(func(string) int)(arg1)\n\tcase 77:\n\t\targ1 := vm.pop().(string)\n\t\treturn fn.(func(string) string)(arg1)\n\tcase 78:\n\t\targ2 := vm.pop().(uint8)\n\t\targ1 := vm.pop().(string)\n\t\treturn fn.(func(string, uint8) int)(arg1, arg2)\n\tcase 79:\n\t\targ2 := vm.pop().(int)\n\t\targ1 := vm.pop().(string)\n\t\treturn fn.(func(string, int) int)(arg1, arg2)\n\tcase 80:\n\t\targ2 := vm.pop().(int32)\n\t\targ1 := vm.pop().(string)\n\t\treturn fn.(func(string, int32) int)(arg1, arg2)\n\tcase 81:\n\t\targ2 := vm.pop().(string)\n\t\targ1 := vm.pop().(string)\n\t\treturn fn.(func(string, string) bool)(arg1, arg2)\n\tcase 82:\n\t\targ2 := vm.pop().(string)\n\t\targ1 := vm.pop().(string)\n\t\treturn fn.(func(string, string) string)(arg1, arg2)\n\tcase 83:\n\t\targ1 := vm.pop().(uint)\n\t\treturn fn.(func(uint) float64)(arg1)\n\tcase 84:\n\t\targ1 := vm.pop().(uint)\n\t\treturn fn.(func(uint) int)(arg1)\n\tcase 85:\n\t\targ1 := vm.pop().(uint)\n\t\treturn fn.(func(uint) uint)(arg1)\n\tcase 86:\n\t\targ1 := vm.pop().(uint16)\n\t\treturn fn.(func(uint16) uint)(arg1)\n\tcase 87:\n\t\targ1 := vm.pop().(uint32)\n\t\treturn fn.(func(uint32) uint64)(arg1)\n\tcase 88:\n\t\targ1 := vm.pop().(uint64)\n\t\treturn fn.(func(uint64) float64)(arg1)\n\tcase 89:\n\t\targ1 := vm.pop().(uint64)\n\t\treturn fn.(func(uint64) int64)(arg1)\n\tcase 90:\n\t\targ1 := vm.pop().(uint8)\n\t\treturn fn.(func(uint8) uint8)(arg1)\n\n\t}\n\tpanic(fmt.Sprintf(\"unknown function kind (%v)\", kind))\n}\n"
  },
  {
    "path": "vm/opcodes.go",
    "content": "package vm\n\ntype Opcode byte\n\nconst (\n\tOpInvalid Opcode = iota\n\tOpPush\n\tOpInt\n\tOpPop\n\tOpStore\n\tOpLoadVar\n\tOpLoadConst\n\tOpLoadField\n\tOpLoadFast\n\tOpLoadMethod\n\tOpLoadFunc\n\tOpLoadEnv\n\tOpFetch\n\tOpFetchField\n\tOpMethod\n\tOpTrue\n\tOpFalse\n\tOpNil\n\tOpNegate\n\tOpNot\n\tOpEqual\n\tOpEqualInt\n\tOpEqualString\n\tOpJump\n\tOpJumpIfTrue\n\tOpJumpIfFalse\n\tOpJumpIfNil\n\tOpJumpIfNotNil\n\tOpJumpIfEnd\n\tOpJumpBackward\n\tOpIn\n\tOpLess\n\tOpMore\n\tOpLessOrEqual\n\tOpMoreOrEqual\n\tOpAdd\n\tOpSubtract\n\tOpMultiply\n\tOpDivide\n\tOpModulo\n\tOpExponent\n\tOpRange\n\tOpMatches\n\tOpMatchesConst\n\tOpContains\n\tOpStartsWith\n\tOpEndsWith\n\tOpSlice\n\tOpCall\n\tOpCall0\n\tOpCall1\n\tOpCall2\n\tOpCall3\n\tOpCallN\n\tOpCallFast\n\tOpCallSafe\n\tOpCallTyped\n\tOpCallBuiltin1\n\tOpArray\n\tOpMap\n\tOpLen\n\tOpCast\n\tOpDeref\n\tOpIncrementIndex\n\tOpDecrementIndex\n\tOpIncrementCount\n\tOpGetIndex\n\tOpGetCount\n\tOpGetLen\n\tOpGetAcc\n\tOpSetAcc\n\tOpSetIndex\n\tOpPointer\n\tOpThrow\n\tOpCreate\n\tOpGroupBy\n\tOpSortBy\n\tOpSort\n\tOpProfileStart\n\tOpProfileEnd\n\tOpBegin\n\tOpAnd\n\tOpOr\n\tOpEnd // This opcode must be at the end of this list.\n)\n"
  },
  {
    "path": "vm/program.go",
    "content": "package vm\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"strings\"\n\t\"text/tabwriter\"\n\n\t\"github.com/expr-lang/expr/ast\"\n\t\"github.com/expr-lang/expr/builtin\"\n\t\"github.com/expr-lang/expr/file\"\n\t\"github.com/expr-lang/expr/vm/runtime\"\n)\n\n// Program represents a compiled expression.\ntype Program struct {\n\tBytecode  []Opcode\n\tArguments []int\n\tConstants []any\n\n\tsource    file.Source\n\tnode      ast.Node\n\tlocations []file.Location\n\tvariables int\n\tfunctions []Function\n\tdebugInfo map[string]string\n\tspan      *Span\n}\n\n// NewProgram returns a new Program. It's used by the compiler.\nfunc NewProgram(\n\tsource file.Source,\n\tnode ast.Node,\n\tlocations []file.Location,\n\tvariables int,\n\tconstants []any,\n\tbytecode []Opcode,\n\targuments []int,\n\tfunctions []Function,\n\tdebugInfo map[string]string,\n\tspan *Span,\n) *Program {\n\treturn &Program{\n\t\tsource:    source,\n\t\tnode:      node,\n\t\tlocations: locations,\n\t\tvariables: variables,\n\t\tConstants: constants,\n\t\tBytecode:  bytecode,\n\t\tArguments: arguments,\n\t\tfunctions: functions,\n\t\tdebugInfo: debugInfo,\n\t\tspan:      span,\n\t}\n}\n\n// Source returns origin file.Source.\nfunc (program *Program) Source() file.Source {\n\treturn program.source\n}\n\n// Node returns origin ast.Node.\nfunc (program *Program) Node() ast.Node {\n\treturn program.node\n}\n\n// Locations returns a slice of bytecode's locations.\nfunc (program *Program) Locations() []file.Location {\n\treturn program.locations\n}\n\n// Disassemble returns opcodes as a string.\nfunc (program *Program) Disassemble() string {\n\tvar buf bytes.Buffer\n\tw := tabwriter.NewWriter(&buf, 0, 0, 2, ' ', 0)\n\tprogram.DisassembleWriter(w)\n\t_ = w.Flush()\n\treturn buf.String()\n}\n\n// DisassembleWriter takes a writer and writes opcodes to it.\nfunc (program *Program) DisassembleWriter(w io.Writer) {\n\tip := 0\n\tfor ip < len(program.Bytecode) {\n\t\tpp := ip\n\t\top := program.Bytecode[ip]\n\t\targ := program.Arguments[ip]\n\t\tip += 1\n\n\t\tcode := func(label string) {\n\t\t\t_, _ = fmt.Fprintf(w, \"%v\\t%v\\n\", pp, label)\n\t\t}\n\t\tjump := func(label string) {\n\t\t\t_, _ = fmt.Fprintf(w, \"%v\\t%v\\t<%v>\\t(%v)\\n\", pp, label, arg, ip+arg)\n\t\t}\n\t\tjumpBack := func(label string) {\n\t\t\t_, _ = fmt.Fprintf(w, \"%v\\t%v\\t<%v>\\t(%v)\\n\", pp, label, arg, ip-arg)\n\t\t}\n\t\targument := func(label string) {\n\t\t\t_, _ = fmt.Fprintf(w, \"%v\\t%v\\t<%v>\\n\", pp, label, arg)\n\t\t}\n\t\targumentWithInfo := func(label string, prefix string) {\n\t\t\t_, _ = fmt.Fprintf(w, \"%v\\t%v\\t<%v>\\t%v\\n\", pp, label, arg, program.debugInfo[fmt.Sprintf(\"%s_%d\", prefix, arg)])\n\t\t}\n\t\tconstant := func(label string) {\n\t\t\tvar c any\n\t\t\tif arg < len(program.Constants) {\n\t\t\t\tc = program.Constants[arg]\n\t\t\t} else {\n\t\t\t\tc = \"out of range\"\n\t\t\t}\n\t\t\tif name, ok := program.debugInfo[fmt.Sprintf(\"const_%d\", arg)]; ok {\n\t\t\t\tc = name\n\t\t\t}\n\t\t\tif r, ok := c.(*regexp.Regexp); ok {\n\t\t\t\tc = r.String()\n\t\t\t}\n\t\t\tif field, ok := c.(*runtime.Field); ok {\n\t\t\t\tc = fmt.Sprintf(\"{%v %v}\", strings.Join(field.Path, \".\"), field.Index)\n\t\t\t}\n\t\t\tif method, ok := c.(*runtime.Method); ok {\n\t\t\t\tc = fmt.Sprintf(\"{%v %v}\", method.Name, method.Index)\n\t\t\t}\n\t\t\t_, _ = fmt.Fprintf(w, \"%v\\t%v\\t<%v>\\t%v\\n\", pp, label, arg, c)\n\t\t}\n\t\tbuiltinArg := func(label string) {\n\t\t\t_, _ = fmt.Fprintf(w, \"%v\\t%v\\t<%v>\\t%v\\n\", pp, label, arg, builtin.Builtins[arg].Name)\n\t\t}\n\n\t\tswitch op {\n\t\tcase OpInvalid:\n\t\t\tcode(\"OpInvalid\")\n\n\t\tcase OpPush:\n\t\t\tconstant(\"OpPush\")\n\n\t\tcase OpInt:\n\t\t\targument(\"OpInt\")\n\n\t\tcase OpPop:\n\t\t\tcode(\"OpPop\")\n\n\t\tcase OpStore:\n\t\t\targumentWithInfo(\"OpStore\", \"var\")\n\n\t\tcase OpLoadVar:\n\t\t\targumentWithInfo(\"OpLoadVar\", \"var\")\n\n\t\tcase OpLoadConst:\n\t\t\tconstant(\"OpLoadConst\")\n\n\t\tcase OpLoadField:\n\t\t\tconstant(\"OpLoadField\")\n\n\t\tcase OpLoadFast:\n\t\t\tconstant(\"OpLoadFast\")\n\n\t\tcase OpLoadMethod:\n\t\t\tconstant(\"OpLoadMethod\")\n\n\t\tcase OpLoadFunc:\n\t\t\targumentWithInfo(\"OpLoadFunc\", \"func\")\n\n\t\tcase OpLoadEnv:\n\t\t\tcode(\"OpLoadEnv\")\n\n\t\tcase OpFetch:\n\t\t\tcode(\"OpFetch\")\n\n\t\tcase OpFetchField:\n\t\t\tconstant(\"OpFetchField\")\n\n\t\tcase OpMethod:\n\t\t\tconstant(\"OpMethod\")\n\n\t\tcase OpTrue:\n\t\t\tcode(\"OpTrue\")\n\n\t\tcase OpFalse:\n\t\t\tcode(\"OpFalse\")\n\n\t\tcase OpNil:\n\t\t\tcode(\"OpNil\")\n\n\t\tcase OpNegate:\n\t\t\tcode(\"OpNegate\")\n\n\t\tcase OpNot:\n\t\t\tcode(\"OpNot\")\n\n\t\tcase OpEqual:\n\t\t\tcode(\"OpEqual\")\n\n\t\tcase OpEqualInt:\n\t\t\tcode(\"OpEqualInt\")\n\n\t\tcase OpEqualString:\n\t\t\tcode(\"OpEqualString\")\n\n\t\tcase OpJump:\n\t\t\tjump(\"OpJump\")\n\n\t\tcase OpJumpIfTrue:\n\t\t\tjump(\"OpJumpIfTrue\")\n\n\t\tcase OpJumpIfFalse:\n\t\t\tjump(\"OpJumpIfFalse\")\n\n\t\tcase OpJumpIfNil:\n\t\t\tjump(\"OpJumpIfNil\")\n\n\t\tcase OpJumpIfNotNil:\n\t\t\tjump(\"OpJumpIfNotNil\")\n\n\t\tcase OpJumpIfEnd:\n\t\t\tjump(\"OpJumpIfEnd\")\n\n\t\tcase OpJumpBackward:\n\t\t\tjumpBack(\"OpJumpBackward\")\n\n\t\tcase OpIn:\n\t\t\tcode(\"OpIn\")\n\n\t\tcase OpLess:\n\t\t\tcode(\"OpLess\")\n\n\t\tcase OpMore:\n\t\t\tcode(\"OpMore\")\n\n\t\tcase OpLessOrEqual:\n\t\t\tcode(\"OpLessOrEqual\")\n\n\t\tcase OpMoreOrEqual:\n\t\t\tcode(\"OpMoreOrEqual\")\n\n\t\tcase OpAdd:\n\t\t\tcode(\"OpAdd\")\n\n\t\tcase OpSubtract:\n\t\t\tcode(\"OpSubtract\")\n\n\t\tcase OpMultiply:\n\t\t\tcode(\"OpMultiply\")\n\n\t\tcase OpDivide:\n\t\t\tcode(\"OpDivide\")\n\n\t\tcase OpModulo:\n\t\t\tcode(\"OpModulo\")\n\n\t\tcase OpExponent:\n\t\t\tcode(\"OpExponent\")\n\n\t\tcase OpRange:\n\t\t\tcode(\"OpRange\")\n\n\t\tcase OpMatches:\n\t\t\tcode(\"OpMatches\")\n\n\t\tcase OpMatchesConst:\n\t\t\tconstant(\"OpMatchesConst\")\n\n\t\tcase OpContains:\n\t\t\tcode(\"OpContains\")\n\n\t\tcase OpStartsWith:\n\t\t\tcode(\"OpStartsWith\")\n\n\t\tcase OpEndsWith:\n\t\t\tcode(\"OpEndsWith\")\n\n\t\tcase OpSlice:\n\t\t\tcode(\"OpSlice\")\n\n\t\tcase OpCall:\n\t\t\targument(\"OpCall\")\n\n\t\tcase OpCall0:\n\t\t\targumentWithInfo(\"OpCall0\", \"func\")\n\n\t\tcase OpCall1:\n\t\t\targumentWithInfo(\"OpCall1\", \"func\")\n\n\t\tcase OpCall2:\n\t\t\targumentWithInfo(\"OpCall2\", \"func\")\n\n\t\tcase OpCall3:\n\t\t\targumentWithInfo(\"OpCall3\", \"func\")\n\n\t\tcase OpCallN:\n\t\t\targument(\"OpCallN\")\n\n\t\tcase OpCallFast:\n\t\t\targument(\"OpCallFast\")\n\n\t\tcase OpCallSafe:\n\t\t\targument(\"OpCallSafe\")\n\n\t\tcase OpCallTyped:\n\t\t\tsignature := reflect.TypeOf(FuncTypes[arg]).Elem().String()\n\t\t\t_, _ = fmt.Fprintf(w, \"%v\\t%v\\t<%v>\\t%v\\n\", pp, \"OpCallTyped\", arg, signature)\n\n\t\tcase OpCallBuiltin1:\n\t\t\tbuiltinArg(\"OpCallBuiltin1\")\n\n\t\tcase OpArray:\n\t\t\tcode(\"OpArray\")\n\n\t\tcase OpMap:\n\t\t\tcode(\"OpMap\")\n\n\t\tcase OpLen:\n\t\t\tcode(\"OpLen\")\n\n\t\tcase OpCast:\n\t\t\targument(\"OpCast\")\n\n\t\tcase OpDeref:\n\t\t\tcode(\"OpDeref\")\n\n\t\tcase OpIncrementIndex:\n\t\t\tcode(\"OpIncrementIndex\")\n\n\t\tcase OpDecrementIndex:\n\t\t\tcode(\"OpDecrementIndex\")\n\n\t\tcase OpIncrementCount:\n\t\t\tcode(\"OpIncrementCount\")\n\n\t\tcase OpGetIndex:\n\t\t\tcode(\"OpGetIndex\")\n\n\t\tcase OpGetCount:\n\t\t\tcode(\"OpGetCount\")\n\n\t\tcase OpGetLen:\n\t\t\tcode(\"OpGetLen\")\n\n\t\tcase OpGetAcc:\n\t\t\tcode(\"OpGetAcc\")\n\n\t\tcase OpSetAcc:\n\t\t\tcode(\"OpSetAcc\")\n\n\t\tcase OpSetIndex:\n\t\t\tcode(\"OpSetIndex\")\n\n\t\tcase OpPointer:\n\t\t\tcode(\"OpPointer\")\n\n\t\tcase OpThrow:\n\t\t\tcode(\"OpThrow\")\n\n\t\tcase OpCreate:\n\t\t\targument(\"OpCreate\")\n\n\t\tcase OpGroupBy:\n\t\t\tcode(\"OpGroupBy\")\n\n\t\tcase OpSortBy:\n\t\t\tcode(\"OpSortBy\")\n\n\t\tcase OpSort:\n\t\t\tcode(\"OpSort\")\n\n\t\tcase OpProfileStart:\n\t\t\tcode(\"OpProfileStart\")\n\n\t\tcase OpProfileEnd:\n\t\t\tcode(\"OpProfileEnd\")\n\n\t\tcase OpBegin:\n\t\t\tcode(\"OpBegin\")\n\n\t\tcase OpAnd:\n\t\t\tcode(\"OpAnd\")\n\n\t\tcase OpOr:\n\t\t\tcode(\"OpOr\")\n\n\t\tcase OpEnd:\n\t\t\tcode(\"OpEnd\")\n\n\t\tdefault:\n\t\t\t_, _ = fmt.Fprintf(w, \"%v\\t%#x (unknown)\\n\", ip, op)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vm/program_test.go",
    "content": "package vm_test\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/vm\"\n)\n\nfunc TestProgram_Disassemble(t *testing.T) {\n\tfor op := vm.OpPush; op < vm.OpEnd; op++ {\n\t\tprogram := vm.Program{\n\t\t\tConstants: []any{1, 2},\n\t\t\tBytecode:  []vm.Opcode{op},\n\t\t\tArguments: []int{1},\n\t\t}\n\t\td := program.Disassemble()\n\t\tif strings.Contains(d, \"(unknown)\") {\n\t\t\tt.Errorf(\"cannot disassemble all opcodes\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vm/runtime/helpers/main.go",
    "content": "package main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/format\"\n\t\"os\"\n\t\"strings\"\n\t\"text/template\"\n)\n\nfunc main() {\n\tvar b bytes.Buffer\n\terr := template.Must(\n\t\ttemplate.New(\"helpers\").\n\t\t\tFuncs(template.FuncMap{\n\t\t\t\t\"cases\":          func(op string) string { return cases(op, uints, ints, floats) },\n\t\t\t\t\"cases_int_only\": func(op string) string { return cases(op, uints, ints) },\n\t\t\t\t\"cases_with_duration\": func(op string) string {\n\t\t\t\t\treturn cases(op, uints, ints, floats, []string{\"time.Duration\"})\n\t\t\t\t},\n\t\t\t\t\"array_equal_cases\": func() string { return arrayEqualCases([]string{\"string\"}, uints, ints, floats) },\n\t\t\t}).\n\t\t\tParse(helpers),\n\t).Execute(&b, nil)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tformatted, err := format.Source(b.Bytes())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Print(string(formatted))\n}\n\nvar ints = []string{\n\t\"int\",\n\t\"int8\",\n\t\"int16\",\n\t\"int32\",\n\t\"int64\",\n}\n\nvar uints = []string{\n\t\"uint\",\n\t\"uint8\",\n\t\"uint16\",\n\t\"uint32\",\n\t\"uint64\",\n}\n\nvar floats = []string{\n\t\"float32\",\n\t\"float64\",\n}\n\nfunc cases(op string, xs ...[]string) string {\n\tvar types []string\n\tfor _, x := range xs {\n\t\ttypes = append(types, x...)\n\t}\n\n\t_, _ = fmt.Fprintf(os.Stderr, \"Generating %s cases for %v\\n\", op, types)\n\n\tvar out string\n\techo := func(s string, xs ...any) {\n\t\tout += fmt.Sprintf(s, xs...) + \"\\n\"\n\t}\n\tfor _, a := range types {\n\t\techo(`case %v:`, a)\n\t\techo(`switch y := b.(type) {`)\n\t\tfor _, b := range types {\n\t\t\tt := \"int\"\n\t\t\tif isDuration(a) || isDuration(b) {\n\t\t\t\tt = \"time.Duration\"\n\t\t\t}\n\t\t\tif isFloat(a) || isFloat(b) {\n\t\t\t\tt = \"float64\"\n\t\t\t}\n\t\t\techo(`case %v:`, b)\n\t\t\tif op == \"/\" {\n\t\t\t\techo(`return float64(x) / float64(y)`)\n\t\t\t} else {\n\t\t\t\techo(`return %v(x) %v %v(y)`, t, op, t)\n\t\t\t}\n\t\t}\n\t\techo(`}`)\n\t}\n\treturn strings.TrimRight(out, \"\\n\")\n}\n\nfunc arrayEqualCases(xs ...[]string) string {\n\tvar types []string\n\tfor _, x := range xs {\n\t\ttypes = append(types, x...)\n\t}\n\n\t_, _ = fmt.Fprintf(os.Stderr, \"Generating array equal cases for %v\\n\", types)\n\n\tvar out string\n\techo := func(s string, xs ...any) {\n\t\tout += fmt.Sprintf(s, xs...) + \"\\n\"\n\t}\n\techo(`case []any:`)\n\techo(`switch y := b.(type) {`)\n\tfor _, a := range append(types, \"any\") {\n\t\techo(`case []%v:`, a)\n\t\techo(`if len(x) != len(y) { return false }`)\n\t\techo(`for i := range x {`)\n\t\techo(`if !Equal(x[i], y[i]) { return false }`)\n\t\techo(`}`)\n\t\techo(\"return true\")\n\t}\n\techo(`}`)\n\tfor _, a := range types {\n\t\techo(`case []%v:`, a)\n\t\techo(`switch y := b.(type) {`)\n\t\techo(`case []any:`)\n\t\techo(`return Equal(y, x)`)\n\t\techo(`case []%v:`, a)\n\t\techo(`if len(x) != len(y) { return false }`)\n\t\techo(`for i := range x {`)\n\t\techo(`if x[i] != y[i] { return false }`)\n\t\techo(`}`)\n\t\techo(\"return true\")\n\t\techo(`}`)\n\t}\n\treturn strings.TrimRight(out, \"\\n\")\n}\n\nfunc isFloat(t string) bool {\n\treturn strings.HasPrefix(t, \"float\")\n}\n\nfunc isDuration(t string) bool {\n\treturn t == \"time.Duration\"\n}\n\nconst helpers = `// Code generated by vm/runtime/helpers/main.go. DO NOT EDIT.\n\npackage runtime\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"time\"\n)\n\nfunc Equal(a, b interface{}) bool {\n\tswitch x := a.(type) {\n\t{{ cases \"==\" }}\n\t{{ array_equal_cases }}\n\tcase string:\n\t\tswitch y := b.(type) {\n\t\tcase string:\n\t\t\treturn x == y\n\t\t}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn x.Equal(y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x == y\n\t\t}\n\tcase bool:\n\t\tswitch y := b.(type) {\n\t\tcase bool:\n\t\t\treturn x == y\n\t\t}\n\t}\n\tif IsNil(a) && IsNil(b) {\n\t\treturn true\n\t}\n\treturn reflect.DeepEqual(a, b)\n}\n\nfunc Less(a, b interface{}) bool {\n\tswitch x := a.(type) {\n\t{{ cases \"<\" }}\n\tcase string:\n\t\tswitch y := b.(type) {\n\t\tcase string:\n\t\t\treturn x < y\n\t\t}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn x.Before(y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x < y\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T < %T\", a, b))\n}\n\nfunc More(a, b interface{}) bool {\n\tswitch x := a.(type) {\n\t{{ cases \">\" }}\n\tcase string:\n\t\tswitch y := b.(type) {\n\t\tcase string:\n\t\t\treturn x > y\n\t\t}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn x.After(y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x > y\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T > %T\", a, b))\n}\n\nfunc LessOrEqual(a, b interface{}) bool {\n\tswitch x := a.(type) {\n\t{{ cases \"<=\" }}\n\tcase string:\n\t\tswitch y := b.(type) {\n\t\tcase string:\n\t\t\treturn x <= y\n\t\t}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn x.Before(y) || x.Equal(y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x <= y\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T <= %T\", a, b))\n}\n\nfunc MoreOrEqual(a, b interface{}) bool {\n\tswitch x := a.(type) {\n\t{{ cases \">=\" }}\n\tcase string:\n\t\tswitch y := b.(type) {\n\t\tcase string:\n\t\t\treturn x >= y\n\t\t}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn x.After(y) || x.Equal(y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x >= y\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T >= %T\", a, b))\n}\n\nfunc Add(a, b interface{}) interface{} {\n\tswitch x := a.(type) {\n\t{{ cases \"+\" }}\n\tcase string:\n\t\tswitch y := b.(type) {\n\t\tcase string:\n\t\t\treturn x + y\n\t\t}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x.Add(y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn y.Add(x)\n\t\tcase time.Duration:\n\t\t\treturn x + y\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T + %T\", a, b))\n}\n\nfunc Subtract(a, b interface{}) interface{} {\n\tswitch x := a.(type) {\n\t{{ cases \"-\" }}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn x.Sub(y)\n\t\tcase time.Duration:\n\t\t\treturn x.Add(-y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x - y\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T - %T\", a, b))\n}\n\nfunc Multiply(a, b interface{}) interface{} {\n\tswitch x := a.(type) {\n\t{{ cases_with_duration \"*\" }}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T * %T\", a, b))\n}\n\nfunc Divide(a, b interface{}) float64 {\n\tswitch x := a.(type) {\n\t{{ cases \"/\" }}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T / %T\", a, b))\n}\n\nfunc Modulo(a, b interface{}) int {\n\tswitch x := a.(type) {\n\t{{ cases_int_only \"%\" }}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T %% %T\", a, b))\n}\n`\n"
  },
  {
    "path": "vm/runtime/helpers[generated].go",
    "content": "// Code generated by vm/runtime/helpers/main.go. DO NOT EDIT.\n\npackage runtime\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"time\"\n)\n\nfunc Equal(a, b interface{}) bool {\n\tswitch x := a.(type) {\n\tcase uint:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) == int(y)\n\t\tcase int:\n\t\t\treturn int(x) == int(y)\n\t\tcase int8:\n\t\t\treturn int(x) == int(y)\n\t\tcase int16:\n\t\t\treturn int(x) == int(y)\n\t\tcase int32:\n\t\t\treturn int(x) == int(y)\n\t\tcase int64:\n\t\t\treturn int(x) == int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) == float64(y)\n\t\t}\n\tcase uint8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) == int(y)\n\t\tcase int:\n\t\t\treturn int(x) == int(y)\n\t\tcase int8:\n\t\t\treturn int(x) == int(y)\n\t\tcase int16:\n\t\t\treturn int(x) == int(y)\n\t\tcase int32:\n\t\t\treturn int(x) == int(y)\n\t\tcase int64:\n\t\t\treturn int(x) == int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) == float64(y)\n\t\t}\n\tcase uint16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) == int(y)\n\t\tcase int:\n\t\t\treturn int(x) == int(y)\n\t\tcase int8:\n\t\t\treturn int(x) == int(y)\n\t\tcase int16:\n\t\t\treturn int(x) == int(y)\n\t\tcase int32:\n\t\t\treturn int(x) == int(y)\n\t\tcase int64:\n\t\t\treturn int(x) == int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) == float64(y)\n\t\t}\n\tcase uint32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) == int(y)\n\t\tcase int:\n\t\t\treturn int(x) == int(y)\n\t\tcase int8:\n\t\t\treturn int(x) == int(y)\n\t\tcase int16:\n\t\t\treturn int(x) == int(y)\n\t\tcase int32:\n\t\t\treturn int(x) == int(y)\n\t\tcase int64:\n\t\t\treturn int(x) == int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) == float64(y)\n\t\t}\n\tcase uint64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) == int(y)\n\t\tcase int:\n\t\t\treturn int(x) == int(y)\n\t\tcase int8:\n\t\t\treturn int(x) == int(y)\n\t\tcase int16:\n\t\t\treturn int(x) == int(y)\n\t\tcase int32:\n\t\t\treturn int(x) == int(y)\n\t\tcase int64:\n\t\t\treturn int(x) == int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) == float64(y)\n\t\t}\n\tcase int:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) == int(y)\n\t\tcase int:\n\t\t\treturn int(x) == int(y)\n\t\tcase int8:\n\t\t\treturn int(x) == int(y)\n\t\tcase int16:\n\t\t\treturn int(x) == int(y)\n\t\tcase int32:\n\t\t\treturn int(x) == int(y)\n\t\tcase int64:\n\t\t\treturn int(x) == int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) == float64(y)\n\t\t}\n\tcase int8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) == int(y)\n\t\tcase int:\n\t\t\treturn int(x) == int(y)\n\t\tcase int8:\n\t\t\treturn int(x) == int(y)\n\t\tcase int16:\n\t\t\treturn int(x) == int(y)\n\t\tcase int32:\n\t\t\treturn int(x) == int(y)\n\t\tcase int64:\n\t\t\treturn int(x) == int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) == float64(y)\n\t\t}\n\tcase int16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) == int(y)\n\t\tcase int:\n\t\t\treturn int(x) == int(y)\n\t\tcase int8:\n\t\t\treturn int(x) == int(y)\n\t\tcase int16:\n\t\t\treturn int(x) == int(y)\n\t\tcase int32:\n\t\t\treturn int(x) == int(y)\n\t\tcase int64:\n\t\t\treturn int(x) == int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) == float64(y)\n\t\t}\n\tcase int32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) == int(y)\n\t\tcase int:\n\t\t\treturn int(x) == int(y)\n\t\tcase int8:\n\t\t\treturn int(x) == int(y)\n\t\tcase int16:\n\t\t\treturn int(x) == int(y)\n\t\tcase int32:\n\t\t\treturn int(x) == int(y)\n\t\tcase int64:\n\t\t\treturn int(x) == int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) == float64(y)\n\t\t}\n\tcase int64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) == int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) == int(y)\n\t\tcase int:\n\t\t\treturn int(x) == int(y)\n\t\tcase int8:\n\t\t\treturn int(x) == int(y)\n\t\tcase int16:\n\t\t\treturn int(x) == int(y)\n\t\tcase int32:\n\t\t\treturn int(x) == int(y)\n\t\tcase int64:\n\t\t\treturn int(x) == int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) == float64(y)\n\t\t}\n\tcase float32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) == float64(y)\n\t\t}\n\tcase float64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) == float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) == float64(y)\n\t\t}\n\tcase []any:\n\t\tswitch y := b.(type) {\n\t\tcase []string:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\tcase []uint:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\tcase []uint8:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\tcase []uint16:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\tcase []uint32:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\tcase []uint64:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\tcase []int:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\tcase []int8:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\tcase []int16:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\tcase []int32:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\tcase []int64:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\tcase []float32:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\tcase []float64:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\tcase []any:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif !Equal(x[i], y[i]) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase []string:\n\t\tswitch y := b.(type) {\n\t\tcase []any:\n\t\t\treturn Equal(y, x)\n\t\tcase []string:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif x[i] != y[i] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase []uint:\n\t\tswitch y := b.(type) {\n\t\tcase []any:\n\t\t\treturn Equal(y, x)\n\t\tcase []uint:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif x[i] != y[i] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase []uint8:\n\t\tswitch y := b.(type) {\n\t\tcase []any:\n\t\t\treturn Equal(y, x)\n\t\tcase []uint8:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif x[i] != y[i] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase []uint16:\n\t\tswitch y := b.(type) {\n\t\tcase []any:\n\t\t\treturn Equal(y, x)\n\t\tcase []uint16:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif x[i] != y[i] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase []uint32:\n\t\tswitch y := b.(type) {\n\t\tcase []any:\n\t\t\treturn Equal(y, x)\n\t\tcase []uint32:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif x[i] != y[i] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase []uint64:\n\t\tswitch y := b.(type) {\n\t\tcase []any:\n\t\t\treturn Equal(y, x)\n\t\tcase []uint64:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif x[i] != y[i] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase []int:\n\t\tswitch y := b.(type) {\n\t\tcase []any:\n\t\t\treturn Equal(y, x)\n\t\tcase []int:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif x[i] != y[i] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase []int8:\n\t\tswitch y := b.(type) {\n\t\tcase []any:\n\t\t\treturn Equal(y, x)\n\t\tcase []int8:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif x[i] != y[i] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase []int16:\n\t\tswitch y := b.(type) {\n\t\tcase []any:\n\t\t\treturn Equal(y, x)\n\t\tcase []int16:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif x[i] != y[i] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase []int32:\n\t\tswitch y := b.(type) {\n\t\tcase []any:\n\t\t\treturn Equal(y, x)\n\t\tcase []int32:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif x[i] != y[i] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase []int64:\n\t\tswitch y := b.(type) {\n\t\tcase []any:\n\t\t\treturn Equal(y, x)\n\t\tcase []int64:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif x[i] != y[i] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase []float32:\n\t\tswitch y := b.(type) {\n\t\tcase []any:\n\t\t\treturn Equal(y, x)\n\t\tcase []float32:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif x[i] != y[i] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase []float64:\n\t\tswitch y := b.(type) {\n\t\tcase []any:\n\t\t\treturn Equal(y, x)\n\t\tcase []float64:\n\t\t\tif len(x) != len(y) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tfor i := range x {\n\t\t\t\tif x[i] != y[i] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase string:\n\t\tswitch y := b.(type) {\n\t\tcase string:\n\t\t\treturn x == y\n\t\t}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn x.Equal(y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x == y\n\t\t}\n\tcase bool:\n\t\tswitch y := b.(type) {\n\t\tcase bool:\n\t\t\treturn x == y\n\t\t}\n\t}\n\tif IsNil(a) && IsNil(b) {\n\t\treturn true\n\t}\n\treturn reflect.DeepEqual(a, b)\n}\n\nfunc Less(a, b interface{}) bool {\n\tswitch x := a.(type) {\n\tcase uint:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) < int(y)\n\t\tcase int:\n\t\t\treturn int(x) < int(y)\n\t\tcase int8:\n\t\t\treturn int(x) < int(y)\n\t\tcase int16:\n\t\t\treturn int(x) < int(y)\n\t\tcase int32:\n\t\t\treturn int(x) < int(y)\n\t\tcase int64:\n\t\t\treturn int(x) < int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) < float64(y)\n\t\t}\n\tcase uint8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) < int(y)\n\t\tcase int:\n\t\t\treturn int(x) < int(y)\n\t\tcase int8:\n\t\t\treturn int(x) < int(y)\n\t\tcase int16:\n\t\t\treturn int(x) < int(y)\n\t\tcase int32:\n\t\t\treturn int(x) < int(y)\n\t\tcase int64:\n\t\t\treturn int(x) < int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) < float64(y)\n\t\t}\n\tcase uint16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) < int(y)\n\t\tcase int:\n\t\t\treturn int(x) < int(y)\n\t\tcase int8:\n\t\t\treturn int(x) < int(y)\n\t\tcase int16:\n\t\t\treturn int(x) < int(y)\n\t\tcase int32:\n\t\t\treturn int(x) < int(y)\n\t\tcase int64:\n\t\t\treturn int(x) < int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) < float64(y)\n\t\t}\n\tcase uint32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) < int(y)\n\t\tcase int:\n\t\t\treturn int(x) < int(y)\n\t\tcase int8:\n\t\t\treturn int(x) < int(y)\n\t\tcase int16:\n\t\t\treturn int(x) < int(y)\n\t\tcase int32:\n\t\t\treturn int(x) < int(y)\n\t\tcase int64:\n\t\t\treturn int(x) < int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) < float64(y)\n\t\t}\n\tcase uint64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) < int(y)\n\t\tcase int:\n\t\t\treturn int(x) < int(y)\n\t\tcase int8:\n\t\t\treturn int(x) < int(y)\n\t\tcase int16:\n\t\t\treturn int(x) < int(y)\n\t\tcase int32:\n\t\t\treturn int(x) < int(y)\n\t\tcase int64:\n\t\t\treturn int(x) < int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) < float64(y)\n\t\t}\n\tcase int:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) < int(y)\n\t\tcase int:\n\t\t\treturn int(x) < int(y)\n\t\tcase int8:\n\t\t\treturn int(x) < int(y)\n\t\tcase int16:\n\t\t\treturn int(x) < int(y)\n\t\tcase int32:\n\t\t\treturn int(x) < int(y)\n\t\tcase int64:\n\t\t\treturn int(x) < int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) < float64(y)\n\t\t}\n\tcase int8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) < int(y)\n\t\tcase int:\n\t\t\treturn int(x) < int(y)\n\t\tcase int8:\n\t\t\treturn int(x) < int(y)\n\t\tcase int16:\n\t\t\treturn int(x) < int(y)\n\t\tcase int32:\n\t\t\treturn int(x) < int(y)\n\t\tcase int64:\n\t\t\treturn int(x) < int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) < float64(y)\n\t\t}\n\tcase int16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) < int(y)\n\t\tcase int:\n\t\t\treturn int(x) < int(y)\n\t\tcase int8:\n\t\t\treturn int(x) < int(y)\n\t\tcase int16:\n\t\t\treturn int(x) < int(y)\n\t\tcase int32:\n\t\t\treturn int(x) < int(y)\n\t\tcase int64:\n\t\t\treturn int(x) < int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) < float64(y)\n\t\t}\n\tcase int32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) < int(y)\n\t\tcase int:\n\t\t\treturn int(x) < int(y)\n\t\tcase int8:\n\t\t\treturn int(x) < int(y)\n\t\tcase int16:\n\t\t\treturn int(x) < int(y)\n\t\tcase int32:\n\t\t\treturn int(x) < int(y)\n\t\tcase int64:\n\t\t\treturn int(x) < int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) < float64(y)\n\t\t}\n\tcase int64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) < int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) < int(y)\n\t\tcase int:\n\t\t\treturn int(x) < int(y)\n\t\tcase int8:\n\t\t\treturn int(x) < int(y)\n\t\tcase int16:\n\t\t\treturn int(x) < int(y)\n\t\tcase int32:\n\t\t\treturn int(x) < int(y)\n\t\tcase int64:\n\t\t\treturn int(x) < int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) < float64(y)\n\t\t}\n\tcase float32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) < float64(y)\n\t\t}\n\tcase float64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) < float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) < float64(y)\n\t\t}\n\tcase string:\n\t\tswitch y := b.(type) {\n\t\tcase string:\n\t\t\treturn x < y\n\t\t}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn x.Before(y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x < y\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T < %T\", a, b))\n}\n\nfunc More(a, b interface{}) bool {\n\tswitch x := a.(type) {\n\tcase uint:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) > int(y)\n\t\tcase int:\n\t\t\treturn int(x) > int(y)\n\t\tcase int8:\n\t\t\treturn int(x) > int(y)\n\t\tcase int16:\n\t\t\treturn int(x) > int(y)\n\t\tcase int32:\n\t\t\treturn int(x) > int(y)\n\t\tcase int64:\n\t\t\treturn int(x) > int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) > float64(y)\n\t\t}\n\tcase uint8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) > int(y)\n\t\tcase int:\n\t\t\treturn int(x) > int(y)\n\t\tcase int8:\n\t\t\treturn int(x) > int(y)\n\t\tcase int16:\n\t\t\treturn int(x) > int(y)\n\t\tcase int32:\n\t\t\treturn int(x) > int(y)\n\t\tcase int64:\n\t\t\treturn int(x) > int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) > float64(y)\n\t\t}\n\tcase uint16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) > int(y)\n\t\tcase int:\n\t\t\treturn int(x) > int(y)\n\t\tcase int8:\n\t\t\treturn int(x) > int(y)\n\t\tcase int16:\n\t\t\treturn int(x) > int(y)\n\t\tcase int32:\n\t\t\treturn int(x) > int(y)\n\t\tcase int64:\n\t\t\treturn int(x) > int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) > float64(y)\n\t\t}\n\tcase uint32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) > int(y)\n\t\tcase int:\n\t\t\treturn int(x) > int(y)\n\t\tcase int8:\n\t\t\treturn int(x) > int(y)\n\t\tcase int16:\n\t\t\treturn int(x) > int(y)\n\t\tcase int32:\n\t\t\treturn int(x) > int(y)\n\t\tcase int64:\n\t\t\treturn int(x) > int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) > float64(y)\n\t\t}\n\tcase uint64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) > int(y)\n\t\tcase int:\n\t\t\treturn int(x) > int(y)\n\t\tcase int8:\n\t\t\treturn int(x) > int(y)\n\t\tcase int16:\n\t\t\treturn int(x) > int(y)\n\t\tcase int32:\n\t\t\treturn int(x) > int(y)\n\t\tcase int64:\n\t\t\treturn int(x) > int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) > float64(y)\n\t\t}\n\tcase int:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) > int(y)\n\t\tcase int:\n\t\t\treturn int(x) > int(y)\n\t\tcase int8:\n\t\t\treturn int(x) > int(y)\n\t\tcase int16:\n\t\t\treturn int(x) > int(y)\n\t\tcase int32:\n\t\t\treturn int(x) > int(y)\n\t\tcase int64:\n\t\t\treturn int(x) > int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) > float64(y)\n\t\t}\n\tcase int8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) > int(y)\n\t\tcase int:\n\t\t\treturn int(x) > int(y)\n\t\tcase int8:\n\t\t\treturn int(x) > int(y)\n\t\tcase int16:\n\t\t\treturn int(x) > int(y)\n\t\tcase int32:\n\t\t\treturn int(x) > int(y)\n\t\tcase int64:\n\t\t\treturn int(x) > int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) > float64(y)\n\t\t}\n\tcase int16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) > int(y)\n\t\tcase int:\n\t\t\treturn int(x) > int(y)\n\t\tcase int8:\n\t\t\treturn int(x) > int(y)\n\t\tcase int16:\n\t\t\treturn int(x) > int(y)\n\t\tcase int32:\n\t\t\treturn int(x) > int(y)\n\t\tcase int64:\n\t\t\treturn int(x) > int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) > float64(y)\n\t\t}\n\tcase int32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) > int(y)\n\t\tcase int:\n\t\t\treturn int(x) > int(y)\n\t\tcase int8:\n\t\t\treturn int(x) > int(y)\n\t\tcase int16:\n\t\t\treturn int(x) > int(y)\n\t\tcase int32:\n\t\t\treturn int(x) > int(y)\n\t\tcase int64:\n\t\t\treturn int(x) > int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) > float64(y)\n\t\t}\n\tcase int64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) > int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) > int(y)\n\t\tcase int:\n\t\t\treturn int(x) > int(y)\n\t\tcase int8:\n\t\t\treturn int(x) > int(y)\n\t\tcase int16:\n\t\t\treturn int(x) > int(y)\n\t\tcase int32:\n\t\t\treturn int(x) > int(y)\n\t\tcase int64:\n\t\t\treturn int(x) > int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) > float64(y)\n\t\t}\n\tcase float32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) > float64(y)\n\t\t}\n\tcase float64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) > float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) > float64(y)\n\t\t}\n\tcase string:\n\t\tswitch y := b.(type) {\n\t\tcase string:\n\t\t\treturn x > y\n\t\t}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn x.After(y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x > y\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T > %T\", a, b))\n}\n\nfunc LessOrEqual(a, b interface{}) bool {\n\tswitch x := a.(type) {\n\tcase uint:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) <= float64(y)\n\t\t}\n\tcase uint8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) <= float64(y)\n\t\t}\n\tcase uint16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) <= float64(y)\n\t\t}\n\tcase uint32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) <= float64(y)\n\t\t}\n\tcase uint64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) <= float64(y)\n\t\t}\n\tcase int:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) <= float64(y)\n\t\t}\n\tcase int8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) <= float64(y)\n\t\t}\n\tcase int16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) <= float64(y)\n\t\t}\n\tcase int32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) <= float64(y)\n\t\t}\n\tcase int64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) <= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) <= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) <= float64(y)\n\t\t}\n\tcase float32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) <= float64(y)\n\t\t}\n\tcase float64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) <= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) <= float64(y)\n\t\t}\n\tcase string:\n\t\tswitch y := b.(type) {\n\t\tcase string:\n\t\t\treturn x <= y\n\t\t}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn x.Before(y) || x.Equal(y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x <= y\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T <= %T\", a, b))\n}\n\nfunc MoreOrEqual(a, b interface{}) bool {\n\tswitch x := a.(type) {\n\tcase uint:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) >= float64(y)\n\t\t}\n\tcase uint8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) >= float64(y)\n\t\t}\n\tcase uint16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) >= float64(y)\n\t\t}\n\tcase uint32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) >= float64(y)\n\t\t}\n\tcase uint64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) >= float64(y)\n\t\t}\n\tcase int:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) >= float64(y)\n\t\t}\n\tcase int8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) >= float64(y)\n\t\t}\n\tcase int16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) >= float64(y)\n\t\t}\n\tcase int32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) >= float64(y)\n\t\t}\n\tcase int64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int8:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int16:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int32:\n\t\t\treturn int(x) >= int(y)\n\t\tcase int64:\n\t\t\treturn int(x) >= int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) >= float64(y)\n\t\t}\n\tcase float32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) >= float64(y)\n\t\t}\n\tcase float64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) >= float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) >= float64(y)\n\t\t}\n\tcase string:\n\t\tswitch y := b.(type) {\n\t\tcase string:\n\t\t\treturn x >= y\n\t\t}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn x.After(y) || x.Equal(y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x >= y\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T >= %T\", a, b))\n}\n\nfunc Add(a, b interface{}) interface{} {\n\tswitch x := a.(type) {\n\tcase uint:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) + int(y)\n\t\tcase int:\n\t\t\treturn int(x) + int(y)\n\t\tcase int8:\n\t\t\treturn int(x) + int(y)\n\t\tcase int16:\n\t\t\treturn int(x) + int(y)\n\t\tcase int32:\n\t\t\treturn int(x) + int(y)\n\t\tcase int64:\n\t\t\treturn int(x) + int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) + float64(y)\n\t\t}\n\tcase uint8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) + int(y)\n\t\tcase int:\n\t\t\treturn int(x) + int(y)\n\t\tcase int8:\n\t\t\treturn int(x) + int(y)\n\t\tcase int16:\n\t\t\treturn int(x) + int(y)\n\t\tcase int32:\n\t\t\treturn int(x) + int(y)\n\t\tcase int64:\n\t\t\treturn int(x) + int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) + float64(y)\n\t\t}\n\tcase uint16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) + int(y)\n\t\tcase int:\n\t\t\treturn int(x) + int(y)\n\t\tcase int8:\n\t\t\treturn int(x) + int(y)\n\t\tcase int16:\n\t\t\treturn int(x) + int(y)\n\t\tcase int32:\n\t\t\treturn int(x) + int(y)\n\t\tcase int64:\n\t\t\treturn int(x) + int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) + float64(y)\n\t\t}\n\tcase uint32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) + int(y)\n\t\tcase int:\n\t\t\treturn int(x) + int(y)\n\t\tcase int8:\n\t\t\treturn int(x) + int(y)\n\t\tcase int16:\n\t\t\treturn int(x) + int(y)\n\t\tcase int32:\n\t\t\treturn int(x) + int(y)\n\t\tcase int64:\n\t\t\treturn int(x) + int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) + float64(y)\n\t\t}\n\tcase uint64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) + int(y)\n\t\tcase int:\n\t\t\treturn int(x) + int(y)\n\t\tcase int8:\n\t\t\treturn int(x) + int(y)\n\t\tcase int16:\n\t\t\treturn int(x) + int(y)\n\t\tcase int32:\n\t\t\treturn int(x) + int(y)\n\t\tcase int64:\n\t\t\treturn int(x) + int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) + float64(y)\n\t\t}\n\tcase int:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) + int(y)\n\t\tcase int:\n\t\t\treturn int(x) + int(y)\n\t\tcase int8:\n\t\t\treturn int(x) + int(y)\n\t\tcase int16:\n\t\t\treturn int(x) + int(y)\n\t\tcase int32:\n\t\t\treturn int(x) + int(y)\n\t\tcase int64:\n\t\t\treturn int(x) + int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) + float64(y)\n\t\t}\n\tcase int8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) + int(y)\n\t\tcase int:\n\t\t\treturn int(x) + int(y)\n\t\tcase int8:\n\t\t\treturn int(x) + int(y)\n\t\tcase int16:\n\t\t\treturn int(x) + int(y)\n\t\tcase int32:\n\t\t\treturn int(x) + int(y)\n\t\tcase int64:\n\t\t\treturn int(x) + int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) + float64(y)\n\t\t}\n\tcase int16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) + int(y)\n\t\tcase int:\n\t\t\treturn int(x) + int(y)\n\t\tcase int8:\n\t\t\treturn int(x) + int(y)\n\t\tcase int16:\n\t\t\treturn int(x) + int(y)\n\t\tcase int32:\n\t\t\treturn int(x) + int(y)\n\t\tcase int64:\n\t\t\treturn int(x) + int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) + float64(y)\n\t\t}\n\tcase int32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) + int(y)\n\t\tcase int:\n\t\t\treturn int(x) + int(y)\n\t\tcase int8:\n\t\t\treturn int(x) + int(y)\n\t\tcase int16:\n\t\t\treturn int(x) + int(y)\n\t\tcase int32:\n\t\t\treturn int(x) + int(y)\n\t\tcase int64:\n\t\t\treturn int(x) + int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) + float64(y)\n\t\t}\n\tcase int64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) + int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) + int(y)\n\t\tcase int:\n\t\t\treturn int(x) + int(y)\n\t\tcase int8:\n\t\t\treturn int(x) + int(y)\n\t\tcase int16:\n\t\t\treturn int(x) + int(y)\n\t\tcase int32:\n\t\t\treturn int(x) + int(y)\n\t\tcase int64:\n\t\t\treturn int(x) + int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) + float64(y)\n\t\t}\n\tcase float32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) + float64(y)\n\t\t}\n\tcase float64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) + float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) + float64(y)\n\t\t}\n\tcase string:\n\t\tswitch y := b.(type) {\n\t\tcase string:\n\t\t\treturn x + y\n\t\t}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x.Add(y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn y.Add(x)\n\t\tcase time.Duration:\n\t\t\treturn x + y\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T + %T\", a, b))\n}\n\nfunc Subtract(a, b interface{}) interface{} {\n\tswitch x := a.(type) {\n\tcase uint:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) - int(y)\n\t\tcase int:\n\t\t\treturn int(x) - int(y)\n\t\tcase int8:\n\t\t\treturn int(x) - int(y)\n\t\tcase int16:\n\t\t\treturn int(x) - int(y)\n\t\tcase int32:\n\t\t\treturn int(x) - int(y)\n\t\tcase int64:\n\t\t\treturn int(x) - int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) - float64(y)\n\t\t}\n\tcase uint8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) - int(y)\n\t\tcase int:\n\t\t\treturn int(x) - int(y)\n\t\tcase int8:\n\t\t\treturn int(x) - int(y)\n\t\tcase int16:\n\t\t\treturn int(x) - int(y)\n\t\tcase int32:\n\t\t\treturn int(x) - int(y)\n\t\tcase int64:\n\t\t\treturn int(x) - int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) - float64(y)\n\t\t}\n\tcase uint16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) - int(y)\n\t\tcase int:\n\t\t\treturn int(x) - int(y)\n\t\tcase int8:\n\t\t\treturn int(x) - int(y)\n\t\tcase int16:\n\t\t\treturn int(x) - int(y)\n\t\tcase int32:\n\t\t\treturn int(x) - int(y)\n\t\tcase int64:\n\t\t\treturn int(x) - int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) - float64(y)\n\t\t}\n\tcase uint32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) - int(y)\n\t\tcase int:\n\t\t\treturn int(x) - int(y)\n\t\tcase int8:\n\t\t\treturn int(x) - int(y)\n\t\tcase int16:\n\t\t\treturn int(x) - int(y)\n\t\tcase int32:\n\t\t\treturn int(x) - int(y)\n\t\tcase int64:\n\t\t\treturn int(x) - int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) - float64(y)\n\t\t}\n\tcase uint64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) - int(y)\n\t\tcase int:\n\t\t\treturn int(x) - int(y)\n\t\tcase int8:\n\t\t\treturn int(x) - int(y)\n\t\tcase int16:\n\t\t\treturn int(x) - int(y)\n\t\tcase int32:\n\t\t\treturn int(x) - int(y)\n\t\tcase int64:\n\t\t\treturn int(x) - int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) - float64(y)\n\t\t}\n\tcase int:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) - int(y)\n\t\tcase int:\n\t\t\treturn int(x) - int(y)\n\t\tcase int8:\n\t\t\treturn int(x) - int(y)\n\t\tcase int16:\n\t\t\treturn int(x) - int(y)\n\t\tcase int32:\n\t\t\treturn int(x) - int(y)\n\t\tcase int64:\n\t\t\treturn int(x) - int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) - float64(y)\n\t\t}\n\tcase int8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) - int(y)\n\t\tcase int:\n\t\t\treturn int(x) - int(y)\n\t\tcase int8:\n\t\t\treturn int(x) - int(y)\n\t\tcase int16:\n\t\t\treturn int(x) - int(y)\n\t\tcase int32:\n\t\t\treturn int(x) - int(y)\n\t\tcase int64:\n\t\t\treturn int(x) - int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) - float64(y)\n\t\t}\n\tcase int16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) - int(y)\n\t\tcase int:\n\t\t\treturn int(x) - int(y)\n\t\tcase int8:\n\t\t\treturn int(x) - int(y)\n\t\tcase int16:\n\t\t\treturn int(x) - int(y)\n\t\tcase int32:\n\t\t\treturn int(x) - int(y)\n\t\tcase int64:\n\t\t\treturn int(x) - int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) - float64(y)\n\t\t}\n\tcase int32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) - int(y)\n\t\tcase int:\n\t\t\treturn int(x) - int(y)\n\t\tcase int8:\n\t\t\treturn int(x) - int(y)\n\t\tcase int16:\n\t\t\treturn int(x) - int(y)\n\t\tcase int32:\n\t\t\treturn int(x) - int(y)\n\t\tcase int64:\n\t\t\treturn int(x) - int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) - float64(y)\n\t\t}\n\tcase int64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) - int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) - int(y)\n\t\tcase int:\n\t\t\treturn int(x) - int(y)\n\t\tcase int8:\n\t\t\treturn int(x) - int(y)\n\t\tcase int16:\n\t\t\treturn int(x) - int(y)\n\t\tcase int32:\n\t\t\treturn int(x) - int(y)\n\t\tcase int64:\n\t\t\treturn int(x) - int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) - float64(y)\n\t\t}\n\tcase float32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) - float64(y)\n\t\t}\n\tcase float64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) - float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) - float64(y)\n\t\t}\n\tcase time.Time:\n\t\tswitch y := b.(type) {\n\t\tcase time.Time:\n\t\t\treturn x.Sub(y)\n\t\tcase time.Duration:\n\t\t\treturn x.Add(-y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase time.Duration:\n\t\t\treturn x - y\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T - %T\", a, b))\n}\n\nfunc Multiply(a, b interface{}) interface{} {\n\tswitch x := a.(type) {\n\tcase uint:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) * int(y)\n\t\tcase int:\n\t\t\treturn int(x) * int(y)\n\t\tcase int8:\n\t\t\treturn int(x) * int(y)\n\t\tcase int16:\n\t\t\treturn int(x) * int(y)\n\t\tcase int32:\n\t\t\treturn int(x) * int(y)\n\t\tcase int64:\n\t\t\treturn int(x) * int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase time.Duration:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\t}\n\tcase uint8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) * int(y)\n\t\tcase int:\n\t\t\treturn int(x) * int(y)\n\t\tcase int8:\n\t\t\treturn int(x) * int(y)\n\t\tcase int16:\n\t\t\treturn int(x) * int(y)\n\t\tcase int32:\n\t\t\treturn int(x) * int(y)\n\t\tcase int64:\n\t\t\treturn int(x) * int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase time.Duration:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\t}\n\tcase uint16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) * int(y)\n\t\tcase int:\n\t\t\treturn int(x) * int(y)\n\t\tcase int8:\n\t\t\treturn int(x) * int(y)\n\t\tcase int16:\n\t\t\treturn int(x) * int(y)\n\t\tcase int32:\n\t\t\treturn int(x) * int(y)\n\t\tcase int64:\n\t\t\treturn int(x) * int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase time.Duration:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\t}\n\tcase uint32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) * int(y)\n\t\tcase int:\n\t\t\treturn int(x) * int(y)\n\t\tcase int8:\n\t\t\treturn int(x) * int(y)\n\t\tcase int16:\n\t\t\treturn int(x) * int(y)\n\t\tcase int32:\n\t\t\treturn int(x) * int(y)\n\t\tcase int64:\n\t\t\treturn int(x) * int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase time.Duration:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\t}\n\tcase uint64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) * int(y)\n\t\tcase int:\n\t\t\treturn int(x) * int(y)\n\t\tcase int8:\n\t\t\treturn int(x) * int(y)\n\t\tcase int16:\n\t\t\treturn int(x) * int(y)\n\t\tcase int32:\n\t\t\treturn int(x) * int(y)\n\t\tcase int64:\n\t\t\treturn int(x) * int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase time.Duration:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\t}\n\tcase int:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) * int(y)\n\t\tcase int:\n\t\t\treturn int(x) * int(y)\n\t\tcase int8:\n\t\t\treturn int(x) * int(y)\n\t\tcase int16:\n\t\t\treturn int(x) * int(y)\n\t\tcase int32:\n\t\t\treturn int(x) * int(y)\n\t\tcase int64:\n\t\t\treturn int(x) * int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase time.Duration:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\t}\n\tcase int8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) * int(y)\n\t\tcase int:\n\t\t\treturn int(x) * int(y)\n\t\tcase int8:\n\t\t\treturn int(x) * int(y)\n\t\tcase int16:\n\t\t\treturn int(x) * int(y)\n\t\tcase int32:\n\t\t\treturn int(x) * int(y)\n\t\tcase int64:\n\t\t\treturn int(x) * int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase time.Duration:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\t}\n\tcase int16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) * int(y)\n\t\tcase int:\n\t\t\treturn int(x) * int(y)\n\t\tcase int8:\n\t\t\treturn int(x) * int(y)\n\t\tcase int16:\n\t\t\treturn int(x) * int(y)\n\t\tcase int32:\n\t\t\treturn int(x) * int(y)\n\t\tcase int64:\n\t\t\treturn int(x) * int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase time.Duration:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\t}\n\tcase int32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) * int(y)\n\t\tcase int:\n\t\t\treturn int(x) * int(y)\n\t\tcase int8:\n\t\t\treturn int(x) * int(y)\n\t\tcase int16:\n\t\t\treturn int(x) * int(y)\n\t\tcase int32:\n\t\t\treturn int(x) * int(y)\n\t\tcase int64:\n\t\t\treturn int(x) * int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase time.Duration:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\t}\n\tcase int64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) * int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) * int(y)\n\t\tcase int:\n\t\t\treturn int(x) * int(y)\n\t\tcase int8:\n\t\t\treturn int(x) * int(y)\n\t\tcase int16:\n\t\t\treturn int(x) * int(y)\n\t\tcase int32:\n\t\t\treturn int(x) * int(y)\n\t\tcase int64:\n\t\t\treturn int(x) * int(y)\n\t\tcase float32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase time.Duration:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\t}\n\tcase float32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase time.Duration:\n\t\t\treturn float64(x) * float64(y)\n\t\t}\n\tcase float64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase time.Duration:\n\t\t\treturn float64(x) * float64(y)\n\t\t}\n\tcase time.Duration:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\tcase uint8:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\tcase uint16:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\tcase uint32:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\tcase uint64:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\tcase int:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\tcase int8:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\tcase int16:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\tcase int32:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\tcase int64:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\tcase float32:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) * float64(y)\n\t\tcase time.Duration:\n\t\t\treturn time.Duration(x) * time.Duration(y)\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T * %T\", a, b))\n}\n\nfunc Divide(a, b interface{}) float64 {\n\tswitch x := a.(type) {\n\tcase uint:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) / float64(y)\n\t\t}\n\tcase uint8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) / float64(y)\n\t\t}\n\tcase uint16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) / float64(y)\n\t\t}\n\tcase uint32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) / float64(y)\n\t\t}\n\tcase uint64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) / float64(y)\n\t\t}\n\tcase int:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) / float64(y)\n\t\t}\n\tcase int8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) / float64(y)\n\t\t}\n\tcase int16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) / float64(y)\n\t\t}\n\tcase int32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) / float64(y)\n\t\t}\n\tcase int64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) / float64(y)\n\t\t}\n\tcase float32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) / float64(y)\n\t\t}\n\tcase float64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase uint64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int8:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int16:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase int64:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float32:\n\t\t\treturn float64(x) / float64(y)\n\t\tcase float64:\n\t\t\treturn float64(x) / float64(y)\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T / %T\", a, b))\n}\n\nfunc Modulo(a, b interface{}) int {\n\tswitch x := a.(type) {\n\tcase uint:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) % int(y)\n\t\tcase int:\n\t\t\treturn int(x) % int(y)\n\t\tcase int8:\n\t\t\treturn int(x) % int(y)\n\t\tcase int16:\n\t\t\treturn int(x) % int(y)\n\t\tcase int32:\n\t\t\treturn int(x) % int(y)\n\t\tcase int64:\n\t\t\treturn int(x) % int(y)\n\t\t}\n\tcase uint8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) % int(y)\n\t\tcase int:\n\t\t\treturn int(x) % int(y)\n\t\tcase int8:\n\t\t\treturn int(x) % int(y)\n\t\tcase int16:\n\t\t\treturn int(x) % int(y)\n\t\tcase int32:\n\t\t\treturn int(x) % int(y)\n\t\tcase int64:\n\t\t\treturn int(x) % int(y)\n\t\t}\n\tcase uint16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) % int(y)\n\t\tcase int:\n\t\t\treturn int(x) % int(y)\n\t\tcase int8:\n\t\t\treturn int(x) % int(y)\n\t\tcase int16:\n\t\t\treturn int(x) % int(y)\n\t\tcase int32:\n\t\t\treturn int(x) % int(y)\n\t\tcase int64:\n\t\t\treturn int(x) % int(y)\n\t\t}\n\tcase uint32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) % int(y)\n\t\tcase int:\n\t\t\treturn int(x) % int(y)\n\t\tcase int8:\n\t\t\treturn int(x) % int(y)\n\t\tcase int16:\n\t\t\treturn int(x) % int(y)\n\t\tcase int32:\n\t\t\treturn int(x) % int(y)\n\t\tcase int64:\n\t\t\treturn int(x) % int(y)\n\t\t}\n\tcase uint64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) % int(y)\n\t\tcase int:\n\t\t\treturn int(x) % int(y)\n\t\tcase int8:\n\t\t\treturn int(x) % int(y)\n\t\tcase int16:\n\t\t\treturn int(x) % int(y)\n\t\tcase int32:\n\t\t\treturn int(x) % int(y)\n\t\tcase int64:\n\t\t\treturn int(x) % int(y)\n\t\t}\n\tcase int:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) % int(y)\n\t\tcase int:\n\t\t\treturn int(x) % int(y)\n\t\tcase int8:\n\t\t\treturn int(x) % int(y)\n\t\tcase int16:\n\t\t\treturn int(x) % int(y)\n\t\tcase int32:\n\t\t\treturn int(x) % int(y)\n\t\tcase int64:\n\t\t\treturn int(x) % int(y)\n\t\t}\n\tcase int8:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) % int(y)\n\t\tcase int:\n\t\t\treturn int(x) % int(y)\n\t\tcase int8:\n\t\t\treturn int(x) % int(y)\n\t\tcase int16:\n\t\t\treturn int(x) % int(y)\n\t\tcase int32:\n\t\t\treturn int(x) % int(y)\n\t\tcase int64:\n\t\t\treturn int(x) % int(y)\n\t\t}\n\tcase int16:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) % int(y)\n\t\tcase int:\n\t\t\treturn int(x) % int(y)\n\t\tcase int8:\n\t\t\treturn int(x) % int(y)\n\t\tcase int16:\n\t\t\treturn int(x) % int(y)\n\t\tcase int32:\n\t\t\treturn int(x) % int(y)\n\t\tcase int64:\n\t\t\treturn int(x) % int(y)\n\t\t}\n\tcase int32:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) % int(y)\n\t\tcase int:\n\t\t\treturn int(x) % int(y)\n\t\tcase int8:\n\t\t\treturn int(x) % int(y)\n\t\tcase int16:\n\t\t\treturn int(x) % int(y)\n\t\tcase int32:\n\t\t\treturn int(x) % int(y)\n\t\tcase int64:\n\t\t\treturn int(x) % int(y)\n\t\t}\n\tcase int64:\n\t\tswitch y := b.(type) {\n\t\tcase uint:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint8:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint16:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint32:\n\t\t\treturn int(x) % int(y)\n\t\tcase uint64:\n\t\t\treturn int(x) % int(y)\n\t\tcase int:\n\t\t\treturn int(x) % int(y)\n\t\tcase int8:\n\t\t\treturn int(x) % int(y)\n\t\tcase int16:\n\t\t\treturn int(x) % int(y)\n\t\tcase int32:\n\t\t\treturn int(x) % int(y)\n\t\tcase int64:\n\t\t\treturn int(x) % int(y)\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"invalid operation: %T %% %T\", a, b))\n}\n"
  },
  {
    "path": "vm/runtime/helpers_test.go",
    "content": "package runtime_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr/internal/testify/assert\"\n\n\t\"github.com/expr-lang/expr/vm/runtime\"\n)\n\nvar tests = []struct {\n\tname string\n\ta, b any\n\twant bool\n}{\n\t{\"int == int\", 42, 42, true},\n\t{\"int != int\", 42, 33, false},\n\t{\"int == int8\", 42, int8(42), true},\n\t{\"int == int16\", 42, int16(42), true},\n\t{\"int == int32\", 42, int32(42), true},\n\t{\"int == int64\", 42, int64(42), true},\n\t{\"float == float\", 42.0, 42.0, true},\n\t{\"float != float\", 42.0, 33.0, false},\n\t{\"float == int\", 42.0, 42, true},\n\t{\"float != int\", 42.0, 33, false},\n\t{\"string == string\", \"foo\", \"foo\", true},\n\t{\"string != string\", \"foo\", \"bar\", false},\n\t{\"bool == bool\", true, true, true},\n\t{\"bool != bool\", true, false, false},\n\t{\"[]any == []int\", []any{1, 2, 3}, []int{1, 2, 3}, true},\n\t{\"[]any != []int\", []any{1, 2, 3}, []int{1, 2, 99}, false},\n\t{\"deep []any == []any\", []any{[]int{1}, 2, []any{\"3\"}}, []any{[]any{1}, 2, []string{\"3\"}}, true},\n\t{\"deep []any != []any\", []any{[]int{1}, 2, []any{\"3\", \"42\"}}, []any{[]any{1}, 2, []string{\"3\"}}, false},\n\t{\"map[string]any == map[string]any\", map[string]any{\"a\": 1}, map[string]any{\"a\": 1}, true},\n\t{\"map[string]any != map[string]any\", map[string]any{\"a\": 1}, map[string]any{\"a\": 1, \"b\": 2}, false},\n}\n\nfunc TestEqual(t *testing.T) {\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgot := runtime.Equal(tt.a, tt.b)\n\t\t\tassert.Equal(t, tt.want, got, \"Equal(%v, %v) = %v; want %v\", tt.a, tt.b, got, tt.want)\n\t\t\tgot = runtime.Equal(tt.b, tt.a)\n\t\t\tassert.Equal(t, tt.want, got, \"Equal(%v, %v) = %v; want %v\", tt.b, tt.a, got, tt.want)\n\t\t})\n\t}\n\n}\n\nfunc BenchmarkEqual(b *testing.B) {\n\tfor _, tt := range tests {\n\t\tb.Run(tt.name, func(b *testing.B) {\n\t\t\tfor i := 0; i < b.N; i++ {\n\t\t\t\truntime.Equal(tt.a, tt.b)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "vm/runtime/runtime.go",
    "content": "package runtime\n\n//go:generate sh -c \"go run ./helpers > ./helpers[generated].go\"\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"reflect\"\n\t\"sync\"\n\n\t\"github.com/expr-lang/expr/internal/deref\"\n)\n\nvar fieldCache sync.Map\n\ntype fieldCacheKey struct {\n\tt reflect.Type\n\tf string\n}\n\nfunc Fetch(from, i any) any {\n\tv := reflect.ValueOf(from)\n\tif v.Kind() == reflect.Invalid {\n\t\tpanic(fmt.Sprintf(\"cannot fetch %v from %T\", i, from))\n\t}\n\n\t// Methods can be defined on any type.\n\tif v.NumMethod() > 0 {\n\t\tif methodName, ok := i.(string); ok {\n\t\t\tmethod := v.MethodByName(methodName)\n\t\t\tif method.IsValid() {\n\t\t\t\treturn method.Interface()\n\t\t\t}\n\t\t}\n\t}\n\n\t// Structs, maps, and slices can be access through a pointer or through\n\t// a value, when they are accessed through a pointer we don't want to\n\t// copy them to a value.\n\t// De-reference everything if necessary (interface and pointers)\n\tv = deref.Value(v)\n\n\tswitch v.Kind() {\n\tcase reflect.Array, reflect.Slice, reflect.String:\n\t\tindex := ToInt(i)\n\t\tl := v.Len()\n\t\tif index < 0 {\n\t\t\tindex = l + index\n\t\t}\n\t\tif index < 0 || index >= l {\n\t\t\tpanic(fmt.Sprintf(\"index out of range: %v (array length is %v)\", index, l))\n\t\t}\n\t\tvalue := v.Index(index)\n\t\tif value.IsValid() {\n\t\t\treturn value.Interface()\n\t\t}\n\n\tcase reflect.Map:\n\t\tvar value reflect.Value\n\t\tif i == nil {\n\t\t\tvalue = v.MapIndex(reflect.Zero(v.Type().Key()))\n\t\t} else {\n\t\t\tvalue = v.MapIndex(reflect.ValueOf(i))\n\t\t}\n\t\tif value.IsValid() {\n\t\t\treturn value.Interface()\n\t\t} else {\n\t\t\telem := reflect.TypeOf(from).Elem()\n\t\t\treturn reflect.Zero(elem).Interface()\n\t\t}\n\n\tcase reflect.Struct:\n\t\tfieldName := i.(string)\n\t\tt := v.Type()\n\t\tkey := fieldCacheKey{\n\t\t\tt: t,\n\t\t\tf: fieldName,\n\t\t}\n\t\tif cv, ok := fieldCache.Load(key); ok {\n\t\t\treturn v.FieldByIndex(cv.([]int)).Interface()\n\t\t}\n\t\tfield, ok := t.FieldByNameFunc(func(name string) bool {\n\t\t\tfield, _ := t.FieldByName(name)\n\t\t\tswitch field.Tag.Get(\"expr\") {\n\t\t\tcase \"-\":\n\t\t\t\treturn false\n\t\t\tcase fieldName:\n\t\t\t\treturn true\n\t\t\tdefault:\n\t\t\t\treturn name == fieldName\n\t\t\t}\n\t\t})\n\t\tif ok && field.IsExported() {\n\t\t\tvalue := v.FieldByIndex(field.Index)\n\t\t\tif value.IsValid() {\n\t\t\t\tfieldCache.Store(key, field.Index)\n\t\t\t\treturn value.Interface()\n\t\t\t}\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"cannot fetch %v from %T\", i, from))\n}\n\ntype Field struct {\n\tIndex []int\n\tPath  []string\n}\n\nfunc FetchField(from any, field *Field) any {\n\tv := reflect.ValueOf(from)\n\tif v.Kind() != reflect.Invalid {\n\t\tv = reflect.Indirect(v)\n\n\t\t// We can use v.FieldByIndex here, but it will panic if the field\n\t\t// is not exists. And we need to recover() to generate a more\n\t\t// user-friendly error message.\n\t\t// Also, our fieldByIndex() function is slightly faster than the\n\t\t// v.FieldByIndex() function as we don't need to verify what a field\n\t\t// is a struct as we already did it on compilation step.\n\t\tvalue := fieldByIndex(v, field)\n\t\tif value.IsValid() {\n\t\t\treturn value.Interface()\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"cannot get %v from %T\", field.Path[0], from))\n}\n\nfunc fieldByIndex(v reflect.Value, field *Field) reflect.Value {\n\tif len(field.Index) == 1 {\n\t\treturn v.Field(field.Index[0])\n\t}\n\tfor i, x := range field.Index {\n\t\tif i > 0 {\n\t\t\tif v.Kind() == reflect.Ptr {\n\t\t\t\tif v.IsNil() {\n\t\t\t\t\tpanic(fmt.Sprintf(\"cannot get %v from %v\", field.Path[i], field.Path[i-1]))\n\t\t\t\t}\n\t\t\t\tv = v.Elem()\n\t\t\t}\n\t\t}\n\t\tv = v.Field(x)\n\t}\n\treturn v\n}\n\ntype Method struct {\n\tIndex int\n\tName  string\n}\n\nfunc FetchMethod(from any, method *Method) any {\n\tv := reflect.ValueOf(from)\n\tkind := v.Kind()\n\tif kind != reflect.Invalid {\n\t\t// Methods can be defined on any type, no need to dereference.\n\t\tmethod := v.Method(method.Index)\n\t\tif method.IsValid() {\n\t\t\treturn method.Interface()\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"cannot fetch %v from %T\", method.Name, from))\n}\n\nfunc Slice(array, from, to any) any {\n\tv := reflect.ValueOf(array)\n\n\tswitch v.Kind() {\n\tcase reflect.Array, reflect.Slice, reflect.String:\n\t\tlength := v.Len()\n\t\ta, b := ToInt(from), ToInt(to)\n\t\tif a < 0 {\n\t\t\ta = length + a\n\t\t}\n\t\tif a < 0 {\n\t\t\ta = 0\n\t\t}\n\t\tif b < 0 {\n\t\t\tb = length + b\n\t\t}\n\t\tif b < 0 {\n\t\t\tb = 0\n\t\t}\n\t\tif b > length {\n\t\t\tb = length\n\t\t}\n\t\tif a > b {\n\t\t\ta = b\n\t\t}\n\t\tif v.Kind() == reflect.Array && !v.CanAddr() {\n\t\t\tnewValue := reflect.New(v.Type()).Elem()\n\t\t\tnewValue.Set(v)\n\t\t\tv = newValue\n\t\t}\n\t\tvalue := v.Slice(a, b)\n\t\tif value.IsValid() {\n\t\t\treturn value.Interface()\n\t\t}\n\n\tcase reflect.Ptr:\n\t\tvalue := v.Elem()\n\t\tif value.IsValid() {\n\t\t\treturn Slice(value.Interface(), from, to)\n\t\t}\n\n\t}\n\tpanic(fmt.Sprintf(\"cannot slice %v\", from))\n}\n\nfunc In(needle any, array any) bool {\n\tif array == nil {\n\t\treturn false\n\t}\n\tv := reflect.ValueOf(array)\n\n\tswitch v.Kind() {\n\n\tcase reflect.Array, reflect.Slice:\n\t\tfor i := 0; i < v.Len(); i++ {\n\t\t\tvalue := v.Index(i)\n\t\t\tif value.IsValid() {\n\t\t\t\tif Equal(value.Interface(), needle) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false\n\n\tcase reflect.Map:\n\t\tvar value reflect.Value\n\t\tif needle == nil {\n\t\t\tvalue = v.MapIndex(reflect.Zero(v.Type().Key()))\n\t\t} else {\n\t\t\tvalue = v.MapIndex(reflect.ValueOf(needle))\n\t\t}\n\t\tif value.IsValid() {\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\n\tcase reflect.Struct:\n\t\tn := reflect.ValueOf(needle)\n\t\tif !n.IsValid() || n.Kind() != reflect.String {\n\t\t\tpanic(fmt.Sprintf(\"cannot use %T as field name of %T\", needle, array))\n\t\t}\n\t\tfield, ok := v.Type().FieldByName(n.String())\n\t\tif !ok || !field.IsExported() || field.Tag.Get(\"expr\") == \"-\" {\n\t\t\treturn false\n\t\t}\n\t\tvalue := v.FieldByIndex(field.Index)\n\t\tif value.IsValid() {\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\n\tcase reflect.Ptr:\n\t\tvalue := v.Elem()\n\t\tif value.IsValid() {\n\t\t\treturn In(needle, value.Interface())\n\t\t}\n\t\treturn false\n\t}\n\n\tpanic(fmt.Sprintf(`operator \"in\" not defined on %T`, array))\n}\n\nfunc Len(a any) int {\n\tv := reflect.ValueOf(a)\n\tswitch v.Kind() {\n\tcase reflect.Array, reflect.Slice, reflect.Map, reflect.String:\n\t\treturn v.Len()\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"invalid argument for len (type %T)\", a))\n\t}\n}\n\nfunc Negate(i any) any {\n\tswitch v := i.(type) {\n\tcase float32:\n\t\treturn -v\n\tcase float64:\n\t\treturn -v\n\tcase int:\n\t\treturn -v\n\tcase int8:\n\t\treturn -v\n\tcase int16:\n\t\treturn -v\n\tcase int32:\n\t\treturn -v\n\tcase int64:\n\t\treturn -v\n\tcase uint:\n\t\treturn -v\n\tcase uint8:\n\t\treturn -v\n\tcase uint16:\n\t\treturn -v\n\tcase uint32:\n\t\treturn -v\n\tcase uint64:\n\t\treturn -v\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"invalid operation: - %T\", v))\n\t}\n}\n\nfunc Exponent(a, b any) float64 {\n\treturn math.Pow(ToFloat64(a), ToFloat64(b))\n}\n\nfunc MakeRange(min, max int) []int {\n\tsize := max - min + 1\n\tif size <= 0 {\n\t\treturn []int{}\n\t}\n\trng := make([]int, size)\n\tfor i := range rng {\n\t\trng[i] = min + i\n\t}\n\treturn rng\n}\n\nfunc ToInt(a any) int {\n\tswitch x := a.(type) {\n\tcase float32:\n\t\treturn int(x)\n\tcase float64:\n\t\treturn int(x)\n\tcase int:\n\t\treturn x\n\tcase int8:\n\t\treturn int(x)\n\tcase int16:\n\t\treturn int(x)\n\tcase int32:\n\t\treturn int(x)\n\tcase int64:\n\t\treturn int(x)\n\tcase uint:\n\t\treturn int(x)\n\tcase uint8:\n\t\treturn int(x)\n\tcase uint16:\n\t\treturn int(x)\n\tcase uint32:\n\t\treturn int(x)\n\tcase uint64:\n\t\treturn int(x)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"invalid operation: int(%T)\", x))\n\t}\n}\n\nfunc ToInt64(a any) int64 {\n\tswitch x := a.(type) {\n\tcase float32:\n\t\treturn int64(x)\n\tcase float64:\n\t\treturn int64(x)\n\tcase int:\n\t\treturn int64(x)\n\tcase int8:\n\t\treturn int64(x)\n\tcase int16:\n\t\treturn int64(x)\n\tcase int32:\n\t\treturn int64(x)\n\tcase int64:\n\t\treturn x\n\tcase uint:\n\t\treturn int64(x)\n\tcase uint8:\n\t\treturn int64(x)\n\tcase uint16:\n\t\treturn int64(x)\n\tcase uint32:\n\t\treturn int64(x)\n\tcase uint64:\n\t\treturn int64(x)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"invalid operation: int64(%T)\", x))\n\t}\n}\n\nfunc ToFloat64(a any) float64 {\n\tswitch x := a.(type) {\n\tcase float32:\n\t\treturn float64(x)\n\tcase float64:\n\t\treturn x\n\tcase int:\n\t\treturn float64(x)\n\tcase int8:\n\t\treturn float64(x)\n\tcase int16:\n\t\treturn float64(x)\n\tcase int32:\n\t\treturn float64(x)\n\tcase int64:\n\t\treturn float64(x)\n\tcase uint:\n\t\treturn float64(x)\n\tcase uint8:\n\t\treturn float64(x)\n\tcase uint16:\n\t\treturn float64(x)\n\tcase uint32:\n\t\treturn float64(x)\n\tcase uint64:\n\t\treturn float64(x)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"invalid operation: float(%T)\", x))\n\t}\n}\n\nfunc ToBool(a any) bool {\n\tif a == nil {\n\t\treturn false\n\t}\n\tswitch x := a.(type) {\n\tcase bool:\n\t\treturn x\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"invalid operation: bool(%T)\", x))\n\t}\n}\n\nfunc IsNil(v any) bool {\n\tif v == nil {\n\t\treturn true\n\t}\n\tr := reflect.ValueOf(v)\n\tswitch r.Kind() {\n\tcase reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Slice:\n\t\treturn r.IsNil()\n\tdefault:\n\t\treturn false\n\t}\n}\n"
  },
  {
    "path": "vm/runtime/sort.go",
    "content": "package runtime\n\ntype SortBy struct {\n\tDesc   bool\n\tArray  []any\n\tValues []any\n}\n\nfunc (s *SortBy) Len() int {\n\treturn len(s.Array)\n}\n\nfunc (s *SortBy) Swap(i, j int) {\n\ts.Array[i], s.Array[j] = s.Array[j], s.Array[i]\n\ts.Values[i], s.Values[j] = s.Values[j], s.Values[i]\n}\n\nfunc (s *SortBy) Less(i, j int) bool {\n\ta, b := s.Values[i], s.Values[j]\n\tif s.Desc {\n\t\treturn Less(b, a)\n\t}\n\treturn Less(a, b)\n}\n\ntype Sort struct {\n\tDesc  bool\n\tArray []any\n}\n\nfunc (s *Sort) Len() int {\n\treturn len(s.Array)\n}\n\nfunc (s *Sort) Swap(i, j int) {\n\ts.Array[i], s.Array[j] = s.Array[j], s.Array[i]\n}\n\nfunc (s *Sort) Less(i, j int) bool {\n\ta, b := s.Array[i], s.Array[j]\n\tif s.Desc {\n\t\treturn Less(b, a)\n\t}\n\treturn Less(a, b)\n}\n"
  },
  {
    "path": "vm/utils.go",
    "content": "package vm\n\nimport (\n\t\"reflect\"\n\t\"time\"\n)\n\ntype (\n\tFunction     = func(params ...any) (any, error)\n\tSafeFunction = func(params ...any) (any, uint, error)\n)\n\nvar (\n\terrorType = reflect.TypeOf((*error)(nil)).Elem()\n)\n\ntype Scope struct {\n\tArray reflect.Value\n\tIndex int\n\tLen   int\n\tCount int\n\tAcc   any\n\t// Fast paths\n\tInts    []int\n\tFloats  []float64\n\tStrings []string\n\tAnys    []any\n}\n\n// Item returns the current element from the scope using fast paths when available.\nfunc (s *Scope) Item() any {\n\tif s.Ints != nil {\n\t\treturn s.Ints[s.Index]\n\t}\n\tif s.Floats != nil {\n\t\treturn s.Floats[s.Index]\n\t}\n\tif s.Strings != nil {\n\t\treturn s.Strings[s.Index]\n\t}\n\tif s.Anys != nil {\n\t\treturn s.Anys[s.Index]\n\t}\n\treturn s.Array.Index(s.Index).Interface()\n}\n\ntype groupBy = map[any][]any\n\ntype Span struct {\n\tName       string  `json:\"name\"`\n\tExpression string  `json:\"expression\"`\n\tDuration   int64   `json:\"duration\"`\n\tChildren   []*Span `json:\"children\"`\n\tstart      time.Time\n}\n\nfunc GetSpan(program *Program) *Span {\n\treturn program.span\n}\n"
  },
  {
    "path": "vm/vm.go",
    "content": "package vm\n\n//go:generate sh -c \"go run ./func_types > ./func_types[generated].go\"\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/builtin\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/file\"\n\t\"github.com/expr-lang/expr/internal/deref\"\n\t\"github.com/expr-lang/expr/vm/runtime\"\n)\n\nconst maxFnArgsBuf = 256\n\nfunc Run(program *Program, env any) (any, error) {\n\tif program == nil {\n\t\treturn nil, fmt.Errorf(\"program is nil\")\n\t}\n\tvm := VM{}\n\treturn vm.Run(program, env)\n}\n\nfunc Debug() *VM {\n\tvm := &VM{\n\t\tdebug: true,\n\t\tstep:  make(chan struct{}, 0),\n\t\tcurr:  make(chan int, 0),\n\t}\n\treturn vm\n}\n\ntype VM struct {\n\tStack        []any\n\tScopes       []*Scope\n\tVariables    []any\n\tMemoryBudget uint\n\tip           int\n\tmemory       uint\n\tdebug        bool\n\tstep         chan struct{}\n\tcurr         chan int\n\tscopePool    []Scope // Pre-allocated pool of Scope values; grows as needed but never shrinks\n\tscopePoolIdx int     // Current index into scopePool for allocation\n\tcurrScope    *Scope  // Cached pointer to the current scope (optimization)\n}\n\nfunc (vm *VM) Run(program *Program, env any) (_ any, err error) {\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\tvar location file.Location\n\t\t\tif vm.ip-1 < len(program.locations) {\n\t\t\t\tlocation = program.locations[vm.ip-1]\n\t\t\t}\n\t\t\tf := &file.Error{\n\t\t\t\tLocation: location,\n\t\t\t\tMessage:  fmt.Sprintf(\"%v\", r),\n\t\t\t}\n\t\t\tif err, ok := r.(error); ok {\n\t\t\t\tf.Wrap(err)\n\t\t\t}\n\t\t\terr = f.Bind(program.source)\n\t\t}\n\t}()\n\n\tif vm.Stack == nil {\n\t\tvm.Stack = make([]any, 0, 2)\n\t} else {\n\t\tclearSlice(vm.Stack)\n\t\tvm.Stack = vm.Stack[0:0]\n\t}\n\tif vm.Scopes != nil {\n\t\tclearSlice(vm.Scopes)\n\t\tvm.Scopes = vm.Scopes[0:0]\n\t}\n\tvm.scopePoolIdx = 0 // Reset pool index for reuse\n\tvm.currScope = nil\n\tif len(vm.Variables) < program.variables {\n\t\tvm.Variables = make([]any, program.variables)\n\t}\n\tif vm.MemoryBudget == 0 {\n\t\tvm.MemoryBudget = conf.DefaultMemoryBudget\n\t}\n\tvm.memory = 0\n\tvm.ip = 0\n\n\tvar fnArgsBuf []any\n\n\tfor vm.ip < len(program.Bytecode) {\n\t\tif debug && vm.debug {\n\t\t\t<-vm.step\n\t\t}\n\n\t\top := program.Bytecode[vm.ip]\n\t\targ := program.Arguments[vm.ip]\n\t\tvm.ip += 1\n\n\t\tswitch op {\n\n\t\tcase OpInvalid:\n\t\t\tpanic(\"invalid opcode\")\n\n\t\tcase OpPush:\n\t\t\tvm.push(program.Constants[arg])\n\n\t\tcase OpInt:\n\t\t\tvm.push(arg)\n\n\t\tcase OpPop:\n\t\t\tvm.pop()\n\n\t\tcase OpStore:\n\t\t\tvm.Variables[arg] = vm.pop()\n\n\t\tcase OpLoadVar:\n\t\t\tvm.push(vm.Variables[arg])\n\n\t\tcase OpLoadConst:\n\t\t\tvm.push(runtime.Fetch(env, program.Constants[arg]))\n\n\t\tcase OpLoadField:\n\t\t\tvm.push(runtime.FetchField(env, program.Constants[arg].(*runtime.Field)))\n\n\t\tcase OpLoadFast:\n\t\t\tvm.push(env.(map[string]any)[program.Constants[arg].(string)])\n\n\t\tcase OpLoadMethod:\n\t\t\tvm.push(runtime.FetchMethod(env, program.Constants[arg].(*runtime.Method)))\n\n\t\tcase OpLoadFunc:\n\t\t\tvm.push(program.functions[arg])\n\n\t\tcase OpFetch:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.Fetch(a, b))\n\n\t\tcase OpFetchField:\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.FetchField(a, program.Constants[arg].(*runtime.Field)))\n\n\t\tcase OpLoadEnv:\n\t\t\tvm.push(env)\n\n\t\tcase OpMethod:\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.FetchMethod(a, program.Constants[arg].(*runtime.Method)))\n\n\t\tcase OpTrue:\n\t\t\tvm.push(true)\n\n\t\tcase OpFalse:\n\t\t\tvm.push(false)\n\n\t\tcase OpNil:\n\t\t\tvm.push(nil)\n\n\t\tcase OpNegate:\n\t\t\tv := runtime.Negate(vm.pop())\n\t\t\tvm.push(v)\n\n\t\tcase OpNot:\n\t\t\tv := vm.pop().(bool)\n\t\t\tvm.push(!v)\n\n\t\tcase OpEqual:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.Equal(a, b))\n\n\t\tcase OpEqualInt:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(a.(int) == b.(int))\n\n\t\tcase OpEqualString:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(a.(string) == b.(string))\n\n\t\tcase OpJump:\n\t\t\tif arg < 0 {\n\t\t\t\tpanic(\"negative jump offset is invalid\")\n\t\t\t}\n\t\t\tvm.ip += arg\n\n\t\tcase OpJumpIfTrue:\n\t\t\tif arg < 0 {\n\t\t\t\tpanic(\"negative jump offset is invalid\")\n\t\t\t}\n\t\t\tif vm.current().(bool) {\n\t\t\t\tvm.ip += arg\n\t\t\t}\n\n\t\tcase OpJumpIfFalse:\n\t\t\tif arg < 0 {\n\t\t\t\tpanic(\"negative jump offset is invalid\")\n\t\t\t}\n\t\t\tif !vm.current().(bool) {\n\t\t\t\tvm.ip += arg\n\t\t\t}\n\n\t\tcase OpJumpIfNil:\n\t\t\tif arg < 0 {\n\t\t\t\tpanic(\"negative jump offset is invalid\")\n\t\t\t}\n\t\t\tif runtime.IsNil(vm.current()) {\n\t\t\t\tvm.ip += arg\n\t\t\t}\n\n\t\tcase OpJumpIfNotNil:\n\t\t\tif arg < 0 {\n\t\t\t\tpanic(\"negative jump offset is invalid\")\n\t\t\t}\n\t\t\tif !runtime.IsNil(vm.current()) {\n\t\t\t\tvm.ip += arg\n\t\t\t}\n\n\t\tcase OpJumpIfEnd:\n\t\t\tif arg < 0 {\n\t\t\t\tpanic(\"negative jump offset is invalid\")\n\t\t\t}\n\t\t\tif vm.currScope.Index >= vm.currScope.Len {\n\t\t\t\tvm.ip += arg\n\t\t\t}\n\n\t\tcase OpJumpBackward:\n\t\t\tvm.ip -= arg\n\n\t\tcase OpIn:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.In(a, b))\n\n\t\tcase OpLess:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.Less(a, b))\n\n\t\tcase OpMore:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.More(a, b))\n\n\t\tcase OpLessOrEqual:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.LessOrEqual(a, b))\n\n\t\tcase OpMoreOrEqual:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.MoreOrEqual(a, b))\n\n\t\tcase OpAdd:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.Add(a, b))\n\n\t\tcase OpSubtract:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.Subtract(a, b))\n\n\t\tcase OpMultiply:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.Multiply(a, b))\n\n\t\tcase OpDivide:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.Divide(a, b))\n\n\t\tcase OpModulo:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.Modulo(a, b))\n\n\t\tcase OpExponent:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tvm.push(runtime.Exponent(a, b))\n\n\t\tcase OpRange:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tmin := runtime.ToInt(a)\n\t\t\tmax := runtime.ToInt(b)\n\t\t\tsize := max - min + 1\n\t\t\tif size <= 0 {\n\t\t\t\tsize = 0\n\t\t\t}\n\t\t\tvm.memGrow(uint(size))\n\t\t\tvm.push(runtime.MakeRange(min, max))\n\n\t\tcase OpMatches:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tif runtime.IsNil(a) || runtime.IsNil(b) {\n\t\t\t\tvm.push(false)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tvar match bool\n\t\t\tvar err error\n\t\t\tif s, ok := a.(string); ok {\n\t\t\t\tmatch, err = regexp.MatchString(b.(string), s)\n\t\t\t} else {\n\t\t\t\tmatch, err = regexp.Match(b.(string), a.([]byte))\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tvm.push(match)\n\n\t\tcase OpMatchesConst:\n\t\t\ta := vm.pop()\n\t\t\tif runtime.IsNil(a) {\n\t\t\t\tvm.push(false)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tr := program.Constants[arg].(*regexp.Regexp)\n\t\t\tif s, ok := a.(string); ok {\n\t\t\t\tvm.push(r.MatchString(s))\n\t\t\t} else {\n\t\t\t\tvm.push(r.Match(a.([]byte)))\n\t\t\t}\n\n\t\tcase OpContains:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tif runtime.IsNil(a) || runtime.IsNil(b) {\n\t\t\t\tvm.push(false)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tvm.push(strings.Contains(a.(string), b.(string)))\n\n\t\tcase OpStartsWith:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tif runtime.IsNil(a) || runtime.IsNil(b) {\n\t\t\t\tvm.push(false)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tvm.push(strings.HasPrefix(a.(string), b.(string)))\n\n\t\tcase OpEndsWith:\n\t\t\tb := vm.pop()\n\t\t\ta := vm.pop()\n\t\t\tif runtime.IsNil(a) || runtime.IsNil(b) {\n\t\t\t\tvm.push(false)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tvm.push(strings.HasSuffix(a.(string), b.(string)))\n\n\t\tcase OpSlice:\n\t\t\tfrom := vm.pop()\n\t\t\tto := vm.pop()\n\t\t\tnode := vm.pop()\n\t\t\tvm.push(runtime.Slice(node, from, to))\n\n\t\tcase OpCall:\n\t\t\tv := vm.pop()\n\t\t\tif v == nil {\n\t\t\t\tpanic(\"invalid operation: cannot call nil\")\n\t\t\t}\n\t\t\tfn := reflect.ValueOf(v)\n\t\t\tif fn.Kind() != reflect.Func {\n\t\t\t\tpanic(fmt.Sprintf(\"invalid operation: cannot call non-function of type %T\", v))\n\t\t\t}\n\t\t\tfnType := fn.Type()\n\t\t\tsize := arg\n\t\t\tisVariadic := fnType.IsVariadic()\n\t\t\tnumIn := fnType.NumIn()\n\t\t\tif isVariadic {\n\t\t\t\tif size < numIn-1 {\n\t\t\t\t\tpanic(fmt.Sprintf(\"invalid number of arguments: expected at least %d, got %d\", numIn-1, size))\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif size != numIn {\n\t\t\t\t\tpanic(fmt.Sprintf(\"invalid number of arguments: expected %d, got %d\", numIn, size))\n\t\t\t\t}\n\t\t\t}\n\t\t\tin := make([]reflect.Value, size)\n\t\t\tfor i := int(size) - 1; i >= 0; i-- {\n\t\t\t\tparam := vm.pop()\n\t\t\t\tif param == nil {\n\t\t\t\t\tvar inType reflect.Type\n\t\t\t\t\tif isVariadic && i >= numIn-1 {\n\t\t\t\t\t\tinType = fnType.In(numIn - 1).Elem()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinType = fnType.In(i)\n\t\t\t\t\t}\n\t\t\t\t\tin[i] = reflect.Zero(inType)\n\t\t\t\t} else {\n\t\t\t\t\tin[i] = reflect.ValueOf(param)\n\t\t\t\t}\n\t\t\t}\n\t\t\tout := fn.Call(in)\n\t\t\tif len(out) == 2 && out[1].Type() == errorType && !out[1].IsNil() {\n\t\t\t\tpanic(out[1].Interface().(error))\n\t\t\t}\n\t\t\tvm.push(out[0].Interface())\n\n\t\tcase OpCall0:\n\t\t\tout, err := program.functions[arg]()\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tvm.push(out)\n\n\t\tcase OpCall1:\n\t\t\tvar args []any\n\t\t\targs, fnArgsBuf = vm.getArgsForFunc(fnArgsBuf, program, 1)\n\t\t\tout, err := program.functions[arg](args...)\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tvm.push(out)\n\n\t\tcase OpCall2:\n\t\t\tvar args []any\n\t\t\targs, fnArgsBuf = vm.getArgsForFunc(fnArgsBuf, program, 2)\n\t\t\tout, err := program.functions[arg](args...)\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tvm.push(out)\n\n\t\tcase OpCall3:\n\t\t\tvar args []any\n\t\t\targs, fnArgsBuf = vm.getArgsForFunc(fnArgsBuf, program, 3)\n\t\t\tout, err := program.functions[arg](args...)\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tvm.push(out)\n\n\t\tcase OpCallN:\n\t\t\tfn := vm.pop().(Function)\n\t\t\tvar args []any\n\t\t\targs, fnArgsBuf = vm.getArgsForFunc(fnArgsBuf, program, arg)\n\t\t\tout, err := fn(args...)\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tvm.push(out)\n\n\t\tcase OpCallFast:\n\t\t\tfn := vm.pop().(func(...any) any)\n\t\t\tvar args []any\n\t\t\targs, fnArgsBuf = vm.getArgsForFunc(fnArgsBuf, program, arg)\n\t\t\tvm.push(fn(args...))\n\n\t\tcase OpCallSafe:\n\t\t\tfn := vm.pop().(SafeFunction)\n\t\t\tvar args []any\n\t\t\targs, fnArgsBuf = vm.getArgsForFunc(fnArgsBuf, program, arg)\n\t\t\tout, mem, err := fn(args...)\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tvm.memGrow(mem)\n\t\t\tvm.push(out)\n\n\t\tcase OpCallTyped:\n\t\t\tvm.push(vm.call(vm.pop(), arg))\n\n\t\tcase OpCallBuiltin1:\n\t\t\tvm.push(builtin.Builtins[arg].Fast(vm.pop()))\n\n\t\tcase OpArray:\n\t\t\tsize := vm.pop().(int)\n\t\t\tvm.memGrow(uint(size))\n\t\t\tarray := make([]any, size)\n\t\t\tfor i := size - 1; i >= 0; i-- {\n\t\t\t\tarray[i] = vm.pop()\n\t\t\t}\n\t\t\tvm.push(array)\n\n\t\tcase OpMap:\n\t\t\tsize := vm.pop().(int)\n\t\t\tvm.memGrow(uint(size))\n\t\t\tm := make(map[string]any)\n\t\t\tfor i := size - 1; i >= 0; i-- {\n\t\t\t\tvalue := vm.pop()\n\t\t\t\tkey := vm.pop()\n\t\t\t\tm[key.(string)] = value\n\t\t\t}\n\t\t\tvm.push(m)\n\n\t\tcase OpLen:\n\t\t\tvm.push(runtime.Len(vm.current()))\n\n\t\tcase OpCast:\n\t\t\tswitch arg {\n\t\t\tcase 0:\n\t\t\t\tvm.push(runtime.ToInt(vm.pop()))\n\t\t\tcase 1:\n\t\t\t\tvm.push(runtime.ToInt64(vm.pop()))\n\t\t\tcase 2:\n\t\t\t\tvm.push(runtime.ToFloat64(vm.pop()))\n\t\t\tcase 3:\n\t\t\t\tvm.push(runtime.ToBool(vm.pop()))\n\t\t\t}\n\n\t\tcase OpDeref:\n\t\t\ta := vm.pop()\n\t\t\tvm.push(deref.Interface(a))\n\n\t\tcase OpIncrementIndex:\n\t\t\tvm.currScope.Index++\n\n\t\tcase OpDecrementIndex:\n\t\t\tvm.currScope.Index--\n\n\t\tcase OpIncrementCount:\n\t\t\tvm.currScope.Count++\n\n\t\tcase OpGetIndex:\n\t\t\tvm.push(vm.currScope.Index)\n\n\t\tcase OpGetCount:\n\t\t\tvm.push(vm.currScope.Count)\n\n\t\tcase OpGetLen:\n\t\t\tvm.push(vm.currScope.Len)\n\n\t\tcase OpGetAcc:\n\t\t\tvm.push(vm.currScope.Acc)\n\n\t\tcase OpSetAcc:\n\t\t\tvm.currScope.Acc = vm.pop()\n\n\t\tcase OpSetIndex:\n\t\t\tvm.currScope.Index = vm.pop().(int)\n\n\t\tcase OpPointer:\n\t\t\tvm.push(vm.currScope.Item())\n\n\t\tcase OpThrow:\n\t\t\tpanic(vm.pop().(error))\n\n\t\tcase OpCreate:\n\t\t\tswitch arg {\n\t\t\tcase 1:\n\t\t\t\tvm.push(make(groupBy))\n\t\t\tcase 2:\n\t\t\t\tscope := vm.currScope\n\t\t\t\tvar desc bool\n\t\t\t\torder, ok := vm.pop().(string)\n\t\t\t\tif !ok {\n\t\t\t\t\tpanic(\"sortBy order argument must be a string\")\n\t\t\t\t}\n\t\t\t\tswitch order {\n\t\t\t\tcase \"asc\":\n\t\t\t\t\tdesc = false\n\t\t\t\tcase \"desc\":\n\t\t\t\t\tdesc = true\n\t\t\t\tdefault:\n\t\t\t\t\tpanic(\"unknown order, use asc or desc\")\n\t\t\t\t}\n\t\t\t\tvm.push(&runtime.SortBy{\n\t\t\t\t\tDesc:   desc,\n\t\t\t\t\tArray:  make([]any, 0, scope.Len),\n\t\t\t\t\tValues: make([]any, 0, scope.Len),\n\t\t\t\t})\n\t\t\tdefault:\n\t\t\t\tpanic(fmt.Sprintf(\"unknown OpCreate argument %v\", arg))\n\t\t\t}\n\n\t\tcase OpGroupBy:\n\t\t\tscope := vm.currScope\n\t\t\tkey := vm.pop()\n\t\t\tif key != nil && !reflect.TypeOf(key).Comparable() {\n\t\t\t\tpanic(fmt.Sprintf(\"cannot use %T as a key for groupBy: type is not comparable\", key))\n\t\t\t}\n\t\t\tscope.Acc.(groupBy)[key] = append(scope.Acc.(groupBy)[key], scope.Item())\n\n\t\tcase OpSortBy:\n\t\t\tscope := vm.currScope\n\t\t\tvalue := vm.pop()\n\t\t\tsortable := scope.Acc.(*runtime.SortBy)\n\t\t\tsortable.Array = append(sortable.Array, scope.Item())\n\t\t\tsortable.Values = append(sortable.Values, value)\n\n\t\tcase OpSort:\n\t\t\tscope := vm.currScope\n\t\t\tsortable := scope.Acc.(*runtime.SortBy)\n\t\t\tsort.Sort(sortable)\n\t\t\tvm.memGrow(uint(scope.Len))\n\t\t\tvm.push(sortable.Array)\n\n\t\tcase OpProfileStart:\n\t\t\tspan := program.Constants[arg].(*Span)\n\t\t\tspan.start = time.Now()\n\n\t\tcase OpProfileEnd:\n\t\t\tspan := program.Constants[arg].(*Span)\n\t\t\tspan.Duration += time.Since(span.start).Nanoseconds()\n\n\t\tcase OpBegin:\n\t\t\ta := vm.pop()\n\t\t\ts := vm.allocScope()\n\t\t\tswitch v := a.(type) {\n\t\t\tcase []int:\n\t\t\t\ts.Ints = v\n\t\t\t\ts.Len = len(v)\n\t\t\tcase []float64:\n\t\t\t\ts.Floats = v\n\t\t\t\ts.Len = len(v)\n\t\t\tcase []string:\n\t\t\t\ts.Strings = v\n\t\t\t\ts.Len = len(v)\n\t\t\tcase []any:\n\t\t\t\ts.Anys = v\n\t\t\t\ts.Len = len(v)\n\t\t\tdefault:\n\t\t\t\ts.Array = reflect.ValueOf(a)\n\t\t\t\ts.Len = s.Array.Len()\n\t\t\t}\n\t\t\tvm.Scopes = append(vm.Scopes, s)\n\t\t\tvm.currScope = s\n\n\t\tcase OpAnd:\n\t\t\ta := vm.pop()\n\t\t\tb := vm.pop()\n\t\t\tvm.push(a.(bool) && b.(bool))\n\n\t\tcase OpOr:\n\t\t\ta := vm.pop()\n\t\t\tb := vm.pop()\n\t\t\tvm.push(a.(bool) || b.(bool))\n\n\t\tcase OpEnd:\n\t\t\tvm.Scopes = vm.Scopes[:len(vm.Scopes)-1]\n\t\t\tif len(vm.Scopes) > 0 {\n\t\t\t\tvm.currScope = vm.Scopes[len(vm.Scopes)-1]\n\t\t\t} else {\n\t\t\t\tvm.currScope = nil\n\t\t\t}\n\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"unknown bytecode %#x\", op))\n\t\t}\n\n\t\tif debug && vm.debug {\n\t\t\tvm.curr <- vm.ip\n\t\t}\n\t}\n\n\tif debug && vm.debug {\n\t\tclose(vm.curr)\n\t\tclose(vm.step)\n\t}\n\n\tif len(vm.Stack) > 0 {\n\t\treturn vm.pop(), nil\n\t}\n\n\treturn nil, nil\n}\n\nfunc (vm *VM) push(value any) {\n\tvm.Stack = append(vm.Stack, value)\n}\n\nfunc (vm *VM) current() any {\n\tif len(vm.Stack) == 0 {\n\t\tpanic(\"stack underflow\")\n\t}\n\treturn vm.Stack[len(vm.Stack)-1]\n}\n\nfunc (vm *VM) pop() any {\n\tif len(vm.Stack) == 0 {\n\t\tpanic(\"stack underflow\")\n\t}\n\tvalue := vm.Stack[len(vm.Stack)-1]\n\tvm.Stack = vm.Stack[:len(vm.Stack)-1]\n\treturn value\n}\n\nfunc (vm *VM) memGrow(size uint) {\n\tvm.memory += size\n\tif vm.memory >= vm.MemoryBudget {\n\t\tpanic(\"memory budget exceeded\")\n\t}\n}\n\nfunc (vm *VM) scope() *Scope {\n\treturn vm.Scopes[len(vm.Scopes)-1]\n}\n\n// allocScope returns a pointer to a Scope from the pool, growing the pool if needed.\n// Callers must set Len and exactly one of: Ints, Floats, Strings, Anys, or Array.\nfunc (vm *VM) allocScope() *Scope {\n\tif vm.scopePoolIdx >= len(vm.scopePool) {\n\t\tvm.scopePool = append(vm.scopePool, Scope{})\n\t}\n\ts := &vm.scopePool[vm.scopePoolIdx]\n\tvm.scopePoolIdx++\n\t// Reset iteration state\n\ts.Index = 0\n\ts.Count = 0\n\ts.Acc = nil\n\t// Clear typed slice pointers to avoid stale fast-path matches\n\ts.Ints = nil\n\ts.Floats = nil\n\ts.Strings = nil\n\ts.Anys = nil\n\t// Clear Array to release reference for GC (only matters for fallback path)\n\ts.Array = reflect.Value{}\n\treturn s\n}\n\n// getArgsForFunc lazily initializes the buffer the first time it is called for\n// a given program (thus, it also needs \"program\" to run). It will\n// take \"needed\" elements from the buffer and populate them with vm.pop() in\n// reverse order. Because the estimation can fall short, this function can\n// occasionally make a new allocation.\nfunc (vm *VM) getArgsForFunc(argsBuf []any, program *Program, needed int) (args []any, argsBufOut []any) {\n\tif needed == 0 || program == nil {\n\t\treturn nil, argsBuf\n\t}\n\n\t// Step 1: fix estimations and preallocate\n\tif argsBuf == nil {\n\t\testimatedFnArgsCount := estimateFnArgsCount(program)\n\t\tif estimatedFnArgsCount > maxFnArgsBuf {\n\t\t\t// put a practical limit to avoid excessive preallocation\n\t\t\testimatedFnArgsCount = maxFnArgsBuf\n\t\t}\n\t\tif estimatedFnArgsCount < needed {\n\t\t\t// in the case that the first call is for example OpCallN with a large\n\t\t\t// number of arguments, then make sure we will be able to serve them at\n\t\t\t// least.\n\t\t\testimatedFnArgsCount = needed\n\t\t}\n\n\t\t// in the case that we are preparing the arguments for the first\n\t\t// function call of the program, then argsBuf will be nil, so we\n\t\t// initialize it. We delay this initial allocation here because a\n\t\t// program could have many function calls but exit earlier than the\n\t\t// first call, so in that case we avoid allocating unnecessarily\n\t\targsBuf = make([]any, estimatedFnArgsCount)\n\t}\n\n\t// Step 2: get the final slice that will be returned\n\tvar buf []any\n\tif len(argsBuf) >= needed {\n\t\t// in this case, we are successfully using the single preallocation. We\n\t\t// use the full slice expression [low : high : max] because in that way\n\t\t// a function that receives this slice as variadic arguments will not be\n\t\t// able to make modifications to contiguous elements with append(). If\n\t\t// they call append on their variadic arguments they will make a new\n\t\t// allocation.\n\t\tbuf = (argsBuf)[:needed:needed]\n\t\targsBuf = (argsBuf)[needed:] // advance the buffer\n\t} else {\n\t\t// if we have been making calls to something like OpCallN with many more\n\t\t// arguments than what we estimated, then we will need to allocate\n\t\t// separately\n\t\tbuf = make([]any, needed)\n\t}\n\n\t// Step 3: populate the final slice bulk copying from the stack. This is the\n\t// exact order and copy() is a highly optimized operation\n\tcopy(buf, vm.Stack[len(vm.Stack)-needed:])\n\tvm.Stack = vm.Stack[:len(vm.Stack)-needed]\n\n\treturn buf, argsBuf\n}\n\nfunc (vm *VM) Step() {\n\tvm.step <- struct{}{}\n}\n\nfunc (vm *VM) Position() chan int {\n\treturn vm.curr\n}\n\nfunc clearSlice[S ~[]E, E any](s S) {\n\tvar zero E\n\tfor i := range s {\n\t\ts[i] = zero // clear mem, optimized by the compiler, in Go 1.21 the \"clear\" builtin can be used\n\t}\n}\n\n// estimateFnArgsCount inspects a *Program and estimates how many function\n// arguments will be required to run it.\nfunc estimateFnArgsCount(program *Program) int {\n\t// Implementation note: a program will not necessarily go through all\n\t// operations, but this is just an estimation\n\tvar count int\n\tfor _, op := range program.Bytecode {\n\t\tif int(op) < len(opArgLenEstimation) {\n\t\t\tcount += opArgLenEstimation[op]\n\t\t}\n\t}\n\treturn count\n}\n\nvar opArgLenEstimation = [...]int{\n\tOpCall1: 1,\n\tOpCall2: 2,\n\tOpCall3: 3,\n\t// we don't know exactly but we know at least 4, so be conservative as this\n\t// is only an optimization and we also want to avoid excessive preallocation\n\tOpCallN: 4,\n\t// here we don't know either, but we can guess it could be common to receive\n\t// up to 3 arguments in a function\n\tOpCallFast: 3,\n\tOpCallSafe: 3,\n}\n"
  },
  {
    "path": "vm/vm_bench_test.go",
    "content": "package vm_test\n\nimport (\n\t\"runtime\"\n\t\"testing\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/checker\"\n\t\"github.com/expr-lang/expr/compiler\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\nfunc BenchmarkVM(b *testing.B) {\n\tcases := []struct {\n\t\tname, input string\n\t}{\n\t\t{\"function calls\", `\nfunc(\n\tfunc(\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t),\n\tfunc(\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t),\n\tfunc(\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t\tfunc(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),\n\t)\n)\n\t\t`},\n\t}\n\n\ta := new(recursive)\n\tfor i, b := 0, a; i < 40*4; i++ {\n\t\tb.Inner = new(recursive)\n\t\tb = b.Inner\n\t}\n\n\tf := func(params ...any) (any, error) { return nil, nil }\n\tenv := map[string]any{\n\t\t\"a\":    a,\n\t\t\"b\":    true,\n\t\t\"func\": f,\n\t}\n\tconfig := conf.New(env)\n\texpr.Function(\"func\", f, f)(config)\n\tconfig.Check()\n\n\tfor _, c := range cases {\n\t\ttree, err := checker.ParseCheck(c.input, config)\n\t\tif err != nil {\n\t\t\tb.Fatal(c.input, \"parse and check\", err)\n\t\t}\n\t\tprog, err := compiler.Compile(tree, config)\n\t\tif err != nil {\n\t\t\tb.Fatal(c.input, \"compile\", err)\n\t\t}\n\t\t//b.Logf(\"disassembled:\\n%s\", prog.Disassemble())\n\t\t//b.FailNow()\n\t\truntime.GC()\n\n\t\tvar vm vm.VM\n\t\tb.Run(\"name=\"+c.name, func(b *testing.B) {\n\t\t\tfor i := 0; i < b.N; i++ {\n\t\t\t\t_, err = vm.Run(prog, env)\n\t\t\t}\n\t\t})\n\t\tif err != nil {\n\t\t\tb.Fatal(err)\n\t\t}\n\t}\n}\n\ntype recursive struct {\n\tInner *recursive `expr:\"a\"`\n}\n"
  },
  {
    "path": "vm/vm_test.go",
    "content": "package vm_test\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/expr-lang/expr/file\"\n\t\"github.com/expr-lang/expr/internal/testify/require\"\n\n\t\"github.com/expr-lang/expr\"\n\t\"github.com/expr-lang/expr/checker\"\n\t\"github.com/expr-lang/expr/compiler\"\n\t\"github.com/expr-lang/expr/conf\"\n\t\"github.com/expr-lang/expr/parser\"\n\t\"github.com/expr-lang/expr/vm\"\n)\n\nfunc TestRun_NilProgram(t *testing.T) {\n\t_, err := vm.Run(nil, nil)\n\trequire.Error(t, err)\n}\n\nfunc TestRun_ReuseVM(t *testing.T) {\n\tnode, err := parser.Parse(`map(1..2, {#})`)\n\trequire.NoError(t, err)\n\n\tprogram, err := compiler.Compile(node, nil)\n\trequire.NoError(t, err)\n\n\treuse := vm.VM{}\n\t_, err = reuse.Run(program, nil)\n\trequire.NoError(t, err)\n\t_, err = reuse.Run(program, nil)\n\trequire.NoError(t, err)\n}\n\nfunc TestRun_ReuseVM_for_different_variables(t *testing.T) {\n\tv := vm.VM{}\n\n\tprogram, err := expr.Compile(`let a = 1; a + 1`)\n\trequire.NoError(t, err)\n\tout, err := v.Run(program, nil)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 2, out)\n\n\tprogram, err = expr.Compile(`let a = 2; a + 1`)\n\trequire.NoError(t, err)\n\tout, err = v.Run(program, nil)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 3, out)\n\n\tprogram, err = expr.Compile(`let a = 2; let b = 2; a + b`)\n\trequire.NoError(t, err)\n\tout, err = v.Run(program, nil)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 4, out)\n}\n\nfunc TestRun_Cast(t *testing.T) {\n\ttests := []struct {\n\t\tinput  string\n\t\texpect reflect.Kind\n\t\twant   any\n\t}{\n\t\t{\n\t\t\tinput:  `1`,\n\t\t\texpect: reflect.Float64,\n\t\t\twant:   float64(1),\n\t\t},\n\t\t{\n\t\t\tinput:  `1`,\n\t\t\texpect: reflect.Int,\n\t\t\twant:   int(1),\n\t\t},\n\t\t{\n\t\t\tinput:  `1`,\n\t\t\texpect: reflect.Int64,\n\t\t\twant:   int64(1),\n\t\t},\n\t\t{\n\t\t\tinput:  `true`,\n\t\t\texpect: reflect.Bool,\n\t\t\twant:   true,\n\t\t},\n\t\t{\n\t\t\tinput:  `false`,\n\t\t\texpect: reflect.Bool,\n\t\t\twant:   false,\n\t\t},\n\t\t{\n\t\t\tinput:  `nil`,\n\t\t\texpect: reflect.Bool,\n\t\t\twant:   false,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(fmt.Sprintf(\"%v %v\", tt.expect, tt.input), func(t *testing.T) {\n\t\t\ttree, err := parser.Parse(tt.input)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tprogram, err := compiler.Compile(tree, &conf.Config{Expect: tt.expect})\n\t\t\trequire.NoError(t, err)\n\n\t\t\tout, err := vm.Run(program, nil)\n\t\t\trequire.NoError(t, err)\n\n\t\t\trequire.Equal(t, tt.want, out)\n\t\t})\n\t}\n}\n\nfunc TestRun_Helpers(t *testing.T) {\n\tvalues := []any{\n\t\tuint(1),\n\t\tuint8(1),\n\t\tuint16(1),\n\t\tuint32(1),\n\t\tuint64(1),\n\t\t1,\n\t\tint8(1),\n\t\tint16(1),\n\t\tint32(1),\n\t\tint64(1),\n\t\tfloat32(1),\n\t\tfloat64(1),\n\t}\n\tops := []string{\"+\", \"-\", \"*\", \"/\", \"%\", \"==\", \">=\", \"<=\", \"<\", \">\"}\n\n\tfor _, a := range values {\n\t\tfor _, b := range values {\n\t\t\tfor _, op := range ops {\n\n\t\t\t\tif op == \"%\" {\n\t\t\t\t\tswitch a.(type) {\n\t\t\t\t\tcase float32, float64:\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tswitch b.(type) {\n\t\t\t\t\tcase float32, float64:\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tinput := fmt.Sprintf(\"a %v b\", op)\n\t\t\t\tenv := map[string]any{\n\t\t\t\t\t\"a\": a,\n\t\t\t\t\t\"b\": b,\n\t\t\t\t}\n\n\t\t\t\tconfig := conf.CreateNew()\n\n\t\t\t\ttree, err := parser.Parse(input)\n\t\t\t\trequire.NoError(t, err)\n\n\t\t\t\t_, err = checker.Check(tree, config)\n\t\t\t\trequire.NoError(t, err)\n\n\t\t\t\tprogram, err := compiler.Compile(tree, config)\n\t\t\t\trequire.NoError(t, err)\n\n\t\t\t\t_, err = vm.Run(program, env)\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t}\n\t}\n}\n\ntype ErrorEnv struct {\n\tInnerEnv InnerEnv\n}\ntype InnerEnv struct{}\n\nfunc (ErrorEnv) WillError(param string) (bool, error) {\n\tif param == \"yes\" {\n\t\treturn false, errors.New(\"error\")\n\t}\n\treturn true, nil\n}\n\nfunc (InnerEnv) WillError(param string) (bool, error) {\n\tif param == \"yes\" {\n\t\treturn false, errors.New(\"inner error\")\n\t}\n\treturn true, nil\n}\n\nfunc TestRun_MethodWithError(t *testing.T) {\n\tinput := `WillError(\"yes\")`\n\n\ttree, err := parser.Parse(input)\n\trequire.NoError(t, err)\n\n\tenv := ErrorEnv{}\n\tfuncConf := conf.New(env)\n\t_, err = checker.Check(tree, funcConf)\n\trequire.NoError(t, err)\n\n\tprogram, err := compiler.Compile(tree, funcConf)\n\trequire.NoError(t, err)\n\n\tout, err := vm.Run(program, env)\n\trequire.EqualError(t, err, \"error (1:1)\\n | WillError(\\\"yes\\\")\\n | ^\")\n\trequire.Equal(t, nil, out)\n\n\tselfErr := errors.Unwrap(err)\n\trequire.NotNil(t, err)\n\trequire.Equal(t, \"error\", selfErr.Error())\n}\n\nfunc TestRun_FastMethods(t *testing.T) {\n\tinput := `hello() + world()`\n\n\ttree, err := parser.Parse(input)\n\trequire.NoError(t, err)\n\n\tenv := map[string]any{\n\t\t\"hello\": func(...any) any { return \"hello \" },\n\t\t\"world\": func(...any) any { return \"world\" },\n\t}\n\tfuncConf := conf.New(env)\n\t_, err = checker.Check(tree, funcConf)\n\trequire.NoError(t, err)\n\n\tprogram, err := compiler.Compile(tree, funcConf)\n\trequire.NoError(t, err)\n\n\tout, err := vm.Run(program, env)\n\trequire.NoError(t, err)\n\n\trequire.Equal(t, \"hello world\", out)\n}\n\nfunc TestRun_InnerMethodWithError(t *testing.T) {\n\tinput := `InnerEnv.WillError(\"yes\")`\n\n\ttree, err := parser.Parse(input)\n\trequire.NoError(t, err)\n\n\tenv := ErrorEnv{}\n\tfuncConf := conf.New(env)\n\tprogram, err := compiler.Compile(tree, funcConf)\n\trequire.NoError(t, err)\n\n\tout, err := vm.Run(program, env)\n\trequire.EqualError(t, err, \"inner error (1:10)\\n | InnerEnv.WillError(\\\"yes\\\")\\n | .........^\")\n\trequire.Equal(t, nil, out)\n}\n\nfunc TestRun_InnerMethodWithError_NilSafe(t *testing.T) {\n\tinput := `InnerEnv?.WillError(\"yes\")`\n\n\ttree, err := parser.Parse(input)\n\trequire.NoError(t, err)\n\n\tenv := ErrorEnv{}\n\tfuncConf := conf.New(env)\n\tprogram, err := compiler.Compile(tree, funcConf)\n\trequire.NoError(t, err)\n\n\tout, err := vm.Run(program, env)\n\trequire.EqualError(t, err, \"inner error (1:11)\\n | InnerEnv?.WillError(\\\"yes\\\")\\n | ..........^\")\n\trequire.Equal(t, nil, out)\n}\n\nfunc TestRun_TaggedFieldName(t *testing.T) {\n\tinput := `value`\n\n\ttree, err := parser.Parse(input)\n\trequire.NoError(t, err)\n\n\tenv := struct {\n\t\tV string `expr:\"value\"`\n\t}{\n\t\tV: \"hello world\",\n\t}\n\n\tfuncConf := conf.New(env)\n\t_, err = checker.Check(tree, funcConf)\n\trequire.NoError(t, err)\n\n\tprogram, err := compiler.Compile(tree, funcConf)\n\trequire.NoError(t, err)\n\n\tout, err := vm.Run(program, env)\n\trequire.NoError(t, err)\n\n\trequire.Equal(t, \"hello world\", out)\n}\n\nfunc TestRun_OpInvalid(t *testing.T) {\n\tprogram := &vm.Program{\n\t\tBytecode:  []vm.Opcode{vm.OpInvalid},\n\t\tArguments: []int{0},\n\t}\n\n\t_, err := vm.Run(program, nil)\n\trequire.EqualError(t, err, \"invalid opcode\")\n}\n\nfunc TestVM_OpcodeOperations(t *testing.T) {\n\ttests := []struct {\n\t\tname        string\n\t\texpr        string\n\t\tenv         map[string]any\n\t\twant        any\n\t\texpectError string\n\t}{\n\t\t// Arithmetic Operations\n\t\t{\n\t\t\tname: \"basic addition\",\n\t\t\texpr: \"2 + 3\",\n\t\t\twant: 5,\n\t\t},\n\t\t{\n\t\t\tname: \"mixed type arithmetic\",\n\t\t\texpr: \"2.5 + 3\",\n\t\t\twant: 5.5,\n\t\t},\n\t\t{\n\t\t\tname: \"chained arithmetic\",\n\t\t\texpr: \"1 + 2 * 3 - 4 / 2\",\n\t\t\twant: 5.0,\n\t\t},\n\t\t{\n\t\t\tname: \"modulo operation\",\n\t\t\texpr: \"5 % 2\",\n\t\t\twant: 1,\n\t\t},\n\t\t{\n\t\t\tname: \"exponent operation\",\n\t\t\texpr: \"2 ^ 3\",\n\t\t\twant: 8.0,\n\t\t},\n\t\t{\n\t\t\tname: \"negation\",\n\t\t\texpr: \"-5\",\n\t\t\twant: -5,\n\t\t},\n\n\t\t// String Operations\n\t\t{\n\t\t\tname: \"string concatenation\",\n\t\t\texpr: `\"hello\" + \" \" + \"world\"`,\n\t\t\twant: \"hello world\",\n\t\t},\n\t\t{\n\t\t\tname: \"string starts with\",\n\t\t\texpr: `\"hello world\" startsWith \"hello\"`,\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"string ends with\",\n\t\t\texpr: `\"hello world\" endsWith \"world\"`,\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"string contains\",\n\t\t\texpr: `\"hello world\" contains \"lo wo\"`,\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"string matches regex\",\n\t\t\texpr: `\"hello123\" matches \"^hello\\\\d+$\"`,\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"byte slice matches regex\",\n\t\t\texpr: `b matches \"^hello\\\\d+$\"`,\n\t\t\tenv:  map[string]any{\"b\": []byte(\"hello123\")},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"byte slice matches dynamic regex\",\n\t\t\texpr: `b matches pattern`,\n\t\t\tenv:  map[string]any{\"b\": []byte(\"hello123\"), \"pattern\": \"^hello\\\\d+$\"},\n\t\t\twant: true,\n\t\t},\n\n\t\t// Data Structure Operations\n\t\t{\n\t\t\tname: \"array creation and access\",\n\t\t\texpr: \"[1, 2, 3][1]\",\n\t\t\twant: 2,\n\t\t},\n\t\t{\n\t\t\tname: \"map creation and access\",\n\t\t\texpr: `{\"a\": 1, \"b\": 2}.b`,\n\t\t\twant: 2,\n\t\t},\n\t\t{\n\t\t\tname: \"array length\",\n\t\t\texpr: \"len([1, 2, 3])\",\n\t\t\twant: 3,\n\t\t},\n\t\t{\n\t\t\tname: \"array slice\",\n\t\t\texpr: \"[1, 2, 3, 4][1:3]\",\n\t\t\twant: []any{2, 3},\n\t\t},\n\t\t{\n\t\t\tname: \"array range\",\n\t\t\texpr: \"1..5\",\n\t\t\twant: []int{1, 2, 3, 4, 5},\n\t\t},\n\n\t\t// Error Cases\n\t\t{\n\t\t\tname:        \"invalid array index\",\n\t\t\texpr:        \"[1,2,3][5]\",\n\t\t\texpectError: \"index out of range\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.expr, expr.Env(tt.env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\ttestVM := &vm.VM{}\n\t\t\tgot, err := testVM.Run(program, tt.env)\n\n\t\t\tif tt.expectError != \"\" {\n\t\t\t\trequire.Error(t, err)\n\t\t\t\trequire.Contains(t, err.Error(), tt.expectError)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\trequire.Equal(t, tt.want, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestVM_GroupAndSortOperations(t *testing.T) {\n\ttests := []struct {\n\t\tname        string\n\t\texpr        string\n\t\tenv         map[string]any\n\t\twant        any\n\t\texpectError string\n\t}{\n\t\t{\n\t\t\tname: \"group by single field\",\n\t\t\texpr: `groupBy([{\"id\": 1, \"type\": \"a\"}, {\"id\": 2, \"type\": \"b\"}, {\"id\": 3, \"type\": \"a\"}], #.type)`,\n\t\t\twant: map[any][]any{\n\t\t\t\t\"a\": {\n\t\t\t\t\tmap[string]any{\"id\": 1, \"type\": \"a\"},\n\t\t\t\t\tmap[string]any{\"id\": 3, \"type\": \"a\"},\n\t\t\t\t},\n\t\t\t\t\"b\": {\n\t\t\t\t\tmap[string]any{\"id\": 2, \"type\": \"b\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sort by field ascending\",\n\t\t\texpr: `sortBy([{\"id\": 3}, {\"id\": 1}, {\"id\": 2}], #.id)`,\n\t\t\twant: []any{\n\t\t\t\tmap[string]any{\"id\": 1},\n\t\t\t\tmap[string]any{\"id\": 2},\n\t\t\t\tmap[string]any{\"id\": 3},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sort by field descending\",\n\t\t\texpr: `sortBy([{\"id\": 3}, {\"id\": 1}, {\"id\": 2}], #.id, \"desc\")`,\n\t\t\twant: []any{\n\t\t\t\tmap[string]any{\"id\": 3},\n\t\t\t\tmap[string]any{\"id\": 2},\n\t\t\t\tmap[string]any{\"id\": 1},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sort by computed value\",\n\t\t\texpr: `sortBy([1, 2, 3, 4], # % 2)`,\n\t\t\twant: []any{2, 4, 1, 3},\n\t\t},\n\t\t{\n\t\t\tname: \"group by with complex key\",\n\t\t\texpr: `groupBy([1, 2, 3, 4, 5, 6], # % 2 == 0 ? \"even\" : \"odd\")`,\n\t\t\twant: map[any][]any{\n\t\t\t\t\"even\": {2, 4, 6},\n\t\t\t\t\"odd\":  {1, 3, 5},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:        \"group by with non-comparable key\",\n\t\t\texpr:        `groupBy([1, 2, 3], [#, # + 1])`, // predicate returns a slice, which is not comparable\n\t\t\texpectError: \"not comparable\",\n\t\t},\n\t\t{\n\t\t\tname:        \"invalid sort order\",\n\t\t\texpr:        `sortBy([1, 2, 3], #, \"invalid\")`,\n\t\t\texpectError: \"unknown order\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.expr, expr.Env(tt.env))\n\t\t\trequire.NoError(t, err)\n\n\t\t\ttestVM := &vm.VM{}\n\t\t\tgot, err := testVM.Run(program, tt.env)\n\n\t\t\tif tt.expectError != \"\" {\n\t\t\t\trequire.Error(t, err)\n\t\t\t\trequire.Contains(t, err.Error(), tt.expectError)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\trequire.Equal(t, tt.want, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TestVM_SortBy_NonStringOrder tests that sortBy with non-string order\n// returns a proper error instead of panicking (regression test for OSS-Fuzz #477658245).\nfunc TestVM_SortBy_NonStringOrder(t *testing.T) {\n\tenv := map[string]any{}\n\tfn := expr.Function(\"fn\", func(params ...any) (any, error) {\n\t\treturn fmt.Sprintf(\"fn(%v)\", params), nil\n\t})\n\n\t// This expression passes a function result as the order argument to sortBy.\n\t// The function returns a string that is not \"asc\" or \"desc\", which should\n\t// produce a proper error rather than a panic.\n\tprogram, err := expr.Compile(`sortBy([1, 2, 3], #, fn($env))`, expr.Env(env), fn)\n\trequire.NoError(t, err)\n\n\ttestVM := &vm.VM{}\n\t_, err = testVM.Run(program, env)\n\trequire.Error(t, err)\n\trequire.Contains(t, err.Error(), \"unknown order\")\n}\n\n// TestVM_ProfileOperations tests the profiling opcodes\nfunc TestVM_ProfileOperations(t *testing.T) {\n\tprogram := &vm.Program{\n\t\tBytecode: []vm.Opcode{\n\t\t\tvm.OpProfileStart,\n\t\t\tvm.OpPush,\n\t\t\tvm.OpCall,\n\t\t\tvm.OpProfileEnd,\n\t\t},\n\t\tArguments: []int{0, 1, 0, 0},\n\t\tConstants: []any{\n\t\t\t&vm.Span{},\n\t\t\tfunc() (any, error) {\n\t\t\t\ttime.Sleep(time.Millisecond * 10)\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t},\n\t}\n\n\ttestVM := &vm.VM{}\n\t_, err := testVM.Run(program, nil)\n\trequire.NoError(t, err)\n\n\tspan := program.Constants[0].(*vm.Span)\n\trequire.Greater(t, span.Duration, time.Millisecond)\n}\n\n// TestVM_IndexOperations tests the index manipulation opcodes\nfunc TestVM_IndexOperations(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\texpr string\n\t\twant any\n\t}{\n\t\t{\n\t\t\tname: \"decrement index in loop\",\n\t\t\texpr: \"reduce([1,2,3], #acc + #, 0)\",\n\t\t\twant: 6,\n\t\t},\n\t\t{\n\t\t\tname: \"set index in loop\",\n\t\t\texpr: \"map([1,2,3], # * 2)\",\n\t\t\twant: []any{2, 4, 6},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tprogram, err := expr.Compile(tt.expr)\n\t\t\trequire.NoError(t, err)\n\n\t\t\ttestVM := &vm.VM{}\n\t\t\tgot, err := testVM.Run(program, nil)\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.Equal(t, tt.want, got)\n\t\t})\n\t}\n}\n\n// TestVM_DirectCallOpcodes tests the specialized call opcodes directly\nfunc TestVM_DirectCallOpcodes(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tbytecode []vm.Opcode\n\t\targs     []int\n\t\tconsts   []any\n\t\tfuncs    []vm.Function\n\t\twant     any\n\t\twantErr  bool\n\t}{\n\t\t{\n\t\t\tname:     \"OpCall0\",\n\t\t\tbytecode: []vm.Opcode{vm.OpCall0},\n\t\t\targs:     []int{0},\n\t\t\tfuncs: []vm.Function{\n\t\t\t\tfunc(args ...any) (any, error) {\n\t\t\t\t\treturn 42, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: 42,\n\t\t},\n\t\t{\n\t\t\tname: \"OpCall1\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,\n\t\t\t\tvm.OpCall1,\n\t\t\t},\n\t\t\targs:   []int{0, 0},\n\t\t\tconsts: []any{10},\n\t\t\tfuncs: []vm.Function{\n\t\t\t\tfunc(args ...any) (any, error) {\n\t\t\t\t\treturn args[0].(int) * 2, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: 20,\n\t\t},\n\t\t{\n\t\t\tname: \"OpCall2\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,\n\t\t\t\tvm.OpPush,\n\t\t\t\tvm.OpCall2,\n\t\t\t},\n\t\t\targs:   []int{0, 1, 0},\n\t\t\tconsts: []any{10, 5},\n\t\t\tfuncs: []vm.Function{\n\t\t\t\tfunc(args ...any) (any, error) {\n\t\t\t\t\treturn args[0].(int) + args[1].(int), nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: 15,\n\t\t},\n\t\t{\n\t\t\tname: \"OpCall3\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,\n\t\t\t\tvm.OpPush,\n\t\t\t\tvm.OpPush,\n\t\t\t\tvm.OpCall3,\n\t\t\t},\n\t\t\targs:   []int{0, 1, 2, 0},\n\t\t\tconsts: []any{10, 5, 2},\n\t\t\tfuncs: []vm.Function{\n\t\t\t\tfunc(args ...any) (any, error) {\n\t\t\t\t\treturn args[0].(int) + args[1].(int) + args[2].(int), nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: 17,\n\t\t},\n\t\t{\n\t\t\tname: \"OpCallN with error\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpLoadFunc,\n\t\t\t\tvm.OpCallN,\n\t\t\t},\n\t\t\targs: []int{0, 0}, // Function index, number of args (0)\n\t\t\tfuncs: []vm.Function{\n\t\t\t\tfunc(args ...any) (any, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"test error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tprogram := vm.NewProgram(\n\t\t\t\tfile.Source{}, // source\n\t\t\t\tnil,           // node\n\t\t\t\tnil,           // locations\n\t\t\t\t0,             // variables\n\t\t\t\ttt.consts,\n\t\t\t\ttt.bytecode,\n\t\t\t\ttt.args,\n\t\t\t\ttt.funcs,\n\t\t\t\tnil, // debugInfo\n\t\t\t\tnil, // span\n\t\t\t)\n\t\t\tvm := &vm.VM{}\n\t\t\tgot, err := vm.Run(program, nil)\n\t\t\tif tt.wantErr {\n\t\t\t\trequire.Error(t, err)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\trequire.Equal(t, tt.want, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestVM_CallN(t *testing.T) {\n\tinput := `fn(1, 2, 3)`\n\n\ttree, err := parser.Parse(input)\n\trequire.NoError(t, err)\n\n\tenv := map[string]any{\n\t\t\"fn\": func(args ...any) (any, error) {\n\t\t\tsum := 0\n\t\t\tfor _, arg := range args {\n\t\t\t\tsum += arg.(int)\n\t\t\t}\n\t\t\treturn sum, nil\n\t\t},\n\t}\n\n\tconfig := conf.New(env)\n\tprogram, err := compiler.Compile(tree, config)\n\trequire.NoError(t, err)\n\n\tout, err := vm.Run(program, env)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 6, out)\n}\n\n// TestVM_IndexAndCountOperations tests the index and count manipulation opcodes directly\nfunc TestVM_IndexAndCountOperations(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tbytecode []vm.Opcode\n\t\targs     []int\n\t\tconsts   []any\n\t\twant     any\n\t\twantErr  bool\n\t}{\n\t\t{\n\t\t\tname: \"GetIndex\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,     // Push array to stack\n\t\t\t\tvm.OpBegin,    // Start scope\n\t\t\t\tvm.OpGetIndex, // Get current index\n\t\t\t},\n\t\t\targs:   []int{0, 0, 0},\n\t\t\tconsts: []any{[]any{1, 2, 3}}, // Array for scope\n\t\t\twant:   0,                     // Initial index is 0\n\t\t},\n\t\t{\n\t\t\tname: \"DecrementIndex\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,           // Push array to stack\n\t\t\t\tvm.OpBegin,          // Start scope\n\t\t\t\tvm.OpDecrementIndex, // Decrement index\n\t\t\t\tvm.OpGetIndex,       // Get current index\n\t\t\t},\n\t\t\targs:   []int{0, 0, 0, 0},\n\t\t\tconsts: []any{[]any{1, 2, 3}}, // Array for scope\n\t\t\twant:   -1,                    // After decrement\n\t\t},\n\t\t{\n\t\t\tname: \"GetCount\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,     // Push array to stack\n\t\t\t\tvm.OpBegin,    // Start scope\n\t\t\t\tvm.OpGetCount, // Get current count\n\t\t\t},\n\t\t\targs:   []int{0, 0, 0},\n\t\t\tconsts: []any{[]any{1, 2, 3}}, // Array for scope\n\t\t\twant:   0,                     // Initial count is 0\n\t\t},\n\t\t{\n\t\t\tname: \"IncrementCount\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,           // Push array to stack\n\t\t\t\tvm.OpBegin,          // Start scope\n\t\t\t\tvm.OpIncrementCount, // Increment count\n\t\t\t\tvm.OpGetCount,       // Get current count\n\t\t\t},\n\t\t\targs:   []int{0, 0, 0, 0},\n\t\t\tconsts: []any{[]any{1, 2, 3}}, // Array for scope\n\t\t\twant:   1,                     // After increment\n\t\t},\n\t\t{\n\t\t\tname: \"Multiple operations\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,           // Push array to stack\n\t\t\t\tvm.OpBegin,          // Start scope\n\t\t\t\tvm.OpIncrementCount, // Count = 1\n\t\t\t\tvm.OpIncrementCount, // Count = 2\n\t\t\t\tvm.OpDecrementIndex, // Index = -1\n\t\t\t\tvm.OpDecrementIndex, // Index = -2\n\t\t\t\tvm.OpGetCount,       // Push count (2)\n\t\t\t\tvm.OpGetIndex,       // Push index (-2)\n\t\t\t\tvm.OpAdd,            // Add them together\n\t\t\t},\n\t\t\targs:   []int{0, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t\tconsts: []any{[]any{1, 2, 3}}, // Array for scope\n\t\t\twant:   0,                     // 2 + (-2) = 0\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tprogram := vm.NewProgram(\n\t\t\t\tfile.Source{}, // source\n\t\t\t\tnil,           // node\n\t\t\t\tnil,           // locations\n\t\t\t\t0,             // variables\n\t\t\t\ttt.consts,\n\t\t\t\ttt.bytecode,\n\t\t\t\ttt.args,\n\t\t\t\tnil, // functions\n\t\t\t\tnil, // debugInfo\n\t\t\t\tnil, // span\n\t\t\t)\n\t\t\tvm := &vm.VM{}\n\t\t\tgot, err := vm.Run(program, nil)\n\t\t\tif tt.wantErr {\n\t\t\t\trequire.Error(t, err)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\trequire.Equal(t, tt.want, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TestVM_DirectBasicOpcodes tests basic opcodes directly\nfunc TestVM_DirectBasicOpcodes(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tbytecode []vm.Opcode\n\t\targs     []int\n\t\tconsts   []any\n\t\tenv      any\n\t\twant     any\n\t\twantErr  bool\n\t}{\n\t\t{\n\t\t\tname: \"OpLoadEnv\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpLoadEnv, // Load entire environment\n\t\t\t},\n\t\t\targs: []int{0},\n\t\t\tenv:  map[string]any{\"key\": \"value\"},\n\t\t\twant: map[string]any{\"key\": \"value\"},\n\t\t},\n\t\t{\n\t\t\tname: \"OpTrue\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpTrue,\n\t\t\t},\n\t\t\targs: []int{0},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpFalse\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpFalse,\n\t\t\t},\n\t\t\targs: []int{0},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"OpNil\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpNil,\n\t\t\t},\n\t\t\targs: []int{0},\n\t\t\twant: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"OpNegate int\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,   // Push number\n\t\t\t\tvm.OpNegate, // Negate it\n\t\t\t},\n\t\t\targs:   []int{0, 0},\n\t\t\tconsts: []any{42},\n\t\t\twant:   -42,\n\t\t},\n\t\t{\n\t\t\tname: \"OpNegate float\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,   // Push number\n\t\t\t\tvm.OpNegate, // Negate it\n\t\t\t},\n\t\t\targs:   []int{0, 0},\n\t\t\tconsts: []any{42.5},\n\t\t\twant:   -42.5,\n\t\t},\n\t\t{\n\t\t\tname: \"OpNot true\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpTrue, // Push true\n\t\t\t\tvm.OpNot,  // Negate it\n\t\t\t},\n\t\t\targs: []int{0, 0},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"OpNot false\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpFalse, // Push false\n\t\t\t\tvm.OpNot,   // Negate it\n\t\t\t},\n\t\t\targs: []int{0, 0},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpNot error\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push non-bool\n\t\t\t\tvm.OpNot,  // Try to negate it\n\t\t\t},\n\t\t\targs:    []int{0, 0},\n\t\t\tconsts:  []any{\"not a bool\"},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpEqualString equal\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,        // Push first string\n\t\t\t\tvm.OpPush,        // Push second string\n\t\t\t\tvm.OpEqualString, // Compare strings\n\t\t\t},\n\t\t\targs:   []int{0, 1, 0},\n\t\t\tconsts: []any{\"hello\", \"hello\"},\n\t\t\twant:   true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpEqualString not equal\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,        // Push first string\n\t\t\t\tvm.OpPush,        // Push second string\n\t\t\t\tvm.OpEqualString, // Compare strings\n\t\t\t},\n\t\t\targs:   []int{0, 1, 0},\n\t\t\tconsts: []any{\"hello\", \"world\"},\n\t\t\twant:   false,\n\t\t},\n\t\t{\n\t\t\tname: \"OpEqualString with empty strings\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,        // Push first string\n\t\t\t\tvm.OpPush,        // Push second string\n\t\t\t\tvm.OpEqualString, // Compare strings\n\t\t\t},\n\t\t\targs:   []int{0, 1, 0},\n\t\t\tconsts: []any{\"\", \"\"},\n\t\t\twant:   true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpEqualString type error\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,        // Push non-string\n\t\t\t\tvm.OpPush,        // Push string\n\t\t\t\tvm.OpEqualString, // Try to compare\n\t\t\t},\n\t\t\targs:    []int{0, 1, 0},\n\t\t\tconsts:  []any{42, \"hello\"},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpInt\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpInt, // Push int directly from args\n\t\t\t},\n\t\t\targs:   []int{42}, // The value 42 is passed directly in args\n\t\t\tconsts: []any{},   // No constants needed\n\t\t\twant:   42,\n\t\t},\n\t\t{\n\t\t\tname: \"OpInt negative\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpInt, // Push negative int directly from args\n\t\t\t},\n\t\t\targs:   []int{-42}, // The value -42 is passed directly in args\n\t\t\tconsts: []any{},    // No constants needed\n\t\t\twant:   -42,\n\t\t},\n\t\t{\n\t\t\tname: \"OpInt zero\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpInt, // Push zero directly from args\n\t\t\t},\n\t\t\targs:   []int{0}, // The value 0 is passed directly in args\n\t\t\tconsts: []any{},  // No constants needed\n\t\t\twant:   0,\n\t\t},\n\t\t{\n\t\t\tname: \"OpIn array true\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push element\n\t\t\t\tvm.OpPush, // Push array\n\t\t\t\tvm.OpIn,   // Check if element is in array\n\t\t\t},\n\t\t\targs:   []int{0, 1, 0},\n\t\t\tconsts: []any{2, []any{1, 2, 3}},\n\t\t\twant:   true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpIn array false\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push element\n\t\t\t\tvm.OpPush, // Push array\n\t\t\t\tvm.OpIn,   // Check if element is in array\n\t\t\t},\n\t\t\targs:   []int{0, 1, 0},\n\t\t\tconsts: []any{4, []any{1, 2, 3}},\n\t\t\twant:   false,\n\t\t},\n\t\t{\n\t\t\tname: \"OpIn map true\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push key\n\t\t\t\tvm.OpPush, // Push map\n\t\t\t\tvm.OpIn,   // Check if key is in map\n\t\t\t},\n\t\t\targs:   []int{0, 1, 0},\n\t\t\tconsts: []any{\"b\", map[string]any{\"a\": 1, \"b\": 2}},\n\t\t\twant:   true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpIn map false\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push key\n\t\t\t\tvm.OpPush, // Push map\n\t\t\t\tvm.OpIn,   // Check if key is in map\n\t\t\t},\n\t\t\targs:   []int{0, 1, 0},\n\t\t\tconsts: []any{\"c\", map[string]any{\"a\": 1, \"b\": 2}},\n\t\t\twant:   false,\n\t\t},\n\t\t{\n\t\t\tname: \"OpExponent integers\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,     // Push base\n\t\t\t\tvm.OpPush,     // Push exponent\n\t\t\t\tvm.OpExponent, // Calculate power\n\t\t\t},\n\t\t\targs:   []int{0, 1, 0},\n\t\t\tconsts: []any{2, 3},\n\t\t\twant:   8.0,\n\t\t},\n\t\t{\n\t\t\tname: \"OpExponent floats\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,     // Push base\n\t\t\t\tvm.OpPush,     // Push exponent\n\t\t\t\tvm.OpExponent, // Calculate power\n\t\t\t},\n\t\t\targs:   []int{0, 1, 0},\n\t\t\tconsts: []any{2.0, 3.0},\n\t\t\twant:   8.0,\n\t\t},\n\t\t{\n\t\t\tname: \"OpExponent negative exponent\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,     // Push base\n\t\t\t\tvm.OpPush,     // Push exponent\n\t\t\t\tvm.OpExponent, // Calculate power\n\t\t\t},\n\t\t\targs:   []int{0, 1, 0},\n\t\t\tconsts: []any{2.0, -2.0},\n\t\t\twant:   0.25,\n\t\t},\n\t\t{\n\t\t\tname: \"OpMatches valid regex\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,    // Push string\n\t\t\t\tvm.OpPush,    // Push pattern\n\t\t\t\tvm.OpMatches, // Match string against pattern\n\t\t\t},\n\t\t\targs:   []int{0, 1, 0},\n\t\t\tconsts: []any{\"hello123\", \"^hello\\\\d+$\"},\n\t\t\twant:   true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpMatches non-matching regex\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,    // Push string\n\t\t\t\tvm.OpPush,    // Push pattern\n\t\t\t\tvm.OpMatches, // Match string against pattern\n\t\t\t},\n\t\t\targs:   []int{0, 1, 0},\n\t\t\tconsts: []any{\"hello\", \"^\\\\d+$\"},\n\t\t\twant:   false,\n\t\t},\n\t\t{\n\t\t\tname: \"OpMatches invalid regex\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,    // Push string\n\t\t\t\tvm.OpPush,    // Push pattern\n\t\t\t\tvm.OpMatches, // Match string against pattern\n\t\t\t},\n\t\t\targs:    []int{0, 1, 0},\n\t\t\tconsts:  []any{\"hello\", \"[invalid\"},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpMatches type error\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,    // Push non-string\n\t\t\t\tvm.OpPush,    // Push pattern\n\t\t\t\tvm.OpMatches, // Match against pattern\n\t\t\t},\n\t\t\targs:    []int{0, 1, 0},\n\t\t\tconsts:  []any{42, \"^\\\\d+$\"},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpCast int to float64\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push int\n\t\t\t\tvm.OpCast, // Cast to float64\n\t\t\t},\n\t\t\targs:   []int{0, 2},\n\t\t\tconsts: []any{42},\n\t\t\twant:   float64(42),\n\t\t},\n\t\t{\n\t\t\tname: \"OpCast int32 to int64\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push int32\n\t\t\t\tvm.OpCast, // Cast to int64\n\t\t\t},\n\t\t\targs:   []int{0, 1},\n\t\t\tconsts: []any{int32(42)},\n\t\t\twant:   int64(42),\n\t\t},\n\t\t{\n\t\t\tname: \"OpCast bool to bool\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpTrue, // Push true\n\t\t\t\tvm.OpCast, // Cast to bool\n\t\t\t},\n\t\t\targs: []int{0, 3},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpCast nil to bool\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpNil,  // Push nil\n\t\t\t\tvm.OpCast, // Cast to bool\n\t\t\t},\n\t\t\targs: []int{0, 3},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"OpCast int to bool\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push int\n\t\t\t\tvm.OpCast, // Cast to bool\n\t\t\t},\n\t\t\targs:    []int{0, 3},\n\t\t\tconsts:  []any{1},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpCast invalid type\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push string\n\t\t\t\tvm.OpCast, // Try to cast to float64\n\t\t\t},\n\t\t\targs:    []int{0, 0},\n\t\t\tconsts:  []any{\"not a number\"},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpLen array\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push array\n\t\t\t\tvm.OpLen,  // Get length\n\t\t\t},\n\t\t\targs:   []int{0, 0},\n\t\t\tconsts: []any{[]any{1, 2, 3}},\n\t\t\twant:   3,\n\t\t},\n\t\t{\n\t\t\tname: \"OpLen empty array\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push empty array\n\t\t\t\tvm.OpLen,  // Get length\n\t\t\t},\n\t\t\targs:   []int{0, 0},\n\t\t\tconsts: []any{[]any{}},\n\t\t\twant:   0,\n\t\t},\n\t\t{\n\t\t\tname: \"OpLen string\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push string\n\t\t\t\tvm.OpLen,  // Get length\n\t\t\t},\n\t\t\targs:   []int{0, 0},\n\t\t\tconsts: []any{\"hello\"},\n\t\t\twant:   5,\n\t\t},\n\t\t{\n\t\t\tname: \"OpLen empty string\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push empty string\n\t\t\t\tvm.OpLen,  // Get length\n\t\t\t},\n\t\t\targs:   []int{0, 0},\n\t\t\tconsts: []any{\"\"},\n\t\t\twant:   0,\n\t\t},\n\t\t{\n\t\t\tname: \"OpLen map\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push map\n\t\t\t\tvm.OpLen,  // Get length\n\t\t\t},\n\t\t\targs:   []int{0, 0},\n\t\t\tconsts: []any{map[string]any{\"a\": 1, \"b\": 2, \"c\": 3}},\n\t\t\twant:   3,\n\t\t},\n\t\t{\n\t\t\tname: \"OpLen empty map\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push empty map\n\t\t\t\tvm.OpLen,  // Get length\n\t\t\t},\n\t\t\targs:   []int{0, 0},\n\t\t\tconsts: []any{map[string]any{}},\n\t\t\twant:   0,\n\t\t},\n\t\t{\n\t\t\tname: \"OpLen invalid type\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush, // Push number\n\t\t\t\tvm.OpLen,  // Try to get length\n\t\t\t},\n\t\t\targs:    []int{0, 0},\n\t\t\tconsts:  []any{42},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpThrow with string\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,  // Push error message\n\t\t\t\tvm.OpThrow, // Throw error\n\t\t\t},\n\t\t\targs:    []int{0, 0},\n\t\t\tconsts:  []any{\"test error\"},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpThrow with error\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpPush,  // Push error\n\t\t\t\tvm.OpThrow, // Throw error\n\t\t\t},\n\t\t\targs:    []int{0, 0},\n\t\t\tconsts:  []any{fmt.Errorf(\"test error\")},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"OpDefault\",\n\t\t\tbytecode: []vm.Opcode{\n\t\t\t\tvm.OpEnd + 1, // OpEnd is always last, this is anunknown opcode\n\t\t\t},\n\t\t\targs:    []int{0, 0},\n\t\t\tconsts:  []any{fmt.Errorf(\"test error\")},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tprogram := vm.NewProgram(\n\t\t\t\tfile.Source{}, // source\n\t\t\t\tnil,           // node\n\t\t\t\tnil,           // locations\n\t\t\t\t0,             // variables\n\t\t\t\ttt.consts,\n\t\t\t\ttt.bytecode,\n\t\t\t\ttt.args,\n\t\t\t\tnil, // functions\n\t\t\t\tnil, // debugInfo\n\t\t\t\tnil, // span\n\t\t\t)\n\t\t\tvm := &vm.VM{}\n\t\t\tgot, err := vm.Run(program, tt.env)\n\t\t\tif tt.wantErr {\n\t\t\t\trequire.Error(t, err)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\trequire.Equal(t, tt.want, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestVM_MemoryBudget(t *testing.T) {\n\ttests := []struct {\n\t\tname        string\n\t\texpr        string\n\t\tmemBudget   uint\n\t\texpectError string\n\t}{\n\t\t{\n\t\t\tname:      \"under budget\",\n\t\t\texpr:      \"map(1..10, #)\",\n\t\t\tmemBudget: 100,\n\t\t},\n\t\t{\n\t\t\tname:        \"exceeds budget\",\n\t\t\texpr:        \"map(1..1000, #)\",\n\t\t\tmemBudget:   10,\n\t\t\texpectError: \"memory budget exceeded\",\n\t\t},\n\t\t{\n\t\t\tname:      \"zero budget uses default\",\n\t\t\texpr:      \"map(1..10, #)\",\n\t\t\tmemBudget: 0,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tnode, err := parser.Parse(tt.expr)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tprogram, err := compiler.Compile(node, nil)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tvm := vm.VM{MemoryBudget: tt.memBudget}\n\t\t\tout, err := vm.Run(program, nil)\n\n\t\t\tif tt.expectError != \"\" {\n\t\t\t\trequire.Error(t, err)\n\t\t\t\trequire.Contains(t, err.Error(), tt.expectError)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\trequire.NotNil(t, out)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// Helper functions for creating deeply nested expressions\nfunc createNestedArithmeticExpr(t *testing.T, depth int) string {\n\tt.Helper()\n\tif depth == 0 {\n\t\treturn \"a\"\n\t}\n\treturn fmt.Sprintf(\"(%s + %d)\", createNestedArithmeticExpr(t, depth-1), depth)\n}\n\nfunc createNestedMapExpr(t *testing.T, depth int) string {\n\tt.Helper()\n\tif depth == 0 {\n\t\treturn `{\"value\": 1}`\n\t}\n\treturn fmt.Sprintf(`{\"nested\": %s}`, createNestedMapExpr(t, depth-1))\n}\n\nfunc TestVM_Limits(t *testing.T) {\n\ttests := []struct {\n\t\tname         string\n\t\texpr         string\n\t\tmemoryBudget uint\n\t\tmaxNodes     uint\n\t\tenv          map[string]any\n\t\texpectError  string\n\t}{\n\t\t{\n\t\t\tname:         \"nested arithmetic allowed with max nodes and memory budget\",\n\t\t\texpr:         createNestedArithmeticExpr(t, 100),\n\t\t\tenv:          map[string]any{\"a\": 1},\n\t\t\tmaxNodes:     1000,\n\t\t\tmemoryBudget: 1, // arithmetic expressions not counted towards memory budget\n\t\t},\n\t\t{\n\t\t\tname:         \"nested arithmetic blocked by max nodes\",\n\t\t\texpr:         createNestedArithmeticExpr(t, 10000),\n\t\t\tenv:          map[string]any{\"a\": 1},\n\t\t\tmaxNodes:     100,\n\t\t\tmemoryBudget: 1, // arithmetic expressions not counted towards memory budget\n\t\t\texpectError:  \"compilation failed: expression exceeds maximum allowed nodes\",\n\t\t},\n\t\t{\n\t\t\tname:         \"nested map blocked by memory budget\",\n\t\t\texpr:         createNestedMapExpr(t, 100),\n\t\t\tenv:          map[string]any{},\n\t\t\tmaxNodes:     1000,\n\t\t\tmemoryBudget: 10, // Small memory budget to trigger limit\n\t\t\texpectError:  \"memory budget exceeded\",\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tvar options []expr.Option\n\t\t\toptions = append(options, expr.Env(test.env))\n\t\t\tif test.maxNodes > 0 {\n\t\t\t\toptions = append(options, func(c *conf.Config) {\n\t\t\t\t\tc.MaxNodes = test.maxNodes\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tprogram, err := expr.Compile(test.expr, options...)\n\t\t\tif err != nil {\n\t\t\t\tif test.expectError != \"\" && strings.Contains(err.Error(), test.expectError) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\ttestVM := &vm.VM{\n\t\t\t\tMemoryBudget: test.memoryBudget,\n\t\t\t}\n\n\t\t\t_, err = testVM.Run(program, test.env)\n\n\t\t\tif test.expectError == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t} else {\n\t\t\t\trequire.Error(t, err)\n\t\t\t\trequire.Contains(t, err.Error(), test.expectError)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestVM_OpJump_NegativeOffset(t *testing.T) {\n\tprogram := vm.NewProgram(\n\t\tfile.Source{},\n\t\tnil,\n\t\tnil,\n\t\t0,\n\t\tnil,\n\t\t[]vm.Opcode{\n\t\t\tvm.OpInt,\n\t\t\tvm.OpInt,\n\t\t\tvm.OpJump,\n\t\t\tvm.OpInt,\n\t\t\tvm.OpJump,\n\t\t},\n\t\t[]int{\n\t\t\t1,\n\t\t\t2,\n\t\t\t-2, // negative offset for a forward jump opcode\n\t\t\t3,\n\t\t\t-2,\n\t\t},\n\t\tnil,\n\t\tnil,\n\t\tnil,\n\t)\n\n\t_, err := vm.Run(program, nil)\n\trequire.Error(t, err)\n\trequire.Contains(t, err.Error(), \"negative jump offset is invalid\")\n}\n\nfunc TestVM_StackUnderflow(t *testing.T) {\n\ttests := []struct {\n\t\tname        string\n\t\tbytecode    []vm.Opcode\n\t\targs        []int\n\t\texpectError string\n\t}{\n\t\t{\n\t\t\tname:     \"pop after push\",\n\t\t\tbytecode: []vm.Opcode{vm.OpInt, vm.OpPop},\n\t\t\targs:     []int{42, 0},\n\t\t},\n\t\t{\n\t\t\tname:        \"underflow after valid operations\",\n\t\t\tbytecode:    []vm.Opcode{vm.OpInt, vm.OpInt, vm.OpPop, vm.OpPop, vm.OpPop},\n\t\t\targs:        []int{1, 2, 0, 0, 0},\n\t\t\texpectError: \"stack underflow\",\n\t\t},\n\t\t{\n\t\t\tname:        \"pop on empty stack\",\n\t\t\tbytecode:    []vm.Opcode{vm.OpPop},\n\t\t\targs:        []int{0},\n\t\t\texpectError: \"stack underflow\",\n\t\t},\n\t\t{\n\t\t\tname:     \"pop after push\",\n\t\t\tbytecode: []vm.Opcode{vm.OpInt, vm.OpPop},\n\t\t\targs:     []int{123, 0},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tprogram := &vm.Program{\n\t\t\t\tBytecode:  tt.bytecode,\n\t\t\t\tArguments: tt.args,\n\t\t\t\tConstants: []any{},\n\t\t\t}\n\n\t\t\t_, err := vm.Run(program, nil)\n\t\t\tif tt.expectError != \"\" {\n\t\t\t\trequire.Error(t, err)\n\t\t\t\trequire.Contains(t, err.Error(), tt.expectError)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestVM_EnvNotCallable(t *testing.T) {\n\t// $env is the environment, not a function.\n\tenv := map[string]any{\n\t\t\"ok\": true,\n\t}\n\n\tcode := `$env('' matches ' '? : now().UTC(g))`\n\t_, err := expr.Compile(code, expr.Env(env))\n\trequire.Error(t, err)\n\trequire.Contains(t, err.Error(), \"is not callable\")\n}\n\nfunc TestVM_OpCall_InvalidNumberOfArguments(t *testing.T) {\n\t// Test that the VM validates argument count at runtime.\n\t// Compile without Env() so compiler generates OpCall without type info.\n\tprogram, err := expr.Compile(`fn(1, 2)`)\n\trequire.NoError(t, err)\n\n\t// Run with a function that has different arity\n\tenv := map[string]any{\n\t\t\"fn\": func(a int) int { return a },\n\t}\n\n\t_, err = expr.Run(program, env)\n\trequire.Error(t, err)\n\trequire.Contains(t, err.Error(), \"invalid number of arguments\")\n}\n\nfunc TestVM_OpCall_InvalidNumberOfArguments_Variadic(t *testing.T) {\n\t// Test variadic function with too few arguments.\n\tprogram, err := expr.Compile(`fn()`)\n\trequire.NoError(t, err)\n\n\t// Run with a variadic function that requires at least 1 argument\n\tenv := map[string]any{\n\t\t\"fn\": func(first int, rest ...int) int { return first },\n\t}\n\n\t_, err = expr.Run(program, env)\n\trequire.Error(t, err)\n\trequire.Contains(t, err.Error(), \"invalid number of arguments\")\n}\n"
  }
]