[
  {
    "path": ".dockerignore",
    "content": "# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n\n####\n# Visual Studio Code\n####\n.vscode\n\n####\n# Jetbrains\n####\n\n# User-specific stuff\n.idea/**/workspace.xml\n.idea/**/tasks.xml\n.idea/**/usage.statistics.xml\n.idea/**/dictionaries\n.idea/**/shelf\n\n# Generated files\n.idea/**/contentModel.xml\n\n# Sensitive or high-churn files\n.idea/**/dataSources/\n.idea/**/dataSources.ids\n.idea/**/dataSources.local.xml\n.idea/**/sqlDataSources.xml\n.idea/**/dynamic.xml\n.idea/**/uiDesigner.xml\n.idea/**/dbnavigator.xml\n\n# Vim\n*.swp\n\n####\n# Random\n####\n\nfrontend/node_modules/*\nfrontend/build/*\n\n*.db\n\nstashdb\nstash-box\ndist\n\npkg/models/generated_*.go\n# TODO - we'll add this in later\nvendor\ndocker\n"
  },
  {
    "path": ".gitattributes",
    "content": "go.mod text eol=lf\ngo.sum text eol=lf"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"[Bug Report] Short Form Subject (50 Chars or less)\"\nlabels: help wanted\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem please ensure that your screenshots are SFW or at least appropriately censored.\n\n**Desktop (please complete the following information):**\n - OS: [e.g. iOS]\n - Browser [e.g. chrome, safari]\n - Version [e.g. 22]\n\n**Smartphone (please complete the following information):**\n - Device: [e.g. iPhone6]\n - OS: [e.g. iOS8.1]\n - Browser [e.g. stock browser, safari]\n - Version [e.g. 22]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/discussion---request-for-commentary--rfc-.md",
    "content": "---\nname: Discussion / Request for Commentary [RFC]\nabout: This is for issues that will be discussed and won't necessarily result directly\n  in commits or pull requests.\ntitle: \"[RFC] Short Form Title\"\nlabels: help wanted\nassignees: ''\n\n---\n\n<!-- Update or delete the title if you need to delegate your title gore to something \n# Title\n\n*### Scope*\n<!-- describe the scope of your topic and your goals ideally within a single paragraph or TL;DR kind of summary so its easier for people to determine if they can contribute at a glance. -->\n\n##  Long Form\n<!-- Only required if your scope and titles can't cover everything. -->\n\n## Examples\n<!-- if you can show a picture or video examples post them here, please ensure that you respect people's time and attention and understand that people are volunteering their time, so concision is ideal and considerate. -->\n\n## Reference Reading\n<!-- if there is any reference reading or documentation, please refer to it here. -->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: \"[Feature] Short Form Title (50 chars or less.)\"\nlabels: enhancement\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: Build\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n  release:\n    types: [ published ]\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\njobs:\n  build:\n    runs-on: ubuntu-24.04\n\n    steps:\n\n    - name: Checkout\n      uses: actions/checkout@v4\n      with:\n        fetch-depth: 0\n\n    - name: Build custom PostgreSQL image\n      run: docker build -t stash-box-postgres -f docker/production/postgres/Dockerfile docker/production/postgres\n\n    - name: Start PostgreSQL container\n      run: |\n        docker run -d \\\n          --name postgres \\\n          -e POSTGRES_DB=postgres \\\n          -e POSTGRES_PASSWORD=postgres \\\n          -e POSTGRES_USER=postgres \\\n          -p 5432:5432 \\\n          --health-cmd pg_isready \\\n          --health-interval 10s \\\n          --health-timeout 5s \\\n          --health-retries 5 \\\n          stash-box-postgres\n\n    - name: Wait for PostgreSQL to be ready\n      run: |\n        until docker exec postgres pg_isready; do\n          echo \"Waiting for postgres...\"\n          sleep 2\n        done\n\n    - name: Install vips\n      run: sudo apt-get update && sudo apt-get install -y libvips-dev\n\n    - name: Install Go\n      uses: actions/setup-go@v5\n      with:\n        go-version: 1.25.x\n\n    - name: Install Node\n      uses: actions/setup-node@v4\n      with:\n        node-version: '24'\n\n    - name: Install PNPM\n      uses: pnpm/action-setup@v4\n      with:\n        version: 9\n\n    - name: Install sqlc\n      uses: sqlc-dev/setup-sqlc@v4\n      with:\n        sqlc-version: '1.29.0'\n\n    - name: Cache node modules\n      uses: actions/cache@v4\n      env:\n        cache-name: cache-node_modules\n      with:\n        path: frontend/node_modules\n        key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('frontend/pnpm-lock.yaml') }}\n\n    - name: Cache UI build\n      uses: actions/cache@v4\n      id: cache-ui\n      env:\n        cache-name: cache-ui\n      with:\n        path: frontend/build\n        key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('frontend/pnpm-lock.yaml', 'frontend/vite.config.js', 'frontend/src/**', 'graphql/**/*.graphql') }}\n\n    - name: Cache go build\n      uses: actions/cache@v4\n      env:\n        cache-name: cache-go-cache-2\n      with:\n        path: |\n          ~/go/pkg/mod\n          .go-cache\n        key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('go.mod', '**/go.sum') }}\n\n    - name: Pre-install\n      run: make pre-ui\n\n    - name: Generate\n      run: make generate\n\n    - name: Check generated files\n      run: |\n        if ! git diff --exit-code; then\n          echo \"::error::Generated files have changed. Run 'make generate' locally and commit the changes.\"\n          git diff\n          exit 1\n        fi\n\n    - name: Build UI\n      # skip UI build for pull requests if UI is unchanged (UI was cached)\n      # this means that the build version/time may be incorrect if the UI is\n      # not changed in a pull request\n      if: ${{ github.event_name != 'pull_request' || steps.cache-ui.outputs.cache-hit != 'true' }}\n      run: make ui\n\n    - name: Run tests\n      env:\n        POSTGRES_DB: postgres:postgres@localhost/postgres?sslmode=disable\n      run: make it\n\n    - name: Set PR version\n      if: ${{ github.event_name == 'pull_request' && github.base_ref != 'refs/heads/master'}}\n      run: echo \"BUILD_TYPE=PR\" >> $GITHUB_ENV\n    - name: Set Official version\n      if: ${{ github.event_name == 'release' && github.ref != 'refs/tags/latest-develop' }}\n      run: echo \"BUILD_TYPE=OFFICIAL\" >> $GITHUB_ENV\n    - name: Set Development version\n      if: ${{ github.event_name == 'push' }}\n      run: echo \"BUILD_TYPE=DEVELOPMENT\" >> $GITHUB_ENV\n\n    - name: Crosscompile binaries\n      run: make cross-compile\n      env:\n        BUILD_TYPE: \"${{ env.BUILD_TYPE }}\"\n\n    - name: Generate checksums\n      run: |\n        git describe --tags --exclude latest-develop | tee CHECKSUMS_SHA1\n        sha1sum dist/stash-box-* | sed 's/dist\\/.*\\///g' | tee -a CHECKSUMS_SHA1\n        echo \"STASH_BOX_VERSION=$(git describe --tags --exclude latest-develop)\" >> $GITHUB_ENV\n\n    - name: Upload Windows binary\n      # only upload binaries for pull requests\n      if: ${{ github.event_name == 'pull_request' && github.base_ref != 'refs/heads/master'}}\n      uses: actions/upload-artifact@v4\n      with:\n        name: stash-box-win.exe\n        path: dist/stash-box-windows.exe\n    - name: Upload Linux binary\n      # only upload binaries for pull requests\n      if: ${{ github.event_name == 'pull_request' && github.base_ref != 'refs/heads/master'}}\n      uses: actions/upload-artifact@v4\n      with:\n        name: stash-box-linux\n        path: dist/stash-box-linux\n\n    - name: Update latest-develop tag\n      if: ${{ github.event_name == 'push' }}\n      run : git tag -f latest-develop; git push -f --tags\n\n    - name: Development Release\n      if: ${{ github.event_name == 'push' }}\n      uses: marvinpinto/action-automatic-releases@v1.1.2\n      with:\n        repo_token: \"${{ secrets.GITHUB_TOKEN }}\"\n        prerelease: true\n        automatic_release_tag: latest-develop\n        title: \"${{ env.STASH_BOX_VERSION }}: Latest development build\"\n        files: |\n          dist/stash-box-windows.exe\n          dist/stash-box-linux\n          CHECKSUMS_SHA1\n\n    - name: Master release\n      if: ${{ github.event_name == 'release' && github.ref != 'refs/tags/latest-develop' }}\n      uses: WithoutPants/github-release@v2.0.4\n      with:\n        token: \"${{ secrets.GITHUB_TOKEN }}\"\n        allow_override: true\n        files: |\n          dist/stash-box-windows.exe\n          dist/stash-box-linux\n          CHECKSUMS_SHA1\n        gzip: false\n\n    - name: Login to DockerHub\n      if: ${{ github.event_name != 'pull_request' }}\n      uses: docker/login-action@v3\n      with:\n        username: ${{ secrets.DOCKERHUB_USERNAME }}\n        password: ${{ secrets.DOCKERHUB_TOKEN }}\n\n    - name: Development Docker\n      if: ${{ github.event_name == 'push' }}\n      run: |\n        docker build -t stashapp/stash-box:development -f ./docker/ci/x86_64/Dockerfile ./dist\n        docker push stashapp/stash-box:development\n\n    - name: Release Docker\n      if: ${{ github.event_name == 'release' && github.ref != 'refs/tags/latest-develop' }}\n      run: |\n        docker build -t stashapp/stash-box:latest -f ./docker/ci/x86_64/Dockerfile ./dist\n        docker push stashapp/stash-box:latest\n"
  },
  {
    "path": ".github/workflows/frontend-lint.yml",
    "content": "name: Lint (frontend)\non:\n  push:\n  pull_request:\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\njobs:\n  build:\n    runs-on: ubuntu-24.04\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Install Node\n        uses: actions/setup-node@v4\n        with:\n          node-version: '24'\n\n      - name: Install PNPM\n        uses: pnpm/action-setup@v4\n        with:\n          version: 9\n\n      - name: Cache node packages\n        uses: actions/cache@v4\n        env:\n          cache-name: cache-node_modules\n        with:\n          path: frontend/node_modules\n          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('frontend/pnpm-lock.yaml') }}\n\n      - name: Install node packages\n        run: make pre-ui\n\n      - name: Validate UI\n        run: make ui-validate\n"
  },
  {
    "path": ".github/workflows/golangci-lint.yml",
    "content": "name: Lint (golangci-lint)\non:\n  push:\n  pull_request:\n\njobs:\n  golangci:\n    name: lint\n    runs-on: ubuntu-24.04\n\n    steps:\n      - name: Install vips\n        run: sudo apt-get update && sudo apt-get install -y libvips-dev\n      - uses: actions/checkout@v4\n      - uses: actions/setup-go@v5\n        with:\n          go-version: 1.25.x\n      - run: mkdir frontend/build && touch frontend/build/dummy\n      - name: Run golangci-lint\n        uses: golangci/golangci-lint-action@v8\n        with:\n          # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version\n          version: latest\n"
  },
  {
    "path": ".gitignore",
    "content": "# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n\n####\n# Visual Studio Code\n####\n.vscode\n\n####\n# Jetbrains\n####\n\n# User-specific stuff\n.idea/**/workspace.xml\n.idea/**/tasks.xml\n.idea/**/usage.statistics.xml\n.idea/**/dictionaries\n.idea/**/shelf\n\n# Generated files\n.idea/**/contentModel.xml\n\n# Sensitive or high-churn files\n.idea/**/dataSources/\n.idea/**/dataSources.ids\n.idea/**/dataSources.local.xml\n.idea/**/sqlDataSources.xml\n.idea/**/dynamic.xml\n.idea/**/uiDesigner.xml\n.idea/**/dbnavigator.xml\n\n# Vim\n*.swp\n\n# macOS\n.DS_Store\n\n####\n# Random\n####\n\nnode_modules\n\n*.db\n.go-cache/\n\nstashdb\n/stash-box\ndist\n\nstash-box-config.yml\n\n# TODO - we'll add this in later\nvendor\n"
  },
  {
    "path": ".golangci.yml",
    "content": "version: \"2\"\nrun:\n  go: \"1.25\"\nlinters:\n  enable:\n    - copyloopvar\n    - dogsled\n    - errorlint\n    - exhaustive\n    - gocritic\n    - misspell\n    - noctx\n    - revive\n    - rowserrcheck\n    - sqlclosecheck\n  settings:\n    exhaustive:\n      default-signifies-exhaustive: true\n    revive:\n      confidence: 0.8\n      severity: error\n      rules:\n        - name: blank-imports\n          disabled: true\n        - name: context-as-argument\n        - name: context-keys-type\n        - name: dot-imports\n        - name: error-return\n        - name: error-strings\n        - name: error-naming\n        - name: exported\n        - name: if-return\n          disabled: false\n        - name: increment-decrement\n        - name: var-naming\n          arguments:\n            - - IDS\n            - []\n            - - skip-package-name-checks: true\n        - name: var-declaration\n        - name: package-comments\n        - name: range\n        - name: receiver-naming\n        - name: time-naming\n        - name: unexported-return\n          disabled: true\n        - name: indent-error-flow\n        - name: errorf\n        - name: empty-block\n        - name: superfluous-else\n        - name: unused-parameter\n          disabled: true\n        - name: unreachable-code\n        - name: redefines-builtin-id\n  exclusions:\n    generated: lax\n    presets:\n      - comments\n      - common-false-positives\n      - legacy\n      - std-error-handling\n    paths:\n      - third_party$\n      - builtin$\n      - examples$\nformatters:\n  enable:\n    - gofmt\n  exclusions:\n    generated: lax\n    paths:\n      - third_party$\n      - builtin$\n      - examples$\n"
  },
  {
    "path": "CLAUDE.md",
    "content": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nStash-box is an open-source video indexing and metadata API server for adult content, developed by Stash App. It serves as a community-driven database of metadata, similar to MusicBrainz for music. The application uses Go for the backend API with GraphQL, and React/TypeScript for the frontend.\n\n## Development Commands\n\n### Backend Development\n- `make build` - Build the Go binary with embedded frontend\n- `make test` - Run unit tests\n- `make it` - Run integration tests\n- `make lint` - Run golangci-lint on Go code\n- `make fmt` - Format Go code with gofmt\n- `make generate` - Regenerate GraphQL files, sqlc queries, and UI types\n- `make generate-backend` - Generate Go GraphQL files only\n- `make generate-ui` - Generate frontend GraphQL types only\n- `make generate-sqlc` - Generate sqlc query code only\n- `make generate-goverter` - Generate goverter type conversion code\n- `make generate-dataloaders` - Generate dataloader files\n\n### Frontend Development\n- `make pre-ui` - Install frontend dependencies via pnpm\n- `make ui` - Build the frontend for production\n- `make ui-start` - Start frontend development server\n- `make ui-fmt` - Format frontend code with prettier\n- `make ui-validate` - Run linting, format checking, and TypeScript validation\n\n### Complete Build Process\n- `make stash-box` - Full build: dependencies, generation, UI, linting, and binary\n\n### Database Setup\nThe application requires PostgreSQL with specific extensions:\n- Run `CREATE EXTENSION pg_trgm; CREATE EXTENSION pgcrypto;` as superuser before first run\n- Database schema migrations run automatically on startup\n- **Migrations**: Located in `internal/database/migrations/postgres/` and executed sequentially by filename\n- Default connection string: `postgres@localhost/stash-box?sslmode=disable`\n- **Query Code Generation**: Uses sqlc (configured in `sqlc.yaml`) to generate type-safe Go code from SQL queries\n\n## Architecture\n\n### Backend (`internal/` directory)\n- **`internal/api/`** - GraphQL resolvers, HTTP handlers, and server setup\n- **`internal/auth/`** - Authentication and authorization logic\n- **`internal/models/`** - Data models, database entity definitions, and generated GraphQL types\n- **`internal/database/`** - Database connection, migrations, and PostgreSQL-specific code\n- **`internal/queries/`** - Type-safe database query code generated by sqlc from SQL files\n- **`internal/service/`** - Business logic layer organized by entity (draft, edit, image, performer, scene, site, studio, tag, user, etc.)\n- **`internal/email/`** - Email handling and templates\n- **`internal/image/`** - Image processing, storage (local/S3), caching, and resizing\n- **`internal/storage/`** - Storage abstraction layer for local/S3 backends\n- **`internal/config/`** - Configuration management and parsing\n- **`internal/converter/`** - Generated type conversion code via goverter\n- **`internal/dataloader/`** - Generated DataLoader implementations for efficient GraphQL N+1 query resolution\n- **`internal/cron/`** - Scheduled task management\n\n### Frontend (`frontend/` directory)\n- **`frontend/src/pages/`** - Page components organized by entity type (performers, scenes, studios, tags, users)\n- **`frontend/src/components/`** - Reusable UI components and form elements\n- **`frontend/src/graphql/`** - GraphQL queries, mutations, fragments, and generated TypeScript types\n- **`frontend/src/hooks/`** - Custom React hooks for authentication, pagination, and state management\n- **`frontend/src/utils/`** - Utility functions for data transformation, routing, and validation\n\n### Key Concepts\n- **Entities**: Performers, Scenes, Studios, Tags, Sites - the main data types in the system\n- **Edits**: All changes go through an edit/voting system before being applied to entities\n- **Drafts**: Temporary submissions that can be converted to edits\n- **Roles**: User permission system (READ, VOTE, EDIT, MODIFY, ADMIN) controlling access to operations\n- **Images**: Stored locally or on S3, with automatic resizing and caching capabilities\n- **Fingerprints**: Used for scene matching and duplicate detection via three algorithms:\n  - **MD5**: Hash of entire video file for exact matching\n  - **OSHASH**: OpenSubtitles Hash implementation - hash of leading and trailing 64kb of video file\n  - **PHASH**: Perceptual hash based on a 5x5 grid of frames at regular intervals for content-based matching\n\n### GraphQL Schema\n- Schema files in `graphql/schema/` define the API structure\n- Code generation via gqlgen creates Go resolvers and TypeScript types\n- Uses dataloader pattern to prevent N+1 queries when fetching related data\n- **Authorization Directives**: `@hasRole(role: ROLE)` implemented in `internal/api/directives.go` for field-level access control\n\n### Configuration\n- YAML configuration file (`stash-box-config.yml`) controls server behavior\n- Support for PostgreSQL connection settings, image storage, email, and security options\n- Environment variables can override configuration values\n\n## Testing\n\n### Backend Tests\n- **Integration tests preferred**: All tests should be integration tests utilizing the GraphQL API as much as possible\n- Unit tests: `make test` - Fast tests that don't require database (use sparingly)\n- Integration tests: `make it` - Full tests against PostgreSQL test database\n- Integration tests use PostgreSQL with default connection string `postgres@localhost/stash-box-test?sslmode=disable`\n- Can override test database via `POSTGRES_DB` environment variable\n- **Warning**: Integration tests drop all tables, never run against production database\n- Test files follow pattern `internal/api/*_integration_test.go` with GraphQL client helper in `graphql_client_test.go`\n- **Test Data Setup**: Tests use the service layer to create test data (see `internal/api/integration_test.go` for user setup example)\n\n### Frontend Tests\n- `cd frontend && pnpm run validate` - Runs ESLint, stylelint, prettier check, and TypeScript compilation\n- No unit tests currently implemented in frontend\n\n## Development Workflow\n\n1. **Setup**: Ensure PostgreSQL is running with required extensions\n2. **Dependencies**: Run `make pre-ui` to install frontend packages\n3. **Development**: Use `make ui-start` for frontend development server\n4. **API Development**: Modify GraphQL schema, run `make generate` to update code\n5. **Database Changes**: Add migration files to `internal/database/migrations/postgres/` (executed sequentially by filename)\n6. **Query Changes**: Modify SQL files in `internal/queries/sql/`, run `make generate-sqlc` to regenerate Go code\n7. **Testing**: Run `make lint test it` before committing changes\n8. **Build**: Use `make stash-box` for complete production build\n\n## Important Notes\n\n- The application requires libvips for image processing on Linux systems\n- Default admin user (`root`) is created on first run with random password printed to stdout\n- Frontend development can use API key in `.env.development.local` to bypass login\n- Integration tests require PostgreSQL (default: `postgres@localhost/stash-box-test?sslmode=disable`)\n- pHash distance matching requires `pg-spgist_hamming` PostgreSQL extension\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 stashapp\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": "Makefile",
    "content": "LDFLAGS := $(LDFLAGS)\n\n.PHONY: \\\n\tstash-box \\\n\tgenerate \\\n\tgenerate-backend \\\n\tgenerate-ui \\\n\tgenerate-sqlc \\\n\tgenerate-goverter \\\n\tgenerate-dataloaders \\\n\ttest \\\n\tit \\\n\tfmt \\\n\tlint \\\n\tui \\\n\tui-start \\\n\tui-fmt \\\n\tui-validate \\\n\tpre-ui \\\n\tclean\n\nifdef OUTPUT\n  OUTPUT := -o $(OUTPUT)\nendif\n\nstash-box: pre-ui generate ui lint build\n\npre-build:\nifndef BUILD_DATE\n\t$(eval BUILD_DATE := $(shell go run scripts/getDate.go))\nendif\n\nifndef GITHASH\n\t$(eval GITHASH := $(shell git rev-parse --short HEAD))\nendif\n\nifndef STASH_BOX_VERSION\n\t$(eval STASH_BOX_VERSION := $(shell git describe --tags --abbrev=0 --exclude latest-develop))\nendif\n\nifndef BUILD_TYPE\n\t$(eval BUILD_TYPE := LOCAL)\nendif\n\nbuild: pre-build\n\t$(eval LDFLAGS := $(LDFLAGS) -X 'github.com/stashapp/stash-box/internal/api.version=$(STASH_BOX_VERSION)' -X 'github.com/stashapp/stash-box/internal/api.buildstamp=$(BUILD_DATE)' -X 'github.com/stashapp/stash-box/internal/api.githash=$(GITHASH)' -X 'github.com/stashapp/stash-box/internal/api.buildtype=$(BUILD_TYPE)')\n\tgo build $(OUTPUT) -v -ldflags \"$(LDFLAGS) $(EXTRA_LDFLAGS)\" ./cmd/stash-box\n\nbuild-release-static: EXTRA_LDFLAGS := -extldflags=-static -s -w\nbuild-release-static: build\n\n# Regenerates GraphQL files and sqlc code\ngenerate: generate-backend generate-ui generate-sqlc\n\nclean:\n\t@ rm -rf stash-box frontend/node_modules frontend/build dist\n\ngenerate-backend:\n\t@ go generate ./...\n\ngenerate-ui:\n\tcd frontend && pnpm generate\n\ngenerate-sqlc:\n\tsqlc generate\n\ngenerate-goverter:\n\tgo run github.com/jmattheis/goverter/cmd/goverter gen ./internal/converter/gen\n\ngenerate-dataloaders:\n\tcd internal/dataloader; \\\n\t\tgo run github.com/vektah/dataloaden UUIDsLoader github.com/gofrs/uuid.UUID \"[]github.com/gofrs/uuid.UUID\"; \\\n\t\tgo run github.com/vektah/dataloaden URLLoader github.com/gofrs/uuid.UUID \"[]github.com/stashapp/stash-box/internal/models.URL\"; \\\n\t\tgo run github.com/vektah/dataloaden TagLoader github.com/gofrs/uuid.UUID \"*github.com/stashapp/stash-box/internal/models.Tag\"; \\\n\t\tgo run github.com/vektah/dataloaden StringsLoader github.com/gofrs/uuid.UUID \"[]string\"; \\\n\t\tgo run github.com/vektah/dataloaden SceneAppearancesLoader github.com/gofrs/uuid.UUID \"[]github.com/stashapp/stash-box/internal/models.PerformerScene\"; \\\n\t\tgo run github.com/vektah/dataloaden PerformerLoader  github.com/gofrs/uuid.UUID \"*github.com/stashapp/stash-box/internal/models.Performer\"; \\\n\t\tgo run github.com/vektah/dataloaden ImageLoader github.com/gofrs/uuid.UUID \"*github.com/stashapp/stash-box/internal/models.Image\"; \\\n\t\tgo run github.com/vektah/dataloaden FingerprintsLoader github.com/gofrs/uuid.UUID \"[]github.com/stashapp/stash-box/internal/models.Fingerprint\"; \\\n\t\tgo run github.com/vektah/dataloaden SubmittedFingerprintsLoader github.com/gofrs/uuid.UUID \"[]github.com/stashapp/stash-box/internal/models.Fingerprint\"; \\\n\t\tgo run github.com/vektah/dataloaden BodyModificationsLoader github.com/gofrs/uuid.UUID \"[]github.com/stashapp/stash-box/internal/models.BodyModification\"; \\\n\t\tgo run github.com/vektah/dataloaden TagCategoryLoader github.com/gofrs/uuid.UUID \"*github.com/stashapp/stash-box/internal/models.TagCategory\"; \\\n\t\tgo run github.com/vektah/dataloaden SiteLoader github.com/gofrs/uuid.UUID \"*github.com/stashapp/stash-box/internal/models.Site\"; \\\n\t\tgo run github.com/vektah/dataloaden StudioLoader github.com/gofrs/uuid.UUID \"*github.com/stashapp/stash-box/internal/models.Studio\"; \\\n\t\tgo run github.com/vektah/dataloaden EditLoader github.com/gofrs/uuid.UUID \"*github.com/stashapp/stash-box/internal/models.Edit\"; \\\n\t\tgo run github.com/vektah/dataloaden EditCommentLoader github.com/gofrs/uuid.UUID \"*github.com/stashapp/stash-box/internal/models.EditComment\"; \\\n\t\tgo run github.com/vektah/dataloaden SceneLoader github.com/gofrs/uuid.UUID \"*github.com/stashapp/stash-box/internal/models.Scene\"; \\\n\t\tgo run github.com/vektah/dataloaden BoolsLoader github.com/gofrs/uuid.UUID \"bool\";\n\ntest:\n\tgo test ./...\n\n# Runs the integration tests. -count=1 is used to ensure results are not\n# cached, which is important if the environment changes\nit:\n\tgo test -tags=integration -count=1 ./...\n\n# Runs gofmt -w on the project's source code, modifying any files that do not match its style.\nfmt:\n\tgo fmt ./...\n\n# Runs all configured linuters. golangci-lint needs to be installed locally first.\nlint:\n\tgolangci-lint run\n\npre-ui:\n\tcd frontend && pnpm install\n\nui:\n\tcd frontend && pnpm build\n\nui-start:\n\tcd frontend && pnpm start\n\nui-fmt:\n\tcd frontend && pnpm format\n\n# runs tests and checks on the UI and builds it\nui-validate:\n\tcd frontend && pnpm run validate\n\n# cross-compile- targets should be run within the compiler docker container\ncross-compile-windows: export GOOS := windows\ncross-compile-windows: export GOARCH := amd64\ncross-compile-windows: export CC := x86_64-w64-mingw32-gcc\ncross-compile-windows: export CXX := x86_64-w64-mingw32-g++\ncross-compile-windows: export CGO_ENABLED = 0\ncross-compile-windows: OUTPUT := -o dist/stash-box-windows.exe\ncross-compile-windows: build-release-static\n\ncross-compile-linux: export GOOS := linux\ncross-compile-linux: export GOARCH := amd64\ncross-compile-linux: OUTPUT := -o dist/stash-box-linux\ncross-compile-linux: export CGO_ENABLED = 1\ncross-compile-linux: build\n\ncross-compile:\n\tmake cross-compile-windows\n\tmake cross-compile-linux\n"
  },
  {
    "path": "README.md",
    "content": "# stash-box\n\n[![Build](https://github.com/stashapp/stash-box/actions/workflows/build.yml/badge.svg?branch=master&event=push)](https://github.com/stashapp/stash-box/actions/workflows/build.yml)\n[![Open Collective backers](https://img.shields.io/opencollective/backers/stashapp?logo=opencollective)](https://opencollective.com/stashapp)\n[![Go Report Card](https://goreportcard.com/badge/github.com/stashapp/stash-box)](https://goreportcard.com/report/github.com/stashapp/stash-box)\n[![Discord](https://img.shields.io/discord/559159668438728723.svg?logo=discord)](https://discord.gg/2TsNFKt)\n[![GitHub release (latest by date)](https://img.shields.io/github/v/release/stashapp/stash-box?logo=github)](https://github.com/stashapp/stash-box/releases/latest)\n[![GitHub issues by-label](https://img.shields.io/github/issues-raw/stashapp/stash-box/bounty)](https://github.com/stashapp/stash-box/labels/bounty)\n\nStash-box is an open-source video indexing and metadata API server for porn developed by Stash App. The purpose of stash-box is to provide a community-driven database of porn metadata, similar to what MusicBrainz does for music. The submission and editing of metadata should follow the same principles as MusicBrainz. [Learn more here](https://musicbrainz.org/doc/Editing_FAQ). Installing Stash-box will create an empty database for you to populate.\n\n# Canonical community-database\n\nIf you're a Stash user, you don't need to install stash-box. The Stash community has a server with many titles from which you can pull data. You can get the login information from our guide to [Accessing StashDB](https://guidelines.stashdb.org/docs/faq_getting-started/stashdb/accessing-stashdb/).\n\n# Docker install\n\nYou can find a `docker-compose` file for production deployment [here](docker/production/docker-compose.yml). You can omit Traefik if you don't need a reverse proxy.\n\nIf you already have PostgreSQL installed, you can install stash-box on its own from [Docker Hub](https://hub.docker.com/r/stashapp/stash-box).\n\n# Bare-metal install\n\nStash-box supports macOS, Windows, and Linux. Releases for Windows and Linux can be found [here](https://github.com/stashapp/stash-box/releases).\n\n## Prerequisites\nTo build stash-box on linux [libvips](https://www.libvips.org/) must be installed, as well as gcc.\n\n## Initial setup\n\n1. Run `make` to build the application.\n2. Stash-box requires access to a PostgreSQL database server. Suppose stash-box doesn't find a configuration file (defaults to `stash-box-config.yml` in the current directory). In that case, it will generate a default configuration file with a default PostgreSQL connection string (`postgres@localhost/stash-box?sslmode=disable`). You can adjust the connection string as needed.\n3. The database must be created and available. If the PostgreSQL user is not a superuser, run `CREATE EXTENSION pg_trgm; CREATE EXTENSION pgcrypto;` by a superuser before rerunning Stash-box. If the schema is not present, it will be created within the database.\n4. The `sslmode` parameter is documented [here](https://godoc.org/github.com/lib/pq). Use `sslmode=disable` to not use SSL for the database connection. The default is `require`.\n5. After ensuring the database connection and availability, rerun Stash-box.\n#### Schema migrations and initial Admin user\nThe second time that stash-box is run, stash-box will run the schema migrations to create the required tables. It will also generate a `root` user with a random password and an API key. These credentials are printed once to stdout and are not logged. The system will regenerate the root user on startup if it does not exist. You can force the system to create a new root user by deleting the root user row from the database and restarting Stash-box. You'll need to capture the console output with your Admin user on the first successful StashDB executable start. Otherwise, you will need to allow Postgres to re-create the database before it will re-post a new `root` user.\n\n# Stash-box CLI and configuration\n\nStash-box is a tool with command line options to make it easier. To see what options are available, run `stash-box --help` in your terminal.\n\nHere's an example of how you can run stash-box locally on port 80:\n\n`stash-box --host 127.0.0.1 --port 80`\n\n\n**Note:** This command should work on OSX / Linux.\n\nWhen you start stash-box for the first time, it generates a configuration file called `stash-box-config.yml` in your current working directory. This file contains default settings for stash-box, including:\n\n- Host: `0.0.0.0`\n- Port: `9998`\n\nYou can change these defaults if needed. For example, if you want to disable the GraphQL playground and cross-domain cookies, you can set `is_production` to `true`.\n\n## API keys and authorization\n\nThere are two ways to authenticate a user in Stash-box: a session or an API key.\n\n1. Session-based authentication: To log in, send a request to `/login` with the `username` and `password` in plain text as form values. Session-based authentication will set a cookie that is required for all subsequent requests. To log out, send a request to `/logout`.\n\n2. API key authentication: To use an API key, set the `ApiKey` header to the user's API key value.\n\n### Configuration keys\n\n| Key | Default | Description |\n|-----|---------|-------------|\n| `title` | `Stash-Box` | Title of the instance, used in the page title. |\n| `require_invite` | `true` | If true, users are required to enter an invite key, generated by existing users to create a new account. |\n| `require_activation` | `false` | If true, users are required to verify their email address before creating an account. Requires `email_from`, `email_host`, and `host_url` to be set. |\n| `activation_expiry` | `7200` (2 hours) | The time - in seconds - after which an activation key (emailed to the user for email verification or password reset purposes) expires. |\n| `email_cooldown` | `300` (5 minutes) | The time - in seconds - that a user must wait before submitting an activation or reset password request for a specific email address. |\n| `default_user_roles` | `READ`, `VOTE`, `EDIT` | The roles assigned to new users when registering. This field must be expressed as a yaml array. |\n| `guidelines_url` | (none) | URL to link to a set of guidelines for users contributing edits. Should be in the form of `https://hostname.com`. |\n| `vote_promotion_threshold` | (none) | Number of approved edits before a user automatically has the `VOTE` role assigned. Leave empty to disable. |\n| `vote_application_threshold` | `3` | Number of same votes required for immediate application of an edit. Set to zero to disable automatic application. |\n| `voting_period` | `345600` | Time, in seconds, before a voting period is closed. |\n| `min_destructive_voting_period` | `172800` | Minimum time, in seconds, that needs to pass before a destructive edit can be immediately applied with sufficient positive votes. |\n| `vote_cron_interval` | `5m` | Time between runs to close edits whose voting periods have ended. |\n| `edit_update_limit` | `1` | Number of times an edit can be updated by the creator. |\n| `email_host` | (none) | Address of the SMTP server. Required to send emails for activation and recovery purposes. |\n| `email_port` | `25` | Port of the SMTP server. Only STARTTLS is supported. Direct TLS connections are not supported. |\n| `email_user` | (none) | Username for the SMTP server. Optional. |\n| `email_password` | (none) | Password for the SMTP server. Optional. |\n| `email_from` | (none) | Email address from which to send emails. |\n| `host_url` | (none) | Base URL for the server. Used when sending emails. Should be in the form of `https://hostname.com`. |\n| `image_location` | (none) | Path to store images, for local image storage. An error will be displayed if this is not set when creating non-URL images. |\n| `image_backend` | (`file`) | Storage solution for images. Can be set to either `file` or `s3`. |\n| `image_jpeg_quality` | `75` | Quality setting when resizing JPEG images. Valid values are 0-100. |\n| `image_max_size` | (none) | Max size of image, if no size is specified. Omit to return full size. |\n| `image_resizing.enabled` | false | Whether to resize images shown in the frontend. |\n| `image_resizing.cache_path` | (none) | Folder in which resized images will be saved for later requests. Recommended when resizing is enabled. |\n| `image_resizing.min_size` | (none) | Only resize images above a certain size |\n| `userLogFile` | (none) | Path to the user log file, which logs user operations. If not set, then these will be output to stderr. |\n| `s3.endpoint` | (none) | Hostname to s3 endpoint used for image storage. |\n| `s3.bucket` | (none) | Name of S3 bucket used to store images. |\n| `s3.access_key` | (none) | Access key used for authentication. |\n| `s3.secret ` | (none) | Secret Access key used for authentication. |\n| `s3.max_dimension` | (none) | If set, a resized copy will be created for any image whose dimensions exceed this number. This copy will be served in place of the original. |\n| `s3.upload_headers` | (none) | A map of headers to send with each upload request. For example, DigitalOcean requires the `x-amz-acl` header to be set to `public-read` or it does not make the uploaded images available. |\n| `phash_distance` | 0 | Determines what binary distance is considered a match when querying with a pHash fingeprint. Using more than 8 is not recommended and may lead to large amounts of false positives. **Note**: The [pg-spgist_hamming extension](#phash-distance-matching) must be installed to use distance matching, otherwise you will get errors. |\n| `favicon_path` | (none) | Location where favicons for linked sites should be stored. Leave empty to disable. |\n| `draft_time_limit` | (24h) | Time, in seconds, before a draft is deleted. |\n| `profiler_port` | 0 | Port on which to serve pprof output. Omit to disable entirely. |\n| `port` | 9998 | Port on which the server runs. When using SSL certificates it should be set to `443`. |\n| `postgres.max_open_conns` | (0) | Maximum number of concurrent open connections to the database. |\n| `postgres.max_idle_conns` | (0) | Maximum number of concurrent idle database connections. |\n| `postgres.conn_max_lifetime` | (0) | Maximum lifetime in minutes before a connection is released. |\n| `require_scene_draft` | false | Whether to allow scene creation outside of draft submissions. |\n| `require_tag_role` | false | Whether to require the EditTag role to edit tags. |\n| `csp` | (none) | Contents of the `Content-Security-Policy` header |\n| `autocert.enabled` | (none) | Whether to enable [autocert](#lets-encrypt)|\n| `autocert.cache_dir` | (none) | The directory where autocert certificates are stored. Should be a persisted directory to avoid certificate regeneration on server restart. |\n| `autocert.domain` | (none) | The domain to generate certificates for.|\n| `autocert.email` | (none) | A valid email. Will be submitted to Let's Encrypt, but otherwise not made public. |\n| `mod_audit_retention_days` | 30 | Number of days to retain audit logs of moderator actions. Set `0` to disable. |\n\n## SSL (HTTPS)\n\n### Let's Encrypt\n\nStash-box supports automatic certificate generation from Let's Encrypt. If you want to avoid running behind a reverse proxy - which can cause a certain amount of overhead due to image loading - this is the recommended approach.\n\nTo use Let's Encrypt, configure the `autocert` config option. As an example:\n```\nautocert:\n    enabled: true\n    cache_dir: /autocert\n    domain: example.org\n    email: email@example.org\n```\n\nTo use autocert it needs access to port 80 to respond to Let's Encrypt's challenge. After certificate generation is done, port 80 will redirect to the SSL port.\n\nStash-box will automatically renew the certificate once it has less than 30 days until expiration.\n\n### Self-signed certificates\n\nHere's an example of how you can do this using OpenSSL:\n\n`openssl req -x509 -newkey rsa:4096 -sha256 -days 7300 -nodes -keyout stash-box.key -out stash-box.crt -extensions san -config <(echo \"[req]\"; echo distinguished_name=req; echo \"[san]\"; echo subjectAltName=DNS:stash-box.server,IP:127.0.0.1) -subj /CN=stash-box.server`\n\n\nYou might need to modify the command for your specific setup. You can find more information about creating a self-signed certificate with OpenSSL [here](https://stackoverflow.com/questions/10175812/how-to-create-a-self-signed-certificate-with-openssl).\n\nOnce you've generated the certificate and key pair, make sure they're named `stash-box.crt` and `stash-box.key` respectively, and place them in the same directory as stash-box. When Stash-box detects these files, it will use HTTPS instead of HTTP.\n\n## pHash Distance Matching\n\nIf you want to enable distance matching for pHashes in stash-box, you'll need to install the [pg-spgist_hamming](https://github.com/fake-name/pg-spgist_hamming) Postgres extension.\n\nThe recommended way to do this is to use the [docker image](docker/production/postgres/Dockerfile). Still, you can also install it manually by following the build instructions in the pg-spgist_hamming repository.\n\nSuppose you install the extension after you've run the migrations. In that case, you'll need to run migration #14 manually to install the extension and add the index. If you don't want to do this, you can wipe the database, and the migrations will run the next time you start stash-box.\n\n# Join Our Community\n\nWe are excited to announce that we have a new home for support, feature requests, and discussions related to Stash and its associated projects. Join our community on the [Discourse forum](https://discourse.stashapp.cc) to connect with other users, share your ideas, and get help from fellow enthusiasts.\n\n# Development\n\n## Install\n\n* [Go](https://golang.org/dl/), minimum version 1.22.\n* [golangci-lint](https://golangci-lint.run/) - Linter aggregator\n    * Follow instructions for your platform from [https://golangci-lint.run/usage/install/](https://golangci-lint.run/usage/install/).\n    * Run the linters with `make lint`.\n* [PNPM](https://pnpm.io/installation) - PNPM package manager\n\n## Commands\n\n* `make generate` - Generate Go GraphQL files. This command should be run if the GraphQL schema has changed.\n* `make ui` - Builds the UI.\n* `make pre-ui` - Download frontend dependencies\n* `make build` - Builds the binary\n* `make test` - Runs the unit tests\n* `make it` - Runs the unit and integration tests\n* `make lint` - Run the linter\n* `make fmt` - Formats and aligns whitespace\n\n**Note:** the integration tests run against a temporary sqlite3 database by default. They can be run against a Postgres server by setting the environment variable `POSTGRES_DB` to the Postgres connection string. For example: `postgres@localhost/stash-box-test?sslmode=disable`. **Be aware that the integration tests drop all tables before and after the tests.**\n\n## Frontend development\n\nTo run the frontend in development mode, run `pnpm start` from the frontend directory.\n\nWhen developing, the API key can be set in `frontend/.env.development.local` to avoid having to log in.  \nWhen `is_production` is enabled on the server, this is the only way to authorize in the frontend development environment. If the server uses https or runs on a custom port, this also needs to be configured in `.env.development.local`.  \nSee `frontend/.env.development.local.shadow` for examples.\n\n## GraphQL playground\n\nYou can access the GraphQL playground at `host:port/playground`, and the GraphQL interface can be found at `host:port/graphql`. To execute queries add a header with your API key: `{\"APIKey\":\"<API_KEY>\"}`. The API key can be found on your user page in stash-box.\n\n## Building a release\n\n1. Run `make generate` to create generated files if they have been changed.\n2. Run `make ui build` to build the executable for your current platform.\n\n# FAQ\n\n> I have a question that needs to be answered here.\n* Join the [Discourse forum](https://discourse.stashapp.cc)\n* Join the [Discord server](https://discord.gg/2TsNFKt), where the community can offer support.\n* Start a [discussion on GitHub](https://github.com/stashapp/stash-box/discussions)\n\n"
  },
  {
    "path": "cmd/stash-box/init.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/spf13/pflag\"\n\t\"github.com/spf13/viper\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/pkg/logger\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\nfunc initConfig(configFilePath *string) {\n\tif *configFilePath != \"\" {\n\t\tdir, name := parseConfigFilePath(*configFilePath)\n\t\tviper.SetConfigName(name)\n\t\tviper.AddConfigPath(dir)\n\t} else {\n\t\tviper.SetConfigName(config.GetConfigName())\n\t\tviper.AddConfigPath(\".\")\n\t}\n\n\terr := viper.ReadInConfig()\n\tnewConfig := false\n\tif err != nil {\n\t\tnewConfig = true\n\t\tdefaultConfigFilePath := config.GetDefaultConfigFilePath()\n\t\tif *configFilePath != \"\" {\n\t\t\tdefaultConfigFilePath = *configFilePath\n\t\t}\n\n\t\t_ = utils.Touch(defaultConfigFilePath)\n\t\tif err = viper.ReadInConfig(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\n\tif err = config.InitializeDefaults(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tinitEnvs()\n\n\tif err = viper.ReadInConfig(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := viper.BindPFlags(pflag.CommandLine); err != nil {\n\t\tlogger.Infof(\"failed to bind flags: %s\", err.Error())\n\t}\n\n\tif err = config.Initialize(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tif newConfig {\n\t\tfmt.Printf(`\nA new config file has been generated at %s.\nThe database connection string has been defaulted to: %s\nPlease ensure this database is created and available, or change the connection string in the configuration file, then rerun stash-box.`,\n\t\t\tviper.GetViper().ConfigFileUsed(), config.GetDatabasePath())\n\t\tos.Exit(0)\n\t}\n\n\tmissingEmail := config.GetMissingEmailSettings()\n\tif len(missingEmail) > 0 {\n\t\tfmt.Printf(\"RequireActivation is set to true, but the following required settings are missing: %s\\n\", strings.Join(missingEmail, \", \"))\n\t}\n\n\tmissingAutocert := config.GetMissingAutocertSettings()\n\tif len(missingAutocert) > 0 {\n\t\tfmt.Printf(\"Autocert is enabled, but the following required settings are missing: %s\\n\", strings.Join(missingAutocert, \", \"))\n\t\tos.Exit(1)\n\t}\n}\n\nfunc parseConfigFilePath(configFilePath string) (string, string) {\n\tdir := filepath.Dir(configFilePath)\n\tname := filepath.Base(configFilePath)\n\textension := filepath.Ext(configFilePath)\n\tname = strings.TrimSuffix(name, extension)\n\treturn dir, name\n}\n\nfunc initEnvs() {\n\tviper.SetEnvPrefix(\"stash_box\")\n\tviper.AutomaticEnv()\n\t_ = viper.BindEnv(\"host\")\n\t_ = viper.BindEnv(\"port\")\n\t_ = viper.BindEnv(\"database\")\n}\n"
  },
  {
    "path": "cmd/stash-box/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"net\"\n\n\t\"github.com/spf13/pflag\"\n\t\"github.com/stashapp/stash-box/frontend\"\n\t\"github.com/stashapp/stash-box/internal/api\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/cron\"\n\t\"github.com/stashapp/stash-box/internal/database\"\n\t\"github.com/stashapp/stash-box/internal/email\"\n\t\"github.com/stashapp/stash-box/internal/image\"\n\t\"github.com/stashapp/stash-box/internal/service\"\n\t\"github.com/stashapp/stash-box/pkg/logger\"\n)\n\nfunc main() {\n\t// Initialize flags\n\tpflag.IP(\"host\", net.IPv4(0, 0, 0, 0), \"ip address for the host\")\n\tpflag.Int(\"port\", 9998, \"port to serve from\")\n\tconfigFilePath := pflag.String(\"config_file\", \"\", \"location of the config file\")\n\tpflag.Parse()\n\n\t// Initialize config\n\tinitConfig(configFilePath)\n\n\t// Initialize logger\n\tlogger.Init(config.GetLogFile(), config.GetUserLogFile(), config.GetLogOut(), config.GetLogLevel())\n\n\tcleanup := logger.InitTracer()\n\t//nolint:errcheck\n\tdefer cleanup(context.Background())\n\n\tapi.InitializeSession()\n\n\t// Create email manager\n\temailMgr := email.NewManager()\n\n\tdb := database.Initialize(config.GetDatabasePath())\n\tfac := service.NewFactory(db, emailMgr)\n\tfac.User().CreateSystemUsers(context.Background())\n\tapi.Start(*fac, frontend.FS)\n\tcron.Init(*fac)\n\n\tif err := image.InitResizer(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tblockForever()\n}\n\nfunc blockForever() {\n\tc := make(chan struct{})\n\t<-c\n}\n"
  },
  {
    "path": "docker/build/x86_64/Dockerfile",
    "content": "# this dockerfile must be built from the top-level stash directory\n# ie from top=level stash:\n# docker build -t stash-box/build -f docker/build/x86_64/Dockerfile .\n\nFROM golang:1.13.14 as compiler\n\nRUN apt-get update && apt-get install -y apt-transport-https\nRUN curl -sL https://deb.nodesource.com/setup_10.x | bash -\nRUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \\\n    echo \"deb https://dl.yarnpkg.com/debian/ stable main\" | tee /etc/apt/sources.list.d/yarn.list\n\nRUN apt-get update && \\\n    apt-get install -y nodejs yarn xz-utils --no-install-recommends || exit 1; \\\n\trm -rf /var/lib/apt/lists/*;\n\t\nWORKDIR /\n\nSHELL [\"/bin/bash\", \"-o\", \"pipefail\", \"-c\"]\n\n# copy the ui yarn stuff so that it doesn't get rebuilt every time\nCOPY ./frontend/package.json ./frontend/yarn.lock /stash-box/frontend/\nCOPY ./Makefile /stash-box/\n\nWORKDIR /stash-box\nRUN make pre-ui\n\nCOPY . /stash-box/\nENV GO111MODULE=on\n\nRUN make generate \nRUN make ui \nRUN make build\n\nFROM ubuntu:19.10 as app\n\nRUN apt-get update && apt-get -y install ca-certificates\nCOPY --from=compiler /stash-box/stash-box /usr/bin/\n\nEXPOSE 9998\nCMD [\"stash-box\", \"--config_file\", \"/root/.stash-box/stash-box-config.yml\"]\n\n\n"
  },
  {
    "path": "docker/build/x86_64/db/initdb.sh",
    "content": "#!/bin/bash\nset -e\n\npsql -v ON_ERROR_STOP=1 --username \"$POSTGRES_USER\" --dbname \"$POSTGRES_DB\" -c 'CREATE DATABASE \"stash-box\";' && \\\npsql -v ON_ERROR_STOP=1 --username \"$POSTGRES_USER\" --dbname \"stash-box\" -c 'CREATE EXTENSION pg_trgm; CREATE EXTENSION pgcrypto;'\n"
  },
  {
    "path": "docker/build/x86_64/docker-compose.yml",
    "content": "# APPNICENAME=Stash-box\n# APPDESCRIPTION=Stash App's own OpenSource video indexing and Perceptual Hashing MetaData API for porn\nversion: '3.4'\nservices:\n  db:\n    image: postgres:12.3\n    restart: always\n    environment:\n      POSTGRES_PASSWORD: stash-box-db\n    volumes:\n      - ./stash-box-data/data:/var/lib/postgresql/data\n      - ./db:/docker-entrypoint-initdb.d\n  stash-box:\n    image: stash-box/build:latest\n    restart: always\n    depends_on:\n      - \"db\"\n    environment:\n      STASH_BOX_DATABASE: postgres:stash-box-db@db/stash-box?sslmode=disable\n    ports:\n      - 9998:9998\n    volumes:\n      - /etc/localtime:/etc/localtime:ro\n      ## Adjust below paths (the left part) to your liking.\n      ## E.g. you can change ./config:/root/.stash to ./stash:/root/.stash\n      \n      ## Keep configs here.\n      - ./config:/root/.stash-box\n"
  },
  {
    "path": "docker/ci/x86_64/Dockerfile",
    "content": "\n# must be built from /dist directory\n\nFROM ubuntu:24.04 as app\nLABEL MAINTAINER=\"https://discord.gg/Uz29ny\"\n\nRUN apt-get update && apt-get install -y libvips\n\nCOPY stash-box-linux /usr/bin/stash-box\n\nEXPOSE 9998\nCMD [\"stash-box\", \"--config_file\", \"/root/.stash-box/stash-box-config.yml\"]\n"
  },
  {
    "path": "docker/ci/x86_64/docker_push.sh",
    "content": "#!/bin/bash\n\nDOCKER_TAG=$1\n\n# must build the image from dist directory\necho \"$DOCKER_PASSWORD\" | docker login -u \"$DOCKER_USERNAME\" --password-stdin\ndocker build -t stashapp/stash-box:$DOCKER_TAG -f ./docker/ci/x86_64/Dockerfile ./dist\n\ndocker push stashapp/stash-box:$DOCKER_TAG\n"
  },
  {
    "path": "docker/production/docker-compose.yml",
    "content": "version: '3.8'\n\nservices:\n  postgres:\n    container_name: postgres\n    build: ./postgres\n    restart: always\n    environment:\n      POSTGRES_USER: <USER>\n      POSTGRES_PASSWORD: <PASSWORD>\n      POSTGRES_DB: <DATABASE>\n    volumes:\n      - /pgdata:/var/lib/postgresql/data\n\n  stash-box:\n    container_name: stash-box\n    image: stashapp/stash-box:development\n    restart: always\n    logging:\n      driver: \"json-file\"\n      options:\n        max-file: \"10\"\n        max-size: \"2m\"\n    links:\n      - postgres\n    volumes:\n      - <CONFIG_DIR>:/root/.stash-box\n    labels:\n      - traefik.http.routers.stash-box.rule=Host(`<DOMAIN>`)\n      - traefik.http.routers.stash-box.tls=true\n      - traefik.http.routers.stash-box.tls.certresolver=stash-box\n      - traefik.port=9998\n\n  traefik:\n    container_name: traefik\n    image: traefik:2.3\n    restart: always\n    ports:\n      - 80:80\n      - 443:443\n    command:\n      - \"--entrypoints.web.address=:80\"\n      - \"--entrypoints.websecure.address=:443\"\n      - \"--entryPoints.web.http.redirections.entryPoint.to=websecure\"\n      - \"--entryPoints.web.http.redirections.entryPoint.scheme=https\"\n      - \"--providers.docker=true\"\n      - \"--certificatesResolvers.stash-box.acme.email=<EMAIL>\"\n      - \"--certificatesResolvers.stash-box.acme.storage=/acme.json\"\n      - \"--certificatesresolvers.stash-box.acme.tlschallenge=true\"\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock:ro\n      - /traefik/acme.json:/acme.json\n"
  },
  {
    "path": "docker/production/postgres/Dockerfile",
    "content": "FROM postgres:18\n\n# Build and install pg-spgist_hamming (pHash matching)\nRUN apt-get update \\\n    && apt-get install -y --no-install-recommends make gcc postgresql-server-dev-18 git ca-certificates \\\n    && git clone --depth 1 https://github.com/fake-name/pg-spgist_hamming.git /tmp/pg-spgist_hamming \\\n    && make -C /tmp/pg-spgist_hamming/bktree \\\n    && make -C /tmp/pg-spgist_hamming/bktree install \\\n    && rm -rf /tmp/pg-spgist_hamming /var/lib/apt/lists/* \\\n    && apt-get purge -y --auto-remove make gcc postgresql-server-dev-18 git\n\n# Install pg_search (ParadeDB full-text search)\nRUN apt-get update \\\n    && apt-get install -y --no-install-recommends curl ca-certificates \\\n    && curl -fLo /tmp/pg_search.deb \\\n        https://github.com/paradedb/paradedb/releases/download/v0.21.8/postgresql-18-pg-search_0.21.8-1PARADEDB-trixie_amd64.deb \\\n    && apt-get install -y /tmp/pg_search.deb \\\n    && rm -f /tmp/pg_search.deb \\\n    && apt-get purge -y curl \\\n    && rm -rf /var/lib/apt/lists/*\n"
  },
  {
    "path": "frontend/.gitattributes",
    "content": "src/**/*.ts* text eol=lf\n"
  },
  {
    "path": "frontend/.gitignore",
    "content": ".idea/\ndist/\nnode_modules/\nsrc/**/*.jsx\ntests/__coverage__/\ntests/**/*.jsx\n.eslintcache\n.env*.local\nbuild\n*.swp\n"
  },
  {
    "path": "frontend/.nvmrc",
    "content": "24\n"
  },
  {
    "path": "frontend/README.md",
    "content": "# Stash-box frontend\n\nThis project builds the frontend for the stash-box server. It can be used to build the static bundle for the go server, or be run standalone for development purposes.\n\n## Setup / Installing\nMake sure your environment is up to date:\n- node >= `22`\n- pnpm >= `9`\n\nFor `node` installation instructions, please see the websites for [node.js](https://nodejs.org/en/download/).\n\n`PNPM` can usually be installed by running `corepack enable pnpm`. For other options, see the [PNPM website](https://pnpm.io/installation).\n\n\nInstall dependencies\n\n```shell\npnpm i\n```\n\n## GraphQL development\nIf any queries/mutations or the schema on the server is updated, the Typescript types can be updated with:\n```shell\npnpm generate\n```\n\n## Running\n\n### Local development server\n\nThe API key can be set in the environment configuration. To do so, you will need to initialize the environment configuration:\n\n```shell\ncp .env.development.local.shadow .env.development.local\n```\n\nFill in the `VITE_APIKEY` variable in `.env.development.local` with the API key for the user.\n\nRun the local development server:\n\n```shell\npnpm start\n```\n\nThe server will by default start on [http://localhost:3001](http://localhost:3001) and will automatically be updated whenever any changes are made. The port can be changed by uncommenting the `PORT` entry and setting the value in the `.env.development.local` file.\n\nRun the linter:\n\n```shell\npnpm lint\n```\n\nRun the code formatter:\n\n```shell\npnpm format\n```\n\nBuild the release bundle:\n\n```shell\npnpm build\n```\n\nRun the validation (before submitting a Pull Request)\n\n```shell\npnpm validate\n```\n"
  },
  {
    "path": "frontend/biome.json",
    "content": "{\n  \"$schema\": \"https://biomejs.dev/schemas/2.2.0/schema.json\",\n  \"vcs\": { \"enabled\": false, \"clientKind\": \"git\", \"useIgnoreFile\": false },\n  \"files\": {\n    \"ignoreUnknown\": false,\n    \"includes\": [\"src/**\", \"!src/graphql/types.ts\"]\n  },\n  \"formatter\": { \"enabled\": true, \"indentStyle\": \"space\", \"indentWidth\": 2 },\n  \"javascript\": { \"formatter\": { \"quoteStyle\": \"double\" }, \"globals\": [] },\n  \"linter\": {\n    \"rules\": {\n      \"a11y\": {\n        \"useSemanticElements\": \"off\"\n      },\n      \"correctness\": {\n        \"useUniqueElementIds\": \"off\"\n      }\n    }\n  },\n  \"assist\": {\n    \"enabled\": true,\n    \"actions\": { \"source\": { \"organizeImports\": \"on\" } }\n  }\n}\n"
  },
  {
    "path": "frontend/codegen.yml",
    "content": "overwrite: true\nschema: \"../graphql/schema/**/*.graphql\"\ndocuments: \"src/graphql/**/*.gql\"\ngenerates:\n  src/graphql/types.ts:\n    plugins:\n      - typescript\n      - typescript-operations\n      - typed-document-node\n    config:\n      dedupeOperationSuffix: true\n      scalars:\n        Date: string\n        DateTime: string\n        Time: string\n        Upload: File\n        FingerprintHash: string\n      namingConvention:\n        enumValues: change-case-all#upperCase\n      nonOptionalTypename: true\n"
  },
  {
    "path": "frontend/embed.go",
    "content": "package frontend\n\nimport \"embed\"\n\n//go:embed build\nvar FS embed.FS\n"
  },
  {
    "path": "frontend/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta\n      name=\"viewport\"\n      content=\"width=device-width, initial-scale=1\"\n    />\n    <meta name=\"theme-color\" content=\"#000000\" />\n    <link rel=\"manifest\" href=\"/manifest.json\" />\n    <title>{{.}}</title>\n  </head>\n  <body>\n    <noscript>You need to enable JavaScript to run this app.</noscript>\n    <div id=\"root\"></div>\n    <script type=\"module\" src=\"/src/index.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "frontend/package.json",
    "content": "{\n  \"name\": \"stash-box-frontend\",\n  \"version\": \"0.1.0\",\n  \"description\": \"Stash-box\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"start\": \"vite --host\",\n    \"build\": \"vite build\",\n    \"validate\": \"pnpm lint && pnpm format-check && tsc --noEmit\",\n    \"lint\": \"pnpm biome lint src\",\n    \"generate\": \"graphql-codegen --config codegen.yml\",\n    \"format\": \"pnpm biome format --write\",\n    \"format-check\": \"pnpm biome format\",\n    \"analyze\": \"analyze=true vite build\"\n  },\n  \"engines\": {\n    \"node\": \">=24\",\n    \"yarn\": \"Please use pnpm\",\n    \"npm\": \"Please use pnpm\"\n  },\n  \"packageManager\": \"pnpm@9.0.5\",\n  \"devDependencies\": {\n    \"@biomejs/biome\": \"^2.4.10\",\n    \"@graphql-codegen/cli\": \"^6.2.1\",\n    \"@graphql-codegen/typed-document-node\": \"^6.1.7\",\n    \"@graphql-codegen/typescript\": \"^5.0.9\",\n    \"@graphql-codegen/typescript-operations\": \"^5.0.9\",\n    \"@graphql-typed-document-node/core\": \"^3.2.0\",\n    \"@types/apollo-upload-client\": \"^19.0.0\",\n    \"@types/lodash-es\": \"^4.17.12\",\n    \"@types/node\": \"~24\",\n    \"@types/react\": \"^18.3.1\",\n    \"@types/react-dom\": \"^18.3.1\",\n    \"@types/react-helmet\": \"^6.1.11\",\n    \"@vitejs/plugin-react\": \"^6.0.1\",\n    \"rollup-plugin-analyzer\": \"^4.0.0\",\n    \"sass\": \"~1.77.6\",\n    \"typescript\": \"~6.0.2\",\n    \"vite\": \"^8.0.3\",\n    \"vite-plugin-graphql-loader\": \"^5.0.1\"\n  },\n  \"dependencies\": {\n    \"@apollo/client\": \"4.1.6\",\n    \"@fortawesome/fontawesome-svg-core\": \"^7.1.0\",\n    \"@fortawesome/free-regular-svg-icons\": \"^7.1.0\",\n    \"@fortawesome/free-solid-svg-icons\": \"^7.1.0\",\n    \"@fortawesome/react-fontawesome\": \"^3.1.1\",\n    \"@hookform/lenses\": \"^0.9.0\",\n    \"@hookform/resolvers\": \"5.2.2\",\n    \"apollo-upload-client\": \"^19.0.0\",\n    \"bootstrap\": \"5.2.3\",\n    \"classnames\": \"^2.5.1\",\n    \"graphql\": \"^16.13.2\",\n    \"graphql-tag\": \"^2.12.6\",\n    \"i18n-iso-countries\": \"^7.14.0\",\n    \"lodash-es\": \"^4.18.1\",\n    \"p-debounce\": \"^5.1.0\",\n    \"query-string\": \"^9.3.1\",\n    \"react\": \"^18.3.1\",\n    \"react-bootstrap\": \"^2.10.10\",\n    \"react-bootstrap-typeahead\": \"^6.4.1\",\n    \"react-dom\": \"^18.3.1\",\n    \"react-helmet\": \"^6.1.0\",\n    \"react-hook-form\": \"7.72.1\",\n    \"react-markdown\": \"^10.1.0\",\n    \"react-responsive-carousel\": \"^3.2.23\",\n    \"react-router-dom\": \"^6.30.2\",\n    \"react-select\": \"5.8.3\",\n    \"rehype-external-links\": \"^3.0.0\",\n    \"remark-breaks\": \"^4.0.0\",\n    \"remark-gfm\": \"^4.0.1\",\n    \"temporal-polyfill\": \"^0.3.2\",\n    \"yup\": \"1.0.1\"\n  },\n  \"browserslist\": {\n    \"production\": [\n      \">0.2%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 1 chrome version\",\n      \"last 1 firefox version\",\n      \"last 1 safari version\"\n    ]\n  }\n}\n"
  },
  {
    "path": "frontend/src/App.scss",
    "content": "@import \"./styles/theme\";\n@import \"./hooks/toast\";\n@import \"./pages/home/styles\";\n@import \"./pages/users/styles\";\n@import \"./pages/notifications/styles\";\n@import \"./pages/performers/styles\";\n@import \"./pages/scenes/styles\";\n@import \"./pages/scenes/sceneForm/styles\";\n@import \"./pages/studios/styles\";\n@import \"./pages/search/search\";\n@import \"./components/checkboxSelect/styles\";\n@import \"./components/editCard/styles\";\n@import \"./components/form/styles\";\n@import \"./components/fragments/styles\";\n@import \"./components/imageCarousel/styles\";\n@import \"./components/imageChangeRow/styles\";\n@import \"./components/list/styles\";\n@import \"./components/performerCard/styles\";\n@import \"./components/performerSelect/styles\";\n@import \"./components/sceneCard/styles\";\n@import \"./components/searchField/styles\";\n@import \"./components/studioSelect/styles\";\n@import \"./components/tagFilter/styles\";\n@import \"./components/tagSelect/styles\";\n@import \"./components/editImages/styles\";\n@import \"./components/urlInput/styles\";\n@import \"./components/image/styles\";\n@import \"react-bootstrap-typeahead/css/Typeahead.css\";\n\n/* this is a bit of a hack, because we can't supply direct class names\n   to the react-select controls */\n/* stylelint-disable selector-class-pattern */\n\n.react-select__control {\n  background-color: $secondary;\n  border-color: $secondary;\n  color: $text-color;\n  cursor: pointer;\n\n  .react-select__single-value,\n  .react-select__input {\n    color: black;\n  }\n\n  .react-select__multi-value {\n    background-color: $muted-gray;\n    color: $text-color;\n  }\n}\n\ndiv.react-select__menu {\n  background-color: $secondary;\n  color: $text-color;\n  z-index: 2;\n\n  .react-select__option {\n    color: $text-color;\n  }\n\n  .react-select__option--is-focused {\n    background-color: #8a9ba826;\n    cursor: pointer;\n  }\n}\n\n.LoginPrompt {\n  height: 70vh;\n  width: 960px;\n  margin-left: auto;\n  margin-right: auto;\n  display: flex;\n\n  a {\n    color: $link-color;\n  }\n}\n\n.bullet-separator {\n  &::before {\n    content: \"\\2022\";\n    margin: 0 0.5rem;\n  }\n}\n\n.PendingEditTab {\n  color: $warning !important;\n}\n\n.MainContent {\n  padding-top: 2rem;\n  padding-bottom: 1rem;\n}\n\n.NarrowPage {\n  margin: auto;\n  max-width: 1200px;\n}\n\n.NotificationBadge {\n  color: white;\n\n  &:active,\n  &:hover {\n    color: var(--bs-gray-500);\n  }\n}\n"
  },
  {
    "path": "frontend/src/App.tsx",
    "content": "import type { FC } from \"react\";\nimport { ApolloProvider } from \"@apollo/client/react\";\nimport { BrowserRouter, Route, Routes } from \"react-router-dom\";\nimport { config as fontAwesomeConfig } from \"@fortawesome/fontawesome-svg-core\";\n\nimport Main from \"src/Main\";\nimport createClient from \"src/utils/createClient\";\nimport Pages from \"src/pages\";\nimport Title from \"src/components/title\";\nimport { ToastProvider } from \"src/hooks/useToast\";\n\nfontAwesomeConfig.autoAddCss = false;\n\nimport \"./App.scss\";\nimport \"@fortawesome/fontawesome-svg-core/styles.css\";\n\nconst client = createClient();\n\nconst App: FC = () => (\n  <ApolloProvider client={client}>\n    <BrowserRouter>\n      <ToastProvider>\n        <Routes>\n          <Route\n            path=\"/*\"\n            element={\n              <Main>\n                <Title />\n                <Pages />\n              </Main>\n            }\n          />\n        </Routes>\n      </ToastProvider>\n    </BrowserRouter>\n  </ApolloProvider>\n);\n\nexport default App;\n"
  },
  {
    "path": "frontend/src/Login.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { Link, useLocation, useNavigate } from \"react-router-dom\";\nimport { useForm } from \"react-hook-form\";\nimport { Button, Col, Form, Row } from \"react-bootstrap\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as yup from \"yup\";\nimport cx from \"classnames\";\n\nimport { ROUTE_REGISTER, ROUTE_FORGOT_PASSWORD } from \"src/constants/route\";\nimport { getPlatformURL, getCredentialsSetting } from \"src/utils/createClient\";\n\nimport \"./App.scss\";\nimport { useCurrentUser } from \"./hooks\";\n\nconst schema = yup.object({\n  username: yup.string().required(\"Username is required\"),\n  password: yup.string().required(\"Password is required\"),\n});\ntype LoginFormData = yup.InferType<typeof schema>;\n\nconst Messages: Record<string, string> = {\n  \"password-reset\": \"Password successfully reset\",\n  \"account-created\": \"Account successfully created\",\n};\n\nconst Login: FC = () => {\n  const [loading, setLoading] = useState(false);\n  const location = useLocation();\n  const navigate = useNavigate();\n  const [loginError, setLoginError] = useState(\"\");\n  const msg = new URLSearchParams(location.search).get(\"msg\");\n  const redirect = new URLSearchParams(location.search).get(\"redirect\");\n  const { isAuthenticated } = useCurrentUser();\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm<LoginFormData>({\n    resolver: yupResolver(schema),\n  });\n\n  if (isAuthenticated) navigate(\"/\");\n\n  const onSubmit = async (formData: LoginFormData) => {\n    setLoading(true);\n\n    const body = new FormData();\n    body.append(\"username\", formData.username);\n    body.append(\"password\", formData.password);\n\n    const res = await fetch(`${getPlatformURL()}login`, {\n      method: \"POST\",\n      body,\n      credentials: getCredentialsSetting(),\n    }).finally(() => setLoading(false));\n\n    const returnURL = decodeURIComponent(redirect ?? \"\") || \"/\";\n    if (res.ok) window.location.replace(returnURL);\n    else setLoginError(\"Access denied\");\n  };\n\n  return (\n    <div className=\"LoginPrompt\">\n      <Form\n        className=\"align-self-center col-4 mx-auto\"\n        onSubmit={handleSubmit(onSubmit)}\n      >\n        <Form.Floating>\n          <Form.Control\n            className={cx({ \"is-invalid\": errors?.username })}\n            placeholder=\"Username\"\n            {...register(\"username\")}\n          />\n          <Form.Label>Username</Form.Label>\n          <div className=\"invalid-feedback text-end\">\n            {errors?.username?.message}\n          </div>\n        </Form.Floating>\n        <Form.Floating className=\"my-3\">\n          <Form.Control\n            type=\"password\"\n            className={cx({ \"is-invalid\": errors?.password })}\n            placeholder=\"Password\"\n            {...register(\"password\")}\n          />\n          <Form.Label>Password</Form.Label>\n          <div className=\"invalid-feedback text-end\">\n            {errors?.password?.message}\n          </div>\n        </Form.Floating>\n        <Row>\n          <Col xs={9}>\n            <div>\n              <Link to={ROUTE_REGISTER}>\n                <small>Register</small>\n              </Link>\n            </div>\n            <div>\n              <Link to={ROUTE_FORGOT_PASSWORD}>\n                <small>Forgot Password</small>\n              </Link>\n            </div>\n          </Col>\n          <Col xs={3} className=\"d-flex justify-content-end\">\n            <div>\n              <Button type=\"submit\" className=\"login-button\" disabled={loading}>\n                Login\n              </Button>\n            </div>\n          </Col>\n        </Row>\n        <Row>\n          <p className=\"col text-end text-danger\">{loginError}</p>\n        </Row>\n        <Row>\n          <p className=\"col text-end text-success\">\n            {Messages[msg ?? \"\"] ?? \"\"}\n          </p>\n        </Row>\n      </Form>\n    </div>\n  );\n};\n\nexport default Login;\n"
  },
  {
    "path": "frontend/src/Main.tsx",
    "content": "import { type FC, useEffect } from \"react\";\nimport { Navbar, Nav, Button, Badge } from \"react-bootstrap\";\nimport { NavLink, useLocation, useNavigate, Link } from \"react-router-dom\";\nimport { faBell, faBook, faUser } from \"@fortawesome/free-solid-svg-icons\";\nimport { faBell as faBellOutlined } from \"@fortawesome/free-regular-svg-icons\";\n\nimport SearchField, { SearchType } from \"src/components/searchField\";\nimport { getPlatformURL, getCredentialsSetting } from \"src/utils/createClient\";\nimport { userHref, setCachedUser, canEdit, isAdmin } from \"src/utils\";\nimport { useAuth } from \"src/hooks\";\nimport { Icon } from \"src/components/fragments\";\nimport { useConfig, useUnreadNotificationsCount } from \"src/graphql\";\nimport {\n  ROUTE_SCENES,\n  ROUTE_PERFORMERS,\n  ROUTE_TAGS,\n  ROUTE_STUDIOS,\n  ROUTE_EDITS,\n  ROUTE_LOGOUT,\n  ROUTE_LOGIN,\n  ROUTE_USERS,\n  ROUTE_ACTIVATE,\n  ROUTE_RESET_PASSWORD,\n  ROUTE_HOME,\n  ROUTE_REGISTER,\n  ROUTE_FORGOT_PASSWORD,\n  ROUTE_SITES,\n  ROUTE_DRAFTS,\n  ROUTE_NOTIFICATIONS,\n  ROUTE_AUDITS,\n} from \"src/constants/route\";\nimport AuthContext from \"./context\";\n\ninterface Props {\n  children?: React.ReactNode;\n}\n\nconst Main: FC<Props> = ({ children }) => {\n  const location = useLocation();\n  const navigate = useNavigate();\n  const { loading, user } = useAuth();\n  const { data: unreadNotifications } = useUnreadNotificationsCount();\n  const notificationCount =\n    unreadNotifications?.getUnreadNotificationCount || null;\n  const { data: configData } = useConfig();\n\n  const guidelinesURL = configData?.getConfig.guidelines_url;\n\n  useEffect(() => {\n    if (loading || user) return;\n\n    if (\n      location.pathname !== ROUTE_ACTIVATE &&\n      location.pathname !== ROUTE_REGISTER &&\n      location.pathname !== ROUTE_LOGIN &&\n      location.pathname !== ROUTE_FORGOT_PASSWORD &&\n      location.pathname !== ROUTE_RESET_PASSWORD\n    ) {\n      const redirect =\n        location.pathname === \"/\"\n          ? \"\"\n          : `?redirect=${encodeURIComponent(location.pathname)}`;\n      navigate(`${ROUTE_LOGIN}${redirect}`);\n    }\n  }, [loading, user, location, navigate]);\n\n  const contextValue = {\n    authenticated: user !== undefined,\n    user,\n  };\n\n  if (!contextValue.authenticated)\n    return (\n      <AuthContext.Provider value={contextValue}>\n        {children}\n      </AuthContext.Provider>\n    );\n\n  const handleLogout = async () => {\n    const res = await fetch(`${getPlatformURL()}logout`, {\n      credentials: getCredentialsSetting(),\n    });\n    setCachedUser();\n    if (res.ok) window.location.href = ROUTE_LOGIN;\n    return false;\n  };\n\n  const renderUserNav = () =>\n    contextValue.authenticated &&\n    contextValue.user && (\n      <>\n        <Link to={ROUTE_NOTIFICATIONS}>\n          <Button variant=\"link\" className=\"NotificationBadge\">\n            <Icon icon={notificationCount ? faBell : faBellOutlined} />\n            {notificationCount && (\n              <Badge bg=\"danger\" className=\"ms-1\">\n                {notificationCount}\n              </Badge>\n            )}\n          </Button>\n        </Link>\n        <NavLink\n          to={userHref(contextValue.user)}\n          className=\"nav-link ms-auto me-2\"\n        >\n          <Icon icon={faUser} className=\"me-2\" />\n          {contextValue.user.name}\n        </NavLink>\n        {isAdmin(user) && (\n          <NavLink to={ROUTE_USERS} className=\"nav-link\">\n            Users\n          </NavLink>\n        )}\n        <NavLink\n          to={ROUTE_LOGOUT}\n          onClick={handleLogout}\n          className=\"nav-link me-4\"\n        >\n          Logout\n        </NavLink>\n      </>\n    );\n\n  return (\n    <div>\n      <Navbar bg=\"dark\" variant=\"dark\" className=\"px-4\">\n        <Nav className=\"me-auto\">\n          <NavLink to={ROUTE_HOME} className=\"nav-link\">\n            Home\n          </NavLink>\n          <NavLink to={ROUTE_PERFORMERS} className=\"nav-link\">\n            Performers\n          </NavLink>\n          <NavLink to={ROUTE_SCENES} className=\"nav-link\">\n            Scenes\n          </NavLink>\n          <NavLink to={ROUTE_STUDIOS} className=\"nav-link\">\n            Studios\n          </NavLink>\n          <NavLink to={ROUTE_TAGS} className=\"nav-link\">\n            Tags\n          </NavLink>\n          <NavLink to={ROUTE_EDITS} className=\"nav-link\">\n            Edits\n          </NavLink>\n          {canEdit(user) && (\n            <NavLink to={ROUTE_DRAFTS} className=\"nav-link\">\n              Drafts\n            </NavLink>\n          )}\n          {isAdmin(user) && (\n            <>\n              <NavLink to={ROUTE_SITES} className=\"nav-link\">\n                Sites\n              </NavLink>\n              <NavLink to={ROUTE_AUDITS} className=\"nav-link\">\n                Audits\n              </NavLink>\n            </>\n          )}\n          {guidelinesURL && (\n            <a\n              href={guidelinesURL}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"nav-link\"\n            >\n              <Icon icon={faBook} className=\"mx-2\" />\n              Guidelines\n            </a>\n          )}\n        </Nav>\n        <Nav className=\"align-items-center\">\n          {contextValue.authenticated && renderUserNav()}\n          <SearchField searchType={SearchType.Combined} nav showAllLink />\n        </Nav>\n      </Navbar>\n      <AuthContext.Provider value={contextValue}>\n        <main className=\"MainContent container-fluid\">{children}</main>\n      </AuthContext.Provider>\n    </div>\n  );\n};\n\nexport default Main;\n"
  },
  {
    "path": "frontend/src/components/amendableEditCard/AmendableChangeRow.tsx",
    "content": "import type { FC } from \"react\";\nimport { Col, Row, Button } from \"react-bootstrap\";\nimport { faXmark, faUndo } from \"@fortawesome/free-solid-svg-icons\";\nimport cx from \"classnames\";\n\nimport { Icon } from \"src/components/fragments\";\nimport { useAmendment } from \"./AmendmentContext\";\n\nexport interface AmendableChangeRowProps {\n  name?: string;\n  field: string;\n  newValue?: string | number | null;\n  oldValue?: string | number | null;\n  showDiff?: boolean;\n}\n\nconst AmendableChangeRow: FC<AmendableChangeRowProps> = ({\n  name,\n  field,\n  newValue,\n  oldValue,\n  showDiff = false,\n}) => {\n  const { state, clearField, restoreField } = useAmendment();\n  const isRemoved = state.removedFields.has(field);\n\n  if (!name || (!newValue && !oldValue)) return null;\n\n  return (\n    <Row\n      className={cx(\"mb-2\", {\n        \"opacity-50 text-decoration-line-through\": isRemoved,\n      })}\n    >\n      <b className=\"col-2 text-end pt-1\">{name}</b>\n      {showDiff && (\n        <Col xs={4}>\n          <div className=\"EditDiff bg-danger\">{oldValue}</div>\n        </Col>\n      )}\n      <Col xs={showDiff ? 4 : 8}>\n        <div className={cx(\"EditDiff\", { \"bg-success\": showDiff })}>\n          {newValue}\n        </div>\n      </Col>\n      <Col xs={2} className=\"text-end\">\n        {!isRemoved && (\n          <Button\n            variant=\"danger\"\n            size=\"sm\"\n            onClick={() => clearField(field)}\n            title={`Remove ${name} change`}\n          >\n            <Icon icon={faXmark} />\n          </Button>\n        )}\n        {isRemoved && (\n          <Button\n            variant=\"secondary\"\n            size=\"sm\"\n            onClick={() => restoreField(field)}\n            title={`Restore ${name} change`}\n          >\n            <Icon icon={faUndo} />\n          </Button>\n        )}\n      </Col>\n    </Row>\n  );\n};\n\nexport default AmendableChangeRow;\n"
  },
  {
    "path": "frontend/src/components/amendableEditCard/AmendableImageChangeRow.tsx",
    "content": "import type { FC } from \"react\";\nimport { Col, Row, Button } from \"react-bootstrap\";\nimport { faXmark, faUndo } from \"@fortawesome/free-solid-svg-icons\";\nimport cx from \"classnames\";\n\nimport ImageComponent from \"src/components/image\";\nimport { Icon } from \"src/components/fragments\";\nimport { useAmendment } from \"./AmendmentContext\";\n\ntype Image = {\n  height: number;\n  id: string;\n  url: string;\n  width: number;\n};\n\nconst CLASSNAME = \"ImageChangeRow\";\nconst CLASSNAME_IMAGE = `${CLASSNAME}-image`;\n\nexport interface AmendableImageChangeRowProps {\n  field: string;\n  newImages?: (Image | null)[] | null;\n  oldImages?: (Image | null)[] | null;\n  showDiff?: boolean;\n}\n\nconst AmendableImageChangeRow: FC<AmendableImageChangeRowProps> = ({\n  field,\n  newImages,\n  oldImages,\n  showDiff = false,\n}) => {\n  const {\n    state,\n    clearAddedItem,\n    clearRemovedItem,\n    restoreAddedItem,\n    restoreRemovedItem,\n  } = useAmendment();\n\n  const removedAddedIndices = state.removedAddedItems.get(field);\n  const removedRemovedIndices = state.removedRemovedItems.get(field);\n\n  if ((newImages ?? []).length === 0 && (oldImages ?? []).length === 0)\n    return null;\n\n  return (\n    <Row className={CLASSNAME}>\n      <b className=\"col-2 text-end\">Images</b>\n      {showDiff && (\n        <Col xs={4}>\n          {(oldImages ?? []).length > 0 && (\n            <>\n              <h6>Removed</h6>\n              <div className={CLASSNAME}>\n                {(oldImages ?? []).map((image, index) => {\n                  const isRemoved = removedRemovedIndices?.has(index);\n                  return (\n                    <div\n                      key={image?.id ?? `deleted-${index}`}\n                      className={cx(\"d-flex align-items-start mb-2\", {\n                        \"opacity-50\": isRemoved,\n                      })}\n                    >\n                      {image === null ? (\n                        <img className={CLASSNAME_IMAGE} alt=\"Deleted\" />\n                      ) : (\n                        <div className={CLASSNAME_IMAGE}>\n                          <ImageComponent images={image} alt=\"\" size=\"full\" />\n                          <div className=\"text-center\">\n                            {image.width} x {image.height}\n                          </div>\n                        </div>\n                      )}\n                      <div className=\"ms-2\">\n                        {!isRemoved && (\n                          <Button\n                            variant=\"danger\"\n                            size=\"sm\"\n                            onClick={() => clearRemovedItem(field, index)}\n                            title=\"Remove this image change from the edit\"\n                          >\n                            <Icon icon={faXmark} />\n                          </Button>\n                        )}\n                        {isRemoved && (\n                          <Button\n                            variant=\"secondary\"\n                            size=\"sm\"\n                            onClick={() => restoreRemovedItem(field, index)}\n                            title=\"Restore this image\"\n                          >\n                            <Icon icon={faUndo} />\n                          </Button>\n                        )}\n                      </div>\n                    </div>\n                  );\n                })}\n              </div>\n            </>\n          )}\n        </Col>\n      )}\n      <Col xs={showDiff ? 4 : 8}>\n        {(newImages ?? []).length > 0 && (\n          <>\n            {showDiff && <h6>Added</h6>}\n            <div className={CLASSNAME}>\n              {(newImages ?? []).map((image, index) => {\n                const isRemoved = removedAddedIndices?.has(index);\n                return (\n                  <div\n                    key={image?.id ?? `deleted-${index}`}\n                    className={cx(\"d-flex align-items-start mb-2\", {\n                      \"opacity-50\": isRemoved,\n                    })}\n                  >\n                    {image === null ? (\n                      <img className={CLASSNAME_IMAGE} alt=\"Deleted\" />\n                    ) : (\n                      <div className={CLASSNAME_IMAGE}>\n                        <ImageComponent images={image} alt=\"\" size=\"full\" />\n                        <div className=\"text-center\">\n                          {image.width} x {image.height}\n                        </div>\n                      </div>\n                    )}\n                    <div className=\"ms-2\">\n                      {!isRemoved && (\n                        <Button\n                          variant=\"danger\"\n                          size=\"sm\"\n                          onClick={() => clearAddedItem(field, index)}\n                          title=\"Remove this image from the edit\"\n                        >\n                          <Icon icon={faXmark} />\n                        </Button>\n                      )}\n                      {isRemoved && (\n                        <Button\n                          variant=\"secondary\"\n                          size=\"sm\"\n                          onClick={() => restoreAddedItem(field, index)}\n                          title=\"Restore this image\"\n                        >\n                          <Icon icon={faUndo} />\n                        </Button>\n                      )}\n                    </div>\n                  </div>\n                );\n              })}\n            </div>\n          </>\n        )}\n      </Col>\n      <Col xs={2} />\n    </Row>\n  );\n};\n\nexport default AmendableImageChangeRow;\n"
  },
  {
    "path": "frontend/src/components/amendableEditCard/AmendableLinkedChangeRow.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Col, Row, Button } from \"react-bootstrap\";\nimport { faXmark, faUndo } from \"@fortawesome/free-solid-svg-icons\";\nimport cx from \"classnames\";\n\nimport { Icon } from \"src/components/fragments\";\nimport { useAmendment } from \"./AmendmentContext\";\n\ninterface Change {\n  name: string | null | undefined;\n  link: string | null | undefined;\n}\n\ninterface AmendableLinkedChangeRowProps {\n  name: string;\n  field: string;\n  oldEntity?: Change | null;\n  newEntity?: Change | null;\n  showDiff?: boolean;\n}\n\nconst AmendableLinkedChangeRow: FC<AmendableLinkedChangeRowProps> = ({\n  name,\n  field,\n  newEntity,\n  oldEntity,\n  showDiff = false,\n}) => {\n  const { state, clearField, restoreField } = useAmendment();\n  const isRemoved = state.removedFields.has(field);\n\n  function getValue(value: Change | null | undefined) {\n    if (!value?.name) {\n      return;\n    }\n\n    if (!value.link) {\n      return value.name;\n    }\n\n    return <Link to={value.link}>{value.name}</Link>;\n  }\n\n  if (!newEntity?.link && !oldEntity?.link) return null;\n\n  return (\n    <Row\n      className={cx(\"mb-2\", {\n        \"opacity-50 text-decoration-line-through\": isRemoved,\n      })}\n    >\n      <b className=\"col-2 text-end pt-1\">{name}</b>\n      {showDiff && (\n        <Col xs={4} className=\"ms-auto\" key={oldEntity?.name}>\n          <div className=\"EditDiff bg-danger\">{getValue(oldEntity)}</div>\n        </Col>\n      )}\n      <Col xs={showDiff ? 4 : 8} key={newEntity?.name}>\n        <div className={cx(\"EditDiff\", { \"bg-success\": showDiff })}>\n          {getValue(newEntity)}\n        </div>\n      </Col>\n      <Col xs={2} className=\"text-end\">\n        {!isRemoved && (\n          <Button\n            variant=\"danger\"\n            size=\"sm\"\n            onClick={() => clearField(field)}\n            title={`Remove ${name} change`}\n          >\n            <Icon icon={faXmark} />\n          </Button>\n        )}\n        {isRemoved && (\n          <Button\n            variant=\"secondary\"\n            size=\"sm\"\n            onClick={() => restoreField(field)}\n            title={`Restore ${name} change`}\n          >\n            <Icon icon={faUndo} />\n          </Button>\n        )}\n      </Col>\n    </Row>\n  );\n};\n\nexport default AmendableLinkedChangeRow;\n"
  },
  {
    "path": "frontend/src/components/amendableEditCard/AmendableListChangeRow.tsx",
    "content": "import type { PropsWithChildren } from \"react\";\nimport { Col, Row, Button } from \"react-bootstrap\";\nimport { faXmark, faUndo } from \"@fortawesome/free-solid-svg-icons\";\nimport cx from \"classnames\";\n\nimport { Icon } from \"src/components/fragments\";\nimport { useAmendment } from \"./AmendmentContext\";\n\ninterface AmendableListChangeRowProps<T> {\n  added?: T[] | null;\n  removed?: T[] | null;\n  renderItem: (o: T) => JSX.Element | undefined;\n  getKey: (o: T) => string;\n  name: string;\n  field: string;\n  showDiff?: boolean;\n}\n\nconst CLASSNAME = \"ListChangeRow\";\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint\nconst AmendableListChangeRow = <T,>({\n  added,\n  removed,\n  name,\n  field,\n  getKey,\n  renderItem,\n  showDiff,\n}: PropsWithChildren<AmendableListChangeRowProps<T>>) => {\n  const {\n    state,\n    clearAddedItem,\n    clearRemovedItem,\n    restoreAddedItem,\n    restoreRemovedItem,\n  } = useAmendment();\n\n  const removedAddedIndices = state.removedAddedItems.get(field);\n  const removedRemovedIndices = state.removedRemovedItems.get(field);\n\n  if ((added ?? []).length === 0 && (removed ?? []).length === 0) return null;\n\n  return (\n    <Row className={`${CLASSNAME}-${name}`}>\n      <b className=\"col-2 text-end\">{name}</b>\n      {showDiff && (\n        <Col xs={4}>\n          {(removed ?? []).length > 0 && (\n            <>\n              <h6>Removed</h6>\n              <div className={CLASSNAME}>\n                <ul>\n                  {(removed ?? []).map((u, index) => {\n                    const isRemoved = removedRemovedIndices?.has(index);\n                    return (\n                      <li\n                        key={getKey(u)}\n                        className={cx(\"d-flex align-items-center\", {\n                          \"opacity-50 text-decoration-line-through\": isRemoved,\n                        })}\n                      >\n                        <span className=\"flex-grow-1\">{renderItem(u)}</span>\n                        {!isRemoved && (\n                          <Button\n                            variant=\"danger\"\n                            size=\"sm\"\n                            className=\"ms-2\"\n                            onClick={() => clearRemovedItem(field, index)}\n                            title=\"Remove this item from the edit\"\n                          >\n                            <Icon icon={faXmark} />\n                          </Button>\n                        )}\n                        {isRemoved && (\n                          <Button\n                            variant=\"secondary\"\n                            size=\"sm\"\n                            className=\"ms-2\"\n                            onClick={() => restoreRemovedItem(field, index)}\n                            title=\"Restore this item\"\n                          >\n                            <Icon icon={faUndo} />\n                          </Button>\n                        )}\n                      </li>\n                    );\n                  })}\n                </ul>\n              </div>\n            </>\n          )}\n        </Col>\n      )}\n      <Col xs={showDiff ? 4 : 8}>\n        {(added ?? []).length > 0 && (\n          <>\n            {showDiff && <h6>Added</h6>}\n            <div className={CLASSNAME}>\n              <ul>\n                {(added ?? []).map((u, index) => {\n                  const isRemoved = removedAddedIndices?.has(index);\n                  return (\n                    <li\n                      key={getKey(u)}\n                      className={cx(\"d-flex align-items-center\", {\n                        \"opacity-50 text-decoration-line-through\": isRemoved,\n                      })}\n                    >\n                      <span className=\"flex-grow-1\">{renderItem(u)}</span>\n                      {!isRemoved && (\n                        <Button\n                          variant=\"danger\"\n                          size=\"sm\"\n                          className=\"ms-2\"\n                          onClick={() => clearAddedItem(field, index)}\n                          title=\"Remove this item from the edit\"\n                        >\n                          <Icon icon={faXmark} />\n                        </Button>\n                      )}\n                      {isRemoved && (\n                        <Button\n                          variant=\"secondary\"\n                          size=\"sm\"\n                          className=\"ms-2\"\n                          onClick={() => restoreAddedItem(field, index)}\n                          title=\"Restore this item\"\n                        >\n                          <Icon icon={faUndo} />\n                        </Button>\n                      )}\n                    </li>\n                  );\n                })}\n              </ul>\n            </div>\n          </>\n        )}\n      </Col>\n      <Col xs={2} />\n    </Row>\n  );\n};\n\nexport default AmendableListChangeRow;\n"
  },
  {
    "path": "frontend/src/components/amendableEditCard/AmendableModifyEdit.tsx",
    "content": "import type { FC } from \"react\";\nimport { Col, Row, Button } from \"react-bootstrap\";\nimport {\n  faCheck,\n  faXmark,\n  faEdit,\n  faUndo,\n} from \"@fortawesome/free-solid-svg-icons\";\nimport cx from \"classnames\";\n\nimport type {\n  GenderEnum,\n  EthnicityEnum,\n  BreastTypeEnum,\n  EditFragment,\n  HairColorEnum,\n  EyeColorEnum,\n} from \"src/graphql\";\nimport {\n  formatDuration,\n  getCountryByISO,\n  isTagEdit,\n  isPerformerEdit,\n  formatBodyModification,\n  isStudioEdit,\n  isSceneEdit,\n  studioHref,\n  categoryHref,\n  compareByName,\n} from \"src/utils\";\nimport {\n  EthnicityTypes,\n  HairColorTypes,\n  EyeColorTypes,\n  BreastTypes,\n  GenderTypes,\n} from \"src/constants\";\nimport { Icon } from \"src/components/fragments\";\nimport AmendableChangeRow from \"./AmendableChangeRow\";\nimport AmendableListChangeRow from \"./AmendableListChangeRow\";\nimport AmendableImageChangeRow from \"./AmendableImageChangeRow\";\nimport AmendableURLChangeRow from \"./AmendableURLChangeRow\";\nimport AmendableLinkedChangeRow from \"./AmendableLinkedChangeRow\";\nimport {\n  renderPerformer,\n  renderTag,\n  renderFingerprint,\n} from \"src/components/editCard/renderEntity\";\nimport type {\n  PerformerDetails,\n  OldPerformerDetails,\n  SceneDetails,\n  OldSceneDetails,\n  StudioDetails,\n  OldStudioDetails,\n  TagDetails,\n  OldTagDetails,\n} from \"src/components/editCard/ModifyEdit\";\nimport { useAmendment } from \"./AmendmentContext\";\n\ntype Details = EditFragment[\"details\"];\ntype OldDetails = EditFragment[\"old_details\"];\ntype Options = EditFragment[\"options\"];\n\n// Special component for Bra Size which combines band_size and cup_size\nconst AmendableBraSizeRow: FC<{\n  newBandSize?: number | null;\n  newCupSize?: string | null;\n  oldBandSize?: number | null;\n  oldCupSize?: string | null;\n  showDiff: boolean;\n}> = ({ newBandSize, newCupSize, oldBandSize, oldCupSize, showDiff }) => {\n  const { state, clearField, restoreField } = useAmendment();\n  const isRemoved =\n    state.removedFields.has(\"band_size\") || state.removedFields.has(\"cup_size\");\n\n  const newValue = `${newBandSize || \"\"}${newCupSize ?? \"\"}`;\n  const oldValue = `${oldBandSize || \"\"}${oldCupSize ?? \"\"}`;\n\n  if (!newValue && !oldValue) return null;\n\n  const handleClear = () => {\n    clearField(\"band_size\");\n    clearField(\"cup_size\");\n  };\n\n  const handleRestore = () => {\n    restoreField(\"band_size\");\n    restoreField(\"cup_size\");\n  };\n\n  return (\n    <Row\n      className={cx(\"mb-2\", {\n        \"opacity-50 text-decoration-line-through\": isRemoved,\n      })}\n    >\n      <b className=\"col-2 text-end pt-1\">Bra Size</b>\n      {showDiff && (\n        <Col xs={4}>\n          <div className=\"EditDiff bg-danger\">{oldValue}</div>\n        </Col>\n      )}\n      <Col xs={showDiff ? 4 : 8}>\n        <div className={cx(\"EditDiff\", { \"bg-success\": showDiff })}>\n          {newValue}\n        </div>\n      </Col>\n      <Col xs={2} className=\"text-end\">\n        {!isRemoved && (\n          <Button\n            variant=\"danger\"\n            size=\"sm\"\n            onClick={handleClear}\n            title=\"Remove Bra Size change\"\n          >\n            <Icon icon={faXmark} />\n          </Button>\n        )}\n        {isRemoved && (\n          <Button\n            variant=\"secondary\"\n            size=\"sm\"\n            onClick={handleRestore}\n            title=\"Restore Bra Size change\"\n          >\n            <Icon icon={faUndo} />\n          </Button>\n        )}\n      </Col>\n    </Row>\n  );\n};\n\nconst renderAmendableTagDetails = (\n  tagDetails: TagDetails,\n  oldTagDetails: OldTagDetails | undefined,\n  showDiff: boolean,\n) => (\n  <>\n    <AmendableChangeRow\n      name=\"Name\"\n      field=\"name\"\n      newValue={tagDetails.name}\n      oldValue={oldTagDetails?.name}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Description\"\n      field=\"description\"\n      newValue={tagDetails.description}\n      oldValue={oldTagDetails?.description}\n      showDiff={showDiff}\n    />\n    <AmendableLinkedChangeRow\n      name=\"Category\"\n      field=\"category_id\"\n      newEntity={{\n        name: tagDetails.category?.name,\n        link: tagDetails.category && categoryHref(tagDetails.category),\n      }}\n      oldEntity={{\n        name: oldTagDetails?.category?.name,\n        link: oldTagDetails?.category && categoryHref(oldTagDetails.category),\n      }}\n      showDiff={showDiff}\n    />\n    <AmendableListChangeRow\n      name=\"Aliases\"\n      field=\"aliases\"\n      added={tagDetails.added_aliases?.map((a) => ({ value: a }))}\n      removed={tagDetails.removed_aliases?.map((a) => ({ value: a }))}\n      renderItem={(o) => <>{o.value}</>}\n      getKey={(o) => o.value}\n      showDiff={showDiff}\n    />\n  </>\n);\n\nconst renderAmendablePerformerDetails = (\n  performerDetails: PerformerDetails,\n  oldPerformerDetails: OldPerformerDetails | undefined,\n  showDiff: boolean,\n  setModifyAliases: boolean,\n) => (\n  <>\n    {performerDetails.name && (\n      <AmendableChangeRow\n        name=\"Name\"\n        field=\"name\"\n        newValue={performerDetails.name}\n        oldValue={oldPerformerDetails?.name}\n        showDiff={showDiff}\n      />\n    )}\n    {oldPerformerDetails?.name &&\n      performerDetails.name !== oldPerformerDetails.name && (\n        <div className=\"d-flex mb-2 align-items-center\">\n          <Icon\n            icon={setModifyAliases ? faCheck : faXmark}\n            color={setModifyAliases ? \"green\" : \"red\"}\n            className=\"ms-auto\"\n          />\n          <span className=\"ms-2\">Set performance aliases to old name</span>\n        </div>\n      )}\n    <AmendableChangeRow\n      name=\"Disambiguation\"\n      field=\"disambiguation\"\n      newValue={performerDetails.disambiguation}\n      oldValue={oldPerformerDetails?.disambiguation}\n      showDiff={showDiff}\n    />\n    <AmendableListChangeRow\n      name=\"Aliases\"\n      field=\"aliases\"\n      added={performerDetails.added_aliases?.map((a) => ({ value: a }))}\n      removed={performerDetails.removed_aliases?.map((a) => ({ value: a }))}\n      renderItem={(o) => <>{o.value}</>}\n      getKey={(o) => o.value}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Gender\"\n      field=\"gender\"\n      newValue={\n        performerDetails.gender &&\n        GenderTypes[performerDetails.gender as keyof typeof GenderEnum]\n      }\n      oldValue={\n        oldPerformerDetails?.gender &&\n        GenderTypes[oldPerformerDetails.gender as keyof typeof GenderEnum]\n      }\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Birthdate\"\n      field=\"birthdate\"\n      newValue={performerDetails.birthdate}\n      oldValue={oldPerformerDetails?.birthdate}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Deathdate\"\n      field=\"deathdate\"\n      newValue={performerDetails.deathdate}\n      oldValue={oldPerformerDetails?.deathdate}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Eye Color\"\n      field=\"eye_color\"\n      newValue={\n        performerDetails.eye_color &&\n        EyeColorTypes[performerDetails.eye_color as keyof typeof EyeColorEnum]\n      }\n      oldValue={\n        oldPerformerDetails?.eye_color &&\n        EyeColorTypes[\n          oldPerformerDetails.eye_color as keyof typeof EyeColorEnum\n        ]\n      }\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Hair Color\"\n      field=\"hair_color\"\n      newValue={\n        performerDetails.hair_color &&\n        HairColorTypes[\n          performerDetails.hair_color as keyof typeof HairColorEnum\n        ]\n      }\n      oldValue={\n        oldPerformerDetails?.hair_color &&\n        HairColorTypes[\n          oldPerformerDetails.hair_color as keyof typeof HairColorEnum\n        ]\n      }\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Height\"\n      field=\"height\"\n      newValue={performerDetails.height}\n      oldValue={oldPerformerDetails?.height}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Breast Type\"\n      field=\"breast_type\"\n      newValue={\n        performerDetails.breast_type &&\n        BreastTypes[performerDetails.breast_type as keyof typeof BreastTypeEnum]\n      }\n      oldValue={\n        oldPerformerDetails?.breast_type &&\n        BreastTypes[\n          oldPerformerDetails.breast_type as keyof typeof BreastTypeEnum\n        ]\n      }\n      showDiff={showDiff}\n    />\n    <AmendableBraSizeRow\n      newBandSize={performerDetails.band_size}\n      newCupSize={performerDetails.cup_size}\n      oldBandSize={oldPerformerDetails?.band_size}\n      oldCupSize={oldPerformerDetails?.cup_size}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Waist Size\"\n      field=\"waist_size\"\n      newValue={performerDetails.waist_size}\n      oldValue={oldPerformerDetails?.waist_size}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Hip Size\"\n      field=\"hip_size\"\n      newValue={performerDetails.hip_size}\n      oldValue={oldPerformerDetails?.hip_size}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Nationality\"\n      field=\"country\"\n      newValue={getCountryByISO(performerDetails.country)}\n      oldValue={getCountryByISO(oldPerformerDetails?.country)}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Ethnicity\"\n      field=\"ethnicity\"\n      newValue={\n        performerDetails.ethnicity &&\n        EthnicityTypes[performerDetails.ethnicity as keyof typeof EthnicityEnum]\n      }\n      oldValue={\n        oldPerformerDetails?.ethnicity &&\n        EthnicityTypes[\n          oldPerformerDetails.ethnicity as keyof typeof EthnicityEnum\n        ]\n      }\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Career Start\"\n      field=\"career_start_year\"\n      newValue={performerDetails.career_start_year}\n      oldValue={oldPerformerDetails?.career_start_year}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Career End\"\n      field=\"career_end_year\"\n      newValue={performerDetails.career_end_year}\n      oldValue={oldPerformerDetails?.career_end_year}\n      showDiff={showDiff}\n    />\n    <AmendableListChangeRow\n      name=\"Tattoos\"\n      field=\"tattoos\"\n      added={performerDetails.added_tattoos}\n      removed={performerDetails.removed_tattoos}\n      renderItem={(o) => <>{formatBodyModification(o)}</>}\n      getKey={(o) => `${o.location}-${o.description ?? \"\"}`}\n      showDiff={showDiff}\n    />\n    <AmendableListChangeRow\n      name=\"Piercings\"\n      field=\"piercings\"\n      added={performerDetails.added_piercings}\n      removed={performerDetails.removed_piercings}\n      renderItem={(o) => <>{formatBodyModification(o)}</>}\n      getKey={(o) => `${o.location}-${o.description ?? \"\"}`}\n      showDiff={showDiff}\n    />\n    <AmendableURLChangeRow\n      field=\"urls\"\n      newURLs={performerDetails.added_urls}\n      oldURLs={performerDetails.removed_urls}\n      showDiff={showDiff}\n    />\n    <AmendableImageChangeRow\n      field=\"images\"\n      newImages={performerDetails.added_images}\n      oldImages={performerDetails.removed_images}\n      showDiff={showDiff}\n    />\n    {performerDetails.draft_id && (\n      <Row className=\"mb-2\">\n        <Col xs={{ offset: 2 }}>\n          <h6>\n            <Icon icon={faEdit} color=\"green\" />\n            <span className=\"ms-1\">Submitted by draft</span>\n          </h6>\n        </Col>\n      </Row>\n    )}\n  </>\n);\n\nconst renderAmendableSceneDetails = (\n  sceneDetails: SceneDetails,\n  oldSceneDetails: OldSceneDetails | undefined,\n  showDiff: boolean,\n) => (\n  <>\n    {sceneDetails.title && (\n      <AmendableChangeRow\n        name=\"Title\"\n        field=\"title\"\n        newValue={sceneDetails.title}\n        oldValue={oldSceneDetails?.title}\n        showDiff={showDiff}\n      />\n    )}\n    <AmendableChangeRow\n      name=\"Date\"\n      field=\"date\"\n      newValue={sceneDetails.date}\n      oldValue={oldSceneDetails?.date}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Duration\"\n      field=\"duration\"\n      newValue={formatDuration(sceneDetails.duration)}\n      oldValue={formatDuration(oldSceneDetails?.duration)}\n      showDiff={showDiff}\n    />\n    <AmendableListChangeRow\n      name=\"Performers\"\n      field=\"performers\"\n      added={sceneDetails.added_performers}\n      removed={sceneDetails.removed_performers}\n      renderItem={renderPerformer}\n      getKey={(o) => o.performer.id}\n      showDiff={showDiff}\n    />\n    <AmendableLinkedChangeRow\n      name=\"Studio\"\n      field=\"studio_id\"\n      newEntity={{\n        name: sceneDetails.studio?.name,\n        link: sceneDetails.studio && studioHref(sceneDetails.studio),\n      }}\n      oldEntity={{\n        name: oldSceneDetails?.studio?.name,\n        link: oldSceneDetails?.studio && studioHref(oldSceneDetails.studio),\n      }}\n      showDiff={showDiff}\n    />\n    <AmendableURLChangeRow\n      field=\"urls\"\n      newURLs={sceneDetails.added_urls}\n      oldURLs={sceneDetails.removed_urls}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Details\"\n      field=\"details\"\n      newValue={sceneDetails.details}\n      oldValue={oldSceneDetails?.details}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Director\"\n      field=\"director\"\n      newValue={sceneDetails.director}\n      oldValue={oldSceneDetails?.director}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Production Date\"\n      field=\"production_date\"\n      newValue={sceneDetails.production_date}\n      oldValue={oldSceneDetails?.production_date}\n      showDiff={showDiff}\n    />\n    <AmendableChangeRow\n      name=\"Studio Code\"\n      field=\"code\"\n      newValue={sceneDetails.code}\n      oldValue={oldSceneDetails?.code}\n      showDiff={showDiff}\n    />\n    <AmendableListChangeRow\n      name=\"Tags\"\n      field=\"tags\"\n      added={sceneDetails.added_tags?.slice().sort(compareByName)}\n      removed={sceneDetails.removed_tags?.slice().sort(compareByName)}\n      renderItem={renderTag}\n      getKey={(o) => o.id}\n      showDiff={showDiff}\n    />\n    <AmendableImageChangeRow\n      field=\"images\"\n      newImages={sceneDetails?.added_images}\n      oldImages={sceneDetails?.removed_images}\n      showDiff={showDiff}\n    />\n    <AmendableListChangeRow\n      name=\"Fingerprints\"\n      field=\"fingerprints\"\n      added={sceneDetails.added_fingerprints}\n      removed={sceneDetails.removed_fingerprints}\n      renderItem={renderFingerprint}\n      getKey={(o) => `${o.hash}${o.algorithm}`}\n      showDiff={showDiff}\n    />\n    {sceneDetails.draft_id && (\n      <Row className=\"mb-2\">\n        <Col xs={{ offset: 2 }}>\n          <h6>\n            <Icon icon={faEdit} color=\"green\" />\n            <span className=\"ms-1\">Submitted by draft</span>\n          </h6>\n        </Col>\n      </Row>\n    )}\n  </>\n);\n\nconst renderAmendableStudioDetails = (\n  studioDetails: StudioDetails,\n  oldStudioDetails: OldStudioDetails | undefined,\n  showDiff: boolean,\n) => (\n  <>\n    <AmendableChangeRow\n      name=\"Name\"\n      field=\"name\"\n      newValue={studioDetails.name}\n      oldValue={oldStudioDetails?.name}\n      showDiff={showDiff}\n    />\n    <AmendableListChangeRow\n      name=\"Aliases\"\n      field=\"aliases\"\n      added={studioDetails.added_aliases?.map((a) => ({ value: a }))}\n      removed={studioDetails.removed_aliases?.map((a) => ({ value: a }))}\n      renderItem={(o) => <>{o.value}</>}\n      getKey={(o) => o.value}\n      showDiff={showDiff}\n    />\n    <AmendableLinkedChangeRow\n      name=\"Network\"\n      field=\"parent_id\"\n      newEntity={{\n        name: studioDetails.parent?.name,\n        link: studioDetails.parent && studioHref(studioDetails.parent),\n      }}\n      oldEntity={{\n        name: oldStudioDetails?.parent?.name,\n        link: oldStudioDetails?.parent && studioHref(oldStudioDetails.parent),\n      }}\n      showDiff={showDiff}\n    />\n    <AmendableURLChangeRow\n      field=\"urls\"\n      newURLs={studioDetails.added_urls}\n      oldURLs={studioDetails.removed_urls}\n      showDiff={showDiff}\n    />\n    <AmendableImageChangeRow\n      field=\"images\"\n      newImages={studioDetails.added_images}\n      oldImages={studioDetails.removed_images}\n      showDiff={showDiff}\n    />\n  </>\n);\n\ninterface AmendableModifyEditProps {\n  details: Details | null;\n  oldDetails?: OldDetails | null;\n  options?: Options;\n}\n\nconst AmendableModifyEdit: FC<AmendableModifyEditProps> = ({\n  details,\n  oldDetails,\n  options,\n}) => {\n  if (!details) return null;\n\n  const showDiff = !!oldDetails;\n\n  if (isTagEdit(details) && (isTagEdit(oldDetails) || !oldDetails)) {\n    return renderAmendableTagDetails(\n      details,\n      oldDetails ?? undefined,\n      showDiff,\n    );\n  }\n\n  if (\n    isPerformerEdit(details) &&\n    (isPerformerEdit(oldDetails) || !oldDetails)\n  ) {\n    return renderAmendablePerformerDetails(\n      details,\n      oldDetails ?? undefined,\n      showDiff,\n      options?.set_modify_aliases ?? false,\n    );\n  }\n\n  if (isStudioEdit(details) && (isStudioEdit(oldDetails) || !oldDetails)) {\n    return renderAmendableStudioDetails(\n      details,\n      oldDetails ?? undefined,\n      showDiff,\n    );\n  }\n\n  if (isSceneEdit(details) && (isSceneEdit(oldDetails) || !oldDetails)) {\n    return renderAmendableSceneDetails(\n      details,\n      oldDetails ?? undefined,\n      showDiff,\n    );\n  }\n\n  return null;\n};\n\nexport default AmendableModifyEdit;\n"
  },
  {
    "path": "frontend/src/components/amendableEditCard/AmendableURLChangeRow.tsx",
    "content": "import type { FC } from \"react\";\nimport { Col, Row, Button } from \"react-bootstrap\";\nimport { faXmark, faUndo } from \"@fortawesome/free-solid-svg-icons\";\nimport cx from \"classnames\";\n\nimport { SiteLink, Icon } from \"src/components/fragments\";\nimport type { URL } from \"src/components/urlChangeRow\";\nimport { useAmendment } from \"./AmendmentContext\";\n\nconst CLASSNAME = \"URLChangeRow\";\n\ninterface AmendableURLChangeRowProps {\n  field: string;\n  newURLs?: URL[] | null;\n  oldURLs?: URL[] | null;\n  showDiff?: boolean;\n}\n\nconst AmendableURLChangeRow: FC<AmendableURLChangeRowProps> = ({\n  field,\n  newURLs,\n  oldURLs,\n  showDiff,\n}) => {\n  const {\n    state,\n    clearAddedItem,\n    clearRemovedItem,\n    restoreAddedItem,\n    restoreRemovedItem,\n  } = useAmendment();\n\n  const removedAddedIndices = state.removedAddedItems.get(field);\n  const removedRemovedIndices = state.removedRemovedItems.get(field);\n\n  if ((newURLs ?? []).length === 0 && (oldURLs ?? []).length === 0) return null;\n\n  return (\n    <Row className={CLASSNAME}>\n      <b className=\"col-2 text-end\">Links</b>\n      {showDiff && (\n        <Col xs={4}>\n          {(oldURLs ?? []).length > 0 && (\n            <>\n              <h6>Removed</h6>\n              <div className={CLASSNAME}>\n                <ul className=\"ps-0\">\n                  {(oldURLs ?? []).map((url, index) => {\n                    const isRemoved = removedRemovedIndices?.has(index);\n                    return (\n                      <li\n                        key={url.url}\n                        className={cx(\"d-flex align-items-start\", {\n                          \"opacity-50 text-decoration-line-through\": isRemoved,\n                        })}\n                      >\n                        <SiteLink site={url.site} />\n                        <a\n                          href={url.url}\n                          target=\"_blank\"\n                          rel=\"noopener noreferrer\"\n                          className=\"d-inline-block flex-grow-1 text-break\"\n                        >\n                          {url.url}\n                        </a>\n                        {!isRemoved && (\n                          <Button\n                            variant=\"danger\"\n                            size=\"sm\"\n                            className=\"ms-2\"\n                            onClick={() => clearRemovedItem(field, index)}\n                            title=\"Remove this URL change from the edit\"\n                          >\n                            <Icon icon={faXmark} />\n                          </Button>\n                        )}\n                        {isRemoved && (\n                          <Button\n                            variant=\"secondary\"\n                            size=\"sm\"\n                            className=\"ms-2\"\n                            onClick={() => restoreRemovedItem(field, index)}\n                            title=\"Restore this URL\"\n                          >\n                            <Icon icon={faUndo} />\n                          </Button>\n                        )}\n                      </li>\n                    );\n                  })}\n                </ul>\n              </div>\n            </>\n          )}\n        </Col>\n      )}\n      <Col xs={showDiff ? 4 : 8}>\n        {(newURLs ?? []).length > 0 && (\n          <>\n            {showDiff && <h6>Added</h6>}\n            <div className={CLASSNAME}>\n              <ul className=\"ps-0\">\n                {(newURLs ?? []).map((url, index) => {\n                  const isRemoved = removedAddedIndices?.has(index);\n                  return (\n                    <li\n                      key={url.url}\n                      className={cx(\"d-flex align-items-start\", {\n                        \"opacity-50 text-decoration-line-through\": isRemoved,\n                      })}\n                    >\n                      <SiteLink site={url.site} />\n                      <a\n                        href={url.url}\n                        target=\"_blank\"\n                        rel=\"noopener noreferrer\"\n                        className=\"d-inline-block flex-grow-1 text-break\"\n                      >\n                        {url.url}\n                      </a>\n                      {!isRemoved && (\n                        <Button\n                          variant=\"danger\"\n                          size=\"sm\"\n                          className=\"ms-2\"\n                          onClick={() => clearAddedItem(field, index)}\n                          title=\"Remove this URL from the edit\"\n                        >\n                          <Icon icon={faXmark} />\n                        </Button>\n                      )}\n                      {isRemoved && (\n                        <Button\n                          variant=\"secondary\"\n                          size=\"sm\"\n                          className=\"ms-2\"\n                          onClick={() => restoreAddedItem(field, index)}\n                          title=\"Restore this URL\"\n                        >\n                          <Icon icon={faUndo} />\n                        </Button>\n                      )}\n                    </li>\n                  );\n                })}\n              </ul>\n            </div>\n          </>\n        )}\n      </Col>\n      <Col xs={2} />\n    </Row>\n  );\n};\n\nexport default AmendableURLChangeRow;\n"
  },
  {
    "path": "frontend/src/components/amendableEditCard/AmendmentContext.tsx",
    "content": "import {\n  createContext,\n  useContext,\n  useState,\n  useCallback,\n  type FC,\n  type ReactNode,\n} from \"react\";\n\nexport interface AmendmentState {\n  removedFields: Set<string>;\n  removedAddedItems: Map<string, Set<number>>;\n  removedRemovedItems: Map<string, Set<number>>;\n}\n\ninterface AmendmentContextValue {\n  state: AmendmentState;\n  clearField: (field: string) => void;\n  clearAddedItem: (field: string, index: number) => void;\n  clearRemovedItem: (field: string, index: number) => void;\n  restoreField: (field: string) => void;\n  restoreAddedItem: (field: string, index: number) => void;\n  restoreRemovedItem: (field: string, index: number) => void;\n  hasChanges: boolean;\n}\n\nconst AmendmentContext = createContext<AmendmentContextValue | null>(null);\n\nexport const useAmendment = () => {\n  const context = useContext(AmendmentContext);\n  if (!context) {\n    throw new Error(\"useAmendment must be used within AmendmentProvider\");\n  }\n  return context;\n};\n\nexport const useAmendmentOptional = () => useContext(AmendmentContext);\n\ninterface AmendmentProviderProps {\n  children: ReactNode;\n}\n\nexport const AmendmentProvider: FC<AmendmentProviderProps> = ({ children }) => {\n  const [removedFields, setRemovedFields] = useState<Set<string>>(new Set());\n  const [removedAddedItems, setRemovedAddedItems] = useState<\n    Map<string, Set<number>>\n  >(new Map());\n  const [removedRemovedItems, setRemovedRemovedItems] = useState<\n    Map<string, Set<number>>\n  >(new Map());\n\n  const clearField = useCallback((field: string) => {\n    setRemovedFields((prev) => {\n      const next = new Set(prev);\n      next.add(field);\n      return next;\n    });\n  }, []);\n\n  const clearAddedItem = useCallback((field: string, index: number) => {\n    setRemovedAddedItems((prev) => {\n      const next = new Map(prev);\n      const indices = next.get(field) ?? new Set<number>();\n      indices.add(index);\n      next.set(field, indices);\n      return next;\n    });\n  }, []);\n\n  const clearRemovedItem = useCallback((field: string, index: number) => {\n    setRemovedRemovedItems((prev) => {\n      const next = new Map(prev);\n      const indices = next.get(field) ?? new Set<number>();\n      indices.add(index);\n      next.set(field, indices);\n      return next;\n    });\n  }, []);\n\n  const restoreField = useCallback((field: string) => {\n    setRemovedFields((prev) => {\n      const next = new Set(prev);\n      next.delete(field);\n      return next;\n    });\n  }, []);\n\n  const restoreAddedItem = useCallback((field: string, index: number) => {\n    setRemovedAddedItems((prev) => {\n      const next = new Map(prev);\n      const indices = next.get(field);\n      if (indices) {\n        indices.delete(index);\n        if (indices.size === 0) {\n          next.delete(field);\n        } else {\n          next.set(field, indices);\n        }\n      }\n      return next;\n    });\n  }, []);\n\n  const restoreRemovedItem = useCallback((field: string, index: number) => {\n    setRemovedRemovedItems((prev) => {\n      const next = new Map(prev);\n      const indices = next.get(field);\n      if (indices) {\n        indices.delete(index);\n        if (indices.size === 0) {\n          next.delete(field);\n        } else {\n          next.set(field, indices);\n        }\n      }\n      return next;\n    });\n  }, []);\n\n  const hasChanges =\n    removedFields.size > 0 ||\n    Array.from(removedAddedItems.values()).some((s) => s.size > 0) ||\n    Array.from(removedRemovedItems.values()).some((s) => s.size > 0);\n\n  const value: AmendmentContextValue = {\n    state: {\n      removedFields,\n      removedAddedItems,\n      removedRemovedItems,\n    },\n    clearField,\n    clearAddedItem,\n    clearRemovedItem,\n    restoreField,\n    restoreAddedItem,\n    restoreRemovedItem,\n    hasChanges,\n  };\n\n  return (\n    <AmendmentContext.Provider value={value}>\n      {children}\n    </AmendmentContext.Provider>\n  );\n};\n"
  },
  {
    "path": "frontend/src/components/amendableEditCard/index.ts",
    "content": "export { default as AmendableModifyEdit } from \"./AmendableModifyEdit\";\nexport { default as AmendableChangeRow } from \"./AmendableChangeRow\";\nexport { default as AmendableListChangeRow } from \"./AmendableListChangeRow\";\nexport { default as AmendableURLChangeRow } from \"./AmendableURLChangeRow\";\nexport { default as AmendableImageChangeRow } from \"./AmendableImageChangeRow\";\nexport { default as AmendableLinkedChangeRow } from \"./AmendableLinkedChangeRow\";\nexport {\n  AmendmentProvider,\n  useAmendment,\n  type AmendmentState,\n} from \"./AmendmentContext\";\n"
  },
  {
    "path": "frontend/src/components/changeRow/ChangeRow.tsx",
    "content": "import type { FC } from \"react\";\nimport { Col, Row } from \"react-bootstrap\";\nimport cx from \"classnames\";\n\nexport interface ChangeRowProps {\n  name?: string;\n  newValue?: string | number | null;\n  oldValue?: string | number | null;\n  showDiff?: boolean;\n}\n\nconst ChangeRow: FC<ChangeRowProps> = ({\n  name,\n  newValue,\n  oldValue,\n  showDiff = false,\n}) =>\n  name && (newValue || oldValue) ? (\n    <Row className=\"mb-2\">\n      <b className=\"col-2 text-end pt-1\">{name}</b>\n      {showDiff && (\n        <Col xs={5}>\n          <div className=\"EditDiff bg-danger\">{oldValue}</div>\n        </Col>\n      )}\n      <Col xs={showDiff ? 5 : 10}>\n        <div className={cx(\"EditDiff\", { \"bg-success\": showDiff })}>\n          {newValue}\n        </div>\n      </Col>\n    </Row>\n  ) : null;\n\nexport default ChangeRow;\n"
  },
  {
    "path": "frontend/src/components/changeRow/index.ts",
    "content": "export { default } from \"./ChangeRow\";\n"
  },
  {
    "path": "frontend/src/components/checkboxSelect/CheckboxSelect.tsx",
    "content": "// biome-ignore-all lint/correctness/noNestedComponentDefinitions: Necessary for react-select\nimport type { FC } from \"react\";\nimport Select, { type OnChangeValue } from \"react-select\";\nimport { Form } from \"react-bootstrap\";\nimport { uniq } from \"lodash-es\";\n\ninterface MultiSelectProps {\n  values: IOptionType[];\n  onChange: (values: string[]) => void;\n  placeholder?: string;\n  plural?: string;\n  selected?: string[];\n}\n\ninterface IOptionType {\n  label: string;\n  value: string;\n  subValues: string[] | null;\n}\n\nconst CheckboxSelect: FC<MultiSelectProps> = ({\n  values,\n  onChange,\n  placeholder = \"Select...\",\n  plural = \"values\",\n  selected = [],\n}) => {\n  const handleChange = (vals: OnChangeValue<IOptionType, true>) => {\n    onChange(uniq(vals.flatMap((v) => [v.value, ...(v.subValues ?? [])])));\n  };\n\n  const formatLabel = (\n    option: IOptionType,\n    meta: { context: \"menu\" | \"value\" },\n  ) => {\n    if (meta.context === \"menu\")\n      return option.subValues === null ? (\n        <div className=\"d-flex ms-3\">\n          <Form.Check\n            className=\"me-2\"\n            checked={selected.includes(option.value)}\n          />\n          {option.label}\n        </div>\n      ) : (\n        <div className=\"d-flex\">\n          <Form.Check\n            className=\"me-2\"\n            checked={selected.includes(option.value)}\n          />\n          <span className=\"text-muted\">{option.label}</span>\n        </div>\n      );\n    return `${\n      selected.length === 0 ? \"All\" : selected.length\n    } ${plural} selected`;\n  };\n\n  const selectedOptions = values.filter((val) => selected.includes(val.value));\n\n  return (\n    <Select\n      value={selectedOptions}\n      isMulti\n      classNamePrefix=\"react-select\"\n      className=\"react-select CheckboxSelect\"\n      options={values}\n      onChange={handleChange}\n      formatOptionLabel={formatLabel}\n      hideSelectedOptions={false}\n      closeMenuOnSelect={false}\n      placeholder={placeholder}\n      noOptionsMessage={() => null}\n      styles={{\n        option: (base) => ({\n          ...base,\n          backgroundColor: \"transparent\",\n        }),\n      }}\n      components={{\n        DropdownIndicator: () => null,\n        IndicatorSeparator: () => null,\n        MultiValue: (e) =>\n          e.data.value === selected[0] ? (\n            <span className=\"text-secondary\">\n              {selected.length} {plural} selected\n            </span>\n          ) : null,\n      }}\n    />\n  );\n};\n\nexport default CheckboxSelect;\n"
  },
  {
    "path": "frontend/src/components/checkboxSelect/index.ts",
    "content": "import CheckboxSelect from \"./CheckboxSelect\";\n\nexport default CheckboxSelect;\n"
  },
  {
    "path": "frontend/src/components/checkboxSelect/styles.scss",
    "content": ".CheckboxSelect {\n  width: 20rem;\n}\n"
  },
  {
    "path": "frontend/src/components/deleteButton/DeleteButton.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { Button } from \"react-bootstrap\";\n\nimport Modal from \"src/components/modal\";\nimport { useCurrentUser } from \"src/hooks\";\n\ninterface DeleteButtonProps {\n  message?: string;\n  onClick: () => void;\n  disabled?: boolean;\n  className?: string;\n}\n\nconst DeleteButton: FC<DeleteButtonProps> = ({\n  message,\n  onClick,\n  disabled = false,\n  className,\n}) => {\n  const { isAdmin } = useCurrentUser();\n  const [showDelete, setShowDelete] = useState(false);\n\n  const toggleModal = () => setShowDelete(true);\n  const handleDelete = (status: boolean): void => {\n    if (status) onClick();\n    setShowDelete(false);\n  };\n\n  const deleteModal = showDelete && (\n    <Modal\n      message={\n        message ??\n        `Are you sure you want to delete this? This operation cannot be undone.`\n      }\n      callback={handleDelete}\n    />\n  );\n  return (\n    <>\n      {deleteModal}\n      {isAdmin && (\n        <Button\n          variant=\"danger\"\n          disabled={showDelete || disabled}\n          onClick={toggleModal}\n          className={className}\n        >\n          Delete\n        </Button>\n      )}\n    </>\n  );\n};\n\nexport default DeleteButton;\n"
  },
  {
    "path": "frontend/src/components/deleteButton/index.ts",
    "content": "import DeleteButton from \"./DeleteButton\";\n\nexport default DeleteButton;\n"
  },
  {
    "path": "frontend/src/components/editCard/AddComment.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { Button, Form } from \"react-bootstrap\";\nimport { useEditComment } from \"src/graphql\";\nimport cx from \"classnames\";\n\nimport { NoteInput } from \"src/components/form\";\nimport { useCurrentUser } from \"src/hooks\";\nimport { CombinedGraphQLErrors } from \"@apollo/client\";\n\ninterface IProps {\n  editID: string;\n}\n\nconst AddComment: FC<IProps> = ({ editID }) => {\n  const { isEditor } = useCurrentUser();\n  const [showInput, setShowInput] = useState(false);\n  const [error, setError] = useState<string>();\n  const [comment, setComment] = useState(\"\");\n  const [saveComment, { loading: saving }] = useEditComment();\n\n  if (!showInput)\n    return (\n      <div className=\"d-flex\">\n        {!showInput && isEditor && (\n          <Button\n            className=\"ms-auto minimal\"\n            variant=\"link\"\n            onClick={() => setShowInput(true)}\n          >\n            Add Comment\n          </Button>\n        )}\n      </div>\n    );\n\n  const handleSaveComment = async () => {\n    const text = comment.trim();\n    if (text) {\n      const res = await saveComment({\n        variables: { input: { id: editID, comment: text } },\n      });\n      if (CombinedGraphQLErrors.is(res.error)) {\n        setError(res.error.message);\n      } else {\n        setShowInput(false);\n        setError(\"\");\n      }\n    }\n  };\n\n  return (\n    <Form.Group className=\"mb-3\">\n      <NoteInput\n        className={cx({ \"is-invalid\": error })}\n        onChange={(text) => setComment(text)}\n      />\n      <Form.Control.Feedback type=\"invalid\" className=\"text-end\">\n        {error}\n      </Form.Control.Feedback>\n      <div className=\"d-flex mt-2\">\n        <Button\n          variant=\"secondary\"\n          className=\"ms-auto\"\n          onClick={() => setShowInput(false)}\n        >\n          Cancel\n        </Button>\n        <Button\n          variant=\"primary\"\n          className=\"ms-2\"\n          disabled={saving || !comment.trim()}\n          onClick={handleSaveComment}\n        >\n          Save\n        </Button>\n      </div>\n    </Form.Group>\n  );\n};\n\nexport default AddComment;\n"
  },
  {
    "path": "frontend/src/components/editCard/EditCard.tsx",
    "content": "import type { FC } from \"react\";\nimport { Card, Col, Row } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport cx from \"classnames\";\nimport { faRobot } from \"@fortawesome/free-solid-svg-icons\";\nimport { Icon, Tooltip } from \"src/components/fragments\";\n\nimport { OperationEnum, type EditFragment } from \"src/graphql\";\n\nimport { formatDateTime, editHref, userHref, formatOrdinals } from \"src/utils\";\nimport ModifyEdit from \"./ModifyEdit\";\nimport EditComment from \"./EditComment\";\nimport EditHeader from \"./EditHeader\";\nimport AddComment from \"./AddComment\";\nimport VoteBar from \"./VoteBar\";\nimport EditExpiration from \"./EditExpiration\";\nimport EditStatus from \"./EditStatus\";\nimport Votes from \"./Votes\";\n\nconst CLASSNAME = \"EditCard\";\n\ninterface Props {\n  edit: EditFragment;\n  showVotes?: boolean;\n  showVoteBar?: boolean;\n  hideDiff?: boolean;\n}\n\nconst EditCardComponent: FC<Props> = ({\n  edit,\n  showVotes = false,\n  showVoteBar = true,\n  hideDiff = false,\n}) => {\n  const title = `${edit.operation.toLowerCase()} ${edit.target_type.toLowerCase()}`;\n  const created = new Date(edit.created);\n\n  const creation = edit.operation === OperationEnum.CREATE && (\n    <ModifyEdit details={edit.details} />\n  );\n  const modifications = edit.operation !== OperationEnum.CREATE && (\n    <ModifyEdit\n      details={edit.details}\n      oldDetails={edit.old_details}\n      options={edit.options ?? undefined}\n    />\n  );\n  const comments = (edit.comments ?? []).map((comment) => (\n    <EditComment {...comment} key={comment.id} />\n  ));\n\n  return (\n    <Card className={cx(CLASSNAME, \"mb-3\")}>\n      <Card.Header className=\"row\">\n        <div className=\"flex-column col-4\">\n          <Link to={editHref(edit)}>\n            <h5 className=\"text-capitalize\">{title.toLowerCase()}</h5>\n          </Link>\n          <div>\n            <b className=\"me-2\">Author:</b>\n            {edit.user ? (\n              <Link to={userHref(edit.user)}>\n                <span>{edit.user.name}</span>\n              </Link>\n            ) : (\n              <span>Deleted User</span>\n            )}\n            {edit.bot && (\n              <Tooltip\n                text=\"Edit submitted by an automated script\"\n                delay={50}\n                placement=\"auto\"\n              >\n                <span>\n                  <Icon icon={faRobot} className=\"ms-2\" />\n                </span>\n              </Tooltip>\n            )}\n          </div>\n          <div>\n            <b className=\"me-2\">Created:</b>\n            <span>{formatDateTime(created)}</span>\n          </div>\n          {edit.updated && edit.update_count > 0 && (\n            <div>\n              <b className=\"me-2\">Updated:</b>\n              <span>{formatDateTime(edit.updated)}</span>\n              <small className=\"text-muted align-text-top ms-2\">{`${formatOrdinals(edit.update_count)} revision`}</small>\n            </div>\n          )}\n        </div>\n        <div className=\"flex-column col-4 ms-auto text-end\">\n          <div>\n            <b className=\"me-2\">Status:</b>\n            <EditStatus {...edit} />\n            <EditExpiration edit={edit} />\n            {showVoteBar && <VoteBar edit={edit} />}\n          </div>\n        </div>\n      </Card.Header>\n      <hr />\n      <Card.Body>\n        <EditHeader edit={edit} compact={hideDiff} />\n        {!hideDiff ? (\n          <>\n            {creation}\n            {modifications}\n            <Row className=\"mt-2\">\n              <Col md={{ offset: 4, span: 8 }}>\n                {showVotes && <Votes edit={edit} />}\n                {comments}\n                <AddComment editID={edit.id} />\n              </Col>\n            </Row>\n          </>\n        ) : (\n          showVotes && <Votes edit={edit} />\n        )}\n      </Card.Body>\n    </Card>\n  );\n};\n\nexport default EditCardComponent;\n"
  },
  {
    "path": "frontend/src/components/editCard/EditComment.tsx",
    "content": "import type { FC } from \"react\";\nimport { Card } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\n\nimport { formatDateTime, userHref, Markdown } from \"src/utils\";\n\nconst CLASSNAME = \"EditComment\";\n\ninterface Props {\n  id: string;\n  comment: string;\n  date: string;\n  user?: { name: string; id: string } | null;\n}\n\nconst EditComment: FC<Props> = ({ id, comment, date, user }) => (\n  <Card className={CLASSNAME}>\n    <Card.Body className=\"pb-0\">\n      <Markdown text={comment} unique={id} />\n    </Card.Body>\n    <Card.Footer className=\"text-end\">\n      {user ? (\n        <Link to={userHref(user)}>{user.name}</Link>\n      ) : (\n        <span>Deleted User</span>\n      )}\n      <span className=\"mx-1\">&bull;</span>\n      <span>{formatDateTime(date, false)}</span>\n    </Card.Footer>\n  </Card>\n);\n\nexport default EditComment;\n"
  },
  {
    "path": "frontend/src/components/editCard/EditExpiration.tsx",
    "content": "import type { FC } from \"react\";\nimport type { Temporal } from \"temporal-polyfill\";\nimport {\n  formatDistance,\n  parseInstant,\n  isInstantInFuture,\n  formatInstant,\n} from \"src/utils\";\n\nimport { Tooltip } from \"src/components/fragments\";\nimport { useConfig, VoteStatusEnum, type EditFragment } from \"src/graphql\";\n\ninterface Props {\n  edit: EditFragment;\n}\n\nconst TooltipMessage: FC<{\n  pass: boolean;\n  time: Temporal.Instant | undefined;\n}> = ({ pass, time }) => (\n  <span>\n    If no other votes are cast the edit will{\" \"}\n    <b className={pass ? \"text-success\" : \"text-danger\"}>\n      {pass ? \"pass\" : \"fail\"}\n    </b>{\" \"}\n    at {time ? formatInstant(time) : \"\"}\n  </span>\n);\n\nconst ExpirationNotification: FC<Props> = ({ edit }) => {\n  const { data } = useConfig();\n  const config = data?.getConfig;\n\n  if (\n    !config?.vote_cron_interval ||\n    edit.status !== VoteStatusEnum.PENDING ||\n    !edit.expires\n  )\n    return null;\n\n  // Pending edits that have reached the voting threshold have shorter voting periods.\n  // This will happen for destructive edits, or when votes are not unanimous.\n  const shortVotingPeriod =\n    config.vote_application_threshold > 0 &&\n    edit.vote_count >= config.vote_application_threshold;\n\n  const expirationTime = parseInstant(edit.expires);\n  const expirationDistance =\n    expirationTime && isInstantInFuture(expirationTime)\n      ? formatDistance(expirationTime)\n      : \"in a moment\";\n\n  const threshold = edit.destructive ? 1 : 0;\n  const pass = shortVotingPeriod || edit.vote_count >= threshold;\n\n  return (\n    <div>\n      <Tooltip\n        delay={0}\n        text={<TooltipMessage pass={pass} time={expirationTime} />}\n      >\n        <span>\n          Voting closes{\" \"}\n          <b>\n            <u>{expirationDistance}</u>\n          </b>\n        </span>\n      </Tooltip>\n    </div>\n  );\n};\n\nexport default ExpirationNotification;\n"
  },
  {
    "path": "frontend/src/components/editCard/EditHeader.tsx",
    "content": "import { type FC, useMemo } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Col, Row } from \"react-bootstrap\";\nimport { faCheck, faXmark, faVideo } from \"@fortawesome/free-solid-svg-icons\";\n\nimport { OperationEnum, type EditFragment } from \"src/graphql\";\nimport {\n  getEditTargetRoute,\n  isPerformer,\n  isScene,\n  isSceneEdit,\n  performerHref,\n  studioHref,\n  getEditTargetName,\n} from \"src/utils\";\nimport { Icon } from \"src/components/fragments\";\n\ntype Target = NonNullable<EditFragment[\"target\"]>;\n\nconst renderTargetLink = (obj?: Target | null) => {\n  if (!obj) return null;\n\n  if (isPerformer(obj)) {\n    return (\n      <Link to={performerHref(obj)}>\n        {obj.name}\n        {obj.disambiguation && (\n          <small className=\"text-muted ms-1\">({obj.disambiguation})</small>\n        )}\n      </Link>\n    );\n  } else {\n    return <Link to={getEditTargetRoute(obj)}>{getEditTargetName(obj)}</Link>;\n  }\n};\n\nconst renderTargetAddendum = (obj?: Target | null) => {\n  if (isScene(obj) && obj?.studio)\n    return (\n      <>\n        <span className=\"mx-2\">•</span>\n        <Icon icon={faVideo} className=\"me-1\" />\n        <Link to={studioHref(obj.studio)}>{obj.studio.name}</Link>\n      </>\n    );\n  return null;\n};\n\ninterface EditHeaderProps {\n  edit: EditFragment;\n  compact?: boolean;\n}\n\nconst EditHeader: FC<EditHeaderProps> = ({ edit, compact = false }) => {\n  const header = useMemo(() => {\n    switch (edit.operation) {\n      case OperationEnum.MODIFY:\n        if (!edit.target) return null;\n        return (\n          <>\n            <Col xs={2} className=\"fw-bold text-end\">\n              Modifying {edit.target_type.toLowerCase()}\n            </Col>\n            <Col>\n              {renderTargetLink(edit.target)}\n              {renderTargetAddendum(edit.target)}\n            </Col>\n          </>\n        );\n\n      case OperationEnum.CREATE:\n        if (edit.applied) {\n          return (\n            <>\n              <Col xs={2} className=\"fw-bold text-end\">\n                Created {edit.target_type.toLowerCase()}\n              </Col>\n              <Col className=\"ps-3\">\n                {renderTargetLink(edit.target)}\n                {renderTargetAddendum(edit.target)}\n              </Col>\n            </>\n          );\n        }\n\n        // For unapplied CREATE edits, show scene info from details if available\n        if (compact && isSceneEdit(edit.details) && edit.details.title) {\n          return (\n            <>\n              <Col xs={2} className=\"fw-bold text-end\">\n                Creating {edit.target_type.toLowerCase()}\n              </Col>\n              <Col className=\"ps-3\">\n                <span>{edit.details.title}</span>\n                {edit.details.studio && (\n                  <>\n                    <span className=\"mx-2\">•</span>\n                    <Icon icon={faVideo} className=\"me-1\" />\n                    <Link to={studioHref(edit.details.studio)}>\n                      {edit.details.studio.name}\n                    </Link>\n                  </>\n                )}\n              </Col>\n            </>\n          );\n        }\n\n        return null;\n\n      case OperationEnum.MERGE:\n        if (!edit.target) return null;\n        return (\n          <Col className=\"lh-base\">\n            <Row>\n              <Col xs={2} className=\"fw-bold text-end\">\n                Merge\n              </Col>\n              <Col xs={10}>\n                {edit.merge_sources?.map((target) => (\n                  <div key={target.id}>\n                    {renderTargetLink(target)}\n                    {renderTargetAddendum(edit.target)}\n                  </div>\n                ))}\n              </Col>\n            </Row>\n            <Row>\n              <Col xs={2} className=\"fw-bold text-end\">\n                Into\n              </Col>\n              <Col xs={10}>\n                {renderTargetLink(edit.target)}\n                {renderTargetAddendum(edit.target)}\n              </Col>\n            </Row>\n            {isPerformer(edit.target) && (\n              <Row>\n                <div className=\"offset-2 d-flex align-items-center\">\n                  <Icon\n                    icon={edit.options?.set_merge_aliases ? faCheck : faXmark}\n                    color={edit.options?.set_merge_aliases ? \"green\" : \"red\"}\n                  />\n                  <span className=\"ms-1\">\n                    Set performance aliases to old name\n                  </span>\n                </div>\n              </Row>\n            )}\n          </Col>\n        );\n\n      case OperationEnum.DESTROY:\n        if (!edit.target) return null;\n        return (\n          <>\n            <Col xs={2} className=\"fw-bold text-end\">\n              Deleting\n            </Col>\n            <Col>\n              <span className=\"EditDiff bg-danger\">\n                {renderTargetLink(edit.target)}\n              </span>\n              {renderTargetAddendum(edit.target)}\n            </Col>\n          </>\n        );\n    }\n  }, [edit, compact]);\n\n  return header ? <Row className=\"mb-4\">{header}</Row> : null;\n};\n\nexport default EditHeader;\n"
  },
  {
    "path": "frontend/src/components/editCard/EditStatus.tsx",
    "content": "import type { FC } from \"react\";\nimport { Badge, type BadgeProps } from \"react-bootstrap\";\n\nimport { VoteStatusEnum } from \"src/graphql\";\nimport { EditStatusTypes } from \"src/constants/enums\";\nimport { Tooltip } from \"src/components/fragments\";\nimport { formatDateTime } from \"src/utils\";\n\ninterface Props {\n  status: VoteStatusEnum;\n  closed?: string | null;\n}\n\nconst EditStatus: FC<Props> = ({ closed, status }) => {\n  let editVariant: BadgeProps[\"bg\"] = \"warning\";\n  if (\n    status === VoteStatusEnum.REJECTED ||\n    status === VoteStatusEnum.IMMEDIATE_REJECTED ||\n    status === VoteStatusEnum.FAILED ||\n    status === VoteStatusEnum.CANCELED\n  )\n    editVariant = \"danger\";\n  else if (\n    status === VoteStatusEnum.ACCEPTED ||\n    status === VoteStatusEnum.IMMEDIATE_ACCEPTED\n  )\n    editVariant = \"success\";\n\n  let tooltip = \"\";\n  switch (status) {\n    case VoteStatusEnum.REJECTED:\n      tooltip = \"Edit did not get sufficient votes to pass.\";\n      break;\n    case VoteStatusEnum.CANCELED:\n      tooltip = \"Edit was cancelled by the editor.\";\n      break;\n    case VoteStatusEnum.IMMEDIATE_REJECTED:\n      tooltip = \"Edit was cancelled by an admin.\";\n      break;\n    case VoteStatusEnum.FAILED:\n      tooltip =\n        \"Edit application failed due to an error. See edit note for more details.\";\n      break;\n  }\n\n  const tooltipContent =\n    closed || tooltip ? (\n      <>\n        {closed && (\n          <div>\n            Closed <b>{formatDateTime(closed)}</b>\n          </div>\n        )}\n        {tooltip}\n      </>\n    ) : (\n      \"\"\n    );\n\n  return (\n    <Tooltip text={tooltipContent}>\n      <Badge className=\"text-uppercase\" bg={editVariant}>\n        {EditStatusTypes[status]}\n      </Badge>\n    </Tooltip>\n  );\n};\n\nexport default EditStatus;\n"
  },
  {
    "path": "frontend/src/components/editCard/ModifyEdit.tsx",
    "content": "import type { FC } from \"react\";\nimport { Col, Row } from \"react-bootstrap\";\nimport { faCheck, faXmark, faEdit } from \"@fortawesome/free-solid-svg-icons\";\n\nimport type {\n  FingerprintAlgorithm,\n  PerformerFragment,\n  GenderEnum,\n  EthnicityEnum,\n  BreastTypeEnum,\n  EditFragment,\n  HairColorEnum,\n  EyeColorEnum,\n} from \"src/graphql\";\nimport {\n  formatDuration,\n  getCountryByISO,\n  isTagEdit,\n  isPerformerEdit,\n  formatBodyModification,\n  isStudioEdit,\n  isSceneEdit,\n  studioHref,\n  categoryHref,\n  compareByName,\n} from \"src/utils\";\nimport {\n  EthnicityTypes,\n  HairColorTypes,\n  EyeColorTypes,\n  BreastTypes,\n  GenderTypes,\n} from \"src/constants\";\nimport { Icon } from \"src/components/fragments\";\nimport ChangeRow from \"src/components/changeRow\";\nimport ImageChangeRow from \"src/components/imageChangeRow\";\nimport URLChangeRow, { type URL } from \"src/components/urlChangeRow\";\nimport LinkedChangeRow from \"../linkedChangeRow\";\nimport ListChangeRow from \"../listChangeRow\";\nimport { renderPerformer, renderTag, renderFingerprint } from \"./renderEntity\";\n\ntype Details = EditFragment[\"details\"];\ntype OldDetails = EditFragment[\"old_details\"];\ntype Options = EditFragment[\"options\"];\n\nexport type Image = {\n  height: number;\n  id: string;\n  url: string;\n  width: number;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype StartingWith<T, K extends string> = T extends `${K}${infer _}` ? T : never;\nexport type TargetOldDetails<T> = Omit<\n  T,\n  StartingWith<keyof T, \"added_\" | \"removed_\"> | \"draft_id\"\n>;\n\nexport interface TagDetails {\n  name?: string | null;\n  description?: string | null;\n  category?: { id: string; name: string } | null;\n  added_aliases?: string[] | null;\n  removed_aliases?: string[] | null;\n}\n\nexport type OldTagDetails = TargetOldDetails<TagDetails>;\n\nexport const renderTagDetails = (\n  tagDetails: TagDetails,\n  oldTagDetails: OldTagDetails | undefined,\n  showDiff: boolean,\n) => (\n  <>\n    <ChangeRow\n      name=\"Name\"\n      newValue={tagDetails.name}\n      oldValue={oldTagDetails?.name}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Description\"\n      newValue={tagDetails.description}\n      oldValue={oldTagDetails?.description}\n      showDiff={showDiff}\n    />\n    <LinkedChangeRow\n      name=\"Category\"\n      newEntity={{\n        name: tagDetails.category?.name,\n        link: tagDetails.category && categoryHref(tagDetails.category),\n      }}\n      oldEntity={{\n        name: oldTagDetails?.category?.name,\n        link: oldTagDetails?.category && categoryHref(oldTagDetails.category),\n      }}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Aliases\"\n      newValue={tagDetails.added_aliases?.join(\", \")}\n      oldValue={tagDetails.removed_aliases?.join(\", \")}\n      showDiff={showDiff}\n    />\n  </>\n);\n\nexport type BodyMod = {\n  location: string;\n  description?: string | null;\n};\n\nexport interface PerformerDetails {\n  name?: string | null;\n  gender?: GenderEnum | null;\n  disambiguation?: string | null;\n  birthdate?: string | null;\n  deathdate?: string | null;\n  career_start_year?: number | null;\n  career_end_year?: number | null;\n  height?: number | null;\n  band_size?: number | null;\n  cup_size?: string | null;\n  waist_size?: number | null;\n  hip_size?: number | null;\n  breast_type?: BreastTypeEnum | null;\n  country?: string | null;\n  ethnicity?: EthnicityEnum | null;\n  eye_color?: string | null;\n  hair_color?: string | null;\n  added_tattoos?: BodyMod[] | null;\n  removed_tattoos?: BodyMod[] | null;\n  added_piercings?: BodyMod[] | null;\n  removed_piercings?: BodyMod[] | null;\n  added_aliases?: string[] | null;\n  removed_aliases?: string[] | null;\n  added_images?: (Image | null)[] | null;\n  removed_images?: (Image | null)[] | null;\n  added_urls?: URL[] | null;\n  removed_urls?: URL[] | null;\n  draft_id?: string | null;\n}\n\nexport type OldPerformerDetails = TargetOldDetails<PerformerDetails>;\n\nexport const renderPerformerDetails = (\n  performerDetails: PerformerDetails,\n  oldPerformerDetails: OldPerformerDetails | undefined,\n  showDiff: boolean,\n  setModifyAliases = false,\n) => (\n  <>\n    {performerDetails.name && (\n      <ChangeRow\n        name=\"Name\"\n        newValue={performerDetails.name}\n        oldValue={oldPerformerDetails?.name}\n        showDiff={showDiff}\n      />\n    )}\n    {oldPerformerDetails?.name &&\n      performerDetails.name !== oldPerformerDetails.name && (\n        <div className=\"d-flex mb-2 align-items-center\">\n          <Icon\n            icon={setModifyAliases ? faCheck : faXmark}\n            color={setModifyAliases ? \"green\" : \"red\"}\n            className=\"ms-auto\"\n          />\n          <span className=\"ms-2\">Set performance aliases to old name</span>\n        </div>\n      )}\n    <ChangeRow\n      name=\"Disambiguation\"\n      newValue={performerDetails.disambiguation}\n      oldValue={oldPerformerDetails?.disambiguation}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Aliases\"\n      newValue={performerDetails.added_aliases?.join(\", \")}\n      oldValue={performerDetails.removed_aliases?.join(\", \")}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Gender\"\n      newValue={\n        performerDetails.gender &&\n        GenderTypes[performerDetails.gender as keyof typeof GenderEnum]\n      }\n      oldValue={\n        oldPerformerDetails?.gender &&\n        GenderTypes[oldPerformerDetails.gender as keyof typeof GenderEnum]\n      }\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Birthdate\"\n      newValue={performerDetails.birthdate}\n      oldValue={oldPerformerDetails?.birthdate}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Deathdate\"\n      newValue={performerDetails.deathdate}\n      oldValue={oldPerformerDetails?.deathdate}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Eye Color\"\n      newValue={\n        performerDetails.eye_color &&\n        EyeColorTypes[performerDetails.eye_color as keyof typeof EyeColorEnum]\n      }\n      oldValue={\n        oldPerformerDetails?.eye_color &&\n        EyeColorTypes[\n          oldPerformerDetails.eye_color as keyof typeof EyeColorEnum\n        ]\n      }\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Hair Color\"\n      newValue={\n        performerDetails.hair_color &&\n        HairColorTypes[\n          performerDetails.hair_color as keyof typeof HairColorEnum\n        ]\n      }\n      oldValue={\n        oldPerformerDetails?.hair_color &&\n        HairColorTypes[\n          oldPerformerDetails.hair_color as keyof typeof HairColorEnum\n        ]\n      }\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Height\"\n      newValue={performerDetails.height}\n      oldValue={oldPerformerDetails?.height}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Breast Type\"\n      newValue={\n        performerDetails.breast_type &&\n        BreastTypes[performerDetails.breast_type as keyof typeof BreastTypeEnum]\n      }\n      oldValue={\n        oldPerformerDetails?.breast_type &&\n        BreastTypes[\n          oldPerformerDetails.breast_type as keyof typeof BreastTypeEnum\n        ]\n      }\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Bra Size\"\n      newValue={`${performerDetails.band_size || \"\"}${\n        performerDetails.cup_size ?? \"\"\n      }`}\n      oldValue={`${oldPerformerDetails?.band_size || \"\"}${\n        oldPerformerDetails?.cup_size ?? \"\"\n      }`}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Waist Size\"\n      newValue={performerDetails.waist_size}\n      oldValue={oldPerformerDetails?.waist_size}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Hip Size\"\n      newValue={performerDetails.hip_size}\n      oldValue={oldPerformerDetails?.hip_size}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Nationality\"\n      newValue={getCountryByISO(performerDetails.country)}\n      oldValue={getCountryByISO(oldPerformerDetails?.country)}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Ethnicity\"\n      newValue={\n        performerDetails.ethnicity &&\n        EthnicityTypes[performerDetails.ethnicity as keyof typeof EthnicityEnum]\n      }\n      oldValue={\n        oldPerformerDetails?.ethnicity &&\n        EthnicityTypes[\n          oldPerformerDetails.ethnicity as keyof typeof EthnicityEnum\n        ]\n      }\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Career Start\"\n      newValue={performerDetails.career_start_year}\n      oldValue={oldPerformerDetails?.career_start_year}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Career End\"\n      newValue={performerDetails.career_end_year}\n      oldValue={oldPerformerDetails?.career_end_year}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Tattoos\"\n      newValue={(performerDetails.added_tattoos ?? [])\n        .map(formatBodyModification)\n        .join(\"\\n\")}\n      oldValue={(performerDetails.removed_tattoos ?? [])\n        .map(formatBodyModification)\n        .join(\"\\n\")}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Piercings\"\n      newValue={(performerDetails.added_piercings ?? [])\n        .map(formatBodyModification)\n        .join(\"\\n\")}\n      oldValue={(performerDetails.removed_piercings ?? [])\n        .map(formatBodyModification)\n        .join(\"\\n\")}\n      showDiff={showDiff}\n    />\n    <URLChangeRow\n      newURLs={performerDetails.added_urls}\n      oldURLs={performerDetails.removed_urls}\n      showDiff={showDiff}\n    />\n    <ImageChangeRow\n      newImages={performerDetails.added_images}\n      oldImages={performerDetails.removed_images}\n      showDiff={showDiff}\n    />\n    {performerDetails.draft_id && (\n      <Row className=\"mb-2\">\n        <Col xs={{ offset: 2 }}>\n          <h6>\n            <Icon icon={faEdit} color=\"green\" />\n            <span className=\"ms-1\">Submitted by draft</span>\n          </h6>\n        </Col>\n      </Row>\n    )}\n  </>\n);\n\ntype ScenePerformance = {\n  as?: string | null;\n  performer: Pick<\n    PerformerFragment,\n    \"name\" | \"id\" | \"gender\" | \"disambiguation\" | \"deleted\"\n  >;\n};\n\nexport interface SceneDetails {\n  title?: string | null;\n  date?: string | null;\n  production_date?: string | null;\n  duration?: number | null;\n  details?: string | null;\n  director?: string | null;\n  code?: string | null;\n  studio?: {\n    id: string;\n    name: string;\n  } | null;\n  added_performers?: ScenePerformance[] | null;\n  removed_performers?: ScenePerformance[] | null;\n  added_images?: (Image | null)[] | null;\n  removed_images?: (Image | null)[] | null;\n  added_urls?: URL[] | null;\n  removed_urls?: URL[] | null;\n  added_tags?:\n    | {\n        id: string;\n        name: string;\n        description?: string | null;\n      }[]\n    | null;\n  removed_tags?:\n    | {\n        id: string;\n        name: string;\n        description?: string | null;\n      }[]\n    | null;\n  added_fingerprints?:\n    | {\n        algorithm: FingerprintAlgorithm;\n        hash: string;\n        duration: number;\n      }[]\n    | null;\n  removed_fingerprints?:\n    | {\n        algorithm: FingerprintAlgorithm;\n        hash: string;\n        duration: number;\n      }[]\n    | null;\n  draft_id?: string | null;\n}\n\nexport type OldSceneDetails = TargetOldDetails<SceneDetails>;\n\nexport const renderSceneDetails = (\n  sceneDetails: SceneDetails,\n  oldSceneDetails: OldSceneDetails | undefined,\n  showDiff: boolean,\n) => (\n  <>\n    {sceneDetails.title && (\n      <ChangeRow\n        name=\"Title\"\n        newValue={sceneDetails.title}\n        oldValue={oldSceneDetails?.title}\n        showDiff={showDiff}\n      />\n    )}\n    <ChangeRow\n      name=\"Date\"\n      newValue={sceneDetails.date}\n      oldValue={oldSceneDetails?.date}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Duration\"\n      newValue={formatDuration(sceneDetails.duration)}\n      oldValue={formatDuration(oldSceneDetails?.duration)}\n      showDiff={showDiff}\n    />\n    <ListChangeRow\n      name=\"Performers\"\n      added={sceneDetails.added_performers}\n      removed={sceneDetails.removed_performers}\n      renderItem={renderPerformer}\n      getKey={(o) => o.performer.id}\n      showDiff={showDiff}\n    />\n    <LinkedChangeRow\n      name=\"Studio\"\n      newEntity={{\n        name: sceneDetails.studio?.name,\n        link: sceneDetails.studio && studioHref(sceneDetails.studio),\n      }}\n      oldEntity={{\n        name: oldSceneDetails?.studio?.name,\n        link: oldSceneDetails?.studio && studioHref(oldSceneDetails.studio),\n      }}\n      showDiff={showDiff}\n    />\n    <URLChangeRow\n      newURLs={sceneDetails.added_urls}\n      oldURLs={sceneDetails.removed_urls}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Details\"\n      newValue={sceneDetails.details}\n      oldValue={oldSceneDetails?.details}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Director\"\n      newValue={sceneDetails.director}\n      oldValue={oldSceneDetails?.director}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Production Date\"\n      newValue={sceneDetails.production_date}\n      oldValue={oldSceneDetails?.production_date}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Studio Code\"\n      newValue={sceneDetails.code}\n      oldValue={oldSceneDetails?.code}\n      showDiff={showDiff}\n    />\n    <ListChangeRow\n      name=\"Tags\"\n      added={sceneDetails.added_tags?.slice().sort(compareByName)}\n      removed={sceneDetails.removed_tags?.slice().sort(compareByName)}\n      renderItem={renderTag}\n      getKey={(o) => o.id}\n      showDiff={showDiff}\n    />\n    <ImageChangeRow\n      newImages={sceneDetails?.added_images}\n      oldImages={sceneDetails?.removed_images}\n      showDiff={showDiff}\n    />\n    <ListChangeRow\n      name=\"Fingerprints\"\n      added={sceneDetails.added_fingerprints}\n      removed={sceneDetails.removed_fingerprints}\n      renderItem={renderFingerprint}\n      getKey={(o) => `${o.hash}${o.algorithm}`}\n      showDiff={showDiff}\n    />\n    {sceneDetails.draft_id && (\n      <Row className=\"mb-2\">\n        <Col xs={{ offset: 2 }}>\n          <h6>\n            <Icon icon={faEdit} color=\"green\" />\n            <span className=\"ms-1\">Submitted by draft</span>\n          </h6>\n        </Col>\n      </Row>\n    )}\n  </>\n);\n\nexport interface StudioDetails {\n  name?: string | null;\n  parent?: {\n    id: string;\n    name: string;\n  } | null;\n  added_images?: (Image | null)[] | null;\n  removed_images?: (Image | null)[] | null;\n  added_urls?: URL[] | null;\n  removed_urls?: URL[] | null;\n  added_aliases?: string[] | null;\n  removed_aliases?: string[] | null;\n}\n\nexport type OldStudioDetails = TargetOldDetails<StudioDetails>;\n\nexport const renderStudioDetails = (\n  studioDetails: StudioDetails,\n  oldStudioDetails: OldStudioDetails | undefined,\n  showDiff: boolean,\n) => (\n  <>\n    <ChangeRow\n      name=\"Name\"\n      newValue={studioDetails.name}\n      oldValue={oldStudioDetails?.name}\n      showDiff={showDiff}\n    />\n    <ChangeRow\n      name=\"Aliases\"\n      newValue={studioDetails.added_aliases?.join(\", \")}\n      oldValue={studioDetails.removed_aliases?.join(\", \")}\n      showDiff={showDiff}\n    />\n    <LinkedChangeRow\n      name=\"Network\"\n      newEntity={{\n        name: studioDetails.parent?.name,\n        link: studioDetails.parent && studioHref(studioDetails.parent),\n      }}\n      oldEntity={{\n        name: oldStudioDetails?.parent?.name,\n        link: oldStudioDetails?.parent && studioHref(oldStudioDetails.parent),\n      }}\n      showDiff={showDiff}\n    />\n    <URLChangeRow\n      newURLs={studioDetails.added_urls}\n      oldURLs={studioDetails.removed_urls}\n      showDiff={showDiff}\n    />\n    <ImageChangeRow\n      newImages={studioDetails.added_images}\n      oldImages={studioDetails.removed_images}\n      showDiff={showDiff}\n    />\n  </>\n);\n\ninterface ModifyEditProps {\n  details: Details | null;\n  oldDetails?: OldDetails | null;\n  options?: Options;\n}\n\nconst ModifyEdit: FC<ModifyEditProps> = ({ details, oldDetails, options }) => {\n  if (!details) return null;\n\n  const showDiff = !!oldDetails;\n\n  if (\n    isTagEdit(details) &&\n    (isTagEdit(oldDetails) || oldDetails === undefined)\n  ) {\n    return renderTagDetails(details, oldDetails, showDiff);\n  }\n\n  if (\n    isPerformerEdit(details) &&\n    (isPerformerEdit(oldDetails) || oldDetails === undefined)\n  ) {\n    return renderPerformerDetails(\n      details,\n      oldDetails,\n      showDiff,\n      options?.set_modify_aliases,\n    );\n  }\n\n  if (\n    isStudioEdit(details) &&\n    (isStudioEdit(oldDetails) || oldDetails === undefined)\n  ) {\n    return renderStudioDetails(details, oldDetails, showDiff);\n  }\n\n  if (\n    isSceneEdit(details) &&\n    (isSceneEdit(oldDetails) || oldDetails === undefined)\n  ) {\n    return renderSceneDetails(details, oldDetails, showDiff);\n  }\n\n  return null;\n};\n\nexport default ModifyEdit;\n"
  },
  {
    "path": "frontend/src/components/editCard/VoteBar.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { Button, Form } from \"react-bootstrap\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport cx from \"classnames\";\n\nimport {\n  VoteStatusEnum,\n  VoteTypeEnum,\n  useVote,\n  type EditFragment,\n} from \"src/graphql\";\nimport { Icon } from \"src/components/fragments\";\nimport { useCurrentUser } from \"src/hooks\";\n\nconst CLASSNAME = \"VoteBar\";\nconst CLASSNAME_BUTTON = `${CLASSNAME}-button`;\nconst CLASSNAME_VOTED = `${CLASSNAME}-voted`;\nconst CLASSNAME_SAVE = `${CLASSNAME}-save`;\n\ninterface Props {\n  edit: EditFragment;\n}\n\nconst VoteBar: FC<Props> = ({ edit }) => {\n  const { isVoter, isSelf } = useCurrentUser();\n  const userVote = (edit.votes ?? []).find((v) => v.user?.id && isSelf(v.user));\n  const [vote, setVote] = useState<VoteTypeEnum | null>(userVote?.vote ?? null);\n  const [submitVote, { loading: savingVote }] = useVote();\n\n  if (edit.status !== VoteStatusEnum.PENDING) return null;\n\n  const currentVote = (\n    <h6>\n      <span className=\"me-2\">Current Vote:</span>\n      <span>{`${edit.vote_count > 0 ? \"+\" : \"\"}${\n        edit.vote_count === 0 ? \"-\" : edit.vote_count\n      }`}</span>\n    </h6>\n  );\n\n  // Only show vote total for edit owner and users without vote role\n  if (!isVoter || isSelf(edit.user)) return <div>{currentVote}</div>;\n\n  const handleSave = () => {\n    if (!vote) return;\n\n    submitVote({\n      variables: {\n        input: {\n          id: edit.id,\n          vote,\n        },\n      },\n    });\n  };\n\n  return (\n    <div className={CLASSNAME}>\n      <div className={CLASSNAME_SAVE}>\n        {currentVote}\n        {vote && vote !== userVote?.vote && (\n          <Button\n            variant=\"secondary\"\n            onClick={handleSave}\n            disabled={savingVote}\n          >\n            <span className=\"me-2\">Save</span>\n            <Icon icon={faCheck} color=\"green\" />\n          </Button>\n        )}\n      </div>\n      <Form.Group\n        controlId={`${edit.id}-vote-yes`}\n        className={cx(CLASSNAME_BUTTON, {\n          [CLASSNAME_VOTED]: userVote?.vote === VoteTypeEnum.ACCEPT,\n          \"bg-success\": vote === VoteTypeEnum.ACCEPT,\n        })}\n        onChange={() => setVote(VoteTypeEnum.ACCEPT)}\n      >\n        <Form.Label>\n          <Form.Check\n            type=\"radio\"\n            name={`${edit.id}-vote`}\n            defaultChecked={userVote?.vote === VoteTypeEnum.ACCEPT}\n          />\n          <span>Yes</span>\n        </Form.Label>\n      </Form.Group>\n      <Form.Group\n        controlId={`${edit.id}-vote-no`}\n        className={cx(CLASSNAME_BUTTON, {\n          [CLASSNAME_VOTED]: userVote?.vote === VoteTypeEnum.REJECT,\n          \"bg-danger\": vote === VoteTypeEnum.REJECT,\n        })}\n        onChange={() => setVote(VoteTypeEnum.REJECT)}\n      >\n        <Form.Label>\n          <Form.Check\n            type=\"radio\"\n            name={`${edit.id}-vote`}\n            defaultChecked={userVote?.vote === VoteTypeEnum.REJECT}\n          />\n          <span>No</span>\n        </Form.Label>\n      </Form.Group>\n      <Form.Group\n        controlId={`${edit.id}-vote-abstain`}\n        className={cx(CLASSNAME_BUTTON, {\n          [CLASSNAME_VOTED]: userVote?.vote === VoteTypeEnum.ABSTAIN,\n          \"bg-warning\": vote === VoteTypeEnum.ABSTAIN,\n        })}\n        onChange={() => setVote(VoteTypeEnum.ABSTAIN)}\n      >\n        <Form.Label>\n          <Form.Check\n            type=\"radio\"\n            name={`${edit.id}-vote`}\n            defaultChecked={userVote?.vote === VoteTypeEnum.ABSTAIN}\n          />\n          <span>Abstain</span>\n        </Form.Label>\n      </Form.Group>\n    </div>\n  );\n};\n\nexport default VoteBar;\n"
  },
  {
    "path": "frontend/src/components/editCard/Votes.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { sortBy } from \"lodash-es\";\n\nimport { VoteTypeEnum, type EditFragment } from \"src/graphql\";\nimport { userHref, formatDateTime } from \"src/utils\";\nimport { VoteTypes } from \"src/constants/enums\";\nimport { Tooltip } from \"src/components/fragments\";\n\nconst CLASSNAME = \"EditVotes\";\n\ninterface VotesProps {\n  edit: EditFragment;\n}\n\nconst Votes: FC<VotesProps> = ({ edit }) => (\n  <>\n    <div className={CLASSNAME}>\n      <h5>Votes:</h5>\n      <div>\n        <b className=\"me-2\">Vote Tally:</b>\n        <b>{edit.votes.filter((v) => v.vote === VoteTypeEnum.ACCEPT).length}</b>\n        <span className=\"mx-1\">yes &mdash;</span>\n        <b>{edit.votes.filter((v) => v.vote === VoteTypeEnum.REJECT).length}</b>\n        <span className=\"ms-1\">no</span>\n      </div>\n      {sortBy(edit.votes, (v) => v.date)\n        .filter((v) => v.vote !== VoteTypeEnum.ABSTAIN)\n        .map(\n          (v) =>\n            v.user && (\n              <div key={`${edit.id}${v.user.id}`}>\n                <Tooltip text={formatDateTime(v.date)}>\n                  <Link to={userHref(v.user)}>{v.user.name}</Link>\n                </Tooltip>\n                <span className=\"mx-2\">&bull;</span>\n                {VoteTypes[v.vote]}\n              </div>\n            ),\n        )}\n    </div>\n  </>\n);\n\nexport default Votes;\n"
  },
  {
    "path": "frontend/src/components/editCard/index.ts",
    "content": "import EditCard from \"./EditCard\";\n\nexport default EditCard;\n"
  },
  {
    "path": "frontend/src/components/editCard/renderEntity.tsx",
    "content": "import { Link } from \"react-router-dom\";\n\nimport type { FingerprintAlgorithm, PerformerFragment } from \"src/graphql\";\n\nimport { performerHref, tagHref, createHref, formatDuration } from \"src/utils\";\nimport { GenderIcon, PerformerName, TagLink } from \"src/components/fragments\";\nimport { ROUTE_SCENES } from \"src/constants\";\n\ntype Appearance = {\n  performer: PerformerFragment;\n  as: string;\n};\n\nexport const renderPerformer = (appearance: {\n  as?: string | null;\n  performer: Pick<\n    Appearance[\"performer\"],\n    \"name\" | \"id\" | \"gender\" | \"disambiguation\" | \"deleted\"\n  >;\n}) => (\n  <Link key={appearance.performer.id} to={performerHref(appearance.performer)}>\n    <GenderIcon gender={appearance.performer.gender} />\n    <PerformerName performer={appearance.performer} as={appearance.as} />\n  </Link>\n);\n\nexport const renderTag = (tag: {\n  id: string;\n  name: string;\n  description?: string | null;\n}) => (\n  <TagLink title={tag.name} link={tagHref(tag)} description={tag.description} />\n);\n\nexport const renderFingerprint = (fingerprint: {\n  hash: string;\n  duration: number;\n  algorithm: FingerprintAlgorithm;\n}) => (\n  <>\n    <Link to={`${createHref(ROUTE_SCENES)}?fingerprint=${fingerprint.hash}`}>\n      {fingerprint.algorithm}: {fingerprint.hash}\n    </Link>\n    <span title={`${fingerprint.duration}s`}>\n      {\", duration: \"}\n      {formatDuration(fingerprint.duration)}\n    </span>\n  </>\n);\n"
  },
  {
    "path": "frontend/src/components/editCard/styles.scss",
    "content": ".EditComment {\n  background-color: $textfield-bg;\n  margin-top: 1rem;\n\n  .card-body a {\n    color: $link-color;\n  }\n\n  blockquote {\n    border-left: 3px solid $muted-gray;\n    padding-left: 1rem;\n    margin-left: 0;\n    font-style: italic;\n    color: $muted-gray;\n  }\n}\n\n.EditDiff {\n  border-radius: 0.25rem;\n  height: 100%;\n  padding: 0.25rem 0.5rem;\n  white-space: pre-wrap;\n}\n\n.VoteBar {\n  display: flex;\n\n  &-voted {\n    font-weight: bold;\n  }\n\n  &-save {\n    margin-left: auto;\n    margin-right: 20px;\n  }\n\n  &-button {\n    margin-right: 8px;\n    margin-top: 8px;\n    min-width: 34px;\n    text-align: center;\n\n    &:last-child {\n      margin-right: 0;\n    }\n\n    .form-label {\n      padding: 0.5rem;\n      margin-bottom: 0;\n    }\n\n    .form-check-input {\n      margin: auto;\n      width: 16px;\n    }\n\n    .form-label,\n    .form-check-input {\n      &:hover {\n        cursor: pointer;\n      }\n    }\n  }\n}\n\n.EditVotes {\n  margin-bottom: 20px;\n  text-align: right;\n}\n\n.ListChangeRow {\n  &-Tags {\n    ul {\n      list-style-type: none;\n      padding-left: 0;\n\n      li {\n        display: inline-block;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/editImages/editImages.tsx",
    "content": "import { type FC, type ChangeEvent, useState } from \"react\";\nimport { Button, Col, Form, Row } from \"react-bootstrap\";\nimport { useFieldArray } from \"react-hook-form\";\nimport type { Lens } from \"@hookform/lenses\";\nimport { CombinedGraphQLErrors } from \"@apollo/client\";\nimport { faImages } from \"@fortawesome/free-solid-svg-icons\";\nimport cx from \"classnames\";\n\nimport { type ImageFragment as Image, useAddImage } from \"src/graphql\";\nimport { Image as ImageInput } from \"src/components/form\";\nimport { Icon, LoadingIndicator } from \"src/components/fragments\";\n\nconst CLASSNAME = \"EditImages\";\nconst CLASSNAME_IMAGES = `${CLASSNAME}-images`;\nconst CLASSNAME_INPUT = `${CLASSNAME}-input`;\nconst CLASSNAME_INPUT_CONTAINER = `${CLASSNAME_INPUT}-container`;\nconst CLASSNAME_DROP = `${CLASSNAME}-drop`;\nconst CLASSNAME_PLACEHOLDER = `${CLASSNAME}-placeholder`;\nconst CLASSNAME_IMAGE = `${CLASSNAME}-image`;\nconst CLASSNAME_UPLOADING = `${CLASSNAME_IMAGE}-uploading`;\n\ninterface EditImagesProps {\n  lens: Lens<Image[]>;\n  file: File | undefined;\n  setFile: (f: File | undefined) => void;\n  maxImages?: number;\n  /** Whether to allow svg/png image input */\n  allowLossless?: boolean;\n  original?: Image[] | undefined;\n}\n\nconst EditImages: FC<EditImagesProps> = ({\n  lens,\n  maxImages,\n  file,\n  setFile,\n  allowLossless = false,\n  original,\n}) => {\n  const interop = lens.interop();\n  const {\n    fields: images,\n    append,\n    remove,\n    replace,\n  } = useFieldArray({\n    control: interop.control,\n    name: interop.name,\n    keyName: \"key\",\n  });\n\n  const [imageData, setImageData] = useState<string>(\"\");\n  const [uploading, setUploading] = useState(false);\n  const [addImage] = useAddImage();\n  const [error, setError] = useState<string>();\n\n  const handleAddImage = () => {\n    setError(\"\");\n    setUploading(true);\n    addImage({\n      variables: {\n        imageData: { file },\n      },\n    })\n      .then((i) => {\n        if (i.data?.imageCreate?.id) {\n          if (!images.some((image) => image.id === i.data?.imageCreate?.id)) {\n            append(i.data.imageCreate);\n          }\n          setFile(undefined);\n          setImageData(\"\");\n        }\n      })\n      .catch((error: unknown) => {\n        if (CombinedGraphQLErrors.is(error)) setError(error.message);\n      })\n      .finally(() => {\n        setUploading(false);\n      });\n  };\n\n  const removeImage = () => {\n    setFile(undefined);\n    setError(\"\");\n    setImageData(\"\");\n  };\n\n  const onFileChange = (event: ChangeEvent<HTMLInputElement>) => {\n    if (event.target.validity.valid && event.target.files?.[0]) {\n      setFile(event.target.files[0]);\n\n      const reader = new FileReader();\n      reader.onload = (e) =>\n        e.target?.result && setImageData(e.target.result as string);\n      reader.onerror = () => setImageData(\"\");\n      reader.onabort = () => setImageData(\"\");\n      reader.readAsDataURL(event.target.files[0]);\n    }\n  };\n\n  const isDisabled = maxImages !== undefined && images.length >= maxImages;\n\n  return (\n    <Row className={`${CLASSNAME} w-100`}>\n      <Col xs={7} className={CLASSNAME_IMAGES}>\n        {images.map((i, index) => (\n          <ImageInput image={i} onRemove={() => remove(index)} key={i.id} />\n        ))}\n      </Col>\n      <Col xs={5} className={CLASSNAME_INPUT}>\n        <div className={CLASSNAME_INPUT_CONTAINER}>\n          {file ? (\n            <div\n              className={cx(CLASSNAME_IMAGE, {\n                [CLASSNAME_UPLOADING]: uploading,\n              })}\n            >\n              <img src={imageData} alt=\"\" />\n              <LoadingIndicator message=\"Uploading image...\" />\n            </div>\n          ) : (\n            !isDisabled && (\n              <div className={CLASSNAME_DROP}>\n                <Form.Control\n                  type=\"file\"\n                  onChange={onFileChange}\n                  accept={[\n                    \".jpg\",\n                    \".jpeg\",\n                    \".webp\",\n                    \".jfif\",\n                    ...(allowLossless ? [\".svg\", \".png\"] : []),\n                  ].join(\",\")}\n                />\n                <div className={CLASSNAME_PLACEHOLDER}>\n                  <Icon icon={faImages} />\n                  <span>Add image</span>\n                </div>\n              </div>\n            )\n          )}\n        </div>\n        <Row className=\"text-end text-danger\">\n          <div>{error}</div>\n        </Row>\n        <div className=\"mt-4 d-flex\">\n          {file && (\n            <>\n              <Button\n                variant=\"danger\"\n                onClick={() => removeImage()}\n                disabled={!file || uploading}\n              >\n                Remove\n              </Button>\n              <Button\n                onClick={() => handleAddImage()}\n                disabled={!file || uploading}\n                className=\"ms-2\"\n              >\n                Upload\n              </Button>\n            </>\n          )}\n          <Button\n            variant=\"danger\"\n            onClick={() => original && replace(original)}\n            disabled={original === undefined}\n            className=\"ms-auto mt-auto\"\n          >\n            Reset Images\n          </Button>\n        </div>\n      </Col>\n    </Row>\n  );\n};\n\nexport default EditImages;\n"
  },
  {
    "path": "frontend/src/components/editImages/index.ts",
    "content": "import EditImages from \"./editImages\";\n\nexport default EditImages;\n"
  },
  {
    "path": "frontend/src/components/editImages/styles.scss",
    "content": ".EditImages {\n  &-drop {\n    align-items: center;\n    border: 3px dashed $text-color;\n    border-radius: 10px;\n    display: flex;\n    height: 400px;\n    justify-content: center;\n    margin: auto;\n    position: relative;\n    width: 400px;\n\n    &:hover {\n      background-color: #394b59;\n    }\n  }\n\n  &-placeholder {\n    align-items: center;\n    display: flex;\n    flex-direction: column;\n    font-size: 2rem;\n    text-align: center;\n\n    .fa-images {\n      font-size: 4rem;\n    }\n  }\n\n  &-images {\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: space-between;\n  }\n\n  &-input-container {\n    display: flex;\n    min-height: 200px;\n  }\n\n  &-image {\n    margin: auto;\n    max-height: 600px;\n    max-width: 100%;\n    position: relative;\n\n    img {\n      max-height: 600px;\n      max-width: 100%;\n    }\n\n    .LoadingIndicator {\n      display: none;\n      position: absolute;\n      text-align: center;\n      text-shadow: 2px 2px black;\n      top: 40%;\n    }\n\n    &-uploading {\n      img {\n        opacity: 0.5;\n      }\n\n      .LoadingIndicator {\n        display: block;\n        opacity: 1;\n      }\n    }\n  }\n\n  .form-control {\n    cursor: pointer;\n    height: 100%;\n    left: 0;\n    opacity: 0;\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/form/BodyModification.tsx",
    "content": "// biome-ignore-all lint/correctness/noNestedComponentDefinitions: react-select\nimport type { FC, ChangeEvent } from \"react\";\nimport Creatable from \"react-select/creatable\";\nimport { components } from \"react-select\";\nimport { Button, Col, Form, InputGroup, Row } from \"react-bootstrap\";\nimport { useFieldArray } from \"react-hook-form\";\nimport type { Lens } from \"@hookform/lenses\";\n\nexport type BodyModItem = {\n  location: string;\n  description?: string | null | undefined;\n};\n\ninterface BodyModificationProps {\n  name: string;\n  lens: Lens<BodyModItem[]>;\n  locationPlaceholder: string;\n  descriptionPlaceholder: string;\n  formatLabel: (text: string) => string;\n}\n\nconst CLASSNAME = \"BodyModification\";\n\nconst BodyModification: FC<BodyModificationProps> = ({\n  name,\n  locationPlaceholder,\n  descriptionPlaceholder,\n  lens,\n  formatLabel,\n}) => {\n  const interop = lens.interop();\n  const {\n    fields: modifications,\n    append,\n    remove,\n    update,\n  } = useFieldArray({\n    control: interop.control,\n    name: interop.name,\n    keyName: \"key\",\n  });\n\n  const isNewLocationValid = (inputValue: string): boolean =>\n    !!inputValue &&\n    !modifications.find(({ location }) => inputValue === location);\n\n  const handleNewLocation = (inputValue: string) => {\n    append({ location: inputValue });\n  };\n\n  const modificationList = modifications.map((mod, index) => (\n    <Row key={mod.location} className=\"mb-1\">\n      <InputGroup className=\"col\">\n        <InputGroup.Text className=\"fw-bold\">Location</InputGroup.Text>\n        <Form.Control defaultValue={mod.location} readOnly />\n        <Form.Control\n          defaultValue={mod.description ?? \"\"}\n          placeholder={descriptionPlaceholder}\n          onInput={(e: ChangeEvent<HTMLInputElement>) =>\n            update(index, {\n              location: mod.location,\n              description: e.currentTarget.value,\n            })\n          }\n        />\n        <Button variant=\"danger\" onClick={() => remove(index)}>\n          Remove\n        </Button>\n      </InputGroup>\n    </Row>\n  ));\n\n  return (\n    <>\n      <Row className={CLASSNAME}>\n        <Col className=\"mb-3\">\n          <Form.Label className=\"text-capitalize\">{name}</Form.Label>\n          <Creatable\n            classNamePrefix=\"react-select\"\n            value={null}\n            name={name}\n            placeholder={locationPlaceholder}\n            isValidNewOption={isNewLocationValid}\n            onCreateOption={handleNewLocation}\n            formatCreateLabel={formatLabel}\n            components={{\n              DropdownIndicator: () => null,\n              Menu: (data) =>\n                data.options.length > 0 ? <components.Menu {...data} /> : null,\n            }}\n          />\n        </Col>\n      </Row>\n      {modificationList}\n    </>\n  );\n};\n\nexport default BodyModification;\n"
  },
  {
    "path": "frontend/src/components/form/EditNote.tsx",
    "content": "import type { FC } from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport cx from \"classnames\";\nimport type { FieldError, UseFormRegister } from \"react-hook-form\";\n\nimport NoteInput from \"./NoteInput\";\n\ninterface Props {\n  // biome-ignore lint/suspicious/noExplicitAny: Awkward react-hook-form type\n  register: UseFormRegister<any>;\n  error?: FieldError;\n}\n\nconst EditNote: FC<Props> = ({ register, error }) => (\n  <div className=\"mb-3\">\n    <Form.Label>Edit Note</Form.Label>\n    <NoteInput\n      className={cx({ \"is-invalid\": error })}\n      register={register}\n      hasError={!!error?.message}\n    />\n    <Form.Text>\n      Please add any relevant sources or other supporting information for your\n      edit.\n    </Form.Text>\n    <Form.Control.Feedback type=\"invalid\">\n      {error?.message}\n    </Form.Control.Feedback>\n  </div>\n);\n\nexport default EditNote;\n"
  },
  {
    "path": "frontend/src/components/form/Image.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button } from \"react-bootstrap\";\nimport { faXmark } from \"@fortawesome/free-solid-svg-icons\";\n\nimport { Icon } from \"src/components/fragments\";\nimport Image from \"src/components/image\";\nimport type { ImageFragment } from \"src/graphql\";\n\ninterface ImageProps {\n  image: Pick<ImageFragment, \"id\" | \"url\" | \"width\" | \"height\">;\n  onRemove: () => void;\n}\n\nconst CLASSNAME = \"ImageInput\";\nconst CLASSNAME_IMAGE = `${CLASSNAME}-image`;\nconst CLASSNAME_REMOVE = `${CLASSNAME}-remove`;\n\nconst ImageInput: FC<ImageProps> = ({ image, onRemove }) => (\n  <div className={CLASSNAME}>\n    <Button\n      variant=\"danger\"\n      className={CLASSNAME_REMOVE}\n      onClick={() => onRemove()}\n    >\n      <Icon icon={faXmark} />\n    </Button>\n    <Image images={image} className={CLASSNAME_IMAGE} size=\"full\" />\n  </div>\n);\n\nexport default ImageInput;\n"
  },
  {
    "path": "frontend/src/components/form/NavButtons.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button } from \"react-bootstrap\";\nimport { useNavigate } from \"react-router-dom\";\n\ninterface Props {\n  onNext: () => void;\n  disabled?: boolean;\n}\n\nexport const NavButtons: FC<Props> = ({ onNext, disabled = false }) => {\n  const navigate = useNavigate();\n  return (\n    <div className=\"d-flex mt-2\">\n      <Button\n        variant=\"danger\"\n        className=\"ms-auto me-2\"\n        onClick={() => navigate(-1)}\n      >\n        Cancel\n      </Button>\n      <Button className=\"me-1\" onClick={onNext} disabled={disabled}>\n        Next\n      </Button>\n    </div>\n  );\n};\n"
  },
  {
    "path": "frontend/src/components/form/NoteInput.tsx",
    "content": "import { type FC, type ChangeEvent, useState } from \"react\";\nimport { Form, Tabs, Tab } from \"react-bootstrap\";\nimport cx from \"classnames\";\n\nimport EditComment from \"src/components/editCard/EditComment\";\nimport type { UseFormRegister } from \"react-hook-form\";\nimport { useCurrentUser } from \"src/hooks\";\n\ninterface IProps {\n  onChange?: (text: string) => void;\n  className?: string;\n  register?: UseFormRegister<{ note: string }>;\n  hasError?: boolean;\n}\n\nconst NoteInput: FC<IProps> = ({\n  onChange,\n  className,\n  register,\n  hasError = false,\n}) => {\n  const { user } = useCurrentUser();\n  const [comment, setComment] = useState(\"\");\n\n  const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n    setComment(e.currentTarget.value);\n    onChange?.(e.currentTarget.value);\n  };\n\n  const textareaProps = register ? register(\"note\") : { name: \"note\" };\n  const now = new Date().toISOString();\n\n  return (\n    <div className={cx(\"NoteInput\", { \"is-invalid\": hasError })}>\n      <Tabs id=\"add-comment\">\n        <Tab eventKey=\"write\" title=\"Write\" className=\"NoteInput-tab\">\n          <Form.Control\n            as=\"textarea\"\n            className={className}\n            onInput={handleChange}\n            rows={5}\n            {...textareaProps}\n          />\n        </Tab>\n        <Tab eventKey=\"preview\" title=\"Preview\" unmountOnExit mountOnEnter>\n          <EditComment\n            id={`${user?.id}-${now}`}\n            comment={comment}\n            date={now}\n            user={user}\n          />\n        </Tab>\n      </Tabs>\n    </div>\n  );\n};\n\nexport default NoteInput;\n"
  },
  {
    "path": "frontend/src/components/form/SubmitButtons.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button } from \"react-bootstrap\";\nimport { useNavigate } from \"react-router-dom\";\n\ninterface Props {\n  disabled?: boolean;\n}\n\nexport const SubmitButtons: FC<Props> = ({ disabled = false }) => {\n  const navigate = useNavigate();\n  return (\n    <div className=\"d-flex mt-2\">\n      <Button\n        variant=\"danger\"\n        className=\"ms-auto me-2\"\n        onClick={() => navigate(-1)}\n      >\n        Cancel\n      </Button>\n      <Button type=\"submit\" disabled className=\"d-none\" aria-hidden=\"true\" />\n      <Button type=\"submit\" disabled={disabled}>\n        Submit Edit\n      </Button>\n    </div>\n  );\n};\n"
  },
  {
    "path": "frontend/src/components/form/index.ts",
    "content": "export { default as BodyModification } from \"./BodyModification\";\nexport { default as Image } from \"./Image\";\nexport { default as EditNote } from \"./EditNote\";\nexport { default as NoteInput } from \"./NoteInput\";\nexport * from \"./NavButtons\";\nexport * from \"./SubmitButtons\";\n"
  },
  {
    "path": "frontend/src/components/form/styles.scss",
    "content": ".BodyModification {\n  &-remove {\n    z-index: 2;\n    background: transparent;\n    border: none;\n    color: rgba(0 0 0 / 50%);\n    width: 10%;\n\n    &:hover {\n      color: rgba(0 0 0 / 80%);\n    }\n  }\n\n  &-select {\n    width: 100%;\n  }\n\n  &-label {\n    width: 90%;\n  }\n\n  &-location {\n    display: inline-block;\n    margin-right: 5%;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    vertical-align: middle;\n    white-space: nowrap;\n    width: 30%;\n  }\n\n  .form-control {\n    display: inline;\n    width: 65%;\n  }\n\n  h6 {\n    text-transform: capitalize;\n  }\n}\n\n.ImageInput {\n  margin: 0.5rem;\n  position: relative;\n  max-height: 200px;\n\n  &-image {\n    border-radius: 3px;\n    height: 200px;\n  }\n\n  &-remove {\n    z-index: 2;\n    left: 5px;\n    opacity: 0.6;\n    padding: 0 5px;\n    position: absolute;\n    top: 5px;\n  }\n\n  &:hover &-remove {\n    opacity: 1;\n  }\n}\n\n.NoteInput {\n  .tab-content {\n    padding-bottom: 0;\n  }\n\n  .EditComment {\n    margin-bottom: 0;\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/fragments/ErrorMessage.tsx",
    "content": "import type { FC, ReactNode } from \"react\";\n\ninterface IProps {\n  error: string | ReactNode;\n}\n\nconst ErrorMessage: FC<IProps> = ({ error }) => (\n  <div className=\"row ErrorMessage\">\n    <h2 className=\"ErrorMessage-content\">Error: {error}</h2>\n  </div>\n);\n\nexport default ErrorMessage;\n"
  },
  {
    "path": "frontend/src/components/fragments/Favorite.tsx",
    "content": "import type { FC, MouseEvent } from \"react\";\nimport { faStar } from \"@fortawesome/free-solid-svg-icons\";\nimport { faStar as farStar } from \"@fortawesome/free-regular-svg-icons\";\nimport { Button } from \"react-bootstrap\";\nimport cx from \"classnames\";\n\nimport { Icon, Tooltip } from \"src/components/fragments\";\nimport { useSetFavorite } from \"src/graphql\";\n\nconst CLASSNAME = \"FavoriteStar\";\n\ninterface Props {\n  entity: {\n    id: string;\n    deleted: boolean;\n    is_favorite: boolean;\n  };\n  entityType: \"performer\" | \"studio\";\n  className?: string;\n  interactable?: boolean;\n}\n\nexport const FavoriteStar: FC<Props> = ({\n  className,\n  entity,\n  entityType,\n  interactable = false,\n}) => {\n  const [setFavorite] = useSetFavorite(entityType, entity.id);\n\n  const handleClick = (e: MouseEvent) => {\n    setFavorite({\n      variables: {\n        id: entity.id,\n        favorite: !entity.is_favorite,\n      },\n    });\n\n    e.preventDefault();\n  };\n\n  if ((!interactable && !entity.is_favorite) || entity.deleted) return null;\n\n  return (\n    <Tooltip\n      text={\n        interactable ? `${entity.is_favorite ? \"Remove\" : \"Add\"} Favorite` : \"\"\n      }\n    >\n      <Button\n        disabled={!interactable}\n        onClick={handleClick}\n        className={cx(CLASSNAME, className)}\n        variant=\"link\"\n      >\n        <Icon\n          icon={entity.is_favorite ? faStar : farStar}\n          color={entity.is_favorite ? \"gold\" : \"white\"}\n        />\n      </Button>\n    </Tooltip>\n  );\n};\n"
  },
  {
    "path": "frontend/src/components/fragments/GenderIcon.tsx",
    "content": "import type { FC } from \"react\";\nimport {\n  faVenus,\n  faTransgender,\n  faMars,\n  faVenusMars,\n} from \"@fortawesome/free-solid-svg-icons\";\nimport Icon from \"./Icon\";\nimport type { GenderEnum } from \"src/graphql\";\nimport { GenderTypes } from \"src/constants\";\n\ninterface IconProps {\n  gender?: GenderEnum | null;\n}\n\nconst GenderIcon: FC<IconProps> = ({ gender }) => {\n  if (gender) {\n    const icon =\n      gender.toLowerCase() === \"male\"\n        ? faMars\n        : gender.toLowerCase() === \"female\"\n          ? faVenus\n          : faTransgender;\n    return <Icon icon={icon} title={GenderTypes[gender]} />;\n  }\n  return <Icon icon={faVenusMars} />;\n};\n\nexport default GenderIcon;\n"
  },
  {
    "path": "frontend/src/components/fragments/Help.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button, OverlayTrigger, Popover } from \"react-bootstrap\";\nimport { Icon } from \"src/components/fragments\";\nimport { faQuestionCircle } from \"@fortawesome/free-solid-svg-icons\";\n\ninterface Props {\n  message: string;\n}\n\nconst Help: FC<Props> = ({ message }) => {\n  const renderContent = () => (\n    <Popover id=\"help\">\n      <Popover.Body>{message}</Popover.Body>\n    </Popover>\n  );\n\n  return (\n    <OverlayTrigger\n      overlay={renderContent()}\n      placement=\"bottom\"\n      trigger=\"hover\"\n    >\n      <Button variant=\"link\" className=\"minimal\">\n        <Icon icon={faQuestionCircle} />\n      </Button>\n    </OverlayTrigger>\n  );\n};\n\nexport default Help;\n"
  },
  {
    "path": "frontend/src/components/fragments/Icon.tsx",
    "content": "import type { FC } from \"react\";\nimport cx from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport type { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\n\ninterface Props {\n  icon: IconDefinition;\n  className?: string;\n  color?: string;\n  title?: string;\n  variant?: \"danger\" | \"success\" | \"info\" | \"warning\";\n}\n\nconst Icon: FC<Props> = ({ icon, className, color, title, variant }) => (\n  <FontAwesomeIcon\n    title={title}\n    icon={icon}\n    className={cx(\"fa-icon\", className, { [`text-${variant}`]: variant })}\n    color={color}\n  />\n);\n\nexport default Icon;\n"
  },
  {
    "path": "frontend/src/components/fragments/LoadingIndicator.tsx",
    "content": "import { type FC, useEffect, useState } from \"react\";\nimport { Spinner } from \"react-bootstrap\";\nimport cx from \"classnames\";\n\ninterface LoadingProps {\n  message?: string;\n  delay?: number;\n}\n\nconst CLASSNAME = \"LoadingIndicator\";\nconst CLASSNAME_MESSAGE = `${CLASSNAME}-message`;\nconst CLASSNAME_DELAYED = `${CLASSNAME}-delayed`;\n\nconst LoadingIndicator: FC<LoadingProps> = ({ message, delay = 100 }) => {\n  const [delayed, setDelayed] = useState(delay > 0);\n  useEffect(() => {\n    if (!delayed || delay === 0) return;\n    const timeout = setTimeout(() => setDelayed(false), delay);\n    return () => clearTimeout(timeout);\n  }, [delayed, delay]);\n\n  return (\n    <div className={cx(CLASSNAME, { [CLASSNAME_DELAYED]: delayed })}>\n      <Spinner animation=\"border\" role=\"status\">\n        <span className=\"visually-hidden\">Loading...</span>\n      </Spinner>\n      <h4 className={CLASSNAME_MESSAGE}>{message ?? \"Loading...\"}</h4>\n    </div>\n  );\n};\n\nexport default LoadingIndicator;\n"
  },
  {
    "path": "frontend/src/components/fragments/PerformerName.tsx",
    "content": "import type { FC } from \"react\";\nimport type { PerformerFragment } from \"src/graphql\";\n\ninterface PerformerNameProps {\n  performer: Pick<PerformerFragment, \"name\" | \"disambiguation\" | \"deleted\">;\n  as?: string | null;\n}\n\nconst PerformerName: FC<PerformerNameProps> = ({ performer, as }) => {\n  if (!as)\n    return (\n      <>\n        {performer.deleted ? (\n          <del>{performer.name}</del>\n        ) : (\n          <span>{performer.name}</span>\n        )}\n        {performer.disambiguation && (\n          <small className=\"ms-1 text-small text-muted\">\n            ({performer.disambiguation})\n          </small>\n        )}\n      </>\n    );\n  return (\n    <>\n      <span>{as}</span>\n      <small className=\"ms-1 text-small text-muted\">\n        ({performer.name})\n        {performer.disambiguation && (\n          <small className=\"ms-1 text-small text-muted\">\n            ({performer.disambiguation})\n          </small>\n        )}\n      </small>\n    </>\n  );\n};\n\nexport default PerformerName;\n"
  },
  {
    "path": "frontend/src/components/fragments/SearchHint.tsx",
    "content": "import type React from \"react\";\nimport { faCircleQuestion } from \"@fortawesome/free-regular-svg-icons\";\nimport { Icon, Tooltip } from \"src/components/fragments\";\n\nexport const SearchHint: React.FC = () => (\n  <Tooltip text='Add \" to the end to include all words, or paste in a Stash ID'>\n    <div className=\"SearchHint\">\n      <Icon icon={faCircleQuestion} color=\"black\" />\n    </div>\n  </Tooltip>\n);\n"
  },
  {
    "path": "frontend/src/components/fragments/SearchInput.tsx",
    "content": "import { components } from \"react-select\";\nimport { extractIdFromUrl } from \"src/utils\";\n\n// Shared Input component for react-select that extracts IDs from pasted stash-box URLs\nexport const SearchInput: typeof components.Input = (props) => (\n  <components.Input\n    {...props}\n    onPaste={(e) => {\n      const pasted = e.clipboardData.getData(\"text/plain\");\n      const extracted = extractIdFromUrl(pasted);\n      if (extracted !== pasted) {\n        e.preventDefault();\n        props.selectProps.onInputChange(extracted, {\n          action: \"input-change\",\n          prevInputValue: String(props.value ?? \"\"),\n        });\n      }\n    }}\n  />\n);\n"
  },
  {
    "path": "frontend/src/components/fragments/SiteLink.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport cx from \"classnames\";\nimport { siteHref } from \"src/utils/route\";\n\nconst CLASSNAME = \"SiteLink\";\nconst CLASSNAME_ICON = `${CLASSNAME}-icon`;\nconst CLASSNAME_NAME = `${CLASSNAME}-name`;\nconst CLASSNAME_NO_MARGIN = `${CLASSNAME}-no-margin`;\n\ninterface Props {\n  site: {\n    id: string;\n    name: string;\n    icon: string;\n  } | null;\n  hideName?: boolean;\n  noMargin?: boolean;\n}\n\nconst SiteLink: FC<Props> = ({ site, hideName = false, noMargin = false }) =>\n  site && (\n    <Link to={siteHref(site)} className={CLASSNAME}>\n      <img className={CLASSNAME_ICON} src={site.icon} alt=\"\" />\n      {!hideName && (\n        <span\n          className={cx(CLASSNAME_NAME, { [CLASSNAME_NO_MARGIN]: noMargin })}\n        >\n          {site.name}\n        </span>\n      )}\n    </Link>\n  );\n\nexport default SiteLink;\n"
  },
  {
    "path": "frontend/src/components/fragments/TagLink.tsx",
    "content": "import type { FC } from \"react\";\nimport { Badge, Button } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport { Icon } from \"src/components/fragments\";\nimport { faXmark } from \"@fortawesome/free-solid-svg-icons\";\nimport cx from \"classnames\";\n\ninterface IProps {\n  title: string;\n  link?: string;\n  description?: string | null;\n  className?: string;\n  onRemove?: () => void;\n  disabled?: boolean;\n}\n\nconst TagLink: FC<IProps> = ({\n  title,\n  link,\n  description,\n  className,\n  onRemove,\n  disabled = false,\n}) => (\n  <Badge className={cx(\"tag-item\", className)} bg=\"none\">\n    <abbr title={description || undefined}>\n      {link && !disabled ? <Link to={link}>{title}</Link> : title}\n    </abbr>\n    {onRemove && (\n      <Button onClick={onRemove}>\n        <Icon icon={faXmark} />\n      </Button>\n    )}\n  </Badge>\n);\n\nexport default TagLink;\n"
  },
  {
    "path": "frontend/src/components/fragments/Thumbnail.tsx",
    "content": "import type { FC } from \"react\";\nimport cx from \"classnames\";\nimport { faXmark } from \"@fortawesome/free-solid-svg-icons\";\nimport Icon from \"./Icon\";\n\ninterface Props {\n  image?: string;\n  size?: 600 | 300;\n  alt?: string | null;\n  className?: string;\n  orientation?: \"portrait\" | \"landscape\";\n}\n\nconst doubleSize = {\n  300: 600,\n  600: 1280,\n};\n\nexport const Thumbnail: FC<Props> = ({\n  image,\n  size,\n  alt,\n  className,\n  orientation = \"landscape\",\n}) =>\n  image ? (\n    <img\n      alt={alt ?? \"\"}\n      className={className}\n      src={image + (size ? `?size=${size}` : \"\")}\n      srcSet={\n        size ? `${image}?size=${doubleSize[size]} ${doubleSize[size]}w` : \"\"\n      }\n    />\n  ) : (\n    <div\n      className={cx(className, \"Thumbnail-empty\")}\n      style={{ aspectRatio: orientation === \"landscape\" ? \"16/9\" : \"2/3\" }}\n    >\n      <Icon icon={faXmark} />\n    </div>\n  );\n"
  },
  {
    "path": "frontend/src/components/fragments/Tooltip.tsx",
    "content": "import type { FC, ReactElement } from \"react\";\nimport {\n  OverlayTrigger,\n  Tooltip as BSTooltip,\n  type PopoverProps,\n} from \"react-bootstrap\";\n\ninterface Props {\n  text: string | ReactElement;\n  placement?: PopoverProps[\"placement\"];\n  children: ReactElement;\n  delay?: number;\n}\n\nconst Tooltip: FC<Props> = ({\n  children,\n  text,\n  delay = 200,\n  placement = \"bottom-end\",\n}) => (\n  <OverlayTrigger\n    delay={{ show: delay, hide: 0 }}\n    overlay={\n      <BSTooltip className=\"Tooltip\" id=\"tooltip\">\n        {text}\n      </BSTooltip>\n    }\n    show={text ? undefined : false}\n    placement={placement}\n    trigger={[\"hover\", \"focus\"]}\n  >\n    {children}\n  </OverlayTrigger>\n);\n\nexport default Tooltip;\n"
  },
  {
    "path": "frontend/src/components/fragments/index.ts",
    "content": "export { default as GenderIcon } from \"./GenderIcon\";\nexport { default as LoadingIndicator } from \"./LoadingIndicator\";\nexport { default as Icon } from \"./Icon\";\nexport { default as TagLink } from \"./TagLink\";\nexport { default as SiteLink } from \"./SiteLink\";\nexport { default as PerformerName } from \"./PerformerName\";\nexport { default as ErrorMessage } from \"./ErrorMessage\";\nexport { default as Help } from \"./Help\";\nexport { default as Tooltip } from \"./Tooltip\";\nexport { FavoriteStar } from \"./Favorite\";\nexport { Thumbnail } from \"./Thumbnail\";\nexport { SearchHint } from \"./SearchHint\";\nexport { SearchInput } from \"./SearchInput\";\n"
  },
  {
    "path": "frontend/src/components/fragments/styles.scss",
    "content": "@keyframes fade-in {\n  0% {\n    opacity: 0;\n  }\n\n  100% {\n    opacity: 1;\n  }\n}\n\n.LoadingIndicator {\n  align-items: center;\n  display: flex;\n  flex-direction: column;\n  height: 70vh;\n  justify-content: center;\n  width: 100%;\n  opacity: 1;\n  transition: opacity 1s linear;\n\n  &-delayed {\n    opacity: 0;\n  }\n\n  &-message {\n    margin-top: 1rem;\n  }\n\n  .spinner-border {\n    height: 3rem;\n    width: 3rem;\n  }\n}\n\n.tag-item {\n  background-color: #bfccd6;\n  color: #182026;\n  font-size: 12px;\n  font-weight: 400;\n  line-height: 16px;\n  margin: 5px;\n  padding: 2px 6px;\n\n  a:hover {\n    color: unset;\n    text-decoration: none;\n  }\n\n  &:hover {\n    cursor: pointer;\n  }\n\n  .btn {\n    background: none;\n    border: none;\n    color: #182026;\n    margin: 0;\n    margin-left: 0.25rem;\n    padding: 0 0.5rem;\n\n    &:hover {\n      background-color: #ffbdad;\n      color: #de350b;\n    }\n\n    .fa-xmark {\n      width: 0.5rem;\n    }\n  }\n}\n\n.ErrorMessage {\n  align-items: center;\n  height: 20rem;\n  justify-content: center;\n\n  &-content {\n    display: inline-block;\n  }\n}\n\n.SiteLink {\n  align-items: baseline;\n  display: inline-flex;\n\n  &-icon {\n    align-self: center;\n    border-radius: 3px;\n    height: 2ex;\n    width: 2ex;\n    margin-right: 5px;\n  }\n\n  &-name {\n    font-size: 2ex;\n    font-weight: bold;\n\n    &::after {\n      content: \":\";\n      margin-right: 0.5rem;\n    }\n  }\n\n  &-no-margin::after {\n    display: none;\n  }\n}\n\n.FavoriteStar {\n  padding: 0;\n  margin-top: -4px;\n\n  &:disabled {\n    opacity: 1;\n  }\n\n  &:focus {\n    box-shadow: none;\n  }\n}\n\n.SearchHint {\n  margin-left: 10px;\n  cursor: help;\n}\n\n.Tooltip {\n  position: absolute !important;\n}\n\n.Thumbnail {\n  &-empty {\n    display: flex;\n    width: 100%;\n    height: 100%;\n    color: var(--bs-gray-400);\n    background-color: #394b59;\n    align-items: center;\n    justify-content: center;\n    border-radius: 4px;\n\n    .fa-icon {\n      height: 30px;\n      max-height: 30%;\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/image/Image.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport cx from \"classnames\";\nimport { faXmark } from \"@fortawesome/free-solid-svg-icons\";\nimport { sortImageURLs } from \"src/utils\";\nimport { LoadingIndicator, Icon } from \"src/components/fragments\";\n\nconst CLASSNAME = \"Image\";\n\ntype Image = {\n  url: string;\n  width: number;\n  height: number;\n};\n\ntype ImageSize = 1280 | 600 | 300 | \"full\";\n\ninterface ImageProps {\n  image?: Image;\n  emptyMessage?: string;\n  size?: ImageSize;\n  alt?: string;\n}\n\nconst ImageComponent: FC<ImageProps> = ({\n  image,\n  emptyMessage = \"No image\",\n  size,\n  alt,\n}) => {\n  const [imageState, setImageState] = useState<\"loading\" | \"error\" | \"done\">(\n    \"loading\",\n  );\n\n  if (!image?.url)\n    return (\n      <div className={`${CLASSNAME}-missing`}>\n        <Icon icon={faXmark} color=\"var(--bs-gray-400)\" />\n        <div>{emptyMessage}</div>\n      </div>\n    );\n\n  const sizeQuery = size ? `?size=${size}` : \"\";\n\n  return (\n    <>\n      {imageState === \"loading\" && (\n        <LoadingIndicator message=\"Loading image...\" delay={200} />\n      )}\n      {imageState === \"error\" && (\n        <div className=\"Image-error\">\n          <Icon icon={faXmark} color=\"red\" />\n          <div>Failed to load image</div>\n        </div>\n      )}\n      <img\n        alt={alt ?? \"\"}\n        src={`${image.url}${sizeQuery}`}\n        className={`${CLASSNAME}-image`}\n        onLoad={() => setImageState(\"done\")}\n        onError={() => setImageState(\"error\")}\n      />\n    </>\n  );\n};\n\ninterface ContainerProps {\n  images: Image[] | Image | undefined;\n  orientation?: \"landscape\" | \"portrait\";\n  emptyMessage?: string;\n  size?: ImageSize;\n  alt?: string;\n  className?: string;\n}\n\nconst ImageContainer: FC<ContainerProps> = ({\n  className,\n  images,\n  orientation = \"landscape\",\n  ...props\n}) => {\n  const image = Array.isArray(images)\n    ? sortImageURLs(images, orientation)[0]\n    : images;\n\n  const aspectRatio = image ? `${image.width}/${image.height}` : \"16/6\";\n\n  return (\n    <div className={cx(CLASSNAME, className)} style={{ aspectRatio }}>\n      <ImageComponent {...props} image={image} />\n    </div>\n  );\n};\nexport default ImageContainer;\n"
  },
  {
    "path": "frontend/src/components/image/index.ts",
    "content": "export { default } from \"./Image\";\n"
  },
  {
    "path": "frontend/src/components/image/styles.scss",
    "content": ".Image {\n  position: relative;\n  display: flex;\n  max-height: 100%;\n  max-width: 100%;\n\n  &-image {\n    max-width: 100%;\n    max-height: 100%;\n    z-index: 1;\n  }\n\n  .LoadingIndicator {\n    position: absolute;\n    background-color: $gray-600;\n    border-radius: 4px;\n    height: 100%;\n    width: 100%;\n    text-align: center;\n  }\n\n  &-error,\n  &-missing {\n    position: absolute;\n    background-color: $secondary;\n    width: 100%;\n    height: 100%;\n    align-content: center;\n    text-align: center;\n    font-size: 24px;\n\n    .fa-icon {\n      border-radius: 4px;\n      width: 70px;\n      height: 70px;\n      max-width: 100%;\n      max-height: 100%;\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/imageCarousel/ImageCarousel.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { Button } from \"react-bootstrap\";\nimport {\n  faChevronLeft,\n  faChevronRight,\n} from \"@fortawesome/free-solid-svg-icons\";\n\nimport type { ImageFragment } from \"src/graphql\";\nimport Image from \"src/components/image\";\nimport { Icon } from \"src/components/fragments\";\nimport { sortImageURLs } from \"src/utils\";\n\ninterface ImageCarouselProps {\n  images: ImageFragment[];\n  orientation?: \"portrait\" | \"landscape\";\n}\n\nconst ImageCarousel: FC<ImageCarouselProps> = ({ images, orientation }) => {\n  const [imageIndex, setImageIndex] = useState(0);\n  const sortedImages = orientation\n    ? sortImageURLs(images, orientation)\n    : images;\n\n  if (sortedImages.length === 0) return <div />;\n\n  const changeImage = (index: number) => {\n    setImageIndex(index);\n  };\n  const setNext = () =>\n    changeImage(imageIndex === sortedImages.length - 1 ? 0 : imageIndex + 1);\n  const setPrev = () =>\n    changeImage(imageIndex === 0 ? sortedImages.length - 1 : imageIndex - 1);\n\n  return (\n    <div className=\"image-carousel\">\n      <div className=\"image-container\">\n        <Button\n          className=\"prev-button minimal\"\n          onClick={setPrev}\n          disabled={sortedImages.length === 1}\n          variant=\"link\"\n        >\n          <Icon icon={faChevronLeft} />\n        </Button>\n        <div className=\"image-carousel-img\">\n          <Image\n            images={sortedImages[imageIndex]}\n            key={sortedImages[imageIndex].url}\n            size={600}\n          />\n        </div>\n        <Button\n          className=\"next-button minimal\"\n          onClick={setNext}\n          disabled={sortedImages.length === 1}\n          variant=\"link\"\n        >\n          <Icon icon={faChevronRight} />\n        </Button>\n      </div>\n\n      <h5 className=\"text-center\">\n        {imageIndex + 1} of {sortedImages.length}\n      </h5>\n    </div>\n  );\n};\n\nexport default ImageCarousel;\n"
  },
  {
    "path": "frontend/src/components/imageCarousel/index.ts",
    "content": "import ImageCarousel from \"./ImageCarousel\";\n\nexport default ImageCarousel;\n"
  },
  {
    "path": "frontend/src/components/imageCarousel/styles.scss",
    "content": ".image-carousel {\n  height: 100%;\n  width: 100%;\n\n  .image-container {\n    align-items: center;\n    display: flex;\n    flex-direction: row;\n    height: 100%;\n    justify-content: center;\n    position: relative;\n    width: 100%;\n  }\n\n  &-img {\n    display: flex;\n    flex-grow: 1;\n    height: 100%;\n    justify-content: center;\n    width: 0;\n\n    img {\n      border-radius: 3px;\n      max-height: 100%;\n      max-width: 100%;\n      object-fit: contain;\n      object-position: center;\n    }\n  }\n\n  .carousel {\n    height: 80%;\n    width: inherit;\n\n    .slide {\n      align-items: center;\n      display: flex;\n      justify-content: center;\n    }\n\n    .slider img {\n      width: inherit;\n    }\n  }\n\n  .slider-wrapper,\n  .slider {\n    height: 100%;\n  }\n\n  .prev-button {\n    padding-left: 0;\n  }\n\n  .next-button {\n    padding-right: 0;\n  }\n\n  .prev-button,\n  .next-button {\n    .fa-icon {\n      height: 4rem;\n      opacity: 0.4;\n      width: 2rem;\n    }\n\n    &:focus {\n      box-shadow: none;\n    }\n\n    &:hover {\n      background-color: transparent;\n      filter: drop-shadow(2px 2px 2px black);\n\n      .fa-icon {\n        opacity: 1;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/imageChangeRow/ImageChangeRow.tsx",
    "content": "import type { FC } from \"react\";\nimport { Col, Row } from \"react-bootstrap\";\nimport ImageComponent from \"src/components/image\";\n\ntype Image = {\n  height: number;\n  id: string;\n  url: string;\n  width: number;\n};\n\nconst CLASSNAME = \"ImageChangeRow\";\nconst CLASSNAME_IMAGE = `${CLASSNAME}-image`;\n\nexport interface ImageChangeRowProps {\n  newImages?: (Image | null)[] | null;\n  oldImages?: (Image | null)[] | null;\n  showDiff?: boolean;\n}\n\nconst Images: FC<{\n  images: (Image | null)[] | null | undefined;\n}> = ({ images }) => {\n  return (\n    <>\n      {(images ?? []).map((image, i) =>\n        image === null ? (\n          // biome-ignore lint/suspicious/noArrayIndexKey: Image is deleted, no other key\n          <img className={CLASSNAME_IMAGE} alt=\"Deleted\" key={`deleted-${i}`} />\n        ) : (\n          <div key={image.id} className={CLASSNAME_IMAGE}>\n            <ImageComponent images={image} alt=\"\" size=\"full\" />\n            <div className=\"text-center\">\n              {image.width} x {image.height}\n            </div>\n          </div>\n        ),\n      )}\n    </>\n  );\n};\n\nconst ImageChangeRow: FC<ImageChangeRowProps> = ({\n  newImages,\n  oldImages,\n  showDiff = false,\n}) =>\n  (newImages ?? []).length > 0 || (oldImages ?? []).length > 0 ? (\n    <Row className={CLASSNAME}>\n      <b className=\"col-2 text-end\">Images</b>\n      {showDiff && (\n        <Col xs={5}>\n          {(oldImages ?? []).length > 0 && (\n            <>\n              <h6>Removed</h6>\n              <div className={CLASSNAME}>\n                <Images images={oldImages} />\n              </div>\n            </>\n          )}\n        </Col>\n      )}\n      <Col xs={showDiff ? 5 : 10}>\n        {(newImages ?? []).length > 0 && (\n          <>\n            {showDiff && <h6>Added</h6>}\n            <div className={CLASSNAME}>\n              <Images images={newImages} />\n            </div>\n          </>\n        )}\n      </Col>\n    </Row>\n  ) : null;\n\nexport default ImageChangeRow;\n"
  },
  {
    "path": "frontend/src/components/imageChangeRow/index.ts",
    "content": "export { default } from \"./ImageChangeRow\";\n"
  },
  {
    "path": "frontend/src/components/imageChangeRow/styles.scss",
    "content": ".ImageChangeRow {\n  display: flex;\n  flex-wrap: wrap;\n\n  .Image {\n    height: 150px;\n    margin: 5px;\n    width: auto;\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/linkedChangeRow/LinkedChangeRow.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Col, Row } from \"react-bootstrap\";\nimport cx from \"classnames\";\n\ninterface Change {\n  name: string | null | undefined;\n  link: string | null | undefined;\n}\n\ninterface LinkedChangeRowProps {\n  name: string;\n  oldEntity?: Change | null;\n  newEntity?: Change | null;\n  showDiff?: boolean;\n}\n\nconst LinkedChangeRow: FC<LinkedChangeRowProps> = ({\n  name,\n  newEntity,\n  oldEntity,\n  showDiff = false,\n}) => {\n  function getValue(value: Change | null | undefined) {\n    if (!value?.name) {\n      return;\n    }\n\n    if (!value.link) {\n      return value.name;\n    }\n\n    return <Link to={value.link}>{value.name}</Link>;\n  }\n\n  if (!newEntity?.link && !oldEntity?.link) return null;\n\n  return (\n    <Row className=\"mb-2\">\n      <b className=\"col-2 text-end pt-1\">{name}</b>\n      {showDiff && (\n        <Col xs={5} className=\"ms-auto\" key={oldEntity?.name}>\n          <div className=\"EditDiff bg-danger\">{getValue(oldEntity)}</div>\n        </Col>\n      )}\n      <Col xs={showDiff ? 5 : 10} key={newEntity?.name}>\n        <div className={cx(\"EditDiff\", { \"bg-success\": showDiff })}>\n          {getValue(newEntity)}\n        </div>\n      </Col>\n    </Row>\n  );\n};\n\nexport default LinkedChangeRow;\n"
  },
  {
    "path": "frontend/src/components/linkedChangeRow/index.ts",
    "content": "export { default } from \"./LinkedChangeRow\";\n"
  },
  {
    "path": "frontend/src/components/list/EditList.tsx",
    "content": "import type { FC } from \"react\";\n\nimport { useEditFilter, usePagination } from \"src/hooks\";\nimport {\n  useEdits,\n  type TargetTypeEnum,\n  type SortDirectionEnum,\n  type VoteStatusEnum,\n  type OperationEnum,\n  type EditSortEnum,\n  type UserVotedFilterEnum,\n} from \"src/graphql\";\nimport { ErrorMessage } from \"src/components/fragments\";\nimport EditCard from \"src/components/editCard\";\nimport List from \"./List\";\n\ninterface EditsProps {\n  id?: string;\n  sort?: EditSortEnum;\n  direction?: SortDirectionEnum;\n  type?: TargetTypeEnum;\n  status?: VoteStatusEnum;\n  operation?: OperationEnum;\n  voted?: UserVotedFilterEnum;\n  userId?: string;\n  defaultVoteStatus?: VoteStatusEnum;\n  defaultVoted?: UserVotedFilterEnum;\n  defaultBot?: \"include\" | \"exclude\" | \"only\";\n  showVotedFilter?: boolean;\n  userSubmitted?: boolean;\n  defaultUserSubmitted?: boolean;\n}\n\nconst PER_PAGE = 20;\n\nconst EditListComponent: FC<EditsProps> = ({\n  id,\n  sort,\n  direction,\n  type,\n  status,\n  operation,\n  voted,\n  userId,\n  defaultVoteStatus,\n  defaultVoted,\n  defaultBot,\n  showVotedFilter,\n  userSubmitted,\n  defaultUserSubmitted,\n}) => {\n  const { page, setPage } = usePagination();\n  const {\n    editFilter,\n    selectedSort,\n    selectedDirection,\n    selectedType,\n    selectedOperation,\n    selectedVoted,\n    selectedStatus,\n    selectedFavorite,\n    selectedBot,\n    selectedUserSubmitted,\n  } = useEditFilter({\n    sort,\n    direction,\n    type,\n    status,\n    operation,\n    voted,\n    showFavoriteOption: id === undefined,\n    showVotedFilter,\n    defaultVoteStatus,\n    defaultVoted,\n    defaultBot,\n    userSubmitted,\n    defaultUserSubmitted,\n  });\n  const { data, loading } = useEdits({\n    input: {\n      target_type: selectedType,\n      target_id: id,\n      status: selectedStatus,\n      operation: selectedOperation,\n      voted: selectedVoted,\n      user_id: userId,\n      is_favorite: selectedFavorite,\n      is_bot:\n        selectedBot === \"only\"\n          ? true\n          : selectedBot === \"exclude\"\n            ? false\n            : undefined,\n      page,\n      per_page: PER_PAGE,\n      sort: selectedSort,\n      direction: selectedDirection,\n      include_user_submitted: selectedUserSubmitted,\n    },\n  });\n\n  if (!loading && !data) return <ErrorMessage error=\"Failed to load edits.\" />;\n\n  const edits =\n    data?.queryEdits?.edits.map((edit) => (\n      <EditCard edit={edit} key={edit.id} />\n    )) ?? [];\n\n  return (\n    <List\n      entityName=\"edits\"\n      loading={loading}\n      listCount={data?.queryEdits.count}\n      filters={editFilter}\n      page={page}\n      setPage={setPage}\n      perPage={PER_PAGE}\n    >\n      <div>{edits}</div>\n    </List>\n  );\n};\n\nexport default EditListComponent;\n"
  },
  {
    "path": "frontend/src/components/list/List.tsx",
    "content": "import { type FC, type ReactNode, useEffect, useState } from \"react\";\nimport { LoadingIndicator } from \"src/components/fragments\";\nimport Pagination from \"src/components/pagination\";\n\nconst PER_PAGE = 20;\n\ninterface Props {\n  page: number;\n  setPage: (page: number) => void;\n  perPage?: number;\n  listCount?: number;\n  loading: boolean;\n  filters?: ReactNode;\n  entityName?: string;\n  children?: React.ReactNode;\n}\n\nconst List: FC<Props> = ({\n  page,\n  setPage,\n  perPage = PER_PAGE,\n  listCount,\n  loading,\n  filters,\n  children,\n  entityName = \"data\",\n}) => {\n  const [count, setCount] = useState<number | undefined>(listCount);\n\n  useEffect(() => {\n    if (!loading && listCount !== undefined) setCount(listCount);\n  }, [loading, listCount]);\n\n  const currentCount = count ?? listCount;\n\n  return (\n    <div className={`${entityName}-list`}>\n      <div className=\"d-flex mt-2 align-items-start flex-wrap\">\n        {filters}\n        <Pagination\n          onClick={setPage}\n          count={currentCount ?? 0}\n          active={page}\n          perPage={perPage}\n          showCount\n        />\n      </div>\n      {loading ? (\n        <LoadingIndicator message={`Loading ${entityName}...`} />\n      ) : currentCount && currentCount > 0 ? (\n        children\n      ) : currentCount === 0 ? (\n        <h4 className=\"m-4 p-4 text-center\">No results</h4>\n      ) : null}\n      <div className=\"d-flex\">\n        <Pagination\n          onClick={setPage}\n          count={currentCount ?? 0}\n          perPage={perPage}\n          active={page}\n        />\n      </div>\n    </div>\n  );\n};\n\nexport default List;\n"
  },
  {
    "path": "frontend/src/components/list/SceneList.tsx",
    "content": "import type { FC } from \"react\";\nimport Select from \"react-select\";\nimport { Button, Col, Form, InputGroup, Row } from \"react-bootstrap\";\nimport {\n  faSortAmountUp,\n  faSortAmountDown,\n} from \"@fortawesome/free-solid-svg-icons\";\n\nimport {\n  useScenes,\n  FavoriteFilter,\n  type SceneQueryInput,\n  SortDirectionEnum,\n  SceneSortEnum,\n  CriterionModifier,\n} from \"src/graphql\";\nimport { usePagination, useQueryParams } from \"src/hooks\";\nimport { ensureEnum } from \"src/utils\";\nimport SceneCard from \"src/components/sceneCard\";\nimport TagFilter from \"src/components/tagFilter\";\nimport { ErrorMessage, Icon } from \"src/components/fragments\";\nimport List from \"./List\";\n\nconst PER_PAGE = 20;\n\ninterface Props {\n  perPage?: number;\n  filter?: Partial<SceneQueryInput>;\n  favoriteFilter?: \"performer\" | \"studio\" | \"all\";\n  tagsFilter?: SceneQueryInput[\"tags\"];\n}\n\nconst sortOptions = [\n  { value: SceneSortEnum.DATE, label: \"Release Date\" },\n  { value: SceneSortEnum.TITLE, label: \"Title\" },\n  { value: SceneSortEnum.TRENDING, label: \"Trending\" },\n  { value: SceneSortEnum.CREATED_AT, label: \"Created At\" },\n  { value: SceneSortEnum.UPDATED_AT, label: \"Updated At\" },\n];\n\nconst favoriteOptions = [\n  {\n    label: \"All Favorites\",\n    value: FavoriteFilter.ALL,\n  },\n  {\n    label: \"Favorite Performers\",\n    value: FavoriteFilter.PERFORMER,\n  },\n  {\n    label: \"Favorite Studios\",\n    value: FavoriteFilter.STUDIO,\n  },\n];\n\nconst SceneList: FC<Props> = ({\n  perPage = PER_PAGE,\n  filter,\n  favoriteFilter,\n  tagsFilter,\n}) => {\n  const [params, setParams] = useQueryParams({\n    sort: { name: \"sort\", type: \"string\", default: SceneSortEnum.DATE },\n    dir: { name: \"dir\", type: \"string\", default: SortDirectionEnum.DESC },\n    favorite: { name: \"favorite\", type: \"string\", default: \"NONE\" },\n    tag: { name: \"tag\", type: \"string\" },\n  });\n  const sort = ensureEnum(SceneSortEnum, params.sort);\n  const direction = ensureEnum(SortDirectionEnum, params.dir);\n  const favorite =\n    params.favorite !== \"NONE\" && ensureEnum(FavoriteFilter, params.favorite);\n\n  const { page, setPage } = usePagination();\n  const { loading, data } = useScenes({\n    input: {\n      page,\n      per_page: perPage,\n      sort,\n      direction,\n      ...filter,\n      favorites: (favoriteFilter !== undefined && favorite) || undefined,\n      tags:\n        tagsFilter ||\n        (params.tag\n          ? { value: [params.tag], modifier: CriterionModifier.INCLUDES }\n          : undefined),\n    },\n  });\n\n  if (!loading && !data) return <ErrorMessage error=\"Failed to load scenes.\" />;\n\n  const filters = (\n    <>\n      {!tagsFilter && (\n        <TagFilter tag={params.tag} onChange={(t) => setParams(\"tag\", t?.id)} />\n      )}\n      <InputGroup className=\"scene-sort w-auto\">\n        <Form.Select\n          className=\"w-auto\"\n          onChange={(e) =>\n            setParams(\"sort\", e.currentTarget.value.toLowerCase())\n          }\n          defaultValue={sort ?? \"name\"}\n        >\n          {sortOptions.map((s) => (\n            <option value={s.value} key={s.value}>\n              {s.label}\n            </option>\n          ))}\n        </Form.Select>\n        <Button\n          variant=\"secondary\"\n          onClick={() =>\n            setParams(\n              \"dir\",\n              direction === SortDirectionEnum.DESC\n                ? SortDirectionEnum.ASC\n                : SortDirectionEnum.DESC,\n            )\n          }\n        >\n          <Icon\n            icon={\n              direction === SortDirectionEnum.DESC\n                ? faSortAmountDown\n                : faSortAmountUp\n            }\n          />\n        </Button>\n      </InputGroup>\n      {favoriteFilter === \"performer\" || favoriteFilter === \"studio\" ? (\n        <Form.Group controlId=\"favorite\" className=\"ms-3\">\n          <Form.Check\n            className=\"mt-2\"\n            type=\"switch\"\n            label={`Only favorite ${favoriteFilter}s`}\n            defaultChecked={!!favorite}\n            onChange={(e) =>\n              setParams(\n                \"favorite\",\n                e.currentTarget.checked ? favoriteFilter.toUpperCase() : \"NONE\",\n              )\n            }\n          />\n        </Form.Group>\n      ) : favoriteFilter === \"all\" ? (\n        <Select\n          className=\"FavoriteFilter ms-4\"\n          classNamePrefix=\"react-select\"\n          onChange={(val) => setParams(\"favorite\", val ? val.value : \"NONE\")}\n          placeholder=\"Favorite filter\"\n          isClearable\n          defaultValue={\n            favorite\n              ? favoriteOptions.find((fav) => fav.value === favorite)\n              : undefined\n          }\n          options={favoriteOptions}\n        />\n      ) : null}\n    </>\n  );\n\n  const scenes = (data?.queryScenes.scenes ?? []).map((scene) => (\n    <Col xs={3} key={scene.id}>\n      <SceneCard scene={scene} />\n    </Col>\n  ));\n\n  return (\n    <List\n      page={page}\n      setPage={setPage}\n      perPage={perPage}\n      listCount={data?.queryScenes.count}\n      loading={loading}\n      filters={filters}\n      entityName=\"scenes\"\n    >\n      <Row>{scenes}</Row>\n    </List>\n  );\n};\n\nexport default SceneList;\n"
  },
  {
    "path": "frontend/src/components/list/TagList.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Card, Form, Row } from \"react-bootstrap\";\nimport { debounce } from \"lodash-es\";\n\nimport {\n  useTags,\n  SortDirectionEnum,\n  TagSortEnum,\n  type TagQueryInput,\n} from \"src/graphql\";\nimport { usePagination, useQueryParams } from \"src/hooks\";\nimport { ErrorMessage } from \"src/components/fragments\";\nimport { createHref, tagHref } from \"src/utils/route\";\nimport { ROUTE_CATEGORIES } from \"src/constants/route\";\nimport List from \"./List\";\n\nconst PER_PAGE = 40;\n\ninterface TagListProps {\n  tagFilter: Partial<TagQueryInput>;\n  showCategoryLink?: boolean;\n}\n\nconst TagList: FC<TagListProps> = ({ tagFilter, showCategoryLink = false }) => {\n  const [{ name }, setParams] = useQueryParams({\n    name: { name: \"query\", type: \"string\", default: \"\" },\n  });\n  const { page, setPage } = usePagination();\n  const { loading, data } = useTags({\n    input: {\n      names: name.trim(),\n      page,\n      per_page: PER_PAGE,\n      sort: TagSortEnum.NAME,\n      direction: SortDirectionEnum.ASC,\n      ...tagFilter,\n    },\n  });\n\n  const tags = (data?.queryTags?.tags ?? []).map((tag) => (\n    <li key={tag.id}>\n      <Link to={tagHref(tag)}>{tag.name}</Link>\n      {tag.description && (\n        <span className=\"ms-2\">\n          &bull;\n          <small className=\"ms-2\">{tag.description}</small>\n        </span>\n      )}\n    </li>\n  ));\n\n  const debouncedHandler = debounce(setParams, 200);\n\n  const filters = (\n    <Form.Control\n      id=\"tag-query\"\n      onChange={(e) => debouncedHandler(\"name\", e.currentTarget.value)}\n      placeholder=\"Filter tag name\"\n      defaultValue={name}\n      className=\"w-25\"\n    />\n  );\n\n  if (!loading && !data) return <ErrorMessage error=\"Failed to load tags.\" />;\n\n  return (\n    <List\n      entityName=\"tags\"\n      page={page}\n      setPage={setPage}\n      perPage={PER_PAGE}\n      filters={filters}\n      loading={loading}\n      listCount={data?.queryTags.count}\n    >\n      <Card>\n        <Card.Body className=\"pt-4\">\n          <Row className=\"g-0\">\n            {showCategoryLink && (\n              <Link to={createHref(ROUTE_CATEGORIES)} className=\"ms-2\">\n                <h5>List of Categories</h5>\n              </Link>\n            )}\n          </Row>\n          <ul>{tags}</ul>\n        </Card.Body>\n      </Card>\n    </List>\n  );\n};\n\nexport default TagList;\n"
  },
  {
    "path": "frontend/src/components/list/URLList.tsx",
    "content": "import type { FC } from \"react\";\nimport { SiteLink } from \"src/components/fragments\";\n\ninterface URLListProps {\n  urls: {\n    url: string;\n    site: {\n      id: string;\n      name: string;\n      icon: string;\n    } | null;\n  }[];\n}\n\nconst URLList: FC<URLListProps> = ({ urls }) => (\n  <ul className=\"URLList\">\n    {urls.map((u) => (\n      <li key={u.url}>\n        <SiteLink site={u.site} />\n        <a href={u.url} target=\"_blank\" rel=\"noreferrer noopener\">\n          {u.url}\n        </a>\n      </li>\n    ))}\n  </ul>\n);\n\nexport default URLList;\n"
  },
  {
    "path": "frontend/src/components/list/index.ts",
    "content": "export { default as List } from \"./List\";\nexport { default as SceneList } from \"./SceneList\";\nexport { default as TagList } from \"./TagList\";\nexport { default as EditList } from \"./EditList\";\nexport { default as URLList } from \"./URLList\";\n"
  },
  {
    "path": "frontend/src/components/list/styles.scss",
    "content": ".URLList {\n  list-style-type: none;\n  padding: 0;\n\n  img {\n    width: 16px;\n  }\n}\n\n.FavoriteFilter {\n  width: 240px;\n}\n\n.BotFilter {\n  width: 120px;\n}\n"
  },
  {
    "path": "frontend/src/components/listChangeRow/ListChangeRow.tsx",
    "content": "import type { PropsWithChildren } from \"react\";\n\nimport { Col, Row } from \"react-bootstrap\";\n\ninterface ListChangeRowProps<T> {\n  added?: T[] | null;\n  removed?: T[] | null;\n  renderItem: (o: T) => JSX.Element | undefined;\n  getKey: (o: T) => string;\n  name: string;\n  showDiff?: boolean;\n}\n\nconst CLASSNAME = \"ListChangeRow\";\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint\nconst ListChangeRow = <T,>({\n  added,\n  removed,\n  name,\n  getKey,\n  renderItem,\n  showDiff,\n}: PropsWithChildren<ListChangeRowProps<T>>) =>\n  (added ?? []).length > 0 || (removed ?? []).length > 0 ? (\n    <Row className={`${CLASSNAME}-${name}`}>\n      <b className=\"col-2 text-end\">{name}</b>\n      {showDiff && (\n        <Col xs={5}>\n          {(removed ?? []).length > 0 && (\n            <>\n              <h6>Removed</h6>\n              <div className={CLASSNAME}>\n                <ul>\n                  {(removed ?? []).map((u) => (\n                    <li key={getKey(u)}>{renderItem(u)}</li>\n                  ))}\n                </ul>\n              </div>\n            </>\n          )}\n        </Col>\n      )}\n      <Col xs={showDiff ? 5 : 10}>\n        {(added ?? []).length > 0 && (\n          <>\n            {showDiff && <h6>Added</h6>}\n            <div className={CLASSNAME}>\n              <ul>\n                {(added ?? []).map((u) => (\n                  <li key={getKey(u)}>{renderItem(u)}</li>\n                ))}\n              </ul>\n            </div>\n          </>\n        )}\n      </Col>\n    </Row>\n  ) : null;\n\nexport default ListChangeRow;\n"
  },
  {
    "path": "frontend/src/components/listChangeRow/index.ts",
    "content": "export { default } from \"./ListChangeRow\";\n"
  },
  {
    "path": "frontend/src/components/modal/Modal.tsx",
    "content": "import type { ReactNode, FC } from \"react\";\nimport { Modal, Button } from \"react-bootstrap\";\n\ninterface ModalProps {\n  callback: (status: boolean) => void;\n  cancelTerm?: string;\n  acceptTerm?: string;\n}\n\ninterface MessageProps {\n  message: string;\n  children?: never;\n}\ninterface ElementProps {\n  children: ReactNode;\n  message?: never;\n}\n\nconst ModalComponent: FC<ModalProps & (MessageProps | ElementProps)> = ({\n  message,\n  children,\n  callback,\n  cancelTerm = \"Cancel\",\n  acceptTerm = \"Delete\",\n}) => {\n  const handleCancel = () => callback(false);\n  const handleAccept = () => callback(true);\n\n  const content = message || children;\n\n  return (\n    <Modal show onHide={handleCancel}>\n      <Modal.Header closeButton>\n        <b>Warning</b>\n      </Modal.Header>\n      <Modal.Body>{content}</Modal.Body>\n      <Modal.Footer>\n        <Button variant=\"danger\" onClick={handleAccept}>\n          {acceptTerm}\n        </Button>\n        <Button variant=\"primary\" onClick={handleCancel}>\n          {cancelTerm}\n        </Button>\n      </Modal.Footer>\n    </Modal>\n  );\n};\n\nexport default ModalComponent;\n"
  },
  {
    "path": "frontend/src/components/modal/index.ts",
    "content": "import Modal from \"./Modal\";\n\nexport default Modal;\n"
  },
  {
    "path": "frontend/src/components/multiSelect/MultiSelect.tsx",
    "content": "// biome-ignore-all lint/correctness/noNestedComponentDefinitions: react-select\nimport type { FC } from \"react\";\nimport CreatableSelect from \"react-select/creatable\";\nimport type { OnChangeValue } from \"react-select\";\n\ninterface MultiSelectProps {\n  initialValues: string[];\n  onChange: (values: string[]) => void;\n  placeholder?: string;\n}\n\ninterface IOptionType {\n  label: string;\n  value: string;\n}\n\nconst MultiSelect: FC<MultiSelectProps> = ({\n  initialValues,\n  onChange,\n  placeholder = \"Select...\",\n}) => {\n  const options: IOptionType[] = (initialValues ?? []).map((value) => ({\n    label: value,\n    value,\n  }));\n\n  const handleChange = (values: OnChangeValue<IOptionType, true>) => {\n    if (!values) {\n      onChange([]);\n      return;\n    }\n\n    onChange(values.map((v) => v.value));\n  };\n\n  /** Allow creating a new option with a different casing. */\n  const isValidNewOption = (\n    inputValue: string,\n    selectValue: OnChangeValue<IOptionType, true>,\n  ): boolean =>\n    !!inputValue &&\n    !selectValue.some(\n      ({ value }) => value.toLowerCase() === inputValue.toLowerCase(),\n    );\n\n  return (\n    <div>\n      <CreatableSelect\n        isMulti\n        classNamePrefix=\"react-select\"\n        className=\"react-select\"\n        defaultValue={options}\n        options={options}\n        isValidNewOption={isValidNewOption}\n        onChange={handleChange}\n        placeholder={placeholder}\n        noOptionsMessage={() => null}\n        formatCreateLabel={(value: string) => `Add '${value}'`}\n        components={{\n          DropdownIndicator: () => null,\n          IndicatorSeparator: () => null,\n        }}\n      />\n    </div>\n  );\n};\n\nexport default MultiSelect;\n"
  },
  {
    "path": "frontend/src/components/multiSelect/index.ts",
    "content": "import MultiSelect from \"./MultiSelect\";\n\nexport default MultiSelect;\n"
  },
  {
    "path": "frontend/src/components/multiSelect/styles.scss",
    "content": ".TagSelect {\n  margin-top: 0.5rem;\n\n  &-list {\n    margin-bottom: 1rem;\n  }\n\n  &-container {\n    display: flex;\n  }\n\n  &-select {\n    display: inline-block;\n    margin-left: auto;\n    width: 25rem;\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/pagination/Pagination.tsx",
    "content": "import type { FC, MouseEvent } from \"react\";\nimport { Pagination } from \"react-bootstrap\";\n\ninterface PaginationProps {\n  active: number;\n  onClick: (page: number) => void;\n  count: number;\n  perPage: number;\n  showCount?: boolean;\n}\n\nconst PaginationComponent: FC<PaginationProps> = ({\n  active,\n  perPage,\n  onClick,\n  count,\n  showCount = false,\n}) => {\n  const pages = Math.ceil(count / perPage);\n  const totalPages = pages === 0 ? 1 : pages;\n  const showFirst = totalPages > 5 && active > 3;\n  const showLast = totalPages > 5 && active < totalPages - 3;\n\n  const maxVal = Math.max(\n    Math.min(active + 2, totalPages),\n    Math.min(totalPages, 5),\n  );\n  const minVal = Math.max(maxVal - 4, 1);\n  const totalItems = maxVal - minVal + 1;\n\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n  const paginationItems = [...Array(totalItems)].map((_, arrayIndex) => {\n    const index = arrayIndex + minVal;\n    const isActive = active === index;\n    return (\n      <Pagination.Item key={index} data-page={index} active={isActive}>\n        {index}\n      </Pagination.Item>\n    );\n  });\n\n  const handleClick = (e: MouseEvent<HTMLUListElement>): void => {\n    const page = (e.target as HTMLElement).closest(\"a\")?.dataset.page;\n    if (!page) return;\n\n    const pageNumber = page ? Number.parseInt(page, 10) : 1;\n    if (pageNumber !== active) onClick(pageNumber);\n  };\n\n  return (\n    <div className=\"ms-auto mt-auto d-flex\">\n      {showCount && count > 0 && (\n        <b className=\"me-4 mt-2\">\n          {new Intl.NumberFormat().format(count)} results\n        </b>\n      )}\n      <Pagination onClick={handleClick}>\n        {showFirst && <Pagination.First data-page={1} />}\n        <Pagination.Prev disabled={active === 1} data-page={active - 1} />\n        {paginationItems}\n        <Pagination.Next\n          disabled={active === totalPages}\n          data-page={active + 1}\n        />\n        {showLast && <Pagination.Last data-page={totalPages} />}\n      </Pagination>\n    </div>\n  );\n};\n\nexport default PaginationComponent;\n"
  },
  {
    "path": "frontend/src/components/pagination/index.ts",
    "content": "import Pagination from \"./Pagination\";\n\nexport default Pagination;\n"
  },
  {
    "path": "frontend/src/components/performerCard/PerformerCard.tsx",
    "content": "import type { FC } from \"react\";\nimport { Card } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport cx from \"classnames\";\n\nimport type { Performer } from \"src/graphql\";\n\nimport {\n  GenderIcon,\n  FavoriteStar,\n  PerformerName,\n  Thumbnail,\n} from \"src/components/fragments\";\nimport { getImage, performerHref } from \"src/utils\";\n\ntype PerformerType = Pick<\n  Performer,\n  \"id\" | \"name\" | \"images\" | \"gender\" | \"is_favorite\" | \"deleted\"\n>;\n\ninterface PerformerCardProps {\n  performer: PerformerType;\n  className?: string;\n}\n\nconst CLASSNAME = \"PerformerCard\";\nconst CLASSNAME_IMAGE = `${CLASSNAME}-image`;\nconst CLASSNAME_STAR = `${CLASSNAME}-star`;\n\nconst PerformerCard: FC<PerformerCardProps> = ({ className, performer }) => (\n  <Card className={cx(CLASSNAME, className)}>\n    <Link to={performerHref(performer)}>\n      <div className={CLASSNAME_IMAGE}>\n        <Thumbnail\n          image={getImage(performer.images, \"portrait\")}\n          alt={performer.name}\n          size={300}\n          orientation=\"portrait\"\n        />\n        <FavoriteStar\n          entity={performer}\n          entityType=\"performer\"\n          className={CLASSNAME_STAR}\n        />\n      </div>\n      <Card.Footer>\n        <h5 className=\"my-1\">\n          <GenderIcon gender={performer.gender} />\n          <PerformerName performer={performer} />\n        </h5>\n      </Card.Footer>\n    </Link>\n  </Card>\n);\n\nexport default PerformerCard;\n"
  },
  {
    "path": "frontend/src/components/performerCard/index.ts",
    "content": "import PerformerCard from \"./PerformerCard\";\n\nexport default PerformerCard;\n"
  },
  {
    "path": "frontend/src/components/performerCard/styles.scss",
    "content": ".PerformerCard {\n  &-image {\n    align-items: center;\n    display: flex;\n    aspect-ratio: 2 / 3;\n\n    img {\n      height: 100%;\n      image-rendering: smooth;\n      object-fit: cover;\n      object-position: top;\n      width: 100%;\n\n      &[src=\"\"] {\n        display: none;\n      }\n    }\n  }\n\n  &-star {\n    position: absolute;\n    top: 0.5rem;\n    right: 0.5rem;\n    z-index: 1;\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/performerSelect/PerformerSelect.tsx",
    "content": "import { type FC, useState } from \"react\";\n\nimport { TagLink } from \"src/components/fragments\";\nimport SearchField, { SearchType } from \"src/components/searchField\";\nimport { formatDisambiguation, performerHref } from \"src/utils\";\n\nimport type { SearchPerformersQuery } from \"src/graphql\";\n\ntype Performer = NonNullable<\n  SearchPerformersQuery[\"searchPerformers\"][\"performers\"][number]\n>;\n\ninterface PerformerSelectProps {\n  performers: Performer[];\n  onChange: (performers: Performer[]) => void;\n  message?: string;\n  excludePerformers?: string[];\n}\n\nconst CLASSNAME = \"PerformerSelect\";\nconst CLASSNAME_LIST = `${CLASSNAME}-list`;\nconst CLASSNAME_CONTAINER = `${CLASSNAME}-container`;\n\nconst PerformerSelect: FC<PerformerSelectProps> = ({\n  performers: initialPerformers,\n  onChange,\n  message = \"Add performer:\",\n  excludePerformers = [],\n}) => {\n  const [performers, setPerformers] = useState(initialPerformers);\n\n  const handleChange = (performer: Performer) => {\n    const newPerformers = [...performers, performer];\n    setPerformers(newPerformers);\n    onChange(newPerformers);\n  };\n\n  const removePerformer = (id: string) => {\n    const newPerformers = performers.filter((performer) => performer.id !== id);\n    setPerformers(newPerformers);\n    onChange(newPerformers);\n  };\n\n  const performerList = [...(performers ?? [])]\n    .sort((a, b) => (a.name > b.name ? 1 : a.name < b.name ? -1 : 0))\n    .map((performer) => (\n      <TagLink\n        title={`${performer.name}${formatDisambiguation(performer)}`}\n        link={performerHref(performer)}\n        onRemove={() => removePerformer(performer.id)}\n        key={performer.id}\n        disabled\n      />\n    ));\n\n  return (\n    <div className={CLASSNAME}>\n      <div className={CLASSNAME_CONTAINER}>\n        <SearchField\n          onClickPerformer={handleChange}\n          searchType={SearchType.Performer}\n          excludeIDs={excludePerformers}\n          placeholder={message}\n        />\n      </div>\n      <div className={CLASSNAME_LIST}>{performerList}</div>\n    </div>\n  );\n};\n\nexport default PerformerSelect;\n"
  },
  {
    "path": "frontend/src/components/performerSelect/index.ts",
    "content": "import PerformerSelect from \"./PerformerSelect\";\n\nexport default PerformerSelect;\n"
  },
  {
    "path": "frontend/src/components/performerSelect/styles.scss",
    "content": ".PerformerSelect {\n  margin-top: 0.5rem;\n\n  &-list {\n    margin: 0.5rem 0;\n  }\n\n  &-container {\n    display: flex;\n  }\n\n  &-select {\n    display: inline-block;\n    margin-left: auto;\n    width: 25rem;\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/sceneCard/SceneCard.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Card } from \"react-bootstrap\";\nimport { faVideo } from \"@fortawesome/free-solid-svg-icons\";\n\nimport type { Scene, Studio } from \"src/graphql\";\nimport {\n  getImage,\n  sceneHref,\n  studioHref,\n  formatDuration,\n  imageType,\n} from \"src/utils\";\nimport { Icon, Thumbnail } from \"src/components/fragments\";\n\ntype Performance = Pick<\n  Scene,\n  \"id\" | \"title\" | \"images\" | \"duration\" | \"release_date\"\n> & {\n  studio?: Pick<Studio, \"id\" | \"name\"> | null;\n};\n\nconst CLASSNAME = \"SceneCard\";\nconst CLASSNAME_IMAGE = `${CLASSNAME}-image`;\nconst CLASSNAME_BODY = `${CLASSNAME}-body`;\n\nconst SceneCard: FC<{ scene: Performance }> = ({ scene }) => (\n  <Card className={CLASSNAME}>\n    <Card.Body className={CLASSNAME_BODY}>\n      <Link className={CLASSNAME_IMAGE} to={sceneHref(scene)}>\n        <Thumbnail\n          alt={scene.title}\n          className={imageType(scene.images[0])}\n          image={getImage(scene.images, \"landscape\")}\n          size={300}\n        />\n      </Link>\n    </Card.Body>\n    <Card.Footer>\n      <div className=\"d-flex\">\n        <Link\n          className=\"text-truncate w-100\"\n          to={sceneHref(scene)}\n          title={scene.title ?? \"\"}\n        >\n          <h6 className=\"text-truncate\">{scene.title}</h6>\n        </Link>\n        <span className=\"text-muted\">\n          {scene.duration ? formatDuration(scene.duration) : \"\"}\n        </span>\n      </div>\n      <div className=\"text-muted\">\n        {scene.studio && (\n          <Link\n            to={studioHref(scene.studio)}\n            className=\"float-end text-truncate SceneCard-studio-name\"\n          >\n            <Icon icon={faVideo} className=\"me-1\" />\n            {scene.studio.name}\n          </Link>\n        )}\n        <strong>{scene.release_date}</strong>\n      </div>\n    </Card.Footer>\n  </Card>\n);\n\nexport default SceneCard;\n"
  },
  {
    "path": "frontend/src/components/sceneCard/index.ts",
    "content": "import SceneCard from \"./SceneCard\";\n\nexport default SceneCard;\n"
  },
  {
    "path": "frontend/src/components/sceneCard/styles.scss",
    "content": ".SceneCard {\n  &.card {\n    box-shadow: none;\n    border-radius: 0;\n    background-color: transparent;\n  }\n\n  &-body {\n    min-height: 150px;\n    padding: 0;\n  }\n\n  &-image {\n    align-items: center;\n    aspect-ratio: 16/9;\n    display: flex;\n    height: 100%;\n    justify-content: center;\n    width: 100%;\n\n    img {\n      height: 100%;\n      image-rendering: smooth;\n      object-fit: cover;\n      object-position: center;\n      width: 100%;\n    }\n\n    .vertical-img {\n      background-color: rgba(0 0 0 / 50%);\n      object-fit: scale-down;\n    }\n  }\n\n  .card-footer {\n    font-size: 0.8rem;\n    padding: 0.75rem 0;\n  }\n\n  &-studio-name {\n    max-width: 65%;\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/searchField/SearchField.tsx",
    "content": "import { type FC, type KeyboardEvent, useRef, useState } from \"react\";\nimport { useApolloClient } from \"@apollo/client/react\";\nimport {\n  type OnChangeValue,\n  components,\n  type SelectInstance,\n  type GroupBase,\n} from \"react-select\";\nimport Async from \"react-select/async\";\nimport debounce from \"p-debounce\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport SearchAllGQL from \"src/graphql/queries/SearchAll.gql\";\nimport SearchPerformersGQL from \"src/graphql/queries/SearchPerformers.gql\";\n\nimport type { SearchAllQuery, SearchPerformersQuery } from \"src/graphql\";\nimport { getImage } from \"src/utils\";\nimport {\n  GenderIcon,\n  SearchHint,\n  SearchInput,\n  Thumbnail,\n} from \"src/components/fragments\";\nimport {\n  handleResult,\n  type SearchResult,\n  type PerformerResult,\n  type SceneResult,\n} from \"./handleResult\";\n\nexport type { PerformerResult, SceneResult };\n\nexport enum SearchType {\n  Performer = \"performer\",\n  Combined = \"combined\",\n}\n\ninterface SearchFieldProps {\n  onClick?: (result: SceneResult | PerformerResult) => void;\n  onClickPerformer?: (result: PerformerResult) => void;\n  searchType: SearchType;\n  excludeIDs?: string[];\n  nav?: boolean;\n  placeholder?: string;\n  showAllLink?: boolean;\n  autoFocus?: boolean;\n  /** When provided, performers who have performed for this studio's network will be sorted to the top */\n  studioId?: string;\n}\n\nconst ValueContainer: typeof components.ValueContainer = (props) => (\n  <>\n    <SearchHint />\n    <components.ValueContainer {...props} />\n  </>\n);\n\nconst DropdownIndicator = () => null;\nconst IndicatorSeparator = () => null;\n\nconst valueIsPerformer = (\n  arg?: SceneResult | PerformerResult,\n): arg is PerformerResult => arg?.__typename === \"Performer\";\n\nconst formatOptionLabel = ({ label, sublabel, value }: SearchResult) => (\n  <div className=\"d-flex\">\n    {valueIsPerformer(value) && (\n      <Thumbnail\n        image={getImage(value.images, \"portrait\")}\n        className=\"SearchField-thumb\"\n        alt={value.name}\n        size={300}\n        orientation=\"portrait\"\n      />\n    )}\n    <div>\n      <div className=\"search-value\">\n        {valueIsPerformer(value) && <GenderIcon gender={value.gender} />}\n        {value?.deleted ? <del>{label}</del> : label}\n      </div>\n      <div className=\"search-subvalue\">{sublabel}</div>\n    </div>\n  </div>\n);\n\nconst SearchField: FC<SearchFieldProps> = ({\n  onClick,\n  onClickPerformer,\n  searchType = SearchType.Performer,\n  excludeIDs = [],\n  nav = false,\n  placeholder,\n  showAllLink = false,\n  autoFocus = false,\n  studioId,\n}) => {\n  const client = useApolloClient();\n  const navigate = useNavigate();\n  const [selectedValue, setSelected] = useState(null);\n  const searchTerm = useRef(\"\");\n  const selectRef =\n    useRef<SelectInstance<SearchResult, false, GroupBase<SearchResult>>>(null);\n\n  const handleSearch = async (term: string) => {\n    if (term) {\n      const { data } = await client.query<\n        SearchPerformersQuery | SearchAllQuery\n      >({\n        query:\n          searchType === SearchType.Performer\n            ? SearchPerformersGQL\n            : SearchAllGQL,\n        variables: {\n          term,\n          ...(searchType === SearchType.Performer && studioId\n            ? { studioId, hasStudioId: true }\n            : {}),\n        },\n        fetchPolicy: \"network-only\",\n      });\n      if (!data) return [];\n      return handleResult(data, excludeIDs, showAllLink, studioId);\n    }\n    return [];\n  };\n\n  const debouncedLoadOptions = debounce(handleSearch, 400);\n\n  const handleLoad = (term: string) => {\n    searchTerm.current = term;\n    return debouncedLoadOptions(term);\n  };\n\n  const handleChange = (result: OnChangeValue<SearchResult, false>) => {\n    if (result?.type === \"ALL\")\n      return navigate(`/search?q=${encodeURIComponent(searchTerm.current)}`);\n\n    if (result?.value) {\n      if (valueIsPerformer(result.value)) onClickPerformer?.(result.value);\n      onClick?.(result.value);\n      if (nav) navigate(`/${result.type}s/${result.value.id}`);\n    }\n\n    setSelected(null);\n  };\n\n  const handleKeyDown = (e: KeyboardEvent<HTMLElement>) => {\n    if (e.key === \"Enter\" && searchTerm.current && showAllLink) {\n      navigate(`/search?q=${encodeURIComponent(searchTerm.current)}`);\n      selectRef?.current?.blur();\n    }\n  };\n\n  return (\n    <div className=\"SearchField\">\n      <Async\n        autoFocus={autoFocus}\n        classNamePrefix=\"react-select\"\n        value={selectedValue}\n        loadOptions={handleLoad}\n        onChange={handleChange}\n        onKeyDown={handleKeyDown}\n        ref={selectRef}\n        placeholder={\n          placeholder ??\n          (searchType === SearchType.Performer\n            ? \"Search for performer...\"\n            : \"Search for performer or scene...\")\n        }\n        formatOptionLabel={formatOptionLabel}\n        components={{\n          DropdownIndicator,\n          IndicatorSeparator,\n          ValueContainer,\n          Input: SearchInput,\n        }}\n        noOptionsMessage={({ inputValue }) =>\n          inputValue === \"\" ? null : `No result found for \"${inputValue}\"`\n        }\n      />\n    </div>\n  );\n};\n\nexport default SearchField;\n"
  },
  {
    "path": "frontend/src/components/searchField/handleResult.ts",
    "content": "import type { SearchAllQuery, SearchPerformersQuery } from \"src/graphql\";\nimport { filterData, formatDisambiguation } from \"src/utils\";\n\ntype SceneAllResult = NonNullable<\n  SearchAllQuery[\"searchScenes\"][\"scenes\"][number]\n>;\ntype PerformerAllResult = NonNullable<\n  SearchAllQuery[\"searchPerformers\"][\"performers\"][number]\n>;\ntype PerformerOnlyResult = NonNullable<\n  SearchPerformersQuery[\"searchPerformers\"][\"performers\"][number]\n>;\n\nexport type PerformerResult = PerformerAllResult | PerformerOnlyResult;\nexport type SceneResult = SceneAllResult;\n\nexport interface SearchGroup {\n  label: string;\n  options: SearchResult[];\n}\n\nexport interface SearchResult {\n  type: string;\n  value?: SceneResult | PerformerResult;\n  label?: string;\n  sublabel?: string;\n}\n\ninterface PerformerSearchResult extends SearchResult {\n  studioSceneCount: number;\n}\n\nconst resultIsSearchAll = (\n  result: SearchAllQuery | SearchPerformersQuery,\n): result is SearchAllQuery =>\n  (result as SearchAllQuery).searchScenes !== undefined;\n\nfunction formatPerformerLabel(performer: PerformerResult): string {\n  return `${performer.name}${formatDisambiguation(performer)}`;\n}\n\nfunction formatPerformerSublabel(\n  performer: PerformerResult,\n  studioSceneCount?: number,\n): string {\n  const parts: (string | null)[] = [];\n\n  if (studioSceneCount && studioSceneCount > 0) {\n    parts.push(\n      `${studioSceneCount} scene${studioSceneCount !== 1 ? \"s\" : \"\"} for network`,\n    );\n  }\n\n  if (performer.birth_date) {\n    parts.push(`Born: ${performer.birth_date}`);\n  }\n\n  if (performer.aliases.length) {\n    parts.push(`AKA: ${performer.aliases.join(\", \")}`);\n  }\n\n  return parts.filter(Boolean).join(\", \");\n}\n\nfunction getStudioSceneCount(performer: PerformerOnlyResult): number {\n  if (\"studios\" in performer && performer.studios?.length) {\n    return performer.studios.reduce((sum, s) => sum + s.scene_count, 0);\n  }\n  return 0;\n}\n\nfunction formatSceneLabel(scene: SceneResult): string {\n  return `${scene.title}${scene.release_date ? ` (${scene.release_date})` : \"\"}`;\n}\n\nfunction formatSceneSublabel(scene: SceneResult): string {\n  return filterData([\n    scene.studio?.name,\n    scene.code ? `Code ${scene.code}` : null,\n    scene.performers\n      ? scene.performers.map((p) => p.as || p.performer.name).join(\", \")\n      : null,\n  ]).join(\" • \");\n}\n\nfunction handleSearchAllResult(\n  result: SearchAllQuery,\n  excludeIDs: string[],\n): { performers: SearchResult[]; scenes: SearchResult[] } {\n  const performers = (result.searchPerformers.performers ?? [])\n    .filter((p): p is PerformerAllResult => p !== null)\n    .filter((performer) => !excludeIDs.includes(performer.id))\n    .map(\n      (performer): SearchResult => ({\n        type: \"performer\",\n        value: performer,\n        label: formatPerformerLabel(performer),\n        sublabel: formatPerformerSublabel(performer),\n      }),\n    );\n\n  const scenes = (result.searchScenes.scenes ?? [])\n    .filter((s): s is SceneResult => s !== null)\n    .filter((scene) => !excludeIDs.includes(scene.id))\n    .map(\n      (scene): SearchResult => ({\n        type: \"scene\",\n        value: scene,\n        label: formatSceneLabel(scene),\n        sublabel: formatSceneSublabel(scene),\n      }),\n    );\n\n  return { performers, scenes };\n}\n\nfunction handlePerformerSearchResult(\n  result: SearchPerformersQuery,\n  excludeIDs: string[],\n  studioId?: string,\n): PerformerSearchResult[] {\n  return (result.searchPerformers.performers ?? [])\n    .filter((p): p is PerformerOnlyResult => p !== null)\n    .filter((performer) => !excludeIDs.includes(performer.id))\n    .map((performer): PerformerSearchResult => {\n      const studioSceneCount = studioId ? getStudioSceneCount(performer) : 0;\n      return {\n        type: \"performer\",\n        value: performer,\n        label: formatPerformerLabel(performer),\n        sublabel: formatPerformerSublabel(performer, studioSceneCount),\n        studioSceneCount,\n      };\n    });\n}\n\nfunction groupPerformersByStudio(\n  performers: PerformerSearchResult[],\n): SearchGroup[] {\n  const studioPerformers = performers.filter((p) => p.studioSceneCount > 0);\n  const otherPerformers = performers.filter((p) => p.studioSceneCount === 0);\n\n  const groups: SearchGroup[] = [];\n\n  if (studioPerformers.length > 0) {\n    groups.push({ label: \"Studio Performers\", options: studioPerformers });\n  }\n\n  if (otherPerformers.length > 0) {\n    const label =\n      studioPerformers.length > 0 ? \"Other Performers\" : \"Performers\";\n    groups.push({ label, options: otherPerformers });\n  }\n\n  return groups;\n}\n\nfunction createPerformerGroups(performers: SearchResult[]): SearchGroup[] {\n  if (performers.length === 0) return [];\n  return [{ label: \"Performers\", options: performers }];\n}\n\nfunction createSceneGroups(scenes: SearchResult[]): SearchGroup[] {\n  if (scenes.length === 0) return [];\n  return [{ label: \"Scenes\", options: scenes }];\n}\n\nexport function handleResult(\n  result: SearchAllQuery | SearchPerformersQuery,\n  excludeIDs: string[],\n  showAllLink: boolean,\n  studioId?: string,\n): (SearchGroup | SearchResult)[] {\n  let performerGroups: SearchGroup[];\n  let sceneGroups: SearchGroup[];\n\n  if (resultIsSearchAll(result)) {\n    const { performers, scenes } = handleSearchAllResult(result, excludeIDs);\n    performerGroups = createPerformerGroups(performers);\n    sceneGroups = createSceneGroups(scenes);\n  } else {\n    const performers = handlePerformerSearchResult(\n      result,\n      excludeIDs,\n      studioId,\n    );\n    performerGroups = studioId\n      ? groupPerformersByStudio(performers)\n      : createPerformerGroups(performers);\n    sceneGroups = [];\n  }\n\n  const hasResults = performerGroups.length > 0 || sceneGroups.length > 0;\n  const showAll: SearchResult[] =\n    showAllLink && hasResults\n      ? [{ type: \"ALL\", label: \"Show all results\" }]\n      : [];\n\n  return [...showAll, ...performerGroups, ...sceneGroups];\n}\n"
  },
  {
    "path": "frontend/src/components/searchField/index.ts",
    "content": "export { default } from \"./SearchField\";\nexport * from \"./SearchField\";\n"
  },
  {
    "path": "frontend/src/components/searchField/styles.scss",
    "content": ".SearchField {\n  width: 400px;\n  z-index: 5;\n\n  .search-value {\n    font-size: 14px;\n    font-weight: 500;\n  }\n\n  .search-subvalue {\n    font-size: 12px;\n  }\n\n  &-thumb {\n    aspect-ratio: 2/3;\n    height: 4rem;\n    width: auto;\n    object-fit: cover;\n    margin-right: 0.5rem;\n  }\n\n  .react-select__menu-list {\n    max-height: 600px;\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/studioSelect/StudioSelect.tsx",
    "content": "import type { FC } from \"react\";\nimport { components } from \"react-select\";\nimport Async from \"react-select/async\";\nimport { useApolloClient } from \"@apollo/client/react\";\nimport debounce from \"p-debounce\";\nimport { SearchHint, SearchInput } from \"src/components/fragments\";\n\nimport StudiosGQL from \"src/graphql/queries/Studios.gql\";\nimport StudioGQL from \"src/graphql/queries/Studio.gql\";\n\nimport {\n  SortDirectionEnum,\n  StudioSortEnum,\n  type StudiosQuery,\n  type StudiosQueryVariables,\n  type StudioQuery,\n  type StudioQueryVariables,\n} from \"src/graphql\";\nimport { isUUID } from \"src/utils\";\n\ntype Studio = NonNullable<StudioQuery[\"findStudio\"]>;\ntype StudioParent = { id: string; name: string } | null;\ntype StudioSlim = Pick<Studio, \"id\" | \"name\"> & { parent?: StudioParent };\n\ninterface IOptionType {\n  value: string;\n  label: string;\n  sublabel: string | undefined;\n  parent: StudioParent;\n}\n\ninterface StudioSelectProps {\n  initialStudio?: StudioSlim | null;\n  excludeStudio?: string;\n  onChange: (studio: StudioSlim | null) => void;\n  onBlur?: React.FocusEventHandler;\n  networkSelect?: boolean;\n  isClearable?: boolean;\n}\n\nconst ValueContainer: typeof components.ValueContainer = (props) => (\n  <>\n    <SearchHint />\n    <components.ValueContainer {...props} />\n  </>\n);\n\nconst CLASSNAME = \"StudioSelect\";\nconst CLASSNAME_SELECT = `${CLASSNAME}-select`;\n\nconst StudioSelect: FC<StudioSelectProps> = ({\n  initialStudio,\n  excludeStudio,\n  onChange,\n  onBlur,\n  networkSelect = false,\n  isClearable = false,\n}) => {\n  const client = useApolloClient();\n\n  const fetchStudios = async (term: string): Promise<IOptionType[]> => {\n    const value = term.trim();\n    if (isUUID(value)) {\n      if (value === excludeStudio) {\n        return [];\n      }\n\n      const { data } = await client.query<StudioQuery, StudioQueryVariables>({\n        query: StudioGQL,\n        variables: { id: value },\n      });\n\n      const studio = data?.findStudio;\n      if (!studio || (networkSelect && studio.parent !== null)) {\n        return [];\n      }\n\n      return [\n        {\n          value: studio.id,\n          label: studio.name,\n          sublabel: studio.parent?.name,\n          parent: studio.parent ?? null,\n        },\n      ];\n    }\n\n    const { data } = await client.query<StudiosQuery, StudiosQueryVariables>({\n      query: StudiosGQL,\n      variables: {\n        input: {\n          name: term,\n          has_parent: networkSelect ? false : undefined,\n          page: 1,\n          per_page: 25,\n          sort: StudioSortEnum.NAME,\n          direction: SortDirectionEnum.ASC,\n        },\n      },\n    });\n\n    if (!data) return [];\n\n    return data?.queryStudios?.studios\n      .map((s) => ({\n        value: s.id,\n        label: s.name,\n        sublabel: s.parent?.name,\n        parent: s.parent ?? null,\n      }))\n      .filter((s) => s.value !== excludeStudio);\n  };\n\n  const debouncedLoad = debounce(fetchStudios, 200);\n\n  const defaultValue = initialStudio\n    ? {\n        value: initialStudio.id,\n        label: initialStudio.name,\n        sublabel: initialStudio.parent?.name,\n        parent: initialStudio.parent ?? null,\n      }\n    : undefined;\n\n  const formatStudioName = (opt: IOptionType) => (\n    <>\n      <span>{opt.label}</span>\n      {opt.sublabel && (\n        <small className=\"bullet-separator parent-studio\">{opt.sublabel}</small>\n      )}\n    </>\n  );\n\n  return (\n    <div className={CLASSNAME}>\n      <Async\n        isMulti={false}\n        classNamePrefix=\"react-select\"\n        className={`react-select ${CLASSNAME_SELECT}`}\n        onChange={(s) =>\n          onChange(s ? { id: s.value, name: s.label, parent: s.parent } : null)\n        }\n        onBlur={onBlur}\n        defaultValue={defaultValue}\n        loadOptions={debouncedLoad}\n        placeholder=\"Search for studio\"\n        noOptionsMessage={({ inputValue }) =>\n          inputValue === \"\" ? null : `No studios found for \"${inputValue}\"`\n        }\n        isClearable={isClearable}\n        formatOptionLabel={formatStudioName}\n        components={{\n          ValueContainer,\n          Input: SearchInput,\n        }}\n      />\n    </div>\n  );\n};\n\nexport default StudioSelect;\n"
  },
  {
    "path": "frontend/src/components/studioSelect/index.ts",
    "content": "export { default } from \"./StudioSelect\";\n"
  },
  {
    "path": "frontend/src/components/studioSelect/styles.scss",
    "content": ".StudioSelect {\n  .parent-studio {\n    color: $text-muted;\n  }\n\n  .react-select__value-container {\n    .parent-studio {\n      color: rgba($black, 0.5);\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/tagFilter/TagFilter.tsx",
    "content": "import type { FC } from \"react\";\nimport Async from \"react-select/async\";\nimport type { OnChangeValue, MenuPlacement } from \"react-select\";\nimport { useApolloClient } from \"@apollo/client/react\";\nimport debounce from \"p-debounce\";\n\nimport SearchTagsGQL from \"src/graphql/queries/SearchTags.gql\";\n\nimport {\n  type SearchTagsQuery,\n  type SearchTagsQueryVariables,\n  useTag,\n} from \"src/graphql\";\n\ntype Tag = NonNullable<SearchTagsQuery[\"query\"][number]>;\n\ninterface TagFilterProps {\n  tag: string;\n  onChange: (tag: Tag | undefined) => void;\n  excludeTags?: string[];\n  menuPlacement?: MenuPlacement;\n  allowDeleted?: boolean;\n}\n\ninterface SearchResult {\n  value: Tag;\n  label: string;\n  sublabel: string;\n}\n\nconst CLASSNAME = \"TagFilter\";\nconst CLASSNAME_SELECT = `${CLASSNAME}-select`;\n\nconst TagFilter: FC<TagFilterProps> = ({\n  tag: tagId,\n  onChange,\n  excludeTags = [],\n  menuPlacement = \"auto\",\n  allowDeleted = false,\n}) => {\n  const client = useApolloClient();\n  const { data: tagData } = useTag({ id: tagId }, !tagId);\n  const selectedTag = tagData?.findTag;\n\n  const handleChange = (result: OnChangeValue<SearchResult, false>) => {\n    onChange(result?.value);\n  };\n\n  const handleSearch = async (term: string) => {\n    const { data } = await client.query<\n      SearchTagsQuery,\n      SearchTagsQueryVariables\n    >({\n      query: SearchTagsGQL,\n      variables: {\n        term,\n        limit: 25,\n      },\n    });\n\n    const { exact, query } = data ?? {};\n\n    const exactResult =\n      exact &&\n      (allowDeleted || !exact.deleted) &&\n      !excludeTags.includes(exact.id)\n        ? {\n            label: exact.name,\n            value: exact,\n            sublabel: exact.description ?? \"\",\n          }\n        : undefined;\n\n    const queryResult = query\n      ?.filter(\n        (tag) =>\n          !excludeTags.includes(tag.id) &&\n          (allowDeleted || !tag.deleted) &&\n          tag.id !== exact?.id,\n      )\n      .map((tag) => ({\n        label: tag.name,\n        value: tag,\n        sublabel: tag.description ?? \"\",\n      }));\n\n    return [\n      ...(exactResult\n        ? [\n            {\n              label:\n                exactResult.label.toLowerCase() === term.toLowerCase()\n                  ? \"Exact Match\"\n                  : \"Alias Match\",\n              options: [exactResult],\n            },\n          ]\n        : []),\n      ...(queryResult ? [{ label: \"Tags\", options: queryResult }] : []),\n    ];\n  };\n\n  const debouncedLoadOptions = debounce(handleSearch, 400);\n\n  const formatOptionLabel = ({ label, sublabel, value }: SearchResult) => {\n    return (\n      <div title={value.aliases.map((a) => `\\u{2022} ${a}`).join(\"\\n\")}>\n        <div className={`${CLASSNAME_SELECT}-value`}>\n          {value.deleted ? <del>{label}</del> : label}\n        </div>\n        <div className={`${CLASSNAME_SELECT}-subvalue`}>{sublabel}</div>\n      </div>\n    );\n  };\n\n  return (\n    <Async\n      classNamePrefix=\"react-select\"\n      className={`react-select ${CLASSNAME_SELECT}`}\n      onChange={handleChange}\n      loadOptions={debouncedLoadOptions}\n      placeholder=\"Filter by tag\"\n      noOptionsMessage={({ inputValue }) =>\n        inputValue === \"\" ? null : `No tags found for \"${inputValue}\"`\n      }\n      value={\n        selectedTag && {\n          label: selectedTag.name,\n          value: selectedTag,\n          sublabel: \"\",\n        }\n      }\n      isClearable\n      menuPlacement={menuPlacement}\n      formatOptionLabel={formatOptionLabel}\n    />\n  );\n};\n\nexport default TagFilter;\n"
  },
  {
    "path": "frontend/src/components/tagFilter/index.ts",
    "content": "import TagFilter from \"./TagFilter\";\n\nexport default TagFilter;\n"
  },
  {
    "path": "frontend/src/components/tagFilter/styles.scss",
    "content": ".TagFilter {\n  &-select {\n    display: inline-block;\n    margin-right: 0.5rem;\n    width: 14rem;\n\n    .react-select__menu {\n      width: 400px;\n    }\n\n    &-value {\n      font-size: 14px;\n      font-weight: 500;\n    }\n\n    &-subvalue {\n      font-size: 12px;\n      color: $text-muted;\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/tagSelect/TagSelect.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport Async from \"react-select/async\";\nimport type { OnChangeValue, MenuPlacement } from \"react-select\";\nimport { useApolloClient } from \"@apollo/client/react\";\nimport debounce from \"p-debounce\";\n\nimport SearchTagsGQL from \"src/graphql/queries/SearchTags.gql\";\n\nimport type { SearchTagsQuery, SearchTagsQueryVariables } from \"src/graphql\";\nimport { SearchInput, TagLink } from \"src/components/fragments\";\nimport { tagHref } from \"src/utils/route\";\nimport { compareByName } from \"src/utils\";\n\ntype Tag = NonNullable<SearchTagsQuery[\"query\"][number]>;\n\ntype TagSlim = {\n  id: string;\n  name: string;\n  description?: string | null | undefined;\n  aliases: string[];\n};\n\ninterface TagSelectProps {\n  tags?: TagSlim[];\n  onChange: (tags: TagSlim[]) => void;\n  message?: string;\n  excludeTags?: string[];\n  menuPlacement?: MenuPlacement;\n  allowDeleted?: boolean;\n}\n\ninterface SearchResult {\n  value: Tag;\n  label: string;\n  sublabel: string;\n}\n\nconst CLASSNAME = \"TagSelect\";\nconst CLASSNAME_LIST = `${CLASSNAME}-list`;\nconst CLASSNAME_SELECT = `${CLASSNAME}-select`;\nconst CLASSNAME_CONTAINER = `${CLASSNAME}-container`;\n\nconst TagSelect: FC<TagSelectProps> = ({\n  tags: initialTags = [],\n  onChange,\n  message = \"Add tag:\",\n  excludeTags = [],\n  menuPlacement = \"auto\",\n  allowDeleted = false,\n}) => {\n  const client = useApolloClient();\n  const [tags, setTags] = useState(initialTags);\n  const excluded = [...excludeTags, ...tags.map((t) => t.id)];\n\n  const handleChange = (result: OnChangeValue<SearchResult, false>) => {\n    if (result?.value) {\n      const newTags = [...tags, result.value];\n      setTags(newTags);\n      onChange(newTags);\n    }\n  };\n\n  const removeTag = (id: string) => {\n    const newTags = tags.filter((tag) => tag.id !== id);\n    setTags(newTags);\n    onChange(newTags);\n  };\n\n  const tagList = [...(tags ?? [])]\n    .sort(compareByName)\n    .map((tag) => (\n      <TagLink\n        title={tag.name}\n        description={tag.description}\n        link={tagHref(tag)}\n        onRemove={() => removeTag(tag.id)}\n        key={tag.id}\n        disabled\n      />\n    ));\n\n  const handleSearch = async (term: string) => {\n    const { data } = await client.query<\n      SearchTagsQuery,\n      SearchTagsQueryVariables\n    >({\n      query: SearchTagsGQL,\n      variables: {\n        term,\n        limit: 25,\n      },\n    });\n\n    const { exact, query } = data ?? {};\n\n    const exactResult =\n      exact && !excluded.includes(exact.id) && (allowDeleted || !exact.deleted)\n        ? {\n            label: exact.name,\n            value: exact,\n            sublabel: exact.description ?? \"\",\n          }\n        : undefined;\n\n    const queryResult = query\n      ?.filter(\n        (tag) =>\n          !excluded.includes(tag.id) &&\n          (allowDeleted || !tag.deleted) &&\n          tag.id !== exact?.id,\n      )\n      .map((tag) => ({\n        label: tag.name,\n        value: tag,\n        sublabel: tag.description ?? \"\",\n      }));\n\n    return [\n      ...(exactResult\n        ? [\n            {\n              label:\n                exactResult.label.toLowerCase() === term.toLowerCase()\n                  ? \"Exact Match\"\n                  : \"Alias Match\",\n              options: [exactResult],\n            },\n          ]\n        : []),\n      ...(queryResult ? [{ label: \"Tags\", options: queryResult }] : []),\n    ];\n  };\n\n  const debouncedLoadOptions = debounce(handleSearch, 400);\n\n  const formatOptionLabel = ({ label, sublabel, value }: SearchResult) => {\n    return (\n      <div title={value.aliases.map((a) => `\\u{2022} ${a}`).join(\"\\n\")}>\n        <div className={`${CLASSNAME_SELECT}-value`}>\n          {value.deleted ? <del>{label}</del> : label}\n        </div>\n        <div className={`${CLASSNAME_SELECT}-subvalue`}>{sublabel}</div>\n      </div>\n    );\n  };\n\n  return (\n    <div className={CLASSNAME}>\n      <div className={CLASSNAME_LIST}>{tagList}</div>\n      <div className={CLASSNAME_CONTAINER}>\n        <span>{message}</span>\n        <Async\n          isMulti={false}\n          classNamePrefix=\"react-select\"\n          className={`react-select ${CLASSNAME_SELECT}`}\n          onChange={handleChange}\n          loadOptions={debouncedLoadOptions}\n          placeholder=\"Search for tag\"\n          noOptionsMessage={({ inputValue }) =>\n            inputValue === \"\" ? null : `No tags found for \"${inputValue}\"`\n          }\n          menuPlacement={menuPlacement}\n          controlShouldRenderValue={false}\n          formatOptionLabel={formatOptionLabel}\n          components={{ Input: SearchInput }}\n        />\n      </div>\n    </div>\n  );\n};\n\nexport default TagSelect;\n"
  },
  {
    "path": "frontend/src/components/tagSelect/index.ts",
    "content": "import TagSelect from \"./TagSelect\";\n\nexport default TagSelect;\n"
  },
  {
    "path": "frontend/src/components/tagSelect/styles.scss",
    "content": ".TagSelect {\n  margin-top: 0.5rem;\n\n  &-list {\n    margin-bottom: 1rem;\n  }\n\n  &-container {\n    display: flex;\n  }\n\n  &-select {\n    display: inline-block;\n    margin-left: auto;\n    width: 25rem;\n\n    &-value {\n      font-size: 14px;\n      font-weight: 500;\n    }\n\n    &-subvalue {\n      font-size: 12px;\n      color: $text-muted;\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/title/Title.tsx",
    "content": "import type { FC } from \"react\";\nimport { Helmet } from \"react-helmet\";\n\n// Title is only injected in production, so default to Stash-Box in dev\nconst INSTANCE_TITLE =\n  document.title === \"{{.}}\" ? \"Stash-Box\" : document.title;\n\ninterface Props {\n  page?: string;\n}\n\nconst Title: FC<Props> = ({ page }) => (\n  <Helmet>\n    <title>{page ? `${page} | ${INSTANCE_TITLE}` : INSTANCE_TITLE}</title>\n  </Helmet>\n);\n\nexport default Title;\n"
  },
  {
    "path": "frontend/src/components/title/index.ts",
    "content": "export { default } from \"./Title\";\n"
  },
  {
    "path": "frontend/src/components/urlChangeRow/URLChangeRow.tsx",
    "content": "import type { FC } from \"react\";\nimport { Col, Row } from \"react-bootstrap\";\nimport { SiteLink } from \"src/components/fragments\";\n\nconst CLASSNAME = \"URLChangeRow\";\n\nexport interface URL {\n  url: string;\n  site: {\n    id: string;\n    name: string;\n    icon: string;\n  };\n}\n\nconst URLChanges: FC<{ urls: URL[] }> = ({ urls }) => (\n  <div className={CLASSNAME}>\n    <ul className=\"ps-0\">\n      {urls.map((url) => (\n        <li key={url.url} className=\"d-flex align-items-start\">\n          <SiteLink site={url.site} />\n          <a\n            href={url.url}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            className=\"d-inline-block w-50 flex-grow-1 text-break\"\n          >\n            {url.url}\n          </a>\n        </li>\n      ))}\n    </ul>\n  </div>\n);\n\ninterface URLChangeRowProps {\n  newURLs?: URL[] | null;\n  oldURLs?: URL[] | null;\n  showDiff?: boolean;\n}\n\nconst URLChangeRow: FC<URLChangeRowProps> = ({ newURLs, oldURLs, showDiff }) =>\n  (newURLs ?? []).length > 0 || (oldURLs ?? []).length > 0 ? (\n    <Row className={CLASSNAME}>\n      <b className=\"col-2 text-end\">Links</b>\n      {showDiff && (\n        <Col xs={5}>\n          {(oldURLs ?? []).length > 0 && (\n            <>\n              <h6>Removed</h6>\n              <URLChanges urls={oldURLs ?? []} />\n            </>\n          )}\n        </Col>\n      )}\n      <Col xs={showDiff ? 5 : 10}>\n        {(newURLs ?? []).length > 0 && (\n          <>\n            {showDiff && <h6>Added</h6>}\n            <URLChanges urls={newURLs ?? []} />\n          </>\n        )}\n      </Col>\n    </Row>\n  ) : null;\n\nexport default URLChangeRow;\n"
  },
  {
    "path": "frontend/src/components/urlChangeRow/index.ts",
    "content": "export { default } from \"./URLChangeRow\";\nexport type { URL } from \"./URLChangeRow\";\n"
  },
  {
    "path": "frontend/src/components/urlInput/index.ts",
    "content": "import URLInput from \"./urlInput\";\n\nexport default URLInput;\n"
  },
  {
    "path": "frontend/src/components/urlInput/styles.scss",
    "content": ".URLInput {\n  width: 100%;\n\n  ul {\n    list-style-type: none;\n    padding-left: 0;\n  }\n\n  li {\n    margin-bottom: 0.5rem;\n  }\n\n  .input-group {\n    flex-wrap: nowrap;\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/urlInput/urlInput.tsx",
    "content": "import { type FC, useRef, useState } from \"react\";\nimport { Button, Form, InputGroup } from \"react-bootstrap\";\nimport { Icon } from \"src/components/fragments\";\nimport type { FieldError, Merge, FieldErrorsImpl } from \"react-hook-form\";\nimport { useFieldArray } from \"react-hook-form\";\nimport type { Lens } from \"@hookform/lenses\";\nimport { faExternalLinkAlt } from \"@fortawesome/free-solid-svg-icons\";\n\nimport { useSites, type ValidSiteTypeEnum, type SiteQuery } from \"src/graphql\";\nimport { cleanURL } from \"src/utils\";\n\ntype Site = NonNullable<SiteQuery[\"findSite\"]>;\n\nconst CLASSNAME = \"URLInput\";\n\nexport type URLItem = {\n  url: string;\n  site: {\n    id: string;\n    name: string;\n    icon: string;\n  };\n};\n\ntype ErrorsType = Merge<\n  FieldError,\n  (Merge<FieldError, FieldErrorsImpl<URLItem>> | undefined)[]\n>;\n\ninterface URLInputProps {\n  lens: Lens<URLItem[]>;\n  type: ValidSiteTypeEnum;\n  errors?: ErrorsType;\n}\n\nconst URLInput: FC<URLInputProps> = ({ lens, type, errors }) => {\n  const interop = lens.interop();\n  const {\n    fields: urls,\n    append,\n    remove,\n  } = useFieldArray({\n    control: interop.control,\n    name: interop.name,\n    keyName: \"key\",\n  });\n  const [newURL, setNewURL] = useState(\"\");\n  const [selectedSite, setSelectedSite] = useState<Site>();\n  const selectRef = useRef<HTMLSelectElement | null>(null);\n  const inputRef = useRef<HTMLInputElement | null>(null);\n  const { data, loading } = useSites();\n\n  if (loading) return null;\n  const sites = (data?.querySites.sites ?? []).filter((s) =>\n    s.valid_types.includes(type),\n  );\n\n  const handleAdd = () => {\n    if (!newURL || !selectedSite) return;\n    const cleanedURL = cleanURL(selectedSite?.regex, newURL);\n\n    const url = cleanedURL ?? newURL;\n    if (!urls.some((u) => u.url === url))\n      append({\n        url,\n        site: selectedSite,\n      });\n\n    if (selectRef.current) selectRef.current.value = \"\";\n    if (inputRef.current) inputRef.current.value = \"\";\n    setSelectedSite(undefined);\n    setNewURL(\"\");\n  };\n\n  const handleInput = (url: string) => {\n    if (!inputRef.current || !selectRef.current) return;\n\n    const site = sites.find((s) => s.regex && new RegExp(s.regex).test(url));\n\n    if (site && selectedSite?.id !== site.id) {\n      setSelectedSite(site);\n      selectRef.current.value = site.id;\n    } else if (url && !site && selectedSite?.regex) {\n      setSelectedSite(undefined);\n      selectRef.current.value = \"\";\n    }\n\n    if (site?.regex && url) {\n      const updatedURL = cleanURL(site.regex, url);\n      if (updatedURL) {\n        inputRef.current.value = updatedURL;\n        return true;\n      }\n    }\n    return false;\n  };\n\n  const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n    const match = handleInput(e.clipboardData.getData(\"text/plain\"));\n    if (match) {\n      e.preventDefault();\n      setNewURL(e.currentTarget.value);\n    }\n  };\n\n  const handleSiteSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const site = sites.find((s) => s.id === e.currentTarget.value);\n    if (site) setSelectedSite(site);\n  };\n\n  return (\n    <div className={CLASSNAME}>\n      <ul>\n        {urls.map((u, i) => (\n          <li key={u.url}>\n            <InputGroup>\n              <Button variant=\"danger\" onClick={() => remove(i)}>\n                Remove\n              </Button>\n              <InputGroup.Text>\n                <b>{u.site.name}</b>\n              </InputGroup.Text>\n              <InputGroup.Text className=\"overflow-hidden\">\n                {u.url}\n              </InputGroup.Text>\n              <Button variant=\"primary\" href={u.url} target=\"_blank\">\n                <Icon icon={faExternalLinkAlt} />\n              </Button>\n            </InputGroup>\n            {errors?.[i]?.url && (\n              <div className=\"text-danger\">{errors?.[i]?.url?.message}</div>\n            )}\n          </li>\n        ))}\n      </ul>\n      <InputGroup>\n        <InputGroup.Text>Add new link</InputGroup.Text>\n        <Form.Control\n          as=\"select\"\n          disabled={sites.length === 0}\n          ref={selectRef}\n          onChange={handleSiteSelect}\n          defaultValue=\"\"\n        >\n          <option disabled value=\"\">\n            Select site\n          </option>\n          {sites.length === 0 ? (\n            <option>No valid sites</option>\n          ) : (\n            sites.map((s) => (\n              <option value={s.id} key={s.id}>\n                {s.name}\n              </option>\n            ))\n          )}\n        </Form.Control>\n        <Form.Control\n          ref={inputRef}\n          onBlur={(e) => handleInput(e.currentTarget.value)}\n          placeholder=\"URL\"\n          onChange={(e) => setNewURL(e.currentTarget.value)}\n          onPaste={handlePaste}\n          className=\"w-50\"\n        />\n        <Button onClick={handleAdd} disabled={!newURL || !selectedSite}>\n          Add\n        </Button>\n      </InputGroup>\n    </div>\n  );\n};\n\nexport default URLInput;\n"
  },
  {
    "path": "frontend/src/constants/enums.ts",
    "content": "import {\n  BreastTypeEnum,\n  EthnicityEnum,\n  EthnicityFilterEnum,\n  EyeColorEnum,\n  HairColorEnum,\n  GenderEnum,\n  GenderFilterEnum,\n  OperationEnum,\n  TargetTypeEnum,\n  UserVotedFilterEnum,\n  VoteStatusEnum,\n  VoteTypeEnum,\n} from \"src/graphql\";\n\ntype EnumDictionary<T extends string | symbol | number, U> = {\n  [K in T]: U;\n};\n\nexport const BreastTypes: EnumDictionary<BreastTypeEnum, string> = {\n  [BreastTypeEnum.NA]: \"N/A\",\n  [BreastTypeEnum.FAKE]: \"Augmented\",\n  [BreastTypeEnum.NATURAL]: \"Natural\",\n};\n\nexport const EthnicityTypes: EnumDictionary<EthnicityEnum, string> = {\n  [EthnicityEnum.ASIAN]: \"Asian\",\n  [EthnicityEnum.BLACK]: \"Black\",\n  [EthnicityEnum.LATIN]: \"Latin\",\n  [EthnicityEnum.MIXED]: \"Mixed\",\n  [EthnicityEnum.OTHER]: \"Other\",\n  [EthnicityEnum.INDIAN]: \"Indian\",\n  [EthnicityEnum.CAUCASIAN]: \"Caucasian\",\n  [EthnicityEnum.MIDDLE_EASTERN]: \"Middle Eastern\",\n};\n\nexport const EthnicityFilterTypes: EnumDictionary<EthnicityFilterEnum, string> =\n  {\n    ...EthnicityTypes,\n    [EthnicityFilterEnum.UNKNOWN]: \"Unknown Ethnicity\",\n  };\n\nexport const EyeColorTypes: EnumDictionary<EyeColorEnum, string> = {\n  [EyeColorEnum.BLUE]: \"Blue\",\n  [EyeColorEnum.BROWN]: \"Brown\",\n  [EyeColorEnum.GREEN]: \"Green\",\n  [EyeColorEnum.GREY]: \"Grey\",\n  [EyeColorEnum.HAZEL]: \"Hazel\",\n  [EyeColorEnum.RED]: \"Red\",\n};\n\nexport const HairColorTypes: EnumDictionary<HairColorEnum, string> = {\n  [HairColorEnum.AUBURN]: \"Auburn\",\n  [HairColorEnum.BALD]: \"Bald\",\n  [HairColorEnum.BLACK]: \"Black\",\n  [HairColorEnum.BLONDE]: \"Blond\",\n  [HairColorEnum.BRUNETTE]: \"Brown\",\n  [HairColorEnum.GREY]: \"Grey\",\n  [HairColorEnum.OTHER]: \"Other\",\n  [HairColorEnum.RED]: \"Red\",\n  [HairColorEnum.VARIOUS]: \"Various\",\n  [HairColorEnum.WHITE]: \"White\",\n};\n\nexport const GenderTypes: EnumDictionary<GenderEnum, string> = {\n  [GenderEnum.MALE]: \"Male\",\n  [GenderEnum.FEMALE]: \"Female\",\n  [GenderEnum.INTERSEX]: \"Intersex\",\n  [GenderEnum.NON_BINARY]: \"Non-binary\",\n  [GenderEnum.TRANSGENDER_MALE]: \"Transmale\",\n  [GenderEnum.TRANSGENDER_FEMALE]: \"Transfemale\",\n};\nexport const GenderFilterTypes: EnumDictionary<GenderFilterEnum, string> = {\n  ...GenderTypes,\n  [GenderFilterEnum.UNKNOWN]: \"Unknown Gender\",\n};\n\nexport const EditOperationTypes: EnumDictionary<OperationEnum, string> = {\n  [OperationEnum.MERGE]: \"Merge\",\n  [OperationEnum.CREATE]: \"Create\",\n  [OperationEnum.MODIFY]: \"Modify\",\n  [OperationEnum.DESTROY]: \"Destroy\",\n};\n\nexport const EditTargetTypes: EnumDictionary<TargetTypeEnum, string> = {\n  [TargetTypeEnum.TAG]: \"Tag\",\n  [TargetTypeEnum.PERFORMER]: \"Performer\",\n  [TargetTypeEnum.SCENE]: \"Scene\",\n  [TargetTypeEnum.STUDIO]: \"Studio\",\n};\n\nexport const EditStatusTypes: EnumDictionary<VoteStatusEnum, string> = {\n  [VoteStatusEnum.PENDING]: \"Pending\",\n  [VoteStatusEnum.IMMEDIATE_ACCEPTED]: \"Admin Accepted\",\n  [VoteStatusEnum.IMMEDIATE_REJECTED]: \"Admin Rejected\",\n  [VoteStatusEnum.ACCEPTED]: \"Accepted\",\n  [VoteStatusEnum.REJECTED]: \"Rejected\",\n  [VoteStatusEnum.FAILED]: \"Failed\",\n  [VoteStatusEnum.CANCELED]: \"Cancelled\",\n};\n\nexport const VoteTypes: EnumDictionary<VoteTypeEnum, string> = {\n  [VoteTypeEnum.ACCEPT]: \"Yes\",\n  [VoteTypeEnum.IMMEDIATE_ACCEPT]: \"Admin Accept\",\n  [VoteTypeEnum.IMMEDIATE_REJECT]: \"Admin Reject\",\n  [VoteTypeEnum.ABSTAIN]: \"Abstain\",\n  [VoteTypeEnum.REJECT]: \"No\",\n};\n\nexport const UserVotedFilterTypes: EnumDictionary<UserVotedFilterEnum, string> =\n  {\n    [UserVotedFilterEnum.NOT_VOTED]: \"Not Yet Voted\",\n    [UserVotedFilterEnum.ACCEPT]: \"Yes\",\n    [UserVotedFilterEnum.ABSTAIN]: \"Abstain\",\n    [UserVotedFilterEnum.REJECT]: \"No\",\n  };\n"
  },
  {
    "path": "frontend/src/constants/index.ts",
    "content": "export * from \"./enums\";\nexport * from \"./route\";\n"
  },
  {
    "path": "frontend/src/constants/route.ts",
    "content": "export const ROUTE_HOME = \"/\";\nexport const ROUTE_LOGIN = \"/login\";\nexport const ROUTE_LOGOUT = \"/logout\";\nexport const ROUTE_USERS = \"/users\";\nexport const ROUTE_USER_ADD = \"/users/add\";\nexport const ROUTE_USER = \"/users/:name\";\nexport const ROUTE_USER_EDIT = \"/users/:name/edit\";\nexport const ROUTE_USER_PASSWORD = \"/users/change-password\";\nexport const ROUTE_USER_EDITS = \"/users/:name/edits\";\nexport const ROUTE_USER_MY_FINGERPRINTS = \"/users/fingerprints\";\nexport const ROUTE_PERFORMER = \"/performers/:id\";\nexport const ROUTE_PERFORMER_ADD = \"/performers/add\";\nexport const ROUTE_PERFORMER_EDIT = \"/performers/:id/edit\";\nexport const ROUTE_PERFORMER_MERGE = \"/performers/:id/merge\";\nexport const ROUTE_PERFORMER_DELETE = \"/performers/:id/delete\";\nexport const ROUTE_PERFORMERS = \"/performers\";\nexport const ROUTE_SCENE = \"/scenes/:id\";\nexport const ROUTE_SCENE_ADD = \"/scenes/add\";\nexport const ROUTE_SCENE_EDIT = \"/scenes/:id/edit\";\nexport const ROUTE_SCENE_DELETE = \"/scenes/:id/delete\";\nexport const ROUTE_SCENES = \"/scenes\";\nexport const ROUTE_STUDIO = \"/studios/:id\";\nexport const ROUTE_STUDIO_ADD = \"/studios/add\";\nexport const ROUTE_STUDIO_EDIT = \"/studios/:id/edit\";\nexport const ROUTE_STUDIO_DELETE = \"/studios/:id/delete\";\nexport const ROUTE_STUDIOS = \"/studios\";\nexport const ROUTE_TAG = \"/tags/:id\";\nexport const ROUTE_TAG_ADD = \"/tags/add\";\nexport const ROUTE_TAG_MERGE = \"/tags/:id/merge\";\nexport const ROUTE_TAG_EDIT = \"/tags/:id/edit\";\nexport const ROUTE_TAG_DELETE = \"/tags/:id/delete\";\nexport const ROUTE_TAGS = \"/tags\";\nexport const ROUTE_CATEGORY = \"/categories/:id\";\nexport const ROUTE_CATEGORY_ADD = \"/categories/add\";\nexport const ROUTE_CATEGORY_EDIT = \"/categories/:id/edit\";\nexport const ROUTE_CATEGORIES = \"/categories\";\nexport const ROUTE_EDITS = \"/edits\";\nexport const ROUTE_EDIT = \"/edits/:id\";\nexport const ROUTE_EDIT_UPDATE = \"/edits/:id/update\";\nexport const ROUTE_EDIT_AMEND = \"/edits/:id/amend\";\nexport const ROUTE_REGISTER = \"/register\";\nexport const ROUTE_ACTIVATE = \"/activate\";\nexport const ROUTE_FORGOT_PASSWORD = \"/forgot-password\";\nexport const ROUTE_RESET_PASSWORD = \"/reset-password\";\nexport const ROUTE_CONFIRM_EMAIL = \"/users/confirm-email\";\nexport const ROUTE_CHANGE_EMAIL = \"/users/change-email\";\nexport const ROUTE_SEARCH = \"/search\";\nexport const ROUTE_VERSION = \"/version\";\nexport const ROUTE_SITE = \"/sites/:id\";\nexport const ROUTE_SITE_ADD = \"/sites/add\";\nexport const ROUTE_SITE_EDIT = \"/sites/:id/edit\";\nexport const ROUTE_SITES = \"/sites\";\nexport const ROUTE_DRAFT = \"/drafts/:id\";\nexport const ROUTE_DRAFTS = \"/drafts\";\nexport const ROUTE_NOTIFICATIONS = \"/notifications\";\nexport const ROUTE_NOTIFICATION_SUBSCRIPTIONS = \"/users/:name/notifications\";\nexport const ROUTE_AUDITS = \"/audits\";\n"
  },
  {
    "path": "frontend/src/context.tsx",
    "content": "import { createContext, useContext } from \"react\";\n\nimport type { RoleEnum } from \"src/graphql\";\n\nexport interface User {\n  id: string;\n  name: string;\n  roles?: RoleEnum[] | null;\n}\n\nexport type ContextType = {\n  authenticated: boolean;\n  user?: User;\n};\n\nconst AuthContext = createContext<ContextType>({\n  authenticated: false,\n});\n\nexport const useAuthContext = () => useContext(AuthContext);\n\nexport default AuthContext;\n"
  },
  {
    "path": "frontend/src/graphql/fragments/CommentFragment.gql",
    "content": "fragment CommentFragment on EditComment {\n  id\n  user {\n    id\n    name\n  }\n  date\n  comment\n}\n"
  },
  {
    "path": "frontend/src/graphql/fragments/EditFragment.gql",
    "content": "#import \"../fragments/PerformerFragment.gql\"\n#import \"../fragments/StudioFragment.gql\"\n#import \"../fragments/ImageFragment.gql\"\n#import \"../fragments/SceneFragment.gql\"\n#import \"../fragments/TagFragment.gql\"\n#import \"../fragments/CommentFragment.gql\"\n#import \"../fragments/URLFragment.gql\"\n#import \"../fragments/FingerprintFragment.gql\"\nfragment EditFragment on Edit {\n  id\n  target_type\n  operation\n  status\n  bot\n  applied\n  created\n  updated\n  closed\n  expires\n  update_count\n  updatable\n  vote_count\n  destructive\n  comments {\n    ...CommentFragment\n  }\n  votes {\n    user {\n      id\n      name\n    }\n    date\n    vote\n  }\n  user {\n    id\n    name\n  }\n  target {\n    ... on Tag {\n      ...TagFragment\n    }\n    ... on Performer {\n      ...PerformerFragment\n    }\n    ... on Studio {\n      ...StudioFragment\n    }\n    ... on Scene {\n      ...SceneFragment\n    }\n  }\n  details {\n    ... on TagEdit {\n      name\n      description\n      added_aliases\n      removed_aliases\n      category {\n        id\n        name\n      }\n    }\n    ... on PerformerEdit {\n      name\n      disambiguation\n      added_aliases\n      removed_aliases\n      gender\n      added_urls {\n        ...URLFragment\n      }\n      removed_urls {\n        ...URLFragment\n      }\n      birthdate\n      deathdate\n      ethnicity\n      country\n      eye_color\n      hair_color\n      height\n      cup_size\n      band_size\n      waist_size\n      hip_size\n      breast_type\n      career_start_year\n      career_end_year\n      added_tattoos {\n        location\n        description\n      }\n      removed_tattoos {\n        location\n        description\n      }\n      added_piercings {\n        location\n        description\n      }\n      removed_piercings {\n        location\n        description\n      }\n      added_images {\n        ...ImageFragment\n      }\n      removed_images {\n        ...ImageFragment\n      }\n      draft_id\n    }\n    ... on StudioEdit {\n      name\n      added_aliases\n      removed_aliases\n      added_urls {\n        ...URLFragment\n      }\n      removed_urls {\n        ...URLFragment\n      }\n      parent {\n        ...StudioFragment\n      }\n      added_images {\n        ...ImageFragment\n      }\n      removed_images {\n        ...ImageFragment\n      }\n    }\n    ... on SceneEdit {\n      title\n      details\n      added_urls {\n        ...URLFragment\n      }\n      removed_urls {\n        ...URLFragment\n      }\n      date\n      production_date\n      studio {\n        ...StudioFragment\n      }\n      added_performers {\n        performer {\n          ...PerformerFragment\n        }\n        as\n      }\n      removed_performers {\n        performer {\n          ...PerformerFragment\n        }\n        as\n      }\n      added_tags {\n        ...TagFragment\n      }\n      removed_tags {\n        ...TagFragment\n      }\n      added_images {\n        ...ImageFragment\n      }\n      removed_images {\n        ...ImageFragment\n      }\n      added_fingerprints {\n        ...FingerprintFragment\n      }\n      removed_fingerprints {\n        ...FingerprintFragment\n      }\n      duration\n      director\n      code\n      draft_id\n    }\n  }\n  old_details {\n    ... on TagEdit {\n      name\n      description\n      category {\n        id\n        name\n      }\n    }\n    ... on PerformerEdit {\n      name\n      disambiguation\n      gender\n      birthdate\n      deathdate\n      ethnicity\n      country\n      eye_color\n      hair_color\n      height\n      cup_size\n      band_size\n      waist_size\n      hip_size\n      breast_type\n      career_start_year\n      career_end_year\n    }\n    ... on StudioEdit {\n      name\n      parent {\n        ...StudioFragment\n      }\n    }\n    ... on SceneEdit {\n      title\n      details\n      added_urls {\n        ...URLFragment\n      }\n      removed_urls {\n        ...URLFragment\n      }\n      date\n      production_date\n      studio {\n        ...StudioFragment\n      }\n      added_performers {\n        performer {\n          ...PerformerFragment\n        }\n        as\n      }\n      removed_performers {\n        performer {\n          ...PerformerFragment\n        }\n        as\n      }\n      added_tags {\n        ...TagFragment\n      }\n      removed_tags {\n        ...TagFragment\n      }\n      added_images {\n        ...ImageFragment\n      }\n      removed_images {\n        ...ImageFragment\n      }\n      added_fingerprints {\n        ...FingerprintFragment\n      }\n      removed_fingerprints {\n        ...FingerprintFragment\n      }\n      duration\n      director\n      code\n    }\n  }\n  merge_sources {\n    ... on Tag {\n      ...TagFragment\n    }\n    ... on Performer {\n      ...PerformerFragment\n    }\n    ... on Studio {\n      ...StudioFragment\n    }\n    ... on Scene {\n      ...SceneFragment\n    }\n  }\n  options {\n    set_modify_aliases\n    set_merge_aliases\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/fragments/FingerprintFragment.gql",
    "content": "fragment FingerprintFragment on Fingerprint {\n  hash\n  algorithm\n  duration\n}\n"
  },
  {
    "path": "frontend/src/graphql/fragments/ImageFragment.gql",
    "content": "fragment ImageFragment on Image {\n  id\n  url\n  width\n  height\n}\n"
  },
  {
    "path": "frontend/src/graphql/fragments/PerformerFragment.gql",
    "content": "#import \"../fragments/ImageFragment.gql\"\n#import \"../fragments/URLFragment.gql\"\nfragment PerformerFragment on Performer {\n  id\n  name\n  disambiguation\n  deleted\n  merged_into_id\n  aliases\n  gender\n  birth_date\n  death_date\n  age\n  height\n  hair_color\n  eye_color\n  ethnicity\n  country\n  career_end_year\n  career_start_year\n  breast_type\n  waist_size\n  hip_size\n  band_size\n  cup_size\n  tattoos {\n    location\n    description\n  }\n  piercings {\n    location\n    description\n  }\n  urls {\n    ...URLFragment\n  }\n  images {\n    ...ImageFragment\n  }\n  is_favorite\n}\n"
  },
  {
    "path": "frontend/src/graphql/fragments/QuerySceneFragment.gql",
    "content": "#import \"../fragments/URLFragment.gql\"\n#import \"../fragments/ImageFragment.gql\"\n#import \"../fragments/ScenePerformerFragment.gql\"\nfragment QuerySceneFragment on Scene {\n  id\n  release_date\n  title\n  duration\n  urls {\n    ...URLFragment\n  }\n  images {\n    ...ImageFragment\n  }\n  studio {\n    id\n    name\n  }\n  performers {\n    as\n    performer {\n      ...ScenePerformerFragment\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/fragments/SceneFragment.gql",
    "content": "#import \"../fragments/ImageFragment.gql\"\n#import \"../fragments/ScenePerformerFragment.gql\"\n#import \"../fragments/URLFragment.gql\"\nfragment SceneFragment on Scene {\n  id\n  release_date\n  production_date\n  title\n  deleted\n  details\n  director\n  code\n  duration\n  urls {\n    ...URLFragment\n  }\n  images {\n    ...ImageFragment\n  }\n  studio {\n    id\n    name\n    parent {\n      id\n      name\n    }\n  }\n  performers {\n    as\n    performer {\n      ...ScenePerformerFragment\n    }\n  }\n  fingerprints {\n    hash\n    algorithm\n    duration\n    submissions\n    reports\n    user_submitted\n    user_reported\n    created\n    updated\n  }\n  tags {\n    id\n    name\n    description\n    aliases\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/fragments/ScenePerformerFragment.gql",
    "content": "fragment ScenePerformerFragment on Performer {\n  id\n  name\n  disambiguation\n  deleted\n  gender\n  aliases\n}\n"
  },
  {
    "path": "frontend/src/graphql/fragments/SearchPerformerFragment.gql",
    "content": "#import \"../fragments/ImageFragment.gql\"\n#import \"../fragments/URLFragment.gql\"\nfragment SearchPerformerFragment on Performer {\n  id\n  name\n  disambiguation\n  deleted\n  gender\n  aliases\n  country\n  career_start_year\n  career_end_year\n  scene_count\n  birth_date\n  urls {\n    ...URLFragment\n  }\n  images {\n    ...ImageFragment\n  }\n  is_favorite\n}\n"
  },
  {
    "path": "frontend/src/graphql/fragments/StudioFragment.gql",
    "content": "#import \"../fragments/URLFragment.gql\"\nfragment StudioFragment on Studio {\n  id\n  name\n  aliases\n  parent {\n    id\n    name\n  }\n  urls {\n    ...URLFragment\n  }\n  images {\n    id\n    url\n    height\n    width\n  }\n  deleted\n  is_favorite\n}\n"
  },
  {
    "path": "frontend/src/graphql/fragments/TagFragment.gql",
    "content": "fragment TagFragment on Tag {\n  id\n  name\n  description\n  deleted\n  category {\n    id\n    name\n  }\n  aliases\n}\n"
  },
  {
    "path": "frontend/src/graphql/fragments/URLFragment.gql",
    "content": "fragment URLFragment on URL {\n  url\n  site {\n    id\n    name\n    icon\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/index.ts",
    "content": "export * from \"./queries\";\nexport * from \"./mutations\";\nexport * from \"./types\";\n"
  },
  {
    "path": "frontend/src/graphql/mutations/ActivateNewUser.gql",
    "content": "mutation ActivateNewUser($input: ActivateNewUserInput!) {\n  activateNewUser(input: $input) {\n    id\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/AddImage.gql",
    "content": "mutation AddImage($imageData: ImageCreateInput!) {\n  imageCreate(input: $imageData) {\n    id\n    url\n    width\n    height\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/AddScene.gql",
    "content": "mutation AddScene($sceneData: SceneCreateInput!) {\n  sceneCreate(input: $sceneData) {\n    id\n    release_date\n    production_date\n    title\n    code\n    details\n    director\n    urls {\n      url\n      site {\n        id\n        name\n      }\n    }\n    studio {\n      id\n      name\n    }\n    performers {\n      performer {\n        name\n        id\n        gender\n        aliases\n      }\n    }\n    fingerprints {\n      hash\n      algorithm\n      duration\n    }\n    tags {\n      id\n      name\n      description\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/AddSite.gql",
    "content": "mutation AddSite($siteData: SiteCreateInput!) {\n  siteCreate(input: $siteData) {\n    id\n    name\n    description\n    url\n    regex\n    valid_types\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/AddStudio.gql",
    "content": "mutation AddStudio($studioData: StudioCreateInput!) {\n  studioCreate(input: $studioData) {\n    id\n    name\n    aliases\n    urls {\n      url\n      site {\n        id\n        name\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/AddTagCategory.gql",
    "content": "mutation AddTagCategory($categoryData: TagCategoryCreateInput!) {\n  tagCategoryCreate(input: $categoryData) {\n    id\n    name\n    description\n    group\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/AddUser.gql",
    "content": "mutation AddUser($userData: UserCreateInput!) {\n  userCreate(input: $userData) {\n    id\n    name\n    email\n    roles\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/AmendEdit.gql",
    "content": "mutation AmendEdit($input: AmendEditInput!) {\n  amendEdit(input: $input) {\n    ...EditFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/ApplyEdit.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\nmutation ApplyEdit($input: ApplyEditInput!) {\n  applyEdit(input: $input) {\n    ...EditFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/CancelEdit.gql",
    "content": "mutation CancelEdit($input: CancelEditInput!) {\n  cancelEdit(input: $input) {\n    id\n    target_type\n    operation\n    status\n    applied\n    created\n    user {\n      id\n      name\n    }\n    target {\n      ... on Tag {\n        id\n        name\n        description\n        deleted\n      }\n    }\n    details {\n      ... on TagEdit {\n        name\n        description\n        added_aliases\n        removed_aliases\n      }\n    }\n    merge_sources {\n      ... on Tag {\n        id\n        name\n        description\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/ChangePassword.gql",
    "content": "mutation ChangePassword($userData: UserChangePasswordInput!) {\n  changePassword(input: $userData)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/ConfirmChangeEmail.gql",
    "content": "mutation ConfirmChangeEmail($token: ID!) {\n  confirmChangeEmail(token: $token)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/DeleteDraft.gql",
    "content": "mutation DeleteDraft($id: ID!) {\n  destroyDraft(id: $id)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/DeleteEdit.gql",
    "content": "mutation DeleteEdit($input: DeleteEditInput!) {\n  deleteEdit(input: $input)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/DeleteFingerprintSubmissions.gql",
    "content": "mutation DeleteFingerprintSubmissions(\n  $input: DeleteFingerprintSubmissionsInput!\n) {\n  sceneDeleteFingerprintSubmissions(input: $input)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/DeleteScene.gql",
    "content": "mutation DeleteScene($input: SceneDestroyInput!) {\n  sceneDestroy(input: $input)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/DeleteSite.gql",
    "content": "mutation DeleteSite($input: SiteDestroyInput!) {\n  siteDestroy(input: $input)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/DeleteStudio.gql",
    "content": "mutation DeleteStudio($input: StudioDestroyInput!) {\n  studioDestroy(input: $input)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/DeleteTagCategory.gql",
    "content": "mutation DeleteTagCategory($input: TagCategoryDestroyInput!) {\n  tagCategoryDestroy(input: $input)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/DeleteUser.gql",
    "content": "mutation DeleteUser($input: UserDestroyInput!) {\n  userDestroy(input: $input)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/EditComment.gql",
    "content": "#import \"../fragments/CommentFragment.gql\"\nmutation EditComment($input: EditCommentInput!) {\n  editComment(input: $input) {\n    id\n    comments {\n      ...CommentFragment\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/FavoritePerformer.gql",
    "content": "mutation FavoritePerformer($id: ID!, $favorite: Boolean!) {\n  favoritePerformer(id: $id, favorite: $favorite)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/FavoriteStudio.gql",
    "content": "mutation FavoriteStudio($id: ID!, $favorite: Boolean!) {\n  favoriteStudio(id: $id, favorite: $favorite)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/GenerateInviteCode.gql",
    "content": "mutation GenerateInviteCodes($input: GenerateInviteCodeInput) {\n  generateInviteCodes(input: $input)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/GrantInvite.gql",
    "content": "mutation GrantInvite($input: GrantInviteInput!) {\n  grantInvite(input: $input)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/MarkNotificationRead.gql",
    "content": "mutation MarkNotificationRead($notification: MarkNotificationReadInput!) {\n  markNotificationsRead(notification: $notification)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/MarkNotificationsRead.gql",
    "content": "mutation MarkNotificationsRead {\n  markNotificationsRead\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/MoveFingerprintSubmissions.gql",
    "content": "mutation MoveFingerprintSubmissions($input: MoveFingerprintSubmissionsInput!) {\n  sceneMoveFingerprintSubmissions(input: $input)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/NewUser.gql",
    "content": "mutation NewUser($input: NewUserInput!) {\n  newUser(input: $input)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/PerformerEdit.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\nmutation PerformerEdit($performerData: PerformerEditInput!) {\n  performerEdit(input: $performerData) {\n    ...EditFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/PerformerEditUpdate.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\nmutation PerformerEditUpdate($id: ID!, $performerData: PerformerEditInput!) {\n  performerEditUpdate(id: $id, input: $performerData) {\n    ...EditFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/RegenerateAPIKey.gql",
    "content": "mutation RegenerateAPIKey($user_id: ID) {\n  regenerateAPIKey(userID: $user_id)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/RequestChangeEmail.gql",
    "content": "mutation RequestChangeEmail {\n  requestChangeEmail\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/RescindInviteCode.gql",
    "content": "mutation RescindInviteCode($code: ID!) {\n  rescindInviteCode(code: $code)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/ResetPassword.gql",
    "content": "mutation ResetPassword($input: ResetPasswordInput!) {\n  resetPassword(input: $input)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/RevokeInvite.gql",
    "content": "mutation RevokeInvite($input: RevokeInviteInput!) {\n  revokeInvite(input: $input)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/SceneEdit.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\nmutation SceneEdit($sceneData: SceneEditInput!) {\n  sceneEdit(input: $sceneData) {\n    ...EditFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/SceneEditUpdate.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\nmutation SceneEditUpdate($id: ID!, $sceneData: SceneEditInput!) {\n  sceneEditUpdate(id: $id, input: $sceneData) {\n    ...EditFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/StudioEdit.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\nmutation StudioEdit($studioData: StudioEditInput!) {\n  studioEdit(input: $studioData) {\n    ...EditFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/StudioEditUpdate.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\nmutation StudioEditUpdate($id: ID!, $studioData: StudioEditInput!) {\n  studioEditUpdate(id: $id, input: $studioData) {\n    ...EditFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/TagEdit.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\nmutation TagEdit($tagData: TagEditInput!) {\n  tagEdit(input: $tagData) {\n    ...EditFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/TagEditUpdate.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\nmutation TagEditUpdate($id: ID!, $tagData: TagEditInput!) {\n  tagEditUpdate(id: $id, input: $tagData) {\n    ...EditFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/UnmatchFingerprint.gql",
    "content": "mutation UnmatchFingerprint(\n  $scene_id: ID!\n  $algorithm: FingerprintAlgorithm!\n  $hash: FingerprintHash!\n  $duration: Int!\n) {\n  unmatchFingerprint: submitFingerprint(\n    input: {\n      vote: REMOVE\n      scene_id: $scene_id\n      fingerprint: { hash: $hash, algorithm: $algorithm, duration: $duration }\n    }\n  )\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/UpdateNotificationSubscriptions.gql",
    "content": "mutation UpdateNotificationSubscriptions($subscriptions: [NotificationEnum!]!) {\n  updateNotificationSubscriptions(subscriptions: $subscriptions)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/UpdateScene.gql",
    "content": "mutation UpdateScene($updateData: SceneUpdateInput!) {\n  sceneUpdate(input: $updateData) {\n    id\n    release_date\n    production_date\n    details\n    director\n    code\n    duration\n    title\n    urls {\n      url\n      site {\n        id\n        name\n      }\n    }\n    studio {\n      id\n      name\n    }\n    performers {\n      performer {\n        name\n        id\n        gender\n        aliases\n      }\n    }\n    fingerprints {\n      hash\n      algorithm\n      duration\n    }\n    tags {\n      id\n      name\n      description\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/UpdateSite.gql",
    "content": "mutation UpdateSite($siteData: SiteUpdateInput!) {\n  siteUpdate(input: $siteData) {\n    id\n    name\n    description\n    url\n    regex\n    valid_types\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/UpdateStudio.gql",
    "content": "#import \"../fragments/StudioFragment.gql\"\nmutation UpdateStudio($input: StudioUpdateInput!) {\n  studioUpdate(input: $input) {\n    ...StudioFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/UpdateTagCategory.gql",
    "content": "mutation UpdateTagCategory($categoryData: TagCategoryUpdateInput!) {\n  tagCategoryUpdate(input: $categoryData) {\n    id\n    name\n    description\n    group\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/UpdateUser.gql",
    "content": "mutation UpdateUser($userData: UserUpdateInput!) {\n  userUpdate(input: $userData) {\n    id\n    name\n    email\n    roles\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/ValidateChangeEmail.gql",
    "content": "mutation ValidateChangeEmail($token: ID!, $email: String!) {\n  validateChangeEmail(token: $token, email: $email)\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/Vote.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\nmutation Vote($input: EditVoteInput!) {\n  editVote(input: $input) {\n    ...EditFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/mutations/index.ts",
    "content": "import { useMutation, type MutationHookOptions } from \"@apollo/client/react\";\n\nimport MeGql from \"../queries/Me.gql\";\nimport {\n  type ActivateNewUserMutation,\n  type ActivateNewUserMutationVariables,\n  type AddUserMutation,\n  type AddUserMutationVariables,\n  type NewUserMutation,\n  type NewUserMutationVariables,\n  type UpdateUserMutation,\n  type UpdateUserMutationVariables,\n  type DeleteUserMutation,\n  type DeleteUserMutationVariables,\n  type AddTagCategoryMutation,\n  type AddTagCategoryMutationVariables,\n  type DeleteTagCategoryMutation,\n  type DeleteTagCategoryMutationVariables,\n  type UpdateTagCategoryMutation,\n  type UpdateTagCategoryMutationVariables,\n  type AddImageMutation,\n  type AddImageMutationVariables,\n  type PerformerEditMutation,\n  type PerformerEditMutationVariables,\n  type PerformerEditUpdateMutation,\n  type PerformerEditUpdateMutationVariables,\n  type TagEditMutation,\n  type TagEditMutationVariables,\n  type TagEditUpdateMutation,\n  type TagEditUpdateMutationVariables,\n  type AddSceneMutation,\n  type AddSceneMutationVariables,\n  type DeleteSceneMutation,\n  type DeleteSceneMutationVariables,\n  type UpdateSceneMutation,\n  type UpdateSceneMutationVariables,\n  type AddStudioMutation,\n  type AddStudioMutationVariables,\n  type DeleteStudioMutation,\n  type DeleteStudioMutationVariables,\n  type UpdateStudioMutation,\n  type UpdateStudioMutationVariables,\n  type ApplyEditMutation,\n  type ApplyEditMutationVariables,\n  type CancelEditMutation,\n  type CancelEditMutationVariables,\n  type DeleteEditMutation,\n  type DeleteEditMutationVariables,\n  type AmendEditMutation,\n  type AmendEditMutationVariables,\n  type ChangePasswordMutation,\n  type ChangePasswordMutationVariables,\n  type ResetPasswordMutation,\n  type ResetPasswordMutationVariables,\n  type RegenerateApiKeyMutation,\n  type RegenerateApiKeyMutationVariables,\n  type GenerateInviteCodesMutation,\n  type GenerateInviteCodesMutationVariables,\n  type GrantInviteMutation,\n  type GrantInviteMutationVariables,\n  type RescindInviteCodeMutation,\n  type RescindInviteCodeMutationVariables,\n  type RevokeInviteMutation,\n  type RevokeInviteMutationVariables,\n  type EditCommentMutation,\n  type EditCommentMutationVariables,\n  type StudioEditMutation,\n  type StudioEditMutationVariables,\n  type StudioEditUpdateMutation,\n  type StudioEditUpdateMutationVariables,\n  type SceneEditMutation,\n  type SceneEditMutationVariables,\n  type SceneEditUpdateMutation,\n  type SceneEditUpdateMutationVariables,\n  type VoteMutation,\n  type VoteMutationVariables,\n  type AddSiteMutation,\n  type AddSiteMutationVariables,\n  type DeleteSiteMutation,\n  type DeleteSiteMutationVariables,\n  type UpdateSiteMutation,\n  type UpdateSiteMutationVariables,\n  type FavoriteStudioMutation,\n  type FavoriteStudioMutationVariables,\n  type FavoritePerformerMutation,\n  type FavoritePerformerMutationVariables,\n  type DeleteDraftMutation,\n  type DeleteDraftMutationVariables,\n  type UnmatchFingerprintMutation,\n  type UnmatchFingerprintMutationVariables,\n  type MoveFingerprintSubmissionsMutation,\n  type MoveFingerprintSubmissionsMutationVariables,\n  type DeleteFingerprintSubmissionsMutation,\n  type DeleteFingerprintSubmissionsMutationVariables,\n  type ValidateChangeEmailMutation,\n  type ValidateChangeEmailMutationVariables,\n  type ConfirmChangeEmailMutation,\n  type ConfirmChangeEmailMutationVariables,\n  type RequestChangeEmailMutation,\n  ActivateNewUserDocument,\n  AddUserDocument,\n  NewUserDocument,\n  UpdateUserDocument,\n  DeleteUserDocument,\n  AddTagCategoryDocument,\n  DeleteTagCategoryDocument,\n  UpdateTagCategoryDocument,\n  AddImageDocument,\n  PerformerEditDocument,\n  TagEditDocument,\n  StudioEditDocument,\n  SceneEditDocument,\n  PerformerEditUpdateDocument,\n  TagEditUpdateDocument,\n  StudioEditUpdateDocument,\n  SceneEditUpdateDocument,\n  AddSceneDocument,\n  DeleteSceneDocument,\n  UpdateSceneDocument,\n  AddStudioDocument,\n  DeleteStudioDocument,\n  UpdateStudioDocument,\n  ApplyEditDocument,\n  CancelEditDocument,\n  DeleteEditDocument,\n  AmendEditDocument,\n  ChangePasswordDocument,\n  ResetPasswordDocument,\n  RegenerateApiKeyDocument,\n  GenerateInviteCodesDocument,\n  GrantInviteDocument,\n  RescindInviteCodeDocument,\n  RevokeInviteDocument,\n  EditCommentDocument,\n  VoteDocument,\n  AddSiteDocument,\n  DeleteSiteDocument,\n  UpdateSiteDocument,\n  FavoritePerformerDocument,\n  FavoriteStudioDocument,\n  DeleteDraftDocument,\n  UnmatchFingerprintDocument,\n  MoveFingerprintSubmissionsDocument,\n  DeleteFingerprintSubmissionsDocument,\n  ValidateChangeEmailDocument,\n  ConfirmChangeEmailDocument,\n  RequestChangeEmailDocument,\n  type RequestChangeEmailMutationVariables,\n  UpdateNotificationSubscriptionsDocument,\n  type UpdateNotificationSubscriptionsMutation,\n  type UpdateNotificationSubscriptionsMutationVariables,\n  MarkNotificationsReadDocument,\n  MarkNotificationReadDocument,\n  type MarkNotificationReadMutationVariables,\n  type MeQuery,\n} from \"../types\";\n\nexport const useActivateUser = (\n  options?: useMutation.Options<\n    ActivateNewUserMutation,\n    ActivateNewUserMutationVariables\n  >,\n) => useMutation(ActivateNewUserDocument, options);\n\nexport const useAddUser = (\n  options?: useMutation.Options<AddUserMutation, AddUserMutationVariables>,\n) => useMutation(AddUserDocument, options);\n\nexport const useNewUser = (\n  options?: useMutation.Options<NewUserMutation, NewUserMutationVariables>,\n) => useMutation(NewUserDocument, options);\n\nexport const useUpdateUser = (\n  options?: useMutation.Options<\n    UpdateUserMutation,\n    UpdateUserMutationVariables\n  >,\n) => useMutation(UpdateUserDocument, options);\n\nexport const useDeleteUser = (\n  options?: useMutation.Options<\n    DeleteUserMutation,\n    DeleteUserMutationVariables\n  >,\n) => useMutation(DeleteUserDocument, options);\n\nexport const useAddCategory = (\n  options?: useMutation.Options<\n    AddTagCategoryMutation,\n    AddTagCategoryMutationVariables\n  >,\n) => useMutation(AddTagCategoryDocument, options);\n\nexport const useDeleteCategory = (\n  options?: useMutation.Options<\n    DeleteTagCategoryMutation,\n    DeleteTagCategoryMutationVariables\n  >,\n) => useMutation(DeleteTagCategoryDocument, options);\n\nexport const useUpdateCategory = (\n  options?: useMutation.Options<\n    UpdateTagCategoryMutation,\n    UpdateTagCategoryMutationVariables\n  >,\n) => useMutation(UpdateTagCategoryDocument, options);\n\nexport const useAddImage = (\n  options?: useMutation.Options<AddImageMutation, AddImageMutationVariables>,\n) => useMutation(AddImageDocument, options);\n\nexport const usePerformerEdit = (\n  options?: useMutation.Options<\n    PerformerEditMutation,\n    PerformerEditMutationVariables\n  >,\n) => useMutation(PerformerEditDocument, options);\n\nexport const usePerformerEditUpdate = (\n  options?: useMutation.Options<\n    PerformerEditUpdateMutation,\n    PerformerEditUpdateMutationVariables\n  >,\n) => useMutation(PerformerEditUpdateDocument, options);\n\nexport const useAddScene = (\n  options?: useMutation.Options<AddSceneMutation, AddSceneMutationVariables>,\n) => useMutation(AddSceneDocument, options);\n\nexport const useDeleteScene = (\n  options?: useMutation.Options<\n    DeleteSceneMutation,\n    DeleteSceneMutationVariables\n  >,\n) => useMutation(DeleteSceneDocument, options);\n\nexport const useUpdateScene = (\n  options?: useMutation.Options<\n    UpdateSceneMutation,\n    UpdateSceneMutationVariables\n  >,\n) => useMutation(UpdateSceneDocument, options);\n\nexport const useAddStudio = (\n  options?: useMutation.Options<AddStudioMutation, AddStudioMutationVariables>,\n) => useMutation(AddStudioDocument, options);\n\nexport const useDeleteStudio = (\n  options?: useMutation.Options<\n    DeleteStudioMutation,\n    DeleteStudioMutationVariables\n  >,\n) => useMutation(DeleteStudioDocument, options);\n\nexport const useUpdateStudio = (\n  options?: useMutation.Options<\n    UpdateStudioMutation,\n    UpdateStudioMutationVariables\n  >,\n) => useMutation(UpdateStudioDocument, options);\n\nexport const useTagEdit = (\n  options?: useMutation.Options<TagEditMutation, TagEditMutationVariables>,\n) => useMutation(TagEditDocument, options);\n\nexport const useTagEditUpdate = (\n  options?: useMutation.Options<\n    TagEditUpdateMutation,\n    TagEditUpdateMutationVariables\n  >,\n) => useMutation(TagEditUpdateDocument, options);\n\nexport const useStudioEdit = (\n  options?: useMutation.Options<\n    StudioEditMutation,\n    StudioEditMutationVariables\n  >,\n) => useMutation(StudioEditDocument, options);\n\nexport const useStudioEditUpdate = (\n  options?: useMutation.Options<\n    StudioEditUpdateMutation,\n    StudioEditUpdateMutationVariables\n  >,\n) => useMutation(StudioEditUpdateDocument, options);\n\nexport const useSceneEdit = (\n  options?: useMutation.Options<SceneEditMutation, SceneEditMutationVariables>,\n) => useMutation(SceneEditDocument, options);\n\nexport const useSceneEditUpdate = (\n  options?: useMutation.Options<\n    SceneEditUpdateMutation,\n    SceneEditUpdateMutationVariables\n  >,\n) => useMutation(SceneEditUpdateDocument, options);\n\nexport const useApplyEdit = (\n  options?: useMutation.Options<ApplyEditMutation, ApplyEditMutationVariables>,\n) => useMutation(ApplyEditDocument, options);\n\nexport const useCancelEdit = (\n  options?: useMutation.Options<\n    CancelEditMutation,\n    CancelEditMutationVariables\n  >,\n) => useMutation(CancelEditDocument, options);\n\nexport const useDeleteEdit = (\n  options?: MutationHookOptions<\n    DeleteEditMutation,\n    DeleteEditMutationVariables\n  >,\n) => useMutation(DeleteEditDocument, options);\n\nexport const useAmendEdit = (\n  options?: MutationHookOptions<AmendEditMutation, AmendEditMutationVariables>,\n) => useMutation(AmendEditDocument, options);\n\nexport const useChangePassword = (\n  options?: useMutation.Options<\n    ChangePasswordMutation,\n    ChangePasswordMutationVariables\n  >,\n) => useMutation(ChangePasswordDocument, options);\n\nexport const useResetPassword = (\n  options?: useMutation.Options<\n    ResetPasswordMutation,\n    ResetPasswordMutationVariables\n  >,\n) => useMutation(ResetPasswordDocument, options);\n\nexport const useRegenerateAPIKey = (\n  options?: useMutation.Options<\n    RegenerateApiKeyMutation,\n    RegenerateApiKeyMutationVariables\n  >,\n) => useMutation(RegenerateApiKeyDocument, options);\n\nexport const useGenerateInviteCodes = (\n  options?: useMutation.Options<\n    GenerateInviteCodesMutation,\n    GenerateInviteCodesMutationVariables\n  >,\n) => useMutation(GenerateInviteCodesDocument, options);\n\nexport const useGrantInvite = (\n  options?: useMutation.Options<\n    GrantInviteMutation,\n    GrantInviteMutationVariables\n  >,\n) => useMutation(GrantInviteDocument, options);\n\nexport const useRescindInviteCode = (\n  options?: useMutation.Options<\n    RescindInviteCodeMutation,\n    RescindInviteCodeMutationVariables\n  >,\n) => useMutation(RescindInviteCodeDocument, options);\n\nexport const useRevokeInvite = (\n  options?: useMutation.Options<\n    RevokeInviteMutation,\n    RevokeInviteMutationVariables\n  >,\n) => useMutation(RevokeInviteDocument, options);\n\nexport const useEditComment = (\n  options?: useMutation.Options<\n    EditCommentMutation,\n    EditCommentMutationVariables\n  >,\n) => useMutation(EditCommentDocument, options);\n\nexport const useVote = (\n  options?: useMutation.Options<VoteMutation, VoteMutationVariables>,\n) => useMutation(VoteDocument, options);\n\nexport const useAddSite = (\n  options?: useMutation.Options<AddSiteMutation, AddSiteMutationVariables>,\n) => useMutation(AddSiteDocument, options);\n\nexport const useDeleteSite = (\n  options?: useMutation.Options<\n    DeleteSiteMutation,\n    DeleteSiteMutationVariables\n  >,\n) => useMutation(DeleteSiteDocument, options);\n\nexport const useUpdateSite = (\n  options?: useMutation.Options<\n    UpdateSiteMutation,\n    UpdateSiteMutationVariables\n  >,\n) => useMutation(UpdateSiteDocument, options);\n\nexport const useSetFavorite = <T extends \"performer\" | \"studio\">(\n  type: T,\n  id: string,\n) =>\n  useMutation<\n    T extends \"performer\" ? FavoritePerformerMutation : FavoriteStudioMutation,\n    T extends \"performer\"\n      ? FavoritePerformerMutationVariables\n      : FavoriteStudioMutationVariables\n  >(type === \"performer\" ? FavoritePerformerDocument : FavoriteStudioDocument, {\n    update: (cache, { errors }) => {\n      if (errors === undefined) {\n        const identity = cache.identify({\n          __typename: type === \"performer\" ? \"Performer\" : \"Studio\",\n          id,\n        });\n        cache.modify({\n          id: identity,\n          fields: {\n            is_favorite: (prevState) => !prevState,\n          },\n        });\n      }\n    },\n  });\n\nexport const useDeleteDraft = (\n  options?: useMutation.Options<\n    DeleteDraftMutation,\n    DeleteDraftMutationVariables\n  >,\n) => useMutation(DeleteDraftDocument, options);\n\nexport const useUnmatchFingerprint = (\n  options?: useMutation.Options<\n    UnmatchFingerprintMutation,\n    UnmatchFingerprintMutationVariables\n  >,\n) =>\n  useMutation(UnmatchFingerprintDocument, {\n    update(cache, { data }, { variables }) {\n      if (data?.unmatchFingerprint)\n        cache.evict({\n          id: cache.identify({ __typename: \"Scene\", id: variables?.scene_id }),\n          fieldName: \"fingerprints\",\n        });\n    },\n    ...options,\n  });\n\nexport const useMoveFingerprintSubmissions = (\n  options?: useMutation.Options<\n    MoveFingerprintSubmissionsMutation,\n    MoveFingerprintSubmissionsMutationVariables\n  >,\n) =>\n  useMutation(MoveFingerprintSubmissionsDocument, {\n    update(cache, { data }, { variables }) {\n      if (data?.sceneMoveFingerprintSubmissions) {\n        // Evict fingerprints from both source and target scenes\n        cache.evict({\n          id: cache.identify({\n            __typename: \"Scene\",\n            id: variables?.input.source_scene_id,\n          }),\n          fieldName: \"fingerprints\",\n        });\n        cache.evict({\n          id: cache.identify({\n            __typename: \"Scene\",\n            id: variables?.input.target_scene_id,\n          }),\n          fieldName: \"fingerprints\",\n        });\n      }\n    },\n    ...options,\n  });\n\nexport const useDeleteFingerprintSubmissions = (\n  options?: useMutation.Options<\n    DeleteFingerprintSubmissionsMutation,\n    DeleteFingerprintSubmissionsMutationVariables\n  >,\n) =>\n  useMutation(DeleteFingerprintSubmissionsDocument, {\n    update(cache, { data }, { variables }) {\n      if (data?.sceneDeleteFingerprintSubmissions) {\n        cache.evict({\n          id: cache.identify({\n            __typename: \"Scene\",\n            id: variables?.input.scene_id,\n          }),\n          fieldName: \"fingerprints\",\n        });\n      }\n    },\n    ...options,\n  });\n\nexport const useValidateChangeEmail = (\n  options?: useMutation.Options<\n    ValidateChangeEmailMutation,\n    ValidateChangeEmailMutationVariables\n  >,\n) => useMutation(ValidateChangeEmailDocument, options);\n\nexport const useConfirmChangeEmail = (\n  options?: useMutation.Options<\n    ConfirmChangeEmailMutation,\n    ConfirmChangeEmailMutationVariables\n  >,\n) => useMutation(ConfirmChangeEmailDocument, options);\n\nexport const useRequestChangeEmail = (\n  options?: useMutation.Options<\n    RequestChangeEmailMutation,\n    RequestChangeEmailMutationVariables\n  >,\n) => useMutation(RequestChangeEmailDocument, options);\n\nexport const useUpdateNotificationSubscriptions = (\n  options?: useMutation.Options<\n    UpdateNotificationSubscriptionsMutation,\n    UpdateNotificationSubscriptionsMutationVariables\n  >,\n) =>\n  useMutation(UpdateNotificationSubscriptionsDocument, {\n    update(cache, { data }) {\n      if (data?.updateNotificationSubscriptions) {\n        const user = cache.read<MeQuery>({ query: MeGql, optimistic: false });\n\n        cache.evict({\n          id: cache.identify({ __typename: \"User\", id: user?.me?.id }),\n          fieldName: \"notification_subscriptions\",\n        });\n      }\n    },\n    ...options,\n  });\n\nexport const useMarkNotificationsRead = () =>\n  useMutation(MarkNotificationsReadDocument, {\n    update(cache, { data }) {\n      if (data?.markNotificationsRead) {\n        cache.evict({ fieldName: \"queryNotifications\" });\n        cache.evict({ fieldName: \"getUnreadNotificationCount\" });\n      }\n    },\n  });\n\nexport const useMarkNotificationRead = (\n  variables: MarkNotificationReadMutationVariables,\n) =>\n  useMutation(MarkNotificationReadDocument, {\n    variables,\n    update(cache, { data }) {\n      if (data?.markNotificationsRead) {\n        cache.evict({ fieldName: \"queryNotifications\" });\n        cache.evict({ fieldName: \"getUnreadNotificationCount\" });\n      }\n    },\n  });\n"
  },
  {
    "path": "frontend/src/graphql/queries/Categories.gql",
    "content": "query Categories {\n  queryTagCategories {\n    count\n    tag_categories {\n      id\n      name\n      description\n      group\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Category.gql",
    "content": "query Category($id: ID!) {\n  findTagCategory(id: $id) {\n    id\n    name\n    description\n    group\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Config.gql",
    "content": "query Config {\n  getConfig {\n    edit_update_limit\n    host_url\n    require_invite\n    require_activation\n    vote_promotion_threshold\n    vote_application_threshold\n    voting_period\n    min_destructive_voting_period\n    vote_cron_interval\n    guidelines_url\n    require_scene_draft\n    require_tag_role\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Draft.gql",
    "content": "#import \"../fragments/ImageFragment.gql\"\n#import \"../fragments/PerformerFragment.gql\"\n#import \"../fragments/TagFragment.gql\"\n#import \"../fragments/StudioFragment.gql\"\nquery Draft($id: ID!) {\n  findDraft(id: $id) {\n    id\n    created\n    expires\n    data {\n      ... on PerformerDraft {\n        id\n        name\n        disambiguation\n        aliases\n        gender\n        birthdate\n        deathdate\n        urls\n        ethnicity\n        country\n        eye_color\n        hair_color\n        height\n        measurements\n        breast_type\n        tattoos\n        piercings\n        career_start_year\n        career_end_year\n        image {\n          ...ImageFragment\n        }\n      }\n      ... on SceneDraft {\n        id\n        title\n        code\n        details\n        director\n        date\n        urls\n        studio {\n          ... on Studio {\n            ...StudioFragment\n          }\n          ... on DraftEntity {\n            draftID: id\n            name\n          }\n        }\n        performers {\n          ... on Performer {\n            ...PerformerFragment\n          }\n          ... on DraftEntity {\n            draftID: id\n            name\n          }\n        }\n        tags {\n          ... on Tag {\n            ...TagFragment\n          }\n          ... on DraftEntity {\n            draftID: id\n            name\n          }\n        }\n        fingerprints {\n          hash\n          algorithm\n          duration\n        }\n        image {\n          ...ImageFragment\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Drafts.gql",
    "content": "query Drafts {\n  findDrafts {\n    id\n    created\n    expires\n    data {\n      ... on PerformerDraft {\n        id\n        name\n      }\n      ... on SceneDraft {\n        id\n        title\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Edit.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\nquery Edit($id: ID!) {\n  findEdit(id: $id) {\n    ...EditFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/EditUpdate.gql",
    "content": "#import \"../fragments/PerformerFragment.gql\"\n#import \"../fragments/StudioFragment.gql\"\n#import \"../fragments/SceneFragment.gql\"\n#import \"../fragments/TagFragment.gql\"\n#import \"../fragments/FingerprintFragment.gql\"\nquery EditUpdate($id: ID!) {\n  findEdit(id: $id) {\n    id\n    target_type\n    operation\n    status\n    applied\n    closed\n    created\n    updated\n    updatable\n    update_count\n    vote_count\n    merge_sources {\n      ... on Tag {\n        id\n      }\n      ... on Performer {\n        id\n      }\n      ... on Studio {\n        id\n      }\n      ... on Scene {\n        id\n      }\n    }\n    options {\n      set_modify_aliases\n      set_merge_aliases\n    }\n    user {\n      id\n      name\n    }\n    target {\n      ... on Tag {\n        ...TagFragment\n        aliases\n      }\n      ... on Performer {\n        ...PerformerFragment\n      }\n      ... on Studio {\n        ...StudioFragment\n      }\n      ... on Scene {\n        ...SceneFragment\n      }\n    }\n    details {\n      ... on TagEdit {\n        name\n        description\n        category {\n          id\n          name\n        }\n        aliases\n      }\n      ... on PerformerEdit {\n        name\n        disambiguation\n        gender\n        birthdate\n        deathdate\n        ethnicity\n        country\n        eye_color\n        hair_color\n        height\n        cup_size\n        band_size\n        waist_size\n        hip_size\n        breast_type\n        career_start_year\n        career_end_year\n        aliases\n        urls {\n          ...URLFragment\n        }\n        tattoos {\n          location\n          description\n        }\n        piercings {\n          location\n          description\n        }\n        images {\n          ...ImageFragment\n        }\n        draft_id\n      }\n      ... on StudioEdit {\n        name\n        urls {\n          ...URLFragment\n        }\n        parent {\n          ...StudioFragment\n        }\n        images {\n          ...ImageFragment\n        }\n      }\n      ... on SceneEdit {\n        title\n        details\n        date\n        production_date\n        studio {\n          ...StudioFragment\n        }\n        urls {\n          ...URLFragment\n        }\n        performers {\n          performer {\n            ...PerformerFragment\n          }\n          as\n        }\n        tags {\n          ...TagFragment\n        }\n        images {\n          ...ImageFragment\n        }\n        fingerprints {\n          ...FingerprintFragment\n        }\n        duration\n        director\n        code\n        draft_id\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Edits.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\nquery Edits($input: EditQueryInput!) {\n  queryEdits(input: $input) {\n    count\n    edits {\n      ...EditFragment\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/FullPerformer.gql",
    "content": "#import \"../fragments/PerformerFragment.gql\"\nquery FullPerformer($id: ID!) {\n  findPerformer(id: $id) {\n    ...PerformerFragment\n    studios {\n      scene_count\n      studio {\n        id\n        name\n        parent {\n          id\n          name\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Me.gql",
    "content": "query Me {\n  me {\n    id\n    name\n    roles\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/ModAudits.gql",
    "content": "query ModAudits($input: ModAuditQueryInput!) {\n  queryModAudits(input: $input) {\n    count\n    audits {\n      id\n      action\n      user {\n        id\n        name\n      }\n      target_id\n      target_type\n      data\n      reason\n      created_at\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/PendingEditsCount.gql",
    "content": "query PendingEditsCount($type: TargetTypeEnum!, $id: ID!) {\n  queryEdits(\n    input: { target_type: $type, target_id: $id, status: PENDING, per_page: 1 }\n  ) {\n    count\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Performer.gql",
    "content": "#import \"../fragments/PerformerFragment.gql\"\nquery Performer($id: ID!) {\n  findPerformer(id: $id) {\n    ...PerformerFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Performers.gql",
    "content": "#import \"../fragments/URLFragment.gql\"\n#import \"../fragments/ImageFragment.gql\"\nquery Performers($input: PerformerQueryInput!) {\n  queryPerformers(input: $input) {\n    count\n    performers {\n      id\n      name\n      disambiguation\n      deleted\n      aliases\n      gender\n      birth_date\n      age\n      height\n      hair_color\n      eye_color\n      ethnicity\n      country\n      career_end_year\n      career_start_year\n      breast_type\n      waist_size\n      hip_size\n      band_size\n      cup_size\n      tattoos {\n        location\n        description\n      }\n      piercings {\n        location\n        description\n      }\n      urls {\n        ...URLFragment\n      }\n      images {\n        ...ImageFragment\n      }\n      is_favorite\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/PublicUser.gql",
    "content": "query PublicUser($name: String!) {\n  findUser(username: $name) {\n    id\n    name\n    vote_count {\n      accept\n      reject\n      immediate_accept\n      immediate_reject\n      abstain\n    }\n    edit_count {\n      immediate_accepted\n      immediate_rejected\n      accepted\n      rejected\n      failed\n      canceled\n      pending\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/QueryExistingPerformer.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\n#import \"../fragments/PerformerFragment.gql\"\nquery QueryExistingPerformer($input: QueryExistingPerformerInput!) {\n  queryExistingPerformer(input: $input) {\n    performers {\n      ...PerformerFragment\n    }\n    edits {\n      ...EditFragment\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/QueryExistingScene.gql",
    "content": "#import \"../fragments/EditFragment.gql\"\n#import \"../fragments/SceneFragment.gql\"\nquery QueryExistingScene($input: QueryExistingSceneInput!) {\n  queryExistingScene(input: $input) {\n    scenes {\n      ...SceneFragment\n    }\n    edits {\n      ...EditFragment\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/QueryNotifications.gql",
    "content": "#import \"../fragments/SceneFragment.gql\"\n#import \"../fragments/EditFragment.gql\"\n#import \"../fragments/CommentFragment.gql\"\n\nfragment NotificationCommentFragment on EditComment {\n  ...CommentFragment\n  edit {\n    ...EditFragment\n  }\n}\n\nquery Notifications($input: QueryNotificationsInput!) {\n  queryNotifications(input: $input) {\n    count\n    notifications {\n      created\n      read\n      data {\n        __typename\n        ... on FavoritePerformerScene {\n          scene {\n            ...SceneFragment\n          }\n        }\n        ... on FavoritePerformerEdit {\n          edit {\n            ...EditFragment\n          }\n        }\n        ... on FavoriteStudioScene {\n          scene {\n            ...SceneFragment\n          }\n        }\n        ... on FavoriteStudioEdit {\n          edit {\n            ...EditFragment\n          }\n        }\n        ... on CommentOwnEdit {\n          comment {\n            ...NotificationCommentFragment\n          }\n        }\n        ... on CommentCommentedEdit {\n          comment {\n            ...NotificationCommentFragment\n          }\n        }\n        ... on CommentVotedEdit {\n          comment {\n            ...NotificationCommentFragment\n          }\n        }\n        ... on DownvoteOwnEdit {\n          edit {\n            ...EditFragment\n          }\n        }\n        ... on FailedOwnEdit {\n          edit {\n            ...EditFragment\n          }\n        }\n        ... on UpdatedEdit {\n          edit {\n            ...EditFragment\n          }\n        }\n        ... on FingerprintedSceneEdit {\n          edit {\n            ...EditFragment\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Scene.gql",
    "content": "#import \"../fragments/SceneFragment.gql\"\nquery Scene($id: ID!) {\n  findScene(id: $id) {\n    ...SceneFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/ScenePairings.gql",
    "content": "#import \"../fragments/ImageFragment.gql\"\nquery ScenePairings(\n  $performerId: ID!\n  $names: String\n  $gender: GenderFilterEnum\n  $favorite: Boolean\n  $page: Int! = 1\n  $per_page: Int! = 25\n  $direction: SortDirectionEnum!\n  $sort: PerformerSortEnum!\n  $fetchScenes: Boolean!\n) {\n  queryPerformers(\n    input: {\n      performed_with: $performerId\n      names: $names\n      gender: $gender\n      is_favorite: $favorite\n      page: $page\n      per_page: $per_page\n      direction: $direction\n      sort: $sort\n    }\n  ) {\n    count\n    performers {\n      id\n      name\n      disambiguation\n      deleted\n      aliases\n      gender\n      birth_date\n      is_favorite\n      images {\n        ...ImageFragment\n      }\n      scenes(input: { performed_with: $performerId })\n        @include(if: $fetchScenes)\n      {\n        id\n        title\n        date\n        duration\n        release_date\n        studio {\n          id\n          name\n        }\n        images {\n          ...ImageFragment\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Scenes.gql",
    "content": "#import \"../fragments/QuerySceneFragment.gql\"\nquery Scenes($input: SceneQueryInput!) {\n  queryScenes(input: $input) {\n    count\n    scenes {\n      ...QuerySceneFragment\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/ScenesWithFingerprints.gql",
    "content": "#import \"../fragments/QuerySceneFragment.gql\"\nquery ScenesWithFingerprints($input: SceneQueryInput!, $submitted: Boolean!) {\n  queryScenes(input: $input) {\n    count\n    scenes {\n      ...QuerySceneFragment\n      fingerprints(is_submitted: $submitted) {\n        hash\n        algorithm\n        duration\n        submissions\n        user_submitted\n        created\n        updated\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/ScenesWithoutCount.gql",
    "content": "#import \"../fragments/QuerySceneFragment.gql\"\nquery ScenesWithoutCount($input: SceneQueryInput!) {\n  queryScenes(input: $input) {\n    scenes {\n      ...QuerySceneFragment\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/SearchAll.gql",
    "content": "#import \"../fragments/ImageFragment.gql\"\n#import \"../fragments/SearchPerformerFragment.gql\"\n#import \"../fragments/URLFragment.gql\"\nquery SearchAll($term: String!, $limit: Int = 5) {\n  searchPerformers(term: $term, limit: $limit) {\n    count\n    performers {\n      ...SearchPerformerFragment\n    }\n  }\n  searchScenes(term: $term, limit: $limit) {\n    count\n    scenes {\n      id\n      release_date\n      title\n      deleted\n      duration\n      code\n      urls {\n        ...URLFragment\n      }\n      images {\n        ...ImageFragment\n      }\n      studio {\n        id\n        name\n      }\n      performers {\n        as\n        performer {\n          id\n          name\n          disambiguation\n          gender\n          aliases\n          deleted\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/SearchPerformers.gql",
    "content": "#import \"../fragments/SearchPerformerFragment.gql\"\nquery SearchPerformers(\n  $term: String!\n  $page: Int\n  $per_page: Int\n  $filter: PerformerSearchFilter\n  $studioId: ID\n  $hasStudioId: Boolean! = false\n) {\n  searchPerformers(\n    term: $term\n    page: $page\n    per_page: $per_page\n    filter: $filter\n  ) {\n    count\n    performers {\n      ...SearchPerformerFragment\n      studios(studio_id: $studioId) @include(if: $hasStudioId) {\n        scene_count\n      }\n    }\n    facets {\n      genders {\n        gender\n        count\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/SearchScenes.gql",
    "content": "#import \"../fragments/ImageFragment.gql\"\n#import \"../fragments/URLFragment.gql\"\nquery SearchScenes($term: String!, $page: Int, $per_page: Int) {\n  searchScenes(term: $term, page: $page, per_page: $per_page) {\n    count\n    scenes {\n      id\n      release_date\n      title\n      deleted\n      duration\n      code\n      urls {\n        ...URLFragment\n      }\n      images {\n        ...ImageFragment\n      }\n      studio {\n        id\n        name\n      }\n      performers {\n        as\n        performer {\n          id\n          name\n          disambiguation\n          gender\n          aliases\n          deleted\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/SearchTags.gql",
    "content": "fragment SearchTagFragment on Tag {\n  deleted\n  id\n  name\n  description\n  aliases\n}\n\nquery SearchTags($term: String!, $limit: Int = 5) {\n  exact: findTagOrAlias(name: $term) {\n    ...SearchTagFragment\n  }\n  query: searchTag(term: $term, limit: $limit) {\n    ...SearchTagFragment\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Site.gql",
    "content": "query Site($id: ID!) {\n  findSite(id: $id) {\n    id\n    name\n    description\n    url\n    regex\n    valid_types\n    icon\n    created\n    updated\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Sites.gql",
    "content": "query Sites {\n  querySites {\n    sites {\n      id\n      name\n      description\n      url\n      regex\n      valid_types\n      icon\n      created\n      updated\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Studio.gql",
    "content": "#import \"../fragments/StudioFragment.gql\"\nquery Studio($id: ID!) {\n  findStudio(id: $id) {\n    ...StudioFragment\n    sub_studios {\n      count\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/StudioPerformers.gql",
    "content": "#import \"../fragments/ImageFragment.gql\"\nquery StudioPerformers(\n  $studioId: ID!\n  $gender: GenderFilterEnum\n  $favorite: Boolean\n  $names: String\n  $page: Int! = 1\n  $per_page: Int! = 25\n  $direction: SortDirectionEnum!\n  $sort: PerformerSortEnum!\n) {\n  queryPerformers(\n    input: {\n      studio_id: $studioId\n      gender: $gender\n      is_favorite: $favorite\n      names: $names\n      page: $page\n      per_page: $per_page\n      direction: $direction\n      sort: $sort\n    }\n  ) {\n    count\n    performers {\n      id\n      name\n      disambiguation\n      deleted\n      aliases\n      gender\n      birth_date\n      is_favorite\n      images {\n        ...ImageFragment\n      }\n      scenes(input: { studio_id: $studioId }) {\n        id\n        title\n        duration\n        release_date\n        production_date\n        studio {\n          id\n          name\n        }\n        images {\n          ...ImageFragment\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Studios.gql",
    "content": "#import \"../fragments/URLFragment.gql\"\n#import \"../fragments/ImageFragment.gql\"\nquery Studios($input: StudioQueryInput!) {\n  queryStudios(input: $input) {\n    count\n    studios {\n      id\n      name\n      aliases\n      deleted\n      parent {\n        id\n        name\n      }\n      urls {\n        ...URLFragment\n      }\n      images {\n        ...ImageFragment\n      }\n      is_favorite\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/SubStudios.gql",
    "content": "query SubStudios($id: ID!, $input: StudioQueryInput!) {\n  findStudio(id: $id) {\n    sub_studios(input: $input) {\n      count\n      studios {\n        id\n        name\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Tag.gql",
    "content": "query Tag($name: String, $id: ID) {\n  findTag(name: $name, id: $id) {\n    id\n    name\n    description\n    aliases\n    deleted\n    category {\n      id\n      name\n      group\n      description\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Tags.gql",
    "content": "query Tags($input: TagQueryInput!) {\n  queryTags(input: $input) {\n    count\n    tags {\n      id\n      name\n      description\n      aliases\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/UnreadNotificationCount.gql",
    "content": "query UnreadNotificationCount {\n  getUnreadNotificationCount\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/User.gql",
    "content": "query User($name: String!) {\n  findUser(username: $name) {\n    id\n    name\n    email\n    roles\n    api_key\n    api_calls\n    invited_by {\n      id\n      name\n    }\n    invite_tokens\n    invite_codes {\n      id\n      uses\n      expires\n    }\n    vote_count {\n      accept\n      reject\n      immediate_accept\n      immediate_reject\n      abstain\n    }\n    edit_count {\n      immediate_accepted\n      immediate_rejected\n      accepted\n      rejected\n      failed\n      canceled\n      pending\n    }\n    notification_subscriptions\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Users.gql",
    "content": "query Users($input: UserQueryInput!) {\n  queryUsers(input: $input) {\n    count\n    users {\n      id\n      name\n      email\n      roles\n      api_key\n      api_calls\n      invited_by {\n        id\n        name\n      }\n      invite_tokens\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/Version.gql",
    "content": "query Version {\n  version {\n    hash\n    version\n    build_time\n    build_type\n  }\n}\n"
  },
  {
    "path": "frontend/src/graphql/queries/index.ts",
    "content": "import { useLazyQuery, useQuery } from \"@apollo/client/react\";\n\nimport {\n  CategoryDocument,\n  type CategoryQueryVariables,\n  CategoriesDocument,\n  EditDocument,\n  type EditQueryVariables,\n  EditUpdateDocument,\n  EditsDocument,\n  type EditsQueryVariables,\n  MeDocument,\n  type MeQuery,\n  PerformerDocument,\n  type PerformerQueryVariables,\n  FullPerformerDocument,\n  PerformersDocument,\n  type PerformersQueryVariables,\n  SceneDocument,\n  type SceneQueryVariables,\n  ScenesDocument,\n  type ScenesQueryVariables,\n  ScenesWithFingerprintsDocument,\n  type ScenesWithFingerprintsQueryVariables,\n  ScenesWithoutCountDocument,\n  SearchAllDocument,\n  type SearchAllQuery,\n  type SearchAllQueryVariables,\n  SearchPerformersDocument,\n  type SearchPerformersQuery,\n  type SearchPerformersQueryVariables,\n  SearchScenesDocument,\n  type SearchScenesQuery,\n  type SearchScenesQueryVariables,\n  SearchTagsDocument,\n  type SearchTagsQueryVariables,\n  StudioDocument,\n  type StudioQueryVariables,\n  StudiosDocument,\n  type StudiosQuery,\n  type StudiosQueryVariables,\n  TagDocument,\n  type TagQueryVariables,\n  TagsDocument,\n  type TagsQuery,\n  type TagsQueryVariables,\n  UserDocument,\n  type UserQueryVariables,\n  UsersDocument,\n  type UsersQueryVariables,\n  PublicUserDocument,\n  type PublicUserQueryVariables,\n  ConfigDocument,\n  PendingEditsCountDocument,\n  type PendingEditsCountQueryVariables,\n  SiteDocument,\n  type SiteQueryVariables,\n  SitesDocument,\n  DraftDocument,\n  type DraftQueryVariables,\n  DraftsDocument,\n  QueryExistingSceneDocument,\n  type QueryExistingSceneQueryVariables,\n  QueryExistingPerformerDocument,\n  type QueryExistingPerformerQueryVariables,\n  ScenePairingsDocument,\n  type ScenePairingsQueryVariables,\n  StudioPerformersDocument,\n  type StudioPerformersQueryVariables,\n  SubStudiosDocument,\n  type SubStudiosQueryVariables,\n  VersionDocument,\n  type MeQueryVariables,\n  NotificationsDocument,\n  type NotificationsQueryVariables,\n  UnreadNotificationCountDocument,\n  ModAuditsDocument,\n  type ModAuditsQueryVariables,\n} from \"../types\";\nimport { useCurrentUser } from \"src/hooks\";\n\nexport const useCategory = (variables: CategoryQueryVariables, skip = false) =>\n  useQuery(CategoryDocument, {\n    variables,\n    skip,\n  });\n\nexport const useCategories = () => useQuery(CategoriesDocument);\n\nexport const useEdit = (variables: EditQueryVariables, skip = false) =>\n  useQuery(EditDocument, {\n    variables,\n    skip,\n  });\n\nexport const useEditUpdate = (variables: EditQueryVariables, skip = false) =>\n  useQuery(EditUpdateDocument, {\n    variables,\n    skip,\n  });\n\nexport const useEdits = (variables: EditsQueryVariables) =>\n  useQuery(EditsDocument, {\n    variables,\n  });\n\nexport const useMe = (options?: useQuery.Options<MeQuery, MeQueryVariables>) =>\n  useQuery(MeDocument, options);\n\nexport const usePerformer = (\n  variables: PerformerQueryVariables,\n  skip = false,\n) =>\n  useQuery(PerformerDocument, {\n    variables,\n    skip,\n  });\n\nexport const useFullPerformer = (\n  variables: PerformerQueryVariables,\n  skip = false,\n) =>\n  useQuery(FullPerformerDocument, {\n    variables,\n    skip,\n  });\n\nexport const usePerformers = (variables: PerformersQueryVariables) =>\n  useQuery(PerformersDocument, {\n    variables,\n  });\n\nexport const useScene = (variables: SceneQueryVariables, skip = false) =>\n  useQuery(SceneDocument, {\n    variables,\n    skip,\n  });\n\nexport const useScenes = (variables: ScenesQueryVariables, skip = false) =>\n  useQuery(ScenesDocument, {\n    variables,\n    skip,\n  });\n\nexport const useScenesWithFingerprints = (\n  variables: ScenesWithFingerprintsQueryVariables,\n  skip = false,\n) =>\n  useQuery(ScenesWithFingerprintsDocument, {\n    variables,\n    skip,\n  });\n\nexport const useScenesWithoutCount = (\n  variables: ScenesQueryVariables,\n  skip = false,\n) =>\n  useQuery(ScenesWithoutCountDocument, {\n    variables,\n    skip,\n  });\n\nexport const useSearchAll = (\n  variables: SearchAllQueryVariables,\n  skip = false,\n) =>\n  useQuery(SearchAllDocument, {\n    variables,\n    skip,\n  });\n\nexport const useSearchPerformers = (\n  variables: SearchPerformersQueryVariables,\n  skip = false,\n) =>\n  useQuery(SearchPerformersDocument, {\n    variables,\n    skip,\n  });\n\nexport const useSearchScenes = (\n  variables: SearchScenesQueryVariables,\n  skip = false,\n) =>\n  useQuery(SearchScenesDocument, {\n    variables,\n    skip,\n  });\n\nexport const useLazySearchAll = (\n  options?: useLazyQuery.Options<SearchAllQuery, SearchAllQueryVariables>,\n) => useLazyQuery(SearchAllDocument, options);\n\nexport const useLazySearchPerformers = (\n  options?: useLazyQuery.Options<\n    SearchPerformersQuery,\n    SearchPerformersQueryVariables\n  >,\n) => useLazyQuery(SearchPerformersDocument, options);\n\nexport const useLazySearchScenes = (\n  options?: useLazyQuery.Options<SearchScenesQuery, SearchScenesQueryVariables>,\n) => useLazyQuery(SearchScenesDocument, options);\n\nexport const useSearchTags = (variables: SearchTagsQueryVariables) =>\n  useQuery(SearchTagsDocument, {\n    variables,\n  });\n\nexport const useStudio = (variables: StudioQueryVariables, skip = false) =>\n  useQuery(StudioDocument, {\n    variables,\n    skip,\n  });\n\nexport const useStudios = (variables: StudiosQueryVariables) =>\n  useQuery(StudiosDocument, {\n    variables,\n  });\n\nexport const useSubStudios = (variables: SubStudiosQueryVariables) =>\n  useQuery(SubStudiosDocument, {\n    variables,\n  });\n\nexport const useLazyStudios = (\n  options?: useLazyQuery.Options<StudiosQuery, StudiosQueryVariables>,\n) => useLazyQuery(StudiosDocument, options);\n\nexport const useTag = (variables: TagQueryVariables, skip = false) =>\n  useQuery(TagDocument, {\n    variables,\n    skip,\n  });\n\nexport const useTags = (variables: TagsQueryVariables) =>\n  useQuery(TagsDocument, {\n    variables,\n  });\nexport const useLazyTags = (\n  options?: useLazyQuery.Options<TagsQuery, TagsQueryVariables>,\n) => useLazyQuery(TagsDocument, options);\n\nexport const usePrivateUser = (variables: UserQueryVariables, skip = false) =>\n  useQuery(UserDocument, {\n    variables,\n    skip,\n  });\nexport const usePublicUser = (\n  variables: PublicUserQueryVariables,\n  skip = false,\n) =>\n  useQuery(PublicUserDocument, {\n    variables,\n    skip,\n  });\n\nexport const useUser = (variables: UserQueryVariables, skip = false) => {\n  const { isAdmin, user } = useCurrentUser();\n  const isUser = () => user?.name === variables.name;\n  const showPrivate = isUser() || isAdmin;\n\n  const privateUser = usePrivateUser(variables, skip || !showPrivate);\n  const publicUser = usePublicUser(variables, skip || showPrivate);\n\n  return showPrivate ? privateUser : publicUser;\n};\n\nexport const useUsers = (variables: UsersQueryVariables) =>\n  useQuery(UsersDocument, {\n    variables,\n  });\n\nexport const useConfig = () => useQuery(ConfigDocument);\n\nexport const useVersion = () => useQuery(VersionDocument);\n\nexport const usePendingEditsCount = (\n  variables: PendingEditsCountQueryVariables,\n) => useQuery(PendingEditsCountDocument, { variables });\n\nexport const useSite = (variables: SiteQueryVariables, skip = false) =>\n  useQuery(SiteDocument, {\n    variables,\n    skip,\n  });\n\nexport const useSites = () => useQuery(SitesDocument);\n\nexport const useDraft = (variables: DraftQueryVariables, skip = false) =>\n  useQuery(DraftDocument, {\n    variables,\n    skip,\n  });\n\nexport const useDrafts = () => useQuery(DraftsDocument);\n\nexport const useQueryExistingScene = (\n  variables: QueryExistingSceneQueryVariables,\n  skip = false,\n) =>\n  useQuery(QueryExistingSceneDocument, {\n    variables,\n    skip,\n  });\n\nexport const useQueryExistingPerformer = (\n  variables: QueryExistingPerformerQueryVariables,\n  skip = false,\n) =>\n  useQuery(QueryExistingPerformerDocument, {\n    variables,\n    skip,\n  });\n\nexport const useScenePairings = (variables: ScenePairingsQueryVariables) =>\n  useQuery(ScenePairingsDocument, {\n    variables,\n  });\n\nexport const useStudioPerformers = (\n  variables: StudioPerformersQueryVariables,\n) =>\n  useQuery(StudioPerformersDocument, {\n    variables,\n  });\n\nexport const useNotifications = (variables: NotificationsQueryVariables) =>\n  useQuery(NotificationsDocument, {\n    variables,\n  });\n\nexport const useUnreadNotificationsCount = () =>\n  useQuery(UnreadNotificationCountDocument);\n\nexport const useModAudits = (variables: ModAuditsQueryVariables) =>\n  useQuery(ModAuditsDocument, {\n    variables,\n  });\n"
  },
  {
    "path": "frontend/src/graphql/scalars.d.ts",
    "content": "type GQLDate = string;\ntype GQLTime = string;\ntype GQLUpload = File;\n"
  },
  {
    "path": "frontend/src/graphql/types.ts",
    "content": "import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string; }\n  String: { input: string; output: string; }\n  Boolean: { input: boolean; output: boolean; }\n  Int: { input: number; output: number; }\n  Float: { input: number; output: number; }\n  Date: { input: string; output: string; }\n  DateTime: { input: string; output: string; }\n  FingerprintHash: { input: string; output: string; }\n  Time: { input: string; output: string; }\n  Upload: { input: File; output: File; }\n};\n\nexport type ActivateNewUserInput = {\n  activation_key: Scalars['ID']['input'];\n  name: Scalars['String']['input'];\n  password: Scalars['String']['input'];\n};\n\nexport type AmendEditInput = {\n  id: Scalars['ID']['input'];\n  reason: Scalars['String']['input'];\n  /** Array items to remove from added arrays */\n  remove_added_items?: InputMaybe<Array<AmendItemRemoval>>;\n  /** Fields to remove from the diff (e.g., [\"name\", \"disambiguation\"]) */\n  remove_fields?: InputMaybe<Array<Scalars['String']['input']>>;\n  /** Array items to remove from removed arrays */\n  remove_removed_items?: InputMaybe<Array<AmendItemRemoval>>;\n};\n\nexport type AmendItemRemoval = {\n  /** Field name (e.g., \"aliases\", \"urls\", \"images\") */\n  field: Scalars['String']['input'];\n  /** Indices to remove from the array */\n  indices: Array<Scalars['Int']['input']>;\n};\n\nexport type ApplyEditInput = {\n  id: Scalars['ID']['input'];\n};\n\nexport type BodyModification = {\n  __typename: 'BodyModification';\n  description?: Maybe<Scalars['String']['output']>;\n  location: Scalars['String']['output'];\n};\n\nexport type BodyModificationCriterionInput = {\n  description?: InputMaybe<Scalars['String']['input']>;\n  location?: InputMaybe<Scalars['String']['input']>;\n  modifier: CriterionModifier;\n};\n\nexport type BodyModificationInput = {\n  description?: InputMaybe<Scalars['String']['input']>;\n  location: Scalars['String']['input'];\n};\n\nexport type BreastTypeCriterionInput = {\n  modifier: CriterionModifier;\n  value?: InputMaybe<BreastTypeEnum>;\n};\n\nexport enum BreastTypeEnum {\n  FAKE = 'FAKE',\n  NA = 'NA',\n  NATURAL = 'NATURAL'\n}\n\nexport type CancelEditInput = {\n  id: Scalars['ID']['input'];\n};\n\nexport type CommentCommentedEdit = {\n  __typename: 'CommentCommentedEdit';\n  comment: EditComment;\n};\n\nexport type CommentOwnEdit = {\n  __typename: 'CommentOwnEdit';\n  comment: EditComment;\n};\n\nexport type CommentVotedEdit = {\n  __typename: 'CommentVotedEdit';\n  comment: EditComment;\n};\n\nexport enum CriterionModifier {\n  /** = */\n  EQUALS = 'EQUALS',\n  EXCLUDES = 'EXCLUDES',\n  /** > */\n  GREATER_THAN = 'GREATER_THAN',\n  INCLUDES = 'INCLUDES',\n  /** INCLUDES ALL */\n  INCLUDES_ALL = 'INCLUDES_ALL',\n  /** IS NULL */\n  IS_NULL = 'IS_NULL',\n  /** < */\n  LESS_THAN = 'LESS_THAN',\n  /** != */\n  NOT_EQUALS = 'NOT_EQUALS',\n  /** IS NOT NULL */\n  NOT_NULL = 'NOT_NULL'\n}\n\nexport enum DateAccuracyEnum {\n  DAY = 'DAY',\n  MONTH = 'MONTH',\n  YEAR = 'YEAR'\n}\n\nexport type DateCriterionInput = {\n  modifier: CriterionModifier;\n  value: Scalars['Date']['input'];\n};\n\nexport type DeleteEditInput = {\n  id: Scalars['ID']['input'];\n  reason: Scalars['String']['input'];\n};\n\nexport type DeleteFingerprintSubmissionsInput = {\n  fingerprints: Array<FingerprintQueryInput>;\n  scene_id: Scalars['ID']['input'];\n};\n\nexport type DownvoteOwnEdit = {\n  __typename: 'DownvoteOwnEdit';\n  edit: Edit;\n};\n\nexport type Draft = {\n  __typename: 'Draft';\n  created: Scalars['Time']['output'];\n  data: DraftData;\n  expires: Scalars['Time']['output'];\n  id: Scalars['ID']['output'];\n};\n\nexport type DraftData = PerformerDraft | SceneDraft;\n\nexport type DraftEntity = {\n  __typename: 'DraftEntity';\n  id?: Maybe<Scalars['ID']['output']>;\n  name: Scalars['String']['output'];\n};\n\nexport type DraftEntityInput = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  name: Scalars['String']['input'];\n};\n\nexport type DraftFingerprint = {\n  __typename: 'DraftFingerprint';\n  algorithm: FingerprintAlgorithm;\n  duration: Scalars['Int']['output'];\n  hash: Scalars['FingerprintHash']['output'];\n};\n\nexport type DraftSubmissionStatus = {\n  __typename: 'DraftSubmissionStatus';\n  id?: Maybe<Scalars['ID']['output']>;\n};\n\nexport type Edit = {\n  __typename: 'Edit';\n  applied: Scalars['Boolean']['output'];\n  bot: Scalars['Boolean']['output'];\n  closed?: Maybe<Scalars['Time']['output']>;\n  comments: Array<EditComment>;\n  created: Scalars['Time']['output'];\n  /** Is the edit considered destructive. */\n  destructive: Scalars['Boolean']['output'];\n  details?: Maybe<EditDetails>;\n  expires?: Maybe<Scalars['Time']['output']>;\n  id: Scalars['ID']['output'];\n  /** Objects to merge with the target. Only applicable to merges */\n  merge_sources: Array<EditTarget>;\n  /** Previous state of fields being modified - null if operation is create or delete. */\n  old_details?: Maybe<EditDetails>;\n  operation: OperationEnum;\n  /** Entity specific options */\n  options?: Maybe<PerformerEditOptions>;\n  status: VoteStatusEnum;\n  /** Object being edited - null if creating a new object */\n  target?: Maybe<EditTarget>;\n  target_type: TargetTypeEnum;\n  updatable: Scalars['Boolean']['output'];\n  update_count: Scalars['Int']['output'];\n  updated?: Maybe<Scalars['Time']['output']>;\n  user?: Maybe<User>;\n  /**  = Accepted - Rejected */\n  vote_count: Scalars['Int']['output'];\n  votes: Array<EditVote>;\n};\n\nexport type EditComment = {\n  __typename: 'EditComment';\n  comment: Scalars['String']['output'];\n  date: Scalars['Time']['output'];\n  edit: Edit;\n  id: Scalars['ID']['output'];\n  user?: Maybe<User>;\n};\n\nexport type EditCommentInput = {\n  comment: Scalars['String']['input'];\n  id: Scalars['ID']['input'];\n};\n\nexport type EditDetails = PerformerEdit | SceneEdit | StudioEdit | TagEdit;\n\nexport type EditInput = {\n  /** Edit submitted by an automated script. Requires bot permission */\n  bot?: InputMaybe<Scalars['Boolean']['input']>;\n  comment?: InputMaybe<Scalars['String']['input']>;\n  /** Not required for create type */\n  id?: InputMaybe<Scalars['ID']['input']>;\n  /** Only required for merge type */\n  merge_source_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n  operation: OperationEnum;\n};\n\nexport type EditQueryInput = {\n  /** Filter by applied status */\n  applied?: InputMaybe<Scalars['Boolean']['input']>;\n  direction?: SortDirectionEnum;\n  /** Filter out user's own edits */\n  include_user_submitted?: InputMaybe<Scalars['Boolean']['input']>;\n  /** Filter to bot edits only */\n  is_bot?: InputMaybe<Scalars['Boolean']['input']>;\n  /** Filter by favorite status */\n  is_favorite?: InputMaybe<Scalars['Boolean']['input']>;\n  /** Filter by operation */\n  operation?: InputMaybe<OperationEnum>;\n  page?: Scalars['Int']['input'];\n  per_page?: Scalars['Int']['input'];\n  sort?: EditSortEnum;\n  /** Filter by status */\n  status?: InputMaybe<VoteStatusEnum>;\n  /** Filter by target id */\n  target_id?: InputMaybe<Scalars['ID']['input']>;\n  /** Filter by target type */\n  target_type?: InputMaybe<TargetTypeEnum>;\n  /** Filter by user id */\n  user_id?: InputMaybe<Scalars['ID']['input']>;\n  /** Filter by vote count */\n  vote_count?: InputMaybe<IntCriterionInput>;\n  /** Filter by user voted status */\n  voted?: InputMaybe<UserVotedFilterEnum>;\n};\n\nexport enum EditSortEnum {\n  CLOSED_AT = 'CLOSED_AT',\n  CREATED_AT = 'CREATED_AT',\n  UPDATED_AT = 'UPDATED_AT'\n}\n\nexport type EditTarget = Performer | Scene | Studio | Tag;\n\nexport type EditVote = {\n  __typename: 'EditVote';\n  date: Scalars['Time']['output'];\n  user?: Maybe<User>;\n  vote: VoteTypeEnum;\n};\n\nexport type EditVoteInput = {\n  id: Scalars['ID']['input'];\n  vote: VoteTypeEnum;\n};\n\nexport enum EthnicityEnum {\n  ASIAN = 'ASIAN',\n  BLACK = 'BLACK',\n  CAUCASIAN = 'CAUCASIAN',\n  INDIAN = 'INDIAN',\n  LATIN = 'LATIN',\n  MIDDLE_EASTERN = 'MIDDLE_EASTERN',\n  MIXED = 'MIXED',\n  OTHER = 'OTHER'\n}\n\nexport enum EthnicityFilterEnum {\n  ASIAN = 'ASIAN',\n  BLACK = 'BLACK',\n  CAUCASIAN = 'CAUCASIAN',\n  INDIAN = 'INDIAN',\n  LATIN = 'LATIN',\n  MIDDLE_EASTERN = 'MIDDLE_EASTERN',\n  MIXED = 'MIXED',\n  OTHER = 'OTHER',\n  UNKNOWN = 'UNKNOWN'\n}\n\nexport type EyeColorCriterionInput = {\n  modifier: CriterionModifier;\n  value?: InputMaybe<EyeColorEnum>;\n};\n\nexport enum EyeColorEnum {\n  BLUE = 'BLUE',\n  BROWN = 'BROWN',\n  GREEN = 'GREEN',\n  GREY = 'GREY',\n  HAZEL = 'HAZEL',\n  RED = 'RED'\n}\n\nexport type FailedOwnEdit = {\n  __typename: 'FailedOwnEdit';\n  edit: Edit;\n};\n\nexport enum FavoriteFilter {\n  ALL = 'ALL',\n  PERFORMER = 'PERFORMER',\n  STUDIO = 'STUDIO'\n}\n\nexport type FavoritePerformerEdit = {\n  __typename: 'FavoritePerformerEdit';\n  edit: Edit;\n};\n\nexport type FavoritePerformerScene = {\n  __typename: 'FavoritePerformerScene';\n  scene: Scene;\n};\n\nexport type FavoriteStudioEdit = {\n  __typename: 'FavoriteStudioEdit';\n  edit: Edit;\n};\n\nexport type FavoriteStudioScene = {\n  __typename: 'FavoriteStudioScene';\n  scene: Scene;\n};\n\nexport type Fingerprint = {\n  __typename: 'Fingerprint';\n  algorithm: FingerprintAlgorithm;\n  created: Scalars['Time']['output'];\n  duration: Scalars['Int']['output'];\n  hash: Scalars['FingerprintHash']['output'];\n  /** number of times this fingerprint has been reported */\n  reports: Scalars['Int']['output'];\n  /** number of times this fingerprint has been submitted (excluding reports) */\n  submissions: Scalars['Int']['output'];\n  updated: Scalars['Time']['output'];\n  /** true if the current user reported this fingerprint */\n  user_reported: Scalars['Boolean']['output'];\n  /** true if the current user submitted this fingerprint */\n  user_submitted: Scalars['Boolean']['output'];\n};\n\nexport enum FingerprintAlgorithm {\n  MD5 = 'MD5',\n  OSHASH = 'OSHASH',\n  PHASH = 'PHASH'\n}\n\nexport type FingerprintBatchSubmission = {\n  algorithm: FingerprintAlgorithm;\n  duration: Scalars['Int']['input'];\n  hash: Scalars['FingerprintHash']['input'];\n  scene_id: Scalars['ID']['input'];\n};\n\nexport type FingerprintEditInput = {\n  algorithm: FingerprintAlgorithm;\n  created: Scalars['Time']['input'];\n  duration: Scalars['Int']['input'];\n  hash: Scalars['FingerprintHash']['input'];\n  /** @deprecated Unused */\n  submissions?: InputMaybe<Scalars['Int']['input']>;\n  /** @deprecated Unused */\n  updated?: InputMaybe<Scalars['Time']['input']>;\n  user_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n};\n\nexport type FingerprintInput = {\n  algorithm: FingerprintAlgorithm;\n  duration: Scalars['Int']['input'];\n  hash: Scalars['FingerprintHash']['input'];\n  /** assumes current user if omitted. Ignored for non-modify Users */\n  user_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n};\n\nexport type FingerprintQueryInput = {\n  algorithm: FingerprintAlgorithm;\n  hash: Scalars['FingerprintHash']['input'];\n};\n\nexport type FingerprintSubmission = {\n  fingerprint: FingerprintInput;\n  scene_id: Scalars['ID']['input'];\n  /** @deprecated Use `vote` with REMOVE instead */\n  unmatch?: InputMaybe<Scalars['Boolean']['input']>;\n  vote?: InputMaybe<FingerprintSubmissionType>;\n};\n\nexport type FingerprintSubmissionResult = {\n  __typename: 'FingerprintSubmissionResult';\n  /** Error message if submission failed */\n  error?: Maybe<Scalars['String']['output']>;\n  /** The fingerprint hash that was submitted */\n  hash: Scalars['FingerprintHash']['output'];\n  /** The scene ID that was submitted to */\n  scene_id: Scalars['ID']['output'];\n};\n\nexport enum FingerprintSubmissionType {\n  /** Report as invalid */\n  INVALID = 'INVALID',\n  /** Remove vote */\n  REMOVE = 'REMOVE',\n  /** Positive vote */\n  VALID = 'VALID'\n}\n\nexport type FingerprintedSceneEdit = {\n  __typename: 'FingerprintedSceneEdit';\n  edit: Edit;\n};\n\nexport type FuzzyDate = {\n  __typename: 'FuzzyDate';\n  accuracy: DateAccuracyEnum;\n  date: Scalars['Date']['output'];\n};\n\nexport enum GenderEnum {\n  FEMALE = 'FEMALE',\n  INTERSEX = 'INTERSEX',\n  MALE = 'MALE',\n  NON_BINARY = 'NON_BINARY',\n  TRANSGENDER_FEMALE = 'TRANSGENDER_FEMALE',\n  TRANSGENDER_MALE = 'TRANSGENDER_MALE'\n}\n\nexport type GenderFacet = {\n  __typename: 'GenderFacet';\n  count: Scalars['Int']['output'];\n  gender: GenderEnum;\n};\n\nexport enum GenderFilterEnum {\n  FEMALE = 'FEMALE',\n  INTERSEX = 'INTERSEX',\n  MALE = 'MALE',\n  NON_BINARY = 'NON_BINARY',\n  TRANSGENDER_FEMALE = 'TRANSGENDER_FEMALE',\n  TRANSGENDER_MALE = 'TRANSGENDER_MALE',\n  UNKNOWN = 'UNKNOWN'\n}\n\nexport type GenerateInviteCodeInput = {\n  keys?: InputMaybe<Scalars['Int']['input']>;\n  ttl?: InputMaybe<Scalars['Int']['input']>;\n  uses?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type GrantInviteInput = {\n  amount: Scalars['Int']['input'];\n  user_id: Scalars['ID']['input'];\n};\n\nexport type HairColorCriterionInput = {\n  modifier: CriterionModifier;\n  value?: InputMaybe<HairColorEnum>;\n};\n\nexport enum HairColorEnum {\n  AUBURN = 'AUBURN',\n  BALD = 'BALD',\n  BLACK = 'BLACK',\n  BLONDE = 'BLONDE',\n  BRUNETTE = 'BRUNETTE',\n  GREY = 'GREY',\n  OTHER = 'OTHER',\n  RED = 'RED',\n  VARIOUS = 'VARIOUS',\n  WHITE = 'WHITE'\n}\n\nexport type IdCriterionInput = {\n  modifier: CriterionModifier;\n  value: Array<Scalars['ID']['input']>;\n};\n\nexport type Image = {\n  __typename: 'Image';\n  height: Scalars['Int']['output'];\n  id: Scalars['ID']['output'];\n  url: Scalars['String']['output'];\n  width: Scalars['Int']['output'];\n};\n\nexport type ImageCreateInput = {\n  file?: InputMaybe<Scalars['Upload']['input']>;\n  url?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type ImageDestroyInput = {\n  id: Scalars['ID']['input'];\n};\n\nexport type ImageUpdateInput = {\n  id: Scalars['ID']['input'];\n  url?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type IntCriterionInput = {\n  modifier: CriterionModifier;\n  value: Scalars['Int']['input'];\n};\n\nexport type InviteKey = {\n  __typename: 'InviteKey';\n  expires?: Maybe<Scalars['Time']['output']>;\n  id: Scalars['ID']['output'];\n  uses?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type MarkNotificationReadInput = {\n  id: Scalars['ID']['input'];\n  type: NotificationEnum;\n};\n\nexport type Measurements = {\n  __typename: 'Measurements';\n  band_size?: Maybe<Scalars['Int']['output']>;\n  cup_size?: Maybe<Scalars['String']['output']>;\n  hip?: Maybe<Scalars['Int']['output']>;\n  waist?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type ModAudit = {\n  __typename: 'ModAudit';\n  action: ModAuditActionEnum;\n  created_at: Scalars['Time']['output'];\n  data: Scalars['String']['output'];\n  id: Scalars['ID']['output'];\n  reason?: Maybe<Scalars['String']['output']>;\n  target_id: Scalars['ID']['output'];\n  target_type: Scalars['String']['output'];\n  user?: Maybe<User>;\n};\n\nexport enum ModAuditActionEnum {\n  EDIT_AMENDMENT = 'EDIT_AMENDMENT',\n  EDIT_DELETE = 'EDIT_DELETE'\n}\n\nexport type ModAuditQueryInput = {\n  action?: InputMaybe<ModAuditActionEnum>;\n  page?: Scalars['Int']['input'];\n  per_page?: Scalars['Int']['input'];\n  user_id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type MoveFingerprintSubmissionsInput = {\n  fingerprints: Array<FingerprintQueryInput>;\n  source_scene_id: Scalars['ID']['input'];\n  target_scene_id: Scalars['ID']['input'];\n};\n\nexport type MultiIdCriterionInput = {\n  modifier: CriterionModifier;\n  value?: InputMaybe<Array<Scalars['ID']['input']>>;\n};\n\nexport type MultiStringCriterionInput = {\n  modifier: CriterionModifier;\n  value: Array<Scalars['String']['input']>;\n};\n\nexport type Mutation = {\n  __typename: 'Mutation';\n  activateNewUser?: Maybe<User>;\n  /** Amend a closed edit by removing fields - moderator only */\n  amendEdit: Edit;\n  /** Apply edit without voting */\n  applyEdit: Edit;\n  /** Cancel edit without voting */\n  cancelEdit: Edit;\n  /** Changes the password for the current user */\n  changePassword: Scalars['Boolean']['output'];\n  confirmChangeEmail: UserChangeEmailStatus;\n  /** Delete a closed edit - moderator only */\n  deleteEdit: Scalars['Boolean']['output'];\n  destroyDraft: Scalars['Boolean']['output'];\n  /** Comment on an edit */\n  editComment: Edit;\n  /** Vote to accept/reject an edit */\n  editVote: Edit;\n  /** Favorite or unfavorite a performer */\n  favoritePerformer: Scalars['Boolean']['output'];\n  /** Favorite or unfavorite a studio */\n  favoriteStudio: Scalars['Boolean']['output'];\n  /** @deprecated Use generateInviteCodes */\n  generateInviteCode?: Maybe<Scalars['ID']['output']>;\n  /** Generates an invite code using an invite token */\n  generateInviteCodes: Array<Scalars['ID']['output']>;\n  /** Adds invite tokens for a user */\n  grantInvite: Scalars['Int']['output'];\n  imageCreate?: Maybe<Image>;\n  imageDestroy: Scalars['Boolean']['output'];\n  /** Mark all of the current users notifications as read. */\n  markNotificationsRead: Scalars['Boolean']['output'];\n  /** User interface for registering */\n  newUser?: Maybe<Scalars['ID']['output']>;\n  performerCreate?: Maybe<Performer>;\n  performerDestroy: Scalars['Boolean']['output'];\n  /** Propose a new performer or modification to a performer */\n  performerEdit: Edit;\n  /** Update a pending performer edit */\n  performerEditUpdate: Edit;\n  performerUpdate?: Maybe<Performer>;\n  /** Regenerates the api key for the given user, or the current user if id not provided */\n  regenerateAPIKey: Scalars['String']['output'];\n  /** Request an email change for the current user */\n  requestChangeEmail: UserChangeEmailStatus;\n  /** Removes a pending invite code - refunding the token */\n  rescindInviteCode: Scalars['Boolean']['output'];\n  /** Generates an email to reset a user password */\n  resetPassword: Scalars['Boolean']['output'];\n  /** Removes invite tokens from a user */\n  revokeInvite: Scalars['Int']['output'];\n  sceneCreate?: Maybe<Scene>;\n  /** Delete all fingerprint submissions for a specific fingerprint on a scene */\n  sceneDeleteFingerprintSubmissions: Scalars['Boolean']['output'];\n  sceneDestroy: Scalars['Boolean']['output'];\n  /** Propose a new scene or modification to a scene */\n  sceneEdit: Edit;\n  /** Update a pending scene edit */\n  sceneEditUpdate: Edit;\n  /** Move all fingerprint submissions from source scene to target scene */\n  sceneMoveFingerprintSubmissions: Scalars['Boolean']['output'];\n  sceneUpdate?: Maybe<Scene>;\n  siteCreate?: Maybe<Site>;\n  siteDestroy: Scalars['Boolean']['output'];\n  siteUpdate?: Maybe<Site>;\n  studioCreate?: Maybe<Studio>;\n  studioDestroy: Scalars['Boolean']['output'];\n  /** Propose a new studio or modification to a studio */\n  studioEdit: Edit;\n  /** Update a pending studio edit */\n  studioEditUpdate: Edit;\n  studioUpdate?: Maybe<Studio>;\n  /** Matches/unmatches a scene to fingerprint */\n  submitFingerprint: Scalars['Boolean']['output'];\n  /** Batch submit up to 1000 fingerprint matches */\n  submitFingerprints: Array<FingerprintSubmissionResult>;\n  submitPerformerDraft: DraftSubmissionStatus;\n  /** Draft submissions */\n  submitSceneDraft: DraftSubmissionStatus;\n  tagCategoryCreate?: Maybe<TagCategory>;\n  tagCategoryDestroy: Scalars['Boolean']['output'];\n  tagCategoryUpdate?: Maybe<TagCategory>;\n  tagCreate?: Maybe<Tag>;\n  tagDestroy: Scalars['Boolean']['output'];\n  /** Propose a new tag or modification to a tag */\n  tagEdit: Edit;\n  /** Update a pending tag edit */\n  tagEditUpdate: Edit;\n  tagUpdate?: Maybe<Tag>;\n  /** Update notification subscriptions for current user. */\n  updateNotificationSubscriptions: Scalars['Boolean']['output'];\n  userCreate?: Maybe<User>;\n  userDestroy: Scalars['Boolean']['output'];\n  userUpdate?: Maybe<User>;\n  validateChangeEmail: UserChangeEmailStatus;\n};\n\n\nexport type MutationActivateNewUserArgs = {\n  input: ActivateNewUserInput;\n};\n\n\nexport type MutationAmendEditArgs = {\n  input: AmendEditInput;\n};\n\n\nexport type MutationApplyEditArgs = {\n  input: ApplyEditInput;\n};\n\n\nexport type MutationCancelEditArgs = {\n  input: CancelEditInput;\n};\n\n\nexport type MutationChangePasswordArgs = {\n  input: UserChangePasswordInput;\n};\n\n\nexport type MutationConfirmChangeEmailArgs = {\n  token: Scalars['ID']['input'];\n};\n\n\nexport type MutationDeleteEditArgs = {\n  input: DeleteEditInput;\n};\n\n\nexport type MutationDestroyDraftArgs = {\n  id: Scalars['ID']['input'];\n};\n\n\nexport type MutationEditCommentArgs = {\n  input: EditCommentInput;\n};\n\n\nexport type MutationEditVoteArgs = {\n  input: EditVoteInput;\n};\n\n\nexport type MutationFavoritePerformerArgs = {\n  favorite: Scalars['Boolean']['input'];\n  id: Scalars['ID']['input'];\n};\n\n\nexport type MutationFavoriteStudioArgs = {\n  favorite: Scalars['Boolean']['input'];\n  id: Scalars['ID']['input'];\n};\n\n\nexport type MutationGenerateInviteCodesArgs = {\n  input?: InputMaybe<GenerateInviteCodeInput>;\n};\n\n\nexport type MutationGrantInviteArgs = {\n  input: GrantInviteInput;\n};\n\n\nexport type MutationImageCreateArgs = {\n  input: ImageCreateInput;\n};\n\n\nexport type MutationImageDestroyArgs = {\n  input: ImageDestroyInput;\n};\n\n\nexport type MutationMarkNotificationsReadArgs = {\n  notification?: InputMaybe<MarkNotificationReadInput>;\n};\n\n\nexport type MutationNewUserArgs = {\n  input: NewUserInput;\n};\n\n\nexport type MutationPerformerCreateArgs = {\n  input: PerformerCreateInput;\n};\n\n\nexport type MutationPerformerDestroyArgs = {\n  input: PerformerDestroyInput;\n};\n\n\nexport type MutationPerformerEditArgs = {\n  input: PerformerEditInput;\n};\n\n\nexport type MutationPerformerEditUpdateArgs = {\n  id: Scalars['ID']['input'];\n  input: PerformerEditInput;\n};\n\n\nexport type MutationPerformerUpdateArgs = {\n  input: PerformerUpdateInput;\n};\n\n\nexport type MutationRegenerateApiKeyArgs = {\n  userID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n\nexport type MutationRescindInviteCodeArgs = {\n  code: Scalars['ID']['input'];\n};\n\n\nexport type MutationResetPasswordArgs = {\n  input: ResetPasswordInput;\n};\n\n\nexport type MutationRevokeInviteArgs = {\n  input: RevokeInviteInput;\n};\n\n\nexport type MutationSceneCreateArgs = {\n  input: SceneCreateInput;\n};\n\n\nexport type MutationSceneDeleteFingerprintSubmissionsArgs = {\n  input: DeleteFingerprintSubmissionsInput;\n};\n\n\nexport type MutationSceneDestroyArgs = {\n  input: SceneDestroyInput;\n};\n\n\nexport type MutationSceneEditArgs = {\n  input: SceneEditInput;\n};\n\n\nexport type MutationSceneEditUpdateArgs = {\n  id: Scalars['ID']['input'];\n  input: SceneEditInput;\n};\n\n\nexport type MutationSceneMoveFingerprintSubmissionsArgs = {\n  input: MoveFingerprintSubmissionsInput;\n};\n\n\nexport type MutationSceneUpdateArgs = {\n  input: SceneUpdateInput;\n};\n\n\nexport type MutationSiteCreateArgs = {\n  input: SiteCreateInput;\n};\n\n\nexport type MutationSiteDestroyArgs = {\n  input: SiteDestroyInput;\n};\n\n\nexport type MutationSiteUpdateArgs = {\n  input: SiteUpdateInput;\n};\n\n\nexport type MutationStudioCreateArgs = {\n  input: StudioCreateInput;\n};\n\n\nexport type MutationStudioDestroyArgs = {\n  input: StudioDestroyInput;\n};\n\n\nexport type MutationStudioEditArgs = {\n  input: StudioEditInput;\n};\n\n\nexport type MutationStudioEditUpdateArgs = {\n  id: Scalars['ID']['input'];\n  input: StudioEditInput;\n};\n\n\nexport type MutationStudioUpdateArgs = {\n  input: StudioUpdateInput;\n};\n\n\nexport type MutationSubmitFingerprintArgs = {\n  input: FingerprintSubmission;\n};\n\n\nexport type MutationSubmitFingerprintsArgs = {\n  input: Array<FingerprintBatchSubmission>;\n};\n\n\nexport type MutationSubmitPerformerDraftArgs = {\n  input: PerformerDraftInput;\n};\n\n\nexport type MutationSubmitSceneDraftArgs = {\n  input: SceneDraftInput;\n};\n\n\nexport type MutationTagCategoryCreateArgs = {\n  input: TagCategoryCreateInput;\n};\n\n\nexport type MutationTagCategoryDestroyArgs = {\n  input: TagCategoryDestroyInput;\n};\n\n\nexport type MutationTagCategoryUpdateArgs = {\n  input: TagCategoryUpdateInput;\n};\n\n\nexport type MutationTagCreateArgs = {\n  input: TagCreateInput;\n};\n\n\nexport type MutationTagDestroyArgs = {\n  input: TagDestroyInput;\n};\n\n\nexport type MutationTagEditArgs = {\n  input: TagEditInput;\n};\n\n\nexport type MutationTagEditUpdateArgs = {\n  id: Scalars['ID']['input'];\n  input: TagEditInput;\n};\n\n\nexport type MutationTagUpdateArgs = {\n  input: TagUpdateInput;\n};\n\n\nexport type MutationUpdateNotificationSubscriptionsArgs = {\n  subscriptions: Array<NotificationEnum>;\n};\n\n\nexport type MutationUserCreateArgs = {\n  input: UserCreateInput;\n};\n\n\nexport type MutationUserDestroyArgs = {\n  input: UserDestroyInput;\n};\n\n\nexport type MutationUserUpdateArgs = {\n  input: UserUpdateInput;\n};\n\n\nexport type MutationValidateChangeEmailArgs = {\n  email: Scalars['String']['input'];\n  token: Scalars['ID']['input'];\n};\n\nexport type NewUserInput = {\n  email: Scalars['String']['input'];\n  invite_key?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type Notification = {\n  __typename: 'Notification';\n  created: Scalars['Time']['output'];\n  data: NotificationData;\n  read: Scalars['Boolean']['output'];\n};\n\nexport type NotificationData = CommentCommentedEdit | CommentOwnEdit | CommentVotedEdit | DownvoteOwnEdit | FailedOwnEdit | FavoritePerformerEdit | FavoritePerformerScene | FavoriteStudioEdit | FavoriteStudioScene | FingerprintedSceneEdit | UpdatedEdit;\n\nexport enum NotificationEnum {\n  COMMENT_COMMENTED_EDIT = 'COMMENT_COMMENTED_EDIT',\n  COMMENT_OWN_EDIT = 'COMMENT_OWN_EDIT',\n  COMMENT_VOTED_EDIT = 'COMMENT_VOTED_EDIT',\n  DOWNVOTE_OWN_EDIT = 'DOWNVOTE_OWN_EDIT',\n  FAILED_OWN_EDIT = 'FAILED_OWN_EDIT',\n  FAVORITE_PERFORMER_EDIT = 'FAVORITE_PERFORMER_EDIT',\n  FAVORITE_PERFORMER_SCENE = 'FAVORITE_PERFORMER_SCENE',\n  FAVORITE_STUDIO_EDIT = 'FAVORITE_STUDIO_EDIT',\n  FAVORITE_STUDIO_SCENE = 'FAVORITE_STUDIO_SCENE',\n  FINGERPRINTED_SCENE_EDIT = 'FINGERPRINTED_SCENE_EDIT',\n  UPDATED_EDIT = 'UPDATED_EDIT'\n}\n\nexport enum OperationEnum {\n  CREATE = 'CREATE',\n  DESTROY = 'DESTROY',\n  MERGE = 'MERGE',\n  MODIFY = 'MODIFY'\n}\n\nexport type Performer = {\n  __typename: 'Performer';\n  age?: Maybe<Scalars['Int']['output']>;\n  aliases: Array<Scalars['String']['output']>;\n  band_size?: Maybe<Scalars['Int']['output']>;\n  birth_date?: Maybe<Scalars['String']['output']>;\n  /** @deprecated Please use `birth_date` */\n  birthdate?: Maybe<FuzzyDate>;\n  breast_type?: Maybe<BreastTypeEnum>;\n  career_end_year?: Maybe<Scalars['Int']['output']>;\n  career_start_year?: Maybe<Scalars['Int']['output']>;\n  country?: Maybe<Scalars['String']['output']>;\n  created: Scalars['Time']['output'];\n  cup_size?: Maybe<Scalars['String']['output']>;\n  death_date?: Maybe<Scalars['String']['output']>;\n  deleted: Scalars['Boolean']['output'];\n  disambiguation?: Maybe<Scalars['String']['output']>;\n  edits: Array<Edit>;\n  ethnicity?: Maybe<EthnicityEnum>;\n  eye_color?: Maybe<EyeColorEnum>;\n  gender?: Maybe<GenderEnum>;\n  hair_color?: Maybe<HairColorEnum>;\n  /** Height in cm */\n  height?: Maybe<Scalars['Int']['output']>;\n  hip_size?: Maybe<Scalars['Int']['output']>;\n  id: Scalars['ID']['output'];\n  images: Array<Image>;\n  is_favorite: Scalars['Boolean']['output'];\n  /** @deprecated Use individual fields, cup/band/waist/hip_size */\n  measurements: Measurements;\n  /** IDs of performers that were merged into this one */\n  merged_ids: Array<Scalars['ID']['output']>;\n  /** ID of performer that replaces this one */\n  merged_into_id?: Maybe<Scalars['ID']['output']>;\n  name: Scalars['String']['output'];\n  piercings?: Maybe<Array<BodyModification>>;\n  scene_count: Scalars['Int']['output'];\n  scenes: Array<Scene>;\n  studios: Array<PerformerStudio>;\n  tattoos?: Maybe<Array<BodyModification>>;\n  updated: Scalars['Time']['output'];\n  urls: Array<Url>;\n  waist_size?: Maybe<Scalars['Int']['output']>;\n};\n\n\nexport type PerformerScenesArgs = {\n  input?: InputMaybe<PerformerScenesInput>;\n};\n\n\nexport type PerformerStudiosArgs = {\n  studio_id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type PerformerAppearance = {\n  __typename: 'PerformerAppearance';\n  /** Performing as alias */\n  as?: Maybe<Scalars['String']['output']>;\n  performer: Performer;\n};\n\nexport type PerformerAppearanceInput = {\n  /** Performing as alias */\n  as?: InputMaybe<Scalars['String']['input']>;\n  performer_id: Scalars['ID']['input'];\n};\n\nexport type PerformerCreateInput = {\n  aliases?: InputMaybe<Array<Scalars['String']['input']>>;\n  band_size?: InputMaybe<Scalars['Int']['input']>;\n  birthdate?: InputMaybe<Scalars['String']['input']>;\n  breast_type?: InputMaybe<BreastTypeEnum>;\n  career_end_year?: InputMaybe<Scalars['Int']['input']>;\n  career_start_year?: InputMaybe<Scalars['Int']['input']>;\n  country?: InputMaybe<Scalars['String']['input']>;\n  cup_size?: InputMaybe<Scalars['String']['input']>;\n  deathdate?: InputMaybe<Scalars['String']['input']>;\n  disambiguation?: InputMaybe<Scalars['String']['input']>;\n  draft_id?: InputMaybe<Scalars['ID']['input']>;\n  ethnicity?: InputMaybe<EthnicityEnum>;\n  eye_color?: InputMaybe<EyeColorEnum>;\n  gender?: InputMaybe<GenderEnum>;\n  hair_color?: InputMaybe<HairColorEnum>;\n  height?: InputMaybe<Scalars['Int']['input']>;\n  hip_size?: InputMaybe<Scalars['Int']['input']>;\n  image_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n  name: Scalars['String']['input'];\n  piercings?: InputMaybe<Array<BodyModificationInput>>;\n  tattoos?: InputMaybe<Array<BodyModificationInput>>;\n  urls?: InputMaybe<Array<UrlInput>>;\n  waist_size?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type PerformerDestroyInput = {\n  id: Scalars['ID']['input'];\n};\n\nexport type PerformerDraft = {\n  __typename: 'PerformerDraft';\n  aliases?: Maybe<Scalars['String']['output']>;\n  birthdate?: Maybe<Scalars['String']['output']>;\n  breast_type?: Maybe<Scalars['String']['output']>;\n  career_end_year?: Maybe<Scalars['Int']['output']>;\n  career_start_year?: Maybe<Scalars['Int']['output']>;\n  country?: Maybe<Scalars['String']['output']>;\n  deathdate?: Maybe<Scalars['String']['output']>;\n  disambiguation?: Maybe<Scalars['String']['output']>;\n  ethnicity?: Maybe<Scalars['String']['output']>;\n  eye_color?: Maybe<Scalars['String']['output']>;\n  gender?: Maybe<Scalars['String']['output']>;\n  hair_color?: Maybe<Scalars['String']['output']>;\n  height?: Maybe<Scalars['String']['output']>;\n  id?: Maybe<Scalars['ID']['output']>;\n  image?: Maybe<Image>;\n  measurements?: Maybe<Scalars['String']['output']>;\n  name: Scalars['String']['output'];\n  piercings?: Maybe<Scalars['String']['output']>;\n  tattoos?: Maybe<Scalars['String']['output']>;\n  urls?: Maybe<Array<Scalars['String']['output']>>;\n};\n\nexport type PerformerDraftInput = {\n  aliases?: InputMaybe<Scalars['String']['input']>;\n  birthdate?: InputMaybe<Scalars['String']['input']>;\n  breast_type?: InputMaybe<Scalars['String']['input']>;\n  career_end_year?: InputMaybe<Scalars['Int']['input']>;\n  career_start_year?: InputMaybe<Scalars['Int']['input']>;\n  country?: InputMaybe<Scalars['String']['input']>;\n  deathdate?: InputMaybe<Scalars['String']['input']>;\n  disambiguation?: InputMaybe<Scalars['String']['input']>;\n  ethnicity?: InputMaybe<Scalars['String']['input']>;\n  eye_color?: InputMaybe<Scalars['String']['input']>;\n  gender?: InputMaybe<Scalars['String']['input']>;\n  hair_color?: InputMaybe<Scalars['String']['input']>;\n  height?: InputMaybe<Scalars['String']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n  image?: InputMaybe<Scalars['Upload']['input']>;\n  measurements?: InputMaybe<Scalars['String']['input']>;\n  name: Scalars['String']['input'];\n  piercings?: InputMaybe<Scalars['String']['input']>;\n  tattoos?: InputMaybe<Scalars['String']['input']>;\n  urls?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\nexport type PerformerEdit = {\n  __typename: 'PerformerEdit';\n  added_aliases?: Maybe<Array<Scalars['String']['output']>>;\n  added_images?: Maybe<Array<Image>>;\n  added_piercings?: Maybe<Array<BodyModification>>;\n  added_tattoos?: Maybe<Array<BodyModification>>;\n  added_urls?: Maybe<Array<Url>>;\n  aliases: Array<Scalars['String']['output']>;\n  band_size?: Maybe<Scalars['Int']['output']>;\n  birthdate?: Maybe<Scalars['String']['output']>;\n  breast_type?: Maybe<BreastTypeEnum>;\n  career_end_year?: Maybe<Scalars['Int']['output']>;\n  career_start_year?: Maybe<Scalars['Int']['output']>;\n  country?: Maybe<Scalars['String']['output']>;\n  cup_size?: Maybe<Scalars['String']['output']>;\n  deathdate?: Maybe<Scalars['String']['output']>;\n  disambiguation?: Maybe<Scalars['String']['output']>;\n  draft_id?: Maybe<Scalars['ID']['output']>;\n  ethnicity?: Maybe<EthnicityEnum>;\n  eye_color?: Maybe<EyeColorEnum>;\n  gender?: Maybe<GenderEnum>;\n  hair_color?: Maybe<HairColorEnum>;\n  /** Height in cm */\n  height?: Maybe<Scalars['Int']['output']>;\n  hip_size?: Maybe<Scalars['Int']['output']>;\n  images: Array<Image>;\n  name?: Maybe<Scalars['String']['output']>;\n  piercings: Array<BodyModification>;\n  removed_aliases?: Maybe<Array<Scalars['String']['output']>>;\n  removed_images?: Maybe<Array<Image>>;\n  removed_piercings?: Maybe<Array<BodyModification>>;\n  removed_tattoos?: Maybe<Array<BodyModification>>;\n  removed_urls?: Maybe<Array<Url>>;\n  tattoos: Array<BodyModification>;\n  urls: Array<Url>;\n  waist_size?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type PerformerEditDetailsInput = {\n  aliases?: InputMaybe<Array<Scalars['String']['input']>>;\n  band_size?: InputMaybe<Scalars['Int']['input']>;\n  birthdate?: InputMaybe<Scalars['String']['input']>;\n  breast_type?: InputMaybe<BreastTypeEnum>;\n  career_end_year?: InputMaybe<Scalars['Int']['input']>;\n  career_start_year?: InputMaybe<Scalars['Int']['input']>;\n  country?: InputMaybe<Scalars['String']['input']>;\n  cup_size?: InputMaybe<Scalars['String']['input']>;\n  deathdate?: InputMaybe<Scalars['String']['input']>;\n  disambiguation?: InputMaybe<Scalars['String']['input']>;\n  draft_id?: InputMaybe<Scalars['ID']['input']>;\n  ethnicity?: InputMaybe<EthnicityEnum>;\n  eye_color?: InputMaybe<EyeColorEnum>;\n  gender?: InputMaybe<GenderEnum>;\n  hair_color?: InputMaybe<HairColorEnum>;\n  height?: InputMaybe<Scalars['Int']['input']>;\n  hip_size?: InputMaybe<Scalars['Int']['input']>;\n  image_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n  name?: InputMaybe<Scalars['String']['input']>;\n  piercings?: InputMaybe<Array<BodyModificationInput>>;\n  tattoos?: InputMaybe<Array<BodyModificationInput>>;\n  urls?: InputMaybe<Array<UrlInput>>;\n  waist_size?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type PerformerEditInput = {\n  /** Not required for destroy type */\n  details?: InputMaybe<PerformerEditDetailsInput>;\n  edit: EditInput;\n  /** Controls aliases modification for merges and name modifications */\n  options?: InputMaybe<PerformerEditOptionsInput>;\n};\n\nexport type PerformerEditOptions = {\n  __typename: 'PerformerEditOptions';\n  /** Set performer alias on scenes attached to merge sources to old name */\n  set_merge_aliases: Scalars['Boolean']['output'];\n  /** Set performer alias on scenes without alias to old name if name is changed */\n  set_modify_aliases: Scalars['Boolean']['output'];\n};\n\nexport type PerformerEditOptionsInput = {\n  /** Set performer alias on scenes attached to merge sources to old name */\n  set_merge_aliases?: InputMaybe<Scalars['Boolean']['input']>;\n  /** Set performer alias on scenes without alias to old name if name is changed */\n  set_modify_aliases?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type PerformerQueryInput = {\n  age?: InputMaybe<IntCriterionInput>;\n  /** Search aliases only - assumes like query unless quoted */\n  alias?: InputMaybe<Scalars['String']['input']>;\n  band_size?: InputMaybe<IntCriterionInput>;\n  birth_year?: InputMaybe<IntCriterionInput>;\n  birthdate?: InputMaybe<DateCriterionInput>;\n  breast_type?: InputMaybe<BreastTypeCriterionInput>;\n  career_end_year?: InputMaybe<IntCriterionInput>;\n  career_start_year?: InputMaybe<IntCriterionInput>;\n  country?: InputMaybe<StringCriterionInput>;\n  cup_size?: InputMaybe<StringCriterionInput>;\n  deathdate?: InputMaybe<DateCriterionInput>;\n  direction?: SortDirectionEnum;\n  disambiguation?: InputMaybe<StringCriterionInput>;\n  ethnicity?: InputMaybe<EthnicityFilterEnum>;\n  eye_color?: InputMaybe<EyeColorCriterionInput>;\n  gender?: InputMaybe<GenderFilterEnum>;\n  hair_color?: InputMaybe<HairColorCriterionInput>;\n  height?: InputMaybe<IntCriterionInput>;\n  hip_size?: InputMaybe<IntCriterionInput>;\n  /** Filter by performerfavorite status for the current user */\n  is_favorite?: InputMaybe<Scalars['Boolean']['input']>;\n  /** Searches name only - assumes like query unless quoted */\n  name?: InputMaybe<Scalars['String']['input']>;\n  /** Searches name and disambiguation - assumes like query unless quoted */\n  names?: InputMaybe<Scalars['String']['input']>;\n  page?: Scalars['Int']['input'];\n  per_page?: Scalars['Int']['input'];\n  /** Filter by a performer they have performed in scenes with */\n  performed_with?: InputMaybe<Scalars['ID']['input']>;\n  piercings?: InputMaybe<BodyModificationCriterionInput>;\n  sort?: PerformerSortEnum;\n  /** Filter by a studio */\n  studio_id?: InputMaybe<Scalars['ID']['input']>;\n  tattoos?: InputMaybe<BodyModificationCriterionInput>;\n  /** Filter to search urls - assumes like query unless quoted */\n  url?: InputMaybe<Scalars['String']['input']>;\n  waist_size?: InputMaybe<IntCriterionInput>;\n};\n\nexport type PerformerScenesInput = {\n  /** Filter by another performer that also performs in the scenes */\n  performed_with?: InputMaybe<Scalars['ID']['input']>;\n  /** Filter by a studio */\n  studio_id?: InputMaybe<Scalars['ID']['input']>;\n  /** Filter by tags */\n  tags?: InputMaybe<MultiIdCriterionInput>;\n};\n\nexport type PerformerSearchFacets = {\n  __typename: 'PerformerSearchFacets';\n  genders: Array<GenderFacet>;\n};\n\nexport type PerformerSearchFilter = {\n  /** Filter by gender */\n  gender?: InputMaybe<GenderEnum>;\n};\n\nexport enum PerformerSortEnum {\n  BIRTHDATE = 'BIRTHDATE',\n  CAREER_START_YEAR = 'CAREER_START_YEAR',\n  CREATED_AT = 'CREATED_AT',\n  DEATHDATE = 'DEATHDATE',\n  DEBUT = 'DEBUT',\n  LAST_SCENE = 'LAST_SCENE',\n  NAME = 'NAME',\n  SCENE_COUNT = 'SCENE_COUNT',\n  UPDATED_AT = 'UPDATED_AT'\n}\n\nexport type PerformerStudio = {\n  __typename: 'PerformerStudio';\n  scene_count: Scalars['Int']['output'];\n  studio: Studio;\n};\n\nexport type PerformerUpdateInput = {\n  aliases?: InputMaybe<Array<Scalars['String']['input']>>;\n  band_size?: InputMaybe<Scalars['Int']['input']>;\n  birthdate?: InputMaybe<Scalars['String']['input']>;\n  breast_type?: InputMaybe<BreastTypeEnum>;\n  career_end_year?: InputMaybe<Scalars['Int']['input']>;\n  career_start_year?: InputMaybe<Scalars['Int']['input']>;\n  country?: InputMaybe<Scalars['String']['input']>;\n  cup_size?: InputMaybe<Scalars['String']['input']>;\n  deathdate?: InputMaybe<Scalars['String']['input']>;\n  disambiguation?: InputMaybe<Scalars['String']['input']>;\n  ethnicity?: InputMaybe<EthnicityEnum>;\n  eye_color?: InputMaybe<EyeColorEnum>;\n  gender?: InputMaybe<GenderEnum>;\n  hair_color?: InputMaybe<HairColorEnum>;\n  height?: InputMaybe<Scalars['Int']['input']>;\n  hip_size?: InputMaybe<Scalars['Int']['input']>;\n  id: Scalars['ID']['input'];\n  image_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n  name?: InputMaybe<Scalars['String']['input']>;\n  piercings?: InputMaybe<Array<BodyModificationInput>>;\n  tattoos?: InputMaybe<Array<BodyModificationInput>>;\n  urls?: InputMaybe<Array<UrlInput>>;\n  waist_size?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The query root for this schema */\nexport type Query = {\n  __typename: 'Query';\n  findDraft?: Maybe<Draft>;\n  findDrafts: Array<Draft>;\n  findEdit?: Maybe<Edit>;\n  /** Find a performer by ID */\n  findPerformer?: Maybe<Performer>;\n  /** Find a scene by ID */\n  findScene?: Maybe<Scene>;\n  /** Finds scenes that match a list of hashes */\n  findScenesBySceneFingerprints: Array<Array<Maybe<Scene>>>;\n  /** Find an external site by ID */\n  findSite?: Maybe<Site>;\n  /** Find a studio by ID or name */\n  findStudio?: Maybe<Studio>;\n  /** Find a tag by ID or name */\n  findTag?: Maybe<Tag>;\n  /** Find a tag category by ID */\n  findTagCategory?: Maybe<TagCategory>;\n  /** Find a tag with a matching name or alias */\n  findTagOrAlias?: Maybe<Tag>;\n  /** Find user by ID or username */\n  findUser?: Maybe<User>;\n  getConfig: StashBoxConfig;\n  getUnreadNotificationCount: Scalars['Int']['output'];\n  /** Returns currently authenticated user */\n  me?: Maybe<User>;\n  queryEdits: QueryEditsResultType;\n  queryExistingPerformer: QueryExistingPerformerResult;\n  queryExistingScene: QueryExistingSceneResult;\n  queryModAudits: QueryModAuditsResultType;\n  queryNotifications: QueryNotificationsResult;\n  queryPerformers: QueryPerformersResultType;\n  queryScenes: QueryScenesResultType;\n  querySites: QuerySitesResultType;\n  queryStudios: QueryStudiosResultType;\n  queryTagCategories: QueryTagCategoriesResultType;\n  queryTags: QueryTagsResultType;\n  queryUsers: QueryUsersResultType;\n  /** @deprecated Use searchPerformers */\n  searchPerformer: Array<Performer>;\n  searchPerformers: QueryPerformersResultType;\n  /** @deprecated Use searchScenes */\n  searchScene: Array<Scene>;\n  searchScenes: QueryScenesResultType;\n  searchStudio: Array<Studio>;\n  searchTag: Array<Tag>;\n  version: Version;\n};\n\n\n/** The query root for this schema */\nexport type QueryFindDraftArgs = {\n  id: Scalars['ID']['input'];\n};\n\n\n/** The query root for this schema */\nexport type QueryFindEditArgs = {\n  id: Scalars['ID']['input'];\n};\n\n\n/** The query root for this schema */\nexport type QueryFindPerformerArgs = {\n  id: Scalars['ID']['input'];\n};\n\n\n/** The query root for this schema */\nexport type QueryFindSceneArgs = {\n  id: Scalars['ID']['input'];\n};\n\n\n/** The query root for this schema */\nexport type QueryFindScenesBySceneFingerprintsArgs = {\n  fingerprints: Array<Array<FingerprintQueryInput>>;\n};\n\n\n/** The query root for this schema */\nexport type QueryFindSiteArgs = {\n  id: Scalars['ID']['input'];\n};\n\n\n/** The query root for this schema */\nexport type QueryFindStudioArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  name?: InputMaybe<Scalars['String']['input']>;\n};\n\n\n/** The query root for this schema */\nexport type QueryFindTagArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  name?: InputMaybe<Scalars['String']['input']>;\n};\n\n\n/** The query root for this schema */\nexport type QueryFindTagCategoryArgs = {\n  id: Scalars['ID']['input'];\n};\n\n\n/** The query root for this schema */\nexport type QueryFindTagOrAliasArgs = {\n  name: Scalars['String']['input'];\n};\n\n\n/** The query root for this schema */\nexport type QueryFindUserArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  username?: InputMaybe<Scalars['String']['input']>;\n};\n\n\n/** The query root for this schema */\nexport type QueryQueryEditsArgs = {\n  input: EditQueryInput;\n};\n\n\n/** The query root for this schema */\nexport type QueryQueryExistingPerformerArgs = {\n  input: QueryExistingPerformerInput;\n};\n\n\n/** The query root for this schema */\nexport type QueryQueryExistingSceneArgs = {\n  input: QueryExistingSceneInput;\n};\n\n\n/** The query root for this schema */\nexport type QueryQueryModAuditsArgs = {\n  input: ModAuditQueryInput;\n};\n\n\n/** The query root for this schema */\nexport type QueryQueryNotificationsArgs = {\n  input: QueryNotificationsInput;\n};\n\n\n/** The query root for this schema */\nexport type QueryQueryPerformersArgs = {\n  input: PerformerQueryInput;\n};\n\n\n/** The query root for this schema */\nexport type QueryQueryScenesArgs = {\n  input: SceneQueryInput;\n};\n\n\n/** The query root for this schema */\nexport type QueryQueryStudiosArgs = {\n  input: StudioQueryInput;\n};\n\n\n/** The query root for this schema */\nexport type QueryQueryTagsArgs = {\n  input: TagQueryInput;\n};\n\n\n/** The query root for this schema */\nexport type QueryQueryUsersArgs = {\n  input: UserQueryInput;\n};\n\n\n/** The query root for this schema */\nexport type QuerySearchPerformerArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  term: Scalars['String']['input'];\n};\n\n\n/** The query root for this schema */\nexport type QuerySearchPerformersArgs = {\n  filter?: InputMaybe<PerformerSearchFilter>;\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  page?: InputMaybe<Scalars['Int']['input']>;\n  per_page?: InputMaybe<Scalars['Int']['input']>;\n  term: Scalars['String']['input'];\n};\n\n\n/** The query root for this schema */\nexport type QuerySearchSceneArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  term: Scalars['String']['input'];\n};\n\n\n/** The query root for this schema */\nexport type QuerySearchScenesArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  page?: InputMaybe<Scalars['Int']['input']>;\n  per_page?: InputMaybe<Scalars['Int']['input']>;\n  term: Scalars['String']['input'];\n};\n\n\n/** The query root for this schema */\nexport type QuerySearchStudioArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  term: Scalars['String']['input'];\n};\n\n\n/** The query root for this schema */\nexport type QuerySearchTagArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  term: Scalars['String']['input'];\n};\n\nexport type QueryEditsResultType = {\n  __typename: 'QueryEditsResultType';\n  count: Scalars['Int']['output'];\n  edits: Array<Edit>;\n};\n\nexport type QueryExistingPerformerInput = {\n  disambiguation?: InputMaybe<Scalars['String']['input']>;\n  name?: InputMaybe<Scalars['String']['input']>;\n  urls: Array<Scalars['String']['input']>;\n};\n\nexport type QueryExistingPerformerResult = {\n  __typename: 'QueryExistingPerformerResult';\n  edits: Array<Edit>;\n  performers: Array<Performer>;\n};\n\nexport type QueryExistingSceneInput = {\n  fingerprints: Array<FingerprintInput>;\n  studio_id?: InputMaybe<Scalars['ID']['input']>;\n  title?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type QueryExistingSceneResult = {\n  __typename: 'QueryExistingSceneResult';\n  edits: Array<Edit>;\n  scenes: Array<Scene>;\n};\n\nexport type QueryModAuditsResultType = {\n  __typename: 'QueryModAuditsResultType';\n  audits: Array<ModAudit>;\n  count: Scalars['Int']['output'];\n};\n\nexport type QueryNotificationsInput = {\n  page?: Scalars['Int']['input'];\n  per_page?: Scalars['Int']['input'];\n  type?: InputMaybe<NotificationEnum>;\n  unread_only?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type QueryNotificationsResult = {\n  __typename: 'QueryNotificationsResult';\n  count: Scalars['Int']['output'];\n  notifications: Array<Notification>;\n};\n\nexport type QueryPerformersResultType = {\n  __typename: 'QueryPerformersResultType';\n  count: Scalars['Int']['output'];\n  /** Search facets, only available for searchPerformer queries */\n  facets?: Maybe<PerformerSearchFacets>;\n  performers: Array<Performer>;\n};\n\nexport type QueryScenesResultType = {\n  __typename: 'QueryScenesResultType';\n  count: Scalars['Int']['output'];\n  scenes: Array<Scene>;\n};\n\nexport type QuerySitesResultType = {\n  __typename: 'QuerySitesResultType';\n  count: Scalars['Int']['output'];\n  sites: Array<Site>;\n};\n\nexport type QueryStudiosResultType = {\n  __typename: 'QueryStudiosResultType';\n  count: Scalars['Int']['output'];\n  studios: Array<Studio>;\n};\n\nexport type QueryTagCategoriesResultType = {\n  __typename: 'QueryTagCategoriesResultType';\n  count: Scalars['Int']['output'];\n  tag_categories: Array<TagCategory>;\n};\n\nexport type QueryTagsResultType = {\n  __typename: 'QueryTagsResultType';\n  count: Scalars['Int']['output'];\n  tags: Array<Tag>;\n};\n\nexport type QueryUsersResultType = {\n  __typename: 'QueryUsersResultType';\n  count: Scalars['Int']['output'];\n  users: Array<User>;\n};\n\nexport type ResetPasswordInput = {\n  email: Scalars['String']['input'];\n};\n\nexport type RevokeInviteInput = {\n  amount: Scalars['Int']['input'];\n  user_id: Scalars['ID']['input'];\n};\n\nexport type RoleCriterionInput = {\n  modifier: CriterionModifier;\n  value: Array<RoleEnum>;\n};\n\nexport enum RoleEnum {\n  ADMIN = 'ADMIN',\n  BOT = 'BOT',\n  EDIT = 'EDIT',\n  EDIT_TAGS = 'EDIT_TAGS',\n  /** May generate invites without tokens */\n  INVITE = 'INVITE',\n  /** May grant and rescind invite tokens and resind invite keys */\n  MANAGE_INVITES = 'MANAGE_INVITES',\n  MODERATE = 'MODERATE',\n  MODIFY = 'MODIFY',\n  READ = 'READ',\n  READ_ONLY = 'READ_ONLY',\n  VOTE = 'VOTE'\n}\n\nexport type Scene = {\n  __typename: 'Scene';\n  code?: Maybe<Scalars['String']['output']>;\n  created: Scalars['Time']['output'];\n  /** @deprecated Please use `release_date` instead */\n  date?: Maybe<Scalars['String']['output']>;\n  deleted: Scalars['Boolean']['output'];\n  details?: Maybe<Scalars['String']['output']>;\n  director?: Maybe<Scalars['String']['output']>;\n  duration?: Maybe<Scalars['Int']['output']>;\n  edits: Array<Edit>;\n  fingerprints: Array<Fingerprint>;\n  id: Scalars['ID']['output'];\n  images: Array<Image>;\n  performers: Array<PerformerAppearance>;\n  production_date?: Maybe<Scalars['String']['output']>;\n  release_date?: Maybe<Scalars['String']['output']>;\n  studio?: Maybe<Studio>;\n  tags: Array<Tag>;\n  title?: Maybe<Scalars['String']['output']>;\n  updated: Scalars['Time']['output'];\n  urls: Array<Url>;\n};\n\n\nexport type SceneFingerprintsArgs = {\n  is_submitted?: InputMaybe<Scalars['Boolean']['input']>;\n};\n\nexport type SceneCreateInput = {\n  code?: InputMaybe<Scalars['String']['input']>;\n  date: Scalars['String']['input'];\n  details?: InputMaybe<Scalars['String']['input']>;\n  director?: InputMaybe<Scalars['String']['input']>;\n  duration?: InputMaybe<Scalars['Int']['input']>;\n  fingerprints: Array<FingerprintEditInput>;\n  image_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n  performers?: InputMaybe<Array<PerformerAppearanceInput>>;\n  production_date?: InputMaybe<Scalars['String']['input']>;\n  studio_id?: InputMaybe<Scalars['ID']['input']>;\n  tag_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n  title?: InputMaybe<Scalars['String']['input']>;\n  urls?: InputMaybe<Array<UrlInput>>;\n};\n\nexport type SceneDestroyInput = {\n  id: Scalars['ID']['input'];\n};\n\nexport type SceneDraft = {\n  __typename: 'SceneDraft';\n  code?: Maybe<Scalars['String']['output']>;\n  date?: Maybe<Scalars['String']['output']>;\n  details?: Maybe<Scalars['String']['output']>;\n  director?: Maybe<Scalars['String']['output']>;\n  fingerprints: Array<DraftFingerprint>;\n  id?: Maybe<Scalars['ID']['output']>;\n  image?: Maybe<Image>;\n  performers: Array<SceneDraftPerformer>;\n  production_date?: Maybe<Scalars['String']['output']>;\n  studio?: Maybe<SceneDraftStudio>;\n  tags?: Maybe<Array<SceneDraftTag>>;\n  title?: Maybe<Scalars['String']['output']>;\n  urls?: Maybe<Array<Scalars['String']['output']>>;\n};\n\nexport type SceneDraftInput = {\n  code?: InputMaybe<Scalars['String']['input']>;\n  date?: InputMaybe<Scalars['String']['input']>;\n  details?: InputMaybe<Scalars['String']['input']>;\n  director?: InputMaybe<Scalars['String']['input']>;\n  fingerprints: Array<FingerprintInput>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n  image?: InputMaybe<Scalars['Upload']['input']>;\n  performers: Array<DraftEntityInput>;\n  production_date?: InputMaybe<Scalars['String']['input']>;\n  studio?: InputMaybe<DraftEntityInput>;\n  tags?: InputMaybe<Array<DraftEntityInput>>;\n  title?: InputMaybe<Scalars['String']['input']>;\n  /** @deprecated Use urls field instead. */\n  url?: InputMaybe<Scalars['String']['input']>;\n  urls?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\nexport type SceneDraftPerformer = DraftEntity | Performer;\n\nexport type SceneDraftStudio = DraftEntity | Studio;\n\nexport type SceneDraftTag = DraftEntity | Tag;\n\nexport type SceneEdit = {\n  __typename: 'SceneEdit';\n  added_fingerprints?: Maybe<Array<Fingerprint>>;\n  added_images?: Maybe<Array<Image>>;\n  /** Added or modified performer appearance entries */\n  added_performers?: Maybe<Array<PerformerAppearance>>;\n  added_tags?: Maybe<Array<Tag>>;\n  added_urls?: Maybe<Array<Url>>;\n  code?: Maybe<Scalars['String']['output']>;\n  date?: Maybe<Scalars['String']['output']>;\n  details?: Maybe<Scalars['String']['output']>;\n  director?: Maybe<Scalars['String']['output']>;\n  draft_id?: Maybe<Scalars['ID']['output']>;\n  duration?: Maybe<Scalars['Int']['output']>;\n  fingerprints: Array<Fingerprint>;\n  images: Array<Image>;\n  performers: Array<PerformerAppearance>;\n  production_date?: Maybe<Scalars['String']['output']>;\n  removed_fingerprints?: Maybe<Array<Fingerprint>>;\n  removed_images?: Maybe<Array<Image>>;\n  removed_performers?: Maybe<Array<PerformerAppearance>>;\n  removed_tags?: Maybe<Array<Tag>>;\n  removed_urls?: Maybe<Array<Url>>;\n  studio?: Maybe<Studio>;\n  tags: Array<Tag>;\n  title?: Maybe<Scalars['String']['output']>;\n  urls: Array<Url>;\n};\n\nexport type SceneEditDetailsInput = {\n  code?: InputMaybe<Scalars['String']['input']>;\n  date?: InputMaybe<Scalars['String']['input']>;\n  details?: InputMaybe<Scalars['String']['input']>;\n  director?: InputMaybe<Scalars['String']['input']>;\n  draft_id?: InputMaybe<Scalars['ID']['input']>;\n  duration?: InputMaybe<Scalars['Int']['input']>;\n  fingerprints?: InputMaybe<Array<FingerprintInput>>;\n  image_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n  performers?: InputMaybe<Array<PerformerAppearanceInput>>;\n  production_date?: InputMaybe<Scalars['String']['input']>;\n  studio_id?: InputMaybe<Scalars['ID']['input']>;\n  tag_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n  title?: InputMaybe<Scalars['String']['input']>;\n  urls?: InputMaybe<Array<UrlInput>>;\n};\n\nexport type SceneEditInput = {\n  /** Not required for destroy type */\n  details?: InputMaybe<SceneEditDetailsInput>;\n  edit: EditInput;\n};\n\nexport type SceneQueryInput = {\n  /** Filter to include scenes with performer appearing as alias */\n  alias?: InputMaybe<StringCriterionInput>;\n  /** Filter by date */\n  date?: InputMaybe<DateCriterionInput>;\n  direction?: SortDirectionEnum;\n  /** Filter by favorited entity */\n  favorites?: InputMaybe<FavoriteFilter>;\n  /** Filter to only include scenes with these fingerprints */\n  fingerprints?: InputMaybe<MultiStringCriterionInput>;\n  /** Filter to scenes with fingerprints submitted by the user */\n  has_fingerprint_submissions?: InputMaybe<Scalars['Boolean']['input']>;\n  page?: Scalars['Int']['input'];\n  /** Filter to only include scenes with this studio as primary or parent */\n  parentStudio?: InputMaybe<Scalars['String']['input']>;\n  per_page?: Scalars['Int']['input'];\n  /** Filter to only include scenes with these performers */\n  performers?: InputMaybe<MultiIdCriterionInput>;\n  /** Filter by production date */\n  production_date?: InputMaybe<DateCriterionInput>;\n  sort?: SceneSortEnum;\n  /** Filter to only include scenes with this studio */\n  studios?: InputMaybe<MultiIdCriterionInput>;\n  /** Filter to only include scenes with these tags */\n  tags?: InputMaybe<MultiIdCriterionInput>;\n  /** Filter to search title and details - assumes like query unless quoted */\n  text?: InputMaybe<Scalars['String']['input']>;\n  /** Filter to search title - assumes like query unless quoted */\n  title?: InputMaybe<Scalars['String']['input']>;\n  /** Filter to search urls - assumes like query unless quoted */\n  url?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport enum SceneSortEnum {\n  CREATED_AT = 'CREATED_AT',\n  DATE = 'DATE',\n  TITLE = 'TITLE',\n  TRENDING = 'TRENDING',\n  UPDATED_AT = 'UPDATED_AT'\n}\n\nexport type SceneUpdateInput = {\n  code?: InputMaybe<Scalars['String']['input']>;\n  date?: InputMaybe<Scalars['String']['input']>;\n  details?: InputMaybe<Scalars['String']['input']>;\n  director?: InputMaybe<Scalars['String']['input']>;\n  duration?: InputMaybe<Scalars['Int']['input']>;\n  fingerprints?: InputMaybe<Array<FingerprintEditInput>>;\n  id: Scalars['ID']['input'];\n  image_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n  performers?: InputMaybe<Array<PerformerAppearanceInput>>;\n  production_date?: InputMaybe<Scalars['String']['input']>;\n  studio_id?: InputMaybe<Scalars['ID']['input']>;\n  tag_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n  title?: InputMaybe<Scalars['String']['input']>;\n  urls?: InputMaybe<Array<UrlInput>>;\n};\n\nexport type Site = {\n  __typename: 'Site';\n  created: Scalars['Time']['output'];\n  description?: Maybe<Scalars['String']['output']>;\n  icon: Scalars['String']['output'];\n  id: Scalars['ID']['output'];\n  name: Scalars['String']['output'];\n  regex?: Maybe<Scalars['String']['output']>;\n  updated: Scalars['Time']['output'];\n  url?: Maybe<Scalars['String']['output']>;\n  valid_types: Array<ValidSiteTypeEnum>;\n};\n\nexport type SiteCreateInput = {\n  description?: InputMaybe<Scalars['String']['input']>;\n  name: Scalars['String']['input'];\n  regex?: InputMaybe<Scalars['String']['input']>;\n  url?: InputMaybe<Scalars['String']['input']>;\n  valid_types: Array<ValidSiteTypeEnum>;\n};\n\nexport type SiteDestroyInput = {\n  id: Scalars['ID']['input'];\n};\n\nexport type SiteUpdateInput = {\n  description?: InputMaybe<Scalars['String']['input']>;\n  id: Scalars['ID']['input'];\n  name: Scalars['String']['input'];\n  regex?: InputMaybe<Scalars['String']['input']>;\n  url?: InputMaybe<Scalars['String']['input']>;\n  valid_types: Array<ValidSiteTypeEnum>;\n};\n\nexport enum SortDirectionEnum {\n  ASC = 'ASC',\n  DESC = 'DESC'\n}\n\nexport type StashBoxConfig = {\n  __typename: 'StashBoxConfig';\n  edit_update_limit: Scalars['Int']['output'];\n  guidelines_url: Scalars['String']['output'];\n  host_url: Scalars['String']['output'];\n  min_destructive_voting_period: Scalars['Int']['output'];\n  require_activation: Scalars['Boolean']['output'];\n  require_invite: Scalars['Boolean']['output'];\n  require_scene_draft: Scalars['Boolean']['output'];\n  require_tag_role: Scalars['Boolean']['output'];\n  vote_application_threshold: Scalars['Int']['output'];\n  vote_cron_interval: Scalars['String']['output'];\n  vote_promotion_threshold?: Maybe<Scalars['Int']['output']>;\n  voting_period: Scalars['Int']['output'];\n};\n\nexport type StringCriterionInput = {\n  modifier: CriterionModifier;\n  value: Scalars['String']['input'];\n};\n\nexport type Studio = {\n  __typename: 'Studio';\n  aliases: Array<Scalars['String']['output']>;\n  /** @deprecated Use sub_studios instead */\n  child_studios: Array<Studio>;\n  created: Scalars['Time']['output'];\n  deleted: Scalars['Boolean']['output'];\n  id: Scalars['ID']['output'];\n  images: Array<Image>;\n  is_favorite: Scalars['Boolean']['output'];\n  name: Scalars['String']['output'];\n  parent?: Maybe<Studio>;\n  performers: QueryPerformersResultType;\n  sub_studios: QueryStudiosResultType;\n  updated: Scalars['Time']['output'];\n  urls: Array<Url>;\n};\n\n\nexport type StudioPerformersArgs = {\n  input: PerformerQueryInput;\n};\n\n\nexport type StudioSub_StudiosArgs = {\n  input?: InputMaybe<StudioQueryInput>;\n};\n\nexport type StudioCreateInput = {\n  aliases?: InputMaybe<Array<Scalars['String']['input']>>;\n  image_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n  name: Scalars['String']['input'];\n  parent_id?: InputMaybe<Scalars['ID']['input']>;\n  urls?: InputMaybe<Array<UrlInput>>;\n};\n\nexport type StudioDestroyInput = {\n  id: Scalars['ID']['input'];\n};\n\nexport type StudioEdit = {\n  __typename: 'StudioEdit';\n  added_aliases?: Maybe<Array<Scalars['String']['output']>>;\n  added_images?: Maybe<Array<Image>>;\n  /** Added and modified URLs */\n  added_urls?: Maybe<Array<Url>>;\n  images: Array<Image>;\n  name?: Maybe<Scalars['String']['output']>;\n  parent?: Maybe<Studio>;\n  removed_aliases?: Maybe<Array<Scalars['String']['output']>>;\n  removed_images?: Maybe<Array<Image>>;\n  removed_urls?: Maybe<Array<Url>>;\n  urls: Array<Url>;\n};\n\nexport type StudioEditDetailsInput = {\n  aliases?: InputMaybe<Array<Scalars['String']['input']>>;\n  image_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n  name?: InputMaybe<Scalars['String']['input']>;\n  parent_id?: InputMaybe<Scalars['ID']['input']>;\n  urls?: InputMaybe<Array<UrlInput>>;\n};\n\nexport type StudioEditInput = {\n  /** Not required for destroy type */\n  details?: InputMaybe<StudioEditDetailsInput>;\n  edit: EditInput;\n};\n\nexport type StudioQueryInput = {\n  direction?: SortDirectionEnum;\n  has_parent?: InputMaybe<Scalars['Boolean']['input']>;\n  /** Filter by studio favorite status for the current user */\n  is_favorite?: InputMaybe<Scalars['Boolean']['input']>;\n  /** Filter to search name - assumes like query unless quoted */\n  name?: InputMaybe<Scalars['String']['input']>;\n  /** Filter to search studio name, aliases and parent studio name - assumes like query unless quoted */\n  names?: InputMaybe<Scalars['String']['input']>;\n  page?: Scalars['Int']['input'];\n  parent?: InputMaybe<IdCriterionInput>;\n  per_page?: Scalars['Int']['input'];\n  sort?: StudioSortEnum;\n  /** Filter to search url - assumes like query unless quoted */\n  url?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport enum StudioSortEnum {\n  CREATED_AT = 'CREATED_AT',\n  NAME = 'NAME',\n  UPDATED_AT = 'UPDATED_AT'\n}\n\nexport type StudioUpdateInput = {\n  aliases?: InputMaybe<Array<Scalars['String']['input']>>;\n  id: Scalars['ID']['input'];\n  image_ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n  name?: InputMaybe<Scalars['String']['input']>;\n  parent_id?: InputMaybe<Scalars['ID']['input']>;\n  urls?: InputMaybe<Array<UrlInput>>;\n};\n\nexport type Tag = {\n  __typename: 'Tag';\n  aliases: Array<Scalars['String']['output']>;\n  category?: Maybe<TagCategory>;\n  created: Scalars['Time']['output'];\n  deleted: Scalars['Boolean']['output'];\n  description?: Maybe<Scalars['String']['output']>;\n  edits: Array<Edit>;\n  id: Scalars['ID']['output'];\n  name: Scalars['String']['output'];\n  updated: Scalars['Time']['output'];\n};\n\nexport type TagCategory = {\n  __typename: 'TagCategory';\n  description?: Maybe<Scalars['String']['output']>;\n  group: TagGroupEnum;\n  id: Scalars['ID']['output'];\n  name: Scalars['String']['output'];\n};\n\nexport type TagCategoryCreateInput = {\n  description?: InputMaybe<Scalars['String']['input']>;\n  group: TagGroupEnum;\n  name: Scalars['String']['input'];\n};\n\nexport type TagCategoryDestroyInput = {\n  id: Scalars['ID']['input'];\n};\n\nexport type TagCategoryUpdateInput = {\n  description?: InputMaybe<Scalars['String']['input']>;\n  group?: InputMaybe<TagGroupEnum>;\n  id: Scalars['ID']['input'];\n  name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type TagCreateInput = {\n  aliases?: InputMaybe<Array<Scalars['String']['input']>>;\n  category_id?: InputMaybe<Scalars['ID']['input']>;\n  description?: InputMaybe<Scalars['String']['input']>;\n  name: Scalars['String']['input'];\n};\n\nexport type TagDestroyInput = {\n  id: Scalars['ID']['input'];\n};\n\nexport type TagEdit = {\n  __typename: 'TagEdit';\n  added_aliases?: Maybe<Array<Scalars['String']['output']>>;\n  aliases: Array<Scalars['String']['output']>;\n  category?: Maybe<TagCategory>;\n  description?: Maybe<Scalars['String']['output']>;\n  name?: Maybe<Scalars['String']['output']>;\n  removed_aliases?: Maybe<Array<Scalars['String']['output']>>;\n};\n\nexport type TagEditDetailsInput = {\n  aliases?: InputMaybe<Array<Scalars['String']['input']>>;\n  category_id?: InputMaybe<Scalars['ID']['input']>;\n  description?: InputMaybe<Scalars['String']['input']>;\n  name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type TagEditInput = {\n  /** Not required for destroy type */\n  details?: InputMaybe<TagEditDetailsInput>;\n  edit: EditInput;\n};\n\nexport enum TagGroupEnum {\n  ACTION = 'ACTION',\n  PEOPLE = 'PEOPLE',\n  SCENE = 'SCENE'\n}\n\nexport type TagQueryInput = {\n  /** Filter to category ID */\n  category_id?: InputMaybe<Scalars['ID']['input']>;\n  direction?: SortDirectionEnum;\n  /** Filter to search name - assumes like query unless quoted */\n  name?: InputMaybe<Scalars['String']['input']>;\n  /** Searches name and aliases - assumes like query unless quoted */\n  names?: InputMaybe<Scalars['String']['input']>;\n  page?: Scalars['Int']['input'];\n  per_page?: Scalars['Int']['input'];\n  sort?: TagSortEnum;\n  /** Filter to search name, aliases and description - assumes like query unless quoted */\n  text?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport enum TagSortEnum {\n  CREATED_AT = 'CREATED_AT',\n  NAME = 'NAME',\n  UPDATED_AT = 'UPDATED_AT'\n}\n\nexport type TagUpdateInput = {\n  aliases?: InputMaybe<Array<Scalars['String']['input']>>;\n  category_id?: InputMaybe<Scalars['ID']['input']>;\n  description?: InputMaybe<Scalars['String']['input']>;\n  id: Scalars['ID']['input'];\n  name?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport enum TargetTypeEnum {\n  PERFORMER = 'PERFORMER',\n  SCENE = 'SCENE',\n  STUDIO = 'STUDIO',\n  TAG = 'TAG'\n}\n\nexport type Url = {\n  __typename: 'URL';\n  site: Site;\n  /** @deprecated Use the site field instead */\n  type: Scalars['String']['output'];\n  url: Scalars['String']['output'];\n};\n\nexport type UrlInput = {\n  site_id: Scalars['ID']['input'];\n  url: Scalars['String']['input'];\n};\n\nexport type UpdatedEdit = {\n  __typename: 'UpdatedEdit';\n  edit: Edit;\n};\n\nexport type User = {\n  __typename: 'User';\n  /** @deprecated Use invite_codes instead */\n  active_invite_codes?: Maybe<Array<Scalars['String']['output']>>;\n  /** Calls to the API from this user over a configurable time period */\n  api_calls: Scalars['Int']['output'];\n  /** Should not be visible to other users */\n  api_key?: Maybe<Scalars['String']['output']>;\n  /**  Edit counts by status  */\n  edit_count: UserEditCount;\n  /** Should not be visible to other users */\n  email?: Maybe<Scalars['String']['output']>;\n  id: Scalars['ID']['output'];\n  invite_codes?: Maybe<Array<InviteKey>>;\n  invite_tokens?: Maybe<Scalars['Int']['output']>;\n  invited_by?: Maybe<User>;\n  name: Scalars['String']['output'];\n  notification_subscriptions: Array<NotificationEnum>;\n  /** Should not be visible to other users */\n  roles?: Maybe<Array<RoleEnum>>;\n  /**  Vote counts by type  */\n  vote_count: UserVoteCount;\n};\n\nexport type UserChangeEmailInput = {\n  existing_email_token?: InputMaybe<Scalars['ID']['input']>;\n  new_email?: InputMaybe<Scalars['String']['input']>;\n  new_email_token?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport enum UserChangeEmailStatus {\n  CONFIRM_NEW = 'CONFIRM_NEW',\n  CONFIRM_OLD = 'CONFIRM_OLD',\n  ERROR = 'ERROR',\n  EXPIRED = 'EXPIRED',\n  INVALID_TOKEN = 'INVALID_TOKEN',\n  SUCCESS = 'SUCCESS'\n}\n\nexport type UserChangePasswordInput = {\n  /** Password in plain text */\n  existing_password?: InputMaybe<Scalars['String']['input']>;\n  new_password: Scalars['String']['input'];\n  reset_key?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type UserCreateInput = {\n  email: Scalars['String']['input'];\n  invited_by_id?: InputMaybe<Scalars['ID']['input']>;\n  name: Scalars['String']['input'];\n  /** Password in plain text */\n  password: Scalars['String']['input'];\n  roles: Array<RoleEnum>;\n};\n\nexport type UserDestroyInput = {\n  id: Scalars['ID']['input'];\n};\n\nexport type UserEditCount = {\n  __typename: 'UserEditCount';\n  accepted: Scalars['Int']['output'];\n  canceled: Scalars['Int']['output'];\n  failed: Scalars['Int']['output'];\n  immediate_accepted: Scalars['Int']['output'];\n  immediate_rejected: Scalars['Int']['output'];\n  pending: Scalars['Int']['output'];\n  rejected: Scalars['Int']['output'];\n};\n\nexport type UserQueryInput = {\n  /** Filter by api key */\n  apiKey?: InputMaybe<Scalars['String']['input']>;\n  /** Filter by number of API calls */\n  api_calls?: InputMaybe<IntCriterionInput>;\n  /** Filter to search email - assumes like query unless quoted */\n  email?: InputMaybe<Scalars['String']['input']>;\n  /** Filter by user that invited */\n  invited_by?: InputMaybe<Scalars['ID']['input']>;\n  /** Filter to search user name - assumes like query unless quoted */\n  name?: InputMaybe<Scalars['String']['input']>;\n  page?: Scalars['Int']['input'];\n  per_page?: Scalars['Int']['input'];\n  /** Filter by roles */\n  roles?: InputMaybe<RoleCriterionInput>;\n  /** Filter by successful edits */\n  successful_edits?: InputMaybe<IntCriterionInput>;\n  /** Filter by votes on successful edits */\n  successful_votes?: InputMaybe<IntCriterionInput>;\n  /** Filter by unsuccessful edits */\n  unsuccessful_edits?: InputMaybe<IntCriterionInput>;\n  /** Filter by votes on unsuccessful edits */\n  unsuccessful_votes?: InputMaybe<IntCriterionInput>;\n};\n\nexport type UserUpdateInput = {\n  email?: InputMaybe<Scalars['String']['input']>;\n  id: Scalars['ID']['input'];\n  name?: InputMaybe<Scalars['String']['input']>;\n  /** Password in plain text */\n  password?: InputMaybe<Scalars['String']['input']>;\n  roles?: InputMaybe<Array<RoleEnum>>;\n};\n\nexport type UserVoteCount = {\n  __typename: 'UserVoteCount';\n  abstain: Scalars['Int']['output'];\n  accept: Scalars['Int']['output'];\n  immediate_accept: Scalars['Int']['output'];\n  immediate_reject: Scalars['Int']['output'];\n  reject: Scalars['Int']['output'];\n};\n\nexport enum UserVotedFilterEnum {\n  ABSTAIN = 'ABSTAIN',\n  ACCEPT = 'ACCEPT',\n  NOT_VOTED = 'NOT_VOTED',\n  REJECT = 'REJECT'\n}\n\nexport enum ValidSiteTypeEnum {\n  PERFORMER = 'PERFORMER',\n  SCENE = 'SCENE',\n  STUDIO = 'STUDIO'\n}\n\nexport type Version = {\n  __typename: 'Version';\n  build_time: Scalars['String']['output'];\n  build_type: Scalars['String']['output'];\n  hash: Scalars['String']['output'];\n  version: Scalars['String']['output'];\n};\n\nexport enum VoteStatusEnum {\n  ACCEPTED = 'ACCEPTED',\n  CANCELED = 'CANCELED',\n  FAILED = 'FAILED',\n  IMMEDIATE_ACCEPTED = 'IMMEDIATE_ACCEPTED',\n  IMMEDIATE_REJECTED = 'IMMEDIATE_REJECTED',\n  PENDING = 'PENDING',\n  REJECTED = 'REJECTED'\n}\n\nexport enum VoteTypeEnum {\n  ABSTAIN = 'ABSTAIN',\n  ACCEPT = 'ACCEPT',\n  /** Immediately accepts the edit - bypassing the vote */\n  IMMEDIATE_ACCEPT = 'IMMEDIATE_ACCEPT',\n  /** Immediately rejects the edit - bypassing the vote */\n  IMMEDIATE_REJECT = 'IMMEDIATE_REJECT',\n  REJECT = 'REJECT'\n}\n\nexport type CommentFragment = { __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null };\n\nexport type EditFragment = { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n    | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n    | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n    | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n    | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n   | null, details?:\n    | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n    | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n    | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n    | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n   | null, old_details?:\n    | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n    | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n    | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n    | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n   | null, merge_sources: Array<\n    | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n    | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n    | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n    | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n  >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null };\n\nexport type FingerprintFragment = { __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number };\n\nexport type ImageFragment = { __typename: 'Image', id: string, url: string, width: number, height: number };\n\nexport type PerformerFragment = { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> };\n\nexport type QuerySceneFragment = { __typename: 'Scene', id: string, release_date?: string | null, title?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }> };\n\nexport type SceneFragment = { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> };\n\nexport type ScenePerformerFragment = { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> };\n\nexport type SearchPerformerFragment = { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string>, country?: string | null, career_start_year?: number | null, career_end_year?: number | null, scene_count: number, birth_date?: string | null, is_favorite: boolean, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> };\n\nexport type StudioFragment = { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> };\n\nexport type TagFragment = { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null };\n\nexport type UrlFragment = { __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } };\n\nexport type ActivateNewUserMutationVariables = Exact<{\n  input: ActivateNewUserInput;\n}>;\n\n\nexport type ActivateNewUserMutation = { __typename: 'Mutation', activateNewUser?: { __typename: 'User', id: string } | null };\n\nexport type AddImageMutationVariables = Exact<{\n  imageData: ImageCreateInput;\n}>;\n\n\nexport type AddImageMutation = { __typename: 'Mutation', imageCreate?: { __typename: 'Image', id: string, url: string, width: number, height: number } | null };\n\nexport type AddSceneMutationVariables = Exact<{\n  sceneData: SceneCreateInput;\n}>;\n\n\nexport type AddSceneMutation = { __typename: 'Mutation', sceneCreate?: { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, code?: string | null, details?: string | null, director?: string | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string } }>, studio?: { __typename: 'Studio', id: string, name: string } | null, performers: Array<{ __typename: 'PerformerAppearance', performer: { __typename: 'Performer', name: string, id: string, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null }> } | null };\n\nexport type AddSiteMutationVariables = Exact<{\n  siteData: SiteCreateInput;\n}>;\n\n\nexport type AddSiteMutation = { __typename: 'Mutation', siteCreate?: { __typename: 'Site', id: string, name: string, description?: string | null, url?: string | null, regex?: string | null, valid_types: Array<ValidSiteTypeEnum> } | null };\n\nexport type AddStudioMutationVariables = Exact<{\n  studioData: StudioCreateInput;\n}>;\n\n\nexport type AddStudioMutation = { __typename: 'Mutation', studioCreate?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string } }> } | null };\n\nexport type AddTagCategoryMutationVariables = Exact<{\n  categoryData: TagCategoryCreateInput;\n}>;\n\n\nexport type AddTagCategoryMutation = { __typename: 'Mutation', tagCategoryCreate?: { __typename: 'TagCategory', id: string, name: string, description?: string | null, group: TagGroupEnum } | null };\n\nexport type AddUserMutationVariables = Exact<{\n  userData: UserCreateInput;\n}>;\n\n\nexport type AddUserMutation = { __typename: 'Mutation', userCreate?: { __typename: 'User', id: string, name: string, email?: string | null, roles?: Array<RoleEnum> | null } | null };\n\nexport type AmendEditMutationVariables = Exact<{\n  input: AmendEditInput;\n}>;\n\n\nexport type AmendEditMutation = { __typename: 'Mutation', amendEdit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, old_details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } };\n\nexport type ApplyEditMutationVariables = Exact<{\n  input: ApplyEditInput;\n}>;\n\n\nexport type ApplyEditMutation = { __typename: 'Mutation', applyEdit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, old_details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } };\n\nexport type CancelEditMutationVariables = Exact<{\n  input: CancelEditInput;\n}>;\n\n\nexport type CancelEditMutation = { __typename: 'Mutation', cancelEdit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, applied: boolean, created: string, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer' }\n      | { __typename: 'Scene' }\n      | { __typename: 'Studio' }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean }\n     | null, details?:\n      | { __typename: 'PerformerEdit' }\n      | { __typename: 'SceneEdit' }\n      | { __typename: 'StudioEdit' }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer' }\n      | { __typename: 'Scene' }\n      | { __typename: 'Studio' }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null }\n    > } };\n\nexport type ChangePasswordMutationVariables = Exact<{\n  userData: UserChangePasswordInput;\n}>;\n\n\nexport type ChangePasswordMutation = { __typename: 'Mutation', changePassword: boolean };\n\nexport type ConfirmChangeEmailMutationVariables = Exact<{\n  token: Scalars['ID']['input'];\n}>;\n\n\nexport type ConfirmChangeEmailMutation = { __typename: 'Mutation', confirmChangeEmail: UserChangeEmailStatus };\n\nexport type DeleteDraftMutationVariables = Exact<{\n  id: Scalars['ID']['input'];\n}>;\n\n\nexport type DeleteDraftMutation = { __typename: 'Mutation', destroyDraft: boolean };\n\nexport type DeleteEditMutationVariables = Exact<{\n  input: DeleteEditInput;\n}>;\n\n\nexport type DeleteEditMutation = { __typename: 'Mutation', deleteEdit: boolean };\n\nexport type DeleteFingerprintSubmissionsMutationVariables = Exact<{\n  input: DeleteFingerprintSubmissionsInput;\n}>;\n\n\nexport type DeleteFingerprintSubmissionsMutation = { __typename: 'Mutation', sceneDeleteFingerprintSubmissions: boolean };\n\nexport type DeleteSceneMutationVariables = Exact<{\n  input: SceneDestroyInput;\n}>;\n\n\nexport type DeleteSceneMutation = { __typename: 'Mutation', sceneDestroy: boolean };\n\nexport type DeleteSiteMutationVariables = Exact<{\n  input: SiteDestroyInput;\n}>;\n\n\nexport type DeleteSiteMutation = { __typename: 'Mutation', siteDestroy: boolean };\n\nexport type DeleteStudioMutationVariables = Exact<{\n  input: StudioDestroyInput;\n}>;\n\n\nexport type DeleteStudioMutation = { __typename: 'Mutation', studioDestroy: boolean };\n\nexport type DeleteTagCategoryMutationVariables = Exact<{\n  input: TagCategoryDestroyInput;\n}>;\n\n\nexport type DeleteTagCategoryMutation = { __typename: 'Mutation', tagCategoryDestroy: boolean };\n\nexport type DeleteUserMutationVariables = Exact<{\n  input: UserDestroyInput;\n}>;\n\n\nexport type DeleteUserMutation = { __typename: 'Mutation', userDestroy: boolean };\n\nexport type EditCommentMutationVariables = Exact<{\n  input: EditCommentInput;\n}>;\n\n\nexport type EditCommentMutation = { __typename: 'Mutation', editComment: { __typename: 'Edit', id: string, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }> } };\n\nexport type FavoritePerformerMutationVariables = Exact<{\n  id: Scalars['ID']['input'];\n  favorite: Scalars['Boolean']['input'];\n}>;\n\n\nexport type FavoritePerformerMutation = { __typename: 'Mutation', favoritePerformer: boolean };\n\nexport type FavoriteStudioMutationVariables = Exact<{\n  id: Scalars['ID']['input'];\n  favorite: Scalars['Boolean']['input'];\n}>;\n\n\nexport type FavoriteStudioMutation = { __typename: 'Mutation', favoriteStudio: boolean };\n\nexport type GenerateInviteCodesMutationVariables = Exact<{\n  input?: InputMaybe<GenerateInviteCodeInput>;\n}>;\n\n\nexport type GenerateInviteCodesMutation = { __typename: 'Mutation', generateInviteCodes: Array<string> };\n\nexport type GrantInviteMutationVariables = Exact<{\n  input: GrantInviteInput;\n}>;\n\n\nexport type GrantInviteMutation = { __typename: 'Mutation', grantInvite: number };\n\nexport type MarkNotificationReadMutationVariables = Exact<{\n  notification: MarkNotificationReadInput;\n}>;\n\n\nexport type MarkNotificationReadMutation = { __typename: 'Mutation', markNotificationsRead: boolean };\n\nexport type MarkNotificationsReadMutationVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type MarkNotificationsReadMutation = { __typename: 'Mutation', markNotificationsRead: boolean };\n\nexport type MoveFingerprintSubmissionsMutationVariables = Exact<{\n  input: MoveFingerprintSubmissionsInput;\n}>;\n\n\nexport type MoveFingerprintSubmissionsMutation = { __typename: 'Mutation', sceneMoveFingerprintSubmissions: boolean };\n\nexport type NewUserMutationVariables = Exact<{\n  input: NewUserInput;\n}>;\n\n\nexport type NewUserMutation = { __typename: 'Mutation', newUser?: string | null };\n\nexport type PerformerEditMutationVariables = Exact<{\n  performerData: PerformerEditInput;\n}>;\n\n\nexport type PerformerEditMutation = { __typename: 'Mutation', performerEdit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, old_details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } };\n\nexport type PerformerEditUpdateMutationVariables = Exact<{\n  id: Scalars['ID']['input'];\n  performerData: PerformerEditInput;\n}>;\n\n\nexport type PerformerEditUpdateMutation = { __typename: 'Mutation', performerEditUpdate: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, old_details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } };\n\nexport type RegenerateApiKeyMutationVariables = Exact<{\n  user_id?: InputMaybe<Scalars['ID']['input']>;\n}>;\n\n\nexport type RegenerateApiKeyMutation = { __typename: 'Mutation', regenerateAPIKey: string };\n\nexport type RequestChangeEmailMutationVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type RequestChangeEmailMutation = { __typename: 'Mutation', requestChangeEmail: UserChangeEmailStatus };\n\nexport type RescindInviteCodeMutationVariables = Exact<{\n  code: Scalars['ID']['input'];\n}>;\n\n\nexport type RescindInviteCodeMutation = { __typename: 'Mutation', rescindInviteCode: boolean };\n\nexport type ResetPasswordMutationVariables = Exact<{\n  input: ResetPasswordInput;\n}>;\n\n\nexport type ResetPasswordMutation = { __typename: 'Mutation', resetPassword: boolean };\n\nexport type RevokeInviteMutationVariables = Exact<{\n  input: RevokeInviteInput;\n}>;\n\n\nexport type RevokeInviteMutation = { __typename: 'Mutation', revokeInvite: number };\n\nexport type SceneEditMutationVariables = Exact<{\n  sceneData: SceneEditInput;\n}>;\n\n\nexport type SceneEditMutation = { __typename: 'Mutation', sceneEdit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, old_details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } };\n\nexport type SceneEditUpdateMutationVariables = Exact<{\n  id: Scalars['ID']['input'];\n  sceneData: SceneEditInput;\n}>;\n\n\nexport type SceneEditUpdateMutation = { __typename: 'Mutation', sceneEditUpdate: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, old_details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } };\n\nexport type StudioEditMutationVariables = Exact<{\n  studioData: StudioEditInput;\n}>;\n\n\nexport type StudioEditMutation = { __typename: 'Mutation', studioEdit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, old_details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } };\n\nexport type StudioEditUpdateMutationVariables = Exact<{\n  id: Scalars['ID']['input'];\n  studioData: StudioEditInput;\n}>;\n\n\nexport type StudioEditUpdateMutation = { __typename: 'Mutation', studioEditUpdate: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, old_details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } };\n\nexport type TagEditMutationVariables = Exact<{\n  tagData: TagEditInput;\n}>;\n\n\nexport type TagEditMutation = { __typename: 'Mutation', tagEdit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, old_details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } };\n\nexport type TagEditUpdateMutationVariables = Exact<{\n  id: Scalars['ID']['input'];\n  tagData: TagEditInput;\n}>;\n\n\nexport type TagEditUpdateMutation = { __typename: 'Mutation', tagEditUpdate: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, old_details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } };\n\nexport type UnmatchFingerprintMutationVariables = Exact<{\n  scene_id: Scalars['ID']['input'];\n  algorithm: FingerprintAlgorithm;\n  hash: Scalars['FingerprintHash']['input'];\n  duration: Scalars['Int']['input'];\n}>;\n\n\nexport type UnmatchFingerprintMutation = { __typename: 'Mutation', unmatchFingerprint: boolean };\n\nexport type UpdateNotificationSubscriptionsMutationVariables = Exact<{\n  subscriptions: Array<NotificationEnum> | NotificationEnum;\n}>;\n\n\nexport type UpdateNotificationSubscriptionsMutation = { __typename: 'Mutation', updateNotificationSubscriptions: boolean };\n\nexport type UpdateSceneMutationVariables = Exact<{\n  updateData: SceneUpdateInput;\n}>;\n\n\nexport type UpdateSceneMutation = { __typename: 'Mutation', sceneUpdate?: { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, title?: string | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string } }>, studio?: { __typename: 'Studio', id: string, name: string } | null, performers: Array<{ __typename: 'PerformerAppearance', performer: { __typename: 'Performer', name: string, id: string, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null }> } | null };\n\nexport type UpdateSiteMutationVariables = Exact<{\n  siteData: SiteUpdateInput;\n}>;\n\n\nexport type UpdateSiteMutation = { __typename: 'Mutation', siteUpdate?: { __typename: 'Site', id: string, name: string, description?: string | null, url?: string | null, regex?: string | null, valid_types: Array<ValidSiteTypeEnum> } | null };\n\nexport type UpdateStudioMutationVariables = Exact<{\n  input: StudioUpdateInput;\n}>;\n\n\nexport type UpdateStudioMutation = { __typename: 'Mutation', studioUpdate?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null };\n\nexport type UpdateTagCategoryMutationVariables = Exact<{\n  categoryData: TagCategoryUpdateInput;\n}>;\n\n\nexport type UpdateTagCategoryMutation = { __typename: 'Mutation', tagCategoryUpdate?: { __typename: 'TagCategory', id: string, name: string, description?: string | null, group: TagGroupEnum } | null };\n\nexport type UpdateUserMutationVariables = Exact<{\n  userData: UserUpdateInput;\n}>;\n\n\nexport type UpdateUserMutation = { __typename: 'Mutation', userUpdate?: { __typename: 'User', id: string, name: string, email?: string | null, roles?: Array<RoleEnum> | null } | null };\n\nexport type ValidateChangeEmailMutationVariables = Exact<{\n  token: Scalars['ID']['input'];\n  email: Scalars['String']['input'];\n}>;\n\n\nexport type ValidateChangeEmailMutation = { __typename: 'Mutation', validateChangeEmail: UserChangeEmailStatus };\n\nexport type VoteMutationVariables = Exact<{\n  input: EditVoteInput;\n}>;\n\n\nexport type VoteMutation = { __typename: 'Mutation', editVote: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, old_details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } };\n\nexport type CategoriesQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type CategoriesQuery = { __typename: 'Query', queryTagCategories: { __typename: 'QueryTagCategoriesResultType', count: number, tag_categories: Array<{ __typename: 'TagCategory', id: string, name: string, description?: string | null, group: TagGroupEnum }> } };\n\nexport type CategoryQueryVariables = Exact<{\n  id: Scalars['ID']['input'];\n}>;\n\n\nexport type CategoryQuery = { __typename: 'Query', findTagCategory?: { __typename: 'TagCategory', id: string, name: string, description?: string | null, group: TagGroupEnum } | null };\n\nexport type ConfigQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type ConfigQuery = { __typename: 'Query', getConfig: { __typename: 'StashBoxConfig', edit_update_limit: number, host_url: string, require_invite: boolean, require_activation: boolean, vote_promotion_threshold?: number | null, vote_application_threshold: number, voting_period: number, min_destructive_voting_period: number, vote_cron_interval: string, guidelines_url: string, require_scene_draft: boolean, require_tag_role: boolean } };\n\nexport type DraftQueryVariables = Exact<{\n  id: Scalars['ID']['input'];\n}>;\n\n\nexport type DraftQuery = { __typename: 'Query', findDraft?: { __typename: 'Draft', id: string, created: string, expires: string, data:\n      | { __typename: 'PerformerDraft', id?: string | null, name: string, disambiguation?: string | null, aliases?: string | null, gender?: string | null, birthdate?: string | null, deathdate?: string | null, urls?: Array<string> | null, ethnicity?: string | null, country?: string | null, eye_color?: string | null, hair_color?: string | null, height?: string | null, measurements?: string | null, breast_type?: string | null, tattoos?: string | null, piercings?: string | null, career_start_year?: number | null, career_end_year?: number | null, image?: { __typename: 'Image', id: string, url: string, width: number, height: number } | null }\n      | { __typename: 'SceneDraft', id?: string | null, title?: string | null, code?: string | null, details?: string | null, director?: string | null, date?: string | null, urls?: Array<string> | null, studio?:\n          | { __typename: 'DraftEntity', name: string, draftID?: string | null }\n          | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n         | null, performers: Array<\n          | { __typename: 'DraftEntity', name: string, draftID?: string | null }\n          | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n        >, tags?: Array<\n          | { __typename: 'DraftEntity', name: string, draftID?: string | null }\n          | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n        > | null, fingerprints: Array<{ __typename: 'DraftFingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }>, image?: { __typename: 'Image', id: string, url: string, width: number, height: number } | null }\n     } | null };\n\nexport type DraftsQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type DraftsQuery = { __typename: 'Query', findDrafts: Array<{ __typename: 'Draft', id: string, created: string, expires: string, data:\n      | { __typename: 'PerformerDraft', id?: string | null, name: string }\n      | { __typename: 'SceneDraft', id?: string | null, title?: string | null }\n     }> };\n\nexport type EditQueryVariables = Exact<{\n  id: Scalars['ID']['input'];\n}>;\n\n\nexport type EditQuery = { __typename: 'Query', findEdit?: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, old_details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } | null };\n\nexport type EditUpdateQueryVariables = Exact<{\n  id: Scalars['ID']['input'];\n}>;\n\n\nexport type EditUpdateQuery = { __typename: 'Query', findEdit?: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, applied: boolean, closed?: string | null, created: string, updated?: string | null, updatable: boolean, update_count: number, vote_count: number, merge_sources: Array<\n      | { __typename: 'Performer', id: string }\n      | { __typename: 'Scene', id: string }\n      | { __typename: 'Studio', id: string }\n      | { __typename: 'Tag', id: string }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', aliases: Array<string>, id: string, name: string, description?: string | null, deleted: boolean, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, aliases: Array<string>, draft_id?: string | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, tattoos: Array<{ __typename: 'BodyModification', location: string, description?: string | null }>, piercings: Array<{ __typename: 'BodyModification', location: string, description?: string | null }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> }\n      | { __typename: 'StudioEdit', name?: string | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null } | null };\n\nexport type EditsQueryVariables = Exact<{\n  input: EditQueryInput;\n}>;\n\n\nexport type EditsQuery = { __typename: 'Query', queryEdits: { __typename: 'QueryEditsResultType', count: number, edits: Array<{ __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n        | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n        | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n        | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n        | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n       | null, details?:\n        | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n        | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n        | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n        | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n       | null, old_details?:\n        | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n        | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n        | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n        | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n       | null, merge_sources: Array<\n        | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n        | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n        | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n        | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n      >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null }> } };\n\nexport type FullPerformerQueryVariables = Exact<{\n  id: Scalars['ID']['input'];\n}>;\n\n\nexport type FullPerformerQuery = { __typename: 'Query', findPerformer?: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, studios: Array<{ __typename: 'PerformerStudio', scene_count: number, studio: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } }>, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } | null };\n\nexport type MeQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type MeQuery = { __typename: 'Query', me?: { __typename: 'User', id: string, name: string, roles?: Array<RoleEnum> | null } | null };\n\nexport type ModAuditsQueryVariables = Exact<{\n  input: ModAuditQueryInput;\n}>;\n\n\nexport type ModAuditsQuery = { __typename: 'Query', queryModAudits: { __typename: 'QueryModAuditsResultType', count: number, audits: Array<{ __typename: 'ModAudit', id: string, action: ModAuditActionEnum, target_id: string, target_type: string, data: string, reason?: string | null, created_at: string, user?: { __typename: 'User', id: string, name: string } | null }> } };\n\nexport type PendingEditsCountQueryVariables = Exact<{\n  type: TargetTypeEnum;\n  id: Scalars['ID']['input'];\n}>;\n\n\nexport type PendingEditsCountQuery = { __typename: 'Query', queryEdits: { __typename: 'QueryEditsResultType', count: number } };\n\nexport type PerformerQueryVariables = Exact<{\n  id: Scalars['ID']['input'];\n}>;\n\n\nexport type PerformerQuery = { __typename: 'Query', findPerformer?: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } | null };\n\nexport type PerformersQueryVariables = Exact<{\n  input: PerformerQueryInput;\n}>;\n\n\nexport type PerformersQuery = { __typename: 'Query', queryPerformers: { __typename: 'QueryPerformersResultType', count: number, performers: Array<{ __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }> } };\n\nexport type PublicUserQueryVariables = Exact<{\n  name: Scalars['String']['input'];\n}>;\n\n\nexport type PublicUserQuery = { __typename: 'Query', findUser?: { __typename: 'User', id: string, name: string, vote_count: { __typename: 'UserVoteCount', accept: number, reject: number, immediate_accept: number, immediate_reject: number, abstain: number }, edit_count: { __typename: 'UserEditCount', immediate_accepted: number, immediate_rejected: number, accepted: number, rejected: number, failed: number, canceled: number, pending: number } } | null };\n\nexport type QueryExistingPerformerQueryVariables = Exact<{\n  input: QueryExistingPerformerInput;\n}>;\n\n\nexport type QueryExistingPerformerQuery = { __typename: 'Query', queryExistingPerformer: { __typename: 'QueryExistingPerformerResult', performers: Array<{ __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }>, edits: Array<{ __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n        | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n        | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n        | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n        | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n       | null, details?:\n        | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n        | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n        | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n        | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n       | null, old_details?:\n        | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n        | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n        | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n        | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n       | null, merge_sources: Array<\n        | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n        | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n        | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n        | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n      >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null }> } };\n\nexport type QueryExistingSceneQueryVariables = Exact<{\n  input: QueryExistingSceneInput;\n}>;\n\n\nexport type QueryExistingSceneQuery = { __typename: 'Query', queryExistingScene: { __typename: 'QueryExistingSceneResult', scenes: Array<{ __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }>, edits: Array<{ __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n        | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n        | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n        | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n        | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n       | null, details?:\n        | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n        | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n        | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n        | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n       | null, old_details?:\n        | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n        | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n        | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n        | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n       | null, merge_sources: Array<\n        | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n        | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n        | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n        | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n      >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null }> } };\n\nexport type NotificationCommentFragment = { __typename: 'EditComment', id: string, date: string, comment: string, edit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, old_details?:\n      | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n      | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n      | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n      | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n     | null, merge_sources: Array<\n      | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n      | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n      | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n      | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n    >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null }, user?: { __typename: 'User', id: string, name: string } | null };\n\nexport type NotificationsQueryVariables = Exact<{\n  input: QueryNotificationsInput;\n}>;\n\n\nexport type NotificationsQuery = { __typename: 'Query', queryNotifications: { __typename: 'QueryNotificationsResult', count: number, notifications: Array<{ __typename: 'Notification', created: string, read: boolean, data:\n        | { __typename: 'CommentCommentedEdit', comment: { __typename: 'EditComment', id: string, date: string, comment: string, edit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n                | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n                | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n                | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n                | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n               | null, details?:\n                | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n                | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n                | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n                | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n               | null, old_details?:\n                | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n                | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n                | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n                | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n               | null, merge_sources: Array<\n                | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n                | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n                | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n                | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n              >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null }, user?: { __typename: 'User', id: string, name: string } | null } }\n        | { __typename: 'CommentOwnEdit', comment: { __typename: 'EditComment', id: string, date: string, comment: string, edit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n                | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n                | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n                | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n                | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n               | null, details?:\n                | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n                | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n                | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n                | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n               | null, old_details?:\n                | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n                | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n                | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n                | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n               | null, merge_sources: Array<\n                | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n                | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n                | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n                | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n              >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null }, user?: { __typename: 'User', id: string, name: string } | null } }\n        | { __typename: 'CommentVotedEdit', comment: { __typename: 'EditComment', id: string, date: string, comment: string, edit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n                | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n                | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n                | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n                | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n               | null, details?:\n                | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n                | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n                | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n                | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n               | null, old_details?:\n                | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n                | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n                | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n                | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n               | null, merge_sources: Array<\n                | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n                | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n                | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n                | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n              >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null }, user?: { __typename: 'User', id: string, name: string } | null } }\n        | { __typename: 'DownvoteOwnEdit', edit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n              | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n              | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n              | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n              | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, details?:\n              | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n              | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n              | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n              | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, old_details?:\n              | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n              | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n              | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n              | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, merge_sources: Array<\n              | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n              | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n              | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n              | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n            >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } }\n        | { __typename: 'FailedOwnEdit', edit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n              | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n              | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n              | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n              | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, details?:\n              | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n              | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n              | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n              | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, old_details?:\n              | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n              | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n              | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n              | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, merge_sources: Array<\n              | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n              | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n              | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n              | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n            >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } }\n        | { __typename: 'FavoritePerformerEdit', edit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n              | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n              | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n              | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n              | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, details?:\n              | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n              | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n              | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n              | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, old_details?:\n              | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n              | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n              | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n              | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, merge_sources: Array<\n              | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n              | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n              | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n              | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n            >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } }\n        | { __typename: 'FavoritePerformerScene', scene: { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> } }\n        | { __typename: 'FavoriteStudioEdit', edit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n              | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n              | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n              | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n              | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, details?:\n              | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n              | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n              | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n              | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, old_details?:\n              | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n              | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n              | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n              | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, merge_sources: Array<\n              | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n              | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n              | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n              | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n            >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } }\n        | { __typename: 'FavoriteStudioScene', scene: { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> } }\n        | { __typename: 'FingerprintedSceneEdit', edit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n              | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n              | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n              | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n              | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, details?:\n              | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n              | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n              | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n              | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, old_details?:\n              | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n              | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n              | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n              | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, merge_sources: Array<\n              | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n              | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n              | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n              | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n            >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } }\n        | { __typename: 'UpdatedEdit', edit: { __typename: 'Edit', id: string, target_type: TargetTypeEnum, operation: OperationEnum, status: VoteStatusEnum, bot: boolean, applied: boolean, created: string, updated?: string | null, closed?: string | null, expires?: string | null, update_count: number, updatable: boolean, vote_count: number, destructive: boolean, comments: Array<{ __typename: 'EditComment', id: string, date: string, comment: string, user?: { __typename: 'User', id: string, name: string } | null }>, votes: Array<{ __typename: 'EditVote', date: string, vote: VoteTypeEnum, user?: { __typename: 'User', id: string, name: string } | null }>, user?: { __typename: 'User', id: string, name: string } | null, target?:\n              | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n              | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n              | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n              | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, details?:\n              | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, added_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, removed_piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n              | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, draft_id?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n              | { __typename: 'StudioEdit', name?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null }\n              | { __typename: 'TagEdit', name?: string | null, description?: string | null, added_aliases?: Array<string> | null, removed_aliases?: Array<string> | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, old_details?:\n              | { __typename: 'PerformerEdit', name?: string | null, disambiguation?: string | null, gender?: GenderEnum | null, birthdate?: string | null, deathdate?: string | null, ethnicity?: EthnicityEnum | null, country?: string | null, eye_color?: EyeColorEnum | null, hair_color?: HairColorEnum | null, height?: number | null, cup_size?: string | null, band_size?: number | null, waist_size?: number | null, hip_size?: number | null, breast_type?: BreastTypeEnum | null, career_start_year?: number | null, career_end_year?: number | null }\n              | { __typename: 'SceneEdit', title?: string | null, details?: string | null, date?: string | null, production_date?: string | null, duration?: number | null, director?: string | null, code?: string | null, added_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, removed_urls?: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }> | null, studio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null, added_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, removed_performers?: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> } }> | null, added_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, removed_tags?: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }> | null, added_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, removed_images?: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> | null, added_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null, removed_fingerprints?: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number }> | null }\n              | { __typename: 'StudioEdit', name?: string | null, parent?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null }\n              | { __typename: 'TagEdit', name?: string | null, description?: string | null, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n             | null, merge_sources: Array<\n              | { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, merged_into_id?: string | null, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, death_date?: string | null, age?: number | null, height?: number | null, hair_color?: HairColorEnum | null, eye_color?: EyeColorEnum | null, ethnicity?: EthnicityEnum | null, country?: string | null, career_end_year?: number | null, career_start_year?: number | null, breast_type?: BreastTypeEnum | null, waist_size?: number | null, hip_size?: number | null, band_size?: number | null, cup_size?: string | null, is_favorite: boolean, tattoos?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, piercings?: Array<{ __typename: 'BodyModification', location: string, description?: string | null }> | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }\n              | { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> }\n              | { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> }\n              | { __typename: 'Tag', id: string, name: string, description?: string | null, deleted: boolean, aliases: Array<string>, category?: { __typename: 'TagCategory', id: string, name: string } | null }\n            >, options?: { __typename: 'PerformerEditOptions', set_modify_aliases: boolean, set_merge_aliases: boolean } | null } }\n       }> } };\n\nexport type SceneQueryVariables = Exact<{\n  id: Scalars['ID']['input'];\n}>;\n\n\nexport type SceneQuery = { __typename: 'Query', findScene?: { __typename: 'Scene', id: string, release_date?: string | null, production_date?: string | null, title?: string | null, deleted: boolean, details?: string | null, director?: string | null, code?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string, parent?: { __typename: 'Studio', id: string, name: string } | null } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }>, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, reports: number, user_submitted: boolean, user_reported: boolean, created: string, updated: string }>, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> } | null };\n\nexport type ScenePairingsQueryVariables = Exact<{\n  performerId: Scalars['ID']['input'];\n  names?: InputMaybe<Scalars['String']['input']>;\n  gender?: InputMaybe<GenderFilterEnum>;\n  favorite?: InputMaybe<Scalars['Boolean']['input']>;\n  page?: Scalars['Int']['input'];\n  per_page?: Scalars['Int']['input'];\n  direction: SortDirectionEnum;\n  sort: PerformerSortEnum;\n  fetchScenes: Scalars['Boolean']['input'];\n}>;\n\n\nexport type ScenePairingsQuery = { __typename: 'Query', queryPerformers: { __typename: 'QueryPerformersResultType', count: number, performers: Array<{ __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, is_favorite: boolean, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, scenes?: Array<{ __typename: 'Scene', id: string, title?: string | null, date?: string | null, duration?: number | null, release_date?: string | null, studio?: { __typename: 'Studio', id: string, name: string } | null, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }> }> } };\n\nexport type ScenesQueryVariables = Exact<{\n  input: SceneQueryInput;\n}>;\n\n\nexport type ScenesQuery = { __typename: 'Query', queryScenes: { __typename: 'QueryScenesResultType', count: number, scenes: Array<{ __typename: 'Scene', id: string, release_date?: string | null, title?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }> }> } };\n\nexport type ScenesWithFingerprintsQueryVariables = Exact<{\n  input: SceneQueryInput;\n  submitted: Scalars['Boolean']['input'];\n}>;\n\n\nexport type ScenesWithFingerprintsQuery = { __typename: 'Query', queryScenes: { __typename: 'QueryScenesResultType', count: number, scenes: Array<{ __typename: 'Scene', id: string, release_date?: string | null, title?: string | null, duration?: number | null, fingerprints: Array<{ __typename: 'Fingerprint', hash: string, algorithm: FingerprintAlgorithm, duration: number, submissions: number, user_submitted: boolean, created: string, updated: string }>, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }> }> } };\n\nexport type ScenesWithoutCountQueryVariables = Exact<{\n  input: SceneQueryInput;\n}>;\n\n\nexport type ScenesWithoutCountQuery = { __typename: 'Query', queryScenes: { __typename: 'QueryScenesResultType', scenes: Array<{ __typename: 'Scene', id: string, release_date?: string | null, title?: string | null, duration?: number | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string> } }> }> } };\n\nexport type SearchAllQueryVariables = Exact<{\n  term: Scalars['String']['input'];\n  limit?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\n\nexport type SearchAllQuery = { __typename: 'Query', searchPerformers: { __typename: 'QueryPerformersResultType', count: number, performers: Array<{ __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string>, country?: string | null, career_start_year?: number | null, career_end_year?: number | null, scene_count: number, birth_date?: string | null, is_favorite: boolean, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }> }, searchScenes: { __typename: 'QueryScenesResultType', count: number, scenes: Array<{ __typename: 'Scene', id: string, release_date?: string | null, title?: string | null, deleted: boolean, duration?: number | null, code?: string | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, gender?: GenderEnum | null, aliases: Array<string>, deleted: boolean } }> }> } };\n\nexport type SearchPerformersQueryVariables = Exact<{\n  term: Scalars['String']['input'];\n  page?: InputMaybe<Scalars['Int']['input']>;\n  per_page?: InputMaybe<Scalars['Int']['input']>;\n  filter?: InputMaybe<PerformerSearchFilter>;\n  studioId?: InputMaybe<Scalars['ID']['input']>;\n  hasStudioId?: Scalars['Boolean']['input'];\n}>;\n\n\nexport type SearchPerformersQuery = { __typename: 'Query', searchPerformers: { __typename: 'QueryPerformersResultType', count: number, performers: Array<{ __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, gender?: GenderEnum | null, aliases: Array<string>, country?: string | null, career_start_year?: number | null, career_end_year?: number | null, scene_count: number, birth_date?: string | null, is_favorite: boolean, studios?: Array<{ __typename: 'PerformerStudio', scene_count: number }>, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }>, facets?: { __typename: 'PerformerSearchFacets', genders: Array<{ __typename: 'GenderFacet', gender: GenderEnum, count: number }> } | null } };\n\nexport type SearchScenesQueryVariables = Exact<{\n  term: Scalars['String']['input'];\n  page?: InputMaybe<Scalars['Int']['input']>;\n  per_page?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\n\nexport type SearchScenesQuery = { __typename: 'Query', searchScenes: { __typename: 'QueryScenesResultType', count: number, scenes: Array<{ __typename: 'Scene', id: string, release_date?: string | null, title?: string | null, deleted: boolean, duration?: number | null, code?: string | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, studio?: { __typename: 'Studio', id: string, name: string } | null, performers: Array<{ __typename: 'PerformerAppearance', as?: string | null, performer: { __typename: 'Performer', id: string, name: string, disambiguation?: string | null, gender?: GenderEnum | null, aliases: Array<string>, deleted: boolean } }> }> } };\n\nexport type SearchTagFragment = { __typename: 'Tag', deleted: boolean, id: string, name: string, description?: string | null, aliases: Array<string> };\n\nexport type SearchTagsQueryVariables = Exact<{\n  term: Scalars['String']['input'];\n  limit?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\n\nexport type SearchTagsQuery = { __typename: 'Query', exact?: { __typename: 'Tag', deleted: boolean, id: string, name: string, description?: string | null, aliases: Array<string> } | null, query: Array<{ __typename: 'Tag', deleted: boolean, id: string, name: string, description?: string | null, aliases: Array<string> }> };\n\nexport type SiteQueryVariables = Exact<{\n  id: Scalars['ID']['input'];\n}>;\n\n\nexport type SiteQuery = { __typename: 'Query', findSite?: { __typename: 'Site', id: string, name: string, description?: string | null, url?: string | null, regex?: string | null, valid_types: Array<ValidSiteTypeEnum>, icon: string, created: string, updated: string } | null };\n\nexport type SitesQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type SitesQuery = { __typename: 'Query', querySites: { __typename: 'QuerySitesResultType', sites: Array<{ __typename: 'Site', id: string, name: string, description?: string | null, url?: string | null, regex?: string | null, valid_types: Array<ValidSiteTypeEnum>, icon: string, created: string, updated: string }> } };\n\nexport type StudioQueryVariables = Exact<{\n  id: Scalars['ID']['input'];\n}>;\n\n\nexport type StudioQuery = { __typename: 'Query', findStudio?: { __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, sub_studios: { __typename: 'QueryStudiosResultType', count: number }, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, height: number, width: number }> } | null };\n\nexport type StudioPerformersQueryVariables = Exact<{\n  studioId: Scalars['ID']['input'];\n  gender?: InputMaybe<GenderFilterEnum>;\n  favorite?: InputMaybe<Scalars['Boolean']['input']>;\n  names?: InputMaybe<Scalars['String']['input']>;\n  page?: Scalars['Int']['input'];\n  per_page?: Scalars['Int']['input'];\n  direction: SortDirectionEnum;\n  sort: PerformerSortEnum;\n}>;\n\n\nexport type StudioPerformersQuery = { __typename: 'Query', queryPerformers: { __typename: 'QueryPerformersResultType', count: number, performers: Array<{ __typename: 'Performer', id: string, name: string, disambiguation?: string | null, deleted: boolean, aliases: Array<string>, gender?: GenderEnum | null, birth_date?: string | null, is_favorite: boolean, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }>, scenes: Array<{ __typename: 'Scene', id: string, title?: string | null, duration?: number | null, release_date?: string | null, production_date?: string | null, studio?: { __typename: 'Studio', id: string, name: string } | null, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }> }> } };\n\nexport type StudiosQueryVariables = Exact<{\n  input: StudioQueryInput;\n}>;\n\n\nexport type StudiosQuery = { __typename: 'Query', queryStudios: { __typename: 'QueryStudiosResultType', count: number, studios: Array<{ __typename: 'Studio', id: string, name: string, aliases: Array<string>, deleted: boolean, is_favorite: boolean, parent?: { __typename: 'Studio', id: string, name: string } | null, urls: Array<{ __typename: 'URL', url: string, site: { __typename: 'Site', id: string, name: string, icon: string } }>, images: Array<{ __typename: 'Image', id: string, url: string, width: number, height: number }> }> } };\n\nexport type SubStudiosQueryVariables = Exact<{\n  id: Scalars['ID']['input'];\n  input: StudioQueryInput;\n}>;\n\n\nexport type SubStudiosQuery = { __typename: 'Query', findStudio?: { __typename: 'Studio', sub_studios: { __typename: 'QueryStudiosResultType', count: number, studios: Array<{ __typename: 'Studio', id: string, name: string }> } } | null };\n\nexport type TagQueryVariables = Exact<{\n  name?: InputMaybe<Scalars['String']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n}>;\n\n\nexport type TagQuery = { __typename: 'Query', findTag?: { __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string>, deleted: boolean, category?: { __typename: 'TagCategory', id: string, name: string, group: TagGroupEnum, description?: string | null } | null } | null };\n\nexport type TagsQueryVariables = Exact<{\n  input: TagQueryInput;\n}>;\n\n\nexport type TagsQuery = { __typename: 'Query', queryTags: { __typename: 'QueryTagsResultType', count: number, tags: Array<{ __typename: 'Tag', id: string, name: string, description?: string | null, aliases: Array<string> }> } };\n\nexport type UnreadNotificationCountQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type UnreadNotificationCountQuery = { __typename: 'Query', getUnreadNotificationCount: number };\n\nexport type UserQueryVariables = Exact<{\n  name: Scalars['String']['input'];\n}>;\n\n\nexport type UserQuery = { __typename: 'Query', findUser?: { __typename: 'User', id: string, name: string, email?: string | null, roles?: Array<RoleEnum> | null, api_key?: string | null, api_calls: number, invite_tokens?: number | null, notification_subscriptions: Array<NotificationEnum>, invited_by?: { __typename: 'User', id: string, name: string } | null, invite_codes?: Array<{ __typename: 'InviteKey', id: string, uses?: number | null, expires?: string | null }> | null, vote_count: { __typename: 'UserVoteCount', accept: number, reject: number, immediate_accept: number, immediate_reject: number, abstain: number }, edit_count: { __typename: 'UserEditCount', immediate_accepted: number, immediate_rejected: number, accepted: number, rejected: number, failed: number, canceled: number, pending: number } } | null };\n\nexport type UsersQueryVariables = Exact<{\n  input: UserQueryInput;\n}>;\n\n\nexport type UsersQuery = { __typename: 'Query', queryUsers: { __typename: 'QueryUsersResultType', count: number, users: Array<{ __typename: 'User', id: string, name: string, email?: string | null, roles?: Array<RoleEnum> | null, api_key?: string | null, api_calls: number, invite_tokens?: number | null, invited_by?: { __typename: 'User', id: string, name: string } | null }> } };\n\nexport type VersionQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type VersionQuery = { __typename: 'Query', version: { __typename: 'Version', hash: string, version: string, build_time: string, build_type: string } };\n\nexport const UrlFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}}]} as unknown as DocumentNode<UrlFragment, unknown>;\nexport const ImageFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}}]} as unknown as DocumentNode<ImageFragment, unknown>;\nexport const ScenePerformerFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]} as unknown as DocumentNode<ScenePerformerFragment, unknown>;\nexport const QuerySceneFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"QuerySceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]} as unknown as DocumentNode<QuerySceneFragment, unknown>;\nexport const SearchPerformerFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SearchPerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scene_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}}]} as unknown as DocumentNode<SearchPerformerFragment, unknown>;\nexport const CommentFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}}]} as unknown as DocumentNode<CommentFragment, unknown>;\nexport const TagFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]} as unknown as DocumentNode<TagFragment, unknown>;\nexport const PerformerFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}}]} as unknown as DocumentNode<PerformerFragment, unknown>;\nexport const StudioFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}}]} as unknown as DocumentNode<StudioFragment, unknown>;\nexport const SceneFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]} as unknown as DocumentNode<SceneFragment, unknown>;\nexport const FingerprintFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}}]} as unknown as DocumentNode<FingerprintFragment, unknown>;\nexport const EditFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}}]} as unknown as DocumentNode<EditFragment, unknown>;\nexport const NotificationCommentFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"NotificationCommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edit\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<NotificationCommentFragment, unknown>;\nexport const SearchTagFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SearchTagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]} as unknown as DocumentNode<SearchTagFragment, unknown>;\nexport const ActivateNewUserDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"ActivateNewUser\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ActivateNewUserInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"activateNewUser\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}]}}]}}]} as unknown as DocumentNode<ActivateNewUserMutation, ActivateNewUserMutationVariables>;\nexport const AddImageDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"AddImage\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"imageData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageCreateInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"imageCreate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"imageData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}}]}}]} as unknown as DocumentNode<AddImageMutation, AddImageMutationVariables>;\nexport const AddSceneDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"AddScene\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sceneData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneCreateInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sceneCreate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sceneData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}}]}}]}}]} as unknown as DocumentNode<AddSceneMutation, AddSceneMutationVariables>;\nexport const AddSiteDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"AddSite\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"siteData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SiteCreateInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"siteCreate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"siteData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"regex\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"valid_types\"}}]}}]}}]} as unknown as DocumentNode<AddSiteMutation, AddSiteMutationVariables>;\nexport const AddStudioDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"AddStudio\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"studioData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioCreateInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studioCreate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"studioData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}}]}}]}}]} as unknown as DocumentNode<AddStudioMutation, AddStudioMutationVariables>;\nexport const AddTagCategoryDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"AddTagCategory\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"categoryData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagCategoryCreateInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tagCategoryCreate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"categoryData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"group\"}}]}}]}}]} as unknown as DocumentNode<AddTagCategoryMutation, AddTagCategoryMutationVariables>;\nexport const AddUserDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"AddUser\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"userData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"UserCreateInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"userCreate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"userData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"email\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"roles\"}}]}}]}}]} as unknown as DocumentNode<AddUserMutation, AddUserMutationVariables>;\nexport const AmendEditDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"AmendEdit\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"AmendEditInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"amendEdit\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<AmendEditMutation, AmendEditMutationVariables>;\nexport const ApplyEditDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"ApplyEdit\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ApplyEditInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applyEdit\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<ApplyEditMutation, ApplyEditMutationVariables>;\nexport const CancelEditDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"CancelEdit\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"CancelEditInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cancelEdit\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}}]}}]}}]}}]} as unknown as DocumentNode<CancelEditMutation, CancelEditMutationVariables>;\nexport const ChangePasswordDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"ChangePassword\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"userData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"UserChangePasswordInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"changePassword\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"userData\"}}}]}]}}]} as unknown as DocumentNode<ChangePasswordMutation, ChangePasswordMutationVariables>;\nexport const ConfirmChangeEmailDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"ConfirmChangeEmail\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"token\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"confirmChangeEmail\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"token\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"token\"}}}]}]}}]} as unknown as DocumentNode<ConfirmChangeEmailMutation, ConfirmChangeEmailMutationVariables>;\nexport const DeleteDraftDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"DeleteDraft\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destroyDraft\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}]}]}}]} as unknown as DocumentNode<DeleteDraftMutation, DeleteDraftMutationVariables>;\nexport const DeleteEditDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"DeleteEdit\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"DeleteEditInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleteEdit\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}]}]}}]} as unknown as DocumentNode<DeleteEditMutation, DeleteEditMutationVariables>;\nexport const DeleteFingerprintSubmissionsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"DeleteFingerprintSubmissions\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"DeleteFingerprintSubmissionsInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sceneDeleteFingerprintSubmissions\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}]}]}}]} as unknown as DocumentNode<DeleteFingerprintSubmissionsMutation, DeleteFingerprintSubmissionsMutationVariables>;\nexport const DeleteSceneDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"DeleteScene\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneDestroyInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sceneDestroy\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}]}]}}]} as unknown as DocumentNode<DeleteSceneMutation, DeleteSceneMutationVariables>;\nexport const DeleteSiteDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"DeleteSite\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SiteDestroyInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"siteDestroy\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}]}]}}]} as unknown as DocumentNode<DeleteSiteMutation, DeleteSiteMutationVariables>;\nexport const DeleteStudioDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"DeleteStudio\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioDestroyInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studioDestroy\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}]}]}}]} as unknown as DocumentNode<DeleteStudioMutation, DeleteStudioMutationVariables>;\nexport const DeleteTagCategoryDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"DeleteTagCategory\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagCategoryDestroyInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tagCategoryDestroy\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}]}]}}]} as unknown as DocumentNode<DeleteTagCategoryMutation, DeleteTagCategoryMutationVariables>;\nexport const DeleteUserDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"DeleteUser\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"UserDestroyInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"userDestroy\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}]}]}}]} as unknown as DocumentNode<DeleteUserMutation, DeleteUserMutationVariables>;\nexport const EditCommentDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditCommentInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"editComment\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}}]} as unknown as DocumentNode<EditCommentMutation, EditCommentMutationVariables>;\nexport const FavoritePerformerDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"FavoritePerformer\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"favorite\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Boolean\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"favoritePerformer\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"favorite\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"favorite\"}}}]}]}}]} as unknown as DocumentNode<FavoritePerformerMutation, FavoritePerformerMutationVariables>;\nexport const FavoriteStudioDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"FavoriteStudio\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"favorite\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Boolean\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"favoriteStudio\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"favorite\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"favorite\"}}}]}]}}]} as unknown as DocumentNode<FavoriteStudioMutation, FavoriteStudioMutationVariables>;\nexport const GenerateInviteCodesDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"GenerateInviteCodes\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"GenerateInviteCodeInput\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"generateInviteCodes\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}]}]}}]} as unknown as DocumentNode<GenerateInviteCodesMutation, GenerateInviteCodesMutationVariables>;\nexport const GrantInviteDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"GrantInvite\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"GrantInviteInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"grantInvite\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}]}]}}]} as unknown as DocumentNode<GrantInviteMutation, GrantInviteMutationVariables>;\nexport const MarkNotificationReadDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"MarkNotificationRead\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"notification\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"MarkNotificationReadInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"markNotificationsRead\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"notification\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"notification\"}}}]}]}}]} as unknown as DocumentNode<MarkNotificationReadMutation, MarkNotificationReadMutationVariables>;\nexport const MarkNotificationsReadDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"MarkNotificationsRead\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"markNotificationsRead\"}}]}}]} as unknown as DocumentNode<MarkNotificationsReadMutation, MarkNotificationsReadMutationVariables>;\nexport const MoveFingerprintSubmissionsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"MoveFingerprintSubmissions\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"MoveFingerprintSubmissionsInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sceneMoveFingerprintSubmissions\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}]}]}}]} as unknown as DocumentNode<MoveFingerprintSubmissionsMutation, MoveFingerprintSubmissionsMutationVariables>;\nexport const NewUserDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"NewUser\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"NewUserInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"newUser\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}]}]}}]} as unknown as DocumentNode<NewUserMutation, NewUserMutationVariables>;\nexport const PerformerEditDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"performerData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEditInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performerEdit\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"performerData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<PerformerEditMutation, PerformerEditMutationVariables>;\nexport const PerformerEditUpdateDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEditUpdate\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"performerData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEditInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performerEditUpdate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"performerData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<PerformerEditUpdateMutation, PerformerEditUpdateMutationVariables>;\nexport const RegenerateApiKeyDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"RegenerateAPIKey\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"user_id\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"regenerateAPIKey\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"userID\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"user_id\"}}}]}]}}]} as unknown as DocumentNode<RegenerateApiKeyMutation, RegenerateApiKeyMutationVariables>;\nexport const RequestChangeEmailDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"RequestChangeEmail\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"requestChangeEmail\"}}]}}]} as unknown as DocumentNode<RequestChangeEmailMutation, RequestChangeEmailMutationVariables>;\nexport const RescindInviteCodeDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"RescindInviteCode\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rescindInviteCode\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}}]}]}}]} as unknown as DocumentNode<RescindInviteCodeMutation, RescindInviteCodeMutationVariables>;\nexport const ResetPasswordDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"ResetPassword\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ResetPasswordInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"resetPassword\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}]}]}}]} as unknown as DocumentNode<ResetPasswordMutation, ResetPasswordMutationVariables>;\nexport const RevokeInviteDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"RevokeInvite\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"RevokeInviteInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"revokeInvite\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}]}]}}]} as unknown as DocumentNode<RevokeInviteMutation, RevokeInviteMutationVariables>;\nexport const SceneEditDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sceneData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEditInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sceneEdit\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sceneData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<SceneEditMutation, SceneEditMutationVariables>;\nexport const SceneEditUpdateDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEditUpdate\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sceneData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEditInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sceneEditUpdate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sceneData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<SceneEditUpdateMutation, SceneEditUpdateMutationVariables>;\nexport const StudioEditDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"studioData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEditInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studioEdit\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"studioData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<StudioEditMutation, StudioEditMutationVariables>;\nexport const StudioEditUpdateDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEditUpdate\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"studioData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEditInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studioEditUpdate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"studioData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<StudioEditUpdateMutation, StudioEditUpdateMutationVariables>;\nexport const TagEditDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tagData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEditInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tagEdit\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tagData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<TagEditMutation, TagEditMutationVariables>;\nexport const TagEditUpdateDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEditUpdate\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tagData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEditInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tagEditUpdate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tagData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<TagEditUpdateMutation, TagEditUpdateMutationVariables>;\nexport const UnmatchFingerprintDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"UnmatchFingerprint\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"scene_id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintAlgorithm\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintHash\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"unmatchFingerprint\"},\"name\":{\"kind\":\"Name\",\"value\":\"submitFingerprint\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"ObjectValue\",\"fields\":[{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"},\"value\":{\"kind\":\"EnumValue\",\"value\":\"REMOVE\"}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"scene_id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"scene_id\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprint\"},\"value\":{\"kind\":\"ObjectValue\",\"fields\":[{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}}]}}]}}]}]}}]} as unknown as DocumentNode<UnmatchFingerprintMutation, UnmatchFingerprintMutationVariables>;\nexport const UpdateNotificationSubscriptionsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"UpdateNotificationSubscriptions\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"subscriptions\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"ListType\",\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"NotificationEnum\"}}}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updateNotificationSubscriptions\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"subscriptions\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"subscriptions\"}}}]}]}}]} as unknown as DocumentNode<UpdateNotificationSubscriptionsMutation, UpdateNotificationSubscriptionsMutationVariables>;\nexport const UpdateSceneDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"UpdateScene\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"updateData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneUpdateInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sceneUpdate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"updateData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}}]}}]}}]} as unknown as DocumentNode<UpdateSceneMutation, UpdateSceneMutationVariables>;\nexport const UpdateSiteDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"UpdateSite\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"siteData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SiteUpdateInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"siteUpdate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"siteData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"regex\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"valid_types\"}}]}}]}}]} as unknown as DocumentNode<UpdateSiteMutation, UpdateSiteMutationVariables>;\nexport const UpdateStudioDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"UpdateStudio\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioUpdateInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studioUpdate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}}]} as unknown as DocumentNode<UpdateStudioMutation, UpdateStudioMutationVariables>;\nexport const UpdateTagCategoryDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"UpdateTagCategory\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"categoryData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagCategoryUpdateInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tagCategoryUpdate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"categoryData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"group\"}}]}}]}}]} as unknown as DocumentNode<UpdateTagCategoryMutation, UpdateTagCategoryMutationVariables>;\nexport const UpdateUserDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"UpdateUser\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"userData\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"UserUpdateInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"userUpdate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"userData\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"email\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"roles\"}}]}}]}}]} as unknown as DocumentNode<UpdateUserMutation, UpdateUserMutationVariables>;\nexport const ValidateChangeEmailDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"ValidateChangeEmail\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"token\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"email\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"validateChangeEmail\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"token\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"token\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"email\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"email\"}}}]}]}}]} as unknown as DocumentNode<ValidateChangeEmailMutation, ValidateChangeEmailMutationVariables>;\nexport const VoteDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"Vote\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditVoteInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"editVote\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<VoteMutation, VoteMutationVariables>;\nexport const CategoriesDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Categories\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryTagCategories\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tag_categories\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"group\"}}]}}]}}]}}]} as unknown as DocumentNode<CategoriesQuery, CategoriesQueryVariables>;\nexport const CategoryDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Category\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findTagCategory\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"group\"}}]}}]}}]} as unknown as DocumentNode<CategoryQuery, CategoryQueryVariables>;\nexport const ConfigDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Config\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"getConfig\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edit_update_limit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"host_url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"require_invite\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"require_activation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_promotion_threshold\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_application_threshold\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"voting_period\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"min_destructive_voting_period\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_cron_interval\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"guidelines_url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"require_scene_draft\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"require_tag_role\"}}]}}]}}]} as unknown as DocumentNode<ConfigQuery, ConfigQueryVariables>;\nexport const DraftDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Draft\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findDraft\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"data\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerDraft\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"measurements\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneDraft\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"DraftEntity\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"draftID\"},\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"DraftEntity\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"draftID\"},\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"DraftEntity\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"draftID\"},\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]} as unknown as DocumentNode<DraftQuery, DraftQueryVariables>;\nexport const DraftsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Drafts\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findDrafts\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"data\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerDraft\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneDraft\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}}]}}]}}]}}]}}]} as unknown as DocumentNode<DraftsQuery, DraftsQueryVariables>;\nexport const EditDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findEdit\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<EditQuery, EditQueryVariables>;\nexport const EditUpdateDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"EditUpdate\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findEdit\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}}]} as unknown as DocumentNode<EditUpdateQuery, EditUpdateQueryVariables>;\nexport const EditsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Edits\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditQueryInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryEdits\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edits\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<EditsQuery, EditsQueryVariables>;\nexport const FullPerformerDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"FullPerformer\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findPerformer\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studios\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scene_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}}]} as unknown as DocumentNode<FullPerformerQuery, FullPerformerQueryVariables>;\nexport const MeDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Me\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"me\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"roles\"}}]}}]}}]} as unknown as DocumentNode<MeQuery, MeQueryVariables>;\nexport const ModAuditsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"ModAudits\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ModAuditQueryInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryModAudits\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"audits\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"action\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"data\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reason\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}}]}}]}}]}}]} as unknown as DocumentNode<ModAuditsQuery, ModAuditsQueryVariables>;\nexport const PendingEditsCountDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"PendingEditsCount\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"type\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TargetTypeEnum\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryEdits\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"ObjectValue\",\"fields\":[{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"type\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"target_id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"},\"value\":{\"kind\":\"EnumValue\",\"value\":\"PENDING\"}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"per_page\"},\"value\":{\"kind\":\"IntValue\",\"value\":\"1\"}}]}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}}]}}]}}]} as unknown as DocumentNode<PendingEditsCountQuery, PendingEditsCountQueryVariables>;\nexport const PerformerDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findPerformer\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}}]} as unknown as DocumentNode<PerformerQuery, PerformerQueryVariables>;\nexport const PerformersDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Performers\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerQueryInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryPerformers\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}}]} as unknown as DocumentNode<PerformersQuery, PerformersQueryVariables>;\nexport const PublicUserDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"PublicUser\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findUser\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"username\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"accept\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reject\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"immediate_accept\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"immediate_reject\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"abstain\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edit_count\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"immediate_accepted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"immediate_rejected\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"accepted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rejected\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"failed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"canceled\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"pending\"}}]}}]}}]}}]} as unknown as DocumentNode<PublicUserQuery, PublicUserQueryVariables>;\nexport const QueryExistingPerformerDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"QueryExistingPerformer\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"QueryExistingPerformerInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryExistingPerformer\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edits\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<QueryExistingPerformerQuery, QueryExistingPerformerQueryVariables>;\nexport const QueryExistingSceneDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"QueryExistingScene\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"QueryExistingSceneInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryExistingScene\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scenes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edits\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}}]} as unknown as DocumentNode<QueryExistingSceneQuery, QueryExistingSceneQueryVariables>;\nexport const NotificationsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Notifications\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"QueryNotificationsInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryNotifications\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"notifications\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"read\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"data\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FavoritePerformerScene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scene\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FavoritePerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edit\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FavoriteStudioScene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scene\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FavoriteStudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edit\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentOwnEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"NotificationCommentFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentCommentedEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"NotificationCommentFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentVotedEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"NotificationCommentFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"DownvoteOwnEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edit\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FailedOwnEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edit\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"UpdatedEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edit\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintedSceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edit\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}}]}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comment\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merged_into_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"death_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Fingerprint\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Edit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"operation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"bot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"applied\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"closed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"update_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updatable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"destructive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comments\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"votes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"target\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tattoos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_piercings\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"location\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"draft_id\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"old_details\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birthdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deathdate\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ethnicity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"eye_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hair_color\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cup_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"band_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"waist_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hip_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"breast_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneEdit\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"added_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"removed_fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"FingerprintFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"merge_sources\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TagFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_modify_aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"set_merge_aliases\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"NotificationCommentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"EditComment\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CommentFragment\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edit\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"EditFragment\"}}]}}]}}]} as unknown as DocumentNode<NotificationsQuery, NotificationsQueryVariables>;\nexport const SceneDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findScene\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"director\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reports\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_reported\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}}]} as unknown as DocumentNode<SceneQuery, SceneQueryVariables>;\nexport const ScenePairingsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePairings\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"performerId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"names\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"GenderFilterEnum\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"favorite\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Boolean\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}},\"defaultValue\":{\"kind\":\"IntValue\",\"value\":\"1\"}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"per_page\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}},\"defaultValue\":{\"kind\":\"IntValue\",\"value\":\"25\"}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"direction\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SortDirectionEnum\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sort\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerSortEnum\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"fetchScenes\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Boolean\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryPerformers\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"ObjectValue\",\"fields\":[{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"performed_with\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"performerId\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"names\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"names\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"favorite\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"per_page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"per_page\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"direction\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"direction\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"sort\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sort\"}}}]}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scenes\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"ObjectValue\",\"fields\":[{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"performed_with\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"performerId\"}}}]}}],\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"include\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"if\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"fetchScenes\"}}}]}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}}]} as unknown as DocumentNode<ScenePairingsQuery, ScenePairingsQueryVariables>;\nexport const ScenesDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Scenes\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneQueryInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryScenes\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scenes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"QuerySceneFragment\"}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"QuerySceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}}]}}]} as unknown as DocumentNode<ScenesQuery, ScenesQueryVariables>;\nexport const ScenesWithFingerprintsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenesWithFingerprints\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneQueryInput\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"submitted\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Boolean\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryScenes\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scenes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"QuerySceneFragment\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fingerprints\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"is_submitted\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"submitted\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"algorithm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"submissions\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user_submitted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"QuerySceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}}]}}]} as unknown as DocumentNode<ScenesWithFingerprintsQuery, ScenesWithFingerprintsQueryVariables>;\nexport const ScenesWithoutCountDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenesWithoutCount\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SceneQueryInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryScenes\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scenes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"QuerySceneFragment\"}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"QuerySceneFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Scene\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ScenePerformerFragment\"}}]}}]}}]}}]} as unknown as DocumentNode<ScenesWithoutCountQuery, ScenesWithoutCountQueryVariables>;\nexport const SearchAllDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"SearchAll\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"limit\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}},\"defaultValue\":{\"kind\":\"IntValue\",\"value\":\"5\"}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"searchPerformers\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"limit\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"limit\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SearchPerformerFragment\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"searchScenes\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"limit\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"limit\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scenes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}}]}}]}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SearchPerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scene_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}}]} as unknown as DocumentNode<SearchAllQuery, SearchAllQueryVariables>;\nexport const SearchPerformersDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"SearchPerformers\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"per_page\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"filter\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerSearchFilter\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"studioId\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"hasStudioId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Boolean\"}}},\"defaultValue\":{\"kind\":\"BooleanValue\",\"value\":false}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"searchPerformers\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"per_page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"per_page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"filter\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"filter\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SearchPerformerFragment\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studios\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"studio_id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"studioId\"}}}],\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"include\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"if\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"hasStudioId\"}}}]}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scene_count\"}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"facets\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"genders\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}}]}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SearchPerformerFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Performer\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"country\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_start_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"career_end_year\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scene_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}}]} as unknown as DocumentNode<SearchPerformersQuery, SearchPerformersQueryVariables>;\nexport const SearchScenesDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"SearchScenes\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"per_page\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"searchScenes\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"per_page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"per_page\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scenes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"code\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"as\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performer\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}}]}}]}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}}]} as unknown as DocumentNode<SearchScenesQuery, SearchScenesQueryVariables>;\nexport const SearchTagsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"SearchTags\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"limit\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}},\"defaultValue\":{\"kind\":\"IntValue\",\"value\":\"5\"}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"exact\"},\"name\":{\"kind\":\"Name\",\"value\":\"findTagOrAlias\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SearchTagFragment\"}}]}},{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"query\"},\"name\":{\"kind\":\"Name\",\"value\":\"searchTag\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"term\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"limit\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"limit\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"SearchTagFragment\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"SearchTagFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]} as unknown as DocumentNode<SearchTagsQuery, SearchTagsQueryVariables>;\nexport const SiteDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Site\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findSite\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"regex\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"valid_types\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}}]}}]} as unknown as DocumentNode<SiteQuery, SiteQueryVariables>;\nexport const SitesDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Sites\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"querySites\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sites\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"regex\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"valid_types\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated\"}}]}}]}}]}}]} as unknown as DocumentNode<SitesQuery, SitesQueryVariables>;\nexport const StudioDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findStudio\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sub_studios\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Studio\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}}]} as unknown as DocumentNode<StudioQuery, StudioQueryVariables>;\nexport const StudioPerformersDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioPerformers\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"studioId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"GenderFilterEnum\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"favorite\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Boolean\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"names\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}},\"defaultValue\":{\"kind\":\"IntValue\",\"value\":\"1\"}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"per_page\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}},\"defaultValue\":{\"kind\":\"IntValue\",\"value\":\"25\"}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"direction\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"SortDirectionEnum\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sort\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PerformerSortEnum\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryPerformers\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"ObjectValue\",\"fields\":[{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"studio_id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"studioId\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"favorite\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"names\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"names\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"per_page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"per_page\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"direction\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"direction\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"sort\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sort\"}}}]}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"performers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"disambiguation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"gender\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"birth_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scenes\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"ObjectValue\",\"fields\":[{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"studio_id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"studioId\"}}}]}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"duration\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"release_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"production_date\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studio\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}}]}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}}]} as unknown as DocumentNode<StudioPerformersQuery, StudioPerformersQueryVariables>;\nexport const StudiosDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Studios\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioQueryInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryStudios\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studios\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parent\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"urls\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_favorite\"}}]}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"URLFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"URL\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"site\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"icon\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImageFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}}]} as unknown as DocumentNode<StudiosQuery, StudiosQueryVariables>;\nexport const SubStudiosDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"SubStudios\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StudioQueryInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findStudio\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sub_studios\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"studios\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}}]}}]}}]} as unknown as DocumentNode<SubStudiosQuery, SubStudiosQueryVariables>;\nexport const TagDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Tag\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findTag\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"category\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"group\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}}]}}]}}]}}]} as unknown as DocumentNode<TagQuery, TagQueryVariables>;\nexport const TagsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Tags\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"TagQueryInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryTags\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"aliases\"}}]}}]}}]}}]} as unknown as DocumentNode<TagsQuery, TagsQueryVariables>;\nexport const UnreadNotificationCountDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"UnreadNotificationCount\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"getUnreadNotificationCount\"}}]}}]} as unknown as DocumentNode<UnreadNotificationCountQuery, UnreadNotificationCountQueryVariables>;\nexport const UserDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"User\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"findUser\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"username\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"email\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"roles\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"api_key\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"api_calls\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"invited_by\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"invite_tokens\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"invite_codes\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"uses\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"expires\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"vote_count\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"accept\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reject\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"immediate_accept\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"immediate_reject\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"abstain\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edit_count\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"immediate_accepted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"immediate_rejected\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"accepted\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rejected\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"failed\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"canceled\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"pending\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"notification_subscriptions\"}}]}}]}}]} as unknown as DocumentNode<UserQuery, UserQueryVariables>;\nexport const UsersDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Users\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"UserQueryInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"queryUsers\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"users\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"email\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"roles\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"api_key\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"api_calls\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"invited_by\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"invite_tokens\"}}]}}]}}]}}]} as unknown as DocumentNode<UsersQuery, UsersQueryVariables>;\nexport const VersionDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Version\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"version\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hash\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"version\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"build_time\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"build_type\"}}]}}]}}]} as unknown as DocumentNode<VersionQuery, VersionQueryVariables>;"
  },
  {
    "path": "frontend/src/hooks/index.ts",
    "content": "export { default as usePagination } from \"./usePagination\";\nexport { default as useEditFilter } from \"./useEditFilter\";\nexport { default as useAuth } from \"./useAuth\";\nexport { useToast } from \"./useToast\";\nexport { useQueryParams } from \"./useQueryParams\";\nexport { useCurrentUser } from \"./useCurrentUser\";\n"
  },
  {
    "path": "frontend/src/hooks/toast.scss",
    "content": ".ToastContainer {\n  position: fixed;\n  bottom: 30px;\n  right: 40px;\n  z-index: 10;\n}\n\n.toast-header {\n  float: right;\n  background-color: transparent;\n  padding: 0.75rem;\n}\n\n.toast.fade {\n  transition: opacity 0.6s ease-in-out;\n}\n"
  },
  {
    "path": "frontend/src/hooks/useAuth.tsx",
    "content": "import { useMe } from \"src/graphql\";\nimport { getCachedUser, setCachedUser } from \"src/utils\";\nimport type { User } from \"../context\";\n\ninterface AuthResult {\n  loading: boolean;\n  user: User | undefined;\n}\n\nconst useAuth = (): AuthResult => {\n  const { loading, data } = useMe({\n    fetchPolicy: \"network-only\",\n  });\n  setCachedUser(data?.me ?? undefined);\n\n  return { loading, user: loading ? getCachedUser() : (data?.me ?? undefined) };\n};\n\nexport default useAuth;\n"
  },
  {
    "path": "frontend/src/hooks/useBeforeUnload.ts",
    "content": "import { useEffect } from \"react\";\n\nconst unloadListener = (event: BeforeUnloadEvent) => {\n  event.preventDefault();\n  event.returnValue = true;\n};\n\nexport const useBeforeUnload = () => {\n  useEffect(() => {\n    window.addEventListener(\"beforeunload\", unloadListener);\n    return () => window.removeEventListener(\"beforeunload\", unloadListener);\n  }, []);\n};\n"
  },
  {
    "path": "frontend/src/hooks/useCurrentUser.tsx",
    "content": "import { useContext, useMemo, useCallback } from \"react\";\nimport { useConfig } from \"src/graphql/queries\";\n\nimport AuthContext from \"src/context\";\nimport {\n  isAdmin as userIsAdmin,\n  canEdit,\n  canTagEdit,\n  canVote,\n  canModerate,\n} from \"src/utils\";\n\nexport const useCurrentUser = () => {\n  const auth = useContext(AuthContext);\n  const { data: config } = useConfig();\n  const requireTagRole = config?.getConfig.require_tag_role ?? false;\n\n  const isAdmin = useMemo(() => userIsAdmin(auth.user), [auth.user]);\n  const isEditor = useMemo(() => canEdit(auth.user), [auth.user]);\n  const isVoter = useMemo(() => canVote(auth.user), [auth.user]);\n  const isModerator = useMemo(() => canModerate(auth.user), [auth.user]);\n  const isTagEditor = useMemo(\n    () => (requireTagRole ? canTagEdit(auth.user) : canEdit(auth.user)),\n    [auth.user, requireTagRole],\n  );\n  const isSelf = useCallback(\n    (user?: (typeof auth)[\"user\"] | string | null) => {\n      if (!auth.user?.id || !user) return false;\n      if (typeof user === \"string\") return user === auth.user.id;\n      return user?.id === auth.user.id;\n    },\n    [auth.user],\n  );\n\n  return {\n    isAdmin,\n    isSelf,\n    isEditor,\n    isTagEditor,\n    isVoter,\n    isModerator,\n    isAuthenticated: auth.authenticated,\n    user: auth.user,\n  };\n};\n"
  },
  {
    "path": "frontend/src/hooks/useEditFilter.tsx",
    "content": "import { Button, Form, InputGroup } from \"react-bootstrap\";\nimport Select from \"react-select\";\nimport {\n  faSortAmountUp,\n  faSortAmountDown,\n} from \"@fortawesome/free-solid-svg-icons\";\n\nimport {\n  OperationEnum,\n  SortDirectionEnum,\n  TargetTypeEnum,\n  VoteStatusEnum,\n  EditSortEnum,\n  UserVotedFilterEnum,\n} from \"src/graphql\";\nimport {\n  EditOperationTypes,\n  EditTargetTypes,\n  EditStatusTypes,\n  UserVotedFilterTypes,\n} from \"src/constants/enums\";\nimport { Icon } from \"src/components/fragments\";\nimport { useQueryParams } from \"src/hooks\";\nimport { resolveEnum, ensureEnum } from \"src/utils\";\n\nconst sortOptions = [\n  { value: EditSortEnum.CREATED_AT, label: \"Date created\" },\n  { value: EditSortEnum.CLOSED_AT, label: \"Date closed\" },\n  { value: EditSortEnum.UPDATED_AT, label: \"Date updated\" },\n];\n\nconst botOptions = [\n  {\n    label: \"Include\",\n    value: \"include\",\n  },\n  {\n    label: \"Exclude\",\n    value: \"exclude\",\n  },\n  {\n    label: \"Only\",\n    value: \"only\",\n  },\n];\n\ninterface EditFilterProps {\n  sort?: EditSortEnum;\n  direction?: SortDirectionEnum;\n  type?: TargetTypeEnum;\n  status?: VoteStatusEnum;\n  operation?: OperationEnum;\n  voted?: UserVotedFilterEnum;\n  favorite?: boolean;\n  bot?: boolean;\n  userSubmitted?: boolean;\n  showFavoriteOption?: boolean;\n  showVotedFilter?: boolean;\n  defaultVoteStatus?: VoteStatusEnum | \"all\";\n  defaultVoted?: UserVotedFilterEnum;\n  defaultBot?: \"include\" | \"exclude\" | \"only\";\n  defaultUserSubmitted?: boolean;\n}\n\nconst useEditFilter = ({\n  sort: fixedSort,\n  direction: fixedDirection,\n  type: fixedType,\n  status: fixedStatus,\n  operation: fixedOperation,\n  voted: fixedVoted,\n  favorite: fixedFavorite,\n  bot: fixedBot,\n  userSubmitted: fixedUserSubmitted,\n  showFavoriteOption = true,\n  showVotedFilter = true,\n  defaultVoteStatus = \"all\",\n  defaultVoted,\n  defaultBot = \"include\",\n  defaultUserSubmitted = true,\n}: EditFilterProps) => {\n  const [params, setParams] = useQueryParams({\n    query: { name: \"query\", type: \"string\", default: \"\" },\n    sort: { name: \"sort\", type: \"string\", default: EditSortEnum.CREATED_AT },\n    direction: { name: \"dir\", type: \"string\", default: SortDirectionEnum.DESC },\n    operation: { name: \"operation\", type: \"string\", default: \"\" },\n    voted: {\n      name: \"voted\",\n      type: \"string\",\n      default: defaultVoted,\n    },\n    status: { name: \"status\", type: \"string\", default: defaultVoteStatus },\n    type: { name: \"type\", type: \"string\", default: \"\" },\n    favorite: { name: \"favorite\", type: \"string\", default: \"false\" },\n    bot: { name: \"bot\", type: \"string\", default: defaultBot },\n    user_submitted: {\n      name: \"user_submitted\",\n      type: \"string\",\n      default: defaultUserSubmitted.toString(),\n    },\n  });\n\n  const sort = ensureEnum(EditSortEnum, params.sort);\n  const direction = ensureEnum(SortDirectionEnum, params.direction);\n  const operation = resolveEnum(OperationEnum, params.operation);\n  const voted = resolveEnum(UserVotedFilterEnum, params.voted);\n  const status = resolveEnum(VoteStatusEnum, params.status, undefined);\n  const type = resolveEnum(TargetTypeEnum, params.type);\n  const favorite = params.favorite === \"true\";\n  const userSubmitted = params.user_submitted !== \"false\";\n\n  const selectedSort = fixedSort ?? sort;\n  const selectedDirection = fixedDirection ?? direction;\n  const selectedStatus = fixedStatus ?? status;\n  const selectedType = fixedType ?? type;\n  const selectedOperation = fixedOperation ?? operation;\n  const selectedVoted = fixedVoted ?? voted;\n  const selectedFavorite = fixedFavorite ?? favorite;\n  const selectedBot = fixedBot ?? params.bot;\n  const selectedUserSubmitted = fixedUserSubmitted ?? userSubmitted;\n\n  const enumToOptions = (e: Record<string, string>) =>\n    Object.keys(e).map((key) => (\n      <option key={key} value={key}>\n        {e[key]}\n      </option>\n    ));\n\n  const editFilter = (\n    <Form className=\"d-flex fw-bold mx-0\">\n      <Form.Group className=\"me-2 mb-3 d-flex flex-column\">\n        <Form.Label>Order</Form.Label>\n        <InputGroup>\n          <Form.Select\n            onChange={(e) => setParams(\"sort\", e.currentTarget.value)}\n            defaultValue={selectedSort}\n          >\n            {sortOptions.map((s) => (\n              <option value={s.value} key={s.value}>\n                {s.label}\n              </option>\n            ))}\n          </Form.Select>\n          <Button\n            variant=\"secondary\"\n            onClick={() =>\n              setParams(\n                \"direction\",\n                selectedDirection === SortDirectionEnum.DESC\n                  ? SortDirectionEnum.ASC\n                  : SortDirectionEnum.DESC,\n              )\n            }\n          >\n            <Icon\n              icon={\n                selectedDirection === SortDirectionEnum.ASC\n                  ? faSortAmountUp\n                  : faSortAmountDown\n              }\n            />\n          </Button>\n        </InputGroup>\n      </Form.Group>\n      <Form.Group className=\"mx-2 mb-3 d-flex flex-column\">\n        <Form.Label>Type</Form.Label>\n        <Form.Select\n          onChange={(e) => setParams(\"type\", e.currentTarget.value)}\n          value={selectedType}\n          disabled={!!fixedType}\n        >\n          <option value={\"\"} key=\"all-targets\">\n            All\n          </option>\n          {enumToOptions(EditTargetTypes)}\n        </Form.Select>\n      </Form.Group>\n      <Form.Group className=\"mx-2 mb-3 d-flex flex-column\">\n        <Form.Label>Status</Form.Label>\n        <Form.Select\n          onChange={(e) => setParams(\"status\", e.currentTarget.value)}\n          value={selectedStatus}\n          disabled={!!fixedStatus}\n        >\n          <option value=\"all\" key=\"all-statuses\">\n            All\n          </option>\n          {enumToOptions(EditStatusTypes)}\n        </Form.Select>\n      </Form.Group>\n      <Form.Group className=\"mx-2 mb-3 d-flex flex-column\">\n        <Form.Label>Operation</Form.Label>\n        <Form.Select\n          onChange={(e) => setParams(\"operation\", e.currentTarget.value)}\n          value={selectedOperation}\n          disabled={!!fixedOperation}\n        >\n          <option value=\"\" key=\"all-operations\">\n            All\n          </option>\n          {enumToOptions(EditOperationTypes)}\n        </Form.Select>\n      </Form.Group>\n      {showVotedFilter && (\n        <Form.Group className=\"mx-2 mb-3 d-flex flex-column\">\n          <Form.Label>Voted</Form.Label>\n          <Form.Select\n            onChange={(e) => setParams(\"voted\", e.currentTarget.value)}\n            value={selectedVoted}\n            disabled={!!fixedVoted}\n          >\n            <option value=\"all\" key=\"all-voted\">\n              All\n            </option>\n            {enumToOptions(UserVotedFilterTypes)}\n          </Form.Select>\n        </Form.Group>\n      )}\n      {showFavoriteOption && (\n        <Form.Group controlId=\"favorite\" className=\"text-center\">\n          <Form.Label>Favorites</Form.Label>\n          <Form.Check\n            className=\"mt-2\"\n            type=\"switch\"\n            defaultChecked={favorite}\n            onChange={(e) =>\n              setParams(\"favorite\", e.currentTarget.checked.toString())\n            }\n          />\n        </Form.Group>\n      )}\n      <Form.Group controlId=\"bot\" className=\"text-center ms-3\">\n        <Form.Label>Bot Edits</Form.Label>\n        <Select\n          className=\"BotFilter\"\n          classNamePrefix=\"react-select\"\n          onChange={(option) => setParams(\"bot\", option?.value ?? \"\")}\n          isClearable={false}\n          components={{ IndicatorSeparator: null }}\n          styles={{\n            valueContainer: (props) => ({ ...props, fontWeight: 400 }),\n          }}\n          options={botOptions}\n          value={botOptions.find((opt) => opt.value === selectedBot)}\n        />\n      </Form.Group>\n      {fixedUserSubmitted === undefined && (\n        <Form.Group\n          controlId=\"include_user_submitted\"\n          className=\"text-center ms-3\"\n        >\n          <Form.Label>My Edits</Form.Label>\n          <Form.Check\n            className=\"mt-2\"\n            type=\"switch\"\n            defaultChecked={userSubmitted}\n            onChange={(e) =>\n              setParams(\"user_submitted\", e.currentTarget.checked.toString())\n            }\n          />\n        </Form.Group>\n      )}\n    </Form>\n  );\n\n  return {\n    editFilter,\n    selectedSort,\n    selectedDirection,\n    selectedType,\n    selectedStatus,\n    selectedOperation,\n    selectedVoted,\n    selectedFavorite,\n    selectedBot,\n    selectedUserSubmitted,\n  };\n};\n\nexport default useEditFilter;\n"
  },
  {
    "path": "frontend/src/hooks/usePagination.ts",
    "content": "import { useQueryParams } from \"src/hooks\";\n\nconst usePagination = () => {\n  const [{ page }, setParams] = useQueryParams({\n    page: { name: \"page\", type: \"number\", default: 1 },\n  });\n\n  const setPage = (pageNumber: number) => setParams(\"page\", pageNumber);\n\n  return { page, setPage };\n};\n\nexport default usePagination;\n"
  },
  {
    "path": "frontend/src/hooks/useQueryParams.ts",
    "content": "// biome-ignore-all lint/performance/noAccumulatingSpread: Necessary for types\nimport { useCallback, useMemo } from \"react\";\nimport { useNavigate, useLocation } from \"react-router-dom\";\nimport querystring from \"query-string\";\nimport { isEqual } from \"lodash-es\";\n\ninterface ParamBase {\n  name: string;\n}\ninterface StringParamConfig extends ParamBase {\n  type: \"string\";\n  default?: string;\n}\ninterface StringArrayParamConfig extends ParamBase {\n  type: \"string[]\";\n  default?: string[];\n}\ninterface NumberParamConfig extends ParamBase {\n  type: \"number\";\n  default?: number;\n}\ninterface NumberArrayParamConfig extends ParamBase {\n  type: \"number[]\";\n  default?: number[];\n}\ninterface BooleanParamConfig extends ParamBase {\n  type: \"boolean\";\n  default?: boolean;\n}\ntype ParamConfig =\n  | StringParamConfig\n  | StringArrayParamConfig\n  | NumberParamConfig\n  | NumberArrayParamConfig\n  | BooleanParamConfig;\ntype QueryParamConfig = Record<string, ParamConfig>;\n\nexport type QueryParams<T extends QueryParamConfig> = {\n  [Property in keyof T]: T[Property] extends StringParamConfig\n    ? string\n    : T[Property] extends StringArrayParamConfig\n      ? string[]\n      : T[Property] extends NumberParamConfig\n        ? number\n        : T[Property] extends NumberArrayParamConfig\n          ? number[]\n          : T[Property] extends BooleanParamConfig\n            ? boolean\n            : never;\n};\n\ntype SetParams<T extends QueryParamConfig, K extends keyof T> = (\n  name: K,\n  value: QueryParams<T>[K] | undefined,\n) => void;\nexport type SetParamsCallback<T extends QueryParamConfig> = SetParams<\n  T,\n  keyof T\n>;\n\nexport const ensureArray = (param?: string | (string | null)[]): string[] => {\n  if (!param) return [];\n  return (Array.isArray(param) ? param : [param]).filter(\n    (val) => val,\n  ) as string[];\n};\n\nexport const ensureNumberArray = (\n  param?: string | (string | null)[],\n): number[] => {\n  return ensureArray(param).map((val) => Number.parseInt(val, 10));\n};\n\nconst getParamValue = (\n  config: ParamConfig,\n  value: string | (string | null)[],\n) => {\n  if (config.default && !value) return config.default;\n  if (config.type === \"number[]\") return ensureNumberArray(value);\n  if (config.type === \"string[]\") return ensureArray(value);\n  if (config.type === \"number\") return parseInt(value.toString(), 10);\n  if (config.type === \"boolean\") return value.toString() === \"true\";\n  return value;\n};\n\nexport const useQueryParams = <T extends QueryParamConfig>(\n  queryParams: T,\n): [QueryParams<T>, SetParamsCallback<T>] => {\n  const navigate = useNavigate();\n  const location = useLocation();\n\n  const allParams = useMemo(() => {\n    const rawQueryParams = querystring.parse(location.search.replace(\"?\", \"\"));\n    const parsedParams = Object.keys(queryParams).reduce(\n      (map, key) => {\n        const config = queryParams[key];\n        const rawValue = rawQueryParams[config.name];\n        rawQueryParams[config.name] = null;\n        const value = getParamValue(config, rawValue || \"\");\n        return { ...map, [key]: value };\n      },\n      {} as QueryParams<T>,\n    );\n\n    return {\n      ...rawQueryParams,\n      ...parsedParams,\n    };\n  }, [location.search, queryParams]);\n\n  const setParams: SetParamsCallback<T> = useCallback(\n    (key, param) => {\n      const rawQueryParams = querystring.parse(\n        location.search.replace(\"?\", \"\"),\n      );\n      const config = queryParams[key];\n      const updatedParams = {\n        ...rawQueryParams,\n        page: undefined,\n        [config.name]: param,\n      };\n      const finalParams = Object.keys(updatedParams).reduce(\n        (params, paramKey) => {\n          const paramConfig = queryParams[paramKey];\n          const paramValue = updatedParams[paramKey];\n          let isDefault = false;\n\n          if (paramConfig) {\n            const values = !Array.isArray(paramValue)\n              ? [paramValue]\n              : paramValue;\n            const defaultValues = !Array.isArray(paramConfig.default)\n              ? [paramConfig.default]\n              : paramConfig.default;\n            isDefault = isEqual(\n              values.map((val) => val?.toString()?.toLowerCase()),\n              defaultValues.map((val) => val?.toString()?.toLowerCase()),\n            );\n          }\n\n          return {\n            ...params,\n            [paramConfig?.name || paramKey]: isDefault ? undefined : paramValue,\n          };\n        },\n        {},\n      );\n      const hash = location.hash ?? \"\";\n      navigate(\n        `${location.pathname}?${querystring\n          .stringify(finalParams)\n          .toLowerCase()}${hash}`,\n        { replace: true },\n      );\n    },\n    [navigate, location.hash, location.pathname, location.search, queryParams],\n  );\n\n  return [allParams, setParams];\n};\n"
  },
  {
    "path": "frontend/src/hooks/useToast.tsx",
    "content": "import React, { useEffect, useState, useContext, createContext } from \"react\";\nimport { Toast } from \"react-bootstrap\";\n\ninterface Message {\n  id: number;\n  content: React.ReactNode | string;\n  variant?: \"success\" | \"danger\" | \"warning\";\n}\n\nconst DISPLAY_TIME = 5000;\nconst ANIMATION_TIME = 1000;\n\nconst ToastContext = createContext<(item: Omit<Message, \"id\">) => void>(\n  () => {},\n);\n\nconst ToastMessage: React.FC<Message> = ({ id, content, variant }) => {\n  const [show, setShow] = useState(true);\n\n  return (\n    <Toast\n      autohide\n      key={id}\n      show={show}\n      onClose={() => setShow(false)}\n      className={`bg-${variant ?? \"success\"}`}\n      delay={DISPLAY_TIME}\n    >\n      <Toast.Header />\n      <Toast.Body>{content}</Toast.Body>\n    </Toast>\n  );\n};\n\ninterface ToastsProps {\n  messages: Message[];\n  setMessages: (messages: Message[]) => void;\n}\n\nconst Toasts: React.FC<ToastsProps> = ({ messages, setMessages }) => {\n  const timer = React.useRef<NodeJS.Timeout>();\n\n  useEffect(() => {\n    if (timer.current) window.clearTimeout(timer.current);\n    if (messages.length)\n      timer.current = setTimeout(\n        () => setMessages?.([]),\n        DISPLAY_TIME + ANIMATION_TIME,\n      );\n  }, [messages, setMessages]);\n\n  const toasts = messages.map((toast) => (\n    <ToastMessage key={toast.id} {...toast} />\n  ));\n\n  return <div className=\"ToastContainer\">{toasts}</div>;\n};\n\ninterface Props {\n  children?: React.ReactNode;\n}\n\nexport const ToastProvider: React.FC<Props> = ({ children }) => {\n  const id = React.useRef(0);\n  const [messages, setMessages] = useState<Message[]>([]);\n\n  const addMessage = (message: Omit<Message, \"id\">) => {\n    console.log(messages);\n    setMessages([...messages, { ...message, id: id.current++ }]);\n  };\n\n  return (\n    <ToastContext.Provider value={addMessage}>\n      {children}\n      <Toasts messages={messages} setMessages={setMessages} />\n    </ToastContext.Provider>\n  );\n};\n\nexport const useToast = () => {\n  const addToast = useContext(ToastContext);\n  return addToast;\n};\n"
  },
  {
    "path": "frontend/src/index.tsx",
    "content": "import { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\n\nconst container = document.getElementById(\"root\");\nif (container) {\n  const root = createRoot(container);\n  root.render(<App />);\n} else {\n  throw Error(\"Root not found\");\n}\n"
  },
  {
    "path": "frontend/src/modules.d.ts",
    "content": "declare module \"*.gql\" {\n  import { DocumentNode } from \"graphql\";\n\n  const value: DocumentNode;\n  export default value;\n}\n\ninterface ImportMetaEnv extends Readonly<Record<string, string>> {\n  readonly VITE_APIKEY?: string;\n  readonly VITE_SERVER_PORT?: string;\n}\n\ninterface ImportMeta {\n  readonly env: ImportMetaEnv;\n}\n"
  },
  {
    "path": "frontend/src/pages/activateUser/ActivateUser.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport type { CombinedGraphQLErrors } from \"@apollo/client\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { useForm } from \"react-hook-form\";\nimport { useNavigate, useLocation } from \"react-router-dom\";\nimport { Button, Form, Row, Col } from \"react-bootstrap\";\nimport * as yup from \"yup\";\nimport cx from \"classnames\";\n\nimport { useActivateUser } from \"src/graphql\";\nimport { ROUTE_HOME, ROUTE_LOGIN } from \"src/constants/route\";\nimport Title from \"src/components/title\";\nimport { useCurrentUser } from \"src/hooks\";\n\nconst schema = yup.object({\n  name: yup.string().trim().required(\"Username is required\"),\n  activationKey: yup\n    .string()\n    .trim()\n    .uuid(\"Invalid activation key\")\n    .required(\"Activation key is required\"),\n  password: yup.string().required(\"Password is required\"),\n});\ntype ActivateNewUserFormData = yup.InferType<typeof schema>;\n\nfunction useQuery() {\n  return new URLSearchParams(useLocation().search);\n}\n\nconst ActivateNewUserPage: FC = () => {\n  const query = useQuery();\n  const navigate = useNavigate();\n  const { isAuthenticated } = useCurrentUser();\n  const [submitError, setSubmitError] = useState<string | undefined>();\n\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm<ActivateNewUserFormData>({\n    resolver: yupResolver(schema),\n  });\n\n  const [activateNewUser] = useActivateUser();\n\n  if (isAuthenticated) navigate(ROUTE_HOME);\n\n  const onSubmit = (formData: ActivateNewUserFormData) => {\n    const userData = {\n      name: formData.name,\n      activation_key: formData.activationKey,\n      password: formData.password,\n    };\n    setSubmitError(undefined);\n    activateNewUser({ variables: { input: userData } })\n      .then(() => {\n        navigate(`${ROUTE_LOGIN}?msg=account-created`);\n      })\n      .catch((err?: CombinedGraphQLErrors) => {\n        if (err?.message) {\n          setSubmitError(err.message);\n        }\n      });\n  };\n\n  const errorList = [\n    errors.activationKey?.message,\n    errors.name?.message,\n    errors.password?.message,\n    submitError,\n  ].filter((err): err is string => err !== undefined);\n\n  return (\n    <div className=\"LoginPrompt\">\n      <Title page=\"Active User\" />\n      <Form\n        className=\"align-self-center col-8 mx-auto\"\n        onSubmit={handleSubmit(onSubmit)}\n      >\n        <Form.Control\n          type=\"hidden\"\n          value={query.get(\"key\") ?? \"\"}\n          {...register(\"activationKey\")}\n        />\n\n        <Form.Group controlId=\"name\">\n          <h3>Register account</h3>\n          <hr className=\"my-4\" />\n          <Row>\n            <Col xs={4}>\n              <Form.Label>Username:</Form.Label>\n            </Col>\n            <Col xs={8}>\n              <Form.Control\n                className={cx({ \"is-invalid\": errors?.name })}\n                type=\"text\"\n                placeholder=\"Username\"\n                {...register(\"name\")}\n              />\n            </Col>\n          </Row>\n        </Form.Group>\n\n        <Form.Group controlId=\"password\" className=\"mt-2\">\n          <Row>\n            <Col xs={4}>\n              <Form.Label>Password:</Form.Label>\n            </Col>\n            <Col xs={8}>\n              <Form.Control\n                className={cx({ \"is-invalid\": errors?.password })}\n                type=\"password\"\n                placeholder=\"Password\"\n                {...register(\"password\")}\n              />\n            </Col>\n          </Row>\n        </Form.Group>\n\n        {errorList.map((error) => (\n          <Row key={error} className=\"text-end text-danger\">\n            <div>{error}</div>\n          </Row>\n        ))}\n\n        <Row>\n          <Col\n            xs={{ span: 3, offset: 9 }}\n            className=\"justify-content-end mt-2 d-flex\"\n          >\n            <Button type=\"submit\">Create Account</Button>\n          </Col>\n        </Row>\n      </Form>\n    </div>\n  );\n};\n\nexport default ActivateNewUserPage;\n"
  },
  {
    "path": "frontend/src/pages/activateUser/index.ts",
    "content": "export { default } from \"./ActivateUser\";\n"
  },
  {
    "path": "frontend/src/pages/audits/AmendmentAuditDetails.tsx",
    "content": "import type { FC } from \"react\";\n\ninterface EditAmendmentData {\n  edit_id: string;\n  removed_data: Record<string, unknown>;\n}\n\nfunction parseAmendmentData(data: string): EditAmendmentData | null {\n  try {\n    return JSON.parse(data) as EditAmendmentData;\n  } catch {\n    return null;\n  }\n}\n\nfunction formatValue(value: unknown): string {\n  if (value === null || value === undefined) return \"\";\n  if (typeof value === \"object\") return JSON.stringify(value, null, 2);\n  return String(value);\n}\n\nconst AmendmentAuditDetails: FC<{ data: string }> = ({ data }) => {\n  const parsed = parseAmendmentData(data);\n  if (!parsed?.removed_data) return null;\n\n  const entries = Object.entries(parsed.removed_data);\n  if (entries.length === 0) return null;\n\n  return (\n    <div className=\"p-3 bg-dark\">\n      <h6>Amendment Details</h6>\n      <div className=\"mb-2\">\n        <strong>Edit ID:</strong> {parsed.edit_id}\n      </div>\n      <div className=\"mb-2\">\n        <strong>Removed:</strong>\n        <ul className=\"mb-0 mt-1\">\n          {entries.map(([field, value]) => (\n            <li key={field}>\n              <strong>{field}:</strong>\n              <pre className=\"mb-0 ms-2\">{formatValue(value)}</pre>\n            </li>\n          ))}\n        </ul>\n      </div>\n    </div>\n  );\n};\n\nexport default AmendmentAuditDetails;\n"
  },
  {
    "path": "frontend/src/pages/audits/AuditRow.tsx",
    "content": "import type { FC } from \"react\";\nimport { useState } from \"react\";\nimport { Button } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport {\n  faChevronDown,\n  faChevronRight,\n} from \"@fortawesome/free-solid-svg-icons\";\n\nimport { Icon } from \"src/components/fragments\";\nimport { formatDateTime, createHref } from \"src/utils\";\nimport { ROUTE_USER } from \"src/constants/route\";\nimport DeleteAuditDetails from \"./DeleteAuditDetails\";\nimport AmendmentAuditDetails from \"./AmendmentAuditDetails\";\n\nconst actionLabels: Record<string, string> = {\n  EDIT_DELETE: \"Edit Deleted\",\n  EDIT_AMENDMENT: \"Edit Amended\",\n};\n\nexport interface AuditRowProps {\n  audit: {\n    id: string;\n    action: string;\n    user?: { id: string; name: string } | null;\n    target_id: string;\n    target_type: string;\n    data: string;\n    reason?: string | null;\n    created_at: string;\n  };\n}\n\nconst AuditRow: FC<AuditRowProps> = ({ audit }) => {\n  const [expanded, setExpanded] = useState(false);\n  const actionLabel = actionLabels[audit.action] ?? audit.action;\n\n  return (\n    <>\n      <tr>\n        <td className=\"text-nowrap\" style={{ width: \"40px\" }}>\n          <Button\n            variant=\"link\"\n            size=\"sm\"\n            onClick={() => setExpanded(!expanded)}\n            className=\"p-0\"\n          >\n            <Icon icon={expanded ? faChevronDown : faChevronRight} />\n          </Button>\n        </td>\n        <td className=\"text-nowrap\">{formatDateTime(audit.created_at)}</td>\n        <td>{actionLabel}</td>\n        <td>\n          {audit.user ? (\n            <Link to={createHref(ROUTE_USER, audit.user)}>\n              {audit.user.name}\n            </Link>\n          ) : (\n            <em>Deleted User</em>\n          )}\n        </td>\n        <td>\n          {audit.target_type === \"EDIT\" ? (\n            <span>Edit {audit.target_id.slice(0, 8)}</span>\n          ) : (\n            audit.target_id\n          )}\n        </td>\n        <td className=\"text-truncate\" style={{ maxWidth: \"300px\" }}>\n          {audit.reason || <em>No reason provided</em>}\n        </td>\n      </tr>\n      <tr className={expanded ? \"\" : \"d-none\"}>\n        <td colSpan={6} className=\"p-0 border-0\">\n          {audit.action === \"EDIT_DELETE\" && (\n            <DeleteAuditDetails data={audit.data} />\n          )}\n          {audit.action === \"EDIT_AMENDMENT\" && (\n            <AmendmentAuditDetails data={audit.data} />\n          )}\n        </td>\n      </tr>\n    </>\n  );\n};\n\nexport default AuditRow;\n"
  },
  {
    "path": "frontend/src/pages/audits/Audits.tsx",
    "content": "import type { FC } from \"react\";\nimport { Table } from \"react-bootstrap\";\n\nimport { useModAudits } from \"src/graphql\";\nimport { usePagination } from \"src/hooks\";\nimport { ErrorMessage } from \"src/components/fragments\";\nimport { List } from \"src/components/list\";\nimport Title from \"src/components/title\";\nimport AuditRow from \"./AuditRow\";\n\nconst PER_PAGE = 25;\n\nconst AuditsComponent: FC = () => {\n  const { page, setPage } = usePagination();\n  const { loading, data } = useModAudits({\n    input: {\n      page,\n      per_page: PER_PAGE,\n    },\n  });\n\n  if (!loading && !data)\n    return <ErrorMessage error=\"Failed to load audit logs.\" />;\n\n  const audits = data?.queryModAudits.audits.map((audit) => (\n    <AuditRow key={audit.id} audit={audit} />\n  ));\n\n  return (\n    <>\n      <Title page=\"Audit Logs\" />\n      <h3>Moderator Audit Logs</h3>\n      <List\n        entityName=\"audits\"\n        page={page}\n        setPage={setPage}\n        perPage={PER_PAGE}\n        loading={loading}\n        listCount={data?.queryModAudits.count}\n      >\n        <Table striped className=\"audits-table\" variant=\"dark\">\n          <thead>\n            <tr>\n              <th style={{ width: \"40px\" }}></th>\n              <th>Date</th>\n              <th>Action</th>\n              <th>User</th>\n              <th>Target</th>\n              <th>Reason</th>\n            </tr>\n          </thead>\n          <tbody>{audits}</tbody>\n        </Table>\n      </List>\n    </>\n  );\n};\n\nexport default AuditsComponent;\n"
  },
  {
    "path": "frontend/src/pages/audits/DeleteAuditDetails.tsx",
    "content": "import type { FC } from \"react\";\n\nimport { formatDateTime } from \"src/utils\";\n\ninterface EditDeleteData {\n  id: string;\n  user_id: { UUID: string; Valid: boolean } | null;\n  target_type: string;\n  operation: string;\n  status: string;\n  applied: boolean;\n  votes: number;\n  bot: boolean;\n  data: unknown;\n  created_at: string;\n  deleted_by: string;\n  deleted_at: string;\n}\n\nconst DeleteAuditDetails: FC<{ data: string }> = ({ data }) => {\n  let parsed: EditDeleteData;\n  try {\n    parsed = JSON.parse(data) as EditDeleteData;\n  } catch {\n    return null;\n  }\n\n  return (\n    <div className=\"p-3 bg-dark\">\n      <h6>Edit Details</h6>\n      <div className=\"mb-2\">\n        <strong>Edit ID:</strong> {parsed.id}\n      </div>\n      <div className=\"mb-2\">\n        <strong>Operation:</strong> {parsed.operation} {parsed.target_type}\n      </div>\n      <div className=\"mb-2\">\n        <strong>Status:</strong> {parsed.status}\n        {parsed.applied && \" (Applied)\"}\n      </div>\n      <div className=\"mb-2\">\n        <strong>Vote Count:</strong> {parsed.votes}\n      </div>\n      <div className=\"mb-2\">\n        <strong>Created:</strong> {formatDateTime(parsed.created_at)}\n      </div>\n      <div className=\"mb-2\">\n        <strong>Bot Edit:</strong> {parsed.bot ? \"Yes\" : \"No\"}\n      </div>\n      <div className=\"mt-3\">\n        <strong>Edit Data:</strong>\n        <pre className=\"mt-2 p-2 bg-secondary rounded\">\n          <code>{JSON.stringify(parsed.data, null, 2)}</code>\n        </pre>\n      </div>\n    </div>\n  );\n};\n\nexport default DeleteAuditDetails;\n"
  },
  {
    "path": "frontend/src/pages/audits/index.tsx",
    "content": "import type { FC } from \"react\";\nimport { Route, Routes } from \"react-router-dom\";\n\nimport Audits from \"./Audits\";\n\nconst AuditRoutes: FC = () => (\n  <Routes>\n    <Route path=\"/\" element={<Audits />} />\n  </Routes>\n);\n\nexport default AuditRoutes;\n"
  },
  {
    "path": "frontend/src/pages/categories/Categories.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Button, Card } from \"react-bootstrap\";\nimport { sortBy, groupBy } from \"lodash-es\";\n\nimport { useCategories } from \"src/graphql\";\nimport { LoadingIndicator } from \"src/components/fragments\";\nimport { createHref } from \"src/utils\";\nimport { ROUTE_CATEGORY, ROUTE_CATEGORY_ADD } from \"src/constants/route\";\nimport { useCurrentUser } from \"src/hooks\";\n\nconst CategoryList: FC = () => {\n  const { isAdmin } = useCurrentUser();\n  const { loading, data } = useCategories();\n\n  const categoryGroups = groupBy(\n    sortBy(data?.queryTagCategories?.tag_categories ?? [], (cat) => cat.name),\n    (cat) => cat.group,\n  );\n\n  const categories = Object.keys(categoryGroups).map((group) => (\n    <div key={group}>\n      <h6>{group}</h6>\n      <ul>\n        {categoryGroups[group].map((category) => (\n          <li key={category.id}>\n            <Link to={createHref(ROUTE_CATEGORY, category)}>\n              {category.name}\n            </Link>\n            {category.description && (\n              <span className=\"ms-2\">\n                &bull;\n                <small className=\"ms-2\">{category.description}</small>\n              </span>\n            )}\n          </li>\n        ))}\n      </ul>\n    </div>\n  ));\n\n  return (\n    <>\n      <div className=\"d-flex\">\n        <h3 className=\"me-4\">Categories</h3>\n        {isAdmin && (\n          <Link to={ROUTE_CATEGORY_ADD} className=\"ms-auto\">\n            <Button>Create</Button>\n          </Link>\n        )}\n      </div>\n      <Card>\n        <Card.Body className=\"p-4\">\n          {loading && <LoadingIndicator message=\"Loading categories...\" />}\n          {!loading && categories}\n        </Card.Body>\n      </Card>\n    </>\n  );\n};\n\nexport default CategoryList;\n"
  },
  {
    "path": "frontend/src/pages/categories/Category.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { Button, Row } from \"react-bootstrap\";\n\nimport { useDeleteCategory, type CategoryQuery } from \"src/graphql\";\nimport { createHref } from \"src/utils\";\nimport DeleteButton from \"src/components/deleteButton\";\nimport { TagList } from \"src/components/list\";\nimport { ROUTE_CATEGORIES, ROUTE_CATEGORY_EDIT } from \"src/constants/route\";\nimport { useCurrentUser } from \"src/hooks\";\n\ntype Category = NonNullable<CategoryQuery[\"findTagCategory\"]>;\n\ninterface Props {\n  category: Category;\n}\n\nconst CategoryComponent: FC<Props> = ({ category }) => {\n  const navigate = useNavigate();\n  const { isAdmin } = useCurrentUser();\n\n  const [deleteCategory, { loading: deleting }] = useDeleteCategory({\n    onCompleted: (result) => {\n      if (result) navigate(ROUTE_CATEGORIES);\n    },\n  });\n\n  const handleDelete = () => {\n    deleteCategory({\n      variables: {\n        input: { id: category.id },\n      },\n    });\n  };\n\n  return (\n    <>\n      <Link to={ROUTE_CATEGORIES}>\n        <h6 className=\"mb-4\">&larr; Category List</h6>\n      </Link>\n      <div className=\"d-flex\">\n        <h3 className=\"me-auto\">\n          <em>{category.name}</em>\n        </h3>\n        <div className=\"ms-auto\">\n          {isAdmin && (\n            <>\n              <Link\n                to={createHref(ROUTE_CATEGORY_EDIT, category)}\n                className=\"me-2\"\n              >\n                <Button>Edit</Button>\n              </Link>\n              <DeleteButton\n                onClick={handleDelete}\n                disabled={deleting}\n                message=\"Do you want to delete category? This is only possible if no tags are attached.\"\n              />\n            </>\n          )}\n        </div>\n      </div>\n      {category.description && (\n        <Row className=\"g-0\">\n          <b className=\"me-2\">Description:</b>\n          <span>{category.description}</span>\n        </Row>\n      )}\n      <hr className=\"my-2 mb-4\" />\n      <TagList tagFilter={{ category_id: category.id }} />\n    </>\n  );\n};\n\nexport default CategoryComponent;\n"
  },
  {
    "path": "frontend/src/pages/categories/CategoryAdd.tsx",
    "content": "import type { FC } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport { useAddCategory, type TagCategoryCreateInput } from \"src/graphql\";\nimport { categoryHref } from \"src/utils\";\nimport CategoryForm from \"./categoryForm\";\n\nconst AddCategory: FC = () => {\n  const navigate = useNavigate();\n  const [createCategory] = useAddCategory({\n    onCompleted: (data) => {\n      if (data?.tagCategoryCreate?.id)\n        navigate(categoryHref(data.tagCategoryCreate));\n    },\n  });\n\n  const doInsert = (insertData: TagCategoryCreateInput) => {\n    createCategory({\n      variables: {\n        categoryData: insertData,\n      },\n    });\n  };\n\n  return (\n    <div>\n      <h3>Add new tag category</h3>\n      <hr />\n      <CategoryForm callback={doInsert} />\n    </div>\n  );\n};\n\nexport default AddCategory;\n"
  },
  {
    "path": "frontend/src/pages/categories/CategoryEdit.tsx",
    "content": "import type { FC } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  useUpdateCategory,\n  type TagCategoryCreateInput,\n  type CategoryQuery,\n} from \"src/graphql\";\nimport { categoryHref } from \"src/utils\";\nimport CategoryForm from \"./categoryForm\";\n\ntype Category = NonNullable<CategoryQuery[\"findTagCategory\"]>;\n\ninterface Props {\n  category: Category;\n}\n\nconst UpdateCategory: FC<Props> = ({ category }) => {\n  const navigate = useNavigate();\n  const [updateCategory] = useUpdateCategory({\n    onCompleted: (result) => {\n      if (result?.tagCategoryUpdate?.id)\n        navigate(categoryHref(result.tagCategoryUpdate));\n    },\n  });\n\n  const doUpdate = (insertData: TagCategoryCreateInput) => {\n    updateCategory({\n      variables: {\n        categoryData: {\n          id: category.id,\n          ...insertData,\n        },\n      },\n    });\n  };\n\n  return (\n    <div>\n      <h3>\n        Update <em>{category.name}</em>\n      </h3>\n      <hr />\n      <CategoryForm callback={doUpdate} category={category} id={category.id} />\n    </div>\n  );\n};\n\nexport default UpdateCategory;\n"
  },
  {
    "path": "frontend/src/pages/categories/categoryForm/CategoryForm.tsx",
    "content": "import type { FC } from \"react\";\nimport { useNavigate, Link } from \"react-router-dom\";\nimport { useForm } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as yup from \"yup\";\nimport cx from \"classnames\";\nimport { Button, Form } from \"react-bootstrap\";\n\nimport {\n  TagGroupEnum,\n  type TagCategoryCreateInput,\n  type CategoryQuery,\n} from \"src/graphql\";\nimport { createHref } from \"src/utils\";\nimport { ROUTE_CATEGORIES, ROUTE_CATEGORY } from \"src/constants/route\";\n\ntype Category = NonNullable<CategoryQuery[\"findTagCategory\"]>;\n\nconst groups = Object.keys(TagGroupEnum);\n\nconst schema = yup.object({\n  name: yup.string().required(\"Name is required\"),\n  description: yup.string(),\n  group: yup.mixed().oneOf(groups).required(\"Group is required\"),\n});\n\ntype CategoryFormData = yup.Asserts<typeof schema>;\n\ninterface TagProps {\n  id?: string;\n  category?: Category;\n  callback: (data: TagCategoryCreateInput) => void;\n}\n\nconst TagForm: FC<TagProps> = ({ id, category, callback }) => {\n  const navigate = useNavigate();\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm({\n    resolver: yupResolver(schema),\n  });\n\n  const onSubmit = (data: CategoryFormData) => {\n    const callbackData: TagCategoryCreateInput = {\n      name: data.name,\n      description: data.description ?? null,\n      group: data.group as TagGroupEnum,\n    };\n    callback(callbackData);\n  };\n\n  return (\n    <Form className=\"TagForm col-6\" onSubmit={handleSubmit(onSubmit)}>\n      <Form.Group controlId=\"name\" className=\"mb-3\">\n        <Form.Label>Name</Form.Label>\n        <Form.Control\n          type=\"text\"\n          className={cx({ \"is-invalid\": errors.name })}\n          placeholder=\"Name\"\n          {...register(\"name\")}\n          defaultValue={category?.name ?? \"\"}\n        />\n        <div className=\"invalid-feedback\">{errors?.name?.message}</div>\n      </Form.Group>\n\n      <Form.Group controlId=\"description\" className=\"mb-3\">\n        <Form.Label>Description</Form.Label>\n        <Form.Control\n          placeholder=\"Description\"\n          defaultValue={category?.description ?? \"\"}\n          {...register(\"description\")}\n        />\n      </Form.Group>\n\n      <Form.Group className=\"mb-3\">\n        <Form.Label>Group</Form.Label>\n        <Form.Select\n          defaultValue={category?.group ?? TagGroupEnum.ACTION}\n          {...register(\"group\")}\n        >\n          {groups.map((g) => (\n            <option value={g} key={g}>{`${g.charAt(0).toUpperCase()}${g\n              .toLowerCase()\n              .slice(1)}`}</option>\n          ))}\n        </Form.Select>\n      </Form.Group>\n\n      <Form.Group className=\"d-flex mb-3\">\n        <Button type=\"submit\" className=\"col-2\">\n          Save\n        </Button>\n        <Button type=\"reset\" className=\"ms-auto me-2\">\n          Reset\n        </Button>\n        <Link to={createHref(id ? ROUTE_CATEGORY : ROUTE_CATEGORIES, { id })}>\n          <Button variant=\"danger\" onClick={() => navigate(-1)}>\n            Cancel\n          </Button>\n        </Link>\n      </Form.Group>\n    </Form>\n  );\n};\n\nexport default TagForm;\n"
  },
  {
    "path": "frontend/src/pages/categories/categoryForm/index.ts",
    "content": "export { default } from \"./CategoryForm\";\n"
  },
  {
    "path": "frontend/src/pages/categories/index.tsx",
    "content": "import type { FC } from \"react\";\nimport { useParams, Route, Routes } from \"react-router-dom\";\nimport { ErrorMessage, LoadingIndicator } from \"src/components/fragments\";\nimport Title from \"src/components/title\";\n\nimport { useCategory } from \"src/graphql\";\n\nimport Category from \"./Category\";\nimport Categories from \"./Categories\";\nimport CategoryAdd from \"./CategoryAdd\";\nimport CategoryEdit from \"./CategoryEdit\";\n\nconst CategoryLoader: FC = () => {\n  const { id } = useParams();\n  const { data, loading } = useCategory({ id: id ?? \"\" }, !id);\n\n  if (!id) return <ErrorMessage error=\"Category ID is required\" />;\n  if (loading) return <LoadingIndicator message=\"Loading...\" />;\n  if (!data?.findTagCategory)\n    return <ErrorMessage error=\"Category not found\" />;\n\n  return (\n    <Routes>\n      <Route\n        path=\"/edit\"\n        element={\n          <>\n            <Title page={`Edit Category \"${data.findTagCategory.name}\"`} />\n            <CategoryEdit category={data.findTagCategory} />\n          </>\n        }\n      />\n      <Route\n        path=\"/\"\n        element={\n          <>\n            <Title page={`Category \"${data.findTagCategory.name}\"`} />\n            <Category category={data.findTagCategory} />\n          </>\n        }\n      />\n    </Routes>\n  );\n};\n\nconst CategoryRoutes: FC = () => (\n  <Routes>\n    <Route\n      path=\"/\"\n      element={\n        <>\n          <Title page=\"Categories\" />\n          <Categories />\n        </>\n      }\n    />\n    <Route\n      path=\"/add\"\n      element={\n        <>\n          <Title page=\"Add Category\" />\n          <CategoryAdd />\n        </>\n      }\n    />\n    <Route path=\"/:id/*\" element={<CategoryLoader />} />\n  </Routes>\n);\n\nexport default CategoryRoutes;\n"
  },
  {
    "path": "frontend/src/pages/drafts/Draft.tsx",
    "content": "import type { DraftQuery } from \"src/graphql\";\nimport SceneDraft from \"./SceneDraft\";\nimport PerformerDraft from \"./PerformerDraft\";\n\ntype Draft = NonNullable<DraftQuery[\"findDraft\"]>;\n\nconst DraftComponent: React.FC<{ draft: Draft }> = ({ draft }) => {\n  if (draft.data.__typename === \"SceneDraft\")\n    return <SceneDraft draft={{ ...draft, data: draft.data }} />;\n  else return <PerformerDraft draft={{ ...draft, data: draft.data }} />;\n};\n\nexport default DraftComponent;\n"
  },
  {
    "path": "frontend/src/pages/drafts/Drafts.tsx",
    "content": "import type React from \"react\";\nimport { Button, Card } from \"react-bootstrap\";\nimport { sortBy } from \"lodash-es\";\nimport { Link } from \"react-router-dom\";\nimport {\n  parseInstant,\n  formatDistance,\n  isInstantInFuture,\n  formatInstant,\n} from \"src/utils\";\nimport { Icon, LoadingIndicator, Tooltip } from \"src/components/fragments\";\nimport { faTrash } from \"@fortawesome/free-solid-svg-icons\";\n\nimport { useDrafts, useDeleteDraft } from \"src/graphql\";\n\nconst DraftList: React.FC = () => {\n  const { loading, data, refetch } = useDrafts();\n  const [deleteDraft, { loading: destroying }] = useDeleteDraft();\n\n  const handleDelete = (id: string) => {\n    deleteDraft({ variables: { id } }).then(() => refetch());\n  };\n\n  return (\n    <>\n      <h3 className=\"me-4\">Drafts</h3>\n      <Card>\n        <Card.Body className=\"p-4\">\n          {loading && <LoadingIndicator message=\"Loading drafts...\" />}\n          {!loading && data !== undefined && !data?.findDrafts.length && (\n            <>\n              <h6>No drafts saved.</h6>\n              <p>Scene and performer drafts can be submitted from Stash.</p>\n            </>\n          )}\n          <ul className=\"ps-0\">\n            {sortBy(data?.findDrafts ?? [], \"expires\").map((draft) => {\n              const expirationDate = parseInstant(draft.expires);\n              const expiration =\n                expirationDate && isInstantInFuture(expirationDate)\n                  ? formatDistance(expirationDate)\n                  : \"in a moment\";\n              return (\n                <li key={draft.id} className=\"d-block\">\n                  {draft.data.__typename === \"PerformerDraft\" ? (\n                    <Link to={`/drafts/${draft.id}`}>\n                      Performer {draft.data.id ? \"update\" : \"addition\"}:{\" \"}\n                      <b>{draft.data.name}</b>\n                    </Link>\n                  ) : (\n                    <Link to={`/drafts/${draft.id}`}>\n                      Scene {draft.data.id ? \"update\" : \"addition\"}:{\" \"}\n                      <b>{draft.data.title}</b>\n                    </Link>\n                  )}\n                  <span className=\"ms-2\">\n                    &bull;\n                    <Tooltip\n                      delay={200}\n                      text={expirationDate ? formatInstant(expirationDate) : \"\"}\n                    >\n                      <small className=\"ms-2\">Expires {expiration}</small>\n                    </Tooltip>\n                  </span>\n                  <Button\n                    onClick={() => handleDelete(draft.id)}\n                    disabled={destroying}\n                    title=\"Delete draft\"\n                    variant=\"minimal\"\n                  >\n                    <Icon icon={faTrash} color=\"red\" />\n                  </Button>\n                </li>\n              );\n            })}\n          </ul>\n        </Card.Body>\n      </Card>\n    </>\n  );\n};\n\nexport default DraftList;\n"
  },
  {
    "path": "frontend/src/pages/drafts/PerformerDraft.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link, useNavigate } from \"react-router-dom\";\n\nimport {\n  usePerformer,\n  usePerformerEdit,\n  OperationEnum,\n  type PerformerEditDetailsInput,\n  type DraftQuery,\n  useSites,\n} from \"src/graphql\";\nimport { LoadingIndicator } from \"src/components/fragments\";\nimport { editHref, performerHref } from \"src/utils\";\nimport { parsePerformerDraft } from \"./parse\";\n\ntype Draft = NonNullable<DraftQuery[\"findDraft\"]>;\ntype PerformerDraft = Draft[\"data\"] & { __typename: \"PerformerDraft\" };\n\nimport PerformerForm from \"src/pages/performers/performerForm\";\n\ninterface Props {\n  draft: Omit<Draft, \"data\"> & { data: PerformerDraft };\n}\n\nconst AddPerformerDraft: FC<Props> = ({ draft }) => {\n  const isUpdate = Boolean(draft.data.id);\n  const navigate = useNavigate();\n  const [submitPerformerEdit, { loading: saving }] = usePerformerEdit({\n    onCompleted: (data) => {\n      if (data.performerEdit.id) navigate(editHref(data.performerEdit));\n    },\n  });\n  const { data: performer, loading: loadingPerformer } = usePerformer(\n    { id: draft.data.id ?? \"\" },\n    !isUpdate,\n  );\n  const { data: sitesData, loading: loadingSites } = useSites();\n\n  if (loadingPerformer || loadingSites) return <LoadingIndicator />;\n\n  const doInsert = (\n    updateData: PerformerEditDetailsInput,\n    editNote: string,\n    setModifyAliases: boolean,\n  ) => {\n    const details: PerformerEditDetailsInput = {\n      ...updateData,\n      draft_id: draft.id,\n    };\n\n    submitPerformerEdit({\n      variables: {\n        performerData: {\n          edit: {\n            id: draft.data.id,\n            operation: isUpdate ? OperationEnum.MODIFY : OperationEnum.CREATE,\n            comment: editNote,\n          },\n          details,\n          options: {\n            set_modify_aliases: isUpdate ? setModifyAliases : undefined,\n          },\n        },\n      },\n    });\n  };\n\n  const [initialPerformer, unparsed] = parsePerformerDraft(\n    draft.data,\n    performer?.findPerformer ?? undefined,\n    sitesData?.querySites.sites ?? [],\n  );\n  const remainder = Object.entries(unparsed)\n    .filter(([, val]) => !!val)\n    .map(([key, val]) => (\n      <li key={key}>\n        <b className=\"me-2\">{key}:</b>\n        <span>{val}</span>\n      </li>\n    ));\n\n  return (\n    <div>\n      <h3>{isUpdate ? \"Update\" : \"Add new\"} performer from draft</h3>\n      {isUpdate && performer?.findPerformer && (\n        <h6>\n          Performer:{\" \"}\n          <Link to={performerHref(performer.findPerformer)}>\n            {performer.findPerformer?.name}\n          </Link>\n        </h6>\n      )}\n      <hr />\n      {remainder.length > 0 && (\n        <>\n          <h6>Unmatched data:</h6>\n          <ul>{remainder}</ul>\n          <hr />\n        </>\n      )}\n      <PerformerForm\n        performer={performer?.findPerformer ?? undefined}\n        callback={doInsert}\n        saving={saving}\n        initial={initialPerformer}\n      />\n    </div>\n  );\n};\n\nexport default AddPerformerDraft;\n"
  },
  {
    "path": "frontend/src/pages/drafts/SceneDraft.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate, Link } from \"react-router-dom\";\nimport { Alert, Col, Row } from \"react-bootstrap\";\n\nimport { sceneHref } from \"src/utils/route\";\nimport {\n  useScene,\n  useSceneEdit,\n  OperationEnum,\n  type SceneEditDetailsInput,\n  FingerprintAlgorithm,\n  type DraftQuery,\n  useSites,\n} from \"src/graphql\";\nimport { LoadingIndicator } from \"src/components/fragments\";\nimport { editHref } from \"src/utils\";\nimport { parseSceneDraft } from \"./parse\";\n\ntype Draft = NonNullable<DraftQuery[\"findDraft\"]>;\ntype SceneDraft = Draft[\"data\"] & { __typename: \"SceneDraft\" };\n\nimport SceneForm from \"src/pages/scenes/sceneForm\";\n\ninterface Props {\n  draft: Omit<Draft, \"data\"> & { data: SceneDraft };\n}\n\nconst SceneDraftAdd: FC<Props> = ({ draft }) => {\n  const isUpdate = Boolean(draft.data.id);\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [submitSceneEdit, { loading: saving }] = useSceneEdit({\n    onCompleted: (data) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (data.sceneEdit.id) navigate(editHref(data.sceneEdit));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n  const { data: scene, loading: loadingScene } = useScene(\n    { id: draft.data.id ?? \"\" },\n    !isUpdate,\n  );\n\n  const doInsert = (updateData: SceneEditDetailsInput, editNote: string) => {\n    const details: SceneEditDetailsInput = {\n      ...updateData,\n      fingerprints: !isUpdate ? draft.data.fingerprints : undefined,\n      draft_id: draft.id,\n    };\n\n    submitSceneEdit({\n      variables: {\n        sceneData: {\n          edit: {\n            id: draft.data.id,\n            operation: isUpdate ? OperationEnum.MODIFY : OperationEnum.CREATE,\n            comment: editNote,\n          },\n          details,\n        },\n      },\n    });\n  };\n  const { data: sitesData, loading: loadingSites } = useSites();\n\n  if (loadingScene || loadingSites) return <LoadingIndicator />;\n\n  const [initialScene, unparsed] = parseSceneDraft(\n    draft.data,\n    scene?.findScene ?? undefined,\n    sitesData?.querySites.sites ?? [],\n  );\n  const remainder = Object.entries(unparsed)\n    .filter(([, val]) => !!val)\n    .map(([key, val]) => (\n      <li key={key}>\n        <b className=\"me-2\">{key}:</b>\n        <span>{val}</span>\n      </li>\n    ));\n\n  const phashMissing =\n    !isUpdate &&\n    draft.data.fingerprints.filter(\n      (f) => f.algorithm === FingerprintAlgorithm.PHASH,\n    ).length === 0;\n\n  return (\n    <div>\n      <h3>{isUpdate ? \"Update\" : \"Add new\"} scene from draft</h3>\n      {isUpdate && scene?.findScene && (\n        <h6>\n          Scene:{\" \"}\n          <Link to={sceneHref(scene.findScene)}>{scene.findScene?.title}</Link>\n        </h6>\n      )}\n      <hr />\n      {remainder.length > 0 && (\n        <>\n          <h6>Unmatched data:</h6>\n          <ul>{remainder}</ul>\n          <hr />\n        </>\n      )}\n      {phashMissing && (\n        <Row>\n          <Col xs={9}>\n            <Alert variant=\"warning\">\n              <b>Warning</b>: The draft does not include a perceptual hash\n              (PHASH) for your scene, so it might not pass voting.\n            </Alert>\n          </Col>\n        </Row>\n      )}\n      <SceneForm\n        scene={scene?.findScene ?? undefined}\n        initial={initialScene}\n        callback={doInsert}\n        saving={saving}\n        isCreate={!isUpdate}\n        draftFingerprints={draft.data.fingerprints}\n      />\n      {submissionError && (\n        <div className=\"text-danger text-end col-9\">\n          Error: {submissionError}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default SceneDraftAdd;\n"
  },
  {
    "path": "frontend/src/pages/drafts/index.tsx",
    "content": "import type React from \"react\";\nimport { Route, Routes, useParams } from \"react-router-dom\";\n\nimport { useDraft, type DraftQuery } from \"src/graphql\";\nimport { ErrorMessage, LoadingIndicator } from \"src/components/fragments\";\nimport Title from \"src/components/title\";\n\ntype DraftData = NonNullable<DraftQuery[\"findDraft\"]>[\"data\"];\ntype SceneDraft = DraftData & { __typename: \"SceneDraft\" };\ntype PerformerDraft = DraftData & { __typename: \"PerformerDraft\" };\n\nimport Draft from \"./Draft\";\nimport Drafts from \"./Drafts\";\n\nconst DraftLoader: React.FC = () => {\n  const { id } = useParams();\n  const { data, loading } = useDraft({ id: id ?? \"\" }, !id);\n\n  if (loading) return <LoadingIndicator message=\"Loading draft...\" />;\n\n  if (!id) return <ErrorMessage error=\"Draft ID is missing\" />;\n\n  const draft = data?.findDraft;\n  if (!draft) return <ErrorMessage error=\"Draft not found.\" />;\n\n  return (\n    <>\n      <Title\n        page={`Draft \"${\n          (draft.data as SceneDraft).title ||\n          (draft.data as PerformerDraft).name\n        }\"`}\n      />\n      <Draft draft={draft} />\n    </>\n  );\n};\n\nconst DraftRoutes: React.FC = () => (\n  <Routes>\n    <Route\n      path=\"/\"\n      element={\n        <>\n          <Title page=\"Drafts\" />\n          <Drafts />\n        </>\n      }\n    />\n    <Route path=\"/:id/*\" element={<DraftLoader />} />\n  </Routes>\n);\n\nexport default DraftRoutes;\n"
  },
  {
    "path": "frontend/src/pages/drafts/parse.ts",
    "content": "import type { InitialScene } from \"src/pages/scenes/sceneForm\";\nimport type { InitialPerformer } from \"src/pages/performers/performerForm\";\nimport {\n  GenderEnum,\n  HairColorEnum,\n  EyeColorEnum,\n  EthnicityEnum,\n  type SceneFragment,\n  type PerformerFragment,\n  type DraftQuery,\n  type SceneQuery,\n  BreastTypeEnum,\n  ValidSiteTypeEnum,\n  type Site,\n} from \"src/graphql\";\nimport { uniqBy } from \"lodash-es\";\n\nimport { cleanURL } from \"src/utils\";\n\ntype DraftData = NonNullable<DraftQuery[\"findDraft\"]>[\"data\"];\ntype SceneDraft = DraftData & { __typename: \"SceneDraft\" };\ntype PerformerDraft = DraftData & { __typename: \"PerformerDraft\" };\ntype Tag = NonNullable<SceneQuery[\"findScene\"]>[\"tags\"][number];\ntype ScenePerformer = NonNullable<\n  SceneQuery[\"findScene\"]\n>[\"performers\"][number];\n\ntype URL = { url: string; site: { id: string; name: string; icon: string } };\nconst joinURLs = <T extends URL>(\n  newURLs: T[] | undefined | null,\n  existingURLs: T[] | undefined,\n) =>\n  uniqBy(\n    [...(newURLs ? newURLs : []), ...(existingURLs ?? [])],\n    (u) => `${u.url}-${u.site.id}`,\n  );\n\ntype Entity = { id: string };\nconst joinImages = <T extends Entity>(\n  newImage: T | null | undefined,\n  existingImages: T[] | undefined,\n) =>\n  uniqBy(\n    [...(newImage ? [newImage] : []), ...(existingImages ?? [])],\n    (i) => i.id,\n  );\n\nconst joinTags = <T extends Entity>(\n  newTags: T[] | null,\n  existingTags: T[] | undefined,\n) => uniqBy([...(newTags ?? []), ...(existingTags ?? [])], (t) => t.id);\n\ntype Performer = { performer: { id: string }; as?: string | null };\nconst joinPerformers = <T extends Performer>(\n  newPerformers: T[] | null,\n  existingPerformers: T[] | undefined,\n) => [\n  ...(existingPerformers ?? []),\n  ...(newPerformers ?? []).filter(\n    (p) =>\n      !(existingPerformers ?? []).some(\n        (ep) => ep.performer.id === p.performer.id,\n      ),\n  ),\n];\n\nconst parseUrls = (\n  urls: string[],\n  type: ValidSiteTypeEnum,\n  sites: Site[],\n): [URL[], string[]] => {\n  const matches = [];\n  const remainder = [];\n\n  for (const url of urls) {\n    if (url === \"\") continue;\n\n    const matchedSite = sites.find((site) => {\n      if (!site.valid_types.includes(type) || !site.regex) return false;\n\n      return Boolean(url.match(site.regex));\n    });\n\n    if (matchedSite)\n      matches.push({\n        url: cleanURL(matchedSite.regex, url) ?? url,\n        site: matchedSite,\n      });\n    else remainder.push(url);\n  }\n  return [matches, remainder];\n};\n\nconst parseSceneUrls = (\n  urls: string[],\n  type: ValidSiteTypeEnum,\n  sites: Site[],\n): [URL[], string[]] => {\n  const [matches, remainder] = parseUrls(urls, type, sites);\n\n  // Fall back to studio URL if there's only one unmatched URL\n  if (remainder.length === 1) {\n    const studio = sites.find((site) => site.name === \"Studio\");\n    if (studio) {\n      matches.push({ url: remainder[0], site: studio });\n      return [matches, []];\n    }\n  }\n\n  return [matches, remainder];\n};\n\nexport const parseSceneDraft = (\n  draft: SceneDraft,\n  existingScene: SceneFragment | undefined,\n  sites: Site[],\n): [InitialScene, Record<string, string | null>] => {\n  const [mappedUrls, remainingUrls] = parseSceneUrls(\n    draft?.urls ?? [],\n    ValidSiteTypeEnum.SCENE,\n    sites,\n  );\n\n  const scene: InitialScene = {\n    date: draft.date,\n    title: draft.title,\n    details: draft.details,\n    urls: joinURLs(mappedUrls, existingScene?.urls),\n    studio: draft.studio?.__typename === \"Studio\" ? draft.studio : null,\n    director: draft.director,\n    code: draft.code,\n    duration: draft.fingerprints?.[0]?.duration ?? null,\n    images: draft.image ? [draft.image] : existingScene?.images,\n    tags: joinTags(\n      (draft.tags ?? []).reduce<Tag[]>((res, t) => {\n        if (t.__typename === \"Tag\") res.push(t);\n        return res;\n      }, []),\n      existingScene?.tags,\n    ),\n    performers: joinPerformers(\n      (draft.performers ?? []).reduce<ScenePerformer[]>((res, p) => {\n        if (p.__typename === \"Performer\")\n          res.push({ performer: p, as: \"\", __typename: \"PerformerAppearance\" });\n        return res;\n      }, []),\n      existingScene?.performers,\n    ),\n  };\n\n  const remainder = {\n    Studio:\n      draft.studio?.__typename === \"DraftEntity\" ? draft.studio.name : null,\n    Performers: (draft.performers ?? [])\n      .reduce<string[]>((res, p) => {\n        if (p.__typename === \"DraftEntity\") res.push(p.name);\n        return res;\n      }, [])\n      .join(\", \"),\n    Urls: remainingUrls.join(\", \"),\n    Tags: (draft.tags ?? [])\n      .reduce<string[]>((res, t) => {\n        if (t.__typename === \"DraftEntity\") res.push(t.name);\n        return res;\n      }, [])\n      .join(\", \"),\n  };\n\n  return [scene, remainder];\n};\n\nconst parseEnum = <T extends string>(\n  value: string | null | undefined,\n  enumObj: Record<string, T>,\n): T | null =>\n  Object.entries(enumObj).find(\n    ([, objVal]) => value?.toLowerCase() === objVal.toLowerCase(),\n  )?.[1] ?? null;\n\nconst parseBreastType = (value: string | null | undefined) => {\n  switch (value?.toLocaleUpperCase()) {\n    case \"FAKE\":\n    case \"AUGMENTED\":\n      return BreastTypeEnum.FAKE;\n    case \"NATURAL\":\n      return BreastTypeEnum.NATURAL;\n    default:\n      return null;\n  }\n};\n\nconst parseHairColor = (value: string | null | undefined) => {\n  switch (value?.toLocaleUpperCase()) {\n    case \"BROWN\":\n    case \"BRUNETTE\":\n      return HairColorEnum.BRUNETTE;\n    case \"BLONDE\":\n    case \"BLOND\":\n      return HairColorEnum.BLONDE;\n    default:\n      return parseEnum(value, HairColorEnum);\n  }\n};\n\nconst parseMeasurements = (value: string | null | undefined) => {\n  const parsedMeasurements = value?.match(\n    /^(\\d\\d)([a-zA-Z]+)(?:-|\\s)(\\d\\d)(?:-|\\s)(\\d\\d)$/,\n  );\n  if (!parsedMeasurements || parsedMeasurements?.length !== 5) return null;\n\n  return {\n    band: Number.parseInt(parsedMeasurements[1], 10),\n    cup: parsedMeasurements[2],\n    waist: Number.parseInt(parsedMeasurements[3], 10),\n    hip: Number.parseInt(parsedMeasurements[4], 10),\n  };\n};\n\nconst parseAliases = (value: string | null | undefined) => {\n  if (!value) return null;\n\n  const aliases = value?.split(\",\").map((alias) => alias.trim());\n  if (aliases.length > 0) return aliases;\n  return null;\n};\n\nexport const parsePerformerDraft = (\n  draft: PerformerDraft,\n  existingPerformer: PerformerFragment | undefined,\n  sites: Site[],\n): [InitialPerformer, Record<string, string | null>] => {\n  const measurements = parseMeasurements(draft?.measurements);\n  const draftAliases = parseAliases(draft?.aliases);\n  const [mappedUrls, remainingUrls] = parseUrls(\n    draft?.urls ?? [],\n    ValidSiteTypeEnum.PERFORMER,\n    sites,\n  );\n\n  const performer: InitialPerformer = {\n    name: draft.name,\n    disambiguation: draft.disambiguation ?? null,\n    images: joinImages(draft.image, existingPerformer?.images),\n    gender: parseEnum(draft.gender, GenderEnum),\n    ethnicity: parseEnum(draft.ethnicity, EthnicityEnum),\n    eye_color: parseEnum(draft.eye_color, EyeColorEnum),\n    hair_color: parseHairColor(draft.hair_color),\n    birthdate: draft.birthdate,\n    deathdate: draft.deathdate,\n    height: Number.parseInt(draft.height ?? \"\", 10) || null,\n    country: draft?.country?.length === 2 ? draft.country : null,\n    aliases: draftAliases ?? existingPerformer?.aliases,\n    career_start_year:\n      draft?.career_start_year ?? existingPerformer?.career_start_year,\n    career_end_year:\n      draft?.career_end_year ?? existingPerformer?.career_end_year,\n    breast_type:\n      parseBreastType(draft?.breast_type) ?? existingPerformer?.breast_type,\n    band_size: measurements?.band ?? existingPerformer?.band_size,\n    waist_size: measurements?.waist ?? existingPerformer?.waist_size,\n    hip_size: measurements?.hip ?? existingPerformer?.hip_size,\n    cup_size: measurements?.cup ?? existingPerformer?.cup_size,\n    tattoos: existingPerformer?.tattoos ?? undefined,\n    piercings: existingPerformer?.piercings ?? undefined,\n    urls: joinURLs(mappedUrls, existingPerformer?.urls),\n  };\n\n  const remainder = {\n    Aliases: draftAliases ? null : (draft?.aliases ?? null),\n    Height: draft.height && !performer.height ? draft.height : null,\n    Country: draft?.country?.length !== 2 ? (draft?.country ?? null) : null,\n    URLs: remainingUrls.join(\", \"),\n    Measurements:\n      draft?.measurements && !measurements ? draft.measurements : null,\n    \"Breast Type\":\n      draft?.breast_type && !parseBreastType(draft?.breast_type)\n        ? draft.breast_type\n        : null,\n    Piercings: draft?.piercings ?? null,\n    Tattoos: draft?.tattoos ?? null,\n  };\n\n  return [performer, remainder];\n};\n"
  },
  {
    "path": "frontend/src/pages/edits/Edit.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { Button } from \"react-bootstrap\";\nimport { useParams, Link } from \"react-router-dom\";\nimport { faGavel, faEdit } from \"@fortawesome/free-solid-svg-icons\";\nimport { UpdateCount } from \"./components/UpdateCount\";\nimport DeleteEditModal from \"./components/DeleteEditModal\";\nimport { Icon } from \"src/components/fragments\";\n\nimport {\n  useEdit,\n  useCancelEdit,\n  useApplyEdit,\n  VoteStatusEnum,\n  OperationEnum,\n} from \"src/graphql\";\nimport { useCurrentUser } from \"src/hooks\";\nimport { ErrorMessage, LoadingIndicator } from \"src/components/fragments\";\nimport EditCard from \"src/components/editCard\";\nimport ModalComponent from \"src/components/modal\";\nimport Title from \"src/components/title\";\nimport {\n  EditOperationTypes,\n  EditTargetTypes,\n  ROUTE_EDIT_UPDATE,\n  ROUTE_EDIT_AMEND,\n} from \"src/constants\";\nimport {\n  getEditTargetRoute,\n  getEditTargetName,\n  getEditDetailsName,\n  createHref,\n} from \"src/utils\";\n\nconst EditComponent: FC = () => {\n  const { isAdmin, isModerator, isSelf } = useCurrentUser();\n  const { id } = useParams();\n  const [showApply, setShowApply] = useState(false);\n  const [showCancel, setShowCancel] = useState(false);\n  const [showDelete, setShowDelete] = useState(false);\n  const { data, loading } = useEdit({ id: id ?? \"\" }, !id);\n  const [cancelEdit, { loading: cancelling }] = useCancelEdit();\n  const [applyEdit, { loading: applying }] = useApplyEdit();\n\n  if (loading) return <LoadingIndicator message=\"Loading...\" />;\n\n  const edit = data?.findEdit;\n  if (!edit) return <ErrorMessage error=\"Failed to load edit.\" />;\n\n  const toggleCancelModal = () => setShowCancel(true);\n  const toggleApplyModal = () => setShowApply(true);\n\n  const handleCancel = (status: boolean): void => {\n    if (status) cancelEdit({ variables: { input: { id: edit.id } } });\n    setShowCancel(false);\n  };\n  const handleApply = (status: boolean): void => {\n    if (status)\n      applyEdit({ variables: { input: { id: edit.id } } }).then((result) => {\n        const target = result.data?.applyEdit.target;\n        if (!target) return;\n\n        window.location.href = `${getEditTargetRoute(target)}#edits`;\n      });\n    setShowApply(false);\n  };\n\n  const cancelModal = showCancel && (\n    <ModalComponent\n      message=\"Are you sure you want to cancel this edit?\"\n      callback={handleCancel}\n      acceptTerm=\"Yes, cancel edit\"\n      cancelTerm=\"Cancel\"\n    />\n  );\n\n  const applyModal = showApply && (\n    <ModalComponent\n      message=\"Are you sure you want to apply this edit?\"\n      callback={handleApply}\n      acceptTerm=\"Apply edit\"\n    />\n  );\n\n  const mutating = cancelling || applying;\n\n  const buttons = (isAdmin || isSelf(edit.user?.id)) &&\n    edit.status === VoteStatusEnum.PENDING && (\n      <div className=\"d-flex justify-content-end\">\n        <UpdateCount\n          updatable={edit.updatable}\n          updateCount={edit.update_count}\n        />\n        {edit.updatable && (\n          <Link to={createHref(ROUTE_EDIT_UPDATE, edit)} className=\"me-2\">\n            <Button variant=\"primary\" disabled={mutating}>\n              Update Edit\n            </Button>\n          </Link>\n        )}\n        <Button\n          variant=\"danger\"\n          className=\"me-2\"\n          disabled={showCancel || mutating}\n          onClick={toggleCancelModal}\n        >\n          Cancel Edit\n        </Button>\n        {isAdmin && (\n          <Button\n            variant=\"danger\"\n            disabled={showApply || mutating}\n            onClick={toggleApplyModal}\n          >\n            Apply Edit\n          </Button>\n        )}\n      </div>\n    );\n\n  const modButtons = isModerator && edit.closed && (\n    <div className=\"d-flex justify-content-end mb-2\">\n      <Link to={createHref(ROUTE_EDIT_AMEND, edit)} className=\"me-2\">\n        <Button variant=\"primary\">\n          <Icon icon={faEdit} className=\"me-2\" />\n          Amend Edit\n        </Button>\n      </Link>\n      <Button variant=\"danger\" onClick={() => setShowDelete(true)}>\n        <Icon icon={faGavel} className=\"me-2\" />\n        Delete Edit\n      </Button>\n    </div>\n  );\n\n  const deleteModal = showDelete && (\n    <DeleteEditModal\n      edit={edit}\n      show={showDelete}\n      onHide={() => setShowDelete(false)}\n    />\n  );\n\n  const targetName =\n    edit.operation === OperationEnum.CREATE\n      ? getEditDetailsName(edit.details)\n      : getEditTargetName(edit.target);\n\n  return (\n    <div>\n      <Title\n        page={`${EditOperationTypes[edit.operation]} ${\n          EditTargetTypes[edit.target_type]\n        } \"${targetName}\"`}\n      />\n      {modButtons}\n      <EditCard edit={edit} showVotes />\n      {buttons}\n      {cancelModal}\n      {applyModal}\n      {deleteModal}\n    </div>\n  );\n};\n\nexport default EditComponent;\n"
  },
  {
    "path": "frontend/src/pages/edits/EditAmend.tsx",
    "content": "import type { FC } from \"react\";\nimport { useParams } from \"react-router-dom\";\n\nimport { useEdit } from \"src/graphql\";\nimport { ErrorMessage, LoadingIndicator } from \"src/components/fragments\";\nimport { AmendmentProvider } from \"src/components/amendableEditCard\";\nimport EditAmendForm from \"./EditAmendForm\";\n\nconst EditAmend: FC = () => {\n  const { id } = useParams();\n  const { data, loading } = useEdit({ id: id ?? \"\" }, !id);\n\n  if (loading) return <LoadingIndicator message=\"Loading...\" />;\n\n  const edit = data?.findEdit;\n  if (!edit) return <ErrorMessage error=\"Failed to load edit.\" />;\n\n  if (!edit.closed) {\n    return <ErrorMessage error=\"Only closed edits can be amended.\" />;\n  }\n\n  return (\n    <AmendmentProvider>\n      <EditAmendForm edit={edit} />\n    </AmendmentProvider>\n  );\n};\n\nexport default EditAmend;\n"
  },
  {
    "path": "frontend/src/pages/edits/EditAmendForm.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { Button, Form, Card } from \"react-bootstrap\";\nimport { useNavigate, Link } from \"react-router-dom\";\n\nimport { useAmendEdit, OperationEnum } from \"src/graphql\";\nimport type { AmendItemRemoval, EditFragment } from \"src/graphql\";\nimport Title from \"src/components/title\";\nimport { EditOperationTypes, EditTargetTypes, ROUTE_EDIT } from \"src/constants\";\nimport { getEditTargetName, getEditDetailsName, createHref } from \"src/utils\";\nimport {\n  AmendableModifyEdit,\n  useAmendment,\n} from \"src/components/amendableEditCard\";\n\nexport interface EditAmendFormProps {\n  edit: EditFragment;\n}\n\nconst EditAmendForm: FC<EditAmendFormProps> = ({ edit }) => {\n  const navigate = useNavigate();\n  const [amendEdit, { loading: amending }] = useAmendEdit();\n  const [reason, setReason] = useState(\"\");\n  const [error, setError] = useState<string | null>(null);\n  const { state, hasChanges } = useAmendment();\n\n  const handleSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n\n    if (!edit?.id || !reason.trim() || !hasChanges) return;\n\n    setError(null);\n\n    const removeFieldsArray = Array.from(state.removedFields);\n\n    const removeAddedItemsArray: AmendItemRemoval[] = [];\n    state.removedAddedItems.forEach((indices, field) => {\n      if (indices.size > 0) {\n        removeAddedItemsArray.push({\n          field,\n          indices: Array.from(indices),\n        });\n      }\n    });\n\n    const removeRemovedItemsArray: AmendItemRemoval[] = [];\n    state.removedRemovedItems.forEach((indices, field) => {\n      if (indices.size > 0) {\n        removeRemovedItemsArray.push({\n          field,\n          indices: Array.from(indices),\n        });\n      }\n    });\n\n    try {\n      await amendEdit({\n        variables: {\n          input: {\n            id: edit.id,\n            reason: reason.trim(),\n            remove_fields: removeFieldsArray,\n            remove_added_items: removeAddedItemsArray,\n            remove_removed_items: removeRemovedItemsArray,\n          },\n        },\n      });\n      navigate(createHref(ROUTE_EDIT, { id: edit.id }));\n    } catch (err) {\n      setError(err instanceof Error ? err.message : \"Failed to amend edit\");\n    }\n  };\n\n  const targetName =\n    edit.operation === OperationEnum.CREATE\n      ? getEditDetailsName(edit.details)\n      : getEditTargetName(edit.target);\n\n  return (\n    <div>\n      <Title\n        page={`Amend ${EditOperationTypes[edit.operation]} ${EditTargetTypes[edit.target_type]}${targetName && targetName !== \"-\" ? ` \"${targetName}\"` : \"\"}`}\n      />\n      <h3>\n        Amend Edit: {EditOperationTypes[edit.operation]}{\" \"}\n        {EditTargetTypes[edit.target_type]}\n        {targetName && targetName !== \"-\" && ` - ${targetName}`}\n      </h3>\n      <p className=\"text-muted\">\n        Click the X button next to any field or item to mark it for removal from\n        this edit. Removed changes will appear dimmed.\n      </p>\n\n      <Form onSubmit={handleSubmit}>\n        <Card className=\"mb-4\">\n          <Card.Header>\n            <strong>Edit Details</strong>\n            <span className=\"text-muted ms-2\">\n              (submitted by {edit.user?.name ?? \"Unknown\"})\n            </span>\n          </Card.Header>\n          <Card.Body>\n            <AmendableModifyEdit\n              details={edit.details}\n              oldDetails={edit.old_details}\n              options={edit.options}\n            />\n          </Card.Body>\n        </Card>\n\n        <Card className=\"mb-4\">\n          <Card.Header>\n            <strong>Amendment Reason</strong>\n          </Card.Header>\n          <Card.Body>\n            <Form.Group>\n              <Form.Control\n                as=\"textarea\"\n                rows={4}\n                value={reason}\n                onChange={(e) => setReason(e.target.value)}\n                placeholder=\"Explain why these fields are being removed from the edit...\"\n                required\n                disabled={amending}\n              />\n            </Form.Group>\n            {error && <div className=\"text-danger mt-3\">{error}</div>}\n          </Card.Body>\n        </Card>\n\n        <div className=\"d-flex justify-content-end gap-2\">\n          <Link to={createHref(ROUTE_EDIT, edit)}>\n            <Button variant=\"secondary\" disabled={amending}>\n              Cancel\n            </Button>\n          </Link>\n          <Button\n            type=\"submit\"\n            variant=\"primary\"\n            disabled={!reason.trim() || !hasChanges || amending}\n          >\n            Amend Edit\n          </Button>\n        </div>\n      </Form>\n    </div>\n  );\n};\n\nexport default EditAmendForm;\n"
  },
  {
    "path": "frontend/src/pages/edits/EditUpdate.tsx",
    "content": "import type { FC } from \"react\";\nimport { useParams } from \"react-router-dom\";\n\nimport { useEditUpdate, TargetTypeEnum } from \"src/graphql\";\nimport { ErrorMessage, LoadingIndicator } from \"src/components/fragments\";\nimport { SceneEditUpdate } from \"src/pages/scenes/SceneEditUpdate\";\nimport { PerformerEditUpdate } from \"src/pages/performers/PerformerEditUpdate\";\nimport { TagEditUpdate } from \"src/pages/tags/TagEditUpdate\";\nimport { StudioEditUpdate } from \"src/pages/studios/StudioEditUpdate\";\n\nconst EditUpdateComponent: FC = () => {\n  const { id } = useParams();\n  const { data, loading } = useEditUpdate({ id: id ?? \"\" }, !id);\n\n  if (loading) return <LoadingIndicator message=\"Loading...\" />;\n\n  const edit = data?.findEdit;\n  if (!edit) return <ErrorMessage error=\"Failed to load edit.\" />;\n  if (!edit.updatable) return <ErrorMessage error=\"Unable to update edit\" />;\n\n  switch (edit.target_type) {\n    case TargetTypeEnum.SCENE:\n      return <SceneEditUpdate edit={edit} />;\n    case TargetTypeEnum.PERFORMER:\n      return <PerformerEditUpdate edit={edit} />;\n    case TargetTypeEnum.TAG:\n      return <TagEditUpdate edit={edit} />;\n    case TargetTypeEnum.STUDIO:\n      return <StudioEditUpdate edit={edit} />;\n  }\n};\n\nexport default EditUpdateComponent;\n"
  },
  {
    "path": "frontend/src/pages/edits/Edits.tsx",
    "content": "import type { FC } from \"react\";\n\nimport { VoteStatusEnum, UserVotedFilterEnum } from \"src/graphql\";\nimport { EditList } from \"src/components/list\";\nimport Title from \"src/components/title\";\n\nconst EditsComponent: FC = () => (\n  <>\n    <Title page=\"Edits\" />\n    <h3>Edits</h3>\n    <EditList\n      defaultVoteStatus={VoteStatusEnum.PENDING}\n      defaultVoted={UserVotedFilterEnum.NOT_VOTED}\n      defaultBot=\"exclude\"\n      defaultUserSubmitted={true}\n    />\n  </>\n);\n\nexport default EditsComponent;\n"
  },
  {
    "path": "frontend/src/pages/edits/components/DeleteEditModal.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { Modal, Button, Form } from \"react-bootstrap\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport { useDeleteEdit } from \"src/graphql\";\nimport { ROUTE_EDITS } from \"src/constants/route\";\nimport { EditOperationTypes, EditTargetTypes } from \"src/constants\";\nimport type { EditFragment } from \"src/graphql\";\n\ninterface Props {\n  edit: EditFragment;\n  show: boolean;\n  onHide: () => void;\n}\n\nconst DeleteEditModal: FC<Props> = ({ edit, show, onHide }) => {\n  const navigate = useNavigate();\n  const [deleteReason, setDeleteReason] = useState(\"\");\n  const [error, setError] = useState<string | null>(null);\n  const [deleteEdit, { loading: deleting }] = useDeleteEdit();\n\n  const handleSubmit = (e: React.FormEvent) => {\n    e.preventDefault();\n    if (!deleteReason.trim()) return;\n\n    setError(null);\n    deleteEdit({\n      variables: {\n        input: {\n          id: edit.id,\n          reason: deleteReason,\n        },\n      },\n    })\n      .then(() => {\n        onHide();\n        navigate(ROUTE_EDITS);\n      })\n      .catch((err) => {\n        setError(err instanceof Error ? err.message : \"Failed to delete edit\");\n      });\n  };\n\n  const handleClose = () => {\n    setDeleteReason(\"\");\n    setError(null);\n    onHide();\n  };\n\n  const editType = `${EditOperationTypes[edit.operation]} ${EditTargetTypes[edit.target_type]}`;\n  const userName = edit.user?.name || \"Unknown User\";\n  const editIdShort = edit.id.slice(0, 8);\n\n  return (\n    <Modal show={show} onHide={handleClose}>\n      <Modal.Header closeButton>\n        <Modal.Title>\n          Delete {editType} - {editIdShort} by {userName}\n        </Modal.Title>\n      </Modal.Header>\n      <Form onSubmit={handleSubmit}>\n        <Modal.Body>\n          <Form.Group>\n            <Form.Label>\n              <strong>Reason for deletion (required):</strong>\n            </Form.Label>\n            <Form.Control\n              as=\"textarea\"\n              rows={4}\n              value={deleteReason}\n              onChange={(e) => setDeleteReason(e.target.value)}\n              placeholder=\"Enter the reason for deleting this edit...\"\n              required\n              disabled={deleting}\n            />\n          </Form.Group>\n          {error && <div className=\"text-danger mt-3\">{error}</div>}\n        </Modal.Body>\n        <Modal.Footer>\n          <Button variant=\"secondary\" onClick={handleClose} disabled={deleting}>\n            Cancel\n          </Button>\n          <Button\n            type=\"submit\"\n            variant=\"danger\"\n            disabled={!deleteReason.trim() || deleting}\n          >\n            {deleting ? \"Deleting...\" : \"Delete Edit\"}\n          </Button>\n        </Modal.Footer>\n      </Form>\n    </Modal>\n  );\n};\n\nexport default DeleteEditModal;\n"
  },
  {
    "path": "frontend/src/pages/edits/components/UpdateCount.tsx",
    "content": "import type { FC } from \"react\";\nimport { useConfig } from \"src/graphql\";\n\ninterface Props {\n  updatable: boolean;\n  updateCount: number;\n}\n\nexport const UpdateCount: FC<Props> = ({ updatable, updateCount }) => {\n  const { data: config } = useConfig();\n\n  const updateLimit = config?.getConfig.edit_update_limit;\n  if (!updatable || !updateLimit) return null;\n\n  const updates = updateLimit - updateCount;\n  return (\n    <small className=\"text-muted align-content-center me-3\">\n      Edit can be updated{\" \"}\n      {updates === 1 ? \"one more time\" : `${updates} more times`}\n    </small>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/edits/index.tsx",
    "content": "import type { FC } from \"react\";\nimport { Route, Routes } from \"react-router-dom\";\n\nimport Edit from \"./Edit\";\nimport Edits from \"./Edits\";\nimport EditUpdate from \"./EditUpdate\";\nimport EditAmend from \"./EditAmend\";\n\nconst SceneRoutes: FC = () => (\n  <Routes>\n    <Route path=\"/\" element={<Edits />} />\n    <Route path=\"/:id/update\" element={<EditUpdate />} />\n    <Route path=\"/:id/amend\" element={<EditAmend />} />\n    <Route path=\"/:id/*\" element={<Edit />} />\n  </Routes>\n);\n\nexport default SceneRoutes;\n"
  },
  {
    "path": "frontend/src/pages/forgotPassword/ForgotPassword.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport type { CombinedGraphQLErrors } from \"@apollo/client\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { useForm } from \"react-hook-form\";\nimport { useNavigate } from \"react-router-dom\";\nimport { Button, Form, Row, Col } from \"react-bootstrap\";\nimport * as yup from \"yup\";\nimport cx from \"classnames\";\n\nimport Title from \"src/components/title\";\nimport { useResetPassword } from \"src/graphql\";\nimport { ROUTE_HOME } from \"src/constants/route\";\nimport { useCurrentUser } from \"src/hooks\";\n\nconst schema = yup.object({\n  email: yup.string().email().required(\"Email is required\"),\n});\ntype ResetPasswordFormData = yup.Asserts<typeof schema>;\n\nconst ForgotPassword: FC = () => {\n  const navigate = useNavigate();\n  const { isAuthenticated } = useCurrentUser();\n  const [resetEmail, setResetEmail] = useState(\"\");\n  const [submitError, setSubmitError] = useState<string | undefined>();\n\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm<ResetPasswordFormData>({\n    resolver: yupResolver(schema),\n  });\n\n  const [resetPassword, { loading }] = useResetPassword();\n\n  if (isAuthenticated) navigate(ROUTE_HOME);\n\n  const onSubmit = (formData: ResetPasswordFormData) => {\n    const userData = {\n      email: formData.email,\n    };\n    setSubmitError(undefined);\n    resetPassword({ variables: { input: userData } })\n      .then(() => {\n        setResetEmail(formData.email);\n      })\n      .catch((err?: CombinedGraphQLErrors) => {\n        if (err?.message) {\n          setSubmitError(err.message);\n        }\n      });\n  };\n\n  if (resetEmail)\n    return (\n      <div className=\"LoginPrompt\">\n        <div className=\"align-self-center col-8 mx-auto\">\n          <h5>Pasword reset</h5>\n          <p>\n            If a matching account was found an email was sent to {resetEmail} to\n            allow you to reset your password.\n          </p>\n          <a href=\"/login\">Return to login</a>\n        </div>\n      </div>\n    );\n\n  const errorList = [errors.email?.message, submitError].filter(\n    (err): err is string => err !== undefined,\n  );\n\n  return (\n    <div className=\"LoginPrompt mx-auto d-flex\">\n      <Title page=\"Forgot Password\" />\n      <Form\n        className=\"align-self-center col-8 mx-auto\"\n        onSubmit={handleSubmit(onSubmit)}\n      >\n        <Form.Group controlId=\"email\">\n          <Row>\n            <Col xs={4}>\n              <Form.Label>Email:</Form.Label>\n            </Col>\n            <Col xs={8}>\n              <Form.Control\n                className={cx({ \"is-invalid\": errors?.email })}\n                type=\"text\"\n                placeholder=\"Email\"\n                {...register(\"email\")}\n              />\n            </Col>\n          </Row>\n        </Form.Group>\n\n        <Row>\n          <Col\n            xs={{ span: 3, offset: 9 }}\n            className=\"justify-content-end mt-2 d-flex\"\n          >\n            <Button type=\"submit\" disabled={loading}>\n              Reset Password\n            </Button>\n          </Col>\n        </Row>\n\n        {errorList.map((error) => (\n          <Row key={error} className=\"text-end text-danger\">\n            <div>{error}</div>\n          </Row>\n        ))}\n      </Form>\n    </div>\n  );\n};\n\nexport default ForgotPassword;\n"
  },
  {
    "path": "frontend/src/pages/forgotPassword/index.ts",
    "content": "export { default } from \"./ForgotPassword\";\n"
  },
  {
    "path": "frontend/src/pages/home/Home.tsx",
    "content": "import type { FC } from \"react\";\nimport { Col, Row } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport cx from \"classnames\";\n\nimport {\n  useScenesWithoutCount,\n  SceneSortEnum,\n  SortDirectionEnum,\n} from \"src/graphql\";\n\nimport SceneCard from \"src/components/sceneCard\";\nimport { LoadingIndicator } from \"src/components/fragments\";\nimport { ROUTE_SCENES } from \"src/constants\";\n\nconst CLASSNAME = \"HomePage\";\nconst CLASSNAME_SCENES = `${CLASSNAME}-scenes`;\n\nconst ScenesComponent: FC = () => {\n  const { data: sceneData, loading: loadingRecent } = useScenesWithoutCount({\n    input: {\n      page: 1,\n      per_page: 20,\n      sort: SceneSortEnum.CREATED_AT,\n      direction: SortDirectionEnum.DESC,\n    },\n  });\n  const { data: trendingData, loading: loadingTrending } =\n    useScenesWithoutCount({\n      input: {\n        page: 1,\n        per_page: 20,\n        sort: SceneSortEnum.TRENDING,\n        direction: SortDirectionEnum.DESC,\n      },\n    });\n\n  if (loadingTrending) return <LoadingIndicator message=\"Loading...\" />;\n\n  const scenes = (sceneData?.queryScenes?.scenes ?? []).map((scene) => (\n    <Col key={scene.id}>\n      <SceneCard scene={scene} />\n    </Col>\n  ));\n  const trendingScenes = (trendingData?.queryScenes?.scenes ?? []).map(\n    (scene) => (\n      <Col key={scene.id}>\n        <SceneCard scene={scene} />\n      </Col>\n    ),\n  );\n\n  return (\n    <div className={cx(CLASSNAME, \"mx-4\")}>\n      {trendingScenes.length > 0 && (\n        <>\n          <h4>\n            <Link to={`${ROUTE_SCENES}?sort=trending`}>Trending scenes</Link>\n          </h4>\n          <Row className={CLASSNAME_SCENES}>{trendingScenes}</Row>\n        </>\n      )}\n      {!loadingRecent && (\n        <>\n          <h4>\n            <Link to={`${ROUTE_SCENES}?sort=created_at`}>\n              Recently added scenes\n            </Link>\n          </h4>\n          <Row className={CLASSNAME_SCENES}>{scenes}</Row>\n        </>\n      )}\n    </div>\n  );\n};\n\nexport default ScenesComponent;\n"
  },
  {
    "path": "frontend/src/pages/home/index.ts",
    "content": "import Home from \"./Home\";\n\nexport default Home;\n"
  },
  {
    "path": "frontend/src/pages/home/styles.scss",
    "content": ".HomePage {\n  &-scenes {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n    grid-template-rows: auto auto;\n    grid-auto-rows: 0;\n    overflow: hidden;\n  }\n}\n"
  },
  {
    "path": "frontend/src/pages/index.tsx",
    "content": "import type { FC } from \"react\";\nimport { Route, Routes } from \"react-router-dom\";\n\nimport {\n  ROUTE_HOME,\n  ROUTE_LOGIN,\n  ROUTE_USERS,\n  ROUTE_PERFORMERS,\n  ROUTE_SCENES,\n  ROUTE_STUDIOS,\n  ROUTE_TAGS,\n  ROUTE_EDITS,\n  ROUTE_CATEGORIES,\n  ROUTE_REGISTER,\n  ROUTE_ACTIVATE,\n  ROUTE_FORGOT_PASSWORD,\n  ROUTE_RESET_PASSWORD,\n  ROUTE_SEARCH,\n  ROUTE_VERSION,\n  ROUTE_SITES,\n  ROUTE_DRAFTS,\n  ROUTE_NOTIFICATIONS,\n  ROUTE_AUDITS,\n} from \"src/constants/route\";\n\nimport Home from \"src/pages/home\";\nimport Login from \"src/Login\";\nimport Users from \"src/pages/users\";\nimport Performers from \"src/pages/performers\";\nimport Scenes from \"src/pages/scenes\";\nimport Studios from \"src/pages/studios\";\nimport Tags from \"src/pages/tags\";\nimport Edits from \"src/pages/edits\";\nimport Categories from \"src/pages/categories\";\nimport RegisterUser from \"src/pages/registerUser\";\nimport ActivateUser from \"src/pages/activateUser\";\nimport ForgotPassword from \"src/pages/forgotPassword\";\nimport ResetPassword from \"src/pages/resetPassword\";\nimport Search from \"src/pages/search\";\nimport Version from \"src/pages/version\";\nimport Sites from \"src/pages/sites\";\nimport Drafts from \"src/pages/drafts\";\nimport Notifications from \"src/pages/notifications\";\nimport Audits from \"src/pages/audits\";\n\nconst Pages: FC = () => (\n  <Routes>\n    <Route path={ROUTE_HOME} element={<Home />} />\n    <Route\n      path=\"/*\"\n      element={\n        <div className=\"NarrowPage\">\n          <Routes>\n            <Route path={ROUTE_LOGIN} element={<Login />} />\n            <Route path={`${ROUTE_USERS}/*`} element={<Users />} />\n            <Route path={`${ROUTE_PERFORMERS}/*`} element={<Performers />} />\n            <Route path={`${ROUTE_SCENES}/*`} element={<Scenes />} />\n            <Route path={`${ROUTE_STUDIOS}/*`} element={<Studios />} />\n            <Route path={`${ROUTE_TAGS}/*`} element={<Tags />} />\n            <Route path={`${ROUTE_EDITS}/*`} element={<Edits />} />\n            <Route path={`${ROUTE_CATEGORIES}/*`} element={<Categories />} />\n            <Route path={ROUTE_REGISTER} element={<RegisterUser />} />\n            <Route path={ROUTE_ACTIVATE} element={<ActivateUser />} />\n            <Route path={ROUTE_FORGOT_PASSWORD} element={<ForgotPassword />} />\n            <Route path={ROUTE_RESET_PASSWORD} element={<ResetPassword />} />\n            <Route path={`${ROUTE_SEARCH}/*`} element={<Search />} />\n            <Route path={ROUTE_VERSION} element={<Version />} />\n            <Route path={`${ROUTE_SITES}/*`} element={<Sites />} />\n            <Route path={`${ROUTE_DRAFTS}/*`} element={<Drafts />} />\n            <Route path={ROUTE_NOTIFICATIONS} element={<Notifications />} />\n            <Route path={`${ROUTE_AUDITS}/*`} element={<Audits />} />\n          </Routes>\n        </div>\n      }\n    />\n  </Routes>\n);\n\nexport default Pages;\n"
  },
  {
    "path": "frontend/src/pages/notifications/CommentNotification.tsx",
    "content": "import type { FC } from \"react\";\nimport type { CommentNotificationType } from \"./types\";\nimport EditComment from \"src/components/editCard/EditComment\";\n\ninterface Props {\n  notification: CommentNotificationType;\n}\n\nexport const CommentNotification: FC<Props> = ({ notification }) => (\n  <EditComment {...notification.data.comment} />\n);\n"
  },
  {
    "path": "frontend/src/pages/notifications/EditNotification.tsx",
    "content": "import type { FC } from \"react\";\nimport EditCard from \"src/components/editCard\";\nimport type { EditNotificationType } from \"./types\";\n\ninterface Props {\n  notification: EditNotificationType;\n}\n\nexport const EditNotification: FC<Props> = ({ notification }) => {\n  return (\n    <EditCard\n      edit={notification.data.edit}\n      showVotes\n      hideDiff\n      showVoteBar={false}\n    />\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/notifications/Notification.tsx",
    "content": "import type React from \"react\";\nimport { Button } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport { faEnvelope, faEnvelopeOpen } from \"@fortawesome/free-solid-svg-icons\";\nimport { Icon } from \"src/components/fragments\";\nimport { editHref } from \"src/utils\";\nimport { useMarkNotificationRead, NotificationEnum } from \"src/graphql\";\nimport {\n  type NotificationType,\n  isSceneNotification,\n  isEditNotification,\n  isCommentNotification,\n} from \"./types\";\nimport { CommentNotification } from \"./CommentNotification\";\nimport { SceneNotification } from \"./sceneNotification\";\nimport { EditNotification } from \"./EditNotification\";\n\ninterface Props {\n  notification: NotificationType;\n}\n\nconst createMarkNotificationReadInput = (notification: NotificationType) => {\n  switch (notification.data.__typename) {\n    case \"CommentOwnEdit\":\n      return {\n        type: NotificationEnum.COMMENT_OWN_EDIT,\n        id: notification.data.comment.id,\n      };\n    case \"CommentCommentedEdit\":\n      return {\n        type: NotificationEnum.COMMENT_COMMENTED_EDIT,\n        id: notification.data.comment.id,\n      };\n    case \"CommentVotedEdit\":\n      return {\n        type: NotificationEnum.COMMENT_VOTED_EDIT,\n        id: notification.data.comment.id,\n      };\n    case \"DownvoteOwnEdit\":\n      return {\n        type: NotificationEnum.DOWNVOTE_OWN_EDIT,\n        id: notification.data.edit.id,\n      };\n    case \"FailedOwnEdit\":\n      return {\n        type: NotificationEnum.FAILED_OWN_EDIT,\n        id: notification.data.edit.id,\n      };\n    case \"FavoritePerformerEdit\":\n      return {\n        type: NotificationEnum.FAVORITE_PERFORMER_EDIT,\n        id: notification.data.edit.id,\n      };\n    case \"FavoriteStudioEdit\":\n      return {\n        type: NotificationEnum.FAVORITE_STUDIO_EDIT,\n        id: notification.data.edit.id,\n      };\n    case \"FingerprintedSceneEdit\":\n      return {\n        type: NotificationEnum.FINGERPRINTED_SCENE_EDIT,\n        id: notification.data.edit.id,\n      };\n    case \"UpdatedEdit\":\n      return {\n        type: NotificationEnum.UPDATED_EDIT,\n        id: notification.data.edit.id,\n      };\n    case \"FavoritePerformerScene\":\n      return {\n        type: NotificationEnum.FAVORITE_PERFORMER_SCENE,\n        id: notification.data.scene.id,\n      };\n    case \"FavoriteStudioScene\":\n      return {\n        type: NotificationEnum.FAVORITE_STUDIO_SCENE,\n        id: notification.data.scene.id,\n      };\n  }\n};\n\nconst NotificationBody = ({\n  notification,\n}: {\n  notification: NotificationType;\n}) => {\n  if (isCommentNotification(notification))\n    return <CommentNotification notification={notification} />;\n  if (isEditNotification(notification))\n    return <EditNotification notification={notification} />;\n  if (isSceneNotification(notification))\n    return <SceneNotification notification={notification} />;\n};\n\nconst NotificationHeader = ({\n  notification,\n}: {\n  notification: NotificationType;\n}) => {\n  const [markRead, { loading }] = useMarkNotificationRead({\n    notification: createMarkNotificationReadInput(notification),\n  });\n\n  const headerText = () => {\n    if (isCommentNotification(notification)) {\n      const editLink = (\n        <Link\n          to={editHref(notification.data.comment.edit)}\n          className=\"text-decoration-underline fst-italic\"\n        >\n          edit\n        </Link>\n      );\n      if (notification.data.__typename === \"CommentCommentedEdit\")\n        return (\n          <span>\n            <em>{notification.data.comment.user?.name}</em> commented on an{\" \"}\n            {editLink}\n            {\" you've commented on.\"}\n          </span>\n        );\n      if (notification.data.__typename === \"CommentOwnEdit\")\n        return (\n          <span>\n            <em>{notification.data.comment.user?.name}</em> commented on your{\" \"}\n            {editLink}.\n          </span>\n        );\n      if (notification.data.__typename === \"CommentVotedEdit\")\n        return (\n          <span>\n            <em>{notification.data.comment.user?.name}</em> commented on an{\" \"}\n            {editLink}\n            {\" you've voted on.\"}\n          </span>\n        );\n    }\n    if (isEditNotification(notification)) {\n      if (notification.data.__typename === \"DownvoteOwnEdit\")\n        return `A user voted no on your edit.`;\n      if (notification.data.__typename === \"FailedOwnEdit\")\n        return `Your edit has failed.`;\n      if (notification.data.__typename === \"UpdatedEdit\")\n        return `An edit you've voted on was updated.`;\n      if (notification.data.__typename === \"FavoritePerformerEdit\")\n        return `An edit was created involving a favorited performer.`;\n      if (notification.data.__typename === \"FavoriteStudioEdit\")\n        return `An edit was created involving a favorited studio.`;\n      if (notification.data.__typename === \"FingerprintedSceneEdit\")\n        return `An edit was created for a scene you have submitted fingerprints for.`;\n    }\n    if (isSceneNotification(notification)) {\n      if (notification.data.__typename === \"FavoriteStudioScene\")\n        return (\n          <span>\n            A new scene from <em>{notification.data.scene.studio?.name}</em> was\n            submitted.\n          </span>\n        );\n      if (notification.data.__typename === \"FavoritePerformerScene\")\n        return `A new scene involving a favorited performer was submitted.`;\n    }\n  };\n\n  return (\n    <h5 className=\"d-flex gap-2\">\n      <div className=\"Notification-read-state\">\n        {notification.read && <Icon icon={faEnvelopeOpen} />}\n        {!notification.read && (\n          <Button\n            variant=\"link\"\n            onClick={() => markRead()}\n            title=\"Mark notification as read\"\n            disabled={loading}\n          >\n            <Icon icon={faEnvelope} variant={\"warning\"} />\n            <Icon icon={faEnvelopeOpen} />\n          </Button>\n        )}\n      </div>\n      {headerText()}\n    </h5>\n  );\n};\n\nexport const Notification: React.FC<Props> = ({ notification }) => {\n  return (\n    <div className=\"Notification\">\n      <NotificationHeader notification={notification} />\n      <NotificationBody notification={notification} />\n    </div>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/notifications/Notifications.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button, Form } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport { faEdit } from \"@fortawesome/free-solid-svg-icons\";\nimport {\n  useNotifications,\n  useMarkNotificationsRead,\n  NotificationEnum,\n  useUnreadNotificationsCount,\n} from \"src/graphql\";\nimport { useCurrentUser, useQueryParams, usePagination } from \"src/hooks\";\nimport { ROUTE_NOTIFICATION_SUBSCRIPTIONS } from \"src/constants/route\";\nimport { userHref, resolveEnum, NotificationType } from \"src/utils\";\nimport { ErrorMessage, Icon, LoadingIndicator } from \"src/components/fragments\";\nimport { List } from \"src/components/list\";\nimport { Notification } from \"./Notification\";\n\nconst PER_PAGE = 20;\n\nconst Notifications: FC = () => {\n  const { user } = useCurrentUser();\n  const { page, setPage } = usePagination();\n  const [params, setParams] = useQueryParams({\n    notification: { name: \"notification\", type: \"string\", default: \"all\" },\n    unread: { name: \"unread\", type: \"string\", default: \"false\" },\n  });\n  const notification = resolveEnum(\n    NotificationEnum,\n    params.notification,\n    undefined,\n  );\n  const unread = params.unread === \"true\";\n\n  const { data: unreadNotificationsCount } = useUnreadNotificationsCount();\n  const [markNotificationsRead, { loading: markingRead }] =\n    useMarkNotificationsRead();\n  const { loading, data } = useNotifications({\n    input: {\n      page,\n      per_page: PER_PAGE,\n      unread_only: unread,\n      type: notification,\n    },\n  });\n\n  if (loading) return <LoadingIndicator message=\"Loading notifications...\" />;\n\n  if (!loading && !data) return <ErrorMessage error=\"No notifications\" />;\n\n  const enumToOptions = (e: Record<string, string>) =>\n    Object.keys(e).map((key) => (\n      <option key={key} value={key}>\n        {e[key]}\n      </option>\n    ));\n\n  return (\n    <>\n      <div className=\"d-flex\">\n        <h3 className=\"me-4\">Notifications</h3>\n        {user && (\n          <>\n            <Link\n              to={userHref(user, ROUTE_NOTIFICATION_SUBSCRIPTIONS)}\n              className=\"ms-auto\"\n            >\n              <Button variant=\"link\">\n                <Icon icon={faEdit} className=\"me-2\" />\n                Edit Subscriptions\n              </Button>\n            </Link>\n            <Button\n              className=\"ms-2\"\n              onClick={() => markNotificationsRead()}\n              disabled={\n                markingRead ||\n                !unreadNotificationsCount?.getUnreadNotificationCount\n              }\n            >\n              Mark all as read\n            </Button>\n          </>\n        )}\n      </div>\n      <List\n        page={page}\n        setPage={setPage}\n        perPage={PER_PAGE}\n        listCount={data?.queryNotifications.count}\n        filters={\n          <>\n            <Form.Group className=\"mx-2 mb-3 d-flex flex-column\">\n              <Form.Label>Notification Type</Form.Label>\n              <Form.Select\n                onChange={(e) =>\n                  setParams(\"notification\", e.currentTarget.value)\n                }\n                value={notification}\n                style={{ maxWidth: 250 }}\n              >\n                <option value=\"all\" key=\"all-types\">\n                  All\n                </option>\n                {enumToOptions(NotificationType)}\n              </Form.Select>\n            </Form.Group>\n\n            <Form.Group controlId=\"unread\" className=\"text-center\">\n              <Form.Label>Unread Only</Form.Label>\n              <Form.Check\n                className=\"mt-2\"\n                type=\"switch\"\n                defaultChecked={unread}\n                onChange={(e) =>\n                  setParams(\"unread\", e.currentTarget.checked.toString())\n                }\n              />\n            </Form.Group>\n          </>\n        }\n        loading={loading}\n        entityName=\"notifications\"\n      >\n        {data?.queryNotifications?.notifications?.map((n) => (\n          <Notification\n            key={`${n.created}-${n.data.__typename}`}\n            notification={n}\n          />\n        ))}\n      </List>\n    </>\n  );\n};\n\nexport default Notifications;\n"
  },
  {
    "path": "frontend/src/pages/notifications/index.ts",
    "content": "export { default } from \"./Notifications\";\n"
  },
  {
    "path": "frontend/src/pages/notifications/sceneNotification.tsx",
    "content": "import type { FC } from \"react\";\nimport SceneCard from \"src/components/sceneCard\";\nimport type { SceneNotificationType } from \"./types\";\n\ninterface Props {\n  notification: SceneNotificationType;\n}\n\nexport const SceneNotification: FC<Props> = ({ notification }) => {\n  return <SceneCard scene={notification.data.scene} />;\n};\n"
  },
  {
    "path": "frontend/src/pages/notifications/styles.scss",
    "content": ".Notification {\n  .SceneCard {\n    width: 300px;\n  }\n\n  &-read-state {\n    width: 20px;\n    height: 20px;\n    display: flex;\n    align-self: center;\n    align-items: center;\n    justify-content: center;\n\n    .btn {\n      border: none;\n      border-bottom: 2px solid transparent;\n      border-radius: 0;\n      padding: 4px 0;\n\n      .fa-envelope {\n        display: block;\n      }\n\n      .fa-envelope-open {\n        display: none;\n      }\n\n      &:hover {\n        border-color: white;\n\n        .fa-envelope {\n          display: none;\n        }\n\n        .fa-envelope-open {\n          display: block;\n          color: white !important;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/pages/notifications/types.ts",
    "content": "import type { NotificationsQuery } from \"src/graphql\";\n\nexport type NotificationType =\n  NotificationsQuery[\"queryNotifications\"][\"notifications\"][number];\n\ntype CommentData = Extract<NotificationType[\"data\"], { comment: unknown }>;\nexport type CommentNotificationType = NotificationType & { data: CommentData };\nexport const isCommentNotification = (\n  notification: NotificationType,\n): notification is CommentNotificationType =>\n  (notification.data as CommentData).comment !== undefined;\n\ntype EditData = Extract<NotificationType[\"data\"], { edit: unknown }>;\nexport type EditNotificationType = NotificationType & { data: EditData };\nexport const isEditNotification = (\n  notification: NotificationType,\n): notification is EditNotificationType =>\n  (notification.data as EditData).edit !== undefined;\n\ntype SceneData = Extract<NotificationType[\"data\"], { scene: unknown }>;\nexport type SceneNotificationType = NotificationType & { data: SceneData };\nexport const isSceneNotification = (\n  notification: NotificationType,\n): notification is SceneNotificationType =>\n  (notification.data as SceneData).scene !== undefined;\n"
  },
  {
    "path": "frontend/src/pages/performers/Performer.tsx",
    "content": "import type { FC } from \"react\";\nimport { useLocation, useNavigate } from \"react-router-dom\";\nimport { Tab, Tabs } from \"react-bootstrap\";\nimport { groupBy, keyBy, sortBy } from \"lodash-es\";\n\nimport {\n  usePendingEditsCount,\n  CriterionModifier,\n  TargetTypeEnum,\n  type FullPerformerQuery,\n} from \"src/graphql\";\n\nimport { formatPendingEdits } from \"src/utils\";\nimport { EditList, SceneList, URLList } from \"src/components/list\";\nimport CheckboxSelect from \"src/components/checkboxSelect\";\nimport { useQueryParams } from \"src/hooks\";\nimport { PerformerInfo, ScenePairings } from \"./components\";\n\ntype Performer = NonNullable<FullPerformerQuery[\"findPerformer\"]>;\n\nconst DEFAULT_TAB = \"scenes\";\n\ninterface Props {\n  performer: Performer;\n}\n\nconst PerformerComponent: FC<Props> = ({ performer }) => {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const activeTab = location.hash?.slice(1) || DEFAULT_TAB;\n  const [{ studioFilter }, setParams] = useQueryParams({\n    studioFilter: { name: \"studios\", type: \"string[]\" },\n  });\n\n  const { data: editData } = usePendingEditsCount({\n    type: TargetTypeEnum.PERFORMER,\n    id: performer.id,\n  });\n  const pendingEditCount = editData?.queryEdits.count;\n\n  const setTab = (tab: string | null) =>\n    navigate({ hash: tab === DEFAULT_TAB ? \"\" : `#${tab}` });\n\n  const studios = keyBy(performer.studios, (s) => s.studio.id);\n  const studioGroups = groupBy(\n    performer.studios,\n    (s) => s.studio.parent?.id ?? \"none\",\n  );\n  const obj = sortBy(\n    [\n      ...(studioGroups.none ?? [])\n        .filter((s) => !studioGroups[s.studio.id])\n        .map((s) => ({\n          label: `${s.studio.name} (${s.scene_count})`,\n          value: s.studio.id,\n          subValues: [],\n        })),\n      ...Object.keys(studioGroups)\n        .filter((key) => key !== \"none\")\n        .map((key) => {\n          const group = studioGroups[key];\n          const { parent } = group[0].studio;\n          const parentSceneCount = studios[parent?.id ?? \"\"]?.scene_count ?? 0;\n          const parentSceneCountText = parentSceneCount\n            ? ` (${parentSceneCount})`\n            : \"\";\n          return {\n            label: `${parent?.name ?? \"Unknown\"}${parentSceneCountText}`,\n            value: parent?.id ?? \"Unknown\",\n            subValues: sortBy(\n              group.map((s) => ({\n                label: `${s.studio.name} (${s.scene_count})`,\n                value: s.studio.id,\n                subValues: null,\n              })),\n              (s) => s.label,\n            ),\n          };\n        }),\n    ],\n    (s) => s.label,\n  ).flatMap((s) => [\n    { ...s, subValues: s.subValues.map((v) => v.value) },\n    ...s.subValues,\n  ]);\n\n  return (\n    <>\n      <PerformerInfo performer={performer} />\n      <hr className=\"my-2\" />\n      <Tabs\n        activeKey={activeTab}\n        id=\"performer-tabs\"\n        mountOnEnter\n        onSelect={setTab}\n      >\n        <Tab eventKey=\"scenes\" title=\"Scenes\" className=\"PerformerScenes\">\n          <CheckboxSelect\n            values={obj}\n            onChange={(ids) => setParams(\"studioFilter\", ids)}\n            placeholder=\"Filter by studios\"\n            plural=\"studios\"\n            key={`performer-${performer.id}-studio-select`}\n            selected={studioFilter}\n          />\n          <SceneList\n            perPage={40}\n            filter={{\n              performers: {\n                value: [performer.id],\n                modifier: CriterionModifier.INCLUDES,\n              },\n              ...(studioFilter\n                ? {\n                    studios: {\n                      value: studioFilter,\n                      modifier: CriterionModifier.INCLUDES,\n                    },\n                  }\n                : {}),\n            }}\n            favoriteFilter={\"studio\"}\n            key={`performer-${performer.id}-scene-list`}\n          />\n        </Tab>\n        <Tab eventKey=\"scenePairings\" title=\"Scene Pairings\">\n          <ScenePairings id={performer.id} />\n        </Tab>\n        <Tab eventKey=\"links\" title=\"Links\">\n          <URLList urls={performer.urls} />\n        </Tab>\n        <Tab\n          eventKey=\"edits\"\n          title={`Edits${formatPendingEdits(pendingEditCount)}`}\n          tabClassName={pendingEditCount ? \"PendingEditTab\" : \"\"}\n        >\n          <EditList type={TargetTypeEnum.PERFORMER} id={performer.id} />\n        </Tab>\n      </Tabs>\n    </>\n  );\n};\n\nexport default PerformerComponent;\n"
  },
  {
    "path": "frontend/src/pages/performers/PerformerAdd.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  usePerformerEdit,\n  OperationEnum,\n  type PerformerEditDetailsInput,\n} from \"src/graphql\";\nimport { editHref } from \"src/utils\";\n\nimport PerformerForm from \"./performerForm\";\n\nconst PerformerAdd: FC = () => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [submitPerformerEdit, { loading: saving }] = usePerformerEdit({\n    onCompleted: (data) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (data.performerEdit.id) navigate(editHref(data.performerEdit));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  const doInsert = (\n    updateData: PerformerEditDetailsInput,\n    editNote: string,\n  ) => {\n    submitPerformerEdit({\n      variables: {\n        performerData: {\n          edit: {\n            operation: OperationEnum.CREATE,\n            comment: editNote,\n          },\n          details: updateData,\n        },\n      },\n    });\n  };\n\n  return (\n    <div>\n      <h3>Add new performer</h3>\n      <hr />\n      <PerformerForm callback={doInsert} saving={saving} isCreate />\n      {submissionError && (\n        <div className=\"text-danger text-end col-9\">\n          Error: {submissionError}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default PerformerAdd;\n"
  },
  {
    "path": "frontend/src/pages/performers/PerformerDelete.tsx",
    "content": "import type { FC } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { Button, Col, Form, Row } from \"react-bootstrap\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\n\nimport {\n  usePerformerEdit,\n  OperationEnum,\n  type FullPerformerQuery,\n} from \"src/graphql\";\nimport { EditNote } from \"src/components/form\";\nimport { editHref } from \"src/utils\";\n\ntype Performer = NonNullable<FullPerformerQuery[\"findPerformer\"]>;\n\nconst schema = yup.object({\n  id: yup.string().required(),\n  note: yup.string().required(\"An edit note is required.\"),\n});\nexport type FormData = yup.Asserts<typeof schema>;\n\ninterface Props {\n  performer: Performer;\n}\n\nconst PerformerDelete: FC<Props> = ({ performer }) => {\n  const navigate = useNavigate();\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm<FormData>({\n    resolver: yupResolver(schema),\n    mode: \"onBlur\",\n  });\n  const [deletePerformerEdit, { loading: deleting }] = usePerformerEdit({\n    onCompleted: (data) => {\n      if (data.performerEdit.id) navigate(editHref(data.performerEdit));\n    },\n  });\n\n  const handleDelete = (data: FormData) =>\n    deletePerformerEdit({\n      variables: {\n        performerData: {\n          edit: {\n            operation: OperationEnum.DESTROY,\n            id: data.id,\n            comment: data.note,\n          },\n        },\n      },\n    });\n\n  return (\n    <Form className=\"PerformerDeleteForm\" onSubmit={handleSubmit(handleDelete)}>\n      <Row>\n        <h4>\n          Delete performer <em>{performer.name}</em>\n        </h4>\n      </Row>\n      <Form.Control type=\"hidden\" value={performer.id} {...register(\"id\")} />\n      <Row className=\"my-4\">\n        <Col md={6}>\n          <EditNote register={register} error={errors.note} />\n          <div className=\"d-flex mt-2\">\n            <Button\n              variant=\"danger\"\n              className=\"ms-auto me-2\"\n              onClick={() => navigate(-1)}\n            >\n              Cancel\n            </Button>\n            <Button\n              type=\"submit\"\n              disabled\n              className=\"d-none\"\n              aria-hidden=\"true\"\n            />\n            <Button type=\"submit\" disabled={deleting}>\n              Submit Edit\n            </Button>\n          </div>\n        </Col>\n      </Row>\n    </Form>\n  );\n};\n\nexport default PerformerDelete;\n"
  },
  {
    "path": "frontend/src/pages/performers/PerformerEdit.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  usePerformerEdit,\n  OperationEnum,\n  type PerformerEditDetailsInput,\n  type FullPerformerQuery,\n} from \"src/graphql\";\n\nimport { editHref } from \"src/utils\";\nimport PerformerForm from \"./performerForm\";\n\ntype Performer = NonNullable<FullPerformerQuery[\"findPerformer\"]>;\n\ninterface Props {\n  performer: Performer;\n}\n\nconst PerformerModify: FC<Props> = ({ performer }) => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [submitPerformerEdit, { loading: saving }] = usePerformerEdit({\n    onCompleted: (editData) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (editData.performerEdit.id) navigate(editHref(editData.performerEdit));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  const doUpdate = (\n    updateData: PerformerEditDetailsInput,\n    editNote: string,\n    setModifyAliases: boolean,\n  ) => {\n    submitPerformerEdit({\n      variables: {\n        performerData: {\n          edit: {\n            id: performer.id,\n            operation: OperationEnum.MODIFY,\n            comment: editNote,\n          },\n          details: updateData,\n          options: {\n            set_modify_aliases: setModifyAliases,\n          },\n        },\n      },\n    });\n  };\n\n  return (\n    <>\n      <h3>\n        Edit performer{\" \"}\n        <i>\n          <b>{performer.name}</b>\n        </i>\n      </h3>\n      <hr />\n      <PerformerForm\n        performer={performer}\n        callback={doUpdate}\n        saving={saving}\n      />\n      {submissionError && (\n        <div className=\"text-danger text-end col-9\">\n          Error: {submissionError}\n        </div>\n      )}\n    </>\n  );\n};\n\nexport default PerformerModify;\n"
  },
  {
    "path": "frontend/src/pages/performers/PerformerEditUpdate.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  usePerformerEditUpdate,\n  type PerformerEditDetailsInput,\n  type EditUpdateQuery,\n} from \"src/graphql\";\nimport { createHref, isPerformer, isPerformerEdit } from \"src/utils\";\nimport PerformerForm from \"./performerForm\";\n\ntype EditUpdate = NonNullable<EditUpdateQuery[\"findEdit\"]>;\n\nimport { ROUTE_EDIT } from \"src/constants\";\nimport Title from \"src/components/title\";\n\nexport const PerformerEditUpdate: FC<{ edit: EditUpdate }> = ({ edit }) => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [updatePerformerEdit, { loading: saving }] = usePerformerEditUpdate({\n    onCompleted: (result) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (result.performerEditUpdate.id)\n        navigate(createHref(ROUTE_EDIT, result.performerEditUpdate));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  if (\n    !isPerformerEdit(edit.details) ||\n    (edit.target && !isPerformer(edit.target))\n  )\n    return null;\n\n  const doUpdate = (\n    updateData: PerformerEditDetailsInput,\n    editNote: string,\n    setModifyAliases: boolean,\n  ) => {\n    if (!isPerformerEdit(edit.details)) return;\n\n    const details: PerformerEditDetailsInput = {\n      ...updateData,\n      draft_id: edit.details.draft_id,\n    };\n    updatePerformerEdit({\n      variables: {\n        id: edit.id,\n        performerData: {\n          edit: {\n            id: edit.target?.id,\n            operation: edit.operation,\n            comment: editNote,\n            merge_source_ids: edit.merge_sources.map((s) => s.id),\n          },\n          options: {\n            set_modify_aliases: setModifyAliases,\n            set_merge_aliases: edit.options?.set_merge_aliases,\n          },\n          details,\n        },\n      },\n    });\n  };\n\n  const performerName = edit.target?.name ?? edit.details.name;\n\n  return (\n    <div>\n      <Title page={`Update performer edit for \"${performerName}\"`} />\n      <h3>\n        Update performer edit for\n        <i className=\"ms-2\">\n          <b>{performerName}</b>\n        </i>\n      </h3>\n      <hr />\n      <PerformerForm\n        performer={edit.target}\n        initial={edit.details}\n        options={edit.options}\n        callback={doUpdate}\n        saving={saving}\n      />\n      {submissionError && (\n        <div className=\"text-danger text-end col-9\">\n          Error: {submissionError}\n        </div>\n      )}\n    </div>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/performers/PerformerMerge.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { Button, Col, Form, Row } from \"react-bootstrap\";\nimport { flatMap, uniq, uniqBy } from \"lodash-es\";\n\nimport {\n  usePerformerEdit,\n  OperationEnum,\n  type PerformerEditDetailsInput,\n  type FullPerformerQuery,\n  type SearchPerformersQuery,\n} from \"src/graphql\";\n\nimport PerformerSelect from \"src/components/performerSelect\";\nimport PerformerCard from \"src/components/performerCard\";\nimport { editHref } from \"src/utils\";\nimport PerformerForm from \"./performerForm\";\nimport { Help } from \"src/components/fragments\";\n\ntype Performer = NonNullable<FullPerformerQuery[\"findPerformer\"]>;\ntype SearchPerformer = NonNullable<\n  SearchPerformersQuery[\"searchPerformers\"][\"performers\"][number]\n>;\n\nconst UPDATE_ALIAS_MESSAGE = `Enabling this option sets each merged performer's name as an alias on every scene that performer does not have an alias on.\nIn most cases, it should be enabled when merging aliases of a performer, and disabled when the performers share the same name.\n`;\n\nconst CLASSNAME = \"PerformerMerge\";\n\ninterface Props {\n  performer: Performer;\n}\n\nconst PerformerMerge: FC<Props> = ({ performer }) => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [mergeActive, setMergeActive] = useState(false);\n  const [mergeSources, setMergeSources] = useState<SearchPerformer[]>([]);\n  const [aliasUpdating, setAliasUpdating] = useState(true);\n  const [insertPerformerEdit, { loading: saving }] = usePerformerEdit({\n    onCompleted: (data) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (data.performerEdit.id) navigate(editHref(data.performerEdit));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  const toggleMerge = () => {\n    setMergeActive(true);\n    const sameName = mergeSources.every(\n      ({ name }) => name.trim() === performer.name.trim(),\n    );\n    // Don't update aliases by default if the names match\n    setAliasUpdating(!sameName);\n  };\n\n  const doUpdate = (\n    insertData: PerformerEditDetailsInput,\n    editNote: string,\n    setModifyAliases: boolean,\n  ) => {\n    insertPerformerEdit({\n      variables: {\n        performerData: {\n          edit: {\n            id: performer.id,\n            operation: OperationEnum.MERGE,\n            merge_source_ids: mergeSources.map((p) => p.id),\n            comment: editNote,\n          },\n          details: insertData,\n          options: {\n            set_merge_aliases: aliasUpdating,\n            set_modify_aliases: setModifyAliases,\n          },\n        },\n      },\n    });\n  };\n\n  const aliases = uniq(\n    [\n      ...performer.aliases,\n      ...mergeSources.map((p) => p.name.trim()),\n      ...flatMap(mergeSources, (p) => p.aliases),\n    ].filter((name) => name !== performer.name.trim()),\n  );\n  const images = uniqBy(\n    [...performer.images, ...flatMap(mergeSources, (i) => i.images)],\n    (image) => image.id,\n  );\n\n  return (\n    <div className={CLASSNAME}>\n      <h3>\n        Merge performers into <em>{performer.name}</em>\n      </h3>\n      <hr />\n      <div className=\"row\">\n        <div className=\"col-6\">\n          {!mergeActive && (\n            <>\n              <PerformerSelect\n                performers={[]}\n                onChange={(performers) => setMergeSources(performers)}\n                message=\"Search for performers to merge...\"\n                excludePerformers={[\n                  performer.id,\n                  ...mergeSources.map((p) => p.id),\n                ]}\n              />\n              {mergeSources.length > 0 && (\n                <Button onClick={toggleMerge} className=\"ms-auto\">\n                  Continue\n                </Button>\n              )}\n            </>\n          )}\n          {mergeActive && (\n            <Row>\n              <Col xs={3}>\n                <h6 className=\"text-center\">Merge Target</h6>\n                <PerformerCard performer={performer} className=\"TargetCard\" />\n              </Col>\n              <Col xs={9}>\n                <Row className=\"mt-4\">\n                  {mergeSources.map((source) => (\n                    <Col xs={4} key={source.id}>\n                      <PerformerCard performer={source} />\n                    </Col>\n                  ))}\n                </Row>\n              </Col>\n            </Row>\n          )}\n        </div>\n        <div className=\"col-6\">\n          <p>\n            Merging performers reassigns all scene performances of the sources\n            to the target performer. The source <i>stashIds</i> will be\n            redirected so that previously tagged content can be updated with the\n            new performers metadata.\n          </p>\n          <p>\n            This operation is not easily reversible and attention should be paid\n            that all entities are truly the same.\n          </p>\n        </div>\n      </div>\n      {mergeActive && (\n        <>\n          <Form.Check\n            id=\"merge-alias-updating\"\n            checked={aliasUpdating}\n            onChange={() => setAliasUpdating(!aliasUpdating)}\n            label=\"Update scene performance aliases on merged performers to old performer name.\"\n            className=\"d-inline-block\"\n          />\n          <Help message={UPDATE_ALIAS_MESSAGE} />\n          <h5 className=\"mt-4\">\n            Update performer metadata for <em>{performer.name}</em>\n          </h5>\n          <PerformerForm\n            performer={performer}\n            initial={{\n              aliases,\n              images,\n            }}\n            callback={doUpdate}\n            saving={saving}\n          />\n          {submissionError && (\n            <div className=\"text-danger text-end col-9\">\n              Error: {submissionError}\n            </div>\n          )}\n        </>\n      )}\n    </div>\n  );\n};\n\nexport default PerformerMerge;\n"
  },
  {
    "path": "frontend/src/pages/performers/Performers.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Button, Col, Form, InputGroup, Row } from \"react-bootstrap\";\nimport Select from \"react-select\";\nimport { debounce } from \"lodash-es\";\nimport {\n  faSortAmountUp,\n  faSortAmountDown,\n} from \"@fortawesome/free-solid-svg-icons\";\n\nimport {\n  usePerformers,\n  SortDirectionEnum,\n  GenderFilterEnum,\n  PerformerSortEnum,\n} from \"src/graphql\";\nimport { useCurrentUser, usePagination, useQueryParams } from \"src/hooks\";\nimport { ErrorMessage, Icon } from \"src/components/fragments\";\nimport PerformerCard from \"src/components/performerCard\";\nimport { ensureEnum, resolveEnum } from \"src/utils\";\nimport { List } from \"src/components/list\";\nimport { ROUTE_PERFORMER_ADD, GenderFilterTypes } from \"src/constants\";\n\nconst PER_PAGE = 25;\n\nconst genderOptions = Object.entries(GenderFilterEnum).map(([, value]) => ({\n  value,\n  label: GenderFilterTypes[value],\n}));\nconst sortOptions = [\n  { value: PerformerSortEnum.NAME, label: \"Name\" },\n  { value: PerformerSortEnum.BIRTHDATE, label: \"Birthdate\" },\n  { value: PerformerSortEnum.SCENE_COUNT, label: \"Scene Count\" },\n  { value: PerformerSortEnum.CAREER_START_YEAR, label: \"Career Start\" },\n  { value: PerformerSortEnum.DEBUT, label: \"Scene Debut\" },\n  { value: PerformerSortEnum.LAST_SCENE, label: \"Latest Scene\" },\n  { value: PerformerSortEnum.CREATED_AT, label: \"Created At\" },\n  { value: PerformerSortEnum.UPDATED_AT, label: \"Updated At\" },\n];\n\nconst PerformersComponent: FC = () => {\n  const { isEditor } = useCurrentUser();\n  const [params, setParams] = useQueryParams({\n    query: { name: \"query\", type: \"string\", default: \"\" },\n    gender: { name: \"gender\", type: \"string\" },\n    direction: { name: \"dir\", type: \"string\", default: SortDirectionEnum.ASC },\n    sort: { name: \"sort\", type: \"string\", default: PerformerSortEnum.NAME },\n    favorite: { name: \"favorite\", type: \"string\", default: \"false\" },\n  });\n  const gender = resolveEnum(GenderFilterEnum, params.gender);\n  const direction = ensureEnum(SortDirectionEnum, params.direction);\n  const sort = ensureEnum(PerformerSortEnum, params.sort);\n  const favorite = params.favorite === \"true\" || undefined;\n  const { page, setPage } = usePagination();\n  const { loading, data } = usePerformers({\n    input: {\n      names: params.query,\n      gender,\n      is_favorite: favorite,\n      page,\n      per_page: PER_PAGE,\n      sort,\n      direction,\n    },\n  });\n\n  if (!loading && !data)\n    return <ErrorMessage error=\"Failed to load performers\" />;\n\n  const performers = (data?.queryPerformers.performers ?? []).map(\n    (performer) => (\n      <Col xs=\"auto\" key={performer.id}>\n        <PerformerCard performer={performer} />\n      </Col>\n    ),\n  );\n\n  const debouncedHandler = debounce(setParams, 200);\n\n  const filters = (\n    <>\n      <Form.Control\n        id=\"performer-name\"\n        onChange={(e) => debouncedHandler(\"query\", e.currentTarget.value)}\n        placeholder=\"Filter performer name\"\n        defaultValue={params.query}\n        className=\"w-auto\"\n      />\n      <Select\n        id=\"performer-gender\"\n        options={genderOptions}\n        defaultValue={genderOptions.find((o) => o.value === gender)}\n        placeholder=\"Gender\"\n        isClearable\n        onChange={(e) => setParams(\"gender\", e?.value ?? undefined)}\n        classNamePrefix=\"react-select\"\n        className=\"performer-filter ms-2\"\n      />\n      <InputGroup className=\"performer-sort ms-2 me-3\">\n        <Form.Select\n          onChange={(e) =>\n            setParams(\"sort\", e.currentTarget.value.toLowerCase())\n          }\n          defaultValue={sort ?? \"name\"}\n        >\n          {sortOptions.map((s) => (\n            <option value={s.value} key={s.value}>\n              {s.label}\n            </option>\n          ))}\n        </Form.Select>\n        <Button\n          variant=\"secondary\"\n          onClick={() =>\n            setParams(\n              \"direction\",\n              direction === SortDirectionEnum.ASC\n                ? SortDirectionEnum.DESC\n                : undefined,\n            )\n          }\n        >\n          <Icon\n            icon={\n              direction === SortDirectionEnum.DESC\n                ? faSortAmountDown\n                : faSortAmountUp\n            }\n          />\n        </Button>\n      </InputGroup>\n      <Form.Group controlId=\"favorite\">\n        <Form.Check\n          className=\"mt-2\"\n          type=\"switch\"\n          label=\"Only favorites\"\n          defaultChecked={favorite}\n          onChange={(e) =>\n            setParams(\"favorite\", e.currentTarget.checked.toString())\n          }\n        />\n      </Form.Group>\n    </>\n  );\n\n  return (\n    <>\n      <div className=\"d-flex\">\n        <h3 className=\"me-4\">Performers</h3>\n        {isEditor && (\n          <Link to={ROUTE_PERFORMER_ADD} className=\"ms-auto\">\n            <Button>Create</Button>\n          </Link>\n        )}\n      </div>\n      <List\n        entityName=\"performers\"\n        page={page}\n        filters={filters}\n        setPage={setPage}\n        perPage={PER_PAGE}\n        loading={loading}\n        listCount={data?.queryPerformers.count}\n      >\n        <Row>{performers}</Row>\n      </List>\n    </>\n  );\n};\n\nexport default PerformersComponent;\n"
  },
  {
    "path": "frontend/src/pages/performers/components/index.ts",
    "content": "export * from \"./performerInfo\";\nexport * from \"./scenePairings\";\n"
  },
  {
    "path": "frontend/src/pages/performers/components/performerInfo.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Button, Card, Col, Row, Table } from \"react-bootstrap\";\nimport { faCodeMerge } from \"@fortawesome/free-solid-svg-icons\";\n\nimport {\n  GenderEnum,\n  type PerformerFragment as Performer,\n  usePerformer,\n} from \"src/graphql\";\n\nimport { useCurrentUser } from \"src/hooks\";\nimport {\n  getCountryByISO,\n  formatBodyModifications,\n  formatMeasurements,\n  formatCareer,\n  createHref,\n} from \"src/utils\";\nimport {\n  EthnicityTypes,\n  HairColorTypes,\n  EyeColorTypes,\n  BreastTypes,\n} from \"src/constants\";\n\nimport {\n  ROUTE_PERFORMER,\n  ROUTE_PERFORMER_EDIT,\n  ROUTE_PERFORMER_MERGE,\n  ROUTE_PERFORMER_DELETE,\n} from \"src/constants/route\";\n\nimport {\n  FavoriteStar,\n  GenderIcon,\n  PerformerName,\n  Tooltip,\n  Icon,\n} from \"src/components/fragments\";\nimport ImageCarousel from \"src/components/imageCarousel\";\n\nconst CLASSNAME = \"PerformerInfo\";\nconst CLASSNAME_ACTIONS = \"PerformerInfo-actions\";\n\ninterface Props {\n  performer: Performer;\n}\n\nconst Actions: FC<Props> = ({ performer }) => {\n  const { isEditor } = useCurrentUser();\n\n  if (!isEditor || performer.deleted) return null;\n\n  return (\n    <Row className={CLASSNAME_ACTIONS}>\n      <Col xs={6}>\n        <div className=\"text-end\">\n          <Link to={createHref(ROUTE_PERFORMER_EDIT, performer)}>\n            <Button>Edit</Button>\n          </Link>\n          <Link\n            to={createHref(ROUTE_PERFORMER_MERGE, performer)}\n            className=\"ms-2\"\n          >\n            <Tooltip\n              text={\n                <>\n                  Merge other performers into <b>{performer.name}</b>\n                </>\n              }\n            >\n              <Button>Merge</Button>\n            </Tooltip>\n          </Link>\n          <Link\n            to={createHref(ROUTE_PERFORMER_DELETE, performer)}\n            className=\"ms-2\"\n          >\n            <Button variant=\"danger\">Delete</Button>\n          </Link>\n        </div>\n      </Col>\n    </Row>\n  );\n};\n\nconst PerformerAge = ({ age }: { age?: number | null }): React.ReactNode => {\n  if (!age) return \"\";\n  return <small className=\"text-muted ms-2\">{`${age} years old`}</small>;\n};\n\nexport const PerformerInfo: FC<Props> = ({ performer }) => {\n  const { data: mergedInto } = usePerformer(\n    { id: performer.merged_into_id ?? \"\" },\n    !performer.merged_into_id,\n  );\n\n  return (\n    <div className={CLASSNAME}>\n      <Actions performer={performer} />\n      <Row>\n        <Col xs={6}>\n          <Card>\n            <Card.Header>\n              <h3>\n                <GenderIcon gender={performer?.gender} />\n                <PerformerName performer={performer} />\n                <FavoriteStar\n                  entity={performer}\n                  entityType=\"performer\"\n                  interactable\n                  className=\"ps-2\"\n                />\n              </h3>\n              {mergedInto?.findPerformer && (\n                <h6 className=\"text-muted\">\n                  <Icon icon={faCodeMerge} className=\"me-2 text-danger\" />\n                  <span>Merged into </span>\n                  <Link\n                    to={createHref(ROUTE_PERFORMER, mergedInto.findPerformer)}\n                  >\n                    <PerformerName performer={mergedInto.findPerformer} />\n                  </Link>\n                </h6>\n              )}\n            </Card.Header>\n            <Card.Body className=\"p-0\">\n              <Table striped>\n                <tbody>\n                  <tr>\n                    <td>Career</td>\n                    <td>\n                      {formatCareer(\n                        performer.career_start_year,\n                        performer.career_end_year,\n                      )}\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>Birthdate</td>\n                    <td>\n                      {performer.birth_date}\n                      {!performer.death_date && (\n                        <PerformerAge age={performer.age} />\n                      )}\n                    </td>\n                  </tr>\n                  {performer.death_date && (\n                    <tr>\n                      <td>Deathdate</td>\n                      <td>\n                        {performer.death_date}\n                        <PerformerAge age={performer.age} />\n                      </td>\n                    </tr>\n                  )}\n                  <tr>\n                    <td>Height</td>\n                    <td>\n                      <div>\n                        {(performer?.height ?? 0) > 0 &&\n                          `${performer.height}cm`}\n                      </div>\n                    </td>\n                  </tr>\n                  {performer.gender !== GenderEnum.MALE &&\n                    performer.gender !== GenderEnum.TRANSGENDER_MALE && (\n                      <>\n                        <tr>\n                          <td>Measurements</td>\n                          <td>{formatMeasurements(performer)}</td>\n                        </tr>\n                        <tr>\n                          <td>Breast type</td>\n                          <td>\n                            {performer.breast_type &&\n                              BreastTypes[performer.breast_type]}\n                          </td>\n                        </tr>\n                      </>\n                    )}\n                  <tr>\n                    <td>Nationality</td>\n                    <td>{getCountryByISO(performer.country)}</td>\n                  </tr>\n                  <tr>\n                    <td>Ethnicity</td>\n                    <td>\n                      {performer.ethnicity &&\n                        EthnicityTypes[performer.ethnicity]}\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>Eye color</td>\n                    <td>\n                      {performer.eye_color &&\n                        EyeColorTypes[performer.eye_color]}\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>Hair color</td>\n                    <td>\n                      {performer.hair_color &&\n                        HairColorTypes[performer.hair_color]}\n                    </td>\n                  </tr>\n                  <tr>\n                    <td>Tattoos</td>\n                    <td>{formatBodyModifications(performer?.tattoos)}</td>\n                  </tr>\n                  <tr>\n                    <td>Piercings</td>\n                    <td>{formatBodyModifications(performer?.piercings)}</td>\n                  </tr>\n                  <tr>\n                    <td>Aliases</td>\n                    <td>{(performer.aliases || []).join(\", \")}</td>\n                  </tr>\n                </tbody>\n              </Table>\n            </Card.Body>\n          </Card>\n          <div className=\"float-end\">\n            {performer.urls.map((u) => (\n              <a\n                href={u.url}\n                target=\"_blank\"\n                rel=\"noreferrer noopener\"\n                key={u.url}\n              >\n                <img src={u.site.icon} alt=\"\" className=\"SiteLink-icon\" />\n              </a>\n            ))}\n          </div>\n        </Col>\n        <Col xs={6} className=\"performer-photo\">\n          <ImageCarousel images={performer.images} orientation=\"portrait\" />\n        </Col>\n      </Row>\n    </div>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/performers/components/scenePairings.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button, Form, InputGroup, Row, Col } from \"react-bootstrap\";\nimport { debounce } from \"lodash-es\";\nimport Select from \"react-select\";\nimport {\n  faSortAmountUp,\n  faSortAmountDown,\n} from \"@fortawesome/free-solid-svg-icons\";\n\nimport {\n  useScenePairings,\n  GenderFilterEnum,\n  PerformerSortEnum,\n  SortDirectionEnum,\n} from \"src/graphql\";\nimport { Icon } from \"src/components/fragments\";\nimport PerformerCard from \"src/components/performerCard\";\nimport SceneCard from \"src/components/sceneCard\";\nimport { GenderFilterTypes } from \"src/constants\";\nimport { usePagination, useQueryParams } from \"src/hooks\";\nimport { ensureEnum, resolveEnum } from \"src/utils\";\nimport { List } from \"src/components/list\";\n\nconst PER_PAGE = 25;\n\nconst genderOptions = Object.entries(GenderFilterEnum).map(([, value]) => ({\n  value,\n  label: GenderFilterTypes[value],\n}));\nconst sortOptions = [\n  { value: PerformerSortEnum.NAME, label: \"Name\" },\n  { value: PerformerSortEnum.BIRTHDATE, label: \"Birthdate\" },\n  { value: PerformerSortEnum.SCENE_COUNT, label: \"Scene Count\" },\n  { value: PerformerSortEnum.CAREER_START_YEAR, label: \"Career Start\" },\n  { value: PerformerSortEnum.DEBUT, label: \"Scene Debut\" },\n  { value: PerformerSortEnum.CREATED_AT, label: \"Created At\" },\n];\n\ninterface Props {\n  id: string;\n}\n\nexport const ScenePairings: FC<Props> = ({ id }) => {\n  const [params, setParams] = useQueryParams({\n    query: { name: \"query\", type: \"string\", default: \"\" },\n    gender: { name: \"gender\", type: \"string\" },\n    direction: { name: \"dir\", type: \"string\", default: SortDirectionEnum.ASC },\n    sort: { name: \"sort\", type: \"string\", default: PerformerSortEnum.NAME },\n    favorite: { name: \"favorite\", type: \"string\", default: \"false\" },\n    scenes: { name: \"scenes\", type: \"string\", default: \"false\" },\n  });\n  const gender = resolveEnum(GenderFilterEnum, params.gender);\n  const direction = ensureEnum(SortDirectionEnum, params.direction);\n  const sort = ensureEnum(PerformerSortEnum, params.sort);\n  const favorite = params.favorite === \"true\" || undefined;\n  const fetchScenes = params.scenes === \"true\";\n  const { page, setPage } = usePagination();\n\n  const { data, loading } = useScenePairings({\n    performerId: id,\n    names: params.query,\n    gender,\n    favorite,\n    page,\n    per_page: PER_PAGE,\n    sort,\n    direction,\n    fetchScenes,\n  });\n\n  const performers = data?.queryPerformers.performers;\n\n  const debouncedHandler = debounce(setParams, 200);\n\n  const filters = (\n    <>\n      <Form.Control\n        id=\"performer-name\"\n        onChange={(e) => debouncedHandler(\"query\", e.currentTarget.value)}\n        placeholder=\"Filter performer name\"\n        defaultValue={params.query}\n        className=\"w-auto\"\n      />\n      <Select\n        id=\"performer-gender\"\n        options={genderOptions}\n        defaultValue={genderOptions.find((o) => o.value === gender)}\n        placeholder=\"Gender\"\n        isClearable\n        onChange={(e) => setParams(\"gender\", e?.value ?? undefined)}\n        classNamePrefix=\"react-select\"\n        className=\"performer-filter ms-2\"\n      />\n      <InputGroup className=\"performer-sort ms-2 me-3\">\n        <Form.Select\n          onChange={(e) =>\n            setParams(\"sort\", e.currentTarget.value.toLowerCase())\n          }\n          defaultValue={sort ?? \"name\"}\n        >\n          {sortOptions.map((s) => (\n            <option value={s.value} key={s.value}>\n              {s.label}\n            </option>\n          ))}\n        </Form.Select>\n        <Button\n          variant=\"secondary\"\n          onClick={() =>\n            setParams(\n              \"direction\",\n              direction === SortDirectionEnum.ASC\n                ? SortDirectionEnum.DESC\n                : undefined,\n            )\n          }\n        >\n          <Icon\n            icon={\n              direction === SortDirectionEnum.DESC\n                ? faSortAmountDown\n                : faSortAmountUp\n            }\n          />\n        </Button>\n      </InputGroup>\n      <Form.Group controlId=\"favorite\">\n        <Form.Check\n          className=\"mt-2\"\n          type=\"switch\"\n          label=\"Favorites\"\n          defaultChecked={favorite}\n          onChange={(e) =>\n            setParams(\"favorite\", e.currentTarget.checked.toString())\n          }\n        />\n      </Form.Group>\n      <Form.Group controlId=\"scenes\">\n        <Form.Check\n          className=\"mt-2 ms-2\"\n          type=\"switch\"\n          label=\"Scenes\"\n          defaultChecked={fetchScenes}\n          onChange={(e) =>\n            setParams(\"scenes\", e.currentTarget.checked.toString())\n          }\n        />\n      </Form.Group>\n    </>\n  );\n\n  return (\n    <List\n      entityName=\"Scene Pairings\"\n      page={page}\n      filters={filters}\n      setPage={setPage}\n      perPage={PER_PAGE}\n      loading={loading}\n      listCount={data?.queryPerformers?.count}\n    >\n      {fetchScenes ? (\n        performers?.map((p, i) => (\n          <Row key={p.id}>\n            <Col xs={3} key={p.id}>\n              <PerformerCard performer={p} />\n            </Col>\n            <Col xs={9}>\n              <Row>\n                {p?.scenes?.map((s) => (\n                  <Col xs={4} key={s.id}>\n                    <SceneCard scene={s} />\n                  </Col>\n                ))}\n              </Row>\n            </Col>\n            {i < performers.length - 1 && <hr />}\n          </Row>\n        ))\n      ) : (\n        <Row>\n          {performers?.map((p) => (\n            <Col xs={3} key={p.id}>\n              <PerformerCard performer={p} />\n            </Col>\n          ))}\n        </Row>\n      )}\n    </List>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/performers/index.tsx",
    "content": "import type { FC } from \"react\";\nimport { Route, Routes, useParams } from \"react-router-dom\";\n\nimport { ErrorMessage, LoadingIndicator } from \"src/components/fragments\";\n\nimport { useFullPerformer } from \"src/graphql\";\nimport Title from \"src/components/title\";\n\nimport Performers from \"./Performers\";\nimport Performer from \"./Performer\";\nimport PerformerAdd from \"./PerformerAdd\";\nimport PerformerEdit from \"./PerformerEdit\";\nimport PerformerMerge from \"./PerformerMerge\";\nimport PerformerDelete from \"./PerformerDelete\";\n\nconst PerformerLoader: FC = () => {\n  const { id } = useParams();\n  const { loading, data } = useFullPerformer({ id: id ?? \"\" }, !id);\n\n  if (loading) return <LoadingIndicator message=\"Loading performer...\" />;\n\n  if (!id) return <ErrorMessage error=\"Performer ID is missing\" />;\n\n  const performer = data?.findPerformer;\n  if (!performer) return <ErrorMessage error=\"Performer not found.\" />;\n\n  return (\n    <Routes>\n      <Route\n        path=\"/merge\"\n        element={\n          <>\n            <Title page={`Merge Into \"${performer.name}\"`} />\n            <PerformerMerge performer={performer} />\n          </>\n        }\n      />\n      <Route\n        path=\"/delete\"\n        element={\n          <>\n            <Title page={`Delete \"${performer.name}\"`} />\n            <PerformerDelete performer={performer} />\n          </>\n        }\n      />\n      <Route\n        path=\"/edit\"\n        element={\n          <>\n            <Title page={`Edit \"${performer.name}\"`} />\n            <PerformerEdit performer={performer} />\n          </>\n        }\n      />\n      <Route\n        path=\"/\"\n        element={\n          <>\n            <Title page={performer.name} />\n            <Performer performer={performer} />\n          </>\n        }\n      />\n    </Routes>\n  );\n};\n\nconst PerformerRoutes: FC = () => (\n  <Routes>\n    <Route\n      path=\"/\"\n      element={\n        <>\n          <Title page=\"Performers\" />\n          <Performers />\n        </>\n      }\n    />\n    <Route\n      path=\"/add\"\n      element={\n        <>\n          <Title page=\"Add Performer\" />\n          <PerformerAdd />\n        </>\n      }\n    />\n    <Route path=\"/:id/*\" element={<PerformerLoader />} />\n  </Routes>\n);\n\nexport default PerformerRoutes;\n"
  },
  {
    "path": "frontend/src/pages/performers/performerForm/ExistingPerformerAlert.tsx",
    "content": "import { type FC, useCallback, useEffect, useState } from \"react\";\nimport { Alert } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport { debounce } from \"lodash-es\";\nimport { faExclamationTriangle } from \"@fortawesome/free-solid-svg-icons\";\nimport {\n  useQueryExistingPerformer,\n  type QueryExistingPerformerInput,\n} from \"src/graphql\";\nimport { Icon, PerformerName } from \"src/components/fragments\";\nimport { performerHref, editHref } from \"src/utils\";\n\ninterface Props {\n  name: string;\n  disambiguation?: string | null;\n  urls?: { url: string }[];\n}\n\nconst ExistingPerformerAlert: FC<Props> = ({\n  name,\n  disambiguation,\n  urls = [],\n}) => {\n  const [input, setInput] = useState<QueryExistingPerformerInput>({\n    name: \"\",\n    urls: [],\n  });\n  const { data: existingData } = useQueryExistingPerformer(\n    { input },\n    input.urls.length === 0 && input.name?.length === 0,\n  );\n\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  const setInputData = useCallback(\n    debounce((input: QueryExistingPerformerInput) => setInput(input), 1000),\n    [],\n  );\n\n  useEffect(() => {\n    setInputData({\n      name,\n      disambiguation,\n      urls: urls.map((u) => u.url),\n    });\n  }, [name, disambiguation, urls, setInputData]);\n\n  const existingPerformer =\n    existingData?.queryExistingPerformer.performers ?? [];\n  const existingEdits = existingData?.queryExistingPerformer.edits ?? [];\n\n  if (existingPerformer.length === 0 && existingEdits.length === 0) return null;\n\n  return (\n    <Alert variant=\"warning\">\n      <div className=\"mb-2\">\n        <b>Warning: Performer match found</b>\n      </div>\n\n      {existingPerformer.length > 0 && (\n        <div className=\"mb-2\">\n          <span>Existing performers that have the same name or link:</span>\n          {existingPerformer.map((p) => (\n            <div key={p.id}>\n              <Icon icon={faExclamationTriangle} color=\"red\" />\n              <Link to={performerHref(p)} className=\"ms-2\">\n                <b>\n                  <PerformerName performer={p} />\n                </b>\n              </Link>\n            </div>\n          ))}\n        </div>\n      )}\n\n      {existingEdits.length > 0 && (\n        <div className=\"mb-2\">\n          <span>\n            Pending edits that submit performers with the same name or links:\n          </span>\n          {existingEdits.map(\n            (e) =>\n              e.details?.__typename === \"PerformerEdit\" && (\n                <div key={e.id}>\n                  <Icon icon={faExclamationTriangle} color=\"red\" />\n                  <Link to={editHref(e)} className=\"ms-2\">\n                    <b>\n                      <PerformerName\n                        performer={{\n                          name: e.details.name ?? \"\",\n                          disambiguation: e.details.disambiguation,\n                          deleted: false,\n                        }}\n                      />\n                    </b>\n                  </Link>\n                </div>\n              ),\n          )}\n        </div>\n      )}\n\n      <div>\n        Please verify your draft is not already in the database before\n        submitting.\n      </div>\n    </Alert>\n  );\n};\n\nexport default ExistingPerformerAlert;\n"
  },
  {
    "path": "frontend/src/pages/performers/performerForm/PerformerForm.tsx",
    "content": "import { type FC, useEffect, useMemo, useState, type WheelEvent } from \"react\";\nimport { useForm, Controller } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { useLens } from \"@hookform/lenses\";\nimport Select from \"react-select\";\nimport { Col, Form, Row, Tabs, Tab } from \"react-bootstrap\";\nimport Countries from \"i18n-iso-countries\";\nimport english from \"i18n-iso-countries/langs/en.json\";\nimport cx from \"classnames\";\nimport { sortBy } from \"lodash-es\";\nimport { Link } from \"react-router-dom\";\nimport { faExclamationTriangle } from \"@fortawesome/free-solid-svg-icons\";\n\nimport {\n  GenderEnum,\n  HairColorEnum,\n  EyeColorEnum,\n  BreastTypeEnum,\n  EthnicityEnum,\n  type PerformerEditDetailsInput,\n  type PerformerEditOptionsInput,\n  ValidSiteTypeEnum,\n  type PerformerFragment as Performer,\n  type ImageFragment,\n} from \"src/graphql\";\n\nimport { renderPerformerDetails } from \"src/components/editCard/ModifyEdit\";\nimport { Help, Icon } from \"src/components/fragments\";\nimport {\n  BodyModification,\n  EditNote,\n  NavButtons,\n  SubmitButtons,\n} from \"src/components/form\";\nimport MultiSelect from \"src/components/multiSelect\";\nimport EditImages from \"src/components/editImages\";\nimport URLInput from \"src/components/urlInput\";\nimport ExistingPerformerAlert from \"./ExistingPerformerAlert\";\n\nimport DiffPerformer from \"./diff\";\nimport { PerformerSchema, type PerformerFormData } from \"./schema\";\nimport type { InitialPerformer } from \"./types\";\nimport { useBeforeUnload } from \"src/hooks/useBeforeUnload\";\n\nimport { GenderTypes } from \"src/constants\";\n\nCountries.registerLocale(english);\nconst CountryList = Countries.getNames(\"en\", { select: \"alias\" });\n\ntype OptionEnum = {\n  value: string;\n  label: string;\n  disabled?: boolean;\n};\n\nconst genderOptions = Object.keys(GenderEnum).map((g) => ({\n  value: g,\n  label: GenderTypes[g as GenderEnum],\n}));\n\nconst GENDER: OptionEnum[] = [\n  { value: \"\", label: \"Select gender...\", disabled: true },\n  { value: \"null\", label: \"Unknown\" },\n  ...genderOptions,\n];\n\nconst HAIR: OptionEnum[] = [\n  { value: \"null\", label: \"Unknown\" },\n  { value: \"BLONDE\", label: \"Blond\" },\n  { value: \"BRUNETTE\", label: \"Brown\" },\n  { value: \"BLACK\", label: \"Black\" },\n  { value: \"RED\", label: \"Red\" },\n  { value: \"AUBURN\", label: \"Auburn\" },\n  { value: \"GREY\", label: \"Grey\" },\n  { value: \"WHITE\", label: \"White\" },\n  { value: \"BALD\", label: \"Bald\" },\n  { value: \"VARIOUS\", label: \"Various\" },\n  { value: \"OTHER\", label: \"Other\" },\n];\n\nconst BREAST: OptionEnum[] = [\n  { value: \"null\", label: \"Unknown\" },\n  { value: \"NATURAL\", label: \"Natural\" },\n  { value: \"FAKE\", label: \"Augmented\" },\n  { value: \"NA\", label: \"N/A\" },\n];\n\nconst EYE: OptionEnum[] = [\n  { value: \"null\", label: \"Unknown\" },\n  { value: \"BLUE\", label: \"Blue\" },\n  { value: \"BROWN\", label: \"Brown\" },\n  { value: \"GREY\", label: \"Grey\" },\n  { value: \"GREEN\", label: \"Green\" },\n  { value: \"HAZEL\", label: \"Hazel\" },\n  { value: \"RED\", label: \"Red\" },\n];\n\nconst ETHNICITY: OptionEnum[] = [\n  { value: \"null\", label: \"Unknown\" },\n  { value: \"CAUCASIAN\", label: \"Caucasian\" },\n  { value: \"BLACK\", label: \"Black\" },\n  { value: \"ASIAN\", label: \"Asian\" },\n  { value: \"INDIAN\", label: \"Indian\" },\n  { value: \"LATIN\", label: \"Latin\" },\n  { value: \"MIDDLE_EASTERN\", label: \"Middle Eastern\" },\n  { value: \"MIXED\", label: \"Mixed\" },\n  { value: \"OTHER\", label: \"Other\" },\n];\n\nconst UPDATE_ALIAS_MESSAGE = `Enabling this option sets the current name as an alias on every scene that this performer does not have an alias on.\nIn most cases, it should be enabled when renaming a performer to a different alias, and disabled when correcting a typo in the name.\n`;\n\nconst getEnumValue = (enumArray: OptionEnum[], val: string | null) => {\n  if (val === null) return enumArray[0].value;\n\n  return val;\n};\n\ninterface PerformerProps {\n  performer?: Performer | null;\n  callback: (\n    data: PerformerEditDetailsInput,\n    note: string,\n    updateAliases: boolean,\n    id?: string,\n  ) => void;\n  initial?: InitialPerformer;\n  options?: PerformerEditOptionsInput | null;\n  saving: boolean;\n  isCreate?: boolean;\n}\n\nconst PerformerForm: FC<PerformerProps> = ({\n  performer,\n  callback,\n  initial,\n  saving,\n  options,\n  isCreate = false,\n}) => {\n  useBeforeUnload();\n  const initialAliases = initial?.aliases ?? performer?.aliases ?? [];\n  const {\n    register,\n    control,\n    handleSubmit,\n    watch,\n    setValue,\n    formState: { errors },\n  } = useForm({\n    resolver: yupResolver(PerformerSchema),\n    mode: \"onBlur\",\n    defaultValues: {\n      name: initial?.name ?? performer?.name ?? \"\",\n      disambiguation: initial?.disambiguation ?? performer?.disambiguation,\n      aliases: initialAliases,\n      gender: initial?.gender ?? performer?.gender ?? \"\",\n      birthdate: initial?.birthdate ?? performer?.birth_date ?? undefined,\n      deathdate: initial?.deathdate ?? performer?.death_date ?? undefined,\n      eye_color: getEnumValue(\n        EYE,\n        initial?.eye_color ?? performer?.eye_color ?? null,\n      ),\n      hair_color: getEnumValue(\n        HAIR,\n        initial?.hair_color ?? performer?.hair_color ?? null,\n      ),\n      height: initial?.height || performer?.height,\n      breastType: getEnumValue(\n        BREAST,\n        initial?.breast_type ?? performer?.breast_type ?? null,\n      ),\n      bandSize: initial?.band_size ?? performer?.band_size,\n      cupSize: initial?.cup_size ?? performer?.cup_size,\n      waistSize: initial?.waist_size ?? performer?.waist_size,\n      hipSize: initial?.hip_size ?? performer?.hip_size,\n      country: initial?.country ?? performer?.country ?? \"\",\n      ethnicity: getEnumValue(\n        ETHNICITY,\n        initial?.ethnicity ?? performer?.ethnicity ?? null,\n      ),\n      career_start_year:\n        initial?.career_start_year ?? performer?.career_start_year,\n      career_end_year: initial?.career_end_year ?? performer?.career_end_year,\n      tattoos: initial?.tattoos ?? performer?.tattoos ?? [],\n      piercings: initial?.piercings ?? performer?.piercings ?? [],\n      images: initial?.images ?? performer?.images ?? [],\n      urls: initial?.urls ?? performer?.urls ?? [],\n    },\n  });\n\n  const lens = useLens({ control });\n\n  const [activeTab, setActiveTab] = useState(\"personal\");\n  const [updateAliases, setUpdateAliases] = useState<boolean>(\n    options?.set_modify_aliases ?? true,\n  );\n  const [file, setFile] = useState<File | undefined>();\n\n  const fieldData = watch();\n  const [oldChanges, newChanges] = useMemo(\n    () =>\n      DiffPerformer(\n        PerformerSchema.cast(fieldData, {\n          assert: \"ignore-optionality\",\n        }) as PerformerFormData,\n        performer,\n      ),\n    [fieldData, performer],\n  );\n\n  const changedName =\n    !!performer?.id &&\n    newChanges.name !== null &&\n    performer?.name?.trim() !== newChanges.name;\n\n  const showBreastType =\n    fieldData.gender !== GenderEnum.MALE &&\n    fieldData.gender !== GenderEnum.TRANSGENDER_MALE;\n  // Update breast type based on gender\n  useEffect(() => {\n    if (!showBreastType) setValue(\"breastType\", BreastTypeEnum.NA);\n  }, [showBreastType, setValue]);\n\n  const enumOptions = (enums: OptionEnum[]) =>\n    enums.map((obj) => (\n      <option key={obj.value} value={obj.value} disabled={!!obj.disabled}>\n        {obj.label}\n      </option>\n    ));\n\n  const onSubmit = (data: PerformerFormData) => {\n    const performerData: PerformerEditDetailsInput = {\n      name: data.name,\n      disambiguation: data.disambiguation,\n      gender: GenderEnum[data.gender as keyof typeof GenderEnum] || null,\n      birthdate: data.birthdate,\n      deathdate: data.deathdate,\n      eye_color:\n        EyeColorEnum[data.eye_color as keyof typeof EyeColorEnum] || null,\n      hair_color:\n        HairColorEnum[data.hair_color as keyof typeof HairColorEnum] || null,\n      career_start_year: data.career_start_year,\n      career_end_year: data.career_end_year,\n      height: data.height,\n      waist_size: data.waistSize,\n      hip_size: data.hipSize,\n      ethnicity:\n        EthnicityEnum[data.ethnicity as keyof typeof EthnicityEnum] || null,\n      country: data.country,\n      aliases: data.aliases,\n      piercings: data.piercings ?? [],\n      tattoos: data.tattoos ?? [],\n      breast_type:\n        BreastTypeEnum[data.breastType as keyof typeof BreastTypeEnum] || null,\n      image_ids: data.images.map((i) => i.id),\n      urls: data.urls?.map((u) => ({\n        url: u.url,\n        site_id: u.site.id,\n      })),\n    };\n\n    performerData.cup_size = data.cupSize?.toUpperCase() ?? null;\n    performerData.band_size = data.bandSize ?? null;\n\n    if (\n      data.gender === GenderEnum.MALE ||\n      data.gender === GenderEnum.TRANSGENDER_MALE\n    )\n      performerData.breast_type = BreastTypeEnum.NA;\n\n    callback(performerData, data.note, updateAliases, data.id);\n  };\n\n  const countryObj = [\n    { label: \"Unknown\", value: \"\" },\n    ...sortBy(\n      Object.entries(CountryList).map(([, countryName]) => {\n        return {\n          label: countryName,\n          value: Countries.getAlpha2Code(countryName, \"en\"),\n        };\n      }),\n      \"label\",\n    ),\n  ];\n\n  const handleNumberInputWheel = (el: WheelEvent<HTMLInputElement>) =>\n    el.currentTarget.blur();\n\n  const metadataErrors = [\n    { error: errors.name?.message, tab: \"personal\" },\n    { error: errors.gender?.message, tab: \"personal\" },\n    { error: errors.birthdate?.message, tab: \"personal\" },\n    { error: errors.deathdate?.message, tab: \"personal\" },\n    { error: errors.career_start_year?.message, tab: \"personal\" },\n    { error: errors.career_end_year?.message, tab: \"personal\" },\n    { error: errors.height?.message, tab: \"personal\" },\n    { error: errors.bandSize?.message, tab: \"personal\" },\n    { error: errors.cupSize?.message, tab: \"personal\" },\n    { error: errors.waistSize?.message, tab: \"personal\" },\n    {\n      error: errors.urls?.find?.((u) => u?.url?.message)?.url?.message,\n      tab: \"links\",\n    },\n  ].filter((e) => e.error) as { error: string; tab: string }[];\n\n  return (\n    <Form className=\"PerformerForm\" onSubmit={handleSubmit(onSubmit)}>\n      <input type=\"hidden\" value={performer?.id} {...register(\"id\")} />\n      {isCreate && (\n        <Row>\n          <Col xs={9}>\n            <ExistingPerformerAlert\n              name={fieldData.name || \"\"}\n              disambiguation={fieldData.disambiguation}\n              urls={fieldData.urls || []}\n            />\n          </Col>\n        </Row>\n      )}\n      <Tabs\n        activeKey={activeTab}\n        onSelect={(key) => key && setActiveTab(key)}\n        className=\"d-flex\"\n      >\n        <Tab\n          eventKey=\"personal\"\n          title=\"Personal Information\"\n          className=\"col-xl-9\"\n        >\n          <Row>\n            <Form.Group controlId=\"name\" className=\"col-6 mb-3\">\n              <Form.Label>Name</Form.Label>\n              <Form.Control\n                className={cx({ \"is-invalid\": errors.name })}\n                {...register(\"name\")}\n              />\n              <Form.Control.Feedback type=\"invalid\">\n                {errors?.name?.message}\n              </Form.Control.Feedback>\n              <Form.Text>The primary name used by the performer.</Form.Text>\n            </Form.Group>\n            <Form.Group controlId=\"disambiguation\" className=\"col-6 mb-3\">\n              <Form.Label>Disambiguation</Form.Label>\n              <Form.Control\n                className={cx({ \"is-invalid\": errors.disambiguation })}\n                {...register(\"disambiguation\")}\n              />\n              <Form.Text>Required if the primary name is not unique.</Form.Text>\n            </Form.Group>\n          </Row>\n\n          {changedName && (\n            <Row>\n              <Form.Group className=\"col mb-3\">\n                <Form.Check\n                  id=\"update-modify-aliases\"\n                  checked={updateAliases}\n                  onChange={() => setUpdateAliases((prev) => !prev)}\n                  label=\"Set unset performance aliases to old name\"\n                  className=\"d-inline-block\"\n                />\n                <Help message={UPDATE_ALIAS_MESSAGE} />\n              </Form.Group>\n            </Row>\n          )}\n\n          <Row>\n            <Form.Group controlId=\"aliases\" className=\"col\">\n              <Form.Label>Aliases</Form.Label>\n              <Controller\n                control={control}\n                name=\"aliases\"\n                render={({ field: { onChange } }) => (\n                  <MultiSelect\n                    initialValues={initialAliases}\n                    onChange={onChange}\n                    placeholder=\"Enter name...\"\n                  />\n                )}\n              />\n              <Form.Text>\n                Any names used by the performer different from the primary name.\n              </Form.Text>\n            </Form.Group>\n          </Row>\n\n          <Row className=\"mb-3\">\n            <Form.Group controlId=\"gender\" className=\"col-6\">\n              <Form.Label>Gender</Form.Label>\n              <Form.Select\n                className={cx({ \"is-invalid\": errors.gender })}\n                {...register(\"gender\")}\n              >\n                {enumOptions(GENDER)}\n              </Form.Select>\n              <Form.Control.Feedback type=\"invalid\">\n                {errors?.gender?.message}\n              </Form.Control.Feedback>\n            </Form.Group>\n\n            <Form.Group controlId=\"birthdate\" className=\"col-3\">\n              <Form.Label>Birthdate</Form.Label>\n              <Form.Control\n                className={cx({ \"is-invalid\": errors.birthdate })}\n                placeholder=\"YYYY-MM-DD\"\n                {...register(\"birthdate\")}\n              />\n              <Form.Control.Feedback type=\"invalid\">\n                {errors?.birthdate?.message}\n              </Form.Control.Feedback>\n            </Form.Group>\n\n            <Form.Group controlId=\"deathdate\" className=\"col-3\">\n              <Form.Label>Deathdate</Form.Label>\n              <Form.Control\n                className={cx({ \"is-invalid\": errors.deathdate })}\n                placeholder=\"YYYY-MM-DD\"\n                {...register(\"deathdate\")}\n              />\n              <Form.Control.Feedback type=\"invalid\">\n                {errors?.deathdate?.message}\n              </Form.Control.Feedback>\n            </Form.Group>\n\n            <Col xs={{ span: 6, offset: 6 }}>\n              <Form.Text>\n                If the precise date is unknown the day and/or month can be\n                omitted.\n              </Form.Text>\n            </Col>\n          </Row>\n\n          <Row>\n            <Form.Group controlId=\"eye_color\" className=\"col-6 mb-3\">\n              <Form.Label>Eye Color</Form.Label>\n              <Form.Select\n                className={cx({ \"is-invalid\": errors.eye_color })}\n                {...register(\"eye_color\")}\n              >\n                {enumOptions(EYE)}\n              </Form.Select>\n              <Form.Control.Feedback>\n                {errors?.eye_color?.message}\n              </Form.Control.Feedback>\n            </Form.Group>\n\n            <Form.Group controlId=\"hair_color\" className=\"col-6 mb-3\">\n              <Form.Label>Hair Color</Form.Label>\n              <Form.Select\n                className={cx({ \"is-invalid\": errors.hair_color })}\n                {...register(\"hair_color\")}\n              >\n                {enumOptions(HAIR)}\n              </Form.Select>\n              <Form.Control.Feedback>\n                {errors?.hair_color?.message}\n              </Form.Control.Feedback>\n            </Form.Group>\n          </Row>\n\n          <Row>\n            <Form.Group controlId=\"height\" className=\"col-6 mb-3\">\n              <Form.Label>Height</Form.Label>\n              <Form.Control\n                className={cx({ \"is-invalid\": errors.height })}\n                type=\"number\"\n                onWheel={handleNumberInputWheel}\n                {...register(\"height\")}\n              />\n              <Form.Control.Feedback type=\"invalid\">\n                {errors?.height?.message}\n              </Form.Control.Feedback>\n              <Form.Text>Height in centimeters</Form.Text>\n            </Form.Group>\n\n            {fieldData.gender !== \"MALE\" &&\n              fieldData.gender !== \"TRANSGENDER_MALE\" && (\n                <Form.Group controlId=\"breastType\" className=\"col-6 mb-3\">\n                  <Form.Label>Breast type</Form.Label>\n                  <Form.Select\n                    className={cx({ \"is-invalid\": errors.breastType })}\n                    {...register(\"breastType\")}\n                  >\n                    {enumOptions(BREAST)}\n                  </Form.Select>\n                  <Form.Control.Feedback type=\"invalid\">\n                    {errors?.breastType?.message}\n                  </Form.Control.Feedback>\n                </Form.Group>\n              )}\n          </Row>\n\n          {showBreastType && (\n            <Row>\n              <Form.Group controlId=\"bandSize\" className=\"col-2 mb-3\">\n                <Form.Label>Band size</Form.Label>\n                <Form.Control\n                  className={cx({ \"is-invalid\": errors.bandSize })}\n                  type=\"number\"\n                  onWheel={handleNumberInputWheel}\n                  {...register(\"bandSize\")}\n                />\n                <Form.Control.Feedback type=\"invalid\">\n                  {errors?.bandSize?.message}\n                </Form.Control.Feedback>\n                <Form.Text>US Bra size number</Form.Text>\n              </Form.Group>\n\n              <Form.Group controlId=\"cupSize\" className=\"col-2 mb-3\">\n                <Form.Label>Cup size</Form.Label>\n                <Form.Control\n                  className={cx({ \"is-invalid\": errors.cupSize })}\n                  {...register(\"cupSize\")}\n                />\n                <Form.Control.Feedback type=\"invalid\">\n                  {errors?.cupSize?.message}\n                </Form.Control.Feedback>\n                <Form.Text>US Bra size letter(s)</Form.Text>\n              </Form.Group>\n\n              <Form.Group controlId=\"waistSize\" className=\"col-4 mb-3\">\n                <Form.Label>Waist size</Form.Label>\n                <Form.Control\n                  className={cx({ \"is-invalid\": errors.waistSize })}\n                  type=\"number\"\n                  onWheel={handleNumberInputWheel}\n                  {...register(\"waistSize\")}\n                />\n                <Form.Control.Feedback type=\"invalid\">\n                  {errors?.waistSize?.message}\n                </Form.Control.Feedback>\n                <Form.Text>Waist circumference in inches</Form.Text>\n              </Form.Group>\n\n              <Form.Group controlId=\"hipSize\" className=\"col-4 mb-3\">\n                <Form.Label>Hip size</Form.Label>\n                <Form.Control\n                  className={cx({ \"is-invalid\": errors.hipSize })}\n                  type=\"number\"\n                  onWheel={handleNumberInputWheel}\n                  {...register(\"hipSize\")}\n                />\n                <Form.Control.Feedback type=\"invalid\">\n                  {errors?.hipSize?.message}\n                </Form.Control.Feedback>\n                <Form.Text>Hip circumference in inches</Form.Text>\n              </Form.Group>\n            </Row>\n          )}\n\n          <Row>\n            <Form.Group controlId=\"country\" className=\"col-6 mb-3\">\n              <Form.Label>Nationality</Form.Label>\n              <Controller\n                control={control}\n                name=\"country\"\n                render={({ field: { onChange, value } }) => (\n                  <Select\n                    classNamePrefix=\"react-select\"\n                    onChange={(option) => onChange(option?.value)}\n                    options={countryObj}\n                    defaultValue={countryObj.find(\n                      (country) => country.value === value,\n                    )}\n                  />\n                )}\n              />\n              <Form.Control.Feedback type=\"invalid\">\n                {errors?.country?.message}\n              </Form.Control.Feedback>\n            </Form.Group>\n\n            <Form.Group controlId=\"ethnicity\" className=\"col-6 mb-3\">\n              <Form.Label>Ethnicity</Form.Label>\n              <Form.Select\n                className={cx({ \"is-invalid\": errors.ethnicity })}\n                {...register(\"ethnicity\")}\n              >\n                {enumOptions(ETHNICITY)}\n              </Form.Select>\n              <Form.Control.Feedback type=\"invalid\">\n                {errors?.ethnicity?.message}\n              </Form.Control.Feedback>\n            </Form.Group>\n          </Row>\n\n          <Row>\n            <Form.Group controlId=\"career_start_year\" className=\"col-6 mb-3\">\n              <Form.Label>Career Start</Form.Label>\n              <Form.Control\n                className={cx({ \"is-invalid\": errors.career_start_year })}\n                type=\"year\"\n                placeholder=\"Year\"\n                {...register(\"career_start_year\")}\n              />\n              <Form.Control.Feedback type=\"invalid\">\n                {errors?.career_start_year?.message}\n              </Form.Control.Feedback>\n            </Form.Group>\n\n            <Form.Group controlId=\"career_end_year\" className=\"col-6 mb-3\">\n              <Form.Label>Career End</Form.Label>\n              <Form.Control\n                className={cx({ \"is-invalid\": errors.career_end_year })}\n                type=\"year\"\n                placeholder=\"Year\"\n                {...register(\"career_end_year\")}\n              />\n              <Form.Control.Feedback type=\"invalid\">\n                {errors?.career_end_year?.message}\n              </Form.Control.Feedback>\n            </Form.Group>\n          </Row>\n\n          <NavButtons onNext={() => setActiveTab(\"bodymod\")} />\n        </Tab>\n\n        <Tab\n          eventKey=\"bodymod\"\n          title=\"Tattoos and Piercings\"\n          className=\"col-xl-9\"\n        >\n          <BodyModification\n            lens={lens.focus(\"tattoos\").defined().cast()}\n            name=\"tattoos\"\n            locationPlaceholder=\"Add a tattoo for a location...\"\n            descriptionPlaceholder=\"Tattoo description...\"\n            formatLabel={(text) => `Add tattoo for location \"${text}\"`}\n          />\n          <Form.Control.Feedback\n            className={cx({ \"d-block\": errors.tattoos })}\n            type=\"invalid\"\n          >\n            {errors?.tattoos?.map?.((mod, idx) => (\n              // biome-ignore lint/suspicious/noArrayIndexKey: Undefined location\n              <div key={idx}>\n                Tattoo {idx + 1}: {mod?.location?.message}\n              </div>\n            ))}\n          </Form.Control.Feedback>\n\n          <BodyModification\n            lens={lens.focus(\"piercings\").defined().cast()}\n            name=\"piercings\"\n            locationPlaceholder=\"Add a piercing for a location...\"\n            descriptionPlaceholder=\"Piercing description...\"\n            formatLabel={(text) => `Add piercing for location \"${text}\"`}\n          />\n          <Form.Control.Feedback\n            className={cx({ \"d-block\": errors.piercings })}\n            type=\"invalid\"\n          >\n            {errors?.piercings?.map?.((mod, idx) => (\n              // biome-ignore lint/suspicious/noArrayIndexKey: Undefined location\n              <div key={idx}>\n                Piercing {idx + 1}: {mod?.location?.message}\n              </div>\n            ))}\n          </Form.Control.Feedback>\n\n          <NavButtons onNext={() => setActiveTab(\"links\")} />\n        </Tab>\n\n        <Tab eventKey=\"links\" title=\"Links\" className=\"col-xl-9\">\n          <URLInput\n            lens={lens.focus(\"urls\").defined()}\n            type={ValidSiteTypeEnum.PERFORMER}\n            errors={errors.urls}\n          />\n\n          <NavButtons onNext={() => setActiveTab(\"images\")} />\n        </Tab>\n\n        <Tab eventKey=\"images\" title=\"Images\">\n          <EditImages\n            lens={lens.focus(\"images\").cast<ImageFragment[]>()}\n            file={file}\n            setFile={(f) => setFile(f)}\n            original={performer?.images}\n          />\n\n          <NavButtons\n            onNext={() => setActiveTab(\"confirm\")}\n            disabled={!!file}\n          />\n\n          <div className=\"d-flex\">\n            {/* dummy element for feedback */}\n            <div className=\"ms-auto\">\n              <span className={file ? \"is-invalid\" : \"\"} />\n              <Form.Control.Feedback type=\"invalid\">\n                Upload or remove image to continue.\n              </Form.Control.Feedback>\n            </div>\n          </div>\n        </Tab>\n\n        <Tab eventKey=\"confirm\" title=\"Confirm\" className=\"mt-3 col-xl-9\">\n          {renderPerformerDetails(\n            newChanges,\n            oldChanges,\n            !!performer,\n            updateAliases,\n          )}\n          <Row className=\"my-4\">\n            <Col md={{ span: 8, offset: 4 }}>\n              <EditNote register={register} error={errors.note} />\n            </Col>\n          </Row>\n\n          {metadataErrors.length > 0 && (\n            <div className=\"text-end my-4\">\n              <h6>\n                <Icon icon={faExclamationTriangle} color=\"red\" />\n                <span className=\"ms-1\">Errors</span>\n              </h6>\n              <div className=\"d-flex flex-column text-danger\">\n                {metadataErrors.map(({ error, tab }) => (\n                  <Link to=\"#\" key={error} onClick={() => setActiveTab(tab)}>\n                    {error}\n                  </Link>\n                ))}\n              </div>\n            </div>\n          )}\n\n          <SubmitButtons disabled={!!file || saving} />\n        </Tab>\n      </Tabs>\n    </Form>\n  );\n};\n\nexport default PerformerForm;\n"
  },
  {
    "path": "frontend/src/pages/performers/performerForm/diff.ts",
    "content": "import type {\n  OldPerformerDetails,\n  PerformerDetails,\n} from \"src/components/editCard/ModifyEdit\";\n\nimport type { PerformerFragment } from \"src/graphql\";\nimport {\n  breastType,\n  ethnicityEnum,\n  genderEnum,\n  diffArray,\n  diffValue,\n  diffImages,\n  diffURLs,\n} from \"src/utils\";\n\nimport type { PerformerFormData } from \"./schema\";\n\nconst diffBodyMods = (\n  newMods: { location?: string; description?: string | null }[] | undefined,\n  oldMods: { location: string; description?: string | null }[] | null,\n) =>\n  diffArray(\n    (newMods ?? []).flatMap((m) =>\n      m.location\n        ? [\n            {\n              location: m.location,\n              description: m.description ?? null,\n            },\n          ]\n        : [],\n    ),\n    oldMods ?? [],\n    (mod) => `${mod.location}|${mod.description}`,\n  );\n\nconst selectPerformerDetails = (\n  data: PerformerFormData,\n  original: PerformerFragment | null | undefined,\n): [\n  Required<OldPerformerDetails>,\n  Required<Omit<PerformerDetails, \"draft_id\">>,\n] => {\n  const [addedImages, removedImages] = diffImages(\n    data.images,\n    original?.images ?? [],\n  );\n  const [addedUrls, removedUrls] = diffURLs(data.urls, original?.urls ?? []);\n  const [addedTattoos, removedTattoos] = diffBodyMods(\n    data.tattoos,\n    original?.tattoos ?? [],\n  );\n  const [addedPiercings, removedPiercings] = diffBodyMods(\n    data.piercings,\n    original?.piercings ?? [],\n  );\n  const [addedAliases, removedAliases] = diffArray(\n    data.aliases,\n    original?.aliases ?? [],\n    (a) => a,\n  );\n  const newCupSize = data.cupSize?.toUpperCase() ?? null;\n  const newBandSize = data.bandSize ?? null;\n\n  return [\n    {\n      name: diffValue(original?.name, data.name),\n      disambiguation: diffValue(original?.disambiguation, data.disambiguation),\n      gender: diffValue(original?.gender, genderEnum(data.gender)),\n      birthdate: diffValue(original?.birth_date, data.birthdate),\n      deathdate: diffValue(original?.death_date, data.deathdate),\n      career_start_year: diffValue(\n        original?.career_start_year,\n        data.career_start_year,\n      ),\n      career_end_year: diffValue(\n        original?.career_end_year,\n        data.career_end_year,\n      ),\n      height: diffValue(original?.height, data.height),\n      band_size: diffValue(original?.band_size, newBandSize),\n      cup_size: diffValue(original?.cup_size, newCupSize),\n      waist_size: diffValue(original?.waist_size, data.waistSize),\n      hip_size: diffValue(original?.hip_size, data.hipSize),\n      breast_type: diffValue(\n        original?.breast_type,\n        breastType(data.breastType),\n      ),\n      country: diffValue(original?.country, data.country),\n      ethnicity: diffValue(original?.ethnicity, ethnicityEnum(data.ethnicity)),\n      eye_color: diffValue(original?.eye_color, data.eye_color),\n      hair_color: diffValue(original?.hair_color, data.hair_color),\n    },\n    {\n      name: diffValue(data.name, original?.name),\n      disambiguation: diffValue(data.disambiguation, original?.disambiguation),\n      gender: diffValue(genderEnum(data.gender), original?.gender),\n      birthdate: diffValue(data.birthdate, original?.birth_date),\n      deathdate: diffValue(data.deathdate, original?.death_date),\n      career_start_year: diffValue(\n        data.career_start_year,\n        original?.career_start_year,\n      ),\n      career_end_year: diffValue(\n        data.career_end_year,\n        original?.career_end_year,\n      ),\n      height: diffValue(data.height, original?.height),\n      band_size: diffValue(newBandSize, original?.band_size),\n      cup_size: diffValue(newCupSize, original?.cup_size),\n      waist_size: diffValue(data.waistSize, original?.waist_size),\n      hip_size: diffValue(data.hipSize, original?.hip_size),\n      breast_type: diffValue(\n        breastType(data.breastType),\n        original?.breast_type,\n      ),\n      country: diffValue(data.country, original?.country),\n      ethnicity: diffValue(ethnicityEnum(data.ethnicity), original?.ethnicity),\n      eye_color: diffValue(data.eye_color, original?.eye_color),\n      hair_color: diffValue(data.hair_color, original?.hair_color),\n      added_tattoos: addedTattoos,\n      removed_tattoos: removedTattoos,\n      added_piercings: addedPiercings,\n      removed_piercings: removedPiercings,\n      added_aliases: addedAliases,\n      removed_aliases: removedAliases,\n      added_images: addedImages,\n      removed_images: removedImages,\n      added_urls: addedUrls,\n      removed_urls: removedUrls,\n    },\n  ];\n};\n\nexport default selectPerformerDetails;\n"
  },
  {
    "path": "frontend/src/pages/performers/performerForm/index.ts",
    "content": "import PerformerForm from \"./PerformerForm\";\nexport * from \"./types\";\n\nexport default PerformerForm;\n"
  },
  {
    "path": "frontend/src/pages/performers/performerForm/schema.ts",
    "content": "import * as yup from \"yup\";\n\nimport {\n  GenderEnum,\n  HairColorEnum,\n  EyeColorEnum,\n  BreastTypeEnum,\n  EthnicityEnum,\n} from \"src/graphql\";\nimport {\n  isValidDate,\n  isDateInRange,\n  maxBirthdate,\n  maxDeathdate,\n} from \"src/utils\";\n\nconst nullCheck = (input: string | null) =>\n  input === \"\" || input === \"null\" ? null : input;\nconst zeroCheck = (input: number | null) =>\n  input === 0 || Number.isNaN(input) ? null : input;\n\nexport const PerformerSchema = yup.object({\n  id: yup.string(),\n  name: yup.string().trim().required(\"Name is required\"),\n  gender: yup\n    .string()\n    .transform((val: string) => (val === \"null\" ? null : val))\n    .nullable()\n    .oneOf([null, ...Object.keys(GenderEnum)], \"Gender is required\"),\n  disambiguation: yup.string().trim().transform(nullCheck).nullable(),\n  birthdate: yup\n    .string()\n    .trim()\n    .transform(nullCheck)\n    .matches(/^\\d{4}$|^\\d{4}-\\d{2}$|^\\d{4}-\\d{2}-\\d{2}$/, {\n      excludeEmptyString: true,\n      message: \"Invalid date, must be YYYY, YYYY-MM, or YYYY-MM-DD\",\n    })\n    .test(\"valid-date\", \"Invalid date\", isValidDate)\n    .test(\"date-outside-range\", \"Outside of range\", (date) =>\n      isDateInRange(date, maxBirthdate()),\n    )\n    .nullable(),\n  deathdate: yup\n    .string()\n    .trim()\n    .transform(nullCheck)\n    .matches(/^\\d{4}$|^\\d{4}-\\d{2}$|^\\d{4}-\\d{2}-\\d{2}$/, {\n      excludeEmptyString: true,\n      message: \"Invalid date, must be YYYY, YYYY-MM, or YYYY-MM-DD\",\n    })\n    .test(\"valid-date\", \"Invalid date\", isValidDate)\n    .test(\"date-outside-range\", \"Outside of range\", (date) =>\n      isDateInRange(date, maxDeathdate()),\n    )\n    .nullable(),\n  career_start_year: yup\n    .number()\n    .transform(zeroCheck)\n    .nullable()\n    .min(1950, \"Invalid year\")\n    .max(new Date().getFullYear(), \"Invalid year\"),\n  career_end_year: yup\n    .number()\n    .transform(zeroCheck)\n    .min(1950, \"Invalid year\")\n    .max(new Date().getFullYear(), \"Invalid year\")\n    .nullable(),\n  height: yup\n    .number()\n    .transform(zeroCheck)\n    .integer(\"Invalid height, decimals are not allowed\")\n    .min(100, \"Invalid height, Height must be in centimeters.\")\n    .max(230, \"Invalid height\")\n    .nullable(),\n  bandSize: yup\n    .number()\n    .transform(zeroCheck)\n    .min(28, \"Size must be 28-56\")\n    .max(56, \"Size must be 28-56\")\n    .nullable(),\n  cupSize: yup\n    .string()\n    .transform(nullCheck)\n    .matches(/^[a-zA-Z]{1,4}$/, {\n      excludeEmptyString: true,\n      message: \"Invalid cup size\",\n    })\n    .nullable(),\n  waistSize: yup\n    .number()\n    .transform(zeroCheck)\n    .min(15, \"Invalid waist size\")\n    .max(50, \"Invalid waist size\")\n    .nullable(),\n  hipSize: yup.number().transform(zeroCheck).nullable(),\n  breastType: yup\n    .string()\n    .transform(nullCheck)\n    .nullable()\n    .oneOf([...Object.keys(BreastTypeEnum), null], \"Invalid breast type\"),\n  country: yup.string().trim().transform(nullCheck).nullable().defined(),\n  ethnicity: yup\n    .string()\n    .transform(nullCheck)\n    .nullable()\n    .oneOf([...Object.keys(EthnicityEnum), null], \"Invalid ethnicity\"),\n  eye_color: yup\n    .string()\n    .transform(nullCheck)\n    .nullable()\n    .oneOf([null, ...Object.keys(EyeColorEnum)], \"Invalid eye color\"),\n  hair_color: yup\n    .string()\n    .transform(nullCheck)\n    .nullable()\n    .oneOf([null, ...Object.keys(HairColorEnum)], \"Invalid hair color\"),\n  tattoos: yup.array().of(\n    yup\n      .object({\n        location: yup.string().trim().required(\"Location is required\"),\n        description: yup.string().trim().transform(nullCheck).nullable(),\n      })\n      .noUnknown(),\n  ),\n  piercings: yup.array().of(\n    yup\n      .object({\n        location: yup.string().trim().required(\"Location is required\"),\n        description: yup.string().trim().transform(nullCheck).nullable(),\n      })\n      .noUnknown(),\n  ),\n  aliases: yup.array().of(yup.string().ensure().trim()).ensure().default([]),\n  images: yup\n    .array()\n    .of(\n      yup.object({\n        id: yup.string().required(),\n        url: yup.string().required(),\n        width: yup.number().default(0),\n        height: yup.number().default(0),\n      }),\n    )\n    .required(),\n  urls: yup\n    .array()\n    .of(\n      yup.object({\n        url: yup.string().url(\"Invalid URL\").required(),\n        site: yup\n          .object({\n            id: yup.string().required(),\n            name: yup.string().required(),\n            icon: yup.string().required(),\n          })\n          .required(),\n      }),\n    )\n    .ensure(),\n  note: yup.string().required(\"Edit note is required\"),\n});\n\nexport type PerformerFormData = yup.Asserts<typeof PerformerSchema>;\n"
  },
  {
    "path": "frontend/src/pages/performers/performerForm/types.ts",
    "content": "import type {\n  GenderEnum,\n  HairColorEnum,\n  EyeColorEnum,\n  EthnicityEnum,\n  BreastTypeEnum,\n} from \"src/graphql\";\n\nexport type InitialPerformer = {\n  name?: string | null;\n  disambiguation?: string | null;\n  gender?: GenderEnum | null;\n  birthdate?: string | null;\n  deathdate?: string | null;\n  height?: number | null;\n  hair_color?: HairColorEnum | null;\n  eye_color?: EyeColorEnum | null;\n  ethnicity?: EthnicityEnum | null;\n  breast_type?: BreastTypeEnum | null;\n  country?: string | null;\n  career_start_year?: number | null;\n  career_end_year?: number | null;\n  urls?: {\n    url: string;\n    site: {\n      id: string;\n      name: string;\n    };\n  }[];\n  aliases?: string[];\n  waist_size?: number | null;\n  hip_size?: number | null;\n  band_size?: number | null;\n  cup_size?: string | null;\n  images?: {\n    id: string;\n    url: string;\n    width: number;\n    height: number;\n  }[];\n  tattoos?: {\n    location: string;\n    description?: string | null;\n  }[];\n  piercings?: {\n    location: string;\n    description?: string | null;\n  }[];\n};\n"
  },
  {
    "path": "frontend/src/pages/performers/styles.scss",
    "content": ".PerformerMerge {\n  .PerformerCard {\n    &-image {\n      height: 8rem;\n      aspect-ratio: 1 / 1;\n    }\n\n    .card-footer {\n      display: none;\n    }\n  }\n\n  .TargetCard {\n    .PerformerCard-image {\n      border: 2px solid white;\n    }\n  }\n}\n\n.performer-photo {\n  height: 470px;\n  margin-top: 0.75rem;\n}\n\n.performer-filter {\n  width: 175px;\n}\n\n.performer-sort {\n  width: 200px;\n\n  select {\n    -webkit-appearance: none;\n  }\n}\n\n.performers-list {\n  .col-auto {\n    width: 20%;\n  }\n}\n\n.PerformerScenes {\n  .CheckboxSelect {\n    float: left;\n    margin-right: 0.5rem;\n  }\n}\n"
  },
  {
    "path": "frontend/src/pages/registerUser/Register.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport type { CombinedGraphQLErrors } from \"@apollo/client\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { useForm } from \"react-hook-form\";\nimport { useNavigate } from \"react-router-dom\";\nimport { Button, Form, Row, Col } from \"react-bootstrap\";\nimport cx from \"classnames\";\n\nimport { ErrorMessage, LoadingIndicator } from \"src/components/fragments\";\nimport Title from \"src/components/title\";\nimport { useNewUser, useConfig, type ConfigQuery } from \"src/graphql\";\nimport * as yup from \"yup\";\n\nimport { ROUTE_HOME, ROUTE_ACTIVATE, ROUTE_LOGIN } from \"src/constants/route\";\nimport { useCurrentUser } from \"src/hooks\";\n\nconst schema = yup.object({\n  email: yup.string().email().required(\"Email is required\"),\n  inviteKey: yup\n    .string()\n    .trim()\n    .matches(\n      /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,\n      \"Invalid invite key\",\n    )\n    .required(\"Invite key is required\"),\n});\ntype RegisterFormData = yup.Asserts<typeof schema>;\n\ninterface Props {\n  config: ConfigQuery[\"getConfig\"];\n}\n\nconst Register: FC<Props> = ({ config }) => {\n  const navigate = useNavigate();\n  const [awaitingActivation, setAwaitingActivation] = useState(false);\n  const { isAuthenticated } = useCurrentUser();\n  const [submitError, setSubmitError] = useState<string | undefined>();\n\n  const inviteRequired = config.require_invite ?? true;\n\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm<RegisterFormData>({\n    resolver: yupResolver(schema),\n  });\n\n  const [newUser] = useNewUser();\n\n  if (isAuthenticated) navigate(ROUTE_HOME);\n\n  const onSubmit = (formData: RegisterFormData) => {\n    const userData = {\n      email: formData.email,\n      invite_key: formData.inviteKey,\n    };\n    setSubmitError(undefined);\n    newUser({ variables: { input: userData } })\n      .then((response) => {\n        if (response.data?.newUser) {\n          navigate(\n            `${ROUTE_ACTIVATE}?email=${encodeURIComponent(\n              formData.email,\n            )}&key=${response.data.newUser}`,\n          );\n        } else {\n          setAwaitingActivation(true);\n        }\n      })\n      .catch((err?: CombinedGraphQLErrors) => {\n        if (err?.message) {\n          setSubmitError(err.message);\n        }\n      });\n  };\n\n  if (awaitingActivation)\n    return (\n      <div className=\"LoginPrompt\">\n        <div className=\"align-self-center col-8 mx-auto\">\n          <h5>Invite key accepted</h5>\n          <p>Please check your email to complete your registration.</p>\n          <a href={ROUTE_LOGIN}>Return to login</a>\n        </div>\n      </div>\n    );\n\n  const errorList = [\n    errors.inviteKey?.message,\n    errors.email?.message,\n    submitError,\n  ].filter((err): err is string => err !== undefined);\n\n  return (\n    <div className=\"LoginPrompt mx-auto d-flex\">\n      <Title page=\"Register Account\" />\n      <Form\n        className=\"align-self-center col-8 mx-auto\"\n        onSubmit={handleSubmit(onSubmit)}\n      >\n        <Form.Group controlId=\"email\">\n          <h3>Register account</h3>\n          <hr className=\"my-4\" />\n          <Row>\n            <Col xs={4}>\n              <Form.Label>Email:</Form.Label>\n            </Col>\n            <Col xs={8}>\n              <Form.Control\n                className={cx({ \"is-invalid\": errors?.email })}\n                type=\"text\"\n                placeholder=\"Email\"\n                {...register(\"email\")}\n              />\n            </Col>\n          </Row>\n        </Form.Group>\n\n        {inviteRequired ? (\n          <Form.Group controlId=\"inviteKey\" className=\"mt-2\">\n            <Row>\n              <Col xs={4}>\n                <Form.Label>Invite Key:</Form.Label>\n              </Col>\n              <Col xs={8}>\n                <Form.Control\n                  className={cx({ \"is-invalid\": errors?.inviteKey })}\n                  type=\"text\"\n                  placeholder=\"Invite Key\"\n                  {...register(\"inviteKey\")}\n                />\n              </Col>\n            </Row>\n          </Form.Group>\n        ) : (\n          <Form.Control type=\"hidden\" value=\"-\" {...register(\"inviteKey\")} />\n        )}\n\n        {errorList.map((error) => (\n          <Row key={error} className=\"text-end text-danger\">\n            <div>{error}</div>\n          </Row>\n        ))}\n\n        <Row>\n          <Col\n            xs={{ span: 2, offset: 10 }}\n            className=\"justify-content-end mt-2 d-flex\"\n          >\n            <Button type=\"submit\">Register</Button>\n          </Col>\n        </Row>\n      </Form>\n    </div>\n  );\n};\n\nconst ConfigLoader = () => {\n  const { data: config, loading } = useConfig();\n  if (loading) return <LoadingIndicator message=\"Loading config...\" />;\n\n  if (!config)\n    return <ErrorMessage error=\"Unable to load server configuration\" />;\n\n  return <Register config={config.getConfig} />;\n};\n\nexport default ConfigLoader;\n"
  },
  {
    "path": "frontend/src/pages/registerUser/index.ts",
    "content": "export { default } from \"./Register\";\n"
  },
  {
    "path": "frontend/src/pages/resetPassword/ResetPassword.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { useForm } from \"react-hook-form\";\nimport { CombinedGraphQLErrors } from \"@apollo/client\";\nimport { useNavigate, useLocation } from \"react-router-dom\";\nimport * as yup from \"yup\";\nimport cx from \"classnames\";\nimport { Button, Form, Row, Col } from \"react-bootstrap\";\n\nimport { ErrorMessage } from \"src/components/fragments\";\nimport Title from \"src/components/title\";\nimport { useChangePassword } from \"src/graphql\";\nimport { useCurrentUser } from \"src/hooks\";\nimport { ROUTE_HOME, ROUTE_LOGIN } from \"src/constants/route\";\n\nconst schema = yup.object({\n  resetKey: yup.string().required(\"Reset Key is required\"),\n  newPassword: yup\n    .string()\n    .min(8, \"Password must be at least 8 characters\")\n    .test(\n      \"uniqueness\",\n      \"Password must have at least 5 unique characters\",\n      (value) =>\n        value !== undefined &&\n        value\n          .split(\"\")\n          .filter(\n            (item: string, i: number, ar: string[]) => ar.indexOf(item) === i,\n          )\n          .join(\"\").length >= 5,\n    )\n    .required(\"Password is required\"),\n  confirmNewPassword: yup\n    .string()\n    .nullable()\n    .oneOf([yup.ref(\"newPassword\"), null], \"Passwords don't match\")\n    .required(\"Password is required\"),\n});\ntype ResetPasswordFormData = yup.Asserts<typeof schema>;\n\nfunction useQuery() {\n  return new URLSearchParams(useLocation().search);\n}\n\nconst ResetPassword: FC = () => {\n  const navigate = useNavigate();\n  const query = useQuery();\n  const [submitError, setSubmitError] = useState<string | undefined>();\n  const { isAuthenticated } = useCurrentUser();\n\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm<ResetPasswordFormData>({\n    resolver: yupResolver(schema),\n  });\n\n  const [changePassword, { loading }] = useChangePassword();\n\n  if (isAuthenticated) navigate(ROUTE_HOME);\n\n  const key = query.get(\"key\");\n\n  if (!key) return <ErrorMessage error=\"Invalid request\" />;\n\n  const onSubmit = (formData: ResetPasswordFormData) => {\n    const userData = {\n      reset_key: formData.resetKey,\n      new_password: formData.newPassword,\n    };\n    setSubmitError(undefined);\n    changePassword({ variables: { userData } })\n      .then(() => {\n        navigate(`${ROUTE_LOGIN}?msg=password-reset`);\n      })\n      .catch(\n        (error: unknown) =>\n          CombinedGraphQLErrors.is(error) && setSubmitError(error.message),\n      );\n  };\n\n  const errorList = [\n    errors.resetKey?.message,\n    errors.newPassword?.message,\n    errors.confirmNewPassword?.message,\n    submitError,\n  ].filter((err): err is string => err !== undefined);\n\n  return (\n    <div className=\"LoginPrompt\">\n      <Title page=\"Reset Password\" />\n      <Form\n        className=\"align-self-center col-8 mx-auto\"\n        onSubmit={handleSubmit(onSubmit)}\n      >\n        <Form.Control type=\"hidden\" value={key} {...register(\"resetKey\")} />\n\n        <Form.Group controlId=\"password\" className=\"mt-2\">\n          <h3>Reset Password</h3>\n          <hr className=\"my-4\" />\n          <Row>\n            <Col>\n              <Form.Group controlId=\"newPassword\" className=\"mb-3\">\n                <Form.Control\n                  className={cx({ \"is-invalid\": errors.newPassword })}\n                  type=\"password\"\n                  placeholder=\"New Password\"\n                  {...register(\"newPassword\")}\n                />\n                <div className=\"invalid-feedback\">\n                  {errors?.newPassword?.message}\n                </div>\n              </Form.Group>\n              <Form.Group controlId=\"confirmNewPassword\" className=\"mb-3\">\n                <Form.Control\n                  className={cx({ \"is-invalid\": errors.confirmNewPassword })}\n                  type=\"password\"\n                  placeholder=\"Confirm New Password\"\n                  {...register(\"confirmNewPassword\")}\n                />\n                <div className=\"invalid-feedback\">\n                  {errors?.confirmNewPassword?.message}\n                </div>\n              </Form.Group>\n            </Col>\n          </Row>\n        </Form.Group>\n\n        {errorList.map((error) => (\n          <Row key={error} className=\"text-end text-danger\">\n            <div>{error}</div>\n          </Row>\n        ))}\n\n        <Row>\n          <Col\n            xs={{ span: 3, offset: 9 }}\n            className=\"justify-content-end mt-2 d-flex\"\n          >\n            <Button type=\"submit\" disabled={loading}>\n              Set Password\n            </Button>\n          </Col>\n        </Row>\n      </Form>\n    </div>\n  );\n};\n\nexport default ResetPassword;\n"
  },
  {
    "path": "frontend/src/pages/resetPassword/index.ts",
    "content": "export { default } from \"./ResetPassword\";\n"
  },
  {
    "path": "frontend/src/pages/scenes/Scene.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link, useLocation, useNavigate } from \"react-router-dom\";\nimport { Button, Card, Tabs, Tab } from \"react-bootstrap\";\n\nimport {\n  usePendingEditsCount,\n  TargetTypeEnum,\n  type SceneFragment as Scene,\n} from \"src/graphql\";\nimport { useCurrentUser } from \"src/hooks\";\nimport {\n  tagHref,\n  performerHref,\n  studioHref,\n  createHref,\n  formatDuration,\n  formatPendingEdits,\n  getUrlBySite,\n  compareByName,\n} from \"src/utils\";\nimport { ROUTE_SCENE_EDIT, ROUTE_SCENE_DELETE } from \"src/constants/route\";\nimport { GenderIcon, TagLink, PerformerName } from \"src/components/fragments\";\nimport { EditList, URLList } from \"src/components/list\";\nimport Image from \"src/components/image\";\nimport { FingerprintTable } from \"./components/fingerprints/FingerprintTable\";\n\nconst DEFAULT_TAB = \"description\";\n\ninterface Props {\n  scene: Scene;\n}\n\nconst SceneComponent: FC<Props> = ({ scene }) => {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const activeTab = location.hash?.slice(1) || DEFAULT_TAB;\n  const { isEditor } = useCurrentUser();\n\n  const { data: editData } = usePendingEditsCount({\n    type: TargetTypeEnum.SCENE,\n    id: scene.id,\n  });\n  const pendingEditCount = editData?.queryEdits.count;\n\n  const setTab = (tab: string | null) =>\n    navigate({ hash: tab === DEFAULT_TAB ? \"\" : `#${tab}` });\n\n  const performers = scene.performers\n    .map((performance) => {\n      const { performer } = performance;\n      return (\n        <Link\n          key={performer.id}\n          to={performerHref(performer)}\n          className=\"scene-performer\"\n        >\n          <GenderIcon gender={performer.gender} />\n          <PerformerName performer={performer} as={performance.as} />\n        </Link>\n      );\n    })\n    .map((p, index) => (index % 2 === 2 ? [\" • \", p] : p));\n\n  const tags = [...scene.tags].sort(compareByName).map((tag) => (\n    <li key={tag.name}>\n      <TagLink\n        title={tag.name}\n        link={tagHref(tag)}\n        description={tag.description}\n      />\n    </li>\n  ));\n\n  const studioURL = getUrlBySite(scene.urls, \"Studio\");\n\n  return (\n    <>\n      <Card className=\"scene-info\">\n        <Card.Header>\n          <div className=\"float-end\">\n            {isEditor && !scene.deleted && (\n              <>\n                <Link to={createHref(ROUTE_SCENE_EDIT, { id: scene.id })}>\n                  <Button>Edit</Button>\n                </Link>\n                <Link\n                  to={createHref(ROUTE_SCENE_DELETE, { id: scene.id })}\n                  className=\"ms-2\"\n                >\n                  <Button variant=\"danger\">Delete</Button>\n                </Link>\n              </>\n            )}\n          </div>\n          <h3>\n            {scene.deleted ? (\n              <del>{scene.title}</del>\n            ) : (\n              <span>{scene.title}</span>\n            )}\n          </h3>\n          <h6>\n            {scene.studio && (\n              <>\n                <Link to={studioHref(scene.studio)}>{scene.studio.name}</Link>\n                <span className=\"mx-1\">•</span>\n              </>\n            )}\n            {scene.release_date}\n          </h6>\n        </Card.Header>\n        <Card.Body className=\"ScenePhoto\">\n          <Image\n            images={scene.images}\n            emptyMessage=\"Scene has no image\"\n            size={1280}\n          />\n        </Card.Body>\n        <Card.Footer className=\"d-flex mx-1\">\n          <div className=\"scene-performers me-auto\">{performers}</div>\n          {scene.code && (\n            <div className=\"ms-3\">\n              Studio Code: <strong>{scene.code}</strong>\n            </div>\n          )}\n          {!!scene.duration && (\n            <div title={`${scene.duration} seconds`} className=\"ms-3\">\n              Duration: <b>{formatDuration(scene.duration)}</b>\n            </div>\n          )}\n          {scene.director && (\n            <div className=\"ms-3\">\n              Director: <strong>{scene.director}</strong>\n            </div>\n          )}\n          {scene.production_date && (\n            <div className=\"ms-3\">\n              Produced: <strong>{scene.production_date}</strong>\n            </div>\n          )}\n        </Card.Footer>\n      </Card>\n      <div className=\"float-end\">\n        {scene.urls.map((u) => (\n          <a href={u.url} target=\"_blank\" rel=\"noreferrer noopener\" key={u.url}>\n            <img src={u.site.icon} alt=\"\" className=\"SiteLink-icon\" />\n          </a>\n        ))}\n      </div>\n      <Tabs\n        activeKey={activeTab}\n        id=\"scene-tabs\"\n        mountOnEnter\n        onSelect={setTab}\n      >\n        <Tab eventKey=\"description\" title=\"Description\" className=\"my-4\">\n          <div className=\"scene-description\">\n            <h4>Description:</h4>\n            <div>{scene.details}</div>\n          </div>\n          <div className=\"scene-tags\">\n            <h6>Tags:</h6>\n            <ul className=\"scene-tag-list\">{tags}</ul>\n          </div>\n          {studioURL && (\n            <>\n              <hr />\n              <div>\n                <b className=\"me-2\">{studioURL.site.name}:</b>\n                <a\n                  href={studioURL.url}\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                >\n                  {studioURL.url}\n                </a>\n              </div>\n            </>\n          )}\n        </Tab>\n        <Tab eventKey=\"fingerprints\" title=\"Fingerprints\" mountOnEnter={false}>\n          <FingerprintTable scene={scene} />\n        </Tab>\n        <Tab eventKey=\"links\" title=\"Links\">\n          <URLList urls={scene.urls} />\n        </Tab>\n        <Tab\n          eventKey=\"edits\"\n          title={`Edits${formatPendingEdits(pendingEditCount)}`}\n          tabClassName={pendingEditCount ? \"PendingEditTab\" : \"\"}\n        >\n          <EditList type={TargetTypeEnum.SCENE} id={scene.id} />\n        </Tab>\n      </Tabs>\n    </>\n  );\n};\n\nexport default SceneComponent;\n"
  },
  {
    "path": "frontend/src/pages/scenes/SceneAdd.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  useSceneEdit,\n  OperationEnum,\n  type SceneEditDetailsInput,\n} from \"src/graphql\";\nimport { editHref } from \"src/utils\";\n\nimport SceneForm from \"./sceneForm\";\n\nconst SceneAdd: FC = () => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [submitSceneEdit, { loading: saving }] = useSceneEdit({\n    onCompleted: (data) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (data.sceneEdit.id) navigate(editHref(data.sceneEdit));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  const doInsert = (updateData: SceneEditDetailsInput, editNote: string) => {\n    submitSceneEdit({\n      variables: {\n        sceneData: {\n          edit: {\n            operation: OperationEnum.CREATE,\n            comment: editNote,\n          },\n          details: updateData,\n        },\n      },\n    });\n  };\n\n  return (\n    <div>\n      <h3>Add new scene</h3>\n      <hr />\n      <SceneForm callback={doInsert} saving={saving} isCreate />\n      {submissionError && (\n        <div className=\"text-danger text-end col-9\">\n          Error: {submissionError}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default SceneAdd;\n"
  },
  {
    "path": "frontend/src/pages/scenes/SceneDelete.tsx",
    "content": "import type { FC } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { Button, Col, Row, Form } from \"react-bootstrap\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\n\nimport {\n  OperationEnum,\n  useSceneEdit,\n  type SceneFragment as Scene,\n} from \"src/graphql\";\nimport { EditNote } from \"src/components/form\";\nimport { editHref } from \"src/utils\";\n\nconst schema = yup.object({\n  id: yup.string().required(),\n  note: yup.string().required(\"An edit note is required.\"),\n});\nexport type FormData = yup.Asserts<typeof schema>;\n\ninterface Props {\n  scene: Scene;\n}\n\nconst SceneDelete: FC<Props> = ({ scene }) => {\n  const navigate = useNavigate();\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm<FormData>({\n    resolver: yupResolver(schema),\n    mode: \"onBlur\",\n  });\n  const [deleteSceneEdit, { loading: deleting }] = useSceneEdit({\n    onCompleted: (data) => {\n      if (data.sceneEdit.id) navigate(editHref(data.sceneEdit));\n    },\n  });\n\n  const handleDelete = (data: FormData) =>\n    deleteSceneEdit({\n      variables: {\n        sceneData: {\n          edit: {\n            operation: OperationEnum.DESTROY,\n            id: data.id,\n            comment: data.note,\n          },\n        },\n      },\n    });\n\n  return (\n    <Form className=\"SceneDeleteForm\" onSubmit={handleSubmit(handleDelete)}>\n      <Row>\n        <h4>\n          Delete scene <em>{scene.title}</em>\n        </h4>\n      </Row>\n      <Form.Control type=\"hidden\" value={scene.id} {...register(\"id\")} />\n      <Row className=\"my-4\">\n        <Col md={6}>\n          <EditNote register={register} error={errors.note} />\n          <div className=\"d-flex mt-2\">\n            <Button\n              variant=\"danger\"\n              className=\"ms-auto me-2\"\n              onClick={() => navigate(-1)}\n            >\n              Cancel\n            </Button>\n            <Button\n              type=\"submit\"\n              disabled\n              className=\"d-none\"\n              aria-hidden=\"true\"\n            />\n            <Button type=\"submit\" disabled={deleting}>\n              Submit Edit\n            </Button>\n          </div>\n        </Col>\n      </Row>\n    </Form>\n  );\n};\n\nexport default SceneDelete;\n"
  },
  {
    "path": "frontend/src/pages/scenes/SceneEdit.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  useSceneEdit,\n  type SceneEditDetailsInput,\n  OperationEnum,\n  type SceneFragment as Scene,\n} from \"src/graphql\";\nimport { createHref } from \"src/utils\";\nimport { ROUTE_EDIT } from \"src/constants\";\nimport SceneForm from \"./sceneForm\";\n\ninterface Props {\n  scene: Scene;\n}\n\nconst SceneEdit: FC<Props> = ({ scene }) => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [insertSceneEdit, { loading: saving }] = useSceneEdit({\n    onCompleted: (result) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (result.sceneEdit.id)\n        navigate(createHref(ROUTE_EDIT, result.sceneEdit));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  const doUpdate = (updateData: SceneEditDetailsInput, editNote: string) => {\n    insertSceneEdit({\n      variables: {\n        sceneData: {\n          edit: {\n            id: scene.id,\n            operation: OperationEnum.MODIFY,\n            comment: editNote,\n          },\n          details: updateData,\n        },\n      },\n    });\n  };\n\n  return (\n    <div>\n      <h3>\n        Edit scene{\" \"}\n        <i>\n          <b>{scene.title}</b>\n        </i>\n      </h3>\n      <hr />\n      <SceneForm scene={scene} callback={doUpdate} saving={saving} />\n      {submissionError && (\n        <div className=\"text-danger text-end col-9\">\n          Error: {submissionError}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default SceneEdit;\n"
  },
  {
    "path": "frontend/src/pages/scenes/SceneEditUpdate.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  useSceneEditUpdate,\n  type SceneEditDetailsInput,\n  type EditUpdateQuery,\n} from \"src/graphql\";\nimport { createHref, isScene, isSceneEdit } from \"src/utils\";\nimport SceneForm from \"./sceneForm\";\n\ntype EditUpdate = NonNullable<EditUpdateQuery[\"findEdit\"]>;\n\nimport { ROUTE_EDIT } from \"src/constants\";\nimport Title from \"src/components/title\";\n\nexport const SceneEditUpdate: FC<{ edit: EditUpdate }> = ({ edit }) => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [updateSceneEdit, { loading: saving }] = useSceneEditUpdate({\n    onCompleted: (result) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (result.sceneEditUpdate.id)\n        navigate(createHref(ROUTE_EDIT, result.sceneEditUpdate));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  if (!isSceneEdit(edit.details) || (edit.target && !isScene(edit.target)))\n    return null;\n\n  const doUpdate = (updateData: SceneEditDetailsInput, editNote: string) => {\n    if (!isSceneEdit(edit.details)) return;\n\n    const details: SceneEditDetailsInput = {\n      ...updateData,\n      draft_id: edit.details.draft_id,\n      fingerprints: edit.details.fingerprints,\n    };\n    updateSceneEdit({\n      variables: {\n        id: edit.id,\n        sceneData: {\n          edit: {\n            id: edit.target?.id,\n            operation: edit.operation,\n            comment: editNote,\n          },\n          details,\n        },\n      },\n    });\n  };\n\n  const sceneTitle = edit.target?.title ?? edit.details.title;\n\n  return (\n    <div>\n      <Title page={`Update scene edit for \"${sceneTitle}\"`} />\n      <h3>\n        Update scene edit for\n        <i className=\"ms-2\">\n          <b>{sceneTitle}</b>\n        </i>\n      </h3>\n      <hr />\n      <SceneForm\n        scene={edit.target}\n        initial={edit.details}\n        callback={doUpdate}\n        saving={saving}\n      />\n      {submissionError && (\n        <div className=\"text-danger text-end col-9\">\n          Error: {submissionError}\n        </div>\n      )}\n    </div>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/scenes/Scenes.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\n\nimport { CriterionModifier, useConfig } from \"src/graphql\";\nimport { createHref } from \"src/utils\";\nimport { SceneList } from \"src/components/list\";\nimport { useQueryParams, useCurrentUser } from \"src/hooks\";\nimport { ROUTE_SCENE_ADD } from \"src/constants/route\";\n\nconst Scenes: FC = () => {\n  const { isEditor } = useCurrentUser();\n  const { data: configData } = useConfig();\n  const [{ fingerprint }] = useQueryParams({\n    fingerprint: { name: \"fingerprint\", type: \"string\" },\n  });\n  const filter = fingerprint\n    ? {\n        fingerprints: {\n          modifier: CriterionModifier.INCLUDES,\n          value: [fingerprint],\n        },\n      }\n    : undefined;\n\n  return (\n    <>\n      <div className=\"d-flex\">\n        <h3 className=\"me-4\">Scenes</h3>\n        {isEditor && !configData?.getConfig.require_scene_draft && (\n          <Link to={createHref(ROUTE_SCENE_ADD)} className=\"ms-auto\">\n            <Button>Create</Button>\n          </Link>\n        )}\n      </div>\n      <SceneList filter={filter} favoriteFilter=\"all\" />\n    </>\n  );\n};\n\nexport default Scenes;\n"
  },
  {
    "path": "frontend/src/pages/scenes/components/fingerprints/DeleteFingerprintsModal.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button, Modal } from \"react-bootstrap\";\nimport { faTrash, faSpinner } from \"@fortawesome/free-solid-svg-icons\";\nimport { Icon } from \"src/components/fragments\";\n\ninterface Props {\n  show: boolean;\n  selectedCount: number;\n  deleting: boolean;\n  onHide: () => void;\n  onDelete: () => Promise<boolean | undefined>;\n}\n\nexport const DeleteFingerprintsModal: FC<Props> = ({\n  show,\n  selectedCount,\n  deleting,\n  onHide,\n  onDelete,\n}) => {\n  return (\n    <Modal show={show} onHide={onHide}>\n      <Modal.Header closeButton>\n        <Modal.Title>Delete Fingerprint Submissions</Modal.Title>\n      </Modal.Header>\n      <Modal.Body>\n        <p>\n          Are you sure you want to delete {selectedCount} fingerprint\n          submission(s)? This action cannot be undone.\n        </p>\n        <p className=\"text-danger\">\n          <strong>Warning:</strong> This will delete all submissions for the\n          selected fingerprints on this scene.\n        </p>\n      </Modal.Body>\n      <Modal.Footer>\n        <Button variant=\"secondary\" onClick={onHide}>\n          Cancel\n        </Button>\n        <Button variant=\"danger\" onClick={onDelete} disabled={deleting}>\n          {deleting ? (\n            <>\n              <Icon icon={faSpinner} className=\"fa-spin me-1\" />\n              Deleting...\n            </>\n          ) : (\n            <>\n              <Icon icon={faTrash} className=\"me-1\" />\n              Delete\n            </>\n          )}\n        </Button>\n      </Modal.Footer>\n    </Modal>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/scenes/components/fingerprints/FingerprintTable.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { Button, Table } from \"react-bootstrap\";\nimport { faArrowRight, faTrash } from \"@fortawesome/free-solid-svg-icons\";\nimport { useCurrentUser } from \"src/hooks\";\nimport { Icon } from \"src/components/fragments\";\nimport type { FingerprintTableProps } from \"./types\";\nimport { useFingerprintSelection } from \"./useFingerprintSelection\";\nimport { useFingerprintSort } from \"./useFingerprintSort\";\nimport { useFingerprintOperations } from \"./useFingerprintOperations\";\nimport { FingerprintTableHeader } from \"./FingerprintTableHeader\";\nimport { FingerprintTableRow } from \"./FingerprintTableRow\";\nimport { MoveFingerprintsModal } from \"./MoveFingerprintsModal\";\nimport { DeleteFingerprintsModal } from \"./DeleteFingerprintsModal\";\n\nexport const FingerprintTable: FC<FingerprintTableProps> = ({ scene }) => {\n  const { isModerator } = useCurrentUser();\n  const [showMoveModal, setShowMoveModal] = useState(false);\n  const [showDeleteModal, setShowDeleteModal] = useState(false);\n\n  const { selectedFingerprints, toggleFingerprintSelection, clearSelection } =\n    useFingerprintSelection();\n\n  const { sortColumn, sortDirection, handleSort, sortedFingerprints } =\n    useFingerprintSort(scene.fingerprints);\n\n  const {\n    handleFingerprintUnmatch,\n    handleMoveFingerprints,\n    handleDeleteFingerprints,\n    unmatching,\n    moving,\n    deleting,\n  } = useFingerprintOperations(scene.id);\n\n  const handleMove = async (targetSceneId: string) => {\n    const fingerprints = scene.fingerprints\n      .filter((fp) => selectedFingerprints.has(fp.hash))\n      .map((fp) => ({\n        hash: fp.hash,\n        algorithm: fp.algorithm,\n      }));\n\n    const success = await handleMoveFingerprints(fingerprints, targetSceneId);\n    if (success) {\n      clearSelection();\n      setShowMoveModal(false);\n    }\n    return success;\n  };\n\n  const handleDelete = async () => {\n    const fingerprints = scene.fingerprints\n      .filter((fp) => selectedFingerprints.has(fp.hash))\n      .map((fp) => ({\n        hash: fp.hash,\n        algorithm: fp.algorithm,\n      }));\n\n    const success = await handleDeleteFingerprints(fingerprints);\n    if (success) {\n      clearSelection();\n      setShowDeleteModal(false);\n    }\n    return success;\n  };\n\n  return (\n    <div className=\"scene-fingerprints my-4\">\n      <div className=\"d-flex justify-content-between align-items-center mb-3\">\n        <h4 className=\"mb-0\">Fingerprints:</h4>\n        {isModerator && scene.fingerprints.length > 0 && (\n          <div>\n            <Button\n              variant=\"primary\"\n              size=\"sm\"\n              className=\"me-2\"\n              disabled={selectedFingerprints.size === 0 || moving}\n              onClick={() => setShowMoveModal(true)}\n            >\n              <Icon icon={faArrowRight} className=\"me-1\" />\n              Move Selected ({selectedFingerprints.size})\n            </Button>\n            <Button\n              variant=\"danger\"\n              size=\"sm\"\n              disabled={selectedFingerprints.size === 0 || deleting}\n              onClick={() => setShowDeleteModal(true)}\n            >\n              <Icon icon={faTrash} className=\"me-1\" />\n              Delete Selected ({selectedFingerprints.size})\n            </Button>\n          </div>\n        )}\n      </div>\n      {scene.fingerprints.length === 0 ? (\n        <h6>No fingerprints found for this scene.</h6>\n      ) : (\n        <Table striped variant=\"dark\">\n          <FingerprintTableHeader\n            isModerator={isModerator}\n            sortColumn={sortColumn}\n            sortDirection={sortDirection}\n            onSort={handleSort}\n          />\n          <tbody>\n            {sortedFingerprints.map((fingerprint) => (\n              <FingerprintTableRow\n                key={fingerprint.hash}\n                fingerprint={fingerprint}\n                isModerator={isModerator}\n                isSelected={selectedFingerprints.has(fingerprint.hash)}\n                unmatching={unmatching}\n                onSelect={toggleFingerprintSelection}\n                onUnmatch={handleFingerprintUnmatch}\n              />\n            ))}\n          </tbody>\n        </Table>\n      )}\n\n      <MoveFingerprintsModal\n        show={showMoveModal}\n        selectedCount={selectedFingerprints.size}\n        moving={moving}\n        onHide={() => setShowMoveModal(false)}\n        onMove={handleMove}\n      />\n\n      <DeleteFingerprintsModal\n        show={showDeleteModal}\n        selectedCount={selectedFingerprints.size}\n        deleting={deleting}\n        onHide={() => setShowDeleteModal(false)}\n        onDelete={handleDelete}\n      />\n    </div>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/scenes/components/fingerprints/FingerprintTableHeader.tsx",
    "content": "import type { FC } from \"react\";\nimport {\n  faSort,\n  faSortUp,\n  faSortDown,\n} from \"@fortawesome/free-solid-svg-icons\";\nimport { Icon } from \"src/components/fragments\";\nimport type { SortColumn, SortDirection } from \"./types\";\n\ninterface Props {\n  isModerator: boolean;\n  sortColumn: SortColumn;\n  sortDirection: SortDirection;\n  onSort: (column: SortColumn) => void;\n}\n\nexport const FingerprintTableHeader: FC<Props> = ({\n  isModerator,\n  sortColumn,\n  sortDirection,\n  onSort,\n}) => {\n  const renderSortIcon = (column: SortColumn) => {\n    if (sortColumn !== column) {\n      return <Icon icon={faSort} className=\"ms-1 text-muted\" />;\n    }\n    return (\n      <Icon\n        icon={sortDirection === \"asc\" ? faSortUp : faSortDown}\n        className=\"ms-1\"\n      />\n    );\n  };\n\n  const handleSortKeyDown = (e: React.KeyboardEvent, column: SortColumn) => {\n    if (e.key === \"Enter\" || e.key === \" \") {\n      e.preventDefault();\n      onSort(column);\n    }\n  };\n\n  return (\n    <thead>\n      <tr>\n        {isModerator && (\n          <td>\n            <b>Select</b>\n          </td>\n        )}\n        <td\n          className=\"fingerprint-sort-header\"\n          onClick={() => onSort(\"algorithm\")}\n          onKeyDown={(e) => handleSortKeyDown(e, \"algorithm\")}\n        >\n          Algorithm\n          {renderSortIcon(\"algorithm\")}\n        </td>\n        <td\n          className=\"fingerprint-sort-header\"\n          onClick={() => onSort(\"hash\")}\n          onKeyDown={(e) => handleSortKeyDown(e, \"hash\")}\n        >\n          Hash\n          {renderSortIcon(\"hash\")}\n        </td>\n        <td\n          className=\"fingerprint-sort-header\"\n          onClick={() => onSort(\"duration\")}\n          onKeyDown={(e) => handleSortKeyDown(e, \"duration\")}\n        >\n          Duration\n          {renderSortIcon(\"duration\")}\n        </td>\n        <td\n          className=\"fingerprint-sort-header\"\n          onClick={() => onSort(\"submissions\")}\n          onKeyDown={(e) => handleSortKeyDown(e, \"submissions\")}\n        >\n          Submissions\n          {renderSortIcon(\"submissions\")}\n        </td>\n        <td\n          className=\"fingerprint-sort-header\"\n          onClick={() => onSort(\"reports\")}\n          onKeyDown={(e) => handleSortKeyDown(e, \"reports\")}\n        >\n          Reports\n          {renderSortIcon(\"reports\")}\n        </td>\n        <td\n          className=\"fingerprint-sort-header\"\n          onClick={() => onSort(\"created\")}\n          onKeyDown={(e) => handleSortKeyDown(e, \"created\")}\n        >\n          First Added\n          {renderSortIcon(\"created\")}\n        </td>\n        <td\n          className=\"fingerprint-sort-header\"\n          onClick={() => onSort(\"updated\")}\n          onKeyDown={(e) => handleSortKeyDown(e, \"updated\")}\n        >\n          Last Added\n          {renderSortIcon(\"updated\")}\n        </td>\n      </tr>\n    </thead>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/scenes/components/fingerprints/FingerprintTableRow.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Button, Form } from \"react-bootstrap\";\nimport {\n  faCheckCircle,\n  faTimesCircle,\n  faSpinner,\n  faTriangleExclamation,\n} from \"@fortawesome/free-solid-svg-icons\";\nimport type { Fingerprint } from \"src/graphql\";\nimport { createHref, formatDate, formatDuration } from \"src/utils\";\nimport { ROUTE_SCENES } from \"src/constants/route\";\nimport { Icon } from \"src/components/fragments\";\nimport type { MatchType } from \"./types\";\n\ninterface Props {\n  fingerprint: Fingerprint;\n  isModerator: boolean;\n  isSelected: boolean;\n  unmatching: boolean;\n  onSelect: (hash: string) => void;\n  onUnmatch: (fingerprint: Fingerprint, type: MatchType) => void;\n}\n\nexport const FingerprintTableRow: FC<Props> = ({\n  fingerprint,\n  isModerator,\n  isSelected,\n  unmatching,\n  onSelect,\n  onUnmatch,\n}) => {\n  const renderUnmatch = (type: MatchType) => (\n    <Button\n      className=\"user-submitted\"\n      title={`Remove ${type}`}\n      onKeyDown={() => onUnmatch(fingerprint, type)}\n      onClick={() => onUnmatch(fingerprint, type)}\n      variant=\"link\"\n      disabled={unmatching}\n    >\n      {!unmatching ? (\n        <>\n          <Icon icon={faCheckCircle} />\n          <Icon icon={faTimesCircle} />\n        </>\n      ) : (\n        <Icon icon={faSpinner} className=\"fa-spin\" />\n      )}\n    </Button>\n  );\n\n  return (\n    <tr>\n      {isModerator && (\n        <td>\n          <Form.Check\n            type=\"checkbox\"\n            checked={isSelected}\n            onChange={() => onSelect(fingerprint.hash)}\n          />\n        </td>\n      )}\n      <td>{fingerprint.algorithm}</td>\n      <td className=\"font-monospace\">\n        <Link\n          to={`${createHref(ROUTE_SCENES)}?fingerprint=${fingerprint.hash}`}\n        >\n          {fingerprint.hash}\n        </Link>\n      </td>\n      <td>\n        <span title={`${fingerprint.duration}s`}>\n          {formatDuration(fingerprint.duration)}\n        </span>\n      </td>\n      <td>\n        {fingerprint.submissions}\n        {fingerprint.user_submitted && renderUnmatch(\"submission\")}\n      </td>\n      <td>\n        {fingerprint.reports > 0 && (\n          <>\n            {fingerprint.reports}{\" \"}\n            <Icon icon={faTriangleExclamation} variant=\"danger\" />\n            {fingerprint.user_reported && renderUnmatch(\"report\")}\n          </>\n        )}\n      </td>\n      <td>{formatDate(fingerprint.created)}</td>\n      <td>{formatDate(fingerprint.updated)}</td>\n    </tr>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/scenes/components/fingerprints/MoveFingerprintsModal.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { Button, Modal, Form } from \"react-bootstrap\";\nimport { faArrowRight, faSpinner } from \"@fortawesome/free-solid-svg-icons\";\nimport { useLazyQuery } from \"@apollo/client/react\";\nimport { SceneDocument, type SceneQuery } from \"src/graphql\";\nimport { useToast } from \"src/hooks\";\nimport { Icon } from \"src/components/fragments\";\n\ninterface Props {\n  show: boolean;\n  selectedCount: number;\n  moving: boolean;\n  onHide: () => void;\n  onMove: (targetSceneId: string) => Promise<boolean | undefined>;\n}\n\nexport const MoveFingerprintsModal: FC<Props> = ({\n  show,\n  selectedCount,\n  moving,\n  onHide,\n  onMove,\n}) => {\n  const addToast = useToast();\n  const [targetSceneId, setTargetSceneId] = useState(\"\");\n  const [targetScene, setTargetScene] = useState<\n    SceneQuery[\"findScene\"] | null\n  >(null);\n\n  const [fetchScene, { loading: loadingScene }] = useLazyQuery(SceneDocument);\n\n  const handleTargetSceneIdChange = async (id: string) => {\n    setTargetSceneId(id);\n    setTargetScene(null);\n\n    if (id.trim()) {\n      try {\n        const result = await fetchScene({ variables: { id } });\n        setTargetScene(result.data?.findScene ?? null);\n      } catch {\n        setTargetScene(null);\n        addToast({\n          variant: \"danger\",\n          content: \"Scene not found\",\n        });\n      }\n    }\n  };\n\n  const handleMove = async () => {\n    if (!targetSceneId || selectedCount === 0) {\n      addToast({\n        variant: \"danger\",\n        content: \"Please select fingerprints and enter a target scene ID\",\n      });\n      return;\n    }\n\n    const success = await onMove(targetSceneId);\n    if (success) {\n      setTargetSceneId(\"\");\n      setTargetScene(null);\n    }\n  };\n\n  const handleClose = () => {\n    setTargetSceneId(\"\");\n    setTargetScene(null);\n    onHide();\n  };\n\n  return (\n    <Modal show={show} onHide={handleClose}>\n      <Modal.Header closeButton>\n        <Modal.Title>Move Fingerprint Submissions</Modal.Title>\n      </Modal.Header>\n      <Modal.Body>\n        <p>Move {selectedCount} fingerprint submission(s) to another scene.</p>\n        <Form.Group className=\"mb-3\">\n          <Form.Label>Target Scene ID</Form.Label>\n          <Form.Control\n            type=\"text\"\n            placeholder=\"Enter scene ID\"\n            value={targetSceneId}\n            onChange={(e) => handleTargetSceneIdChange(e.target.value)}\n          />\n        </Form.Group>\n        {loadingScene && (\n          <div className=\"text-center my-3\">\n            <Icon icon={faSpinner} className=\"fa-spin\" /> Loading scene...\n          </div>\n        )}\n        {targetScene && (\n          <div className=\"d-flex align-items-center p-3 border rounded\">\n            {targetScene.images.length > 0 && (\n              <img\n                src={targetScene.images[0].url}\n                alt={targetScene.title || \"Scene\"}\n                style={{ width: \"120px\", height: \"80px\", objectFit: \"cover\" }}\n                className=\"me-3\"\n              />\n            )}\n            <div>\n              <h6 className=\"mb-1\">{targetScene.title || \"Untitled\"}</h6>\n              <small className=\"text-muted\">\n                {targetScene.studio?.name && `${targetScene.studio.name} • `}\n                {targetScene.release_date}\n              </small>\n            </div>\n          </div>\n        )}\n      </Modal.Body>\n      <Modal.Footer>\n        <Button variant=\"secondary\" onClick={handleClose}>\n          Cancel\n        </Button>\n        <Button\n          variant=\"primary\"\n          onClick={handleMove}\n          disabled={moving || !targetScene}\n        >\n          {moving ? (\n            <>\n              <Icon icon={faSpinner} className=\"fa-spin me-1\" />\n              Moving...\n            </>\n          ) : (\n            <>\n              <Icon icon={faArrowRight} className=\"me-1\" />\n              Move\n            </>\n          )}\n        </Button>\n      </Modal.Footer>\n    </Modal>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/scenes/components/fingerprints/types.ts",
    "content": "import type { Fingerprint } from \"src/graphql\";\n\nexport interface FingerprintTableProps {\n  scene: {\n    id: string;\n    fingerprints: Fingerprint[];\n  };\n}\n\nexport type MatchType = \"submission\" | \"report\";\n\nexport type SortColumn =\n  | \"algorithm\"\n  | \"hash\"\n  | \"duration\"\n  | \"submissions\"\n  | \"reports\"\n  | \"created\"\n  | \"updated\";\n\nexport type SortDirection = \"asc\" | \"desc\";\n"
  },
  {
    "path": "frontend/src/pages/scenes/components/fingerprints/useFingerprintOperations.ts",
    "content": "import {\n  type Fingerprint,\n  type FingerprintQueryInput,\n  useUnmatchFingerprint,\n  useMoveFingerprintSubmissions,\n  useDeleteFingerprintSubmissions,\n} from \"src/graphql\";\nimport { useToast } from \"src/hooks\";\nimport type { MatchType } from \"./types\";\n\nexport const useFingerprintOperations = (sceneId: string) => {\n  const addToast = useToast();\n\n  const [unmatchFingerprint, { loading: unmatching }] = useUnmatchFingerprint();\n  const [moveFingerprintSubmissions, { loading: moving }] =\n    useMoveFingerprintSubmissions();\n  const [deleteFingerprintSubmissions, { loading: deleting }] =\n    useDeleteFingerprintSubmissions();\n\n  const handleFingerprintUnmatch = async (\n    fingerprint: Fingerprint,\n    type: MatchType,\n  ) => {\n    if (unmatching) return;\n\n    const { data } = await unmatchFingerprint({\n      variables: {\n        scene_id: sceneId,\n        algorithm: fingerprint.algorithm,\n        hash: fingerprint.hash,\n        duration: fingerprint.duration,\n      },\n    });\n    const success = data?.unmatchFingerprint;\n    addToast({\n      variant: success ? \"success\" : \"danger\",\n      content: `${\n        success ? \"Removed\" : \"Failed to remove\"\n      } fingerprint ${type}`,\n    });\n  };\n\n  const handleMoveFingerprints = async (\n    fingerprints: FingerprintQueryInput[],\n    targetSceneId: string,\n  ) => {\n    const { data } = await moveFingerprintSubmissions({\n      variables: {\n        input: {\n          fingerprints,\n          source_scene_id: sceneId,\n          target_scene_id: targetSceneId,\n        },\n      },\n    });\n\n    const success = data?.sceneMoveFingerprintSubmissions;\n    addToast({\n      variant: success ? \"success\" : \"danger\",\n      content: success\n        ? `Moved ${fingerprints.length} fingerprint(s) to scene ${targetSceneId}`\n        : \"Failed to move fingerprints\",\n    });\n\n    return success;\n  };\n\n  const handleDeleteFingerprints = async (\n    fingerprints: FingerprintQueryInput[],\n  ) => {\n    const { data } = await deleteFingerprintSubmissions({\n      variables: {\n        input: {\n          fingerprints,\n          scene_id: sceneId,\n        },\n      },\n    });\n\n    const success = data?.sceneDeleteFingerprintSubmissions;\n    addToast({\n      variant: success ? \"success\" : \"danger\",\n      content: success\n        ? `Deleted ${fingerprints.length} fingerprint submission(s)`\n        : \"Failed to delete fingerprint submissions\",\n    });\n\n    return success;\n  };\n\n  return {\n    handleFingerprintUnmatch,\n    handleMoveFingerprints,\n    handleDeleteFingerprints,\n    unmatching,\n    moving,\n    deleting,\n  };\n};\n"
  },
  {
    "path": "frontend/src/pages/scenes/components/fingerprints/useFingerprintSelection.ts",
    "content": "import { useState, useCallback } from \"react\";\n\nexport const useFingerprintSelection = () => {\n  const [selectedFingerprints, setSelectedFingerprints] = useState<Set<string>>(\n    new Set(),\n  );\n\n  const toggleFingerprintSelection = useCallback((hash: string) => {\n    setSelectedFingerprints((prev) => {\n      const next = new Set(prev);\n      if (next.has(hash)) {\n        next.delete(hash);\n      } else {\n        next.add(hash);\n      }\n      return next;\n    });\n  }, []);\n\n  const clearSelection = useCallback(() => {\n    setSelectedFingerprints(new Set());\n  }, []);\n\n  return {\n    selectedFingerprints,\n    toggleFingerprintSelection,\n    clearSelection,\n  };\n};\n"
  },
  {
    "path": "frontend/src/pages/scenes/components/fingerprints/useFingerprintSort.ts",
    "content": "import { useState, useMemo } from \"react\";\nimport type { Fingerprint } from \"src/graphql\";\nimport type { SortColumn, SortDirection } from \"./types\";\n\nexport const useFingerprintSort = (fingerprints: Fingerprint[]) => {\n  const [sortColumn, setSortColumn] = useState<SortColumn>(\"created\");\n  const [sortDirection, setSortDirection] = useState<SortDirection>(\"desc\");\n\n  const handleSort = (column: SortColumn) => {\n    if (sortColumn === column) {\n      setSortDirection(sortDirection === \"asc\" ? \"desc\" : \"asc\");\n    } else {\n      setSortColumn(column);\n      setSortDirection(\"asc\");\n    }\n  };\n\n  const sortedFingerprints = useMemo(() => {\n    const fps = [...fingerprints];\n    fps.sort((a, b) => {\n      let compareResult = 0;\n\n      switch (sortColumn) {\n        case \"algorithm\":\n          compareResult = a.algorithm.localeCompare(b.algorithm);\n          break;\n        case \"hash\":\n          compareResult = a.hash.localeCompare(b.hash);\n          break;\n        case \"duration\":\n          compareResult = a.duration - b.duration;\n          break;\n        case \"submissions\":\n          compareResult = a.submissions - b.submissions;\n          break;\n        case \"reports\":\n          compareResult = a.reports - b.reports;\n          break;\n        case \"created\":\n          compareResult =\n            new Date(a.created).getTime() - new Date(b.created).getTime();\n          break;\n        case \"updated\":\n          compareResult =\n            new Date(a.updated).getTime() - new Date(b.updated).getTime();\n          break;\n      }\n\n      return sortDirection === \"asc\" ? compareResult : -compareResult;\n    });\n    return fps;\n  }, [fingerprints, sortColumn, sortDirection]);\n\n  return {\n    sortColumn,\n    sortDirection,\n    handleSort,\n    sortedFingerprints,\n  };\n};\n"
  },
  {
    "path": "frontend/src/pages/scenes/index.tsx",
    "content": "import type { FC } from \"react\";\nimport { Route, Routes, useParams } from \"react-router-dom\";\n\nimport { ErrorMessage, LoadingIndicator } from \"src/components/fragments\";\n\nimport { useScene } from \"src/graphql\";\nimport Title from \"src/components/title\";\n\nimport Scenes from \"./Scenes\";\nimport Scene from \"./Scene\";\nimport SceneEdit from \"./SceneEdit\";\nimport SceneAdd from \"./SceneAdd\";\nimport SceneDelete from \"./SceneDelete\";\n\nconst SceneLoader: FC = () => {\n  const { id } = useParams();\n  const { loading, data } = useScene({ id: id ?? \"id\" }, !id);\n\n  if (loading) return <LoadingIndicator message=\"Loading scene...\" />;\n\n  if (!id) return <ErrorMessage error=\"Scene ID is missing\" />;\n\n  const scene = data?.findScene;\n  if (!scene) return <ErrorMessage error=\"Scene not found.\" />;\n\n  return (\n    <Routes>\n      <Route\n        path=\"/delete\"\n        element={\n          <>\n            <Title page={`Delete Scene \"${scene.title}\"`} />\n            <SceneDelete scene={scene} />\n          </>\n        }\n      />\n      <Route\n        path=\"/edit\"\n        element={\n          <>\n            <Title page={`Edit Scene \"${scene.title}\"`} />\n            <SceneEdit scene={scene} />\n          </>\n        }\n      />\n      <Route\n        path=\"/\"\n        element={\n          <>\n            <Title page={`\"${scene.title}\"`} />\n            <Scene scene={scene} />\n          </>\n        }\n      />\n    </Routes>\n  );\n};\n\nconst SceneRoutes: FC = () => (\n  <Routes>\n    <Route\n      path=\"/add\"\n      element={\n        <>\n          <Title page=\"Add Scene\" />\n          <SceneAdd />\n        </>\n      }\n    />\n    <Route\n      path=\"/\"\n      element={\n        <>\n          <Title page=\"Scenes\" />\n          <Scenes />\n        </>\n      }\n    />\n    <Route path=\"/:id/*\" element={<SceneLoader />} />\n  </Routes>\n);\n\nexport default SceneRoutes;\n"
  },
  {
    "path": "frontend/src/pages/scenes/sceneForm/ExistingSceneAlert.tsx",
    "content": "import type { FC } from \"react\";\nimport { Alert } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport { faExclamationTriangle } from \"@fortawesome/free-solid-svg-icons\";\nimport { type FingerprintAlgorithm, useQueryExistingScene } from \"src/graphql\";\nimport { Icon } from \"src/components/fragments\";\nimport { sceneHref, editHref } from \"src/utils\";\n\ninterface Props {\n  title: string | null;\n  studio_id: string | null;\n  fingerprints:\n    | {\n        hash: string;\n        algorithm: FingerprintAlgorithm;\n        duration: number;\n      }[]\n    | undefined;\n}\n\nconst ExistingSceneAlert: FC<Props> = ({\n  title,\n  studio_id,\n  fingerprints = [],\n}) => {\n  const { data: existingData } = useQueryExistingScene({\n    input: { title, studio_id, fingerprints },\n  });\n  const existingScenes = existingData?.queryExistingScene.scenes ?? [];\n  const existingEdits = existingData?.queryExistingScene.edits ?? [];\n\n  if (existingScenes.length === 0 && existingEdits.length === 0) return null;\n\n  return (\n    <Alert variant=\"warning\">\n      <div className=\"mb-2\">\n        <b>Warning: Scene match found</b>\n      </div>\n\n      {existingScenes.length > 0 && (\n        <div className=\"mb-2\">\n          <span>Existing scenes that have the same title or fingerprints:</span>\n          {existingScenes.map((s) => (\n            <div key={s.id}>\n              <Icon icon={faExclamationTriangle} color=\"red\" />\n              <Link to={sceneHref(s)} className=\"ms-2\">\n                <b>{s.title}</b>\n              </Link>\n            </div>\n          ))}\n        </div>\n      )}\n\n      {existingEdits.length > 0 && (\n        <div className=\"mb-2\">\n          <span>\n            Pending edits that submit scenes with the same title or\n            fingerprints:\n          </span>\n          {existingEdits.map((e) => (\n            <div key={e.id}>\n              <Icon icon={faExclamationTriangle} color=\"red\" />\n              <Link to={editHref(e)} className=\"ms-2\">\n                <b>{(e.details as { title: string }).title}</b>\n              </Link>\n            </div>\n          ))}\n        </div>\n      )}\n\n      <div>\n        Please verify your draft is not already in the database before\n        submitting.\n      </div>\n    </Alert>\n  );\n};\n\nexport default ExistingSceneAlert;\n"
  },
  {
    "path": "frontend/src/pages/scenes/sceneForm/SceneForm.tsx",
    "content": "import { type FC, useState, useMemo } from \"react\";\nimport { useForm, useFieldArray, Controller } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { useLens } from \"@hookform/lenses\";\nimport cx from \"classnames\";\nimport { Button, Col, Form, InputGroup, Row, Tab, Tabs } from \"react-bootstrap\";\nimport { Typeahead, Menu, MenuItem } from \"react-bootstrap-typeahead\";\nimport { Link } from \"react-router-dom\";\nimport {\n  faExclamationTriangle,\n  faExternalLinkAlt,\n} from \"@fortawesome/free-solid-svg-icons\";\n\nimport { formatDuration, parseDuration, performerHref } from \"src/utils\";\nimport {\n  ValidSiteTypeEnum,\n  type SceneEditDetailsInput,\n  type GenderEnum,\n  type FingerprintAlgorithm,\n  type SceneFragment as Scene,\n  type ImageFragment,\n} from \"src/graphql\";\n\nimport { renderSceneDetails } from \"src/components/editCard/ModifyEdit\";\nimport { GenderIcon, Icon } from \"src/components/fragments\";\nimport SearchField, {\n  SearchType,\n  type PerformerResult,\n} from \"src/components/searchField\";\nimport TagSelect from \"src/components/tagSelect\";\nimport StudioSelect from \"src/components/studioSelect\";\nimport EditImages from \"src/components/editImages\";\nimport { EditNote, NavButtons, SubmitButtons } from \"src/components/form\";\nimport URLInput from \"src/components/urlInput\";\nimport DiffScene from \"./diff\";\nimport { SceneSchema, type SceneFormData } from \"./schema\";\nimport type { InitialScene } from \"./types\";\nimport { useBeforeUnload } from \"src/hooks/useBeforeUnload\";\nimport ExistingSceneAlert from \"./ExistingSceneAlert\";\n\nconst CLASS_NAME = \"SceneForm\";\nconst CLASS_NAME_PERFORMER_CHANGE = `${CLASS_NAME}-performer-change`;\n\ninterface SceneProps {\n  scene?: Scene | null;\n  initial?: InitialScene;\n  callback: (updateData: SceneEditDetailsInput, editNote: string) => void;\n  saving: boolean;\n  isCreate?: boolean;\n  draftFingerprints?: {\n    hash: string;\n    algorithm: FingerprintAlgorithm;\n    duration: number;\n  }[];\n}\n\nconst SceneForm: FC<SceneProps> = ({\n  scene,\n  initial,\n  callback,\n  saving,\n  isCreate = false,\n  draftFingerprints,\n}) => {\n  useBeforeUnload();\n  const {\n    register,\n    control,\n    handleSubmit,\n    watch,\n    formState: { errors },\n  } = useForm({\n    resolver: yupResolver(SceneSchema),\n    mode: \"onBlur\",\n    defaultValues: {\n      title: initial?.title ?? scene?.title ?? undefined,\n      details: initial?.details ?? scene?.details ?? undefined,\n      date: initial?.date ?? scene?.release_date ?? undefined,\n      production_date:\n        initial?.production_date ?? scene?.production_date ?? undefined,\n      duration: formatDuration(initial?.duration ?? scene?.duration),\n      director: initial?.director ?? scene?.director,\n      code: initial?.code ?? scene?.code,\n      urls: initial?.urls ?? scene?.urls ?? [],\n      images: initial?.images ?? scene?.images ?? [],\n      studio: initial?.studio ?? scene?.studio ?? undefined,\n      tags: initial?.tags ?? scene?.tags ?? [],\n      performers: (initial?.performers ?? scene?.performers ?? []).map((p) => ({\n        performerId: p.performer.id,\n        name: p.performer.name,\n        alias: p.as ?? \"\",\n        aliases: p.performer.aliases,\n        gender: p.performer.gender,\n        disambiguation: p.performer.disambiguation,\n        deleted: p.performer.deleted,\n      })),\n    },\n  });\n  const {\n    fields: performerFields,\n    append: appendPerformer,\n    remove: removePerformer,\n    update: updatePerformer,\n  } = useFieldArray({\n    control,\n    name: \"performers\",\n    keyName: \"key\",\n  });\n\n  const lens = useLens({ control });\n\n  const fieldData = watch();\n  const [oldSceneChanges, newSceneChanges] = useMemo(\n    () =>\n      DiffScene(\n        SceneSchema.cast(fieldData, {\n          assert: \"ignore-optionality\",\n        }) as SceneFormData,\n        scene,\n      ),\n    [fieldData, scene],\n  );\n\n  const [isChanging, setChange] = useState<number | undefined>();\n  const [activeTab, setActiveTab] = useState(\"details\");\n  const [file, setFile] = useState<File | undefined>();\n\n  const onSubmit = (data: SceneFormData) => {\n    const sceneData: SceneEditDetailsInput = {\n      title: data.title,\n      date: data.date,\n      production_date: data.production_date,\n      duration: parseDuration(data.duration),\n      director: data.director,\n      code: data.code,\n      details: data.details,\n      studio_id: data.studio?.id,\n      performers: (data.performers ?? []).map((performance) => ({\n        performer_id: performance.performerId,\n        as: performance.alias,\n      })),\n      image_ids: data.images.map((i) => i.id),\n      tag_ids: data.tags?.map((t) => t.id),\n      urls: data.urls?.map((u) => ({\n        url: u.url,\n        site_id: u.site.id,\n      })),\n    };\n\n    callback(sceneData, data.note);\n  };\n\n  const addPerformer = (result: PerformerResult) => {\n    appendPerformer({\n      name: result.name,\n      performerId: result.id,\n      gender: result.gender,\n      alias: \"\",\n      aliases: result.aliases,\n      disambiguation: result.disambiguation ?? undefined,\n      deleted: result.deleted,\n    });\n  };\n\n  const handleRemove = (index: number) => {\n    if (isChanging && isChanging > index) setChange(isChanging - 1);\n    else if (isChanging === index) setChange(undefined);\n    removePerformer(index);\n  };\n\n  const handleChange = (result: PerformerResult, index: number) => {\n    setChange(undefined);\n    const alias = performerFields[index].alias || performerFields[index].name;\n    updatePerformer(index, {\n      name: result.name,\n      performerId: result.id,\n      gender: result.gender,\n      alias: alias === result.name ? \"\" : alias,\n      aliases: result.aliases,\n      disambiguation: result.disambiguation ?? undefined,\n      deleted: result.deleted,\n    });\n  };\n\n  const currentPerformerIds = performerFields.map((p) => p.performerId);\n\n  const performerList = performerFields.map((p, index) => (\n    <Row className=\"performer-item d-flex g-0\" key={p.performerId}>\n      <Form.Control\n        type=\"hidden\"\n        defaultValue={p.performerId}\n        {...register(`performers.${index}.performerId`)}\n      />\n\n      <Col xs={6}>\n        <InputGroup className=\"flex-nowrap\">\n          <Button variant=\"danger\" onClick={() => handleRemove(index)}>\n            Remove\n          </Button>\n          {isChanging === index ? (\n            <Button\n              className={CLASS_NAME_PERFORMER_CHANGE}\n              variant=\"primary\"\n              onClick={() => setChange(undefined)}\n            >\n              Cancel\n            </Button>\n          ) : (\n            <Button\n              className={CLASS_NAME_PERFORMER_CHANGE}\n              variant=\"primary\"\n              onClick={() => setChange(index)}\n            >\n              Change\n            </Button>\n          )}\n          {isChanging === index ? (\n            <SearchField\n              autoFocus\n              onClick={(res) =>\n                res.__typename === \"Performer\" && handleChange(res, index)\n              }\n              excludeIDs={currentPerformerIds.filter(\n                (id) => id !== p.performerId,\n              )}\n              searchType={SearchType.Performer}\n              studioId={fieldData.studio?.parent?.id ?? fieldData.studio?.id}\n            />\n          ) : (\n            <>\n              <InputGroup.Text className=\"flex-grow-1 text-start text-truncate\">\n                <GenderIcon gender={p.gender as GenderEnum} />\n                <span\n                  className={cx(\"performer-name text-truncate\", {\n                    \"text-decoration-line-through\": p.deleted,\n                  })}\n                >\n                  <b>{p.name}</b>\n                  {p.disambiguation && (\n                    <small className=\"ms-1\">({p.disambiguation})</small>\n                  )}\n                </span>\n              </InputGroup.Text>\n              <Button\n                variant=\"primary\"\n                href={performerHref({ id: p.performerId })}\n                target=\"_blank\"\n              >\n                <Icon icon={faExternalLinkAlt} />\n              </Button>\n            </>\n          )}\n        </InputGroup>\n      </Col>\n\n      <Col xs={{ span: 5, offset: 1 }}>\n        <InputGroup>\n          <InputGroup.Text>Scene Alias</InputGroup.Text>\n\n          <Controller\n            name={`performers.${index}.alias`}\n            control={control}\n            render={({ field: { onChange } }) => (\n              <Typeahead\n                id={`performers.${index}.alias`}\n                onInputChange={onChange}\n                onChange={(selected) =>\n                  selected.length && onChange(selected[0])\n                }\n                options={p.aliases ?? []}\n                defaultInputValue={p.alias ?? \"\"}\n                emptyLabel={\"\"}\n                renderMenu={(options, { id }) => {\n                  if (!options.length) {\n                    // biome-ignore lint/complexity/noUselessFragments: Necessary for return type\n                    return <></>;\n                  }\n                  const results = options as string[];\n                  return (\n                    <Menu id={id}>\n                      <MenuItem\n                        option=\"aliases\"\n                        position={0}\n                        key={\"header\"}\n                        disabled\n                      >\n                        <b className=\"text-dark\">{`${p.name}'s Aliases`}</b>\n                      </MenuItem>\n                      {results.map((result, idx) => (\n                        <MenuItem\n                          option={result}\n                          position={idx + 1}\n                          key={result}\n                        >\n                          {result}\n                        </MenuItem>\n                      ))}\n                    </Menu>\n                  );\n                }}\n                placeholder={p.name}\n              />\n            )}\n          />\n        </InputGroup>\n      </Col>\n    </Row>\n  ));\n\n  const metadataErrors = [\n    { error: errors.title?.message, tab: \"details\" },\n    { error: errors.date?.message, tab: \"details\" },\n    { error: errors.production_date?.message, tab: \"details\" },\n    { error: errors.duration?.message, tab: \"details\" },\n    {\n      error: errors.studio !== undefined ? \"Studio is required\" : undefined,\n      tab: \"details\",\n    },\n    {\n      error: errors.urls?.find?.((u) => u?.url?.message)?.url?.message,\n      tab: \"links\",\n    },\n  ].filter((e) => e.error) as { error: string; tab: string }[];\n\n  return (\n    <Form className={CLASS_NAME} onSubmit={handleSubmit(onSubmit)}>\n      {isCreate && (\n        <Row>\n          <Col xs={9}>\n            <ExistingSceneAlert\n              title={fieldData.title}\n              studio_id={fieldData.studio?.id}\n              fingerprints={draftFingerprints}\n            />\n          </Col>\n        </Row>\n      )}\n      <Tabs activeKey={activeTab} onSelect={(key) => key && setActiveTab(key)}>\n        <Tab eventKey=\"details\" title=\"Details\" className=\"col-xl-9\">\n          <Row>\n            <Form.Group controlId=\"title\" className=\"col-8 mb-3\">\n              <Form.Label>Title</Form.Label>\n              <Form.Control\n                as=\"input\"\n                className={cx({ \"is-invalid\": errors.title })}\n                type=\"text\"\n                placeholder=\"Title\"\n                {...register(\"title\", { required: true })}\n              />\n              <Form.Control.Feedback type=\"invalid\">\n                {errors?.title?.message}\n              </Form.Control.Feedback>\n            </Form.Group>\n\n            <Form.Group controlId=\"date\" className=\"col-2 mb-3\">\n              <Form.Label>Date</Form.Label>\n              <Form.Control\n                as=\"input\"\n                className={cx({ \"is-invalid\": errors.date })}\n                type=\"text\"\n                placeholder=\"YYYY-MM-DD\"\n                {...register(\"date\")}\n              />\n              <Form.Control.Feedback type=\"invalid\">\n                {errors?.date?.message}\n              </Form.Control.Feedback>\n              {/* <Form.Text>\n                If the precise date is unknown the day and/or month can be\n                omitted.\n              </Form.Text> */}\n            </Form.Group>\n\n            <Form.Group controlId=\"duration\" className=\"col-2 mb-3\">\n              <Form.Label>Duration</Form.Label>\n              <Form.Control\n                as=\"input\"\n                className={cx({ \"is-invalid\": errors.duration })}\n                placeholder=\"Duration\"\n                {...register(\"duration\")}\n              />\n              <Form.Control.Feedback type=\"invalid\">\n                {errors?.duration?.message}\n              </Form.Control.Feedback>\n            </Form.Group>\n          </Row>\n\n          <Row>\n            <Form.Group className=\"col mb-3\">\n              <Form.Label>Performers</Form.Label>\n              {performerList}\n              <div className=\"add-performer\">\n                <span>Add performer:</span>\n                <SearchField\n                  onClick={(res) =>\n                    res.__typename === \"Performer\" && addPerformer(res)\n                  }\n                  excludeIDs={currentPerformerIds}\n                  searchType={SearchType.Performer}\n                  studioId={\n                    fieldData.studio?.parent?.id ?? fieldData.studio?.id\n                  }\n                />\n              </div>\n            </Form.Group>\n          </Row>\n\n          <Row>\n            <Form.Group\n              controlId=\"studioId\"\n              className=\"studio-select col-6 mb-3\"\n            >\n              <Form.Label>Studio</Form.Label>\n              <Controller\n                name=\"studio\"\n                control={control}\n                render={({ field: { onChange, onBlur, value } }) => (\n                  <StudioSelect\n                    initialStudio={value}\n                    onChange={onChange}\n                    onBlur={onBlur}\n                    isClearable\n                  />\n                )}\n              />\n              <Form.Control.Feedback type=\"invalid\">\n                {errors.studio !== undefined ? \"Studio is required\" : null}\n              </Form.Control.Feedback>\n            </Form.Group>\n\n            <Form.Group controlId=\"code\" className=\"col-6 mb-3\">\n              <Form.Label>Studio Code</Form.Label>\n              <Form.Control\n                as=\"input\"\n                type=\"text\"\n                placeholder=\"Unique code used by studio to identify scene\"\n                {...register(\"code\")}\n              />\n            </Form.Group>\n          </Row>\n\n          <Row>\n            <Form.Group controlId=\"details\" className=\"col mb-3\">\n              <Form.Label>Details</Form.Label>\n              <Form.Control\n                as=\"textarea\"\n                className=\"description\"\n                placeholder=\"Details\"\n                {...register(\"details\")}\n              />\n            </Form.Group>\n          </Row>\n\n          <Row>\n            <Form.Group controlId=\"director\" className=\"col-4 mb-3\">\n              <Form.Label>Director</Form.Label>\n              <Form.Control\n                as=\"input\"\n                type=\"text\"\n                placeholder=\"Director\"\n                {...register(\"director\")}\n              />\n            </Form.Group>\n\n            <Form.Group controlId=\"production_date\" className=\"col-2 mb-3\">\n              <Form.Label>Production Date</Form.Label>\n              <Form.Control\n                as=\"input\"\n                className={cx({ \"is-invalid\": errors.production_date })}\n                type=\"text\"\n                placeholder=\"YYYY-MM-DD\"\n                {...register(\"production_date\")}\n              />\n              <Form.Control.Feedback type=\"invalid\">\n                {errors?.production_date?.message}\n              </Form.Control.Feedback>\n            </Form.Group>\n\n            <Form.Group className=\"col-6 mb-3\" />\n          </Row>\n\n          <Form.Group className=\"mb-3\">\n            <Form.Label>Tags</Form.Label>\n            <Controller\n              name=\"tags\"\n              control={control}\n              render={({ field: { onChange, value } }) => (\n                <TagSelect\n                  tags={value}\n                  onChange={onChange}\n                  menuPlacement=\"top\"\n                />\n              )}\n            />\n          </Form.Group>\n\n          <NavButtons onNext={() => setActiveTab(\"links\")} />\n        </Tab>\n\n        <Tab eventKey=\"links\" title=\"Links\" className=\"col-xl-9\">\n          <URLInput\n            lens={lens.focus(\"urls\").defined()}\n            type={ValidSiteTypeEnum.SCENE}\n            errors={errors.urls}\n          />\n\n          <NavButtons onNext={() => setActiveTab(\"images\")} />\n        </Tab>\n\n        <Tab eventKey=\"images\" title=\"Images\">\n          <EditImages\n            lens={lens.focus(\"images\").cast<ImageFragment[]>()}\n            maxImages={1}\n            file={file}\n            setFile={(f) => setFile(f)}\n            original={scene?.images}\n          />\n\n          <NavButtons\n            onNext={() => setActiveTab(\"confirm\")}\n            disabled={!!file}\n          />\n\n          <div className=\"d-flex\">\n            {/* dummy element for feedback */}\n            <div className=\"ms-auto\">\n              <span className={file ? \"is-invalid\" : \"\"} />\n              <Form.Control.Feedback type=\"invalid\">\n                Upload or remove image to continue.\n              </Form.Control.Feedback>\n            </div>\n          </div>\n        </Tab>\n        <Tab eventKey=\"confirm\" title=\"Confirm\" className=\"mt-2 col-xl-9\">\n          {renderSceneDetails(newSceneChanges, oldSceneChanges, !!scene)}\n          <Row className=\"my-4\">\n            <Col md={{ span: 8, offset: 4 }}>\n              <EditNote register={register} error={errors.note} />\n            </Col>\n          </Row>\n\n          {metadataErrors.length > 0 && (\n            <div className=\"text-end my-4\">\n              <h6>\n                <Icon icon={faExclamationTriangle} color=\"red\" />\n                <span className=\"ms-1\">Errors</span>\n              </h6>\n              <div className=\"d-flex flex-column text-danger\">\n                {metadataErrors.map(({ error, tab }) => (\n                  <Link to=\"#\" key={error} onClick={() => setActiveTab(tab)}>\n                    {error}\n                  </Link>\n                ))}\n              </div>\n            </div>\n          )}\n\n          <SubmitButtons disabled={saving} />\n        </Tab>\n      </Tabs>\n    </Form>\n  );\n};\n\nexport default SceneForm;\n"
  },
  {
    "path": "frontend/src/pages/scenes/sceneForm/diff.ts",
    "content": "import type {\n  OldSceneDetails,\n  SceneDetails,\n} from \"src/components/editCard/ModifyEdit\";\n\nimport type { SceneFragment } from \"src/graphql\";\nimport {\n  genderEnum,\n  parseDuration,\n  diffArray,\n  diffValue,\n  diffImages,\n  diffURLs,\n} from \"src/utils\";\n\nimport type { SceneFormData } from \"./schema\";\n\ntype OmittedKeys = \"draft_id\" | \"added_fingerprints\" | \"removed_fingerprints\";\n\ntype Performer = {\n  performer: Pick<\n    SceneFragment[\"performers\"][number][\"performer\"],\n    \"id\" | \"name\" | \"gender\" | \"disambiguation\" | \"deleted\"\n  >;\n  as?: string | null;\n};\n\ntype Tag = {\n  id: string;\n  name: string;\n  description?: string | null;\n};\n\nconst selectSceneDetails = (\n  data: SceneFormData,\n  original: SceneFragment | null | undefined,\n): [Required<OldSceneDetails>, Required<Omit<SceneDetails, OmittedKeys>>] => {\n  const [addedPerformers, removedPerformers] = diffArray<Performer>(\n    (data.performers ?? []).flatMap((p) =>\n      p.performerId && p.name\n        ? [\n            {\n              performer: {\n                id: p.performerId,\n                name: p.name,\n                gender: genderEnum(p.gender),\n                disambiguation: p.disambiguation ?? null,\n                deleted: p.deleted ?? false,\n              },\n              as: p.alias ?? null,\n            },\n          ]\n        : [],\n    ),\n    original?.performers ?? [],\n    (s) => `${s.performer.id}${s.as}`,\n  );\n\n  const [addedTags, removedTags] = diffArray<Tag>(\n    (data.tags ?? []).flatMap((t) =>\n      t.id && t.name\n        ? [\n            {\n              id: t.id,\n              name: t.name,\n              description: t.description ?? null,\n            },\n          ]\n        : [],\n    ),\n    original?.tags ?? [],\n    (t) => t.id,\n  );\n\n  const [addedImages, removedImages] = diffImages(\n    data.images,\n    original?.images ?? [],\n  );\n  const [addedUrls, removedUrls] = diffURLs(data.urls, original?.urls ?? []);\n\n  return [\n    {\n      title: diffValue(original?.title, data.title),\n      details: diffValue(original?.details, data.details),\n      date: diffValue(original?.release_date, data.date),\n      production_date: diffValue(\n        original?.production_date,\n        data.production_date,\n      ),\n      duration: diffValue(original?.duration, parseDuration(data.duration)),\n      director: diffValue(original?.director, data.director),\n      code: diffValue(original?.code, data.code),\n      studio:\n        original?.studio?.id !== data.studio?.id &&\n        original?.studio?.id &&\n        original?.studio.name\n          ? {\n              id: original.studio.id,\n              name: original.studio.name,\n            }\n          : null,\n    },\n    {\n      title: diffValue(data.title, original?.title),\n      details: diffValue(data.details, original?.details),\n      date: diffValue(data.date, original?.release_date),\n      production_date: diffValue(\n        data.production_date,\n        original?.production_date,\n      ),\n      duration: diffValue(parseDuration(data.duration), original?.duration),\n      director: diffValue(data.director, original?.director),\n      code: diffValue(data.code, original?.code),\n      studio:\n        data.studio?.id !== original?.studio?.id &&\n        data.studio?.id &&\n        data.studio?.name\n          ? {\n              id: data.studio.id,\n              name: data.studio.name,\n            }\n          : null,\n      added_urls: addedUrls,\n      removed_urls: removedUrls,\n      added_performers: addedPerformers,\n      removed_performers: removedPerformers,\n      added_tags: addedTags,\n      removed_tags: removedTags,\n      added_images: addedImages,\n      removed_images: removedImages,\n    },\n  ];\n};\n\nexport default selectSceneDetails;\n"
  },
  {
    "path": "frontend/src/pages/scenes/sceneForm/index.ts",
    "content": "import SceneForm from \"./SceneForm\";\n\nexport default SceneForm;\nexport * from \"./types\";\n"
  },
  {
    "path": "frontend/src/pages/scenes/sceneForm/schema.ts",
    "content": "import * as yup from \"yup\";\nimport { GenderEnum } from \"src/graphql\";\nimport { isValidDate, isDateInRange, maxReleaseDate } from \"src/utils\";\n\nconst nullCheck = (input: string | null) =>\n  input === \"\" || input === \"null\" ? null : input;\n\nexport const SceneSchema = yup.object({\n  title: yup.string().trim().required(\"Title is required\"),\n  details: yup.string().trim(),\n  date: yup\n    .string()\n    .trim()\n    .defined()\n    .transform(nullCheck)\n    .matches(/^\\d{4}$|^\\d{4}-\\d{2}$|^\\d{4}-\\d{2}-\\d{2}$/, {\n      excludeEmptyString: true,\n      message: \"Invalid date, must be YYYY, YYYY-MM, or YYYY-MM-DD\",\n    })\n    .test(\"valid-date\", \"Invalid date\", isValidDate)\n    .test(\"date-outside-range\", \"Outside of range\", (date) =>\n      isDateInRange(date, maxReleaseDate()),\n    )\n    .nullable()\n    .required(\"Release date is required\"),\n  production_date: yup\n    .string()\n    .trim()\n    .defined()\n    .transform(nullCheck)\n    .matches(/^\\d{4}$|^\\d{4}-\\d{2}$|^\\d{4}-\\d{2}-\\d{2}$/, {\n      excludeEmptyString: true,\n      message: \"Invalid date, must be YYYY, YYYY-MM, or YYYY-MM-DD\",\n    })\n    .test(\"valid-date\", \"Invalid date\", isValidDate)\n    .test(\"date-outside-range\", \"Outside of range\", (date) =>\n      isDateInRange(date, maxReleaseDate()),\n    )\n    .nullable(),\n  duration: yup\n    .string()\n    .trim()\n    .matches(/^((\\d+:)?([0-5]?\\d):)?([0-5]?\\d)$/, {\n      excludeEmptyString: true,\n      message: \"Invalid duration, format should be HH:MM:SS\",\n    })\n    .nullable(),\n  director: yup.string().trim().transform(nullCheck).nullable(),\n  code: yup.string().trim().transform(nullCheck).nullable(),\n  studio: yup\n    .object({\n      id: yup.string().required(),\n      name: yup.string().required(),\n      parent: yup\n        .object({\n          id: yup.string().required(),\n          name: yup.string().required(),\n        })\n        .nullable()\n        .optional(),\n    })\n    .nullable()\n    .required(\"Studio is required\"),\n  performers: yup\n    .array()\n    .of(\n      yup\n        .object({\n          performerId: yup.string().required(),\n          name: yup.string().required(),\n          disambiguation: yup.string().nullable(),\n          alias: yup.string().trim().transform(nullCheck).nullable(),\n          aliases: yup.array().of(yup.string().required()).nullable(),\n          gender: yup\n            .string()\n            .nullable()\n            .oneOf([null, ...Object.keys(GenderEnum)]),\n          deleted: yup.bool().required(),\n        })\n        .transform((s: { name?: string; alias?: string }) => ({\n          ...s,\n          alias: s.name === s?.alias?.trim() ? undefined : s?.alias?.trim(),\n        }))\n        .required(),\n    )\n    .ensure(),\n  tags: yup\n    .array()\n    .of(\n      yup.object({\n        id: yup.string().required(),\n        name: yup.string().required(),\n        description: yup.string().nullable().optional(),\n        aliases: yup.array().of(yup.string().required()).defined(),\n      }),\n    )\n    .ensure(),\n  images: yup\n    .array()\n    .of(\n      yup.object({\n        id: yup.string().required(),\n        url: yup.string().required(),\n        width: yup.number().required(),\n        height: yup.number().required(),\n      }),\n    )\n    .required(),\n  urls: yup\n    .array()\n    .of(\n      yup.object({\n        url: yup.string().url(\"Invalid URL\").required(),\n        site: yup\n          .object({\n            id: yup.string().required(),\n            name: yup.string().required(),\n            icon: yup.string().required(),\n          })\n          .required(),\n      }),\n    )\n    .ensure(),\n  note: yup.string().required(\"Edit note is required\"),\n});\n\nexport type SceneFormData = yup.Asserts<typeof SceneSchema>;\n"
  },
  {
    "path": "frontend/src/pages/scenes/sceneForm/styles.scss",
    "content": ".SceneForm {\n  label,\n  .label {\n    font-weight: 700;\n    margin-bottom: 0;\n  }\n\n  .performer-item {\n    align-items: center;\n    display: flex;\n    margin: 0.5rem 0;\n\n    label {\n      margin-left: auto;\n      padding: 0 0.5rem;\n    }\n  }\n\n  .performer-name {\n    flex-grow: 1;\n    width: 0;\n  }\n\n  .remove-item {\n    background: transparent;\n    border: none;\n    color: white;\n    opacity: 1;\n\n    &:hover {\n      opacity: 0.8;\n    }\n  }\n\n  &-performer-change {\n    width: 5rem;\n  }\n\n  .SearchField {\n    flex-grow: 1;\n    max-width: 400px;\n    width: auto;\n    position: relative;\n\n    .react-select__control {\n      border-top-left-radius: 0;\n      border-bottom-left-radius: 0;\n    }\n  }\n\n  .add-performer {\n    align-items: center;\n    display: flex;\n\n    .SearchField {\n      display: inline-block;\n      margin-left: auto;\n      padding-top: 0.5rem;\n    }\n  }\n\n  .description {\n    height: 10rem;\n  }\n\n  .button-row {\n    display: flex;\n\n    .reset-button {\n      margin-left: auto;\n    }\n  }\n\n  .studio-select .invalid-feedback {\n    display: block;\n  }\n\n  .TagSelect .react-select__menu {\n    // min-width should match .TagSelect-select\n    min-width: 25rem;\n    width: max-content;\n    max-width: 45rem;\n    right: 0;\n  }\n}\n"
  },
  {
    "path": "frontend/src/pages/scenes/sceneForm/types.ts",
    "content": "import type { GenderEnum } from \"src/graphql\";\n\nexport type InitialScene = {\n  title?: string | null;\n  details?: string | null;\n  duration?: number | null;\n  director?: string | null;\n  date?: string | null;\n  production_date?: string | null;\n  code?: string | null;\n  urls?: {\n    url: string;\n    site: {\n      id: string;\n      name: string;\n    };\n  }[];\n  images?: {\n    id: string;\n    width: number;\n    height: number;\n    url: string;\n  }[];\n  studio?: {\n    id: string;\n    name: string;\n  } | null;\n  tags?: {\n    id: string;\n    name: string;\n    aliases: string[];\n  }[];\n  performers?:\n    | {\n        as?: string | null;\n        performer: {\n          id: string;\n          name: string;\n          aliases?: string[] | null;\n          disambiguation?: string | null;\n          gender?: GenderEnum | null;\n          deleted: boolean;\n        };\n      }[]\n    | null;\n};\n"
  },
  {
    "path": "frontend/src/pages/scenes/styles.scss",
    "content": ".fa-mars,\n.fa-venus,\n.fa-transgender {\n  margin-right: 0.25rem;\n}\n\n.fa-mars {\n  color: #89cff0;\n}\n\n.fa-venus {\n  color: #f38cac;\n}\n\n.fa-transgender {\n  color: #c8a2c8;\n}\n\n.ScenePhoto {\n  padding: 0;\n  min-height: 450px;\n  display: flex;\n  flex-direction: column;\n}\n\n.scene-performer {\n  display: inline-block;\n  margin-right: 0.5rem;\n}\n\n.scene-description {\n  white-space: pre-wrap;\n}\n\n.scene-tags {\n  margin-top: 1rem;\n}\n\n.scene-tag-list {\n  list-style-type: none;\n  margin: 0;\n  padding: 0;\n\n  li {\n    display: inline;\n    margin: 0;\n  }\n}\n\n.user-submitted {\n  color: $success;\n  margin-left: 0.5rem;\n  padding: 0;\n  vertical-align: baseline;\n\n  .fa-circle-xmark {\n    display: none;\n  }\n\n  &:hover {\n    cursor: pointer;\n    color: $danger;\n\n    .fa-circle-xmark {\n      display: inline;\n    }\n\n    .fa-circle-check {\n      display: none;\n    }\n  }\n\n  .fa-spin {\n    animation-duration: 1.5s;\n    cursor: wait;\n    color: $warning;\n  }\n}\n\n.fingerprint-sort-header {\n  cursor: pointer;\n  font-weight: bold;\n}\n"
  },
  {
    "path": "frontend/src/pages/search/GenderFacet.tsx",
    "content": "import type { FC } from \"react\";\nimport { Badge, Stack } from \"react-bootstrap\";\nimport { faTimes } from \"@fortawesome/free-solid-svg-icons\";\n\nimport type { GenderEnum, GenderFacet as GenderFacetType } from \"src/graphql\";\nimport { GenderIcon, Icon } from \"src/components/fragments\";\nimport { GenderTypes } from \"src/constants\";\n\ninterface Props {\n  genders: GenderFacetType[];\n  selected?: GenderEnum | null;\n  onClick?: (gender: GenderEnum | null) => void;\n}\n\nexport const GenderFacet: FC<Props> = ({ genders, selected, onClick }) => {\n  if (!genders || genders.length === 0) return null;\n\n  return (\n    <div className=\"SearchPage-facets\">\n      <small className=\"text-muted me-2\">Gender:</small>\n      <Stack direction=\"horizontal\" gap={2} className=\"flex-wrap\">\n        {genders.map((g) => {\n          const isSelected = selected === g.gender;\n          return (\n            <Badge\n              key={g.gender}\n              bg={isSelected ? \"primary\" : \"secondary\"}\n              className=\"d-flex align-items-center gap-1\"\n              style={{ cursor: onClick ? \"pointer\" : \"default\" }}\n              onClick={() => onClick?.(isSelected ? null : g.gender)}\n            >\n              <GenderIcon gender={g.gender} />\n              {GenderTypes[g.gender] ?? g.gender}\n              <Badge bg=\"dark\" pill className=\"ms-1\">\n                {g.count}\n              </Badge>\n              {isSelected && <Icon icon={faTimes} className=\"ms-1\" />}\n            </Badge>\n          );\n        })}\n      </Stack>\n    </div>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/search/PerformerCard.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Card } from \"react-bootstrap\";\nimport {\n  faBirthdayCake,\n  faFlag,\n  faVideo,\n} from \"@fortawesome/free-solid-svg-icons\";\n\nimport type { SearchAllQuery } from \"src/graphql\";\nimport {\n  Icon,\n  FavoriteStar,\n  GenderIcon,\n  PerformerName,\n  Thumbnail,\n} from \"src/components/fragments\";\nimport { getImage, getCountryByISO, performerHref } from \"src/utils\";\n\nexport type Performer = NonNullable<\n  SearchAllQuery[\"searchPerformers\"][\"performers\"][number]\n>;\n\nexport const PerformerCard: FC<{ performer: Performer }> = ({ performer }) => (\n  <Link to={performerHref(performer)} className=\"SearchPage-performer\">\n    <Card>\n      <Thumbnail\n        orientation=\"portrait\"\n        image={getImage(performer.images, \"portrait\")}\n        className=\"SearchPage-performer-image\"\n        size={300}\n      />\n      <div className=\"ms-3\">\n        <h4>\n          <GenderIcon gender={performer?.gender} />\n          <PerformerName performer={performer} />\n          <FavoriteStar\n            entity={performer}\n            entityType=\"performer\"\n            className=\"ps-2\"\n          />\n          {performer.aliases.length > 0 && (\n            <h6>\n              <small>Aliases: {performer.aliases.join(\", \")}</small>\n            </h6>\n          )}\n        </h4>\n        <div>\n          {performer.birth_date && (\n            <div>\n              <Icon icon={faBirthdayCake} />\n              {performer.birth_date}\n            </div>\n          )}\n          {performer.country && (\n            <div>\n              <Icon icon={faFlag} />\n              {getCountryByISO(performer.country)}\n            </div>\n          )}\n          <div>\n            <Icon icon={faVideo} />\n            {performer.scene_count} scene{performer.scene_count !== 1 && \"s\"}\n          </div>\n        </div>\n      </div>\n    </Card>\n  </Link>\n);\n"
  },
  {
    "path": "frontend/src/pages/search/SceneCard.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Card } from \"react-bootstrap\";\nimport {\n  faCalendar,\n  faUsers,\n  faVideo,\n} from \"@fortawesome/free-solid-svg-icons\";\n\nimport type { SearchAllQuery } from \"src/graphql\";\nimport { Icon, Thumbnail } from \"src/components/fragments\";\nimport { getImage, sceneHref, formatDuration } from \"src/utils\";\n\nexport type Scene = NonNullable<\n  SearchAllQuery[\"searchScenes\"][\"scenes\"][number]\n>;\n\nexport const SceneCard: FC<{ scene: Scene }> = ({ scene }) => (\n  <Link to={sceneHref(scene)} className=\"SearchPage-scene\">\n    <Card>\n      <Thumbnail\n        image={getImage(scene.images, \"landscape\")}\n        className=\"SearchPage-scene-image\"\n        size={300}\n      />\n      <div className=\"ms-3 w-100\">\n        <h5>\n          {scene.title}\n          <small className=\"text-muted ms-2\">\n            {formatDuration(scene.duration)}\n          </small>\n        </h5>\n        <div>\n          <div>\n            <Icon icon={faCalendar} />\n            {scene.release_date}\n          </div>\n          <div>\n            <Icon icon={faVideo} />\n            {scene.studio?.name ?? \"Unknown\"}\n            <small className=\"text-muted ms-2\">{scene.code}</small>\n          </div>\n          {scene.performers.length > 0 && (\n            <div>\n              <Icon icon={faUsers} />\n              {scene.performers.map((p) => p.as ?? p.performer.name).join(\", \")}\n            </div>\n          )}\n        </div>\n      </div>\n    </Card>\n  </Link>\n);\n"
  },
  {
    "path": "frontend/src/pages/search/SearchAll.tsx",
    "content": "import type { FC } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { Col, Row } from \"react-bootstrap\";\n\nimport { useSearchAll } from \"src/graphql\";\nimport { LoadingIndicator } from \"src/components/fragments\";\n\nimport { PerformerCard } from \"./PerformerCard\";\nimport { SceneCard } from \"./SceneCard\";\n\nexport const SearchAll: FC = () => {\n  const [searchParams] = useSearchParams();\n  const term = searchParams.get(\"q\") ?? \"\";\n\n  const { data, loading } = useSearchAll({ term, limit: 10 }, !term);\n\n  if (!term) return null;\n\n  if (loading) {\n    return <LoadingIndicator message=\"Searching...\" />;\n  }\n\n  if (!data) return null;\n\n  return (\n    <Row>\n      <Col xs={6}>\n        <h3>Performers</h3>\n        <div>\n          {data.searchPerformers.performers.map((p) => (\n            <PerformerCard performer={p} key={p.id} />\n          ))}\n        </div>\n      </Col>\n      <Col xs={6}>\n        <h3>Scenes</h3>\n        {data.searchScenes.scenes.map((s) => (\n          <SceneCard scene={s} key={s.id} />\n        ))}\n      </Col>\n    </Row>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/search/SearchLayout.tsx",
    "content": "import { type FC, useMemo, useCallback } from \"react\";\nimport {\n  useNavigate,\n  useSearchParams,\n  Outlet,\n  NavLink,\n} from \"react-router-dom\";\nimport { Badge, Form, Nav } from \"react-bootstrap\";\nimport { debounce } from \"lodash-es\";\nimport { faMagnifyingGlass } from \"@fortawesome/free-solid-svg-icons\";\nimport cx from \"classnames\";\n\nimport { Icon } from \"src/components/fragments\";\nimport Title from \"src/components/title\";\nimport { useSearchAll } from \"src/graphql\";\n\nconst CLASSNAME = \"SearchPage\";\nconst CLASSNAME_INPUT = `${CLASSNAME}-input`;\n\nexport const SearchLayout: FC = () => {\n  const navigate = useNavigate();\n  const [searchParams] = useSearchParams();\n  const term = searchParams.get(\"q\") ?? \"\";\n  const query = term ? `?q=${encodeURIComponent(term)}` : \"\";\n\n  const debouncedSearch = useMemo(\n    () =>\n      debounce((searchTerm: string, pathname: string) => {\n        const q = searchTerm ? `?q=${encodeURIComponent(searchTerm)}` : \"\";\n        navigate(`${pathname}${q}`, { replace: true });\n      }, 200),\n    [navigate],\n  );\n\n  const handleSearch = useCallback(\n    (searchTerm: string) => {\n      debouncedSearch(searchTerm, location.pathname);\n    },\n    [debouncedSearch],\n  );\n\n  const { data: searchData } = useSearchAll({ term, limit: 10 }, !term);\n\n  const performerCount = searchData?.searchPerformers.count;\n  const sceneCount = searchData?.searchScenes.count;\n\n  return (\n    <div className={CLASSNAME}>\n      <Title page={term || \"Search\"} />\n      <Form.Group className={cx(CLASSNAME_INPUT, \"mb-3\")}>\n        <Icon icon={faMagnifyingGlass} />\n        <Form.Control\n          key={term}\n          defaultValue={term}\n          onChange={(e) => handleSearch(e.currentTarget.value)}\n          placeholder=\"Search for performer or scene\"\n          autoFocus\n        />\n      </Form.Group>\n\n      <Nav variant=\"tabs\" className=\"mb-3\">\n        <Nav.Item>\n          <Nav.Link as={NavLink} to={`/search${query}`} end>\n            All\n          </Nav.Link>\n        </Nav.Item>\n        <Nav.Item>\n          <Nav.Link as={NavLink} to={`/search/performers${query}`}>\n            Performers\n            {performerCount !== undefined && (\n              <Badge bg=\"secondary\" className=\"ms-2\">\n                {performerCount}\n              </Badge>\n            )}\n          </Nav.Link>\n        </Nav.Item>\n        <Nav.Item>\n          <Nav.Link as={NavLink} to={`/search/scenes${query}`}>\n            Scenes\n            {sceneCount !== undefined && (\n              <Badge bg=\"secondary\" className=\"ms-2\">\n                {sceneCount}\n              </Badge>\n            )}\n          </Nav.Link>\n        </Nav.Item>\n      </Nav>\n\n      <Outlet />\n    </div>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/search/SearchPerformersTab.tsx",
    "content": "import { useState, type FC } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\n\nimport { useSearchPerformers, type GenderEnum } from \"src/graphql\";\nimport { usePagination } from \"src/hooks\";\nimport { List } from \"src/components/list\";\nimport { LoadingIndicator } from \"src/components/fragments\";\n\nimport { PerformerCard } from \"./PerformerCard\";\nimport { GenderFacet } from \"./GenderFacet\";\n\nconst PER_PAGE = 20;\n\nexport const SearchPerformersTab: FC = () => {\n  const [searchParams] = useSearchParams();\n  const term = searchParams.get(\"q\") ?? \"\";\n  const { page, setPage } = usePagination();\n  const [selectedGender, setSelectedGender] = useState<GenderEnum | null>(null);\n\n  const { loading, data } = useSearchPerformers(\n    {\n      term: term ?? \"\",\n      page,\n      per_page: PER_PAGE,\n      filter: {\n        gender: selectedGender,\n      },\n    },\n    !term,\n  );\n\n  const handleGenderClick = (gender: GenderEnum | null) => {\n    setSelectedGender(gender);\n    setPage(1);\n  };\n\n  if (!term) {\n    return null;\n  }\n\n  if (loading && !data) {\n    return <LoadingIndicator message=\"Searching performers...\" />;\n  }\n\n  const performers = data?.searchPerformers.performers ?? [];\n  const count = data?.searchPerformers.count ?? 0;\n  const facets = data?.searchPerformers.facets;\n\n  return (\n    <List\n      entityName=\"performers\"\n      page={page}\n      setPage={setPage}\n      perPage={PER_PAGE}\n      loading={loading}\n      listCount={count}\n      filters={\n        facets && (\n          <GenderFacet\n            genders={facets.genders}\n            selected={selectedGender}\n            onClick={handleGenderClick}\n          />\n        )\n      }\n    >\n      <div>\n        {performers.map((p) => (\n          <PerformerCard performer={p} key={p.id} />\n        ))}\n      </div>\n    </List>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/search/SearchScenesTab.tsx",
    "content": "import type { FC } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\n\nimport { useSearchScenes } from \"src/graphql\";\nimport { usePagination } from \"src/hooks\";\nimport { List } from \"src/components/list\";\nimport { LoadingIndicator } from \"src/components/fragments\";\n\nimport { SceneCard } from \"./SceneCard\";\n\nconst PER_PAGE = 20;\n\nexport const SearchScenesTab: FC = () => {\n  const [searchParams] = useSearchParams();\n  const term = searchParams.get(\"q\") ?? \"\";\n  const { page, setPage } = usePagination();\n\n  const { loading, data } = useSearchScenes(\n    {\n      term: term ?? \"\",\n      page,\n      per_page: PER_PAGE,\n    },\n    !term,\n  );\n\n  if (!term) {\n    return null;\n  }\n\n  if (loading && !data) {\n    return <LoadingIndicator message=\"Searching scenes...\" />;\n  }\n\n  const scenes = data?.searchScenes.scenes ?? [];\n  const count = data?.searchScenes.count ?? 0;\n\n  return (\n    <List\n      entityName=\"scenes\"\n      page={page}\n      setPage={setPage}\n      perPage={PER_PAGE}\n      loading={loading}\n      listCount={count}\n    >\n      <div>\n        {scenes.map((s) => (\n          <SceneCard scene={s} key={s.id} />\n        ))}\n      </div>\n    </List>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/search/index.tsx",
    "content": "import type { FC } from \"react\";\nimport { Route, Routes } from \"react-router-dom\";\n\nimport { SearchLayout } from \"./SearchLayout\";\nimport { SearchAll } from \"./SearchAll\";\nimport { SearchPerformersTab } from \"./SearchPerformersTab\";\nimport { SearchScenesTab } from \"./SearchScenesTab\";\n\nconst SearchRoutes: FC = () => (\n  <Routes>\n    <Route element={<SearchLayout />}>\n      <Route index element={<SearchAll />} />\n      <Route path=\"performers\" element={<SearchPerformersTab />} />\n      <Route path=\"scenes\" element={<SearchScenesTab />} />\n    </Route>\n  </Routes>\n);\n\nexport default SearchRoutes;\n"
  },
  {
    "path": "frontend/src/pages/search/search.scss",
    "content": ".SearchPage {\n  &-input {\n    font-size: 1.5rem;\n    position: relative;\n\n    .form-control {\n      font-size: 1.5rem;\n      padding-left: 2.5rem;\n    }\n\n    .fa-magnifying-glass {\n      left: 0.6rem;\n      position: absolute;\n      top: 0.8rem;\n\n      path {\n        fill: $text-muted;\n      }\n    }\n  }\n\n  &-facets {\n    display: flex;\n    align-items: center;\n    flex-wrap: wrap;\n    gap: 0.5rem;\n    margin-right: auto;\n\n    .badge {\n      font-weight: normal;\n      font-size: 0.85rem;\n    }\n  }\n\n  &-performer,\n  &-scene {\n    display: block;\n\n    .card {\n      display: flex;\n      flex-direction: row;\n      padding: 10px;\n    }\n\n    &:hover {\n      text-decoration: none;\n\n      .card {\n        background-color: #495b68;\n      }\n    }\n\n    &-image {\n      border-radius: 3px;\n      flex-shrink: 0;\n      object-fit: cover;\n\n      &[src=\"\"] {\n        visibility: hidden;\n      }\n    }\n  }\n\n  &-performer-image {\n    max-width: 4.67rem;\n  }\n\n  &-scene-image {\n    width: 12.44rem;\n  }\n\n  .fa-icon {\n    margin-right: 10px;\n  }\n}\n"
  },
  {
    "path": "frontend/src/pages/sites/Site.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { Button } from \"react-bootstrap\";\n\nimport { useDeleteSite, type SiteQuery } from \"src/graphql\";\nimport { createHref } from \"src/utils\";\nimport { SiteLink } from \"src/components/fragments\";\nimport DeleteButton from \"src/components/deleteButton\";\nimport { ROUTE_SITES, ROUTE_SITE_EDIT } from \"src/constants/route\";\nimport { useCurrentUser } from \"src/hooks\";\n\ntype Site = NonNullable<SiteQuery[\"findSite\"]>;\n\ninterface Props {\n  site: Site;\n}\n\nconst SiteComponent: FC<Props> = ({ site }) => {\n  const navigate = useNavigate();\n  const { isAdmin } = useCurrentUser();\n\n  const [deleteSite, { loading: deleting }] = useDeleteSite({\n    onCompleted: (result) => {\n      if (result) navigate(ROUTE_SITES);\n    },\n  });\n\n  const handleDelete = () => {\n    deleteSite({\n      variables: {\n        input: { id: site.id },\n      },\n    });\n  };\n\n  return (\n    <>\n      <Link to={ROUTE_SITES}>\n        <h6 className=\"mb-4\">&larr; Site List</h6>\n      </Link>\n      <div className=\"d-flex\">\n        <h3 className=\"me-auto\">\n          <SiteLink site={site} />\n        </h3>\n        {isAdmin && (\n          <div className=\"ms-auto\">\n            <Link to={createHref(ROUTE_SITE_EDIT, site)} className=\"me-2\">\n              <Button>Edit</Button>\n            </Link>\n            <DeleteButton\n              onClick={handleDelete}\n              disabled={deleting}\n              message=\"Do you want to delete the site? This is only possible if no links are attached.\"\n            />\n          </div>\n        )}\n      </div>\n      <dl>\n        <dt>Valid targets</dt>\n        <dd>{site.valid_types.join(\", \")}</dd>\n        {site.description && (\n          <>\n            <dt>Description:</dt>\n            <dd>{site.description}</dd>\n          </>\n        )}\n        {site.url && (\n          <>\n            <dt>URL:</dt>\n            <dd>{site.url}</dd>\n          </>\n        )}\n        {site.regex && (\n          <>\n            <dt>Regular Expression:</dt>\n            <dd>\n              <code>{site.regex}</code>\n            </dd>\n          </>\n        )}\n      </dl>\n    </>\n  );\n};\n\nexport default SiteComponent;\n"
  },
  {
    "path": "frontend/src/pages/sites/SiteAdd.tsx",
    "content": "import type { FC } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport { useAddSite, type SiteCreateInput } from \"src/graphql\";\nimport { siteHref } from \"src/utils\";\nimport SiteForm from \"./siteForm\";\n\nconst AddSite: FC = () => {\n  const navigate = useNavigate();\n  const [createSite] = useAddSite({\n    onCompleted: (data) => {\n      if (data?.siteCreate?.id) navigate(siteHref(data.siteCreate));\n    },\n  });\n\n  const doInsert = (insertData: SiteCreateInput) => {\n    createSite({\n      variables: {\n        siteData: insertData,\n      },\n    });\n  };\n\n  return (\n    <div>\n      <h3>Add new site</h3>\n      <hr />\n      <SiteForm callback={doInsert} />\n    </div>\n  );\n};\n\nexport default AddSite;\n"
  },
  {
    "path": "frontend/src/pages/sites/SiteEdit.tsx",
    "content": "import type { FC } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  useUpdateSite,\n  type SiteCreateInput,\n  type SiteQuery,\n} from \"src/graphql\";\nimport { siteHref } from \"src/utils\";\nimport SiteForm from \"./siteForm\";\n\ntype Site = NonNullable<SiteQuery[\"findSite\"]>;\n\ninterface Props {\n  site: Site;\n}\n\nconst UpdateSite: FC<Props> = ({ site }) => {\n  const navigate = useNavigate();\n  const [updateSite] = useUpdateSite({\n    onCompleted: (result) => {\n      if (result?.siteUpdate?.id) navigate(siteHref(result.siteUpdate));\n    },\n  });\n\n  const doUpdate = (insertData: SiteCreateInput) => {\n    updateSite({\n      variables: {\n        siteData: {\n          id: site.id,\n          ...insertData,\n        },\n      },\n    });\n  };\n\n  return (\n    <div>\n      <h3>\n        Update <em>{site.name}</em>\n      </h3>\n      <hr />\n      <SiteForm callback={doUpdate} site={site} />\n    </div>\n  );\n};\n\nexport default UpdateSite;\n"
  },
  {
    "path": "frontend/src/pages/sites/Sites.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Button, Card } from \"react-bootstrap\";\nimport { sortBy } from \"lodash-es\";\n\nimport { useSites } from \"src/graphql\";\nimport { LoadingIndicator, SiteLink } from \"src/components/fragments\";\nimport { ROUTE_SITE_ADD } from \"src/constants/route\";\nimport { useCurrentUser } from \"src/hooks\";\n\nconst SiteList: FC = () => {\n  const { isAdmin } = useCurrentUser();\n  const { loading, data } = useSites();\n\n  const sites = sortBy(data?.querySites.sites ?? [], (s) =>\n    s.name.toLowerCase(),\n  );\n\n  return (\n    <>\n      <div className=\"d-flex\">\n        <h3 className=\"me-4\">Sites</h3>\n        {isAdmin && (\n          <Link to={ROUTE_SITE_ADD} className=\"ms-auto\">\n            <Button>Create</Button>\n          </Link>\n        )}\n      </div>\n      <Card>\n        <Card.Body className=\"p-4\">\n          {loading && <LoadingIndicator message=\"Loading sites...\" />}\n          <ul className=\"ps-0\">\n            {sites.map((site) => (\n              <li key={site.id} className=\"d-block\">\n                <SiteLink site={site} noMargin />\n                {site.description && (\n                  <span className=\"ms-2\">\n                    &bull;\n                    <small className=\"ms-2\">{site.description}</small>\n                  </span>\n                )}\n              </li>\n            ))}\n          </ul>\n        </Card.Body>\n      </Card>\n    </>\n  );\n};\n\nexport default SiteList;\n"
  },
  {
    "path": "frontend/src/pages/sites/index.tsx",
    "content": "import type { FC } from \"react\";\nimport { Route, Routes, useParams } from \"react-router-dom\";\n\nimport { useSite } from \"src/graphql\";\nimport { ErrorMessage, LoadingIndicator } from \"src/components/fragments\";\nimport Title from \"src/components/title\";\n\nimport Site from \"./Site\";\nimport Sites from \"./Sites\";\nimport SiteAdd from \"./SiteAdd\";\nimport SiteEdit from \"./SiteEdit\";\n\nconst SiteLoader: FC = () => {\n  const { id } = useParams();\n  const { data, loading } = useSite({ id: id ?? \"\" }, !id);\n\n  if (loading) return <LoadingIndicator message=\"Loading site...\" />;\n\n  if (!id) return <ErrorMessage error=\"Site ID is missing\" />;\n\n  const site = data?.findSite;\n  if (!site) return <ErrorMessage error=\"Site not found.\" />;\n\n  return (\n    <Routes>\n      <Route\n        path=\"/edit\"\n        element={\n          <>\n            <Title page={`Edit Site \"${site.name}\"`} />\n            <SiteEdit site={site} />\n          </>\n        }\n      />\n      <Route\n        path=\"/\"\n        element={\n          <>\n            <Title page={`Site \"${site.name}\"`} />\n            <Site site={site} />\n          </>\n        }\n      />\n    </Routes>\n  );\n};\n\nconst SiteRoutes: FC = () => (\n  <Routes>\n    <Route\n      path=\"/\"\n      element={\n        <>\n          <Title page=\"Sites\" />\n          <Sites />\n        </>\n      }\n    />\n    <Route\n      path=\"/add\"\n      element={\n        <>\n          <Title page=\"Add Site\" />\n          <SiteAdd />\n        </>\n      }\n    />\n    <Route path=\"/:id/*\" element={<SiteLoader />} />\n  </Routes>\n);\n\nexport default SiteRoutes;\n"
  },
  {
    "path": "frontend/src/pages/sites/siteForm/SiteForm.tsx",
    "content": "import type { FC } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { useForm, Controller } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as yup from \"yup\";\nimport cx from \"classnames\";\nimport { Button, Form } from \"react-bootstrap\";\nimport Select from \"react-select\";\nimport { capitalize } from \"lodash-es\";\n\nimport {\n  ValidSiteTypeEnum,\n  type SiteCreateInput,\n  type SiteQuery,\n} from \"src/graphql\";\n\ntype Site = NonNullable<SiteQuery[\"findSite\"]>;\n\nconst validSites = Object.keys(ValidSiteTypeEnum);\n\nconst schema = yup.object({\n  name: yup.string().required(\"Name is required\"),\n  description: yup.string().optional(),\n  url: yup.string().optional(),\n  regex: yup.string().optional(),\n  valid_types: yup\n    .array(yup.string().oneOf(validSites).required())\n    .min(1, \"At least one site type is required\")\n    .ensure(),\n});\n\ntype SiteFormData = yup.Asserts<typeof schema>;\n\ninterface SiteProps {\n  site?: Site;\n  callback: (data: SiteCreateInput) => void;\n}\n\nconst SiteForm: FC<SiteProps> = ({ site, callback }) => {\n  const navigate = useNavigate();\n  const {\n    control,\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm({\n    resolver: yupResolver(schema),\n  });\n\n  const onSubmit = (data: SiteFormData) => {\n    const callbackData: SiteCreateInput = {\n      name: data.name,\n      description: data.description,\n      url: data.url,\n      regex: data.regex,\n      valid_types: data.valid_types as ValidSiteTypeEnum[],\n    };\n    callback(callbackData);\n  };\n\n  return (\n    <Form className=\"SiteForm w-50\" onSubmit={handleSubmit(onSubmit)}>\n      <Form.Group controlId=\"name\" className=\"mb-3\">\n        <Form.Label>Name</Form.Label>\n        <Form.Control\n          className={cx({ \"is-invalid\": errors.name })}\n          placeholder=\"Name\"\n          defaultValue={site?.name ?? \"\"}\n          {...register(\"name\")}\n        />\n        <Form.Control.Feedback type=\"invalid\">\n          {errors?.name?.message}\n        </Form.Control.Feedback>\n      </Form.Group>\n\n      <Form.Group controlId=\"description\" className=\"mb-3\">\n        <Form.Label>Description</Form.Label>\n        <Form.Control\n          placeholder=\"Description\"\n          defaultValue={site?.description ?? \"\"}\n          {...register(\"description\")}\n        />\n      </Form.Group>\n\n      <Form.Group controlId=\"url\" className=\"mb-3\">\n        <Form.Label>URL</Form.Label>\n        <Form.Control\n          placeholder=\"URL\"\n          defaultValue={site?.url ?? \"\"}\n          {...register(\"url\")}\n        />\n        <Form.Text>URL of the site, if applicable.</Form.Text>\n      </Form.Group>\n\n      <Form.Group controlId=\"regex\" className=\"mb-3\">\n        <Form.Label>Regular Expression</Form.Label>\n        <Form.Control\n          placeholder=\"\"\n          defaultValue={site?.regex ?? \"\"}\n          {...register(\"regex\")}\n        />\n        <Form.Text>\n          An optional regular expression that will be used to clean links and\n          autofill the Site selection with this Site. Must contain a capture\n          group of the portion of the URL that will be kept.\n          <br />\n          Example:\n          <br />\n          This regexp{\" \"}\n          <code>(https?:\\/\\/(?:www\\.)?(?:(.*)\\.)?example\\.org\\/?[^?#]+)</code>\n          <br />\n          will match this string{\" \"}\n          <code>http://example.org/foo/bar?id=69#top</code>\n          <br />\n          and will clean it into <code>http://example.org/foo/bar</code>\n        </Form.Text>\n      </Form.Group>\n\n      <Form.Group className=\"mb-3\">\n        <Form.Label>Valid link targets</Form.Label>\n        <Controller\n          control={control}\n          name=\"valid_types\"\n          defaultValue={(site?.valid_types ?? []) as string[]}\n          render={({ field: { onChange } }) => (\n            <Select\n              classNamePrefix=\"react-select\"\n              className={cx({ \"is-invalid\": errors.valid_types })}\n              defaultValue={(site?.valid_types ?? []).map((s) => ({\n                value: s as string,\n                label: capitalize(s),\n              }))}\n              isMulti\n              onChange={(values) => onChange(values.map((v) => v.value))}\n              options={validSites.map((s) => ({\n                value: s,\n                label: capitalize(s),\n              }))}\n              placeholder=\"Types this site can link to\"\n            />\n          )}\n        />\n        <Form.Control.Feedback type=\"invalid\">\n          {/* Workaround for typing error in react-hook-form */}\n          {(errors.valid_types as unknown as { message: string })?.message}\n        </Form.Control.Feedback>\n      </Form.Group>\n\n      <Form.Group className=\"d-flex mb-3\">\n        <Button type=\"submit\" className=\"col-2\">\n          Save\n        </Button>\n        <Button type=\"reset\" className=\"ms-auto me-2\">\n          Reset\n        </Button>\n        <Button variant=\"danger\" onClick={() => navigate(-1)}>\n          Cancel\n        </Button>\n      </Form.Group>\n    </Form>\n  );\n};\n\nexport default SiteForm;\n"
  },
  {
    "path": "frontend/src/pages/sites/siteForm/index.ts",
    "content": "export { default } from \"./SiteForm\";\n"
  },
  {
    "path": "frontend/src/pages/studios/Studio.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link, useLocation, useNavigate } from \"react-router-dom\";\nimport { Button, Tab, Tabs } from \"react-bootstrap\";\n\nimport {\n  usePendingEditsCount,\n  TargetTypeEnum,\n  CriterionModifier,\n  type StudioQuery,\n} from \"src/graphql\";\n\ntype Studio = NonNullable<StudioQuery[\"findStudio\"]>;\nimport { useCurrentUser } from \"src/hooks\";\nimport { EditList, SceneList, URLList } from \"src/components/list\";\nimport {\n  StudioPerformers,\n  SubStudioPreview,\n  SubStudioList,\n} from \"./components\";\n\nimport {\n  getImage,\n  createHref,\n  studioHref,\n  formatPendingEdits,\n  getUrlBySite,\n} from \"src/utils\";\nimport { ROUTE_STUDIO_EDIT, ROUTE_STUDIO_DELETE } from \"src/constants/route\";\nimport { FavoriteStar } from \"src/components/fragments\";\n\nconst DEFAULT_TAB = \"scenes\";\n\ninterface Props {\n  studio: Studio;\n}\n\nconst StudioComponent: FC<Props> = ({ studio }) => {\n  const { isEditor } = useCurrentUser();\n  const navigate = useNavigate();\n  const location = useLocation();\n  const activeTab = location.hash?.slice(1) || DEFAULT_TAB;\n\n  const { data: editData } = usePendingEditsCount({\n    type: TargetTypeEnum.STUDIO,\n    id: studio.id,\n  });\n  const pendingEditCount = editData?.queryEdits.count;\n\n  const studioImage = getImage(studio.images, \"landscape\");\n  const hasSubStudios = studio.sub_studios.count > 0;\n\n  const setTab = (tab: string | null) =>\n    navigate({ hash: tab === DEFAULT_TAB ? \"\" : `#${tab}` });\n\n  const homeURL = getUrlBySite(studio.urls, \"Home\");\n\n  return (\n    <>\n      <div className=\"d-flex\">\n        <div className=\"studio-title me-auto\">\n          <h3>\n            {studio.deleted ? (\n              <del>{studio.name}</del>\n            ) : (\n              <span>{studio.name}</span>\n            )}\n            <FavoriteStar\n              entity={studio}\n              entityType=\"studio\"\n              interactable\n              className=\"ps-2\"\n            />\n          </h3>\n          {homeURL && (\n            <h6>\n              {homeURL.site.name !== \"Home\" && (\n                <b className=\"me-2\">{homeURL.site.name}:</b>\n              )}\n              <a href={homeURL.url} target=\"_blank\" rel=\"noreferrer noopener\">\n                {homeURL.url}\n              </a>\n            </h6>\n          )}\n          {studio.parent && (\n            <span>\n              Part of{\" \"}\n              <b>\n                <Link to={studioHref(studio.parent)}>{studio.parent.name}</Link>\n              </b>\n            </span>\n          )}\n          {studio.aliases.length > 0 && (\n            <div className=\"d-flex\">\n              <b className=\"me-2\">Aliases:</b>\n              <span>{studio.aliases.join(\", \")}</span>\n            </div>\n          )}\n        </div>\n        {studioImage && (\n          <div className=\"studio-photo\">\n            <img src={getImage(studio.images, \"landscape\")} alt=\"Studio logo\" />\n          </div>\n        )}\n        <div>\n          {isEditor && !studio.deleted && (\n            <>\n              <Link to={createHref(ROUTE_STUDIO_EDIT, studio)} className=\"ms-2\">\n                <Button>Edit</Button>\n              </Link>\n              <Link\n                to={createHref(ROUTE_STUDIO_DELETE, studio)}\n                className=\"ms-2\"\n              >\n                <Button variant=\"danger\">Delete</Button>\n              </Link>\n            </>\n          )}\n        </div>\n      </div>\n      {hasSubStudios && (\n        <>\n          <h6>Sub Studios</h6>\n          <SubStudioPreview\n            id={studio.id}\n            onViewAll={() => setTab(\"sub-studios\")}\n          />\n        </>\n      )}\n      <Tabs\n        activeKey={activeTab}\n        id=\"studio-tabs\"\n        mountOnEnter\n        onSelect={setTab}\n      >\n        <Tab eventKey=\"scenes\" title={hasSubStudios ? \"All Scenes\" : \"Scenes\"}>\n          <SceneList\n            filter={{ parentStudio: studio.id }}\n            favoriteFilter=\"performer\"\n          />\n        </Tab>\n        {hasSubStudios && (\n          <Tab eventKey=\"studio-scenes\" title=\"Studio Scenes\">\n            <SceneList\n              filter={{\n                studios: {\n                  value: [studio.id],\n                  modifier: CriterionModifier.INCLUDES,\n                },\n              }}\n            />\n          </Tab>\n        )}\n        {hasSubStudios && (\n          <Tab eventKey=\"sub-studios\" title=\"Sub Studios\">\n            <SubStudioList id={studio.id} />\n          </Tab>\n        )}\n        <Tab eventKey=\"performers\" title=\"Performers\">\n          <StudioPerformers id={studio.id} />\n        </Tab>\n        <Tab eventKey=\"links\" title=\"Links\">\n          <URLList urls={studio.urls} />\n        </Tab>\n        <Tab\n          eventKey=\"edits\"\n          title={`Edits${formatPendingEdits(pendingEditCount)}`}\n          tabClassName={pendingEditCount ? \"PendingEditTab\" : \"\"}\n        >\n          <EditList type={TargetTypeEnum.STUDIO} id={studio.id} />\n        </Tab>\n      </Tabs>\n    </>\n  );\n};\n\nexport default StudioComponent;\n"
  },
  {
    "path": "frontend/src/pages/studios/StudioAdd.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  useStudioEdit,\n  OperationEnum,\n  type StudioEditDetailsInput,\n} from \"src/graphql\";\nimport { editHref } from \"src/utils\";\n\nimport StudioForm from \"./studioForm\";\n\nconst StudioAdd: FC = () => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [insertStudioEdit, { loading: saving }] = useStudioEdit({\n    onCompleted: (data) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (data.studioEdit.id) navigate(editHref(data.studioEdit));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  const doInsert = (insertData: StudioEditDetailsInput, editNote: string) => {\n    insertStudioEdit({\n      variables: {\n        studioData: {\n          edit: {\n            operation: OperationEnum.CREATE,\n            comment: editNote,\n          },\n          details: insertData,\n        },\n      },\n    });\n  };\n\n  return (\n    <div>\n      <h3>Add new studio</h3>\n      <hr />\n      <StudioForm callback={doInsert} saving={saving} />\n      {submissionError && (\n        <div className=\"text-danger text-end col-9\">\n          Error: {submissionError}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default StudioAdd;\n"
  },
  {
    "path": "frontend/src/pages/studios/StudioDelete.tsx",
    "content": "import type { FC } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { Button, Col, Form, Row } from \"react-bootstrap\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\n\nimport {\n  OperationEnum,\n  useStudioEdit,\n  type StudioFragment as Studio,\n} from \"src/graphql\";\nimport { EditNote } from \"src/components/form\";\nimport { editHref } from \"src/utils\";\n\nconst schema = yup.object({\n  id: yup.string().required(),\n  note: yup.string().required(\"An edit note is required.\"),\n});\nexport type FormData = yup.Asserts<typeof schema>;\n\ninterface Props {\n  studio: Studio;\n}\n\nconst StudioDelete: FC<Props> = ({ studio }) => {\n  const navigate = useNavigate();\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm<FormData>({\n    resolver: yupResolver(schema),\n    mode: \"onBlur\",\n  });\n  const [deleteStudioEdit, { loading: deleting }] = useStudioEdit({\n    onCompleted: (data) => {\n      if (data.studioEdit.id) navigate(editHref(data.studioEdit));\n    },\n  });\n\n  const handleDelete = (data: FormData) =>\n    deleteStudioEdit({\n      variables: {\n        studioData: {\n          edit: {\n            operation: OperationEnum.DESTROY,\n            id: data.id,\n            comment: data.note,\n          },\n        },\n      },\n    });\n\n  return (\n    <Form className=\"StudioDeleteForm\" onSubmit={handleSubmit(handleDelete)}>\n      <Row>\n        <h4>\n          Delete studio <em>{studio.name}</em>\n        </h4>\n      </Row>\n      <Form.Control type=\"hidden\" value={studio.id} {...register(\"id\")} />\n      <Row className=\"my-4\">\n        <Col md={6}>\n          <EditNote register={register} error={errors.note} />\n          <div className=\"d-flex mt-2\">\n            <Button\n              variant=\"danger\"\n              className=\"ms-auto me-2\"\n              onClick={() => navigate(-1)}\n            >\n              Cancel\n            </Button>\n            <Button\n              type=\"submit\"\n              disabled\n              className=\"d-none\"\n              aria-hidden=\"true\"\n            />\n            <Button type=\"submit\" disabled={deleting}>\n              Submit Edit\n            </Button>\n          </div>\n        </Col>\n      </Row>\n    </Form>\n  );\n};\n\nexport default StudioDelete;\n"
  },
  {
    "path": "frontend/src/pages/studios/StudioEdit.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  useStudioEdit,\n  type StudioEditDetailsInput,\n  OperationEnum,\n  type StudioQuery,\n} from \"src/graphql\";\n\ntype Studio = NonNullable<StudioQuery[\"findStudio\"]>;\nimport { createHref } from \"src/utils\";\nimport { ROUTE_EDIT } from \"src/constants\";\nimport StudioForm from \"./studioForm\";\n\ninterface Props {\n  studio: Studio;\n}\n\nconst StudioEdit: FC<Props> = ({ studio }) => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [insertStudioEdit, { loading: saving }] = useStudioEdit({\n    onCompleted: (data) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (data.studioEdit.id) navigate(createHref(ROUTE_EDIT, data.studioEdit));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  const doUpdate = (insertData: StudioEditDetailsInput, editNote: string) => {\n    insertStudioEdit({\n      variables: {\n        studioData: {\n          edit: {\n            id: studio.id,\n            operation: OperationEnum.MODIFY,\n            comment: editNote,\n          },\n          details: insertData,\n        },\n      },\n    });\n  };\n\n  return (\n    <div>\n      <h3>\n        Edit\n        <strong className=\"ms-2\">{studio.name}</strong>\n      </h3>\n      <hr />\n      <StudioForm\n        studio={studio}\n        callback={doUpdate}\n        showNetworkSelect={studio.sub_studios.count === 0}\n        saving={saving}\n      />\n      {submissionError && (\n        <div className=\"text-danger text-end col-9\">\n          Error: {submissionError}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default StudioEdit;\n"
  },
  {
    "path": "frontend/src/pages/studios/StudioEditUpdate.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  useStudioEditUpdate,\n  type StudioEditDetailsInput,\n  type EditUpdateQuery,\n} from \"src/graphql\";\nimport { createHref, isStudio, isStudioEdit } from \"src/utils\";\nimport StudioForm from \"./studioForm\";\n\ntype EditUpdate = NonNullable<EditUpdateQuery[\"findEdit\"]>;\n\nimport { ROUTE_EDIT } from \"src/constants\";\nimport Title from \"src/components/title\";\n\nexport const StudioEditUpdate: FC<{ edit: EditUpdate }> = ({ edit }) => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [updateStudioEdit, { loading: saving }] = useStudioEditUpdate({\n    onCompleted: (result) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (result.studioEditUpdate.id)\n        navigate(createHref(ROUTE_EDIT, result.studioEditUpdate));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  if (\n    !isStudioEdit(edit.details) ||\n    (edit.target !== null && !isStudio(edit.target))\n  )\n    return null;\n\n  const doUpdate = (updateData: StudioEditDetailsInput, editNote: string) => {\n    updateStudioEdit({\n      variables: {\n        id: edit.id,\n        studioData: {\n          edit: {\n            id: edit.target?.id,\n            operation: edit.operation,\n            comment: editNote,\n            merge_source_ids: edit.merge_sources.map((s) => s.id),\n          },\n          details: updateData,\n        },\n      },\n    });\n  };\n\n  const studioName = edit?.target?.name ?? edit.details?.name;\n\n  return (\n    <div>\n      <Title page={`Update studio edit for \"${studioName}\"`} />\n      <h3>\n        Update studio edit for\n        <i className=\"ms-2\">\n          <b>{studioName}</b>\n        </i>\n      </h3>\n      <hr />\n      <StudioForm\n        studio={edit.target}\n        initial={edit.details}\n        callback={doUpdate}\n        saving={saving}\n      />\n      {submissionError && (\n        <div className=\"text-danger text-end col-9\">\n          Error: {submissionError}\n        </div>\n      )}\n    </div>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/studios/Studios.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button, Card, Form } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport { studioHref, createHref } from \"src/utils\";\nimport { ROUTE_STUDIO_ADD } from \"src/constants/route\";\nimport { debounce } from \"lodash-es\";\n\nimport { useStudios, SortDirectionEnum, StudioSortEnum } from \"src/graphql\";\nimport { useCurrentUser, usePagination, useQueryParams } from \"src/hooks\";\nimport { List } from \"src/components/list\";\nimport { FavoriteStar } from \"src/components/fragments\";\n\nconst PER_PAGE = 40;\n\nconst StudiosComponent: FC = () => {\n  const { isEditor } = useCurrentUser();\n  const [params, setParams] = useQueryParams({\n    query: { name: \"query\", type: \"string\", default: \"\" },\n    favorite: { name: \"favorite\", type: \"string\", default: \"false\" },\n  });\n  const favorite = params.favorite === \"true\" || undefined;\n  const { page, setPage } = usePagination();\n  const { loading, data } = useStudios({\n    input: {\n      names: params.query,\n      is_favorite: favorite,\n      page,\n      per_page: PER_PAGE,\n      direction: SortDirectionEnum.ASC,\n      sort: StudioSortEnum.NAME,\n    },\n  });\n\n  const studioList = data?.queryStudios.studios.map((s) => (\n    <li key={s.id} className={s.parent === null ? \"fw-bold\" : \"\"}>\n      <Link to={studioHref(s)}>{s.name}</Link>\n      {s.parent && (\n        <small className=\"bullet-separator text-muted\">\n          <Link to={studioHref(s.parent)}>{s.parent.name}</Link>\n        </small>\n      )}\n      <FavoriteStar entity={s} entityType=\"studio\" className=\"ps-2\" />\n    </li>\n  ));\n\n  const debouncedHandler = debounce(setParams, 200);\n\n  const filters = (\n    <>\n      <Form.Control\n        id=\"studio-query\"\n        onChange={(e) => debouncedHandler(\"query\", e.currentTarget.value)}\n        placeholder=\"Filter studio name\"\n        defaultValue={params.query ?? \"\"}\n        className=\"w-25 me-3\"\n      />\n      <Form.Group controlId=\"favorite\">\n        <Form.Check\n          className=\"mt-2\"\n          type=\"switch\"\n          label=\"Only favorites\"\n          defaultChecked={favorite}\n          onChange={(e) =>\n            setParams(\"favorite\", e.currentTarget.checked.toString())\n          }\n        />\n      </Form.Group>\n    </>\n  );\n\n  return (\n    <>\n      <div className=\"d-flex\">\n        <h3 className=\"me-4\">Studios</h3>\n        {isEditor && (\n          <Link to={createHref(ROUTE_STUDIO_ADD)} className=\"ms-auto\">\n            <Button className=\"me-auto\">Create</Button>\n          </Link>\n        )}\n      </div>\n      <List\n        entityName=\"studios\"\n        page={page}\n        setPage={setPage}\n        perPage={PER_PAGE}\n        filters={filters}\n        loading={loading}\n        listCount={data?.queryStudios.count}\n      >\n        <Card>\n          <Card.Body>\n            <ul>{studioList}</ul>\n          </Card.Body>\n        </Card>\n      </List>\n    </>\n  );\n};\n\nexport default StudiosComponent;\n"
  },
  {
    "path": "frontend/src/pages/studios/components/index.ts",
    "content": "export * from \"./studioPerformers\";\nexport { SubStudioList } from \"./subStudioList\";\nexport { SubStudioPreview } from \"./subStudioPreview\";\n"
  },
  {
    "path": "frontend/src/pages/studios/components/studioPerformers.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button, Form, InputGroup, Row, Col } from \"react-bootstrap\";\nimport { debounce } from \"lodash-es\";\nimport Select from \"react-select\";\nimport {\n  faSortAmountUp,\n  faSortAmountDown,\n} from \"@fortawesome/free-solid-svg-icons\";\n\nimport {\n  useStudioPerformers,\n  GenderFilterEnum,\n  PerformerSortEnum,\n  SortDirectionEnum,\n} from \"src/graphql\";\nimport { Icon } from \"src/components/fragments\";\nimport PerformerCard from \"src/components/performerCard\";\nimport SceneCard from \"src/components/sceneCard\";\nimport { GenderFilterTypes } from \"src/constants\";\nimport { usePagination, useQueryParams } from \"src/hooks\";\nimport { ensureEnum, resolveEnum } from \"src/utils\";\nimport { List } from \"src/components/list\";\n\nconst PER_PAGE = 25;\n\nconst genderOptions = Object.entries(GenderFilterEnum).map(([, value]) => ({\n  value,\n  label: GenderFilterTypes[value],\n}));\nconst sortOptions = [\n  { value: PerformerSortEnum.LAST_SCENE, label: \"Latest Scene\" },\n  { value: PerformerSortEnum.DEBUT, label: \"First Scene\" },\n  { value: PerformerSortEnum.NAME, label: \"Name\" },\n  { value: PerformerSortEnum.SCENE_COUNT, label: \"Scene Count\" },\n];\n\ninterface Props {\n  id: string;\n}\n\nexport const StudioPerformers: FC<Props> = ({ id }) => {\n  const [params, setParams] = useQueryParams({\n    query: { name: \"query\", type: \"string\", default: \"\" },\n    gender: { name: \"gender\", type: \"string\" },\n    direction: { name: \"dir\", type: \"string\", default: SortDirectionEnum.DESC },\n    sort: {\n      name: \"sort\",\n      type: \"string\",\n      default: PerformerSortEnum.LAST_SCENE,\n    },\n    favorite: { name: \"favorite\", type: \"string\", default: \"false\" },\n  });\n  const gender = resolveEnum(GenderFilterEnum, params.gender);\n  const direction = ensureEnum(SortDirectionEnum, params.direction);\n  const sort = ensureEnum(PerformerSortEnum, params.sort);\n  const favorite = params.favorite === \"true\" || undefined;\n  const names = params.query || undefined;\n  const { page, setPage } = usePagination();\n\n  const { data, loading } = useStudioPerformers({\n    studioId: id,\n    gender,\n    favorite,\n    names,\n    page,\n    per_page: PER_PAGE,\n    sort,\n    direction,\n  });\n\n  const performers = data?.queryPerformers.performers;\n\n  const debouncedHandler = debounce(setParams, 200);\n\n  const filters = (\n    <>\n      <Form.Control\n        id=\"performer-name\"\n        onChange={(e) => debouncedHandler(\"query\", e.currentTarget.value)}\n        placeholder=\"Filter performer name\"\n        defaultValue={params.query}\n        className=\"w-auto\"\n      />\n      <Select\n        id=\"performer-gender\"\n        options={genderOptions}\n        defaultValue={genderOptions.find((o) => o.value === gender)}\n        placeholder=\"Gender\"\n        isClearable\n        onChange={(e) => setParams(\"gender\", e?.value ?? undefined)}\n        classNamePrefix=\"react-select\"\n        className=\"performer-filter ms-2\"\n      />\n      <InputGroup className=\"performer-sort ms-2 me-3\">\n        <Form.Select\n          onChange={(e) =>\n            setParams(\"sort\", e.currentTarget.value.toLowerCase())\n          }\n          defaultValue={sort ?? \"name\"}\n        >\n          {sortOptions.map((s) => (\n            <option value={s.value} key={s.value}>\n              {s.label}\n            </option>\n          ))}\n        </Form.Select>\n        <Button\n          variant=\"secondary\"\n          onClick={() =>\n            setParams(\n              \"direction\",\n              direction === SortDirectionEnum.DESC\n                ? SortDirectionEnum.ASC\n                : undefined,\n            )\n          }\n        >\n          <Icon\n            icon={\n              direction === SortDirectionEnum.DESC\n                ? faSortAmountDown\n                : faSortAmountUp\n            }\n          />\n        </Button>\n      </InputGroup>\n      <Form.Group controlId=\"favorite\">\n        <Form.Check\n          className=\"mt-2\"\n          type=\"switch\"\n          label=\"Only favorites\"\n          defaultChecked={favorite}\n          onChange={(e) =>\n            setParams(\"favorite\", e.currentTarget.checked.toString())\n          }\n        />\n      </Form.Group>\n    </>\n  );\n\n  return (\n    <List\n      entityName=\"Scene Pairings\"\n      page={page}\n      filters={filters}\n      setPage={setPage}\n      perPage={PER_PAGE}\n      loading={loading}\n      listCount={data?.queryPerformers?.count}\n    >\n      {performers?.map((p, i) => (\n        <Row key={p.id}>\n          <Col xs={3} key={p.id}>\n            <PerformerCard performer={p} />\n          </Col>\n          <Col xs={9}>\n            <Row>\n              {p.scenes.map((s) => (\n                <Col xs={4} key={s.id}>\n                  <SceneCard scene={s} />\n                </Col>\n              ))}\n            </Row>\n          </Col>\n          {i < performers.length - 1 && <hr />}\n        </Row>\n      ))}\n    </List>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/studios/components/subStudioList.tsx",
    "content": "import { type FC, useState, useMemo } from \"react\";\nimport { Card, Form } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport { debounce } from \"lodash-es\";\n\nimport { useSubStudios, SortDirectionEnum, StudioSortEnum } from \"src/graphql\";\nimport { usePagination } from \"src/hooks\";\nimport { List } from \"src/components/list\";\nimport { studioHref } from \"src/utils\";\n\nconst PER_PAGE = 25;\n\ninterface Props {\n  id: string;\n}\n\nexport const SubStudioList: FC<Props> = ({ id }) => {\n  const [filter, setFilter] = useState(\"\");\n  const names = filter || undefined;\n  const { page, setPage } = usePagination();\n\n  const { data, loading } = useSubStudios({\n    id,\n    input: {\n      page,\n      per_page: PER_PAGE,\n      sort: StudioSortEnum.NAME,\n      direction: SortDirectionEnum.ASC,\n      names,\n    },\n  });\n\n  const studios = data?.findStudio?.sub_studios.studios;\n  const showLoading = loading && !studios;\n\n  const debouncedSetFilter = useMemo(() => debounce(setFilter, 200), []);\n\n  const filters = (\n    <Form.Control\n      id=\"sub-studio-name\"\n      onChange={(e) => debouncedSetFilter(e.currentTarget.value)}\n      placeholder=\"Filter by name\"\n      className=\"w-auto\"\n    />\n  );\n\n  return (\n    <List\n      entityName=\"sub-studios\"\n      page={page}\n      filters={filters}\n      setPage={setPage}\n      perPage={PER_PAGE}\n      loading={showLoading}\n      listCount={data?.findStudio?.sub_studios.count}\n    >\n      <Card>\n        <Card.Body>\n          <ul>\n            {studios?.map((s) => (\n              <li key={s.id}>\n                <Link to={studioHref(s)}>{s.name}</Link>\n              </li>\n            ))}\n          </ul>\n        </Card.Body>\n      </Card>\n    </List>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/studios/components/subStudioPreview.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nimport { useSubStudios, SortDirectionEnum, StudioSortEnum } from \"src/graphql\";\nimport { LoadingIndicator } from \"src/components/fragments\";\nimport { studioHref } from \"src/utils\";\n\nconst PREVIEW_COUNT = 25;\n\ninterface Props {\n  id: string;\n  onViewAll: () => void;\n}\n\nexport const SubStudioPreview: FC<Props> = ({ id, onViewAll }) => {\n  const { data, loading } = useSubStudios({\n    id,\n    input: {\n      page: 1,\n      per_page: PREVIEW_COUNT,\n      sort: StudioSortEnum.NAME,\n      direction: SortDirectionEnum.ASC,\n    },\n  });\n\n  const studios = data?.findStudio?.sub_studios.studios;\n  const count = data?.findStudio?.sub_studios.count ?? 0;\n  const hasMore = count > PREVIEW_COUNT;\n\n  if (loading) return <LoadingIndicator message=\"Loading sub-studios...\" />;\n\n  return (\n    <div className=\"sub-studio-list\">\n      <ul>\n        {studios?.map((s) => (\n          <li key={s.id}>\n            <Link to={studioHref(s)}>{s.name}</Link>\n          </li>\n        ))}\n        {hasMore && (\n          <li key=\"view-all\" style={{ listStyle: \"none\", marginLeft: \"-1rem\" }}>\n            <button\n              type=\"button\"\n              className=\"btn btn-link p-0\"\n              onClick={onViewAll}\n            >\n              View all {count} sub-studios\n            </button>\n          </li>\n        )}\n      </ul>\n    </div>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/studios/index.tsx",
    "content": "import type { FC } from \"react\";\nimport { Route, Routes, useParams } from \"react-router-dom\";\n\nimport { ErrorMessage, LoadingIndicator } from \"src/components/fragments\";\n\nimport { useStudio } from \"src/graphql\";\nimport Title from \"src/components/title\";\n\nimport Studio from \"./Studio\";\nimport Studios from \"./Studios\";\nimport StudioEdit from \"./StudioEdit\";\nimport StudioAdd from \"./StudioAdd\";\nimport StudioDelete from \"./StudioDelete\";\n\nconst StudioLoader: FC = () => {\n  const { id } = useParams();\n  const { loading, data } = useStudio({ id: id ?? \"\" }, !id);\n\n  if (loading) return <LoadingIndicator message=\"Loading studio...\" />;\n\n  if (!id) return <ErrorMessage error=\"Studio ID is missing\" />;\n\n  const studio = data?.findStudio;\n  if (!studio) return <ErrorMessage error=\"Studio not found.\" />;\n\n  return (\n    <Routes>\n      <Route\n        path=\"/delete\"\n        element={\n          <>\n            <Title page={`Delete \"${studio.name}\"`} />\n            <StudioDelete studio={studio} />\n          </>\n        }\n      />\n      <Route\n        path=\"/edit\"\n        element={\n          <>\n            <Title page={`Edit \"${studio.name}\"`} />\n            <StudioEdit studio={studio} />\n          </>\n        }\n      />\n      <Route\n        path=\"/\"\n        element={\n          <>\n            <Title page={studio.name} />\n            <Studio studio={studio} />\n          </>\n        }\n      />\n    </Routes>\n  );\n};\n\nconst StudioRoutes: FC = () => (\n  <Routes>\n    <Route\n      path=\"/add\"\n      element={\n        <>\n          <Title page=\"Add Studio\" />\n          <StudioAdd />\n        </>\n      }\n    />\n    <Route\n      path=\"/\"\n      element={\n        <>\n          <Title page=\"Studios\" />\n          <Studios />\n        </>\n      }\n    />\n    <Route path=\"/:id/*\" element={<StudioLoader />} />\n  </Routes>\n);\n\nexport default StudioRoutes;\n"
  },
  {
    "path": "frontend/src/pages/studios/studioForm/StudioForm.tsx",
    "content": "import { type FC, useMemo, useState } from \"react\";\nimport { Row, Col, Form, Tab, Tabs } from \"react-bootstrap\";\nimport { Controller, useForm } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { useLens } from \"@hookform/lenses\";\nimport cx from \"classnames\";\nimport { Link } from \"react-router-dom\";\nimport { faExclamationTriangle } from \"@fortawesome/free-solid-svg-icons\";\n\nimport {\n  type StudioEditDetailsInput,\n  ValidSiteTypeEnum,\n  type StudioFragment as Studio,\n  type ImageFragment,\n} from \"src/graphql\";\nimport { Icon } from \"src/components/fragments\";\nimport StudioSelect from \"src/components/studioSelect\";\nimport EditImages from \"src/components/editImages\";\nimport { EditNote, NavButtons, SubmitButtons } from \"src/components/form\";\nimport URLInput from \"src/components/urlInput\";\nimport { renderStudioDetails } from \"src/components/editCard/ModifyEdit\";\n\nimport { StudioSchema, type StudioFormData } from \"./schema\";\nimport type { InitialStudio } from \"./types\";\nimport DiffStudio from \"./diff\";\nimport { useBeforeUnload } from \"src/hooks/useBeforeUnload\";\nimport MultiSelect from \"src/components/multiSelect\";\n\ninterface StudioProps {\n  studio?: Studio | null;\n  callback: (data: StudioEditDetailsInput, editNote: string) => void;\n  showNetworkSelect?: boolean;\n  initial?: InitialStudio;\n  saving: boolean;\n}\n\nconst StudioForm: FC<StudioProps> = ({\n  studio,\n  callback,\n  showNetworkSelect = true,\n  initial,\n  saving,\n}) => {\n  useBeforeUnload();\n  const initialAliases = initial?.aliases ?? studio?.aliases ?? [];\n  const {\n    register,\n    control,\n    handleSubmit,\n    watch,\n    formState: { errors },\n  } = useForm({\n    resolver: yupResolver(StudioSchema),\n    defaultValues: {\n      name: initial?.name ?? studio?.name,\n      aliases: initialAliases,\n      images: initial?.images ?? studio?.images ?? [],\n      urls: initial?.urls ?? studio?.urls ?? [],\n      parent: initial?.parent ?? studio?.parent,\n    },\n  });\n\n  const lens = useLens({ control });\n\n  const [file, setFile] = useState<File | undefined>();\n  const fieldData = watch();\n  const [oldStudioChanges, newStudioChanges] = useMemo(\n    () =>\n      DiffStudio(\n        StudioSchema.cast(fieldData, {\n          assert: \"ignore-optionality\",\n        }) as StudioFormData,\n        studio,\n      ),\n    [fieldData, studio],\n  );\n\n  const [activeTab, setActiveTab] = useState(\"details\");\n\n  const onSubmit = (data: StudioFormData) => {\n    const callbackData: StudioEditDetailsInput = {\n      name: data.name,\n      aliases: data.aliases ?? [],\n      urls: data.urls?.map((u) => ({\n        url: u.url,\n        site_id: u.site.id,\n      })),\n      image_ids: data.images.map((i) => i.id),\n      parent_id: data.parent?.id ?? null,\n    };\n    callback(callbackData, data.note);\n  };\n\n  const metadataErrors = [\n    { error: errors.name?.message, tab: \"details\" },\n    {\n      error: errors.urls?.find?.((u) => u?.url?.message)?.url?.message,\n      tab: \"links\",\n    },\n  ].filter((e) => e.error) as { error: string; tab: string }[];\n\n  return (\n    <Form className=\"StudioForm\" onSubmit={handleSubmit(onSubmit)}>\n      <Tabs\n        activeKey={activeTab}\n        onSelect={(key) => key && setActiveTab(key)}\n        className=\"d-flex\"\n      >\n        <Tab eventKey=\"details\" title=\"Details\" className=\"col-xl-6\">\n          <Form.Group controlId=\"name\" className=\"mb-3\">\n            <Form.Label>Name</Form.Label>\n            <Form.Control\n              className={cx({ \"is-invalid\": errors.name })}\n              placeholder=\"Name\"\n              {...register(\"name\")}\n            />\n            <Form.Control.Feedback type=\"invalid\">\n              {errors?.name?.message}\n            </Form.Control.Feedback>\n          </Form.Group>\n\n          <Form.Group controlId=\"aliases\" className=\"mb-3\">\n            <Form.Label>Aliases</Form.Label>\n            <Controller\n              name=\"aliases\"\n              control={control}\n              render={({ field: { onChange } }) => (\n                <MultiSelect\n                  initialValues={initialAliases}\n                  onChange={onChange}\n                  placeholder=\"Enter name...\"\n                />\n              )}\n            />\n            <Form.Control.Feedback type=\"invalid\">\n              {errors?.aliases?.message}\n            </Form.Control.Feedback>\n          </Form.Group>\n\n          {showNetworkSelect && (\n            <Form.Group controlId=\"network\" className=\"mb-3\">\n              <Form.Label>Network</Form.Label>\n              <Controller\n                name=\"parent\"\n                control={control}\n                render={({ field: { onChange, value } }) => (\n                  <StudioSelect\n                    excludeStudio={studio?.id}\n                    initialStudio={value}\n                    onChange={onChange}\n                    isClearable\n                    networkSelect\n                  />\n                )}\n              />\n            </Form.Group>\n          )}\n\n          <NavButtons onNext={() => setActiveTab(\"links\")} />\n        </Tab>\n\n        <Tab eventKey=\"links\" title=\"Links\" className=\"col-xl-9\">\n          <Form.Group className=\"mb-3\">\n            <Form.Label>Links</Form.Label>\n            <URLInput\n              lens={lens.focus(\"urls\").defined()}\n              type={ValidSiteTypeEnum.STUDIO}\n              errors={errors.urls}\n            />\n          </Form.Group>\n\n          <NavButtons onNext={() => setActiveTab(\"images\")} />\n        </Tab>\n\n        <Tab eventKey=\"images\" title=\"Images\" className=\"col-xl-6\">\n          <EditImages\n            lens={lens.focus(\"images\").cast<ImageFragment[]>()}\n            maxImages={1}\n            file={file}\n            setFile={(f) => setFile(f)}\n            allowLossless\n          />\n\n          <NavButtons\n            onNext={() => setActiveTab(\"confirm\")}\n            disabled={!!file}\n          />\n\n          <div className=\"d-flex\">\n            {/* dummy element for feedback */}\n            <div className=\"ms-auto\">\n              <span className={file ? \"is-invalid\" : \"\"} />\n              <Form.Control.Feedback type=\"invalid\">\n                Upload or remove image to continue.\n              </Form.Control.Feedback>\n            </div>\n          </div>\n        </Tab>\n\n        <Tab eventKey=\"confirm\" title=\"Confirm\" className=\"mt-3 col-xl-9\">\n          {renderStudioDetails(newStudioChanges, oldStudioChanges, !!studio)}\n          <Row className=\"my-4\">\n            <Col md={{ span: 8, offset: 4 }}>\n              <EditNote register={register} error={errors.note} />\n            </Col>\n          </Row>\n\n          {metadataErrors.length > 0 && (\n            <div className=\"text-end my-4\">\n              <h6>\n                <Icon icon={faExclamationTriangle} color=\"red\" />\n                <span className=\"ms-1\">Errors</span>\n              </h6>\n              <div className=\"d-flex flex-column text-danger\">\n                {metadataErrors.map(({ error, tab }) => (\n                  <Link to=\"#\" key={error} onClick={() => setActiveTab(tab)}>\n                    {error}\n                  </Link>\n                ))}\n              </div>\n            </div>\n          )}\n\n          <SubmitButtons disabled={!!file || saving} />\n        </Tab>\n      </Tabs>\n    </Form>\n  );\n};\n\nexport default StudioForm;\n"
  },
  {
    "path": "frontend/src/pages/studios/studioForm/diff.ts",
    "content": "import type {\n  OldStudioDetails,\n  StudioDetails,\n} from \"src/components/editCard/ModifyEdit\";\nimport type { StudioFragment } from \"src/graphql\";\nimport type { StudioFormData } from \"./schema\";\nimport { diffValue, diffImages, diffURLs, diffArray } from \"src/utils\";\n\nconst selectStudioDetails = (\n  data: StudioFormData,\n  original: StudioFragment | null | undefined,\n): [Required<OldStudioDetails>, Required<StudioDetails>] => {\n  const [addedImages, removedImages] = diffImages(\n    data.images,\n    original?.images ?? [],\n  );\n  const [addedUrls, removedUrls] = diffURLs(data.urls, original?.urls ?? []);\n  const [addedAliases, removedAliases] = diffArray(\n    data?.aliases,\n    original?.aliases ?? [],\n    (a) => a,\n  );\n\n  return [\n    {\n      name: diffValue(original?.name, data.name),\n      parent:\n        original?.parent?.id !== data.parent?.id &&\n        original?.parent?.id &&\n        original?.parent.name\n          ? {\n              id: original.parent.id,\n              name: original.parent.name,\n            }\n          : null,\n    },\n    {\n      name: diffValue(data.name, original?.name),\n      parent:\n        data.parent?.id !== original?.parent?.id &&\n        data.parent?.id &&\n        data.parent?.name\n          ? {\n              id: data.parent.id,\n              name: data.parent.name,\n            }\n          : null,\n      added_urls: addedUrls,\n      removed_urls: removedUrls,\n      added_images: addedImages,\n      removed_images: removedImages,\n      added_aliases: addedAliases,\n      removed_aliases: removedAliases,\n    },\n  ];\n};\n\nexport default selectStudioDetails;\n"
  },
  {
    "path": "frontend/src/pages/studios/studioForm/index.ts",
    "content": "import StudioForm from \"./StudioForm\";\n\nexport default StudioForm;\n"
  },
  {
    "path": "frontend/src/pages/studios/studioForm/schema.ts",
    "content": "import * as yup from \"yup\";\n\nexport const StudioSchema = yup.object({\n  name: yup.string().trim().required(\"Name is required\"),\n  aliases: yup.array().of(yup.string().trim().ensure()).ensure().default([]),\n  urls: yup\n    .array()\n    .of(\n      yup.object({\n        url: yup.string().url(\"Invalid URL\").required(),\n        site: yup\n          .object({\n            id: yup.string().required(),\n            name: yup.string().required(),\n            icon: yup.string().required(),\n          })\n          .required(),\n      }),\n    )\n    .ensure(),\n  images: yup\n    .array()\n    .of(\n      yup.object({\n        id: yup.string().required(),\n        url: yup.string().required(),\n        width: yup.number().required(),\n        height: yup.number().required(),\n      }),\n    )\n    .required(),\n  parent: yup\n    .object({\n      id: yup.string().required(),\n      name: yup.string().required(),\n    })\n    .nullable()\n    .default(null),\n  note: yup.string().required(\"Edit note is required\"),\n});\n\nexport type StudioFormData = yup.Asserts<typeof StudioSchema>;\n"
  },
  {
    "path": "frontend/src/pages/studios/studioForm/types.ts",
    "content": "export type InitialStudio = {\n  name?: string | null;\n  aliases?: string[];\n  parent?: {\n    id: string;\n    name: string;\n  } | null;\n  images?: {\n    id: string;\n    height: number;\n    width: number;\n    url: string;\n  }[];\n  urls?: {\n    url: string;\n    site: {\n      id: string;\n      name: string;\n    };\n  }[];\n};\n"
  },
  {
    "path": "frontend/src/pages/studios/styles.scss",
    "content": ".studio-photo {\n  flex-grow: 1;\n  margin-right: 1rem;\n  max-height: 100px;\n  text-align: right;\n\n  img {\n    max-height: 100%;\n    max-width: 32rem;\n  }\n}\n\n.sub-studio-list {\n  margin-bottom: 1rem;\n  max-height: 15rem;\n  overflow-y: auto;\n\n  ul {\n    column-count: 3;\n    margin-bottom: 0;\n  }\n}\n\n.StudioForm {\n  .EditImages {\n    &-images,\n    &-input {\n      flex: unset;\n      width: unset;\n    }\n\n    &-drop {\n      height: 200px;\n      padding: 1rem;\n    }\n  }\n}\n"
  },
  {
    "path": "frontend/src/pages/tags/Tag.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link, useLocation, useNavigate } from \"react-router-dom\";\nimport { Button, Tab, Tabs } from \"react-bootstrap\";\n\nimport {\n  usePendingEditsCount,\n  CriterionModifier,\n  TargetTypeEnum,\n  type TagFragment as Tag,\n} from \"src/graphql\";\n\nimport { Tooltip } from \"src/components/fragments\";\nimport { EditList, SceneList } from \"src/components/list\";\nimport { createHref, tagHref, formatPendingEdits } from \"src/utils\";\nimport {\n  ROUTE_TAG_EDIT,\n  ROUTE_TAG_MERGE,\n  ROUTE_TAG_DELETE,\n  ROUTE_CATEGORY,\n} from \"src/constants/route\";\nimport { useCurrentUser } from \"src/hooks\";\n\nconst DEFAULT_TAB = \"scenes\";\n\ninterface Props {\n  tag: Tag;\n}\n\nconst TagComponent: FC<Props> = ({ tag }) => {\n  const { isTagEditor } = useCurrentUser();\n  const navigate = useNavigate();\n  const location = useLocation();\n  const activeTab = location.hash?.slice(1) || DEFAULT_TAB;\n\n  const { data: editData } = usePendingEditsCount({\n    type: TargetTypeEnum.TAG,\n    id: tag.id,\n  });\n  const pendingEditCount = editData?.queryEdits.count;\n\n  const setTab = (tab: string | null) =>\n    navigate({ hash: tab === DEFAULT_TAB ? \"\" : `#${tab}` });\n\n  return (\n    <>\n      <div className=\"d-flex\">\n        <h3>\n          <span className=\"me-2\">Tag:</span>\n          {tag.deleted ? <del>{tag.name}</del> : <em>{tag.name}</em>}\n        </h3>\n        {isTagEditor && !tag.deleted && (\n          <div className=\"ms-auto\">\n            <Link to={tagHref(tag, ROUTE_TAG_EDIT)} className=\"ms-2\">\n              <Button>Edit</Button>\n            </Link>\n            <Link to={tagHref(tag, ROUTE_TAG_MERGE)} className=\"ms-2\">\n              <Tooltip\n                text={\n                  <>\n                    Merge other tags into <b>{tag.name}</b>\n                  </>\n                }\n              >\n                <Button>Merge</Button>\n              </Tooltip>\n            </Link>\n            <Link to={createHref(ROUTE_TAG_DELETE, tag)} className=\"ms-2\">\n              <Button variant=\"danger\">Delete</Button>\n            </Link>\n          </div>\n        )}\n      </div>\n      {tag.description && (\n        <div className=\"d-flex\">\n          <b className=\"me-2\">Description:</b>\n          <span>{tag.description}</span>\n        </div>\n      )}\n      {tag.category && (\n        <div className=\"d-flex\">\n          <b className=\"me-2\">Category:</b>\n          <Link to={createHref(ROUTE_CATEGORY, tag.category)}>\n            {tag.category.name}\n          </Link>\n        </div>\n      )}\n      {tag.aliases.length > 0 && (\n        <div className=\"d-flex\">\n          <b className=\"me-2\">Aliases:</b>\n          <span>{tag.aliases.join(\", \")}</span>\n        </div>\n      )}\n      <hr className=\"my-2\" />\n      <Tabs activeKey={activeTab} id=\"tag-tabs\" mountOnEnter onSelect={setTab}>\n        <Tab eventKey=\"scenes\" title=\"Scenes\">\n          <SceneList\n            tagsFilter={{\n              value: [tag.id],\n              modifier: CriterionModifier.INCLUDES,\n            }}\n            favoriteFilter=\"all\"\n          />\n        </Tab>\n        <Tab\n          eventKey=\"edits\"\n          title={`Edits${formatPendingEdits(pendingEditCount)}`}\n          tabClassName={pendingEditCount ? \"PendingEditTab\" : \"\"}\n        >\n          <EditList type={TargetTypeEnum.TAG} id={tag.id} />\n        </Tab>\n      </Tabs>\n    </>\n  );\n};\n\nexport default TagComponent;\n"
  },
  {
    "path": "frontend/src/pages/tags/TagAdd.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  useTagEdit,\n  OperationEnum,\n  type TagEditDetailsInput,\n} from \"src/graphql\";\n\nimport { editHref } from \"src/utils\";\nimport TagForm from \"./tagForm\";\n\nconst TagAddComponent: FC = () => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [insertTagEdit, { loading: saving }] = useTagEdit({\n    onCompleted: (data) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (data.tagEdit.id) navigate(editHref(data.tagEdit));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  const doInsert = (insertData: TagEditDetailsInput, editNote: string) => {\n    insertTagEdit({\n      variables: {\n        tagData: {\n          edit: {\n            operation: OperationEnum.CREATE,\n            comment: editNote,\n          },\n          details: insertData,\n        },\n      },\n    });\n  };\n\n  return (\n    <div>\n      <h3>Add new tag</h3>\n      <hr />\n      <TagForm callback={doInsert} saving={saving} />\n      {submissionError && (\n        <div className=\"text-danger text-end col-9\">\n          Error: {submissionError}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default TagAddComponent;\n"
  },
  {
    "path": "frontend/src/pages/tags/TagDelete.tsx",
    "content": "import type { FC } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { Button, Col, Form, Row } from \"react-bootstrap\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\n\nimport {\n  useTagEdit,\n  OperationEnum,\n  type TagFragment as Tag,\n} from \"src/graphql\";\nimport { EditNote } from \"src/components/form\";\nimport { editHref } from \"src/utils\";\n\nconst schema = yup.object({\n  id: yup.string().required(),\n  note: yup.string().required(\"An edit note is required.\"),\n});\nexport type FormData = yup.Asserts<typeof schema>;\n\ninterface Props {\n  tag: Tag;\n}\n\nconst TagDelete: FC<Props> = ({ tag }) => {\n  const navigate = useNavigate();\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm<FormData>({\n    resolver: yupResolver(schema),\n    mode: \"onBlur\",\n  });\n  const [deleteTagEdit, { loading: deleting }] = useTagEdit({\n    onCompleted: (data) => {\n      if (data.tagEdit.id) navigate(editHref(data.tagEdit));\n    },\n  });\n\n  const handleDelete = (data: FormData) =>\n    deleteTagEdit({\n      variables: {\n        tagData: {\n          edit: {\n            operation: OperationEnum.DESTROY,\n            id: data.id,\n            comment: data.note,\n          },\n        },\n      },\n    });\n\n  return (\n    <Form className=\"TagDeleteForm\" onSubmit={handleSubmit(handleDelete)}>\n      <Row>\n        <h4>\n          Delete tag <em>{tag.name}</em>\n        </h4>\n      </Row>\n      <Form.Control type=\"hidden\" value={tag.id} {...register(\"id\")} />\n      <Row className=\"my-4\">\n        <Col md={6}>\n          <EditNote register={register} error={errors.note} />\n          <div className=\"d-flex mt-2\">\n            <Button\n              variant=\"danger\"\n              className=\"ms-auto me-2\"\n              onClick={() => navigate(-1)}\n            >\n              Cancel\n            </Button>\n            <Button\n              type=\"submit\"\n              disabled\n              className=\"d-none\"\n              aria-hidden=\"true\"\n            />\n            <Button type=\"submit\" disabled={deleting}>\n              Submit Edit\n            </Button>\n          </div>\n        </Col>\n      </Row>\n    </Form>\n  );\n};\n\nexport default TagDelete;\n"
  },
  {
    "path": "frontend/src/pages/tags/TagEdit.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  useTagEdit,\n  OperationEnum,\n  type TagEditDetailsInput,\n  type TagFragment as Tag,\n} from \"src/graphql\";\n\nimport { ROUTE_EDIT } from \"src/constants/route\";\nimport { createHref } from \"src/utils/route\";\nimport TagForm from \"./tagForm\";\n\ninterface Props {\n  tag: Tag;\n}\n\nconst TagEdit: FC<Props> = ({ tag }) => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [insertTagEdit, { loading: saving }] = useTagEdit({\n    onCompleted: (data) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (data.tagEdit.id) navigate(createHref(ROUTE_EDIT, data.tagEdit));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  const doUpdate = (insertData: TagEditDetailsInput, editNote: string) => {\n    insertTagEdit({\n      variables: {\n        tagData: {\n          edit: {\n            id: tag.id,\n            operation: OperationEnum.MODIFY,\n            comment: editNote,\n          },\n          details: insertData,\n        },\n      },\n    });\n  };\n\n  return (\n    <div>\n      <h3>Edit tag</h3>\n      <hr />\n      <TagForm tag={tag} callback={doUpdate} saving={saving} />\n      {submissionError && (\n        <div className=\"text-danger col-9\">Error: {submissionError}</div>\n      )}\n    </div>\n  );\n};\n\nexport default TagEdit;\n"
  },
  {
    "path": "frontend/src/pages/tags/TagEditUpdate.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport {\n  useTagEditUpdate,\n  type TagEditDetailsInput,\n  type EditUpdateQuery,\n} from \"src/graphql\";\nimport { createHref, isTag, isTagEdit } from \"src/utils\";\nimport TagForm from \"./tagForm\";\n\ntype EditUpdate = NonNullable<EditUpdateQuery[\"findEdit\"]>;\n\nimport { ROUTE_EDIT } from \"src/constants\";\nimport Title from \"src/components/title\";\n\nexport const TagEditUpdate: FC<{ edit: EditUpdate }> = ({ edit }) => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [updateTagEdit, { loading: saving }] = useTagEditUpdate({\n    onCompleted: (result) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (result.tagEditUpdate.id)\n        navigate(createHref(ROUTE_EDIT, result.tagEditUpdate));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  if (!isTagEdit(edit.details) || (edit.target && !isTag(edit.target)))\n    return null;\n\n  const doUpdate = (updateData: TagEditDetailsInput, editNote: string) => {\n    updateTagEdit({\n      variables: {\n        id: edit.id,\n        tagData: {\n          edit: {\n            id: edit.target?.id,\n            operation: edit.operation,\n            comment: editNote,\n            merge_source_ids: edit.merge_sources.map((s) => s.id),\n          },\n          details: updateData,\n        },\n      },\n    });\n  };\n\n  const tagName = edit.target?.name ?? edit.details.name;\n\n  return (\n    <div>\n      <Title page={`Update tag edit for \"${tagName}\"`} />\n      <h3>\n        Update tag edit for\n        <i className=\"ms-2\">\n          <b>{tagName}</b>\n        </i>\n      </h3>\n      <hr />\n      <TagForm\n        tag={edit.target}\n        initial={edit.details}\n        callback={doUpdate}\n        saving={saving}\n      />\n      {submissionError && (\n        <div className=\"text-danger text-end col-9\">\n          Error: {submissionError}\n        </div>\n      )}\n    </div>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/tags/TagMerge.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { Col, Row } from \"react-bootstrap\";\nimport { flatMap, uniq } from \"lodash-es\";\n\nimport {\n  useTagEdit,\n  OperationEnum,\n  type TagEditDetailsInput,\n  type TagFragment as Tag,\n} from \"src/graphql\";\n\nimport TagSelect from \"src/components/tagSelect\";\nimport { editHref } from \"src/utils\";\nimport TagForm from \"./tagForm\";\n\ninterface Props {\n  tag: Tag;\n}\n\ntype TagSlim = {\n  id: string;\n  name: string;\n  aliases: string[];\n};\n\nconst TagMerge: FC<Props> = ({ tag }) => {\n  const navigate = useNavigate();\n  const [submissionError, setSubmissionError] = useState(\"\");\n  const [mergeSources, setMergeSources] = useState<TagSlim[]>([]);\n  const [insertTagEdit, { loading: saving }] = useTagEdit({\n    onCompleted: (data) => {\n      if (submissionError) setSubmissionError(\"\");\n      if (data.tagEdit.id) navigate(editHref(data.tagEdit));\n    },\n    onError: (error) => setSubmissionError(error.message),\n  });\n\n  const doUpdate = (insertData: TagEditDetailsInput, editNote: string) => {\n    insertTagEdit({\n      variables: {\n        tagData: {\n          edit: {\n            id: tag.id,\n            operation: OperationEnum.MERGE,\n            merge_source_ids: mergeSources.map((t) => t.id),\n            comment: editNote,\n          },\n          details: insertData,\n        },\n      },\n    });\n  };\n\n  const aliases = uniq([\n    ...tag.aliases,\n    ...mergeSources.map((t) => t.name),\n    ...flatMap(mergeSources, (t) => t.aliases),\n  ]);\n\n  return (\n    <div>\n      <h3>\n        Merge tags into <em>{tag.name}</em>\n      </h3>\n      <hr />\n      <Row className=\"g-0\">\n        <Col xs={6}>\n          <TagSelect\n            tags={[]}\n            onChange={(tags) => setMergeSources(tags)}\n            message=\"Select tags to merge:\"\n            excludeTags={[tag.id, ...mergeSources.map((t) => t.id)]}\n          />\n        </Col>\n      </Row>\n      <hr className=\"my-4\" />\n      <h5>\n        Modify <em>{tag.name}</em>\n      </h5>\n      <Row className=\"g-0\">\n        {submissionError && (\n          <div className=\"text-danger mb-2\">Error: {submissionError}</div>\n        )}\n        <TagForm\n          tag={tag}\n          callback={doUpdate}\n          saving={saving}\n          initial={{ aliases }}\n        />\n      </Row>\n    </div>\n  );\n};\n\nexport default TagMerge;\n"
  },
  {
    "path": "frontend/src/pages/tags/Tags.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\n\nimport { TagList } from \"src/components/list\";\nimport { createHref } from \"src/utils\";\nimport { ROUTE_TAG_ADD } from \"src/constants/route\";\nimport { useCurrentUser } from \"src/hooks\";\n\nconst Tags: FC = () => {\n  const { isTagEditor } = useCurrentUser();\n  return (\n    <>\n      <div className=\"d-flex\">\n        <h3>Tags</h3>\n        {isTagEditor && (\n          <Link to={createHref(ROUTE_TAG_ADD)} className=\"ms-auto\">\n            <Button className=\"ms-auto\">Create</Button>\n          </Link>\n        )}\n      </div>\n      <TagList tagFilter={{}} showCategoryLink />\n    </>\n  );\n};\n\nexport default Tags;\n"
  },
  {
    "path": "frontend/src/pages/tags/index.tsx",
    "content": "import type { FC } from \"react\";\nimport { Route, Routes, useParams } from \"react-router-dom\";\n\nimport { useTag } from \"src/graphql\";\nimport Title from \"src/components/title\";\nimport { ErrorMessage, LoadingIndicator } from \"src/components/fragments\";\n\nimport Tag from \"./Tag\";\nimport Tags from \"./Tags\";\nimport TagAdd from \"./TagAdd\";\nimport TagEdit from \"./TagEdit\";\nimport TagMerge from \"./TagMerge\";\nimport TagDelete from \"./TagDelete\";\n\nconst TagLoader: FC = () => {\n  const { id } = useParams<{ id: string }>();\n  const { data, loading } = useTag({ id });\n\n  if (loading) return <LoadingIndicator message=\"Loading tag...\" />;\n\n  if (!id) return <ErrorMessage error=\"Tag ID is missing\" />;\n\n  const tag = data?.findTag;\n  if (!tag) return <ErrorMessage error=\"Tag not found.\" />;\n\n  return (\n    <Routes>\n      <Route\n        path=\"/merge\"\n        element={\n          <>\n            <Title page={`Merge Tag \"${tag.name}\"`} />\n            <TagMerge tag={tag} />\n          </>\n        }\n      />\n      <Route\n        path=\"/delete\"\n        element={\n          <>\n            <Title page={`Delete Tag \"${tag.name}\"`} />\n            <TagDelete tag={tag} />\n          </>\n        }\n      />\n      <Route\n        path=\"/edit\"\n        element={\n          <>\n            <Title page={`Edit Tag \"${tag.name}\"`} />\n            <TagEdit tag={tag} />\n          </>\n        }\n      />\n      <Route\n        path=\"/\"\n        element={\n          <>\n            <Title page={`Tag \"${tag.name}\"`} />\n            <Tag tag={tag} />\n          </>\n        }\n      />\n    </Routes>\n  );\n};\n\nconst TagRoutes: FC = () => (\n  <Routes>\n    <Route\n      path=\"/\"\n      element={\n        <>\n          <Title page=\"Tags\" />\n          <Tags />\n        </>\n      }\n    />\n    <Route\n      path=\"/add\"\n      element={\n        <>\n          <Title page=\"Add Tag\" />\n          <TagAdd />\n        </>\n      }\n    />\n    <Route path=\"/:id/*\" element={<TagLoader />} />\n  </Routes>\n);\n\nexport default TagRoutes;\n"
  },
  {
    "path": "frontend/src/pages/tags/tagForm/TagForm.tsx",
    "content": "import type { FC } from \"react\";\nimport { useForm, Controller, type FieldError } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport cx from \"classnames\";\nimport { Button, Form } from \"react-bootstrap\";\nimport Select from \"react-select\";\nimport { groupBy, sortBy } from \"lodash-es\";\n\nimport {\n  useCategories,\n  type TagEditDetailsInput,\n  type TagFragment as Tag,\n} from \"src/graphql\";\n\nimport { EditNote } from \"src/components/form\";\nimport { LoadingIndicator } from \"src/components/fragments\";\nimport MultiSelect from \"src/components/multiSelect\";\n\nimport { TagSchema, type TagFormData } from \"./schema\";\nimport type { InitialTag } from \"./types\";\nimport { useBeforeUnload } from \"src/hooks/useBeforeUnload\";\n\ninterface TagProps {\n  tag?: Tag | null;\n  callback: (data: TagEditDetailsInput, editNote: string) => void;\n  initial?: InitialTag;\n  saving: boolean;\n}\n\nconst TagForm: FC<TagProps> = ({ tag, callback, initial, saving }) => {\n  useBeforeUnload();\n  const initialAliases = initial?.aliases ?? tag?.aliases ?? [];\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n    control,\n  } = useForm({\n    resolver: yupResolver(TagSchema),\n    defaultValues: {\n      name: initial?.name ?? tag?.name ?? \"\",\n      description: initial?.description ?? tag?.description ?? \"\",\n      aliases: initialAliases,\n      category: initial?.category ?? tag?.category,\n    },\n  });\n\n  const { loading: loadingCategories, data: categoryData } = useCategories();\n\n  if (loadingCategories)\n    return <LoadingIndicator message=\"Loading tag categories...\" />;\n\n  const onSubmit = (data: TagFormData) => {\n    const callbackData: TagEditDetailsInput = {\n      name: data.name,\n      description: data.description ?? null,\n      aliases: data.aliases ?? [],\n      category_id: data.category?.id,\n    };\n    callback(callbackData, data.note);\n  };\n\n  const categories = (\n    categoryData?.queryTagCategories.tag_categories ?? []\n  ).map((cat) => ({\n    label: cat.name,\n    value: cat.id,\n    group: cat.group,\n  }));\n  const grouped = groupBy(categories, (cat) => cat.group);\n  const categoryObj = sortBy(Object.keys(grouped)).map((groupName) => ({\n    label: groupName,\n    options: sortBy(grouped[groupName], (cat) => cat.label),\n  }));\n\n  return (\n    <Form className=\"TagForm w-50\" onSubmit={handleSubmit(onSubmit)}>\n      <Form.Group controlId=\"name\" className=\"mb-3\">\n        <Form.Label>Name</Form.Label>\n        <Form.Control\n          type=\"text\"\n          className={cx({ \"is-invalid\": errors.name })}\n          placeholder=\"Name\"\n          {...register(\"name\")}\n        />\n        <div className=\"invalid-feedback\">{errors?.name?.message}</div>\n      </Form.Group>\n\n      <Form.Group controlId=\"description\" className=\"mb-3\">\n        <Form.Label>Description</Form.Label>\n        <Form.Control placeholder=\"Description\" {...register(\"description\")} />\n      </Form.Group>\n\n      <Form.Group className=\"mb-3\">\n        <Form.Label>Aliases</Form.Label>\n        <Controller\n          name=\"aliases\"\n          control={control}\n          render={({ field: { onChange } }) => (\n            <MultiSelect\n              initialValues={initialAliases}\n              onChange={onChange}\n              placeholder=\"Enter name...\"\n            />\n          )}\n        />\n      </Form.Group>\n\n      <Form.Group className=\"mb-3\">\n        <Form.Label>Category</Form.Label>\n        <Controller\n          name=\"category\"\n          control={control}\n          render={({ field: { onChange, value } }) => (\n            <Select\n              classNamePrefix=\"react-select\"\n              className={cx({ \"is-invalid\": errors.category })}\n              onChange={(opt) =>\n                onChange(opt ? { id: opt.value, name: opt.label } : null)\n              }\n              options={categoryObj}\n              isClearable\n              placeholder=\"Category\"\n              defaultValue={\n                value ? categories.find((s) => s.value === value.id) : null\n              }\n            />\n          )}\n        />\n        <div className=\"invalid-feedback\">\n          {(errors?.category as FieldError | undefined)?.message}\n        </div>\n      </Form.Group>\n\n      <EditNote register={register} error={errors.note} />\n\n      <Form.Group className=\"d-flex mb-3\">\n        <Button type=\"submit\" disabled className=\"d-none\" aria-hidden=\"true\" />\n        <Button type=\"submit\" disabled={saving}>\n          Submit Edit\n        </Button>\n        <Button type=\"reset\" className=\"ms-auto me-2\">\n          Reset\n        </Button>\n        <Button variant=\"danger\" onClick={() => history.back()}>\n          Cancel\n        </Button>\n      </Form.Group>\n    </Form>\n  );\n};\n\nexport default TagForm;\n"
  },
  {
    "path": "frontend/src/pages/tags/tagForm/diff.ts",
    "content": "import type {\n  OldTagDetails,\n  TagDetails,\n} from \"src/components/editCard/ModifyEdit\";\nimport type { TagFragment as Tag } from \"src/graphql\";\nimport type { TagFormData } from \"./schema\";\nimport { diffValue, diffArray } from \"src/utils\";\n\nconst selectTagDetails = (\n  data: TagFormData,\n  original: Tag,\n): [Required<OldTagDetails>, Required<TagDetails>] => {\n  const [addedAliases, removedAliases] = diffArray(\n    data?.aliases,\n    original.aliases,\n    (a) => a,\n  );\n\n  return [\n    {\n      name: diffValue(original.name, data.name),\n      description: diffValue(original.description, data.description),\n      category:\n        original.category?.id !== data.category?.id &&\n        original.category?.id &&\n        original.category.name\n          ? {\n              id: original.category.id,\n              name: original.category.name,\n            }\n          : null,\n    },\n    {\n      name: diffValue(data.name, original.name),\n      description: diffValue(data.description, original.description),\n      category:\n        data.category?.id !== original.category?.id &&\n        data.category?.id &&\n        data.category?.name\n          ? {\n              id: data.category?.id,\n              name: data.category?.name,\n            }\n          : null,\n      added_aliases: addedAliases,\n      removed_aliases: removedAliases,\n    },\n  ];\n};\n\nexport default selectTagDetails;\n"
  },
  {
    "path": "frontend/src/pages/tags/tagForm/index.ts",
    "content": "import TagForm from \"./TagForm\";\n\nexport default TagForm;\n"
  },
  {
    "path": "frontend/src/pages/tags/tagForm/schema.ts",
    "content": "import * as yup from \"yup\";\n\nexport const TagSchema = yup.object({\n  name: yup.string().trim().required(\"Name is required\"),\n  description: yup.string().trim(),\n  aliases: yup.array().of(yup.string().trim().ensure()).ensure().default([]),\n  category: yup\n    .object({\n      id: yup.string().required(),\n      name: yup.string().required(),\n    })\n    .nullable()\n    .default(null),\n  note: yup.string().required(\"Edit note is required\"),\n});\n\nexport type TagFormData = yup.Asserts<typeof TagSchema>;\n"
  },
  {
    "path": "frontend/src/pages/tags/tagForm/types.ts",
    "content": "export type InitialTag = {\n  name?: string | null;\n  description?: string | null;\n  aliases?: string[];\n  category?: {\n    id: string;\n    name: string;\n  } | null;\n};\n"
  },
  {
    "path": "frontend/src/pages/users/GenerateInviteKeyModal.tsx",
    "content": "import { type FC, useState, useMemo } from \"react\";\nimport { Modal, Button, Form } from \"react-bootstrap\";\nimport type { GenerateInviteCodeInput } from \"src/graphql\";\nimport { formatDateTime } from \"src/utils\";\n\ninterface ModalProps {\n  callback: (input?: GenerateInviteCodeInput) => void;\n}\n\nconst ms = 1000;\nconst minutesInSeconds = 60;\nconst hoursInSeconds = 60 * minutesInSeconds;\nconst daysInSeconds = 24 * hoursInSeconds;\nconst yearsInSeconds = 365 * daysInSeconds;\n\nexport const GenerateInviteKeyModal: FC<ModalProps> = ({ callback }) => {\n  const [keyAmount, setKeyAmount] = useState(1);\n  const [keyUses, setKeyUses] = useState(1);\n  const [keyExpireAmount, setKeyExpireAmount] = useState(30);\n  const [keyExpireUnit, setKeyExpireUnit] = useState(daysInSeconds);\n\n  const handleCancel = () => callback();\n  const handleAccept = () =>\n    callback({\n      keys: keyAmount,\n      uses: keyUses,\n      ttl: keyExpireAmount * keyExpireUnit,\n    });\n\n  const expireTime = useMemo(() => {\n    const ret = new Date();\n    ret.setTime(ret.getTime() + keyExpireAmount * keyExpireUnit * ms);\n    return ret;\n  }, [keyExpireAmount, keyExpireUnit]);\n\n  return (\n    <Modal show onHide={handleCancel}>\n      <Modal.Header closeButton>\n        <b>Generate Invite Keys</b>\n      </Modal.Header>\n      <Modal.Body>\n        <Form>\n          <Form.Group controlId=\"key-amount\">\n            <Form.Label>Amount of Keys</Form.Label>\n            <Form.Control\n              value={keyAmount}\n              onChange={(e) =>\n                setKeyAmount(parseInt(e.currentTarget.value, 10))\n              }\n              type=\"number\"\n              min={1}\n              max={100}\n              placeholder=\"Enter number of keys\"\n            />\n          </Form.Group>\n          <Form.Group controlId=\"key-uses\" className=\"mt-4\">\n            <Form.Label>Uses per key</Form.Label>\n            <Form.Control\n              value={keyUses}\n              onChange={(e) => setKeyUses(parseInt(e.currentTarget.value, 10))}\n              type=\"number\"\n              min={0}\n              max={100}\n              placeholder=\"Uses per key\"\n            />\n            <Form.Text className=\"text-muted\">\n              Enter 0 for unlimited uses.\n            </Form.Text>\n          </Form.Group>\n          <Form.Group controlId=\"key-expiration\" className=\"mt-4\">\n            <Form.Label>Expire time</Form.Label>\n            <Form.Control\n              type=\"number\"\n              min={1}\n              value={keyExpireAmount}\n              onChange={(e) =>\n                setKeyExpireAmount(parseInt(e.currentTarget.value, 10))\n              }\n            />\n            <Form.Select\n              value={keyExpireUnit}\n              onChange={(e) => {\n                setKeyExpireUnit(parseInt(e.currentTarget.value, 10));\n              }}\n              className=\"mt-2\"\n            >\n              <option value={minutesInSeconds}>Minutes</option>\n              <option value={hoursInSeconds}>Hours</option>\n              <option value={daysInSeconds}>Days</option>\n              <option value={yearsInSeconds}>Years</option>\n            </Form.Select>\n            <Form.Text className=\"text-muted\">\n              Expires at {formatDateTime(expireTime)}\n            </Form.Text>\n          </Form.Group>\n        </Form>\n      </Modal.Body>\n      <Modal.Footer>\n        <Button variant=\"primary\" onClick={handleAccept}>\n          Generate\n        </Button>\n        <Button variant=\"secondary\" onClick={handleCancel}>\n          Cancel\n        </Button>\n      </Modal.Footer>\n    </Modal>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/users/User.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Button, Col, Form, InputGroup, Row, Table } from \"react-bootstrap\";\nimport {\n  faMinus,\n  faPlus,\n  faSyncAlt,\n  faTrash,\n} from \"@fortawesome/free-solid-svg-icons\";\nimport { sortBy } from \"lodash-es\";\n\nimport {\n  VoteStatusEnum,\n  VoteTypeEnum,\n  useConfig,\n  useDeleteUser,\n  useRegenerateAPIKey,\n  useRescindInviteCode,\n  useGrantInvite,\n  useRevokeInvite,\n  type UserQuery,\n  type PublicUserQuery,\n  useGenerateInviteCodes,\n  type GenerateInviteCodeInput,\n  useRequestChangeEmail,\n} from \"src/graphql\";\nimport { useCurrentUser, useToast } from \"src/hooks\";\nimport {\n  ROUTE_USER_EDIT,\n  ROUTE_USER_PASSWORD,\n  ROUTE_USERS,\n  ROUTE_USER_EDITS,\n  ROUTE_USER_MY_FINGERPRINTS,\n} from \"src/constants/route\";\nimport Modal from \"src/components/modal\";\nimport { Icon, Tooltip } from \"src/components/fragments\";\nimport { isPrivateUser, createHref, formatDateTime } from \"src/utils\";\nimport { EditStatusTypes, VoteTypes } from \"src/constants\";\nimport { GenerateInviteKeyModal } from \"./GenerateInviteKeyModal\";\nimport { CombinedGraphQLErrors } from \"@apollo/client\";\n\ninterface IInviteKeys {\n  id: string;\n  uses?: number | null | undefined;\n  expires?: string | null | undefined;\n}\n\ninterface UserInviteKeysProps {\n  inviteCodes: IInviteKeys[];\n  rescindInvite: (id: string) => void;\n}\n\nconst UserInviteKeys: FC<UserInviteKeysProps> = ({\n  inviteCodes,\n  rescindInvite,\n}) => {\n  if (inviteCodes.length === 0) return null;\n\n  return (\n    <Table>\n      <thead>\n        <tr>\n          <th>Code</th>\n          <th>Uses</th>\n          <th>Expires</th>\n          <th></th>\n        </tr>\n      </thead>\n      <tbody>\n        {inviteCodes.map((ic) => (\n          <tr key={ic.id}>\n            <td>\n              <InputGroup className=\"mb-2\">\n                <InputGroup.Text>\n                  <code>{ic.id}</code>\n                </InputGroup.Text>\n                <Button onClick={() => navigator.clipboard?.writeText(ic.id)}>\n                  Copy\n                </Button>\n              </InputGroup>\n            </td>\n            <td>{(ic.uses ?? 0) === 0 ? \"unlimited\" : ic.uses}</td>\n            <td>\n              {ic.expires ? (\n                <span>{formatDateTime(ic.expires, true)}</span>\n              ) : (\n                \"never\"\n              )}\n            </td>\n            <td>\n              <Button variant=\"danger\" onClick={() => rescindInvite(ic.id)}>\n                <Icon icon={faTrash} />\n              </Button>\n            </td>\n          </tr>\n        ))}\n      </tbody>\n    </Table>\n  );\n};\n\ntype User = NonNullable<UserQuery[\"findUser\"]>;\ntype EditCounts = User[\"edit_count\"];\ntype VoteCounts = User[\"vote_count\"];\n\ntype PublicUser = NonNullable<PublicUserQuery[\"findUser\"]>;\n\ntype EditCount = [VoteStatusEnum, number];\nconst filterEdits = (editCount: EditCounts): EditCount[] => {\n  const edits = Object.entries(editCount)\n    .map(([status, count]) => {\n      const resolvedStatus =\n        VoteStatusEnum[status.toUpperCase() as VoteStatusEnum];\n      return resolvedStatus\n        ? [EditStatusTypes[resolvedStatus], count]\n        : undefined;\n    })\n    .filter((val): val is EditCount => val !== undefined);\n  return sortBy(edits, (value) => value[0]);\n};\n\ntype VoteCount = [VoteTypeEnum, number];\nconst filterVotes = (voteCount: VoteCounts): VoteCount[] => {\n  const votes = Object.entries(voteCount)\n    .map(([status, count]) => {\n      const resolvedStatus = VoteTypeEnum[status.toUpperCase() as VoteTypeEnum];\n      return resolvedStatus ? [VoteTypes[resolvedStatus], count] : undefined;\n    })\n    .filter((val): val is VoteCount => val !== undefined);\n  return sortBy(votes, (value) => value[0]);\n};\n\ninterface Props {\n  user: User | PublicUser;\n  refetch: () => void;\n}\n\nconst UserComponent: FC<Props> = ({ user, refetch }) => {\n  const { isAdmin, isSelf } = useCurrentUser();\n  const { data: configData } = useConfig();\n  const [showDelete, setShowDelete] = useState(false);\n  const [showRegenerateAPIKey, setShowRegenerateAPIKey] = useState(false);\n  const [showRescindCode, setShowRescindCode] = useState<string | undefined>();\n  const [showGenerateInviteKey, setShowGenerateInviteKey] = useState(false);\n  const toast = useToast();\n\n  const [deleteUser, { loading: deleting }] = useDeleteUser();\n  const [regenerateAPIKey] = useRegenerateAPIKey();\n  const [rescindInviteCode] = useRescindInviteCode();\n  const [generateInviteCode] = useGenerateInviteCodes();\n  const [grantInvite] = useGrantInvite();\n  const [revokeInvite] = useRevokeInvite();\n  const [requestChangeEmail] = useRequestChangeEmail();\n\n  const showPrivate = isPrivateUser(user);\n  const isOwner = showPrivate && isSelf(user);\n\n  const endpointURL = configData && `${configData.getConfig.host_url}/graphql`;\n\n  const toggleModal = () => setShowDelete(true);\n  const handleDelete = (status: boolean): void => {\n    if (status)\n      deleteUser({ variables: { input: { id: user.id } } }).then(() => {\n        window.location.href = ROUTE_USERS;\n      });\n    setShowDelete(false);\n  };\n  const deleteModal = showDelete && (\n    <Modal\n      message={`Are you sure you want to delete '${user.name}'? This operation cannot be undone.`}\n      callback={handleDelete}\n    />\n  );\n\n  const handleRegenerateAPIKey = (status: boolean): void => {\n    if (status) {\n      const userID = isSelf(user.id) ? null : user.id;\n      regenerateAPIKey({ variables: { user_id: userID } }).then(() => {\n        refetch();\n      });\n    }\n    setShowRegenerateAPIKey(false);\n  };\n  const regenerateAPIKeyModal = showRegenerateAPIKey && (\n    <Modal callback={handleRegenerateAPIKey} acceptTerm=\"Confirm\">\n      <p>\n        Are you sure you want to regenerate the API key? The old key will be\n        removed and can no longer be used.\n      </p>\n      <p>\n        <i>This operation cannot be undone.</i>\n      </p>\n    </Modal>\n  );\n\n  const handleRescindCode = (status: boolean): void => {\n    if (status) {\n      rescindInviteCode({ variables: { code: showRescindCode ?? \"\" } }).then(\n        () => {\n          refetch();\n        },\n      );\n    }\n\n    setShowRescindCode(undefined);\n  };\n  const rescindCodeModal = showRescindCode && (\n    <Modal\n      message={`Are you sure you want to rescind code '${showRescindCode}'? This operation cannot be undone.`}\n      callback={handleRescindCode}\n    />\n  );\n\n  const handleGenerateCode = (input: GenerateInviteCodeInput) => {\n    generateInviteCode({\n      variables: {\n        input,\n      },\n    }).then(() => {\n      refetch();\n    });\n  };\n\n  const generateInviteCodeModal = showGenerateInviteKey && (\n    <GenerateInviteKeyModal\n      callback={(i) => {\n        if (i) {\n          handleGenerateCode(i);\n        }\n        setShowGenerateInviteKey(false);\n      }}\n    />\n  );\n\n  const handleGrantInvite = () => {\n    grantInvite({\n      variables: {\n        input: {\n          amount: 1,\n          user_id: user.id,\n        },\n      },\n    }).then(() => {\n      refetch();\n    });\n  };\n\n  const handleRevokeInvite = () => {\n    revokeInvite({\n      variables: {\n        input: {\n          amount: 1,\n          user_id: user.id,\n        },\n      },\n    }).then(() => {\n      refetch();\n    });\n  };\n\n  const handleChangeEmail = () => {\n    requestChangeEmail()\n      .then(() => {\n        toast({\n          variant: \"success\",\n          content: (\n            <>\n              <h5>Change email</h5>\n              <div>Please check your existing email to continue.</div>\n            </>\n          ),\n        });\n      })\n      .catch((error: unknown) => {\n        let message: React.ReactNode | string | undefined =\n          CombinedGraphQLErrors.is(error) && error.message;\n        if (message === \"pending-email-change\")\n          message = (\n            <>\n              <h5>Pending email change</h5>\n              <div>Email change already requested. Please try again later.</div>\n            </>\n          );\n        toast({ variant: \"danger\", content: message });\n      });\n  };\n\n  const editCount = filterEdits(user.edit_count);\n  const voteCount = filterVotes(user.vote_count);\n\n  return (\n    <Row className=\"justify-content-center\">\n      <Col lg={10}>\n        <div className=\"d-flex\">\n          <h3>{user.name}</h3>\n          {deleteModal}\n          {regenerateAPIKeyModal}\n          {generateInviteCodeModal}\n          {rescindCodeModal}\n          <div className=\"ms-auto\">\n            <Link to={createHref(ROUTE_USER_EDITS, user)} className=\"ms-2\">\n              <Button variant=\"secondary\">User Edits</Button>\n            </Link>\n            {isOwner && (\n              <>\n                <Link to={ROUTE_USER_MY_FINGERPRINTS} className=\"ms-2\">\n                  <Button variant=\"secondary\">My Fingerprints</Button>\n                </Link>\n                <Link to={ROUTE_USER_PASSWORD} className=\"ms-2\">\n                  <Button>Change Password</Button>\n                </Link>\n              </>\n            )}\n            {isOwner && (\n              <Button onClick={() => handleChangeEmail()} className=\"ms-2\">\n                Change Email\n              </Button>\n            )}\n            {isAdmin && (\n              <>\n                <Link to={createHref(ROUTE_USER_EDIT, user)} className=\"ms-2\">\n                  <Button>Edit User</Button>\n                </Link>\n                <Button\n                  className=\"ms-2\"\n                  variant=\"danger\"\n                  disabled={showDelete || deleting}\n                  onClick={toggleModal}\n                >\n                  Delete User\n                </Button>\n              </>\n            )}\n          </div>\n        </div>\n        <hr />\n        {showPrivate && (\n          <>\n            <Row>\n              <Col xs={2}>Email</Col>\n              <Col>{user.email}</Col>\n            </Row>\n            <Row>\n              <Col xs={2}>Roles</Col>\n              <Col>{(user.roles ?? []).join(\", \")}</Col>\n            </Row>\n            <Row className=\"my-3 align-items-baseline\">\n              <Col xs={2}>API key</Col>\n              <Col xs={10}>\n                <InputGroup>\n                  <Form.Control value={user.api_key ?? \"\"} disabled />\n                  <Button\n                    onClick={() =>\n                      navigator.clipboard?.writeText(user.api_key ?? \"\")\n                    }\n                  >\n                    Copy to Clipboard\n                  </Button>\n                  <Tooltip text=\"Regenerate API Key\" placement=\"top-end\">\n                    <Button\n                      variant=\"danger\"\n                      disabled={showRegenerateAPIKey}\n                      onClick={() => setShowRegenerateAPIKey(true)}\n                    >\n                      <Icon icon={faSyncAlt} />\n                    </Button>\n                  </Tooltip>\n                </InputGroup>\n              </Col>\n            </Row>\n            {endpointURL && (\n              <Row className=\"my-3 align-items-baseline\">\n                <Col xs={2}>GraphQL Endpoint</Col>\n                <Col xs={10}>\n                  <InputGroup>\n                    <Form.Control value={endpointURL} disabled />\n                    <Button\n                      onClick={() =>\n                        navigator.clipboard?.writeText(endpointURL)\n                      }\n                    >\n                      Copy to Clipboard\n                    </Button>\n                  </InputGroup>\n                </Col>\n              </Row>\n            )}\n          </>\n        )}\n        <Row>\n          <Col xs={6}>\n            <Table>\n              <thead>\n                <tr>\n                  <th>Edits</th>\n                  <th>Count</th>\n                </tr>\n              </thead>\n              <tbody>\n                {editCount.map(([status, count]) => (\n                  <tr key={status}>\n                    <td>{status}</td>\n                    <td>{count}</td>\n                  </tr>\n                ))}\n              </tbody>\n            </Table>\n          </Col>\n          <Col xs={6}>\n            <Table>\n              <thead>\n                <tr>\n                  <th>Votes</th>\n                  <th>Count</th>\n                </tr>\n              </thead>\n              <tbody>\n                {voteCount.map(([vote, count]) => (\n                  <tr key={vote}>\n                    <td>{vote}</td>\n                    <td>{count}</td>\n                  </tr>\n                ))}\n              </tbody>\n            </Table>\n          </Col>\n        </Row>\n        {showPrivate && (\n          <Row>\n            <Col xs={2}>Invite Tokens</Col>\n            <InputGroup className=\"col\">\n              {isAdmin && (\n                <Button onClick={() => handleRevokeInvite()}>\n                  <Icon icon={faMinus} />\n                </Button>\n              )}\n              <InputGroup.Text>{user.invite_tokens ?? 0}</InputGroup.Text>\n              {isAdmin && (\n                <Button onClick={() => handleGrantInvite()}>\n                  <Icon icon={faPlus} />\n                </Button>\n              )}\n            </InputGroup>\n          </Row>\n        )}\n        {showPrivate && (\n          <div>\n            <Row>\n              <Col xs={2}>Invite Keys</Col>\n            </Row>\n            <Row className=\"my-2\">\n              <Col>\n                <div>\n                  {isOwner && (\n                    <Button\n                      variant=\"link\"\n                      onClick={() => setShowGenerateInviteKey(true)}\n                      disabled={user.invite_tokens === 0}\n                    >\n                      <Icon icon={faPlus} className=\"me-2\" />\n                      Generate Key\n                    </Button>\n                  )}\n                </div>\n                <UserInviteKeys\n                  inviteCodes={user.invite_codes ?? []}\n                  rescindInvite={(c) => setShowRescindCode(c)}\n                />\n              </Col>\n            </Row>\n          </div>\n        )}\n      </Col>\n    </Row>\n  );\n};\n\nexport default UserComponent;\n"
  },
  {
    "path": "frontend/src/pages/users/UserAdd.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { CombinedGraphQLErrors } from \"@apollo/client\";\n\nimport { useAddUser } from \"src/graphql\";\nimport { ROUTE_USERS } from \"src/constants/route\";\nimport UserForm, { type UserData } from \"./UserForm\";\n\nconst AddUserComponent: FC = () => {\n  const [queryError, setQueryError] = useState<string>();\n  const navigate = useNavigate();\n  const [insertUser] = useAddUser({\n    onCompleted: () => {\n      window.location.href = ROUTE_USERS;\n    },\n  });\n\n  const doInsert = (userData: UserData) => {\n    insertUser({ variables: { userData } })\n      .then(() => navigate(ROUTE_USERS))\n      .catch(\n        (error: unknown) =>\n          CombinedGraphQLErrors.is(error) && setQueryError(error.message),\n      );\n  };\n\n  const emptyUser = {\n    id: \"\",\n    name: \"\",\n    email: \"\",\n    password: \"\",\n    roles: [],\n  };\n\n  return (\n    <div className=\"col-6\">\n      <h3>Add user</h3>\n      <hr />\n      <UserForm user={emptyUser} error={queryError} callback={doInsert} />\n    </div>\n  );\n};\n\nexport default AddUserComponent;\n"
  },
  {
    "path": "frontend/src/pages/users/UserConfirmChangeEmail.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { CombinedGraphQLErrors } from \"@apollo/client\";\nimport { useNavigate } from \"react-router-dom\";\nimport { Button, Form } from \"react-bootstrap\";\n\nimport type { User } from \"src/context\";\nimport { useQueryParams, useToast } from \"src/hooks\";\nimport { userHref } from \"src/utils\";\nimport { ErrorMessage } from \"src/components/fragments\";\nimport Title from \"src/components/title\";\nimport { useConfirmChangeEmail, UserChangeEmailStatus } from \"src/graphql\";\n\nconst ConfirmChangeEmail: FC<{ user: User }> = ({ user }) => {\n  const navigate = useNavigate();\n  const [submitError, setSubmitError] = useState<string | undefined>();\n  const [{ token }] = useQueryParams({\n    token: { name: \"key\", type: \"string\" },\n  });\n  const toast = useToast();\n\n  const [confirmChangeEmail, { loading }] = useConfirmChangeEmail();\n\n  if (!token) return <ErrorMessage error=\"Missing key\" />;\n  if (submitError) return <ErrorMessage error={submitError} />;\n\n  const onSubmit = () => {\n    setSubmitError(undefined);\n    confirmChangeEmail({ variables: { token } })\n      .then((res) => {\n        const status = res.data?.confirmChangeEmail;\n        if (status === UserChangeEmailStatus.SUCCESS) {\n          toast({\n            variant: \"success\",\n            content: (\n              <>\n                <h5>Email successfully changed</h5>\n              </>\n            ),\n          });\n          navigate(userHref(user));\n        } else if (status === UserChangeEmailStatus.INVALID_TOKEN)\n          setSubmitError(\n            \"Invalid or expired token, please restart the process.\",\n          );\n        else if (status === UserChangeEmailStatus.EXPIRED)\n          setSubmitError(\n            \"Email change token expired, please restart the process.\",\n          );\n        else setSubmitError(\"An unknown error occurred\");\n      })\n      .catch(\n        (error: unknown) =>\n          CombinedGraphQLErrors.is(error) && setSubmitError(error.message),\n      );\n    return false;\n  };\n\n  return (\n    <div className=\"LoginPrompt\">\n      <Title page=\"Confirm Email change\" />\n      <Form className=\"align-self-center col-8 mx-auto\">\n        <h5>Confirm change email</h5>\n        <p>Click the button to confirm email change.</p>\n        <Button type=\"submit\" disabled={loading} onClick={onSubmit}>\n          Complete email change\n        </Button>\n      </Form>\n    </div>\n  );\n};\n\nexport default ConfirmChangeEmail;\n"
  },
  {
    "path": "frontend/src/pages/users/UserEdit.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { CombinedGraphQLErrors } from \"@apollo/client\";\n\nimport {\n  useUpdateUser,\n  type PublicUserQuery,\n  type UserQuery,\n} from \"src/graphql\";\nimport { userHref, isPrivateUser } from \"src/utils\";\nimport UserEditForm, { type UserEditData } from \"./UserEditForm\";\nimport { ErrorMessage } from \"src/components/fragments\";\n\ntype User =\n  | NonNullable<UserQuery[\"findUser\"]>\n  | NonNullable<PublicUserQuery[\"findUser\"]>;\n\ninterface Props {\n  user: User;\n}\n\nconst EditUserComponent: FC<Props> = ({ user }) => {\n  const [queryError, setQueryError] = useState<string>();\n  const navigate = useNavigate();\n  const [updateUser] = useUpdateUser();\n\n  if (!isPrivateUser(user)) return <ErrorMessage error=\"Access Denied\" />;\n\n  const doUpdate = (userData: UserEditData) => {\n    updateUser({ variables: { userData } })\n      .then((res) => navigate(userHref(res.data?.userUpdate ?? user)))\n      .catch(\n        (error: unknown) =>\n          CombinedGraphQLErrors.is(error) && setQueryError(error.message),\n      );\n  };\n\n  return (\n    <div>\n      <h3>Edit &lsquo;{user.name}&rsquo;</h3>\n      <hr />\n      <UserEditForm\n        user={user}\n        username={user.name}\n        error={queryError}\n        callback={doUpdate}\n      />\n    </div>\n  );\n};\n\nexport default EditUserComponent;\n"
  },
  {
    "path": "frontend/src/pages/users/UserEditForm.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button, Row, Form } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport Select from \"react-select\";\nimport * as yup from \"yup\";\nimport { useForm, Controller } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport cx from \"classnames\";\n\nimport { RoleEnum, type UserUpdateInput } from \"src/graphql\";\nimport { userHref } from \"src/utils\";\nimport { useCurrentUser } from \"src/hooks\";\n\nconst schema = yup.object({\n  name: yup.string().optional(),\n  id: yup.string().required(),\n  email: yup.string().email().required(\"Email is required\"),\n  roles: yup.array().of(yup.string().required()).required(),\n});\ntype UserFormData = yup.Asserts<typeof schema>;\n\nexport type UserEditData = {\n  name?: string;\n  id: string;\n  email: string;\n  roles: RoleEnum[];\n};\n\ninterface UserProps {\n  user: UserUpdateInput;\n  username: string;\n  error?: string;\n  callback: (data: UserEditData) => void;\n}\n\nconst roles = Object.keys(RoleEnum).map((role) => ({\n  label: role,\n  value: role,\n}));\n\nconst UserForm: FC<UserProps> = ({ user, username, callback, error }) => {\n  const { isAdmin } = useCurrentUser();\n  const {\n    register,\n    control,\n    handleSubmit,\n    formState: { errors },\n  } = useForm({\n    resolver: yupResolver(schema),\n  });\n\n  const onSubmit = (formData: UserFormData) => {\n    const userData = {\n      ...formData,\n      id: formData.id,\n      email: formData.email,\n      roles: formData.roles as RoleEnum[],\n    };\n    callback(userData);\n  };\n\n  return (\n    <Form onSubmit={handleSubmit(onSubmit)}>\n      <Row>\n        {isAdmin && (\n          <Form.Group controlId=\"name\" className=\"col-6 mb-3\">\n            <Form.Label>Username</Form.Label>\n            <Form.Control\n              className={cx({ \"is-invalid\": errors.name })}\n              type=\"text\"\n              placeholder=\"Username\"\n              defaultValue={user.name ?? \"\"}\n              {...register(\"name\")}\n            />\n            <div className=\"invalid-feedback\">{errors?.name?.message}</div>\n          </Form.Group>\n        )}\n      </Row>\n      <Row>\n        <Form.Control type=\"hidden\" value={user.id} {...register(\"id\")} />\n        <Form.Group controlId=\"email\" className=\"col-6 mb-3\">\n          <Form.Label>Email</Form.Label>\n          <Form.Control\n            className={cx({ \"is-invalid\": errors.email })}\n            type=\"email\"\n            placeholder=\"Email\"\n            defaultValue={user.email ?? \"\"}\n            {...register(\"email\")}\n          />\n          <div className=\"invalid-feedback\">{errors?.email?.message}</div>\n        </Form.Group>\n      </Row>\n      {isAdmin && (\n        <Row>\n          <Form.Group className=\"col-6 mb-3\">\n            <Form.Label>Roles</Form.Label>\n            <Controller\n              name=\"roles\"\n              control={control}\n              defaultValue={(user.roles ?? []) as string[]}\n              render={({ field: { onChange, value } }) => (\n                <Select\n                  classNamePrefix=\"react-select\"\n                  name=\"roles\"\n                  options={roles}\n                  placeholder=\"User roles\"\n                  onChange={(vals) => onChange(vals.map((v) => v.value) ?? [])}\n                  defaultValue={roles.filter((r) => value.includes(r.value))}\n                  isMulti\n                />\n              )}\n            />\n          </Form.Group>\n        </Row>\n      )}\n      <Row>\n        <div className=\"col-6\">\n          <Button variant=\"primary\" type=\"submit\">\n            Save\n          </Button>\n          <Link to={userHref({ name: username })} className=\"ms-2\">\n            <Button variant=\"secondary\">Cancel</Button>\n          </Link>\n          <div className=\"invalid-feedback d-block\">{error}</div>\n        </div>\n      </Row>\n    </Form>\n  );\n};\n\nexport default UserForm;\n"
  },
  {
    "path": "frontend/src/pages/users/UserEdits.tsx",
    "content": "import type { FC } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nimport { ROUTE_USER } from \"src/constants/route\";\nimport { createHref } from \"src/utils\";\nimport { EditList } from \"src/components/list\";\nimport { VoteStatusEnum } from \"src/graphql\";\nimport { useCurrentUser } from \"src/hooks\";\n\ninterface Props {\n  user: {\n    id: string;\n    name: string;\n  };\n}\n\nconst UserEditsComponent: FC<Props> = ({ user }) => {\n  const { isSelf } = useCurrentUser();\n  return (\n    <>\n      <h3>\n        Edits by <Link to={createHref(ROUTE_USER, user)}>{user.name}</Link>\n      </h3>\n      <EditList\n        userId={user.id}\n        defaultVoteStatus={VoteStatusEnum.PENDING}\n        showVotedFilter={!isSelf(user)}\n        userSubmitted={true}\n      />\n    </>\n  );\n};\n\nexport default UserEditsComponent;\n"
  },
  {
    "path": "frontend/src/pages/users/UserFingerprints.tsx",
    "content": "import { UserFingerprintsList } from \"./UserFingerprintsList\";\n\nconst UserFingerprintsComponent = () => {\n  const filter = {\n    has_fingerprint_submissions: true,\n  };\n\n  return (\n    <>\n      <h3>My fingerprints</h3>\n      <UserFingerprintsList filter={filter} />\n    </>\n  );\n};\n\nexport default UserFingerprintsComponent;\n"
  },
  {
    "path": "frontend/src/pages/users/UserFingerprintsList/UserFingerprint.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button } from \"react-bootstrap\";\nimport type { FingerprintAlgorithm } from \"src/graphql\";\nimport { Icon } from \"src/components/fragments\";\nimport { formatDuration } from \"src/utils\";\nimport { faTimesCircle } from \"@fortawesome/free-solid-svg-icons\";\n\ninterface Props {\n  fingerprint: {\n    hash: string;\n    duration: number;\n    algorithm: FingerprintAlgorithm;\n  };\n  deleteFingerprint: () => void;\n}\n\nexport const UserFingerprint: FC<Props> = ({\n  fingerprint,\n  deleteFingerprint,\n}) => (\n  <li>\n    <div key={fingerprint.hash}>\n      <b className=\"me-2\">{fingerprint.algorithm}</b>\n      {fingerprint.hash} ({formatDuration(fingerprint.duration)})\n      <Button\n        className=\"text-danger ms-2\"\n        title=\"Submitted by you - click to remove submission\"\n        onClick={deleteFingerprint}\n        variant=\"link\"\n      >\n        <Icon icon={faTimesCircle} />\n      </Button>\n    </div>\n  </li>\n);\n"
  },
  {
    "path": "frontend/src/pages/users/UserFingerprintsList/UserFingerprintsList.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { Button, Form, InputGroup, Row, Table } from \"react-bootstrap\";\nimport {\n  faSortAmountUp,\n  faSortAmountDown,\n} from \"@fortawesome/free-solid-svg-icons\";\n\nimport {\n  useScenesWithFingerprints,\n  type SceneQueryInput,\n  SortDirectionEnum,\n  SceneSortEnum,\n  useUnmatchFingerprint,\n  type FingerprintAlgorithm,\n  CriterionModifier,\n} from \"src/graphql\";\nimport { usePagination, useQueryParams } from \"src/hooks\";\nimport { ensureEnum } from \"src/utils\";\nimport { ErrorMessage, Icon } from \"src/components/fragments\";\nimport List from \"src/components/list/List\";\nimport Modal from \"src/components/modal\";\nimport TagFilter from \"src/components/tagFilter\";\nimport UserSceneLine from \"./UserSceneLine\";\n\nconst PER_PAGE = 20;\n\ninterface Props {\n  perPage?: number;\n  filter?: Partial<SceneQueryInput>;\n}\n\nconst sortOptions = [\n  { value: SceneSortEnum.DATE, label: \"Release Date\" },\n  { value: SceneSortEnum.TITLE, label: \"Title\" },\n  { value: SceneSortEnum.TRENDING, label: \"Trending\" },\n  { value: SceneSortEnum.CREATED_AT, label: \"Created At\" },\n  { value: SceneSortEnum.UPDATED_AT, label: \"Updated At\" },\n];\n\nexport const UserFingerprintsList: FC<Props> = ({\n  perPage = PER_PAGE,\n  filter,\n}) => {\n  const [deletionCandidates, setDeletionCandidates] = useState<\n    {\n      hash: string;\n      scene_id: string;\n      algorithm: FingerprintAlgorithm;\n      duration: number;\n    }[]\n  >([]);\n\n  const [showDelete, setShowDelete] = useState(false);\n  const [deleteFingerprint] = useUnmatchFingerprint();\n  const [params, setParams] = useQueryParams({\n    sort: { name: \"sort\", type: \"string\", default: SceneSortEnum.DATE },\n    dir: { name: \"dir\", type: \"string\", default: SortDirectionEnum.DESC },\n    tag: { name: \"tag\", type: \"string\" },\n  });\n  const sort = ensureEnum(SceneSortEnum, params.sort);\n  const direction = ensureEnum(SortDirectionEnum, params.dir);\n\n  const { page, setPage } = usePagination();\n  const { loading, data } = useScenesWithFingerprints({\n    input: {\n      page,\n      per_page: perPage,\n      sort,\n      direction,\n      ...filter,\n      tags: params.tag\n        ? { value: [params.tag], modifier: CriterionModifier.INCLUDES }\n        : undefined,\n    },\n    submitted: true,\n  });\n\n  if (!loading && !data) return <ErrorMessage error=\"Failed to load scenes.\" />;\n\n  const filters = (\n    <InputGroup className=\"scene-sort w-auto\">\n      <TagFilter tag={params.tag} onChange={(t) => setParams(\"tag\", t?.id)} />\n      <Form.Select\n        className=\"w-auto\"\n        onChange={(e) => setParams(\"sort\", e.currentTarget.value.toLowerCase())}\n        defaultValue={sort ?? \"name\"}\n      >\n        {sortOptions.map((s) => (\n          <option value={s.value} key={s.value}>\n            {s.label}\n          </option>\n        ))}\n      </Form.Select>\n      <Button\n        variant=\"secondary\"\n        onClick={() =>\n          setParams(\n            \"dir\",\n            direction === SortDirectionEnum.DESC\n              ? SortDirectionEnum.ASC\n              : SortDirectionEnum.DESC,\n          )\n        }\n      >\n        <Icon\n          icon={\n            direction === SortDirectionEnum.DESC\n              ? faSortAmountDown\n              : faSortAmountUp\n          }\n        />\n      </Button>\n    </InputGroup>\n  );\n\n  const deleteFingerprints = (\n    fingerprints: {\n      scene_id: string;\n      hash: string;\n      algorithm: FingerprintAlgorithm;\n      duration: number;\n    }[],\n  ) => {\n    setDeletionCandidates(fingerprints);\n    setShowDelete(true);\n  };\n\n  const handleDelete = async (status: boolean) => {\n    if (status && deletionCandidates.length) {\n      for (const candidate of deletionCandidates) {\n        await deleteFingerprint({\n          variables: candidate,\n        });\n      }\n    }\n    setDeletionCandidates([]);\n    setShowDelete(false);\n  };\n\n  const deleteModal = showDelete && (\n    <Modal\n      message={`Are you sure you want to delete ${deletionCandidates.length} fingerprints? This operation cannot be undone.`}\n      callback={handleDelete}\n    />\n  );\n\n  return (\n    <>\n      {deleteModal}\n      <List\n        page={page}\n        setPage={setPage}\n        perPage={perPage}\n        listCount={data?.queryScenes.count}\n        loading={loading}\n        filters={filters}\n        entityName=\"scenes\"\n      >\n        <Row>\n          <Table striped variant=\"dark\">\n            <thead>\n              <tr>\n                <th style={{ width: \"50px\" }}></th>\n                <th>Title</th>\n                <th>Studio</th>\n                <th>Duration</th>\n                <th style={{ width: \"120px\" }}>Release Date</th>\n              </tr>\n            </thead>\n            <tbody>\n              {data?.queryScenes.scenes.map((scene) => (\n                <UserSceneLine\n                  key={scene.id}\n                  scene={scene}\n                  deleteFingerprints={deleteFingerprints}\n                />\n              ))}\n            </tbody>\n          </Table>\n        </Row>\n      </List>\n    </>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/users/UserFingerprintsList/UserSceneLine.tsx",
    "content": "import type { FC } from \"react\";\n\nimport type {\n  FingerprintAlgorithm,\n  ScenesWithFingerprintsQuery,\n} from \"src/graphql\";\nimport { Icon } from \"src/components/fragments\";\nimport { Link } from \"react-router-dom\";\nimport { Button } from \"react-bootstrap\";\nimport { sceneHref, studioHref, formatDuration } from \"src/utils\";\nimport { faVideo, faTrashCan } from \"@fortawesome/free-solid-svg-icons\";\nimport { UserFingerprint } from \"./UserFingerprint\";\n\ninterface Props {\n  scene: ScenesWithFingerprintsQuery[\"queryScenes\"][\"scenes\"][number];\n  deleteFingerprints: (\n    fingerprints: {\n      scene_id: string;\n      hash: string;\n      algorithm: FingerprintAlgorithm;\n      duration: number;\n    }[],\n  ) => void;\n}\n\nconst UserSceneLine: FC<Props> = ({ scene, deleteFingerprints }) => (\n  <>\n    <tr key={scene.id}>\n      <td>\n        <Button\n          variant=\"link\"\n          className=\"text-danger\"\n          onClick={() =>\n            deleteFingerprints(\n              scene.fingerprints.map((fp) => ({ ...fp, scene_id: scene.id })),\n            )\n          }\n        >\n          <Icon\n            icon={faTrashCan}\n            className=\"me-1\"\n            title=\"Delete all of your submitted fingerprints for this scene\"\n          />\n        </Button>\n      </td>\n      <td>\n        <Link to={sceneHref(scene)}>{scene.title}</Link>\n      </td>\n      <td>\n        {scene.studio && (\n          <Link\n            to={studioHref(scene.studio)}\n            className=\"text-truncate SceneCard-studio-name\"\n          >\n            <Icon icon={faVideo} className=\"me-1\" />\n            {scene.studio.name}\n          </Link>\n        )}\n      </td>\n      <td>{scene.duration ? formatDuration(scene.duration) : \"\"}</td>\n      <td>{scene.release_date}</td>\n    </tr>\n    <tr key={`${scene.id}-fps`}>\n      <td colSpan={4}>\n        <ul>\n          {scene.fingerprints.map((fp) => (\n            <UserFingerprint\n              fingerprint={fp}\n              deleteFingerprint={() =>\n                deleteFingerprints([{ ...fp, scene_id: scene.id }])\n              }\n              key={fp.hash}\n            />\n          ))}\n        </ul>\n      </td>\n    </tr>\n  </>\n);\n\nexport default UserSceneLine;\n"
  },
  {
    "path": "frontend/src/pages/users/UserFingerprintsList/index.ts",
    "content": "export * from \"./UserFingerprintsList\";\n"
  },
  {
    "path": "frontend/src/pages/users/UserForm.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button, Form, Row } from \"react-bootstrap\";\nimport { useNavigate } from \"react-router-dom\";\nimport Select from \"react-select\";\nimport * as yup from \"yup\";\nimport { useForm, Controller } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport cx from \"classnames\";\n\nimport { RoleEnum, type UserUpdateInput } from \"src/graphql\";\n\nconst schema = yup.object({\n  id: yup.string(),\n  name: yup.string().required(\"Username is required\"),\n  email: yup.string().email().required(\"Email is required\"),\n  password: yup\n    .string()\n    .min(8, \"Password must be at least 8 characters\")\n    .test(\n      \"uniqueness\",\n      \"Password must have at least 5 unique characters\",\n      (value) =>\n        value !== undefined &&\n        value\n          .split(\"\")\n          .filter(\n            (item: string, i: number, ar: string[]) => ar.indexOf(item) === i,\n          )\n          .join(\"\").length >= 5,\n    )\n    .required(\"Password is required\"),\n  roles: yup.array().of(yup.string().required()).required(),\n});\n\ntype UserFormData = yup.Asserts<typeof schema>;\n\nexport type UserData = {\n  name: string;\n  email: string;\n  password: string;\n  roles: RoleEnum[];\n};\n\ninterface UserProps {\n  user: UserUpdateInput;\n  error?: string;\n  callback: (data: UserData, id?: string) => void;\n}\n\nconst roles = Object.keys(RoleEnum).map((role) => ({\n  label: role,\n  value: role,\n}));\n\nconst UserForm: FC<UserProps> = ({ user, callback, error }) => {\n  const navigate = useNavigate();\n  const {\n    register,\n    handleSubmit,\n    control,\n    formState: { errors },\n  } = useForm({\n    resolver: yupResolver(schema),\n  });\n\n  const onSubmit = (formData: UserFormData) => {\n    const userData = {\n      ...formData,\n      name: formData.name,\n      email: formData.email,\n      password: formData.password,\n      roles: formData.roles as RoleEnum[],\n    };\n    callback(userData, formData.id);\n  };\n\n  return (\n    <Form onSubmit={handleSubmit(onSubmit)}>\n      <Row>\n        <Form.Control type=\"hidden\" value={user.id} />\n        <Form.Group controlId=\"username\" className=\"col mb-3\">\n          <Form.Label>Username</Form.Label>\n          <Form.Control\n            className={cx({ \"is-invalid\": errors.name })}\n            placeholder=\"Username\"\n            defaultValue={user.name ?? \"\"}\n            {...register(\"name\")}\n          />\n          <div className=\"invalid-feedback\">{errors?.name?.message}</div>\n        </Form.Group>\n      </Row>\n      <Row>\n        <Form.Group controlId=\"email\" className=\"col mb-3\">\n          <Form.Label>Email</Form.Label>\n          <Form.Control\n            className={cx({ \"is-invalid\": errors.email })}\n            type=\"email\"\n            placeholder=\"Email\"\n            defaultValue={user.email ?? \"\"}\n            {...register(\"email\")}\n          />\n          <div className=\"invalid-feedback\">{errors?.email?.message}</div>\n        </Form.Group>\n      </Row>\n      <Row>\n        <Form.Group controlId=\"password\" className=\"col mb-3\">\n          <Form.Label>Password</Form.Label>\n          <Form.Control\n            className={cx({ \"is-invalid\": errors.password })}\n            type=\"password\"\n            placeholder=\"Password\"\n            defaultValue={user.password ?? \"\"}\n            {...register(\"password\")}\n          />\n          <div className=\"invalid-feedback\">{errors?.password?.message}</div>\n        </Form.Group>\n      </Row>\n      <Row>\n        <Form.Group className=\"col mb-3\">\n          <Form.Label>Roles</Form.Label>\n          <Controller\n            name=\"roles\"\n            control={control}\n            defaultValue={(user.roles ?? []) as string[]}\n            render={({ field: { onChange, value } }) => (\n              <Select\n                classNamePrefix=\"react-select\"\n                name=\"roles\"\n                options={roles}\n                placeholder=\"User roles\"\n                onChange={(vals) => onChange(vals.map((v) => v.value) ?? [])}\n                defaultValue={roles.filter((r) => value.includes(r.value))}\n                isMulti\n              />\n            )}\n          />\n        </Form.Group>\n      </Row>\n      <Row>\n        <div className=\"col\">\n          <Button type=\"submit\">Create</Button>\n          <Button\n            variant=\"secondary\"\n            className=\"ms-2\"\n            onClick={() => navigate(-1)}\n          >\n            Cancel\n          </Button>\n          <div className=\"invalid-feedback d-block\">{error}</div>\n        </div>\n      </Row>\n    </Form>\n  );\n};\n\nexport default UserForm;\n"
  },
  {
    "path": "frontend/src/pages/users/UserNotificationPreferences.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button, Form } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport { ROUTE_NOTIFICATIONS } from \"src/constants/route\";\nimport {\n  NotificationEnum,\n  useUpdateNotificationSubscriptions,\n} from \"src/graphql\";\nimport {\n  NotificationType,\n  ensureEnum,\n  FavoriteNotificationType,\n} from \"src/utils\";\nimport { useCurrentUser } from \"../../hooks\";\n\ninterface Props {\n  user: {\n    id: string;\n    notification_subscriptions: NotificationEnum[];\n  };\n}\n\nexport const UserNotificationPreferences: FC<Props> = ({ user }) => {\n  const { isEditor } = useCurrentUser();\n  const subscribableNotificationTypes = Object.entries(\n    isEditor ? NotificationType : FavoriteNotificationType,\n  );\n\n  const [updateSubscriptions, { loading: submitting }] =\n    useUpdateNotificationSubscriptions();\n  const activeNotifications: string[] = user.notification_subscriptions.map(\n    (e) => e,\n  );\n\n  const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n    e.preventDefault();\n    const data = new FormData(e.currentTarget);\n    const subscriptions = data\n      .getAll(\"subscriptions\")\n      .map((sub) => ensureEnum(NotificationEnum, sub.toString()));\n\n    updateSubscriptions({ variables: { subscriptions } });\n  };\n\n  return (\n    <>\n      <Link to={ROUTE_NOTIFICATIONS}>\n        <h6 className=\"mb-4\">&larr; Notifications</h6>\n      </Link>\n      <h4>Active notification subscriptions</h4>\n      <hr />\n\n      <Form onSubmit={handleSubmit}>\n        {subscribableNotificationTypes.map(([key, value]) => (\n          <Form.Check\n            value={key}\n            defaultChecked={activeNotifications.includes(key)}\n            id={key}\n            label={value}\n            key={key}\n            name=\"subscriptions\"\n          />\n        ))}\n        <div className=\"mt-4\">\n          <Button type=\"reset\" className=\"me-2\">\n            Reset\n          </Button>\n          <Button type=\"submit\" disabled={submitting}>\n            Save\n          </Button>\n        </div>\n      </Form>\n    </>\n  );\n};\n"
  },
  {
    "path": "frontend/src/pages/users/UserPassword.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { CombinedGraphQLErrors } from \"@apollo/client\";\n\nimport { useChangePassword } from \"src/graphql\";\nimport { userHref } from \"src/utils\";\nimport UserPassword, { type UserPasswordData } from \"./UserPasswordForm\";\nimport { useCurrentUser } from \"src/hooks\";\n\nconst ChangePasswordComponent: FC = () => {\n  const { user } = useCurrentUser();\n  const [queryError, setQueryError] = useState<string>();\n  const navigate = useNavigate();\n  const [changePassword] = useChangePassword();\n\n  const doUpdate = (formData: UserPasswordData) => {\n    const userData = {\n      existing_password: formData.existingPassword,\n      new_password: formData.newPassword,\n    };\n    changePassword({ variables: { userData } })\n      .then(() => user && navigate(userHref(user)))\n      .catch(\n        (error) =>\n          CombinedGraphQLErrors.is(error) && setQueryError(error.message),\n      );\n  };\n\n  return (\n    <div className=\"col-6\">\n      <h3>Change Password</h3>\n      <hr />\n      <UserPassword error={queryError} callback={doUpdate} />\n    </div>\n  );\n};\n\nexport default ChangePasswordComponent;\n"
  },
  {
    "path": "frontend/src/pages/users/UserPasswordForm.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button, Form } from \"react-bootstrap\";\nimport * as yup from \"yup\";\nimport { useForm } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport cx from \"classnames\";\nimport { useNavigate } from \"react-router-dom\";\n\nconst schema = yup.object({\n  id: yup.string(),\n  existingPassword: yup.string().required(\"Existing password is required\"),\n  newPassword: yup\n    .string()\n    .min(8, \"Password must be at least 8 characters\")\n    .test(\n      \"uniqueness\",\n      \"Password must have at least 5 unique characters\",\n      (value) =>\n        value !== undefined &&\n        value\n          .split(\"\")\n          .filter(\n            (item: string, i: number, ar: string[]) => ar.indexOf(item) === i,\n          )\n          .join(\"\").length >= 5,\n    )\n    .required(\"Password is required\"),\n  confirmNewPassword: yup\n    .string()\n    .nullable()\n    .oneOf([yup.ref(\"newPassword\"), null], \"Passwords don't match\")\n    .required(\"Password is required\"),\n});\ntype UserFormData = yup.InferType<typeof schema>;\n\nexport type UserPasswordData = {\n  newPassword: string;\n  existingPassword: string;\n};\n\ninterface UserProps {\n  error?: string;\n  callback: (data: UserPasswordData) => void;\n}\n\nconst UserForm: FC<UserProps> = ({ callback, error }) => {\n  const navigate = useNavigate();\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm({\n    resolver: yupResolver(schema),\n  });\n\n  const onSubmit = (formData: UserFormData) => {\n    const userData = {\n      existingPassword: formData.existingPassword,\n      newPassword: formData.confirmNewPassword,\n    };\n    callback(userData);\n  };\n\n  return (\n    <Form onSubmit={handleSubmit(onSubmit)}>\n      <Form.Group controlId=\"existingPassword\" className=\"mb-3\">\n        <Form.Control\n          className={cx({ \"is-invalid\": errors.existingPassword })}\n          type=\"password\"\n          placeholder=\"Existing Password\"\n          {...register(\"existingPassword\")}\n        />\n        <div className=\"invalid-feedback\">\n          {errors?.existingPassword?.message}\n        </div>\n      </Form.Group>\n      <Form.Group controlId=\"newPassword\" className=\"mb-3\">\n        <Form.Control\n          className={cx({ \"is-invalid\": errors.newPassword })}\n          type=\"password\"\n          placeholder=\"New Password\"\n          {...register(\"newPassword\")}\n        />\n        <div className=\"invalid-feedback\">{errors?.newPassword?.message}</div>\n      </Form.Group>\n      <Form.Group controlId=\"confirmNewPassword\" className=\"mb-3\">\n        <Form.Control\n          className={cx({ \"is-invalid\": errors.confirmNewPassword })}\n          type=\"password\"\n          placeholder=\"Confirm New Password\"\n          {...register(\"confirmNewPassword\")}\n        />\n        <div className=\"invalid-feedback\">\n          {errors?.confirmNewPassword?.message}\n        </div>\n      </Form.Group>\n      <div>\n        <Button type=\"submit\">Save</Button>\n        <Button\n          variant=\"secondary\"\n          className=\"ms-2\"\n          onClick={() => navigate(-1)}\n        >\n          Cancel\n        </Button>\n        <div className=\"invalid-feedback d-block\">{error}</div>\n      </div>\n    </Form>\n  );\n};\n\nexport default UserForm;\n"
  },
  {
    "path": "frontend/src/pages/users/UserValidateChangeEmail.tsx",
    "content": "import { type FC, useState } from \"react\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { useForm } from \"react-hook-form\";\nimport { CombinedGraphQLErrors } from \"@apollo/client\";\nimport * as yup from \"yup\";\nimport cx from \"classnames\";\nimport { Button, Form, Row, Col } from \"react-bootstrap\";\n\nimport type { User } from \"src/context\";\nimport { useQueryParams } from \"src/hooks\";\nimport { ErrorMessage } from \"src/components/fragments\";\nimport Title from \"src/components/title\";\nimport { useValidateChangeEmail, UserChangeEmailStatus } from \"src/graphql\";\n\nconst schema = yup.object({\n  token: yup.string().required(),\n  email: yup.string().required(\"Email is required\"),\n});\ntype ValidateChangeEmailFormData = yup.Asserts<typeof schema>;\n\nconst ValidateChangeEmail: FC<{ user: User }> = () => {\n  const [submitError, setSubmitError] = useState<string | undefined>();\n  const [{ token, submitted }, setQueryParam] = useQueryParams({\n    token: { name: \"key\", type: \"string\" },\n    submitted: { name: \"submitted\", type: \"boolean\" },\n  });\n\n  const {\n    register,\n    handleSubmit,\n    formState: { errors },\n  } = useForm<ValidateChangeEmailFormData>({\n    resolver: yupResolver(schema),\n  });\n\n  const [validateChangeEmail, { loading }] = useValidateChangeEmail();\n\n  if (submitted)\n    return (\n      <div className=\"LoginPrompt\">\n        <div className=\"align-self-center col-8 mx-auto\">\n          <h5>Confirmation email sent</h5>\n          <p>Please check your email to complete the email change.</p>\n        </div>\n      </div>\n    );\n\n  if (!token) return <ErrorMessage error=\"Missing token\" />;\n\n  const onSubmit = (formData: ValidateChangeEmailFormData) => {\n    setSubmitError(undefined);\n    validateChangeEmail({ variables: { ...formData } })\n      .then((res) => {\n        const status = res.data?.validateChangeEmail;\n        if (status === UserChangeEmailStatus.CONFIRM_NEW)\n          setQueryParam(\"submitted\", true);\n        else if (status === UserChangeEmailStatus.INVALID_TOKEN)\n          setSubmitError(\n            \"Invalid or expired token, please restart the process.\",\n          );\n        else if (status === UserChangeEmailStatus.EXPIRED)\n          setSubmitError(\n            \"Email change token expired, please restart the process.\",\n          );\n        else setSubmitError(\"An unknown error occurred\");\n      })\n      .catch(\n        (error: unknown) =>\n          CombinedGraphQLErrors.is(error) && setSubmitError(error.message),\n      );\n  };\n\n  const errorList = [\n    errors.token?.message,\n    errors.email?.message,\n    submitError,\n  ].filter((err): err is string => err !== undefined);\n\n  return (\n    <div className=\"LoginPrompt\">\n      <Title page=\"Confirm Email\" />\n      <Form\n        className=\"align-self-center col-8 mx-auto\"\n        onSubmit={handleSubmit(onSubmit)}\n      >\n        <h5>Change email</h5>\n        <p>Enter a new email address to complete email change.</p>\n        <Form.Control type=\"hidden\" value={token} {...register(\"token\")} />\n\n        <Form.Group controlId=\"email\" className=\"mt-2\">\n          <Form.Control\n            className={cx({ \"is-invalid\": errors?.email })}\n            type=\"email\"\n            placeholder=\"New email\"\n            {...register(\"email\")}\n          />\n        </Form.Group>\n\n        {errorList.map((error) => (\n          <Row key={error} className=\"text-end text-danger\">\n            <div>{error}</div>\n          </Row>\n        ))}\n\n        <Row>\n          <Col\n            xs={{ span: 3, offset: 9 }}\n            className=\"justify-content-end mt-2 d-flex\"\n          >\n            <Button type=\"submit\" disabled={loading}>\n              Change Email\n            </Button>\n          </Col>\n        </Row>\n      </Form>\n    </div>\n  );\n};\n\nexport default ValidateChangeEmail;\n"
  },
  {
    "path": "frontend/src/pages/users/Users.tsx",
    "content": "import type { FC } from \"react\";\nimport { Button, Form, Table } from \"react-bootstrap\";\nimport { Link } from \"react-router-dom\";\nimport { faUserEdit } from \"@fortawesome/free-solid-svg-icons\";\nimport { debounce } from \"lodash-es\";\n\nimport { useUsers } from \"src/graphql\";\nimport { usePagination, useQueryParams } from \"src/hooks\";\nimport { ErrorMessage, Icon } from \"src/components/fragments\";\nimport { List } from \"src/components/list\";\nimport { createHref } from \"src/utils\";\nimport {\n  ROUTE_USER_EDIT,\n  ROUTE_USER,\n  ROUTE_USER_ADD,\n} from \"src/constants/route\";\n\nconst PER_PAGE = 20;\n\nconst UsersComponent: FC = () => {\n  const [{ query }, setParams] = useQueryParams({\n    query: { name: \"query\", type: \"string\", default: \"\" },\n  });\n  const { page, setPage } = usePagination();\n  const { loading, data } = useUsers({\n    input: {\n      name: query.trim(),\n      page,\n      per_page: PER_PAGE,\n    },\n  });\n\n  if (!loading && !data) return <ErrorMessage error=\"Failed to load users.\" />;\n\n  const users = data?.queryUsers.users.map((user) => (\n    <tr key={user.id}>\n      <td className=\"text-nowrap\">\n        <Link to={createHref(ROUTE_USER_EDIT, user)}>\n          <Button variant=\"secondary\" className=\"minimal\">\n            <Icon icon={faUserEdit} />\n          </Button>\n        </Link>\n        <Link to={createHref(ROUTE_USER, user)}>\n          <Button variant=\"link\">\n            <span>{user.name}</span>\n          </Button>\n        </Link>\n      </td>\n      <td>{user.email}</td>\n      <td>{user?.roles?.join(\", \") ?? \"\"}</td>\n      <td>{user?.invited_by?.name ?? \"\"}</td>\n      <td>{user?.invite_tokens ?? \"\"}</td>\n    </tr>\n  ));\n\n  const debouncedHandler = debounce(setParams, 200);\n\n  const filters = (\n    <Form.Control\n      id=\"user-name\"\n      onChange={(e) => debouncedHandler(\"query\", e.currentTarget.value)}\n      placeholder=\"Filter by username\"\n      defaultValue={query ?? \"\"}\n      className=\"w-auto\"\n    />\n  );\n\n  return (\n    <>\n      <div className=\"d-flex\">\n        <h3>Users</h3>\n        <Link to={ROUTE_USER_ADD} className=\"ms-auto\">\n          <Button>Add User</Button>\n        </Link>\n      </div>\n      <List\n        entityName=\"users\"\n        page={page}\n        setPage={setPage}\n        perPage={PER_PAGE}\n        loading={loading}\n        listCount={data?.queryUsers.count}\n        filters={filters}\n      >\n        <Table striped className=\"users-table\" variant=\"dark\">\n          <thead>\n            <tr>\n              <th>Username</th>\n              <th>Email</th>\n              <th>Roles</th>\n              <th>Invited by</th>\n              <th>Invite Tokens</th>\n            </tr>\n          </thead>\n          <tbody>{users}</tbody>\n        </Table>\n      </List>\n    </>\n  );\n};\n\nexport default UsersComponent;\n"
  },
  {
    "path": "frontend/src/pages/users/index.tsx",
    "content": "import type { FC } from \"react\";\nimport { Route, Routes, useParams } from \"react-router-dom\";\n\nimport { useUser } from \"src/graphql\";\nimport Title from \"src/components/title\";\nimport { ErrorMessage, LoadingIndicator } from \"src/components/fragments\";\n\nimport Users from \"./Users\";\nimport User from \"./User\";\nimport UserAdd from \"./UserAdd\";\nimport UserEdit from \"./UserEdit\";\nimport UserPassword from \"./UserPassword\";\nimport UserEdits from \"./UserEdits\";\nimport UserConfirmChangeEmail from \"./UserConfirmChangeEmail\";\nimport UserValidateChangeEmail from \"./UserValidateChangeEmail\";\nimport UserFingerprints from \"./UserFingerprints\";\nimport { UserNotificationPreferences } from \"./UserNotificationPreferences\";\n\nconst UserLoader: FC = () => {\n  const { name } = useParams<{ name: string }>();\n  const { data, loading, refetch } = useUser({ name: name ?? \"\" });\n\n  if (!name) return <ErrorMessage error=\"Tag ID is missing\" />;\n\n  if (loading) return <LoadingIndicator message=\"Loading user...\" />;\n\n  const user = data?.findUser;\n  if (!user) return <ErrorMessage error=\"User not found.\" />;\n\n  return (\n    <Routes>\n      <Route\n        path=\"/\"\n        element={\n          <>\n            <Title page={user.name} />\n            <User user={user} refetch={refetch} />\n          </>\n        }\n      />\n      <Route\n        path=\"/edit\"\n        element={\n          <>\n            <Title page={`Edit ${user.name}`} />\n            <UserEdit user={user} />\n          </>\n        }\n      />\n      <Route\n        path=\"/edits\"\n        element={\n          <>\n            <Title page={`Edits by ${user.name}`} />\n            <UserEdits user={user} />\n          </>\n        }\n      />\n      <Route\n        path=\"/confirm-email\"\n        element={<UserConfirmChangeEmail user={user} />}\n      />\n      <Route\n        path=\"/change-email\"\n        element={<UserValidateChangeEmail user={user} />}\n      />\n      <Route\n        path=\"/notifications\"\n        element={\n          \"notification_subscriptions\" in user ? (\n            <>\n              <Title page={\"Notification Preferences\"} />\n              <UserNotificationPreferences user={user} />\n            </>\n          ) : (\n            <ErrorMessage error=\"Forbidden\" />\n          )\n        }\n      />\n    </Routes>\n  );\n};\n\nconst UserRoutes: FC = () => (\n  <Routes>\n    <Route\n      path=\"/\"\n      element={\n        <>\n          <Title page=\"Users\" />\n          <Users />\n        </>\n      }\n    />\n    <Route\n      path=\"/add\"\n      element={\n        <>\n          <Title page=\"Add User\" />\n          <UserAdd />\n        </>\n      }\n    />\n    <Route\n      path=\"/change-password\"\n      element={\n        <>\n          <Title page=\"Change Password\" />\n          <UserPassword />\n        </>\n      }\n    />\n    <Route\n      path=\"/fingerprints\"\n      element={\n        <>\n          <Title page={\"My Fingerprints\"} />\n          <UserFingerprints />\n        </>\n      }\n    />\n    <Route path=\"/:name/*\" element={<UserLoader />} />\n  </Routes>\n);\n\nexport default UserRoutes;\n"
  },
  {
    "path": "frontend/src/pages/users/styles.scss",
    "content": ".users-table {\n  table-layout: fixed;\n\n  .apikey {\n    width: 50%;\n    word-break: break-all;\n  }\n}\n"
  },
  {
    "path": "frontend/src/pages/version/Version.tsx",
    "content": "import type { FC } from \"react\";\nimport { useVersion } from \"src/graphql\";\n\nconst Version: FC = () => {\n  const { loading, data } = useVersion();\n\n  if (loading || !data) return null;\n\n  let link = \"\";\n  switch (data.version.build_type) {\n    case \"OFFICIAL\":\n      link = `https://github.com/stashapp/stash-box/releases/tag/${data.version.version}`;\n      break;\n    case \"DEVELOPMENT\":\n    case \"PR\":\n      link = `https://github.com/stashapp/stash-box/commit/${data.version.hash}`;\n      break;\n  }\n\n  return (\n    <dl>\n      <dt>Version</dt>\n      <dd>\n        {link ? (\n          <a href={link}>{data.version.version}</a>\n        ) : (\n          <span>{data.version.version}</span>\n        )}\n      </dd>\n      <dt>Build Type</dt>\n      <dd>{data.version.build_type}</dd>\n      <dt>Build Hash</dt>\n      <dd>{data.version.hash}</dd>\n      <dt>Build Time</dt>\n      <dd>{data.version.build_time}</dd>\n    </dl>\n  );\n};\n\nexport default Version;\n"
  },
  {
    "path": "frontend/src/pages/version/index.ts",
    "content": "export { default } from \"./Version\";\n"
  },
  {
    "path": "frontend/src/styles/theme.scss",
    "content": "// 1. Include functions first (so you can manipulate colors, SVGs, calc, etc)\n@import \"bootstrap/scss/functions\";\n\n// 2. Include any default variable overrides here\n$primary: #137cbd;\n$secondary: #394b59;\n$success: #0f9960;\n$warning: #d9822b;\n$danger: #db3737;\n$dark: #394b59;\n$text-color: #f5f8fa;\n$muted-gray: #bfccd6;\n$text-muted: $muted-gray;\n$theme-colors: (\n  \"primary\": $primary,\n  \"secondary\": $secondary,\n  \"success\": $success,\n  \"warning\": $warning,\n  \"danger\": $danger,\n  \"dark\": $dark,\n);\n$link-color: #48aff0;\n$link-hover-color: $link-color;\n$pre-color: $text-color;\n$popover-bg: $secondary;\n\n// Custom variables\n$dark-text: #182026;\n$textfield-bg: rgba(16 22 26 / 30%);\n\n// 3. Include remainder of required Bootstrap stylesheets\n@import \"bootstrap/scss/variables\";\n@import \"bootstrap/scss/maps\";\n@import \"bootstrap/scss/mixins\";\n\n// 4. Include any optional Bootstrap components as you like\n@import \"bootstrap/scss/root\";\n@import \"bootstrap/scss/reboot\";\n@import \"bootstrap/scss/type\";\n@import \"bootstrap/scss/containers\";\n@import \"bootstrap/scss/grid\";\n@import \"bootstrap/scss/helpers\";\n@import \"bootstrap/scss/utilities\";\n@import \"bootstrap/scss/utilities/api\";\n\n// Layout & components\n@import \"bootstrap/scss/tables\";\n@import \"bootstrap/scss/forms\";\n@import \"bootstrap/scss/buttons\";\n@import \"bootstrap/scss/nav\";\n@import \"bootstrap/scss/navbar\";\n@import \"bootstrap/scss/card\";\n@import \"bootstrap/scss/pagination\";\n@import \"bootstrap/scss/badge\";\n@import \"bootstrap/scss/modal\";\n@import \"bootstrap/scss/tooltip\";\n@import \"bootstrap/scss/popover\";\n@import \"bootstrap/scss/spinners\";\n@import \"bootstrap/scss/close\";\n@import \"bootstrap/scss/toasts\";\n@import \"bootstrap/scss/alert\";\n@import \"bootstrap/scss/dropdown\";\n\n/*\n@import \"bootstrap/scss/images\";\n@import \"bootstrap/scss/transitions\";\n@import \"bootstrap/scss/button-group\";\n@import \"bootstrap/scss/accordion\";\n@import \"bootstrap/scss/breadcrumb\";\n@import \"bootstrap/scss/progress\";\n@import \"bootstrap/scss/list-group\";\n@import \"bootstrap/scss/carousel\";\n@import \"bootstrap/scss/offcanvas\";\n*/\n\n:root {\n  --bs-primary: #{$primary};\n  --bs-secondary: #{$secondary};\n  --bs-success: #{$success};\n  --bs-warning: #{$warning};\n  --bs-danger: #{$danger};\n  --bs-body-bg: #202b33;\n  --bs-dark: #{$dark};\n  --bs-dark-rgb: 57, 75, 89;\n}\n\nbody {\n  color: $text-color;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  min-width: 1210px;\n}\n\n.table {\n  color: #f5f8fa;\n\n  --bs-table-bg: transparent;\n  --bs-table-striped-bg: rgba(92 112 128 / 15%);\n  --bs-table-striped-color: #f5f8fa;\n\n  td {\n    border: none;\n    padding: 0.25rem 0.75rem;\n    vertical-align: middle;\n\n    &:first-child {\n      padding-left: 1rem;\n    }\n  }\n}\n\n.btn.active:not(.disabled),\n.btn.active.minimal:not(.disabled) {\n  background-color: rgba(138 155 168 / 30%);\n  color: $text-color;\n}\n\n.btn-link {\n  text-decoration: none;\n\n  &:hover {\n    text-decoration: underline;\n  }\n}\n\na {\n  color: unset;\n  text-decoration: none;\n\n  &:hover {\n    color: unset;\n    text-decoration: underline;\n  }\n}\n\na.minimal,\nbutton.minimal {\n  background: none;\n  border: none;\n  color: $text-color;\n  transition: none;\n\n  &:hover {\n    background: rgba(138 155 168 / 15%);\n    color: $text-color;\n  }\n\n  &:active {\n    background: rgba(138 155 168 / 30%);\n    color: $text-color;\n  }\n}\n\na[aria-current] {\n  font-weight: bold;\n}\n\nlabel.is-invalid {\n  .error-message {\n    color: red;\n  }\n}\n\nhr {\n  margin: 5px 0;\n  background-color: rgba(0 0 0 / 10%);\n  border-color: rgba(0 0 0 / 10%);\n  opacity: 1;\n}\n\n.dropdown-toggle::after {\n  content: none;\n}\n\n.nav-tabs {\n  border: none;\n  margin: auto;\n  margin-bottom: 0.5rem;\n\n  .nav-link {\n    border: none;\n    color: $text-color;\n    padding: 8px;\n\n    &.active {\n      background-color: transparent;\n      border-bottom: 2px solid;\n      color: $link-color;\n\n      &:hover {\n        border-bottom-color: $link-color;\n        cursor: default;\n      }\n    }\n\n    &:hover {\n      border-bottom: 2px solid white;\n    }\n  }\n}\n\n.navbar-dark .navbar-nav .nav-link {\n  color: $text-color;\n\n  &:hover {\n    text-decoration: none;\n  }\n}\n\n.tab-content {\n  padding-bottom: 2rem;\n}\n\n.form-floating {\n  .form-label {\n    color: var(--bs-body-color);\n  }\n}\n\n.form-control {\n  &-plaintext {\n    color: $text-color;\n    margin: 0;\n    padding: 0;\n\n    option {\n      color: black;\n    }\n\n    &::placeholder {\n      color: transparent;\n    }\n\n    &:hover {\n      cursor: default;\n    }\n  }\n}\n\n.popover {\n  max-width: inherit;\n\n  &-body {\n    color: $text-color;\n    white-space: pre-wrap;\n  }\n}\n\n.modal {\n  color: $text-color;\n\n  .btn-close {\n    background-color: $text-color;\n  }\n\n  &-header,\n  &-body,\n  &-footer {\n    background-color: #30404d;\n    border-color: transparent;\n    color: $text-color;\n  }\n\n  &-content {\n    background-color: transparent;\n  }\n}\n\n.card {\n  background-color: #30404d;\n  border: none;\n  border-radius: 3px;\n  box-shadow:\n    0 0 0 1px rgba(16 22 26 / 40%),\n    0 0 0 rgba(16 22 26 / 0%),\n    0 0 0 rgba(16 22 26 / 0%);\n  overflow: hidden;\n  padding: 0;\n  margin: calc($grid-gutter-width * 0.5) 0;\n\n  &-footer,\n  &-header {\n    background-color: transparent;\n    border: none;\n  }\n}\n\n.page-link {\n  background-color: var(--bs-secondary);\n  border-bottom: none;\n  border-left-color: var(--bs-body-bg);\n  border-right-color: var(--bs-body-bg);\n  border-top: none;\n  color: white;\n}\n\n.page-link:focus {\n  background-color: var(--bs-secondary);\n  color: white;\n}\n\n.page-link:hover,\n.page-item.active .page-link {\n  background-color: #2a3742;\n  border-color: #25313a;\n  color: white;\n  z-index: 1;\n}\n\n.page-item:first-child .page-link {\n  border-left-color: var(--bs-secondary);\n}\n\n.page-item:last-child .page-link {\n  border-right-color: var(--bs-secondary);\n}\n\n.page-item.disabled .page-link {\n  background-color: var(--bs-secondary);\n  color: $gray-400;\n}\n\n.text-input,\n.input-control {\n  border: 0;\n  box-shadow:\n    0 0 0 0 rgba(19 124 189 / 0%),\n    0 0 0 0 rgba(19 124 189 / 0%),\n    0 0 0 0 rgba(19 124 189 / 0%),\n    inset 0 0 0 1px rgba(16 22 26 / 30%),\n    inset 0 1px 1px rgba(16 22 26 / 40%);\n  color: $text-color;\n\n  &:focus {\n    border: 0;\n    box-shadow:\n      0 0 0 1px $primary,\n      0 0 0 1px $primary,\n      0 0 0 3px rgba(19 124 189 / 30%),\n      inset 0 0 0 1px rgba(16 22 26 / 30%),\n      inset 0 1px 1px rgba(16 22 26 / 40%);\n    color: $text-color;\n  }\n}\n\n/* stylelint-disable no-descending-specificity */\n.text-input,\n.text-input[readonly],\n.text-input:focus {\n  background-color: $textfield-bg;\n}\n\n.input-control,\n.input-control:focus {\n  background-color: $secondary;\n}\n/* stylelint-enable no-descending-specificity */\n\ntextarea.text-input {\n  line-height: 2.5ex;\n  min-height: 12ex;\n  overflow-y: scroll;\n}\n\n.sr-only {\n  @include visually-hidden;\n}\n"
  },
  {
    "path": "frontend/src/utils/country.ts",
    "content": "import Countries from \"i18n-iso-countries\";\nimport english from \"i18n-iso-countries/langs/en.json\";\n\nCountries.registerLocale(english);\n\nconst fuzzyDict: Record<string, string> = {\n  USA: \"US\",\n  \"United States\": \"US\",\n  America: \"US\",\n  American: \"US\",\n  Czechia: \"CZ\",\n  England: \"GB\",\n  \"United Kingdom\": \"GB\",\n  Russia: \"RU\",\n  \"Slovak Republic\": \"SK\",\n};\n\nexport const getISOCountry = (country: string | null | undefined) => {\n  if (!country) return null;\n\n  const code = fuzzyDict[country] ?? Countries.getAlpha2Code(country, \"en\");\n  if (!code) return null;\n\n  return {\n    code,\n    name: Countries.getName(code, \"en\"),\n  };\n};\n\nexport const getCountryByISO = (iso?: string | null) => {\n  if (!iso) return null;\n  const country = Countries.getName(iso, \"en\", { select: \"alias\" });\n  return country ?? null;\n};\n"
  },
  {
    "path": "frontend/src/utils/createClient.ts",
    "content": "import {\n  ApolloClient,\n  InMemoryCache,\n  ApolloLink,\n  type TypePolicies,\n} from \"@apollo/client\";\nimport { ErrorLink } from \"@apollo/client/link/error\";\nimport { CombinedGraphQLErrors, ServerError } from \"@apollo/client\";\nimport { SetContextLink } from \"@apollo/client/link/context\";\nimport { RemoveTypenameFromVariablesLink } from \"@apollo/client/link/remove-typename\";\nimport UploadHttpLink from \"apollo-upload-client/UploadHttpLink.mjs\";\n\nconst typePolicies: TypePolicies = {\n  SceneDraft: {\n    keyFields: false,\n  },\n  PerformerDraft: {\n    keyFields: false,\n  },\n  Studio: {\n    fields: {\n      sub_studios: {\n        keyArgs: [\"input\"],\n      },\n    },\n  },\n  Query: {\n    fields: {\n      findStudio: {\n        merge: true,\n      },\n    },\n  },\n};\n\nconst isDevEnvironment = () => import.meta.env.DEV;\n\nexport const getCredentialsSetting = () =>\n  isDevEnvironment() && !import.meta.env.VITE_SERVER_URL\n    ? \"include\"\n    : \"same-origin\";\n\nexport const getPlatformURL = () => {\n  let platformUrl = new URL(window.location.origin);\n\n  if (isDevEnvironment()) {\n    platformUrl = new URL(\n      import.meta.env.VITE_SERVER_URL ?? window.location.origin,\n    );\n    platformUrl.port = import.meta.env.VITE_SERVER_PORT ?? \"9998\";\n  }\n\n  return platformUrl;\n};\n\nconst httpLink = new UploadHttpLink({\n  uri: `${getPlatformURL().toString().slice(0, -1)}/graphql`,\n  fetchOptions: {\n    mode: \"cors\",\n    credentials: getCredentialsSetting(),\n  },\n});\n\nconst authLink = new SetContextLink(({ headers, ...context }) => ({\n  headers: {\n    ...headers,\n    ...(import.meta.env.VITE_APIKEY && {\n      ApiKey: import.meta.env.VITE_APIKEY,\n    }),\n  },\n  ...context,\n}));\n\nconst errorLink = new ErrorLink(({ error }) => {\n  if (CombinedGraphQLErrors.is(error)) {\n    error.errors.forEach(({ message }) => {\n      console.log(`GraphQL error: ${message}`);\n    });\n  } else if (ServerError.is(error)) {\n    console.log(`Server error: ${error.message}`);\n  } else if (error) {\n    console.log(`Other error: ${error.message}`);\n  }\n});\n\nconst createClient = () =>\n  new ApolloClient({\n    link: ApolloLink.from([\n      authLink,\n      errorLink,\n      new RemoveTypenameFromVariablesLink(),\n      httpLink,\n    ]),\n    cache: new InMemoryCache({ typePolicies }),\n  });\n\nexport const setToken = (token: string) => {\n  localStorage.setItem(\"token\", token);\n};\n\nexport default createClient;\n"
  },
  {
    "path": "frontend/src/utils/data.ts",
    "content": "export const filterData = <T>(data?: (T | null | undefined)[] | null) =>\n  data ? (data.filter((item) => item) as T[]) : [];\n\nexport const compareByName = <T extends { name: string }>(a: T, b: T) =>\n  a.name > b.name ? 1 : a.name < b.name ? -1 : 0;\n"
  },
  {
    "path": "frontend/src/utils/date.ts",
    "content": "import { Temporal } from \"temporal-polyfill\";\n\nexport const formatDateTime = (dateTime: Date | string, utc = false) => {\n  const timeZone = utc ? \"UTC\" : undefined;\n  const date = dateTime instanceof Date ? dateTime : new Date(dateTime);\n  return `${date.toLocaleString(\"en-us\", {\n    month: \"short\",\n    year: \"numeric\",\n    day: \"numeric\",\n    timeZone,\n  })} ${date.toLocaleTimeString(navigator.languages[0], {\n    timeZone,\n  })}`;\n};\n\nexport const formatDate = (dateTime: Date | string, utc = false) => {\n  const timeZone = utc ? \"UTC\" : undefined;\n  const date = dateTime instanceof Date ? dateTime : new Date(dateTime);\n  return date.toLocaleString(\"en-us\", {\n    month: \"short\",\n    year: \"numeric\",\n    day: \"numeric\",\n    timeZone,\n  });\n};\n\nexport const formatISODate = (dateTime: Date | string) => {\n  const date = dateTime instanceof Date ? dateTime : new Date(dateTime);\n  return date.toISOString().slice(0, 10);\n};\n\nconst MIN_DATE = Temporal.PlainDate.from(\"1900-01-01\");\nexport const maxBirthdate = () =>\n  Temporal.Now.plainDateISO().add({ years: -18 });\nexport const maxDeathdate = () => Temporal.Now.plainDateISO();\nexport const maxReleaseDate = () =>\n  Temporal.Now.plainDateISO().add({ years: 1 });\n\nexport const isInstantInFuture = (instant: Temporal.Instant) =>\n  Temporal.Instant.compare(instant, Temporal.Now.instant()) > 0;\n\nexport const formatInstant = (instant: Temporal.Instant) =>\n  instant.toZonedDateTimeISO(Temporal.Now.timeZoneId()).toLocaleString();\n\nexport const isValidDate = (date?: string) => {\n  if (!date) return true;\n  try {\n    Temporal.PlainDate.from(date);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\nexport const isDateInRange = (\n  date: string | undefined,\n  end?: Temporal.PlainDate,\n) => {\n  if (!date) return true;\n\n  let parsedDate: Temporal.PlainDate;\n  try {\n    parsedDate = Temporal.PlainDate.from(date);\n  } catch {\n    return true;\n  }\n\n  if (Temporal.PlainDate.compare(parsedDate, MIN_DATE) < 0) return false;\n\n  if (end && Temporal.PlainDate.compare(parsedDate, end) > 0) return false;\n\n  return true;\n};\n\nexport const formatDistance = (\n  from: Temporal.Instant,\n  to?: Temporal.Instant,\n) => {\n  const toInstant = to ?? Temporal.Now.instant();\n  const tz = Temporal.Now.timeZoneId();\n  const fromZDT = from.toZonedDateTimeISO(tz);\n  const toZDT = toInstant.toZonedDateTimeISO(tz);\n\n  const rough = fromZDT.since(toZDT, { largestUnit: \"year\" });\n  const rtf = new Intl.RelativeTimeFormat(\"en\", { numeric: \"auto\" });\n  const round = (unit: Temporal.DateTimeUnit) =>\n    fromZDT.since(toZDT, {\n      largestUnit: unit,\n      smallestUnit: unit,\n      roundingMode: \"halfExpand\",\n    });\n\n  if (rough.years) return rtf.format(round(\"year\").years, \"year\");\n  if (rough.months) return rtf.format(round(\"month\").months, \"month\");\n  if (rough.days) return rtf.format(round(\"day\").days, \"day\");\n  if (rough.hours) return rtf.format(round(\"hour\").hours, \"hour\");\n  if (rough.minutes) return rtf.format(round(\"minute\").minutes, \"minute\");\n  return rtf.format(round(\"second\").seconds, \"second\");\n};\n\nexport const parseDate = (date?: string): Temporal.PlainDate | undefined => {\n  if (!date) return;\n\n  try {\n    return Temporal.PlainDate.from(date);\n  } catch {\n    return;\n  }\n};\n\nexport const parseInstant = (date?: string): Temporal.Instant | undefined => {\n  if (!date) return;\n\n  try {\n    return Temporal.Instant.from(date);\n  } catch {\n    return;\n  }\n};\n"
  },
  {
    "path": "frontend/src/utils/diff.ts",
    "content": "export const diffArray = <T>(a: T[], b: T[], getKey: (t: T) => string) => [\n  a.filter((x) => !b.some((val) => getKey(val) === getKey(x))),\n  b.filter((x) => !a.some((val) => getKey(val) === getKey(x))),\n];\n\nexport const diffValue = <T>(\n  a: T | undefined | null,\n  b: T | undefined | null,\n): T | null => (a && a !== b ? a : null);\n\nexport const diffImages = (\n  newImages:\n    | {\n        id: string | undefined;\n        url: string | undefined;\n        width: number | undefined;\n        height: number | undefined;\n      }[]\n    | undefined,\n  oldImages: { id: string; url: string; width: number; height: number }[],\n) =>\n  diffArray(\n    (newImages ?? []).flatMap((i) =>\n      i.id && i.url && i.height && i.width\n        ? [\n            {\n              id: i.id,\n              url: i.url,\n              width: i.width,\n              height: i.height,\n            },\n          ]\n        : [],\n    ),\n    oldImages,\n    (i) => i.id,\n  );\n\nexport const diffURLs = (\n  newURLs:\n    | {\n        url: string | undefined;\n        site:\n          | {\n              id: string | undefined;\n              name: string | undefined;\n              icon: string | undefined;\n            }\n          | undefined;\n      }[]\n    | undefined,\n  originalURLs: {\n    url: string;\n    site: {\n      id: string;\n      name: string;\n      icon: string;\n    };\n  }[],\n) =>\n  diffArray(\n    (newURLs ?? []).map((u) => ({\n      url: u.url ?? \"\",\n      site: {\n        id: u.site?.id ?? \"\",\n        name: u.site?.name ?? \"\",\n        icon: u.site?.icon ?? \"\",\n      },\n    })),\n    originalURLs.map((u) => ({\n      url: u.url,\n      site: {\n        id: u.site.id,\n        name: u.site.name,\n        icon: u.site.icon,\n      },\n    })),\n    (u) => `${u.site.name ?? \"Unknown\"}: ${u.url}`,\n  );\n"
  },
  {
    "path": "frontend/src/utils/edit.ts",
    "content": "import type { EditsQuery } from \"src/graphql\";\nimport { ROUTE_HOME } from \"src/constants/route\";\nimport { performerHref, tagHref, studioHref, sceneHref } from \"./route\";\n\ntype Edits = NonNullable<EditsQuery[\"queryEdits\"][\"edits\"][number]>;\n\ntype Details = Edits[\"details\"];\n\ntype Target = NonNullable<Edits[\"target\"]>;\ntype Tag = Target & { __typename: \"Tag\" };\ntype Performer = Target & { __typename: \"Performer\" };\ntype Studio = Target & { __typename: \"Studio\" };\ntype Scene = Target & { __typename: \"Scene\" };\n\ninterface TypeName {\n  __typename: string;\n}\n\nexport const isTag = (\n  entity: TypeName | null | undefined,\n): entity is Tag | undefined =>\n  entity?.__typename === \"Tag\" || entity === undefined;\n\nexport const isPerformer = (\n  entity: TypeName | null | undefined,\n): entity is Performer | undefined =>\n  entity?.__typename === \"Performer\" || entity === undefined;\n\nexport const isStudio = (\n  entity: TypeName | null | undefined,\n): entity is Studio | undefined =>\n  entity?.__typename === \"Studio\" || entity === undefined;\n\nexport const isScene = (\n  entity: TypeName | null | undefined,\n): entity is Scene | undefined =>\n  entity?.__typename === \"Scene\" || entity === undefined;\n\nexport const isTagEdit = <T extends TypeName>(\n  details?: T | null,\n): details is T & { __typename: \"TagEdit\" } =>\n  details?.__typename === \"TagEdit\";\n\nexport const isPerformerEdit = <T extends TypeName>(\n  details?: T | null,\n): details is T & { __typename: \"PerformerEdit\" } =>\n  details?.__typename === \"PerformerEdit\";\n\nexport const isStudioEdit = <T extends TypeName>(\n  details?: T | null,\n): details is T & { __typename: \"StudioEdit\" } =>\n  details?.__typename === \"StudioEdit\";\n\nexport const isSceneEdit = <T extends TypeName>(\n  details?: T | null,\n): details is T & { __typename: \"SceneEdit\" } =>\n  details?.__typename === \"SceneEdit\";\n\nexport const isValidEditTarget = (\n  target: Target | null | undefined,\n): target is Performer | Tag | Studio | Scene =>\n  (isPerformer(target) ||\n    isTag(target) ||\n    isStudio(target) ||\n    isScene(target)) &&\n  target !== undefined;\n\nexport const getEditTargetRoute = (target: Target): string => {\n  if (isTag(target)) {\n    return tagHref(target);\n  }\n  if (isPerformer(target)) {\n    return performerHref(target);\n  }\n  if (isStudio(target)) {\n    return studioHref(target);\n  }\n  if (isScene(target)) {\n    return sceneHref(target);\n  }\n\n  return ROUTE_HOME;\n};\n\nexport const getEditTargetName = (target?: Target | null): string => {\n  if (!target) return \"-\";\n\n  if (isScene(target)) {\n    return target.title || target.id;\n  }\n\n  if (isPerformer(target)) {\n    const disambiguation = target?.disambiguation\n      ? ` (${target?.disambiguation})`\n      : \"\";\n    return `${target?.name}${disambiguation}`;\n  }\n  return target.name || target.id;\n};\n\nexport const getEditTargetEntity = (target: Target) => {\n  if (isTag(target)) {\n    return \"Tag\";\n  }\n  if (isPerformer(target)) {\n    return \"Performer\";\n  }\n  if (isStudio(target)) {\n    return \"Studio\";\n  }\n  if (isScene(target)) {\n    return \"Scene\";\n  }\n};\n\nexport const getEditDetailsName = (details: Details | null): string => {\n  if (isSceneEdit(details)) {\n    return details.title ?? \"-\";\n  }\n\n  if (isPerformerEdit(details)) {\n    const disambiguation = details?.disambiguation\n      ? ` (${details?.disambiguation})`\n      : \"\";\n    return `${details?.name}${disambiguation}`;\n  }\n\n  return details?.name ?? \"-\";\n};\n"
  },
  {
    "path": "frontend/src/utils/enum.ts",
    "content": "import {\n  BreastTypeEnum,\n  FingerprintAlgorithm,\n  EthnicityEnum,\n  GenderEnum,\n  NotificationEnum,\n} from \"src/graphql\";\n\nexport const genderEnum = (\n  gender: string | undefined | null,\n): GenderEnum | null =>\n  gender === \"MALE\"\n    ? GenderEnum.MALE\n    : gender === \"FEMALE\"\n      ? GenderEnum.FEMALE\n      : gender === \"NON_BINARY\"\n        ? GenderEnum.NON_BINARY\n        : gender === \"TRANSGENDER_MALE\"\n          ? GenderEnum.TRANSGENDER_MALE\n          : gender === \"TRANSGENDER_FEMALE\"\n            ? GenderEnum.TRANSGENDER_FEMALE\n            : gender === \"INTERSEX\"\n              ? GenderEnum.INTERSEX\n              : null;\n\nexport const ethnicityEnum = (\n  ethnicity: string | undefined | null,\n): EthnicityEnum | null => {\n  switch (ethnicity) {\n    case \"ASIAN\":\n      return EthnicityEnum.ASIAN;\n    case \"BLACK\":\n      return EthnicityEnum.BLACK;\n    case \"CAUCASIAN\":\n      return EthnicityEnum.CAUCASIAN;\n    case \"INDIAN\":\n      return EthnicityEnum.INDIAN;\n    case \"LATIN\":\n      return EthnicityEnum.LATIN;\n    case \"MIDDLE_EASTERN\":\n      return EthnicityEnum.MIDDLE_EASTERN;\n    case \"MIXED\":\n      return EthnicityEnum.MIXED;\n    case \"OTHER\":\n      return EthnicityEnum.OTHER;\n    default:\n      return null;\n  }\n};\n\nexport const fingerprintAlgorithm = (\n  algorithm: string | undefined | null,\n): FingerprintAlgorithm | null =>\n  algorithm === \"MD5\"\n    ? FingerprintAlgorithm.MD5\n    : algorithm === \"OSHASH\"\n      ? FingerprintAlgorithm.OSHASH\n      : algorithm === \"PHASH\"\n        ? FingerprintAlgorithm.PHASH\n        : null;\n\nexport const breastType = (\n  type: string | undefined | null,\n): BreastTypeEnum | null => {\n  switch (type) {\n    case \"FAKE\":\n      return BreastTypeEnum.FAKE;\n    case \"NA\":\n      return BreastTypeEnum.NA;\n    case \"NATURAL\":\n      return BreastTypeEnum.NATURAL;\n    default:\n      return null;\n  }\n};\n\nexport const ensureEnum = <T>(enm: { [s: string]: T }, value: string): T =>\n  (Object.values(enm) as unknown as string[]).includes(value.toUpperCase())\n    ? (value.toUpperCase() as unknown as T)\n    : Object.values(enm)[0];\n\nexport const resolveEnum = <T>(\n  enm: { [s: string]: T },\n  value: string | null,\n  defaultValue?: T,\n): T | undefined =>\n  value &&\n  (Object.values(enm) as unknown as string[]).includes(value.toUpperCase())\n    ? (value.toUpperCase() as unknown as T)\n    : defaultValue;\n\nexport const FavoriteNotificationType = {\n  [NotificationEnum.FAVORITE_PERFORMER_EDIT]:\n    \"An edit to a performer you have favorited, or a scene involving them.\",\n  [NotificationEnum.FAVORITE_STUDIO_EDIT]:\n    \"An edit to a studio you have favorited, or a scene from that studio.\",\n  [NotificationEnum.FAVORITE_STUDIO_SCENE]:\n    \"A new scene from a studio you have favorited.\",\n  [NotificationEnum.FAVORITE_PERFORMER_SCENE]:\n    \"A new scene involving a performer you have favorited.\",\n} as const;\nexport const NotificationType = {\n  [NotificationEnum.UPDATED_EDIT]: \"Updates to an edit you have voted on.\",\n  [NotificationEnum.COMMENT_OWN_EDIT]: \"Comments on one of your edits\",\n  [NotificationEnum.DOWNVOTE_OWN_EDIT]: \"Downvotes on one of your edits\",\n  [NotificationEnum.FAILED_OWN_EDIT]: \"One of your edits have failed\",\n  [NotificationEnum.COMMENT_COMMENTED_EDIT]:\n    \"Comments on edits you have commented on\",\n  [NotificationEnum.COMMENT_VOTED_EDIT]: \"Comments on edits you have voted on\",\n  [NotificationEnum.FINGERPRINTED_SCENE_EDIT]:\n    \"An edit to a scene you have submitted fingerprints for.\",\n  ...FavoriteNotificationType,\n} as const;\n"
  },
  {
    "path": "frontend/src/utils/general.ts",
    "content": "export const isUUID = (term: string): boolean =>\n  /^[a-f\\d]{8}-[a-f\\d]{4}-[a-f\\d]{4}-[a-f\\d]{4}-[a-f\\d]{12}$/i.test(term);\n"
  },
  {
    "path": "frontend/src/utils/index.ts",
    "content": "export * from \"./country\";\nexport * from \"./date\";\nexport * from \"./edit\";\nexport * from \"./general\";\nexport * from \"./transforms\";\nexport * from \"./route\";\nexport * from \"./markdown\";\nexport * from \"./enum\";\nexport * from \"./user\";\nexport * from \"./diff\";\nexport * from \"./data\";\nexport * from \"./intl\";\nexport * from \"./url\";\n"
  },
  {
    "path": "frontend/src/utils/intl.ts",
    "content": "const enOrdinalRules = new Intl.PluralRules(\"en-US\", { type: \"ordinal\" });\n\nconst suffixes = new Map([\n  [\"one\", \"st\"],\n  [\"two\", \"nd\"],\n  [\"few\", \"rd\"],\n  [\"other\", \"th\"],\n]);\n\nexport const formatOrdinals = (num: number) => {\n  const rule = enOrdinalRules.select(num);\n  const suffix = suffixes.get(rule);\n  return `${num}${suffix}`;\n};\n"
  },
  {
    "path": "frontend/src/utils/markdown.tsx",
    "content": "import type { FC } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport RemarkGFM from \"remark-gfm\";\nimport RemarkBreaks from \"remark-breaks\";\nimport RehypeExternalLinks from \"rehype-external-links\";\n\ninterface Props {\n  text: string | null | undefined;\n  unique?: string;\n}\n\nexport const Markdown: FC<Props> = ({ text, unique }) =>\n  text ? (\n    <ReactMarkdown\n      remarkPlugins={[RemarkGFM, RemarkBreaks]}\n      rehypePlugins={[\n        [RehypeExternalLinks, { rel: [\"nofollow\", \"noopener\", \"noreferrer\"] }],\n      ]}\n      remarkRehypeOptions={{\n        clobberPrefix: unique ? `${unique}-` : undefined,\n      }}\n      disallowedElements={[\"img\"]}\n      components={{\n        input: (props) => (\n          <input\n            className={props.type === \"checkbox\" ? \"form-check-input\" : \"\"}\n            {...props}\n          />\n        ),\n      }}\n    >\n      {text}\n    </ReactMarkdown>\n  ) : null;\n"
  },
  {
    "path": "frontend/src/utils/route.ts",
    "content": "import { generatePath, matchPath } from \"react-router-dom\";\nimport {\n  ROUTE_TAG,\n  ROUTE_PERFORMER,\n  ROUTE_CATEGORY,\n  ROUTE_EDIT,\n  ROUTE_STUDIO,\n  ROUTE_SCENE,\n  ROUTE_SITE,\n  ROUTE_USER,\n} from \"src/constants/route\";\nimport { isUUID } from \"./general\";\n\nexport const userHref = (obj: { name: string }, route: string = ROUTE_USER) =>\n  generatePath(route, { name: obj.name ?? \"_\" });\n\nexport const sceneHref = (obj: { id: string }, route: string = ROUTE_SCENE) =>\n  generatePath(route, obj);\n\nexport const studioHref = (obj: { id: string }, route: string = ROUTE_STUDIO) =>\n  generatePath(route, obj);\n\nexport const editHref = (obj: { id: string }, route: string = ROUTE_EDIT) =>\n  generatePath(route, obj);\n\nexport const categoryHref = (\n  obj: { id: string },\n  route: string = ROUTE_CATEGORY,\n) => generatePath(route, obj);\n\nexport const tagHref = (obj: { id: string }, route: string = ROUTE_TAG) =>\n  generatePath(route, { id: obj.id ?? \"_\" });\n\nexport const performerHref = (\n  obj: { id: string },\n  route: string = ROUTE_PERFORMER,\n) => generatePath(route, obj);\n\nexport const siteHref = (obj: { id: string }, route: string = ROUTE_SITE) =>\n  generatePath(route, obj);\n\nexport const createHref = (route: string, params: unknown = {}) =>\n  generatePath(\n    route,\n    params as Record<string, string | number | boolean | undefined>,\n  );\n\nconst ROUTES_WITH_ID = [ROUTE_PERFORMER, ROUTE_SCENE, ROUTE_STUDIO, ROUTE_TAG];\n\n// Extracts a UUID from a local URL (e.g., /performers/{id}, /scenes/{id})\nexport const extractIdFromUrl = (text: string): string => {\n  const trimmed = text.trim();\n\n  if (isUUID(trimmed)) {\n    return trimmed;\n  }\n\n  try {\n    const url = new URL(trimmed);\n\n    // Only process URLs from the same origin\n    if (url.origin !== window.location.origin) {\n      return trimmed;\n    }\n\n    for (const route of ROUTES_WITH_ID) {\n      const match = matchPath(route, url.pathname);\n      if (match?.params.id && isUUID(match.params.id)) {\n        return match.params.id;\n      }\n    }\n  } catch {\n    // Not a valid URL, return original text\n  }\n\n  return trimmed;\n};\n"
  },
  {
    "path": "frontend/src/utils/transforms.ts",
    "content": "import type { UrlFragment } from \"src/graphql\";\n\nexport const formatCareer = (\n  start?: number | null,\n  end?: number | null,\n): string | undefined =>\n  start || end ? `Active ${start ?? \"????\"}\\u2013${end ?? \"\"}` : undefined;\n\nexport const formatMeasurements = ({\n  cup_size,\n  band_size,\n  hip_size,\n  waist_size,\n}: {\n  cup_size?: string | null;\n  band_size?: number | null;\n  waist_size?: number | null;\n  hip_size?: number | null;\n}): string | undefined => {\n  if (cup_size || band_size || hip_size || waist_size) {\n    const bust = `${band_size ?? \"?\"}${cup_size ?? \"?\"}`;\n    return `${bust}-${waist_size ?? \"??\"}-${hip_size ?? \"??\"}`;\n  }\n  return undefined;\n};\n\nexport const getBraSize = (\n  cup_size: string | null | undefined,\n  band_size: number | null | undefined,\n): string | undefined =>\n  band_size && cup_size ? `${band_size}${cup_size}` : undefined;\n\ntype Image = {\n  url: string;\n  width: number;\n  height: number;\n};\n\nexport const sortImageURLs = (\n  urls: Image[],\n  orientation: \"portrait\" | \"landscape\",\n) =>\n  urls\n    .map((u) => ({\n      ...u,\n      aspect:\n        orientation === \"portrait\"\n          ? u.height / u.width > 1\n          : u.width / u.height > 1,\n    }))\n    .sort((a, b) => {\n      if (a.aspect > b.aspect) return -1;\n      if (a.aspect < b.aspect) return 1;\n      if (orientation === \"portrait\" && a.height > b.height) return -1;\n      if (orientation === \"portrait\" && a.height < b.height) return 1;\n      if (orientation === \"landscape\" && a.width > b.width) return -1;\n      if (orientation === \"landscape\" && a.width < b.width) return 1;\n      return 0;\n    });\n\nexport const getImage = (\n  urls: Image[],\n  orientation: \"portrait\" | \"landscape\",\n) => {\n  const images = sortImageURLs(urls, orientation);\n  return images?.[0]?.url;\n};\n\nexport const imageType = (image?: Image) => {\n  if (image && image.height > image.width) {\n    return `vertical-img`;\n  } else {\n    return `horizontal-img`;\n  }\n};\n\nexport const getUrlBySite = (urls: UrlFragment[], name: string) =>\n  urls.find((url) => url.site.name === name) ?? urls[0];\n\nexport const formatBodyModification = (\n  bodyMod?: { location: string; description?: string | null } | null,\n) =>\n  bodyMod\n    ? bodyMod.location +\n      (bodyMod.description ? ` (${bodyMod.description})` : \"\")\n    : null;\n\nexport const formatBodyModifications = (\n  bodyMod?: { location: string; description?: string | null }[] | null,\n) => (bodyMod ?? []).map(formatBodyModification).join(\", \");\n\nexport const formatPendingEdits = (count?: number) =>\n  count ? ` (${count} Pending)` : \"\";\n\nexport const formatDuration = (dur?: number | null) => {\n  if (!dur) return \"\";\n  let value = dur;\n  let hour = 0;\n  let minute = 0;\n  let seconds = 0;\n  if (value >= 3600) {\n    hour = Math.floor(value / 3600);\n    value -= hour * 3600;\n  }\n  minute = Math.floor(value / 60);\n  value -= minute * 60;\n  seconds = value;\n\n  const res = [\n    minute.toString().padStart(2, \"0\"),\n    seconds.toString().padStart(2, \"0\"),\n  ];\n  if (hour) res.unshift(hour.toString());\n  return res.join(\":\");\n};\n\nexport const parseDuration = (\n  dur: string | null | undefined,\n): number | null => {\n  if (!dur) return null;\n\n  const regex = /^((?<hours>\\d+:)?(?<minutes>[0-5]?\\d):)?(?<seconds>[0-5]?\\d)$/;\n  const matches = regex.exec(dur);\n  const hours = matches?.groups?.hours ?? \"0\";\n  const minutes = matches?.groups?.minutes ?? \"0\";\n  const seconds = matches?.groups?.seconds ?? \"0\";\n\n  const duration =\n    Number.parseInt(seconds, 10) +\n    Number.parseInt(minutes, 10) * 60 +\n    Number.parseInt(hours, 10) * 3600;\n  return duration > 0 ? duration : null;\n};\n\nexport const parseBraSize = (braSize = \"\"): [string | null, number | null] => {\n  const band = /^\\d+/.exec(braSize)?.[0];\n  const bandSize = band ? Number.parseInt(band, 10) : null;\n  const cup = bandSize ? braSize.replace(bandSize.toString(), \"\") : null;\n  const cupSize = cup\n    ? (/^[a-zA-Z]+/.exec(cup)?.[0]?.toUpperCase() ?? null)\n    : null;\n\n  return [cupSize, bandSize];\n};\n\nexport const formatDisambiguation = ({\n  disambiguation,\n}: {\n  disambiguation?: string | null;\n}) => (disambiguation ? ` (${disambiguation})` : \"\");\n"
  },
  {
    "path": "frontend/src/utils/url.ts",
    "content": "export const cleanURL = (\n  regexStr: string | undefined | null,\n  url: string,\n): string | undefined => {\n  if (!regexStr) return;\n\n  const regex = new RegExp(regexStr);\n  const match = regex.exec(url);\n\n  if (match == null || match.length < 2) {\n    return match?.[1];\n  } else {\n    match.shift();\n    return match.join(\"\");\n  }\n};\n"
  },
  {
    "path": "frontend/src/utils/user.ts",
    "content": "import type { User } from \"../context\";\nimport { type UserQuery, type PublicUserQuery, RoleEnum } from \"src/graphql\";\n\ntype PrivateUser = NonNullable<UserQuery[\"findUser\"]>;\ntype PublicUser = NonNullable<PublicUserQuery[\"findUser\"]>;\n\nconst USER_STORAGE = \"stash_box_user\";\nconst cache = localStorage.getItem(USER_STORAGE);\nconst cachedUser = cache ? (JSON.parse(cache) as User) : undefined;\n\nexport const getCachedUser = () => cachedUser;\nexport const setCachedUser = (user?: User | null) => {\n  if (user) localStorage.setItem(USER_STORAGE, JSON.stringify(user));\n  else localStorage.removeItem(USER_STORAGE);\n};\n\nexport const isPrivateUser = (\n  user: PublicUser | PrivateUser,\n): user is PrivateUser => !!(user as PrivateUser).email;\n\nexport const isAdmin = (user?: User) =>\n  (user?.roles ?? []).includes(RoleEnum.ADMIN);\n\nexport const canEdit = (user?: User) =>\n  (user?.roles ?? []).includes(RoleEnum.EDIT) || isAdmin(user);\n\nexport const canTagEdit = (user?: User) =>\n  (user?.roles ?? []).includes(RoleEnum.EDIT_TAGS) || isAdmin(user);\n\nexport const canVote = (user?: User) =>\n  (user?.roles ?? []).includes(RoleEnum.VOTE) || isAdmin(user);\n\nexport const canModerate = (user?: User) =>\n  (user?.roles ?? []).includes(RoleEnum.MODERATE) || isAdmin(user);\n"
  },
  {
    "path": "frontend/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"bundler\",\n    \"resolveJsonModule\": true,\n    \"target\": \"ESNext\",\n    \"jsx\": \"react-jsx\",\n    \"lib\": [\n      \"dom\",\n      \"dom.iterable\",\n      \"esnext\"\n    ],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"paths\": {\n      \"src/*\": [\"./src/*\"]\n    },\n    \"noFallthroughCasesInSwitch\": true,\n    \"types\": [\n      \"node\",\n      \"vite/client\"\n    ]\n  },\n  \"include\": [\n    \"src/**/*\"\n  ]\n}\n"
  },
  {
    "path": "frontend/vite.config.mjs",
    "content": "import { defineConfig, loadEnv } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\nimport graphqlPlugin from \"vite-plugin-graphql-loader\";\nimport analyzePlugin from \"rollup-plugin-analyzer\";\n\nexport default defineConfig(({ mode }) => {\n  const env = {\n    ...process.env,\n    ...loadEnv(mode, process.cwd(), \"\"),\n  };\n\n  /** @type {import(\"vite\").UserConfig} */\n  const config = {\n    build: {\n      outDir: \"build\",\n      assetsDir: \"assets\",\n      sourcemap: mode === \"production\",\n    },\n    optimizeDeps: {\n      entries: \"src/index.tsx\",\n    },\n    server: {\n      port: Number(env.PORT) || undefined,\n    },\n    plugins: [\n      react(),\n      graphqlPlugin(),\n    ],\n    resolve: {\n      tsconfigPaths: true\n    }\n  };\n\n  if (process.env.analyze) {\n    config.plugins.push(\n      analyzePlugin({ summaryOnly: true, limit: 30 })\n    );\n  }\n\n  return config;\n});\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/stashapp/stash-box\n\ngo 1.25.0\n\nrequire (\n\tgithub.com/99designs/gqlgen v0.17.89\n\tgithub.com/Masterminds/squirrel v1.5.4\n\tgithub.com/davidbyttow/govips/v2 v2.18.0\n\tgithub.com/disintegration/imaging v1.6.2\n\tgithub.com/exaring/otelpgx v0.10.0\n\tgithub.com/go-chi/chi/v5 v5.2.5\n\tgithub.com/gofrs/uuid v4.3.1+incompatible\n\tgithub.com/golang-jwt/jwt/v5 v5.3.1\n\tgithub.com/golang-migrate/migrate/v4 v4.19.1\n\tgithub.com/gorilla/sessions v1.4.0\n\tgithub.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c\n\tgithub.com/jackc/pgx/v5 v5.9.1\n\tgithub.com/klauspost/compress v1.18.5\n\tgithub.com/minio/minio-go/v7 v7.0.100\n\tgithub.com/ravilushqa/otelgqlgen v0.19.0\n\tgithub.com/riandyrn/otelchi v0.12.2\n\tgithub.com/robfig/cron/v3 v3.0.1\n\tgithub.com/rs/cors v1.11.1\n\tgithub.com/sirupsen/logrus v1.9.4\n\tgithub.com/spf13/pflag v1.0.10\n\tgithub.com/spf13/viper v1.21.0\n\tgithub.com/stretchr/testify v1.11.1\n\tgithub.com/vektah/gqlparser/v2 v2.5.32\n\tgithub.com/wneessen/go-mail v0.7.2\n\tgo.deanishe.net/favicon v0.1.0\n\tgo.opentelemetry.io/otel v1.43.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0\n\tgo.opentelemetry.io/otel/sdk v1.43.0\n\tgo.opentelemetry.io/otel/trace v1.43.0\n\tgolang.org/x/crypto v0.49.0\n\tgolang.org/x/image v0.38.0\n\tgolang.org/x/net v0.52.0\n\tgolang.org/x/sync v0.20.0\n)\n\nrequire (\n\tcel.dev/expr v0.25.1 // indirect\n\tfilippo.io/edwards25519 v1.1.1 // indirect\n\tgithub.com/PuerkitoBio/goquery v1.11.0 // indirect\n\tgithub.com/agnivade/levenshtein v1.2.1 // indirect\n\tgithub.com/andybalholm/cascadia v1.3.3 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.1 // indirect\n\tgithub.com/cenkalti/backoff/v5 v5.0.3 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n\tgithub.com/cubicdaiya/gonp v1.0.4 // indirect\n\tgithub.com/dave/jennifer v1.6.0 // indirect\n\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n\tgithub.com/dustin/go-humanize v1.0.1 // indirect\n\tgithub.com/fatih/structtag v1.2.0 // indirect\n\tgithub.com/felixge/httpsnoop v1.0.4 // indirect\n\tgithub.com/friendsofgo/errors v0.9.2 // indirect\n\tgithub.com/fsnotify/fsnotify v1.9.0 // indirect\n\tgithub.com/go-ini/ini v1.67.0 // indirect\n\tgithub.com/go-logr/logr v1.4.3 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-sql-driver/mysql v1.9.2 // indirect\n\tgithub.com/go-viper/mapstructure/v2 v2.5.0 // indirect\n\tgithub.com/goccy/go-yaml v1.19.2 // indirect\n\tgithub.com/google/cel-go v0.24.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/gorilla/securecookie v1.1.2 // indirect\n\tgithub.com/gorilla/websocket v1.5.3 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect\n\tgithub.com/hashicorp/golang-lru/v2 v2.0.7 // indirect\n\tgithub.com/inconshreveable/mousetrap v1.1.0 // indirect\n\tgithub.com/jackc/pgpassfile v1.0.0 // indirect\n\tgithub.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect\n\tgithub.com/jackc/puddle/v2 v2.2.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jmattheis/goverter v1.9.1 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.11 // indirect\n\tgithub.com/klauspost/crc32 v1.3.0 // indirect\n\tgithub.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect\n\tgithub.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect\n\tgithub.com/lib/pq v1.10.9 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/minio/crc64nvme v1.1.1 // indirect\n\tgithub.com/minio/md5-simd v1.1.2 // indirect\n\tgithub.com/ncruces/go-strftime v0.1.9 // indirect\n\tgithub.com/pelletier/go-toml/v2 v2.2.4 // indirect\n\tgithub.com/pganalyze/pg_query_go/v6 v6.1.0 // indirect\n\tgithub.com/philhofer/fwd v1.2.0 // indirect\n\tgithub.com/pingcap/errors v0.11.5-0.20240311024730-e056997136bb // indirect\n\tgithub.com/pingcap/failpoint v0.0.0-20240528011301-b51a646c7c86 // indirect\n\tgithub.com/pingcap/log v1.1.0 // indirect\n\tgithub.com/pingcap/tidb/pkg/parser v0.0.0-20250324122243-d51e00e5bbf0 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n\tgithub.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect\n\tgithub.com/riza-io/grpc-go v0.2.0 // indirect\n\tgithub.com/rs/xid v1.6.0 // indirect\n\tgithub.com/sagikazarmark/locafero v0.11.0 // indirect\n\tgithub.com/sergi/go-diff v1.4.0 // indirect\n\tgithub.com/sosodev/duration v1.4.0 // indirect\n\tgithub.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect\n\tgithub.com/spf13/afero v1.15.0 // indirect\n\tgithub.com/spf13/cast v1.10.0 // indirect\n\tgithub.com/spf13/cobra v1.9.1 // indirect\n\tgithub.com/sqlc-dev/sqlc v1.29.0 // indirect\n\tgithub.com/stoewer/go-strcase v1.2.0 // indirect\n\tgithub.com/subosito/gotenv v1.6.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.9.0 // indirect\n\tgithub.com/tinylib/msgp v1.6.1 // indirect\n\tgithub.com/urfave/cli/v3 v3.7.0 // indirect\n\tgithub.com/vektah/dataloaden v0.3.0 // indirect\n\tgithub.com/wasilibs/go-pgquery v0.0.0-20250409022910-10ac41983c07 // indirect\n\tgithub.com/wasilibs/wazero-helpers v0.0.0-20240620070341-3dff1577cd52 // indirect\n\tgo.opentelemetry.io/auto/sdk v1.2.1 // indirect\n\tgo.opentelemetry.io/contrib v1.36.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.43.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.10.0 // indirect\n\tgo.uber.org/atomic v1.11.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgo.yaml.in/yaml/v3 v3.0.4 // indirect\n\tgolang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect\n\tgolang.org/x/mod v0.33.0 // indirect\n\tgolang.org/x/sys v0.42.0 // indirect\n\tgolang.org/x/text v0.35.0 // indirect\n\tgolang.org/x/tools v0.42.0 // indirect\n\tgolang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect\n\tgoogle.golang.org/grpc v1.80.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.11 // indirect\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tmodernc.org/libc v1.62.1 // indirect\n\tmodernc.org/mathutil v1.7.1 // indirect\n\tmodernc.org/memory v1.9.1 // indirect\n\tmodernc.org/sqlite v1.37.0 // indirect\n)\n\ntool (\n\tgithub.com/99designs/gqlgen\n\tgithub.com/99designs/gqlgen/graphql/introspection\n\tgithub.com/jmattheis/goverter/cmd/goverter\n\tgithub.com/sqlc-dev/sqlc/cmd/sqlc\n\tgithub.com/vektah/dataloaden\n)\n"
  },
  {
    "path": "go.sum",
    "content": "cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4=\ncel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=\nfilippo.io/edwards25519 v1.1.1 h1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw=\nfilippo.io/edwards25519 v1.1.1/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=\ngithub.com/99designs/gqlgen v0.17.89 h1:KzEcxPiMgQoMw3m/E85atUEHyZyt0PbAflMia5Kw8z8=\ngithub.com/99designs/gqlgen v0.17.89/go.mod h1:GFqruTVGB7ZTdrf1uzOagpXbY7DrEt1pIxnTdhIbWvQ=\ngithub.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=\ngithub.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM=\ngithub.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=\ngithub.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=\ngithub.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=\ngithub.com/PuerkitoBio/goquery v1.6.0/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=\ngithub.com/PuerkitoBio/goquery v1.11.0 h1:jZ7pwMQXIITcUXNH83LLk+txlaEy6NVOfTuP43xxfqw=\ngithub.com/PuerkitoBio/goquery v1.11.0/go.mod h1:wQHgxUOU3JGuj3oD/QFfxUdlzW6xPHfqyHre6VMY4DQ=\ngithub.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM=\ngithub.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU=\ngithub.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=\ngithub.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=\ngithub.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=\ngithub.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=\ngithub.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=\ngithub.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=\ngithub.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=\ngithub.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=\ngithub.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=\ngithub.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=\ngithub.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48=\ngithub.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=\ngithub.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=\ngithub.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=\ngithub.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\ngithub.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=\ngithub.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=\ngithub.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=\ngithub.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=\ngithub.com/cubicdaiya/gonp v1.0.4 h1:ky2uIAJh81WiLcGKBVD5R7KsM/36W6IqqTy6Bo6rGws=\ngithub.com/cubicdaiya/gonp v1.0.4/go.mod h1:iWGuP/7+JVTn02OWhRemVbMmG1DOUnmrGTYYACpOI0I=\ngithub.com/dave/jennifer v1.6.0 h1:MQ/6emI2xM7wt0tJzJzyUik2Q3Tcn2eE0vtYgh4GPVI=\ngithub.com/dave/jennifer v1.6.0/go.mod h1:AxTG893FiZKqxy3FP1kL80VMshSMuz2G+EgvszgGRnk=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davidbyttow/govips/v2 v2.18.0 h1:pZRshWVYvewP/TZx3yZ7YeC42WyLXg53tHy5Qt8nT9E=\ngithub.com/davidbyttow/govips/v2 v2.18.0/go.mod h1:8+nst5zfMoats12PgmmAPh6p5OfjDaXK0BXMFl/vOcM=\ngithub.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo=\ngithub.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=\ngithub.com/dhui/dktest v0.4.6 h1:+DPKyScKSEp3VLtbMDHcUq6V5Lm5zfZZVb0Sk7Ahom4=\ngithub.com/dhui/dktest v0.4.6/go.mod h1:JHTSYDtKkvFNFHJKqCzVzqXecyv+tKt8EzceOmQOgbU=\ngithub.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=\ngithub.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=\ngithub.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=\ngithub.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=\ngithub.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI=\ngithub.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=\ngithub.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=\ngithub.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=\ngithub.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=\ngithub.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=\ngithub.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=\ngithub.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=\ngithub.com/exaring/otelpgx v0.10.0 h1:NGGegdoBQM3jNZDKG8ENhigUcgBN7d7943L0YlcIpZc=\ngithub.com/exaring/otelpgx v0.10.0/go.mod h1:R5/M5LWsPPBZc1SrRE5e0DiU48bI78C1/GPTWs6I66U=\ngithub.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=\ngithub.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=\ngithub.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=\ngithub.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=\ngithub.com/friendsofgo/errors v0.9.2 h1:X6NYxef4efCBdwI7BgS820zFaN7Cphrmb+Pljdzjtgk=\ngithub.com/friendsofgo/errors v0.9.2/go.mod h1:yCvFW5AkDIL9qn7suHVLiI/gH228n7PC4Pn44IGoTOI=\ngithub.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=\ngithub.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=\ngithub.com/go-chi/chi/v5 v5.2.5 h1:Eg4myHZBjyvJmAFjFvWgrqDTXFyOzjj7YIm3L3mu6Ug=\ngithub.com/go-chi/chi/v5 v5.2.5/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0=\ngithub.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=\ngithub.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\ngithub.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=\ngithub.com/go-openapi/strfmt v0.19.8/go.mod h1:qBBipho+3EoIqn6YDI+4RnQEtj6jT/IdKm+PAlXxSUc=\ngithub.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=\ngithub.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=\ngithub.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro=\ngithub.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=\ngithub.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=\ngithub.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=\ngithub.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=\ngithub.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=\ngithub.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=\ngithub.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=\ngithub.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=\ngithub.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=\ngithub.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=\ngithub.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=\ngithub.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=\ngithub.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=\ngithub.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=\ngithub.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=\ngithub.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=\ngithub.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=\ngithub.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=\ngithub.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=\ngithub.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=\ngithub.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=\ngithub.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=\ngithub.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=\ngithub.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=\ngithub.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=\ngithub.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM=\ngithub.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=\ngithub.com/gofrs/uuid v4.3.1+incompatible h1:0/KbAdpx3UXAx1kEOWHJeOkpbgRFGHVgv+CFIY7dBJI=\ngithub.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY=\ngithub.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=\ngithub.com/golang-migrate/migrate/v4 v4.19.1 h1:OCyb44lFuQfYXYLx1SCxPZQGU7mcaZ7gH9yH4jSFbBA=\ngithub.com/golang-migrate/migrate/v4 v4.19.1/go.mod h1:CTcgfjxhaUtsLipnLoQRWCrjYXycRz/g5+RWDuYgPrE=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/google/cel-go v0.24.1 h1:jsBCtxG8mM5wiUJDSGUqU0K7Mtr3w7Eyv00rw4DiZxI=\ngithub.com/google/cel-go v0.24.1/go.mod h1:Hdf9TqOaTNSFQA1ybQaRqATVoK7m/zcf7IMhGXP5zI8=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=\ngithub.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=\ngithub.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=\ngithub.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=\ngithub.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ=\ngithub.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik=\ngithub.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=\ngithub.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c=\ngithub.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c h1:fEE5/5VNnYUoBOj2I9TP8Jc+a7lge3QWn9DKE7NCwfc=\ngithub.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c/go.mod h1:ObS/W+h8RYb1Y7fYivughjxojTmIu5iAIjSrSLCLeqE=\ngithub.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=\ngithub.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=\ngithub.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=\ngithub.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=\ngithub.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=\ngithub.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=\ngithub.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=\ngithub.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=\ngithub.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=\ngithub.com/jackc/pgx/v5 v5.9.1 h1:uwrxJXBnx76nyISkhr33kQLlUqjv7et7b9FjCen/tdc=\ngithub.com/jackc/pgx/v5 v5.9.1/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4=\ngithub.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=\ngithub.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=\ngithub.com/jedib0t/go-pretty v4.3.0+incompatible/go.mod h1:XemHduiw8R651AF9Pt4FwCTKeG3oo7hrHJAoznj9nag=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jmattheis/goverter v1.9.1 h1:3nLa+E5RzwJZik27/beP7RFe+KRaIl+MNV3HYsd0KeE=\ngithub.com/jmattheis/goverter v1.9.1/go.mod h1:3M72lCsCzbc+ACG+/tqNR3n3PVcxZK95aHiwHshPJQ8=\ngithub.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=\ngithub.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=\ngithub.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=\ngithub.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=\ngithub.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=\ngithub.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=\ngithub.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE=\ngithub.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=\ngithub.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU=\ngithub.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=\ngithub.com/klauspost/crc32 v1.3.0 h1:sSmTt3gUt81RP655XGZPElI0PelVTZ6YwCRnPSupoFM=\ngithub.com/klauspost/crc32 v1.3.0/go.mod h1:D7kQaZhnkX/Y0tstFGf8VUzv2UofNGqCjnC3zdHB0Hw=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw=\ngithub.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o=\ngithub.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk=\ngithub.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw=\ngithub.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=\ngithub.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=\ngithub.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=\ngithub.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=\ngithub.com/minio/crc64nvme v1.1.1 h1:8dwx/Pz49suywbO+auHCBpCtlW1OfpcLN7wYgVR6wAI=\ngithub.com/minio/crc64nvme v1.1.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg=\ngithub.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=\ngithub.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=\ngithub.com/minio/minio-go/v7 v7.0.100 h1:ShkWi8Tyj9RtU57OQB2HIXKz4bFgtVib0bbT1sbtLI8=\ngithub.com/minio/minio-go/v7 v7.0.100/go.mod h1:EtGNKtlX20iL2yaYnxEigaIvj0G0GwSDnifnG8ClIdw=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=\ngithub.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=\ngithub.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=\ngithub.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=\ngithub.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=\ngithub.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=\ngithub.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=\ngithub.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=\ngithub.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=\ngithub.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=\ngithub.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=\ngithub.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=\ngithub.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=\ngithub.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=\ngithub.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=\ngithub.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=\ngithub.com/pganalyze/pg_query_go/v6 v6.1.0 h1:jG5ZLhcVgL1FAw4C/0VNQaVmX1SUJx71wBGdtTtBvls=\ngithub.com/pganalyze/pg_query_go/v6 v6.1.0/go.mod h1:nvTHIuoud6e1SfrUaFwHqT0i4b5Nr+1rPWVds3B5+50=\ngithub.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM=\ngithub.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM=\ngithub.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=\ngithub.com/pingcap/errors v0.11.5-0.20240311024730-e056997136bb h1:3pSi4EDG6hg0orE1ndHkXvX6Qdq2cZn8gAPir8ymKZk=\ngithub.com/pingcap/errors v0.11.5-0.20240311024730-e056997136bb/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg=\ngithub.com/pingcap/failpoint v0.0.0-20240528011301-b51a646c7c86 h1:tdMsjOqUR7YXHoBitzdebTvOjs/swniBTOLy5XiMtuE=\ngithub.com/pingcap/failpoint v0.0.0-20240528011301-b51a646c7c86/go.mod h1:exzhVYca3WRtd6gclGNErRWb1qEgff3LYta0LvRmON4=\ngithub.com/pingcap/log v1.1.0 h1:ELiPxACz7vdo1qAvvaWJg1NrYFoY6gqAh/+Uo6aXdD8=\ngithub.com/pingcap/log v1.1.0/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4=\ngithub.com/pingcap/tidb/pkg/parser v0.0.0-20250324122243-d51e00e5bbf0 h1:W3rpAI3bubR6VWOcwxDIG0Gz9G5rl5b3SL116T0vBt0=\ngithub.com/pingcap/tidb/pkg/parser v0.0.0-20250324122243-d51e00e5bbf0/go.mod h1:+8feuexTKcXHZF/dkDfvCwEyBAmgb4paFc3/WeYV2eE=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/ravilushqa/otelgqlgen v0.19.0 h1:LbgdvOeZLW3y6qJoZHu2qd1srsB2aYRDiY8moPfmZkQ=\ngithub.com/ravilushqa/otelgqlgen v0.19.0/go.mod h1:89WViMNkh5tnf6PYQGDFQDyLdhpQSlDdQ2/lYkdnlHg=\ngithub.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=\ngithub.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=\ngithub.com/riandyrn/otelchi v0.12.2 h1:6QhGv0LVw/dwjtPd12mnNrl0oEQF4ZAlmHcnlTYbeAg=\ngithub.com/riandyrn/otelchi v0.12.2/go.mod h1:weZZeUJURvtCcbWsdb7Y6F8KFZGedJlSrgUjq9VirV8=\ngithub.com/riza-io/grpc-go v0.2.0 h1:2HxQKFVE7VuYstcJ8zqpN84VnAoJ4dCL6YFhJewNcHQ=\ngithub.com/riza-io/grpc-go v0.2.0/go.mod h1:2bDvR9KkKC3KhtlSHfR3dAXjUMT86kg4UfWFyVGWqi8=\ngithub.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=\ngithub.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=\ngithub.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=\ngithub.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=\ngithub.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA=\ngithub.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=\ngithub.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=\ngithub.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc=\ngithub.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik=\ngithub.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=\ngithub.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=\ngithub.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=\ngithub.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=\ngithub.com/sosodev/duration v1.4.0 h1:35ed0KiVFriGHHzZZJaZLgmTEEICIyt8Sx0RQfj9IjE=\ngithub.com/sosodev/duration v1.4.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg=\ngithub.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw=\ngithub.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U=\ngithub.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=\ngithub.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=\ngithub.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=\ngithub.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=\ngithub.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=\ngithub.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=\ngithub.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=\ngithub.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=\ngithub.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=\ngithub.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=\ngithub.com/sqlc-dev/sqlc v1.29.0 h1:HQctoD7y/i29Bao53qXO7CZ/BV9NcvpGpsJWvz9nKWs=\ngithub.com/sqlc-dev/sqlc v1.29.0/go.mod h1:BavmYw11px5AdPOjAVHmb9fctP5A8GTziC38wBF9tp0=\ngithub.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU=\ngithub.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=\ngithub.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\ngithub.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=\ngithub.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=\ngithub.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=\ngithub.com/tetratelabs/wazero v1.9.0 h1:IcZ56OuxrtaEz8UYNRHBrUa9bYeX9oVY93KspZZBf/I=\ngithub.com/tetratelabs/wazero v1.9.0/go.mod h1:TSbcXCfFP0L2FGkRPxHphadXPjo1T6W+CseNNY7EkjM=\ngithub.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=\ngithub.com/tinylib/msgp v1.6.1 h1:ESRv8eL3u+DNHUoSAAQRE50Hm162zqAnBoGv9PzScPY=\ngithub.com/tinylib/msgp v1.6.1/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA=\ngithub.com/urfave/cli/v3 v3.7.0 h1:AGSnbUyjtLiM+WJUb4dzXKldl/gL+F8OwmRDtVr6g2U=\ngithub.com/urfave/cli/v3 v3.7.0/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso=\ngithub.com/vektah/dataloaden v0.3.0 h1:ZfVN2QD6swgvp+tDqdH/OIT/wu3Dhu0cus0k5gIZS84=\ngithub.com/vektah/dataloaden v0.3.0/go.mod h1:/HUdMve7rvxZma+2ZELQeNh88+003LL7Pf/CZ089j8U=\ngithub.com/vektah/gqlparser/v2 v2.5.32 h1:k9QPJd4sEDTL+qB4ncPLflqTJ3MmjB9SrVzJrawpFSc=\ngithub.com/vektah/gqlparser/v2 v2.5.32/go.mod h1:c1I28gSOVNzlfc4WuDlqU7voQnsqI6OG2amkBAFmgts=\ngithub.com/wasilibs/go-pgquery v0.0.0-20250409022910-10ac41983c07 h1:mJdDDPblDfPe7z7go8Dvv1AJQDI3eQ/5xith3q2mFlo=\ngithub.com/wasilibs/go-pgquery v0.0.0-20250409022910-10ac41983c07/go.mod h1:Ak17IJ037caFp4jpCw/iQQ7/W74Sqpb1YuKJU6HTKfM=\ngithub.com/wasilibs/wazero-helpers v0.0.0-20240620070341-3dff1577cd52 h1:OvLBa8SqJnZ6P+mjlzc2K7PM22rRUPE1x32G9DTPrC4=\ngithub.com/wasilibs/wazero-helpers v0.0.0-20240620070341-3dff1577cd52/go.mod h1:jMeV4Vpbi8osrE/pKUxRZkVaA0EX7NZN0A9/oRzgpgY=\ngithub.com/wneessen/go-mail v0.7.2 h1:xxPnhZ6IZLSgxShebmZ6DPKh1b6OJcoHfzy7UjOkzS8=\ngithub.com/wneessen/go-mail v0.7.2/go.mod h1:+TkW6QP3EVkgTEqHtVmnAE/1MRhmzb8Y9/W3pweuS+k=\ngithub.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=\ngithub.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.deanishe.net/favicon v0.1.0 h1:Afy941gjRik+DjUUcYHUxcztFEeFse2ITBkMMOlgefM=\ngo.deanishe.net/favicon v0.1.0/go.mod h1:vIKVI+lUh8k3UAzaN4gjC+cpyatLQWmx0hVX4vLE8jU=\ngo.mongodb.org/mongo-driver v1.4.2/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc=\ngo.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=\ngo.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=\ngo.opentelemetry.io/contrib v1.36.0 h1:ZeE8MRl6bAmxcjZeznBfqTe6syNvMKdxdBMzv6fDV94=\ngo.opentelemetry.io/contrib v1.36.0/go.mod h1:V0PijCkYR5XurE5ytnNJuqWMXPW60jJTPXOiKj6nvhI=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=\ngo.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=\ngo.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk=\ngo.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=\ngo.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY=\ngo.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg=\ngo.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg=\ngo.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw=\ngo.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A=\ngo.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=\ngo.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=\ngo.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g=\ngo.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk=\ngo.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=\ngo.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=\ngo.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=\ngo.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngo.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=\ngo.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=\ngolang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=\ngolang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=\ngolang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=\ngolang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=\ngolang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4=\ngolang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=\ngolang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw=\ngolang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM=\ngolang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/image v0.38.0 h1:5l+q+Y9JDC7mBOMjo4/aPhMDcxEptsX+Tt3GgRQRPuE=\ngolang.org/x/image v0.38.0/go.mod h1:/3f6vaXC+6CEanU4KJxbcUZyEePbyKbaLoDOe4ehFYY=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=\ngolang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=\ngolang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8=\ngolang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w=\ngolang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/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/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=\ngolang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=\ngolang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0=\ngolang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=\ngolang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=\ngolang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\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.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=\ngolang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=\ngolang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=\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.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=\ngolang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\ngolang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=\ngolang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=\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.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=\ngolang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=\ngolang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190515012406-7d7faa4812bd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\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/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=\ngolang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=\ngolang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k=\ngolang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU=\ngolang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=\ngonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=\ngonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 h1:m8qni9SQFH0tJc1X0vmnpw/0t+AImlSvp30sEupozUg=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=\ngoogle.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM=\ngoogle.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=\ngoogle.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nmodernc.org/cc/v4 v4.25.2 h1:T2oH7sZdGvTaie0BRNFbIYsabzCxUQg8nLqCdQ2i0ic=\nmodernc.org/cc/v4 v4.25.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=\nmodernc.org/ccgo/v4 v4.25.1 h1:TFSzPrAGmDsdnhT9X2UrcPMI3N/mJ9/X9ykKXwLhDsU=\nmodernc.org/ccgo/v4 v4.25.1/go.mod h1:njjuAYiPflywOOrm3B7kCB444ONP5pAVr8PIEoE0uDw=\nmodernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=\nmodernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=\nmodernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=\nmodernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=\nmodernc.org/libc v1.62.1 h1:s0+fv5E3FymN8eJVmnk0llBe6rOxCu/DEU+XygRbS8s=\nmodernc.org/libc v1.62.1/go.mod h1:iXhATfJQLjG3NWy56a6WVU73lWOcdYVxsvwCgoPljuo=\nmodernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=\nmodernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=\nmodernc.org/memory v1.9.1 h1:V/Z1solwAVmMW1yttq3nDdZPJqV1rM05Ccq6KMSZ34g=\nmodernc.org/memory v1.9.1/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=\nmodernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=\nmodernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=\nmodernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=\nmodernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=\nmodernc.org/sqlite v1.37.0 h1:s1TMe7T3Q3ovQiK2Ouz4Jwh7dw4ZDqbebSDTlSJdfjI=\nmodernc.org/sqlite v1.37.0/go.mod h1:5YiWv+YviqGMuGw4V+PNplcyaJ5v+vQd7TQOgkACoJM=\nmodernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=\nmodernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=\nmodernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=\nmodernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=\n"
  },
  {
    "path": "gqlgen.yml",
    "content": "# Refer to https://gqlgen.com/config/ for detailed .gqlgen.yml documentation.\n\nschema:\n  - \"graphql/schema/types/*.graphql\"\n  - \"graphql/schema/*.graphql\"\nexec:\n  filename: internal/models/generated_exec.go\nmodel:\n  filename: internal/models/generated_models.go\n\nstruct_tag: gqlgen\n\nautobind:\n  - \"github.com/stashapp/stash-box/internal/models\"\n\nmodels:\n  ID:\n    model: github.com/stashapp/stash-box/internal/models.ID\n  FingerprintHash:\n    model: github.com/stashapp/stash-box/internal/models.FingerprintHash\n  Image:\n    model: github.com/stashapp/stash-box/internal/models.Image\n    fields:\n      url:\n        resolver: true\n  URLInput:\n    model: github.com/stashapp/stash-box/internal/models.URL\n  QueryPerformersResultType:\n    model: github.com/stashapp/stash-box/internal/models.PerformerQuery\n  QueryEditsResultType:\n    model: github.com/stashapp/stash-box/internal/models.EditQuery\n  QueryScenesResultType:\n    model: github.com/stashapp/stash-box/internal/models.SceneQuery\n  QueryModAuditsResultType:\n    model: github.com/stashapp/stash-box/internal/models.ModAuditQuery\n\nomit_slice_element_pointers: true\n"
  },
  {
    "path": "graphql/schema/schema.graphql",
    "content": "\"\"\"The query root for this schema\"\"\"\ntype Query {\n  #### Performers ####\n\n  # performer names may not be unique\n  \"\"\"Find a performer by ID\"\"\"\n  findPerformer(id: ID!): Performer @hasRole(role: READ)\n  queryPerformers(input: PerformerQueryInput!): QueryPerformersResultType! @hasRole(role: READ)\n\n  #### Studios ####\n\n  # studio names should be unique\n  \"\"\"Find a studio by ID or name\"\"\"\n  findStudio(id: ID, name: String): Studio @hasRole(role: READ)\n  queryStudios(input: StudioQueryInput!): QueryStudiosResultType! @hasRole(role: READ)\n\n  #### Tags ####\n\n  # tag names will be unique\n  \"\"\"Find a tag by ID or name\"\"\"\n  findTag(id: ID, name: String): Tag @hasRole(role: READ)\n  \"\"\"Find a tag with a matching name or alias\"\"\"\n  findTagOrAlias(name: String!): Tag @hasRole(role: READ)\n  queryTags(input: TagQueryInput!): QueryTagsResultType! @hasRole(role: READ)\n\n  \"\"\"Find a tag category by ID\"\"\"\n  findTagCategory(id: ID!): TagCategory @hasRole(role: READ)\n  queryTagCategories: QueryTagCategoriesResultType! @hasRole(role: READ)\n\n  #### Scenes ####\n\n  # ids should be unique\n  \"\"\"Find a scene by ID\"\"\"\n  findScene(id: ID!): Scene @hasRole(role: READ)\n\n  \"\"\"Finds scenes that match a list of hashes\"\"\"\n  findScenesBySceneFingerprints(fingerprints: [[FingerprintQueryInput!]!]!): [[Scene]!]! @hasRole(role: READ)\n\n  queryScenes(input: SceneQueryInput!): QueryScenesResultType! @hasRole(role: READ)\n\n  \"\"\"Find an external site by ID\"\"\"\n  findSite(id: ID!): Site @hasRole(role: READ)\n  querySites: QuerySitesResultType! @hasRole(role: READ)\n\n  #### Edits ####\n\n  findEdit(id: ID!): Edit @hasRole(role: READ)\n  queryEdits(input: EditQueryInput!): QueryEditsResultType! @hasRole(role: READ)\n\n  #### Users ####\n\n  \"\"\"Find user by ID or username\"\"\"\n  findUser(id: ID, username: String): User @hasRole(role: READ)\n  queryUsers(input: UserQueryInput!): QueryUsersResultType! @hasRole(role: ADMIN)\n\n  \"\"\"Returns currently authenticated user\"\"\"\n  me: User\n\n  ### Full text search ###\n  searchPerformer(term: String!, limit: Int): [Performer!]! @hasRole(role: READ) @deprecated(reason: \"Use searchPerformers\")\n  searchPerformers(term: String!, limit: Int, page: Int, per_page: Int, filter: PerformerSearchFilter): QueryPerformersResultType! @hasRole(role: READ)\n  searchScene(term: String!, limit: Int): [Scene!]! @hasRole(role: READ) @deprecated(reason: \"Use searchScenes\")\n  searchScenes(term: String!, limit: Int, page: Int, per_page: Int): QueryScenesResultType! @hasRole(role: READ)\n  searchTag(term: String!, limit: Int): [Tag!]! @hasRole(role: READ)\n  searchStudio(term: String!, limit: Int): [Studio!]! @hasRole(role: READ)\n\n  ### Drafts ###\n  findDraft(id: ID!): Draft @hasRole(role: READ)\n  findDrafts: [Draft!]! @hasRole(role: READ)\n\n  ###Find scenes or pending scenes which match scene input###\n  queryExistingScene(input: QueryExistingSceneInput!): QueryExistingSceneResult! @hasRole(role: READ)\n\n  ###Find performers or pending performers which match performer input###\n  queryExistingPerformer(input: QueryExistingPerformerInput!): QueryExistingPerformerResult! @hasRole(role: READ)\n\n  #### Version ####\n  version: Version! @hasRole(role: READ)\n\n  ### Instance Config ###\n  getConfig: StashBoxConfig!\n\n  queryNotifications(input: QueryNotificationsInput!): QueryNotificationsResult! @hasRole(role: READ)\n  getUnreadNotificationCount: Int! @hasRole(role: READ)\n\n  ### Moderator Audits ###\n  queryModAudits(input: ModAuditQueryInput!): QueryModAuditsResultType! @hasRole(role: ADMIN)\n}\n\ntype Mutation {\n  # Admin-only interface\n  sceneCreate(input: SceneCreateInput!): Scene @hasRole(role: MODIFY)\n  sceneUpdate(input: SceneUpdateInput!): Scene @hasRole(role: MODIFY)\n  sceneDestroy(input: SceneDestroyInput!): Boolean! @hasRole(role: MODIFY)\n\n  performerCreate(input: PerformerCreateInput!): Performer @hasRole(role: MODIFY)\n  performerUpdate(input: PerformerUpdateInput!): Performer @hasRole(role: MODIFY)\n  performerDestroy(input: PerformerDestroyInput!): Boolean! @hasRole(role: MODIFY)\n\n  studioCreate(input: StudioCreateInput!): Studio @hasRole(role: MODIFY)\n  studioUpdate(input: StudioUpdateInput!): Studio @hasRole(role: MODIFY)\n  studioDestroy(input: StudioDestroyInput!): Boolean! @hasRole(role: MODIFY)\n\n  tagCreate(input: TagCreateInput!): Tag @hasRole(role: MODIFY)\n  tagUpdate(input: TagUpdateInput!): Tag @hasRole(role: MODIFY)\n  tagDestroy(input: TagDestroyInput!): Boolean! @hasRole(role: MODIFY)\n\n  userCreate(input: UserCreateInput!): User @hasRole(role: ADMIN)\n  userUpdate(input: UserUpdateInput!): User @hasRole(role: ADMIN)\n  userDestroy(input: UserDestroyInput!): Boolean! @hasRole(role: ADMIN)\n\n  imageCreate(input: ImageCreateInput!): Image @hasRole(role: EDIT)\n  imageDestroy(input: ImageDestroyInput!): Boolean! @hasRole(role: MODIFY)\n\n  \"\"\"User interface for registering\"\"\"\n  newUser(input: NewUserInput!): ID\n  activateNewUser(input: ActivateNewUserInput!): User\n\n  generateInviteCode: ID @deprecated(reason: \"Use generateInviteCodes\")\n  \"\"\"Generates an invite code using an invite token\"\"\"\n  generateInviteCodes(input: GenerateInviteCodeInput): [ID!]!\n  \"\"\"Removes a pending invite code - refunding the token\"\"\"\n  rescindInviteCode(code: ID!): Boolean!\n  \"\"\"Adds invite tokens for a user\"\"\"\n  grantInvite(input: GrantInviteInput!): Int!\n  \"\"\"Removes invite tokens from a user\"\"\"\n  revokeInvite(input: RevokeInviteInput!): Int!\n\n  tagCategoryCreate(input: TagCategoryCreateInput!): TagCategory @hasRole(role: ADMIN)\n  tagCategoryUpdate(input: TagCategoryUpdateInput!): TagCategory @hasRole(role: ADMIN)\n  tagCategoryDestroy(input: TagCategoryDestroyInput!): Boolean! @hasRole(role: ADMIN)\n\n  siteCreate(input: SiteCreateInput!): Site @hasRole(role: ADMIN)\n  siteUpdate(input: SiteUpdateInput!): Site @hasRole(role: ADMIN)\n  siteDestroy(input: SiteDestroyInput!): Boolean! @hasRole(role: ADMIN)\n\n  \"\"\"Regenerates the api key for the given user, or the current user if id not provided\"\"\"\n  regenerateAPIKey(userID: ID): String!\n\n  \"\"\"Generates an email to reset a user password\"\"\"\n  resetPassword(input: ResetPasswordInput!): Boolean!\n\n  \"\"\"Changes the password for the current user\"\"\"\n  changePassword(input: UserChangePasswordInput!): Boolean!\n\n  \"\"\"Request an email change for the current user\"\"\"\n  requestChangeEmail: UserChangeEmailStatus! @hasRole(role: READ)\n  validateChangeEmail(token: ID!, email: String!): UserChangeEmailStatus! @hasRole(role: READ)\n  confirmChangeEmail(token: ID!): UserChangeEmailStatus! @hasRole(role: READ)\n\n  # Edit interfaces\n  \"\"\"Propose a new scene or modification to a scene\"\"\"\n  sceneEdit(input: SceneEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Propose a new performer or modification to a performer\"\"\"\n  performerEdit(input: PerformerEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Propose a new studio or modification to a studio\"\"\"\n  studioEdit(input: StudioEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Propose a new tag or modification to a tag\"\"\"\n  tagEdit(input: TagEditInput!): Edit! @hasRole(role: EDIT)\n\n  \"\"\"Update a pending scene edit\"\"\"\n  sceneEditUpdate(id: ID!, input: SceneEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Update a pending performer edit\"\"\"\n  performerEditUpdate(id: ID!, input: PerformerEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Update a pending studio edit\"\"\"\n  studioEditUpdate(id: ID!, input: StudioEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Update a pending tag edit\"\"\"\n  tagEditUpdate(id: ID!, input: TagEditInput!): Edit! @hasRole(role: EDIT)\n\n  \"\"\"Vote to accept/reject an edit\"\"\"\n  editVote(input: EditVoteInput!): Edit! @hasRole(role: VOTE)\n  \"\"\"Comment on an edit\"\"\"\n  editComment(input: EditCommentInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Apply edit without voting\"\"\"\n  applyEdit(input: ApplyEditInput!): Edit! @hasRole(role: ADMIN)\n  \"\"\"Cancel edit without voting\"\"\"\n  cancelEdit(input: CancelEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Delete a closed edit - moderator only\"\"\"\n  deleteEdit(input: DeleteEditInput!): Boolean! @hasRole(role: MODERATE)\n  \"\"\"Amend a closed edit by removing fields - moderator only\"\"\"\n  amendEdit(input: AmendEditInput!): Edit! @hasRole(role: MODERATE)\n\n  \"\"\"Matches/unmatches a scene to fingerprint\"\"\"\n  submitFingerprint(input: FingerprintSubmission!): Boolean! @hasRole(role: READ)\n  \"\"\"Batch submit up to 1000 fingerprint matches\"\"\"\n  submitFingerprints(input: [FingerprintBatchSubmission!]!): [FingerprintSubmissionResult!]! @hasRole(role: READ)\n\n  \"\"\"Move all fingerprint submissions from source scene to target scene\"\"\"\n  sceneMoveFingerprintSubmissions(input: MoveFingerprintSubmissionsInput!): Boolean! @hasRole(role: MODERATE)\n  \"\"\"Delete all fingerprint submissions for a specific fingerprint on a scene\"\"\"\n  sceneDeleteFingerprintSubmissions(input: DeleteFingerprintSubmissionsInput!): Boolean! @hasRole(role: MODERATE)\n\n  \"\"\"Draft submissions\"\"\"\n  submitSceneDraft(input: SceneDraftInput!): DraftSubmissionStatus! @hasRole(role: EDIT)\n  submitPerformerDraft(input: PerformerDraftInput!): DraftSubmissionStatus! @hasRole(role: EDIT)\n  destroyDraft(id: ID!): Boolean! @hasRole(role: EDIT)\n\n  \"\"\"Favorite or unfavorite a performer\"\"\"\n  favoritePerformer(id: ID!, favorite: Boolean!): Boolean! @hasRole(role: READ)\n  \"\"\"Favorite or unfavorite a studio\"\"\"\n  favoriteStudio(id: ID!, favorite: Boolean!): Boolean! @hasRole(role: READ)\n\n  \"\"\"Mark all of the current users notifications as read.\"\"\"\n  markNotificationsRead(notification: MarkNotificationReadInput): Boolean! @hasRole(role: READ)\n  \"\"\"Update notification subscriptions for current user.\"\"\"\n  updateNotificationSubscriptions(subscriptions: [NotificationEnum!]!): Boolean! @hasRole(role: READ)\n}\n\nschema {\n  query: Query\n  mutation: Mutation\n}\n"
  },
  {
    "path": "graphql/schema/types/config.graphql",
    "content": "type StashBoxConfig {\n  host_url: String!\n  require_invite: Boolean!\n  require_activation: Boolean!\n  vote_promotion_threshold: Int\n  vote_application_threshold: Int!\n  voting_period: Int!\n  min_destructive_voting_period: Int!\n  vote_cron_interval: String!\n  guidelines_url: String!\n  require_scene_draft: Boolean!\n  edit_update_limit: Int!\n  require_tag_role: Boolean!\n}\n"
  },
  {
    "path": "graphql/schema/types/draft.graphql",
    "content": "type DraftSubmissionStatus {\n  id: ID\n}\n\ntype DraftEntity {\n  name: String!\n  id: ID\n}\n\ninput DraftEntityInput {\n  name: String!\n  id: ID\n}\n\ntype Draft {\n  id: ID!\n  created: Time!\n  expires: Time!\n  data: DraftData!\n}\n\nunion DraftData = SceneDraft | PerformerDraft\n"
  },
  {
    "path": "graphql/schema/types/edit.graphql",
    "content": "enum OperationEnum {\n    CREATE\n    MODIFY\n    DESTROY\n    MERGE\n}\n\nenum VoteTypeEnum {\n    ABSTAIN\n    ACCEPT\n    REJECT\n    \"\"\"Immediately accepts the edit - bypassing the vote\"\"\"\n    IMMEDIATE_ACCEPT\n    \"\"\"Immediately rejects the edit - bypassing the vote\"\"\"\n    IMMEDIATE_REJECT\n}\n\nenum VoteStatusEnum {\n    ACCEPTED\n    REJECTED\n    PENDING\n    IMMEDIATE_ACCEPTED\n    IMMEDIATE_REJECTED\n    FAILED\n    CANCELED\n}\n\ntype EditVote {\n    user: User\n    date: Time!\n    vote: VoteTypeEnum!\n}\n\ntype EditComment {\n    id: ID!\n    user: User\n    date: Time!\n    comment: String!\n    edit: Edit!\n}\n\nunion EditDetails = PerformerEdit | SceneEdit | StudioEdit | TagEdit\n\nenum TargetTypeEnum {\n    SCENE\n    STUDIO\n    PERFORMER\n    TAG\n}\n\nunion EditTarget = Performer | Scene | Studio | Tag\n\ntype Edit {\n    id: ID!\n    user: User\n    \"\"\"Object being edited - null if creating a new object\"\"\"\n    target: EditTarget\n    target_type: TargetTypeEnum!\n    \"\"\"Objects to merge with the target. Only applicable to merges\"\"\"\n    merge_sources: [EditTarget!]!\n    operation: OperationEnum!\n    bot: Boolean!\n    details: EditDetails\n    \"\"\"Previous state of fields being modified - null if operation is create or delete.\"\"\"\n    old_details: EditDetails\n    \"\"\"Entity specific options\"\"\"\n    options: PerformerEditOptions\n    comments: [EditComment!]!\n    votes: [EditVote!]!\n    \"\"\" = Accepted - Rejected\"\"\"\n    vote_count: Int!\n    \"\"\"Is the edit considered destructive.\"\"\"\n    destructive: Boolean!\n    status: VoteStatusEnum!\n    applied: Boolean!\n    update_count: Int!\n    updatable: Boolean!\n    created: Time!\n    updated: Time\n    closed: Time\n    expires: Time\n}\n\ninput EditInput {\n  \"\"\"Not required for create type\"\"\"\n  id: ID\n  operation: OperationEnum!\n  \"\"\"Only required for merge type\"\"\"\n  merge_source_ids: [ID!]\n  comment: String\n  \"\"\"Edit submitted by an automated script. Requires bot permission\"\"\"\n  bot: Boolean\n}\n\ninput EditVoteInput {\n    id: ID!\n    vote: VoteTypeEnum!\n}\n\ninput EditCommentInput {\n    id: ID!\n    comment: String!\n}\n\ntype QueryEditsResultType {\n  count: Int!\n  edits: [Edit!]!\n}\n\nenum EditSortEnum {\n  CREATED_AT\n  UPDATED_AT\n  CLOSED_AT\n}\n\nenum UserVotedFilterEnum {\n    ABSTAIN\n    ACCEPT\n    REJECT\n    NOT_VOTED\n}\n\ninput EditQueryInput {\n  \"\"\"Filter by user id\"\"\"\n  user_id: ID\n  \"\"\"Filter by status\"\"\"\n  status: VoteStatusEnum\n  \"\"\"Filter by operation\"\"\"\n  operation: OperationEnum\n  \"\"\"Filter by vote count\"\"\"\n  vote_count: IntCriterionInput\n  \"\"\"Filter by applied status\"\"\"\n  applied: Boolean\n  \"\"\"Filter by target type\"\"\"\n  target_type: TargetTypeEnum\n  \"\"\"Filter by target id\"\"\"\n  target_id: ID\n  \"\"\"Filter by favorite status\"\"\"\n  is_favorite: Boolean\n  \"\"\"Filter by user voted status\"\"\"\n  voted: UserVotedFilterEnum\n  \"\"\"Filter to bot edits only\"\"\"\n  is_bot: Boolean\n  \"\"\"Filter out user's own edits\"\"\"\n  include_user_submitted: Boolean\n\n  page: Int! = 1\n  per_page: Int! = 25\n  direction: SortDirectionEnum! = DESC\n  sort: EditSortEnum! = CREATED_AT\n}\n\ninput ApplyEditInput {\n    id: ID!\n}\ninput CancelEditInput {\n    id: ID!\n}\ninput DeleteEditInput {\n    id: ID!\n    reason: String!\n}\n\ninput AmendEditInput {\n    id: ID!\n    reason: String!\n    \"\"\"Fields to remove from the diff (e.g., [\"name\", \"disambiguation\"])\"\"\"\n    remove_fields: [String!]\n    \"\"\"Array items to remove from added arrays\"\"\"\n    remove_added_items: [AmendItemRemoval!]\n    \"\"\"Array items to remove from removed arrays\"\"\"\n    remove_removed_items: [AmendItemRemoval!]\n}\n\ninput AmendItemRemoval {\n    \"\"\"Field name (e.g., \"aliases\", \"urls\", \"images\")\"\"\"\n    field: String!\n    \"\"\"Indices to remove from the array\"\"\"\n    indices: [Int!]!\n}\n"
  },
  {
    "path": "graphql/schema/types/filter.graphql",
    "content": "input MultiIDCriterionInput {\n  value: [ID!]\n  modifier: CriterionModifier!\n}\n\ninput IDCriterionInput {\n  value: [ID!]!\n  modifier: CriterionModifier!\n}\n\ninput StringCriterionInput {\n  value: String!\n  modifier: CriterionModifier!\n}\n\ninput MultiStringCriterionInput {\n  value: [String!]!\n  modifier: CriterionModifier!\n}\n\ninput IntCriterionInput {\n  value: Int!\n  modifier: CriterionModifier!\n}\n\ninput DateCriterionInput {\n  value: Date!\n  modifier: CriterionModifier!\n}\n\nenum CriterionModifier {\n  \"\"\"=\"\"\"\n  EQUALS,\n  \"\"\"!=\"\"\"\n  NOT_EQUALS,\n  \"\"\">\"\"\"\n  GREATER_THAN,\n  \"\"\"<\"\"\"\n  LESS_THAN,\n  \"\"\"IS NULL\"\"\"\n  IS_NULL,\n  \"\"\"IS NOT NULL\"\"\"\n  NOT_NULL,\n  \"\"\"INCLUDES ALL\"\"\"\n  INCLUDES_ALL,\n  INCLUDES,\n  EXCLUDES,\n}"
  },
  {
    "path": "graphql/schema/types/image.graphql",
    "content": "scalar Upload\n\ntype Image {\n  id: ID!\n  url: String!\n  width: Int!\n  height: Int!\n}\n\ninput ImageCreateInput {\n  url: String\n  file: Upload\n}\n\ninput ImageUpdateInput {\n  id: ID!\n  url: String\n}\n\ninput ImageDestroyInput {\n  id: ID!\n}\n"
  },
  {
    "path": "graphql/schema/types/misc.graphql",
    "content": "scalar Date\nscalar DateTime\nscalar Time\nscalar FingerprintHash\n\nenum DateAccuracyEnum {\n  YEAR\n  MONTH\n  DAY\n}\n\ntype FuzzyDate {\n  date: Date!\n  accuracy: DateAccuracyEnum!\n}\n\nenum SortDirectionEnum {\n  ASC\n  DESC\n}\n\ntype URL {\n  url: String!\n  type: String! @deprecated(reason: \"Use the site field instead\")\n  site: Site!\n}\n\ninput URLInput {\n  url: String!\n  site_id: ID!\n}\n"
  },
  {
    "path": "graphql/schema/types/mod_audit.graphql",
    "content": "enum ModAuditActionEnum {\n  EDIT_DELETE\n  EDIT_AMENDMENT\n}\n\ntype ModAudit {\n  id: ID!\n  action: ModAuditActionEnum!\n  user: User\n  target_id: ID!\n  target_type: String!\n  data: String!\n  reason: String\n  created_at: Time!\n}\n\ntype QueryModAuditsResultType {\n  count: Int!\n  audits: [ModAudit!]!\n}\n\ninput ModAuditQueryInput {\n  page: Int! = 1\n  per_page: Int! = 25\n  action: ModAuditActionEnum\n  user_id: ID\n}\n"
  },
  {
    "path": "graphql/schema/types/notifications.graphql",
    "content": "type Notification {\n  created: Time!\n  read: Boolean!\n  data: NotificationData!\n}\n\nenum NotificationEnum {\n  FAVORITE_PERFORMER_SCENE\n  FAVORITE_PERFORMER_EDIT\n  FAVORITE_STUDIO_SCENE\n  FAVORITE_STUDIO_EDIT\n  COMMENT_OWN_EDIT\n  DOWNVOTE_OWN_EDIT\n  FAILED_OWN_EDIT\n  COMMENT_COMMENTED_EDIT\n  COMMENT_VOTED_EDIT\n  UPDATED_EDIT\n  FINGERPRINTED_SCENE_EDIT\n}\n\nunion NotificationData =\n   | FavoritePerformerScene\n   | FavoritePerformerEdit\n   | FavoriteStudioScene \n   | FavoriteStudioEdit\n   | CommentOwnEdit\n   | CommentCommentedEdit\n   | CommentVotedEdit\n   | DownvoteOwnEdit\n   | FailedOwnEdit\n   | UpdatedEdit\n   | FingerprintedSceneEdit\n\ntype FavoritePerformerScene {\n  scene: Scene!\n}\n\ntype FavoritePerformerEdit {\n  edit: Edit!\n}\n\ntype FavoriteStudioScene {\n  scene: Scene!\n}\n\ntype FavoriteStudioEdit {\n  edit: Edit!\n}\n\ntype CommentOwnEdit {\n  comment: EditComment!\n}\n\ntype DownvoteOwnEdit {\n  edit: Edit!\n}\n\ntype FailedOwnEdit {\n  edit: Edit!\n}\n\ntype CommentCommentedEdit {\n  comment: EditComment!\n}\n\ntype CommentVotedEdit {\n  comment: EditComment!\n}\n\ntype UpdatedEdit {\n  edit: Edit!\n}\n\ntype FingerprintedSceneEdit {\n  edit: Edit!\n}\n\ninput QueryNotificationsInput {\n  page: Int! = 1\n  per_page: Int! = 25\n  type: NotificationEnum\n  unread_only: Boolean\n}\n\ntype QueryNotificationsResult {\n  count: Int!\n  notifications: [Notification!]!\n}\n\ninput MarkNotificationReadInput {\n  type: NotificationEnum!\n  id: ID!\n}\n"
  },
  {
    "path": "graphql/schema/types/performer.graphql",
    "content": "enum GenderEnum {\n  MALE\n  FEMALE\n  TRANSGENDER_MALE\n  TRANSGENDER_FEMALE\n  INTERSEX\n  NON_BINARY\n}\n\nenum GenderFilterEnum {\n  UNKNOWN\n  MALE\n  FEMALE\n  TRANSGENDER_MALE\n  TRANSGENDER_FEMALE\n  INTERSEX\n  NON_BINARY\n}\n\nenum BreastTypeEnum {\n  NATURAL\n  FAKE\n  NA\n}\n\ntype Measurements {\n  cup_size: String\n  band_size: Int\n  waist: Int\n  hip: Int\n}\n\nenum EthnicityEnum {\n  CAUCASIAN\n  BLACK\n  ASIAN\n  INDIAN\n  LATIN\n  MIDDLE_EASTERN\n  MIXED\n  OTHER\n}\nenum EthnicityFilterEnum {\n  UNKNOWN\n  CAUCASIAN\n  BLACK\n  ASIAN\n  INDIAN\n  LATIN\n  MIDDLE_EASTERN\n  MIXED\n  OTHER\n}\n\nenum EyeColorEnum {\n  BLUE\n  BROWN\n  GREY\n  GREEN\n  HAZEL\n  RED\n}\n\nenum HairColorEnum {\n  BLONDE\n  BRUNETTE\n  BLACK\n  RED\n  AUBURN\n  GREY\n  BALD\n  VARIOUS\n  WHITE\n  OTHER\n}\n\ntype BodyModification {\n  location: String!\n  description: String\n}\n\ninput BodyModificationInput {\n  location: String!\n  description: String\n}\n\ntype Performer {\n  id: ID!\n  name: String!\n  disambiguation: String\n  aliases: [String!]!\n  gender: GenderEnum\n  urls: [URL!]!\n  birthdate: FuzzyDate @deprecated(reason: \"Please use `birth_date`\")\n  birth_date: String\n  death_date: String\n  age: Int # resolver\n  ethnicity: EthnicityEnum\n  country: String\n  eye_color: EyeColorEnum\n  hair_color: HairColorEnum\n  \"\"\"Height in cm\"\"\"\n  height: Int\n  measurements: Measurements! @deprecated(reason: \"Use individual fields, cup/band/waist/hip_size\")\n  cup_size: String\n  band_size: Int\n  waist_size: Int\n  hip_size: Int\n  breast_type: BreastTypeEnum\n  career_start_year: Int\n  career_end_year: Int\n  tattoos: [BodyModification!]\n  piercings: [BodyModification!]\n  images: [Image!]!\n  deleted: Boolean!\n  edits: [Edit!]!\n  scene_count: Int!\n  scenes(input: PerformerScenesInput): [Scene!]!\n  \"\"\"IDs of performers that were merged into this one\"\"\"\n  merged_ids: [ID!]!\n  \"\"\"ID of performer that replaces this one\"\"\"\n  merged_into_id: ID\n  studios(studio_id: ID): [PerformerStudio!]!\n  is_favorite: Boolean!\n  created: Time!\n  updated: Time!\n}\n\ninput PerformerScenesInput {\n  \"\"\"Filter by another performer that also performs in the scenes\"\"\"\n  performed_with: ID\n\n  \"\"\"Filter by a studio\"\"\"\n  studio_id: ID\n\n  \"\"\"Filter by tags\"\"\"\n  tags: MultiIDCriterionInput\n}\n\ntype PerformerStudio {\n  studio: Studio!\n  scene_count: Int!\n}\n\ninput PerformerCreateInput {\n  name: String!\n  disambiguation: String\n  aliases: [String!]\n  gender: GenderEnum\n  urls: [URLInput!]\n  birthdate: String\n  deathdate: String\n  ethnicity: EthnicityEnum\n  country: String\n  eye_color: EyeColorEnum\n  hair_color: HairColorEnum\n  height: Int\n  cup_size: String\n  band_size: Int\n  waist_size: Int\n  hip_size: Int\n  breast_type: BreastTypeEnum\n  career_start_year: Int\n  career_end_year: Int\n  tattoos: [BodyModificationInput!]\n  piercings: [BodyModificationInput!]\n  image_ids: [ID!]\n  draft_id: ID\n}\n\ninput PerformerUpdateInput {\n  id: ID!\n  name: String\n  disambiguation: String\n  aliases: [String!]\n  gender: GenderEnum\n  urls: [URLInput!]\n  birthdate: String\n  deathdate: String\n  ethnicity: EthnicityEnum\n  country: String\n  eye_color: EyeColorEnum\n  hair_color: HairColorEnum\n  height: Int\n  cup_size: String\n  band_size: Int\n  waist_size: Int\n  hip_size: Int\n  breast_type: BreastTypeEnum\n  career_start_year: Int\n  career_end_year: Int\n  tattoos: [BodyModificationInput!]\n  piercings: [BodyModificationInput!]\n  image_ids: [ID!]\n}\n\ninput PerformerDestroyInput {\n  id: ID!\n}\n\ninput PerformerEditDetailsInput {\n  name: String\n  disambiguation: String\n  aliases: [String!]\n  gender: GenderEnum\n  urls: [URLInput!]\n  birthdate: String\n  deathdate: String\n  ethnicity: EthnicityEnum\n  country: String\n  eye_color: EyeColorEnum\n  hair_color: HairColorEnum\n  height: Int\n  cup_size: String\n  band_size: Int\n  waist_size: Int\n  hip_size: Int\n  breast_type: BreastTypeEnum\n  career_start_year: Int\n  career_end_year: Int\n  tattoos: [BodyModificationInput!]\n  piercings: [BodyModificationInput!]\n  image_ids: [ID!]\n  draft_id: ID\n}\n\ninput PerformerEditOptionsInput {\n  \"\"\"Set performer alias on scenes without alias to old name if name is changed\"\"\"\n  set_modify_aliases: Boolean = false\n  \"\"\"Set performer alias on scenes attached to merge sources to old name\"\"\"\n  set_merge_aliases: Boolean = true\n}\n\ninput PerformerEditInput {\n  edit: EditInput!\n  \"\"\"Not required for destroy type\"\"\"\n  details: PerformerEditDetailsInput\n  \"\"\"Controls aliases modification for merges and name modifications\"\"\"\n  options: PerformerEditOptionsInput\n}\n\ntype PerformerEdit {\n  name: String\n  disambiguation: String\n  added_aliases: [String!]\n  removed_aliases: [String!]\n  gender: GenderEnum\n  added_urls: [URL!]\n  removed_urls: [URL!]\n  birthdate: String\n  deathdate: String\n  ethnicity: EthnicityEnum\n  country: String\n  eye_color: EyeColorEnum\n  hair_color: HairColorEnum\n  \"\"\"Height in cm\"\"\"\n  height: Int\n  cup_size: String\n  band_size: Int\n  waist_size: Int\n  hip_size: Int\n  breast_type: BreastTypeEnum\n  career_start_year: Int\n  career_end_year: Int\n  added_tattoos: [BodyModification!]\n  removed_tattoos: [BodyModification!]\n  added_piercings: [BodyModification!]\n  removed_piercings: [BodyModification!]\n  added_images: [Image!]\n  removed_images: [Image!]\n  draft_id: ID\n\n  aliases: [String!]!\n  urls: [URL!]!\n  images: [Image!]!\n  tattoos: [BodyModification!]!\n  piercings: [BodyModification!]!\n}\n\ntype PerformerEditOptions {\n  \"\"\"Set performer alias on scenes without alias to old name if name is changed\"\"\"\n  set_modify_aliases: Boolean!\n  \"\"\"Set performer alias on scenes attached to merge sources to old name\"\"\"\n  set_merge_aliases: Boolean!\n}\n\ntype GenderFacet {\n  gender: GenderEnum!\n  count: Int!\n}\n\ntype PerformerSearchFacets {\n  genders: [GenderFacet!]!\n}\n\ntype QueryPerformersResultType {\n  count: Int!\n  performers: [Performer!]!\n  \"\"\"Search facets, only available for searchPerformer queries\"\"\"\n  facets: PerformerSearchFacets\n}\n\ninput BreastTypeCriterionInput {\n  value: BreastTypeEnum\n  modifier: CriterionModifier!\n}\n\ninput EyeColorCriterionInput {\n  value: EyeColorEnum\n  modifier: CriterionModifier!\n}\n\ninput HairColorCriterionInput {\n  value: HairColorEnum\n  modifier: CriterionModifier!\n}\n\ninput BodyModificationCriterionInput {\n  location: String\n  description: String\n  modifier: CriterionModifier!\n}\n\nenum PerformerSortEnum {\n  NAME\n  BIRTHDATE\n  DEATHDATE\n  SCENE_COUNT\n  CAREER_START_YEAR\n  DEBUT\n  LAST_SCENE\n  CREATED_AT\n  UPDATED_AT\n}\n\ninput PerformerSearchFilter {\n  \"\"\"Filter by gender\"\"\"\n  gender: GenderEnum\n}\n\ninput PerformerQueryInput {\n  \"\"\"Searches name and disambiguation - assumes like query unless quoted\"\"\"\n  names: String\n\n  \"\"\"Searches name only - assumes like query unless quoted\"\"\"\n  name: String\n\n  \"\"\"Search aliases only - assumes like query unless quoted\"\"\"\n  alias: String\n\n  disambiguation: StringCriterionInput\n\n  gender: GenderFilterEnum\n\n  \"\"\"Filter to search urls - assumes like query unless quoted\"\"\"\n  url: String\n\n  birthdate: DateCriterionInput\n  deathdate: DateCriterionInput\n  birth_year: IntCriterionInput\n  age: IntCriterionInput\n\n  ethnicity: EthnicityFilterEnum\n  country: StringCriterionInput\n  eye_color: EyeColorCriterionInput\n  hair_color: HairColorCriterionInput\n  height: IntCriterionInput\n\n  cup_size: StringCriterionInput\n  band_size: IntCriterionInput\n  waist_size: IntCriterionInput\n  hip_size: IntCriterionInput\n\n  breast_type: BreastTypeCriterionInput\n\n  career_start_year: IntCriterionInput\n  career_end_year: IntCriterionInput\n  tattoos: BodyModificationCriterionInput\n  piercings: BodyModificationCriterionInput\n  \"\"\"Filter by performerfavorite status for the current user\"\"\"\n  is_favorite: Boolean\n\n  \"\"\"Filter by a performer they have performed in scenes with\"\"\"\n  performed_with: ID\n\n  \"\"\"Filter by a studio\"\"\"\n  studio_id: ID\n\n  page: Int! = 1\n  per_page: Int! = 25\n  direction: SortDirectionEnum! = DESC\n  sort: PerformerSortEnum! = CREATED_AT\n}\n\ntype PerformerDraft {\n  id: ID\n  name: String!\n  disambiguation: String\n  aliases: String\n  gender: String\n  birthdate: String\n  deathdate: String\n  urls: [String!]\n  ethnicity: String\n  country: String\n  eye_color: String\n  hair_color: String\n  height: String\n  measurements: String\n  breast_type: String\n  tattoos: String\n  piercings: String\n  career_start_year: Int\n  career_end_year: Int\n  image: Image\n}\n\ninput PerformerDraftInput {\n  id: ID\n  disambiguation: String\n  name: String!\n  aliases: String\n  gender: String\n  birthdate: String\n  deathdate: String\n  urls: [String!]\n  ethnicity: String\n  country: String\n  eye_color: String\n  hair_color: String\n  height: String\n  measurements: String\n  breast_type: String\n  tattoos: String\n  piercings: String\n  career_start_year: Int\n  career_end_year: Int\n  image: Upload\n}\n\ninput QueryExistingPerformerInput {\n  name: String\n  disambiguation: String\n  urls: [String!]!\n}\n\ntype QueryExistingPerformerResult {\n  edits: [Edit!]!\n  performers: [Performer!]!\n}\n"
  },
  {
    "path": "graphql/schema/types/scene.graphql",
    "content": "type PerformerAppearance {\n  performer: Performer!\n  \"\"\"Performing as alias\"\"\"\n  as: String\n}\n\ninput PerformerAppearanceInput {\n  performer_id: ID!\n  \"\"\"Performing as alias\"\"\"\n  as: String\n}\n\nenum FingerprintAlgorithm {\n  MD5\n  OSHASH\n  PHASH\n}\n\nenum FavoriteFilter {\n  PERFORMER\n  STUDIO\n  ALL\n}\n\nenum FingerprintSubmissionType {\n  \"Positive vote\"\n  VALID\n  \"Report as invalid\"\n  INVALID\n  \"Remove vote\"\n  REMOVE\n}\n\ntype Fingerprint {\n  hash: FingerprintHash!\n  algorithm: FingerprintAlgorithm!\n  duration: Int!\n  \"number of times this fingerprint has been submitted (excluding reports)\"\n  submissions: Int!\n  \"number of times this fingerprint has been reported\"\n  reports: Int!\n  created: Time!\n  updated: Time!\n  \"true if the current user submitted this fingerprint\"\n  user_submitted: Boolean!\n  \"true if the current user reported this fingerprint\"\n  user_reported: Boolean!\n}\n\ntype DraftFingerprint {\n  hash: FingerprintHash!\n  algorithm: FingerprintAlgorithm!\n  duration: Int!\n}\n\ninput FingerprintInput {\n  \"\"\"assumes current user if omitted. Ignored for non-modify Users\"\"\"\n  user_ids: [ID!]\n  hash: FingerprintHash!\n  algorithm: FingerprintAlgorithm!\n  duration: Int!\n}\n\ninput FingerprintEditInput {\n  user_ids: [ID!]\n  hash: FingerprintHash!\n  algorithm: FingerprintAlgorithm!\n  duration: Int!\n  created: Time!\n  submissions: Int @deprecated(reason: \"Unused\")\n  updated: Time @deprecated(reason: \"Unused\")\n}\n\ninput FingerprintQueryInput {\n  hash: FingerprintHash!\n  algorithm: FingerprintAlgorithm!\n}\n\ninput FingerprintSubmission {\n  scene_id: ID!\n  fingerprint: FingerprintInput!\n  unmatch: Boolean @deprecated(reason: \"Use `vote` with REMOVE instead\")\n  vote: FingerprintSubmissionType = VALID\n}\n\ninput FingerprintBatchSubmission {\n  scene_id: ID!\n  hash: FingerprintHash!\n  algorithm: FingerprintAlgorithm!\n  duration: Int!\n}\n\ntype FingerprintSubmissionResult {\n  \"\"\"The fingerprint hash that was submitted\"\"\"\n  hash: FingerprintHash!\n  \"\"\"The scene ID that was submitted to\"\"\"\n  scene_id: ID!\n  \"\"\"Error message if submission failed\"\"\"\n  error: String\n}\n\ninput MoveFingerprintSubmissionsInput {\n  fingerprints: [FingerprintQueryInput!]!\n  source_scene_id: ID!\n  target_scene_id: ID!\n}\n\ninput DeleteFingerprintSubmissionsInput {\n  fingerprints: [FingerprintQueryInput!]!\n  scene_id: ID!\n}\n\ntype Scene {\n  id: ID!\n  title: String\n  details: String\n  date: String @deprecated(reason: \"Please use `release_date` instead\")\n  release_date: String\n  production_date: String\n  urls: [URL!]!\n  studio: Studio\n  tags: [Tag!]!\n  images: [Image!]!\n  performers: [PerformerAppearance!]!\n  fingerprints(is_submitted: Boolean = False): [Fingerprint!]!\n  duration: Int\n  director: String\n  code: String\n  deleted: Boolean!\n  edits: [Edit!]!\n  created: Time!\n  updated: Time!\n}\n\ninput SceneCreateInput {\n  title: String\n  details: String\n  urls: [URLInput!]\n  date: String!\n  production_date: String\n  studio_id: ID\n  performers: [PerformerAppearanceInput!]\n  tag_ids: [ID!]\n  image_ids: [ID!]\n  fingerprints: [FingerprintEditInput!]!\n  duration: Int\n  director: String\n  code: String\n}\n\ninput SceneUpdateInput {\n  id: ID!\n  title: String\n  details: String\n  urls: [URLInput!]\n  date: String\n  production_date: String\n  studio_id: ID\n  performers: [PerformerAppearanceInput!]\n  tag_ids: [ID!]\n  image_ids: [ID!]\n  fingerprints: [FingerprintEditInput!]\n  duration: Int\n  director: String\n  code: String\n}\n\ninput SceneDestroyInput {\n  id: ID!\n}\n\ninput SceneEditDetailsInput {\n  title: String\n  details: String\n  urls: [URLInput!]\n  date: String\n  production_date: String\n  studio_id: ID\n  performers: [PerformerAppearanceInput!]\n  tag_ids: [ID!]\n  image_ids: [ID!]\n  duration: Int\n  director: String\n  code: String\n  fingerprints: [FingerprintInput!]\n  draft_id: ID\n}\n\ninput SceneEditInput {\n  edit: EditInput!\n  \"\"\"Not required for destroy type\"\"\"\n  details: SceneEditDetailsInput\n}\n\ntype SceneEdit {\n  title: String\n  details: String\n  added_urls: [URL!]\n  removed_urls: [URL!]\n  date: String\n  production_date: String\n  studio: Studio\n  \"\"\"Added or modified performer appearance entries\"\"\"\n  added_performers: [PerformerAppearance!]\n  removed_performers: [PerformerAppearance!]\n  added_tags: [Tag!]\n  removed_tags: [Tag!]\n  added_images: [Image!]\n  removed_images: [Image!]\n  added_fingerprints: [Fingerprint!]\n  removed_fingerprints: [Fingerprint!]\n  duration: Int\n  director: String\n  code: String\n  draft_id: ID\n\n  urls: [URL!]!\n  performers: [PerformerAppearance!]!\n  tags: [Tag!]!\n  images: [Image!]!\n  fingerprints: [Fingerprint!]!\n}\n\ntype QueryScenesResultType {\n  count: Int!\n  scenes: [Scene!]!\n}\n\nenum SceneSortEnum {\n  TITLE\n  DATE\n  TRENDING\n  CREATED_AT\n  UPDATED_AT\n}\n\ninput SceneQueryInput {\n  \"\"\"Filter to search title and details - assumes like query unless quoted\"\"\"\n  text: String\n  \"\"\"Filter to search title - assumes like query unless quoted\"\"\"\n  title: String\n  \"\"\"Filter to search urls - assumes like query unless quoted\"\"\"\n  url: String\n  \"\"\"Filter by date\"\"\"\n  date: DateCriterionInput\n  \"\"\"Filter by production date\"\"\"\n  production_date: DateCriterionInput\n  \"\"\"Filter to only include scenes with this studio\"\"\"\n  studios: MultiIDCriterionInput\n  \"\"\"Filter to only include scenes with this studio as primary or parent\"\"\"\n  parentStudio: String\n  \"\"\"Filter to only include scenes with these tags\"\"\"\n  tags: MultiIDCriterionInput\n  \"\"\"Filter to only include scenes with these performers\"\"\"\n  performers: MultiIDCriterionInput\n  \"\"\"Filter to include scenes with performer appearing as alias\"\"\"\n  alias: StringCriterionInput\n  \"\"\"Filter to only include scenes with these fingerprints\"\"\"\n  fingerprints: MultiStringCriterionInput\n  \"\"\"Filter by favorited entity\"\"\"\n  favorites: FavoriteFilter\n  \"\"\"Filter to scenes with fingerprints submitted by the user\"\"\"\n  has_fingerprint_submissions: Boolean = False\n\n  page: Int! = 1\n  per_page: Int! = 25\n  direction: SortDirectionEnum! = DESC\n  sort: SceneSortEnum! = DATE\n}\n\nunion SceneDraftStudio = Studio | DraftEntity\nunion SceneDraftPerformer = Performer | DraftEntity\nunion SceneDraftTag = Tag | DraftEntity\n\ntype SceneDraft {\n  id: ID\n  title: String\n  code: String\n  details: String\n  director: String\n  urls: [String!]\n  date: String\n  production_date: String\n  studio: SceneDraftStudio\n  performers: [SceneDraftPerformer!]!\n  tags: [SceneDraftTag!]\n  image: Image\n  fingerprints: [DraftFingerprint!]!\n}\n\ninput SceneDraftInput {\n  id: ID\n  title: String\n  code: String\n  details: String\n  director: String\n  url: String @deprecated(reason: \"Use urls field instead.\")\n  urls: [String!]\n  date: String\n  production_date: String\n  studio: DraftEntityInput\n  performers: [DraftEntityInput!]!\n  tags: [DraftEntityInput!]\n  image: Upload\n  fingerprints: [FingerprintInput!]!\n}\n\ninput QueryExistingSceneInput {\n  title: String\n  studio_id: ID\n  fingerprints: [FingerprintInput!]!\n}\n\ntype QueryExistingSceneResult {\n  edits: [Edit!]!\n  scenes: [Scene!]!\n}\n"
  },
  {
    "path": "graphql/schema/types/site.graphql",
    "content": "type Site {\n  id: ID!\n  name: String!\n  description:  String\n  url:  String\n  regex:  String\n  valid_types: [ValidSiteTypeEnum!]!\n  icon: String!\n  created: Time!\n  updated: Time!\n}\n\ninput SiteCreateInput {\n  name: String!\n  description: String\n  url: String\n  regex: String\n  valid_types: [ValidSiteTypeEnum!]!\n}\n\ninput SiteUpdateInput {\n  id: ID!\n  name: String!\n  description: String\n  url: String\n  regex: String\n  valid_types: [ValidSiteTypeEnum!]!\n}\n\ninput SiteDestroyInput {\n  id: ID!\n}\n\ntype QuerySitesResultType {\n  count: Int!\n  sites: [Site!]!\n}\n\nenum ValidSiteTypeEnum {\n  PERFORMER\n  SCENE\n  STUDIO\n}\n"
  },
  {
    "path": "graphql/schema/types/studio.graphql",
    "content": "type Studio {\n  id: ID!\n  name: String!\n  aliases: [String!]!\n  urls: [URL!]!\n  parent: Studio\n  child_studios: [Studio!]! @deprecated(reason: \"Use sub_studios instead\")\n  sub_studios(input: StudioQueryInput): QueryStudiosResultType!\n  images: [Image!]!\n  deleted: Boolean!\n  is_favorite: Boolean!\n  created: Time!\n  updated: Time!\n\n  performers(input: PerformerQueryInput!): QueryPerformersResultType!\n}\n\ninput StudioCreateInput {\n  name: String!\n  aliases: [String!]\n  urls: [URLInput!]\n  parent_id: ID\n  image_ids: [ID!]\n}\n\ninput StudioUpdateInput {\n  id: ID!\n  name: String\n  aliases: [String!]\n  urls: [URLInput!]\n  parent_id: ID\n  image_ids: [ID!]\n}\n\ninput StudioDestroyInput {\n  id: ID!\n}\n\ninput StudioEditDetailsInput {\n  name: String\n  aliases: [String!]\n  urls: [URLInput!]\n  parent_id: ID\n  image_ids: [ID!]\n}\n\ninput StudioEditInput {\n  edit: EditInput!\n  \"\"\"Not required for destroy type\"\"\"\n  details: StudioEditDetailsInput\n}\n\ntype StudioEdit {\n  name: String\n  \"\"\"Added and modified URLs\"\"\"\n  added_urls: [URL!]\n  removed_urls: [URL!]\n  parent: Studio\n  added_images: [Image!]\n  removed_images: [Image!]\n  added_aliases: [String!]\n  removed_aliases: [String!]\n\n  images: [Image!]!\n  urls: [URL!]!\n}\n\ntype QueryStudiosResultType {\n  count: Int!\n  studios: [Studio!]!\n}\n\nenum StudioSortEnum {\n  NAME\n  CREATED_AT\n  UPDATED_AT\n}\n\ninput StudioQueryInput {\n  \"\"\"Filter to search name - assumes like query unless quoted\"\"\"\n  name: String\n  \"\"\"Filter to search studio name, aliases and parent studio name - assumes like query unless quoted\"\"\"\n  names: String\n  \"\"\"Filter to search url - assumes like query unless quoted\"\"\"\n  url: String\n  parent: IDCriterionInput\n  has_parent: Boolean\n  \"\"\"Filter by studio favorite status for the current user\"\"\"\n  is_favorite: Boolean\n\n  page: Int! = 1\n  per_page: Int! = 25\n  direction: SortDirectionEnum! = ASC\n  sort: StudioSortEnum! = NAME\n}\n"
  },
  {
    "path": "graphql/schema/types/tag.graphql",
    "content": "enum TagGroupEnum {\n  PEOPLE\n  SCENE\n  ACTION\n}\n\ntype Tag {\n  id: ID!\n  name: String!\n  description: String\n  aliases: [String!]!\n  deleted: Boolean!\n  edits: [Edit!]!\n  category: TagCategory\n  created: Time!\n  updated: Time!\n}\n\ninput TagCreateInput {\n  name: String!\n  description: String\n  aliases: [String!]\n  category_id: ID\n}\n\ninput TagUpdateInput {\n  id: ID!\n  name: String\n  description: String\n  aliases: [String!]\n  category_id: ID\n}\n\ninput TagDestroyInput {\n  id: ID!\n}\n\ninput TagEditDetailsInput {\n  name: String\n  description: String\n  aliases: [String!]\n  category_id: ID\n}\n\ninput TagEditInput {\n  edit: EditInput!\n  \"\"\"Not required for destroy type\"\"\"\n  details: TagEditDetailsInput\n}\n\ntype TagEdit {\n  name: String\n  description: String\n  added_aliases: [String!]\n  removed_aliases: [String!]\n  category: TagCategory\n\n  aliases: [String!]!\n}\n\ntype QueryTagsResultType {\n  count: Int!\n  tags: [Tag!]!\n}\n\ntype QueryTagCategoriesResultType {\n  count: Int!\n  tag_categories: [TagCategory!]!\n}\n\nenum TagSortEnum {\n  NAME\n  CREATED_AT\n  UPDATED_AT\n}\n\ninput TagQueryInput {\n  \"\"\"Filter to search name, aliases and description - assumes like query unless quoted\"\"\"\n  text: String\n  \"\"\"Searches name and aliases - assumes like query unless quoted\"\"\"\n  names: String\n  \"\"\"Filter to search name - assumes like query unless quoted\"\"\"\n  name: String\n  \"\"\"Filter to category ID\"\"\"\n  category_id: ID\n\n  page: Int! = 1\n  per_page: Int! = 25\n  direction: SortDirectionEnum! = ASC\n  sort: TagSortEnum! = NAME\n}\n\ntype TagCategory {\n  id: ID!\n  name: String!\n  group:  TagGroupEnum!\n  description: String\n}\n\ninput TagCategoryCreateInput {\n  name: String!\n  group:  TagGroupEnum!\n  description: String\n}\n\ninput TagCategoryUpdateInput {\n  id: ID!\n  name: String\n  group:  TagGroupEnum\n  description: String\n}\n\ninput TagCategoryDestroyInput {\n  id: ID!\n}\n"
  },
  {
    "path": "graphql/schema/types/user.graphql",
    "content": "directive @isUserOwner on FIELD_DEFINITION\ndirective @hasRole(role: RoleEnum!) on FIELD_DEFINITION\n\nenum RoleEnum {\n  READ\n  VOTE\n  EDIT\n  MODIFY\n  MODERATE\n  ADMIN\n  \"\"\"May generate invites without tokens\"\"\"\n  INVITE\n  \"\"\"May grant and rescind invite tokens and resind invite keys\"\"\"\n  MANAGE_INVITES\n  BOT\n  READ_ONLY\n  EDIT_TAGS\n}\n\ntype InviteKey {\n  id: ID!\n  uses: Int\n  expires: Time\n}\n\ntype User {\n  id: ID!\n  name: String!\n  \"\"\"Should not be visible to other users\"\"\"\n  roles: [RoleEnum!] @isUserOwner\n  \"\"\"Should not be visible to other users\"\"\"\n  email: String @isUserOwner\n  \"\"\"Should not be visible to other users\"\"\"\n  api_key: String @isUserOwner\n  notification_subscriptions: [NotificationEnum!]! @isUserOwner\n\n  \"\"\" Vote counts by type \"\"\"\n  vote_count: UserVoteCount!\n  \"\"\" Edit counts by status \"\"\"\n  edit_count: UserEditCount!\n\n  \"\"\"Calls to the API from this user over a configurable time period\"\"\"\n  api_calls: Int! @isUserOwner\n  invited_by: User @isUserOwner\n  invite_tokens: Int @isUserOwner\n  active_invite_codes: [String!] @isUserOwner @deprecated(reason: \"Use invite_codes instead\")\n  invite_codes: [InviteKey!] @isUserOwner\n}\n\ninput UserCreateInput {\n  name: String!\n  \"\"\"Password in plain text\"\"\"\n  password: String!\n  roles: [RoleEnum!]!\n  email: String!\n  invited_by_id: ID\n}\n\ninput UserUpdateInput {\n  id: ID!\n  name: String\n  \"\"\"Password in plain text\"\"\"\n  password: String\n  roles: [RoleEnum!]\n  email: String\n}\n\ninput NewUserInput {\n  email: String!\n  invite_key: ID \n}\n\ninput ActivateNewUserInput {\n  name: String!\n  activation_key: ID!\n  password: String!\n}\n\ninput ResetPasswordInput {\n  email: String!\n}\n\ninput UserChangePasswordInput {\n  \"\"\"Password in plain text\"\"\"\n  existing_password: String\n  new_password: String!\n  reset_key: ID\n}\n\ninput UserDestroyInput {\n    id: ID!\n}\n\ninput GrantInviteInput {\n  user_id: ID!\n  amount: Int!\n}\n\ninput RevokeInviteInput {\n  user_id: ID!\n  amount: Int!\n}\n\ntype QueryUsersResultType {\n  count: Int!\n  users: [User!]!\n}\n\ninput RoleCriterionInput {\n  value: [RoleEnum!]!\n  modifier: CriterionModifier!\n}\n\ninput UserQueryInput {\n  \"\"\"Filter to search user name - assumes like query unless quoted\"\"\"\n  name: String\n  \"\"\"Filter to search email - assumes like query unless quoted\"\"\"\n  email: String\n  \"\"\"Filter by roles\"\"\"\n  roles: RoleCriterionInput\n  \"\"\"Filter by api key\"\"\"\n  apiKey: String\n\n  \"\"\"Filter by successful edits\"\"\"\n  successful_edits: IntCriterionInput\n  \"\"\"Filter by unsuccessful edits\"\"\"\n  unsuccessful_edits: IntCriterionInput\n  \"\"\"Filter by votes on successful edits\"\"\"\n  successful_votes: IntCriterionInput\n  \"\"\"Filter by votes on unsuccessful edits\"\"\"\n  unsuccessful_votes: IntCriterionInput\n  \"\"\"Filter by number of API calls\"\"\"\n  api_calls: IntCriterionInput\n  \"\"\"Filter by user that invited\"\"\"\n  invited_by: ID\n\n  page: Int! = 1\n  per_page: Int! = 25\n}\n\ntype UserEditCount {\n  accepted: Int!\n  rejected: Int!\n  pending: Int!\n  immediate_accepted: Int!\n  immediate_rejected: Int!\n  failed: Int!\n  canceled: Int!\n}\n\ntype UserVoteCount {\n  abstain: Int!\n  accept: Int!\n  reject: Int!\n  immediate_accept: Int!\n  immediate_reject: Int!\n}\n\ninput GenerateInviteCodeInput {\n  # the number of invite keys to generate. If not set, a single invite key will be generated\n  keys: Int\n  # the number of uses for each invite key. If not set, the invite key will have one use\n  uses: Int\n  # the number of seconds until the invite code expires. If not set, the invite code will never expire\n  ttl: Int\n}\n\ninput UserChangeEmailInput {\n  existing_email_token: ID\n  new_email_token: ID\n  new_email: String\n}\n\nenum UserChangeEmailStatus {\n  CONFIRM_OLD\n  CONFIRM_NEW\n  EXPIRED\n  INVALID_TOKEN\n  SUCCESS\n  ERROR\n}\n"
  },
  {
    "path": "graphql/schema/types/version.graphql",
    "content": "type Version {\n  hash: String!\n  build_time: String!\n  build_type: String!\n  version: String!\n}\n"
  },
  {
    "path": "internal/api/context_keys.go",
    "content": "package api\n\n// https://stackoverflow.com/questions/40891345/fix-should-not-use-basic-type-string-as-key-in-context-withvalue-golint\n\ntype key int\n\nconst (\n\tContextRepo key = iota\n)\n"
  },
  {
    "path": "internal/api/directives.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/99designs/gqlgen/graphql\"\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc IsUserOwnerDirective(ctx context.Context, obj interface{}, next graphql.Resolver) (interface{}, error) {\n\tif err := auth.ValidateUserOrAdmin(ctx, obj.(*models.User).ID); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn next(ctx)\n}\n\nfunc HasRoleDirective(ctx context.Context, obj interface{}, next graphql.Resolver, role models.RoleEnum) (interface{}, error) {\n\tif err := auth.ValidateRole(ctx, role); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn next(ctx)\n}\n"
  },
  {
    "path": "internal/api/draft_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype draftTestRunner struct {\n\ttestRunner\n}\n\nfunc createDraftTestRunner(t *testing.T) *draftTestRunner {\n\treturn &draftTestRunner{\n\t\ttestRunner: *asEdit(t),\n\t}\n}\n\nfunc (s *draftTestRunner) testSubmitSceneDraft() {\n\ttitle := \"Test Scene Draft\"\n\thash := models.FingerprintHash(0xabc123def456)\n\talgorithm := models.FingerprintAlgorithmPhash\n\tduration := 180\n\n\tinput := models.SceneDraftInput{\n\t\tTitle: &title,\n\t\tFingerprints: []models.FingerprintInput{\n\t\t\t{\n\t\t\t\tHash:      hash,\n\t\t\t\tAlgorithm: algorithm,\n\t\t\t\tDuration:  duration,\n\t\t\t},\n\t\t},\n\t\tPerformers: []models.DraftEntityInput{\n\t\t\t{\n\t\t\t\tName: \"Test Performer\",\n\t\t\t},\n\t\t},\n\t}\n\n\tresult, err := s.client.submitSceneDraft(input)\n\tassert.NoError(s.t, err, \"Error submitting scene draft\")\n\tassert.NotNil(s.t, result, \"Result should not be nil\")\n\tassert.NotNil(s.t, result.ID, \"Draft ID should not be nil\")\n\tassert.NotNil(s.t, result.UUID(), \"Draft UUID should not be nil\")\n}\n\nfunc (s *draftTestRunner) testSubmitPerformerDraft() {\n\tname := \"Test Performer Draft\"\n\tgender := \"Female\"\n\tcountry := \"US\"\n\n\tinput := models.PerformerDraftInput{\n\t\tName:    name,\n\t\tGender:  &gender,\n\t\tCountry: &country,\n\t}\n\n\tresult, err := s.client.submitPerformerDraft(input)\n\tassert.NoError(s.t, err, \"Error submitting performer draft\")\n\tassert.NotNil(s.t, result, \"Result should not be nil\")\n\tassert.NotNil(s.t, result.ID, \"Draft ID should not be nil\")\n\tassert.NotNil(s.t, result.UUID(), \"Draft UUID should not be nil\")\n}\n\nfunc (s *draftTestRunner) testFindDraft() {\n\t// Create a draft first\n\tname := \"Test Performer for Find\"\n\tinput := models.PerformerDraftInput{\n\t\tName: name,\n\t}\n\n\tresult, err := s.client.submitPerformerDraft(input)\n\tassert.NoError(s.t, err, \"Error submitting performer draft\")\n\tassert.NotNil(s.t, result.UUID(), \"Draft UUID should not be nil\")\n\n\tdraftID := *result.UUID()\n\n\t// Find the draft\n\tfoundDraft, err := s.client.findDraft(draftID)\n\tassert.NoError(s.t, err, \"Error finding draft\")\n\tassert.NotNil(s.t, foundDraft, \"Found draft should not be nil\")\n\tassert.Equal(s.t, draftID.String(), foundDraft.ID, \"Draft ID should match\")\n}\n\nfunc (s *draftTestRunner) testFindDrafts() {\n\t// Create multiple drafts\n\tname1 := \"Test Performer 1\"\n\tinput1 := models.PerformerDraftInput{\n\t\tName: name1,\n\t}\n\tresult1, err := s.client.submitPerformerDraft(input1)\n\tassert.NoError(s.t, err, \"Error submitting first performer draft\")\n\n\tname2 := \"Test Performer 2\"\n\tinput2 := models.PerformerDraftInput{\n\t\tName: name2,\n\t}\n\tresult2, err := s.client.submitPerformerDraft(input2)\n\tassert.NoError(s.t, err, \"Error submitting second performer draft\")\n\n\t// Find all drafts\n\tdrafts, err := s.client.findDrafts()\n\tassert.NoError(s.t, err, \"Error finding drafts\")\n\tassert.NotNil(s.t, drafts, \"Drafts should not be nil\")\n\tassert.True(s.t, len(drafts) >= 2, \"Should have at least 2 drafts\")\n\n\t// Verify our created drafts are in the results\n\tfoundDraft1 := false\n\tfoundDraft2 := false\n\tfor _, draft := range drafts {\n\t\tif draft.ID == result1.UUID().String() {\n\t\t\tfoundDraft1 = true\n\t\t}\n\t\tif draft.ID == result2.UUID().String() {\n\t\t\tfoundDraft2 = true\n\t\t}\n\t}\n\tassert.True(s.t, foundDraft1, \"First draft should be found\")\n\tassert.True(s.t, foundDraft2, \"Second draft should be found\")\n}\n\nfunc (s *draftTestRunner) testDestroyDraft() {\n\t// Create a draft first\n\tname := \"Test Performer for Destroy\"\n\tinput := models.PerformerDraftInput{\n\t\tName: name,\n\t}\n\n\tresult, err := s.client.submitPerformerDraft(input)\n\tassert.NoError(s.t, err, \"Error submitting performer draft\")\n\tassert.NotNil(s.t, result.UUID(), \"Draft UUID should not be nil\")\n\n\tdraftID := *result.UUID()\n\n\t// Destroy the draft\n\tdestroyed, err := s.client.destroyDraft(draftID)\n\tassert.NoError(s.t, err, \"Error destroying draft\")\n\tassert.True(s.t, destroyed, \"Draft should be destroyed\")\n\n\t// Verify draft is no longer found\n\tfoundDraft, err := s.client.findDraft(draftID)\n\t// Should return an error since the draft doesn't exist\n\tassert.NotNil(s.t, err, \"Should return error when finding destroyed draft\")\n\tassert.Nil(s.t, foundDraft, \"Found draft should be nil after destruction\")\n}\n\nfunc TestSubmitSceneDraft(t *testing.T) {\n\tpt := createDraftTestRunner(t)\n\tpt.testSubmitSceneDraft()\n}\n\nfunc TestSubmitPerformerDraft(t *testing.T) {\n\tpt := createDraftTestRunner(t)\n\tpt.testSubmitPerformerDraft()\n}\n\nfunc TestFindDraft(t *testing.T) {\n\tpt := createDraftTestRunner(t)\n\tpt.testFindDraft()\n}\n\nfunc TestFindDrafts(t *testing.T) {\n\tpt := createDraftTestRunner(t)\n\tpt.testFindDrafts()\n}\n\nfunc TestDestroyDraft(t *testing.T) {\n\tpt := createDraftTestRunner(t)\n\tpt.testDestroyDraft()\n}\n\nfunc (s *draftTestRunner) testSceneDraftTagResolution() {\n\t// Create three unique tags using the resolver directly\n\ttag1Name := \"Tag One\"\n\ttag1Input := models.TagCreateInput{Name: tag1Name}\n\ttag1, err := s.resolver.Mutation().TagCreate(s.ctx, tag1Input)\n\tassert.NoError(s.t, err, \"Error creating tag 1\")\n\ttag1ID := tag1.ID\n\n\ttag2Name := \"Tag Two\"\n\ttag2Input := models.TagCreateInput{Name: tag2Name}\n\ttag2, err := s.resolver.Mutation().TagCreate(s.ctx, tag2Input)\n\tassert.NoError(s.t, err, \"Error creating tag 2\")\n\ttag2ID := tag2.ID\n\n\ttag3Name := \"Tag Three\"\n\ttag3Alias := \"Tag Three Alias\"\n\ttag3Input := models.TagCreateInput{Name: tag3Name, Aliases: []string{tag3Alias}}\n\ttag3, err := s.resolver.Mutation().TagCreate(s.ctx, tag3Input)\n\tassert.NoError(s.t, err, \"Error creating tag 3\")\n\ttag3ID := tag3.ID\n\n\t// Submit a draft testing all resolution methods\n\ttitle := \"Scene with Multiple Tags\"\n\thash := models.FingerprintHash(0x1234567890)\n\talgorithm := models.FingerprintAlgorithmPhash\n\tduration := 120\n\tunmatchedTagName := \"Nonexistent Tag\"\n\n\tdraftInput := models.SceneDraftInput{\n\t\tTitle: &title,\n\t\tFingerprints: []models.FingerprintInput{\n\t\t\t{Hash: hash, Algorithm: algorithm, Duration: duration},\n\t\t},\n\t\tPerformers: []models.DraftEntityInput{},\n\t\tTags: []models.DraftEntityInput{\n\t\t\t{Name: tag1Name},               // Test: exact name match\n\t\t\t{Name: \"Ignored\", ID: &tag2ID}, // Test: ID match (name ignored)\n\t\t\t{Name: tag3Alias},              // Test: alias match\n\t\t\t{Name: unmatchedTagName},       // Test: non-existent tag\n\t\t},\n\t}\n\n\tdraft, err := s.client.submitSceneDraft(draftInput)\n\tassert.NoError(s.t, err, \"Error submitting draft\")\n\tassert.NotNil(s.t, draft.UUID(), \"Draft UUID should not be nil\")\n\n\t// Query back and verify all tags\n\tfoundDraft, err := s.client.findDraftWithTags(*draft.UUID())\n\tassert.NoError(s.t, err, \"Error finding draft\")\n\tassert.NotNil(s.t, foundDraft.Data, \"Draft data should not be nil\")\n\n\tdraftData := foundDraft.Data.(map[string]interface{})\n\ttags, ok := draftData[\"tags\"].([]interface{})\n\tassert.True(s.t, ok, \"Tags should be an array\")\n\tassert.Equal(s.t, 4, len(tags), \"Should have exactly 4 tags\")\n\n\t// Verify each tag\n\ttag1Found := tags[0].(map[string]interface{})\n\tassert.Equal(s.t, \"Tag\", tag1Found[\"__typename\"], \"Tag 1 should be resolved\")\n\tassert.Equal(s.t, tag1ID.String(), tag1Found[\"id\"], \"Tag 1 ID should match\")\n\tassert.Equal(s.t, tag1Name, tag1Found[\"name\"], \"Tag 1 name should match\")\n\n\ttag2Found := tags[1].(map[string]interface{})\n\tassert.Equal(s.t, \"Tag\", tag2Found[\"__typename\"], \"Tag 2 should be resolved\")\n\tassert.Equal(s.t, tag2ID.String(), tag2Found[\"id\"], \"Tag 2 ID should match\")\n\tassert.Equal(s.t, tag2Name, tag2Found[\"name\"], \"Tag 2 name should match\")\n\n\ttag3Found := tags[2].(map[string]interface{})\n\tassert.Equal(s.t, \"Tag\", tag3Found[\"__typename\"], \"Tag 3 should be resolved\")\n\tassert.Equal(s.t, tag3ID.String(), tag3Found[\"id\"], \"Tag 3 ID should match\")\n\tassert.Equal(s.t, tag3Name, tag3Found[\"name\"], \"Tag 3 name should match\")\n\n\tunmatchedFound := tags[3].(map[string]interface{})\n\tassert.Equal(s.t, \"DraftEntity\", unmatchedFound[\"__typename\"], \"Unmatched tag should be DraftEntity\")\n\tassert.Equal(s.t, unmatchedTagName, unmatchedFound[\"name\"], \"Unmatched tag name should match\")\n}\n\nfunc TestSceneDraftTagResolution(t *testing.T) {\n\tpt := createDraftTestRunner(t)\n\tpt.testSceneDraftTagResolution()\n}\n"
  },
  {
    "path": "internal/api/edit_amend_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype editAmendTestRunner struct {\n\ttestRunner\n}\n\nfunc createEditAmendTestRunner(t *testing.T) *editAmendTestRunner {\n\treturn &editAmendTestRunner{\n\t\ttestRunner: *asModerate(t),\n\t}\n}\n\nfunc (s *editAmendTestRunner) testAmendClosedEdit() {\n\t// Create a performer edit with name and aliases\n\tname := s.generatePerformerName()\n\taliases := []string{\"Alias1\", \"Alias2\"}\n\tdetailsInput := &models.PerformerEditDetailsInput{\n\t\tName:    &name,\n\t\tAliases: aliases,\n\t}\n\tcreatedEdit, err := s.createTestPerformerEdit(models.OperationEnumCreate, detailsInput, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Apply the edit to make it closed (requires admin)\n\tadminRunner := asAdmin(s.t)\n\tappliedEdit, err := adminRunner.applyEdit(createdEdit.ID)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, appliedEdit.ClosedAt)\n\n\t// Amend the edit - remove the name field\n\treason := \"Removing incorrect name\"\n\tamendInput := models.AmendEditInput{\n\t\tID:           appliedEdit.ID,\n\t\tReason:       reason,\n\t\tRemoveFields: []string{\"name\"},\n\t}\n\n\tamendedEdit, err := s.resolver.Mutation().AmendEdit(s.ctx, amendInput)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, amendedEdit)\n\n\t// Verify the edit still exists and can be fetched\n\tedit, err := s.resolver.Query().FindEdit(s.ctx, appliedEdit.ID)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, edit)\n}\n\nfunc (s *editAmendTestRunner) testAmendArrayItems() {\n\t// Create a performer edit with multiple aliases\n\tname := s.generatePerformerName()\n\taliases := []string{\"Alias1\", \"Alias2\", \"Alias3\"}\n\tdetailsInput := &models.PerformerEditDetailsInput{\n\t\tName:    &name,\n\t\tAliases: aliases,\n\t}\n\tcreatedEdit, err := s.createTestPerformerEdit(models.OperationEnumCreate, detailsInput, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Apply the edit\n\tadminRunner := asAdmin(s.t)\n\tappliedEdit, err := adminRunner.applyEdit(createdEdit.ID)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, appliedEdit.ClosedAt)\n\n\t// Amend the edit - remove one alias\n\treason := \"Removing incorrect alias\"\n\tamendInput := models.AmendEditInput{\n\t\tID:     appliedEdit.ID,\n\t\tReason: reason,\n\t\tRemoveAddedItems: []models.AmendItemRemoval{\n\t\t\t{\n\t\t\t\tField:   \"aliases\",\n\t\t\t\tIndices: []int{1}, // Remove \"Alias2\"\n\t\t\t},\n\t\t},\n\t}\n\n\tamendedEdit, err := s.resolver.Mutation().AmendEdit(s.ctx, amendInput)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, amendedEdit)\n}\n\nfunc (s *editAmendTestRunner) testCannotAmendPendingEdit() {\n\t// Create a performer edit (leave it pending)\n\tcreatedEdit, err := s.createTestPerformerEdit(models.OperationEnumCreate, nil, nil, nil)\n\tassert.NoError(s.t, err)\n\tassert.Nil(s.t, createdEdit.ClosedAt)\n\tassert.Equal(s.t, models.VoteStatusEnumPending.String(), createdEdit.Status)\n\n\t// Attempt to amend pending edit\n\treason := \"Test reason\"\n\tamendInput := models.AmendEditInput{\n\t\tID:           createdEdit.ID,\n\t\tReason:       reason,\n\t\tRemoveFields: []string{\"name\"},\n\t}\n\n\t_, err = s.resolver.Mutation().AmendEdit(s.ctx, amendInput)\n\tassert.Error(s.t, err)\n\tassert.Contains(s.t, err.Error(), \"cannot amend pending edit\")\n}\n\nfunc (s *editAmendTestRunner) testNonModeratorCannotAmend() {\n\t// Create and close an edit as moderator\n\tcreatedEdit, err := s.createTestPerformerEdit(models.OperationEnumCreate, nil, nil, nil)\n\tassert.NoError(s.t, err)\n\n\tadminRunner := asAdmin(s.t)\n\tappliedEdit, err := adminRunner.applyEdit(createdEdit.ID)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, appliedEdit.ClosedAt)\n\n\t// Switch to non-moderator user (edit role only)\n\teditRunner := asEdit(s.t)\n\treason := \"Test reason\"\n\tamendInput := models.AmendEditInput{\n\t\tID:           appliedEdit.ID,\n\t\tReason:       reason,\n\t\tRemoveFields: []string{\"name\"},\n\t}\n\n\t// Attempt to amend as non-moderator (using client to enforce directives)\n\t_, err = editRunner.client.amendEdit(amendInput)\n\tassert.Error(s.t, err)\n\tassert.Contains(s.t, err.Error(), \"not authorized\")\n}\n\nfunc (s *editAmendTestRunner) testAmendRequiresReason() {\n\t// Create and close an edit with multiple fields\n\tname := s.generatePerformerName()\n\taliases := []string{\"Alias1\", \"Alias2\"}\n\tdetailsInput := &models.PerformerEditDetailsInput{\n\t\tName:    &name,\n\t\tAliases: aliases,\n\t}\n\tcreatedEdit, err := s.createTestPerformerEdit(models.OperationEnumCreate, detailsInput, nil, nil)\n\tassert.NoError(s.t, err)\n\n\tadminRunner := asAdmin(s.t)\n\tappliedEdit, err := adminRunner.applyEdit(createdEdit.ID)\n\tassert.NoError(s.t, err)\n\n\t// Attempt to amend with empty reason - should still work as the reason is just metadata\n\t// The validation is for having at least one removal\n\tamendInput := models.AmendEditInput{\n\t\tID:           appliedEdit.ID,\n\t\tReason:       \"\", // Empty reason\n\t\tRemoveFields: []string{\"name\"},\n\t}\n\n\t// Empty reason is allowed at the backend level - the frontend enforces required\n\t_, err = s.resolver.Mutation().AmendEdit(s.ctx, amendInput)\n\tassert.NoError(s.t, err)\n}\n\nfunc (s *editAmendTestRunner) testAmendRequiresChanges() {\n\t// Create and close an edit\n\tcreatedEdit, err := s.createTestPerformerEdit(models.OperationEnumCreate, nil, nil, nil)\n\tassert.NoError(s.t, err)\n\n\tadminRunner := asAdmin(s.t)\n\tappliedEdit, err := adminRunner.applyEdit(createdEdit.ID)\n\tassert.NoError(s.t, err)\n\n\t// Attempt to amend without specifying any removals\n\tamendInput := models.AmendEditInput{\n\t\tID:     appliedEdit.ID,\n\t\tReason: \"Some reason\",\n\t\t// No RemoveFields, RemoveAddedItems, or RemoveRemovedItems\n\t}\n\n\t_, err = s.resolver.Mutation().AmendEdit(s.ctx, amendInput)\n\tassert.Error(s.t, err)\n\tassert.Contains(s.t, err.Error(), \"must specify at least one field or item to remove\")\n}\n\nfunc TestAmendClosedEdit(t *testing.T) {\n\ts := createEditAmendTestRunner(t)\n\ts.testAmendClosedEdit()\n}\n\nfunc TestAmendArrayItems(t *testing.T) {\n\ts := createEditAmendTestRunner(t)\n\ts.testAmendArrayItems()\n}\n\nfunc TestCannotAmendPendingEdit(t *testing.T) {\n\ts := createEditAmendTestRunner(t)\n\ts.testCannotAmendPendingEdit()\n}\n\nfunc TestNonModeratorCannotAmendEdit(t *testing.T) {\n\ts := createEditAmendTestRunner(t)\n\ts.testNonModeratorCannotAmend()\n}\n\nfunc TestAmendRequiresReason(t *testing.T) {\n\ts := createEditAmendTestRunner(t)\n\ts.testAmendRequiresReason()\n}\n\nfunc TestAmendRequiresChanges(t *testing.T) {\n\ts := createEditAmendTestRunner(t)\n\ts.testAmendRequiresChanges()\n}\n"
  },
  {
    "path": "internal/api/edit_delete_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype editDeleteTestRunner struct {\n\ttestRunner\n}\n\nfunc createEditDeleteTestRunner(t *testing.T) *editDeleteTestRunner {\n\treturn &editDeleteTestRunner{\n\t\ttestRunner: *asModerate(t),\n\t}\n}\n\nfunc (s *editDeleteTestRunner) testDeleteClosedEdit() {\n\t// Create a tag edit\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Apply the edit to make it closed (requires admin)\n\tadminRunner := asAdmin(s.t)\n\tappliedEdit, err := adminRunner.applyEdit(createdEdit.ID)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, appliedEdit.ClosedAt)\n\tassert.Equal(s.t, models.VoteStatusEnumImmediateAccepted.String(), appliedEdit.Status)\n\n\t// Delete the closed edit\n\treason := \"Test deletion reason\"\n\tdeleteInput := models.DeleteEditInput{\n\t\tID:     appliedEdit.ID,\n\t\tReason: reason,\n\t}\n\n\tdeleted, err := s.resolver.Mutation().DeleteEdit(s.ctx, deleteInput)\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, deleted)\n\n\t// Verify edit is deleted - should return nil\n\tedit, err := s.resolver.Query().FindEdit(s.ctx, appliedEdit.ID)\n\tassert.NoError(s.t, err)\n\tassert.Nil(s.t, edit)\n\n\t// Note: Cannot easily verify audit record in test due to transaction isolation\n\t// The audit record is created in the service layer and would require direct database access\n}\n\nfunc (s *editDeleteTestRunner) testCannotDeletePendingEdit() {\n\t// Create a tag edit (leave it pending)\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\tassert.Nil(s.t, createdEdit.ClosedAt)\n\tassert.Equal(s.t, models.VoteStatusEnumPending.String(), createdEdit.Status)\n\n\t// Attempt to delete pending edit\n\treason := \"Test reason\"\n\tdeleteInput := models.DeleteEditInput{\n\t\tID:     createdEdit.ID,\n\t\tReason: reason,\n\t}\n\n\tdeleted, err := s.resolver.Mutation().DeleteEdit(s.ctx, deleteInput)\n\tassert.Error(s.t, err)\n\tassert.False(s.t, deleted)\n\tassert.Contains(s.t, err.Error(), \"cannot delete pending edit\")\n\n\t// Verify edit still exists\n\tedit, err := s.resolver.Query().FindEdit(s.ctx, createdEdit.ID)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, edit)\n\tassert.Equal(s.t, createdEdit.ID, edit.ID)\n}\n\nfunc (s *editDeleteTestRunner) testNonModeratorCannotDelete() {\n\t// Create and close an edit as moderator\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\tadminRunner := asAdmin(s.t)\n\tappliedEdit, err := adminRunner.applyEdit(createdEdit.ID)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, appliedEdit.ClosedAt)\n\n\t// Switch to non-moderator user (edit role only)\n\teditRunner := asEdit(s.t)\n\treason := \"Test reason\"\n\tdeleteInput := models.DeleteEditInput{\n\t\tID:     appliedEdit.ID,\n\t\tReason: reason,\n\t}\n\n\t// Attempt to delete as non-moderator (using client to enforce directives)\n\tdeleted, err := editRunner.client.deleteEdit(deleteInput)\n\tassert.Error(s.t, err)\n\tassert.False(s.t, deleted)\n\tassert.Contains(s.t, err.Error(), \"not authorized\")\n\n\t// Verify edit still exists\n\tedit, err := s.resolver.Query().FindEdit(s.ctx, appliedEdit.ID)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, edit)\n\tassert.Equal(s.t, appliedEdit.ID, edit.ID)\n}\n\nfunc (s *editDeleteTestRunner) testDeleteRejectedEdit() {\n\t// Create a tag edit\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Cancel/reject the edit\n\tcancelInput := models.CancelEditInput{\n\t\tID: createdEdit.ID,\n\t}\n\tcanceledEdit, err := s.resolver.Mutation().CancelEdit(s.ctx, cancelInput)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, canceledEdit.ClosedAt)\n\tassert.Equal(s.t, models.VoteStatusEnumCanceled.String(), canceledEdit.Status)\n\n\t// Delete the rejected edit\n\treason := \"Removing rejected edit\"\n\tdeleteInput := models.DeleteEditInput{\n\t\tID:     canceledEdit.ID,\n\t\tReason: reason,\n\t}\n\n\tdeleted, err := s.resolver.Mutation().DeleteEdit(s.ctx, deleteInput)\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, deleted)\n\n\t// Verify edit is deleted\n\tedit, err := s.resolver.Query().FindEdit(s.ctx, canceledEdit.ID)\n\tassert.NoError(s.t, err)\n\tassert.Nil(s.t, edit)\n}\n\nfunc (s *editDeleteTestRunner) testDeleteEditWithComments() {\n\t// Create a tag edit\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Add a comment\n\tcommentText := \"Test comment\"\n\tcommentInput := models.EditCommentInput{\n\t\tID:      createdEdit.ID,\n\t\tComment: commentText,\n\t}\n\t_, err = s.resolver.Mutation().EditComment(s.ctx, commentInput)\n\tassert.NoError(s.t, err)\n\n\t// Verify comment exists\n\tcomments, err := s.resolver.Edit().Comments(s.ctx, createdEdit)\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 1, len(comments))\n\n\t// Close the edit (requires admin)\n\tadminRunner := asAdmin(s.t)\n\tappliedEdit, err := adminRunner.applyEdit(createdEdit.ID)\n\tassert.NoError(s.t, err)\n\n\t// Delete the edit\n\treason := \"Cleaning up test edit with comments\"\n\tdeleteInput := models.DeleteEditInput{\n\t\tID:     appliedEdit.ID,\n\t\tReason: reason,\n\t}\n\n\tdeleted, err := s.resolver.Mutation().DeleteEdit(s.ctx, deleteInput)\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, deleted)\n\n\t// Verify edit and comments are deleted (CASCADE)\n\tedit, err := s.resolver.Query().FindEdit(s.ctx, appliedEdit.ID)\n\tassert.NoError(s.t, err)\n\tassert.Nil(s.t, edit)\n}\n\nfunc (s *editDeleteTestRunner) testDeleteEditWithVotes() {\n\t// Create a tag edit as non-admin\n\teditRunner := asEdit(s.t)\n\tcreatedEdit, err := editRunner.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Vote on it as admin\n\tvoteInput := models.EditVoteInput{\n\t\tID:   createdEdit.ID,\n\t\tVote: models.VoteTypeEnumAccept,\n\t}\n\t_, err = s.resolver.Mutation().EditVote(s.ctx, voteInput)\n\tassert.NoError(s.t, err)\n\n\t// Verify vote exists\n\tvotes, err := s.resolver.Edit().Votes(s.ctx, createdEdit)\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 1, len(votes))\n\n\t// Close the edit (requires admin)\n\tadminRunner := asAdmin(s.t)\n\tappliedEdit, err := adminRunner.applyEdit(createdEdit.ID)\n\tassert.NoError(s.t, err)\n\n\t// Delete the edit\n\treason := \"Cleaning up test edit with votes\"\n\tdeleteInput := models.DeleteEditInput{\n\t\tID:     appliedEdit.ID,\n\t\tReason: reason,\n\t}\n\n\tdeleted, err := s.resolver.Mutation().DeleteEdit(s.ctx, deleteInput)\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, deleted)\n\n\t// Verify edit and votes are deleted (CASCADE)\n\tedit, err := s.resolver.Query().FindEdit(s.ctx, appliedEdit.ID)\n\tassert.NoError(s.t, err)\n\tassert.Nil(s.t, edit)\n}\n\nfunc TestDeleteClosedEdit(t *testing.T) {\n\ts := createEditDeleteTestRunner(t)\n\ts.testDeleteClosedEdit()\n}\n\nfunc TestCannotDeletePendingEdit(t *testing.T) {\n\ts := createEditDeleteTestRunner(t)\n\ts.testCannotDeletePendingEdit()\n}\n\nfunc TestNonModeratorCannotDeleteEdit(t *testing.T) {\n\ts := createEditDeleteTestRunner(t)\n\ts.testNonModeratorCannotDelete()\n}\n\nfunc TestDeleteRejectedEdit(t *testing.T) {\n\ts := createEditDeleteTestRunner(t)\n\ts.testDeleteRejectedEdit()\n}\n\nfunc TestDeleteEditWithComments(t *testing.T) {\n\ts := createEditDeleteTestRunner(t)\n\ts.testDeleteEditWithComments()\n}\n\nfunc TestDeleteEditWithVotes(t *testing.T) {\n\ts := createEditDeleteTestRunner(t)\n\ts.testDeleteEditWithVotes()\n}\n"
  },
  {
    "path": "internal/api/edit_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype editTestRunner struct {\n\ttestRunner\n}\n\nfunc createEditTestRunner(t *testing.T) *editTestRunner {\n\treturn &editTestRunner{\n\t\ttestRunner: *asAdmin(t),\n\t}\n}\n\nfunc (s *editTestRunner) testAdminCancelEdit() {\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\teditInput := models.CancelEditInput{\n\t\tID: createdEdit.ID,\n\t}\n\n\tpt := createEditTestRunner(s.t)\n\tcancelEdit, err := s.resolver.Mutation().CancelEdit(pt.ctx, editInput)\n\tassert.NoError(s.t, err, \"Admin failed to cancel edit: %s\")\n\ts.verifyAdminCancelEdit(cancelEdit)\n}\n\nfunc (s *editTestRunner) verifyAdminCancelEdit(edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumCreate.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateRejected.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumTag.String(), edit)\n\ts.verifyEditApplication(false, edit)\n}\n\nfunc (s *editTestRunner) testOwnerCancelEdit() {\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\teditInput := models.CancelEditInput{\n\t\tID: createdEdit.ID,\n\t}\n\tcancelEdit, err := s.resolver.Mutation().CancelEdit(s.ctx, editInput)\n\tassert.NoError(s.t, err)\n\ts.verifyOwnerCancelEdit(cancelEdit)\n}\n\nfunc (s *editTestRunner) verifyOwnerCancelEdit(edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumCreate.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumCanceled.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumTag.String(), edit)\n\ts.verifyEditApplication(false, edit)\n}\n\nfunc (s *editTestRunner) testEditComment() {\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\ttext := \"some comment text\"\n\teditInput := models.EditCommentInput{\n\t\tID:      createdEdit.ID,\n\t\tComment: text,\n\t}\n\teditComment, err := s.resolver.Mutation().EditComment(s.ctx, editInput)\n\tassert.NoError(s.t, err)\n\ts.verifyEditComment(editComment, text)\n}\n\nfunc (s *editTestRunner) verifyEditComment(edit *models.Edit, comment string) {\n\tcomments, _ := s.resolver.Edit().Comments(s.ctx, edit)\n\tassert.True(s.t, len(comments) == 1)\n\tassert.Equal(s.t, comments[0].Text, comment)\n}\n\nfunc (s *editTestRunner) testVotePermissionsPromotion() {\n\tcreatedUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumEdit})\n\tassert.NoError(s.t, err)\n\n\tfor i := 1; i <= 10; i++ {\n\t\ts.ctx = context.WithValue(s.ctx, auth.ContextUser, createdUser)\n\t\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\t\tassert.NoError(s.t, err)\n\t\ts.ctx = context.WithValue(s.ctx, auth.ContextRoles, userDB.adminRoles)\n\t\t_, err = s.applyEdit(createdEdit.ID)\n\t\tassert.NoError(s.t, err)\n\t}\n\ts.ctx = context.WithValue(s.ctx, auth.ContextUser, createdUser)\n\n\t// Wait for async promotion to complete\n\ttime.Sleep(50 * time.Millisecond)\n\n\tuserID := createdUser.ID\n\tuser, err := s.resolver.Query().FindUser(s.ctx, &userID, nil)\n\tassert.NoError(s.t, err)\n\n\ts.verifyUserRolePromotion(user)\n}\n\nfunc (s *editTestRunner) verifyUserRolePromotion(user *models.User) {\n\troles, _ := s.resolver.User().Roles(s.ctx, user)\n\n\thasVotePermission := false\n\tfor _, role := range roles {\n\t\tif role == models.RoleEnumVote {\n\t\t\thasVotePermission = true\n\t\t}\n\t}\n\tassert.Equal(s.t, hasVotePermission, true)\n}\n\nfunc (s *editTestRunner) testPositiveEditVoteApplication() {\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\tfor i := 1; i <= 3; i++ {\n\t\tcreatedUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumVote})\n\t\tassert.NoError(s.t, err)\n\t\ts.ctx = context.WithValue(s.ctx, auth.ContextUser, createdUser)\n\t\tvotedEdit, err := s.resolver.Mutation().EditVote(s.ctx, models.EditVoteInput{\n\t\t\tID:   createdEdit.ID,\n\t\t\tVote: models.VoteTypeEnumAccept,\n\t\t})\n\t\tassert.NoError(s.t, err)\n\n\t\t// Verify vote_count is updated correctly after each vote\n\t\tif i < 3 {\n\t\t\t// First two votes should not trigger auto-apply\n\t\t\tassert.Equal(s.t, i, votedEdit.VoteCount, \"Vote count should be %d after %d accept votes\", i, i)\n\t\t}\n\t}\n\n\tupdatedEdit, err := s.resolver.Query().FindEdit(s.ctx, createdEdit.ID)\n\tassert.NoError(s.t, err)\n\n\ts.verifyEditApplied(updatedEdit)\n}\n\nfunc (s *editTestRunner) verifyEditApplied(edit *models.Edit) {\n\ts.verifyEditStatus(models.VoteStatusEnumAccepted.String(), edit)\n}\n\nfunc (s *editTestRunner) verifyEditRejected(edit *models.Edit) {\n\ts.verifyEditStatus(models.VoteStatusEnumRejected.String(), edit)\n}\n\nfunc (s *editTestRunner) testNegativeEditVoteApplication() {\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\tfor i := 1; i <= 3; i++ {\n\t\tcreatedUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumVote})\n\t\tassert.NoError(s.t, err)\n\t\ts.ctx = context.WithValue(s.ctx, auth.ContextUser, createdUser)\n\t\tvotedEdit, err := s.resolver.Mutation().EditVote(s.ctx, models.EditVoteInput{\n\t\t\tID:   createdEdit.ID,\n\t\t\tVote: models.VoteTypeEnumReject,\n\t\t})\n\t\tassert.NoError(s.t, err)\n\n\t\t// Verify vote_count is updated correctly after each vote\n\t\tif i < 3 {\n\t\t\t// First two votes should not trigger auto-reject\n\t\t\tassert.Equal(s.t, -i, votedEdit.VoteCount, \"Vote count should be -%d after %d reject votes\", i, i)\n\t\t}\n\t}\n\n\tupdatedEdit, err := s.resolver.Query().FindEdit(s.ctx, createdEdit.ID)\n\tassert.NoError(s.t, err)\n\n\ts.verifyEditRejected(updatedEdit)\n}\n\nfunc (s *editTestRunner) testEditVoteNotApplying() {\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\tfor i := 1; i <= 3; i++ {\n\t\tcreatedUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumVote})\n\t\tassert.NoError(s.t, err)\n\t\ts.ctx = context.WithValue(s.ctx, auth.ContextUser, createdUser)\n\n\t\tvote := models.VoteTypeEnumAccept\n\t\tif i == 3 {\n\t\t\tvote = models.VoteTypeEnumReject\n\t\t}\n\t\tvotedEdit, err := s.resolver.Mutation().EditVote(s.ctx, models.EditVoteInput{\n\t\t\tID:   createdEdit.ID,\n\t\t\tVote: vote,\n\t\t})\n\t\tassert.NoError(s.t, err)\n\n\t\t// Verify vote_count is updated correctly after each vote\n\t\texpectedCount := i\n\t\tif i == 3 {\n\t\t\t// After 2 accepts and 1 reject: 2 - 1 = 1\n\t\t\texpectedCount = 1\n\t\t}\n\t\tassert.Equal(s.t, expectedCount, votedEdit.VoteCount, \"Vote count should be %d after vote %d\", expectedCount, i)\n\t}\n\n\tupdatedEdit, err := s.resolver.Query().FindEdit(s.ctx, createdEdit.ID)\n\tassert.NoError(s.t, err)\n\n\ts.verifyEditPending(updatedEdit)\n\t// Final verification of vote_count\n\tassert.Equal(s.t, 1, updatedEdit.VoteCount, \"Final vote count should be 1 (2 accepts - 1 reject)\")\n}\n\nfunc (s *editTestRunner) verifyEditPending(edit *models.Edit) {\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n}\n\nfunc (s *editTestRunner) testDestructiveEditsNotAutoApplied() {\n\tcreatedTag, err := s.createTestTag(nil)\n\tassert.NoError(s.t, err)\n\n\tid := createdTag.UUID()\n\tinput := models.EditInput{\n\t\tID:        &id,\n\t\tOperation: models.OperationEnumDestroy,\n\t}\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumDestroy, nil, &input)\n\tassert.NoError(s.t, err)\n\n\tfor i := 1; i <= 3; i++ {\n\t\tcreatedUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumVote})\n\t\tassert.NoError(s.t, err)\n\t\ts.ctx = context.WithValue(s.ctx, auth.ContextUser, createdUser)\n\t\ts.resolver.Mutation().EditVote(s.ctx, models.EditVoteInput{\n\t\t\tID:   createdEdit.ID,\n\t\t\tVote: models.VoteTypeEnumAccept,\n\t\t})\n\t}\n\n\tupdatedEdit, err := s.resolver.Query().FindEdit(s.ctx, createdEdit.ID)\n\tassert.NoError(s.t, err)\n\n\ts.verifyEditPending(updatedEdit)\n}\n\nfunc (s *editTestRunner) testVoteOwnedEditsDisallowed() {\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t_, err = s.resolver.Mutation().EditVote(s.ctx, models.EditVoteInput{\n\t\tID:   createdEdit.ID,\n\t\tVote: models.VoteTypeEnumAccept,\n\t})\n\tassert.ErrorIs(s.t, err, auth.ErrUnauthorized)\n}\n\nfunc TestAdminCancelEdit(t *testing.T) {\n\tpt := &editTestRunner{\n\t\ttestRunner: *asEdit(t),\n\t}\n\tpt.testAdminCancelEdit()\n}\n\nfunc TestOwnerCancelEdit(t *testing.T) {\n\tpt := &editTestRunner{\n\t\ttestRunner: *asEdit(t),\n\t}\n\tpt.testOwnerCancelEdit()\n}\n\nfunc TestEditComment(t *testing.T) {\n\tpt := createEditTestRunner(t)\n\tpt.testEditComment()\n}\n\nfunc TestVotePermissionsPromotion(t *testing.T) {\n\tpt := createEditTestRunner(t)\n\tpt.testVotePermissionsPromotion()\n}\n\nfunc TestPositiveEditVoteApplication(t *testing.T) {\n\tpt := createEditTestRunner(t)\n\tpt.testPositiveEditVoteApplication()\n}\n\nfunc TestNegativeEditVoteApplication(t *testing.T) {\n\tpt := createEditTestRunner(t)\n\tpt.testNegativeEditVoteApplication()\n}\n\nfunc TestEditVoteNotApplying(t *testing.T) {\n\tpt := createEditTestRunner(t)\n\tpt.testEditVoteNotApplying()\n}\n\nfunc TestDestructiveEditsNotAutoApplied(t *testing.T) {\n\tpt := createEditTestRunner(t)\n\tpt.testDestructiveEditsNotAutoApplied()\n}\n\nfunc TestVoteOwnedEditsDisallowed(t *testing.T) {\n\tpt := createEditTestRunner(t)\n\tpt.testVoteOwnedEditsDisallowed()\n}\n\nfunc (s *editTestRunner) testQueryEdits() {\n\t// Create test data: different types of edits with different statuses\n\n\t// Create pending performer edit\n\t_, err := s.createTestPerformerEdit(models.OperationEnumCreate, nil, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Create pending scene edit\n\t_, err = s.createTestSceneEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Create pending studio edit\n\tstudioEdit1, err := s.createTestStudioEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Create pending tag edit\n\ttagEdit1, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Create a modify edit for an existing performer\n\texistingPerformer, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\tperformerID := existingPerformer.UUID()\n\tperformerModifyEdit, err := s.createTestPerformerEdit(models.OperationEnumModify, nil, &models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &performerID,\n\t}, nil)\n\tassert.NoError(s.t, err)\n\n\t// Apply one edit to have an applied edit\n\tappliedEdit, err := s.applyEdit(tagEdit1.ID)\n\tassert.NoError(s.t, err)\n\n\t// Cancel one edit to have a cancelled edit\n\t_, err = s.resolver.Mutation().CancelEdit(s.ctx, models.CancelEditInput{\n\t\tID: studioEdit1.ID,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Test 1: Query all pending edits\n\tresult, err := s.resolver.Query().QueryEdits(s.ctx, models.EditQueryInput{\n\t\tStatus:    &[]models.VoteStatusEnum{models.VoteStatusEnumPending}[0],\n\t\tPage:      1,\n\t\tPerPage:   25,\n\t\tDirection: models.SortDirectionEnumDesc,\n\t\tSort:      models.EditSortEnumCreatedAt,\n\t})\n\tassert.NoError(s.t, err)\n\n\teditsResult, err := s.resolver.QueryEditsResultType().Edits(s.ctx, result)\n\tassert.NoError(s.t, err)\n\tcount, err := s.resolver.QueryEditsResultType().Count(s.ctx, result)\n\tassert.NoError(s.t, err)\n\n\tassert.True(s.t, count >= 3, \"Should have at least 3 pending edits\")\n\tassert.True(s.t, len(editsResult) >= 3, \"Should return at least 3 pending edits\")\n\n\t// Verify all returned edits are pending\n\tfor _, edit := range editsResult {\n\t\tassert.Equal(s.t, edit.Status, models.VoteStatusEnumPending.String(), \"All returned edits should be pending\")\n\t}\n\n\t// Test 2: Query by target type (PERFORMER)\n\tresult, err = s.resolver.Query().QueryEdits(s.ctx, models.EditQueryInput{\n\t\tTargetType: &[]models.TargetTypeEnum{models.TargetTypeEnumPerformer}[0],\n\t\tPage:       1,\n\t\tPerPage:    25,\n\t\tDirection:  models.SortDirectionEnumDesc,\n\t\tSort:       models.EditSortEnumCreatedAt,\n\t})\n\tassert.NoError(s.t, err)\n\n\teditsResult, err = s.resolver.QueryEditsResultType().Edits(s.ctx, result)\n\tassert.NoError(s.t, err)\n\n\tassert.True(s.t, len(editsResult) >= 2, \"Should have at least 2 performer edits\")\n\tfor _, edit := range editsResult {\n\t\tassert.Equal(s.t, edit.TargetType, models.TargetTypeEnumPerformer.String(), \"All returned edits should be performer type\")\n\t}\n\n\t// Test 3: Query by operation (CREATE)\n\tresult, err = s.resolver.Query().QueryEdits(s.ctx, models.EditQueryInput{\n\t\tOperation: &[]models.OperationEnum{models.OperationEnumCreate}[0],\n\t\tPage:      1,\n\t\tPerPage:   25,\n\t\tDirection: models.SortDirectionEnumDesc,\n\t\tSort:      models.EditSortEnumCreatedAt,\n\t})\n\tassert.NoError(s.t, err)\n\n\teditsResult, err = s.resolver.QueryEditsResultType().Edits(s.ctx, result)\n\tassert.NoError(s.t, err)\n\n\tassert.True(s.t, len(editsResult) >= 4, \"Should have at least 4 create edits\")\n\tfor _, edit := range editsResult {\n\t\tassert.Equal(s.t, edit.Operation, models.OperationEnumCreate.String(), \"All returned edits should be CREATE operation\")\n\t}\n\n\t// Test 4: Query by operation (MODIFY)\n\tresult, err = s.resolver.Query().QueryEdits(s.ctx, models.EditQueryInput{\n\t\tOperation: &[]models.OperationEnum{models.OperationEnumModify}[0],\n\t\tPage:      1,\n\t\tPerPage:   25,\n\t\tDirection: models.SortDirectionEnumDesc,\n\t\tSort:      models.EditSortEnumCreatedAt,\n\t})\n\tassert.NoError(s.t, err)\n\n\teditsResult, err = s.resolver.QueryEditsResultType().Edits(s.ctx, result)\n\tassert.NoError(s.t, err)\n\n\tassert.True(s.t, len(editsResult) >= 1, \"Should have at least 1 modify edit\")\n\tfor _, edit := range editsResult {\n\t\tassert.Equal(s.t, edit.Operation, models.OperationEnumModify.String(), \"All returned edits should be MODIFY operation\")\n\t}\n\n\t// Test 5: Query by applied status (applied=true)\n\tresult, err = s.resolver.Query().QueryEdits(s.ctx, models.EditQueryInput{\n\t\tApplied:   &[]bool{true}[0],\n\t\tPage:      1,\n\t\tPerPage:   25,\n\t\tDirection: models.SortDirectionEnumDesc,\n\t\tSort:      models.EditSortEnumCreatedAt,\n\t})\n\tassert.NoError(s.t, err)\n\n\teditsResult, err = s.resolver.QueryEditsResultType().Edits(s.ctx, result)\n\tassert.NoError(s.t, err)\n\n\tassert.True(s.t, len(editsResult) >= 1, \"Should have at least 1 applied edit\")\n\n\t// Verify the applied edit is in the results\n\tfoundApplied := false\n\tfor _, edit := range editsResult {\n\t\tassert.Equal(s.t, edit.Applied, true, \"All returned edits should be applied\")\n\t\tif edit.ID == appliedEdit.ID {\n\t\t\tfoundApplied = true\n\t\t}\n\t}\n\tassert.True(s.t, foundApplied, \"Should find the applied edit we created\")\n\n\t// Test 6: Query by applied status (applied=false)\n\tresult, err = s.resolver.Query().QueryEdits(s.ctx, models.EditQueryInput{\n\t\tApplied:   &[]bool{false}[0],\n\t\tPage:      1,\n\t\tPerPage:   25,\n\t\tDirection: models.SortDirectionEnumDesc,\n\t\tSort:      models.EditSortEnumCreatedAt,\n\t})\n\tassert.NoError(s.t, err)\n\n\teditsResult, err = s.resolver.QueryEditsResultType().Edits(s.ctx, result)\n\tassert.NoError(s.t, err)\n\n\tassert.True(s.t, len(editsResult) >= 3, \"Should have at least 3 unapplied edits\")\n\tfor _, edit := range editsResult {\n\t\tassert.Equal(s.t, edit.Applied, false, \"All returned edits should be unapplied\")\n\t}\n\n\t// Test 7: Query by specific target ID\n\tresult, err = s.resolver.Query().QueryEdits(s.ctx, models.EditQueryInput{\n\t\tTargetType: &[]models.TargetTypeEnum{models.TargetTypeEnumPerformer}[0],\n\t\tTargetID:   &performerID,\n\t\tPage:       1,\n\t\tPerPage:    25,\n\t\tDirection:  models.SortDirectionEnumDesc,\n\t\tSort:       models.EditSortEnumCreatedAt,\n\t})\n\tassert.NoError(s.t, err)\n\n\teditsResult, err = s.resolver.QueryEditsResultType().Edits(s.ctx, result)\n\tassert.NoError(s.t, err)\n\n\tassert.True(s.t, len(editsResult) >= 1, \"Should have at least 1 edit for the target\")\n\tfoundModifyEdit := false\n\tfor _, edit := range editsResult {\n\t\tif edit.ID == performerModifyEdit.ID {\n\t\t\tfoundModifyEdit = true\n\t\t}\n\t}\n\tassert.True(s.t, foundModifyEdit, \"Should find the modify edit for the specific performer\")\n\n\t// Test 8: Query by user ID\n\tresult, err = s.resolver.Query().QueryEdits(s.ctx, models.EditQueryInput{\n\t\tUserID:    &userDB.admin.ID,\n\t\tPage:      1,\n\t\tPerPage:   25,\n\t\tDirection: models.SortDirectionEnumDesc,\n\t\tSort:      models.EditSortEnumCreatedAt,\n\t})\n\tassert.NoError(s.t, err)\n\n\teditsResult, err = s.resolver.QueryEditsResultType().Edits(s.ctx, result)\n\tassert.NoError(s.t, err)\n\n\tassert.True(s.t, len(editsResult) >= 4, \"Should have at least 4 edits by the current user\")\n\tfor _, edit := range editsResult {\n\t\tuser, _ := s.resolver.Edit().User(s.ctx, &edit)\n\t\tassert.Equal(s.t, user.ID, userDB.admin.ID, \"All returned edits should be by the specified user\")\n\t}\n\n\t// Test 9: Test pagination\n\tresult, err = s.resolver.Query().QueryEdits(s.ctx, models.EditQueryInput{\n\t\tPage:      1,\n\t\tPerPage:   2,\n\t\tDirection: models.SortDirectionEnumDesc,\n\t\tSort:      models.EditSortEnumCreatedAt,\n\t})\n\tassert.NoError(s.t, err)\n\n\teditsResult, err = s.resolver.QueryEditsResultType().Edits(s.ctx, result)\n\tassert.NoError(s.t, err)\n\tcount, err = s.resolver.QueryEditsResultType().Count(s.ctx, result)\n\tassert.NoError(s.t, err)\n\n\tassert.Equal(s.t, len(editsResult), 2, \"Should return exactly 2 edits with per_page=2\")\n\tassert.True(s.t, count >= 4, \"Total count should be at least 4\")\n\n\t// Test 10: Test sorting by CREATED_AT ascending\n\tresult, err = s.resolver.Query().QueryEdits(s.ctx, models.EditQueryInput{\n\t\tStatus:    &[]models.VoteStatusEnum{models.VoteStatusEnumPending}[0],\n\t\tPage:      1,\n\t\tPerPage:   10,\n\t\tDirection: models.SortDirectionEnumAsc,\n\t\tSort:      models.EditSortEnumCreatedAt,\n\t})\n\tassert.NoError(s.t, err)\n\n\teditsResult, err = s.resolver.QueryEditsResultType().Edits(s.ctx, result)\n\tassert.NoError(s.t, err)\n\n\tif len(editsResult) >= 2 {\n\t\t// Verify ascending order\n\t\tfor i := 0; i < len(editsResult)-1; i++ {\n\t\t\tassert.True(s.t, !editsResult[i].CreatedAt.After(editsResult[i+1].CreatedAt),\n\t\t\t\t\"Edits should be sorted by created_at in ascending order\")\n\t\t}\n\t}\n\n\t// Test 11: Query cancelled edits\n\tresult, err = s.resolver.Query().QueryEdits(s.ctx, models.EditQueryInput{\n\t\tStatus:    &[]models.VoteStatusEnum{models.VoteStatusEnumCanceled}[0],\n\t\tPage:      1,\n\t\tPerPage:   25,\n\t\tDirection: models.SortDirectionEnumDesc,\n\t\tSort:      models.EditSortEnumCreatedAt,\n\t})\n\tassert.NoError(s.t, err)\n\n\teditsResult, err = s.resolver.QueryEditsResultType().Edits(s.ctx, result)\n\tassert.NoError(s.t, err)\n\n\tassert.True(s.t, len(editsResult) >= 1, \"Should have at least 1 cancelled edit\")\n\tfor _, edit := range editsResult {\n\t\tassert.Equal(s.t, edit.Status, models.VoteStatusEnumCanceled.String(), \"All returned edits should be cancelled\")\n\t}\n}\n\nfunc TestQueryEdits(t *testing.T) {\n\tpt := createEditTestRunner(t)\n\tpt.testQueryEdits()\n}\n\nfunc (s *editTestRunner) testBotFlag() {\n\t// Test creating edit without bot flag (should default to false)\n\tnormalEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\tassert.False(s.t, normalEdit.Bot, \"Edit without bot flag should have bot=false\")\n\n\t// Test creating edit with bot flag set to true\n\tbotTrue := true\n\teditWithBotTrue, err := s.createTestTagEdit(models.OperationEnumCreate, nil, &models.EditInput{\n\t\tOperation: models.OperationEnumCreate,\n\t\tBot:       &botTrue,\n\t})\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, editWithBotTrue.Bot, \"Edit with bot=true should have bot=true\")\n\n\t// Query for bot edits and verify we get exactly one\n\tresultBot, err := s.resolver.Query().QueryEdits(s.ctx, models.EditQueryInput{\n\t\tIsBot:     &botTrue,\n\t\tPage:      1,\n\t\tPerPage:   25,\n\t\tDirection: models.SortDirectionEnumDesc,\n\t\tSort:      models.EditSortEnumCreatedAt,\n\t})\n\tassert.NoError(s.t, err)\n\n\teditsResultBot, err := s.resolver.QueryEditsResultType().Edits(s.ctx, resultBot)\n\tassert.NoError(s.t, err)\n\tcountBot, err := s.resolver.QueryEditsResultType().Count(s.ctx, resultBot)\n\tassert.NoError(s.t, err)\n\n\tassert.Equal(s.t, 1, countBot, \"Should have exactly 1 bot edit\")\n\tassert.Equal(s.t, 1, len(editsResultBot), \"Should return exactly 1 bot edit\")\n\tassert.Equal(s.t, editWithBotTrue.ID, editsResultBot[0].ID, \"Returned bot edit should match the one we created\")\n\tassert.True(s.t, editsResultBot[0].Bot, \"Returned edit should have bot=true\")\n}\n\nfunc TestBotFlag(t *testing.T) {\n\tpt := createEditTestRunner(t)\n\tpt.testBotFlag()\n}\n"
  },
  {
    "path": "internal/api/field_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"database/sql\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\ntype fieldComparator struct {\n\tr *testRunner\n}\n\nfunc (c *fieldComparator) strPtrStrPtr(expected *string, actual *string, field string) {\n\tc.r.t.Helper()\n\tif expected == actual {\n\t\treturn\n\t}\n\n\tmatched := true\n\tif expected == nil || actual == nil {\n\t\tmatched = false\n\t} else {\n\t\tmatched = *expected == *actual\n\t}\n\n\tif !matched {\n\t\tc.r.fieldMismatch(expected, actual, field)\n\t}\n}\n\nfunc (c *fieldComparator) strPtrNullStr(expected *string, actual sql.NullString, field string) {\n\tc.r.t.Helper()\n\tif expected == nil && !actual.Valid {\n\t\treturn\n\t}\n\n\tmatched := true\n\tif expected == nil || !actual.Valid {\n\t\tmatched = false\n\t} else {\n\t\tmatched = *expected == actual.String\n\t}\n\n\tif !matched {\n\t\tc.r.fieldMismatch(expected, actual.String, field)\n\t}\n}\n\nfunc (c *fieldComparator) strPtrNullUUID(expected *string, actual uuid.NullUUID, field string) {\n\tc.r.t.Helper()\n\tif expected == nil && !actual.Valid {\n\t\treturn\n\t}\n\n\tmatched := true\n\tif expected == nil || !actual.Valid {\n\t\tmatched = false\n\t} else {\n\t\tmatched = *expected == actual.UUID.String()\n\t}\n\n\tif !matched {\n\t\tc.r.fieldMismatch(expected, actual.UUID.String(), field)\n\t}\n}\n\nfunc (c *fieldComparator) intPtrIntPtr(expected *int, actual *int, field string) {\n\tc.r.t.Helper()\n\tif expected == actual {\n\t\treturn\n\t}\n\n\tmatched := true\n\tif expected == nil || actual == nil {\n\t\tmatched = false\n\t} else {\n\t\tmatched = *expected == *actual\n\t}\n\n\tif !matched {\n\t\tc.r.fieldMismatch(expected, actual, field)\n\t}\n}\n\nfunc (c *fieldComparator) uuidPtrUUIDPtr(expected *uuid.UUID, actual *uuid.UUID, field string) {\n\tc.r.t.Helper()\n\tif expected == actual {\n\t\treturn\n\t}\n\n\tmatched := true\n\tif expected == nil || actual == nil {\n\t\tmatched = false\n\t} else {\n\t\tmatched = *expected == *actual\n\t}\n\n\tif !matched {\n\t\tc.r.fieldMismatch(expected, actual, field)\n\t}\n}\n\nfunc (c *fieldComparator) uuidPtrNullUUID(expected *uuid.UUID, actual uuid.NullUUID, field string) {\n\tc.r.t.Helper()\n\tif expected == nil && !actual.Valid {\n\t\treturn\n\t}\n\n\tmatched := true\n\tif expected == nil || !actual.Valid {\n\t\tmatched = false\n\t} else {\n\t\tmatched = *expected == actual.UUID\n\t}\n\n\tif !matched {\n\t\tc.r.fieldMismatch(expected, actual.UUID, field)\n\t}\n}\n"
  },
  {
    "path": "internal/api/fingerprint_filter.go",
    "content": "package api\n\nimport \"github.com/stashapp/stash-box/internal/models\"\n\n// filterMD5FingerprintInputs removes MD5 fingerprints from a slice.\nfunc filterMD5FingerprintInputs(fps []models.FingerprintInput) []models.FingerprintInput {\n\tresult := fps[:0]\n\tfor _, fp := range fps {\n\t\tif fp.Algorithm != models.FingerprintAlgorithmMd5 {\n\t\t\tresult = append(result, fp)\n\t\t}\n\t}\n\treturn result\n}\n\n// filterMD5FingerprintQueryInputs removes MD5 fingerprints from nested slices.\nfunc filterMD5FingerprintQueryInputs(fps [][]models.FingerprintQueryInput) [][]models.FingerprintQueryInput {\n\tfor i, group := range fps {\n\t\tfiltered := group[:0]\n\t\tfor _, fp := range group {\n\t\t\tif fp.Algorithm != models.FingerprintAlgorithmMd5 {\n\t\t\t\tfiltered = append(filtered, fp)\n\t\t\t}\n\t\t}\n\t\tfps[i] = filtered\n\t}\n\treturn fps\n}\n\n// filterMD5FingerprintEditInputs removes MD5 fingerprints from a slice.\nfunc filterMD5FingerprintEditInputs(fps []models.FingerprintEditInput) []models.FingerprintEditInput {\n\tresult := fps[:0]\n\tfor _, fp := range fps {\n\t\tif fp.Algorithm != models.FingerprintAlgorithmMd5 {\n\t\t\tresult = append(result, fp)\n\t\t}\n\t}\n\treturn result\n}\n"
  },
  {
    "path": "internal/api/graphql_client_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/99designs/gqlgen/client\"\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype idObject struct {\n\tID string `json:\"id\"`\n}\n\ntype performerAppearance struct {\n\tPerformer *idObject `json:\"performer\"`\n\t// Performing as alias\n\tAs *string `json:\"as\"`\n}\n\ntype fingerprint struct {\n\tHash        string                      `json:\"hash\"`\n\tAlgorithm   models.FingerprintAlgorithm `json:\"algorithm\"`\n\tDuration    int                         `json:\"duration\"`\n\tSubmissions int                         `json:\"submissions\"`\n\tCreated     string                      `json:\"created\"`\n\tUpdated     string                      `json:\"updated\"`\n}\n\n// FingerprintHash returns the Hash as a models.FingerprintHash\nfunc (f fingerprint) FingerprintHash() models.FingerprintHash {\n\th, _ := models.UnmarshalFingerprintHash(f.Hash)\n\treturn h\n}\n\ntype siteURL struct {\n\tSite *idObject `json:\"site\"`\n\tURL  string    `json:\"url\"`\n}\n\ntype sceneOutput struct {\n\tID             string                `json:\"id\"`\n\tTitle          *string               `json:\"title\"`\n\tDetails        *string               `json:\"details\"`\n\tDate           *string               `json:\"release_date\"`\n\tProductionDate *string               `json:\"production_date\"`\n\tUrls           []siteURL             `json:\"urls\"`\n\tStudio         *idObject             `json:\"studio\"`\n\tTags           []idObject            `json:\"tags\"`\n\tImages         []idObject            `json:\"images\"`\n\tPerformers     []performerAppearance `json:\"performers\"`\n\tFingerprints   []fingerprint         `json:\"fingerprints\"`\n\tDuration       *int                  `json:\"duration\"`\n\tDirector       *string               `json:\"director\"`\n\tCode           *string               `json:\"code\"`\n\tDeleted        bool                  `json:\"deleted\"`\n}\n\nfunc (s sceneOutput) UUID() uuid.UUID {\n\treturn uuid.FromStringOrNil(s.ID)\n}\n\ntype queryScenesResultType struct {\n\tCount  int           `json:\"count\"`\n\tScenes []sceneOutput `json:\"scenes\"`\n}\n\ntype measurements struct {\n\tCupSize  *string `json:\"cup_size\"`\n\tBandSize *int    `json:\"band_size\"`\n\tWaist    *int    `json:\"waist\"`\n\tHip      *int    `json:\"hip\"`\n}\n\ntype performerOutput struct {\n\tID              string        `json:\"id\"`\n\tName            string        `json:\"name\"`\n\tDisambiguation  *string       `json:\"disambiguation\"`\n\tGender          *string       `json:\"gender\"`\n\tBirthdate       *string       `json:\"birth_date\"`\n\tDeathdate       *string       `json:\"death_date\"`\n\tEthnicity       *string       `json:\"ethnicity\"`\n\tCountry         *string       `json:\"country\"`\n\tEyeColor        *string       `json:\"eye_color\"`\n\tHairColor       *string       `json:\"hair_color\"`\n\tHeight          *int          `json:\"height\"`\n\tMeasurements    *measurements `json:\"measurements\"`\n\tBreastType      *string       `json:\"breast_type\"`\n\tCareerStartYear *int          `json:\"career_start_year\"`\n\tCareerEndYear   *int          `json:\"career_end_year\"`\n}\n\nfunc (p performerOutput) UUID() uuid.UUID {\n\treturn uuid.FromStringOrNil(p.ID)\n}\n\ntype studioOutput struct {\n\tID           string     `json:\"id\"`\n\tName         string     `json:\"name\"`\n\tUrls         []siteURL  `json:\"urls\"`\n\tParent       *idObject  `json:\"parent\"`\n\tChildStudios []idObject `json:\"child_studios\"`\n\tImages       []idObject `json:\"images\"`\n\tDeleted      bool       `json:\"deleted\"`\n}\n\nfunc (s studioOutput) UUID() uuid.UUID {\n\treturn uuid.FromStringOrNil(s.ID)\n}\n\ntype tagOutput struct {\n\tID          string     `json:\"id\"`\n\tName        string     `json:\"name\"`\n\tDescription *string    `json:\"description\"`\n\tAliases     []string   `json:\"aliases\"`\n\tDeleted     bool       `json:\"deleted\"`\n\tEdits       []idObject `json:\"edits\"`\n\tCategory    *idObject  `json:\"category\"`\n}\n\nfunc (t tagOutput) UUID() uuid.UUID {\n\treturn uuid.FromStringOrNil(t.ID)\n}\n\ntype siteOutput struct {\n\tID          string   `json:\"id\"`\n\tName        string   `json:\"name\"`\n\tDescription *string  `json:\"description\"`\n\tURL         *string  `json:\"url\"`\n\tRegex       *string  `json:\"regex\"`\n\tValidTypes  []string `json:\"valid_types\"`\n}\n\nfunc (s siteOutput) UUID() uuid.UUID {\n\treturn uuid.FromStringOrNil(s.ID)\n}\n\ntype querySitesResultType struct {\n\tSites []siteOutput `json:\"sites\"`\n}\n\ntype queryPerformersResultType struct {\n\tCount      int               `json:\"count\"`\n\tPerformers []performerOutput `json:\"performers\"`\n}\n\ntype queryStudiosResultType struct {\n\tCount   int            `json:\"count\"`\n\tStudios []studioOutput `json:\"studios\"`\n}\n\ntype queryTagsResultType struct {\n\tCount int         `json:\"count\"`\n\tTags  []tagOutput `json:\"tags\"`\n}\n\ntype tagCategoryOutput struct {\n\tID          string  `json:\"id\"`\n\tName        string  `json:\"name\"`\n\tDescription *string `json:\"description\"`\n}\n\nfunc (tc tagCategoryOutput) UUID() uuid.UUID {\n\treturn uuid.FromStringOrNil(tc.ID)\n}\n\ntype queryTagCategoriesResultType struct {\n\tCount         int                 `json:\"count\"`\n\tTagCategories []tagCategoryOutput `json:\"tag_categories\"`\n}\n\ntype userOutput struct {\n\tID   string `json:\"id\"`\n\tName string `json:\"name\"`\n}\n\nfunc (u userOutput) UUID() uuid.UUID {\n\treturn uuid.FromStringOrNil(u.ID)\n}\n\ntype draftSubmissionStatusOutput struct {\n\tID *string `json:\"id\"`\n}\n\nfunc (d draftSubmissionStatusOutput) UUID() *uuid.UUID {\n\tif d.ID == nil {\n\t\treturn nil\n\t}\n\tid := uuid.FromStringOrNil(*d.ID)\n\treturn &id\n}\n\ntype draftEntityOutput struct {\n\tName string  `json:\"name\"`\n\tID   *string `json:\"id\"`\n}\n\ntype draftFingerprintOutput struct {\n\tHash      string `json:\"hash\"`\n\tAlgorithm string `json:\"algorithm\"`\n\tDuration  int    `json:\"duration\"`\n}\n\ntype sceneDraftOutput struct {\n\tID           *string                  `json:\"id\"`\n\tTitle        *string                  `json:\"title\"`\n\tCode         *string                  `json:\"code\"`\n\tDetails      *string                  `json:\"details\"`\n\tDirector     *string                  `json:\"director\"`\n\tURLs         []string                 `json:\"urls\"`\n\tDate         *string                  `json:\"date\"`\n\tStudio       *draftEntityOutput       `json:\"studio\"`\n\tPerformers   []draftEntityOutput      `json:\"performers\"`\n\tTags         []draftEntityOutput      `json:\"tags\"`\n\tFingerprints []draftFingerprintOutput `json:\"fingerprints\"`\n}\n\ntype performerDraftOutput struct {\n\tID              *string  `json:\"id\"`\n\tName            string   `json:\"name\"`\n\tDisambiguation  *string  `json:\"disambiguation\"`\n\tAliases         *string  `json:\"aliases\"`\n\tGender          *string  `json:\"gender\"`\n\tBirthdate       *string  `json:\"birthdate\"`\n\tDeathdate       *string  `json:\"deathdate\"`\n\tUrls            []string `json:\"urls\"`\n\tEthnicity       *string  `json:\"ethnicity\"`\n\tCountry         *string  `json:\"country\"`\n\tEyeColor        *string  `json:\"eye_color\"`\n\tHairColor       *string  `json:\"hair_color\"`\n\tHeight          *string  `json:\"height\"`\n\tMeasurements    *string  `json:\"measurements\"`\n\tBreastType      *string  `json:\"breast_type\"`\n\tTattoos         *string  `json:\"tattoos\"`\n\tPiercings       *string  `json:\"piercings\"`\n\tCareerStartYear *int     `json:\"career_start_year\"`\n\tCareerEndYear   *int     `json:\"career_end_year\"`\n}\n\ntype draftOutput struct {\n\tID      string      `json:\"id\"`\n\tCreated string      `json:\"created\"`\n\tExpires string      `json:\"expires\"`\n\tData    interface{} `json:\"data\"`\n}\n\nfunc (d draftOutput) UUID() uuid.UUID {\n\treturn uuid.FromStringOrNil(d.ID)\n}\n\ntype notificationOutput struct {\n\tCreated string `json:\"created\"`\n\tRead    bool   `json:\"read\"`\n}\n\ntype queryNotificationsResultType struct {\n\tCount         int                  `json:\"count\"`\n\tNotifications []notificationOutput `json:\"notifications\"`\n}\n\nfunc makeFragment(t reflect.Type) string {\n\tret := strings.Builder{}\n\tfor i := 0; i < t.NumField(); i++ {\n\t\tf := t.Field(i)\n\t\tv := f.Tag.Get(\"json\")\n\t\tif i > 0 {\n\t\t\tv = \"\\n\" + v\n\t\t}\n\n\t\tft := f.Type\n\t\tif ft.Kind() == reflect.Slice {\n\t\t\tft = ft.Elem()\n\t\t}\n\t\tif ft.Kind() == reflect.Ptr {\n\t\t\tft = ft.Elem()\n\t\t}\n\n\t\tif ft.Kind() == reflect.Struct {\n\t\t\tv = v + \" {\\n\" + makeFragment(ft) + \"\\n}\"\n\t\t}\n\n\t\tret.WriteString(v)\n\t}\n\n\treturn ret.String()\n}\n\ntype graphqlClient struct {\n\t*client.Client\n}\n\nfunc (c *graphqlClient) createScene(input models.SceneCreateInput) (*sceneOutput, error) {\n\tq := `\n\tmutation SceneCreate($input: SceneCreateInput!) {\n\t\tsceneCreate(input: $input) {\n\t\t\t` + makeFragment(reflect.TypeOf(sceneOutput{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tSceneCreate *sceneOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.SceneCreate, nil\n}\n\nfunc (c *graphqlClient) findScene(id uuid.UUID) (*sceneOutput, error) {\n\tq := `\n\tquery FindScene($id: ID!) {\n\t\tfindScene(id: $id) {\n\t\t\t` + makeFragment(reflect.TypeOf(sceneOutput{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tFindScene *sceneOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"id\", id)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.FindScene, nil\n}\n\nfunc (c *graphqlClient) findScenesBySceneFingerprints(sceneFingerprints [][]models.FingerprintQueryInput) ([][]*sceneOutput, error) {\n\tq := `\n\tquery FindScenesBySceneFingerprints($input: [[FingerprintQueryInput!]!]!) {\n\t\tfindScenesBySceneFingerprints(fingerprints: $input) {\n\t\t\t` + makeFragment(reflect.TypeOf(sceneOutput{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tFindScenesBySceneFingerprints [][]*sceneOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", sceneFingerprints)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.FindScenesBySceneFingerprints, nil\n}\n\nfunc (c *graphqlClient) queryScenes(input models.SceneQueryInput) (*queryScenesResultType, error) {\n\tq := `\n\tquery QueryScenes($input: SceneQueryInput!) {\n\t\tqueryScenes(input: $input) {\n\t\t\t` + makeFragment(reflect.TypeOf(queryScenesResultType{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tQueryScenes *queryScenesResultType\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.QueryScenes, nil\n}\n\nfunc (c *graphqlClient) updateScene(updateInput models.SceneUpdateInput) (*sceneOutput, error) {\n\tq := `\n\tmutation SceneUpdate($input: SceneUpdateInput!) {\n\t\tsceneUpdate(input: $input) {\n\t\t\t` + makeFragment(reflect.TypeOf(sceneOutput{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tSceneUpdate *sceneOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", updateInput)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.SceneUpdate, nil\n}\n\nfunc (c *graphqlClient) destroyScene(input models.SceneDestroyInput) (bool, error) {\n\tq := `\n\tmutation SceneDestroy($input: SceneDestroyInput!) {\n\t\tsceneDestroy(input: $input)\n\t}`\n\n\tvar resp struct {\n\t\tSceneDestroy bool\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn resp.SceneDestroy, nil\n}\n\nfunc (c *graphqlClient) submitFingerprint(input models.FingerprintSubmission) (bool, error) {\n\tq := `\n\tmutation SubmitFingerprint($input: FingerprintSubmission!) {\n\t\tsubmitFingerprint(input: $input)\n\t}`\n\n\tvar resp struct {\n\t\tSubmitFingerprint bool\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn resp.SubmitFingerprint, nil\n}\n\ntype fingerprintSubmissionResultOutput struct {\n\tHash    string  `json:\"hash\"`\n\tSceneID string  `json:\"scene_id\"`\n\tError   *string `json:\"error\"`\n}\n\nfunc (c *graphqlClient) submitFingerprints(input []models.FingerprintBatchSubmission) ([]models.FingerprintSubmissionResult, error) {\n\tq := `\n\tmutation SubmitFingerprints($input: [FingerprintBatchSubmission!]!) {\n\t\tsubmitFingerprints(input: $input) {\n\t\t\thash\n\t\t\tscene_id\n\t\t\terror\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tSubmitFingerprints []fingerprintSubmissionResultOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Convert output to models\n\tresults := make([]models.FingerprintSubmissionResult, len(resp.SubmitFingerprints))\n\tfor i, r := range resp.SubmitFingerprints {\n\t\thash, _ := models.UnmarshalFingerprintHash(r.Hash)\n\t\tresults[i] = models.FingerprintSubmissionResult{\n\t\t\tHash:    hash,\n\t\t\tSceneID: uuid.FromStringOrNil(r.SceneID),\n\t\t\tError:   r.Error,\n\t\t}\n\t}\n\n\treturn results, nil\n}\n\nfunc (c *graphqlClient) sceneMoveFingerprintSubmissions(input models.MoveFingerprintSubmissionsInput) (bool, error) {\n\tq := `\n\tmutation SceneMoveFingerprintSubmissions($input: MoveFingerprintSubmissionsInput!) {\n\t\tsceneMoveFingerprintSubmissions(input: $input)\n\t}`\n\n\tvar resp struct {\n\t\tSceneMoveFingerprintSubmissions bool\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn resp.SceneMoveFingerprintSubmissions, nil\n}\n\nfunc (c *graphqlClient) sceneDeleteFingerprintSubmissions(input models.DeleteFingerprintSubmissionsInput) (bool, error) {\n\tq := `\n\tmutation SceneDeleteFingerprintSubmissions($input: DeleteFingerprintSubmissionsInput!) {\n\t\tsceneDeleteFingerprintSubmissions(input: $input)\n\t}`\n\n\tvar resp struct {\n\t\tSceneDeleteFingerprintSubmissions bool\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn resp.SceneDeleteFingerprintSubmissions, nil\n}\n\nfunc (c *graphqlClient) createPerformer(input models.PerformerCreateInput) (*performerOutput, error) {\n\tq := `\n\tmutation PerformerCreate($input: PerformerCreateInput!) {\n\t\tperformerCreate(input: $input) {\n\t\t\t` + makeFragment(reflect.TypeOf(performerOutput{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tPerformerCreate *performerOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.PerformerCreate, nil\n}\n\nfunc (c *graphqlClient) findPerformer(id uuid.UUID) (*performerOutput, error) {\n\tq := `\n\tquery FindPerformer($id: ID!) {\n\t\tfindPerformer(id: $id) {\n\t\t\t` + makeFragment(reflect.TypeOf(performerOutput{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tFindPerformer *performerOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"id\", id)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.FindPerformer, nil\n}\n\nfunc (c *graphqlClient) createStudio(input models.StudioCreateInput) (*studioOutput, error) {\n\tq := `\n\tmutation StudioCreate($input: StudioCreateInput!) {\n\t\tstudioCreate(input: $input) {\n\t\t\t` + makeFragment(reflect.TypeOf(studioOutput{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tStudioCreate *studioOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.StudioCreate, nil\n}\n\nfunc (c *graphqlClient) findStudio(id uuid.UUID) (*studioOutput, error) {\n\tq := `\n\tquery FindStudio($id: ID!) {\n\t\tfindStudio(id: $id) {\n\t\t\t` + makeFragment(reflect.TypeOf(studioOutput{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tFindStudio *studioOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"id\", id)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.FindStudio, nil\n}\n\nfunc (c *graphqlClient) createTag(input models.TagCreateInput) (*tagOutput, error) {\n\tq := `\n\tmutation TagCreate($input: TagCreateInput!) {\n\t\ttagCreate(input: $input) {\n\t\t\t` + makeFragment(reflect.TypeOf(tagOutput{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tTagCreate *tagOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.TagCreate, nil\n}\n\nfunc (c *graphqlClient) findSite(id uuid.UUID) (*siteOutput, error) {\n\tq := `\n\tquery FindSite($id: ID!) {\n\t\tfindSite(id: $id) {\n\t\t\t` + makeFragment(reflect.TypeOf(siteOutput{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tFindSite *siteOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"id\", id)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.FindSite, nil\n}\n\nfunc (c *graphqlClient) querySites() (*querySitesResultType, error) {\n\tq := `\n\tquery QuerySites {\n\t\tquerySites {\n\t\t\t` + makeFragment(reflect.TypeOf(querySitesResultType{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tQuerySites *querySitesResultType\n\t}\n\tif err := c.Post(q, &resp); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.QuerySites, nil\n}\n\nfunc (c *graphqlClient) updateSite(input models.SiteUpdateInput) (*siteOutput, error) {\n\tq := `\n\tmutation SiteUpdate($input: SiteUpdateInput!) {\n\t\tsiteUpdate(input: $input) {\n\t\t\t` + makeFragment(reflect.TypeOf(siteOutput{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tSiteUpdate *siteOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.SiteUpdate, nil\n}\n\nfunc (c *graphqlClient) destroySite(input models.SiteDestroyInput) (bool, error) {\n\tq := `\n\tmutation SiteDestroy($input: SiteDestroyInput!) {\n\t\tsiteDestroy(input: $input)\n\t}`\n\n\tvar resp struct {\n\t\tSiteDestroy bool\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn resp.SiteDestroy, nil\n}\n\nfunc (c *graphqlClient) queryPerformers(input models.PerformerQueryInput) (*queryPerformersResultType, error) {\n\tq := `\n\tquery QueryPerformers($input: PerformerQueryInput!) {\n\t\tqueryPerformers(input: $input) {\n\t\t\t` + makeFragment(reflect.TypeOf(queryPerformersResultType{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tQueryPerformers *queryPerformersResultType\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.QueryPerformers, nil\n}\n\nfunc (c *graphqlClient) queryStudios(input models.StudioQueryInput) (*queryStudiosResultType, error) {\n\tq := `\n\tquery QueryStudios($input: StudioQueryInput!) {\n\t\tqueryStudios(input: $input) {\n\t\t\t` + makeFragment(reflect.TypeOf(queryStudiosResultType{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tQueryStudios *queryStudiosResultType\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.QueryStudios, nil\n}\n\nfunc (c *graphqlClient) queryTags(input models.TagQueryInput) (*queryTagsResultType, error) {\n\tq := `\n\tquery QueryTags($input: TagQueryInput!) {\n\t\tqueryTags(input: $input) {\n\t\t\t` + makeFragment(reflect.TypeOf(queryTagsResultType{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tQueryTags *queryTagsResultType\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.QueryTags, nil\n}\n\nfunc (c *graphqlClient) queryTagCategories() (*queryTagCategoriesResultType, error) {\n\tq := `\n\tquery QueryTagCategories {\n\t\tqueryTagCategories {\n\t\t\t` + makeFragment(reflect.TypeOf(queryTagCategoriesResultType{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tQueryTagCategories *queryTagCategoriesResultType\n\t}\n\tif err := c.Post(q, &resp); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.QueryTagCategories, nil\n}\n\nfunc (c *graphqlClient) findTagOrAlias(name string) (*tagOutput, error) {\n\tq := `\n\tquery FindTagOrAlias($name: String!) {\n\t\tfindTagOrAlias(name: $name) {\n\t\t\t` + makeFragment(reflect.TypeOf(tagOutput{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tFindTagOrAlias *tagOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"name\", name)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.FindTagOrAlias, nil\n}\n\nfunc (c *graphqlClient) me() (*userOutput, error) {\n\tq := `\n\tquery Me {\n\t\tme {\n\t\t\t` + makeFragment(reflect.TypeOf(userOutput{})) + `\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tMe *userOutput\n\t}\n\tif err := c.Post(q, &resp); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.Me, nil\n}\n\nfunc (c *graphqlClient) favoritePerformer(id uuid.UUID, favorite bool) (bool, error) {\n\tq := `\n\tmutation FavoritePerformer($id: ID!, $favorite: Boolean!) {\n\t\tfavoritePerformer(id: $id, favorite: $favorite)\n\t}`\n\n\tvar resp struct {\n\t\tFavoritePerformer bool\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"id\", id), client.Var(\"favorite\", favorite)); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn resp.FavoritePerformer, nil\n}\n\nfunc (c *graphqlClient) favoriteStudio(id uuid.UUID, favorite bool) (bool, error) {\n\tq := `\n\tmutation FavoriteStudio($id: ID!, $favorite: Boolean!) {\n\t\tfavoriteStudio(id: $id, favorite: $favorite)\n\t}`\n\n\tvar resp struct {\n\t\tFavoriteStudio bool\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"id\", id), client.Var(\"favorite\", favorite)); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn resp.FavoriteStudio, nil\n}\n\nfunc (c *graphqlClient) submitSceneDraft(input models.SceneDraftInput) (*draftSubmissionStatusOutput, error) {\n\tq := `\n\tmutation SubmitSceneDraft($input: SceneDraftInput!) {\n\t\tsubmitSceneDraft(input: $input) {\n\t\t\tid\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tSubmitSceneDraft draftSubmissionStatusOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &resp.SubmitSceneDraft, nil\n}\n\nfunc (c *graphqlClient) submitPerformerDraft(input models.PerformerDraftInput) (*draftSubmissionStatusOutput, error) {\n\tq := `\n\tmutation SubmitPerformerDraft($input: PerformerDraftInput!) {\n\t\tsubmitPerformerDraft(input: $input) {\n\t\t\tid\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tSubmitPerformerDraft draftSubmissionStatusOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &resp.SubmitPerformerDraft, nil\n}\n\nfunc (c *graphqlClient) findDraft(id uuid.UUID) (*draftOutput, error) {\n\tq := `\n\tquery FindDraft($id: ID!) {\n\t\tfindDraft(id: $id) {\n\t\t\tid\n\t\t\tcreated\n\t\t\texpires\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tFindDraft *draftOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"id\", id)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.FindDraft, nil\n}\n\nfunc (c *graphqlClient) findDraftWithTags(id uuid.UUID) (*draftOutput, error) {\n\tq := `\n\tquery FindDraft($id: ID!) {\n\t\tfindDraft(id: $id) {\n\t\t\tid\n\t\t\tcreated\n\t\t\texpires\n\t\t\tdata {\n\t\t\t\t... on SceneDraft {\n\t\t\t\t\ttags {\n\t\t\t\t\t\t__typename\n\t\t\t\t\t\t... on Tag {\n\t\t\t\t\t\t\tid\n\t\t\t\t\t\t\tname\n\t\t\t\t\t\t}\n\t\t\t\t\t\t... on DraftEntity {\n\t\t\t\t\t\t\tname\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\tvar resp struct {\n\t\tFindDraft *draftOutput\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"id\", id)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.FindDraft, nil\n}\n\nfunc (c *graphqlClient) findDrafts() ([]draftOutput, error) {\n\tq := `\n\tquery FindDrafts {\n\t\tfindDrafts {\n\t\t\tid\n\t\t\tcreated\n\t\t\texpires\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tFindDrafts []draftOutput\n\t}\n\tif err := c.Post(q, &resp); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.FindDrafts, nil\n}\n\nfunc (c *graphqlClient) destroyDraft(id uuid.UUID) (bool, error) {\n\tq := `\n\tmutation DestroyDraft($id: ID!) {\n\t\tdestroyDraft(id: $id)\n\t}`\n\n\tvar resp struct {\n\t\tDestroyDraft bool\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"id\", id)); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn resp.DestroyDraft, nil\n}\n\nfunc (c *graphqlClient) queryNotifications(input models.QueryNotificationsInput) (*queryNotificationsResultType, error) {\n\tq := `\n\tquery QueryNotifications($input: QueryNotificationsInput!) {\n\t\tqueryNotifications(input: $input) {\n\t\t\tcount\n\t\t\tnotifications {\n\t\t\t\tcreated\n\t\t\t\tread\n\t\t\t}\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tQueryNotifications queryNotificationsResultType\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &resp.QueryNotifications, nil\n}\n\nfunc (c *graphqlClient) getUnreadNotificationCount() (int, error) {\n\tq := `\n\tquery GetUnreadNotificationCount {\n\t\tgetUnreadNotificationCount\n\t}`\n\n\tvar resp struct {\n\t\tGetUnreadNotificationCount int\n\t}\n\tif err := c.Post(q, &resp); err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn resp.GetUnreadNotificationCount, nil\n}\n\nfunc (c *graphqlClient) updateNotificationSubscriptions(subscriptions []models.NotificationEnum) (bool, error) {\n\tq := `\n\tmutation UpdateNotificationSubscriptions($subscriptions: [NotificationEnum!]!) {\n\t\tupdateNotificationSubscriptions(subscriptions: $subscriptions)\n\t}`\n\n\tvar resp struct {\n\t\tUpdateNotificationSubscriptions bool\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"subscriptions\", subscriptions)); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn resp.UpdateNotificationSubscriptions, nil\n}\n\nfunc (c *graphqlClient) markNotificationsRead(notification *models.MarkNotificationReadInput) (bool, error) {\n\tq := `\n\tmutation MarkNotificationsRead($notification: MarkNotificationReadInput) {\n\t\tmarkNotificationsRead(notification: $notification)\n\t}`\n\n\tvar resp struct {\n\t\tMarkNotificationsRead bool\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"notification\", notification)); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn resp.MarkNotificationsRead, nil\n}\n\nfunc (c *graphqlClient) getNotificationSubscriptions() ([]models.NotificationEnum, error) {\n\tq := `\n\tquery Me {\n\t\tme {\n\t\t\tnotification_subscriptions\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tMe struct {\n\t\t\tNotificationSubscriptions []models.NotificationEnum `json:\"notification_subscriptions\"`\n\t\t}\n\t}\n\tif err := c.Post(q, &resp); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn resp.Me.NotificationSubscriptions, nil\n}\n\nfunc (c *graphqlClient) deleteEdit(input models.DeleteEditInput) (bool, error) {\n\tq := `\n\tmutation DeleteEdit($input: DeleteEditInput!) {\n\t\tdeleteEdit(input: $input)\n\t}`\n\n\tvar resp struct {\n\t\tDeleteEdit bool\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn resp.DeleteEdit, nil\n}\n\nfunc (c *graphqlClient) amendEdit(input models.AmendEditInput) (bool, error) {\n\tq := `\n\tmutation AmendEdit($input: AmendEditInput!) {\n\t\tamendEdit(input: $input) {\n\t\t\tid\n\t\t}\n\t}`\n\n\tvar resp struct {\n\t\tAmendEdit struct {\n\t\t\tID uuid.UUID\n\t\t}\n\t}\n\tif err := c.Post(q, &resp, client.Var(\"input\", input)); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn resp.AmendEdit.ID != uuid.Nil, nil\n}\n"
  },
  {
    "path": "internal/api/integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"testing\"\n\n\t\"github.com/stashapp/stash-box/internal/api\"\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\tdbtest \"github.com/stashapp/stash-box/internal/database/testutil\"\n\t\"github.com/stashapp/stash-box/internal/dataloader\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/service\"\n\n\t\"github.com/99designs/gqlgen/client\"\n\t\"github.com/99designs/gqlgen/graphql\"\n\t\"github.com/99designs/gqlgen/graphql/handler\"\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\n// we need to create some users to test the api with, otherwise all calls\n// will be unauthorised\ntype userPopulator struct {\n\tnone          *models.User\n\tread          *models.User\n\tadmin         *models.User\n\tmodify        *models.User\n\tmoderate      *models.User\n\tedit          *models.User\n\tnoneRoles     []models.RoleEnum\n\treadRoles     []models.RoleEnum\n\tadminRoles    []models.RoleEnum\n\tmodifyRoles   []models.RoleEnum\n\tmoderateRoles []models.RoleEnum\n\teditRoles     []models.RoleEnum\n}\n\nvar userDB *userPopulator\n\nfunc (p *userPopulator) PopulateDB(factory *service.Factory) error {\n\tctx := context.TODO()\n\tuserService := factory.User()\n\n\t// create admin user\n\tcreateInput := models.UserCreateInput{\n\t\tName:     \"admin\",\n\t\tPassword: \"TestPassword#2024\",\n\t\tRoles: []models.RoleEnum{\n\t\t\tmodels.RoleEnumAdmin,\n\t\t},\n\t\tEmail: \"admin@example.com\",\n\t}\n\n\tvar err error\n\tp.admin, err = userService.Create(ctx, createInput)\n\tp.adminRoles = createInput.Roles\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// create modify user\n\tcreateInput = models.UserCreateInput{\n\t\tName:     \"modify\",\n\t\tPassword: \"TestPassword#2024\",\n\t\tRoles: []models.RoleEnum{\n\t\t\tmodels.RoleEnumModify,\n\t\t},\n\t\tEmail: \"modify@example.com\",\n\t}\n\n\tp.modify, err = userService.Create(ctx, createInput)\n\tp.modifyRoles = createInput.Roles\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// create moderate user\n\tcreateInput = models.UserCreateInput{\n\t\tName:     \"moderate\",\n\t\tPassword: \"TestPassword#2024\",\n\t\tRoles: []models.RoleEnum{\n\t\t\tmodels.RoleEnumModerate,\n\t\t},\n\t\tEmail: \"moderate@example.com\",\n\t}\n\n\tp.moderate, err = userService.Create(ctx, createInput)\n\tp.moderateRoles = createInput.Roles\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// create edit user\n\tcreateInput = models.UserCreateInput{\n\t\tName:     \"edit\",\n\t\tPassword: \"TestPassword#2024\",\n\t\tRoles: []models.RoleEnum{\n\t\t\tmodels.RoleEnumEdit,\n\t\t},\n\t\tEmail: \"edit@example.com\",\n\t}\n\n\tp.edit, err = userService.Create(ctx, createInput)\n\tp.editRoles = createInput.Roles\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// create read user\n\tcreateInput = models.UserCreateInput{\n\t\tName:     \"read\",\n\t\tPassword: \"TestPassword#2024\",\n\t\tRoles: []models.RoleEnum{\n\t\t\tmodels.RoleEnumRead,\n\t\t},\n\t\tEmail: \"read@example.com\",\n\t}\n\n\tp.read, err = userService.Create(ctx, createInput)\n\tp.readRoles = createInput.Roles\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// create none user\n\tcreateInput = models.UserCreateInput{\n\t\tName:     \"none\",\n\t\tPassword: \"TestPassword#2024\",\n\t\tRoles: []models.RoleEnum{\n\t\t\tmodels.RoleEnumRead,\n\t\t},\n\t\tEmail: \"none@example.com\",\n\t}\n\n\tp.none, err = userService.Create(ctx, createInput)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// create other users as needed\n\treturn nil\n}\n\nfunc TestMain(m *testing.M) {\n\tuserDB = &userPopulator{}\n\tdbtest.TestWithDatabase(m, userDB)\n}\n\ntype testRunner struct {\n\tt        *testing.T\n\tclient   *graphqlClient\n\tresolver api.Resolver\n\tctx      context.Context\n\terr      error\n}\n\nvar sceneSuffix int\nvar performerSuffix int\nvar studioSuffix int\nvar tagSuffix int\nvar sceneChecksumSuffix int\nvar userSuffix int\nvar categorySuffix int\nvar siteSuffix int\n\nfunc createTestRunner(t *testing.T, u *models.User, roles []models.RoleEnum) *testRunner {\n\tresolver := api.NewResolver(*dbtest.Factory())\n\n\tgqlHandler := handler.NewDefaultServer(models.NewExecutableSchema(models.Config{\n\t\tResolvers: resolver,\n\t\tDirectives: models.DirectiveRoot{\n\t\t\tIsUserOwner: api.IsUserOwnerDirective,\n\t\t\tHasRole:     api.HasRoleDirective,\n\t\t},\n\t}))\n\tvar handlerFunc http.HandlerFunc = func(w http.ResponseWriter, r *http.Request) {\n\t\t// re-create context for each request\n\t\tctx := context.TODO()\n\t\tctx = context.WithValue(ctx, auth.ContextUser, u)\n\t\tctx = context.WithValue(ctx, auth.ContextRoles, roles)\n\t\tctx = context.WithValue(ctx, dataloader.GetLoadersKey(), dataloader.GetLoaders(ctx, *dbtest.Factory()))\n\t\tctx = graphql.WithOperationContext(ctx, &graphql.OperationContext{})\n\n\t\tr = r.WithContext(ctx)\n\t\tgqlHandler.ServeHTTP(w, r)\n\t}\n\n\tc := client.New(handlerFunc)\n\n\t// replicate what the server.go code does\n\tctx := context.TODO()\n\tctx = context.WithValue(ctx, auth.ContextUser, u)\n\tctx = context.WithValue(ctx, auth.ContextRoles, roles)\n\tctx = context.WithValue(ctx, dataloader.GetLoadersKey(), dataloader.GetLoaders(ctx, *dbtest.Factory()))\n\tctx = graphql.WithOperationContext(ctx, &graphql.OperationContext{})\n\n\treturn &testRunner{\n\t\tt: t,\n\t\tclient: &graphqlClient{\n\t\t\tc,\n\t\t},\n\t\tresolver: *resolver,\n\t\tctx:      ctx,\n\t}\n}\n\nfunc asAdmin(t *testing.T) *testRunner {\n\treturn createTestRunner(t, userDB.admin, userDB.adminRoles)\n}\n\nfunc asModify(t *testing.T) *testRunner {\n\treturn createTestRunner(t, userDB.modify, userDB.modifyRoles)\n}\n\nfunc asModerate(t *testing.T) *testRunner {\n\treturn createTestRunner(t, userDB.moderate, userDB.moderateRoles)\n}\n\nfunc asRead(t *testing.T) *testRunner {\n\treturn createTestRunner(t, userDB.read, userDB.readRoles)\n}\n\nfunc asNone(t *testing.T) *testRunner {\n\treturn createTestRunner(t, userDB.none, userDB.noneRoles)\n}\n\nfunc asEdit(t *testing.T) *testRunner {\n\treturn createTestRunner(t, userDB.edit, userDB.editRoles)\n}\n\nfunc (t *testRunner) doTest(test func()) {\n\tif t.t.Failed() {\n\t\treturn\n\t}\n\n\ttest()\n}\n\nfunc (t *testRunner) fieldMismatch(expected interface{}, actual interface{}, field string) {\n\tt.t.Helper()\n\tt.t.Errorf(\"%s mismatch: %+v != %+v\", field, actual, expected)\n}\n\nfunc (t *testRunner) updateContext(fields []string) context.Context {\n\tvariables := make(map[string]interface{})\n\tfor _, v := range fields {\n\t\tvariables[v] = true\n\t}\n\n\trctx := &graphql.OperationContext{\n\t\tVariables: variables,\n\t}\n\treturn graphql.WithOperationContext(t.ctx, rctx)\n}\n\nfunc (s *testRunner) generatePerformerName() string {\n\tperformerSuffix += 1\n\treturn \"performer-\" + strconv.Itoa(performerSuffix)\n}\n\nfunc (s *testRunner) createTestPerformer(input *models.PerformerCreateInput) (*performerOutput, error) {\n\ts.t.Helper()\n\tif input == nil {\n\t\tinput = &models.PerformerCreateInput{\n\t\t\tName: s.generatePerformerName(),\n\t\t}\n\t}\n\n\tcreatedPerformer, err := s.client.createPerformer(*input)\n\n\tif err != nil {\n\t\ts.t.Errorf(\"Error creating performer: %s\", err.Error())\n\t\treturn nil, err\n\t}\n\n\treturn createdPerformer, nil\n}\n\nfunc (s *testRunner) createFullPerformerCreateInput() *models.PerformerCreateInput {\n\tname := s.generatePerformerName()\n\tdisambiguation := \"Dis Ambiguation\"\n\tgender := models.GenderEnumFemale\n\tethnicity := models.EthnicityEnumCaucasian\n\teyecolor := models.EyeColorEnumBlue\n\thaircolor := models.HairColorEnumAuburn\n\tcountry := \"Some Country\"\n\theight := 160\n\thip := 23\n\twaist := 24\n\tband := 25\n\tcup := \"DD\"\n\tbreasttype := models.BreastTypeEnumNatural\n\tcareerstart := 2019\n\tcareerend := 2020\n\ttattoodesc := \"Tatto Desc\"\n\tbirthdate := \"2000-02-03\"\n\tdeathdate := \"2024-01-02\"\n\tsite, err := s.createTestSite(nil)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\treturn &models.PerformerCreateInput{\n\t\tName:           name,\n\t\tDisambiguation: &disambiguation,\n\t\tAliases:        []string{\"Alias1\"},\n\t\tGender:         &gender,\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"http://example.org\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t\tBirthdate:       &birthdate,\n\t\tDeathdate:       &deathdate,\n\t\tEthnicity:       &ethnicity,\n\t\tCountry:         &country,\n\t\tEyeColor:        &eyecolor,\n\t\tHairColor:       &haircolor,\n\t\tHeight:          &height,\n\t\tHipSize:         &hip,\n\t\tWaistSize:       &waist,\n\t\tBandSize:        &band,\n\t\tCupSize:         &cup,\n\t\tBreastType:      &breasttype,\n\t\tCareerStartYear: &careerstart,\n\t\tCareerEndYear:   &careerend,\n\t\tTattoos: []models.BodyModificationInput{\n\t\t\t{\n\t\t\t\tLocation:    \"Wrist\",\n\t\t\t\tDescription: &tattoodesc,\n\t\t\t},\n\t\t},\n\t\tPiercings: []models.BodyModificationInput{\n\t\t\t{\n\t\t\t\tLocation: \"Ears\",\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunc (s *testRunner) generateStudioName() string {\n\tstudioSuffix += 1\n\treturn \"studio-\" + strconv.Itoa(studioSuffix)\n}\n\nfunc (s *testRunner) createTestStudio(input *models.StudioCreateInput) (*studioOutput, error) {\n\ts.t.Helper()\n\tif input == nil {\n\t\tinput = &models.StudioCreateInput{\n\t\t\tName: s.generateStudioName(),\n\t\t}\n\t}\n\n\tcreatedStudio, err := s.client.createStudio(*input)\n\n\tif err != nil {\n\t\ts.t.Errorf(\"Error creating studio: %s\", err.Error())\n\t\treturn nil, err\n\t}\n\n\treturn createdStudio, nil\n}\n\nfunc (s *testRunner) generateTagName() string {\n\ttagSuffix += 1\n\treturn \"testtag\" + strconv.Itoa(tagSuffix)\n}\n\nfunc (s *testRunner) createTestTag(input *models.TagCreateInput) (*tagOutput, error) {\n\ts.t.Helper()\n\tif input == nil {\n\t\tinput = &models.TagCreateInput{\n\t\t\tName: s.generateTagName(),\n\t\t}\n\t}\n\n\tcreatedTag, err := s.client.createTag(*input)\n\n\tif err != nil {\n\t\ts.t.Errorf(\"Error creating tag: %s\", err.Error())\n\t\treturn nil, err\n\t}\n\n\treturn createdTag, nil\n}\n\nfunc (s *testRunner) generateSceneName() string {\n\tsceneSuffix += 1\n\treturn \"scene-\" + strconv.Itoa(sceneSuffix)\n}\n\nfunc (s *testRunner) createTestScene(input *models.SceneCreateInput) (*sceneOutput, error) {\n\ts.t.Helper()\n\tif input == nil {\n\t\ttitle := s.generateSceneName()\n\t\tinput = &models.SceneCreateInput{\n\t\t\tTitle: &title,\n\t\t\tFingerprints: []models.FingerprintEditInput{\n\t\t\t\ts.generateSceneFingerprint(nil),\n\t\t\t},\n\t\t\tDate: \"2020-03-02\",\n\t\t}\n\t}\n\n\tif input.Fingerprints == nil {\n\t\tinput.Fingerprints = []models.FingerprintEditInput{}\n\t}\n\n\tcreatedScene, err := s.client.createScene(*input)\n\n\tif err != nil {\n\t\ts.t.Errorf(\"Error creating scene: %s\", err.Error())\n\t\treturn nil, err\n\t}\n\n\treturn createdScene, nil\n}\n\nfunc (s *testRunner) generateSceneFingerprint(userIDs []uuid.UUID) models.FingerprintEditInput {\n\treturn s.generateSceneFingerprintWithAlgorithm(models.FingerprintAlgorithmOshash, userIDs)\n}\n\nfunc (s *testRunner) generateSceneFingerprintWithAlgorithm(algorithm models.FingerprintAlgorithm, userIDs []uuid.UUID) models.FingerprintEditInput {\n\tif userIDs == nil {\n\t\tuserIDs = []uuid.UUID{}\n\t}\n\n\tsceneChecksumSuffix += 1\n\treturn models.FingerprintEditInput{\n\t\tAlgorithm: algorithm,\n\t\tHash:      models.FingerprintHash(sceneChecksumSuffix),\n\t\tDuration:  1234,\n\t\tUserIds:   userIDs,\n\t}\n}\n\nfunc (s *testRunner) generateUserName() string {\n\tuserSuffix += 1\n\treturn \"user-\" + strconv.Itoa(userSuffix)\n}\n\nfunc (s *testRunner) createTestUser(input *models.UserCreateInput, roles []models.RoleEnum) (*models.User, error) {\n\ts.t.Helper()\n\n\tuserRoles := roles\n\tif roles == nil {\n\t\tuserRoles = []models.RoleEnum{\n\t\t\tmodels.RoleEnumAdmin,\n\t\t}\n\t}\n\n\tif input == nil {\n\t\tname := s.generateUserName()\n\t\tinput = &models.UserCreateInput{\n\t\t\tName:     name,\n\t\t\tEmail:    name + \"@example.com\",\n\t\t\tPassword: \"password\" + name,\n\t\t\tRoles:    userRoles,\n\t\t}\n\t}\n\n\tcreatedUser, err := s.resolver.Mutation().UserCreate(s.ctx, *input)\n\n\tif err != nil {\n\t\ts.t.Errorf(\"Error creating user: %s\", err.Error())\n\t\treturn nil, err\n\t}\n\n\treturn createdUser, nil\n}\n\nfunc (s *testRunner) generateCategoryName() string {\n\tcategorySuffix += 1\n\treturn \"category-\" + strconv.Itoa(categorySuffix)\n}\n\nfunc (s *testRunner) createTestTagCategory(input *models.TagCategoryCreateInput) (*models.TagCategory, error) {\n\ts.t.Helper()\n\n\tif input == nil {\n\t\tname := s.generateCategoryName()\n\t\tdesc := \"Description for \" + name\n\t\tinput = &models.TagCategoryCreateInput{\n\t\t\tName:        name,\n\t\t\tDescription: &desc,\n\t\t\tGroup:       models.TagGroupEnumAction,\n\t\t}\n\t}\n\n\tcreatedCategory, err := s.resolver.Mutation().TagCategoryCreate(s.ctx, *input)\n\n\tif err != nil {\n\t\ts.t.Errorf(\"Error creating tag category: %s\", err.Error())\n\t\treturn nil, err\n\t}\n\n\treturn createdCategory, nil\n}\n\nfunc (s *testRunner) createTestTagEdit(operation models.OperationEnum, detailsInput *models.TagEditDetailsInput, editInput *models.EditInput) (*models.Edit, error) {\n\ts.t.Helper()\n\n\tif editInput == nil {\n\t\tinput := models.EditInput{\n\t\t\tOperation: operation,\n\t\t}\n\t\teditInput = &input\n\t}\n\n\tif detailsInput == nil {\n\t\tname := s.generateTagName()\n\t\tinput := models.TagEditDetailsInput{\n\t\t\tName: &name,\n\t\t}\n\t\tdetailsInput = &input\n\t}\n\n\ttagEditInput := models.TagEditInput{\n\t\tEdit:    editInput,\n\t\tDetails: detailsInput,\n\t}\n\n\tcreatedEdit, err := s.resolver.Mutation().TagEdit(s.ctx, tagEditInput)\n\n\tif err != nil {\n\t\ts.t.Errorf(\"Error creating edit: %s\", err.Error())\n\t\treturn nil, err\n\t}\n\n\treturn createdEdit, nil\n}\n\nfunc (s *testRunner) createTestStudioEdit(operation models.OperationEnum, detailsInput *models.StudioEditDetailsInput, editInput *models.EditInput) (*models.Edit, error) {\n\ts.t.Helper()\n\n\tif editInput == nil {\n\t\tinput := models.EditInput{\n\t\t\tOperation: operation,\n\t\t}\n\t\teditInput = &input\n\t}\n\n\tif detailsInput == nil {\n\t\tname := s.generateStudioName()\n\t\tinput := models.StudioEditDetailsInput{\n\t\t\tName: &name,\n\t\t}\n\t\tdetailsInput = &input\n\t}\n\n\tstudioEditInput := models.StudioEditInput{\n\t\tEdit:    editInput,\n\t\tDetails: detailsInput,\n\t}\n\n\tcreatedEdit, err := s.resolver.Mutation().StudioEdit(s.ctx, studioEditInput)\n\n\tif err != nil {\n\t\ts.t.Errorf(\"Error creating edit: %s\", err.Error())\n\t\treturn nil, err\n\t}\n\n\treturn createdEdit, nil\n}\n\nfunc (s *testRunner) applyEdit(id uuid.UUID) (*models.Edit, error) {\n\ts.t.Helper()\n\n\tinput := models.ApplyEditInput{\n\t\tID: id,\n\t}\n\tappliedEdit, err := s.resolver.Mutation().ApplyEdit(s.ctx, input)\n\n\tif err != nil {\n\t\ts.t.Errorf(\"Error applying edit: %s\", err.Error())\n\t\treturn nil, err\n\t}\n\n\treturn appliedEdit, nil\n}\n\nfunc (s *testRunner) getEditTagDetails(input *models.Edit) *models.TagEdit {\n\ts.t.Helper()\n\tr := s.resolver.Edit()\n\n\tdetails, _ := r.Details(s.ctx, input)\n\ttagDetails := details.(*models.TagEdit)\n\treturn tagDetails\n}\n\nfunc (s *testRunner) getEditTagTarget(input *models.Edit) *models.Tag {\n\ts.t.Helper()\n\tr := s.resolver.Edit()\n\n\ttarget, _ := r.Target(s.ctx, input)\n\ttagTarget := target.(*models.Tag)\n\treturn tagTarget\n}\n\nfunc (s *testRunner) getEditStudioDetails(input *models.Edit) *models.StudioEdit {\n\ts.t.Helper()\n\tr := s.resolver.Edit()\n\n\tdetails, _ := r.Details(s.ctx, input)\n\ttagDetails := details.(*models.StudioEdit)\n\treturn tagDetails\n}\n\nfunc (s *testRunner) getEditStudioTarget(input *models.Edit) *models.Studio {\n\ts.t.Helper()\n\tr := s.resolver.Edit()\n\n\ttarget, _ := r.Target(s.ctx, input)\n\ttagTarget := target.(*models.Studio)\n\treturn tagTarget\n}\n\nfunc oneNil(l interface{}, r interface{}) bool {\n\treturn l != r && (l == nil || r == nil)\n}\n\nfunc bothNil(l interface{}, r interface{}) bool {\n\treturn l == nil && r == nil\n}\n\nfunc (s *testRunner) verifyEditOperation(operation string, edit *models.Edit) {\n\tif edit.Operation != operation {\n\t\ts.fieldMismatch(operation, edit.Operation, \"Operation\")\n\t}\n}\n\nfunc (s *testRunner) verifyEditStatus(status string, edit *models.Edit) {\n\tif edit.Status != status {\n\t\ts.fieldMismatch(status, edit.Status, \"Status\")\n\t}\n}\n\nfunc (s *testRunner) verifyEditApplication(applied bool, edit *models.Edit) {\n\tif edit.Applied != applied {\n\t\ts.fieldMismatch(applied, edit.Applied, \"Applied\")\n\t}\n}\n\nfunc (s *testRunner) verifyEditTargetType(targetType string, edit *models.Edit) {\n\tif edit.TargetType != targetType {\n\t\ts.fieldMismatch(targetType, edit.TargetType, \"TargetType\")\n\t}\n}\n\nfunc (s *testRunner) verifyAppliedPerformerEdit(edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumModify.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumPerformer.String(), edit)\n\ts.verifyEditApplication(true, edit)\n}\n\nfunc (s *testRunner) verifyAppliedSceneEdit(edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumModify.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumScene.String(), edit)\n\ts.verifyEditApplication(true, edit)\n}\n\nfunc (s *testRunner) createTestPerformerEdit(operation models.OperationEnum, detailsInput *models.PerformerEditDetailsInput, editInput *models.EditInput, options *models.PerformerEditOptionsInput) (*models.Edit, error) {\n\ts.t.Helper()\n\n\tif editInput == nil {\n\t\tinput := models.EditInput{\n\t\t\tOperation: operation,\n\t\t}\n\t\teditInput = &input\n\t}\n\n\tif detailsInput == nil {\n\t\tname := s.generatePerformerName()\n\t\tinput := models.PerformerEditDetailsInput{\n\t\t\tName: &name,\n\t\t}\n\t\tdetailsInput = &input\n\t}\n\n\tperformerEditInput := models.PerformerEditInput{\n\t\tEdit:    editInput,\n\t\tDetails: detailsInput,\n\t\tOptions: options,\n\t}\n\n\tcreatedEdit, err := s.resolver.Mutation().PerformerEdit(s.ctx, performerEditInput)\n\n\tif err != nil {\n\t\ts.t.Errorf(\"Error creating edit: %s\", err.Error())\n\t\treturn nil, err\n\t}\n\n\treturn createdEdit, nil\n}\n\nfunc (s *testRunner) getEditPerformerDetails(input *models.Edit) *models.PerformerEdit {\n\ts.t.Helper()\n\tr := s.resolver.Edit()\n\n\tdetails, _ := r.Details(s.ctx, input)\n\tperformerDetails := details.(*models.PerformerEdit)\n\treturn performerDetails\n}\n\nfunc (s *testRunner) getEditPerformerTarget(input *models.Edit) *models.Performer {\n\ts.t.Helper()\n\tr := s.resolver.Edit()\n\n\ttarget, _ := r.Target(s.ctx, input)\n\tperformerTarget := target.(*models.Performer)\n\treturn performerTarget\n}\n\nfunc (s *testRunner) createPerformerEditDetailsInput() *models.PerformerEditDetailsInput {\n\tname := s.generatePerformerName()\n\tdisambiguation := \"Dis Ambiguation\"\n\tgender := models.GenderEnumFemale\n\tethnicity := models.EthnicityEnumCaucasian\n\teyecolor := models.EyeColorEnumBlue\n\thaircolor := models.HairColorEnumAuburn\n\tcountry := \"Some Country\"\n\theight := 160\n\thip := 23\n\twaist := 24\n\tband := 25\n\tcup := \"DD\"\n\tbreasttype := models.BreastTypeEnumNatural\n\tcareerstart := 2019\n\tcareerend := 2020\n\ttattoodesc := \"Tatto Desc\"\n\tbirthdate := \"2000-02-03\"\n\tdeathdate := \"2024-01-02\"\n\tsite, err := s.createTestSite(nil)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\treturn &models.PerformerEditDetailsInput{\n\t\tName:           &name,\n\t\tDisambiguation: &disambiguation,\n\t\tAliases:        []string{\"Alias1\"},\n\t\tGender:         &gender,\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"http://example.org\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t\tBirthdate:       &birthdate,\n\t\tDeathdate:       &deathdate,\n\t\tEthnicity:       &ethnicity,\n\t\tCountry:         &country,\n\t\tEyeColor:        &eyecolor,\n\t\tHairColor:       &haircolor,\n\t\tHeight:          &height,\n\t\tHipSize:         &hip,\n\t\tWaistSize:       &waist,\n\t\tBandSize:        &band,\n\t\tCupSize:         &cup,\n\t\tBreastType:      &breasttype,\n\t\tCareerStartYear: &careerstart,\n\t\tCareerEndYear:   &careerend,\n\t\tTattoos: []models.BodyModificationInput{\n\t\t\t{\n\t\t\t\tLocation:    \"Wrist\",\n\t\t\t\tDescription: &tattoodesc,\n\t\t\t},\n\t\t},\n\t\tPiercings: []models.BodyModificationInput{\n\t\t\t{\n\t\t\t\tLocation: \"Ears\",\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunc (s *testRunner) createFullSceneCreateInput() *models.SceneCreateInput {\n\ttitle := s.generateSceneName()\n\tdetails := \"Details\"\n\tdate := \"2000-02-03\"\n\tproduction_date := \"2000-01-09\"\n\tduration := 123\n\tdirector := \"Director\"\n\tcode := \"SomeCode\"\n\tsite, err := s.createTestSite(nil)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\treturn &models.SceneCreateInput{\n\t\tTitle:   &title,\n\t\tDetails: &details,\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"http://example.org\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t\tDate:           date,\n\t\tProductionDate: &production_date,\n\t\tFingerprints: []models.FingerprintEditInput{\n\t\t\ts.generateSceneFingerprint(nil),\n\t\t},\n\t\tDuration: &duration,\n\t\tDirector: &director,\n\t\tCode:     &code,\n\t}\n}\n\nfunc (s *testRunner) createSceneEditDetailsInput() *models.SceneEditDetailsInput {\n\ttitle := s.generateSceneName()\n\tdetails := \"Details\"\n\tdate := \"2000-02-03\"\n\tproduction_date := \"2000-01-09\"\n\tduration := 123\n\tdirector := \"Director\"\n\tcode := \"SomeCode\"\n\tsite, err := s.createTestSite(nil)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\treturn &models.SceneEditDetailsInput{\n\t\tTitle:   &title,\n\t\tDetails: &details,\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"http://example.org\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t\tDate:           &date,\n\t\tProductionDate: &production_date,\n\t\tDuration:       &duration,\n\t\tDirector:       &director,\n\t\tCode:           &code,\n\t}\n}\n\nfunc (s *testRunner) createFullSceneEditDetailsInput() *models.SceneEditDetailsInput {\n\tcreatedPerformer, err := s.createTestPerformer(nil)\n\tif err != nil {\n\t\ts.t.Errorf(\"Error creating performer: %s\", err.Error())\n\t\treturn nil\n\t}\n\tcreatedTag, err := s.createTestTag(nil)\n\tif err != nil {\n\t\ts.t.Errorf(\"Error creating tag: %s\", err.Error())\n\t\treturn nil\n\t}\n\n\ttitle := s.generateSceneName()\n\tdetails := \"Details\"\n\tdate := \"2000-02-03\"\n\tproduction_date := \"2000-01-09\"\n\tduration := 123\n\tdirector := \"Director\"\n\tcode := \"SomeCode\"\n\tas := \"Alias\"\n\tsite, err := s.createTestSite(nil)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\treturn &models.SceneEditDetailsInput{\n\t\tTitle:   &title,\n\t\tDetails: &details,\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"http://example.org\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t\tDate:           &date,\n\t\tProductionDate: &production_date,\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\t{\n\t\t\t\tPerformerID: createdPerformer.UUID(),\n\t\t\t\tAs:          &as,\n\t\t\t},\n\t\t},\n\t\tTagIds: []uuid.UUID{\n\t\t\tcreatedTag.UUID(),\n\t\t},\n\t\tDuration: &duration,\n\t\tDirector: &director,\n\t\tCode:     &code,\n\t}\n}\n\nfunc (s *testRunner) createTestSceneEdit(operation models.OperationEnum, detailsInput *models.SceneEditDetailsInput, editInput *models.EditInput) (*models.Edit, error) {\n\ts.t.Helper()\n\n\tif editInput == nil {\n\t\tinput := models.EditInput{\n\t\t\tOperation: operation,\n\t\t}\n\t\teditInput = &input\n\t}\n\n\tif detailsInput == nil {\n\t\ttitle := s.generateSceneName()\n\t\tinput := models.SceneEditDetailsInput{\n\t\t\tTitle: &title,\n\t\t}\n\t\tdetailsInput = &input\n\t}\n\n\tsceneEditInput := models.SceneEditInput{\n\t\tEdit:    editInput,\n\t\tDetails: detailsInput,\n\t}\n\n\tcreatedEdit, err := s.resolver.Mutation().SceneEdit(s.ctx, sceneEditInput)\n\n\tif err != nil {\n\t\ts.t.Errorf(\"Error creating edit: %s\", err.Error())\n\t\treturn nil, err\n\t}\n\n\treturn createdEdit, nil\n}\n\nfunc (s *testRunner) getEditSceneDetails(input *models.Edit) *models.SceneEdit {\n\ts.t.Helper()\n\tr := s.resolver.Edit()\n\n\tdetails, _ := r.Details(s.ctx, input)\n\tsceneDetails := details.(*models.SceneEdit)\n\treturn sceneDetails\n}\n\nfunc (s *testRunner) getEditSceneTarget(input *models.Edit) *models.Scene {\n\ts.t.Helper()\n\tr := s.resolver.Edit()\n\n\ttarget, _ := r.Target(s.ctx, input)\n\tsceneTarget := target.(*models.Scene)\n\treturn sceneTarget\n}\n\nfunc (s *testRunner) generateSiteName() string {\n\tsiteSuffix += 1\n\treturn \"site-\" + strconv.Itoa(siteSuffix)\n}\n\nfunc (s *testRunner) createTestSite(input *models.SiteCreateInput) (*models.Site, error) {\n\ts.t.Helper()\n\n\tif input == nil {\n\t\tname := s.generateSiteName()\n\t\tdesc := \"Description for \" + name\n\t\tinput = &models.SiteCreateInput{\n\t\t\tName:        name,\n\t\t\tDescription: &desc,\n\t\t\tValidTypes:  []models.ValidSiteTypeEnum{models.ValidSiteTypeEnumScene},\n\t\t}\n\t}\n\n\tcreatedSite, err := s.resolver.Mutation().SiteCreate(s.ctx, *input)\n\n\tif err != nil {\n\t\ts.t.Errorf(\"Error creating site: %s\", err.Error())\n\t\treturn nil, err\n\t}\n\n\treturn createdSite, nil\n}\n\nfunc (s *testRunner) compareSiteURLs(input []models.URL, output []siteURL) {\n\tvar convertedURLs []models.URL\n\tfor _, url := range output {\n\t\tconvertedURLs = append(convertedURLs, models.URL{\n\t\t\tURL:    url.URL,\n\t\t\tSiteID: uuid.FromStringOrNil(url.Site.ID),\n\t\t})\n\t}\n\n\tassert.Equal(s.t, input, convertedURLs)\n}\n\nfunc comparePerformers(input []models.PerformerAppearanceInput, performers []performerAppearance) bool {\n\tif len(performers) != len(input) {\n\t\treturn false\n\t}\n\n\tfor i, v := range performers {\n\t\tperformerID := v.Performer.ID\n\t\tif performerID != input[i].PerformerID.String() {\n\t\t\treturn false\n\t\t}\n\n\t\tif v.As != input[i].As {\n\t\t\tif v.As == nil || input[i].As == nil {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif *v.As != *input[i].As {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true\n}\n\nfunc comparePerformersInput(input, performers []models.PerformerAppearanceInput) bool {\n\tif len(performers) != len(input) {\n\t\treturn false\n\t}\n\n\tfor i, v := range performers {\n\t\tperformerID := v.PerformerID\n\t\tif performerID != input[i].PerformerID {\n\t\t\treturn false\n\t\t}\n\n\t\tif v.As != input[i].As {\n\t\t\tif v.As == nil || input[i].As == nil {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif *v.As != *input[i].As {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true\n}\n\nfunc compareTags(tagIDs []uuid.UUID, tags []idObject) bool {\n\tif len(tags) != len(tagIDs) {\n\t\treturn false\n\t}\n\n\tfor i, v := range tags {\n\t\ttagID := v.ID\n\t\tif tagID != tagIDs[i].String() {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\nfunc compareFingerprints(input []models.FingerprintEditInput, fingerprints []fingerprint) bool {\n\tif len(input) != len(fingerprints) {\n\t\treturn false\n\t}\n\n\tfor i, v := range fingerprints {\n\t\tif input[i].Algorithm != v.Algorithm || input[i].Hash.Hex() != v.Hash {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\nfunc compareFingerprintsInput(input, fingerprints []models.FingerprintEditInput) bool {\n\tif len(input) != len(fingerprints) {\n\t\treturn false\n\t}\n\n\tfor i, v := range fingerprints {\n\t\tif input[i].Algorithm != v.Algorithm || input[i].Hash != v.Hash {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\nfunc assertBodyMods(t *testing.T, input []models.BodyModificationInput, bodyMods []models.BodyModification, text string) {\n\tt.Helper()\n\n\t// Flatten input to strings\n\tinputStrs := make([]string, len(input))\n\tfor i, v := range input {\n\t\tdesc := \"\"\n\t\tif v.Description != nil {\n\t\t\tdesc = *v.Description\n\t\t}\n\t\tinputStrs[i] = v.Location + \"|\" + desc\n\t}\n\n\t// Flatten bodyMods to strings\n\tbodyModStrs := make([]string, len(bodyMods))\n\tfor i, v := range bodyMods {\n\t\tdesc := \"\"\n\t\tif v.Description != nil {\n\t\t\tdesc = *v.Description\n\t\t}\n\t\tbodyModStrs[i] = v.Location + \"|\" + desc\n\t}\n\n\t// Use ElementsMatch for order-independent comparison\n\tassert.ElementsMatch(t, inputStrs, bodyModStrs, text)\n}\n\nfunc (s *testRunner) getUserNotificationSubscriptions() ([]models.NotificationEnum, error) {\n\treturn s.client.getNotificationSubscriptions()\n}\n"
  },
  {
    "path": "internal/api/loaders.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/dataloader\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc tagList(ctx context.Context, tagIDs []uuid.UUID) ([]models.Tag, error) {\n\tif len(tagIDs) == 0 {\n\t\treturn nil, nil\n\t}\n\n\tret, errors := dataloader.For(ctx).TagByID.LoadAll(tagIDs)\n\tfor _, err := range errors {\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tvar tags []models.Tag\n\tfor _, tag := range ret {\n\t\tif tag != nil {\n\t\t\ttags = append(tags, *tag)\n\t\t}\n\t}\n\n\treturn tags, nil\n}\n\nfunc imageList(ctx context.Context, imageIDs []uuid.UUID) ([]models.Image, error) {\n\tif len(imageIDs) == 0 {\n\t\treturn nil, nil\n\t}\n\n\tres, errors := dataloader.For(ctx).ImageByID.LoadAll(imageIDs)\n\tfor _, err := range errors {\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\tvar images []models.Image\n\tfor _, image := range res {\n\t\tif image != nil {\n\t\t\timages = append(images, *image)\n\t\t}\n\t}\n\treturn images, nil\n}\n"
  },
  {
    "path": "internal/api/notification_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype notificationTestRunner struct {\n\ttestRunner\n}\n\nfunc createNotificationTestRunner(t *testing.T) *notificationTestRunner {\n\treturn &notificationTestRunner{\n\t\ttestRunner: *asEdit(t),\n\t}\n}\n\n// testNotificationOnCommentOwnEdit tests that a notification is created when someone comments on the user's own edit\nfunc (s *notificationTestRunner) testNotificationOnCommentOwnEdit() {\n\t// Create an edit as the main test user\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Subscribe to comment notifications\n\tsubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumCommentOwnEdit,\n\t}\n\t_, err = s.client.updateNotificationSubscriptions(subscriptions)\n\tassert.NoError(s.t, err)\n\n\t// Get initial unread count\n\tinitialUnreadCount, err := s.client.getUnreadNotificationCount()\n\tassert.NoError(s.t, err)\n\n\t// Create another user and have them comment on the edit\n\tcommenterUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumEdit})\n\tassert.NoError(s.t, err)\n\n\tcommenterCtx := context.WithValue(s.ctx, auth.ContextUser, commenterUser)\n\tcommentText := \"Test comment on edit\"\n\t_, err = s.resolver.Mutation().EditComment(commenterCtx, models.EditCommentInput{\n\t\tID:      createdEdit.ID,\n\t\tComment: commentText,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Small delay to ensure notification is created\n\ttime.Sleep(100 * time.Millisecond)\n\n\t// Verify unread count increased\n\tnewUnreadCount, err := s.client.getUnreadNotificationCount()\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, newUnreadCount > initialUnreadCount, \"Unread count should have increased after comment\")\n\n\t// Query notifications to verify the notification was created\n\tresult, err := s.client.queryNotifications(models.QueryNotificationsInput{\n\t\tPage:       1,\n\t\tPerPage:    25,\n\t\tUnreadOnly: pointerTo(true),\n\t})\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, len(result.Notifications) > 0, \"Should have at least one unread notification\")\n\n\t// Find the notification we just created\n\tfoundNotification := false\n\tfor _, notification := range result.Notifications {\n\t\tif !notification.Read {\n\t\t\tfoundNotification = true\n\t\t\tbreak\n\t\t}\n\t}\n\tassert.True(s.t, foundNotification, \"Should find an unread notification\")\n}\n\n// testNotificationOnDownvoteOwnEdit tests that a notification is created when someone downvotes the user's edit\nfunc (s *notificationTestRunner) testNotificationOnDownvoteOwnEdit() {\n\t// Create an edit as the main test user\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Subscribe to downvote notifications\n\tsubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumDownvoteOwnEdit,\n\t}\n\t_, err = s.client.updateNotificationSubscriptions(subscriptions)\n\tassert.NoError(s.t, err)\n\n\t// Get initial unread count\n\tinitialUnreadCount, err := s.client.getUnreadNotificationCount()\n\tassert.NoError(s.t, err)\n\n\t// Create a user with vote role and have them downvote the edit\n\tvoterUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumVote})\n\tassert.NoError(s.t, err)\n\n\tvoterCtx := context.WithValue(s.ctx, auth.ContextUser, voterUser)\n\t_, err = s.resolver.Mutation().EditVote(voterCtx, models.EditVoteInput{\n\t\tID:   createdEdit.ID,\n\t\tVote: models.VoteTypeEnumReject,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Small delay to ensure notification is created\n\ttime.Sleep(100 * time.Millisecond)\n\n\t// Verify unread count increased\n\tnewUnreadCount, err := s.client.getUnreadNotificationCount()\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, newUnreadCount > initialUnreadCount, \"Unread count should have increased after downvote\")\n\n\t// Query notifications to verify\n\tresult, err := s.client.queryNotifications(models.QueryNotificationsInput{\n\t\tPage:       1,\n\t\tPerPage:    25,\n\t\tUnreadOnly: pointerTo(true),\n\t})\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, len(result.Notifications) > 0, \"Should have at least one unread notification\")\n}\n\n// testNotificationOnFailedOwnEdit tests that a notification is NOT created when the user cancels their own edit\nfunc (s *notificationTestRunner) testNotificationOnFailedOwnEdit() {\n\t// Create an edit as the main test user\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Subscribe to failed edit notifications\n\tsubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumFailedOwnEdit,\n\t}\n\t_, err = s.client.updateNotificationSubscriptions(subscriptions)\n\tassert.NoError(s.t, err)\n\n\t// Get initial unread count\n\tinitialUnreadCount, err := s.client.getUnreadNotificationCount()\n\tassert.NoError(s.t, err)\n\n\t// Cancel the edit (which should NOT trigger a notification for self-cancellation)\n\t_, err = s.resolver.Mutation().CancelEdit(s.ctx, models.CancelEditInput{\n\t\tID: createdEdit.ID,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Small delay to ensure any notification would have been created\n\ttime.Sleep(100 * time.Millisecond)\n\n\t// Verify unread count did NOT increase (no notification for self-cancellation)\n\tnewUnreadCount, err := s.client.getUnreadNotificationCount()\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, initialUnreadCount, newUnreadCount, \"Unread count should NOT change when user cancels their own edit\")\n}\n\n// testNotificationOnAdminCancelEdit tests that a notification IS created when an admin cancels/rejects the user's edit\nfunc (s *notificationTestRunner) testNotificationOnAdminCancelEdit() {\n\t// Create an edit as the main test user\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Subscribe to failed edit notifications\n\tsubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumFailedOwnEdit,\n\t}\n\t_, err = s.client.updateNotificationSubscriptions(subscriptions)\n\tassert.NoError(s.t, err)\n\n\t// Get initial unread count\n\tinitialUnreadCount, err := s.client.getUnreadNotificationCount()\n\tassert.NoError(s.t, err)\n\n\t// Use the existing admin user to cancel the edit\n\tadminCtx := context.WithValue(s.ctx, auth.ContextUser, userDB.admin)\n\tadminCtx = context.WithValue(adminCtx, auth.ContextRoles, userDB.adminRoles)\n\t_, err = s.resolver.Mutation().CancelEdit(adminCtx, models.CancelEditInput{\n\t\tID: createdEdit.ID,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Small delay to ensure notification is created\n\ttime.Sleep(100 * time.Millisecond)\n\n\t// Verify unread count increased\n\tnewUnreadCount, err := s.client.getUnreadNotificationCount()\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, newUnreadCount > initialUnreadCount, \"Unread count should have increased after admin cancellation\")\n\n\t// Query notifications to verify\n\tresult, err := s.client.queryNotifications(models.QueryNotificationsInput{\n\t\tPage:       1,\n\t\tPerPage:    25,\n\t\tUnreadOnly: pointerTo(true),\n\t})\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, len(result.Notifications) > 0, \"Should have at least one unread notification\")\n}\n\n// testMarkSpecificNotificationRead tests marking a specific notification as read\nfunc (s *notificationTestRunner) testMarkSpecificNotificationRead() {\n\t// First, clear all existing notifications by marking them all as read\n\t_, _ = s.client.markNotificationsRead(nil)\n\ttime.Sleep(100 * time.Millisecond)\n\n\t// Create an edit and trigger a notification\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Subscribe to comment notifications\n\tsubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumCommentOwnEdit,\n\t}\n\t_, err = s.client.updateNotificationSubscriptions(subscriptions)\n\tassert.NoError(s.t, err)\n\n\t// Create a comment to trigger notification - we need the comment ID for marking as read\n\tcommenterUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumEdit})\n\tassert.NoError(s.t, err)\n\n\tcommenterCtx := context.WithValue(s.ctx, auth.ContextUser, commenterUser)\n\teditWithComment, err := s.resolver.Mutation().EditComment(commenterCtx, models.EditCommentInput{\n\t\tID:      createdEdit.ID,\n\t\tComment: \"Test comment\",\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Get the comment ID from the edit\n\tcomments, err := s.resolver.Edit().Comments(s.ctx, editWithComment)\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, len(comments) > 0, \"Should have at least one comment\")\n\tcommentID := comments[0].ID\n\n\t// Wait for notification to be created (increased timeout for CI environments)\n\ttime.Sleep(100 * time.Millisecond)\n\n\t// Get unread count before marking as read\n\tunreadCountBefore, err := s.client.getUnreadNotificationCount()\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, unreadCountBefore >= 1, \"Should have at least one unread notification\")\n\n\t// Mark the specific notification as read using the comment ID\n\tsuccess, err := s.client.markNotificationsRead(&models.MarkNotificationReadInput{\n\t\tType: models.NotificationEnumCommentOwnEdit,\n\t\tID:   commentID,\n\t})\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, success, \"Marking notification as read should succeed\")\n\n\ttime.Sleep(100 * time.Millisecond)\n\n\t// Verify unread count decreased\n\tunreadCountAfter, err := s.client.getUnreadNotificationCount()\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, unreadCountAfter < unreadCountBefore, \"Unread count should have decreased after marking notification as read\")\n\n\t// Query unread notifications and verify the count decreased\n\tresultAfter, err := s.client.queryNotifications(models.QueryNotificationsInput{\n\t\tPage:       1,\n\t\tPerPage:    100,\n\t\tUnreadOnly: pointerTo(true),\n\t})\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, len(resultAfter.Notifications) < unreadCountBefore, \"Should have fewer unread notifications after marking one as read\")\n}\n\n// testMarkAllNotificationsRead tests marking all notifications as read\nfunc (s *notificationTestRunner) testMarkAllNotificationsRead() {\n\t// Subscribe to multiple notification types\n\tsubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumCommentOwnEdit,\n\t\tmodels.NotificationEnumDownvoteOwnEdit,\n\t\tmodels.NotificationEnumFailedOwnEdit,\n\t}\n\t_, err := s.client.updateNotificationSubscriptions(subscriptions)\n\tassert.NoError(s.t, err)\n\n\t// Create multiple edits and trigger multiple notifications\n\tfor i := 0; i < 3; i++ {\n\t\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\t\tassert.NoError(s.t, err)\n\n\t\t// Create a comment to trigger notification\n\t\tcommenterUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumEdit})\n\t\tassert.NoError(s.t, err)\n\n\t\tcommenterCtx := context.WithValue(s.ctx, auth.ContextUser, commenterUser)\n\t\t_, err = s.resolver.Mutation().EditComment(commenterCtx, models.EditCommentInput{\n\t\t\tID:      createdEdit.ID,\n\t\t\tComment: \"Test comment\",\n\t\t})\n\t\tassert.NoError(s.t, err)\n\t}\n\n\t// Wait for all notifications to be created (multiple notifications, so longer wait)\n\ttime.Sleep(200 * time.Millisecond)\n\n\t// Verify we have unread notifications\n\tunreadCountBefore, err := s.client.getUnreadNotificationCount()\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, unreadCountBefore >= 3, \"Should have at least 3 unread notifications\")\n\n\t// Mark all notifications as read by passing nil\n\tsuccess, err := s.client.markNotificationsRead(nil)\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, success, \"Marking all notifications as read should succeed\")\n\n\t// Verify unread count is now 0\n\tunreadCountAfter, err := s.client.getUnreadNotificationCount()\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, unreadCountAfter, 0, \"Unread count should be 0 after marking all as read\")\n\n\t// Query unread notifications and verify none are returned\n\tresult, err := s.client.queryNotifications(models.QueryNotificationsInput{\n\t\tPage:       1,\n\t\tPerPage:    25,\n\t\tUnreadOnly: pointerTo(true),\n\t})\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, len(result.Notifications), 0, \"Should have no unread notifications after marking all as read\")\n}\n\n// Helper function to create a pointer to a boolean\nfunc pointerTo[T any](v T) *T {\n\treturn &v\n}\n\nfunc TestNotificationOnCommentOwnEdit(t *testing.T) {\n\tpt := createNotificationTestRunner(t)\n\tpt.testNotificationOnCommentOwnEdit()\n}\n\nfunc TestNotificationOnDownvoteOwnEdit(t *testing.T) {\n\tpt := createNotificationTestRunner(t)\n\tpt.testNotificationOnDownvoteOwnEdit()\n}\n\nfunc TestNotificationOnFailedOwnEdit(t *testing.T) {\n\tpt := createNotificationTestRunner(t)\n\tpt.testNotificationOnFailedOwnEdit()\n}\n\nfunc TestNotificationOnAdminCancelEdit(t *testing.T) {\n\tpt := createNotificationTestRunner(t)\n\tpt.testNotificationOnAdminCancelEdit()\n}\n\nfunc TestMarkSpecificNotificationRead(t *testing.T) {\n\tpt := createNotificationTestRunner(t)\n\tpt.testMarkSpecificNotificationRead()\n}\n\nfunc TestMarkAllNotificationsRead(t *testing.T) {\n\tpt := createNotificationTestRunner(t)\n\tpt.testMarkAllNotificationsRead()\n}\n\n// testNotificationSubscriptionRoleEnforcement tests that READ users can only subscribe to favorite notification types\nfunc (s *notificationTestRunner) testNotificationSubscriptionRoleEnforcement() {\n\t// Test 1: READ user can subscribe to favorite notification types\n\treadRunner := asRead(s.t)\n\tfavoriteSubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumFavoritePerformerScene,\n\t\tmodels.NotificationEnumFavoritePerformerEdit,\n\t\tmodels.NotificationEnumFavoriteStudioScene,\n\t\tmodels.NotificationEnumFavoriteStudioEdit,\n\t}\n\n\tsuccess, err := readRunner.client.updateNotificationSubscriptions(favoriteSubscriptions)\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, success, \"READ user should be able to subscribe to favorite notification types\")\n\n\t// Verify subscriptions were actually set\n\tcurrentSubscriptions, err := readRunner.getUserNotificationSubscriptions()\n\tassert.NoError(s.t, err)\n\tassert.ElementsMatch(s.t, favoriteSubscriptions, currentSubscriptions, \"READ user should have all favorite subscriptions set\")\n\n\t// Test 2: READ user attempts to subscribe to both favorite and non-favorite types\n\t// Non-favorite types should be silently filtered out\n\tmixedSubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumFavoritePerformerScene, // favorite - should be kept\n\t\tmodels.NotificationEnumFavoriteStudioEdit,     // favorite - should be kept\n\t\tmodels.NotificationEnumCommentOwnEdit,         // non-favorite - should be filtered\n\t\tmodels.NotificationEnumDownvoteOwnEdit,        // non-favorite - should be filtered\n\t\tmodels.NotificationEnumUpdatedEdit,            // non-favorite - should be filtered\n\t\tmodels.NotificationEnumCommentCommentedEdit,   // non-favorite - should be filtered\n\t\tmodels.NotificationEnumFingerprintedSceneEdit, // non-favorite - should be filtered\n\t}\n\n\tsuccess, err = readRunner.client.updateNotificationSubscriptions(mixedSubscriptions)\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, success, \"updateNotificationSubscriptions should succeed for READ user\")\n\n\t// Verify only favorite subscriptions were set\n\tcurrentSubscriptions, err = readRunner.getUserNotificationSubscriptions()\n\tassert.NoError(s.t, err)\n\texpectedSubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumFavoritePerformerScene,\n\t\tmodels.NotificationEnumFavoriteStudioEdit,\n\t}\n\tassert.ElementsMatch(s.t, expectedSubscriptions, currentSubscriptions, \"READ user should only have favorite subscriptions set\")\n\n\t// Test 3: EDIT user can subscribe to all notification types including non-favorites\n\teditRunner := asEdit(s.t)\n\tallSubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumFavoritePerformerScene,\n\t\tmodels.NotificationEnumFavoriteStudioEdit,\n\t\tmodels.NotificationEnumCommentOwnEdit,\n\t\tmodels.NotificationEnumDownvoteOwnEdit,\n\t\tmodels.NotificationEnumUpdatedEdit,\n\t\tmodels.NotificationEnumFailedOwnEdit,\n\t\tmodels.NotificationEnumCommentCommentedEdit,\n\t\tmodels.NotificationEnumCommentVotedEdit,\n\t\tmodels.NotificationEnumFingerprintedSceneEdit,\n\t}\n\n\tsuccess, err = editRunner.client.updateNotificationSubscriptions(allSubscriptions)\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, success, \"EDIT user should be able to subscribe to all notification types\")\n\n\t// Verify all subscriptions were set\n\tcurrentSubscriptions, err = editRunner.getUserNotificationSubscriptions()\n\tassert.NoError(s.t, err)\n\tassert.ElementsMatch(s.t, allSubscriptions, currentSubscriptions, \"EDIT user should have all subscriptions set\")\n}\n\nfunc TestNotificationSubscriptionRoleEnforcement(t *testing.T) {\n\tpt := createNotificationTestRunner(t)\n\tpt.testNotificationSubscriptionRoleEnforcement()\n}\n\n// testQueryNotificationsPagination tests that pagination works correctly for queryNotifications\nfunc (s *notificationTestRunner) testQueryNotificationsPagination() {\n\t// First, mark all existing notifications as read to start fresh\n\t_, _ = s.client.markNotificationsRead(nil)\n\ttime.Sleep(100 * time.Millisecond)\n\n\t// Subscribe to comment notifications\n\tsubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumCommentOwnEdit,\n\t}\n\t_, err := s.client.updateNotificationSubscriptions(subscriptions)\n\tassert.NoError(s.t, err)\n\n\t// Create 5 edits and have different users comment on them to generate 5 notifications\n\tfor i := 0; i < 5; i++ {\n\t\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\t\tassert.NoError(s.t, err)\n\n\t\tcommenterUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumEdit})\n\t\tassert.NoError(s.t, err)\n\n\t\tcommenterCtx := context.WithValue(s.ctx, auth.ContextUser, commenterUser)\n\t\t_, err = s.resolver.Mutation().EditComment(commenterCtx, models.EditCommentInput{\n\t\t\tID:      createdEdit.ID,\n\t\t\tComment: \"Test comment\",\n\t\t})\n\t\tassert.NoError(s.t, err)\n\t}\n\n\t// Wait for all notifications to be created\n\ttime.Sleep(200 * time.Millisecond)\n\n\t// Test pagination with perPage=2\n\tperPage := 2\n\n\t// Fetch page 1\n\tpage1Result, err := s.client.queryNotifications(models.QueryNotificationsInput{\n\t\tPage:       1,\n\t\tPerPage:    perPage,\n\t\tUnreadOnly: pointerTo(true),\n\t})\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 5, page1Result.Count, \"Total count should be 5\")\n\tassert.Equal(s.t, 2, len(page1Result.Notifications), \"Page 1 should have 2 notifications\")\n\n\t// Fetch page 2\n\tpage2Result, err := s.client.queryNotifications(models.QueryNotificationsInput{\n\t\tPage:       2,\n\t\tPerPage:    perPage,\n\t\tUnreadOnly: pointerTo(true),\n\t})\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 5, page2Result.Count, \"Total count should still be 5\")\n\tassert.Equal(s.t, 2, len(page2Result.Notifications), \"Page 2 should have 2 notifications\")\n\n\t// Fetch page 3\n\tpage3Result, err := s.client.queryNotifications(models.QueryNotificationsInput{\n\t\tPage:       3,\n\t\tPerPage:    perPage,\n\t\tUnreadOnly: pointerTo(true),\n\t})\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 5, page3Result.Count, \"Total count should still be 5\")\n\tassert.Equal(s.t, 1, len(page3Result.Notifications), \"Page 3 should have 1 notification\")\n\n\t// Verify no overlap between pages by comparing timestamps\n\t// Since notifications are ordered by created_at DESC, page 1 should have newer or equal timestamps than page 2\n\tif len(page1Result.Notifications) > 0 && len(page2Result.Notifications) > 0 {\n\t\tlastPage1Time := page1Result.Notifications[len(page1Result.Notifications)-1].Created\n\t\tfirstPage2Time := page2Result.Notifications[0].Created\n\t\t// String comparison works for ISO8601 timestamps\n\t\tassert.True(s.t, lastPage1Time >= firstPage2Time,\n\t\t\t\"Page 1 last notification should be newer or equal to page 2 first notification\")\n\t}\n\n\t// Test page beyond available data\n\tpage4Result, err := s.client.queryNotifications(models.QueryNotificationsInput{\n\t\tPage:       4,\n\t\tPerPage:    perPage,\n\t\tUnreadOnly: pointerTo(true),\n\t})\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 5, page4Result.Count, \"Total count should still be 5\")\n\tassert.Equal(s.t, 0, len(page4Result.Notifications), \"Page 4 should have 0 notifications\")\n}\n\nfunc TestQueryNotificationsPagination(t *testing.T) {\n\tpt := createNotificationTestRunner(t)\n\tpt.testQueryNotificationsPagination()\n}\n\n// testQueryNotificationsTypeFilter tests that the type filter works correctly\nfunc (s *notificationTestRunner) testQueryNotificationsTypeFilter() {\n\t// First, mark all existing notifications as read to have a clean slate\n\t_, _ = s.client.markNotificationsRead(nil)\n\ttime.Sleep(100 * time.Millisecond)\n\n\t// Subscribe to multiple notification types\n\tsubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumCommentOwnEdit,\n\t\tmodels.NotificationEnumDownvoteOwnEdit,\n\t}\n\t_, err := s.client.updateNotificationSubscriptions(subscriptions)\n\tassert.NoError(s.t, err)\n\n\t// Create an edit to trigger notifications\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Create a comment to trigger COMMENT_OWN_EDIT notification\n\tcommenterUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumEdit})\n\tassert.NoError(s.t, err)\n\n\tcommenterCtx := context.WithValue(s.ctx, auth.ContextUser, commenterUser)\n\t_, err = s.resolver.Mutation().EditComment(commenterCtx, models.EditCommentInput{\n\t\tID:      createdEdit.ID,\n\t\tComment: \"Test comment\",\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Create a downvote to trigger DOWNVOTE_OWN_EDIT notification\n\tvoterUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumVote})\n\tassert.NoError(s.t, err)\n\n\tvoterCtx := context.WithValue(s.ctx, auth.ContextUser, voterUser)\n\t_, err = s.resolver.Mutation().EditVote(voterCtx, models.EditVoteInput{\n\t\tID:   createdEdit.ID,\n\t\tVote: models.VoteTypeEnumReject,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Wait for notifications to be created\n\ttime.Sleep(200 * time.Millisecond)\n\n\t// Query all notifications (no type filter)\n\tallResult, err := s.client.queryNotifications(models.QueryNotificationsInput{\n\t\tPage:       1,\n\t\tPerPage:    25,\n\t\tUnreadOnly: pointerTo(true),\n\t})\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 2, allResult.Count, \"Should have exactly 2 notifications total\")\n\tassert.Equal(s.t, 2, len(allResult.Notifications), \"Should return exactly 2 notifications\")\n\n\t// Query only COMMENT_OWN_EDIT notifications\n\tcommentNotificationType := models.NotificationEnumCommentOwnEdit\n\tcommentResult, err := s.client.queryNotifications(models.QueryNotificationsInput{\n\t\tPage:       1,\n\t\tPerPage:    25,\n\t\tType:       &commentNotificationType,\n\t\tUnreadOnly: pointerTo(true),\n\t})\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 1, commentResult.Count, \"Should have exactly 1 COMMENT_OWN_EDIT notification\")\n\tassert.Equal(s.t, 1, len(commentResult.Notifications), \"Should return exactly 1 COMMENT_OWN_EDIT notification\")\n\n\t// Query only DOWNVOTE_OWN_EDIT notifications\n\tdownvoteNotificationType := models.NotificationEnumDownvoteOwnEdit\n\tdownvoteResult, err := s.client.queryNotifications(models.QueryNotificationsInput{\n\t\tPage:       1,\n\t\tPerPage:    25,\n\t\tType:       &downvoteNotificationType,\n\t\tUnreadOnly: pointerTo(true),\n\t})\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 1, downvoteResult.Count, \"Should have exactly 1 DOWNVOTE_OWN_EDIT notification\")\n\tassert.Equal(s.t, 1, len(downvoteResult.Notifications), \"Should return exactly 1 DOWNVOTE_OWN_EDIT notification\")\n\n\t// Verify the sum of filtered notifications equals the total\n\ttotalFiltered := commentResult.Count + downvoteResult.Count\n\tassert.Equal(s.t, allResult.Count, totalFiltered, \"Sum of filtered notifications should equal total notifications\")\n}\n\nfunc TestQueryNotificationsTypeFilter(t *testing.T) {\n\tpt := createNotificationTestRunner(t)\n\tpt.testQueryNotificationsTypeFilter()\n}\n\n// testNotificationOnFavoriteStudioScene tests that a FAVORITE_STUDIO_SCENE notification is created\n// when a scene is created for a studio that the user has favorited and the edit is approved via voting\nfunc (s *notificationTestRunner) testNotificationOnFavoriteStudioScene() {\n\t// Create a studio using the admin user\n\tadminRunner := asAdmin(s.t)\n\tstudio, err := adminRunner.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\tstudioID := studio.UUID()\n\n\t// Create a subscriber user who will favorite the studio\n\tsubscriberUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumEdit})\n\tassert.NoError(s.t, err)\n\n\t// Create a runner for the subscriber to make GraphQL calls\n\tsubscriberRunner := createTestRunner(s.t, subscriberUser, []models.RoleEnum{models.RoleEnumEdit})\n\n\t// Subscriber favorites the studio\n\t_, err = subscriberRunner.client.favoriteStudio(studioID, true)\n\tassert.NoError(s.t, err)\n\n\t// Subscriber subscribes to FAVORITE_STUDIO_SCENE notifications\n\tsubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumFavoriteStudioScene,\n\t}\n\t_, err = subscriberRunner.client.updateNotificationSubscriptions(subscriptions)\n\tassert.NoError(s.t, err)\n\n\t// Create an editor user who will submit the scene edit\n\teditorUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumEdit})\n\tassert.NoError(s.t, err)\n\n\teditorRunner := createTestRunner(s.t, editorUser, []models.RoleEnum{models.RoleEnumEdit})\n\n\t// Editor creates a scene edit with the favorited studio\n\ttitle := editorRunner.generateSceneName()\n\tsceneEditDetailsInput := models.SceneEditDetailsInput{\n\t\tTitle:    &title,\n\t\tStudioID: &studioID,\n\t}\n\tcreatedEdit, err := editorRunner.createTestSceneEdit(models.OperationEnumCreate, &sceneEditDetailsInput, nil)\n\tassert.NoError(s.t, err)\n\n\t// Have 3 voters vote to approve the edit (reaching the threshold)\n\tfor i := 1; i <= 3; i++ {\n\t\tvoterUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumVote})\n\t\tassert.NoError(s.t, err)\n\n\t\tvoterCtx := context.WithValue(s.ctx, auth.ContextUser, voterUser)\n\t\t_, err = s.resolver.Mutation().EditVote(voterCtx, models.EditVoteInput{\n\t\t\tID:   createdEdit.ID,\n\t\t\tVote: models.VoteTypeEnumAccept,\n\t\t})\n\t\tassert.NoError(s.t, err)\n\t}\n\n\t// Small delay to ensure notification is created (notifications are triggered asynchronously)\n\ttime.Sleep(200 * time.Millisecond)\n\n\t// Query notifications and verify the notification type\n\tnotificationType := models.NotificationEnumFavoriteStudioScene\n\tresult, err := subscriberRunner.client.queryNotifications(models.QueryNotificationsInput{\n\t\tPage:       1,\n\t\tPerPage:    25,\n\t\tType:       &notificationType,\n\t\tUnreadOnly: pointerTo(true),\n\t})\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 1, len(result.Notifications), \"Subscriber should have exactly one FAVORITE_STUDIO_SCENE notification\")\n}\n\nfunc TestNotificationOnFavoriteStudioScene(t *testing.T) {\n\tpt := createNotificationTestRunner(t)\n\tpt.testNotificationOnFavoriteStudioScene()\n}\n"
  },
  {
    "path": "internal/api/performer_edit_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype performerEditTestRunner struct {\n\ttestRunner\n}\n\nfunc contains(slice []uuid.UUID, item uuid.UUID) bool {\n\tfor _, v := range slice {\n\t\tif v == item {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc createPerformerEditTestRunner(t *testing.T) *performerEditTestRunner {\n\treturn &performerEditTestRunner{\n\t\ttestRunner: *asAdmin(t),\n\t}\n}\n\nfunc (s *performerEditTestRunner) compareBodyModifications(input []models.BodyModificationInput, actual []models.BodyModification) {\n\tassert.Equal(s.t, len(input), len(actual))\n\tfor i, inp := range input {\n\t\tassert.Equal(s.t, inp.Location, actual[i].Location)\n\t\tif inp.Description == nil {\n\t\t\tassert.Nil(s.t, actual[i].Description)\n\t\t} else {\n\t\t\tassert.Equal(s.t, *inp.Description, *actual[i].Description)\n\t\t}\n\t}\n}\n\nfunc (s *performerEditTestRunner) testCreatePerformerEdit() {\n\tperformerEditDetailsInput := s.createPerformerEditDetailsInput()\n\tedit, err := s.createTestPerformerEdit(models.OperationEnumCreate, performerEditDetailsInput, nil, nil)\n\tassert.NoError(s.t, err)\n\ts.verifyCreatedPerformerEdit(*performerEditDetailsInput, edit)\n}\n\nfunc (s *performerEditTestRunner) verifyCreatedPerformerEdit(input models.PerformerEditDetailsInput, edit *models.Edit) {\n\tassert.True(s.t, edit.ID != uuid.Nil, \"Expected created edit id to be non-zero\")\n\n\ts.verifyEditOperation(models.OperationEnumCreate.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumPerformer.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\ts.verifyPerformerEditDetails(input, edit)\n}\n\nfunc (s *performerEditTestRunner) testFindEditById() {\n\tcreatedEdit, err := s.createTestPerformerEdit(models.OperationEnumCreate, nil, nil, nil)\n\tassert.NoError(s.t, err)\n\n\teditID := createdEdit.ID\n\tedit, err := s.resolver.Query().FindEdit(s.ctx, editID)\n\tassert.NoError(s.t, err, \"Error finding edit: %s\")\n\tassert.NotNil(s.t, edit, \"Did not find edit by id\")\n}\n\nfunc (s *performerEditTestRunner) testModifyPerformerEdit() {\n\texistingName := \"performerName\"\n\n\texistingBirthdate := \"1990-01-02\"\n\texistingDeathdate := \"2024-11-22\"\n\tperformerCreateInput := models.PerformerCreateInput{\n\t\tName:      existingName,\n\t\tBirthdate: &existingBirthdate,\n\t\tDeathdate: &existingDeathdate,\n\t}\n\tcreatedPerformer, err := s.createTestPerformer(&performerCreateInput)\n\tassert.NoError(s.t, err)\n\n\tperformerEditDetailsInput := s.createPerformerEditDetailsInput()\n\tid := createdPerformer.UUID()\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &id,\n\t}\n\n\tcreatedUpdateEdit, err := s.createTestPerformerEdit(models.OperationEnumModify, performerEditDetailsInput, &editInput, nil)\n\tassert.NoError(s.t, err)\n\n\ts.verifyUpdatedPerformerEdit(createdPerformer, *performerEditDetailsInput, createdUpdateEdit)\n}\n\nfunc (s *performerEditTestRunner) verifyUpdatedPerformerEdit(originalPerformer *performerOutput, input models.PerformerEditDetailsInput, edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumModify.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumPerformer.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\ts.verifyPerformerEditDetails(input, edit)\n}\n\nfunc (s *performerEditTestRunner) verifyPerformerEditDetails(input models.PerformerEditDetailsInput, edit *models.Edit) {\n\tperformerDetails := s.getEditPerformerDetails(edit)\n\n\tc := fieldComparator{r: &s.testRunner}\n\tc.strPtrStrPtr(input.Name, performerDetails.Name, \"Name\")\n\tc.strPtrStrPtr(input.Disambiguation, performerDetails.Disambiguation, \"Disambiguation\")\n\tc.strPtrStrPtr(input.Birthdate, performerDetails.Birthdate, \"Birthdate\")\n\tc.strPtrStrPtr(input.Deathdate, performerDetails.Deathdate, \"Deathdate\")\n\n\tassert.Equal(s.t, input.Aliases, performerDetails.AddedAliases)\n\n\tif input.Gender == nil {\n\t\tassert.Nil(s.t, performerDetails.Gender)\n\t} else {\n\t\tassert.True(s.t, input.Gender.IsValid() && (input.Gender.String() == *performerDetails.Gender))\n\t}\n\n\tassert.Equal(s.t, input.Urls, performerDetails.AddedUrls)\n\n\tif input.Ethnicity == nil {\n\t\tassert.Nil(s.t, performerDetails.Ethnicity)\n\t} else {\n\t\tassert.True(s.t, input.Ethnicity.IsValid() && (input.Ethnicity.String() == *performerDetails.Ethnicity))\n\t}\n\n\tif input.Country == nil {\n\t\tassert.Nil(s.t, performerDetails.Country)\n\t} else {\n\t\tassert.True(s.t, *input.Country == *performerDetails.Country)\n\t}\n\n\tif input.EyeColor == nil {\n\t\tassert.Nil(s.t, performerDetails.EyeColor)\n\t} else {\n\t\tassert.True(s.t, input.EyeColor.IsValid() && (input.EyeColor.String() == *performerDetails.EyeColor))\n\t}\n\n\tif input.HairColor == nil {\n\t\tassert.Nil(s.t, performerDetails.HairColor)\n\t} else {\n\t\tassert.True(s.t, input.HairColor.IsValid() && (input.HairColor.String() == *performerDetails.HairColor))\n\t}\n\n\tif input.Height == nil {\n\t\tassert.Nil(s.t, performerDetails.Height)\n\t} else {\n\t\tassert.True(s.t, *input.Height == *performerDetails.Height)\n\t}\n\n\tif input.BandSize == nil {\n\t\tassert.Nil(s.t, performerDetails.BandSize)\n\t} else {\n\t\tassert.True(s.t, *input.BandSize == *performerDetails.BandSize)\n\t}\n\n\tif input.WaistSize == nil {\n\t\tassert.Nil(s.t, performerDetails.WaistSize)\n\t} else {\n\t\tassert.True(s.t, *input.WaistSize == *performerDetails.WaistSize)\n\t}\n\n\tif input.HipSize == nil {\n\t\tassert.Nil(s.t, performerDetails.HipSize)\n\t} else {\n\t\tassert.True(s.t, *input.HipSize == *performerDetails.HipSize)\n\t}\n\n\tif input.CupSize == nil {\n\t\tassert.Nil(s.t, performerDetails.CupSize)\n\t} else {\n\t\tassert.True(s.t, *input.CupSize == *performerDetails.CupSize)\n\t}\n\n\tif input.BreastType == nil {\n\t\tassert.Nil(s.t, performerDetails.BreastType)\n\t} else {\n\t\tassert.True(s.t, input.BreastType.IsValid() && (input.BreastType.String() == *performerDetails.BreastType))\n\t}\n\n\tif input.CareerStartYear == nil {\n\t\tassert.Nil(s.t, performerDetails.CareerStartYear)\n\t} else {\n\t\tassert.True(s.t, *input.CareerStartYear == *performerDetails.CareerStartYear)\n\t}\n\n\tif input.CareerEndYear == nil {\n\t\tassert.Nil(s.t, performerDetails.CareerEndYear)\n\t} else {\n\t\tassert.True(s.t, *input.CareerEndYear == *performerDetails.CareerEndYear)\n\t}\n\ts.compareBodyModifications(input.Tattoos, performerDetails.AddedTattoos)\n\ts.compareBodyModifications(input.Piercings, performerDetails.AddedPiercings)\n\tassert.Equal(s.t, input.ImageIds, performerDetails.AddedImages)\n}\n\nfunc (s *performerEditTestRunner) verifyPerformerEdit(input models.PerformerEditDetailsInput, performer *models.Performer) {\n\tresolver := s.resolver.Performer()\n\n\tassert.True(s.t, input.Name == nil || (*input.Name == performer.Name))\n\n\tif input.Disambiguation == nil {\n\t\tassert.Nil(s.t, performer.Disambiguation)\n\t} else {\n\t\tassert.Equal(s.t, *input.Disambiguation, *performer.Disambiguation)\n\t}\n\n\taliases, _ := resolver.Aliases(s.ctx, performer)\n\tif len(input.Aliases) == 0 {\n\t\tassert.True(s.t, len(aliases) == 0)\n\t} else {\n\t\tassert.Equal(s.t, input.Aliases, aliases)\n\t}\n\n\tif input.Gender == nil {\n\t\tassert.Nil(s.t, performer.Gender)\n\t} else {\n\t\tassert.Equal(s.t, input.Gender.String(), performer.Gender.String())\n\t}\n\n\turls, _ := resolver.Urls(s.ctx, performer)\n\tassert.Equal(s.t, input.Urls, urls)\n\n\tif input.Birthdate == nil {\n\t\tassert.Nil(s.t, performer.BirthDate)\n\t} else {\n\t\tassert.Equal(s.t, *input.Birthdate, *performer.BirthDate)\n\t}\n\n\tif input.Deathdate == nil {\n\t\tassert.Nil(s.t, performer.DeathDate)\n\t} else {\n\t\tassert.Equal(s.t, *input.Deathdate, *performer.DeathDate)\n\t}\n\n\tif input.Ethnicity == nil {\n\t\tassert.Nil(s.t, performer.Ethnicity)\n\t} else {\n\t\tassert.Equal(s.t, input.Ethnicity.String(), performer.Ethnicity.String())\n\t}\n\n\tif input.Country == nil {\n\t\tassert.Nil(s.t, performer.Country)\n\t} else {\n\t\tassert.Equal(s.t, *input.Country, *performer.Country)\n\t}\n\n\tif input.EyeColor == nil {\n\t\tassert.Nil(s.t, performer.EyeColor)\n\t} else {\n\t\tassert.Equal(s.t, input.EyeColor.String(), performer.EyeColor.String())\n\t}\n\n\tif input.HairColor == nil {\n\t\tassert.Nil(s.t, performer.HairColor)\n\t} else {\n\t\tassert.Equal(s.t, input.HairColor.String(), performer.HairColor.String())\n\t}\n\n\tif input.Height == nil {\n\t\tassert.Nil(s.t, performer.Height)\n\t} else {\n\t\tassert.Equal(s.t, *input.Height, *performer.Height)\n\t}\n\n\tif input.BandSize == nil {\n\t\tassert.Nil(s.t, performer.BandSize)\n\t} else {\n\t\tassert.Equal(s.t, *input.BandSize, *performer.BandSize)\n\t}\n\n\tif input.CupSize == nil {\n\t\tassert.Nil(s.t, performer.CupSize)\n\t} else {\n\t\tassert.Equal(s.t, *input.CupSize, *performer.CupSize)\n\t}\n\n\tif input.WaistSize == nil {\n\t\tassert.Nil(s.t, performer.WaistSize)\n\t} else {\n\t\tassert.Equal(s.t, *input.WaistSize, *performer.WaistSize)\n\t}\n\n\tif input.HipSize == nil {\n\t\tassert.Nil(s.t, performer.HipSize)\n\t} else {\n\t\tassert.Equal(s.t, *input.HipSize, *performer.HipSize)\n\t}\n\n\tif input.BreastType == nil {\n\t\tassert.Nil(s.t, performer.BreastType)\n\t} else {\n\t\tassert.Equal(s.t, input.BreastType.String(), performer.BreastType.String())\n\t}\n\n\tif input.CareerStartYear == nil {\n\t\tassert.Nil(s.t, performer.CareerStartYear)\n\t} else {\n\t\tassert.Equal(s.t, *input.CareerStartYear, *performer.CareerStartYear)\n\t}\n\n\tif input.CareerEndYear == nil {\n\t\tassert.Nil(s.t, performer.CareerEndYear)\n\t} else {\n\t\tassert.Equal(s.t, *input.CareerEndYear, *performer.CareerEndYear)\n\t}\n\n\ttattoos, _ := resolver.Tattoos(s.ctx, performer)\n\tif len(input.Tattoos) == 0 {\n\t\tassert.True(s.t, len(tattoos) == 0)\n\t} else {\n\t\ts.compareBodyModifications(input.Tattoos, tattoos)\n\t}\n\n\tpiercings, _ := resolver.Piercings(s.ctx, performer)\n\tif len(input.Piercings) == 0 {\n\t\tassert.True(s.t, len(piercings) == 0)\n\t} else {\n\t\ts.compareBodyModifications(input.Piercings, piercings)\n\t}\n\n\timages, _ := resolver.Images(s.ctx, performer)\n\tvar imageIds []uuid.UUID\n\tfor _, image := range images {\n\t\timageIds = append(imageIds, image.ID)\n\t}\n\tassert.Equal(s.t, input.ImageIds, imageIds)\n}\n\nfunc (s *performerEditTestRunner) testDestroyPerformerEdit() {\n\tcreatedPerformer, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tperformerID := createdPerformer.UUID()\n\n\tperformerEditDetailsInput := models.PerformerEditDetailsInput{}\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumDestroy,\n\t\tID:        &performerID,\n\t}\n\tdestroyEdit, err := s.createTestPerformerEdit(models.OperationEnumDestroy, &performerEditDetailsInput, &editInput, nil)\n\tassert.NoError(s.t, err)\n\n\ts.verifyDestroyPerformerEdit(performerID, destroyEdit)\n}\n\nfunc (s *performerEditTestRunner) verifyDestroyPerformerEdit(performerID uuid.UUID, edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumDestroy.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumPerformer.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\teditTarget := s.getEditPerformerTarget(edit)\n\n\tassert.Equal(s.t, performerID, editTarget.ID)\n}\n\nfunc (s *performerEditTestRunner) testMergePerformerEdit() {\n\texistingName := \"performerName2\"\n\texistingAlias := \"performerAlias2\"\n\tperformerCreateInput := models.PerformerCreateInput{\n\t\tName:    existingName,\n\t\tAliases: []string{existingAlias},\n\t}\n\tcreatedPrimaryPerformer, err := s.createTestPerformer(&performerCreateInput)\n\tassert.NoError(s.t, err)\n\n\tcreatedMergePerformer, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tperformerEditDetailsInput := s.createPerformerEditDetailsInput()\n\tid := createdPrimaryPerformer.UUID()\n\tmergeSources := []uuid.UUID{createdMergePerformer.UUID()}\n\teditInput := models.EditInput{\n\t\tOperation:      models.OperationEnumMerge,\n\t\tID:             &id,\n\t\tMergeSourceIds: mergeSources,\n\t}\n\n\tcreatedMergeEdit, err := s.createTestPerformerEdit(models.OperationEnumMerge, performerEditDetailsInput, &editInput, nil)\n\tassert.NoError(s.t, err)\n\n\ts.verifyMergePerformerEdit(createdPrimaryPerformer, *performerEditDetailsInput, createdMergeEdit, mergeSources)\n}\n\nfunc (s *performerEditTestRunner) verifyMergePerformerEdit(originalPerformer *performerOutput, input models.PerformerEditDetailsInput, edit *models.Edit, inputMergeSources []uuid.UUID) {\n\ts.verifyEditOperation(models.OperationEnumMerge.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumPerformer.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\ts.verifyPerformerEditDetails(input, edit)\n\n\tvar mergeSources []uuid.UUID\n\tmerges, _ := s.resolver.Edit().MergeSources(s.ctx, edit)\n\tfor i := range merges {\n\t\tmerge := merges[i].(*models.Performer)\n\t\tmergeSources = append(mergeSources, merge.ID)\n\t}\n\tassert.Equal(s.t, inputMergeSources, mergeSources)\n}\n\nfunc (s *performerEditTestRunner) testApplyCreatePerformerEdit() {\n\tperformerEditDetailsInput := s.createPerformerEditDetailsInput()\n\tedit, err := s.createTestPerformerEdit(models.OperationEnumCreate, performerEditDetailsInput, nil, nil)\n\tassert.NoError(s.t, err)\n\n\tappliedEdit, err := s.applyEdit(edit.ID)\n\tassert.NoError(s.t, err)\n\ts.verifyAppliedPerformerCreateEdit(*performerEditDetailsInput, appliedEdit)\n}\n\nfunc (s *performerEditTestRunner) verifyAppliedPerformerCreateEdit(input models.PerformerEditDetailsInput, edit *models.Edit) {\n\tassert.True(s.t, edit.ID != uuid.Nil, \"Expected created edit id to be non-zero\")\n\n\ts.verifyEditOperation(models.OperationEnumCreate.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumPerformer.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\tperformer := s.getEditPerformerTarget(edit)\n\ts.verifyPerformerEdit(input, performer)\n}\n\nfunc (s *performerEditTestRunner) testApplyModifyPerformerEdit() {\n\tsite, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tperformerCreateInput := models.PerformerCreateInput{\n\t\tName:    \"performerName3\",\n\t\tAliases: []string{\"modfied performer alias\"},\n\t\tTattoos: []models.BodyModificationInput{\n\t\t\t{\n\t\t\t\tLocation: \"some tattoo location\",\n\t\t\t},\n\t\t},\n\t\tPiercings: []models.BodyModificationInput{\n\t\t\t{\n\t\t\t\tLocation: \"some piercing location\",\n\t\t\t},\n\t\t},\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"http://example.org/asd\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t}\n\tcreatedPerformer, err := s.createTestPerformer(&performerCreateInput)\n\tassert.NoError(s.t, err)\n\n\t// Create edit that replaces all metadata for the performer\n\tperformerEditDetailsInput := s.createPerformerEditDetailsInput()\n\tid := createdPerformer.UUID()\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &id,\n\t}\n\n\tcreatedUpdateEdit, err := s.createTestPerformerEdit(models.OperationEnumModify, performerEditDetailsInput, &editInput, nil)\n\tassert.NoError(s.t, err)\n\n\tappliedEdit, err := s.applyEdit(createdUpdateEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tmodifiedPerformer, _ := s.resolver.Query().FindPerformer(s.ctx, id)\n\n\ts.verifyAppliedPerformerEdit(appliedEdit)\n\ts.verifyPerformerEdit(*performerEditDetailsInput, modifiedPerformer)\n}\n\nfunc (s *performerEditTestRunner) testApplyModifyPerformerWithoutAliases() {\n\tcreatedPerformer, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tsceneAppearance := models.PerformerAppearanceInput{\n\t\tPerformerID: createdPerformer.UUID(),\n\t}\n\n\tsceneInput := models.SceneCreateInput{\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\tsceneAppearance,\n\t\t},\n\t\tDate: \"2020-01-02\",\n\t}\n\tscene, err := s.createTestScene(&sceneInput)\n\tassert.NoError(s.t, err)\n\n\tperformerEditDetailsInput := s.createPerformerEditDetailsInput()\n\tid := createdPerformer.UUID()\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &id,\n\t}\n\n\tcreatedUpdateEdit, err := s.createTestPerformerEdit(models.OperationEnumModify, performerEditDetailsInput, &editInput, nil)\n\tassert.NoError(s.t, err)\n\n\t_, err = s.applyEdit(createdUpdateEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tscene, err = s.client.findScene(scene.UUID())\n\tassert.NoError(s.t, err, \"Error finding scene\")\n\n\ts.verifyPerformanceAlias(scene, nil)\n\n\tperformer, err := s.client.findPerformer(id)\n\tassert.NoError(s.t, err, \"Error finding performer\")\n\n\tperformerEditDetailsInput = s.createPerformerEditDetailsInput()\n\teditInput = models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &id,\n\t}\n\n\taliasVal := true\n\toptions := models.PerformerEditOptionsInput{\n\t\tSetModifyAliases: &aliasVal,\n\t}\n\n\tcreatedUpdateEdit, err = s.createTestPerformerEdit(models.OperationEnumModify, performerEditDetailsInput, &editInput, &options)\n\tassert.NoError(s.t, err)\n\n\t_, err = s.applyEdit(createdUpdateEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tscene, err = s.client.findScene(scene.UUID())\n\tassert.NoError(s.t, err, \"Error finding scene\")\n\n\t// set modify aliases was set to true - this should be set to the old name\n\ts.verifyPerformanceAlias(scene, &performer.Name)\n}\n\nfunc (s *performerEditTestRunner) testApplyModifyPerformerWithAliases() {\n\tcreatedPerformer, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tsceneAppearance := models.PerformerAppearanceInput{\n\t\tPerformerID: createdPerformer.UUID(),\n\t}\n\n\tsceneInput := models.SceneCreateInput{\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\tsceneAppearance,\n\t\t},\n\t\tDate: \"2020-01-02\",\n\t}\n\tscene, err := s.createTestScene(&sceneInput)\n\tassert.NoError(s.t, err)\n\n\tperformerEditDetailsInput := s.createPerformerEditDetailsInput()\n\tid := createdPerformer.UUID()\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &id,\n\t}\n\n\taliasVal := true\n\toptions := models.PerformerEditOptionsInput{\n\t\tSetModifyAliases: &aliasVal,\n\t}\n\n\tcreatedUpdateEdit, err := s.createTestPerformerEdit(models.OperationEnumModify, performerEditDetailsInput, &editInput, &options)\n\tassert.NoError(s.t, err)\n\n\t_, err = s.applyEdit(createdUpdateEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tscene, err = s.client.findScene(scene.UUID())\n\tassert.NoError(s.t, err, \"Error finding scene\")\n\n\ts.verifyPerformanceAlias(scene, &createdPerformer.Name)\n}\n\nfunc (s *performerEditTestRunner) testApplyModifyUnsetPerformerEdit() {\n\tperformerData := s.createFullPerformerCreateInput()\n\tcreatedPerformer, err := s.createTestPerformer(performerData)\n\tassert.NoError(s.t, err)\n\n\tid := createdPerformer.UUID()\n\n\tvar resp struct {\n\t\tPerformerEdit struct {\n\t\t\tID string\n\t\t}\n\t}\n\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tmutation {\n\t\t\tperformerEdit(input: {\n\t\t\t\tedit: {id: \"%v\", operation: MODIFY}\n\t\t\t\tdetails: { aliases: [], tattoos: [], piercings: [], urls: [], disambiguation: null }\n\t\t\t}) {\n\t\t\t\tid\n\t\t\t}\n\t\t}\n\t`, id), &resp)\n\n\tedit, _ := s.applyEdit(uuid.FromStringOrNil(resp.PerformerEdit.ID))\n\ts.verifyAppliedPerformerEdit(edit)\n\n\tvar performer struct {\n\t\tFindPerformer struct {\n\t\t\tHeight         int\n\t\t\tID             string\n\t\t\tDisambiguation string\n\t\t\tAliases        []string\n\t\t\tURLs           []models.URL\n\t\t\tPiercings      []models.BodyModification\n\t\t\tTattoos        []models.BodyModification\n\t\t}\n\t}\n\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tquery {\n\t\t\tfindPerformer(id: \"%v\") {\n\t\t\t\tdisambiguation\n\t\t\t\theight\n\t\t\t\taliases\n\t\t\t\turls {\n\t\t\t\t\turl\n\t\t\t\t}\n\t\t\t\tpiercings {\n\t\t\t\t\tlocation\n\t\t\t\t}\n\t\t\t\ttattoos {\n\t\t\t\t\tlocation\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`, id), &performer)\n\n\tassert.Equal(s.t, performer.FindPerformer.Disambiguation, \"\")\n\tassert.Equal(s.t, performer.FindPerformer.Height, *performerData.Height)\n\tassert.True(s.t, len(performer.FindPerformer.Aliases) == 0)\n\tassert.True(s.t, len(performer.FindPerformer.URLs) == 0)\n\tassert.True(s.t, len(performer.FindPerformer.Piercings) == 0)\n\tassert.True(s.t, len(performer.FindPerformer.Tattoos) == 0)\n}\n\nfunc (s *performerEditTestRunner) testApplyDestroyPerformerEdit() {\n\tcreatedPerformer, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tperformerID := createdPerformer.UUID()\n\tappearance := models.PerformerAppearanceInput{\n\t\tPerformerID: performerID,\n\t}\n\tsceneInput := models.SceneCreateInput{\n\t\tPerformers: []models.PerformerAppearanceInput{appearance},\n\t\tDate:       \"2020-03-02\",\n\t}\n\tscene, _ := s.createTestScene(&sceneInput)\n\n\tperformerEditDetailsInput := models.PerformerEditDetailsInput{}\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumDestroy,\n\t\tID:        &performerID,\n\t}\n\tdestroyEdit, err := s.createTestPerformerEdit(models.OperationEnumDestroy, &performerEditDetailsInput, &editInput, nil)\n\tassert.NoError(s.t, err)\n\n\tappliedEdit, err := s.applyEdit(destroyEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tdestroyedPerformer, err := s.resolver.Query().FindPerformer(s.ctx, performerID)\n\tassert.NoError(s.t, err)\n\n\tscene, err = s.client.findScene(scene.UUID())\n\tassert.NoError(s.t, err, \"Error finding scene\")\n\n\ts.verifyApplyDestroyPerformerEdit(destroyedPerformer, appliedEdit, scene)\n}\n\nfunc (s *performerEditTestRunner) verifyApplyDestroyPerformerEdit(destroyedPerformer *models.Performer, edit *models.Edit, scene *sceneOutput) {\n\ts.verifyEditOperation(models.OperationEnumDestroy.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumPerformer.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\tassert.True(s.t, destroyedPerformer.Deleted, true)\n\n\tscenePerformers := scene.Performers\n\tassert.True(s.t, len(scenePerformers) == 0)\n}\n\nfunc (s *performerEditTestRunner) testApplyMergePerformerEdit() {\n\tmergeSource1, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tmergeSource2, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tmergeTarget, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tmergeSource1Appearance := models.PerformerAppearanceInput{\n\t\tPerformerID: mergeSource1.UUID(),\n\t}\n\tmergeSource2Appearance := models.PerformerAppearanceInput{\n\t\tPerformerID: mergeSource2.UUID(),\n\t}\n\tmergeTargetAppearance := models.PerformerAppearanceInput{\n\t\tPerformerID: mergeTarget.UUID(),\n\t}\n\t// Scene with performer from both source and target, should not cause db unique error\n\tsceneInput := models.SceneCreateInput{\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\tmergeSource2Appearance,\n\t\t\tmergeTargetAppearance,\n\t\t},\n\t\tDate: \"2020-02-03\",\n\t}\n\tscene1, err := s.createTestScene(&sceneInput)\n\tassert.NoError(s.t, err)\n\n\tsceneInput = models.SceneCreateInput{\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\tmergeSource1Appearance,\n\t\t\tmergeSource2Appearance,\n\t\t},\n\t\tDate: \"2020-03-02\",\n\t}\n\tscene2, err := s.createTestScene(&sceneInput)\n\tassert.NoError(s.t, err)\n\n\tperformerEditDetailsInput := s.createPerformerEditDetailsInput()\n\tmergeSources := []uuid.UUID{\n\t\tmergeSource1.UUID(),\n\t\tmergeSource2.UUID(),\n\t}\n\tsetMergeAliases := true\n\toptions := models.PerformerEditOptionsInput{\n\t\tSetMergeAliases: &setMergeAliases,\n\t}\n\n\tid := mergeTarget.UUID()\n\teditInput := models.EditInput{\n\t\tOperation:      models.OperationEnumMerge,\n\t\tID:             &id,\n\t\tMergeSourceIds: mergeSources,\n\t}\n\n\tmergeEdit, err := s.createTestPerformerEdit(models.OperationEnumMerge, performerEditDetailsInput, &editInput, &options)\n\tassert.NoError(s.t, err)\n\n\tappliedMerge, err := s.applyEdit(mergeEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tscene1, err = s.client.findScene(scene1.UUID())\n\tassert.NoError(s.t, err, \"Error finding scene\")\n\n\tscene2, err = s.client.findScene(scene2.UUID())\n\tassert.NoError(s.t, err, \"Error finding scene\")\n\n\ts.verifyAppliedMergePerformerEdit(*performerEditDetailsInput, appliedMerge, scene1, scene2)\n\t// Target already attached, so should not get alias\n\ts.verifyPerformanceAlias(scene1, nil)\n\ts.verifyPerformanceAlias(scene2, &mergeSource1.Name)\n\n\t// Verify merged_ids and merged_into_id fields\n\ttargetPerformer, err := s.resolver.Query().FindPerformer(s.ctx, mergeTarget.UUID())\n\tassert.NoError(s.t, err)\n\n\tmergedIds, err := s.resolver.Performer().MergedIds(s.ctx, targetPerformer)\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 2, len(mergedIds), \"Target should have 2 performers merged into it\")\n\tassert.True(s.t, contains(mergedIds, mergeSource1.UUID()), \"Target should contain source1 in merged_ids\")\n\tassert.True(s.t, contains(mergedIds, mergeSource2.UUID()), \"Target should contain source2 in merged_ids\")\n\n\tmergedIntoID, err := s.resolver.Performer().MergedIntoID(s.ctx, targetPerformer)\n\tassert.NoError(s.t, err)\n\tassert.Nil(s.t, mergedIntoID, \"Target performer should not be merged into anything\")\n\n\tsource1Performer, err := s.resolver.Query().FindPerformer(s.ctx, mergeSource1.UUID())\n\tassert.NoError(s.t, err)\n\n\tsource1MergedIds, err := s.resolver.Performer().MergedIds(s.ctx, source1Performer)\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 0, len(source1MergedIds), \"Source performer should have no performers merged into it\")\n\n\tsource1MergedIntoID, err := s.resolver.Performer().MergedIntoID(s.ctx, source1Performer)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, source1MergedIntoID, \"Source performer should be merged into target\")\n\tassert.Equal(s.t, mergeTarget.UUID(), *source1MergedIntoID, \"Source should be merged into target\")\n}\n\nfunc (s *performerEditTestRunner) verifyAppliedMergePerformerEdit(input models.PerformerEditDetailsInput, edit *models.Edit, scene1 *sceneOutput, scene2 *sceneOutput) {\n\ts.verifyEditOperation(models.OperationEnumMerge.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumPerformer.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\ts.verifyPerformerEditDetails(input, edit)\n\n\tmerges, _ := s.resolver.Edit().MergeSources(s.ctx, edit)\n\tfor i := range merges {\n\t\tperformer := merges[i].(*models.Performer)\n\t\tassert.True(s.t, performer.Deleted == true)\n\t}\n\n\teditTarget := s.getEditPerformerTarget(edit)\n\tscene1Performers := scene1.Performers\n\tassert.True(s.t, len(scene1Performers) == 1)\n\tassert.Equal(s.t, scene1Performers[0].Performer.ID, editTarget.ID.String())\n\n\tscene2Performers := scene2.Performers\n\tassert.True(s.t, len(scene2Performers) == 1)\n\tassert.Equal(s.t, scene2Performers[0].Performer.ID, editTarget.ID.String())\n}\n\nfunc (s *performerEditTestRunner) verifyPerformanceAlias(scene *sceneOutput, alias *string) {\n\tscenePerformers := scene.Performers\n\tassert.True(s.t, len(scenePerformers) == 1)\n\n\tif alias == nil {\n\t\tassert.True(s.t, len(scenePerformers) == 0 || scenePerformers[0].As == nil)\n\t} else {\n\t\tassert.NotNil(s.t, scenePerformers[0].As)\n\t\tassert.True(s.t, *alias == *scenePerformers[0].As)\n\t}\n}\n\nfunc (s *performerEditTestRunner) testApplyMergePerformerEditWithoutAlias() {\n\tmergeSource, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tmergeTarget, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tmergeSourceAppearance := models.PerformerAppearanceInput{\n\t\tPerformerID: mergeSource.UUID(),\n\t}\n\n\tsceneInput := models.SceneCreateInput{\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\tmergeSourceAppearance,\n\t\t},\n\t\tDate: \"2020-03-02\",\n\t}\n\tscene, err := s.createTestScene(&sceneInput)\n\tassert.NoError(s.t, err)\n\n\tperformerEditDetailsInput := s.createPerformerEditDetailsInput()\n\tid := mergeTarget.UUID()\n\tmergeSources := []uuid.UUID{mergeSource.UUID()}\n\teditInput := models.EditInput{\n\t\tOperation:      models.OperationEnumMerge,\n\t\tID:             &id,\n\t\tMergeSourceIds: mergeSources,\n\t}\n\n\tmergeEdit, err := s.createTestPerformerEdit(models.OperationEnumMerge, performerEditDetailsInput, &editInput, nil)\n\tassert.NoError(s.t, err)\n\n\t_, err = s.applyEdit(mergeEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tscene, err = s.client.findScene(scene.UUID())\n\tassert.NoError(s.t, err, \"Error finding scene\")\n\n\ts.verifyPerformanceAlias(scene, nil)\n}\n\nfunc (s *performerTestRunner) testChangeURLSite() {\n\tsite, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tinput := &models.PerformerCreateInput{\n\t\tName: s.generatePerformerName(),\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"URL\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t}\n\n\tcreatedPerformer, err := s.createTestPerformer(input)\n\n\tsiteTwo, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tupdateInput := &models.PerformerEditDetailsInput{\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"URL\",\n\t\t\t\tSiteID: siteTwo.ID,\n\t\t\t},\n\t\t},\n\t}\n\tid := uuid.FromStringOrNil(createdPerformer.ID)\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &id,\n\t}\n\n\tmodifyEdit, err := s.createTestPerformerEdit(models.OperationEnumModify, updateInput, &editInput, nil)\n\tassert.NoError(s.t, err)\n\n\t_, err = s.applyEdit(modifyEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tperformer, _ := s.resolver.Query().FindPerformer(s.ctx, id)\n\turls, _ := s.resolver.Performer().Urls(s.ctx, performer)\n\tassert.Equal(s.t, updateInput.Urls, urls)\n}\n\nfunc (s *performerEditTestRunner) testPerformerEditUpdate() {\n\t// Create a pending edit with initial details\n\tperformerEditDetailsInput := s.createPerformerEditDetailsInput()\n\tcreatedEdit, err := s.createTestPerformerEdit(models.OperationEnumCreate, performerEditDetailsInput, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Verify initial state\n\tassert.Equal(s.t, 0, createdEdit.UpdateCount, \"Initial update_count should be 0\")\n\tassert.Nil(s.t, createdEdit.UpdatedAt, \"Initial updated timestamp should be nil\")\n\n\t// Update the edit with new details\n\tnewName := \"Updated Performer Name\"\n\tnewGender := models.GenderEnumMale\n\tnewBirthdate := \"1995-06-15\"\n\tnewHeight := 175\n\tupdatedDetails := models.PerformerEditDetailsInput{\n\t\tName:      &newName,\n\t\tGender:    &newGender,\n\t\tBirthdate: &newBirthdate,\n\t\tHeight:    &newHeight,\n\t}\n\n\teditID := createdEdit.ID\n\tupdatedEdit, err := s.resolver.Mutation().PerformerEditUpdate(s.ctx, createdEdit.ID, models.PerformerEditInput{\n\t\tEdit:    &models.EditInput{Operation: models.OperationEnumCreate},\n\t\tDetails: &updatedDetails,\n\t})\n\tassert.NoError(s.t, err, \"Error updating performer edit\")\n\n\t// Verify basic properties\n\tassert.Equal(s.t, createdEdit.ID, updatedEdit.ID, \"Edit ID should not change\")\n\tassert.NotNil(s.t, updatedEdit, \"Updated edit should not be nil\")\n\n\t// Verify update_count was incremented\n\tassert.Equal(s.t, 1, updatedEdit.UpdateCount, \"update_count should be incremented to 1\")\n\n\t// Verify updated timestamp is set\n\tassert.NotNil(s.t, updatedEdit.UpdatedAt, \"updated timestamp should be set after update\")\n\n\t// Verify edit is still pending (not applied)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), updatedEdit)\n\ts.verifyEditApplication(false, updatedEdit)\n\n\t// Verify the new details are persisted\n\ts.verifyPerformerEditDetails(updatedDetails, updatedEdit)\n\n\t// Re-fetch the edit from the database to ensure persistence\n\trefetchedEdit, err := s.resolver.Query().FindEdit(s.ctx, createdEdit.ID)\n\tassert.NoError(s.t, err, \"Error re-fetching edit\")\n\tassert.Equal(s.t, 1, refetchedEdit.UpdateCount, \"update_count should persist in database\")\n\ts.verifyPerformerEditDetails(updatedDetails, refetchedEdit)\n\n\t// Attempt to update the edit again - should fail due to update limit\n\tsecondUpdateName := \"Second Update Name\"\n\tsecondUpdatedDetails := models.PerformerEditDetailsInput{\n\t\tName:      &secondUpdateName,\n\t\tGender:    &newGender,\n\t\tBirthdate: &newBirthdate,\n\t\tHeight:    &newHeight,\n\t}\n\n\t_, err = s.resolver.Mutation().PerformerEditUpdate(s.ctx, createdEdit.ID, models.PerformerEditInput{\n\t\tEdit:    &models.EditInput{ID: &editID, Operation: models.OperationEnumCreate},\n\t\tDetails: &secondUpdatedDetails,\n\t})\n\n\t// Verify that the update limit error is returned\n\tassert.ErrorContains(s.t, err, \"edit update limit reached\")\n}\n\nfunc TestCreatePerformerEdit(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testCreatePerformerEdit()\n}\n\nfunc TestModifyPerformerEdit(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testModifyPerformerEdit()\n}\n\nfunc TestDestroyPerformerEdit(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testDestroyPerformerEdit()\n}\n\nfunc TestMergePerformerEdit(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testMergePerformerEdit()\n}\n\nfunc TestApplyCreatePerformerEdit(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testApplyCreatePerformerEdit()\n}\n\nfunc TestApplyModifyPerformerEdit(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testApplyModifyPerformerEdit()\n}\n\nfunc TestApplyModifyPerformerEditOptions(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testApplyModifyPerformerWithAliases()\n\tpt.testApplyModifyPerformerWithoutAliases()\n}\n\nfunc TestApplyMergePerformerEditWithoutAlias(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testApplyMergePerformerEditWithoutAlias()\n}\n\nfunc TestApplyModifyUnsetPerformerEdit(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testApplyModifyUnsetPerformerEdit()\n}\n\nfunc TestApplyDestroyPerformerEdit(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testApplyDestroyPerformerEdit()\n}\n\nfunc TestApplyMergePerformerEdit(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testApplyMergePerformerEdit()\n}\n\nfunc TestChangeURLSite(t *testing.T) {\n\tpt := createPerformerTestRunner(t)\n\tpt.testChangeURLSite()\n}\n\nfunc TestPerformerEditUpdate(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testPerformerEditUpdate()\n}\n\nfunc (s *performerEditTestRunner) testQueryExistingPerformer() {\n\t// Create a performer edit for testing\n\tsite, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tperformerName := \"Test Performer Name\"\n\tperformerDisambiguation := \"Test Disambiguation\"\n\ttestURL := \"http://example.com/performer123\"\n\n\tperformerEditDetailsInput := models.PerformerEditDetailsInput{\n\t\tName:           &performerName,\n\t\tDisambiguation: &performerDisambiguation,\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    testURL,\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t}\n\n\tedit, err := s.createTestPerformerEdit(models.OperationEnumCreate, &performerEditDetailsInput, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Test 1: Query by URL - should find the edit\n\tvar resp1 struct {\n\t\tQueryExistingPerformer struct {\n\t\t\tEdits []struct {\n\t\t\t\tID string\n\t\t\t}\n\t\t}\n\t}\n\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tquery {\n\t\t\tqueryExistingPerformer(input: {\n\t\t\t\turls: [\"%v\"]\n\t\t\t}) {\n\t\t\t\tedits {\n\t\t\t\t\tid\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`, testURL), &resp1)\n\tassert.True(s.t, len(resp1.QueryExistingPerformer.Edits) > 0, \"Should find edit by URL\")\n\n\t// Test 2: Query by name and disambiguation - should find the edit\n\tvar resp2 struct {\n\t\tQueryExistingPerformer struct {\n\t\t\tEdits []struct {\n\t\t\t\tID string\n\t\t\t}\n\t\t}\n\t}\n\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tquery {\n\t\t\tqueryExistingPerformer(input: {\n\t\t\t\tname: \"%v\"\n\t\t\t\tdisambiguation: \"%v\"\n\t\t\t\turls: []\n\t\t\t}) {\n\t\t\t\tedits {\n\t\t\t\t\tid\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`, performerName, performerDisambiguation), &resp2)\n\tassert.True(s.t, len(resp2.QueryExistingPerformer.Edits) > 0, \"Should find edit by name and disambiguation\")\n\n\t// Test 3: Cancel the edit and verify it no longer appears\n\t_, err = s.resolver.Mutation().CancelEdit(s.ctx, models.CancelEditInput{\n\t\tID: edit.ID,\n\t})\n\tassert.NoError(s.t, err)\n\n\tvar resp3 struct {\n\t\tQueryExistingPerformer struct {\n\t\t\tEdits []struct {\n\t\t\t\tID string\n\t\t\t}\n\t\t}\n\t}\n\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tquery {\n\t\t\tqueryExistingPerformer(input: {\n\t\t\t\turls: [\"%v\"]\n\t\t\t}) {\n\t\t\t\tedits {\n\t\t\t\t\tid\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`, testURL), &resp3)\n\tassert.True(s.t, len(resp3.QueryExistingPerformer.Edits) == 0, \"Should not find cancelled edit\")\n\n\t// Test 4: Create an actual performer (without disambiguation) and verify it appears in results\n\tperformerName2 := \"Test Performer Name 2\"\n\ttestURL2 := \"http://example.com/performer456\"\n\tactualPerformerInput := models.PerformerCreateInput{\n\t\tName: performerName2,\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    testURL2,\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t}\n\tcreatedPerformer, err := s.createTestPerformer(&actualPerformerInput)\n\tassert.NoError(s.t, err)\n\n\t// Query by name only (works because performer has no disambiguation)\n\tvar resp4 struct {\n\t\tQueryExistingPerformer struct {\n\t\t\tPerformers []struct {\n\t\t\t\tID string\n\t\t\t}\n\t\t}\n\t}\n\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tquery {\n\t\t\tqueryExistingPerformer(input: {\n\t\t\t\tname: \"%v\"\n\t\t\t\turls: []\n\t\t\t}) {\n\t\t\t\tperformers {\n\t\t\t\t\tid\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`, performerName2), &resp4)\n\tassert.True(s.t, len(resp4.QueryExistingPerformer.Performers) > 0, \"Should find created performer by name\")\n\tassert.Equal(s.t, createdPerformer.ID, resp4.QueryExistingPerformer.Performers[0].ID, \"Should return the correct performer\")\n\n\t// Test 5: Query by URL for the created performer\n\tvar resp5 struct {\n\t\tQueryExistingPerformer struct {\n\t\t\tPerformers []struct {\n\t\t\t\tID string\n\t\t\t}\n\t\t}\n\t}\n\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tquery {\n\t\t\tqueryExistingPerformer(input: {\n\t\t\t\turls: [\"%v\"]\n\t\t\t}) {\n\t\t\t\tperformers {\n\t\t\t\t\tid\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`, testURL2), &resp5)\n\tassert.True(s.t, len(resp5.QueryExistingPerformer.Performers) > 0, \"Should find created performer by URL\")\n\tassert.Equal(s.t, createdPerformer.ID, resp5.QueryExistingPerformer.Performers[0].ID, \"Should return the correct performer by URL\")\n\n\t// Test 6: Create a performer WITH disambiguation and query with matching disambiguation\n\tperformerName3 := \"Test Performer Name 3\"\n\tperformerDisambiguation3 := \"Test Disambiguation 3\"\n\ttestURL3 := \"http://example.com/performer789\"\n\tactualPerformerInput3 := models.PerformerCreateInput{\n\t\tName:           performerName3,\n\t\tDisambiguation: &performerDisambiguation3,\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    testURL3,\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t}\n\tcreatedPerformer3, err := s.createTestPerformer(&actualPerformerInput3)\n\tassert.NoError(s.t, err)\n\n\tvar resp6 struct {\n\t\tQueryExistingPerformer struct {\n\t\t\tPerformers []struct {\n\t\t\t\tID string\n\t\t\t}\n\t\t}\n\t}\n\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tquery {\n\t\t\tqueryExistingPerformer(input: {\n\t\t\t\tname: \"%v\"\n\t\t\t\tdisambiguation: \"%v\"\n\t\t\t\turls: []\n\t\t\t}) {\n\t\t\t\tperformers {\n\t\t\t\t\tid\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`, performerName3, performerDisambiguation3), &resp6)\n\tassert.True(s.t, len(resp6.QueryExistingPerformer.Performers) > 0, \"Should find created performer by name and disambiguation\")\n\tassert.Equal(s.t, createdPerformer3.ID, resp6.QueryExistingPerformer.Performers[0].ID, \"Should return the correct performer with disambiguation\")\n}\n\nfunc TestQueryExistingPerformer(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testQueryExistingPerformer()\n}\n\nfunc (s *performerEditTestRunner) testApplyModifyPerformerEnumFields() {\n\tinitialGender := models.GenderEnumMale\n\tinitialEthnicity := models.EthnicityEnumAsian\n\tinitialHairColor := models.HairColorEnumBlonde\n\tinitialEyeColor := models.EyeColorEnumBlue\n\tinitialBreastType := models.BreastTypeEnumNatural\n\n\tperformerCreateInput := models.PerformerCreateInput{\n\t\tName:       \"Enum Test Performer\",\n\t\tGender:     &initialGender,\n\t\tEthnicity:  &initialEthnicity,\n\t\tHairColor:  &initialHairColor,\n\t\tEyeColor:   &initialEyeColor,\n\t\tBreastType: &initialBreastType,\n\t}\n\tcreatedPerformer, err := s.createTestPerformer(&performerCreateInput)\n\tassert.NoError(s.t, err)\n\n\tnewGender := models.GenderEnumFemale\n\tnewEthnicity := models.EthnicityEnumCaucasian\n\tnewHairColor := models.HairColorEnumBrunette\n\tnewEyeColor := models.EyeColorEnumGreen\n\tnewBreastType := models.BreastTypeEnumFake\n\n\tperformerEditDetailsInput := models.PerformerEditDetailsInput{\n\t\tGender:     &newGender,\n\t\tEthnicity:  &newEthnicity,\n\t\tHairColor:  &newHairColor,\n\t\tEyeColor:   &newEyeColor,\n\t\tBreastType: &newBreastType,\n\t}\n\n\tid := createdPerformer.UUID()\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &id,\n\t}\n\n\tcreatedUpdateEdit, err := s.createTestPerformerEdit(models.OperationEnumModify, &performerEditDetailsInput, &editInput, nil)\n\tassert.NoError(s.t, err)\n\n\tappliedEdit, err := s.applyEdit(createdUpdateEdit.ID)\n\tassert.NoError(s.t, err)\n\n\ts.verifyAppliedPerformerEdit(appliedEdit)\n\n\tmodifiedPerformer, err := s.resolver.Query().FindPerformer(s.ctx, id)\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, newGender.String(), modifiedPerformer.Gender.String())\n\tassert.Equal(s.t, newEthnicity.String(), modifiedPerformer.Ethnicity.String())\n\tassert.Equal(s.t, newHairColor.String(), modifiedPerformer.HairColor.String())\n\tassert.Equal(s.t, newEyeColor.String(), modifiedPerformer.EyeColor.String())\n\tassert.Equal(s.t, newBreastType.String(), modifiedPerformer.BreastType.String())\n}\n\nfunc TestApplyModifyPerformerEnumFields(t *testing.T) {\n\tpt := createPerformerEditTestRunner(t)\n\tpt.testApplyModifyPerformerEnumFields()\n}\n"
  },
  {
    "path": "internal/api/performer_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype performerTestRunner struct {\n\ttestRunner\n}\n\nfunc createPerformerTestRunner(t *testing.T) *performerTestRunner {\n\treturn &performerTestRunner{\n\t\ttestRunner: *asAdmin(t),\n\t}\n}\n\nfunc (s *performerTestRunner) testCreatePerformer() {\n\tdisambiguation := \"Disambiguation\"\n\tcountry := \"USA\"\n\theight := 182\n\tcupSize := \"C\"\n\tbandSize := 32\n\tcareerStartYear := 2000\n\ttattooDesc := \"Foobar\"\n\tgender := models.GenderEnumFemale\n\tethnicity := models.EthnicityEnumCaucasian\n\teyeColor := models.EyeColorEnumBlue\n\thairColor := models.HairColorEnumBlonde\n\tbreastType := models.BreastTypeEnumNatural\n\tbirthdate := \"2001-02-03\"\n\tdeathdate := \"2024-12-23\"\n\tsite, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tinput := models.PerformerCreateInput{\n\t\tName:           s.generatePerformerName(),\n\t\tDisambiguation: &disambiguation,\n\t\tAliases:        []string{\"Alias1\", \"Alias2\"},\n\t\tGender:         &gender,\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"URL\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t\tBirthdate:       &birthdate,\n\t\tDeathdate:       &deathdate,\n\t\tEthnicity:       &ethnicity,\n\t\tCountry:         &country,\n\t\tEyeColor:        &eyeColor,\n\t\tHairColor:       &hairColor,\n\t\tHeight:          &height,\n\t\tCupSize:         &cupSize,\n\t\tBandSize:        &bandSize,\n\t\tWaistSize:       &bandSize,\n\t\tHipSize:         &bandSize,\n\t\tBreastType:      &breastType,\n\t\tCareerStartYear: &careerStartYear,\n\t\tCareerEndYear:   nil,\n\t\tTattoos: []models.BodyModificationInput{\n\t\t\t{\n\t\t\t\tLocation:    \"Inner thigh\",\n\t\t\t\tDescription: &tattooDesc,\n\t\t\t},\n\t\t},\n\t\tPiercings: []models.BodyModificationInput{\n\t\t\t{\n\t\t\t\tLocation:    \"Nose\",\n\t\t\t\tDescription: nil,\n\t\t\t},\n\t\t},\n\t}\n\n\tperformer, err := s.resolver.Mutation().PerformerCreate(s.ctx, input)\n\tassert.NoError(s.t, err)\n\n\ts.verifyCreatedPerformer(input, performer)\n}\n\nfunc (s *performerTestRunner) verifyCreatedPerformer(input models.PerformerCreateInput, performer *models.Performer) {\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, input.Name, performer.Name)\n\n\tr := s.resolver.Performer()\n\n\tassert.True(s.t, performer.ID != uuid.Nil, \"Expected created performer id to be non-zero\")\n\n\tassert.Equal(s.t, performer.Disambiguation, input.Disambiguation)\n\n\talias, _ := r.Aliases(s.ctx, performer)\n\tassert.Equal(s.t, alias, input.Aliases)\n\n\tassert.Equal(s.t, performer.Gender, input.Gender)\n\n\turls, _ := s.resolver.Performer().Urls(s.ctx, performer)\n\tassert.Equal(s.t, input.Urls, urls)\n\n\tbirthdate, _ := r.Birthdate(s.ctx, performer)\n\tif input.Birthdate == nil {\n\t\tassert.Nil(s.t, birthdate)\n\t} else {\n\t\tassert.Equal(s.t, *input.Birthdate, birthdate.Date)\n\t}\n\n\tassert.Equal(s.t, performer.DeathDate, input.Deathdate)\n\n\tassert.Equal(s.t, performer.Ethnicity, input.Ethnicity)\n\n\tassert.Equal(s.t, performer.Country, input.Country)\n\n\tassert.Equal(s.t, performer.EyeColor, input.EyeColor)\n\n\tassert.Equal(s.t, performer.HairColor, input.HairColor)\n\n\tassert.Equal(s.t, performer.Height, input.Height)\n\n\tassert.Equal(s.t, performer.CupSize, input.CupSize)\n\n\tassert.Equal(s.t, performer.BandSize, input.BandSize)\n\n\tassert.Equal(s.t, performer.WaistSize, input.WaistSize)\n\n\tassert.Equal(s.t, performer.HipSize, input.HipSize)\n\n\tassert.Equal(s.t, performer.BreastType, input.BreastType)\n\n\tassert.Equal(s.t, performer.CareerStartYear, input.CareerStartYear)\n\n\tassert.Equal(s.t, performer.CareerEndYear, input.CareerEndYear)\n\n\ttattoos, _ := s.resolver.Performer().Tattoos(s.ctx, performer)\n\tassertBodyMods(s.t, input.Tattoos, tattoos, \"Tattoos should match\")\n\n\tpiercings, _ := s.resolver.Performer().Piercings(s.ctx, performer)\n\tassertBodyMods(s.t, input.Piercings, piercings, \"Piercings should match\")\n}\n\nfunc (s *performerTestRunner) testFindPerformer() {\n\tcreatedPerformer, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tperformer, err := s.resolver.Query().FindPerformer(s.ctx, createdPerformer.UUID())\n\tassert.NoError(s.t, err, \"Error finding performer\")\n\n\tassert.NotNil(s.t, performer, \"Did not find performer by id\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdPerformer.Name, performer.Name)\n}\n\nfunc (s *performerTestRunner) testUpdatePerformer() {\n\tcupSize := \"C\"\n\tbandSize := 32\n\ttattooDesc := \"Foobar\"\n\tdate := \"2001-02-03\"\n\tdeathdate := \"2024-11-23\"\n\tsite, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tinput := &models.PerformerCreateInput{\n\t\tName:    s.generatePerformerName(),\n\t\tAliases: []string{\"Alias1\", \"Alias2\"},\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"URL\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t\tBirthdate: &date,\n\t\tDeathdate: &deathdate,\n\t\tCupSize:   &cupSize,\n\t\tBandSize:  &bandSize,\n\t\tWaistSize: &bandSize,\n\t\tHipSize:   &bandSize,\n\t\tTattoos: []models.BodyModificationInput{\n\t\t\t{\n\t\t\t\tLocation:    \"Inner thigh\",\n\t\t\t\tDescription: &tattooDesc,\n\t\t\t},\n\t\t},\n\t\tPiercings: []models.BodyModificationInput{\n\t\t\t{\n\t\t\t\tLocation:    \"Nose\",\n\t\t\t\tDescription: nil,\n\t\t\t},\n\t\t},\n\t}\n\n\tcreatedPerformer, err := s.createTestPerformer(input)\n\tassert.NoError(s.t, err)\n\n\tperformerID := createdPerformer.UUID()\n\n\tupdateInput := models.PerformerUpdateInput{\n\t\tID:      performerID,\n\t\tAliases: []string{\"Alias3\", \"Alias4\"},\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"URL\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t\tBirthdate: &date,\n\t\tDeathdate: &deathdate,\n\t\tCupSize:   &cupSize,\n\t\tBandSize:  &bandSize,\n\t\tWaistSize: &bandSize,\n\t\tHipSize:   &bandSize,\n\t\tTattoos: []models.BodyModificationInput{\n\t\t\t{\n\t\t\t\tLocation:    \"Tramp stamp\",\n\t\t\t\tDescription: &tattooDesc,\n\t\t\t},\n\t\t},\n\t\tPiercings: []models.BodyModificationInput{\n\t\t\t{\n\t\t\t\tLocation:    \"Navel\",\n\t\t\t\tDescription: nil,\n\t\t\t},\n\t\t},\n\t}\n\n\t// need some mocking of the context to make the field ignore behaviour work\n\tctx := s.updateContext([]string{\n\t\t\"aliases\",\n\t\t\"urls\",\n\t\t\"birthdate\",\n\t\t\"deathdate\",\n\t\t\"tattoos\",\n\t\t\"piercings\",\n\t\t\"cup_size\",\n\t\t\"band_size\",\n\t\t\"waist_size\",\n\t\t\"hip_size\",\n\t})\n\n\tupdatedPerformer, err := s.resolver.Mutation().PerformerUpdate(ctx, updateInput)\n\tassert.NoError(s.t, err)\n\n\ts.verifyUpdatedPerformer(updateInput, updatedPerformer)\n}\n\nfunc (s *performerTestRunner) verifyUpdatedPerformer(input models.PerformerUpdateInput, performer *models.Performer) {\n\t// ensure basic attributes are set correctly\n\tassert.True(s.t, input.Name == nil || *input.Name == performer.Name)\n\n\tr := s.resolver.Performer()\n\n\taliases, _ := r.Aliases(s.ctx, performer)\n\tassert.Equal(s.t, aliases, input.Aliases)\n\n\t// ensure urls were set correctly\n\turls, _ := s.resolver.Performer().Urls(s.ctx, performer)\n\tassert.Equal(s.t, input.Urls, urls)\n\n\tbirthdate, _ := s.resolver.Performer().Birthdate(s.ctx, performer)\n\tif input.Birthdate == nil {\n\t\tassert.Nil(s.t, birthdate)\n\t} else {\n\t\tassert.Equal(s.t, *input.Birthdate, birthdate.Date)\n\t}\n\n\tassert.Equal(s.t, performer.DeathDate, input.Deathdate)\n\n\ttattoos, _ := s.resolver.Performer().Tattoos(s.ctx, performer)\n\tassertBodyMods(s.t, input.Tattoos, tattoos, \"Tattoos should match\")\n\n\tpiercings, _ := s.resolver.Performer().Piercings(s.ctx, performer)\n\tassertBodyMods(s.t, input.Piercings, piercings, \"Piercings should match\")\n\n\tassert.Equal(s.t, performer.CupSize, input.CupSize)\n\n\tassert.Equal(s.t, performer.BandSize, input.BandSize)\n\n\tassert.Equal(s.t, performer.WaistSize, input.WaistSize)\n\n\tassert.Equal(s.t, performer.HipSize, input.HipSize)\n}\n\nfunc (s *performerTestRunner) testDestroyPerformer() {\n\tcreatedPerformer, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tperformerID := createdPerformer.UUID()\n\n\tdestroyed, err := s.resolver.Mutation().PerformerDestroy(s.ctx, models.PerformerDestroyInput{\n\t\tID: performerID,\n\t})\n\tassert.NoError(s.t, err, \"Error destroying performer\")\n\tassert.True(s.t, destroyed, \"Performer was not destroyed\")\n\n\t// ensure cannot find performer\n\tfoundPerformer, err := s.resolver.Query().FindPerformer(s.ctx, performerID)\n\tassert.NoError(s.t, err)\n\n\tassert.Nil(s.t, foundPerformer, \"Found performer after destruction\")\n\n\t// TODO - ensure scene was not removed\n}\n\nfunc (s *performerTestRunner) testQueryPerformers() {\n\t// Create test performers with specific attributes\n\tname1 := s.generatePerformerName()\n\tperformer1, err := s.createTestPerformer(&models.PerformerCreateInput{\n\t\tName: name1,\n\t})\n\tassert.NoError(s.t, err)\n\n\tname2 := s.generatePerformerName()\n\tperformer2, err := s.createTestPerformer(&models.PerformerCreateInput{\n\t\tName: name2,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Test basic query\n\tresult, err := s.client.queryPerformers(models.PerformerQueryInput{\n\t\tPage:      1,\n\t\tPerPage:   25,\n\t\tDirection: models.SortDirectionEnumAsc,\n\t\tSort:      models.PerformerSortEnumName,\n\t})\n\tassert.NoError(s.t, err, \"Error querying performers\")\n\n\t// Ensure we have at least the performers we created\n\tassert.True(s.t, result.Count >= 2, \"Expected at least 2 performers in count\")\n\tassert.True(s.t, len(result.Performers) >= 2, \"Expected at least 2 performers in results\")\n\n\t// Verify our created performers are in the results\n\tfound1 := false\n\tfound2 := false\n\tfor _, p := range result.Performers {\n\t\tif p.ID == performer1.ID {\n\t\t\tfound1 = true\n\t\t\tassert.Equal(s.t, name1, p.Name)\n\t\t}\n\t\tif p.ID == performer2.ID {\n\t\t\tfound2 = true\n\t\t\tassert.Equal(s.t, name2, p.Name)\n\t\t}\n\t}\n\n\tassert.True(s.t, found1, \"Created performer 1 not found in query results\")\n\tassert.True(s.t, found2, \"Created performer 2 not found in query results\")\n}\n\nfunc (s *performerTestRunner) testQueryPerformersBirthdate() {\n\t// Create test performers with specific birthdates\n\tbirthdate1 := \"2000-01-07\"\n\tbirthdate2 := \"1995-06-15\"\n\tbirthdate3 := \"2000-01-07\" // Same as birthdate1\n\n\tname1 := s.generatePerformerName()\n\tperformer1, err := s.createTestPerformer(&models.PerformerCreateInput{\n\t\tName:      name1,\n\t\tBirthdate: &birthdate1,\n\t})\n\tassert.NoError(s.t, err)\n\n\tname2 := s.generatePerformerName()\n\tperformer2, err := s.createTestPerformer(&models.PerformerCreateInput{\n\t\tName:      name2,\n\t\tBirthdate: &birthdate2,\n\t})\n\tassert.NoError(s.t, err)\n\n\tname3 := s.generatePerformerName()\n\tperformer3, err := s.createTestPerformer(&models.PerformerCreateInput{\n\t\tName:      name3,\n\t\tBirthdate: &birthdate3,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Test EQUALS modifier\n\tequalsResult, err := s.client.queryPerformers(models.PerformerQueryInput{\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumAsc,\n\t\tSort:      models.PerformerSortEnumName,\n\t\tBirthdate: &models.DateCriterionInput{\n\t\t\tValue:    birthdate1,\n\t\t\tModifier: models.CriterionModifierEquals,\n\t\t},\n\t})\n\tassert.NoError(s.t, err, \"Error querying performers with birthdate equals\")\n\tassert.GreaterOrEqual(s.t, equalsResult.Count, 2, \"Expected at least 2 performers with birthdate 2000-01-07\")\n\n\t// Verify performers 1 and 3 are in results\n\tfound1 := false\n\tfound3 := false\n\tfor _, p := range equalsResult.Performers {\n\t\tif p.ID == performer1.ID {\n\t\t\tfound1 = true\n\t\t}\n\t\tif p.ID == performer3.ID {\n\t\t\tfound3 = true\n\t\t}\n\t\t// Ensure performer2 is not in results\n\t\tassert.NotEqual(s.t, performer2.ID, p.ID, \"Performer with different birthdate should not be in EQUALS results\")\n\t}\n\tassert.True(s.t, found1, \"Performer 1 with matching birthdate not found\")\n\tassert.True(s.t, found3, \"Performer 3 with matching birthdate not found\")\n\n\t// Test GREATER_THAN modifier\n\tgtResult, err := s.client.queryPerformers(models.PerformerQueryInput{\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumAsc,\n\t\tSort:      models.PerformerSortEnumName,\n\t\tBirthdate: &models.DateCriterionInput{\n\t\t\tValue:    \"1997-01-01\",\n\t\t\tModifier: models.CriterionModifierGreaterThan,\n\t\t},\n\t})\n\tassert.NoError(s.t, err, \"Error querying performers with birthdate greater than\")\n\n\t// Performer1 and Performer3 should be in results (born in 2000)\n\tfoundGt1 := false\n\tfoundGt3 := false\n\tfor _, p := range gtResult.Performers {\n\t\tif p.ID == performer1.ID {\n\t\t\tfoundGt1 = true\n\t\t}\n\t\tif p.ID == performer3.ID {\n\t\t\tfoundGt3 = true\n\t\t}\n\t\t// Performer2 born in 1995 should not be in results\n\t\tassert.NotEqual(s.t, performer2.ID, p.ID, \"Performer with birthdate before 1997 should not be in GREATER_THAN results\")\n\t}\n\tassert.True(s.t, foundGt1, \"Performer 1 born after 1997 should be in GREATER_THAN results\")\n\tassert.True(s.t, foundGt3, \"Performer 3 born after 1997 should be in GREATER_THAN results\")\n\n\t// Test LESS_THAN modifier\n\tltResult, err := s.client.queryPerformers(models.PerformerQueryInput{\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumAsc,\n\t\tSort:      models.PerformerSortEnumName,\n\t\tBirthdate: &models.DateCriterionInput{\n\t\t\tValue:    \"1997-01-01\",\n\t\t\tModifier: models.CriterionModifierLessThan,\n\t\t},\n\t})\n\tassert.NoError(s.t, err, \"Error querying performers with birthdate less than\")\n\n\t// Performer2 should be in results (born in 1995)\n\tfoundLt2 := false\n\tfor _, p := range ltResult.Performers {\n\t\tif p.ID == performer2.ID {\n\t\t\tfoundLt2 = true\n\t\t}\n\t\t// Performer1 and Performer3 born in 2000 should not be in results\n\t\tassert.NotEqual(s.t, performer1.ID, p.ID, \"Performer with birthdate after 1997 should not be in LESS_THAN results\")\n\t\tassert.NotEqual(s.t, performer3.ID, p.ID, \"Performer with birthdate after 1997 should not be in LESS_THAN results\")\n\t}\n\tassert.True(s.t, foundLt2, \"Performer 2 born before 1997 should be in LESS_THAN results\")\n\n\t// Test NOT_EQUALS modifier\n\tneResult, err := s.client.queryPerformers(models.PerformerQueryInput{\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumAsc,\n\t\tSort:      models.PerformerSortEnumName,\n\t\tBirthdate: &models.DateCriterionInput{\n\t\t\tValue:    birthdate1,\n\t\t\tModifier: models.CriterionModifierNotEquals,\n\t\t},\n\t})\n\tassert.NoError(s.t, err, \"Error querying performers with birthdate not equals\")\n\n\t// Performer2 should be in results\n\tfoundNe2 := false\n\tfor _, p := range neResult.Performers {\n\t\tif p.ID == performer2.ID {\n\t\t\tfoundNe2 = true\n\t\t}\n\t\t// Performer1 and Performer3 should not be in results\n\t\tassert.NotEqual(s.t, performer1.ID, p.ID, \"Performer with matching birthdate should not be in NOT_EQUALS results\")\n\t\tassert.NotEqual(s.t, performer3.ID, p.ID, \"Performer with matching birthdate should not be in NOT_EQUALS results\")\n\t}\n\tassert.True(s.t, foundNe2, \"Performer 2 with different birthdate should be in NOT_EQUALS results\")\n}\n\nfunc TestCreatePerformer(t *testing.T) {\n\tpt := createPerformerTestRunner(t)\n\tpt.testCreatePerformer()\n}\n\nfunc TestFindPerformer(t *testing.T) {\n\tpt := createPerformerTestRunner(t)\n\tpt.testFindPerformer()\n}\n\nfunc TestUpdatePerformer(t *testing.T) {\n\tpt := createPerformerTestRunner(t)\n\tpt.testUpdatePerformer()\n}\n\n// TestUpdatePerformerName is removed due to no longer allowing\n// partial updates\n\nfunc TestDestroyPerformer(t *testing.T) {\n\tpt := createPerformerTestRunner(t)\n\tpt.testDestroyPerformer()\n}\n\nfunc (s *performerTestRunner) testQueryPerformersByAgeAndBirthYear() {\n\t// Use relative dates based on current time so tests don't break as time passes\n\tnow := time.Now()\n\tcurrentYear := now.Year()\n\n\t// Calculate birthdates for specific ages (use January 1st to ensure birthday has passed)\n\tbirthYear30 := currentYear - 30\n\tbirthYear25 := currentYear - 25\n\tbirthYear20 := currentYear - 20\n\n\tbirthdate30YearsAgo := time.Date(birthYear30, 1, 1, 0, 0, 0, 0, time.UTC).Format(\"2006-01-02\")\n\tbirthdate25YearsAgo := time.Date(birthYear25, 1, 1, 0, 0, 0, 0, time.UTC).Format(\"2006-01-02\")\n\tbirthdate20YearsAgo := time.Date(birthYear20, 1, 1, 0, 0, 0, 0, time.UTC).Format(\"2006-01-02\")\n\t// Death date 5 years ago (so performer born 25 years ago died at age 20)\n\tdeathdate5YearsAgo := time.Date(currentYear-5, 4, 19, 0, 0, 0, 0, time.UTC).Format(\"2006-01-02\")\n\n\t// Create performer age 30 (alive)\n\tname1 := s.generatePerformerName()\n\tperformer1, err := s.createTestPerformer(&models.PerformerCreateInput{\n\t\tName:      name1,\n\t\tBirthdate: &birthdate30YearsAgo,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Create performer age 25 (alive)\n\tname2 := s.generatePerformerName()\n\tperformer2, err := s.createTestPerformer(&models.PerformerCreateInput{\n\t\tName:      name2,\n\t\tBirthdate: &birthdate25YearsAgo,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Create performer born 25 years ago but died 5 years ago (age at death: 20)\n\tname3 := s.generatePerformerName()\n\tperformer3, err := s.createTestPerformer(&models.PerformerCreateInput{\n\t\tName:      name3,\n\t\tBirthdate: &birthdate25YearsAgo,\n\t\tDeathdate: &deathdate5YearsAgo,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Create performer age 20 (alive)\n\tname4 := s.generatePerformerName()\n\tperformer4, err := s.createTestPerformer(&models.PerformerCreateInput{\n\t\tName:      name4,\n\t\tBirthdate: &birthdate20YearsAgo,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Test birth_year filter: query for performers born in birthYear25\n\tbirthYearFilter25 := &models.IntCriterionInput{\n\t\tValue:    birthYear25,\n\t\tModifier: models.CriterionModifierEquals,\n\t}\n\tresult, err := s.client.queryPerformers(models.PerformerQueryInput{\n\t\tBirthYear: birthYearFilter25,\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumAsc,\n\t\tSort:      models.PerformerSortEnumName,\n\t})\n\tassert.NoError(s.t, err, \"Error querying performers by birth year\")\n\tassert.True(s.t, result.Count >= 2, \"Expected at least 2 performers born in year %d\", birthYear25)\n\n\t// Verify both performers born in birthYear25 are in results\n\tfound2 := false\n\tfound3 := false\n\tfor _, p := range result.Performers {\n\t\tif p.ID == performer2.ID {\n\t\t\tfound2 = true\n\t\t}\n\t\tif p.ID == performer3.ID {\n\t\t\tfound3 = true\n\t\t}\n\t}\n\tassert.True(s.t, found2, \"Performer born in %d (alive) not found\", birthYear25)\n\tassert.True(s.t, found3, \"Performer born in %d (deceased) not found\", birthYear25)\n\n\t// Test birth_year filter: query for performers born in birthYear30\n\tbirthYearFilter30 := &models.IntCriterionInput{\n\t\tValue:    birthYear30,\n\t\tModifier: models.CriterionModifierEquals,\n\t}\n\tresult, err = s.client.queryPerformers(models.PerformerQueryInput{\n\t\tBirthYear: birthYearFilter30,\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumAsc,\n\t\tSort:      models.PerformerSortEnumName,\n\t})\n\tassert.NoError(s.t, err, \"Error querying performers by birth year %d\", birthYear30)\n\tassert.True(s.t, result.Count >= 1, \"Expected at least 1 performer born in %d\", birthYear30)\n\n\t// Verify performer born in birthYear30 is in results\n\tfound1 := false\n\tfor _, p := range result.Performers {\n\t\tif p.ID == performer1.ID {\n\t\t\tfound1 = true\n\t\t}\n\t}\n\tassert.True(s.t, found1, \"Performer born in %d not found\", birthYear30)\n\n\t// Test age filter: query for performers age 25 (still alive)\n\tage25 := &models.IntCriterionInput{\n\t\tValue:    25,\n\t\tModifier: models.CriterionModifierEquals,\n\t}\n\tresult, err = s.client.queryPerformers(models.PerformerQueryInput{\n\t\tAge:       age25,\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumAsc,\n\t\tSort:      models.PerformerSortEnumName,\n\t})\n\tassert.NoError(s.t, err, \"Error querying performers by age 25\")\n\tassert.True(s.t, result.Count >= 1, \"Expected at least 1 performer age 25\")\n\n\t// Verify performer2 (alive, age 25) is in results\n\tfound2 = false\n\tfor _, p := range result.Performers {\n\t\tif p.ID == performer2.ID {\n\t\t\tfound2 = true\n\t\t}\n\t\t// performer3 should NOT be in results (died at age 20)\n\t\tif p.ID == performer3.ID {\n\t\t\ts.t.Errorf(\"Performer who died at age 20 should not be in age 25 results\")\n\t\t}\n\t}\n\tassert.True(s.t, found2, \"Performer age 25 not found\")\n\n\t// Test age filter: query for performers age 20\n\tage20 := &models.IntCriterionInput{\n\t\tValue:    20,\n\t\tModifier: models.CriterionModifierEquals,\n\t}\n\tresult, err = s.client.queryPerformers(models.PerformerQueryInput{\n\t\tAge:       age20,\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumAsc,\n\t\tSort:      models.PerformerSortEnumName,\n\t})\n\tassert.NoError(s.t, err, \"Error querying performers by age 20\")\n\tassert.True(s.t, result.Count >= 2, \"Expected at least 2 performers age 20\")\n\n\t// Verify both performer3 (died at 20) and performer4 (currently 20) are in results\n\tfound3 = false\n\tfound4 := false\n\tfor _, p := range result.Performers {\n\t\tif p.ID == performer3.ID {\n\t\t\tfound3 = true\n\t\t}\n\t\tif p.ID == performer4.ID {\n\t\t\tfound4 = true\n\t\t}\n\t}\n\tassert.True(s.t, found3, \"Performer who died at age 20 not found\")\n\tassert.True(s.t, found4, \"Performer currently age 20 not found\")\n}\n\nfunc (s *performerTestRunner) testQueryPerformersSceneCountSort() {\n\t// Test that performers with 0 scenes are returned when sorting by SCENE_COUNT\n\t// Create performer with no scenes\n\tperformerWithNoScenes, err := s.createTestPerformer(&models.PerformerCreateInput{\n\t\tName: s.generatePerformerName(),\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Create performer with scenes\n\tperformerWithScenes, err := s.createTestPerformer(&models.PerformerCreateInput{\n\t\tName: s.generatePerformerName(),\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Create a scene with the second performer\n\tsceneDate := \"2020-01-15\"\n\tsceneTitle := s.generateSceneName()\n\t_, err = s.createTestScene(&models.SceneCreateInput{\n\t\tTitle: &sceneTitle,\n\t\tDate:  sceneDate,\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\t{\n\t\t\t\tPerformerID: performerWithScenes.UUID(),\n\t\t\t},\n\t\t},\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Query performers sorted by SCENE_COUNT DESC (most scenes first)\n\tresult, err := s.client.queryPerformers(models.PerformerQueryInput{\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumDesc,\n\t\tSort:      models.PerformerSortEnumSceneCount,\n\t})\n\tassert.NoError(s.t, err, \"Error querying performers by scene count\")\n\n\t// Find our test performers in the results\n\tfoundWithNoScenes := false\n\tfoundWithScenes := false\n\tindexWithNoScenes := -1\n\tindexWithScenes := -1\n\tfor i, p := range result.Performers {\n\t\tif p.ID == performerWithNoScenes.ID {\n\t\t\tfoundWithNoScenes = true\n\t\t\tindexWithNoScenes = i\n\t\t}\n\t\tif p.ID == performerWithScenes.ID {\n\t\t\tfoundWithScenes = true\n\t\t\tindexWithScenes = i\n\t\t}\n\t}\n\n\t// Both performers should be in the results\n\tassert.True(s.t, foundWithNoScenes, \"Performer with 0 scenes not found when sorting by SCENE_COUNT DESC\")\n\tassert.True(s.t, foundWithScenes, \"Performer with scenes not found when sorting by SCENE_COUNT DESC\")\n\t// Performer with scenes should come before performer with 0 scenes when sorting DESC\n\tif foundWithNoScenes && foundWithScenes {\n\t\tassert.Less(s.t, indexWithScenes, indexWithNoScenes, \"Performer with scenes should come before performer with 0 scenes when sorting DESC\")\n\t}\n\n\t// Query performers sorted by SCENE_COUNT ASC (fewest scenes first)\n\tresult, err = s.client.queryPerformers(models.PerformerQueryInput{\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumAsc,\n\t\tSort:      models.PerformerSortEnumSceneCount,\n\t})\n\tassert.NoError(s.t, err, \"Error querying performers by scene count ASC\")\n\n\tfoundWithNoScenes = false\n\tfoundWithScenes = false\n\tindexWithNoScenes = -1\n\tindexWithScenes = -1\n\tfor i, p := range result.Performers {\n\t\tif p.ID == performerWithNoScenes.ID {\n\t\t\tfoundWithNoScenes = true\n\t\t\tindexWithNoScenes = i\n\t\t}\n\t\tif p.ID == performerWithScenes.ID {\n\t\t\tfoundWithScenes = true\n\t\t\tindexWithScenes = i\n\t\t}\n\t}\n\n\tassert.True(s.t, foundWithNoScenes, \"Performer with 0 scenes not found when sorting by SCENE_COUNT ASC\")\n\tassert.True(s.t, foundWithScenes, \"Performer with scenes not found when sorting by SCENE_COUNT ASC\")\n\t// Performer with 0 scenes should come before performer with scenes when sorting ASC\n\tif foundWithNoScenes && foundWithScenes {\n\t\tassert.Less(s.t, indexWithNoScenes, indexWithScenes, \"Performer with 0 scenes should come before performer with scenes when sorting ASC\")\n\t}\n\n\t// Test sorting by DEBUT\n\tresult, err = s.client.queryPerformers(models.PerformerQueryInput{\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumDesc,\n\t\tSort:      models.PerformerSortEnumDebut,\n\t})\n\tassert.NoError(s.t, err, \"Error querying performers by debut\")\n\n\tfoundWithNoScenes = false\n\tfoundWithScenes = false\n\tfor _, p := range result.Performers {\n\t\tif p.ID == performerWithNoScenes.ID {\n\t\t\tfoundWithNoScenes = true\n\t\t}\n\t\tif p.ID == performerWithScenes.ID {\n\t\t\tfoundWithScenes = true\n\t\t}\n\t}\n\n\tassert.True(s.t, foundWithNoScenes, \"Performer with 0 scenes not found when sorting by DEBUT\")\n\tassert.True(s.t, foundWithScenes, \"Performer with scenes not found when sorting by DEBUT\")\n\n\t// Test sorting by LAST_SCENE\n\tresult, err = s.client.queryPerformers(models.PerformerQueryInput{\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumDesc,\n\t\tSort:      models.PerformerSortEnumLastScene,\n\t})\n\tassert.NoError(s.t, err, \"Error querying performers by last scene\")\n\n\tfoundWithNoScenes = false\n\tfoundWithScenes = false\n\tfor _, p := range result.Performers {\n\t\tif p.ID == performerWithNoScenes.ID {\n\t\t\tfoundWithNoScenes = true\n\t\t}\n\t\tif p.ID == performerWithScenes.ID {\n\t\t\tfoundWithScenes = true\n\t\t}\n\t}\n\n\tassert.True(s.t, foundWithNoScenes, \"Performer with 0 scenes not found when sorting by LAST_SCENE\")\n\tassert.True(s.t, foundWithScenes, \"Performer with scenes not found when sorting by LAST_SCENE\")\n\n\t// Verify count matches actual performer count\n\ttotalCount := len(result.Performers)\n\tassert.Equal(s.t, result.Count, totalCount, \"Count field should match number of performers returned\")\n}\n\nfunc TestQueryPerformers(t *testing.T) {\n\tpt := createPerformerTestRunner(t)\n\tpt.testQueryPerformers()\n}\n\nfunc TestQueryPerformersBirthdate(t *testing.T) {\n\tpt := createPerformerTestRunner(t)\n\tpt.testQueryPerformersBirthdate()\n}\n\nfunc TestQueryPerformersByAgeAndBirthYear(t *testing.T) {\n\tpt := createPerformerTestRunner(t)\n\tpt.testQueryPerformersByAgeAndBirthYear()\n}\n\nfunc TestQueryPerformersSceneCountSort(t *testing.T) {\n\tpt := createPerformerTestRunner(t)\n\tpt.testQueryPerformersSceneCountSort()\n}\n"
  },
  {
    "path": "internal/api/performer_resolver_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype performerResolverTestRunner struct {\n\ttestRunner\n}\n\nfunc createPerformerResolverTestRunner(t *testing.T) *performerResolverTestRunner {\n\treturn &performerResolverTestRunner{\n\t\ttestRunner: *asAdmin(t),\n\t}\n}\n\n// testPerformerImages tests the images resolver field\nfunc (s *performerResolverTestRunner) testPerformerImages() {\n\t// Create a performer using the resolver\n\tname := s.generatePerformerName()\n\tperformer, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName: name,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Get images via resolver\n\timages, err := s.resolver.Performer().Images(s.ctx, performer)\n\tassert.NoError(s.t, err)\n\tassert.Nil(s.t, images, \"New performer should have nil images\")\n}\n\n// testPerformerDeleted tests the deleted field\nfunc (s *performerResolverTestRunner) testPerformerDeleted() {\n\t// Create a performer\n\tname := s.generatePerformerName()\n\tperformer, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName: name,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Verify not deleted\n\tassert.Equal(s.t, false, performer.Deleted, \"New performer should not be deleted\")\n\n\t// Destroy the performer\n\tperformerID := performer.ID\n\tdestroyed, err := s.resolver.Mutation().PerformerDestroy(s.ctx, models.PerformerDestroyInput{\n\t\tID: performerID,\n\t})\n\tassert.NoError(s.t, err)\n\tassert.True(s.t, destroyed, \"Performer should be destroyed\")\n\n\t// Find the performer again (it should still exist but marked as deleted)\n\tdeletedPerformer, err := s.resolver.Query().FindPerformer(s.ctx, performerID)\n\tassert.NoError(s.t, err)\n\n\t// The performer should be nil (destroyed performers are not returned)\n\tassert.Nil(s.t, deletedPerformer, \"Deleted performer should not be returned\")\n}\n\n// testPerformerEdits tests the edits resolver field\nfunc (s *performerResolverTestRunner) testPerformerEdits() {\n\t// Create a performer via edit\n\tname := s.generatePerformerName()\n\tedit, err := s.createTestPerformerEdit(models.OperationEnumCreate, &models.PerformerEditDetailsInput{\n\t\tName: &name,\n\t}, nil, nil)\n\tassert.NoError(s.t, err)\n\n\t// Apply the edit\n\tappliedEdit, err := s.applyEdit(edit.ID)\n\tassert.NoError(s.t, err)\n\n\t// Get the created performer ID from the edit\n\ttarget, err := s.resolver.Edit().Target(s.ctx, appliedEdit)\n\tassert.NoError(s.t, err)\n\tperformer := target.(*models.Performer)\n\n\t// Get edits via resolver\n\tedits, err := s.resolver.Performer().Edits(s.ctx, performer)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, edits, \"Edits should not be nil\")\n\tassert.True(s.t, len(edits) >= 1, \"Performer should have at least one edit\")\n\n\t// Verify the edit we created is in the list\n\tfoundEdit := false\n\tfor _, e := range edits {\n\t\tif e.ID == edit.ID {\n\t\t\tfoundEdit = true\n\t\t\tbreak\n\t\t}\n\t}\n\tassert.True(s.t, foundEdit, \"Should find the create edit in performer's edits\")\n}\n\n// testPerformerSceneCount tests the scene_count resolver field\nfunc (s *performerResolverTestRunner) testPerformerSceneCount() {\n\t// Create a performer\n\tname := s.generatePerformerName()\n\tperformer, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName: name,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Initially should have 0 scenes\n\tsceneCount, err := s.resolver.Performer().SceneCount(s.ctx, performer)\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 0, sceneCount, \"New performer should have 0 scenes\")\n\n\t// Create a scene with this performer\n\tperformerID := performer.ID\n\tscene, err := s.resolver.Mutation().SceneCreate(s.ctx, models.SceneCreateInput{\n\t\tDate: \"2020-01-01\",\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\t{\n\t\t\t\tPerformerID: performerID,\n\t\t\t},\n\t\t},\n\t})\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, scene)\n\n\t// Refresh the performer\n\tperformer, err = s.resolver.Query().FindPerformer(s.ctx, performerID)\n\tassert.NoError(s.t, err)\n\n\t// Now should have 1 scene\n\tsceneCount, err = s.resolver.Performer().SceneCount(s.ctx, performer)\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, 1, sceneCount, \"Performer should have 1 scene\")\n}\n\n// testPerformerScenes tests the scenes resolver field\nfunc (s *performerResolverTestRunner) testPerformerScenes() {\n\t// Create a performer\n\tname := s.generatePerformerName()\n\tperformer, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName: name,\n\t})\n\tassert.NoError(s.t, err)\n\n\tperformerID := performer.ID\n\n\t// Create two scenes with this performer\n\tscene1, err := s.resolver.Mutation().SceneCreate(s.ctx, models.SceneCreateInput{\n\t\tDate: \"2020-01-01\",\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\t{PerformerID: performerID},\n\t\t},\n\t})\n\tassert.NoError(s.t, err)\n\n\tscene2, err := s.resolver.Mutation().SceneCreate(s.ctx, models.SceneCreateInput{\n\t\tDate: \"2020-02-02\",\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\t{PerformerID: performerID},\n\t\t},\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Refresh the performer\n\tperformer, err = s.resolver.Query().FindPerformer(s.ctx, performerID)\n\tassert.NoError(s.t, err)\n\n\t// Get scenes via resolver\n\tscenes, err := s.resolver.Performer().Scenes(s.ctx, performer, nil)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, scenes, \"Scenes should not be nil\")\n\tassert.True(s.t, len(scenes) >= 2, \"Performer should have at least 2 scenes\")\n\n\t// Verify our scenes are in the list\n\tfoundScene1 := false\n\tfoundScene2 := false\n\tfor _, scene := range scenes {\n\t\tif scene.ID == scene1.ID {\n\t\t\tfoundScene1 = true\n\t\t}\n\t\tif scene.ID == scene2.ID {\n\t\t\tfoundScene2 = true\n\t\t}\n\t}\n\tassert.True(s.t, foundScene1, \"Should find scene1 in performer's scenes\")\n\tassert.True(s.t, foundScene2, \"Should find scene2 in performer's scenes\")\n}\n\n// testPerformerStudios tests the studios resolver field\nfunc (s *performerResolverTestRunner) testPerformerStudios() {\n\t// Create a performer\n\tname := s.generatePerformerName()\n\tperformer, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName: name,\n\t})\n\tassert.NoError(s.t, err)\n\n\tperformerID := performer.ID\n\n\t// Create two different studios\n\tstudio1Name := s.generateStudioName()\n\tstudio1, err := s.resolver.Mutation().StudioCreate(s.ctx, models.StudioCreateInput{\n\t\tName: studio1Name,\n\t})\n\tassert.NoError(s.t, err)\n\n\tstudio2Name := s.generateStudioName()\n\tstudio2, err := s.resolver.Mutation().StudioCreate(s.ctx, models.StudioCreateInput{\n\t\tName: studio2Name,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Create scenes with this performer at different studios\n\t// Scene at studio1\n\t_, err = s.resolver.Mutation().SceneCreate(s.ctx, models.SceneCreateInput{\n\t\tDate:     \"2020-01-01\",\n\t\tStudioID: &studio1.ID,\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\t{PerformerID: performerID},\n\t\t},\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Scene at studio2\n\t_, err = s.resolver.Mutation().SceneCreate(s.ctx, models.SceneCreateInput{\n\t\tDate:     \"2020-02-02\",\n\t\tStudioID: &studio2.ID,\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\t{PerformerID: performerID},\n\t\t},\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Refresh the performer\n\tperformer, err = s.resolver.Query().FindPerformer(s.ctx, performerID)\n\tassert.NoError(s.t, err)\n\n\t// Get studios via resolver (nil studioID returns all studios)\n\tstudios, err := s.resolver.Performer().Studios(s.ctx, performer, nil)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, studios, \"Studios should not be nil\")\n\tassert.True(s.t, len(studios) >= 2, \"Performer should have appeared with at least 2 studios\")\n\n\t// Verify our studios are in the list\n\tfoundStudio1 := false\n\tfoundStudio2 := false\n\tfor _, ps := range studios {\n\t\tif ps.Studio.ID == studio1.ID {\n\t\t\tfoundStudio1 = true\n\t\t\tassert.True(s.t, ps.SceneCount >= 1, \"Studio1 should have at least 1 scene with this performer\")\n\t\t}\n\t\tif ps.Studio.ID == studio2.ID {\n\t\t\tfoundStudio2 = true\n\t\t\tassert.True(s.t, ps.SceneCount >= 1, \"Studio2 should have at least 1 scene with this performer\")\n\t\t}\n\t}\n\tassert.True(s.t, foundStudio1, \"Should find studio1 in performer's studios\")\n\tassert.True(s.t, foundStudio2, \"Should find studio2 in performer's studios\")\n}\n\n// testPerformerCreatedUpdated tests the created and updated timestamp fields\nfunc (s *performerResolverTestRunner) testPerformerCreatedUpdated() {\n\t// Create a performer\n\tname := s.generatePerformerName()\n\tperformer, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName: name,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Get created and updated timestamps - these are direct fields\n\tcreatedTime := performer.Created\n\tupdatedTime := performer.Updated\n\n\t// Initially, updated should equal created\n\tassert.Equal(s.t, createdTime, updatedTime, \"Updated should equal created for new performer\")\n\n\t// Wait a bit to ensure timestamps are different\n\ttime.Sleep(10 * time.Millisecond)\n\n\t// Update the performer\n\tperformerID := performer.ID\n\tnewAliases := []string{\"Updated Alias\"}\n\tctx := s.updateContext([]string{\"aliases\"})\n\tupdatedPerformer, err := s.resolver.Mutation().PerformerUpdate(ctx, models.PerformerUpdateInput{\n\t\tID:      performerID,\n\t\tAliases: newAliases,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Get new timestamps\n\tnewCreatedTime := updatedPerformer.Created\n\tnewUpdatedTime := updatedPerformer.Updated\n\n\t// Verify updated timestamp changed\n\tassert.True(s.t, newUpdatedTime.After(updatedTime), \"Updated timestamp should be after original\")\n\t// Created should remain the same\n\tassert.Equal(s.t, newCreatedTime, createdTime, \"Created timestamp should not change on update\")\n}\n\n// testPerformerAge tests the age calculated field\nfunc (s *performerResolverTestRunner) testPerformerAge() {\n\t// Create a performer with a known birthdate\n\tbirthdate := \"2000-01-01\"\n\tname := s.generatePerformerName()\n\tperformer, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName:      name,\n\t\tBirthdate: &birthdate,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Get age via resolver\n\tage, err := s.resolver.Performer().Age(s.ctx, performer)\n\tassert.NoError(s.t, err)\n\n\t// Age should be approximately current year - 2000\n\tcurrentYear := time.Now().Year()\n\texpectedAge := currentYear - 2000\n\tassert.NotNil(s.t, age, \"Age should not be nil for performer with birthdate\")\n\tassert.True(s.t, *age >= expectedAge-1 && *age <= expectedAge+1, \"Age should be approximately %d, got %d\", expectedAge, *age)\n\n\t// Create a performer without birthdate\n\tname2 := s.generatePerformerName()\n\tperformerNoBirthdate, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName: name2,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Age should be nil\n\tageNil, err := s.resolver.Performer().Age(s.ctx, performerNoBirthdate)\n\tassert.NoError(s.t, err)\n\tassert.Nil(s.t, ageNil, \"Age should be nil for performer without birthdate\")\n\n\t// Create a performer with a deathdate\n\tdeathdate := \"2020-06-15\"\n\tname3 := s.generatePerformerName()\n\tperformerDeceased, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName:      name3,\n\t\tBirthdate: &birthdate,\n\t\tDeathdate: &deathdate,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Age should be calculated from birthdate to deathdate\n\tageDeceased, err := s.resolver.Performer().Age(s.ctx, performerDeceased)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, ageDeceased, \"Age should not be nil for deceased performer with both dates\")\n\t// Age at death should be 20 (2020 - 2000)\n\tassert.Equal(s.t, *ageDeceased, 20, \"Age at death should be 20\")\n}\n\n// testPerformerAliases tests the aliases resolver field\nfunc (s *performerResolverTestRunner) testPerformerAliases() {\n\t// Create a performer with aliases\n\taliases := []string{\"Alias One\", \"Alias Two\", \"Alias Three\"}\n\tname := s.generatePerformerName()\n\tperformer, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName:    name,\n\t\tAliases: aliases,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Get aliases via resolver\n\tretrievedAliases, err := s.resolver.Performer().Aliases(s.ctx, performer)\n\tassert.NoError(s.t, err)\n\tassert.ElementsMatch(s.t, retrievedAliases, aliases)\n\n\t// Create performer without aliases\n\tname2 := s.generatePerformerName()\n\tperformerNoAliases, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName: name2,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Should have no aliases\n\temptyAliases, err := s.resolver.Performer().Aliases(s.ctx, performerNoAliases)\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, len(emptyAliases), 0, \"Performer without aliases should have no aliases\")\n}\n\n// testPerformerUrls tests the urls resolver field\nfunc (s *performerResolverTestRunner) testPerformerUrls() {\n\t// Create a site for URLs\n\tsiteName := s.generateSiteName()\n\tsite, err := s.resolver.Mutation().SiteCreate(s.ctx, models.SiteCreateInput{\n\t\tName: siteName,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Create a performer with URLs\n\turls := []models.URL{\n\t\t{URL: \"http://example.com/performer1\", SiteID: site.ID},\n\t\t{URL: \"http://example.com/performer2\", SiteID: site.ID},\n\t}\n\tname := s.generatePerformerName()\n\tperformer, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName: name,\n\t\tUrls: urls,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Get URLs via resolver\n\tretrievedUrls, err := s.resolver.Performer().Urls(s.ctx, performer)\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, len(retrievedUrls), len(urls), \"Should have same number of URLs\")\n\n\t// Verify URLs match\n\tfor i, url := range retrievedUrls {\n\t\tassert.Equal(s.t, url.URL, urls[i].URL, \"URL should match\")\n\t\tassert.Equal(s.t, url.SiteID, urls[i].SiteID, \"Site ID should match\")\n\t}\n}\n\n// testPerformerBirthdate tests the birthdate resolver field\nfunc (s *performerResolverTestRunner) testPerformerBirthdate() {\n\t// Create a performer with a birthdate\n\tbirthdate := \"2000-05-15\"\n\tname := s.generatePerformerName()\n\tperformer, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName:      name,\n\t\tBirthdate: &birthdate,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Get birthdate via resolver\n\tretrievedBirthdate, err := s.resolver.Performer().Birthdate(s.ctx, performer)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, retrievedBirthdate, \"Birthdate should not be nil\")\n\tassert.Equal(s.t, retrievedBirthdate.Date, birthdate, \"Birthdate should match\")\n\n\t// Create performer without birthdate\n\tname2 := s.generatePerformerName()\n\tperformerNoBirthdate, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName: name2,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Should be nil\n\tnilBirthdate, err := s.resolver.Performer().Birthdate(s.ctx, performerNoBirthdate)\n\tassert.NoError(s.t, err)\n\tassert.Nil(s.t, nilBirthdate, \"Birthdate should be nil for performer without birthdate\")\n}\n\n// testPerformerTattoosAndPiercings tests the tattoos and piercings resolver fields\nfunc (s *performerResolverTestRunner) testPerformerTattoosAndPiercings() {\n\ttattooDesc := \"Dragon on back\"\n\tpiercingDesc := \"Silver ring\"\n\n\t// Create a performer with tattoos and piercings\n\ttattoos := []models.BodyModificationInput{\n\t\t{Location: \"Back\", Description: &tattooDesc},\n\t\t{Location: \"Arm\", Description: nil},\n\t}\n\tpiercings := []models.BodyModificationInput{\n\t\t{Location: \"Nose\", Description: &piercingDesc},\n\t\t{Location: \"Navel\", Description: nil},\n\t}\n\n\tname := s.generatePerformerName()\n\tperformer, err := s.resolver.Mutation().PerformerCreate(s.ctx, models.PerformerCreateInput{\n\t\tName:      name,\n\t\tTattoos:   tattoos,\n\t\tPiercings: piercings,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Get tattoos via resolver\n\tretrievedTattoos, err := s.resolver.Performer().Tattoos(s.ctx, performer)\n\tassert.NoError(s.t, err)\n\tassertBodyMods(s.t, tattoos, retrievedTattoos, \"Tattoos should match\")\n\n\t// Get piercings via resolver\n\tretrievedPiercings, err := s.resolver.Performer().Piercings(s.ctx, performer)\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, len(retrievedPiercings), len(piercings), \"Should have same number of piercings\")\n\tassertBodyMods(s.t, piercings, retrievedPiercings, \"Piercings should match\")\n}\n\nfunc TestPerformerImages(t *testing.T) {\n\tpt := createPerformerResolverTestRunner(t)\n\tpt.testPerformerImages()\n}\n\nfunc TestPerformerDeleted(t *testing.T) {\n\tpt := createPerformerResolverTestRunner(t)\n\tpt.testPerformerDeleted()\n}\n\nfunc TestPerformerEdits(t *testing.T) {\n\tpt := createPerformerResolverTestRunner(t)\n\tpt.testPerformerEdits()\n}\n\nfunc TestPerformerSceneCount(t *testing.T) {\n\tpt := createPerformerResolverTestRunner(t)\n\tpt.testPerformerSceneCount()\n}\n\nfunc TestPerformerScenes(t *testing.T) {\n\tpt := createPerformerResolverTestRunner(t)\n\tpt.testPerformerScenes()\n}\n\nfunc TestPerformerStudios(t *testing.T) {\n\tpt := createPerformerResolverTestRunner(t)\n\tpt.testPerformerStudios()\n}\n\nfunc TestPerformerCreatedUpdated(t *testing.T) {\n\tpt := createPerformerResolverTestRunner(t)\n\tpt.testPerformerCreatedUpdated()\n}\n\nfunc TestPerformerAge(t *testing.T) {\n\tpt := createPerformerResolverTestRunner(t)\n\tpt.testPerformerAge()\n}\n\nfunc TestPerformerAliases(t *testing.T) {\n\tpt := createPerformerResolverTestRunner(t)\n\tpt.testPerformerAliases()\n}\n\nfunc TestPerformerUrls(t *testing.T) {\n\tpt := createPerformerResolverTestRunner(t)\n\tpt.testPerformerUrls()\n}\n\nfunc TestPerformerBirthdate(t *testing.T) {\n\tpt := createPerformerResolverTestRunner(t)\n\tpt.testPerformerBirthdate()\n}\n\nfunc TestPerformerTattoosAndPiercings(t *testing.T) {\n\tpt := createPerformerResolverTestRunner(t)\n\tpt.testPerformerTattoosAndPiercings()\n}\n"
  },
  {
    "path": "internal/api/resolver.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/service\"\n)\n\ntype Resolver struct {\n\tservices service.Factory\n}\n\nfunc NewResolver(fac service.Factory) *Resolver {\n\treturn &Resolver{\n\t\tservices: fac,\n\t}\n}\n\nfunc (r *Resolver) Mutation() models.MutationResolver {\n\treturn &mutationResolver{r}\n}\nfunc (r *Resolver) Edit() models.EditResolver {\n\treturn &editResolver{r}\n}\nfunc (r *Resolver) EditComment() models.EditCommentResolver {\n\treturn &editCommentResolver{r}\n}\nfunc (r *Resolver) EditVote() models.EditVoteResolver {\n\treturn &editVoteResolver{r}\n}\nfunc (r *Resolver) Performer() models.PerformerResolver {\n\treturn &performerResolver{r}\n}\nfunc (r *Resolver) PerformerEdit() models.PerformerEditResolver {\n\treturn &performerEditResolver{r}\n}\nfunc (r *Resolver) StudioEdit() models.StudioEditResolver {\n\treturn &studioEditResolver{r}\n}\nfunc (r *Resolver) TagEdit() models.TagEditResolver {\n\treturn &tagEditResolver{r}\n}\nfunc (r *Resolver) SceneEdit() models.SceneEditResolver {\n\treturn &sceneEditResolver{r}\n}\nfunc (r *Resolver) Tag() models.TagResolver {\n\treturn &tagResolver{r}\n}\nfunc (r *Resolver) TagCategory() models.TagCategoryResolver {\n\treturn &tagCategoryResolver{r}\n}\nfunc (r *Resolver) Image() models.ImageResolver {\n\treturn &imageResolver{r}\n}\nfunc (r *Resolver) Studio() models.StudioResolver {\n\treturn &studioResolver{r}\n}\nfunc (r *Resolver) Scene() models.SceneResolver {\n\treturn &sceneResolver{r}\n}\nfunc (r *Resolver) Site() models.SiteResolver {\n\treturn &siteResolver{r}\n}\nfunc (r *Resolver) URL() models.URLResolver {\n\treturn &urlResolver{r}\n}\nfunc (r *Resolver) User() models.UserResolver {\n\treturn &userResolver{r}\n}\nfunc (r *Resolver) Query() models.QueryResolver {\n\treturn &queryResolver{r}\n}\nfunc (r *Resolver) QueryPerformersResultType() models.QueryPerformersResultTypeResolver {\n\treturn &queryPerformerResolver{r}\n}\nfunc (r *Resolver) QueryScenesResultType() models.QueryScenesResultTypeResolver {\n\treturn &querySceneResolver{r}\n}\nfunc (r *Resolver) QueryEditsResultType() models.QueryEditsResultTypeResolver {\n\treturn &queryEditResolver{r}\n}\nfunc (r *Resolver) Draft() models.DraftResolver {\n\treturn &draftResolver{r}\n}\nfunc (r *Resolver) PerformerDraft() models.PerformerDraftResolver {\n\treturn &performerDraftResolver{r}\n}\nfunc (r *Resolver) SceneDraft() models.SceneDraftResolver {\n\treturn &sceneDraftResolver{r}\n}\nfunc (r *Resolver) QueryExistingSceneResult() models.QueryExistingSceneResultResolver {\n\treturn &queryExistingSceneResolver{r}\n}\nfunc (r *Resolver) QueryExistingPerformerResult() models.QueryExistingPerformerResultResolver {\n\treturn &queryExistingPerformerResolver{r}\n}\nfunc (r *Resolver) QueryNotificationsResult() models.QueryNotificationsResultResolver {\n\treturn &queryNotificationsResolver{r}\n}\nfunc (r *Resolver) Notification() models.NotificationResolver {\n\treturn &notificationResolver{r}\n}\nfunc (r *Resolver) QueryModAuditsResultType() models.QueryModAuditsResultTypeResolver {\n\treturn &queryModAuditResolver{r}\n}\nfunc (r *Resolver) ModAudit() models.ModAuditResolver {\n\treturn &modAuditResolver{r}\n}\n\ntype mutationResolver struct{ *Resolver }\n\ntype queryResolver struct{ *Resolver }\n\nfunc (r *queryResolver) Version(ctx context.Context) (*models.Version, error) {\n\tversion, githash, buildstamp := GetVersion()\n\n\treturn &models.Version{\n\t\tVersion:   version,\n\t\tHash:      githash,\n\t\tBuildTime: buildstamp,\n\t\tBuildType: buildtype,\n\t}, nil\n}\n\nfunc (r *queryResolver) GetConfig(ctx context.Context) (*models.StashBoxConfig, error) {\n\treturn &models.StashBoxConfig{\n\t\tHostURL:                    config.GetHostURL(),\n\t\tRequireInvite:              config.GetRequireInvite(),\n\t\tRequireActivation:          config.GetRequireActivation(),\n\t\tVotePromotionThreshold:     config.GetVotePromotionThreshold(),\n\t\tVoteApplicationThreshold:   config.GetVoteApplicationThreshold(),\n\t\tVotingPeriod:               config.GetVotingPeriod(),\n\t\tMinDestructiveVotingPeriod: config.GetMinDestructiveVotingPeriod(),\n\t\tVoteCronInterval:           config.GetVoteCronInterval(),\n\t\tGuidelinesURL:              config.GetGuidelinesURL(),\n\t\tRequireSceneDraft:          config.GetRequireSceneDraft(),\n\t\tEditUpdateLimit:            config.GetEditUpdateLimit(),\n\t\tRequireTagRole:             config.GetRequireTagRole(),\n\t}, nil\n}\n"
  },
  {
    "path": "internal/api/resolver_model_draft.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype draftResolver struct{ *Resolver }\n\nfunc (r *draftResolver) Created(ctx context.Context, obj *models.Draft) (*time.Time, error) {\n\treturn &obj.CreatedAt, nil\n}\n\nfunc (r *draftResolver) Expires(ctx context.Context, obj *models.Draft) (*time.Time, error) {\n\tduration := time.Second * time.Duration(config.GetDraftTimeLimit())\n\texpiration := obj.CreatedAt.Add(duration)\n\treturn &expiration, nil\n}\n\nfunc (r *draftResolver) Data(ctx context.Context, obj *models.Draft) (models.DraftData, error) {\n\tswitch obj.Type {\n\tcase \"SCENE\":\n\t\treturn obj.GetSceneData()\n\tcase \"PERFORMER\":\n\t\treturn obj.GetPerformerData()\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported type: %s\", obj.Type)\n\t}\n}\n"
  },
  {
    "path": "internal/api/resolver_model_edit.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\ntype editResolver struct{ *Resolver }\n\nfunc (r *editResolver) ID(ctx context.Context, obj *models.Edit) (string, error) {\n\treturn obj.ID.String(), nil\n}\n\nfunc (r *editResolver) User(ctx context.Context, obj *models.Edit) (*models.User, error) {\n\tif obj.UserID.UUID.IsNil() {\n\t\treturn nil, nil\n\t}\n\n\treturn r.services.User().FindByID(ctx, obj.UserID.UUID)\n}\n\nfunc (r *editResolver) Created(ctx context.Context, obj *models.Edit) (*time.Time, error) {\n\treturn &obj.CreatedAt, nil\n}\n\nfunc (r *editResolver) Updated(ctx context.Context, obj *models.Edit) (*time.Time, error) {\n\treturn obj.UpdatedAt, nil\n}\n\nfunc (r *editResolver) Closed(ctx context.Context, obj *models.Edit) (*time.Time, error) {\n\treturn obj.ClosedAt, nil\n}\n\nfunc (r *editResolver) Expires(ctx context.Context, obj *models.Edit) (*time.Time, error) {\n\tif obj.Status != models.VoteStatusEnumPending.String() {\n\t\treturn nil, nil\n\t}\n\n\t// Count expiration time from creation, or time when edit was amended\n\tstartTime := obj.CreatedAt\n\tif obj.UpdatedAt != nil {\n\t\tstartTime = *obj.UpdatedAt\n\t}\n\n\t// Pending edits that have reached the voting threshold have shorter voting periods.\n\t// This will happen for destructive edits, or when votes are not unanimous.\n\tshort := config.GetVoteApplicationThreshold() > 0 && obj.VoteCount >= config.GetVoteApplicationThreshold()\n\tduration := config.GetVotingPeriod()\n\tif short {\n\t\tduration = config.GetMinDestructiveVotingPeriod()\n\t}\n\n\texpiration := startTime.Add(time.Second * time.Duration(duration))\n\treturn &expiration, nil\n}\n\nfunc (r *editResolver) Target(ctx context.Context, obj *models.Edit) (models.EditTarget, error) {\n\tvar operation models.OperationEnum\n\tvar status models.VoteStatusEnum\n\tutils.ResolveEnumString(obj.Operation, &operation)\n\tutils.ResolveEnumString(obj.Status, &status)\n\tif operation == models.OperationEnumCreate && status != models.VoteStatusEnumAccepted && status != models.VoteStatusEnumImmediateAccepted {\n\t\treturn nil, nil\n\t}\n\n\treturn r.services.Edit().GetEditTarget(ctx, obj.ID)\n}\n\nfunc (r *editResolver) TargetType(ctx context.Context, obj *models.Edit) (models.TargetTypeEnum, error) {\n\tvar ret models.TargetTypeEnum\n\tif !utils.ResolveEnumString(obj.TargetType, &ret) {\n\t\treturn \"\", nil\n\t}\n\n\treturn ret, nil\n}\n\nfunc (r *editResolver) MergeSources(ctx context.Context, obj *models.Edit) ([]models.EditTarget, error) {\n\teditData := obj.GetData()\n\tif editData == nil {\n\t\treturn nil, nil\n\t}\n\n\tif len(editData.MergeSources) == 0 {\n\t\treturn nil, nil\n\t}\n\n\treturn r.services.Edit().GetMergeSources(ctx, editData.MergeSources, obj.TargetType)\n}\n\nfunc (r *editResolver) Operation(ctx context.Context, obj *models.Edit) (models.OperationEnum, error) {\n\tvar ret models.OperationEnum\n\tif !utils.ResolveEnumString(obj.Operation, &ret) {\n\t\treturn \"\", nil\n\t}\n\n\treturn ret, nil\n}\n\nfunc (r *editResolver) Details(ctx context.Context, obj *models.Edit) (models.EditDetails, error) {\n\tvar ret models.EditDetails\n\tvar targetType models.TargetTypeEnum\n\tutils.ResolveEnumString(obj.TargetType, &targetType)\n\n\tswitch targetType {\n\tcase models.TargetTypeEnumTag:\n\t\ttagData, err := obj.GetTagData()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif tagData.New != nil {\n\t\t\ttagData.New.EditID = obj.ID\n\t\t}\n\t\tret = tagData.New\n\tcase models.TargetTypeEnumPerformer:\n\t\tperformerData, err := obj.GetPerformerData()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif performerData.New != nil {\n\t\t\tperformerData.New.EditID = obj.ID\n\t\t}\n\t\tret = performerData.New\n\tcase models.TargetTypeEnumStudio:\n\t\tstudioData, err := obj.GetStudioData()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif studioData.New != nil {\n\t\t\tstudioData.New.EditID = obj.ID\n\t\t}\n\t\tret = studioData.New\n\tcase models.TargetTypeEnumScene:\n\t\tsceneData, err := obj.GetSceneData()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif sceneData.New != nil {\n\t\t\tsceneData.New.EditID = obj.ID\n\t\t}\n\t\tret = sceneData.New\n\t}\n\n\treturn ret, nil\n}\n\nfunc (r *editResolver) OldDetails(ctx context.Context, obj *models.Edit) (models.EditDetails, error) {\n\tvar ret models.EditDetails\n\tvar targetType models.TargetTypeEnum\n\tutils.ResolveEnumString(obj.TargetType, &targetType)\n\n\tswitch targetType {\n\tcase models.TargetTypeEnumTag:\n\t\ttagData, err := obj.GetTagData()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = tagData.Old\n\tcase models.TargetTypeEnumPerformer:\n\t\tperformerData, err := obj.GetPerformerData()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = performerData.Old\n\tcase models.TargetTypeEnumStudio:\n\t\tstudioData, err := obj.GetStudioData()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = studioData.Old\n\tcase models.TargetTypeEnumScene:\n\t\tsceneData, err := obj.GetSceneData()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = sceneData.Old\n\t}\n\n\treturn ret, nil\n}\n\nfunc (r *editResolver) Comments(ctx context.Context, obj *models.Edit) ([]models.EditComment, error) {\n\treturn r.services.Edit().GetComments(ctx, obj.ID)\n}\n\nfunc (r *editResolver) Votes(ctx context.Context, obj *models.Edit) ([]models.EditVote, error) {\n\treturn r.services.Edit().GetVotes(ctx, obj.ID)\n}\n\nfunc (r *editResolver) Status(ctx context.Context, obj *models.Edit) (models.VoteStatusEnum, error) {\n\tvar ret models.VoteStatusEnum\n\tif !utils.ResolveEnumString(obj.Status, &ret) {\n\t\treturn \"\", nil\n\t}\n\n\treturn ret, nil\n}\n\nfunc (r *editResolver) Options(ctx context.Context, obj *models.Edit) (*models.PerformerEditOptions, error) {\n\tif obj.TargetType == models.TargetTypeEnumPerformer.String() {\n\t\tdata, err := obj.GetPerformerData()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\toptions := models.PerformerEditOptions{\n\t\t\tSetMergeAliases:  data.SetMergeAliases,\n\t\t\tSetModifyAliases: data.SetModifyAliases,\n\t\t}\n\t\treturn &options, nil\n\t}\n\treturn nil, nil\n}\n\nfunc (r *editResolver) Destructive(ctx context.Context, obj *models.Edit) (bool, error) {\n\treturn obj.IsDestructive(), nil\n}\n\nfunc (r *editResolver) Updatable(ctx context.Context, obj *models.Edit) (bool, error) {\n\tuser := auth.GetCurrentUser(ctx)\n\n\tif user.ID != obj.UserID.UUID {\n\t\treturn false, nil\n\t}\n\n\tif obj.UpdateCount >= config.GetEditUpdateLimit() {\n\t\treturn false, nil\n\t}\n\n\tif obj.Operation == models.OperationEnumDestroy.String() {\n\t\treturn false, nil\n\t}\n\n\treturn true, nil\n}\n"
  },
  {
    "path": "internal/api/resolver_model_edit_comment.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype editCommentResolver struct{ *Resolver }\n\nfunc (r *editCommentResolver) ID(ctx context.Context, obj *models.EditComment) (string, error) {\n\treturn obj.ID.String(), nil\n}\n\nfunc (r *editCommentResolver) Comment(ctx context.Context, obj *models.EditComment) (string, error) {\n\treturn obj.Text, nil\n}\n\nfunc (r *editCommentResolver) Date(ctx context.Context, obj *models.EditComment) (*time.Time, error) {\n\treturn &obj.CreatedAt, nil\n}\n\nfunc (r *editCommentResolver) User(ctx context.Context, obj *models.EditComment) (*models.User, error) {\n\tif obj.UserID.UUID.IsNil() {\n\t\treturn nil, nil\n\t}\n\n\treturn r.services.User().FindByID(ctx, obj.UserID.UUID)\n}\n\nfunc (r *editCommentResolver) Edit(ctx context.Context, obj *models.EditComment) (*models.Edit, error) {\n\treturn r.services.Edit().FindByID(ctx, obj.EditID)\n}\n"
  },
  {
    "path": "internal/api/resolver_model_edit_vote.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\ntype editVoteResolver struct{ *Resolver }\n\nfunc (r *editVoteResolver) Vote(ctx context.Context, obj *models.EditVote) (models.VoteTypeEnum, error) {\n\tvar ret models.VoteTypeEnum\n\tif !utils.ResolveEnumString(obj.Vote, &ret) {\n\t\treturn \"\", nil\n\t}\n\treturn ret, nil\n}\n\nfunc (r *editVoteResolver) Date(ctx context.Context, obj *models.EditVote) (*time.Time, error) {\n\treturn &obj.CreatedAt, nil\n}\n\nfunc (r *editVoteResolver) User(ctx context.Context, obj *models.EditVote) (*models.User, error) {\n\t// User votes only available to users with vote permission\n\tif err := auth.ValidateRole(ctx, models.RoleEnumVote); err != nil {\n\t\treturn nil, nil\n\t}\n\n\treturn r.services.User().FindByID(ctx, obj.UserID)\n}\n"
  },
  {
    "path": "internal/api/resolver_model_image.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype imageResolver struct{ *Resolver }\n\nfunc (r *imageResolver) ID(ctx context.Context, obj *models.Image) (string, error) {\n\treturn obj.ID.String(), nil\n}\nfunc (r *imageResolver) URL(ctx context.Context, obj *models.Image) (string, error) {\n\tbaseURL := ctx.Value(BaseURLCtxKey).(string)\n\tid := obj.ID.String()\n\treturn baseURL + \"/images/\" + id, nil\n}\n"
  },
  {
    "path": "internal/api/resolver_model_notification.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/stashapp/stash-box/internal/dataloader\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype notificationResolver struct{ *Resolver }\n\nfunc (r *notificationResolver) Created(ctx context.Context, obj *models.Notification) (*time.Time, error) {\n\treturn &obj.CreatedAt, nil\n}\n\nfunc (r *notificationResolver) Read(ctx context.Context, obj *models.Notification) (bool, error) {\n\treturn obj.ReadAt != nil, nil\n}\n\nfunc (r *notificationResolver) Data(ctx context.Context, obj *models.Notification) (models.NotificationData, error) {\n\tswitch obj.Type {\n\tcase models.NotificationEnumCommentCommentedEdit:\n\t\tfallthrough\n\tcase models.NotificationEnumCommentOwnEdit:\n\t\tfallthrough\n\tcase models.NotificationEnumCommentVotedEdit:\n\t\tcomment, err := dataloader.For(ctx).EditCommentByID.Load(obj.TargetID)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tswitch obj.Type {\n\t\tcase models.NotificationEnumCommentCommentedEdit:\n\t\t\treturn &models.CommentCommentedEdit{Comment: comment}, nil\n\t\tcase models.NotificationEnumCommentOwnEdit:\n\t\t\treturn &models.CommentOwnEdit{Comment: comment}, nil\n\t\tdefault:\n\t\t\treturn &models.CommentVotedEdit{Comment: comment}, nil\n\t\t}\n\n\tcase models.NotificationEnumFavoritePerformerScene:\n\t\tfallthrough\n\tcase models.NotificationEnumFavoriteStudioScene:\n\t\tscene, err := dataloader.For(ctx).SceneByID.Load(obj.TargetID)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif obj.Type == models.NotificationEnumFavoritePerformerScene {\n\t\t\treturn &models.FavoritePerformerScene{Scene: scene}, nil\n\t\t}\n\t\treturn &models.FavoriteStudioScene{Scene: scene}, nil\n\n\tcase models.NotificationEnumFavoritePerformerEdit:\n\t\tfallthrough\n\tcase models.NotificationEnumFavoriteStudioEdit:\n\t\tfallthrough\n\tcase models.NotificationEnumDownvoteOwnEdit:\n\t\tfallthrough\n\tcase models.NotificationEnumFailedOwnEdit:\n\t\tfallthrough\n\tcase models.NotificationEnumFingerprintedSceneEdit:\n\t\tfallthrough\n\tcase models.NotificationEnumUpdatedEdit:\n\t\tedit, err := dataloader.For(ctx).EditByID.Load(obj.TargetID)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// nolint:exhaustive\n\t\tswitch obj.Type {\n\t\tcase models.NotificationEnumFavoritePerformerEdit:\n\t\t\treturn &models.FavoritePerformerEdit{Edit: edit}, nil\n\t\tcase models.NotificationEnumFavoriteStudioEdit:\n\t\t\treturn &models.FavoriteStudioEdit{Edit: edit}, nil\n\t\tcase models.NotificationEnumDownvoteOwnEdit:\n\t\t\treturn &models.DownvoteOwnEdit{Edit: edit}, nil\n\t\tcase models.NotificationEnumFailedOwnEdit:\n\t\t\treturn &models.FailedOwnEdit{Edit: edit}, nil\n\t\tcase models.NotificationEnumUpdatedEdit:\n\t\t\treturn &models.UpdatedEdit{Edit: edit}, nil\n\t\tcase models.NotificationEnumFingerprintedSceneEdit:\n\t\t\treturn &models.FingerprintedSceneEdit{Edit: edit}, nil\n\t\t}\n\t}\n\treturn nil, nil\n}\n"
  },
  {
    "path": "internal/api/resolver_model_performer.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sort\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/dataloader\"\n\t\"github.com/stashapp/stash-box/internal/image\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\ntype performerResolver struct{ *Resolver }\n\nfunc (r *performerResolver) ID(ctx context.Context, obj *models.Performer) (string, error) {\n\treturn obj.ID.String(), nil\n}\n\nfunc (r *performerResolver) Aliases(ctx context.Context, obj *models.Performer) ([]string, error) {\n\taliases, err := dataloader.For(ctx).PerformerAliasesByID.Load(obj.ID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsort.Strings(aliases)\n\n\treturn aliases, nil\n}\n\nfunc (r *performerResolver) Urls(ctx context.Context, obj *models.Performer) ([]models.URL, error) {\n\treturn dataloader.For(ctx).PerformerUrlsByID.Load(obj.ID)\n}\n\n// Deprecated: use `BirthDate`\nfunc (r *performerResolver) Birthdate(ctx context.Context, obj *models.Performer) (*models.FuzzyDate, error) {\n\treturn resolveFuzzyDate(obj.BirthDate), nil\n}\n\nfunc (r *performerResolver) Age(ctx context.Context, obj *models.Performer) (*int, error) {\n\tif obj.BirthDate == nil {\n\t\treturn nil, nil\n\t}\n\n\tbirthdate, err := utils.ParseDateStringAsTime(*obj.BirthDate)\n\tif err != nil {\n\t\treturn nil, nil\n\t}\n\n\tend := time.Now()\n\tif obj.DeathDate != nil {\n\t\tdeathdate, err := utils.ParseDateStringAsTime(*obj.DeathDate)\n\t\tif err == nil {\n\t\t\tend = deathdate\n\t\t}\n\t}\n\n\tbirthYear := birthdate.Year()\n\tthisYear := end.Year()\n\tage := thisYear - birthYear\n\n\tif end.YearDay() < birthdate.YearDay() {\n\t\tage--\n\t}\n\n\treturn &age, nil\n}\n\nfunc (r *performerResolver) Measurements(ctx context.Context, obj *models.Performer) (*models.Measurements, error) {\n\tret := models.Measurements{\n\t\tBandSize: obj.BandSize,\n\t\tCupSize:  obj.CupSize,\n\t\tHip:      obj.HipSize,\n\t\tWaist:    obj.WaistSize,\n\t}\n\treturn &ret, nil\n}\n\nfunc (r *performerResolver) Tattoos(ctx context.Context, obj *models.Performer) ([]models.BodyModification, error) {\n\treturn dataloader.For(ctx).PerformerTattoosByID.Load(obj.ID)\n}\n\nfunc (r *performerResolver) Piercings(ctx context.Context, obj *models.Performer) ([]models.BodyModification, error) {\n\treturn dataloader.For(ctx).PerformerPiercingsByID.Load(obj.ID)\n}\n\nfunc (r *performerResolver) Images(ctx context.Context, obj *models.Performer) ([]models.Image, error) {\n\timageIDs, err := dataloader.For(ctx).PerformerImageIDsByID.Load(obj.ID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\timages, err := imageList(ctx, imageIDs)\n\timage.OrderPortrait(images)\n\treturn images, err\n}\n\nfunc (r *performerResolver) Edits(ctx context.Context, obj *models.Performer) ([]models.Edit, error) {\n\treturn r.services.Edit().FindByPerformerID(ctx, obj.ID)\n}\n\nfunc (r *performerResolver) SceneCount(ctx context.Context, obj *models.Performer) (int, error) {\n\treturn r.services.Scene().CountByPerformer(ctx, obj.ID)\n}\n\nfunc (r *performerResolver) Scenes(ctx context.Context, obj *models.Performer, input *models.PerformerScenesInput) ([]models.Scene, error) {\n\tperformers := []uuid.UUID{\n\t\tobj.ID,\n\t}\n\tif input != nil && input.PerformedWith != nil {\n\t\tperformers = append(performers, *input.PerformedWith)\n\t}\n\n\tvar studios *models.MultiIDCriterionInput\n\tif input != nil && input.StudioID != nil {\n\t\tstudios = &models.MultiIDCriterionInput{\n\t\t\tModifier: models.CriterionModifierIncludes,\n\t\t\tValue:    []uuid.UUID{*input.StudioID},\n\t\t}\n\t}\n\n\tvar tags *models.MultiIDCriterionInput\n\tif input != nil {\n\t\ttags = input.Tags\n\t}\n\n\tfilter := models.SceneQueryInput{\n\t\tPerformers: &models.MultiIDCriterionInput{\n\t\t\tModifier: models.CriterionModifierIncludesAll,\n\t\t\tValue:    performers,\n\t\t},\n\t\tStudios:   studios,\n\t\tTags:      tags,\n\t\tSort:      \"DATE\",\n\t\tDirection: \"DESC\",\n\t\tPage:      1,\n\t\tPerPage:   10,\n\t}\n\n\treturn r.services.Scene().Query(ctx, filter)\n}\n\nfunc (r *performerResolver) MergedIds(ctx context.Context, obj *models.Performer) ([]uuid.UUID, error) {\n\treturn dataloader.For(ctx).PerformerMergeIDsBySourceID.Load(obj.ID)\n}\n\nfunc (r *performerResolver) MergedIntoID(ctx context.Context, obj *models.Performer) (*uuid.UUID, error) {\n\tres, err := dataloader.For(ctx).PerformerMergeIDsByID.Load(obj.ID)\n\tif len(res) == 1 {\n\t\treturn &res[0], err\n\t} else if err != nil && len(res) > 1 {\n\t\treturn nil, fmt.Errorf(\"invalid number of results returned, expecting exactly 1, found %d\", len(res))\n\t}\n\treturn nil, err\n}\n\nfunc (r *performerResolver) Studios(ctx context.Context, obj *models.Performer, studioID *uuid.UUID) ([]models.PerformerStudio, error) {\n\treturn r.services.Studio().CountByPerformer(ctx, obj.ID, studioID)\n}\n\nfunc (r *performerResolver) IsFavorite(ctx context.Context, obj *models.Performer) (bool, error) {\n\treturn dataloader.For(ctx).PerformerIsFavoriteByID.Load(obj.ID)\n}\n"
  },
  {
    "path": "internal/api/resolver_model_performer_draft.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype performerDraftResolver struct{ *Resolver }\n\nfunc (r *performerDraftResolver) ID(ctx context.Context, obj *models.PerformerDraft) (*string, error) {\n\tif obj.ID != nil {\n\t\tval := obj.ID.String()\n\t\treturn &val, nil\n\t}\n\treturn nil, nil\n}\n\nfunc (r *performerDraftResolver) Image(ctx context.Context, obj *models.PerformerDraft) (*models.Image, error) {\n\tif obj.Image == nil {\n\t\treturn nil, nil\n\t}\n\n\treturn r.services.Image().Find(ctx, *obj.Image)\n}\n"
  },
  {
    "path": "internal/api/resolver_model_performer_edit.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\ntype performerEditResolver struct{ *Resolver }\n\nfunc (r *performerEditResolver) Gender(ctx context.Context, obj *models.PerformerEdit) (*models.GenderEnum, error) {\n\tvar ret models.GenderEnum\n\tif obj.Gender == nil || !utils.ResolveEnumString(*obj.Gender, &ret) {\n\t\treturn nil, nil\n\t}\n\n\treturn &ret, nil\n}\n\nfunc (r *performerEditResolver) HairColor(ctx context.Context, obj *models.PerformerEdit) (*models.HairColorEnum, error) {\n\tvar ret models.HairColorEnum\n\tif obj.HairColor == nil || !utils.ResolveEnumString(*obj.HairColor, &ret) {\n\t\treturn nil, nil\n\t}\n\n\treturn &ret, nil\n}\n\nfunc (r *performerEditResolver) EyeColor(ctx context.Context, obj *models.PerformerEdit) (*models.EyeColorEnum, error) {\n\tvar ret models.EyeColorEnum\n\tif obj.EyeColor == nil || !utils.ResolveEnumString(*obj.EyeColor, &ret) {\n\t\treturn nil, nil\n\t}\n\n\treturn &ret, nil\n}\n\nfunc (r *performerEditResolver) Ethnicity(ctx context.Context, obj *models.PerformerEdit) (*models.EthnicityEnum, error) {\n\tvar ret models.EthnicityEnum\n\tif obj.Ethnicity == nil || !utils.ResolveEnumString(*obj.Ethnicity, &ret) {\n\t\treturn nil, nil\n\t}\n\n\treturn &ret, nil\n}\n\nfunc (r *performerEditResolver) BreastType(ctx context.Context, obj *models.PerformerEdit) (*models.BreastTypeEnum, error) {\n\tvar ret models.BreastTypeEnum\n\tif obj.BreastType == nil || !utils.ResolveEnumString(*obj.BreastType, &ret) {\n\t\treturn nil, nil\n\t}\n\n\treturn &ret, nil\n}\n\nfunc (r *performerEditResolver) AddedImages(ctx context.Context, obj *models.PerformerEdit) ([]models.Image, error) {\n\treturn imageList(ctx, obj.AddedImages)\n}\n\nfunc (r *performerEditResolver) RemovedImages(ctx context.Context, obj *models.PerformerEdit) ([]models.Image, error) {\n\treturn imageList(ctx, obj.RemovedImages)\n}\n\nfunc (r *performerEditResolver) Images(ctx context.Context, obj *models.PerformerEdit) ([]models.Image, error) {\n\treturn r.services.Edit().GetMergedImages(ctx, obj.EditID)\n}\n\nfunc (r *performerEditResolver) Urls(ctx context.Context, obj *models.PerformerEdit) ([]models.URL, error) {\n\treturn r.services.Edit().GetMergedURLs(ctx, obj.EditID)\n}\n\nfunc (r *performerEditResolver) Aliases(ctx context.Context, obj *models.PerformerEdit) ([]string, error) {\n\treturn r.services.Edit().GetMergedPerformerAliases(ctx, obj.EditID)\n}\n\nfunc (r *performerEditResolver) Tattoos(ctx context.Context, obj *models.PerformerEdit) ([]models.BodyModification, error) {\n\treturn r.services.Edit().GetMergedPerformerTattoos(ctx, obj.EditID)\n}\n\nfunc (r *performerEditResolver) Piercings(ctx context.Context, obj *models.PerformerEdit) ([]models.BodyModification, error) {\n\treturn r.services.Edit().GetMergedPerformerPiercings(ctx, obj.EditID)\n}\n"
  },
  {
    "path": "internal/api/resolver_model_scene.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/stashapp/stash-box/internal/dataloader\"\n\t\"github.com/stashapp/stash-box/internal/image\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype sceneResolver struct{ *Resolver }\n\nfunc (r *sceneResolver) ID(ctx context.Context, obj *models.Scene) (string, error) {\n\treturn obj.ID.String(), nil\n}\n\n// Deprecated: use `ReleaseDate`\nfunc (r *sceneResolver) Date(ctx context.Context, obj *models.Scene) (*string, error) {\n\tret := resolveFuzzyDate(obj.Date)\n\tif ret != nil {\n\t\treturn &ret.Date, nil\n\t}\n\treturn nil, nil\n}\n\nfunc (r *sceneResolver) ReleaseDate(ctx context.Context, obj *models.Scene) (*string, error) {\n\treturn obj.Date, nil\n}\n\nfunc (r *sceneResolver) Studio(ctx context.Context, obj *models.Scene) (*models.Studio, error) {\n\tif !obj.StudioID.Valid {\n\t\treturn nil, nil\n\t}\n\n\tstudio, err := dataloader.For(ctx).StudioByID.Load(obj.StudioID.UUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn studio, nil\n}\n\nfunc (r *sceneResolver) Tags(ctx context.Context, obj *models.Scene) ([]models.Tag, error) {\n\ttagIDs, err := dataloader.For(ctx).SceneTagIDsByID.Load(obj.ID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn tagList(ctx, tagIDs)\n}\n\nfunc (r *sceneResolver) Images(ctx context.Context, obj *models.Scene) ([]models.Image, error) {\n\timageIDs, err := dataloader.For(ctx).SceneImageIDsByID.Load(obj.ID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\timages, err := imageList(ctx, imageIDs)\n\timage.OrderLandscape(images)\n\treturn images, err\n}\n\nfunc (r *sceneResolver) Performers(ctx context.Context, obj *models.Scene) ([]models.PerformerAppearance, error) {\n\tappearances, err := dataloader.For(ctx).SceneAppearancesByID.Load(obj.ID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar ret []models.PerformerAppearance\n\tfor _, appearance := range appearances {\n\t\tperformer, err := dataloader.For(ctx).PerformerByID.Load(appearance.PerformerID)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tretApp := models.PerformerAppearance{\n\t\t\tPerformer: performer,\n\t\t\tAs:        appearance.As,\n\t\t}\n\t\tret = append(ret, retApp)\n\t}\n\n\treturn ret, nil\n}\n\nfunc (r *sceneResolver) Fingerprints(ctx context.Context, obj *models.Scene, isSubmitted *bool) ([]models.Fingerprint, error) {\n\tif isSubmitted != nil && *isSubmitted {\n\t\treturn dataloader.For(ctx).SubmittedSceneFingerprintsByID.Load(obj.ID)\n\t}\n\treturn dataloader.For(ctx).SceneFingerprintsByID.Load(obj.ID)\n}\n\nfunc (r *sceneResolver) Urls(ctx context.Context, obj *models.Scene) ([]models.URL, error) {\n\treturn dataloader.For(ctx).SceneUrlsByID.Load(obj.ID)\n}\n\nfunc (r *sceneResolver) Edits(ctx context.Context, obj *models.Scene) ([]models.Edit, error) {\n\treturn r.services.Edit().FindBySceneID(ctx, obj.ID)\n}\n\nfunc (r *sceneResolver) Created(ctx context.Context, obj *models.Scene) (*time.Time, error) {\n\treturn &obj.CreatedAt, nil\n}\n\nfunc (r *sceneResolver) Updated(ctx context.Context, obj *models.Scene) (*time.Time, error) {\n\treturn &obj.UpdatedAt, nil\n}\n"
  },
  {
    "path": "internal/api/resolver_model_scene_draft.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype sceneDraftResolver struct{ *Resolver }\n\nfunc (r *sceneDraftResolver) ID(ctx context.Context, obj *models.SceneDraft) (*string, error) {\n\tif obj.ID != nil {\n\t\tval := obj.ID.String()\n\t\treturn &val, nil\n\t}\n\treturn nil, nil\n}\n\nfunc (r *sceneDraftResolver) Image(ctx context.Context, obj *models.SceneDraft) (*models.Image, error) {\n\tif obj.Image == nil {\n\t\treturn nil, nil\n\t}\n\n\treturn r.services.Image().Find(ctx, *obj.Image)\n}\n\nfunc (r *sceneDraftResolver) Performers(ctx context.Context, obj *models.SceneDraft) ([]models.SceneDraftPerformer, error) {\n\treturn r.services.Draft().FindPerformers(ctx, obj.Performers)\n}\n\nfunc (r *sceneDraftResolver) Tags(ctx context.Context, obj *models.SceneDraft) ([]models.SceneDraftTag, error) {\n\treturn r.services.Draft().FindTags(ctx, obj.Tags)\n}\n\nfunc (r *sceneDraftResolver) Studio(ctx context.Context, obj *models.SceneDraft) (models.SceneDraftStudio, error) {\n\treturn r.services.Draft().FindStudio(ctx, obj.Studio)\n}\n"
  },
  {
    "path": "internal/api/resolver_model_scene_edit.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/dataloader\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype sceneEditResolver struct{ *Resolver }\n\nfunc (r *sceneEditResolver) Studio(ctx context.Context, obj *models.SceneEdit) (*models.Studio, error) {\n\tif obj.StudioID == nil {\n\t\treturn nil, nil\n\t}\n\n\treturn r.services.Studio().FindByID(ctx, *obj.StudioID)\n}\n\nfunc (r *sceneEditResolver) performerAppearanceList(ctx context.Context, performers []models.PerformerAppearanceInput) ([]models.PerformerAppearance, error) {\n\tif len(performers) == 0 {\n\t\treturn nil, nil\n\t}\n\n\tvar uuids []uuid.UUID\n\tfor _, p := range performers {\n\t\tuuids = append(uuids, p.PerformerID)\n\t}\n\tloadedPerformers, errors := dataloader.For(ctx).PerformerByID.LoadAll(uuids)\n\tfor _, err := range errors {\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tvar ret []models.PerformerAppearance\n\tfor i, p := range performers {\n\t\trr := models.PerformerAppearance{\n\t\t\tPerformer: loadedPerformers[i],\n\t\t\tAs:        p.As,\n\t\t}\n\t\tret = append(ret, rr)\n\t}\n\n\treturn ret, nil\n}\n\nfunc (r *sceneEditResolver) AddedPerformers(ctx context.Context, obj *models.SceneEdit) ([]models.PerformerAppearance, error) {\n\treturn r.performerAppearanceList(ctx, obj.AddedPerformers)\n}\n\nfunc (r *sceneEditResolver) RemovedPerformers(ctx context.Context, obj *models.SceneEdit) ([]models.PerformerAppearance, error) {\n\treturn r.performerAppearanceList(ctx, obj.RemovedPerformers)\n}\n\nfunc (r *sceneEditResolver) AddedTags(ctx context.Context, obj *models.SceneEdit) ([]models.Tag, error) {\n\treturn tagList(ctx, obj.AddedTags)\n}\n\nfunc (r *sceneEditResolver) RemovedTags(ctx context.Context, obj *models.SceneEdit) ([]models.Tag, error) {\n\treturn tagList(ctx, obj.RemovedTags)\n}\n\nfunc (r *sceneEditResolver) AddedImages(ctx context.Context, obj *models.SceneEdit) ([]models.Image, error) {\n\treturn imageList(ctx, obj.AddedImages)\n}\n\nfunc (r *sceneEditResolver) RemovedImages(ctx context.Context, obj *models.SceneEdit) ([]models.Image, error) {\n\treturn imageList(ctx, obj.RemovedImages)\n}\n\nfunc (r *sceneEditResolver) fingerprintList(ctx context.Context, fingerprints []models.FingerprintInput) ([]models.Fingerprint, error) {\n\tvar ret []models.Fingerprint\n\tfor _, fp := range fingerprints {\n\t\trr := models.Fingerprint{\n\t\t\tHash:      fp.Hash,\n\t\t\tAlgorithm: fp.Algorithm,\n\t\t\tDuration:  fp.Duration,\n\t\t}\n\t\tret = append(ret, rr)\n\t}\n\n\treturn ret, nil\n}\n\nfunc (r *sceneEditResolver) AddedFingerprints(ctx context.Context, obj *models.SceneEdit) ([]models.Fingerprint, error) {\n\treturn r.fingerprintList(ctx, obj.AddedFingerprints)\n}\n\nfunc (r *sceneEditResolver) RemovedFingerprints(ctx context.Context, obj *models.SceneEdit) ([]models.Fingerprint, error) {\n\treturn r.fingerprintList(ctx, obj.RemovedFingerprints)\n}\n\nfunc (r *sceneEditResolver) Fingerprints(ctx context.Context, obj *models.SceneEdit) ([]models.Fingerprint, error) {\n\tvar ret []models.Fingerprint\n\tfor _, fp := range obj.AddedFingerprints {\n\t\tret = append(ret, models.Fingerprint{\n\t\t\tHash:          fp.Hash,\n\t\t\tAlgorithm:     fp.Algorithm,\n\t\t\tDuration:      fp.Duration,\n\t\t\tSubmissions:   0,\n\t\t\tUserSubmitted: true,\n\t\t})\n\t}\n\n\treturn ret, nil\n}\n\nfunc (r *sceneEditResolver) Images(ctx context.Context, obj *models.SceneEdit) ([]models.Image, error) {\n\treturn r.services.Edit().GetMergedImages(ctx, obj.EditID)\n}\n\nfunc (r *sceneEditResolver) Tags(ctx context.Context, obj *models.SceneEdit) ([]models.Tag, error) {\n\treturn r.services.Edit().GetMergedTags(ctx, obj.EditID)\n}\n\nfunc (r *sceneEditResolver) Performers(ctx context.Context, obj *models.SceneEdit) ([]models.PerformerAppearance, error) {\n\treturn r.services.Edit().GetMergedPerformers(ctx, obj.EditID)\n}\n\nfunc (r *sceneEditResolver) Urls(ctx context.Context, obj *models.SceneEdit) ([]models.URL, error) {\n\treturn r.services.Edit().GetMergedURLs(ctx, obj.EditID)\n}\n"
  },
  {
    "path": "internal/api/resolver_model_site.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\ntype siteResolver struct{ *Resolver }\n\nfunc (r *siteResolver) ValidTypes(ctx context.Context, obj *models.Site) ([]models.ValidSiteTypeEnum, error) {\n\tvar ret []models.ValidSiteTypeEnum\n\tfor _, validType := range obj.ValidTypes {\n\t\tvar resolvedType models.ValidSiteTypeEnum\n\t\tif utils.ResolveEnumString(validType, &resolvedType) {\n\t\t\tret = append(ret, resolvedType)\n\t\t}\n\t}\n\n\treturn ret, nil\n}\n\nfunc (r *siteResolver) Created(ctx context.Context, obj *models.Site) (*time.Time, error) {\n\treturn &obj.CreatedAt, nil\n}\n\nfunc (r *siteResolver) Updated(ctx context.Context, obj *models.Site) (*time.Time, error) {\n\treturn &obj.UpdatedAt, nil\n}\n\nfunc (r *siteResolver) Icon(ctx context.Context, obj *models.Site) (string, error) {\n\tbaseURL, _ := ctx.Value(BaseURLCtxKey).(string)\n\treturn baseURL + \"/images/site/\" + obj.ID.String(), nil\n}\n"
  },
  {
    "path": "internal/api/resolver_model_studio.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"sort\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/dataloader\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype studioResolver struct{ *Resolver }\n\nfunc (r *studioResolver) ID(ctx context.Context, obj *models.Studio) (string, error) {\n\treturn obj.ID.String(), nil\n}\n\nfunc (r *studioResolver) Urls(ctx context.Context, obj *models.Studio) ([]models.URL, error) {\n\treturn dataloader.For(ctx).StudioUrlsByID.Load(obj.ID)\n}\n\nfunc (r *studioResolver) Parent(ctx context.Context, obj *models.Studio) (*models.Studio, error) {\n\tif !obj.ParentStudioID.Valid {\n\t\treturn nil, nil\n\t}\n\n\treturn r.services.Studio().FindByID(ctx, obj.ParentStudioID.UUID)\n}\n\nfunc (r *studioResolver) ChildStudios(ctx context.Context, obj *models.Studio) ([]models.Studio, error) {\n\treturn r.services.Studio().FindByParentID(ctx, obj.ID)\n}\n\nfunc (r *studioResolver) SubStudios(ctx context.Context, obj *models.Studio, input *models.StudioQueryInput) (*models.QueryStudiosResultType, error) {\n\tvar filter models.StudioQueryInput\n\tif input != nil {\n\t\tfilter = *input\n\t}\n\tfilter.Parent = &models.IDCriterionInput{\n\t\tValue:    []uuid.UUID{obj.ID},\n\t\tModifier: models.CriterionModifierEquals,\n\t}\n\treturn r.services.Studio().Query(ctx, filter)\n}\n\nfunc (r *studioResolver) Images(ctx context.Context, obj *models.Studio) ([]models.Image, error) {\n\timageIDs, err := dataloader.For(ctx).StudioImageIDsByID.Load(obj.ID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn imageList(ctx, imageIDs)\n}\n\nfunc (r *studioResolver) IsFavorite(ctx context.Context, obj *models.Studio) (bool, error) {\n\treturn dataloader.For(ctx).StudioIsFavoriteByID.Load(obj.ID)\n}\n\nfunc (r *studioResolver) Created(ctx context.Context, obj *models.Studio) (*time.Time, error) {\n\treturn &obj.CreatedAt, nil\n}\n\nfunc (r *studioResolver) Updated(ctx context.Context, obj *models.Studio) (*time.Time, error) {\n\treturn &obj.UpdatedAt, nil\n}\n\nfunc (r *studioResolver) Performers(ctx context.Context, obj *models.Studio, input models.PerformerQueryInput) (*models.PerformerQuery, error) {\n\tinput.StudioID = &obj.ID\n\treturn &models.PerformerQuery{\n\t\tFilter: input,\n\t}, nil\n}\n\nfunc (r *studioResolver) Aliases(ctx context.Context, obj *models.Studio) ([]string, error) {\n\taliases, err := dataloader.For(ctx).StudioAliasesByID.Load(obj.ID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsort.Strings(aliases)\n\n\treturn aliases, nil\n}\n"
  },
  {
    "path": "internal/api/resolver_model_studio_edit.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype studioEditResolver struct{ *Resolver }\n\nfunc (r *studioEditResolver) Parent(ctx context.Context, obj *models.StudioEdit) (*models.Studio, error) {\n\tif obj.ParentID == nil {\n\t\treturn nil, nil\n\t}\n\n\treturn r.services.Studio().FindByID(ctx, *obj.ParentID)\n}\n\nfunc (r *studioEditResolver) AddedImages(ctx context.Context, obj *models.StudioEdit) ([]models.Image, error) {\n\treturn imageList(ctx, obj.AddedImages)\n}\n\nfunc (r *studioEditResolver) RemovedImages(ctx context.Context, obj *models.StudioEdit) ([]models.Image, error) {\n\treturn imageList(ctx, obj.RemovedImages)\n}\n\nfunc (r *studioEditResolver) Images(ctx context.Context, obj *models.StudioEdit) ([]models.Image, error) {\n\treturn r.services.Edit().GetMergedImages(ctx, obj.EditID)\n}\n\nfunc (r *studioEditResolver) Urls(ctx context.Context, obj *models.StudioEdit) ([]models.URL, error) {\n\treturn r.services.Edit().GetMergedURLs(ctx, obj.EditID)\n}\n"
  },
  {
    "path": "internal/api/resolver_model_tag.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"sort\"\n\t\"time\"\n\n\t\"github.com/stashapp/stash-box/internal/dataloader\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype tagResolver struct{ *Resolver }\n\nfunc (r *tagResolver) ID(ctx context.Context, obj *models.Tag) (string, error) {\n\treturn obj.ID.String(), nil\n}\nfunc (r *tagResolver) Description(ctx context.Context, obj *models.Tag) (*string, error) {\n\treturn obj.Description, nil\n}\nfunc (r *tagResolver) Aliases(ctx context.Context, obj *models.Tag) ([]string, error) {\n\taliases, err := r.services.Tag().GetAliases(ctx, obj.ID)\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsort.Strings(aliases)\n\n\treturn aliases, nil\n}\n\nfunc (r *tagResolver) Edits(ctx context.Context, obj *models.Tag) ([]models.Edit, error) {\n\treturn r.services.Edit().FindByTagID(ctx, obj.ID)\n}\n\nfunc (r *tagResolver) Category(ctx context.Context, obj *models.Tag) (*models.TagCategory, error) {\n\tif obj.CategoryID.Valid {\n\t\treturn dataloader.For(ctx).TagCategoryByID.Load(obj.CategoryID.UUID)\n\t}\n\treturn nil, nil\n}\n\nfunc (r *tagResolver) Created(ctx context.Context, obj *models.Tag) (*time.Time, error) {\n\treturn &obj.Created, nil\n}\n\nfunc (r *tagResolver) Updated(ctx context.Context, obj *models.Tag) (*time.Time, error) {\n\treturn &obj.Updated, nil\n}\n"
  },
  {
    "path": "internal/api/resolver_model_tag_category.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\ntype tagCategoryResolver struct{ *Resolver }\n\nfunc (r *tagCategoryResolver) ID(ctx context.Context, obj *models.TagCategory) (string, error) {\n\treturn obj.ID.String(), nil\n}\n\nfunc (r *tagCategoryResolver) Name(ctx context.Context, obj *models.TagCategory) (string, error) {\n\treturn obj.Name, nil\n}\n\nfunc (r *tagCategoryResolver) Group(ctx context.Context, obj *models.TagCategory) (models.TagGroupEnum, error) {\n\tvar ret models.TagGroupEnum\n\tif !utils.ResolveEnumString(obj.Group, &ret) {\n\t\treturn \"\", nil\n\t}\n\n\treturn ret, nil\n}\n"
  },
  {
    "path": "internal/api/resolver_model_tag_edit.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype tagEditResolver struct{ *Resolver }\n\nfunc (r *tagEditResolver) Category(ctx context.Context, obj *models.TagEdit) (*models.TagCategory, error) {\n\tif obj.CategoryID == nil {\n\t\treturn nil, nil\n\t}\n\n\treturn r.services.Tag().FindCategory(ctx, *obj.CategoryID)\n}\n\nfunc (r *tagEditResolver) Aliases(ctx context.Context, obj *models.TagEdit) ([]string, error) {\n\treturn r.services.Edit().GetMergedStudioAliases(ctx, obj.EditID)\n}\n"
  },
  {
    "path": "internal/api/resolver_model_url.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"strings\"\n\n\t\"github.com/stashapp/stash-box/internal/dataloader\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype urlResolver struct{ *Resolver }\n\nfunc (r *urlResolver) URL(ctx context.Context, obj *models.URL) (string, error) {\n\treturn obj.URL, nil\n}\n\nfunc (r *urlResolver) Site(ctx context.Context, obj *models.URL) (*models.Site, error) {\n\treturn dataloader.For(ctx).SiteByID.Load(obj.SiteID)\n}\n\nfunc (r *urlResolver) Type(ctx context.Context, obj *models.URL) (string, error) {\n\tsite, err := dataloader.For(ctx).SiteByID.Load(obj.SiteID)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn strings.ToUpper(site.Name), err\n}\n"
  },
  {
    "path": "internal/api/resolver_model_user.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype userResolver struct{ *Resolver }\n\nfunc (r *userResolver) ID(ctx context.Context, user *models.User) (string, error) {\n\treturn user.ID.String(), nil\n}\n\nfunc (r *userResolver) Roles(ctx context.Context, user *models.User) ([]models.RoleEnum, error) {\n\t// Limit user role visibility to admins and user themself\n\tif err := auth.ValidateOwner(ctx, user.ID); err != nil {\n\t\tif err := auth.ValidateRole(ctx, models.RoleEnumAdmin); err != nil {\n\t\t\treturn nil, nil\n\t\t}\n\t}\n\n\treturn r.services.User().GetRoles(ctx, user.ID)\n}\n\nfunc (r *userResolver) VoteCount(ctx context.Context, obj *models.User) (*models.UserVoteCount, error) {\n\treturn r.services.User().CountVotesByType(ctx, obj.ID)\n}\n\nfunc (r *userResolver) EditCount(ctx context.Context, obj *models.User) (*models.UserEditCount, error) {\n\treturn r.services.User().CountEditsByStatus(ctx, obj.ID)\n}\n\nfunc (r *userResolver) InvitedBy(ctx context.Context, user *models.User) (*models.User, error) {\n\tif !user.InvitedByID.Valid {\n\t\treturn nil, nil\n\t}\n\n\treturn r.services.User().FindByID(ctx, user.InvitedByID.UUID)\n}\n\nfunc (r *userResolver) ActiveInviteCodes(ctx context.Context, user *models.User) ([]string, error) {\n\t// only show if current user or invite manager\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\n\tif currentUser.ID != user.ID {\n\t\tif err := auth.ValidateRole(ctx, models.RoleEnumManageInvites); err != nil {\n\t\t\treturn nil, nil\n\t\t}\n\t}\n\n\tcodes, err := r.InviteCodes(ctx, user)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar inviteCodes []string\n\tfor _, code := range codes {\n\t\tinviteCodes = append(inviteCodes, code.ID.String())\n\t}\n\n\treturn inviteCodes, err\n}\n\nfunc (r *userResolver) InviteCodes(ctx context.Context, user *models.User) ([]models.InviteKey, error) {\n\t// only show if current user or invite manager\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\n\tif currentUser.ID != user.ID {\n\t\tif err := auth.ValidateRole(ctx, models.RoleEnumManageInvites); err != nil {\n\t\t\treturn nil, nil\n\t\t}\n\t}\n\n\treturn r.services.UserToken().FindActiveInviteKeysForUser(ctx, user.ID)\n}\n\nfunc (r *userResolver) NotificationSubscriptions(ctx context.Context, user *models.User) ([]models.NotificationEnum, error) {\n\treturn r.services.User().GetNotificationSubscriptions(ctx, user.ID)\n}\n"
  },
  {
    "path": "internal/api/resolver_mutation_draft.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/99designs/gqlgen/graphql\"\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *mutationResolver) SubmitSceneDraft(ctx context.Context, input models.SceneDraftInput) (*models.DraftSubmissionStatus, error) {\n\tinput.Fingerprints = filterMD5FingerprintInputs(input.Fingerprints)\n\n\timageID, err := r.createImage(ctx, input.Image)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn r.services.Draft().SubmitScene(ctx, input, imageID)\n}\n\nfunc (r *mutationResolver) SubmitPerformerDraft(ctx context.Context, input models.PerformerDraftInput) (*models.DraftSubmissionStatus, error) {\n\timageID, err := r.createImage(ctx, input.Image)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn r.services.Draft().SubmitPerformer(ctx, input, imageID)\n}\n\nfunc (r *mutationResolver) DestroyDraft(ctx context.Context, id uuid.UUID) (bool, error) {\n\treturn r.services.Draft().Destroy(ctx, auth.GetCurrentUser(ctx), id)\n}\n\nfunc (r *mutationResolver) createImage(ctx context.Context, file *graphql.Upload) (*uuid.UUID, error) {\n\tvar imageID *uuid.UUID\n\tif file != nil {\n\t\timage, err := r.services.Image().Create(ctx, models.ImageCreateInput{\n\t\t\tFile: file,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif image != nil {\n\t\t\timageID = &image.ID\n\t\t}\n\t}\n\n\treturn imageID, nil\n}\n"
  },
  {
    "path": "internal/api/resolver_mutation_edit.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *mutationResolver) SceneEdit(ctx context.Context, input models.SceneEditInput) (*models.Edit, error) {\n\tif input.Details != nil {\n\t\tinput.Details.Fingerprints = filterMD5FingerprintInputs(input.Details.Fingerprints)\n\t}\n\n\tedit, err := r.services.Edit().CreateSceneEdit(ctx, input)\n\tif err == nil {\n\t\tgo r.services.Notification().OnCreateEdit(context.Background(), edit)\n\t}\n\treturn edit, err\n}\n\nfunc (r *mutationResolver) SceneEditUpdate(ctx context.Context, id uuid.UUID, input models.SceneEditInput) (*models.Edit, error) {\n\tif input.Details != nil {\n\t\tinput.Details.Fingerprints = filterMD5FingerprintInputs(input.Details.Fingerprints)\n\t}\n\n\tedit, err := r.services.Edit().UpdateSceneEdit(ctx, id, input)\n\tif err == nil {\n\t\tgo r.services.Notification().OnUpdateEdit(context.Background(), edit)\n\t}\n\treturn edit, err\n}\n\nfunc (r *mutationResolver) StudioEdit(ctx context.Context, input models.StudioEditInput) (*models.Edit, error) {\n\tedit, err := r.services.Edit().CreateStudioEdit(ctx, input)\n\tif err == nil {\n\t\tgo r.services.Notification().OnCreateEdit(context.Background(), edit)\n\t}\n\treturn edit, err\n}\n\nfunc (r *mutationResolver) StudioEditUpdate(ctx context.Context, id uuid.UUID, input models.StudioEditInput) (*models.Edit, error) {\n\tedit, err := r.services.Edit().UpdateStudioEdit(ctx, id, input)\n\tif err == nil {\n\t\tgo r.services.Notification().OnUpdateEdit(context.Background(), edit)\n\t}\n\treturn edit, err\n}\n\nfunc (r *mutationResolver) TagEdit(ctx context.Context, input models.TagEditInput) (*models.Edit, error) {\n\tedit, err := r.services.Edit().CreateTagEdit(ctx, input)\n\tif err == nil {\n\t\tgo r.services.Notification().OnCreateEdit(context.Background(), edit)\n\t}\n\treturn edit, err\n}\n\nfunc (r *mutationResolver) TagEditUpdate(ctx context.Context, id uuid.UUID, input models.TagEditInput) (*models.Edit, error) {\n\tedit, err := r.services.Edit().UpdateTagEdit(ctx, id, input)\n\tif err == nil {\n\t\tgo r.services.Notification().OnUpdateEdit(context.Background(), edit)\n\t}\n\treturn edit, err\n}\n\nfunc (r *mutationResolver) PerformerEdit(ctx context.Context, input models.PerformerEditInput) (*models.Edit, error) {\n\tedit, err := r.services.Edit().CreatePerformerEdit(ctx, input)\n\tif err == nil {\n\t\tgo r.services.Notification().OnCreateEdit(context.Background(), edit)\n\t}\n\treturn edit, err\n}\n\nfunc (r *mutationResolver) PerformerEditUpdate(ctx context.Context, id uuid.UUID, input models.PerformerEditInput) (*models.Edit, error) {\n\tedit, err := r.services.Edit().UpdatePerformerEdit(ctx, id, input)\n\tif err == nil {\n\t\tgo r.services.Notification().OnUpdateEdit(context.Background(), edit)\n\t}\n\treturn edit, err\n}\n\nfunc (r *mutationResolver) EditVote(ctx context.Context, input models.EditVoteInput) (*models.Edit, error) {\n\tedit, err := r.services.Edit().CreateVote(ctx, input)\n\tif err == nil {\n\t\tif input.Vote == models.VoteTypeEnumReject {\n\t\t\tgo r.services.Notification().OnEditDownvote(context.Background(), edit)\n\t\t}\n\t\t// Check if the edit was closed due to reaching the voting threshold\n\t\tif edit.Status != models.VoteStatusEnumPending.String() {\n\t\t\tgo r.services.Notification().OnApplyEdit(context.Background(), edit)\n\t\t}\n\t}\n\n\treturn edit, err\n}\n\nfunc (r *mutationResolver) EditComment(ctx context.Context, input models.EditCommentInput) (*models.Edit, error) {\n\tedit, comment, err := r.services.Edit().CreateComment(ctx, input)\n\tif err == nil {\n\t\tgo r.services.Notification().OnEditComment(context.Background(), comment)\n\t}\n\treturn edit, err\n}\n\nfunc (r *mutationResolver) CancelEdit(ctx context.Context, input models.CancelEditInput) (*models.Edit, error) {\n\tedit, err := r.services.Edit().Cancel(ctx, input)\n\tif err == nil {\n\t\tgo r.services.Notification().OnCancelEdit(context.Background(), edit)\n\t}\n\n\treturn edit, err\n}\n\nfunc (r *mutationResolver) ApplyEdit(ctx context.Context, input models.ApplyEditInput) (*models.Edit, error) {\n\tedit, err := r.services.Edit().Apply(ctx, input)\n\tif err == nil {\n\t\tgo r.services.Notification().OnApplyEdit(context.Background(), edit)\n\t}\n\n\treturn edit, err\n}\n\nfunc (r *mutationResolver) DeleteEdit(ctx context.Context, input models.DeleteEditInput) (bool, error) {\n\terr := r.services.Edit().DeleteWithAudit(ctx, input)\n\treturn err == nil, err\n}\n\nfunc (r *mutationResolver) AmendEdit(ctx context.Context, input models.AmendEditInput) (*models.Edit, error) {\n\treturn r.services.Edit().AmendEdit(ctx, input)\n}\n"
  },
  {
    "path": "internal/api/resolver_mutation_image.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *mutationResolver) ImageCreate(ctx context.Context, input models.ImageCreateInput) (*models.Image, error) {\n\treturn r.services.Image().Create(ctx, input)\n}\n\nfunc (r *mutationResolver) ImageDestroy(ctx context.Context, input models.ImageDestroyInput) (bool, error) {\n\terr := r.services.Image().Destroy(ctx, input.ID)\n\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn true, nil\n}\n"
  },
  {
    "path": "internal/api/resolver_mutation_notifications.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *mutationResolver) MarkNotificationsRead(ctx context.Context, notification *models.MarkNotificationReadInput) (bool, error) {\n\tuser := auth.GetCurrentUser(ctx)\n\tif notification == nil {\n\t\terr := r.services.Notification().MarkAllRead(ctx, user.ID)\n\t\treturn err == nil, err\n\t}\n\n\terr := r.services.Notification().MarkRead(ctx, user.ID, notification.Type, notification.ID)\n\treturn err == nil, err\n}\n\nfunc (r *mutationResolver) UpdateNotificationSubscriptions(ctx context.Context, subscriptions []models.NotificationEnum) (bool, error) {\n\tuser := auth.GetCurrentUser(ctx)\n\n\tif auth.IsRole(ctx, models.RoleEnumEdit) {\n\t\terr := r.services.Notification().UpdateNotificationSubscriptions(ctx, user.ID, subscriptions)\n\t\treturn err == nil, err\n\t}\n\n\tisFavoriteSubscription := map[models.NotificationEnum]bool{\n\t\tmodels.NotificationEnumFavoritePerformerScene: true,\n\t\tmodels.NotificationEnumFavoritePerformerEdit:  true,\n\t\tmodels.NotificationEnumFavoriteStudioScene:    true,\n\t\tmodels.NotificationEnumFavoriteStudioEdit:     true,\n\t}\n\n\tvar filteredSubscriptions []models.NotificationEnum\n\tfor _, s := range subscriptions {\n\t\tif isFavoriteSubscription[s] {\n\t\t\tfilteredSubscriptions = append(filteredSubscriptions, s)\n\t\t}\n\t}\n\n\terr := r.services.Notification().UpdateNotificationSubscriptions(ctx, user.ID, filteredSubscriptions)\n\treturn err == nil, err\n}\n"
  },
  {
    "path": "internal/api/resolver_mutation_performer.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *mutationResolver) PerformerCreate(ctx context.Context, input models.PerformerCreateInput) (*models.Performer, error) {\n\treturn r.services.Performer().Create(ctx, input)\n}\n\nfunc (r *mutationResolver) PerformerUpdate(ctx context.Context, input models.PerformerUpdateInput) (*models.Performer, error) {\n\treturn r.services.Performer().Update(ctx, input)\n}\n\nfunc (r *mutationResolver) PerformerDestroy(ctx context.Context, input models.PerformerDestroyInput) (bool, error) {\n\terr := r.services.Performer().Delete(ctx, input.ID)\n\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\nfunc (r *mutationResolver) FavoritePerformer(ctx context.Context, id uuid.UUID, favorite bool) (bool, error) {\n\tuser := auth.GetCurrentUser(ctx)\n\terr := r.services.Performer().Favorite(ctx, user.ID, id, favorite)\n\treturn err == nil, err\n}\n"
  },
  {
    "path": "internal/api/resolver_mutation_scene.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *mutationResolver) SceneCreate(ctx context.Context, input models.SceneCreateInput) (*models.Scene, error) {\n\tinput.Fingerprints = filterMD5FingerprintEditInputs(input.Fingerprints)\n\n\ts := r.services.Scene()\n\treturn s.Create(ctx, input)\n}\n\nfunc (r *mutationResolver) SceneUpdate(ctx context.Context, input models.SceneUpdateInput) (*models.Scene, error) {\n\tinput.Fingerprints = filterMD5FingerprintEditInputs(input.Fingerprints)\n\n\ts := r.services.Scene()\n\treturn s.Update(ctx, input)\n}\n\nfunc (r *mutationResolver) SceneDestroy(ctx context.Context, input models.SceneDestroyInput) (bool, error) {\n\ts := r.services.Scene()\n\terr := s.Delete(ctx, input.ID)\n\treturn err == nil, err\n}\n\nfunc (r *mutationResolver) SubmitFingerprint(ctx context.Context, input models.FingerprintSubmission) (bool, error) {\n\t// Filter out MD5 fingerprints\n\tif input.Fingerprint != nil && input.Fingerprint.Algorithm == models.FingerprintAlgorithmMd5 {\n\t\treturn true, nil\n\t}\n\n\ts := r.services.Scene()\n\treturn s.SubmitFingerprint(ctx, input)\n}\n\nfunc (r *mutationResolver) SubmitFingerprints(ctx context.Context, input []models.FingerprintBatchSubmission) ([]models.FingerprintSubmissionResult, error) {\n\t// Validate max 1000 fingerprints\n\tif len(input) > 1000 {\n\t\treturn nil, errors.New(\"maximum of 1000 fingerprints allowed per batch\")\n\t}\n\n\ts := r.services.Scene()\n\treturn s.SubmitFingerprints(ctx, input)\n}\n\nfunc (r *mutationResolver) SceneMoveFingerprintSubmissions(ctx context.Context, input models.MoveFingerprintSubmissionsInput) (bool, error) {\n\ts := r.services.Scene()\n\terr := s.MoveFingerprintSubmissions(ctx, input)\n\treturn err == nil, err\n}\n\nfunc (r *mutationResolver) SceneDeleteFingerprintSubmissions(ctx context.Context, input models.DeleteFingerprintSubmissionsInput) (bool, error) {\n\ts := r.services.Scene()\n\terr := s.DeleteFingerprintSubmissions(ctx, input)\n\treturn err == nil, err\n}\n"
  },
  {
    "path": "internal/api/resolver_mutation_site.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *mutationResolver) SiteCreate(ctx context.Context, input models.SiteCreateInput) (*models.Site, error) {\n\treturn r.services.Site().Create(ctx, input)\n}\n\nfunc (r *mutationResolver) SiteUpdate(ctx context.Context, input models.SiteUpdateInput) (*models.Site, error) {\n\treturn r.services.Site().Update(ctx, input)\n}\n\nfunc (r *mutationResolver) SiteDestroy(ctx context.Context, input models.SiteDestroyInput) (bool, error) {\n\terr := r.services.Site().Destroy(ctx, input.ID)\n\treturn err == nil, err\n}\n"
  },
  {
    "path": "internal/api/resolver_mutation_studio.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *mutationResolver) StudioCreate(ctx context.Context, input models.StudioCreateInput) (*models.Studio, error) {\n\treturn r.services.Studio().Create(ctx, input)\n}\n\nfunc (r *mutationResolver) StudioUpdate(ctx context.Context, input models.StudioUpdateInput) (*models.Studio, error) {\n\treturn r.services.Studio().Update(ctx, input)\n}\n\nfunc (r *mutationResolver) StudioDestroy(ctx context.Context, input models.StudioDestroyInput) (bool, error) {\n\terr := r.services.Studio().Delete(ctx, input.ID)\n\treturn err == nil, err\n}\n\nfunc (r *mutationResolver) FavoriteStudio(ctx context.Context, id uuid.UUID, favorite bool) (bool, error) {\n\terr := r.services.Studio().Favorite(ctx, id, favorite)\n\treturn err == nil, err\n}\n"
  },
  {
    "path": "internal/api/resolver_mutation_tag.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *mutationResolver) TagCreate(ctx context.Context, input models.TagCreateInput) (*models.Tag, error) {\n\treturn r.services.Tag().Create(ctx, input)\n}\n\nfunc (r *mutationResolver) TagUpdate(ctx context.Context, input models.TagUpdateInput) (*models.Tag, error) {\n\treturn r.services.Tag().Update(ctx, input)\n}\n\nfunc (r *mutationResolver) TagDestroy(ctx context.Context, input models.TagDestroyInput) (bool, error) {\n\terr := r.services.Tag().Delete(ctx, input)\n\treturn err == nil, err\n}\n"
  },
  {
    "path": "internal/api/resolver_mutation_tag_category.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *mutationResolver) TagCategoryCreate(ctx context.Context, input models.TagCategoryCreateInput) (*models.TagCategory, error) {\n\treturn r.services.Tag().CreateCategory(ctx, input)\n}\n\nfunc (r *mutationResolver) TagCategoryUpdate(ctx context.Context, input models.TagCategoryUpdateInput) (*models.TagCategory, error) {\n\treturn r.services.Tag().UpdateCategory(ctx, input)\n}\n\nfunc (r *mutationResolver) TagCategoryDestroy(ctx context.Context, input models.TagCategoryDestroyInput) (bool, error) {\n\terr := r.services.Tag().DeleteCategory(ctx, input)\n\n\treturn err == nil, err\n}\n"
  },
  {
    "path": "internal/api/resolver_mutation_user.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *mutationResolver) UserCreate(ctx context.Context, input models.UserCreateInput) (*models.User, error) {\n\treturn r.services.User().Create(ctx, input)\n}\n\nfunc (r *mutationResolver) UserUpdate(ctx context.Context, input models.UserUpdateInput) (*models.User, error) {\n\treturn r.services.User().Update(ctx, input)\n}\n\nfunc (r *mutationResolver) UserDestroy(ctx context.Context, input models.UserDestroyInput) (bool, error) {\n\terr := r.services.User().Delete(ctx, input)\n\treturn err == nil, err\n}\n\nfunc (r *mutationResolver) RegenerateAPIKey(ctx context.Context, userID *uuid.UUID) (string, error) {\n\treturn r.services.User().RegenerateAPIKey(ctx, userID)\n}\n\nfunc (r *mutationResolver) ResetPassword(ctx context.Context, input models.ResetPasswordInput) (bool, error) {\n\terr := r.services.User().ResetPassword(ctx, input)\n\treturn err == nil, err\n}\n\nfunc (r *mutationResolver) ChangePassword(ctx context.Context, input models.UserChangePasswordInput) (bool, error) {\n\terr := r.services.User().ChangePassword(ctx, input)\n\treturn err == nil, err\n}\n\nfunc (r *mutationResolver) NewUser(ctx context.Context, input models.NewUserInput) (*uuid.UUID, error) {\n\treturn r.services.User().NewUser(ctx, input.Email, input.InviteKey)\n}\n\nfunc (r *mutationResolver) ActivateNewUser(ctx context.Context, input models.ActivateNewUserInput) (*models.User, error) {\n\treturn r.services.User().ActivateNewUser(ctx, input)\n}\n\nfunc (r *mutationResolver) GenerateInviteCodes(ctx context.Context, input *models.GenerateInviteCodeInput) ([]uuid.UUID, error) {\n\treturn r.services.User().GenerateInviteCodes(ctx, input)\n}\n\nfunc (r *mutationResolver) GenerateInviteCode(ctx context.Context) (*uuid.UUID, error) {\n\treturn r.services.User().GenerateInviteCode(ctx)\n}\n\nfunc (r *mutationResolver) RescindInviteCode(ctx context.Context, inviteKeyID uuid.UUID) (bool, error) {\n\terr := r.services.User().RescindInviteCode(ctx, inviteKeyID)\n\treturn err == nil, err\n}\n\nfunc (r *mutationResolver) GrantInvite(ctx context.Context, input models.GrantInviteInput) (int, error) {\n\treturn r.services.User().GrantInvite(ctx, input)\n}\n\nfunc (r *mutationResolver) RevokeInvite(ctx context.Context, input models.RevokeInviteInput) (int, error) {\n\treturn r.services.User().RevokeInvite(ctx, input)\n}\n\nfunc (r *mutationResolver) RequestChangeEmail(ctx context.Context) (models.UserChangeEmailStatus, error) {\n\treturn r.services.User().RequestChangeEmail(ctx)\n}\n\nfunc (r *mutationResolver) ValidateChangeEmail(ctx context.Context, tokenID uuid.UUID, email string) (models.UserChangeEmailStatus, error) {\n\treturn r.services.User().ValidateChangeEmail(ctx, tokenID, email)\n}\n\nfunc (r *mutationResolver) ConfirmChangeEmail(ctx context.Context, tokenID uuid.UUID) (models.UserChangeEmailStatus, error) {\n\treturn r.services.User().ConfirmChangeEmail(ctx, tokenID)\n}\n"
  },
  {
    "path": "internal/api/resolver_query_draft.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *queryResolver) FindDrafts(ctx context.Context) ([]models.Draft, error) {\n\tuser := auth.GetCurrentUser(ctx)\n\treturn r.services.Draft().FindByUser(ctx, user.ID)\n}\n\nfunc (r *queryResolver) FindDraft(ctx context.Context, id uuid.UUID) (*models.Draft, error) {\n\tdraft, err := r.services.Draft().FindByID(ctx, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tuser := auth.GetCurrentUser(ctx)\n\tif user.ID != draft.UserID {\n\t\treturn nil, fmt.Errorf(\"draft not found: %s\", id)\n\t}\n\n\treturn draft, nil\n}\n"
  },
  {
    "path": "internal/api/resolver_query_edit.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *queryResolver) FindEdit(ctx context.Context, id uuid.UUID) (*models.Edit, error) {\n\treturn r.services.Edit().FindByID(ctx, id)\n}\n\nfunc (r *queryResolver) QueryEdits(ctx context.Context, input models.EditQueryInput) (*models.EditQuery, error) {\n\treturn &models.EditQuery{\n\t\tFilter: input,\n\t}, nil\n}\n\ntype queryEditResolver struct{ *Resolver }\n\nfunc (r *queryEditResolver) Count(ctx context.Context, obj *models.EditQuery) (int, error) {\n\treturn r.services.Edit().QueryCount(ctx, obj.Filter)\n}\n\nfunc (r *queryEditResolver) Edits(ctx context.Context, obj *models.EditQuery) ([]models.Edit, error) {\n\treturn r.services.Edit().QueryEdits(ctx, obj.Filter)\n}\n"
  },
  {
    "path": "internal/api/resolver_query_mod_audit.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *queryResolver) QueryModAudits(ctx context.Context, input models.ModAuditQueryInput) (*models.ModAuditQuery, error) {\n\treturn &models.ModAuditQuery{\n\t\tFilter: input,\n\t}, nil\n}\n\ntype queryModAuditResolver struct{ *Resolver }\n\nfunc (r *queryModAuditResolver) Count(ctx context.Context, obj *models.ModAuditQuery) (int, error) {\n\treturn r.services.ModAudit().GetModAuditCount(ctx, obj.Filter)\n}\n\nfunc (r *queryModAuditResolver) Audits(ctx context.Context, obj *models.ModAuditQuery) ([]models.ModAudit, error) {\n\treturn r.services.ModAudit().QueryModAudits(ctx, obj.Filter)\n}\n\ntype modAuditResolver struct{ *Resolver }\n\nfunc (r *modAuditResolver) Action(ctx context.Context, obj *models.ModAudit) (models.ModAuditActionEnum, error) {\n\treturn models.ModAuditActionEnum(obj.Action), nil\n}\n\nfunc (r *modAuditResolver) User(ctx context.Context, obj *models.ModAudit) (*models.User, error) {\n\tif !obj.UserID.Valid {\n\t\treturn nil, nil\n\t}\n\treturn r.services.User().FindByID(ctx, obj.UserID.UUID)\n}\n"
  },
  {
    "path": "internal/api/resolver_query_notifications.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *queryResolver) QueryNotifications(ctx context.Context, input models.QueryNotificationsInput) (*models.QueryNotificationsResult, error) {\n\treturn &models.QueryNotificationsResult{\n\t\tInput: input,\n\t}, nil\n}\n\ntype queryNotificationsResolver struct{ *Resolver }\n\nfunc (r *queryNotificationsResolver) Count(ctx context.Context, query *models.QueryNotificationsResult) (int, error) {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\tunreadOnly := query.Input.UnreadOnly != nil && *query.Input.UnreadOnly\n\treturn r.services.Notification().GetNotificationsCount(ctx, currentUser.ID, unreadOnly, query.Input.Type)\n}\n\nfunc (r *queryNotificationsResolver) Notifications(ctx context.Context, query *models.QueryNotificationsResult) ([]models.Notification, error) {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\tunreadOnly := query.Input.UnreadOnly != nil && *query.Input.UnreadOnly\n\tpage := query.Input.Page\n\tperPage := query.Input.PerPage\n\treturn r.services.Notification().GetNotifications(ctx, currentUser.ID, unreadOnly, page, perPage, query.Input.Type)\n}\n\nfunc (r *queryResolver) GetUnreadNotificationCount(ctx context.Context) (int, error) {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\treturn r.services.Notification().GetNotificationsCount(ctx, currentUser.ID, true, nil)\n}\n"
  },
  {
    "path": "internal/api/resolver_query_performer.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *queryResolver) FindPerformer(ctx context.Context, id uuid.UUID) (*models.Performer, error) {\n\treturn r.services.Performer().FindByID(ctx, id)\n}\n\nfunc (r *queryResolver) QueryPerformers(ctx context.Context, input models.PerformerQueryInput) (*models.PerformerQuery, error) {\n\treturn &models.PerformerQuery{\n\t\tFilter: input,\n\t}, nil\n}\n\ntype queryPerformerResolver struct{ *Resolver }\n\nfunc (r *queryPerformerResolver) Count(ctx context.Context, obj *models.PerformerQuery) (int, error) {\n\tif obj.SearchResults != nil {\n\t\treturn obj.SearchResults.Count, nil\n\t}\n\treturn r.services.Performer().QueryCount(ctx, obj.Filter)\n}\n\nfunc (r *queryPerformerResolver) Performers(ctx context.Context, obj *models.PerformerQuery) ([]models.Performer, error) {\n\tif obj.SearchResults != nil {\n\t\treturn obj.SearchResults.Performers, nil\n\t}\n\treturn r.services.Performer().Query(ctx, obj.Filter)\n}\n\nfunc (r *queryPerformerResolver) Facets(ctx context.Context, obj *models.PerformerQuery) (*models.PerformerSearchFacets, error) {\n\tif obj.SearchResults != nil {\n\t\treturn obj.SearchResults.Facets, nil\n\t}\n\treturn nil, nil\n}\n\nfunc (r *queryResolver) QueryExistingPerformer(ctx context.Context, input models.QueryExistingPerformerInput) (*models.QueryExistingPerformerResult, error) {\n\treturn &models.QueryExistingPerformerResult{\n\t\tInput: input,\n\t}, nil\n}\n\ntype queryExistingPerformerResolver struct{ *Resolver }\n\nfunc (r *queryExistingPerformerResolver) Edits(ctx context.Context, obj *models.QueryExistingPerformerResult) ([]models.Edit, error) {\n\treturn r.services.Edit().FindPendingPerformerCreation(ctx, obj.Input)\n}\n\nfunc (r *queryExistingPerformerResolver) Performers(ctx context.Context, obj *models.QueryExistingPerformerResult) ([]models.Performer, error) {\n\treturn r.services.Performer().FindExistingPerformers(ctx, obj.Input)\n}\n\n// Deprecated: Use SearchPerformers instead\nfunc (r *queryResolver) SearchPerformer(ctx context.Context, term string, limit *int) ([]models.Performer, error) {\n\tresult, err := r.services.Performer().SearchPerformer(ctx, term, limit, nil, nil, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif result.SearchResults != nil {\n\t\treturn result.SearchResults.Performers, nil\n\t}\n\treturn nil, nil\n}\n\nfunc (r *queryResolver) SearchPerformers(ctx context.Context, term string, limit *int, page *int, perPage *int, filter *models.PerformerSearchFilter) (*models.PerformerQuery, error) {\n\treturn r.services.Performer().SearchPerformer(ctx, term, limit, page, perPage, filter)\n}\n"
  },
  {
    "path": "internal/api/resolver_query_scene.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"strings\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *queryResolver) FindScene(ctx context.Context, id uuid.UUID) (*models.Scene, error) {\n\treturn r.services.Scene().FindByID(ctx, id)\n}\n\nfunc (r *queryResolver) QueryScenes(ctx context.Context, input models.SceneQueryInput) (*models.SceneQuery, error) {\n\treturn &models.SceneQuery{\n\t\tFilter: input,\n\t}, nil\n}\n\nfunc (r *queryResolver) FindScenesBySceneFingerprints(ctx context.Context, sceneFingerprints [][]models.FingerprintQueryInput) ([][]*models.Scene, error) {\n\tif len(sceneFingerprints) > 40 {\n\t\treturn nil, errors.New(\"too many scenes\")\n\t}\n\n\tsceneFingerprints = filterMD5FingerprintQueryInputs(sceneFingerprints)\n\treturn r.services.Scene().FindScenesBySceneFingerprints(ctx, sceneFingerprints)\n}\n\ntype querySceneResolver struct{ *Resolver }\n\nfunc (r *querySceneResolver) Count(ctx context.Context, obj *models.SceneQuery) (int, error) {\n\tif obj.SearchResults != nil {\n\t\treturn obj.SearchResults.Count, nil\n\t}\n\treturn r.services.Scene().QueryCount(ctx, obj.Filter)\n}\n\nfunc (r *querySceneResolver) Scenes(ctx context.Context, obj *models.SceneQuery) ([]models.Scene, error) {\n\tif obj.SearchResults != nil {\n\t\treturn obj.SearchResults.Scenes, nil\n\t}\n\treturn r.services.Scene().Query(ctx, obj.Filter)\n}\n\nfunc (r *queryResolver) QueryExistingScene(ctx context.Context, input models.QueryExistingSceneInput) (*models.QueryExistingSceneResult, error) {\n\tinput.Fingerprints = filterMD5FingerprintInputs(input.Fingerprints)\n\treturn &models.QueryExistingSceneResult{\n\t\tInput: input,\n\t}, nil\n}\n\ntype queryExistingSceneResolver struct{ *Resolver }\n\nfunc (r *queryExistingSceneResolver) Edits(ctx context.Context, obj *models.QueryExistingSceneResult) ([]models.Edit, error) {\n\treturn r.services.Edit().FindPendingSceneCreation(ctx, obj.Input)\n}\n\nfunc (r *queryExistingSceneResolver) Scenes(ctx context.Context, obj *models.QueryExistingSceneResult) ([]models.Scene, error) {\n\treturn r.services.Scene().FindExistingScenes(ctx, obj.Input)\n}\n\n// Deprecated: Use SearchScenes instead\nfunc (r *queryResolver) SearchScene(ctx context.Context, term string, limit *int) ([]models.Scene, error) {\n\tresult, err := r.searchScenes(ctx, term, limit, nil, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif result.SearchResults != nil {\n\t\treturn result.SearchResults.Scenes, nil\n\t}\n\treturn nil, nil\n}\n\nfunc (r *queryResolver) SearchScenes(ctx context.Context, term string, limit *int, page *int, perPage *int) (*models.SceneQuery, error) {\n\treturn r.searchScenes(ctx, term, limit, page, perPage)\n}\n\nfunc (r *queryResolver) searchScenes(ctx context.Context, term string, limit *int, page *int, perPage *int) (*models.SceneQuery, error) {\n\ttrimmedQuery := strings.TrimSpace(term)\n\tsceneID, err := uuid.FromString(trimmedQuery)\n\tif err == nil {\n\t\tvar scenes []models.Scene\n\t\tscene, err := r.services.Scene().FindByID(ctx, sceneID)\n\t\tif scene != nil {\n\t\t\tscenes = append(scenes, *scene)\n\t\t}\n\t\treturn &models.SceneQuery{\n\t\t\tSearchResults: &models.SceneSearchResults{\n\t\t\t\tScenes: scenes,\n\t\t\t\tCount:  len(scenes),\n\t\t\t},\n\t\t}, err\n\t}\n\n\tsearchLimit := 10\n\tsearchOffset := 0\n\n\tif perPage != nil && *perPage > 0 {\n\t\tsearchLimit = *perPage\n\t} else if limit != nil && *limit > 0 {\n\t\tsearchLimit = *limit\n\t}\n\n\tif page != nil && *page > 1 {\n\t\tsearchOffset = (*page - 1) * searchLimit\n\t}\n\n\tif strings.HasPrefix(trimmedQuery, \"https://\") || strings.HasPrefix(trimmedQuery, \"http://\") {\n\t\tscenes, err := r.services.Scene().FindByURL(ctx, trimmedQuery, searchLimit)\n\t\treturn &models.SceneQuery{\n\t\t\tSearchResults: &models.SceneSearchResults{\n\t\t\t\tScenes: scenes,\n\t\t\t\tCount:  len(scenes),\n\t\t\t},\n\t\t}, err\n\t}\n\n\treturn r.services.Scene().SearchScenesWithCount(ctx, trimmedQuery, searchLimit, searchOffset)\n}\n"
  },
  {
    "path": "internal/api/resolver_query_site.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *queryResolver) FindSite(ctx context.Context, id uuid.UUID) (*models.Site, error) {\n\treturn r.services.Site().GetByID(ctx, id)\n}\n\nfunc (r *queryResolver) QuerySites(ctx context.Context) (*models.QuerySitesResultType, error) {\n\tsites, count, err := r.services.Site().Query(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &models.QuerySitesResultType{\n\t\tSites: sites,\n\t\tCount: count,\n\t}, nil\n}\n"
  },
  {
    "path": "internal/api/resolver_query_studio.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *queryResolver) FindStudio(ctx context.Context, id *uuid.UUID, name *string) (*models.Studio, error) {\n\tif id != nil {\n\t\treturn r.services.Studio().FindByID(ctx, *id)\n\t} else if name != nil {\n\t\treturn r.services.Studio().FindByName(ctx, *name)\n\t}\n\n\treturn nil, nil\n}\n\nfunc (r *queryResolver) QueryStudios(ctx context.Context, input models.StudioQueryInput) (*models.QueryStudiosResultType, error) {\n\treturn r.services.Studio().Query(ctx, input)\n}\n\nfunc (r *queryResolver) SearchStudio(ctx context.Context, term string, limit *int) ([]models.Studio, error) {\n\ts := r.services.Studio()\n\n\tid := parseUUID(term)\n\tif !id.IsNil() {\n\t\tvar studios []models.Studio\n\t\tstudio, err := s.FindByID(ctx, id)\n\t\tif studio != nil {\n\t\t\tstudios = append(studios, *studio)\n\t\t}\n\t\treturn studios, err\n\t}\n\n\tsearchLimit := 10\n\tif limit != nil {\n\t\tsearchLimit = *limit\n\t}\n\n\treturn s.Search(ctx, term, searchLimit)\n}\n"
  },
  {
    "path": "internal/api/resolver_query_tag.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"strings\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *queryResolver) FindTag(ctx context.Context, id *uuid.UUID, name *string) (*models.Tag, error) {\n\ts := r.services.Tag()\n\tif id != nil {\n\t\treturn s.Find(ctx, *id)\n\t} else if name != nil {\n\t\treturn s.FindByName(ctx, *name)\n\t}\n\n\treturn nil, nil\n}\n\nfunc (r *queryResolver) FindTagOrAlias(ctx context.Context, name string) (*models.Tag, error) {\n\treturn r.services.Tag().FindByNameOrAlias(ctx, name)\n}\n\nfunc (r *queryResolver) QueryTags(ctx context.Context, input models.TagQueryInput) (*models.QueryTagsResultType, error) {\n\ts := r.services.Tag()\n\tif input.Name != nil {\n\t\ttagID, err := uuid.FromString(*input.Name)\n\t\tif err == nil {\n\t\t\ttag, err := s.Find(ctx, tagID)\n\n\t\t\tif tag != nil {\n\t\t\t\treturn &models.QueryTagsResultType{\n\t\t\t\t\tTags:  []models.Tag{*tag},\n\t\t\t\t\tCount: 1,\n\t\t\t\t}, err\n\t\t\t}\n\t\t}\n\t}\n\n\treturn s.Query(ctx, input)\n}\n\nfunc (r *queryResolver) SearchTag(ctx context.Context, term string, limit *int) ([]models.Tag, error) {\n\ttrimmedQuery := strings.TrimSpace(term)\n\ttagID, err := uuid.FromString(trimmedQuery)\n\tif err == nil {\n\t\tvar tags []models.Tag\n\t\ttag, err := r.services.Tag().Find(ctx, tagID)\n\t\tif tag != nil {\n\t\t\ttags = append(tags, *tag)\n\t\t}\n\t\treturn tags, err\n\t}\n\n\tsearchLimit := 10\n\tif limit != nil {\n\t\tsearchLimit = *limit\n\t}\n\n\treturn r.services.Tag().SearchTags(ctx, trimmedQuery, searchLimit)\n}\n"
  },
  {
    "path": "internal/api/resolver_query_tag_category.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *queryResolver) FindTagCategory(ctx context.Context, id uuid.UUID) (*models.TagCategory, error) {\n\treturn r.services.Tag().FindCategory(ctx, id)\n}\n\nfunc (r *queryResolver) QueryTagCategories(ctx context.Context) (*models.QueryTagCategoriesResultType, error) {\n\tcount, categories, err := r.services.Tag().QueryCategories(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &models.QueryTagCategoriesResultType{\n\t\tTagCategories: categories,\n\t\tCount:         count,\n\t}, nil\n}\n"
  },
  {
    "path": "internal/api/resolver_query_user.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc (r *queryResolver) FindUser(ctx context.Context, id *uuid.UUID, username *string) (*models.User, error) {\n\tvar ret *models.User\n\tvar err error\n\tif id != nil {\n\t\tret, err = r.services.User().FindByID(ctx, *id)\n\t} else if username != nil {\n\t\tret, err = r.services.User().FindByName(ctx, *username)\n\t}\n\n\treturn ret, err\n}\n\nfunc (r *queryResolver) QueryUsers(ctx context.Context, input models.UserQueryInput) (*models.QueryUsersResultType, error) {\n\treturn r.services.User().Query(ctx, input)\n}\n\nfunc (r *queryResolver) Me(ctx context.Context) (*models.User, error) {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\tif currentUser == nil {\n\t\treturn nil, auth.ErrUnauthorized\n\t}\n\n\treturn currentUser, nil\n}\n"
  },
  {
    "path": "internal/api/routes_image.go",
    "content": "package api\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"slices\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/jackc/pgx/v5\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/service\"\n\t\"github.com/stashapp/stash-box/internal/storage\"\n\n\t\"github.com/go-chi/chi/v5\"\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/image\"\n\t\"github.com/stashapp/stash-box/internal/image/cache\"\n\t\"github.com/stashapp/stash-box/pkg/logger\"\n)\n\ntype imageRoutes struct {\n\tfac service.Factory\n}\n\nfunc (rs imageRoutes) Routes() chi.Router {\n\tr := chi.NewRouter()\n\n\tr.Get(\"/{uuid}\", rs.image)\n\tr.Get(\"/site/{uuid}\", rs.siteImage)\n\n\treturn r\n}\n\nfunc (rs imageRoutes) image(w http.ResponseWriter, r *http.Request) {\n\tuuid, err := uuid.FromString(chi.URLParam(r, \"uuid\"))\n\tif err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\n\trequestedSize, err := getImageSize(r)\n\tif err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusBadRequest)\n\t}\n\n\tcacheManager := cache.GetCacheManager()\n\n\t// Check for cached image\n\tif requestedSize != 0 && cacheManager != nil {\n\t\treader, err := cacheManager.Read(uuid, requestedSize)\n\n\t\tif err == nil {\n\t\t\tdefer reader.Close()\n\n\t\t\tw.Header().Add(\"Cache-Control\", \"max-age=604800000\")\n\t\t\t// Use http.ServeContent for *os.File to enable sendfile syscall\n\t\t\tif file, ok := reader.(*os.File); ok {\n\t\t\t\thttp.ServeContent(w, r, \"\", time.Time{}, file)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif _, err := io.Copy(w, reader); err != nil {\n\t\t\t\tlogger.Debugf(\"failed to read cached image: %v\", err)\n\t\t\t\tw.Header().Set(\"Cache-Control\", \"no-store\")\n\t\t\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t}\n\n\tctx := r.Context()\n\timageService := rs.fac.Image()\n\tdatabaseImage, err := imageService.Find(ctx, uuid)\n\tif err != nil {\n\t\tif errors.Is(err, pgx.ErrNoRows) {\n\t\t\thttp.NotFound(w, r)\n\t\t} else {\n\t\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\t}\n\t\treturn\n\t}\n\n\tif databaseImage == nil {\n\t\thttp.NotFound(w, r)\n\t\treturn\n\t}\n\n\treader, size, err := imageService.Read(*databaseImage)\n\tif err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusNotFound)\n\t\treturn\n\t}\n\tdefer reader.Close()\n\n\tif databaseImage.Width == -1 {\n\t\tw.Header().Add(\"Content-Type\", \"image/svg+xml\")\n\t\tw.Header().Add(\"Content-Security-Policy\", \"script-src 'none'\")\n\t}\n\tw.Header().Add(\"Cache-Control\", \"max-age=604800000\")\n\n\t// Resize image\n\tif shouldResize(databaseImage, requestedSize) {\n\t\tdata, err := image.Resize(reader, requestedSize, databaseImage, size)\n\t\tif err != nil {\n\t\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\t\treturn\n\t\t}\n\n\t\tif _, err := w.Write(data); err != nil {\n\t\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\t}\n\t\tif cacheManager != nil {\n\t\t\t_ = cacheManager.Write(databaseImage.ID, requestedSize, data)\n\t\t}\n\t\treturn\n\t}\n\n\t// Serve full image - use http.ServeContent for *os.File to enable sendfile syscall\n\tif file, ok := reader.(*os.File); ok {\n\t\thttp.ServeContent(w, r, \"\", time.Time{}, file)\n\t\treturn\n\t}\n\tif _, err := io.Copy(w, reader); err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t}\n}\n\nfunc (rs imageRoutes) siteImage(w http.ResponseWriter, r *http.Request) {\n\tid := chi.URLParam(r, \"uuid\")\n\tsiteID, err := uuid.FromString(id)\n\tif err != nil {\n\t\tw.WriteHeader(http.StatusNotFound)\n\t\treturn\n\t}\n\n\tctx := r.Context()\n\tsite, err := rs.fac.Site().GetByID(ctx, siteID)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tdata, err := storage.GetSiteIcon(r.Context(), *site)\n\tif err != nil {\n\t\tlogger.Error(\"Couldn't get favicon:\", err)\n\t}\n\n\tif data == nil {\n\t\tw.Header().Add(\"Cache-Control\", \"max-age=86400\")\n\t\tw.WriteHeader(http.StatusNotFound)\n\t\treturn\n\t}\n\n\tw.Header().Add(\"Cache-Control\", \"max-age=604800000\")\n\t//nolint\n\tw.Write(data)\n}\n\n// Limit allowed sizes to prevent abuse\nvar allowedSizes = []int{300, 600, 1280}\n\nfunc getImageSize(r *http.Request) (int, error) {\n\tmaxSize := 0\n\tquerySize := r.FormValue(\"size\")\n\tswitch {\n\tcase querySize == \"full\":\n\t// Skip resize\n\tcase querySize != \"\":\n\t\tsize, err := strconv.Atoi(querySize)\n\t\tif err != nil || !slices.Contains(allowedSizes, size) {\n\t\t\treturn 0, err\n\t\t}\n\t\treturn size, err\n\tcase config.GetImageMaxSize() != nil:\n\t\tmaxSize = *config.GetImageMaxSize()\n\t}\n\n\treturn maxSize, nil\n}\n\n// shouldResize returns true if resize config is enabled, the size to resize to is not zero,\n// the image is not below the minimum size to ignore, and the image is larger than the minimum\n// size to resize down to.\nfunc shouldResize(image *models.Image, requestedSize int) bool {\n\tconfig := config.GetImageResizeConfig()\n\tminSize := config.MinSize\n\treturn config.Enabled && requestedSize != 0 &&\n\t\t(image.Width > minSize || image.Height > minSize) &&\n\t\t(image.Width > requestedSize || image.Height > requestedSize)\n}\n"
  },
  {
    "path": "internal/api/routes_root.go",
    "content": "package api\n\nimport (\n\t\"embed\"\n\t\"html/template\"\n\t\"io/fs\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/go-chi/chi/v5\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/service\"\n)\n\ntype rootRoutes struct {\n\tui    embed.FS\n\tindex []byte\n}\n\nfunc (rr rootRoutes) Routes(fac service.Factory) chi.Router {\n\trr.index = getIndex(rr.ui)\n\n\tr := chi.NewRouter()\n\n\t// session handlers\n\tr.Post(\"/login\", handleLogin(fac))\n\tr.HandleFunc(\"/logout\", handleLogout)\n\n\tr.Mount(\"/images\", imageRoutes{\n\t\tfac: fac,\n\t}.Routes())\n\n\t// Serve static assets\n\tr.HandleFunc(\"/assets/*\", rr.assets)\n\tr.HandleFunc(\"/favicon.ico\", rr.assets)\n\tr.HandleFunc(\"/manifest.json\", rr.assets)\n\n\t// Serve the web app\n\tr.HandleFunc(\"/*\", rr.app)\n\n\treturn r\n}\n\nfunc (rr rootRoutes) assets(w http.ResponseWriter, r *http.Request) {\n\tw.Header().Add(\"Cache-Control\", \"max-age=604800000\")\n\tuiRoot, err := fs.Sub(rr.ui, \"build\")\n\tif err != nil {\n\t\tpanic(error.Error(err))\n\t}\n\thttp.FileServer(http.FS(uiRoot)).ServeHTTP(w, r)\n}\n\nfunc (rr rootRoutes) app(w http.ResponseWriter, r *http.Request) {\n\tcsp := config.GetCSP()\n\tif csp != \"\" {\n\t\tw.Header().Add(\"Content-Security-Policy\", csp)\n\t}\n\tw.Header().Add(\"Strict-Transport-Security\", \"max-age=31536000; includeSubDomains\")\n\tw.Header().Add(\"X-Content-Type-Options\", \"nosniff\")\n\tw.Header().Add(\"Referrer-Policy\", \"same-origin\")\n\tw.Header().Add(\"Permissions-Policy\", \"accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()\")\n\t_, _ = w.Write(rr.index)\n}\n\nfunc getIndex(ui embed.FS) []byte {\n\tindexFile, err := ui.ReadFile(\"build/index.html\")\n\tif err != nil {\n\t\tpanic(error.Error(err))\n\t}\n\ttmpl := template.Must(template.New(\"index\").Parse(string(indexFile)))\n\ttitle := template.HTMLEscapeString(config.GetTitle())\n\toutput := new(strings.Builder)\n\tif err := tmpl.Execute(output, template.HTML(title)); err != nil {\n\t\tpanic(error.Error(err))\n\t}\n\treturn []byte(output.String())\n}\n"
  },
  {
    "path": "internal/api/scene_edit_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype sceneEditTestRunner struct {\n\ttestRunner\n}\n\nfunc createSceneEditTestRunner(t *testing.T) *sceneEditTestRunner {\n\treturn &sceneEditTestRunner{\n\t\ttestRunner: *asAdmin(t),\n\t}\n}\n\nfunc (s *sceneEditTestRunner) testCreateSceneEdit() {\n\tsceneEditDetailsInput := s.createFullSceneEditDetailsInput()\n\n\tedit, err := s.createTestSceneEdit(models.OperationEnumCreate, sceneEditDetailsInput, nil)\n\tassert.NoError(s.t, err)\n\ts.verifyCreatedSceneEdit(*sceneEditDetailsInput, edit)\n}\n\nfunc (s *sceneEditTestRunner) verifyCreatedSceneEdit(input models.SceneEditDetailsInput, edit *models.Edit) {\n\tassert.True(s.t, edit.ID != uuid.Nil, \"Expected created edit id to be non-zero\")\n\n\ts.verifyEditOperation(models.OperationEnumCreate.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumScene.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\ts.verifySceneEditDetails(input, edit)\n}\n\nfunc (s *sceneEditTestRunner) testFindEditById() {\n\tcreatedEdit, err := s.createTestSceneEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\tedit, err := s.resolver.Query().FindEdit(s.ctx, createdEdit.ID)\n\tassert.NoError(s.t, err)\n\tassert.NotNil(s.t, edit, \"Did not find edit by id\")\n}\n\nfunc (s *sceneEditTestRunner) testModifySceneEdit() {\n\texistingTitle := \"sceneName\"\n\texistingDetails := \"sceneDetails\"\n\texistingProductionDate := \"2020-03-01\"\n\n\tsceneCreateInput := models.SceneCreateInput{\n\t\tTitle:          &existingTitle,\n\t\tDetails:        &existingDetails,\n\t\tDate:           \"2020-03-02\",\n\t\tProductionDate: &existingProductionDate,\n\t}\n\tcreatedScene, err := s.createTestScene(&sceneCreateInput)\n\tassert.NoError(s.t, err)\n\n\tsceneEditDetailsInput := s.createSceneEditDetailsInput()\n\tid := createdScene.UUID()\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &id,\n\t}\n\n\tcreatedUpdateEdit, err := s.createTestSceneEdit(models.OperationEnumModify, sceneEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\ts.verifyUpdatedSceneEdit(createdScene, *sceneEditDetailsInput, createdUpdateEdit)\n}\n\nfunc (s *sceneEditTestRunner) verifyUpdatedSceneEdit(originalScene *sceneOutput, input models.SceneEditDetailsInput, edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumModify.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumScene.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\ts.verifySceneEditDetails(input, edit)\n}\n\nfunc (s *sceneEditTestRunner) verifySceneEditDetails(input models.SceneEditDetailsInput, edit *models.Edit) {\n\tsceneDetails := s.getEditSceneDetails(edit)\n\n\tc := fieldComparator{r: &s.testRunner}\n\tc.strPtrStrPtr(input.Title, sceneDetails.Title, \"Title\")\n\tc.strPtrStrPtr(input.Details, sceneDetails.Details, \"Details\")\n\tc.strPtrStrPtr(input.Director, sceneDetails.Director, \"Director\")\n\tc.strPtrStrPtr(input.Code, sceneDetails.Code, \"Code\")\n\tc.uuidPtrUUIDPtr(input.StudioID, sceneDetails.StudioID, \"StudioID\")\n\tc.intPtrIntPtr(input.Duration, sceneDetails.Duration, \"Duration\")\n\tc.strPtrStrPtr(input.Date, sceneDetails.Date, \"Date\")\n\tc.strPtrStrPtr(input.ProductionDate, sceneDetails.ProductionDate, \"ProductionDate\")\n\n\tassert.Equal(s.t, input.Urls, sceneDetails.AddedUrls)\n\tassert.Equal(s.t, input.ImageIds, sceneDetails.AddedImages)\n\tassert.Equal(s.t, input.TagIds, sceneDetails.AddedTags)\n\n\tif !comparePerformersInput(input.Performers, sceneDetails.AddedPerformers) {\n\t\ts.fieldMismatch(input.Performers, sceneDetails.AddedPerformers, \"Performers\")\n\t}\n}\n\nfunc (s *sceneEditTestRunner) verifySceneEdit(input models.SceneEditDetailsInput, scene *models.Scene) {\n\tresolver := s.resolver.Scene()\n\n\tc := fieldComparator{r: &s.testRunner}\n\tc.strPtrStrPtr(input.Title, scene.Title, \"Title\")\n\tc.strPtrStrPtr(input.Details, scene.Details, \"Details\")\n\tc.strPtrStrPtr(input.Director, scene.Director, \"Director\")\n\tc.strPtrStrPtr(input.Code, scene.Code, \"Code\")\n\tc.uuidPtrNullUUID(input.StudioID, scene.StudioID, \"StudioID\")\n\tc.intPtrIntPtr(input.Duration, scene.Duration, \"Duration\")\n\tc.strPtrStrPtr(input.Date, scene.Date, \"Date\")\n\tc.strPtrStrPtr(input.ProductionDate, scene.ProductionDate, \"ProductionDate\")\n\n\turls, _ := resolver.Urls(s.ctx, scene)\n\tassert.Equal(s.t, input.Urls, urls)\n\n\timages, _ := resolver.Images(s.ctx, scene)\n\tvar imageIds []uuid.UUID\n\tfor _, image := range images {\n\t\timageIds = append(imageIds, image.ID)\n\t}\n\tassert.Equal(s.t, input.ImageIds, imageIds)\n\n\ttags, _ := resolver.Tags(s.ctx, scene)\n\n\tvar tagIdObjs []idObject\n\tfor _, t := range tags {\n\t\ttagIdObjs = append(tagIdObjs, idObject{ID: t.ID.String()})\n\t}\n\n\tif !compareTags(input.TagIds, tagIdObjs) {\n\t\ts.fieldMismatch(input.TagIds, tags, \"Tags\")\n\t}\n\n\tperformers, _ := resolver.Performers(s.ctx, scene)\n\tvar performerIdObjs []performerAppearance\n\tfor _, p := range performers {\n\t\tperformerIdObjs = append(performerIdObjs, performerAppearance{\n\t\t\tPerformer: &idObject{\n\t\t\t\tID: p.Performer.ID.String(),\n\t\t\t},\n\t\t\tAs: p.As,\n\t\t})\n\t}\n\n\tif !comparePerformers(input.Performers, performerIdObjs) {\n\t\ts.fieldMismatch(input.Performers, performers, \"Performers\")\n\t}\n}\n\nfunc (s *sceneEditTestRunner) testDestroySceneEdit() {\n\tcreatedScene, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tsceneID := createdScene.UUID()\n\n\tsceneEditDetailsInput := models.SceneEditDetailsInput{}\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumDestroy,\n\t\tID:        &sceneID,\n\t}\n\tdestroyEdit, err := s.createTestSceneEdit(models.OperationEnumDestroy, &sceneEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\ts.verifyDestroySceneEdit(sceneID, destroyEdit)\n}\n\nfunc (s *sceneEditTestRunner) verifyDestroySceneEdit(sceneID uuid.UUID, edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumDestroy.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumScene.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\teditTarget := s.getEditSceneTarget(edit)\n\tassert.Equal(s.t, sceneID, editTarget.ID)\n}\n\nfunc (s *sceneEditTestRunner) testMergeSceneEdit() {\n\texistingName := \"sceneName2\"\n\texistingProductionDate := \"2020-03-01\"\n\tsceneCreateInput := models.SceneCreateInput{\n\t\tTitle:          &existingName,\n\t\tDate:           \"2020-03-02\",\n\t\tProductionDate: &existingProductionDate,\n\t}\n\tcreatedPrimaryScene, err := s.createTestScene(&sceneCreateInput)\n\tassert.NoError(s.t, err)\n\n\tcreatedMergeScene, err := s.createTestScene(nil)\n\n\tsceneEditDetailsInput := s.createFullSceneEditDetailsInput()\n\tid := createdPrimaryScene.UUID()\n\tmergeSources := []uuid.UUID{createdMergeScene.UUID()}\n\teditInput := models.EditInput{\n\t\tOperation:      models.OperationEnumMerge,\n\t\tID:             &id,\n\t\tMergeSourceIds: mergeSources,\n\t}\n\n\tcreatedMergeEdit, err := s.createTestSceneEdit(models.OperationEnumMerge, sceneEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\ts.verifyMergeSceneEdit(createdPrimaryScene, *sceneEditDetailsInput, createdMergeEdit, mergeSources)\n}\n\nfunc (s *sceneEditTestRunner) verifyMergeSceneEdit(originalScene *sceneOutput, input models.SceneEditDetailsInput, edit *models.Edit, inputMergeSources []uuid.UUID) {\n\ts.verifyEditOperation(models.OperationEnumMerge.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumScene.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\ts.verifySceneEditDetails(input, edit)\n\n\tvar mergeSources []uuid.UUID\n\tmerges, _ := s.resolver.Edit().MergeSources(s.ctx, edit)\n\tfor i := range merges {\n\t\tmerge := merges[i].(*models.Scene)\n\t\tmergeSources = append(mergeSources, merge.ID)\n\t}\n\tassert.Equal(s.t, inputMergeSources, mergeSources)\n}\n\nfunc (s *sceneEditTestRunner) testApplyCreateSceneEdit() {\n\tsceneEditDetailsInput := s.createFullSceneEditDetailsInput()\n\tedit, err := s.createTestSceneEdit(models.OperationEnumCreate, sceneEditDetailsInput, nil)\n\tappliedEdit, err := s.applyEdit(edit.ID)\n\tassert.NoError(s.t, err)\n\ts.verifyAppliedSceneCreateEdit(*sceneEditDetailsInput, appliedEdit)\n}\n\nfunc (s *sceneEditTestRunner) verifyAppliedSceneCreateEdit(input models.SceneEditDetailsInput, edit *models.Edit) {\n\tassert.True(s.t, edit.ID != uuid.Nil)\n\n\ts.verifyEditOperation(models.OperationEnumCreate.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumScene.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\tscene := s.getEditSceneTarget(edit)\n\ts.verifySceneEdit(input, scene)\n}\n\nfunc (s *sceneEditTestRunner) testApplyModifySceneEdit() {\n\ttitle := \"sceneName3\"\n\tproductionDate := \"2020-03-01\"\n\tsite, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tsceneCreateInput := models.SceneCreateInput{\n\t\tTitle: &title,\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"http://example.org/asd\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t\tDate:           \"2020-03-02\",\n\t\tProductionDate: &productionDate,\n\t}\n\tcreatedScene, err := s.createTestScene(&sceneCreateInput)\n\tassert.NoError(s.t, err)\n\n\t// Create edit that replaces all metadata for the scene\n\tsceneEditDetailsInput := s.createFullSceneEditDetailsInput()\n\tid := createdScene.UUID()\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &id,\n\t}\n\n\tcreatedUpdateEdit, err := s.createTestSceneEdit(models.OperationEnumModify, sceneEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\tappliedEdit, err := s.applyEdit(createdUpdateEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tmodifiedScene, _ := s.resolver.Query().FindScene(s.ctx, id)\n\ts.verifyApplyModifySceneEdit(*sceneEditDetailsInput, modifiedScene, appliedEdit)\n}\n\nfunc (s *sceneEditTestRunner) verifyApplyModifySceneEdit(input models.SceneEditDetailsInput, updatedScene *models.Scene, edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumModify.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumScene.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\ts.verifySceneEdit(input, updatedScene)\n}\n\nfunc (s *sceneEditTestRunner) testApplyModifyUnsetSceneEdit() {\n\tsceneData := s.createFullSceneCreateInput()\n\tcreatedScene, err := s.createTestScene(sceneData)\n\tassert.NoError(s.t, err)\n\n\tid := createdScene.UUID()\n\n\tvar resp struct {\n\t\tSceneEdit struct {\n\t\t\tID string\n\t\t}\n\t}\n\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tmutation {\n\t\t\tsceneEdit(input: {\n\t\t\t\tedit: {id: \"%v\", operation: MODIFY}\n\t\t\t\tdetails: { urls: [], director: null }\n\t\t\t}) {\n\t\t\t\tid\n\t\t\t}\n\t\t}\n\t`, id), &resp)\n\n\tedit, _ := s.applyEdit(uuid.FromStringOrNil(resp.SceneEdit.ID))\n\ts.verifyAppliedSceneEdit(edit)\n\n\tvar scene struct {\n\t\tFindScene struct {\n\t\t\tDirector string\n\t\t\tURLs     []models.URL\n\t\t\tTags     []models.Tag\n\t\t}\n\t}\n\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tquery {\n\t\t\tfindScene(id: \"%v\") {\n\t\t\t\tdirector\n\t\t\t\turls {\n\t\t\t\t\turl\n\t\t\t\t}\n\t\t\t\ttags {\n\t\t\t\t  id\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`, id), &scene)\n\n\tassert.Equal(s.t, scene.FindScene.Director, \"\")\n\tassert.True(s.t, len(scene.FindScene.URLs) == 0)\n\tassert.True(s.t, len(scene.FindScene.Tags) == len(sceneData.TagIds))\n}\n\nfunc (s *sceneEditTestRunner) testApplyDestroySceneEdit() {\n\tcreatedScene, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tsceneID := createdScene.UUID()\n\n\tsceneEditDetailsInput := models.SceneEditDetailsInput{}\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumDestroy,\n\t\tID:        &sceneID,\n\t}\n\tdestroyEdit, err := s.createTestSceneEdit(models.OperationEnumDestroy, &sceneEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\tappliedEdit, err := s.applyEdit(destroyEdit.ID)\n\n\tdestroyedScene, _ := s.resolver.Query().FindScene(s.ctx, sceneID)\n\ts.verifyApplyDestroySceneEdit(destroyedScene, appliedEdit)\n}\n\nfunc (s *sceneEditTestRunner) verifyApplyDestroySceneEdit(destroyedScene *models.Scene, edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumDestroy.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumScene.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\tassert.Equal(s.t, destroyedScene.Deleted, true)\n}\n\nfunc (s *sceneEditTestRunner) testApplyMergeSceneEdit() {\n\tmergeSource1, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tmergeSource2, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tmergeTarget, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tsceneEditDetailsInput := s.createFullSceneEditDetailsInput()\n\tmergeSources := []uuid.UUID{\n\t\tmergeSource1.UUID(),\n\t\tmergeSource2.UUID(),\n\t}\n\n\tid := mergeTarget.UUID()\n\teditInput := models.EditInput{\n\t\tOperation:      models.OperationEnumMerge,\n\t\tID:             &id,\n\t\tMergeSourceIds: mergeSources,\n\t}\n\n\tmergeEdit, err := s.createTestSceneEdit(models.OperationEnumMerge, sceneEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\tappliedMerge, err := s.applyEdit(mergeEdit.ID)\n\tassert.NoError(s.t, err)\n\n\ts.verifyAppliedMergeSceneEdit(*sceneEditDetailsInput, appliedMerge)\n}\n\nfunc (s *sceneEditTestRunner) verifyAppliedMergeSceneEdit(input models.SceneEditDetailsInput, edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumMerge.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumScene.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\ts.verifySceneEditDetails(input, edit)\n\n\tmerges, _ := s.resolver.Edit().MergeSources(s.ctx, edit)\n\tfor i := range merges {\n\t\tscene := merges[i].(*models.Scene)\n\t\tassert.Equal(s.t, scene.Deleted, true)\n\t}\n}\n\nfunc (s *sceneEditTestRunner) testQueryExistingScene() {\n\tstudio, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\tsceneEditDetailsInput := s.createFullSceneEditDetailsInput()\n\tsceneEditDetailsInput.Fingerprints = []models.FingerprintInput{{\n\t\tHash:      models.FingerprintHash(0xa5d),\n\t\tAlgorithm: models.FingerprintAlgorithmPhash,\n\t\tDuration:  123,\n\t}}\n\tstudioID := studio.UUID()\n\tsceneEditDetailsInput.StudioID = &studioID\n\n\tedit, err := s.createTestSceneEdit(models.OperationEnumCreate, sceneEditDetailsInput, nil)\n\tassert.NoError(s.t, err)\n\n\tvar resp struct {\n\t\tQueryExistingScene struct {\n\t\t\tEdits []struct {\n\t\t\t\tID string\n\t\t\t}\n\t\t}\n\t}\n\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tquery {\n\t\t\tqueryExistingScene(input: {\n\t\t\t\ttitle: \"%v\"\n\t\t\t\tstudio_id: \"%v\"\n\t\t\t\tfingerprints: [{\n\t\t\t\t  duration: 123\n\t\t\t\t\thash: \"%v\"\n\t\t\t\t\talgorithm: %v\n\t\t\t\t}]\n\t\t\t}) {\n\t\t\t  edits {\n\t\t\t\t\tid\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`, *sceneEditDetailsInput.Title, sceneEditDetailsInput.StudioID, sceneEditDetailsInput.Fingerprints[0].Hash, sceneEditDetailsInput.Fingerprints[0].Algorithm), &resp)\n\tassert.True(s.t, len(resp.QueryExistingScene.Edits) > 0)\n\n\t_, err = s.resolver.Mutation().CancelEdit(s.ctx, models.CancelEditInput{\n\t\tID: edit.ID,\n\t})\n\tassert.NoError(s.t, err)\n\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tquery {\n\t\t\tqueryExistingScene(input: {\n\t\t\t\ttitle: \"%v\"\n\t\t\t\tstudio_id: \"%v\"\n\t\t\t\tfingerprints: [{\n\t\t\t\t  duration: 123\n\t\t\t\t\thash: \"%v\"\n\t\t\t\t\talgorithm: %v\n\t\t\t\t}]\n\t\t\t}) {\n\t\t\t  edits {\n\t\t\t\t\tid\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`, *sceneEditDetailsInput.Title, sceneEditDetailsInput.StudioID, sceneEditDetailsInput.Fingerprints[0].Hash, sceneEditDetailsInput.Fingerprints[0].Algorithm), &resp)\n\tassert.True(s.t, len(resp.QueryExistingScene.Edits) == 0)\n}\n\nfunc (s *sceneEditTestRunner) testSceneEditUpdate() {\n\t// Create a pending edit\n\tsceneEditDetailsInput := s.createSceneEditDetailsInput()\n\tcreatedEdit, err := s.createTestSceneEdit(models.OperationEnumCreate, sceneEditDetailsInput, nil)\n\tassert.NoError(s.t, err)\n\n\t// Update the edit with new details\n\tnewTitle := \"Updated Title\"\n\tupdatedDetails := models.SceneEditDetailsInput{\n\t\tTitle: &newTitle,\n\t}\n\n\teditID := createdEdit.ID\n\tupdatedEdit, err := s.resolver.Mutation().SceneEditUpdate(s.ctx, createdEdit.ID, models.SceneEditInput{\n\t\tEdit:    &models.EditInput{ID: &editID},\n\t\tDetails: &updatedDetails,\n\t})\n\tassert.NoError(s.t, err, \"Error updating scene edit\")\n\n\t// Verify the edit was updated\n\tassert.Equal(s.t, createdEdit.ID, updatedEdit.ID, \"Edit ID should not change\")\n\tassert.NotNil(s.t, updatedEdit, \"Updated edit should not be nil\")\n}\n\nfunc TestCreateSceneEdit(t *testing.T) {\n\tpt := createSceneEditTestRunner(t)\n\tpt.testCreateSceneEdit()\n}\n\nfunc TestModifySceneEdit(t *testing.T) {\n\tpt := createSceneEditTestRunner(t)\n\tpt.testModifySceneEdit()\n}\n\nfunc TestDestroySceneEdit(t *testing.T) {\n\tpt := createSceneEditTestRunner(t)\n\tpt.testDestroySceneEdit()\n}\n\nfunc TestMergeSceneEdit(t *testing.T) {\n\tpt := createSceneEditTestRunner(t)\n\tpt.testMergeSceneEdit()\n}\n\nfunc TestApplyCreateSceneEdit(t *testing.T) {\n\tpt := createSceneEditTestRunner(t)\n\tpt.testApplyCreateSceneEdit()\n}\n\nfunc TestApplyModifySceneEdit(t *testing.T) {\n\tpt := createSceneEditTestRunner(t)\n\tpt.testApplyModifySceneEdit()\n}\n\nfunc TestApplyModifyUnsetSceneEdit(t *testing.T) {\n\tpt := createSceneEditTestRunner(t)\n\tpt.testApplyModifyUnsetSceneEdit()\n}\n\nfunc TestApplyDestroySceneEdit(t *testing.T) {\n\tpt := createSceneEditTestRunner(t)\n\tpt.testApplyDestroySceneEdit()\n}\n\nfunc TestApplyMergeSceneEdit(t *testing.T) {\n\tpt := createSceneEditTestRunner(t)\n\tpt.testApplyMergeSceneEdit()\n}\n\nfunc TestQueryExistingScene(t *testing.T) {\n\tpt := createSceneEditTestRunner(t)\n\tpt.testQueryExistingScene()\n}\n\nfunc TestSceneEditUpdate(t *testing.T) {\n\tpt := createSceneEditTestRunner(t)\n\tpt.testSceneEditUpdate()\n}\n"
  },
  {
    "path": "internal/api/scene_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype sceneTestRunner struct {\n\ttestRunner\n}\n\nfunc createSceneTestRunner(t *testing.T) *sceneTestRunner {\n\treturn &sceneTestRunner{\n\t\ttestRunner: *asAdmin(t),\n\t}\n}\n\nfunc (s *sceneTestRunner) testCreateScene() {\n\ttitle := \"Title\"\n\tdetails := \"Details\"\n\tdate := \"2003-02-01\"\n\tproduction_date := \"2003-03-09\"\n\n\tperformer, _ := s.createTestPerformer(nil)\n\tstudio, _ := s.createTestStudio(nil)\n\ttag, _ := s.createTestTag(nil)\n\tsite, _ := s.createTestSite(nil)\n\n\tperformerID := performer.UUID()\n\tstudioID := studio.UUID()\n\ttagID := tag.UUID()\n\n\tperformerAlias := \"alias\"\n\n\tinput := models.SceneCreateInput{\n\t\tTitle:          &title,\n\t\tDetails:        &details,\n\t\tDate:           date,\n\t\tProductionDate: &production_date,\n\t\tFingerprints: []models.FingerprintEditInput{\n\t\t\ts.generateSceneFingerprint(nil),\n\t\t},\n\t\tStudioID: &studioID,\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\t{\n\t\t\t\tPerformerID: performerID,\n\t\t\t\tAs:          &performerAlias,\n\t\t\t},\n\t\t},\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"URL\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t\tTagIds: []uuid.UUID{\n\t\t\ttagID,\n\t\t},\n\t}\n\n\tscene, err := s.client.createScene(input)\n\tassert.NoError(s.t, err)\n\n\ts.verifyCreatedScene(input, scene)\n}\n\nfunc (s *sceneTestRunner) verifyCreatedScene(input models.SceneCreateInput, scene *sceneOutput) {\n\t// ensure basic attributes are set correctly\n\tassert.True(s.t, scene.ID != \"\", \"Expected created scene id to be non-zero\")\n\n\tassert.Equal(s.t, scene.Title, input.Title)\n\tassert.Equal(s.t, scene.Details, input.Details)\n\n\ts.compareSiteURLs(input.Urls, scene.Urls)\n\n\tassert.True(s.t, bothNil(scene.Date, input.Date) || (!oneNil(scene.Date, input.Date) && input.Date == *scene.Date))\n\tassert.True(s.t, bothNil(scene.ProductionDate, input.ProductionDate) || (!oneNil(scene.ProductionDate, input.ProductionDate) && *input.ProductionDate == *scene.ProductionDate))\n\tassert.True(s.t, compareFingerprints(input.Fingerprints, scene.Fingerprints))\n\tassert.True(s.t, comparePerformers(input.Performers, scene.Performers))\n\tassert.True(s.t, compareTags(input.TagIds, scene.Tags))\n}\n\nfunc (s *sceneTestRunner) testFindSceneById() {\n\tcreatedScene, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tscene, err := s.client.findScene(createdScene.UUID())\n\tassert.NoError(s.t, err)\n\n\t// ensure returned scene is not nil\n\tassert.NotNil(s.t, scene, \"Did not find scene by id\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, *createdScene.Title, *scene.Title)\n}\n\nfunc (s *sceneTestRunner) testUpdateScene() {\n\ttitle := \"Title\"\n\tdetails := \"Details\"\n\tdate := \"2003-02-01\"\n\tproduction_date := \"2003-01-30\"\n\n\tperformer, _ := s.createTestPerformer(nil)\n\tstudio, _ := s.createTestStudio(nil)\n\ttag, _ := s.createTestTag(nil)\n\tsite, _ := s.createTestSite(nil)\n\n\tperformerID := performer.UUID()\n\tstudioID := studio.UUID()\n\ttagID := tag.UUID()\n\n\tperformerAlias := \"alias\"\n\n\tinput := models.SceneCreateInput{\n\t\tTitle:          &title,\n\t\tDetails:        &details,\n\t\tDate:           date,\n\t\tProductionDate: &production_date,\n\t\tFingerprints: []models.FingerprintEditInput{\n\t\t\t// fingerprint that will be kept\n\t\t\ts.generateSceneFingerprint([]uuid.UUID{\n\t\t\t\tuserDB.none.ID,\n\t\t\t\tuserDB.admin.ID,\n\t\t\t}),\n\t\t\t// fingerprint that will be removed\n\t\t\ts.generateSceneFingerprint(nil),\n\t\t},\n\t\tStudioID: &studioID,\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\t{\n\t\t\t\tPerformerID: performerID,\n\t\t\t\tAs:          &performerAlias,\n\t\t\t},\n\t\t},\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"URL\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t\tTagIds: []uuid.UUID{\n\t\t\ttagID,\n\t\t},\n\t}\n\n\tcreatedScene, err := s.createTestScene(&input)\n\tassert.NoError(s.t, err)\n\n\tnewTitle := \"NewTitle\"\n\tnewDetails := \"NewDetails\"\n\tnewDate := \"2001-02-03\"\n\tnewProductionDate := \"2001-02-01\"\n\n\tperformer, _ = s.createTestPerformer(nil)\n\tstudio, _ = s.createTestStudio(nil)\n\ttag, _ = s.createTestTag(nil)\n\tsite, _ = s.createTestSite(nil)\n\n\tperformerID = performer.UUID()\n\tstudioID = studio.UUID()\n\ttagID = tag.UUID()\n\n\tperformerAlias = \"updatedAlias\"\n\n\tsceneID := createdScene.UUID()\n\tupdateInput := models.SceneUpdateInput{\n\t\tID:             sceneID,\n\t\tTitle:          &newTitle,\n\t\tDetails:        &newDetails,\n\t\tDate:           &newDate,\n\t\tProductionDate: &newProductionDate,\n\t\tFingerprints: []models.FingerprintEditInput{\n\t\t\tinput.Fingerprints[0],\n\t\t\ts.generateSceneFingerprint(nil),\n\t\t},\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\t{\n\t\t\t\tPerformerID: performerID,\n\t\t\t\tAs:          &performerAlias,\n\t\t\t},\n\t\t},\n\t\tUrls: []models.URL{\n\t\t\t{\n\t\t\t\tURL:    \"URL\",\n\t\t\t\tSiteID: site.ID,\n\t\t\t},\n\t\t},\n\t\tStudioID: &studioID,\n\t\tTagIds: []uuid.UUID{\n\t\t\ttagID,\n\t\t},\n\t}\n\n\tscene, err := s.client.updateScene(updateInput)\n\tassert.NoError(s.t, err)\n\n\ts.verifyUpdatedScene(updateInput, scene)\n\n\t// ensure fingerprint changes were enacted\n\ts.verifyUpdatedFingerprints(input.Fingerprints, updateInput.Fingerprints, scene)\n\n\t// ensure submissions count was maintained\n\toriginalFP := input.Fingerprints[0]\n\tfoundFP := false\n\tfor _, f := range scene.Fingerprints {\n\t\tif originalFP.Algorithm == f.Algorithm && originalFP.Hash.Hex() == f.Hash {\n\t\t\tfoundFP = true\n\t\t\tassert.Equal(s.t, f.Submissions, 2, \"Incorrect fingerprint submissions count\")\n\t\t}\n\t}\n\n\tassert.True(s.t, foundFP, \"Could not find original fingerprint\")\n}\n\nfunc (s *sceneTestRunner) verifyUpdatedScene(input models.SceneUpdateInput, scene *sceneOutput) {\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, scene.Title, input.Title)\n\tassert.Equal(s.t, scene.Details, input.Details)\n\n\tassert.True(s.t, bothNil(scene.Date, input.Date) || (!oneNil(scene.Date, input.Date) && *scene.Date == *input.Date))\n\tassert.True(s.t, bothNil(scene.ProductionDate, input.ProductionDate) || (!oneNil(scene.ProductionDate, input.ProductionDate) && *scene.ProductionDate == *input.ProductionDate))\n\n\ts.compareSiteURLs(input.Urls, scene.Urls)\n\n\tassert.True(s.t, comparePerformers(input.Performers, scene.Performers))\n\tassert.True(s.t, compareTags(input.TagIds, scene.Tags))\n}\n\nfunc (s *sceneTestRunner) verifyUpdatedFingerprints(original, updated []models.FingerprintEditInput, scene *sceneOutput) {\n\thashExists := func(h models.FingerprintEditInput, vs []models.FingerprintEditInput) bool {\n\t\tfor _, v := range vs {\n\t\t\tif h.Algorithm == v.Algorithm && h.Hash == v.Hash {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\tinOutput := func(h models.FingerprintEditInput) bool {\n\t\tfor _, hh := range scene.Fingerprints {\n\t\t\tif hh.Algorithm == h.Algorithm && hh.Hash == h.Hash.Hex() {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\tfor _, o := range original {\n\t\t// find in updated\n\t\tif hashExists(o, updated) {\n\t\t\t// exists, so ensure hash exists in output\n\t\t\tassert.True(s.t, inOutput(o), \"existing hash s missing in output\")\n\t\t} else {\n\t\t\t// not exists, ensure not in output\n\t\t\tassert.True(s.t, !inOutput(o), \"removed hash %s still in output\")\n\t\t}\n\t}\n\n\tfor _, u := range updated {\n\t\t// find in original\n\t\tif !hashExists(u, original) {\n\t\t\t// new hash, ensure in output\n\t\t\tassert.True(s.t, inOutput(u), \"new hash missing in output\")\n\t\t}\n\t}\n}\n\nfunc (s *sceneTestRunner) testDestroyScene() {\n\tcreatedScene, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tsceneID := createdScene.UUID()\n\n\tdestroyed, err := s.client.destroyScene(models.SceneDestroyInput{\n\t\tID: sceneID,\n\t})\n\tassert.NoError(s.t, err, \"Error destroying scene\")\n\tassert.True(s.t, destroyed, \"Scene was not destroyed\")\n\n\t// ensure cannot find scene\n\tfoundScene, err := s.client.findScene(sceneID)\n\tassert.NoError(s.t, err, \"Error finding scene after destroying\")\n\tassert.Nil(s.t, foundScene, \"Found scene after destruction\")\n\n\t// TODO - ensure scene was not removed\n}\n\nfunc (s *sceneTestRunner) testSubmitFingerprint() {\n\tcreatedScene, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tfp := s.generateSceneFingerprint(nil)\n\n\t_, err = s.client.submitFingerprint(models.FingerprintSubmission{\n\t\tSceneID: createdScene.UUID(),\n\t\tFingerprint: &models.FingerprintInput{\n\t\t\tHash:      fp.Hash,\n\t\t\tAlgorithm: fp.Algorithm,\n\t\t\tDuration:  fp.Duration,\n\t\t},\n\t})\n\tassert.NoError(s.t, err, \"Error submitting fingerprint\")\n\n\tscene, err := s.client.findScene(createdScene.UUID())\n\tassert.NoError(s.t, err, \"Error finding scene\")\n\n\t// verify created fingerprint\n\texpected := fingerprint{\n\t\tHash:        fp.Hash.Hex(),\n\t\tAlgorithm:   fp.Algorithm,\n\t\tDuration:    fp.Duration,\n\t\tSubmissions: 1,\n\t}\n\tactualFP := scene.Fingerprints[1]\n\tactual := fingerprint{\n\t\tHash:        actualFP.Hash,\n\t\tAlgorithm:   actualFP.Algorithm,\n\t\tDuration:    actualFP.Duration,\n\t\tSubmissions: actualFP.Submissions,\n\t}\n\tassert.Equal(s.t, actual, expected)\n\n\t// submit the same fingerprint - should not add and should not error\n\t_, err = s.client.submitFingerprint(models.FingerprintSubmission{\n\t\tSceneID: createdScene.UUID(),\n\t\tFingerprint: &models.FingerprintInput{\n\t\t\tHash:      fp.Hash,\n\t\t\tAlgorithm: fp.Algorithm,\n\t\t\tDuration:  fp.Duration,\n\t\t},\n\t})\n\tassert.NoError(s.t, err, \"Error submitting fingerprint\")\n}\n\nfunc (s *sceneTestRunner) testSubmitFingerprintUnmatch() {\n\tcreatedScene, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tunmatch := true\n\t_, err = s.client.submitFingerprint(models.FingerprintSubmission{\n\t\tSceneID: createdScene.UUID(),\n\t\tFingerprint: &models.FingerprintInput{\n\t\t\tHash:      createdScene.Fingerprints[0].FingerprintHash(),\n\t\t\tAlgorithm: createdScene.Fingerprints[0].Algorithm,\n\t\t\tDuration:  createdScene.Fingerprints[0].Duration,\n\t\t},\n\t\tUnmatch: &unmatch,\n\t})\n\tassert.NoError(s.t, err, \"Error submitting fingerprint\")\n\n\tscene, err := s.client.findScene(createdScene.UUID())\n\tassert.NoError(s.t, err)\n\n\tassert.True(s.t, len(scene.Fingerprints) == 0)\n}\n\nfunc (s *sceneTestRunner) testSubmitFingerprintModify() {\n\tcreatedScene, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tfp := s.generateSceneFingerprint(nil)\n\n\t_, err = s.client.submitFingerprint(models.FingerprintSubmission{\n\t\tSceneID: createdScene.UUID(),\n\t\tFingerprint: &models.FingerprintInput{\n\t\t\tHash:      fp.Hash,\n\t\t\tAlgorithm: fp.Algorithm,\n\t\t\tDuration:  fp.Duration,\n\t\t\tUserIds: []uuid.UUID{\n\t\t\t\tuserDB.edit.ID,\n\t\t\t\tuserDB.none.ID,\n\t\t\t\tuserDB.read.ID,\n\t\t\t},\n\t\t},\n\t})\n\tassert.NoError(s.t, err, \"Error submitting fingerprint\")\n\n\tscene, err := s.client.findScene(createdScene.UUID())\n\tassert.NoError(s.t, err)\n\n\t// verify created fingerprint\n\texpected := fingerprint{\n\t\tHash:        fp.Hash.Hex(),\n\t\tAlgorithm:   fp.Algorithm,\n\t\tDuration:    fp.Duration,\n\t\tSubmissions: 3,\n\t}\n\tactualFP := scene.Fingerprints[0]\n\tactual := fingerprint{\n\t\tHash:        actualFP.Hash,\n\t\tAlgorithm:   actualFP.Algorithm,\n\t\tDuration:    actualFP.Duration,\n\t\tSubmissions: actualFP.Submissions,\n\t}\n\tassert.Equal(s.t, actual, expected)\n\n\t// submit the same fingerprint - should add\n\t_, err = s.client.submitFingerprint(models.FingerprintSubmission{\n\t\tSceneID: createdScene.UUID(),\n\t\tFingerprint: &models.FingerprintInput{\n\t\t\tHash:      fp.Hash,\n\t\t\tAlgorithm: fp.Algorithm,\n\t\t\tDuration:  fp.Duration,\n\t\t},\n\t})\n\tassert.NoError(s.t, err, \"Error submitting fingerprint\")\n\n\tscene, err = s.client.findScene(createdScene.UUID())\n\tassert.NoError(s.t, err)\n\n\texpected.Submissions = 4\n\tactual.Submissions = scene.Fingerprints[0].Submissions\n\n\tassert.Equal(s.t, actual, expected)\n}\n\nfunc (s *sceneTestRunner) testSubmitFingerprintUnmatchModify() {\n\tcreatedScene, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tfp := s.generateSceneFingerprint(nil)\n\n\t_, err = s.client.submitFingerprint(models.FingerprintSubmission{\n\t\tSceneID: createdScene.UUID(),\n\t\tFingerprint: &models.FingerprintInput{\n\t\t\tHash:      fp.Hash,\n\t\t\tAlgorithm: fp.Algorithm,\n\t\t\tDuration:  fp.Duration,\n\t\t\tUserIds: []uuid.UUID{\n\t\t\t\tuserDB.edit.ID,\n\t\t\t\tuserDB.none.ID,\n\t\t\t\tuserDB.read.ID,\n\t\t\t},\n\t\t},\n\t})\n\tassert.NoError(s.t, err, \"Error submitting fingerprint\")\n\n\tunmatch := true\n\t_, err = s.client.submitFingerprint(models.FingerprintSubmission{\n\t\tSceneID: createdScene.UUID(),\n\t\tFingerprint: &models.FingerprintInput{\n\t\t\tHash:      fp.Hash,\n\t\t\tAlgorithm: fp.Algorithm,\n\t\t\tDuration:  fp.Duration,\n\t\t\tUserIds: []uuid.UUID{\n\t\t\t\tuserDB.edit.ID,\n\t\t\t},\n\t\t},\n\t\tUnmatch: &unmatch,\n\t})\n\tassert.NoError(s.t, err, \"Error submitting fingerprint\")\n\n\tscene, err := s.client.findScene(createdScene.UUID())\n\tassert.NoError(s.t, err)\n\n\texpected := fingerprint{\n\t\tHash:        fp.Hash.Hex(),\n\t\tAlgorithm:   fp.Algorithm,\n\t\tDuration:    fp.Duration,\n\t\tSubmissions: 2,\n\t}\n\tactualFP := scene.Fingerprints[0]\n\tactual := fingerprint{\n\t\tHash:        actualFP.Hash,\n\t\tAlgorithm:   actualFP.Algorithm,\n\t\tDuration:    actualFP.Duration,\n\t\tSubmissions: actualFP.Submissions,\n\t}\n\tassert.Equal(s.t, actual, expected)\n}\n\nfunc (s *sceneTestRunner) verifyQueryScenesResult(filter models.SceneQueryInput, ids []uuid.UUID) {\n\ts.t.Helper()\n\n\tfilter.Page = 1\n\tfilter.PerPage = 10\n\tfilter.Sort = models.SceneSortEnumTitle\n\tfilter.Direction = models.SortDirectionEnumAsc\n\n\tresults, err := s.client.queryScenes(filter)\n\tassert.NoError(s.t, err)\n\n\tassert.Equal(s.t, results.Count, len(ids))\n\n\tfor _, id := range ids {\n\t\tfound := false\n\t\tfor _, scene := range results.Scenes {\n\t\t\tif scene.ID == id.String() {\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tassert.True(s.t, found, \"Missing scene\")\n\t}\n}\n\nfunc (s *sceneTestRunner) verifyInvalidModifier(filter models.SceneQueryInput) {\n\ts.t.Helper()\n\n\tfilter.Page = 1\n\tfilter.PerPage = 10\n\n\tresolver, _ := s.resolver.Query().QueryScenes(s.ctx, filter)\n\t_, err := s.resolver.QueryScenesResultType().Scenes(s.ctx, resolver)\n\tassert.ErrorContains(s.t, err, \"unsupported modifier\")\n}\n\nfunc (s *sceneTestRunner) testQueryScenesByStudio() {\n\tstudio1, _ := s.createTestStudio(nil)\n\tstudio2, _ := s.createTestStudio(nil)\n\n\tstudio1ID := studio1.UUID()\n\tstudio2ID := studio2.UUID()\n\n\tprefix := \"testQueryScenesByStudio_\"\n\tscene1Title := prefix + \"scene1Title\"\n\tscene2Title := prefix + \"scene2Title\"\n\tscene3Title := prefix + \"scene3Title\"\n\n\tinput := models.SceneCreateInput{\n\t\tStudioID: &studio1ID,\n\t\tTitle:    &scene1Title,\n\t\tDate:     \"2020-03-02\",\n\t}\n\n\tscene1, err := s.createTestScene(&input)\n\tassert.NoError(s.t, err)\n\n\tinput.StudioID = &studio2ID\n\tinput.Title = &scene2Title\n\tscene2, err := s.createTestScene(&input)\n\tassert.NoError(s.t, err)\n\n\tinput.StudioID = nil\n\tinput.Title = &scene3Title\n\tscene3, err := s.createTestScene(&input)\n\tassert.NoError(s.t, err)\n\n\tscene1ID := scene1.UUID()\n\tscene2ID := scene2.UUID()\n\tscene3ID := scene3.UUID()\n\n\t// test equals\n\tfilter := models.SceneQueryInput{\n\t\tStudios: &models.MultiIDCriterionInput{\n\t\t\tValue:    []uuid.UUID{studio1ID},\n\t\t\tModifier: models.CriterionModifierEquals,\n\t\t},\n\t}\n\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene1ID})\n\n\tfilter.Studios.Modifier = models.CriterionModifierNotEquals\n\tfilter.Title = &scene2Title\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene2ID})\n\n\tfilter.Studios.Modifier = models.CriterionModifierIsNull\n\tfilter.Title = &scene3Title\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene3ID})\n\n\tfilter.Studios.Modifier = models.CriterionModifierNotNull\n\tfilter.Title = &scene1Title\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene1ID})\n\n\tfilter.Studios.Modifier = models.CriterionModifierIncludes\n\tfilter.Studios.Value = []uuid.UUID{studio1ID, studio2ID}\n\tfilter.Title = nil\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene1ID, scene2ID})\n\n\tfilter.Studios.Modifier = models.CriterionModifierExcludes\n\tfilter.Studios.Value = []uuid.UUID{studio1ID}\n\tfilter.Title = &scene2Title\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene2ID})\n\n\t// test invalid modifiers\n\tfilter.Studios.Modifier = models.CriterionModifierGreaterThan\n\ts.verifyInvalidModifier(filter)\n\n\tfilter.Studios.Modifier = models.CriterionModifierLessThan\n\ts.verifyInvalidModifier(filter)\n\n\tfilter.Studios.Modifier = models.CriterionModifierIncludesAll\n\ts.verifyInvalidModifier(filter)\n}\n\nfunc (s *sceneTestRunner) testQueryScenesByPerformer() {\n\tperformer1, _ := s.createTestPerformer(nil)\n\tperformer2, _ := s.createTestPerformer(nil)\n\n\tperformer1ID := performer1.UUID()\n\tperformer2ID := performer2.UUID()\n\n\tprefix := \"testQueryScenesByPerformer_\"\n\tscene1Title := prefix + \"scene1Title\"\n\tscene2Title := prefix + \"scene2Title\"\n\tscene3Title := prefix + \"scene3Title\"\n\n\tinput := models.SceneCreateInput{\n\t\tPerformers: []models.PerformerAppearanceInput{\n\t\t\t{\n\t\t\t\tPerformerID: performer1ID,\n\t\t\t},\n\t\t},\n\t\tTitle: &scene1Title,\n\t\tDate:  \"2020-03-02\",\n\t}\n\n\tscene1, err := s.createTestScene(&input)\n\tassert.NoError(s.t, err)\n\n\tinput.Performers[0].PerformerID = performer2ID\n\tinput.Title = &scene2Title\n\tscene2, err := s.createTestScene(&input)\n\tassert.NoError(s.t, err)\n\n\tinput.Performers = append(input.Performers, models.PerformerAppearanceInput{\n\t\tPerformerID: performer1ID,\n\t})\n\tinput.Title = &scene3Title\n\tscene3, err := s.createTestScene(&input)\n\tassert.NoError(s.t, err)\n\n\tscene1ID := scene1.UUID()\n\tscene2ID := scene2.UUID()\n\tscene3ID := scene3.UUID()\n\n\ttitleSearch := prefix\n\tfilter := models.SceneQueryInput{\n\t\tPerformers: &models.MultiIDCriterionInput{\n\t\t\tValue:    []uuid.UUID{performer1ID},\n\t\t\tModifier: models.CriterionModifierIncludes,\n\t\t},\n\t\tTitle: &titleSearch,\n\t}\n\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene1ID, scene3ID})\n\n\tfilter.Performers.Modifier = models.CriterionModifierExcludes\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene2ID})\n\n\tfilter.Performers.Modifier = models.CriterionModifierIncludesAll\n\tfilter.Performers.Value = append(filter.Performers.Value, performer2ID)\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene3ID})\n\n\t// test INCLUDES with multiple performers - scene3 has both performers and should appear only once\n\tfilter.Performers.Modifier = models.CriterionModifierIncludes\n\tfilter.Performers.Value = []uuid.UUID{performer1ID, performer2ID}\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene1ID, scene2ID, scene3ID})\n\n\t// test invalid modifiers\n\tfilter.Performers.Modifier = models.CriterionModifierGreaterThan\n\ts.verifyInvalidModifier(filter)\n\n\tfilter.Performers.Modifier = models.CriterionModifierLessThan\n\ts.verifyInvalidModifier(filter)\n\n\tfilter.Performers.Modifier = models.CriterionModifierEquals\n\ts.verifyInvalidModifier(filter)\n\n\tfilter.Performers.Modifier = models.CriterionModifierNotEquals\n\ts.verifyInvalidModifier(filter)\n\n\tfilter.Performers.Modifier = models.CriterionModifierIsNull\n\ts.verifyInvalidModifier(filter)\n\n\tfilter.Performers.Modifier = models.CriterionModifierNotNull\n\ts.verifyInvalidModifier(filter)\n}\n\nfunc (s *sceneTestRunner) testQueryScenesByTag() {\n\ttag1, _ := s.createTestTag(nil)\n\ttag2, _ := s.createTestTag(nil)\n\n\ttag1ID := tag1.UUID()\n\ttag2ID := tag2.UUID()\n\n\tprefix := \"testQueryScenesByTag_\"\n\tscene1Title := prefix + \"scene1Title\"\n\tscene2Title := prefix + \"scene2Title\"\n\tscene3Title := prefix + \"scene3Title\"\n\n\tinput := models.SceneCreateInput{\n\t\tTagIds: []uuid.UUID{\n\t\t\ttag1ID,\n\t\t},\n\t\tTitle: &scene1Title,\n\t\tDate:  \"2020-03-02\",\n\t}\n\n\tscene1, err := s.createTestScene(&input)\n\tassert.NoError(s.t, err)\n\n\tinput.TagIds[0] = tag2ID\n\tinput.Title = &scene2Title\n\tscene2, err := s.createTestScene(&input)\n\tassert.NoError(s.t, err)\n\n\tinput.TagIds = append(input.TagIds, tag1ID)\n\tinput.Title = &scene3Title\n\tscene3, err := s.createTestScene(&input)\n\tassert.NoError(s.t, err)\n\n\tscene1ID := scene1.UUID()\n\tscene2ID := scene2.UUID()\n\tscene3ID := scene3.UUID()\n\n\ttitleSearch := prefix\n\tfilter := models.SceneQueryInput{\n\t\tTags: &models.MultiIDCriterionInput{\n\t\t\tValue:    []uuid.UUID{tag1ID},\n\t\t\tModifier: models.CriterionModifierIncludes,\n\t\t},\n\t\tTitle: &titleSearch,\n\t}\n\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene1ID, scene3ID})\n\n\tfilter.Tags.Modifier = models.CriterionModifierExcludes\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene2ID})\n\n\tfilter.Tags.Modifier = models.CriterionModifierIncludesAll\n\tfilter.Tags.Value = append(filter.Tags.Value, tag2ID)\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene3ID})\n\n\t// test INCLUDES with multiple tags - scene3 has both tags and should appear only once\n\tfilter.Tags.Modifier = models.CriterionModifierIncludes\n\tfilter.Tags.Value = []uuid.UUID{tag1ID, tag2ID}\n\ts.verifyQueryScenesResult(filter, []uuid.UUID{scene1ID, scene2ID, scene3ID})\n\n\t// test invalid modifiers\n\tfilter.Tags.Modifier = models.CriterionModifierGreaterThan\n\ts.verifyInvalidModifier(filter)\n\n\tfilter.Tags.Modifier = models.CriterionModifierLessThan\n\ts.verifyInvalidModifier(filter)\n\n\tfilter.Tags.Modifier = models.CriterionModifierEquals\n\ts.verifyInvalidModifier(filter)\n\n\tfilter.Tags.Modifier = models.CriterionModifierNotEquals\n\ts.verifyInvalidModifier(filter)\n\n\tfilter.Tags.Modifier = models.CriterionModifierIsNull\n\ts.verifyInvalidModifier(filter)\n\n\tfilter.Tags.Modifier = models.CriterionModifierNotNull\n\ts.verifyInvalidModifier(filter)\n}\n\nfunc TestCreateScene(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testCreateScene()\n}\n\nfunc TestFindSceneById(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testFindSceneById()\n}\n\nfunc TestUpdateScene(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testUpdateScene()\n}\n\n// TestUpdateSceneTitle is removed due to no longer allowing\n// partial updates\n\nfunc TestDestroyScene(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testDestroyScene()\n}\n\nfunc TestQueryScenesByStudio(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testQueryScenesByStudio()\n}\n\nfunc TestQueryScenesByPerformer(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testQueryScenesByPerformer()\n}\n\nfunc TestQueryScenesByTag(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testQueryScenesByTag()\n}\n\nfunc TestSubmitFingerprint(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testSubmitFingerprint()\n}\n\nfunc TestSubmitFingerprintUnmatch(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testSubmitFingerprintUnmatch()\n}\n\nfunc TestSubmitFingerprintModify(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testSubmitFingerprintModify()\n}\n\nfunc TestSubmitFingerprintUnmatchModify(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testSubmitFingerprintUnmatchModify()\n}\n\nfunc TestSubmitFingerprintsBatch(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testSubmitFingerprintsBatch()\n}\n\nfunc TestSubmitFingerprintsBatchMixedResults(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testSubmitFingerprintsBatchMixedResults()\n}\n\nfunc TestSubmitFingerprintsBatchMaxLimit(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testSubmitFingerprintsBatchMaxLimit()\n}\n\nfunc (s *sceneTestRunner) testSubmitFingerprintsBatch() {\n\t// Create multiple test scenes\n\tscene1, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\tscene2, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\t// Generate fingerprints for each scene\n\tfp1 := s.generateSceneFingerprint(nil)\n\tfp2 := s.generateSceneFingerprint(nil)\n\n\t// Submit batch of fingerprints\n\tresults, err := s.client.submitFingerprints([]models.FingerprintBatchSubmission{\n\t\t{\n\t\t\tSceneID:   scene1.UUID(),\n\t\t\tHash:      fp1.Hash,\n\t\t\tAlgorithm: fp1.Algorithm,\n\t\t\tDuration:  fp1.Duration,\n\t\t},\n\t\t{\n\t\t\tSceneID:   scene2.UUID(),\n\t\t\tHash:      fp2.Hash,\n\t\t\tAlgorithm: fp2.Algorithm,\n\t\t\tDuration:  fp2.Duration,\n\t\t},\n\t})\n\tassert.NoError(s.t, err, \"Error submitting fingerprints\")\n\tassert.Len(s.t, results, 2)\n\n\t// Verify both results succeeded (no errors)\n\tassert.Nil(s.t, results[0].Error)\n\tassert.Nil(s.t, results[1].Error)\n\tassert.Equal(s.t, fp1.Hash, results[0].Hash)\n\tassert.Equal(s.t, fp2.Hash, results[1].Hash)\n\n\t// Verify fingerprints were added to scenes\n\tfoundScene1, err := s.client.findScene(scene1.UUID())\n\tassert.NoError(s.t, err)\n\tassert.Len(s.t, foundScene1.Fingerprints, 2) // 1 original + 1 new\n\n\tfoundScene2, err := s.client.findScene(scene2.UUID())\n\tassert.NoError(s.t, err)\n\tassert.Len(s.t, foundScene2.Fingerprints, 2) // 1 original + 1 new\n}\n\nfunc (s *sceneTestRunner) testSubmitFingerprintsBatchMixedResults() {\n\t// Create one valid scene\n\tvalidScene, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tfp1 := s.generateSceneFingerprint(nil)\n\tfp2 := s.generateSceneFingerprint(nil)\n\n\t// Create a non-existent scene ID\n\tnonExistentID := uuid.Must(uuid.NewV4())\n\n\t// Submit batch with mix of valid and invalid scene IDs\n\tresults, err := s.client.submitFingerprints([]models.FingerprintBatchSubmission{\n\t\t{\n\t\t\tSceneID:   validScene.UUID(),\n\t\t\tHash:      fp1.Hash,\n\t\t\tAlgorithm: fp1.Algorithm,\n\t\t\tDuration:  fp1.Duration,\n\t\t},\n\t\t{\n\t\t\tSceneID:   nonExistentID,\n\t\t\tHash:      fp2.Hash,\n\t\t\tAlgorithm: fp2.Algorithm,\n\t\t\tDuration:  fp2.Duration,\n\t\t},\n\t})\n\tassert.NoError(s.t, err, \"Error submitting fingerprints\")\n\tassert.Len(s.t, results, 2)\n\n\t// First submission should succeed\n\tassert.Nil(s.t, results[0].Error)\n\tassert.Equal(s.t, fp1.Hash, results[0].Hash)\n\n\t// Second submission should fail (non-existent scene)\n\tassert.NotNil(s.t, results[1].Error)\n\tassert.Equal(s.t, fp2.Hash, results[1].Hash)\n\n\t// Verify valid scene got the fingerprint\n\tfoundScene, err := s.client.findScene(validScene.UUID())\n\tassert.NoError(s.t, err)\n\tassert.Len(s.t, foundScene.Fingerprints, 2) // 1 original + 1 new\n}\n\nfunc (s *sceneTestRunner) testSubmitFingerprintsBatchMaxLimit() {\n\t// Create a batch of 1001 fingerprints (exceeds limit)\n\tscene, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tsubmissions := make([]models.FingerprintBatchSubmission, 1001)\n\tfor i := 0; i < 1001; i++ {\n\t\tfp := s.generateSceneFingerprint(nil)\n\t\tsubmissions[i] = models.FingerprintBatchSubmission{\n\t\t\tSceneID:   scene.UUID(),\n\t\t\tHash:      fp.Hash,\n\t\t\tAlgorithm: fp.Algorithm,\n\t\t\tDuration:  fp.Duration,\n\t\t}\n\t}\n\n\t// Should return an error\n\t_, err = s.client.submitFingerprints(submissions)\n\tassert.Error(s.t, err)\n\tassert.Contains(s.t, err.Error(), \"1000\")\n}\n\nfunc (s *sceneTestRunner) testFindScenesBySceneFingerprints() {\n\t// Enable phash distance matching for this test\n\toriginalPHashDistance := config.GetPHashDistance()\n\tconfig.C.PHashDistance = 2\n\tdefer func() {\n\t\tconfig.C.PHashDistance = originalPHashDistance\n\t}()\n\n\t// Create a scene with multiple fingerprints (MD5, OSHASH, and PHASH)\n\ttitle := \"Scene with Multiple Fingerprints for Scene Fingerprints Query\"\n\tmd5Fingerprint := s.generateSceneFingerprintWithAlgorithm(models.FingerprintAlgorithmMd5, nil)\n\toshashFingerprint := s.generateSceneFingerprintWithAlgorithm(models.FingerprintAlgorithmOshash, nil)\n\tphashFingerprint := models.FingerprintEditInput{\n\t\tAlgorithm: models.FingerprintAlgorithmPhash,\n\t\tHash:      models.FingerprintHash(0x2), // Different from the other test\n\t\tDuration:  1234,\n\t\tUserIds:   []uuid.UUID{},\n\t}\n\n\tinput := models.SceneCreateInput{\n\t\tTitle: &title,\n\t\tDate:  \"2020-03-02\",\n\t\tFingerprints: []models.FingerprintEditInput{\n\t\t\tmd5Fingerprint,\n\t\t\toshashFingerprint,\n\t\t\tphashFingerprint,\n\t\t},\n\t}\n\n\tcreatedScene, err := s.createTestScene(&input)\n\tassert.NoError(s.t, err)\n\n\t// Query with all three fingerprints as a single scene's fingerprints\n\t// This should return the scene ONCE, not three times\n\tqueryFingerprints := [][]models.FingerprintQueryInput{\n\t\t{\n\t\t\t{\n\t\t\t\tAlgorithm: md5Fingerprint.Algorithm,\n\t\t\t\tHash:      md5Fingerprint.Hash,\n\t\t\t},\n\t\t\t{\n\t\t\t\tAlgorithm: oshashFingerprint.Algorithm,\n\t\t\t\tHash:      oshashFingerprint.Hash,\n\t\t\t},\n\t\t\t{\n\t\t\t\tAlgorithm: phashFingerprint.Algorithm,\n\t\t\t\tHash:      phashFingerprint.Hash,\n\t\t\t},\n\t\t},\n\t}\n\n\tresults, err := s.client.findScenesBySceneFingerprints(queryFingerprints)\n\tassert.NoError(s.t, err)\n\n\t// Should return one array (one for each input set of fingerprints)\n\tassert.Equal(s.t, len(results), 1, \"Should return one result set\")\n\n\t// Within that array, the scene should only appear ONCE, not three times\n\tassert.Equal(s.t, len(results[0]), 1, \"Scene should only be returned once, not duplicated for each fingerprint\")\n\tassert.Equal(s.t, results[0][0].ID, createdScene.ID, \"Returned scene should match the created scene\")\n}\n\nfunc TestFindScenesBySceneFingerprints(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testFindScenesBySceneFingerprints()\n}\n\nfunc (s *sceneTestRunner) testMoveFingerprintSubmissions() {\n\t// Create two scenes with fingerprints\n\tscene1, err := s.createTestScene(nil)\n\tassert.Nil(s.t, err)\n\tscene2, err := s.createTestScene(nil)\n\tassert.Nil(s.t, err)\n\n\t// Add additional fingerprints to scene1 via submission\n\tfp1 := s.generateSceneFingerprintWithAlgorithm(models.FingerprintAlgorithmOshash, nil)\n\tfp2 := s.generateSceneFingerprintWithAlgorithm(models.FingerprintAlgorithmPhash, nil)\n\n\t_, err = s.client.submitFingerprint(models.FingerprintSubmission{\n\t\tSceneID: scene1.UUID(),\n\t\tFingerprint: &models.FingerprintInput{\n\t\t\tHash:      fp1.Hash,\n\t\t\tAlgorithm: fp1.Algorithm,\n\t\t\tDuration:  fp1.Duration,\n\t\t},\n\t})\n\tassert.Nil(s.t, err)\n\n\t_, err = s.client.submitFingerprint(models.FingerprintSubmission{\n\t\tSceneID: scene1.UUID(),\n\t\tFingerprint: &models.FingerprintInput{\n\t\t\tHash:      fp2.Hash,\n\t\t\tAlgorithm: fp2.Algorithm,\n\t\t\tDuration:  fp2.Duration,\n\t\t},\n\t})\n\tassert.Nil(s.t, err)\n\n\t// Verify scene1 has the fingerprints\n\tupdatedScene1, err := s.client.findScene(scene1.UUID())\n\tassert.Nil(s.t, err)\n\tassert.True(s.t, len(updatedScene1.Fingerprints) >= 2)\n\n\t// Move the fingerprints from scene1 to scene2\n\tmoderateUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumModerate})\n\tassert.Nil(s.t, err)\n\n\tmoderateRunner := createTestRunner(s.t, moderateUser, []models.RoleEnum{models.RoleEnumModerate})\n\n\t_, err = moderateRunner.client.sceneMoveFingerprintSubmissions(models.MoveFingerprintSubmissionsInput{\n\t\tFingerprints: []models.FingerprintQueryInput{\n\t\t\t{Hash: fp1.Hash, Algorithm: fp1.Algorithm},\n\t\t\t{Hash: fp2.Hash, Algorithm: fp2.Algorithm},\n\t\t},\n\t\tSourceSceneID: scene1.UUID(),\n\t\tTargetSceneID: scene2.UUID(),\n\t})\n\tfmt.Println(err)\n\tassert.Nil(s.t, err)\n\n\t// Verify scene1 no longer has these fingerprints\n\tupdatedScene1, err = s.client.findScene(scene1.UUID())\n\tassert.Nil(s.t, err)\n\tfor _, fp := range updatedScene1.Fingerprints {\n\t\tassert.NotEqual(s.t, fp1.Hash, fp.Hash)\n\t\tassert.NotEqual(s.t, fp2.Hash, fp.Hash)\n\t}\n\n\t// Verify scene2 now has the fingerprints\n\tupdatedScene2, err := s.client.findScene(scene2.UUID())\n\tassert.Nil(s.t, err)\n\tfoundFP1 := false\n\tfoundFP2 := false\n\tfor _, fp := range updatedScene2.Fingerprints {\n\t\tif fp.FingerprintHash() == fp1.Hash && fp.Algorithm == fp1.Algorithm {\n\t\t\tfoundFP1 = true\n\t\t}\n\t\tif fp.FingerprintHash() == fp2.Hash && fp.Algorithm == fp2.Algorithm {\n\t\t\tfoundFP2 = true\n\t\t}\n\t}\n\tassert.True(s.t, foundFP1, \"Fingerprint 1 should be moved to scene2\")\n\tassert.True(s.t, foundFP2, \"Fingerprint 2 should be moved to scene2\")\n}\n\nfunc (s *sceneTestRunner) testDeleteFingerprintSubmissions() {\n\t// Create a scene with fingerprints\n\tscene, err := s.createTestScene(nil)\n\tassert.Nil(s.t, err)\n\n\t// Add additional fingerprints via submission\n\tfp1 := s.generateSceneFingerprintWithAlgorithm(models.FingerprintAlgorithmOshash, nil)\n\tfp2 := s.generateSceneFingerprintWithAlgorithm(models.FingerprintAlgorithmPhash, nil)\n\n\t_, err = s.client.submitFingerprint(models.FingerprintSubmission{\n\t\tSceneID: scene.UUID(),\n\t\tFingerprint: &models.FingerprintInput{\n\t\t\tHash:      fp1.Hash,\n\t\t\tAlgorithm: fp1.Algorithm,\n\t\t\tDuration:  fp1.Duration,\n\t\t},\n\t})\n\tassert.Nil(s.t, err)\n\n\t_, err = s.client.submitFingerprint(models.FingerprintSubmission{\n\t\tSceneID: scene.UUID(),\n\t\tFingerprint: &models.FingerprintInput{\n\t\t\tHash:      fp2.Hash,\n\t\t\tAlgorithm: fp2.Algorithm,\n\t\t\tDuration:  fp2.Duration,\n\t\t},\n\t})\n\tassert.Nil(s.t, err)\n\n\t// Verify scene has the fingerprints\n\tupdatedScene, err := s.client.findScene(scene.UUID())\n\tassert.Nil(s.t, err)\n\tinitialCount := len(updatedScene.Fingerprints)\n\tassert.True(s.t, initialCount >= 2)\n\n\t// Delete the fingerprints\n\tmoderateUser, err := s.createTestUser(nil, []models.RoleEnum{models.RoleEnumModerate})\n\tassert.Nil(s.t, err)\n\n\tmoderateRunner := createTestRunner(s.t, moderateUser, []models.RoleEnum{models.RoleEnumModerate})\n\n\t_, err = moderateRunner.client.sceneDeleteFingerprintSubmissions(models.DeleteFingerprintSubmissionsInput{\n\t\tFingerprints: []models.FingerprintQueryInput{\n\t\t\t{Hash: fp1.Hash, Algorithm: fp1.Algorithm},\n\t\t\t{Hash: fp2.Hash, Algorithm: fp2.Algorithm},\n\t\t},\n\t\tSceneID: scene.UUID(),\n\t})\n\tassert.Nil(s.t, err)\n\n\t// Verify scene no longer has these fingerprints\n\tupdatedScene, err = s.client.findScene(scene.UUID())\n\tassert.Nil(s.t, err)\n\tfor _, fp := range updatedScene.Fingerprints {\n\t\tassert.NotEqual(s.t, fp1.Hash, fp.Hash, \"Fingerprint 1 should be deleted\")\n\t\tassert.NotEqual(s.t, fp2.Hash, fp.Hash, \"Fingerprint 2 should be deleted\")\n\t}\n\tassert.Equal(s.t, initialCount-2, len(updatedScene.Fingerprints), \"Should have 2 fewer fingerprints\")\n}\n\nfunc TestMoveFingerprintSubmissions(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testMoveFingerprintSubmissions()\n}\n\nfunc TestDeleteFingerprintSubmissions(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testDeleteFingerprintSubmissions()\n}\n\nfunc (s *sceneTestRunner) testFindScenesBySceneFingerprintsMultipleMatches() {\n\t// Create multiple scenes with the same OSHASH to test that all are returned\n\t// Using OSHASH instead of phash to avoid distance matching complexity\n\tsharedHash := models.FingerprintHash(0x1234567890abcdef)\n\n\ttitle1 := \"Scene 1 with Shared Hash\"\n\toshashFingerprint1 := models.FingerprintEditInput{\n\t\tAlgorithm: models.FingerprintAlgorithmOshash,\n\t\tHash:      sharedHash,\n\t\tDuration:  1234,\n\t\tUserIds:   []uuid.UUID{},\n\t}\n\tinput1 := models.SceneCreateInput{\n\t\tTitle: &title1,\n\t\tDate:  \"2020-03-02\",\n\t\tFingerprints: []models.FingerprintEditInput{\n\t\t\toshashFingerprint1,\n\t\t},\n\t}\n\tcreatedScene1, err := s.createTestScene(&input1)\n\tassert.NoError(s.t, err)\n\n\ttitle2 := \"Scene 2 with Shared Hash\"\n\toshashFingerprint2 := models.FingerprintEditInput{\n\t\tAlgorithm: models.FingerprintAlgorithmOshash,\n\t\tHash:      sharedHash,\n\t\tDuration:  1235,\n\t\tUserIds:   []uuid.UUID{},\n\t}\n\tinput2 := models.SceneCreateInput{\n\t\tTitle: &title2,\n\t\tDate:  \"2020-03-03\",\n\t\tFingerprints: []models.FingerprintEditInput{\n\t\t\toshashFingerprint2,\n\t\t},\n\t}\n\tcreatedScene2, err := s.createTestScene(&input2)\n\tassert.NoError(s.t, err)\n\n\ttitle3 := \"Scene 3 with Shared Hash\"\n\toshashFingerprint3 := models.FingerprintEditInput{\n\t\tAlgorithm: models.FingerprintAlgorithmOshash,\n\t\tHash:      sharedHash,\n\t\tDuration:  1236,\n\t\tUserIds:   []uuid.UUID{},\n\t}\n\tinput3 := models.SceneCreateInput{\n\t\tTitle: &title3,\n\t\tDate:  \"2020-03-04\",\n\t\tFingerprints: []models.FingerprintEditInput{\n\t\t\toshashFingerprint3,\n\t\t},\n\t}\n\tcreatedScene3, err := s.createTestScene(&input3)\n\tassert.NoError(s.t, err)\n\n\t// Query with the shared hash - should return ALL three scenes\n\tqueryFingerprints := [][]models.FingerprintQueryInput{\n\t\t{\n\t\t\t{\n\t\t\t\tAlgorithm: models.FingerprintAlgorithmOshash,\n\t\t\t\tHash:      sharedHash,\n\t\t\t},\n\t\t},\n\t}\n\n\tresults, err := s.client.findScenesBySceneFingerprints(queryFingerprints)\n\tassert.NoError(s.t, err)\n\n\t// Should return one array (one for each input set of fingerprints)\n\tassert.Equal(s.t, 1, len(results), \"Should return one result set\")\n\n\t// Within that array, all three scenes should be returned\n\tassert.Equal(s.t, 3, len(results[0]), \"All three scenes with the same hash should be returned\")\n\n\t// Verify all three scene IDs are present\n\treturnedIDs := make(map[string]bool)\n\tfor _, scene := range results[0] {\n\t\treturnedIDs[scene.ID] = true\n\t}\n\n\tassert.True(s.t, returnedIDs[createdScene1.ID], \"Scene 1 should be in results\")\n\tassert.True(s.t, returnedIDs[createdScene2.ID], \"Scene 2 should be in results\")\n\tassert.True(s.t, returnedIDs[createdScene3.ID], \"Scene 3 should be in results\")\n}\n\nfunc TestFindScenesBySceneFingerprintsMultipleMatches(t *testing.T) {\n\tpt := createSceneTestRunner(t)\n\tpt.testFindScenesBySceneFingerprintsMultipleMatches()\n}\n"
  },
  {
    "path": "internal/api/search_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype searchTestRunner struct {\n\ttestRunner\n}\n\nfunc createSearchTestRunner(t *testing.T) *searchTestRunner {\n\treturn &searchTestRunner{\n\t\ttestRunner: *asModify(t),\n\t}\n}\n\nfunc (s *searchTestRunner) testSearchPerformerByTerm() {\n\tcreatedPerformer, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tresult, err := s.resolver.Query().SearchPerformers(s.ctx, createdPerformer.Name, nil, nil, nil, nil)\n\tassert.NoError(s.t, err, \"Error finding performer\")\n\n\tperformers := result.SearchResults.Performers\n\n\t// ensure returned performer is not nil\n\tassert.True(s.t, len(performers) > 0, \"Did not find performer by name search\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdPerformer.UUID(), performers[0].ID)\n}\n\nfunc (s *searchTestRunner) testSearchPerformerByID() {\n\tcreatedPerformer, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tresult, err := s.resolver.Query().SearchPerformers(s.ctx, \"   \"+createdPerformer.ID, nil, nil, nil, nil)\n\tassert.NoError(s.t, err, \"Error finding performer\")\n\n\tperformers := result.SearchResults.Performers\n\n\t// ensure returned performer is not nil\n\tassert.True(s.t, len(performers) > 0, \"Did not find performer by name search\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdPerformer.UUID(), performers[0].ID)\n}\n\nfunc (s *searchTestRunner) testSearchPerformerByNonExistentID() {\n\t// Search for a non-existent performer ID should return empty result, not error\n\tnonExistentID := \"00000000-0000-0000-0000-000000000000\"\n\tresult, err := s.resolver.Query().SearchPerformers(s.ctx, nonExistentID, nil, nil, nil, nil)\n\tassert.NoError(s.t, err, \"Should not error when performer not found\")\n\tassert.Equal(s.t, 0, len(result.SearchResults.Performers), \"Should return empty result for non-existent ID\")\n}\n\nfunc (s *searchTestRunner) testSearchSceneByTerm() {\n\tcreatedStudio, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\tstudioID := createdStudio.UUID()\n\n\ttitle := \"scene search title\"\n\tdate := \"2019-02-03\"\n\tinput := models.SceneCreateInput{\n\t\tTitle:    &title,\n\t\tDate:     date,\n\t\tStudioID: &studioID,\n\t}\n\tcreatedScene, err := s.createTestScene(&input)\n\tassert.NoError(s.t, err)\n\n\tresult, err := s.resolver.Query().SearchScenes(s.ctx, *createdScene.Title+\" \"+*createdScene.Date, nil, nil, nil)\n\tassert.NoError(s.t, err, \"Error finding scene\")\n\n\tscenes := result.SearchResults.Scenes\n\n\tassert.True(s.t, len(scenes) > 0, \"Did not find scene by search\")\n\n\t// ensure correct scene\n\tassert.Equal(s.t, createdScene.UUID(), scenes[0].ID)\n}\n\nfunc (s *searchTestRunner) testSearchSceneByID() {\n\tcreatedScene, err := s.createTestScene(nil)\n\tassert.NoError(s.t, err)\n\n\tresult, err := s.resolver.Query().SearchScenes(s.ctx, \"   \"+createdScene.ID, nil, nil, nil)\n\tassert.NoError(s.t, err, \"Error finding scene\")\n\n\tscenes := result.SearchResults.Scenes\n\n\t// ensure a scene is returned\n\tassert.True(s.t, len(scenes) > 0, \"Did not find scene by id search\")\n\n\t// ensure correct scene\n\tassert.Equal(s.t, createdScene.UUID(), scenes[0].ID)\n}\n\nfunc (s *searchTestRunner) testSearchTagByTerm() {\n\tcreatedTag, err := s.createTestTag(nil)\n\tassert.NoError(s.t, err)\n\n\ttags, err := s.resolver.Query().SearchTag(s.ctx, createdTag.Name, nil)\n\tassert.NoError(s.t, err, \"Error finding tag\")\n\n\t// ensure returned tag is not nil\n\tassert.True(s.t, len(tags) > 0, \"Did not find tag by name search\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdTag.UUID(), tags[0].ID)\n}\n\nfunc (s *searchTestRunner) testSearchTagByID() {\n\tcreatedTag, err := s.createTestTag(nil)\n\tassert.NoError(s.t, err)\n\n\ttags, err := s.resolver.Query().SearchTag(s.ctx, \"   \"+createdTag.ID, nil)\n\tassert.NoError(s.t, err, \"Error finding tag\")\n\n\t// ensure returned tag is not nil\n\tassert.True(s.t, len(tags) > 0, \"Did not find tag by name search\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdTag.UUID(), tags[0].ID)\n}\n\nfunc TestSearchPerformerByTerm(t *testing.T) {\n\tpt := createSearchTestRunner(t)\n\tpt.testSearchPerformerByTerm()\n}\n\nfunc TestSearchPerformerByID(t *testing.T) {\n\tpt := createSearchTestRunner(t)\n\tpt.testSearchPerformerByID()\n}\n\nfunc TestSearchPerformerByNonExistentID(t *testing.T) {\n\tpt := createSearchTestRunner(t)\n\tpt.testSearchPerformerByNonExistentID()\n}\n\nfunc TestSearchSceneByTerm(t *testing.T) {\n\tpt := createSearchTestRunner(t)\n\tpt.testSearchSceneByTerm()\n}\n\nfunc TestSearchSceneByID(t *testing.T) {\n\tpt := createSearchTestRunner(t)\n\tpt.testSearchSceneByID()\n}\n\nfunc TestSearchTagByTerm(t *testing.T) {\n\tpt := createSearchTestRunner(t)\n\tpt.testSearchTagByTerm()\n}\n\nfunc TestSearchTagByID(t *testing.T) {\n\tpt := createSearchTestRunner(t)\n\tpt.testSearchTagByID()\n}\n\nfunc (s *searchTestRunner) testSearchPerformerFacets() {\n\t// Create performers with different genders\n\tfemale := models.GenderEnumFemale\n\tmale := models.GenderEnumMale\n\n\tinput1 := models.PerformerCreateInput{\n\t\tName:   \"Test Facet Performer Female\",\n\t\tGender: &female,\n\t}\n\t_, err := s.createTestPerformer(&input1)\n\tassert.NoError(s.t, err)\n\n\tinput2 := models.PerformerCreateInput{\n\t\tName:   \"Test Facet Performer Male\",\n\t\tGender: &male,\n\t}\n\t_, err = s.createTestPerformer(&input2)\n\tassert.NoError(s.t, err)\n\n\t// Search and check facets\n\tresult, err := s.resolver.Query().SearchPerformers(s.ctx, \"Test Facet Performer\", nil, nil, nil, nil)\n\tassert.NoError(s.t, err, \"Error searching performers\")\n\tassert.True(s.t, len(result.SearchResults.Performers) >= 2, \"Should find at least 2 performers\")\n\n\t// Check facets are present\n\tfacets := result.SearchResults.Facets\n\tassert.NotNil(s.t, facets, \"Facets should be present for search results\")\n}\n\nfunc (s *searchTestRunner) testQueryPerformerNoFacets() {\n\t// queryPerformers should return nil facets\n\tinput := models.PerformerQueryInput{\n\t\tPage:    1,\n\t\tPerPage: 10,\n\t}\n\tqueryResult, err := s.resolver.Query().QueryPerformers(s.ctx, input)\n\tassert.NoError(s.t, err)\n\n\t// Get facets via resolver\n\tfacets, err := s.resolver.QueryPerformersResultType().Facets(s.ctx, queryResult)\n\tassert.NoError(s.t, err)\n\tassert.Nil(s.t, facets, \"Facets should be nil for queryPerformers\")\n}\n\nfunc TestSearchPerformerFacets(t *testing.T) {\n\tpt := createSearchTestRunner(t)\n\tpt.testSearchPerformerFacets()\n}\n\nfunc TestQueryPerformerNoFacets(t *testing.T) {\n\tpt := createSearchTestRunner(t)\n\tpt.testQueryPerformerNoFacets()\n}\n"
  },
  {
    "path": "internal/api/server.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"embed\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/http/pprof\"\n\t\"os\"\n\t\"runtime/debug\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/klauspost/compress/flate\"\n\t\"github.com/vektah/gqlparser/v2/gqlerror\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\t\"github.com/ravilushqa/otelgqlgen\"\n\n\t\"github.com/99designs/gqlgen/graphql\"\n\tgqlHandler \"github.com/99designs/gqlgen/graphql/handler\"\n\tgqlExtension \"github.com/99designs/gqlgen/graphql/handler/extension\"\n\tgqlTransport \"github.com/99designs/gqlgen/graphql/handler/transport\"\n\tgqlPlayground \"github.com/99designs/gqlgen/graphql/playground\"\n\t\"github.com/go-chi/chi/v5\"\n\t\"github.com/go-chi/chi/v5/middleware\"\n\t\"github.com/riandyrn/otelchi\"\n\t\"github.com/rs/cors\"\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/autocert\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/dataloader\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/service\"\n\t\"github.com/stashapp/stash-box/internal/service/user\"\n\t\"github.com/stashapp/stash-box/pkg/logger\"\n)\n\nvar version string\nvar buildstamp string\nvar githash string\nvar buildtype string\n\nconst APIKeyHeader = \"ApiKey\"\n\nfunc getUserAndRoles(ctx context.Context, fac service.Factory, userID string) (*models.User, []models.RoleEnum, error) {\n\tif userID == \"\" {\n\t\treturn nil, nil, nil\n\t}\n\tid, err := uuid.FromString(userID)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tu, err := fac.User().FindByID(ctx, id)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\troles, err := fac.User().GetRoles(ctx, id)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\treturn u, roles, nil\n}\n\nfunc authenticateHandler(fac service.Factory) func(http.Handler) http.Handler {\n\treturn func(next http.Handler) http.Handler {\n\t\treturn http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\t\tctx := r.Context()\n\n\t\t\t// translate api key into current user, if present\n\t\t\tuserID := \"\"\n\t\t\tapiKey := r.Header.Get(APIKeyHeader)\n\t\t\tvar err error\n\t\t\tif apiKey != \"\" {\n\t\t\t\tuserID, err = user.GetUserIDFromAPIKey(apiKey)\n\t\t\t} else {\n\t\t\t\t// handle session\n\t\t\t\tuserID, err = getSessionUserID(w, r)\n\t\t\t}\n\n\t\t\tvar u *models.User\n\t\t\tvar roles []models.RoleEnum\n\t\t\tif err == nil {\n\t\t\t\tu, roles, err = getUserAndRoles(ctx, fac, userID)\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tw.WriteHeader(http.StatusInternalServerError)\n\t\t\t\t_, err = w.Write([]byte(err.Error()))\n\t\t\t\tif err != nil {\n\t\t\t\t\tlogger.Error(err)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// ensure api key of the user matches the passed one\n\t\t\tif apiKey != \"\" && u != nil && u.APIKey != apiKey {\n\t\t\t\tw.WriteHeader(http.StatusUnauthorized)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// TODO - increment api key counters\n\n\t\t\tctx = context.WithValue(ctx, auth.ContextUser, u)\n\t\t\tctx = context.WithValue(ctx, auth.ContextRoles, roles)\n\n\t\t\tspan := trace.SpanFromContext(ctx)\n\t\t\tif span.SpanContext().IsValid() && u != nil {\n\t\t\t\tspan.SetAttributes(\n\t\t\t\t\tattribute.String(\"user.id\", u.ID.String()),\n\t\t\t\t\tattribute.String(\"user.name\", u.Name),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tr = r.WithContext(ctx)\n\n\t\t\tnext.ServeHTTP(w, r)\n\t\t})\n\t}\n}\n\nfunc redirect(w http.ResponseWriter, req *http.Request) {\n\ttarget := \"https://\" + req.Host + req.URL.Path\n\tif len(req.URL.RawQuery) > 0 {\n\t\ttarget += \"?\" + req.URL.RawQuery\n\t}\n\thttp.Redirect(w, req, target, http.StatusPermanentRedirect)\n}\n\nfunc Start(fac service.Factory, ui embed.FS) {\n\tr := chi.NewRouter()\n\tr.Use(otelchi.Middleware(\"\", otelchi.WithChiRoutes(r)))\n\n\tvar corsConfig *cors.Cors\n\tif config.GetIsProduction() {\n\t\tcorsConfig = cors.AllowAll()\n\t} else {\n\t\tcorsConfig = cors.New(cors.Options{\n\t\t\tAllowOriginFunc:  func(origin string) bool { return true },\n\t\t\tAllowCredentials: true,\n\t\t\tAllowedHeaders:   []string{\"*\"},\n\t\t})\n\t}\n\n\tr.Use(corsConfig.Handler)\n\tr.Use(authenticateHandler(fac))\n\tr.Use(middleware.Recoverer)\n\n\tcompressor := middleware.NewCompressor(flate.DefaultCompression)\n\tr.Use(compressor.Handler)\n\tr.Use(middleware.StripSlashes)\n\tr.Use(BaseURLMiddleware)\n\n\trecoverFunc := func(ctx context.Context, err interface{}) error {\n\t\tlogger.Error(err)\n\t\tdebug.PrintStack()\n\n\t\tmessage := fmt.Sprintf(\"Internal system error. Error <%v>\", err)\n\t\treturn errors.New(message)\n\t}\n\n\tgqlConfig := models.Config{\n\t\tResolvers: NewResolver(fac),\n\t\tDirectives: models.DirectiveRoot{\n\t\t\tIsUserOwner: IsUserOwnerDirective,\n\t\t\tHasRole:     HasRoleDirective,\n\t\t},\n\t}\n\tgqlSrv := gqlHandler.New(models.NewExecutableSchema(gqlConfig))\n\tgqlSrv.SetRecoverFunc(recoverFunc)\n\tgqlSrv.AddTransport(gqlTransport.Options{})\n\tgqlSrv.AddTransport(gqlTransport.GET{})\n\tgqlSrv.AddTransport(gqlTransport.POST{})\n\tgqlSrv.AddTransport(gqlTransport.MultipartForm{})\n\tgqlSrv.Use(gqlExtension.Introspection{})\n\tgqlSrv.Use(otelgqlgen.Middleware(otelgqlgen.WithCreateSpanFromFields(func(fieldCtx *graphql.FieldContext) bool { return fieldCtx.IsResolver })))\n\tgqlSrv.SetErrorPresenter(func(ctx context.Context, e error) *gqlerror.Error {\n\t\terr := graphql.DefaultErrorPresenter(ctx, e)\n\n\t\t// Get username from context if available\n\t\tusername := \"anonymous\"\n\t\tif user := auth.GetCurrentUser(ctx); user != nil {\n\t\t\tusername = user.Name\n\t\t}\n\n\t\t// Log the error at debug level with username\n\t\tlogger.Debugf(\"GraphQL error [user: %s]: %v\", username, err)\n\n\t\treturn err\n\t})\n\n\tr.Handle(\"/graphql\", dataloader.Middleware(fac)(gqlSrv))\n\n\tif !config.GetIsProduction() {\n\t\tr.Handle(\"/playground\", gqlPlayground.Handler(\"GraphQL playground\", \"/graphql\"))\n\t}\n\n\tr.Mount(\"/\", rootRoutes{ui: ui}.Routes(fac))\n\n\tif config.GetProfilerPort() != nil {\n\t\tgo func() {\n\t\t\tmux := http.NewServeMux()\n\t\t\tmux.HandleFunc(\"/\", pprof.Index)\n\t\t\tmux.HandleFunc(\"/cmdline\", pprof.Cmdline)\n\t\t\tmux.HandleFunc(\"/profile\", pprof.Profile)\n\t\t\tmux.HandleFunc(\"/symbol\", pprof.Symbol)\n\t\t\tmux.HandleFunc(\"/trace\", pprof.Trace)\n\t\t\tmux.Handle(\"/allocs\", pprof.Handler(\"allocs\"))\n\t\t\tmux.Handle(\"/block\", pprof.Handler(\"block\"))\n\t\t\tmux.Handle(\"/goroutine\", pprof.Handler(\"goroutine\"))\n\t\t\tmux.Handle(\"/heap\", pprof.Handler(\"heap\"))\n\t\t\tmux.Handle(\"/mutex\", pprof.Handler(\"mutex\"))\n\t\t\tmux.Handle(\"/threadcreate\", pprof.Handler(\"threadcreate\"))\n\t\t\tlogger.Infof(\"profiler is running at http://localhost:%d/\", *config.GetProfilerPort())\n\t\t\tlogger.Fatal(http.ListenAndServe(\":\"+strconv.Itoa(*config.GetProfilerPort()), mux))\n\t\t}()\n\t}\n\n\taddress := config.GetHost() + \":\" + strconv.Itoa(config.GetPort())\n\n\t// Priority 1: Autocert (Let's Encrypt)\n\tif tlsConfig := autocert.Init(); tlsConfig != nil {\n\t\thttpsServer := &http.Server{\n\t\t\tAddr:      address,\n\t\t\tHandler:   r,\n\t\t\tTLSConfig: tlsConfig,\n\t\t}\n\n\t\t// Start HTTP server for ACME HTTP-01 challenges on port 80\n\t\t// Non-challenge requests are redirected to HTTPS\n\t\tgo func() {\n\t\t\tlogger.Infof(\"Starting HTTP server on %s:80 for ACME challenges\", config.GetHost())\n\t\t\tif err := http.ListenAndServe(config.GetHost()+\":80\", autocert.HTTPHandler(http.HandlerFunc(redirect))); err != nil {\n\t\t\t\tlogger.Errorf(\"HTTP server error: %v\", err)\n\t\t\t}\n\t\t}()\n\n\t\tgo func() {\n\t\t\tprintVersion()\n\t\t\tlogger.Infof(\"stash-box is running on HTTPS (autocert) at https://%s/\", address)\n\t\t\tlogger.Fatal(httpsServer.ListenAndServeTLS(\"\", \"\"))\n\t\t}()\n\t\treturn\n\t}\n\n\t// Priority 2: File-based TLS\n\tif tlsConfig := makeTLSConfig(); tlsConfig != nil {\n\t\thttpsServer := &http.Server{\n\t\t\tAddr:      address,\n\t\t\tHandler:   r,\n\t\t\tTLSConfig: tlsConfig,\n\t\t}\n\n\t\tif config.GetHTTPUpgrade() {\n\t\t\tgo func() {\n\t\t\t\tlogger.Fatal(http.ListenAndServe(config.GetHost()+\":80\", http.HandlerFunc(redirect)))\n\t\t\t}()\n\t\t}\n\n\t\tgo func() {\n\t\t\tprintVersion()\n\t\t\tlogger.Infof(\"stash-box is running on HTTPS at https://%s/\", address)\n\t\t\tlogger.Fatal(httpsServer.ListenAndServeTLS(\"\", \"\"))\n\t\t}()\n\t\treturn\n\t}\n\n\t// Priority 3: HTTP only\n\tserver := &http.Server{\n\t\tAddr:    address,\n\t\tHandler: r,\n\t}\n\n\tgo func() {\n\t\tprintVersion()\n\t\tlogger.Infof(\"stash-box is running on HTTP at http://%s/\", address)\n\t\tlogger.Fatal(server.ListenAndServe())\n\t}()\n}\n\nfunc printVersion() {\n\tversionString := version\n\tif buildtype != \"OFFICIAL\" {\n\t\tversionString += \" (\" + githash + \")\"\n\t}\n\tfmt.Printf(\"stash-box version: %s - %s\\n\", versionString, buildstamp)\n}\n\nfunc GetVersion() (string, string, string) {\n\treturn version, githash, buildstamp\n}\n\nfunc makeTLSConfig() *tls.Config {\n\tcert, err := os.ReadFile(config.GetSSLCert())\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\tkey, err := os.ReadFile(config.GetSSLKey())\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\tcerts := make([]tls.Certificate, 1)\n\tcerts[0], err = tls.X509KeyPair(cert, key)\n\tif err != nil {\n\t\treturn nil\n\t}\n\ttlsConfig := &tls.Config{\n\t\tCertificates: certs,\n\t\tMinVersion:   tls.VersionTLS13,\n\t}\n\n\treturn tlsConfig\n}\n\ntype contextKey struct {\n\tname string\n}\n\nvar (\n\tBaseURLCtxKey = &contextKey{\"BaseURL\"}\n)\n\nfunc BaseURLMiddleware(next http.Handler) http.Handler {\n\tfn := func(w http.ResponseWriter, r *http.Request) {\n\t\tctx := r.Context()\n\n\t\tvar scheme string\n\t\tif strings.Compare(\"https\", r.URL.Scheme) == 0 || r.Proto == \"HTTP/2.0\" || r.Header.Get(\"X-Forwarded-Proto\") == \"https\" {\n\t\t\tscheme = \"https\"\n\t\t} else {\n\t\t\tscheme = \"http\"\n\t\t}\n\t\tbaseURL := scheme + \"://\" + r.Host\n\n\t\tr = r.WithContext(context.WithValue(ctx, BaseURLCtxKey, baseURL))\n\n\t\tnext.ServeHTTP(w, r)\n\t}\n\treturn http.HandlerFunc(fn)\n}\n"
  },
  {
    "path": "internal/api/session.go",
    "content": "package api\n\nimport (\n\t\"errors\"\n\t\"net/http\"\n\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/service\"\n\t\"github.com/stashapp/stash-box/internal/service/user\"\n\n\t\"github.com/gorilla/sessions\"\n)\n\nconst cookieName = \"stashbox\"\nconst usernameFormKey = \"username\"\nconst passwordFormKey = \"password\"\nconst userIDKey = \"userID\"\nconst maxCookieAge = 60 * 60 * 24 * 30 // 1 month\n\nvar sessionStore *sessions.CookieStore\n\nfunc InitializeSession() {\n\tsessionStore = sessions.NewCookieStore(config.GetSessionStoreKey())\n}\n\nfunc handleLogin(fac service.Factory) func(http.ResponseWriter, *http.Request) {\n\treturn func(w http.ResponseWriter, r *http.Request) {\n\t\tnewSession, err := sessionStore.Get(r, cookieName)\n\n\t\tif err != nil {\n\t\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\t\treturn\n\t\t}\n\n\t\tusername := r.FormValue(usernameFormKey)\n\t\tpassword := r.FormValue(passwordFormKey)\n\n\t\t// authenticate the user\n\t\tuserID, err := fac.User().Authenticate(r.Context(), username, password)\n\n\t\tif errors.Is(err, user.ErrAccessDenied) {\n\t\t\thttp.Error(w, err.Error(), http.StatusUnauthorized)\n\t\t\treturn\n\t\t} else if err != nil {\n\t\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\t\treturn\n\t\t}\n\n\t\tnewSession.Values[userIDKey] = userID\n\t\tnewSession.Options.MaxAge = maxCookieAge\n\t\tnewSession.Options.HttpOnly = true\n\t\tif config.GetIsProduction() {\n\t\t\tnewSession.Options.Secure = true\n\t\t} else {\n\t\t\tnewSession.Options.Secure = false\n\t\t\tnewSession.Options.SameSite = http.SameSiteLaxMode\n\t\t}\n\n\t\terr = newSession.Save(r, w)\n\t\tif err != nil {\n\t\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc handleLogout(w http.ResponseWriter, r *http.Request) {\n\tsession, err := sessionStore.Get(r, cookieName)\n\tif err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\tdelete(session.Values, userIDKey)\n\tsession.Options.MaxAge = -1\n\tsession.Options.HttpOnly = true\n\tif config.GetIsProduction() {\n\t\tsession.Options.Secure = true\n\t} else {\n\t\tsession.Options.Secure = false\n\t\tsession.Options.SameSite = http.SameSiteLaxMode\n\t}\n\n\terr = session.Save(r, w)\n\tif err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\t// Redirect to home page after successful logout\n\thttp.Redirect(w, r, \"/\", http.StatusFound)\n}\n\nfunc getSessionUserID(w http.ResponseWriter, r *http.Request) (string, error) {\n\tsession, err := sessionStore.Get(r, cookieName)\n\tif err != nil {\n\t\tsession.Options.MaxAge = -1\n\t\tif err = session.Save(r, w); err != nil {\n\t\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\t}\n\t\treturn \"\", nil\n\t}\n\n\tif !session.IsNew {\n\t\tuserIDInt := session.Values[userIDKey]\n\t\tuserID, _ := userIDInt.(string)\n\n\t\t// refresh the cookie\n\t\terr = session.Save(r, w)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\treturn userID, nil\n\t}\n\n\treturn \"\", nil\n}\n"
  },
  {
    "path": "internal/api/site_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype siteTestRunner struct {\n\ttestRunner\n}\n\nfunc createSiteTestRunner(t *testing.T) *siteTestRunner {\n\treturn &siteTestRunner{\n\t\ttestRunner: *asAdmin(t),\n\t}\n}\n\nfunc (s *siteTestRunner) testCreateSite() {\n\tdescription := \"Test site description\"\n\turl := \"https://example.com\"\n\tregex := `^https://example\\.com/.*$`\n\n\tinput := models.SiteCreateInput{\n\t\tName:        s.generateSiteName(),\n\t\tDescription: &description,\n\t\tURL:         &url,\n\t\tRegex:       &regex,\n\t\tValidTypes:  []models.ValidSiteTypeEnum{models.ValidSiteTypeEnumScene, models.ValidSiteTypeEnumPerformer},\n\t}\n\n\tsite, err := s.resolver.Mutation().SiteCreate(s.ctx, input)\n\tassert.NoError(s.t, err, \"Error creating site\")\n\n\ts.verifyCreatedSite(input, site)\n}\n\nfunc (s *siteTestRunner) verifyCreatedSite(input models.SiteCreateInput, site *models.Site) {\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, input.Name, site.Name)\n\tassert.True(s.t, site.ID != uuid.Nil, \"Expected created site id to be non-zero\")\n\n\t// verify optional fields\n\tif input.Description != nil {\n\t\tassert.NotNil(s.t, site.Description, \"Expected description to be set\")\n\t\tassert.Equal(s.t, *input.Description, *site.Description)\n\t}\n\n\tif input.URL != nil {\n\t\tassert.NotNil(s.t, site.URL, \"Expected URL to be set\")\n\t\tassert.Equal(s.t, *input.URL, *site.URL)\n\t}\n\n\tif input.Regex != nil {\n\t\tassert.NotNil(s.t, site.Regex, \"Expected regex to be set\")\n\t\tassert.Equal(s.t, *input.Regex, *site.Regex)\n\t}\n\n\t// verify valid types\n\tassert.Equal(s.t, len(input.ValidTypes), len(site.ValidTypes))\n}\n\nfunc (s *siteTestRunner) testFindSiteById() {\n\tcreatedSite, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tsiteID := createdSite.ID\n\n\tsite, err := s.client.findSite(siteID)\n\tassert.NoError(s.t, err, \"Error finding site\")\n\n\t// ensure returned site is not nil\n\tassert.NotNil(s.t, site, \"Did not find site by id\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdSite.Name, site.Name)\n}\n\nfunc (s *siteTestRunner) testQuerySites() {\n\t// Create multiple test sites\n\tsite1, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tsite2, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tresult, err := s.client.querySites()\n\tassert.NoError(s.t, err, \"Error querying sites\")\n\n\t// ensure we have at least the sites we created\n\tassert.True(s.t, len(result.Sites) >= 2, \"Expected at least 2 sites in query result\")\n\n\t// verify our created sites are in the results\n\tfound1 := false\n\tfound2 := false\n\tfor _, site := range result.Sites {\n\t\tif site.ID == site1.ID.String() {\n\t\t\tfound1 = true\n\t\t}\n\t\tif site.ID == site2.ID.String() {\n\t\t\tfound2 = true\n\t\t}\n\t}\n\n\tassert.True(s.t, found1, \"Created site 1 not found in query results\")\n\tassert.True(s.t, found2, \"Created site 2 not found in query results\")\n}\n\nfunc (s *siteTestRunner) testUpdateSite() {\n\tcreatedSite, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tsiteID := createdSite.ID\n\n\tnewDescription := \"Updated description\"\n\tnewURL := \"https://updated.com\"\n\tnewName := \"Updated \" + createdSite.Name\n\n\tupdateInput := models.SiteUpdateInput{\n\t\tID:          siteID,\n\t\tName:        newName,\n\t\tDescription: &newDescription,\n\t\tURL:         &newURL,\n\t\tValidTypes:  []models.ValidSiteTypeEnum{models.ValidSiteTypeEnumScene},\n\t}\n\n\tupdatedSite, err := s.client.updateSite(updateInput)\n\tassert.NoError(s.t, err, \"Error updating site\")\n\n\ts.verifyUpdatedSite(updateInput, updatedSite)\n}\n\nfunc (s *siteTestRunner) verifyUpdatedSite(input models.SiteUpdateInput, site *siteOutput) {\n\t// ensure ID matches\n\tassert.Equal(s.t, input.ID.String(), site.ID)\n\n\t// verify updated fields\n\tassert.Equal(s.t, input.Name, site.Name)\n\n\tif input.Description != nil {\n\t\tassert.NotNil(s.t, site.Description, \"Expected description to be set\")\n\t\tassert.Equal(s.t, *input.Description, *site.Description)\n\t}\n\n\tif input.URL != nil {\n\t\tassert.NotNil(s.t, site.URL, \"Expected URL to be set\")\n\t\tassert.Equal(s.t, *input.URL, *site.URL)\n\t}\n}\n\nfunc (s *siteTestRunner) testDestroySite() {\n\tcreatedSite, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tsiteID := createdSite.ID\n\n\tdestroyed, err := s.client.destroySite(models.SiteDestroyInput{\n\t\tID: siteID,\n\t})\n\tassert.NoError(s.t, err, \"Error destroying site\")\n\n\tassert.True(s.t, destroyed, \"Site was not destroyed\")\n\n\t// ensure cannot find site\n\tfoundSite, err := s.client.findSite(siteID)\n\tassert.NoError(s.t, err, \"Error finding site after destroying\")\n\n\tassert.Nil(s.t, foundSite, \"Found site after destruction\")\n}\n\nfunc TestCreateSite(t *testing.T) {\n\tst := createSiteTestRunner(t)\n\tst.testCreateSite()\n}\n\nfunc TestFindSiteById(t *testing.T) {\n\tst := createSiteTestRunner(t)\n\tst.testFindSiteById()\n}\n\nfunc TestQuerySites(t *testing.T) {\n\tst := createSiteTestRunner(t)\n\tst.testQuerySites()\n}\n\nfunc TestUpdateSite(t *testing.T) {\n\tst := createSiteTestRunner(t)\n\tst.testUpdateSite()\n}\n\nfunc TestDestroySite(t *testing.T) {\n\tst := createSiteTestRunner(t)\n\tst.testDestroySite()\n}\n"
  },
  {
    "path": "internal/api/studio_edit_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype studioEditTestRunner struct {\n\ttestRunner\n}\n\nfunc createStudioEditTestRunner(t *testing.T) *studioEditTestRunner {\n\treturn &studioEditTestRunner{\n\t\ttestRunner: *asAdmin(t),\n\t}\n}\n\nfunc (s *studioEditTestRunner) testCreateStudioEdit() {\n\tparentStudio, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\tparentID := parentStudio.UUID()\n\tname := \"Name\"\n\tstudioEditDetailsInput := models.StudioEditDetailsInput{\n\t\tName:     &name,\n\t\tParentID: &parentID,\n\t}\n\n\tedit, err := s.createTestStudioEdit(models.OperationEnumCreate, &studioEditDetailsInput, nil)\n\tassert.NoError(s.t, err)\n\ts.verifyCreatedStudioEdit(studioEditDetailsInput, edit)\n}\n\nfunc (s *studioEditTestRunner) verifyCreatedStudioEdit(input models.StudioEditDetailsInput, edit *models.Edit) {\n\tr := s.resolver.Edit()\n\n\tassert.True(s.t, edit.ID != uuid.Nil, \"Expected created edit id to be non-zero\")\n\n\tdetails, _ := r.Details(s.ctx, edit)\n\tstudioDetails := details.(*models.StudioEdit)\n\n\ts.verifyEditOperation(models.OperationEnumCreate.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumStudio.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, *input.Name, *studioDetails.Name)\n\tassert.Equal(s.t, *input.ParentID, *studioDetails.ParentID)\n}\n\nfunc (s *studioEditTestRunner) testFindEditById() {\n\tcreatedEdit, err := s.createTestStudioEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\tedit, err := s.resolver.Query().FindEdit(s.ctx, createdEdit.ID)\n\tassert.NoError(s.t, err, \"Error finding edit\")\n\n\t// ensure returned studio is not nil\n\tassert.NotNil(s.t, edit, \"Did not find edit by id\")\n}\n\nfunc (s *studioEditTestRunner) testModifyStudioEdit() {\n\texistingParentStudio, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\texistingParentID := existingParentStudio.UUID()\n\texistingName := \"studioName\"\n\tstudioCreateInput := models.StudioCreateInput{\n\t\tName:     existingName,\n\t\tParentID: &existingParentID,\n\t}\n\tcreatedStudio, err := s.createTestStudio(&studioCreateInput)\n\tassert.NoError(s.t, err)\n\n\tnewParent, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\tnewParentID := newParent.UUID()\n\tnewName := \"newName\"\n\n\tsite, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\turl := models.URL{\n\t\tURL:    \"http://example.org\",\n\t\tSiteID: site.ID,\n\t}\n\tstudioEditDetailsInput := models.StudioEditDetailsInput{\n\t\tName:     &newName,\n\t\tParentID: &newParentID,\n\t\tUrls:     []models.URL{url},\n\t}\n\tid := createdStudio.UUID()\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &id,\n\t}\n\n\tcreatedUpdateEdit, err := s.createTestStudioEdit(models.OperationEnumModify, &studioEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\ts.verifyUpdatedStudioEdit(createdStudio, studioEditDetailsInput, createdUpdateEdit)\n}\n\nfunc (s *studioEditTestRunner) verifyUpdatedStudioEdit(originalStudio *studioOutput, input models.StudioEditDetailsInput, edit *models.Edit) {\n\tstudioDetails := s.getEditStudioDetails(edit)\n\n\ts.verifyEditOperation(models.OperationEnumModify.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumStudio.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, *input.Name, *studioDetails.Name)\n\tassert.Equal(s.t, *input.ParentID, *studioDetails.ParentID)\n\n\tassert.Equal(s.t, input.Urls, studioDetails.AddedUrls)\n}\n\nfunc (s *studioEditTestRunner) testDestroyStudioEdit() {\n\tcreatedStudio, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\tstudioID := createdStudio.UUID()\n\n\tstudioEditDetailsInput := models.StudioEditDetailsInput{}\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumDestroy,\n\t\tID:        &studioID,\n\t}\n\tdestroyEdit, err := s.createTestStudioEdit(models.OperationEnumDestroy, &studioEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\ts.verifyDestroyStudioEdit(studioID, destroyEdit)\n}\n\nfunc (s *studioEditTestRunner) verifyDestroyStudioEdit(studioID uuid.UUID, edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumDestroy.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumStudio.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\teditTarget := s.getEditStudioTarget(edit)\n\n\tassert.Equal(s.t, studioID, editTarget.ID)\n}\n\nfunc (s *studioEditTestRunner) testMergeStudioEdit() {\n\texistingName := \"studioName2\"\n\tstudioCreateInput := models.StudioCreateInput{\n\t\tName: existingName,\n\t}\n\tcreatedPrimaryStudio, err := s.createTestStudio(&studioCreateInput)\n\tassert.NoError(s.t, err)\n\n\tcreatedMergeStudio, err := s.createTestStudio(nil)\n\n\tnewName := \"newName2\"\n\tstudioEditDetailsInput := models.StudioEditDetailsInput{\n\t\tName: &newName,\n\t}\n\tid := createdPrimaryStudio.UUID()\n\tmergeSources := []uuid.UUID{createdMergeStudio.UUID()}\n\teditInput := models.EditInput{\n\t\tOperation:      models.OperationEnumMerge,\n\t\tID:             &id,\n\t\tMergeSourceIds: mergeSources,\n\t}\n\n\tcreatedMergeEdit, err := s.createTestStudioEdit(models.OperationEnumMerge, &studioEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\ts.verifyMergeStudioEdit(createdPrimaryStudio, studioEditDetailsInput, createdMergeEdit, mergeSources)\n}\n\nfunc (s *studioEditTestRunner) verifyMergeStudioEdit(originalStudio *studioOutput, input models.StudioEditDetailsInput, edit *models.Edit, inputMergeSources []uuid.UUID) {\n\tstudioDetails := s.getEditStudioDetails(edit)\n\n\ts.verifyEditOperation(models.OperationEnumMerge.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumStudio.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, *input.Name, *studioDetails.Name)\n\n\tvar mergeSources []uuid.UUID\n\tmerges, _ := s.resolver.Edit().MergeSources(s.ctx, edit)\n\tfor i := range merges {\n\t\tmerge := merges[i].(*models.Studio)\n\t\tmergeSources = append(mergeSources, merge.ID)\n\t}\n\tassert.Equal(s.t, inputMergeSources, mergeSources)\n}\n\nfunc (s *studioEditTestRunner) testApplyCreateStudioEdit() {\n\tname := \"Name\"\n\tparent, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\tparentID := parent.UUID()\n\tstudioEditDetailsInput := models.StudioEditDetailsInput{\n\t\tName:     &name,\n\t\tParentID: &parentID,\n\t}\n\tedit, err := s.createTestStudioEdit(models.OperationEnumCreate, &studioEditDetailsInput, nil)\n\tassert.NoError(s.t, err)\n\n\tappliedEdit, err := s.applyEdit(edit.ID)\n\tassert.NoError(s.t, err)\n\ts.verifyAppliedStudioCreateEdit(studioEditDetailsInput, appliedEdit)\n}\n\nfunc (s *studioEditTestRunner) verifyAppliedStudioCreateEdit(input models.StudioEditDetailsInput, edit *models.Edit) {\n\tassert.True(s.t, edit.ID != uuid.Nil, \"Expected created edit id to be non-zero\")\n\n\ts.verifyEditOperation(models.OperationEnumCreate.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumStudio.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\tstudio := s.getEditStudioTarget(edit)\n\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, *input.Name, studio.Name)\n\tassert.Equal(s.t, *input.ParentID, studio.ParentStudioID.UUID)\n}\n\nfunc (s *studioEditTestRunner) testApplyModifyStudioEdit() {\n\texistingName := \"studioName3\"\n\tsite, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tstudioCreateInput := models.StudioCreateInput{\n\t\tName: existingName,\n\t\tUrls: []models.URL{{\n\t\t\tURL:    \"http://example.org/old\",\n\t\t\tSiteID: site.ID,\n\t\t}},\n\t}\n\tcreatedStudio, err := s.createTestStudio(&studioCreateInput)\n\tassert.NoError(s.t, err)\n\n\tnewName := \"newName3\"\n\tnewParent, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\tnewParentID := newParent.UUID()\n\tnewUrl := models.URL{\n\t\tURL:    \"http://example.org/new\",\n\t\tSiteID: site.ID,\n\t}\n\tstudioEditDetailsInput := models.StudioEditDetailsInput{\n\t\tName:     &newName,\n\t\tParentID: &newParentID,\n\t\tUrls:     []models.URL{newUrl},\n\t}\n\tid := createdStudio.UUID()\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &id,\n\t}\n\n\tcreatedUpdateEdit, err := s.createTestStudioEdit(models.OperationEnumModify, &studioEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\tappliedEdit, err := s.applyEdit(createdUpdateEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tmodifiedStudio, err := s.resolver.Query().FindStudio(s.ctx, &id, nil)\n\tassert.NoError(s.t, err)\n\n\ts.verifyApplyModifyStudioEdit(studioEditDetailsInput, modifiedStudio, appliedEdit)\n}\n\nfunc (s *studioEditTestRunner) verifyApplyModifyStudioEdit(input models.StudioEditDetailsInput, updatedStudio *models.Studio, edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumModify.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumStudio.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, *input.Name, updatedStudio.Name)\n\tassert.True(s.t, updatedStudio.ParentStudioID.Valid && (*input.ParentID == updatedStudio.ParentStudioID.UUID))\n\n\turls, _ := s.resolver.Studio().Urls(s.ctx, updatedStudio)\n\tassert.Equal(s.t, input.Urls, urls)\n}\n\nfunc (s *studioEditTestRunner) testApplyModifyUnsetStudioEdit() {\n\texistingName := \"studioName4\"\n\tsite, err := s.createTestSite(nil)\n\tassert.NoError(s.t, err)\n\n\tnewParent, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\tnewParentID := newParent.UUID()\n\n\tstudioCreateInput := models.StudioCreateInput{\n\t\tName: existingName,\n\t\tUrls: []models.URL{{\n\t\t\tURL:    \"http://example.org/old\",\n\t\t\tSiteID: site.ID,\n\t\t}},\n\t\tParentID: &newParentID,\n\t}\n\tcreatedStudio, err := s.createTestStudio(&studioCreateInput)\n\tassert.NoError(s.t, err)\n\n\tvar resp struct {\n\t\tStudioEdit struct {\n\t\t\tID string\n\t\t}\n\t}\n\n\tnewName := \"cleared-name\"\n\tid := createdStudio.UUID()\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tmutation {\n\t\t\tstudioEdit(input: {\n\t\t\t\tedit: {id: \"%v\", operation: MODIFY}\n\t\t\t\tdetails: { parent_id: null, urls: [], name: \"%s\"}\n\t\t\t}) {\n\t\t\t\tid\n\t\t\t}\n\t\t}\n\t`, id, newName), &resp)\n\n\t_, err = s.applyEdit(uuid.FromStringOrNil(resp.StudioEdit.ID))\n\tassert.NoError(s.t, err)\n\n\tvar studio struct {\n\t\tFindStudio struct {\n\t\t\tName   string\n\t\t\tParent struct {\n\t\t\t\tId uuid.NullUUID\n\t\t\t}\n\t\t\tURLs []models.URL\n\t\t}\n\t}\n\n\ts.client.MustPost(fmt.Sprintf(`\n\t\tquery {\n\t\t\tfindStudio(id: \"%v\") {\n\t\t\t  name\n\t\t\t  parent {\n\t\t\t\t  id\n\t\t\t\t}\n\t\t\t\turls {\n\t\t\t\t\turl\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`, id), &studio)\n\n\tassert.Equal(s.t, newName, studio.FindStudio.Name)\n\tassert.True(s.t, studio.FindStudio.Parent.Id.UUID.IsNil())\n\tassert.True(s.t, len(studio.FindStudio.URLs) == 0)\n}\n\nfunc (s *studioEditTestRunner) testApplyDestroyStudioEdit() {\n\tcreatedStudio, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\tstudioID := createdStudio.UUID()\n\tsceneInput := models.SceneCreateInput{\n\t\tStudioID: &studioID,\n\t\tDate:     \"2020-03-02\",\n\t}\n\tscene, err := s.createTestScene(&sceneInput)\n\tassert.NoError(s.t, err)\n\n\tstudioEditDetailsInput := models.StudioEditDetailsInput{}\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumDestroy,\n\t\tID:        &studioID,\n\t}\n\tdestroyEdit, err := s.createTestStudioEdit(models.OperationEnumDestroy, &studioEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\tappliedEdit, err := s.applyEdit(destroyEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tdestroyedStudio, err := s.resolver.Query().FindStudio(s.ctx, &studioID, nil)\n\tassert.NoError(s.t, err)\n\n\tscene, err = s.client.findScene(scene.UUID())\n\tassert.NoError(s.t, err)\n\n\ts.verifyApplyDestroyStudioEdit(destroyedStudio, appliedEdit, scene)\n}\n\nfunc (s *studioEditTestRunner) verifyApplyDestroyStudioEdit(destroyedStudio *models.Studio, edit *models.Edit, scene *sceneOutput) {\n\ts.verifyEditOperation(models.OperationEnumDestroy.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumStudio.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\tassert.Equal(s.t, destroyedStudio.Deleted, true)\n\tassert.Nil(s.t, scene.Studio)\n}\n\nfunc (s *studioEditTestRunner) testApplyMergeStudioEdit() {\n\tmergeSource1, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\tmergeSource2, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\tmergeTarget, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\t// Scene with studio from both source and target, should not cause db unique error\n\tmergeTargetID := mergeTarget.UUID()\n\tsceneInput := models.SceneCreateInput{\n\t\tStudioID: &mergeTargetID,\n\t\tDate:     \"2020-03-02\",\n\t}\n\tscene1, err := s.createTestScene(&sceneInput)\n\tassert.NoError(s.t, err)\n\n\tmergeSource1ID := mergeSource1.UUID()\n\tsceneInput = models.SceneCreateInput{\n\t\tStudioID: &mergeSource1ID,\n\t\tDate:     \"2020-03-02\",\n\t}\n\tscene2, err := s.createTestScene(&sceneInput)\n\tassert.NoError(s.t, err)\n\n\tnewName := \"newName4\"\n\tstudioEditDetailsInput := models.StudioEditDetailsInput{\n\t\tName: &newName,\n\t}\n\tid := mergeTarget.UUID()\n\tmergeSources := []uuid.UUID{mergeSource1.UUID(), mergeSource2.UUID()}\n\teditInput := models.EditInput{\n\t\tOperation:      models.OperationEnumMerge,\n\t\tID:             &id,\n\t\tMergeSourceIds: mergeSources,\n\t}\n\n\tmergeEdit, err := s.createTestStudioEdit(models.OperationEnumMerge, &studioEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\tappliedMerge, err := s.applyEdit(mergeEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tscene1, err = s.client.findScene(scene1.UUID())\n\tassert.NoError(s.t, err)\n\n\tscene2, err = s.client.findScene(scene2.UUID())\n\tassert.NoError(s.t, err)\n\n\ts.verifyAppliedMergeStudioEdit(studioEditDetailsInput, appliedMerge, scene1, scene2)\n}\n\nfunc (s *studioEditTestRunner) verifyAppliedMergeStudioEdit(input models.StudioEditDetailsInput, edit *models.Edit, scene1 *sceneOutput, scene2 *sceneOutput) {\n\ts.verifyEditOperation(models.OperationEnumMerge.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumStudio.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\tstudioDetails := s.getEditStudioDetails(edit)\n\tassert.Equal(s.t, *input.Name, *studioDetails.Name)\n\n\tmerges, _ := s.resolver.Edit().MergeSources(s.ctx, edit)\n\tfor i := range merges {\n\t\tstudio := merges[i].(*models.Studio)\n\t\tassert.Equal(s.t, studio.Deleted, true)\n\t}\n\n\teditTarget := s.getEditStudioTarget(edit)\n\tassert.Equal(s.t, scene1.Studio.ID, editTarget.ID.String())\n\tassert.Equal(s.t, scene2.Studio.ID, editTarget.ID.String())\n}\n\nfunc (s *studioEditTestRunner) testStudioEditUpdate() {\n\t// Create a pending edit\n\tname := \"Original Studio Name\"\n\tstudioEditDetailsInput := models.StudioEditDetailsInput{\n\t\tName: &name,\n\t}\n\tcreatedEdit, err := s.createTestStudioEdit(models.OperationEnumCreate, &studioEditDetailsInput, nil)\n\tassert.NoError(s.t, err)\n\n\t// Update the edit with new details\n\tnewName := \"Updated Studio Name\"\n\tupdatedDetails := models.StudioEditDetailsInput{\n\t\tName: &newName,\n\t}\n\n\teditID := createdEdit.ID\n\tupdatedEdit, err := s.resolver.Mutation().StudioEditUpdate(s.ctx, createdEdit.ID, models.StudioEditInput{\n\t\tEdit:    &models.EditInput{ID: &editID},\n\t\tDetails: &updatedDetails,\n\t})\n\tassert.NoError(s.t, err, \"Error updating studio edit\")\n\n\t// Verify the edit was updated\n\tassert.Equal(s.t, createdEdit.ID, updatedEdit.ID, \"Edit ID should not change\")\n\tassert.NotNil(s.t, updatedEdit, \"Updated edit should not be nil\")\n}\n\nfunc TestCreateStudioEdit(t *testing.T) {\n\tpt := createStudioEditTestRunner(t)\n\tpt.testCreateStudioEdit()\n}\n\nfunc TestModifyStudioEdit(t *testing.T) {\n\tpt := createStudioEditTestRunner(t)\n\tpt.testModifyStudioEdit()\n}\n\nfunc TestDestroyStudioEdit(t *testing.T) {\n\tpt := createStudioEditTestRunner(t)\n\tpt.testDestroyStudioEdit()\n}\n\nfunc TestMergeStudioEdit(t *testing.T) {\n\tpt := createStudioEditTestRunner(t)\n\tpt.testMergeStudioEdit()\n}\n\nfunc TestApplyCreateStudioEdit(t *testing.T) {\n\tpt := createStudioEditTestRunner(t)\n\tpt.testApplyCreateStudioEdit()\n}\n\nfunc TestApplyModifyStudioEdit(t *testing.T) {\n\tpt := createStudioEditTestRunner(t)\n\tpt.testApplyModifyStudioEdit()\n}\n\nfunc TestApplyModifyUnsetStudioEdit(t *testing.T) {\n\tpt := createStudioEditTestRunner(t)\n\tpt.testApplyModifyUnsetStudioEdit()\n}\n\nfunc TestApplyDestroyStudioEdit(t *testing.T) {\n\tpt := createStudioEditTestRunner(t)\n\tpt.testApplyDestroyStudioEdit()\n}\n\nfunc TestApplyMergeStudioEdit(t *testing.T) {\n\tpt := createStudioEditTestRunner(t)\n\tpt.testApplyMergeStudioEdit()\n}\n\nfunc TestStudioEditUpdate(t *testing.T) {\n\tpt := createStudioEditTestRunner(t)\n\tpt.testStudioEditUpdate()\n}\n"
  },
  {
    "path": "internal/api/studio_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"strconv\"\n\t\"testing\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype studioTestRunner struct {\n\ttestRunner\n\tstudioSuffix int\n}\n\nfunc createStudioTestRunner(t *testing.T) *studioTestRunner {\n\treturn &studioTestRunner{\n\t\ttestRunner: *asModify(t),\n\t}\n}\n\nfunc (s *studioTestRunner) generateStudioName() string {\n\ts.studioSuffix += 1\n\treturn \"studioTestRunner-\" + strconv.Itoa(s.studioSuffix)\n}\n\nfunc (s *studioTestRunner) testCreateStudio() {\n\tinput := models.StudioCreateInput{\n\t\tName: s.generateStudioName(),\n\t}\n\n\tstudio, err := s.resolver.Mutation().StudioCreate(s.ctx, input)\n\tassert.NoError(s.t, err, \"Error creating studio\")\n\n\ts.verifyCreatedStudio(input, studio)\n}\n\nfunc (s *studioTestRunner) verifyCreatedStudio(input models.StudioCreateInput, studio *models.Studio) {\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, input.Name, studio.Name)\n\n\tassert.True(s.t, studio.ID != uuid.Nil, \"Expected created studio id to be non-zero\")\n}\n\nfunc (s *studioTestRunner) testFindStudioById() {\n\tcreatedStudio, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\tstudioID := createdStudio.UUID()\n\tstudio, err := s.resolver.Query().FindStudio(s.ctx, &studioID, nil)\n\tassert.NoError(s.t, err, \"Error finding studio\")\n\n\t// ensure returned studio is not nil\n\tassert.NotNil(s.t, studio, \"Did not find studio by id\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdStudio.Name, studio.Name)\n}\n\nfunc (s *studioTestRunner) testFindStudioByName() {\n\tcreatedStudio, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\tstudioName := createdStudio.Name\n\tstudio, err := s.resolver.Query().FindStudio(s.ctx, nil, &studioName)\n\tassert.NoError(s.t, err, \"Error finding studio\")\n\n\t// ensure returned studio is not nil\n\tassert.NotNil(s.t, studio, \"Did not find studio by name\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdStudio.Name, studio.Name)\n}\n\nfunc (s *studioTestRunner) testUpdateStudioName() {\n\tinput := &models.StudioCreateInput{\n\t\tName: s.generateStudioName(),\n\t}\n\n\tcreatedStudio, err := s.createTestStudio(input)\n\tassert.NoError(s.t, err)\n\n\tstudioID := createdStudio.UUID()\n\n\tupdatedName := s.generateStudioName()\n\tupdateInput := models.StudioUpdateInput{\n\t\tID:   studioID,\n\t\tName: &updatedName,\n\t}\n\n\t// need some mocking of the context to make the field ignore behaviour work\n\tctx := s.updateContext([]string{\n\t\t\"name\",\n\t})\n\tupdatedStudio, err := s.resolver.Mutation().StudioUpdate(ctx, updateInput)\n\tassert.NoError(s.t, err, \"Error updating studio\")\n\n\tinput.Name = updatedName\n\ts.verifyCreatedStudio(*input, updatedStudio)\n}\n\nfunc (s *studioTestRunner) verifyUpdatedStudio(input models.StudioUpdateInput, studio *models.Studio) {\n\t// ensure basic attributes are set correctly\n\tassert.True(s.t, input.Name == nil || (*input.Name == studio.Name))\n}\n\nfunc (s *studioTestRunner) testDestroyStudio() {\n\tcreatedStudio, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\tstudioID := createdStudio.UUID()\n\n\tdestroyed, err := s.resolver.Mutation().StudioDestroy(s.ctx, models.StudioDestroyInput{\n\t\tID: studioID,\n\t})\n\tassert.NoError(s.t, err, \"Error destroying studio\")\n\n\tassert.True(s.t, destroyed, \"Studio was not destroyed\")\n\n\t// ensure cannot find studio\n\tfoundStudio, err := s.resolver.Query().FindStudio(s.ctx, &studioID, nil)\n\tassert.NoError(s.t, err, \"Error finding studio after destroying\")\n\n\tassert.True(s.t, foundStudio == nil, nil, \"Found studio after destruction\")\n\n\t// TODO - ensure scene was not removed\n}\n\nfunc (s *studioTestRunner) testQueryStudios() {\n\t// Create test studios\n\tname1 := s.generateStudioName()\n\tstudio1, err := s.createTestStudio(&models.StudioCreateInput{\n\t\tName: name1,\n\t})\n\tassert.NoError(s.t, err)\n\n\tname2 := s.generateStudioName()\n\tstudio2, err := s.createTestStudio(&models.StudioCreateInput{\n\t\tName: name2,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Test basic query\n\tresult, err := s.client.queryStudios(models.StudioQueryInput{\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumAsc,\n\t\tSort:      models.StudioSortEnumName,\n\t})\n\tassert.NoError(s.t, err, \"Error querying studios\")\n\n\t// Ensure we have at least the studios we created\n\tassert.True(s.t, result.Count >= 2, \"Expected at least 2 studios in count\")\n\tassert.True(s.t, len(result.Studios) >= 2, \"Expected at least 2 studios in results\")\n\n\t// Debug: check studio IDs\n\ts.t.Logf(\"Looking for studio1 ID: %s, studio2 ID: %s\", studio1.ID, studio2.ID)\n\ts.t.Logf(\"Query returned %d studios\", len(result.Studios))\n\n\t// Verify our created studios are in the results\n\tfound1 := false\n\tfound2 := false\n\tfor _, st := range result.Studios {\n\t\tif st.ID == studio1.ID {\n\t\t\tfound1 = true\n\t\t\tassert.Equal(s.t, name1, st.Name)\n\t\t}\n\t\tif st.ID == studio2.ID {\n\t\t\tfound2 = true\n\t\t\tassert.Equal(s.t, name2, st.Name)\n\t\t}\n\t}\n\n\tassert.True(s.t, found1, \"Created studio 1 not found in query results\")\n\tassert.True(s.t, found2, \"Created studio 2 not found in query results\")\n}\n\nfunc TestCreateStudio(t *testing.T) {\n\tpt := createStudioTestRunner(t)\n\tpt.testCreateStudio()\n}\n\nfunc TestFindStudioById(t *testing.T) {\n\tpt := createStudioTestRunner(t)\n\tpt.testFindStudioById()\n}\n\nfunc TestFindStudioByName(t *testing.T) {\n\tpt := createStudioTestRunner(t)\n\tpt.testFindStudioByName()\n}\n\nfunc TestUpdateStudioName(t *testing.T) {\n\tpt := createStudioTestRunner(t)\n\tpt.testUpdateStudioName()\n}\n\nfunc TestDestroyStudio(t *testing.T) {\n\tpt := createStudioTestRunner(t)\n\tpt.testDestroyStudio()\n}\n\nfunc TestQueryStudios(t *testing.T) {\n\tpt := createStudioTestRunner(t)\n\tpt.testQueryStudios()\n}\n\nfunc (s *studioTestRunner) testParentChildStudios() {\n\t// Create parent studio\n\tparentInput := models.StudioCreateInput{\n\t\tName: s.generateStudioName(),\n\t}\n\tparentStudio, err := s.resolver.Mutation().StudioCreate(s.ctx, parentInput)\n\tassert.NoError(s.t, err, \"Error creating parent studio\")\n\n\tparentID := parentStudio.ID\n\n\t// Create child studios\n\tchild1Input := models.StudioCreateInput{\n\t\tName:     s.generateStudioName(),\n\t\tParentID: &parentID,\n\t}\n\tchild1, err := s.resolver.Mutation().StudioCreate(s.ctx, child1Input)\n\tassert.NoError(s.t, err, \"Error creating child studio 1\")\n\n\tchild2Input := models.StudioCreateInput{\n\t\tName:     s.generateStudioName(),\n\t\tParentID: &parentID,\n\t}\n\tchild2, err := s.resolver.Mutation().StudioCreate(s.ctx, child2Input)\n\tassert.NoError(s.t, err, \"Error creating child studio 2\")\n\n\tchild3Input := models.StudioCreateInput{\n\t\tName:     s.generateStudioName(),\n\t\tParentID: &parentID,\n\t}\n\tchild3, err := s.resolver.Mutation().StudioCreate(s.ctx, child3Input)\n\tassert.NoError(s.t, err, \"Error creating child studio 3\")\n\n\t// Query parent studio using GraphQL client to get child_studios field\n\tqueriedParent, err := s.client.findStudio(parentID)\n\tassert.NoError(s.t, err, \"Error finding parent studio\")\n\tassert.NotNil(s.t, queriedParent, \"Parent studio not found\")\n\n\t// Verify child_studios field contains the created children\n\tassert.Equal(s.t, 3, len(queriedParent.ChildStudios), \"Expected 3 child studios\")\n\n\t// Verify all child IDs are present\n\tchildIDs := make(map[string]bool)\n\tfor _, child := range queriedParent.ChildStudios {\n\t\tchildIDs[child.ID] = true\n\t}\n\n\tassert.True(s.t, childIDs[child1.ID.String()], \"Child1 not found in parent's child_studios\")\n\tassert.True(s.t, childIDs[child2.ID.String()], \"Child2 not found in parent's child_studios\")\n\tassert.True(s.t, childIDs[child3.ID.String()], \"Child3 not found in parent's child_studios\")\n\n\t// Verify each child has correct parent\n\tfor _, childID := range []uuid.UUID{child1.ID, child2.ID, child3.ID} {\n\t\tchild, err := s.resolver.Query().FindStudio(s.ctx, &childID, nil)\n\t\tassert.NoError(s.t, err, \"Error finding child studio\")\n\t\tassert.NotNil(s.t, child, \"Child studio not found\")\n\n\t\tparent, err := s.resolver.Studio().Parent(s.ctx, child)\n\t\tassert.NoError(s.t, err, \"Error getting parent from child\")\n\t\tassert.NotNil(s.t, parent, \"Parent not found from child\")\n\t\tassert.Equal(s.t, parentID, parent.ID, \"Child's parent ID doesn't match\")\n\t}\n}\n\nfunc TestParentChildStudios(t *testing.T) {\n\tpt := createStudioTestRunner(t)\n\tpt.testParentChildStudios()\n}\n"
  },
  {
    "path": "internal/api/tag_category_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype tagCategoryTestRunner struct {\n\ttestRunner\n}\n\nfunc createTagCategoryTestRunner(t *testing.T) *tagCategoryTestRunner {\n\treturn &tagCategoryTestRunner{\n\t\ttestRunner: *asAdmin(t),\n\t}\n}\n\nfunc (s *tagCategoryTestRunner) testCreateTagCategory() {\n\tdescription := \"Description\"\n\n\tinput := models.TagCategoryCreateInput{\n\t\tName:        s.generateCategoryName(),\n\t\tDescription: &description,\n\t\tGroup:       models.TagGroupEnumPeople,\n\t}\n\n\tcategory, err := s.resolver.Mutation().TagCategoryCreate(s.ctx, input)\n\tassert.NoError(s.t, err, \"Error creating tagCategory\")\n\n\ts.verifyCreatedTagCategory(input, category)\n}\n\nfunc (s *tagCategoryTestRunner) verifyCreatedTagCategory(input models.TagCategoryCreateInput, category *models.TagCategory) {\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, input.Name, category.Name)\n\n\tr := s.resolver.TagCategory()\n\n\tassert.True(s.t, category.ID != uuid.Nil, \"Expected created tagCategory id to be non-zero\")\n\n\tassert.Equal(s.t, category.Description, input.Description)\n\n\tgroup, _ := r.Group(s.ctx, category)\n\tassert.Equal(s.t, group, models.TagGroupEnumPeople)\n}\n\nfunc (s *tagCategoryTestRunner) testFindTagCategoryById() {\n\tcreatedCategory, err := s.createTestTagCategory(nil)\n\tassert.NoError(s.t, err)\n\n\tcategory, err := s.resolver.Query().FindTagCategory(s.ctx, createdCategory.ID)\n\tassert.NoError(s.t, err, \"Error finding tagCategory\")\n\n\t// ensure returned tagCategory is not nil\n\tassert.NotNil(s.t, category, \"Did not find tagCategory by id\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdCategory.Name, category.Name)\n}\n\nfunc (s *tagCategoryTestRunner) testUpdateTagCategory() {\n\tcreatedCategory, err := s.createTestTagCategory(nil)\n\tassert.NoError(s.t, err)\n\n\tcatID := createdCategory.ID\n\n\tnewDescription := \"newDescription\"\n\n\tupdateInput := models.TagCategoryUpdateInput{\n\t\tID:          catID,\n\t\tDescription: &newDescription,\n\t}\n\n\tupdatedCategory, err := s.resolver.Mutation().TagCategoryUpdate(s.ctx, updateInput)\n\tassert.NoError(s.t, err, \"Error updating tagCategory\")\n\n\ts.verifyUpdatedTagCategory(updateInput, updatedCategory)\n}\n\nfunc (s *tagCategoryTestRunner) verifyUpdatedTagCategory(input models.TagCategoryUpdateInput, category *models.TagCategory) {\n\t// ensure basic attributes are set correctly\n\tassert.True(s.t, input.Name == nil || (*input.Name == category.Name))\n\n\tassert.Equal(s.t, category.Description, input.Description)\n}\n\nfunc (s *tagCategoryTestRunner) testDestroyTagCategory() {\n\tcreatedCategory, err := s.createTestTagCategory(nil)\n\tassert.NoError(s.t, err)\n\n\tcatID := createdCategory.ID\n\n\tdestroyed, err := s.resolver.Mutation().TagCategoryDestroy(s.ctx, models.TagCategoryDestroyInput{\n\t\tID: catID,\n\t})\n\tassert.NoError(s.t, err, \"Error destroying tagCategory\")\n\n\tassert.True(s.t, destroyed, \"TagCategory was not destroyed\")\n\n\t// ensure cannot find tagCategory\n\tfoundTagCategory, err := s.resolver.Query().FindTagCategory(s.ctx, catID)\n\tassert.NoError(s.t, err, \"Error finding tagCategory after destroying\")\n\n\tassert.Nil(s.t, foundTagCategory, \"Found tagCategory after destruction\")\n}\n\nfunc (s *tagCategoryTestRunner) testQueryTagCategories() {\n\t// Create test tag categories\n\tcat1, err := s.createTestTagCategory(nil)\n\tassert.NoError(s.t, err)\n\n\tcat2, err := s.createTestTagCategory(nil)\n\tassert.NoError(s.t, err)\n\n\t// Query all tag categories\n\tresult, err := s.client.queryTagCategories()\n\tassert.NoError(s.t, err, \"Error querying tag categories\")\n\n\t// Ensure we have at least the categories we created\n\tassert.True(s.t, result.Count >= 2, \"Expected at least 2 tag categories in count\")\n\tassert.True(s.t, len(result.TagCategories) >= 2, \"Expected at least 2 tag categories in results\")\n\n\t// Verify our created categories are in the results\n\tfound1 := false\n\tfound2 := false\n\tfor _, tc := range result.TagCategories {\n\t\tif tc.ID == cat1.ID.String() {\n\t\t\tfound1 = true\n\t\t\tassert.Equal(s.t, cat1.Name, tc.Name)\n\t\t}\n\t\tif tc.ID == cat2.ID.String() {\n\t\t\tfound2 = true\n\t\t\tassert.Equal(s.t, cat2.Name, tc.Name)\n\t\t}\n\t}\n\n\tassert.True(s.t, found1, \"Created tag category 1 not found in query results\")\n\tassert.True(s.t, found2, \"Created tag category 2 not found in query results\")\n}\n\nfunc TestCreateTagCategory(t *testing.T) {\n\tpt := createTagCategoryTestRunner(t)\n\tpt.testCreateTagCategory()\n}\n\nfunc TestUpdateTagCategory(t *testing.T) {\n\tpt := createTagCategoryTestRunner(t)\n\tpt.testUpdateTagCategory()\n}\n\nfunc TestDestroyTagCategory(t *testing.T) {\n\tpt := createTagCategoryTestRunner(t)\n\tpt.testDestroyTagCategory()\n}\n\nfunc TestQueryTagCategories(t *testing.T) {\n\tpt := createTagCategoryTestRunner(t)\n\tpt.testQueryTagCategories()\n}\n"
  },
  {
    "path": "internal/api/tag_edit_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype tagEditTestRunner struct {\n\ttestRunner\n}\n\nfunc createTagEditTestRunner(t *testing.T) *tagEditTestRunner {\n\treturn &tagEditTestRunner{\n\t\ttestRunner: *asAdmin(t),\n\t}\n}\n\nfunc (s *tagEditTestRunner) testCreateTagEdit() {\n\tcategory, err := s.createTestTagCategory(nil)\n\tassert.NoError(s.t, err)\n\n\tcategoryID := category.ID\n\tname := \"Name\"\n\tdescription := \"Description\"\n\ttagEditDetailsInput := models.TagEditDetailsInput{\n\t\tName:        &name,\n\t\tDescription: &description,\n\t\tAliases:     []string{\"Alias1\"},\n\t\tCategoryID:  &categoryID,\n\t}\n\n\tedit, err := s.createTestTagEdit(models.OperationEnumCreate, &tagEditDetailsInput, nil)\n\tassert.NoError(s.t, err)\n\ts.verifyCreatedTagEdit(tagEditDetailsInput, edit)\n}\n\nfunc (s *tagEditTestRunner) verifyCreatedTagEdit(input models.TagEditDetailsInput, edit *models.Edit) {\n\tr := s.resolver.Edit()\n\n\tassert.True(s.t, edit.ID != uuid.Nil, \"Expected created edit id to be non-zero\")\n\n\tdetails, _ := r.Details(s.ctx, edit)\n\ttagDetails := details.(*models.TagEdit)\n\n\ts.verifyEditOperation(models.OperationEnumCreate.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumTag.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, *input.Name, *tagDetails.Name)\n\tassert.Equal(s.t, *input.Description, *tagDetails.Description)\n\tassert.Equal(s.t, input.Aliases, tagDetails.AddedAliases)\n\tassert.Equal(s.t, *input.CategoryID, *tagDetails.CategoryID)\n}\n\nfunc (s *tagEditTestRunner) testFindEditById() {\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, nil, nil)\n\tassert.NoError(s.t, err)\n\n\tedit, err := s.resolver.Query().FindEdit(s.ctx, createdEdit.ID)\n\tassert.NoError(s.t, err, \"Error finding edit\")\n\n\t// ensure returned tag is not nil\n\tassert.NotNil(s.t, edit, \"Did not find edit by id\")\n}\n\nfunc (s *tagEditTestRunner) testModifyTagEdit() {\n\texistingCategory, err := s.createTestTagCategory(nil)\n\tassert.NoError(s.t, err)\n\n\texistingCategoryID := existingCategory.ID\n\texistingName := \"tagName\"\n\texistingAlias := \"tagAlias\"\n\ttagCreateInput := models.TagCreateInput{\n\t\tName:       existingName,\n\t\tAliases:    []string{existingAlias},\n\t\tCategoryID: &existingCategoryID,\n\t}\n\tcreatedTag, err := s.createTestTag(&tagCreateInput)\n\tassert.NoError(s.t, err)\n\n\tnewCategory, err := s.createTestTagCategory(nil)\n\tassert.NoError(s.t, err)\n\n\tnewCategoryID := newCategory.ID\n\tnewDescription := \"newDescription\"\n\tnewAlias := \"newTagAlias\"\n\tnewName := \"newName\"\n\ttagEditDetailsInput := models.TagEditDetailsInput{\n\t\tName:        &newName,\n\t\tDescription: &newDescription,\n\t\tAliases:     []string{newAlias},\n\t\tCategoryID:  &newCategoryID,\n\t}\n\tid := createdTag.UUID()\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &id,\n\t}\n\n\tcreatedUpdateEdit, err := s.createTestTagEdit(models.OperationEnumModify, &tagEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\ts.verifyUpdatedTagEdit(createdTag, tagEditDetailsInput, createdUpdateEdit)\n}\n\nfunc (s *tagEditTestRunner) verifyUpdatedTagEdit(originalTag *tagOutput, input models.TagEditDetailsInput, edit *models.Edit) {\n\ttagDetails := s.getEditTagDetails(edit)\n\n\ts.verifyEditOperation(models.OperationEnumModify.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumTag.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, *input.Name, *tagDetails.Name)\n\tassert.Equal(s.t, *input.Description, *tagDetails.Description)\n\n\ttagAliases := originalTag.Aliases\n\tassert.Equal(s.t, tagAliases, tagDetails.RemovedAliases)\n\tassert.Equal(s.t, input.Aliases, tagDetails.AddedAliases)\n\n\tassert.Equal(s.t, *input.CategoryID, *tagDetails.CategoryID)\n}\n\nfunc (s *tagEditTestRunner) testDestroyTagEdit() {\n\tcreatedTag, err := s.createTestTag(nil)\n\tassert.NoError(s.t, err)\n\n\ttagID := createdTag.UUID()\n\n\ttagEditDetailsInput := models.TagEditDetailsInput{}\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumDestroy,\n\t\tID:        &tagID,\n\t}\n\tdestroyEdit, err := s.createTestTagEdit(models.OperationEnumDestroy, &tagEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\ts.verifyDestroyTagEdit(tagID, destroyEdit)\n}\n\nfunc (s *tagEditTestRunner) verifyDestroyTagEdit(tagID uuid.UUID, edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumDestroy.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumTag.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\teditTarget := s.getEditTagTarget(edit)\n\n\tassert.Equal(s.t, tagID, editTarget.ID)\n}\n\nfunc (s *tagEditTestRunner) testMergeTagEdit() {\n\texistingName := \"tagName2\"\n\texistingAlias := \"tagAlias2\"\n\ttagCreateInput := models.TagCreateInput{\n\t\tName:    existingName,\n\t\tAliases: []string{existingAlias},\n\t}\n\tcreatedPrimaryTag, err := s.createTestTag(&tagCreateInput)\n\tassert.NoError(s.t, err)\n\n\tcreatedMergeTag, err := s.createTestTag(nil)\n\tassert.NoError(s.t, err)\n\n\tnewDescription := \"newDescription2\"\n\tnewAlias := \"newTagAlias2\"\n\tnewName := \"newName2\"\n\ttagEditDetailsInput := models.TagEditDetailsInput{\n\t\tName:        &newName,\n\t\tDescription: &newDescription,\n\t\tAliases:     []string{newAlias},\n\t}\n\tid := createdPrimaryTag.UUID()\n\tmergeSources := []uuid.UUID{createdMergeTag.UUID()}\n\teditInput := models.EditInput{\n\t\tOperation:      models.OperationEnumMerge,\n\t\tID:             &id,\n\t\tMergeSourceIds: mergeSources,\n\t}\n\n\tcreatedMergeEdit, err := s.createTestTagEdit(models.OperationEnumMerge, &tagEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\ts.verifyMergeTagEdit(createdPrimaryTag, tagEditDetailsInput, createdMergeEdit, mergeSources)\n}\n\nfunc (s *tagEditTestRunner) verifyMergeTagEdit(originalTag *tagOutput, input models.TagEditDetailsInput, edit *models.Edit, inputMergeSources []uuid.UUID) {\n\ttagDetails := s.getEditTagDetails(edit)\n\n\ts.verifyEditOperation(models.OperationEnumMerge.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumPending.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumTag.String(), edit)\n\ts.verifyEditApplication(false, edit)\n\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, *input.Name, *tagDetails.Name)\n\tassert.Equal(s.t, *input.Description, *tagDetails.Description)\n\n\ttagAliases := originalTag.Aliases\n\tassert.Equal(s.t, tagAliases, tagDetails.RemovedAliases)\n\tassert.Equal(s.t, input.Aliases, tagDetails.AddedAliases)\n\n\tvar mergeSources []uuid.UUID\n\tmerges, _ := s.resolver.Edit().MergeSources(s.ctx, edit)\n\tfor i := range merges {\n\t\tmerge := merges[i].(*models.Tag)\n\t\tmergeSources = append(mergeSources, merge.ID)\n\t}\n\tassert.Equal(s.t, inputMergeSources, mergeSources)\n}\n\nfunc (s *tagEditTestRunner) testApplyCreateTagEdit() {\n\tname := \"Name\"\n\tdescription := \"Description\"\n\tcategory, err := s.createTestTagCategory(nil)\n\tassert.NoError(s.t, err)\n\n\tcategoryID := category.ID\n\ttagEditDetailsInput := models.TagEditDetailsInput{\n\t\tName:        &name,\n\t\tDescription: &description,\n\t\tAliases:     []string{\"Alias1\"},\n\t\tCategoryID:  &categoryID,\n\t}\n\tedit, err := s.createTestTagEdit(models.OperationEnumCreate, &tagEditDetailsInput, nil)\n\tassert.NoError(s.t, err)\n\n\tappliedEdit, err := s.applyEdit(edit.ID)\n\tassert.NoError(s.t, err)\n\n\ts.verifyAppliedTagCreateEdit(tagEditDetailsInput, appliedEdit)\n}\n\nfunc (s *tagEditTestRunner) verifyAppliedTagCreateEdit(input models.TagEditDetailsInput, edit *models.Edit) {\n\tassert.True(s.t, edit.ID != uuid.Nil, \"Expected created edit id to be non-zero\")\n\n\ts.verifyEditOperation(models.OperationEnumCreate.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumTag.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\ttag := s.getEditTagTarget(edit)\n\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, *input.Name, tag.Name)\n\tassert.Equal(s.t, *input.Description, *tag.Description)\n\n\taliases, err := s.resolver.Tag().Aliases(s.ctx, tag)\n\tassert.NoError(s.t, err)\n\tassert.Equal(s.t, input.Aliases, aliases)\n\n\tassert.Equal(s.t, *input.CategoryID, tag.CategoryID.UUID)\n}\n\nfunc (s *tagEditTestRunner) testApplyModifyTagEdit() {\n\texistingName := \"tagName3\"\n\texistingAlias := \"tagAlias3\"\n\ttagCreateInput := models.TagCreateInput{\n\t\tName:    existingName,\n\t\tAliases: []string{existingAlias},\n\t}\n\tcreatedTag, err := s.createTestTag(&tagCreateInput)\n\tassert.NoError(s.t, err)\n\n\tnewDescription := \"newDescription3\"\n\tnewAlias := \"newTagAlias3\"\n\tnewName := \"newName3\"\n\tnewCategory, err := s.createTestTagCategory(nil)\n\tassert.NoError(s.t, err)\n\n\tnewCategoryID := newCategory.ID\n\ttagEditDetailsInput := models.TagEditDetailsInput{\n\t\tName:        &newName,\n\t\tDescription: &newDescription,\n\t\tAliases:     []string{newAlias},\n\t\tCategoryID:  &newCategoryID,\n\t}\n\tid := createdTag.UUID()\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumModify,\n\t\tID:        &id,\n\t}\n\n\tcreatedUpdateEdit, err := s.createTestTagEdit(models.OperationEnumModify, &tagEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\tappliedEdit, err := s.applyEdit(createdUpdateEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tmodifiedTag, err := s.resolver.Query().FindTag(s.ctx, &id, nil)\n\tassert.NoError(s.t, err)\n\ts.verifyApplyModifyTagEdit(tagEditDetailsInput, modifiedTag, appliedEdit)\n}\n\nfunc (s *tagEditTestRunner) verifyApplyModifyTagEdit(input models.TagEditDetailsInput, updatedTag *models.Tag, edit *models.Edit) {\n\ts.verifyEditOperation(models.OperationEnumModify.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumTag.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, *input.Name, updatedTag.Name)\n\tassert.Equal(s.t, *input.Description, *updatedTag.Description)\n\n\ttagAliases, _ := s.resolver.Tag().Aliases(s.ctx, updatedTag)\n\tassert.Equal(s.t, input.Aliases, tagAliases)\n\n\tassert.True(s.t, updatedTag.CategoryID.Valid && (*input.CategoryID == updatedTag.CategoryID.UUID))\n}\n\nfunc (s *tagEditTestRunner) testApplyDestroyTagEdit() {\n\tcreatedTag, err := s.createTestTag(nil)\n\tassert.NoError(s.t, err)\n\n\ttagID := createdTag.UUID()\n\tsceneInput := models.SceneCreateInput{\n\t\tTagIds: []uuid.UUID{tagID},\n\t\tDate:   \"2020-03-02\",\n\t}\n\tscene, err := s.createTestScene(&sceneInput)\n\tassert.NoError(s.t, err)\n\n\ttagEditDetailsInput := models.TagEditDetailsInput{}\n\teditInput := models.EditInput{\n\t\tOperation: models.OperationEnumDestroy,\n\t\tID:        &tagID,\n\t}\n\tdestroyEdit, err := s.createTestTagEdit(models.OperationEnumDestroy, &tagEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\tappliedEdit, err := s.applyEdit(destroyEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tdestroyedTag, err := s.resolver.Query().FindTag(s.ctx, &tagID, nil)\n\tassert.NoError(s.t, err)\n\n\tscene, err = s.client.findScene(scene.UUID())\n\tassert.NoError(s.t, err, \"Error finding scene\")\n\ts.verifyApplyDestroyTagEdit(destroyedTag, appliedEdit, scene)\n}\n\nfunc (s *tagEditTestRunner) verifyApplyDestroyTagEdit(destroyedTag *models.Tag, edit *models.Edit, scene *sceneOutput) {\n\ts.verifyEditOperation(models.OperationEnumDestroy.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumTag.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\tassert.Equal(s.t, destroyedTag.Deleted, true)\n\n\tsceneTags := scene.Tags\n\tassert.True(s.t, len(sceneTags) == 0)\n}\n\nfunc (s *tagEditTestRunner) testApplyMergeTagEdit() {\n\tmergeSource1, err := s.createTestTag(nil)\n\tassert.NoError(s.t, err)\n\n\tmergeSource2, err := s.createTestTag(nil)\n\tassert.NoError(s.t, err)\n\n\tmergeTarget, err := s.createTestTag(nil)\n\tassert.NoError(s.t, err)\n\n\t// Scene with tag from both source and target, should not cause db unique error\n\tsceneInput := models.SceneCreateInput{\n\t\tTagIds: []uuid.UUID{mergeSource2.UUID(), mergeTarget.UUID()},\n\t\tDate:   \"2020-03-02\",\n\t}\n\tscene1, err := s.createTestScene(&sceneInput)\n\tassert.NoError(s.t, err)\n\n\tsceneInput = models.SceneCreateInput{\n\t\tTagIds: []uuid.UUID{mergeSource1.UUID(), mergeSource2.UUID()},\n\t\tDate:   \"2020-03-02\",\n\t}\n\tscene2, err := s.createTestScene(&sceneInput)\n\tassert.NoError(s.t, err)\n\n\tnewDescription := \"newDescription4\"\n\tnewAlias := \"newTagAlias4\"\n\tnewName := \"newName4\"\n\ttagEditDetailsInput := models.TagEditDetailsInput{\n\t\tName:        &newName,\n\t\tDescription: &newDescription,\n\t\tAliases:     []string{newAlias},\n\t}\n\tid := mergeTarget.UUID()\n\tmergeSources := []uuid.UUID{mergeSource1.UUID(), mergeSource2.UUID()}\n\teditInput := models.EditInput{\n\t\tOperation:      models.OperationEnumMerge,\n\t\tID:             &id,\n\t\tMergeSourceIds: mergeSources,\n\t}\n\n\tmergeEdit, err := s.createTestTagEdit(models.OperationEnumMerge, &tagEditDetailsInput, &editInput)\n\tassert.NoError(s.t, err)\n\n\tappliedMerge, err := s.applyEdit(mergeEdit.ID)\n\tassert.NoError(s.t, err)\n\n\tscene1, err = s.client.findScene(scene1.UUID())\n\tassert.NoError(s.t, err, \"Error finding scene\")\n\n\tscene2, err = s.client.findScene(scene2.UUID())\n\tassert.NoError(s.t, err, \"Error finding scene\")\n\n\ts.verifyAppliedMergeTagEdit(tagEditDetailsInput, appliedMerge, scene1, scene2)\n}\n\nfunc (s *tagEditTestRunner) verifyAppliedMergeTagEdit(input models.TagEditDetailsInput, edit *models.Edit, scene1, scene2 *sceneOutput) {\n\ts.verifyEditOperation(models.OperationEnumMerge.String(), edit)\n\ts.verifyEditStatus(models.VoteStatusEnumImmediateAccepted.String(), edit)\n\ts.verifyEditTargetType(models.TargetTypeEnumTag.String(), edit)\n\ts.verifyEditApplication(true, edit)\n\n\ttagDetails := s.getEditTagDetails(edit)\n\tassert.Equal(s.t, *input.Name, *tagDetails.Name)\n\tassert.Equal(s.t, *input.Description, *tagDetails.Description)\n\n\tassert.Equal(s.t, input.Aliases, tagDetails.AddedAliases)\n\n\tmerges, _ := s.resolver.Edit().MergeSources(s.ctx, edit)\n\tfor i := range merges {\n\t\ttag := merges[i].(*models.Tag)\n\t\tassert.Equal(s.t, tag.Deleted, true)\n\t}\n\n\teditTarget := s.getEditTagTarget(edit)\n\tscene1Tags := scene1.Tags\n\tassert.Equal(s.t, len(scene1Tags), 1)\n\tassert.Equal(s.t, scene1Tags[0].ID, editTarget.ID.String())\n\n\tscene2Tags := scene2.Tags\n\tassert.Equal(s.t, len(scene2Tags), 1)\n\tassert.Equal(s.t, scene2Tags[0].ID, editTarget.ID.String())\n}\n\nfunc (s *tagEditTestRunner) testTagEditUpdate() {\n\t// Create a pending edit\n\tname := \"Original Tag Name\"\n\ttagEditDetailsInput := models.TagEditDetailsInput{\n\t\tName: &name,\n\t}\n\tcreatedEdit, err := s.createTestTagEdit(models.OperationEnumCreate, &tagEditDetailsInput, nil)\n\tassert.NoError(s.t, err)\n\n\t// Update the edit with new details\n\tnewName := \"Updated Tag Name\"\n\tupdatedDetails := models.TagEditDetailsInput{\n\t\tName: &newName,\n\t}\n\n\teditID := createdEdit.ID\n\tupdatedEdit, err := s.resolver.Mutation().TagEditUpdate(s.ctx, createdEdit.ID, models.TagEditInput{\n\t\tEdit:    &models.EditInput{ID: &editID},\n\t\tDetails: &updatedDetails,\n\t})\n\tassert.NoError(s.t, err, \"Error updating tag edit\")\n\n\t// Verify the edit was updated\n\tassert.Equal(s.t, createdEdit.ID, updatedEdit.ID, \"Edit ID should not change\")\n\tassert.NotNil(s.t, updatedEdit, \"Updated edit should not be nil\")\n}\n\nfunc TestCreateTagEdit(t *testing.T) {\n\tpt := createTagEditTestRunner(t)\n\tpt.testCreateTagEdit()\n}\n\nfunc TestModifyTagEdit(t *testing.T) {\n\tpt := createTagEditTestRunner(t)\n\tpt.testModifyTagEdit()\n}\n\nfunc TestDestroyTagEdit(t *testing.T) {\n\tpt := createTagEditTestRunner(t)\n\tpt.testDestroyTagEdit()\n}\n\nfunc TestMergeTagEdit(t *testing.T) {\n\tpt := createTagEditTestRunner(t)\n\tpt.testMergeTagEdit()\n}\n\nfunc TestApplyCreateTagEdit(t *testing.T) {\n\tpt := createTagEditTestRunner(t)\n\tpt.testApplyCreateTagEdit()\n}\n\nfunc TestApplyModifyTagEdit(t *testing.T) {\n\tpt := createTagEditTestRunner(t)\n\tpt.testApplyModifyTagEdit()\n}\n\nfunc TestApplyDestroyTagEdit(t *testing.T) {\n\tpt := createTagEditTestRunner(t)\n\tpt.testApplyDestroyTagEdit()\n}\n\nfunc TestApplyMergeTagEdit(t *testing.T) {\n\tpt := createTagEditTestRunner(t)\n\tpt.testApplyMergeTagEdit()\n}\n\nfunc TestTagEditUpdate(t *testing.T) {\n\tpt := createTagEditTestRunner(t)\n\tpt.testTagEditUpdate()\n}\n"
  },
  {
    "path": "internal/api/tag_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype tagTestRunner struct {\n\ttestRunner\n}\n\nfunc createTagTestRunner(t *testing.T) *tagTestRunner {\n\treturn &tagTestRunner{\n\t\ttestRunner: *asModify(t),\n\t}\n}\n\nfunc (s *tagTestRunner) testCreateTag() {\n\tdescription := \"Description\"\n\n\tinput := models.TagCreateInput{\n\t\tName:        s.generateTagName(),\n\t\tDescription: &description,\n\t}\n\n\ttag, err := s.resolver.Mutation().TagCreate(s.ctx, input)\n\tassert.NoError(s.t, err, \"Error creating tag\")\n\n\ts.verifyCreatedTag(input, tag)\n}\n\nfunc (s *tagTestRunner) verifyCreatedTag(input models.TagCreateInput, tag *models.Tag) {\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, input.Name, tag.Name)\n\n\tassert.True(s.t, tag.ID != uuid.Nil, \"Expected created tag id to be non-zero\")\n\tassert.Equal(s.t, tag.Description, input.Description)\n}\n\nfunc (s *tagTestRunner) testFindTagById() {\n\tcreatedTag, err := s.createTestTag(nil)\n\tassert.NoError(s.t, err)\n\n\ttagID := createdTag.UUID()\n\ttag, err := s.resolver.Query().FindTag(s.ctx, &tagID, nil)\n\tassert.NoError(s.t, err, \"Error finding tag\")\n\n\t// ensure returned tag is not nil\n\tassert.NotNil(s.t, tag, \"Did not find tag by id\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdTag.Name, tag.Name)\n}\n\nfunc (s *tagTestRunner) testFindTagByName() {\n\tcreatedTag, err := s.createTestTag(nil)\n\tassert.NoError(s.t, err)\n\n\ttagName := createdTag.Name\n\n\ttag, err := s.resolver.Query().FindTag(s.ctx, nil, &tagName)\n\tassert.NoError(s.t, err, \"Error finding tag\")\n\n\t// ensure returned tag is not nil\n\tassert.NotNil(s.t, tag, \"Did not find tag by name\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdTag.Name, tag.Name)\n}\n\nfunc (s *tagTestRunner) testUpdateTag() {\n\tcreatedTag, err := s.createTestTag(nil)\n\tassert.NoError(s.t, err)\n\n\ttagID := createdTag.UUID()\n\n\tnewDescription := \"newDescription\"\n\n\tupdateInput := models.TagUpdateInput{\n\t\tID:          tagID,\n\t\tDescription: &newDescription,\n\t}\n\n\tupdatedTag, err := s.resolver.Mutation().TagUpdate(s.ctx, updateInput)\n\tassert.NoError(s.t, err, \"Error updating tag\")\n\n\tupdateInput.Name = &createdTag.Name\n\ts.verifyUpdatedTag(updateInput, updatedTag)\n}\n\nfunc (s *tagTestRunner) verifyUpdatedTag(input models.TagUpdateInput, tag *models.Tag) {\n\t// ensure basic attributes are set correctly\n\tassert.True(s.t, input.Name == nil || (*input.Name == tag.Name))\n\tassert.Equal(s.t, tag.Description, input.Description)\n}\n\nfunc (s *tagTestRunner) testDestroyTag() {\n\tcreatedTag, err := s.createTestTag(nil)\n\tassert.NoError(s.t, err)\n\n\ttagID := createdTag.UUID()\n\n\tdestroyed, err := s.resolver.Mutation().TagDestroy(s.ctx, models.TagDestroyInput{\n\t\tID: tagID,\n\t})\n\tassert.NoError(s.t, err, \"Error destroying tag\")\n\n\tassert.True(s.t, destroyed, \"Tag was not destroyed\")\n\n\t// ensure cannot find tag\n\tfoundTag, err := s.resolver.Query().FindTag(s.ctx, &tagID, nil)\n\tassert.NoError(s.t, err, \"Error finding tag after destroying\")\n\n\tassert.Nil(s.t, foundTag, \"Found tag after destruction\")\n\n\t// TODO - ensure scene was not removed\n}\n\nfunc (s *tagTestRunner) testQueryTags() {\n\t// Create test tags\n\tname1 := s.generateTagName()\n\ttag1, err := s.createTestTag(&models.TagCreateInput{\n\t\tName: name1,\n\t})\n\tassert.NoError(s.t, err)\n\n\tname2 := s.generateTagName()\n\ttag2, err := s.createTestTag(&models.TagCreateInput{\n\t\tName: name2,\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Test basic query\n\tresult, err := s.client.queryTags(models.TagQueryInput{\n\t\tPage:      1,\n\t\tPerPage:   100,\n\t\tDirection: models.SortDirectionEnumAsc,\n\t\tSort:      models.TagSortEnumName,\n\t})\n\tassert.NoError(s.t, err, \"Error querying tags\")\n\n\t// Ensure we have at least the tags we created\n\tassert.True(s.t, result.Count >= 2, \"Expected at least 2 tags in count\")\n\tassert.True(s.t, len(result.Tags) >= 2, \"Expected at least 2 tags in results\")\n\n\t// Debug: check tag IDs\n\ts.t.Logf(\"Looking for tag1 ID: %s, tag2 ID: %s\", tag1.ID, tag2.ID)\n\ts.t.Logf(\"Query returned %d tags\", len(result.Tags))\n\n\t// Verify our created tags are in the results\n\tfound1 := false\n\tfound2 := false\n\tfor _, tag := range result.Tags {\n\t\tif tag.ID == tag1.ID {\n\t\t\tfound1 = true\n\t\t\tassert.Equal(s.t, name1, tag.Name)\n\t\t}\n\t\tif tag.ID == tag2.ID {\n\t\t\tfound2 = true\n\t\t\tassert.Equal(s.t, name2, tag.Name)\n\t\t}\n\t}\n\n\tassert.True(s.t, found1, \"Created tag 1 not found in query results\")\n\tassert.True(s.t, found2, \"Created tag 2 not found in query results\")\n}\n\nfunc (s *tagTestRunner) testFindTagOrAlias() {\n\t// Create a tag with aliases\n\ttagName := s.generateTagName()\n\talias1 := \"alias1-\" + tagName\n\talias2 := \"alias2-\" + tagName\n\n\ttag, err := s.createTestTag(&models.TagCreateInput{\n\t\tName:    tagName,\n\t\tAliases: []string{alias1, alias2},\n\t})\n\tassert.NoError(s.t, err)\n\n\t// Test finding by name\n\tfoundByName, err := s.client.findTagOrAlias(tagName)\n\tassert.NoError(s.t, err, \"Error finding tag by name\")\n\tassert.NotNil(s.t, foundByName, \"Did not find tag by name\")\n\tassert.Equal(s.t, tag.ID, foundByName.ID)\n\n\t// Test finding by alias\n\tfoundByAlias, err := s.client.findTagOrAlias(alias1)\n\tassert.NoError(s.t, err, \"Error finding tag by alias\")\n\tassert.NotNil(s.t, foundByAlias, \"Did not find tag by alias\")\n\tassert.Equal(s.t, tag.ID, foundByAlias.ID)\n\n\t// Test not finding non-existent tag/alias\n\tnotFound, err := s.client.findTagOrAlias(\"non-existent-tag-12345\")\n\tassert.NoError(s.t, err, \"Error finding non-existent tag\")\n\tassert.Nil(s.t, notFound, \"Found tag that shouldn't exist\")\n}\n\nfunc TestCreateTag(t *testing.T) {\n\tpt := createTagTestRunner(t)\n\tpt.testCreateTag()\n}\n\nfunc TestFindTagById(t *testing.T) {\n\tpt := createTagTestRunner(t)\n\tpt.testFindTagById()\n}\n\nfunc TestFindTagByName(t *testing.T) {\n\tpt := createTagTestRunner(t)\n\tpt.testFindTagByName()\n}\n\nfunc TestUpdateTag(t *testing.T) {\n\tpt := createTagTestRunner(t)\n\tpt.testUpdateTag()\n}\n\nfunc TestDestroyTag(t *testing.T) {\n\tpt := createTagTestRunner(t)\n\tpt.testDestroyTag()\n}\n\nfunc TestQueryTags(t *testing.T) {\n\tpt := createTagTestRunner(t)\n\tpt.testQueryTags()\n}\n\nfunc TestFindTagOrAlias(t *testing.T) {\n\tpt := createTagTestRunner(t)\n\tpt.testFindTagOrAlias()\n}\n"
  },
  {
    "path": "internal/api/user_integration_test.go",
    "content": "//go:build integration\n\npackage api_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype userTestRunner struct {\n\ttestRunner\n}\n\nfunc createUserTestRunner(t *testing.T) *userTestRunner {\n\treturn &userTestRunner{\n\t\ttestRunner: *asAdmin(t),\n\t}\n}\n\nfunc (s *userTestRunner) testCreateUser() {\n\tname := s.generateUserName()\n\tinput := models.UserCreateInput{\n\t\tName:     name,\n\t\tPassword: \"password\" + name,\n\t\tEmail:    name + \"@example.com\",\n\t\tRoles: []models.RoleEnum{\n\t\t\tmodels.RoleEnumAdmin,\n\t\t},\n\t}\n\n\tuser, err := s.resolver.Mutation().UserCreate(s.ctx, input)\n\tassert.NoError(s.t, err, \"Error creating user\")\n\n\ts.verifyCreatedUser(input, user)\n}\n\nfunc (s *userTestRunner) verifyCreatedUser(input models.UserCreateInput, user *models.User) {\n\t// ensure basic attributes are set correctly\n\tassert.Equal(s.t, input.Name, user.Name)\n\tassert.Equal(s.t, input.Email, user.Email)\n\n\t// ensure apikey is set\n\tassert.True(s.t, user.APIKey != \"\", \"API key was not generated\")\n\tassert.True(s.t, user.PasswordHash != \"\", \"Password was not set\")\n\tassert.True(s.t, user.ID != uuid.Nil, \"Expected created user id to be non-zero\")\n\n\t// TODO - ensure roles are set\n\n}\n\nfunc (s *userTestRunner) testFindUserById() {\n\tcreatedUser, err := s.createTestUser(nil, nil)\n\tassert.NoError(s.t, err)\n\n\tuser, err := s.resolver.Query().FindUser(s.ctx, &createdUser.ID, nil)\n\tassert.NoError(s.t, err, \"Error finding user\")\n\n\t// ensure returned user is not nil\n\tassert.NotNil(s.t, user, \"Did not find user by id\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdUser.Name, user.Name)\n}\n\nfunc (s *userTestRunner) testFindUserByName() {\n\tcreatedUser, err := s.createTestUser(nil, nil)\n\tassert.NoError(s.t, err)\n\n\tuserName := createdUser.Name\n\tuser, err := s.resolver.Query().FindUser(s.ctx, nil, &userName)\n\tassert.NoError(s.t, err, \"Error finding user\")\n\n\t// ensure returned user is not nil\n\tassert.NotNil(s.t, user, \"Did not find user by name\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdUser.Name, user.Name)\n}\n\nfunc (s *userTestRunner) testQueryUserByName() {\n\tcreatedUser, err := s.createTestUser(nil, nil)\n\tassert.NoError(s.t, err)\n\n\tuserName := createdUser.Name\n\n\tinput := models.UserQueryInput{\n\t\tName:    &userName,\n\t\tPage:    1,\n\t\tPerPage: 1,\n\t}\n\n\tresult, err := s.resolver.Query().QueryUsers(s.ctx, input)\n\tassert.NoError(s.t, err, \"Error querying user\")\n\n\t// ensure one result was returned\n\tassert.Equal(s.t, result.Count, 1, \"Expected 1 user\")\n\n\t// ensure values were set\n\tassert.Equal(s.t, createdUser.Name, result.Users[0].Name)\n}\n\nfunc (s *userTestRunner) testUpdateUserName() {\n\tname := s.generateUserName()\n\tinput := &models.UserCreateInput{\n\t\tName:     name,\n\t\tEmail:    name + \"@example.com\",\n\t\tPassword: \"password\" + name,\n\t}\n\n\tcreatedUser, err := s.createTestUser(input, nil)\n\tassert.NoError(s.t, err)\n\n\tuserID := createdUser.ID\n\n\tupdatedName := s.generateUserName()\n\tupdateInput := models.UserUpdateInput{\n\t\tID:   userID,\n\t\tName: &updatedName,\n\t}\n\n\t// need some mocking of the context to make the field ignore behaviour work\n\tctx := s.updateContext([]string{\n\t\t\"name\",\n\t})\n\tupdatedUser, err := s.resolver.Mutation().UserUpdate(ctx, updateInput)\n\tassert.NoError(s.t, err, \"Error updating user\")\n\n\tinput.Name = updatedName\n\ts.verifyCreatedUser(*input, updatedUser)\n}\n\nfunc (s *userTestRunner) testUpdatePassword() {\n\tname := s.generateUserName()\n\tinput := &models.UserCreateInput{\n\t\tName:     name,\n\t\tEmail:    name + \"@example.com\",\n\t\tPassword: \"password\" + name,\n\t}\n\n\tcreatedUser, err := s.createTestUser(input, nil)\n\tassert.NoError(s.t, err)\n\n\tuserID := createdUser.ID\n\toldPassword := createdUser.PasswordHash\n\n\tupdatedPassword := s.generateUserName() + \"newpassword\"\n\tupdateInput := models.UserUpdateInput{\n\t\tID:       userID,\n\t\tPassword: &updatedPassword,\n\t}\n\n\t// need some mocking of the context to make the field ignore behaviour work\n\tctx := s.updateContext([]string{\n\t\t\"password\",\n\t})\n\tupdatedUser, err := s.resolver.Mutation().UserUpdate(ctx, updateInput)\n\tassert.NoError(s.t, err, \"Error updating user\")\n\n\t// ensure password is set\n\tassert.True(s.t, updatedUser.PasswordHash != \"\", \"Password was not set\")\n\tassert.True(s.t, updatedUser.PasswordHash != oldPassword, \"Password was not changed\")\n}\n\nfunc (s *userTestRunner) verifyUpdatedUser(input models.UserUpdateInput, user *models.User) {\n\t// ensure basic attributes are set correctly\n\tassert.True(s.t, input.Name == nil || *input.Name == user.Name)\n}\n\nfunc (s *userTestRunner) testDestroyUser() {\n\tcreatedUser, err := s.createTestUser(nil, nil)\n\tassert.NoError(s.t, err)\n\n\tuserID := createdUser.ID\n\n\tdestroyed, err := s.resolver.Mutation().UserDestroy(s.ctx, models.UserDestroyInput{\n\t\tID: userID,\n\t})\n\tassert.NoError(s.t, err, \"Error destroying user\")\n\n\tassert.True(s.t, destroyed, \"User was not destroyed\")\n\n\t// ensure cannot find user\n\tfoundUser, err := s.resolver.Query().FindUser(s.ctx, &userID, nil)\n\tassert.NoError(s.t, err, \"Error finding user after destroying\")\n\n\tassert.Nil(s.t, foundUser, \"Found user after destruction\")\n}\n\nfunc (s *userTestRunner) testUserQuery() {\n\tuserName := userDB.admin.Name\n\n\tinput := models.UserQueryInput{\n\t\tName:    &userName,\n\t\tPage:    1,\n\t\tPerPage: 1,\n\t}\n\n\tusers, err := s.resolver.Query().QueryUsers(s.ctx, input)\n\tassert.NoError(s.t, err)\n\n\tassert.Equal(s.t, len(users.Users), 1, \"QueryUsers: admin user not found\")\n}\n\nfunc (s *userTestRunner) testChangePassword() {\n\tname := s.generateUserName()\n\toldPassword := \"password\" + name\n\tinput := &models.UserCreateInput{\n\t\tName:     name,\n\t\tEmail:    name + \"@example.com\",\n\t\tPassword: oldPassword,\n\t}\n\n\tcreatedUser, err := s.createTestUser(input, nil)\n\tassert.NoError(s.t, err)\n\n\t// change password as the test user\n\tctx := context.TODO()\n\tctx = context.WithValue(ctx, auth.ContextUser, createdUser)\n\n\tupdatedPassword := name + \"newpassword\"\n\texistingPassword := \"incorrect password\"\n\tupdateInput := models.UserChangePasswordInput{\n\t\tExistingPassword: &existingPassword,\n\t\tNewPassword:      updatedPassword,\n\t}\n\n\t_, err = s.resolver.Mutation().ChangePassword(ctx, updateInput)\n\tassert.Error(s.t, err, \"current password incorrect\", \"Expected error for incorrect current password\")\n\n\tupdateInput.ExistingPassword = &oldPassword\n\tupdateInput.NewPassword = \"aaa\"\n\n\t_, err = s.resolver.Mutation().ChangePassword(ctx, updateInput)\n\tassert.Error(s.t, err, \"password length < 8\", \"Expected error for invalid new password\")\n\n\tupdateInput.NewPassword = updatedPassword\n\t_, err = s.resolver.Mutation().ChangePassword(ctx, updateInput)\n\tassert.NoError(s.t, err, \"Error changing password\")\n}\n\nfunc (s *userTestRunner) testRegenerateAPIKey() {\n\tname := s.generateUserName()\n\tinput := &models.UserCreateInput{\n\t\tName:     name,\n\t\tEmail:    name + \"@example.com\",\n\t\tPassword: \"password\" + name,\n\t}\n\n\tcreatedUser, err := s.createTestUser(input, nil)\n\tassert.NoError(s.t, err)\n\n\toldKey := createdUser.APIKey\n\n\t// regenerate as the test user\n\tctx := context.TODO()\n\tctx = context.WithValue(ctx, auth.ContextUser, createdUser)\n\n\tadminID := userDB.admin.ID\n\t_, err = s.resolver.Mutation().RegenerateAPIKey(ctx, &adminID)\n\tassert.Error(s.t, err, \"not authorized\", \"Expected error for changing other user API key\")\n\n\t// wait one second before regenerating to ensure a new key is created\n\ttime.Sleep(1 * time.Second)\n\tnewKey, err := s.resolver.Mutation().RegenerateAPIKey(ctx, nil)\n\tassert.NoError(s.t, err, \"Error regenerating API key\")\n\n\tassert.True(s.t, newKey != \"\", \"Regenerated API key is empty\")\n\n\tassert.True(s.t, newKey != oldKey, \"Regenerated API key is same as old key\")\n\n\tuserID := createdUser.ID\n\tuser, err := s.resolver.Query().FindUser(s.ctx, &userID, nil)\n\tassert.NoError(s.t, err, \"Error finding user\")\n\n\tassert.Equal(s.t, user.APIKey, newKey, \"Returned API key s is different to stored key\")\n}\n\nfunc (s *userTestRunner) testUserEditQuery() {\n\tcreatedUser, err := s.createTestUser(nil, nil)\n\tassert.NoError(s.t, err)\n\n\tuserID := createdUser.ID\n\tfilter := models.EditQueryInput{\n\t\tUserID: &userID,\n\t}\n\t_, err = s.resolver.Query().QueryEdits(s.ctx, filter)\n\tassert.NoError(s.t, err, \"Error finding user edits\")\n\n\t// TODO: Test edits are returned\n}\n\nfunc TestCreateUser(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testCreateUser()\n}\n\nfunc TestFindUserById(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testFindUserById()\n}\n\nfunc TestFindUserByName(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testFindUserByName()\n}\n\nfunc TestQueryUserByName(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testQueryUserByName()\n}\n\nfunc TestUpdateUserName(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testUpdateUserName()\n}\n\nfunc TestUpdateUserPassword(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testUpdatePassword()\n}\n\nfunc TestDestroyUser(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testDestroyUser()\n}\n\nfunc TestUserQuery(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testUserQuery()\n}\n\nfunc TestChangePassword(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testChangePassword()\n}\n\nfunc TestRegenerateAPIKey(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testRegenerateAPIKey()\n}\n\nfunc TestUserEditQuery(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testUserEditQuery()\n}\n\nfunc (s *userTestRunner) testMeQuery() {\n\t// Test me query returns current authenticated user\n\tme, err := s.client.me()\n\tassert.NoError(s.t, err, \"Error getting current user\")\n\n\tassert.NotNil(s.t, me, \"me query returned nil\")\n\tassert.Equal(s.t, userDB.admin.ID.String(), me.ID, \"me query returned wrong user\")\n\tassert.Equal(s.t, userDB.admin.Name, me.Name, \"me query returned wrong user name\")\n}\n\nfunc (s *userTestRunner) testFavoritePerformer() {\n\t// Create a test performer\n\tperformer, err := s.createTestPerformer(nil)\n\tassert.NoError(s.t, err)\n\n\tperformerID := performer.UUID()\n\n\t// Favorite the performer\n\tresult, err := s.client.favoritePerformer(performerID, true)\n\tassert.NoError(s.t, err, \"Error favoriting performer\")\n\tassert.True(s.t, result, \"Expected favoritePerformer to return true\")\n\n\t// Unfavorite the performer\n\tresult, err = s.client.favoritePerformer(performerID, false)\n\tassert.NoError(s.t, err, \"Error unfavoriting performer\")\n\tassert.True(s.t, result, \"Expected favoritePerformer to return true\")\n}\n\nfunc (s *userTestRunner) testFavoriteStudio() {\n\t// Create a test studio\n\tstudio, err := s.createTestStudio(nil)\n\tassert.NoError(s.t, err)\n\n\tstudioID := studio.UUID()\n\n\t// Favorite the studio\n\tresult, err := s.client.favoriteStudio(studioID, true)\n\tassert.NoError(s.t, err, \"Error favoriting studio\")\n\tassert.True(s.t, result, \"Expected favoriteStudio to return true\")\n\n\t// Unfavorite the studio\n\tresult, err = s.client.favoriteStudio(studioID, false)\n\tassert.NoError(s.t, err, \"Error unfavoriting studio\")\n\tassert.True(s.t, result, \"Expected favoriteStudio to return true\")\n}\n\nfunc TestMeQuery(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testMeQuery()\n}\n\nfunc TestFavoritePerformer(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testFavoritePerformer()\n}\n\nfunc TestFavoriteStudio(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testFavoriteStudio()\n}\n\nfunc (s *userTestRunner) testQueryNotifications() {\n\tinput := models.QueryNotificationsInput{\n\t\tPage:    1,\n\t\tPerPage: 25,\n\t}\n\n\tresult, err := s.client.queryNotifications(input)\n\tassert.NoError(s.t, err, \"Error querying notifications\")\n\tassert.NotNil(s.t, result, \"Result should not be nil\")\n\tassert.NotNil(s.t, result.Notifications, \"Notifications should not be nil\")\n}\n\nfunc (s *userTestRunner) testGetUnreadNotificationCount() {\n\tcount, err := s.client.getUnreadNotificationCount()\n\tassert.NoError(s.t, err, \"Error getting unread notification count\")\n\tassert.True(s.t, count >= 0, \"Count should be non-negative\")\n}\n\nfunc (s *userTestRunner) testUpdateNotificationSubscriptions() {\n\tsubscriptions := []models.NotificationEnum{\n\t\tmodels.NotificationEnumFavoritePerformerScene,\n\t\tmodels.NotificationEnumFavoriteStudioScene,\n\t}\n\n\tresult, err := s.client.updateNotificationSubscriptions(subscriptions)\n\tassert.NoError(s.t, err, \"Error updating notification subscriptions\")\n\tassert.True(s.t, result, \"Update should return true\")\n}\n\nfunc TestQueryNotifications(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testQueryNotifications()\n}\n\nfunc TestGetUnreadNotificationCount(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testGetUnreadNotificationCount()\n}\n\nfunc TestUpdateNotificationSubscriptions(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testUpdateNotificationSubscriptions()\n}\n\nfunc (s *userTestRunner) testNewUser() {\n\t// Grant invite tokens to the admin user\n\tadminID := userDB.admin.ID\n\t_, err := s.resolver.Mutation().GrantInvite(s.ctx, models.GrantInviteInput{\n\t\tUserID: adminID,\n\t\tAmount: 10,\n\t})\n\tassert.NoError(s.t, err, \"Error granting invite tokens\")\n\n\t// Generate an invite key if required\n\tinviteKey, err := s.resolver.Mutation().GenerateInviteCode(s.ctx)\n\tassert.NoError(s.t, err, \"Error generating invite key\")\n\n\t// Test 1: NewUser with valid email should succeed\n\temail := \"newuser@example.com\"\n\tinput := models.NewUserInput{\n\t\tEmail:     email,\n\t\tInviteKey: inviteKey,\n\t}\n\n\tactivationKey, err := s.resolver.Mutation().NewUser(s.ctx, input)\n\tassert.NoError(s.t, err, \"Error calling NewUser with valid email\")\n\tassert.NotNil(s.t, activationKey, \"Activation key should not be nil\")\n\n\t// Test 2: NewUser with same email should fail (pending activation exists)\n\tinviteKey2, err := s.resolver.Mutation().GenerateInviteCode(s.ctx)\n\tassert.NoError(s.t, err, \"Error generating second invite key\")\n\n\tinput.InviteKey = inviteKey2\n\t_, err = s.resolver.Mutation().NewUser(s.ctx, input)\n\tassert.Error(s.t, err, \"Expected error when email has pending activation\")\n\tassert.Contains(s.t, err.Error(), \"email already has a pending activation\", \"Error should mention pending activation\")\n\n\t// Test 3: NewUser with existing user email should fail\n\tinviteKey3, err := s.resolver.Mutation().GenerateInviteCode(s.ctx)\n\tassert.NoError(s.t, err, \"Error generating third invite key\")\n\n\texistingEmail := userDB.admin.Email\n\tinput2 := models.NewUserInput{\n\t\tEmail:     existingEmail,\n\t\tInviteKey: inviteKey3,\n\t}\n\n\t_, err = s.resolver.Mutation().NewUser(s.ctx, input2)\n\tassert.Error(s.t, err, \"Expected error when email already in use\")\n\tassert.Contains(s.t, err.Error(), \"email already in use\", \"Error should mention email already in use\")\n}\n\nfunc TestNewUser(t *testing.T) {\n\tpt := createUserTestRunner(t)\n\tpt.testNewUser()\n}\n"
  },
  {
    "path": "internal/api/utils.go",
    "content": "package api\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc parseUUID(id string) uuid.UUID {\n\ttrimmed := strings.TrimSpace(id)\n\treturn uuid.FromStringOrNil(trimmed)\n}\n\nfunc resolveFuzzyDate(date *string) *models.FuzzyDate {\n\tif date == nil {\n\t\treturn nil\n\t}\n\n\tswitch {\n\tcase len(*date) == 4:\n\t\treturn &models.FuzzyDate{\n\t\t\tAccuracy: models.DateAccuracyEnumYear,\n\t\t\tDate:     fmt.Sprintf(\"%s-01-01\", *date),\n\t\t}\n\tcase len(*date) == 7:\n\t\treturn &models.FuzzyDate{\n\t\t\tAccuracy: models.DateAccuracyEnumMonth,\n\t\t\tDate:     fmt.Sprintf(\"%s-01\", *date),\n\t\t}\n\tcase len(*date) == 10:\n\t\treturn &models.FuzzyDate{\n\t\t\tAccuracy: models.DateAccuracyEnumDay,\n\t\t\tDate:     *date,\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "internal/auth/authorization.go",
    "content": "package auth\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype key int\n\nconst (\n\tContextUser key = iota\n\tContextRoles\n)\n\nconst APIKeyHeader = \"ApiKey\"\n\nvar ErrUnauthorized = errors.New(\"not authorized\")\n\nfunc GetCurrentUser(ctx context.Context) *models.User {\n\tuserCtxVal := ctx.Value(ContextUser)\n\tif userCtxVal != nil {\n\t\tcurrentUser := userCtxVal.(*models.User)\n\t\treturn currentUser\n\t}\n\n\treturn nil\n}\n\nfunc IsRole(ctx context.Context, requiredRole models.RoleEnum) bool {\n\tvar roles []models.RoleEnum\n\n\troleCtxVal := ctx.Value(ContextRoles)\n\tif roleCtxVal != nil {\n\t\troles = roleCtxVal.([]models.RoleEnum)\n\t}\n\n\tvalid := false\n\n\tfor _, role := range roles {\n\t\tif role.Implies(requiredRole) {\n\t\t\tvalid = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn valid\n}\n\nfunc ValidateRole(ctx context.Context, requiredRole models.RoleEnum) error {\n\tif !IsRole(ctx, requiredRole) {\n\t\treturn ErrUnauthorized\n\t}\n\n\treturn nil\n}\n\nfunc ValidateInvite(ctx context.Context) error {\n\treturn ValidateRole(ctx, models.RoleEnumInvite)\n}\n\nfunc ValidateManageInvites(ctx context.Context) error {\n\treturn ValidateRole(ctx, models.RoleEnumManageInvites)\n}\n\nfunc ValidateAdmin(ctx context.Context) error {\n\treturn ValidateRole(ctx, models.RoleEnumAdmin)\n}\n\nfunc ValidateOwner(ctx context.Context, userID uuid.UUID) error {\n\tuser := GetCurrentUser(ctx)\n\tif user != nil && user.ID == userID {\n\t\treturn nil\n\t}\n\n\treturn ErrUnauthorized\n}\n\nfunc ValidateUserOrAdmin(ctx context.Context, userID uuid.UUID) error {\n\tif err := ValidateOwner(ctx, userID); err == nil {\n\t\treturn nil\n\t}\n\treturn ValidateRole(ctx, models.RoleEnumAdmin)\n}\n\nfunc ValidateBot(ctx context.Context) error {\n\treturn ValidateRole(ctx, models.RoleEnumBot)\n}\n"
  },
  {
    "path": "internal/autocert/autocert.go",
    "content": "package autocert\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"encoding/pem\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"golang.org/x/crypto/acme/autocert\"\n\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/pkg/logger\"\n)\n\nvar manager *autocert.Manager\nvar domain string\n\n// Init initializes autocert if configured and returns the TLS config.\n// Returns nil if autocert is not enabled.\nfunc Init() *tls.Config {\n\tcfg := config.GetAutocertConfig()\n\tif cfg == nil {\n\t\treturn nil\n\t}\n\n\tcache := autocert.DirCache(cfg.CacheDir)\n\tdomain = cfg.Domain\n\n\tmanager = &autocert.Manager{\n\t\tPrompt:     autocert.AcceptTOS,\n\t\tHostPolicy: autocert.HostWhitelist(domain),\n\t\tCache:      cache,\n\t\tEmail:      cfg.Email,\n\t}\n\n\t// Obtain certificate on startup\n\tgo checkAndRenew()\n\n\ttlsConfig := manager.TLSConfig()\n\ttlsConfig.MinVersion = tls.VersionTLS12\n\n\treturn tlsConfig\n}\n\n// HTTPHandler returns the autocert HTTP handler for ACME challenges.\n// The fallback handler is used for non-ACME requests.\nfunc HTTPHandler(fallback http.Handler) http.Handler {\n\tif manager == nil {\n\t\treturn fallback\n\t}\n\treturn manager.HTTPHandler(fallback)\n}\n\n// CheckAndRenew checks the certificate and renews if needed.\n// Called by cron job.\nfunc CheckAndRenew() {\n\tif manager == nil {\n\t\treturn\n\t}\n\tcheckAndRenew()\n}\n\nfunc checkAndRenew() {\n\t// Check cache first\n\tif data, err := manager.Cache.Get(context.Background(), domain); err == nil {\n\t\tif block, _ := pem.Decode(data); block != nil {\n\t\t\tif cert, err := x509.ParseCertificate(block.Bytes); err == nil {\n\t\t\t\tnow := time.Now()\n\t\t\t\tdaysUntilExpiry := int(cert.NotAfter.Sub(now).Hours() / 24)\n\n\t\t\t\tswitch {\n\t\t\t\tcase now.After(cert.NotAfter):\n\t\t\t\t\tlogger.Warnf(\"Autocert: certificate for %s has expired, renewing...\", domain)\n\t\t\t\tcase daysUntilExpiry <= 30:\n\t\t\t\t\tlogger.Infof(\"Autocert: certificate for %s expires in %d days, renewing...\", domain, daysUntilExpiry)\n\t\t\t\tdefault:\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tlogger.Infof(\"Autocert: obtaining certificate for %s from Let's Encrypt...\", domain)\n\t}\n\n\t// Trigger certificate acquisition/renewal\n\thello := &tls.ClientHelloInfo{ServerName: domain}\n\tcert, err := manager.GetCertificate(hello)\n\tif err != nil {\n\t\tlogger.Errorf(\"Autocert: failed to obtain certificate for %s: %v\", domain, err)\n\t\treturn\n\t}\n\n\tif cert != nil && len(cert.Certificate) > 0 {\n\t\tif x509Cert, parseErr := x509.ParseCertificate(cert.Certificate[0]); parseErr == nil {\n\t\t\tdaysUntilExpiry := int(time.Until(x509Cert.NotAfter).Hours() / 24)\n\t\t\tlogger.Infof(\"Autocert: obtained certificate for %s (expires %s, %d days remaining)\", domain, x509Cert.NotAfter.Format(\"2006-01-02\"), daysUntilExpiry)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "internal/config/config.go",
    "content": "package config\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t\"github.com/spf13/viper\"\n\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\ntype S3Config struct {\n\tEndpoint      string            `mapstructure:\"endpoint\"`\n\tBucket        string            `mapstructure:\"bucket\"`\n\tAccessKey     string            `mapstructure:\"access_key\"`\n\tSecret        string            `mapstructure:\"secret\"`\n\tMaxDimension  int               `mapstructure:\"max_dimension\"`\n\tUploadHeaders map[string]string `mapstructure:\"upload_headers\"`\n}\n\ntype PostgresConfig struct {\n\tMaxOpenConns    int `mapstructure:\"max_open_conns\"`\n\tMaxIdleConns    int `mapstructure:\"max_idle_conns\"`\n\tConnMaxLifetime int `mapstructure:\"conn_max_lifetime\"`\n}\n\ntype OTelConfig struct {\n\tEndpoint   string  `mapstructure:\"endpoint\"`\n\tTraceRatio float64 `mapstructure:\"trace_ratio\"`\n}\n\ntype ImageResizeConfig struct {\n\tEnabled   bool   `mapstructure:\"enabled\"`\n\tCachePath string `mapstructure:\"cache_path\"`\n\tMinSize   int    `mapstructure:\"min_size\"`\n}\n\ntype AutocertConfig struct {\n\tEnabled  bool   `mapstructure:\"enabled\"`\n\tDomain   string `mapstructure:\"domain\"`\n\tEmail    string `mapstructure:\"email\"`\n\tCacheDir string `mapstructure:\"cache_dir\"`\n}\n\ntype config struct {\n\tHost         string `mapstructure:\"host\"`\n\tPort         int    `mapstructure:\"port\"`\n\tDatabase     string `mapstructure:\"database\"`\n\tProfilerPort int    `mapstructure:\"profiler_port\"`\n\n\tHTTPUpgrade  bool `mapstructure:\"http_upgrade\"`\n\tIsProduction bool `mapstructure:\"is_production\"`\n\n\t// Key used to sign JWT tokens\n\tJWTSignKey string `mapstructure:\"jwt_secret_key\"`\n\t// Key used for session store\n\tSessionStoreKey string `mapstructure:\"session_store_key\"`\n\n\t// Invite settings\n\tRequireInvite     bool     `mapstructure:\"require_invite\"`\n\tRequireActivation bool     `mapstructure:\"require_activation\"`\n\tActivationExpiry  int      `mapstructure:\"activation_expiry\"`\n\tEmailCooldown     int      `mapstructure:\"email_cooldown\"`\n\tDefaultUserRoles  []string `mapstructure:\"default_user_roles\"`\n\n\t// URL link for contributor guidelines for submitting edits\n\tGuidelinesURL string `mapstructure:\"guidelines_url\"`\n\t// Number of approved edits before user automatically gets VOTE role\n\tVotePromotionThreshold int `mapstructure:\"vote_promotion_threshold\"`\n\t// Number of positive votes required for immediate approval\n\tVoteApplicationThreshold int `mapstructure:\"vote_application_threshold\"`\n\t// Duration, in seconds, of the voting period\n\tVotingPeriod int `mapstructure:\"voting_period\"`\n\t// Duration, in seconds, of the minimum voting period for destructive edits\n\tMinDestructiveVotingPeriod int `mapstructure:\"min_destructive_voting_period\"`\n\t// Interval between checks for completed voting periods\n\tVoteCronInterval string `mapstructure:\"vote_cron_interval\"`\n\t// Number of times an edit can be updated by the creator\n\tEditUpdateLimit int `mapstructure:\"edit_update_limit\"`\n\t// Require all scene create edits to be submitted via drafts\n\tRequireSceneDraft bool `mapstructure:\"require_scene_draft\"`\n\t// Require the TagRole or Admin to edit tags\n\tRequireTagRole bool `mapstructure:\"require_tag_role\"`\n\n\t// Email settings\n\tEmailHost string `mapstructure:\"email_host\"`\n\tEmailPort int    `mapstructure:\"email_port\"`\n\tEmailUser string `mapstructure:\"email_user\"`\n\tEmailPW   string `mapstructure:\"email_password\"`\n\tEmailFrom string `mapstructure:\"email_from\"`\n\tHostURL   string `mapstructure:\"host_url\"`\n\n\t// Image storage settings\n\tImageLocation    string `mapstructure:\"image_location\"`\n\tImageBackend     string `mapstructure:\"image_backend\"`\n\tFaviconPath      string `mapstructure:\"favicon_path\"`\n\tImageMaxSize     int    `mapstructure:\"image_max_size\"`\n\tImageJpegQuality int    `mapstructure:\"image_jpeg_quality\"`\n\n\t// Logging options\n\tLogFile     string `mapstructure:\"logFile\"`\n\tUserLogFile string `mapstructure:\"userLogFile\"`\n\tLogOut      bool   `mapstructure:\"logOut\"`\n\tLogLevel    string `mapstructure:\"logLevel\"`\n\n\tS3 struct {\n\t\tS3Config `mapstructure:\",squash\"`\n\t}\n\n\tPostgres struct {\n\t\tPostgresConfig `mapstructure:\",squash\"`\n\t}\n\n\tOTel struct {\n\t\tOTelConfig `mapstructure:\",squash\"`\n\t}\n\n\t// revive:disable-next-line\n\tImage_Resizing struct {\n\t\tImageResizeConfig `mapstructure:\",squash\"`\n\t}\n\n\tAutocert struct {\n\t\tAutocertConfig `mapstructure:\",squash\"`\n\t}\n\n\tPHashDistance int `mapstructure:\"phash_distance\"`\n\n\tTitle string `mapstructure:\"title\"`\n\n\tDraftTimeLimit int `mapstructure:\"draft_time_limit\"`\n\n\t// Number of days to retain mod audit logs (0 to disable logging)\n\tModAuditRetentionDays int `mapstructure:\"mod_audit_retention_days\"`\n\n\tCSP string `mapstructure:\"csp\"`\n}\n\nvar JWTSignKey = \"jwt_secret_key\"\nvar SessionStoreKey = \"session_store_key\"\nvar Database = \"database\"\n\ntype ImageBackendType string\n\nconst (\n\tFileBackend ImageBackendType = \"file\"\n\tS3Backend   ImageBackendType = \"s3\"\n)\n\nvar defaultUserRoles = []string{\"READ\", \"VOTE\", \"EDIT\"}\nvar C = &config{\n\tRequireInvite:              true,\n\tRequireActivation:          false,\n\tActivationExpiry:           2 * 60 * 60,\n\tEmailCooldown:              5 * 60,\n\tEmailPort:                  25,\n\tImageBackend:               string(FileBackend),\n\tPHashDistance:              0,\n\tVoteApplicationThreshold:   3,\n\tVotePromotionThreshold:     10,\n\tVoteCronInterval:           \"5m\",\n\tVotingPeriod:               345600,\n\tMinDestructiveVotingPeriod: 172800,\n\tDraftTimeLimit:             86400,\n\tEditUpdateLimit:            1,\n\tRequireSceneDraft:          false,\n\tRequireTagRole:             false,\n\tModAuditRetentionDays:      30,\n}\n\nfunc GetDatabasePath() string {\n\treturn C.Database\n}\n\nfunc GetHost() string {\n\treturn C.Host\n}\n\nfunc GetPort() int {\n\treturn C.Port\n}\n\nfunc GetProfilerPort() *int {\n\tif C.ProfilerPort == 0 {\n\t\treturn nil\n\t}\n\treturn &C.ProfilerPort\n}\n\nfunc GetJWTSignKey() []byte {\n\treturn []byte(C.JWTSignKey)\n}\n\nfunc GetSessionStoreKey() []byte {\n\treturn []byte(C.SessionStoreKey)\n}\n\nfunc GetHTTPUpgrade() bool {\n\treturn C.HTTPUpgrade\n}\n\nfunc GetIsProduction() bool {\n\treturn C.IsProduction\n}\n\n// GetRequireInvite returns true if new users cannot register without an invite\n// key.\nfunc GetRequireInvite() bool {\n\treturn C.RequireInvite\n}\n\n// GetRequireActivation returns true if new users must validate their email address\n// via activation to create an account.\nfunc GetRequireActivation() bool {\n\treturn C.RequireActivation\n}\n\n// GetActivationExpiry returns the duration before an activation email expires.\nfunc GetActivationExpiry() time.Duration {\n\treturn time.Duration(C.ActivationExpiry * int(time.Second))\n}\n\n// GetEmailCooldown returns the duration before a second activation email may\n// be generated.\nfunc GetEmailCooldown() time.Duration {\n\treturn time.Duration(C.EmailCooldown * int(time.Second))\n}\n\n// GetDefaultUserRoles returns the default roles assigned to a new user\n// when created via registration.\nfunc GetDefaultUserRoles() []string {\n\tif len(C.DefaultUserRoles) == 0 {\n\t\treturn defaultUserRoles\n\t}\n\treturn C.DefaultUserRoles\n}\n\nfunc GetEmailHost() string {\n\treturn C.EmailHost\n}\n\nfunc GetEmailPort() int {\n\treturn C.EmailPort\n}\n\nfunc GetEmailUser() string {\n\treturn C.EmailUser\n}\n\nfunc GetEmailPassword() string {\n\treturn C.EmailPW\n}\n\nfunc GetEmailFrom() string {\n\treturn C.EmailFrom\n}\n\nfunc GetHostURL() string {\n\treturn C.HostURL\n}\n\nfunc GetGuidelinesURL() string {\n\treturn C.GuidelinesURL\n}\n\n// GetImageLocation returns the path of where to locally store images.\nfunc GetImageLocation() string {\n\treturn C.ImageLocation\n}\n\n// GetImageBackend returns the backend used to store images.\nfunc GetImageBackend() ImageBackendType {\n\treturn ImageBackendType(C.ImageBackend)\n}\n\nfunc GetS3Config() *S3Config {\n\treturn &C.S3.S3Config\n}\n\nfunc GetImageResizeConfig() *ImageResizeConfig {\n\treturn &C.Image_Resizing.ImageResizeConfig\n}\n\nfunc GetOTelConfig() *OTelConfig {\n\tif C.OTel.Endpoint != \"\" {\n\t\treturn &C.OTel.OTelConfig\n\t}\n\treturn nil\n}\n\nfunc GetAutocertConfig() *AutocertConfig {\n\tif C.Autocert.Enabled {\n\t\treturn &C.Autocert.AutocertConfig\n\t}\n\treturn nil\n}\n\nfunc GetMissingAutocertSettings() []string {\n\tif !C.Autocert.Enabled {\n\t\treturn nil\n\t}\n\n\tmissing := []string{}\n\tif C.Autocert.Domain == \"\" {\n\t\tmissing = append(missing, \"domain\")\n\t}\n\tif C.Autocert.Email == \"\" {\n\t\tmissing = append(missing, \"email\")\n\t}\n\tif C.Autocert.CacheDir == \"\" {\n\t\tmissing = append(missing, \"cache_dir\")\n\t}\n\n\treturn missing\n}\n\n// ValidateImageLocation returns an error is image_location is not set.\nfunc ValidateImageLocation() error {\n\tif C.ImageLocation == \"\" {\n\t\treturn errors.New(\"ImageLocation not set\")\n\t}\n\n\treturn nil\n}\n\nfunc GetImageMaxSize() *int {\n\tsize := C.ImageMaxSize\n\tif size == 0 {\n\t\treturn nil\n\t}\n\treturn &size\n}\n\nfunc GetImageJpegQuality() int {\n\tif C.ImageJpegQuality <= 0 || C.ImageJpegQuality > 100 {\n\t\treturn 75\n\t}\n\treturn C.ImageJpegQuality\n}\n\n// GetLogFile returns the filename of the file to output logs to.\n// An empty string means that file logging will be disabled.\nfunc GetLogFile() string {\n\treturn C.LogFile\n}\n\n// GetUserLogFile returns the filename of the file to output user operation\n// logs to.\n// An empty string means that user operation logging will be output to stderr.\nfunc GetUserLogFile() string {\n\treturn C.UserLogFile\n}\n\n// GetLogOut returns true if logging should be output to the terminal\n// in addition to writing to a log file. Logging will be output to the\n// terminal if file logging is disabled. Defaults to true.\nfunc GetLogOut() bool {\n\treturn C.LogOut\n}\n\n// GetLogLevel returns the lowest log level to write to the log.\n// Should be one of \"Debug\", \"Info\", \"Warning\", \"Error\"\nfunc GetLogLevel() string {\n\tconst defaultValue = \"Info\"\n\n\tvalue := C.LogLevel\n\tif value != \"Debug\" && value != \"Info\" && value != \"Warning\" && value != \"Error\" {\n\t\tvalue = defaultValue\n\t}\n\n\treturn value\n}\n\nfunc GetPHashDistance() int {\n\treturn C.PHashDistance\n}\n\nfunc InitializeDefaults() error {\n\t// generate some api keys\n\tconst apiKeyLength = 32\n\n\tif viper.GetString(JWTSignKey) == \"\" {\n\t\tsignKey, err := utils.GenerateRandomKey(apiKeyLength)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tviper.Set(JWTSignKey, signKey)\n\t}\n\n\tif viper.GetString(SessionStoreKey) == \"\" {\n\t\tsessionStoreKey, err := utils.GenerateRandomKey(apiKeyLength)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tviper.Set(SessionStoreKey, sessionStoreKey)\n\t}\n\n\tif viper.GetString(Database) == \"\" {\n\t\tviper.Set(Database, GetDefaultDatabaseFilePath())\n\t}\n\n\treturn viper.WriteConfig()\n}\n\n// Unmarshal config\nfunc Initialize() error {\n\treturn viper.Unmarshal(&C)\n}\n\nfunc GetMissingEmailSettings() []string {\n\tif !GetRequireActivation() {\n\t\treturn nil\n\t}\n\n\tmissing := []string{}\n\tif GetEmailFrom() == \"\" {\n\t\tmissing = append(missing, \"EmailFrom\")\n\t}\n\tif GetEmailHost() == \"\" {\n\t\tmissing = append(missing, \"EmailHost\")\n\t}\n\tif GetHostURL() == \"\" {\n\t\tmissing = append(missing, \"HostURL\")\n\t}\n\n\treturn missing\n}\n\nfunc GetVotePromotionThreshold() *int {\n\tif C.VotePromotionThreshold == 0 {\n\t\treturn nil\n\t}\n\treturn &C.VotePromotionThreshold\n}\n\nfunc GetVoteApplicationThreshold() int {\n\treturn C.VoteApplicationThreshold\n}\n\nfunc GetVotingPeriod() int {\n\treturn C.VotingPeriod\n}\n\nfunc GetMinDestructiveVotingPeriod() int {\n\treturn C.MinDestructiveVotingPeriod\n}\n\nfunc GetVoteCronInterval() string {\n\treturn C.VoteCronInterval\n}\n\nfunc GetEditUpdateLimit() int {\n\treturn C.EditUpdateLimit\n}\n\nfunc GetRequireSceneDraft() bool {\n\treturn C.RequireSceneDraft\n}\n\nfunc GetRequireTagRole() bool {\n\treturn C.RequireTagRole\n}\n\nfunc GetTitle() string {\n\tif C.Title == \"\" {\n\t\treturn \"Stash-Box\"\n\t}\n\treturn C.Title\n}\n\nfunc GetFaviconPath() (*string, error) {\n\tif len(C.FaviconPath) == 0 {\n\t\treturn nil, errors.New(\"favicon_path not set\")\n\t}\n\treturn &C.FaviconPath, nil\n}\n\nfunc GetDraftTimeLimit() int {\n\treturn C.DraftTimeLimit\n}\n\nfunc GetModAuditRetentionDays() int {\n\treturn C.ModAuditRetentionDays\n}\n\nfunc GetMaxOpenConns() int {\n\tif C.Postgres.MaxOpenConns == 0 {\n\t\treturn 25\n\t}\n\treturn C.Postgres.MaxOpenConns\n}\n\nfunc GetMaxIdleConns() int {\n\tif C.Postgres.MaxIdleConns == 0 {\n\t\treturn 10\n\t}\n\treturn C.Postgres.MaxIdleConns\n}\n\nfunc GetConnMaxLifetime() int {\n\treturn C.Postgres.MaxIdleConns\n}\n\nfunc GetCSP() string {\n\treturn C.CSP\n}\n"
  },
  {
    "path": "internal/config/paths.go",
    "content": "package config\n\nimport (\n\t\"path/filepath\"\n)\n\nfunc GetConfigDirectory() string {\n\treturn \".\"\n}\n\nfunc GetDefaultDatabaseFilePath() string {\n\treturn \"postgres@localhost/stash-box?sslmode=disable\"\n}\n\nfunc GetConfigName() string {\n\treturn \"stash-box-config\"\n}\n\nfunc GetDefaultConfigFilePath() string {\n\treturn filepath.Join(GetConfigDirectory(), GetConfigName()+\".yml\")\n}\n\nfunc GetSSLKey() string {\n\treturn filepath.Join(GetConfigDirectory(), \"stash-box.key\")\n}\n\nfunc GetSSLCert() string {\n\treturn filepath.Join(GetConfigDirectory(), \"stash-box.crt\")\n}\n"
  },
  {
    "path": "internal/converter/converter.go",
    "content": "package converter\n\nimport (\n\t\"encoding/json\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/converter/gen\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/pkg/logger\"\n)\n\n// Package-level converter instances (stateless, created once)\nvar (\n\tmodelConverter        = &gen.ModelConverterImpl{}\n\tinputConverter        = &gen.InputConverterImpl{}\n\tcreateParamsConverter = &gen.CreateParamsConverterImpl{}\n\tupdateParamsConverter = &gen.UpdateParamsConverterImpl{}\n)\n\n// ImageToModel converts a queries.Image to a models.Image\nfunc ImageToModel(i queries.Image) models.Image {\n\treturn modelConverter.ConvertImage(i)\n}\n\nfunc ImageToModelPtr(i queries.Image) *models.Image {\n\timage := ImageToModel(i)\n\treturn &image\n}\n\n// ImagesToModels converts a slice of queries.Image to a slice of models.Image\nfunc ImagesToModels(images []queries.Image) []models.Image {\n\treturn modelConverter.ConvertImages(images)\n}\n\n// PerformerToModel converts a queries.Performer to a models.Performer\nfunc PerformerToModel(p queries.Performer) models.Performer {\n\treturn modelConverter.ConvertPerformer(p)\n}\n\nfunc PerformerToModelPtr(p queries.Performer) *models.Performer {\n\tperformer := PerformerToModel(p)\n\treturn &performer\n}\n\n// SceneToModel converts a queries.Scene to a models.Scene\nfunc SceneToModel(s queries.Scene) models.Scene {\n\treturn modelConverter.ConvertScene(s)\n}\n\nfunc SceneToModelPtr(s queries.Scene) *models.Scene {\n\tscene := SceneToModel(s)\n\treturn &scene\n}\n\n// SiteToModel converts a queries.Site to a models.Site\nfunc SiteToModel(s queries.Site) models.Site {\n\treturn modelConverter.ConvertSite(s)\n}\n\nfunc SiteToModelPtr(s queries.Site) *models.Site {\n\tsite := SiteToModel(s)\n\treturn &site\n}\n\n// StudioToModel converts a queries.Studio to a models.Studio\nfunc StudioToModel(s queries.Studio) models.Studio {\n\treturn modelConverter.ConvertStudio(s)\n}\n\nfunc StudioToModelPtr(s queries.Studio) *models.Studio {\n\tstudio := StudioToModel(s)\n\treturn &studio\n}\n\n// TagCategoryToModel converts a queries.TagCategory to a models.TagCategory\nfunc TagCategoryToModel(tc queries.TagCategory) models.TagCategory {\n\treturn modelConverter.ConvertTagCategory(tc)\n}\n\nfunc TagCategoryToModelPtr(tc queries.TagCategory) *models.TagCategory {\n\ttagCategory := TagCategoryToModel(tc)\n\treturn &tagCategory\n}\n\n// TagToModel converts a queries.Tag to a models.Tag\nfunc TagToModel(t queries.Tag) models.Tag {\n\treturn modelConverter.ConvertTag(t)\n}\n\nfunc TagToModelPtr(t queries.Tag) *models.Tag {\n\ttag := TagToModel(t)\n\treturn &tag\n}\n\n// UserTokenToModel converts a queries.UserToken to a models.UserToken\nfunc UserTokenToModel(ut queries.UserToken) models.UserToken {\n\treturn modelConverter.ConvertUserToken(ut)\n}\n\nfunc UserTokenToModelPtr(ut queries.UserToken) *models.UserToken {\n\tuserToken := UserTokenToModel(ut)\n\treturn &userToken\n}\n\n// SceneDraftInputToSceneDraft converts a models.SceneDraftInput to a models.SceneDraft\nfunc SceneDraftInputToSceneDraft(input models.SceneDraftInput) models.SceneDraft {\n\treturn inputConverter.ConvertSceneDraftInput(input)\n}\n\n// EditToModel converts a queries.Edit to a models.Edit\nfunc EditToModel(e queries.Edit) models.Edit {\n\treturn modelConverter.ConvertEdit(e)\n}\n\nfunc EditToModelPtr(e queries.Edit) *models.Edit {\n\tedit := EditToModel(e)\n\treturn &edit\n}\n\n// EditsToModels converts []queries.Edit to []models.Edit\nfunc EditsToModels(edits []queries.Edit) []models.Edit {\n\treturn modelConverter.ConvertEdits(edits)\n}\n\n// EditVoteToModel converts a queries.EditVote to a models.EditVote\nfunc EditVoteToModel(ec queries.EditVote) models.EditVote {\n\treturn modelConverter.ConvertEditVote(ec)\n}\n\n// EditCommentToModel converts a queries.EditComment to a models.EditComment\nfunc EditCommentToModel(ec queries.EditComment) models.EditComment {\n\treturn modelConverter.ConvertEditComment(ec)\n}\n\nfunc EditCommentToModelPtr(ec queries.EditComment) *models.EditComment {\n\teditComment := EditCommentToModel(ec)\n\treturn &editComment\n}\n\n// TagToCreateParams converts a models.Tag to a queries.CreateTagParams\nfunc TagToCreateParams(t models.Tag) queries.CreateTagParams {\n\treturn createParamsConverter.ConvertTagToCreateParams(t)\n}\n\n// TagToUpdateParams converts a models.Tag to a queries.UpdateTagParams\nfunc TagToUpdateParams(t models.Tag) queries.UpdateTagParams {\n\treturn updateParamsConverter.ConvertTagToUpdateParams(t)\n}\n\n// StudioToCreateParams converts a models.Studio to a queries.CreateStudioParams\nfunc StudioToCreateParams(s models.Studio) queries.CreateStudioParams {\n\treturn createParamsConverter.ConvertStudioToCreateParams(s)\n}\n\n// StudioToUpdateParams converts a models.Studio to a queries.UpdateStudioParams\nfunc StudioToUpdateParams(s models.Studio) queries.UpdateStudioParams {\n\treturn updateParamsConverter.ConvertStudioToUpdateParams(s)\n}\n\n// SceneToCreateParams converts a models.Scene to a queries.CreateSceneParams\nfunc SceneToCreateParams(s models.Scene) queries.CreateSceneParams {\n\treturn createParamsConverter.ConvertSceneToCreateParams(s)\n}\n\n// SceneToUpdateParams converts a models.Scene to a queries.UpdateSceneParams\nfunc SceneToUpdateParams(s models.Scene) queries.UpdateSceneParams {\n\treturn updateParamsConverter.ConvertSceneToUpdateParams(s)\n}\n\n// BodyModInputToModel converts []models.BodyModificationInput to []models.BodyModification\nfunc BodyModInputToModel(inputs []models.BodyModificationInput) []models.BodyModification {\n\treturn inputConverter.ConvertBodyModInputSlice(inputs)\n}\n\n// PerformerToCreateParams converts a models.Performer to a queries.CreatePerformerParams\nfunc PerformerToCreateParams(p models.Performer) queries.CreatePerformerParams {\n\treturn createParamsConverter.ConvertPerformerToCreateParams(p)\n}\n\n// PerformerToUpdateParams converts a models.Performer to a queries.UpdatePerformerParams\nfunc PerformerToUpdateParams(p models.Performer) queries.UpdatePerformerParams {\n\treturn updateParamsConverter.ConvertPerformerToUpdateParams(p)\n}\n\n// EditToUpdateParams converts a models.Edit to a queries.UpdateEditParams\nfunc EditToUpdateParams(e models.Edit) queries.UpdateEditParams {\n\treturn updateParamsConverter.ConvertEditToUpdateParams(e)\n}\n\n// EditToCreateParams converts a models.Edit to a queries.CreateEditParams\nfunc EditToCreateParams(e models.Edit) queries.CreateEditParams {\n\treturn createParamsConverter.ConvertEditToCreateParams(e)\n}\n\n// EditCommentToCreateParams converts a models.EditComment to a queries.CreateEditCommentParams\nfunc EditCommentToCreateParams(ec models.EditComment) queries.CreateEditCommentParams {\n\treturn createParamsConverter.ConvertEditCommentToCreateParams(ec)\n}\n\n// UserToModel converts a queries.User to a models.User\nfunc UserToModel(u queries.User) models.User {\n\treturn modelConverter.ConvertUser(u)\n}\n\nfunc UserToModelPtr(u queries.User) *models.User {\n\tuser := UserToModel(u)\n\treturn &user\n}\n\n// PerformerCreateInputToPerformer converts a models.PerformerCreateInput to a models.Performer\nfunc PerformerCreateInputToPerformer(input models.PerformerCreateInput) models.Performer {\n\treturn models.Performer{\n\t\tName:            input.Name,\n\t\tDisambiguation:  input.Disambiguation,\n\t\tGender:          input.Gender,\n\t\tBirthDate:       input.Birthdate,\n\t\tDeathDate:       input.Deathdate,\n\t\tEthnicity:       input.Ethnicity,\n\t\tCountry:         input.Country,\n\t\tEyeColor:        input.EyeColor,\n\t\tHairColor:       input.HairColor,\n\t\tHeight:          input.Height,\n\t\tCupSize:         input.CupSize,\n\t\tBandSize:        input.BandSize,\n\t\tWaistSize:       input.WaistSize,\n\t\tHipSize:         input.HipSize,\n\t\tBreastType:      input.BreastType,\n\t\tCareerStartYear: input.CareerStartYear,\n\t\tCareerEndYear:   input.CareerEndYear,\n\t}\n}\n\n// UpdatePerformerFromUpdateInput updates an existing models.Performer with data from models.PerformerUpdateInput\nfunc UpdatePerformerFromUpdateInput(performer *models.Performer, input models.PerformerUpdateInput) {\n\tif input.Name != nil {\n\t\tperformer.Name = *input.Name\n\t}\n\tif input.Disambiguation != nil {\n\t\tperformer.Disambiguation = input.Disambiguation\n\t}\n\tif input.Gender != nil {\n\t\tperformer.Gender = input.Gender\n\t}\n\tif input.Birthdate != nil {\n\t\tperformer.BirthDate = input.Birthdate\n\t}\n\tif input.Deathdate != nil {\n\t\tperformer.DeathDate = input.Deathdate\n\t}\n\tif input.Ethnicity != nil {\n\t\tperformer.Ethnicity = input.Ethnicity\n\t}\n\tif input.Country != nil {\n\t\tperformer.Country = input.Country\n\t}\n\tif input.EyeColor != nil {\n\t\tperformer.EyeColor = input.EyeColor\n\t}\n\tif input.HairColor != nil {\n\t\tperformer.HairColor = input.HairColor\n\t}\n\tif input.Height != nil {\n\t\tperformer.Height = input.Height\n\t}\n\tif input.CupSize != nil {\n\t\tperformer.CupSize = input.CupSize\n\t}\n\tif input.BandSize != nil {\n\t\tperformer.BandSize = input.BandSize\n\t}\n\tif input.WaistSize != nil {\n\t\tperformer.WaistSize = input.WaistSize\n\t}\n\tif input.HipSize != nil {\n\t\tperformer.HipSize = input.HipSize\n\t}\n\tif input.BreastType != nil {\n\t\tperformer.BreastType = input.BreastType\n\t}\n\tif input.CareerStartYear != nil {\n\t\tperformer.CareerStartYear = input.CareerStartYear\n\t}\n\tif input.CareerEndYear != nil {\n\t\tperformer.CareerEndYear = input.CareerEndYear\n\t}\n}\n\n// SceneCreateInputToScene converts a models.SceneCreateInput to a models.Scene\nfunc SceneCreateInputToScene(input models.SceneCreateInput) models.Scene {\n\tvar studioID uuid.NullUUID\n\tif input.StudioID != nil {\n\t\tstudioID = uuid.NullUUID{UUID: *input.StudioID, Valid: true}\n\t}\n\n\treturn models.Scene{\n\t\tTitle:          input.Title,\n\t\tDetails:        input.Details,\n\t\tDate:           &input.Date,\n\t\tProductionDate: input.ProductionDate,\n\t\tStudioID:       studioID,\n\t\tDuration:       input.Duration,\n\t\tDirector:       input.Director,\n\t\tCode:           input.Code,\n\t}\n}\n\n// UpdateSceneFromUpdateInput updates an existing models.Scene with data from models.SceneUpdateInput\nfunc UpdateSceneFromUpdateInput(scene *models.Scene, input models.SceneUpdateInput) {\n\tif input.Title != nil {\n\t\tscene.Title = input.Title\n\t}\n\tif input.Details != nil {\n\t\tscene.Details = input.Details\n\t}\n\tif input.Date != nil {\n\t\tscene.Date = input.Date\n\t}\n\tif input.ProductionDate != nil {\n\t\tscene.ProductionDate = input.ProductionDate\n\t}\n\tif input.StudioID != nil {\n\t\tscene.StudioID = uuid.NullUUID{UUID: *input.StudioID, Valid: true}\n\t}\n\tif input.Duration != nil {\n\t\tscene.Duration = input.Duration\n\t}\n\tif input.Director != nil {\n\t\tscene.Director = input.Director\n\t}\n\tif input.Code != nil {\n\t\tscene.Code = input.Code\n\t}\n}\n\n// SiteCreateInputToSite converts a models.SiteCreateInput to a models.Site\nfunc SiteCreateInputToSite(input models.SiteCreateInput) models.Site {\n\tvalidTypes := make([]string, len(input.ValidTypes))\n\tfor i, vt := range input.ValidTypes {\n\t\tvalidTypes[i] = string(vt)\n\t}\n\n\treturn models.Site{\n\t\tName:        input.Name,\n\t\tDescription: input.Description,\n\t\tURL:         input.URL,\n\t\tRegex:       input.Regex,\n\t\tValidTypes:  validTypes,\n\t}\n}\n\n// SiteToCreateParams converts a models.Site to a queries.CreateSiteParams\nfunc SiteToCreateParams(s models.Site) queries.CreateSiteParams {\n\treturn createParamsConverter.ConvertSiteToCreateParams(s)\n}\n\n// SiteToUpdateParams converts a models.Site to a queries.UpdateSiteParams\nfunc SiteToUpdateParams(s models.Site) queries.UpdateSiteParams {\n\treturn updateParamsConverter.ConvertSiteToUpdateParams(s)\n}\n\n// UpdateSiteFromUpdateInput updates an existing models.Site with data from models.SiteUpdateInput\nfunc UpdateSiteFromUpdateInput(site *models.Site, input models.SiteUpdateInput) {\n\tsite.Name = input.Name\n\tsite.Description = input.Description\n\tsite.URL = input.URL\n\tsite.Regex = input.Regex\n\n\tvalidTypes := make([]string, len(input.ValidTypes))\n\tfor i, vt := range input.ValidTypes {\n\t\tvalidTypes[i] = string(vt)\n\t}\n\tsite.ValidTypes = validTypes\n}\n\n// StudioCreateInputToCreateParams converts a models.StudioCreateInput to a queries.CreateStudioParams\nfunc StudioCreateInputToCreateParams(input models.StudioCreateInput) (queries.CreateStudioParams, error) {\n\tid, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn queries.CreateStudioParams{}, err\n\t}\n\n\tvar parentStudioID uuid.NullUUID\n\tif input.ParentID != nil {\n\t\tparentStudioID = uuid.NullUUID{UUID: *input.ParentID, Valid: true}\n\t}\n\n\treturn queries.CreateStudioParams{\n\t\tID:             id,\n\t\tName:           input.Name,\n\t\tParentStudioID: parentStudioID,\n\t}, nil\n}\n\n// UpdateStudioFromUpdateInput applies changes from models.StudioUpdateInput to queries.Studio and returns queries.UpdateStudioParams\nfunc UpdateStudioFromUpdateInput(studio queries.Studio, input models.StudioUpdateInput) queries.UpdateStudioParams {\n\t// Start with existing studio values\n\tname := studio.Name\n\tparentStudioID := studio.ParentStudioID\n\n\t// Apply updates from input\n\tif input.Name != nil {\n\t\tname = *input.Name\n\t}\n\tif input.ParentID != nil {\n\t\tparentStudioID = uuid.NullUUID{UUID: *input.ParentID, Valid: true}\n\t}\n\n\treturn queries.UpdateStudioParams{\n\t\tID:             studio.ID,\n\t\tName:           name,\n\t\tParentStudioID: parentStudioID,\n\t}\n}\n\n// TagCategoryCreateInputToCreateParams converts a models.TagCategoryCreateInput to a queries.CreateTagCategoryParams\nfunc TagCategoryCreateInputToCreateParams(input models.TagCategoryCreateInput) (queries.CreateTagCategoryParams, error) {\n\tid, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn queries.CreateTagCategoryParams{}, err\n\t}\n\n\treturn queries.CreateTagCategoryParams{\n\t\tID:          id,\n\t\tGroup:       string(input.Group),\n\t\tName:        input.Name,\n\t\tDescription: input.Description,\n\t}, nil\n}\n\n// UpdateTagCategoryFromUpdateInput applies changes from models.TagCategoryUpdateInput to queries.TagCategory and returns queries.UpdateTagCategoryParams\nfunc UpdateTagCategoryFromUpdateInput(tagCategory queries.TagCategory, input models.TagCategoryUpdateInput) queries.UpdateTagCategoryParams {\n\t// Start with existing values\n\tname := tagCategory.Name\n\tgroup := tagCategory.Group\n\tdescription := tagCategory.Description\n\n\t// Apply updates from input\n\tif input.Name != nil {\n\t\tname = *input.Name\n\t}\n\tif input.Group != nil {\n\t\tgroup = string(*input.Group)\n\t}\n\tif input.Description != nil {\n\t\tdescription = input.Description\n\t}\n\n\treturn queries.UpdateTagCategoryParams{\n\t\tID:          tagCategory.ID,\n\t\tGroup:       group,\n\t\tName:        name,\n\t\tDescription: description,\n\t}\n}\n\n// TagCreateInputToCreateParams converts a models.TagCreateInput to a queries.CreateTagParams\nfunc TagCreateInputToCreateParams(input models.TagCreateInput) (queries.CreateTagParams, error) {\n\tid, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn queries.CreateTagParams{}, err\n\t}\n\n\tvar categoryID uuid.NullUUID\n\tif input.CategoryID != nil {\n\t\tcategoryID = uuid.NullUUID{UUID: *input.CategoryID, Valid: true}\n\t}\n\n\treturn queries.CreateTagParams{\n\t\tID:          id,\n\t\tName:        input.Name,\n\t\tCategoryID:  categoryID,\n\t\tDescription: input.Description,\n\t}, nil\n}\n\n// UpdateTagFromUpdateInput applies changes from models.TagUpdateInput to queries.Tag and returns queries.UpdateTagParams\nfunc UpdateTagFromUpdateInput(tag queries.Tag, input models.TagUpdateInput) queries.UpdateTagParams {\n\t// Start with existing values\n\tname := tag.Name\n\tcategoryID := tag.CategoryID\n\n\t// Apply updates from input\n\tif input.Name != nil {\n\t\tname = *input.Name\n\t}\n\tif input.CategoryID != nil {\n\t\tcategoryID = uuid.NullUUID{UUID: *input.CategoryID, Valid: true}\n\t}\n\n\treturn queries.UpdateTagParams{\n\t\tID:          tag.ID,\n\t\tName:        name,\n\t\tCategoryID:  categoryID,\n\t\tDescription: input.Description,\n\t}\n}\n\n// UserCreateInputToCreateParams converts a models.UserCreateInput to a queries.CreateUserParams\nfunc UserCreateInputToCreateParams(input models.UserCreateInput, id uuid.UUID, passwordHash, apiKey string) queries.CreateUserParams {\n\tvar invitedBy uuid.NullUUID\n\tif input.InvitedByID != nil {\n\t\tinvitedBy = uuid.NullUUID{UUID: *input.InvitedByID, Valid: true}\n\t}\n\n\treturn queries.CreateUserParams{\n\t\tID:           id,\n\t\tName:         input.Name,\n\t\tPasswordHash: passwordHash,\n\t\tEmail:        input.Email,\n\t\tApiKey:       apiKey,\n\t\tApiCalls:     new(int),\n\t\tInviteTokens: 0,\n\t\tInvitedBy:    invitedBy,\n\t}\n}\n\n// UpdateUserFromUpdateInput applies changes from models.UserUpdateInput to queries.User and returns queries.UpdateUserParams\nfunc UpdateUserFromUpdateInput(user queries.User, input models.UserUpdateInput, passwordHash string) queries.UpdateUserParams {\n\t// Start with existing values\n\tname := user.Name\n\temail := user.Email\n\tuserPasswordHash := user.PasswordHash\n\n\t// Apply updates from input\n\tif input.Name != nil {\n\t\tname = *input.Name\n\t}\n\tif input.Email != nil {\n\t\temail = *input.Email\n\t}\n\tif input.Password != nil {\n\t\tuserPasswordHash = passwordHash\n\t}\n\n\treturn queries.UpdateUserParams{\n\t\tID:           user.ID,\n\t\tName:         name,\n\t\tPasswordHash: userPasswordHash,\n\t\tEmail:        email,\n\t}\n}\n\n// CreateUserTokenParamsFromData creates a queries.CreateUserTokenParams with token expiring based on config\nfunc CreateUserTokenParamsFromData(tokenType string, data any) (queries.CreateUserTokenParams, error) {\n\tid, err := uuid.NewV4()\n\tif err != nil {\n\t\treturn queries.CreateUserTokenParams{}, err\n\t}\n\n\tdataBytes, err := json.Marshal(data)\n\tif err != nil {\n\t\treturn queries.CreateUserTokenParams{}, err\n\t}\n\n\tnow := time.Now()\n\texpires := now.Add(config.GetActivationExpiry())\n\n\treturn queries.CreateUserTokenParams{\n\t\tID:        id,\n\t\tData:      dataBytes,\n\t\tType:      tokenType,\n\t\tCreatedAt: now,\n\t\tExpiresAt: expires,\n\t}, nil\n}\n\n// DraftToModel converts a queries.Draft to a models.Draft\nfunc DraftToModel(d queries.Draft) models.Draft {\n\treturn models.Draft{\n\t\tID:        d.ID,\n\t\tUserID:    d.UserID,\n\t\tType:      d.Type,\n\t\tData:      json.RawMessage(d.Data),\n\t\tCreatedAt: d.CreatedAt,\n\t}\n}\n\nfunc DraftToModelPtr(d queries.Draft) *models.Draft {\n\tdraft := DraftToModel(d)\n\treturn &draft\n}\n\n// CreateEditCommentParams creates a queries.CreateEditCommentParams from editID, userID, and comment text\nfunc CreateEditCommentParams(editID, userID uuid.UUID, commentText string) (queries.CreateEditCommentParams, error) {\n\tid, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn queries.CreateEditCommentParams{}, err\n\t}\n\n\treturn queries.CreateEditCommentParams{\n\t\tID:     id,\n\t\tEditID: editID,\n\t\tUserID: uuid.NullUUID{UUID: userID, Valid: true},\n\t\tText:   commentText,\n\t}, nil\n}\n\n// PerformersToModels converts []queries.Performer to []models.Performer\nfunc PerformersToModels(performers []queries.Performer) []models.Performer {\n\treturn modelConverter.ConvertPerformers(performers)\n}\n\nfunc ScenesToModels(scenes []queries.Scene) []models.Scene {\n\treturn modelConverter.ConvertScenes(scenes)\n}\n\n// StudiosToModels converts []queries.Studio to []models.Studio\nfunc StudiosToModels(studios []queries.Studio) []models.Studio {\n\treturn modelConverter.ConvertStudios(studios)\n}\n\n// TagCategoriesToModels converts []queries.TagCategory to []models.TagCategory\nfunc TagCategoriesToModels(tagCategories []queries.TagCategory) []models.TagCategory {\n\treturn modelConverter.ConvertTagCategories(tagCategories)\n}\n\n// TagsToModels converts []queries.Tag to []models.Tag\nfunc TagsToModels(tags []queries.Tag) []models.Tag {\n\treturn modelConverter.ConvertTags(tags)\n}\n\n// EditCommentsToModels converts []queries.EditComment to []models.EditComment\nfunc EditCommentsToModels(comments []queries.EditComment) []models.EditComment {\n\treturn modelConverter.ConvertEditComments(comments)\n}\n\n// EditVotesToModels converts []queries.EditVote to []models.EditVote\nfunc EditVotesToModels(votes []queries.EditVote) []models.EditVote {\n\treturn modelConverter.ConvertEditVotes(votes)\n}\n\n// InviteKeysToModels converts []queries.InviteKey to []models.InviteKey\nfunc InviteKeysToModels(keys []queries.InviteKey) []models.InviteKey {\n\treturn modelConverter.ConvertInviteKeys(keys)\n}\n\n// NotificationsToModels converts []queries.Notification to []models.Notification\nfunc NotificationsToModels(notifications []queries.Notification) []models.Notification {\n\treturn modelConverter.ConvertNotifications(notifications)\n}\n\n// InviteKeyToModel converts a queries.InviteKey to a models.InviteKey\nfunc InviteKeyToModel(ik queries.InviteKey) models.InviteKey {\n\tvar expires *time.Time\n\tif ik.ExpireTime != nil {\n\t\texpires = ik.ExpireTime\n\t}\n\n\treturn models.InviteKey{\n\t\tID:          ik.ID,\n\t\tGeneratedBy: ik.GeneratedBy,\n\t\tGeneratedAt: ik.GeneratedAt,\n\t\tUses:        ik.Uses,\n\t\tExpires:     expires,\n\t}\n}\n\n// StringToRoleEnum converts a string to a models.RoleEnum, returns nil if invalid\nfunc StringToRoleEnum(s string) *models.RoleEnum {\n\trole := models.RoleEnum(s)\n\tif !role.IsValid() {\n\t\tlogger.Warnf(\"Invalid role '%s', discarding\", s)\n\t\treturn nil\n\t}\n\treturn &role\n}\n\n// StringsToRoleEnums converts a slice of strings to a slice of models.RoleEnum, discarding invalid ones\nfunc StringsToRoleEnums(strings []string) []models.RoleEnum {\n\tvar result []models.RoleEnum\n\tfor _, s := range strings {\n\t\tif role := StringToRoleEnum(s); role != nil {\n\t\t\tresult = append(result, *role)\n\t\t}\n\t}\n\treturn result\n}\n\n// NotificationToModel converts a database notification to a models.Notification\nfunc NotificationToModel(dbNotification queries.Notification) models.Notification {\n\tnotification := models.Notification{\n\t\tUserID:    dbNotification.UserID,\n\t\tType:      models.NotificationEnum(dbNotification.Type),\n\t\tTargetID:  dbNotification.ID,\n\t\tCreatedAt: dbNotification.CreatedAt,\n\t\tReadAt:    dbNotification.ReadAt,\n\t}\n\n\treturn notification\n}\n"
  },
  {
    "path": "internal/converter/gen/extensions.go",
    "content": "package gen\n\nimport (\n\t\"time\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n)\n\n// Extend functions for type conversions\n\nfunc ConvertTime(t time.Time) time.Time {\n\treturn t\n}\n\nfunc ConvertNullIntToInt(i *int) int {\n\tif i != nil {\n\t\treturn *i\n\t}\n\treturn 0\n}\n\nfunc ConvertNotificationType(t queries.NotificationType) models.NotificationEnum {\n\treturn models.NotificationEnum(t)\n}\n"
  },
  {
    "path": "internal/converter/gen/generated.go",
    "content": "// Code generated by github.com/jmattheis/goverter, DO NOT EDIT.\n//go:build !goverter\n\npackage gen\n\nimport (\n\t\"encoding/json\"\n\tuuid \"github.com/gofrs/uuid\"\n\tmodels \"github.com/stashapp/stash-box/internal/models\"\n\tqueries \"github.com/stashapp/stash-box/internal/queries\"\n\t\"time\"\n)\n\ntype CreateParamsConverterImpl struct{}\n\nfunc (c *CreateParamsConverterImpl) ConvertEditCommentToCreateParams(source models.EditComment) queries.CreateEditCommentParams {\n\tvar queriesCreateEditCommentParams queries.CreateEditCommentParams\n\tqueriesCreateEditCommentParams.ID = c.uuidUUIDToUuidUUID(source.ID)\n\tqueriesCreateEditCommentParams.EditID = c.uuidUUIDToUuidUUID(source.EditID)\n\tqueriesCreateEditCommentParams.UserID = c.uuidNullUUIDToUuidNullUUID(source.UserID)\n\tqueriesCreateEditCommentParams.Text = source.Text\n\treturn queriesCreateEditCommentParams\n}\nfunc (c *CreateParamsConverterImpl) ConvertEditToCreateParams(source models.Edit) queries.CreateEditParams {\n\tvar queriesCreateEditParams queries.CreateEditParams\n\tqueriesCreateEditParams.ID = c.uuidUUIDToUuidUUID(source.ID)\n\tqueriesCreateEditParams.UserID = c.uuidNullUUIDToUuidNullUUID(source.UserID)\n\tqueriesCreateEditParams.TargetType = source.TargetType\n\tqueriesCreateEditParams.Operation = source.Operation\n\tqueriesCreateEditParams.Data = c.jsonRawMessageToByteList(source.Data)\n\tqueriesCreateEditParams.Votes = source.VoteCount\n\tqueriesCreateEditParams.Status = source.Status\n\tqueriesCreateEditParams.Applied = source.Applied\n\tqueriesCreateEditParams.Bot = source.Bot\n\treturn queriesCreateEditParams\n}\nfunc (c *CreateParamsConverterImpl) ConvertPerformerToCreateParams(source models.Performer) queries.CreatePerformerParams {\n\tvar queriesCreatePerformerParams queries.CreatePerformerParams\n\tqueriesCreatePerformerParams.ID = c.uuidUUIDToUuidUUID(source.ID)\n\tqueriesCreatePerformerParams.Name = source.Name\n\tif source.Disambiguation != nil {\n\t\txstring := *source.Disambiguation\n\t\tqueriesCreatePerformerParams.Disambiguation = &xstring\n\t}\n\tif source.Gender != nil {\n\t\tmodelsGenderEnum := c.modelsGenderEnumToModelsGenderEnum(*source.Gender)\n\t\tqueriesCreatePerformerParams.Gender = &modelsGenderEnum\n\t}\n\tif source.BirthDate != nil {\n\t\txstring2 := *source.BirthDate\n\t\tqueriesCreatePerformerParams.Birthdate = &xstring2\n\t}\n\tif source.Ethnicity != nil {\n\t\tmodelsEthnicityEnum := c.modelsEthnicityEnumToModelsEthnicityEnum(*source.Ethnicity)\n\t\tqueriesCreatePerformerParams.Ethnicity = &modelsEthnicityEnum\n\t}\n\tif source.Country != nil {\n\t\txstring3 := *source.Country\n\t\tqueriesCreatePerformerParams.Country = &xstring3\n\t}\n\tif source.EyeColor != nil {\n\t\tmodelsEyeColorEnum := c.modelsEyeColorEnumToModelsEyeColorEnum(*source.EyeColor)\n\t\tqueriesCreatePerformerParams.EyeColor = &modelsEyeColorEnum\n\t}\n\tif source.HairColor != nil {\n\t\tmodelsHairColorEnum := c.modelsHairColorEnumToModelsHairColorEnum(*source.HairColor)\n\t\tqueriesCreatePerformerParams.HairColor = &modelsHairColorEnum\n\t}\n\tif source.Height != nil {\n\t\txint := *source.Height\n\t\tqueriesCreatePerformerParams.Height = &xint\n\t}\n\tif source.CupSize != nil {\n\t\txstring4 := *source.CupSize\n\t\tqueriesCreatePerformerParams.CupSize = &xstring4\n\t}\n\tif source.BandSize != nil {\n\t\txint2 := *source.BandSize\n\t\tqueriesCreatePerformerParams.BandSize = &xint2\n\t}\n\tif source.HipSize != nil {\n\t\txint3 := *source.HipSize\n\t\tqueriesCreatePerformerParams.HipSize = &xint3\n\t}\n\tif source.WaistSize != nil {\n\t\txint4 := *source.WaistSize\n\t\tqueriesCreatePerformerParams.WaistSize = &xint4\n\t}\n\tif source.BreastType != nil {\n\t\tmodelsBreastTypeEnum := c.modelsBreastTypeEnumToModelsBreastTypeEnum(*source.BreastType)\n\t\tqueriesCreatePerformerParams.BreastType = &modelsBreastTypeEnum\n\t}\n\tif source.CareerStartYear != nil {\n\t\txint5 := *source.CareerStartYear\n\t\tqueriesCreatePerformerParams.CareerStartYear = &xint5\n\t}\n\tif source.CareerEndYear != nil {\n\t\txint6 := *source.CareerEndYear\n\t\tqueriesCreatePerformerParams.CareerEndYear = &xint6\n\t}\n\tif source.DeathDate != nil {\n\t\txstring5 := *source.DeathDate\n\t\tqueriesCreatePerformerParams.Deathdate = &xstring5\n\t}\n\treturn queriesCreatePerformerParams\n}\nfunc (c *CreateParamsConverterImpl) ConvertSceneToCreateParams(source models.Scene) queries.CreateSceneParams {\n\tvar queriesCreateSceneParams queries.CreateSceneParams\n\tqueriesCreateSceneParams.ID = c.uuidUUIDToUuidUUID(source.ID)\n\tif source.Title != nil {\n\t\txstring := *source.Title\n\t\tqueriesCreateSceneParams.Title = &xstring\n\t}\n\tif source.Details != nil {\n\t\txstring2 := *source.Details\n\t\tqueriesCreateSceneParams.Details = &xstring2\n\t}\n\tif source.Date != nil {\n\t\txstring3 := *source.Date\n\t\tqueriesCreateSceneParams.Date = &xstring3\n\t}\n\tif source.ProductionDate != nil {\n\t\txstring4 := *source.ProductionDate\n\t\tqueriesCreateSceneParams.ProductionDate = &xstring4\n\t}\n\tqueriesCreateSceneParams.StudioID = c.uuidNullUUIDToUuidNullUUID(source.StudioID)\n\tif source.Duration != nil {\n\t\txint := *source.Duration\n\t\tqueriesCreateSceneParams.Duration = &xint\n\t}\n\tif source.Director != nil {\n\t\txstring5 := *source.Director\n\t\tqueriesCreateSceneParams.Director = &xstring5\n\t}\n\tif source.Code != nil {\n\t\txstring6 := *source.Code\n\t\tqueriesCreateSceneParams.Code = &xstring6\n\t}\n\treturn queriesCreateSceneParams\n}\nfunc (c *CreateParamsConverterImpl) ConvertSiteToCreateParams(source models.Site) queries.CreateSiteParams {\n\tvar queriesCreateSiteParams queries.CreateSiteParams\n\tqueriesCreateSiteParams.ID = c.uuidUUIDToUuidUUID(source.ID)\n\tqueriesCreateSiteParams.Name = source.Name\n\tif source.Description != nil {\n\t\txstring := *source.Description\n\t\tqueriesCreateSiteParams.Description = &xstring\n\t}\n\tif source.URL != nil {\n\t\txstring2 := *source.URL\n\t\tqueriesCreateSiteParams.Url = &xstring2\n\t}\n\tif source.Regex != nil {\n\t\txstring3 := *source.Regex\n\t\tqueriesCreateSiteParams.Regex = &xstring3\n\t}\n\tif source.ValidTypes != nil {\n\t\tqueriesCreateSiteParams.ValidTypes = make([]string, len(source.ValidTypes))\n\t\tfor i := 0; i < len(source.ValidTypes); i++ {\n\t\t\tqueriesCreateSiteParams.ValidTypes[i] = source.ValidTypes[i]\n\t\t}\n\t}\n\treturn queriesCreateSiteParams\n}\nfunc (c *CreateParamsConverterImpl) ConvertStudioToCreateParams(source models.Studio) queries.CreateStudioParams {\n\tvar queriesCreateStudioParams queries.CreateStudioParams\n\tqueriesCreateStudioParams.ID = c.uuidUUIDToUuidUUID(source.ID)\n\tqueriesCreateStudioParams.Name = source.Name\n\tqueriesCreateStudioParams.ParentStudioID = c.uuidNullUUIDToUuidNullUUID(source.ParentStudioID)\n\treturn queriesCreateStudioParams\n}\nfunc (c *CreateParamsConverterImpl) ConvertTagToCreateParams(source models.Tag) queries.CreateTagParams {\n\tvar queriesCreateTagParams queries.CreateTagParams\n\tqueriesCreateTagParams.ID = c.uuidUUIDToUuidUUID(source.ID)\n\tqueriesCreateTagParams.Name = source.Name\n\tqueriesCreateTagParams.CategoryID = c.uuidNullUUIDToUuidNullUUID(source.CategoryID)\n\tif source.Description != nil {\n\t\txstring := *source.Description\n\t\tqueriesCreateTagParams.Description = &xstring\n\t}\n\treturn queriesCreateTagParams\n}\nfunc (c *CreateParamsConverterImpl) jsonRawMessageToByteList(source json.RawMessage) []uint8 {\n\tvar byteList []uint8\n\tif source != nil {\n\t\tbyteList = make([]uint8, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tbyteList[i] = source[i]\n\t\t}\n\t}\n\treturn byteList\n}\nfunc (c *CreateParamsConverterImpl) modelsBreastTypeEnumToModelsBreastTypeEnum(source models.BreastTypeEnum) models.BreastTypeEnum {\n\tvar modelsBreastTypeEnum models.BreastTypeEnum\n\tswitch source {\n\tcase models.BreastTypeEnumFake:\n\t\tmodelsBreastTypeEnum = models.BreastTypeEnumFake\n\tcase models.BreastTypeEnumNa:\n\t\tmodelsBreastTypeEnum = models.BreastTypeEnumNa\n\tcase models.BreastTypeEnumNatural:\n\t\tmodelsBreastTypeEnum = models.BreastTypeEnumNatural\n\tdefault: // ignored\n\t}\n\treturn modelsBreastTypeEnum\n}\nfunc (c *CreateParamsConverterImpl) modelsEthnicityEnumToModelsEthnicityEnum(source models.EthnicityEnum) models.EthnicityEnum {\n\tvar modelsEthnicityEnum models.EthnicityEnum\n\tswitch source {\n\tcase models.EthnicityEnumAsian:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumAsian\n\tcase models.EthnicityEnumBlack:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumBlack\n\tcase models.EthnicityEnumCaucasian:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumCaucasian\n\tcase models.EthnicityEnumIndian:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumIndian\n\tcase models.EthnicityEnumLatin:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumLatin\n\tcase models.EthnicityEnumMiddleEastern:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumMiddleEastern\n\tcase models.EthnicityEnumMixed:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumMixed\n\tcase models.EthnicityEnumOther:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumOther\n\tdefault: // ignored\n\t}\n\treturn modelsEthnicityEnum\n}\nfunc (c *CreateParamsConverterImpl) modelsEyeColorEnumToModelsEyeColorEnum(source models.EyeColorEnum) models.EyeColorEnum {\n\tvar modelsEyeColorEnum models.EyeColorEnum\n\tswitch source {\n\tcase models.EyeColorEnumBlue:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumBlue\n\tcase models.EyeColorEnumBrown:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumBrown\n\tcase models.EyeColorEnumGreen:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumGreen\n\tcase models.EyeColorEnumGrey:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumGrey\n\tcase models.EyeColorEnumHazel:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumHazel\n\tcase models.EyeColorEnumRed:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumRed\n\tdefault: // ignored\n\t}\n\treturn modelsEyeColorEnum\n}\nfunc (c *CreateParamsConverterImpl) modelsGenderEnumToModelsGenderEnum(source models.GenderEnum) models.GenderEnum {\n\tvar modelsGenderEnum models.GenderEnum\n\tswitch source {\n\tcase models.GenderEnumFemale:\n\t\tmodelsGenderEnum = models.GenderEnumFemale\n\tcase models.GenderEnumIntersex:\n\t\tmodelsGenderEnum = models.GenderEnumIntersex\n\tcase models.GenderEnumMale:\n\t\tmodelsGenderEnum = models.GenderEnumMale\n\tcase models.GenderEnumNonBinary:\n\t\tmodelsGenderEnum = models.GenderEnumNonBinary\n\tcase models.GenderEnumTransgenderFemale:\n\t\tmodelsGenderEnum = models.GenderEnumTransgenderFemale\n\tcase models.GenderEnumTransgenderMale:\n\t\tmodelsGenderEnum = models.GenderEnumTransgenderMale\n\tdefault: // ignored\n\t}\n\treturn modelsGenderEnum\n}\nfunc (c *CreateParamsConverterImpl) modelsHairColorEnumToModelsHairColorEnum(source models.HairColorEnum) models.HairColorEnum {\n\tvar modelsHairColorEnum models.HairColorEnum\n\tswitch source {\n\tcase models.HairColorEnumAuburn:\n\t\tmodelsHairColorEnum = models.HairColorEnumAuburn\n\tcase models.HairColorEnumBald:\n\t\tmodelsHairColorEnum = models.HairColorEnumBald\n\tcase models.HairColorEnumBlack:\n\t\tmodelsHairColorEnum = models.HairColorEnumBlack\n\tcase models.HairColorEnumBlonde:\n\t\tmodelsHairColorEnum = models.HairColorEnumBlonde\n\tcase models.HairColorEnumBrunette:\n\t\tmodelsHairColorEnum = models.HairColorEnumBrunette\n\tcase models.HairColorEnumGrey:\n\t\tmodelsHairColorEnum = models.HairColorEnumGrey\n\tcase models.HairColorEnumOther:\n\t\tmodelsHairColorEnum = models.HairColorEnumOther\n\tcase models.HairColorEnumRed:\n\t\tmodelsHairColorEnum = models.HairColorEnumRed\n\tcase models.HairColorEnumVarious:\n\t\tmodelsHairColorEnum = models.HairColorEnumVarious\n\tcase models.HairColorEnumWhite:\n\t\tmodelsHairColorEnum = models.HairColorEnumWhite\n\tdefault: // ignored\n\t}\n\treturn modelsHairColorEnum\n}\nfunc (c *CreateParamsConverterImpl) uuidNullUUIDToUuidNullUUID(source uuid.NullUUID) uuid.NullUUID {\n\tvar uuidNullUUID uuid.NullUUID\n\tuuidNullUUID.UUID = c.uuidUUIDToUuidUUID(source.UUID)\n\tuuidNullUUID.Valid = source.Valid\n\treturn uuidNullUUID\n}\nfunc (c *CreateParamsConverterImpl) uuidUUIDToUuidUUID(source uuid.UUID) uuid.UUID {\n\tvar uuidUUID uuid.UUID\n\tfor i := 0; i < len(source); i++ {\n\t\tuuidUUID[i] = source[i]\n\t}\n\treturn uuidUUID\n}\n\ntype InputConverterImpl struct{}\n\nfunc (c *InputConverterImpl) ConvertBodyModInputSlice(source []models.BodyModificationInput) []models.BodyModification {\n\tvar modelsBodyModificationList []models.BodyModification\n\tif source != nil {\n\t\tmodelsBodyModificationList = make([]models.BodyModification, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tmodelsBodyModificationList[i] = c.modelsBodyModificationInputToModelsBodyModification(source[i])\n\t\t}\n\t}\n\treturn modelsBodyModificationList\n}\nfunc (c *InputConverterImpl) ConvertSceneDraftInput(source models.SceneDraftInput) models.SceneDraft {\n\tvar modelsSceneDraft models.SceneDraft\n\tmodelsSceneDraft.ID = c.pUuidUUIDToPUuidUUID(source.ID)\n\tif source.Title != nil {\n\t\txstring := *source.Title\n\t\tmodelsSceneDraft.Title = &xstring\n\t}\n\tif source.Code != nil {\n\t\txstring2 := *source.Code\n\t\tmodelsSceneDraft.Code = &xstring2\n\t}\n\tif source.Details != nil {\n\t\txstring3 := *source.Details\n\t\tmodelsSceneDraft.Details = &xstring3\n\t}\n\tif source.Director != nil {\n\t\txstring4 := *source.Director\n\t\tmodelsSceneDraft.Director = &xstring4\n\t}\n\tif source.Urls != nil {\n\t\tmodelsSceneDraft.URLs = make([]string, len(source.Urls))\n\t\tfor i := 0; i < len(source.Urls); i++ {\n\t\t\tmodelsSceneDraft.URLs[i] = source.Urls[i]\n\t\t}\n\t}\n\tif source.Date != nil {\n\t\txstring5 := *source.Date\n\t\tmodelsSceneDraft.Date = &xstring5\n\t}\n\tif source.ProductionDate != nil {\n\t\txstring6 := *source.ProductionDate\n\t\tmodelsSceneDraft.ProductionDate = &xstring6\n\t}\n\tmodelsSceneDraft.Studio = c.pModelsDraftEntityInputToPModelsDraftEntity(source.Studio)\n\tif source.Performers != nil {\n\t\tmodelsSceneDraft.Performers = make([]models.DraftEntity, len(source.Performers))\n\t\tfor j := 0; j < len(source.Performers); j++ {\n\t\t\tmodelsSceneDraft.Performers[j] = c.modelsDraftEntityInputToModelsDraftEntity(source.Performers[j])\n\t\t}\n\t}\n\tif source.Fingerprints != nil {\n\t\tmodelsSceneDraft.Fingerprints = make([]models.DraftFingerprint, len(source.Fingerprints))\n\t\tfor k := 0; k < len(source.Fingerprints); k++ {\n\t\t\tmodelsSceneDraft.Fingerprints[k] = c.modelsFingerprintInputToModelsDraftFingerprint(source.Fingerprints[k])\n\t\t}\n\t}\n\treturn modelsSceneDraft\n}\nfunc (c *InputConverterImpl) modelsBodyModificationInputToModelsBodyModification(source models.BodyModificationInput) models.BodyModification {\n\tvar modelsBodyModification models.BodyModification\n\tmodelsBodyModification.Location = source.Location\n\tif source.Description != nil {\n\t\txstring := *source.Description\n\t\tmodelsBodyModification.Description = &xstring\n\t}\n\treturn modelsBodyModification\n}\nfunc (c *InputConverterImpl) modelsDraftEntityInputToModelsDraftEntity(source models.DraftEntityInput) models.DraftEntity {\n\tvar modelsDraftEntity models.DraftEntity\n\tmodelsDraftEntity.Name = source.Name\n\tmodelsDraftEntity.ID = c.pUuidUUIDToPUuidUUID(source.ID)\n\treturn modelsDraftEntity\n}\nfunc (c *InputConverterImpl) modelsFingerprintAlgorithmToModelsFingerprintAlgorithm(source models.FingerprintAlgorithm) models.FingerprintAlgorithm {\n\tvar modelsFingerprintAlgorithm models.FingerprintAlgorithm\n\tswitch source {\n\tcase models.FingerprintAlgorithmMd5:\n\t\tmodelsFingerprintAlgorithm = models.FingerprintAlgorithmMd5\n\tcase models.FingerprintAlgorithmOshash:\n\t\tmodelsFingerprintAlgorithm = models.FingerprintAlgorithmOshash\n\tcase models.FingerprintAlgorithmPhash:\n\t\tmodelsFingerprintAlgorithm = models.FingerprintAlgorithmPhash\n\tdefault: // ignored\n\t}\n\treturn modelsFingerprintAlgorithm\n}\nfunc (c *InputConverterImpl) modelsFingerprintInputToModelsDraftFingerprint(source models.FingerprintInput) models.DraftFingerprint {\n\tvar modelsDraftFingerprint models.DraftFingerprint\n\tmodelsDraftFingerprint.Hash = models.FingerprintHash(source.Hash)\n\tmodelsDraftFingerprint.Algorithm = c.modelsFingerprintAlgorithmToModelsFingerprintAlgorithm(source.Algorithm)\n\tmodelsDraftFingerprint.Duration = source.Duration\n\treturn modelsDraftFingerprint\n}\nfunc (c *InputConverterImpl) pModelsDraftEntityInputToPModelsDraftEntity(source *models.DraftEntityInput) *models.DraftEntity {\n\tvar pModelsDraftEntity *models.DraftEntity\n\tif source != nil {\n\t\tvar modelsDraftEntity models.DraftEntity\n\t\tmodelsDraftEntity.Name = (*source).Name\n\t\tmodelsDraftEntity.ID = c.pUuidUUIDToPUuidUUID((*source).ID)\n\t\tpModelsDraftEntity = &modelsDraftEntity\n\t}\n\treturn pModelsDraftEntity\n}\nfunc (c *InputConverterImpl) pUuidUUIDToPUuidUUID(source *uuid.UUID) *uuid.UUID {\n\tvar pUuidUUID *uuid.UUID\n\tif source != nil {\n\t\tuuidUUID := c.uuidUUIDToUuidUUID2((*source))\n\t\tpUuidUUID = &uuidUUID\n\t}\n\treturn pUuidUUID\n}\nfunc (c *InputConverterImpl) uuidUUIDToUuidUUID2(source uuid.UUID) uuid.UUID {\n\tvar uuidUUID uuid.UUID\n\tfor i := 0; i < len(source); i++ {\n\t\tuuidUUID[i] = source[i]\n\t}\n\treturn uuidUUID\n}\n\ntype ModelConverterImpl struct{}\n\nfunc (c *ModelConverterImpl) ConvertEdit(source queries.Edit) models.Edit {\n\tvar modelsEdit models.Edit\n\tmodelsEdit.ID = c.uuidUUIDToUuidUUID3(source.ID)\n\tmodelsEdit.UserID = c.uuidNullUUIDToUuidNullUUID2(source.UserID)\n\tmodelsEdit.TargetType = source.TargetType\n\tmodelsEdit.Operation = source.Operation\n\tmodelsEdit.VoteCount = source.Votes\n\tmodelsEdit.Status = source.Status\n\tmodelsEdit.Applied = source.Applied\n\tmodelsEdit.Data = c.byteListToJsonRawMessage(source.Data)\n\tmodelsEdit.Bot = source.Bot\n\tmodelsEdit.CreatedAt = ConvertTime(source.CreatedAt)\n\tmodelsEdit.UpdateCount = source.UpdateCount\n\tmodelsEdit.UpdatedAt = c.pTimeTimeToPTimeTime(source.UpdatedAt)\n\tmodelsEdit.ClosedAt = c.pTimeTimeToPTimeTime(source.ClosedAt)\n\treturn modelsEdit\n}\nfunc (c *ModelConverterImpl) ConvertEditComment(source queries.EditComment) models.EditComment {\n\tvar modelsEditComment models.EditComment\n\tmodelsEditComment.ID = c.uuidUUIDToUuidUUID3(source.ID)\n\tmodelsEditComment.EditID = c.uuidUUIDToUuidUUID3(source.EditID)\n\tmodelsEditComment.UserID = c.uuidNullUUIDToUuidNullUUID2(source.UserID)\n\tmodelsEditComment.CreatedAt = ConvertTime(source.CreatedAt)\n\tmodelsEditComment.Text = source.Text\n\treturn modelsEditComment\n}\nfunc (c *ModelConverterImpl) ConvertEditComments(source []queries.EditComment) []models.EditComment {\n\tvar modelsEditCommentList []models.EditComment\n\tif source != nil {\n\t\tmodelsEditCommentList = make([]models.EditComment, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tmodelsEditCommentList[i] = c.ConvertEditComment(source[i])\n\t\t}\n\t}\n\treturn modelsEditCommentList\n}\nfunc (c *ModelConverterImpl) ConvertEditVote(source queries.EditVote) models.EditVote {\n\tvar modelsEditVote models.EditVote\n\tmodelsEditVote.EditID = c.uuidUUIDToUuidUUID3(source.EditID)\n\tmodelsEditVote.UserID = c.uuidUUIDToUuidUUID3(source.UserID)\n\tmodelsEditVote.CreatedAt = ConvertTime(source.CreatedAt)\n\tmodelsEditVote.Vote = source.Vote\n\treturn modelsEditVote\n}\nfunc (c *ModelConverterImpl) ConvertEditVotes(source []queries.EditVote) []models.EditVote {\n\tvar modelsEditVoteList []models.EditVote\n\tif source != nil {\n\t\tmodelsEditVoteList = make([]models.EditVote, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tmodelsEditVoteList[i] = c.ConvertEditVote(source[i])\n\t\t}\n\t}\n\treturn modelsEditVoteList\n}\nfunc (c *ModelConverterImpl) ConvertEdits(source []queries.Edit) []models.Edit {\n\tvar modelsEditList []models.Edit\n\tif source != nil {\n\t\tmodelsEditList = make([]models.Edit, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tmodelsEditList[i] = c.ConvertEdit(source[i])\n\t\t}\n\t}\n\treturn modelsEditList\n}\nfunc (c *ModelConverterImpl) ConvertImage(source queries.Image) models.Image {\n\tvar modelsImage models.Image\n\tmodelsImage.ID = c.uuidUUIDToUuidUUID3(source.ID)\n\tif source.Url != nil {\n\t\txstring := *source.Url\n\t\tmodelsImage.RemoteURL = &xstring\n\t}\n\tmodelsImage.Checksum = source.Checksum\n\tmodelsImage.Width = source.Width\n\tmodelsImage.Height = source.Height\n\treturn modelsImage\n}\nfunc (c *ModelConverterImpl) ConvertImages(source []queries.Image) []models.Image {\n\tvar modelsImageList []models.Image\n\tif source != nil {\n\t\tmodelsImageList = make([]models.Image, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tmodelsImageList[i] = c.ConvertImage(source[i])\n\t\t}\n\t}\n\treturn modelsImageList\n}\nfunc (c *ModelConverterImpl) ConvertInviteKey(source queries.InviteKey) models.InviteKey {\n\tvar modelsInviteKey models.InviteKey\n\tmodelsInviteKey.ID = c.uuidUUIDToUuidUUID3(source.ID)\n\tif source.Uses != nil {\n\t\txint := *source.Uses\n\t\tmodelsInviteKey.Uses = &xint\n\t}\n\tmodelsInviteKey.GeneratedBy = c.uuidUUIDToUuidUUID3(source.GeneratedBy)\n\tmodelsInviteKey.GeneratedAt = ConvertTime(source.GeneratedAt)\n\tmodelsInviteKey.Expires = c.pTimeTimeToPTimeTime(source.ExpireTime)\n\treturn modelsInviteKey\n}\nfunc (c *ModelConverterImpl) ConvertInviteKeys(source []queries.InviteKey) []models.InviteKey {\n\tvar modelsInviteKeyList []models.InviteKey\n\tif source != nil {\n\t\tmodelsInviteKeyList = make([]models.InviteKey, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tmodelsInviteKeyList[i] = c.ConvertInviteKey(source[i])\n\t\t}\n\t}\n\treturn modelsInviteKeyList\n}\nfunc (c *ModelConverterImpl) ConvertNotification(source queries.Notification) models.Notification {\n\tvar modelsNotification models.Notification\n\tmodelsNotification.UserID = c.uuidUUIDToUuidUUID3(source.UserID)\n\tmodelsNotification.Type = ConvertNotificationType(source.Type)\n\tmodelsNotification.TargetID = c.uuidUUIDToUuidUUID3(source.ID)\n\tmodelsNotification.CreatedAt = ConvertTime(source.CreatedAt)\n\tmodelsNotification.ReadAt = c.pTimeTimeToPTimeTime(source.ReadAt)\n\treturn modelsNotification\n}\nfunc (c *ModelConverterImpl) ConvertNotifications(source []queries.Notification) []models.Notification {\n\tvar modelsNotificationList []models.Notification\n\tif source != nil {\n\t\tmodelsNotificationList = make([]models.Notification, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tmodelsNotificationList[i] = c.ConvertNotification(source[i])\n\t\t}\n\t}\n\treturn modelsNotificationList\n}\nfunc (c *ModelConverterImpl) ConvertPerformer(source queries.Performer) models.Performer {\n\tvar modelsPerformer models.Performer\n\tmodelsPerformer.ID = c.uuidUUIDToUuidUUID3(source.ID)\n\tmodelsPerformer.Name = source.Name\n\tif source.Disambiguation != nil {\n\t\txstring := *source.Disambiguation\n\t\tmodelsPerformer.Disambiguation = &xstring\n\t}\n\tif source.Gender != nil {\n\t\tmodelsGenderEnum := c.modelsGenderEnumToModelsGenderEnum2(*source.Gender)\n\t\tmodelsPerformer.Gender = &modelsGenderEnum\n\t}\n\tif source.Birthdate != nil {\n\t\txstring2 := *source.Birthdate\n\t\tmodelsPerformer.BirthDate = &xstring2\n\t}\n\tif source.Deathdate != nil {\n\t\txstring3 := *source.Deathdate\n\t\tmodelsPerformer.DeathDate = &xstring3\n\t}\n\tif source.Ethnicity != nil {\n\t\tmodelsEthnicityEnum := c.modelsEthnicityEnumToModelsEthnicityEnum2(*source.Ethnicity)\n\t\tmodelsPerformer.Ethnicity = &modelsEthnicityEnum\n\t}\n\tif source.Country != nil {\n\t\txstring4 := *source.Country\n\t\tmodelsPerformer.Country = &xstring4\n\t}\n\tif source.EyeColor != nil {\n\t\tmodelsEyeColorEnum := c.modelsEyeColorEnumToModelsEyeColorEnum2(*source.EyeColor)\n\t\tmodelsPerformer.EyeColor = &modelsEyeColorEnum\n\t}\n\tif source.HairColor != nil {\n\t\tmodelsHairColorEnum := c.modelsHairColorEnumToModelsHairColorEnum2(*source.HairColor)\n\t\tmodelsPerformer.HairColor = &modelsHairColorEnum\n\t}\n\tif source.Height != nil {\n\t\txint := *source.Height\n\t\tmodelsPerformer.Height = &xint\n\t}\n\tif source.CupSize != nil {\n\t\txstring5 := *source.CupSize\n\t\tmodelsPerformer.CupSize = &xstring5\n\t}\n\tif source.BandSize != nil {\n\t\txint2 := *source.BandSize\n\t\tmodelsPerformer.BandSize = &xint2\n\t}\n\tif source.WaistSize != nil {\n\t\txint3 := *source.WaistSize\n\t\tmodelsPerformer.WaistSize = &xint3\n\t}\n\tif source.HipSize != nil {\n\t\txint4 := *source.HipSize\n\t\tmodelsPerformer.HipSize = &xint4\n\t}\n\tif source.BreastType != nil {\n\t\tmodelsBreastTypeEnum := c.modelsBreastTypeEnumToModelsBreastTypeEnum2(*source.BreastType)\n\t\tmodelsPerformer.BreastType = &modelsBreastTypeEnum\n\t}\n\tif source.CareerStartYear != nil {\n\t\txint5 := *source.CareerStartYear\n\t\tmodelsPerformer.CareerStartYear = &xint5\n\t}\n\tif source.CareerEndYear != nil {\n\t\txint6 := *source.CareerEndYear\n\t\tmodelsPerformer.CareerEndYear = &xint6\n\t}\n\tmodelsPerformer.Deleted = source.Deleted\n\tmodelsPerformer.Created = ConvertTime(source.CreatedAt)\n\tmodelsPerformer.Updated = ConvertTime(source.UpdatedAt)\n\treturn modelsPerformer\n}\nfunc (c *ModelConverterImpl) ConvertPerformers(source []queries.Performer) []models.Performer {\n\tvar modelsPerformerList []models.Performer\n\tif source != nil {\n\t\tmodelsPerformerList = make([]models.Performer, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tmodelsPerformerList[i] = c.ConvertPerformer(source[i])\n\t\t}\n\t}\n\treturn modelsPerformerList\n}\nfunc (c *ModelConverterImpl) ConvertScene(source queries.Scene) models.Scene {\n\tvar modelsScene models.Scene\n\tmodelsScene.ID = c.uuidUUIDToUuidUUID3(source.ID)\n\tif source.Title != nil {\n\t\txstring := *source.Title\n\t\tmodelsScene.Title = &xstring\n\t}\n\tif source.Details != nil {\n\t\txstring2 := *source.Details\n\t\tmodelsScene.Details = &xstring2\n\t}\n\tif source.Date != nil {\n\t\txstring3 := *source.Date\n\t\tmodelsScene.Date = &xstring3\n\t}\n\tif source.ProductionDate != nil {\n\t\txstring4 := *source.ProductionDate\n\t\tmodelsScene.ProductionDate = &xstring4\n\t}\n\tmodelsScene.StudioID = c.uuidNullUUIDToUuidNullUUID2(source.StudioID)\n\tmodelsScene.CreatedAt = ConvertTime(source.CreatedAt)\n\tmodelsScene.UpdatedAt = ConvertTime(source.UpdatedAt)\n\tif source.Duration != nil {\n\t\txint := *source.Duration\n\t\tmodelsScene.Duration = &xint\n\t}\n\tif source.Director != nil {\n\t\txstring5 := *source.Director\n\t\tmodelsScene.Director = &xstring5\n\t}\n\tif source.Code != nil {\n\t\txstring6 := *source.Code\n\t\tmodelsScene.Code = &xstring6\n\t}\n\tmodelsScene.Deleted = source.Deleted\n\treturn modelsScene\n}\nfunc (c *ModelConverterImpl) ConvertScenes(source []queries.Scene) []models.Scene {\n\tvar modelsSceneList []models.Scene\n\tif source != nil {\n\t\tmodelsSceneList = make([]models.Scene, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tmodelsSceneList[i] = c.ConvertScene(source[i])\n\t\t}\n\t}\n\treturn modelsSceneList\n}\nfunc (c *ModelConverterImpl) ConvertSite(source queries.Site) models.Site {\n\tvar modelsSite models.Site\n\tmodelsSite.ID = c.uuidUUIDToUuidUUID3(source.ID)\n\tmodelsSite.Name = source.Name\n\tif source.Description != nil {\n\t\txstring := *source.Description\n\t\tmodelsSite.Description = &xstring\n\t}\n\tif source.Url != nil {\n\t\txstring2 := *source.Url\n\t\tmodelsSite.URL = &xstring2\n\t}\n\tif source.Regex != nil {\n\t\txstring3 := *source.Regex\n\t\tmodelsSite.Regex = &xstring3\n\t}\n\tif source.ValidTypes != nil {\n\t\tmodelsSite.ValidTypes = make([]string, len(source.ValidTypes))\n\t\tfor i := 0; i < len(source.ValidTypes); i++ {\n\t\t\tmodelsSite.ValidTypes[i] = source.ValidTypes[i]\n\t\t}\n\t}\n\tmodelsSite.CreatedAt = ConvertTime(source.CreatedAt)\n\tmodelsSite.UpdatedAt = ConvertTime(source.UpdatedAt)\n\treturn modelsSite\n}\nfunc (c *ModelConverterImpl) ConvertStudio(source queries.Studio) models.Studio {\n\tvar modelsStudio models.Studio\n\tmodelsStudio.ID = c.uuidUUIDToUuidUUID3(source.ID)\n\tmodelsStudio.Name = source.Name\n\tmodelsStudio.ParentStudioID = c.uuidNullUUIDToUuidNullUUID2(source.ParentStudioID)\n\tmodelsStudio.CreatedAt = ConvertTime(source.CreatedAt)\n\tmodelsStudio.UpdatedAt = ConvertTime(source.UpdatedAt)\n\tmodelsStudio.Deleted = source.Deleted\n\treturn modelsStudio\n}\nfunc (c *ModelConverterImpl) ConvertStudios(source []queries.Studio) []models.Studio {\n\tvar modelsStudioList []models.Studio\n\tif source != nil {\n\t\tmodelsStudioList = make([]models.Studio, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tmodelsStudioList[i] = c.ConvertStudio(source[i])\n\t\t}\n\t}\n\treturn modelsStudioList\n}\nfunc (c *ModelConverterImpl) ConvertTag(source queries.Tag) models.Tag {\n\tvar modelsTag models.Tag\n\tmodelsTag.ID = c.uuidUUIDToUuidUUID3(source.ID)\n\tmodelsTag.Name = source.Name\n\tif source.Description != nil {\n\t\txstring := *source.Description\n\t\tmodelsTag.Description = &xstring\n\t}\n\tmodelsTag.Deleted = source.Deleted\n\tmodelsTag.CategoryID = c.uuidNullUUIDToUuidNullUUID2(source.CategoryID)\n\tmodelsTag.Created = ConvertTime(source.CreatedAt)\n\tmodelsTag.Updated = ConvertTime(source.UpdatedAt)\n\treturn modelsTag\n}\nfunc (c *ModelConverterImpl) ConvertTagCategories(source []queries.TagCategory) []models.TagCategory {\n\tvar modelsTagCategoryList []models.TagCategory\n\tif source != nil {\n\t\tmodelsTagCategoryList = make([]models.TagCategory, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tmodelsTagCategoryList[i] = c.ConvertTagCategory(source[i])\n\t\t}\n\t}\n\treturn modelsTagCategoryList\n}\nfunc (c *ModelConverterImpl) ConvertTagCategory(source queries.TagCategory) models.TagCategory {\n\tvar modelsTagCategory models.TagCategory\n\tmodelsTagCategory.ID = c.uuidUUIDToUuidUUID3(source.ID)\n\tmodelsTagCategory.Name = source.Name\n\tmodelsTagCategory.Group = source.Group\n\tif source.Description != nil {\n\t\txstring := *source.Description\n\t\tmodelsTagCategory.Description = &xstring\n\t}\n\tmodelsTagCategory.CreatedAt = ConvertTime(source.CreatedAt)\n\tmodelsTagCategory.UpdatedAt = ConvertTime(source.UpdatedAt)\n\treturn modelsTagCategory\n}\nfunc (c *ModelConverterImpl) ConvertTags(source []queries.Tag) []models.Tag {\n\tvar modelsTagList []models.Tag\n\tif source != nil {\n\t\tmodelsTagList = make([]models.Tag, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tmodelsTagList[i] = c.ConvertTag(source[i])\n\t\t}\n\t}\n\treturn modelsTagList\n}\nfunc (c *ModelConverterImpl) ConvertUser(source queries.User) models.User {\n\tvar modelsUser models.User\n\tmodelsUser.ID = c.uuidUUIDToUuidUUID3(source.ID)\n\tmodelsUser.Name = source.Name\n\tmodelsUser.PasswordHash = source.PasswordHash\n\tmodelsUser.Email = source.Email\n\tmodelsUser.APIKey = source.ApiKey\n\tmodelsUser.APICalls = ConvertNullIntToInt(source.ApiCalls)\n\tmodelsUser.InviteTokens = source.InviteTokens\n\tmodelsUser.InvitedByID = c.uuidNullUUIDToUuidNullUUID2(source.InvitedBy)\n\tmodelsUser.LastAPICall = ConvertTime(source.LastApiCall)\n\tmodelsUser.CreatedAt = ConvertTime(source.CreatedAt)\n\tmodelsUser.UpdatedAt = ConvertTime(source.UpdatedAt)\n\treturn modelsUser\n}\nfunc (c *ModelConverterImpl) ConvertUserToken(source queries.UserToken) models.UserToken {\n\tvar modelsUserToken models.UserToken\n\tmodelsUserToken.ID = c.uuidUUIDToUuidUUID3(source.ID)\n\tmodelsUserToken.Data = c.byteListToJsonRawMessage(source.Data)\n\tmodelsUserToken.Type = source.Type\n\tmodelsUserToken.CreatedAt = ConvertTime(source.CreatedAt)\n\tmodelsUserToken.ExpiresAt = ConvertTime(source.ExpiresAt)\n\treturn modelsUserToken\n}\nfunc (c *ModelConverterImpl) byteListToJsonRawMessage(source []uint8) json.RawMessage {\n\tvar jsonRawMessage json.RawMessage\n\tif source != nil {\n\t\tjsonRawMessage = make(json.RawMessage, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tjsonRawMessage[i] = source[i]\n\t\t}\n\t}\n\treturn jsonRawMessage\n}\nfunc (c *ModelConverterImpl) modelsBreastTypeEnumToModelsBreastTypeEnum2(source models.BreastTypeEnum) models.BreastTypeEnum {\n\tvar modelsBreastTypeEnum models.BreastTypeEnum\n\tswitch source {\n\tcase models.BreastTypeEnumFake:\n\t\tmodelsBreastTypeEnum = models.BreastTypeEnumFake\n\tcase models.BreastTypeEnumNa:\n\t\tmodelsBreastTypeEnum = models.BreastTypeEnumNa\n\tcase models.BreastTypeEnumNatural:\n\t\tmodelsBreastTypeEnum = models.BreastTypeEnumNatural\n\tdefault: // ignored\n\t}\n\treturn modelsBreastTypeEnum\n}\nfunc (c *ModelConverterImpl) modelsEthnicityEnumToModelsEthnicityEnum2(source models.EthnicityEnum) models.EthnicityEnum {\n\tvar modelsEthnicityEnum models.EthnicityEnum\n\tswitch source {\n\tcase models.EthnicityEnumAsian:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumAsian\n\tcase models.EthnicityEnumBlack:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumBlack\n\tcase models.EthnicityEnumCaucasian:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumCaucasian\n\tcase models.EthnicityEnumIndian:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumIndian\n\tcase models.EthnicityEnumLatin:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumLatin\n\tcase models.EthnicityEnumMiddleEastern:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumMiddleEastern\n\tcase models.EthnicityEnumMixed:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumMixed\n\tcase models.EthnicityEnumOther:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumOther\n\tdefault: // ignored\n\t}\n\treturn modelsEthnicityEnum\n}\nfunc (c *ModelConverterImpl) modelsEyeColorEnumToModelsEyeColorEnum2(source models.EyeColorEnum) models.EyeColorEnum {\n\tvar modelsEyeColorEnum models.EyeColorEnum\n\tswitch source {\n\tcase models.EyeColorEnumBlue:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumBlue\n\tcase models.EyeColorEnumBrown:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumBrown\n\tcase models.EyeColorEnumGreen:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumGreen\n\tcase models.EyeColorEnumGrey:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumGrey\n\tcase models.EyeColorEnumHazel:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumHazel\n\tcase models.EyeColorEnumRed:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumRed\n\tdefault: // ignored\n\t}\n\treturn modelsEyeColorEnum\n}\nfunc (c *ModelConverterImpl) modelsGenderEnumToModelsGenderEnum2(source models.GenderEnum) models.GenderEnum {\n\tvar modelsGenderEnum models.GenderEnum\n\tswitch source {\n\tcase models.GenderEnumFemale:\n\t\tmodelsGenderEnum = models.GenderEnumFemale\n\tcase models.GenderEnumIntersex:\n\t\tmodelsGenderEnum = models.GenderEnumIntersex\n\tcase models.GenderEnumMale:\n\t\tmodelsGenderEnum = models.GenderEnumMale\n\tcase models.GenderEnumNonBinary:\n\t\tmodelsGenderEnum = models.GenderEnumNonBinary\n\tcase models.GenderEnumTransgenderFemale:\n\t\tmodelsGenderEnum = models.GenderEnumTransgenderFemale\n\tcase models.GenderEnumTransgenderMale:\n\t\tmodelsGenderEnum = models.GenderEnumTransgenderMale\n\tdefault: // ignored\n\t}\n\treturn modelsGenderEnum\n}\nfunc (c *ModelConverterImpl) modelsHairColorEnumToModelsHairColorEnum2(source models.HairColorEnum) models.HairColorEnum {\n\tvar modelsHairColorEnum models.HairColorEnum\n\tswitch source {\n\tcase models.HairColorEnumAuburn:\n\t\tmodelsHairColorEnum = models.HairColorEnumAuburn\n\tcase models.HairColorEnumBald:\n\t\tmodelsHairColorEnum = models.HairColorEnumBald\n\tcase models.HairColorEnumBlack:\n\t\tmodelsHairColorEnum = models.HairColorEnumBlack\n\tcase models.HairColorEnumBlonde:\n\t\tmodelsHairColorEnum = models.HairColorEnumBlonde\n\tcase models.HairColorEnumBrunette:\n\t\tmodelsHairColorEnum = models.HairColorEnumBrunette\n\tcase models.HairColorEnumGrey:\n\t\tmodelsHairColorEnum = models.HairColorEnumGrey\n\tcase models.HairColorEnumOther:\n\t\tmodelsHairColorEnum = models.HairColorEnumOther\n\tcase models.HairColorEnumRed:\n\t\tmodelsHairColorEnum = models.HairColorEnumRed\n\tcase models.HairColorEnumVarious:\n\t\tmodelsHairColorEnum = models.HairColorEnumVarious\n\tcase models.HairColorEnumWhite:\n\t\tmodelsHairColorEnum = models.HairColorEnumWhite\n\tdefault: // ignored\n\t}\n\treturn modelsHairColorEnum\n}\nfunc (c *ModelConverterImpl) pTimeTimeToPTimeTime(source *time.Time) *time.Time {\n\tvar pTimeTime *time.Time\n\tif source != nil {\n\t\ttimeTime := ConvertTime((*source))\n\t\tpTimeTime = &timeTime\n\t}\n\treturn pTimeTime\n}\nfunc (c *ModelConverterImpl) uuidNullUUIDToUuidNullUUID2(source uuid.NullUUID) uuid.NullUUID {\n\tvar uuidNullUUID uuid.NullUUID\n\tuuidNullUUID.UUID = c.uuidUUIDToUuidUUID3(source.UUID)\n\tuuidNullUUID.Valid = source.Valid\n\treturn uuidNullUUID\n}\nfunc (c *ModelConverterImpl) uuidUUIDToUuidUUID3(source uuid.UUID) uuid.UUID {\n\tvar uuidUUID uuid.UUID\n\tfor i := 0; i < len(source); i++ {\n\t\tuuidUUID[i] = source[i]\n\t}\n\treturn uuidUUID\n}\n\ntype UpdateParamsConverterImpl struct{}\n\nfunc (c *UpdateParamsConverterImpl) ConvertEditToUpdateParams(source models.Edit) queries.UpdateEditParams {\n\tvar queriesUpdateEditParams queries.UpdateEditParams\n\tqueriesUpdateEditParams.ID = c.uuidUUIDToUuidUUID4(source.ID)\n\tqueriesUpdateEditParams.Data = c.jsonRawMessageToByteList2(source.Data)\n\tqueriesUpdateEditParams.Votes = source.VoteCount\n\tqueriesUpdateEditParams.Status = source.Status\n\tqueriesUpdateEditParams.Applied = source.Applied\n\tqueriesUpdateEditParams.ClosedAt = c.pTimeTimeToPTimeTime2(source.ClosedAt)\n\tqueriesUpdateEditParams.UpdateCount = source.UpdateCount\n\treturn queriesUpdateEditParams\n}\nfunc (c *UpdateParamsConverterImpl) ConvertPerformerToUpdateParams(source models.Performer) queries.UpdatePerformerParams {\n\tvar queriesUpdatePerformerParams queries.UpdatePerformerParams\n\tqueriesUpdatePerformerParams.ID = c.uuidUUIDToUuidUUID4(source.ID)\n\tqueriesUpdatePerformerParams.Name = source.Name\n\tif source.Disambiguation != nil {\n\t\txstring := *source.Disambiguation\n\t\tqueriesUpdatePerformerParams.Disambiguation = &xstring\n\t}\n\tif source.Gender != nil {\n\t\tmodelsGenderEnum := c.modelsGenderEnumToModelsGenderEnum3(*source.Gender)\n\t\tqueriesUpdatePerformerParams.Gender = &modelsGenderEnum\n\t}\n\tif source.BirthDate != nil {\n\t\txstring2 := *source.BirthDate\n\t\tqueriesUpdatePerformerParams.Birthdate = &xstring2\n\t}\n\tif source.Ethnicity != nil {\n\t\tmodelsEthnicityEnum := c.modelsEthnicityEnumToModelsEthnicityEnum3(*source.Ethnicity)\n\t\tqueriesUpdatePerformerParams.Ethnicity = &modelsEthnicityEnum\n\t}\n\tif source.Country != nil {\n\t\txstring3 := *source.Country\n\t\tqueriesUpdatePerformerParams.Country = &xstring3\n\t}\n\tif source.EyeColor != nil {\n\t\tmodelsEyeColorEnum := c.modelsEyeColorEnumToModelsEyeColorEnum3(*source.EyeColor)\n\t\tqueriesUpdatePerformerParams.EyeColor = &modelsEyeColorEnum\n\t}\n\tif source.HairColor != nil {\n\t\tmodelsHairColorEnum := c.modelsHairColorEnumToModelsHairColorEnum3(*source.HairColor)\n\t\tqueriesUpdatePerformerParams.HairColor = &modelsHairColorEnum\n\t}\n\tif source.Height != nil {\n\t\txint := *source.Height\n\t\tqueriesUpdatePerformerParams.Height = &xint\n\t}\n\tif source.CupSize != nil {\n\t\txstring4 := *source.CupSize\n\t\tqueriesUpdatePerformerParams.CupSize = &xstring4\n\t}\n\tif source.BandSize != nil {\n\t\txint2 := *source.BandSize\n\t\tqueriesUpdatePerformerParams.BandSize = &xint2\n\t}\n\tif source.HipSize != nil {\n\t\txint3 := *source.HipSize\n\t\tqueriesUpdatePerformerParams.HipSize = &xint3\n\t}\n\tif source.WaistSize != nil {\n\t\txint4 := *source.WaistSize\n\t\tqueriesUpdatePerformerParams.WaistSize = &xint4\n\t}\n\tif source.BreastType != nil {\n\t\tmodelsBreastTypeEnum := c.modelsBreastTypeEnumToModelsBreastTypeEnum3(*source.BreastType)\n\t\tqueriesUpdatePerformerParams.BreastType = &modelsBreastTypeEnum\n\t}\n\tif source.CareerStartYear != nil {\n\t\txint5 := *source.CareerStartYear\n\t\tqueriesUpdatePerformerParams.CareerStartYear = &xint5\n\t}\n\tif source.CareerEndYear != nil {\n\t\txint6 := *source.CareerEndYear\n\t\tqueriesUpdatePerformerParams.CareerEndYear = &xint6\n\t}\n\tif source.DeathDate != nil {\n\t\txstring5 := *source.DeathDate\n\t\tqueriesUpdatePerformerParams.Deathdate = &xstring5\n\t}\n\treturn queriesUpdatePerformerParams\n}\nfunc (c *UpdateParamsConverterImpl) ConvertSceneToUpdateParams(source models.Scene) queries.UpdateSceneParams {\n\tvar queriesUpdateSceneParams queries.UpdateSceneParams\n\tqueriesUpdateSceneParams.ID = c.uuidUUIDToUuidUUID4(source.ID)\n\tif source.Title != nil {\n\t\txstring := *source.Title\n\t\tqueriesUpdateSceneParams.Title = &xstring\n\t}\n\tif source.Details != nil {\n\t\txstring2 := *source.Details\n\t\tqueriesUpdateSceneParams.Details = &xstring2\n\t}\n\tif source.Date != nil {\n\t\txstring3 := *source.Date\n\t\tqueriesUpdateSceneParams.Date = &xstring3\n\t}\n\tif source.ProductionDate != nil {\n\t\txstring4 := *source.ProductionDate\n\t\tqueriesUpdateSceneParams.ProductionDate = &xstring4\n\t}\n\tqueriesUpdateSceneParams.StudioID = c.uuidNullUUIDToUuidNullUUID3(source.StudioID)\n\tif source.Duration != nil {\n\t\txint := *source.Duration\n\t\tqueriesUpdateSceneParams.Duration = &xint\n\t}\n\tif source.Director != nil {\n\t\txstring5 := *source.Director\n\t\tqueriesUpdateSceneParams.Director = &xstring5\n\t}\n\tif source.Code != nil {\n\t\txstring6 := *source.Code\n\t\tqueriesUpdateSceneParams.Code = &xstring6\n\t}\n\treturn queriesUpdateSceneParams\n}\nfunc (c *UpdateParamsConverterImpl) ConvertSiteToUpdateParams(source models.Site) queries.UpdateSiteParams {\n\tvar queriesUpdateSiteParams queries.UpdateSiteParams\n\tqueriesUpdateSiteParams.ID = c.uuidUUIDToUuidUUID4(source.ID)\n\tqueriesUpdateSiteParams.Name = source.Name\n\tif source.Description != nil {\n\t\txstring := *source.Description\n\t\tqueriesUpdateSiteParams.Description = &xstring\n\t}\n\tif source.URL != nil {\n\t\txstring2 := *source.URL\n\t\tqueriesUpdateSiteParams.Url = &xstring2\n\t}\n\tif source.Regex != nil {\n\t\txstring3 := *source.Regex\n\t\tqueriesUpdateSiteParams.Regex = &xstring3\n\t}\n\tif source.ValidTypes != nil {\n\t\tqueriesUpdateSiteParams.ValidTypes = make([]string, len(source.ValidTypes))\n\t\tfor i := 0; i < len(source.ValidTypes); i++ {\n\t\t\tqueriesUpdateSiteParams.ValidTypes[i] = source.ValidTypes[i]\n\t\t}\n\t}\n\treturn queriesUpdateSiteParams\n}\nfunc (c *UpdateParamsConverterImpl) ConvertStudioToUpdateParams(source models.Studio) queries.UpdateStudioParams {\n\tvar queriesUpdateStudioParams queries.UpdateStudioParams\n\tqueriesUpdateStudioParams.ID = c.uuidUUIDToUuidUUID4(source.ID)\n\tqueriesUpdateStudioParams.Name = source.Name\n\tqueriesUpdateStudioParams.ParentStudioID = c.uuidNullUUIDToUuidNullUUID3(source.ParentStudioID)\n\treturn queriesUpdateStudioParams\n}\nfunc (c *UpdateParamsConverterImpl) ConvertTagToUpdateParams(source models.Tag) queries.UpdateTagParams {\n\tvar queriesUpdateTagParams queries.UpdateTagParams\n\tqueriesUpdateTagParams.ID = c.uuidUUIDToUuidUUID4(source.ID)\n\tqueriesUpdateTagParams.Name = source.Name\n\tqueriesUpdateTagParams.CategoryID = c.uuidNullUUIDToUuidNullUUID3(source.CategoryID)\n\tif source.Description != nil {\n\t\txstring := *source.Description\n\t\tqueriesUpdateTagParams.Description = &xstring\n\t}\n\treturn queriesUpdateTagParams\n}\nfunc (c *UpdateParamsConverterImpl) jsonRawMessageToByteList2(source json.RawMessage) []uint8 {\n\tvar byteList []uint8\n\tif source != nil {\n\t\tbyteList = make([]uint8, len(source))\n\t\tfor i := 0; i < len(source); i++ {\n\t\t\tbyteList[i] = source[i]\n\t\t}\n\t}\n\treturn byteList\n}\nfunc (c *UpdateParamsConverterImpl) modelsBreastTypeEnumToModelsBreastTypeEnum3(source models.BreastTypeEnum) models.BreastTypeEnum {\n\tvar modelsBreastTypeEnum models.BreastTypeEnum\n\tswitch source {\n\tcase models.BreastTypeEnumFake:\n\t\tmodelsBreastTypeEnum = models.BreastTypeEnumFake\n\tcase models.BreastTypeEnumNa:\n\t\tmodelsBreastTypeEnum = models.BreastTypeEnumNa\n\tcase models.BreastTypeEnumNatural:\n\t\tmodelsBreastTypeEnum = models.BreastTypeEnumNatural\n\tdefault: // ignored\n\t}\n\treturn modelsBreastTypeEnum\n}\nfunc (c *UpdateParamsConverterImpl) modelsEthnicityEnumToModelsEthnicityEnum3(source models.EthnicityEnum) models.EthnicityEnum {\n\tvar modelsEthnicityEnum models.EthnicityEnum\n\tswitch source {\n\tcase models.EthnicityEnumAsian:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumAsian\n\tcase models.EthnicityEnumBlack:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumBlack\n\tcase models.EthnicityEnumCaucasian:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumCaucasian\n\tcase models.EthnicityEnumIndian:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumIndian\n\tcase models.EthnicityEnumLatin:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumLatin\n\tcase models.EthnicityEnumMiddleEastern:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumMiddleEastern\n\tcase models.EthnicityEnumMixed:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumMixed\n\tcase models.EthnicityEnumOther:\n\t\tmodelsEthnicityEnum = models.EthnicityEnumOther\n\tdefault: // ignored\n\t}\n\treturn modelsEthnicityEnum\n}\nfunc (c *UpdateParamsConverterImpl) modelsEyeColorEnumToModelsEyeColorEnum3(source models.EyeColorEnum) models.EyeColorEnum {\n\tvar modelsEyeColorEnum models.EyeColorEnum\n\tswitch source {\n\tcase models.EyeColorEnumBlue:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumBlue\n\tcase models.EyeColorEnumBrown:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumBrown\n\tcase models.EyeColorEnumGreen:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumGreen\n\tcase models.EyeColorEnumGrey:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumGrey\n\tcase models.EyeColorEnumHazel:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumHazel\n\tcase models.EyeColorEnumRed:\n\t\tmodelsEyeColorEnum = models.EyeColorEnumRed\n\tdefault: // ignored\n\t}\n\treturn modelsEyeColorEnum\n}\nfunc (c *UpdateParamsConverterImpl) modelsGenderEnumToModelsGenderEnum3(source models.GenderEnum) models.GenderEnum {\n\tvar modelsGenderEnum models.GenderEnum\n\tswitch source {\n\tcase models.GenderEnumFemale:\n\t\tmodelsGenderEnum = models.GenderEnumFemale\n\tcase models.GenderEnumIntersex:\n\t\tmodelsGenderEnum = models.GenderEnumIntersex\n\tcase models.GenderEnumMale:\n\t\tmodelsGenderEnum = models.GenderEnumMale\n\tcase models.GenderEnumNonBinary:\n\t\tmodelsGenderEnum = models.GenderEnumNonBinary\n\tcase models.GenderEnumTransgenderFemale:\n\t\tmodelsGenderEnum = models.GenderEnumTransgenderFemale\n\tcase models.GenderEnumTransgenderMale:\n\t\tmodelsGenderEnum = models.GenderEnumTransgenderMale\n\tdefault: // ignored\n\t}\n\treturn modelsGenderEnum\n}\nfunc (c *UpdateParamsConverterImpl) modelsHairColorEnumToModelsHairColorEnum3(source models.HairColorEnum) models.HairColorEnum {\n\tvar modelsHairColorEnum models.HairColorEnum\n\tswitch source {\n\tcase models.HairColorEnumAuburn:\n\t\tmodelsHairColorEnum = models.HairColorEnumAuburn\n\tcase models.HairColorEnumBald:\n\t\tmodelsHairColorEnum = models.HairColorEnumBald\n\tcase models.HairColorEnumBlack:\n\t\tmodelsHairColorEnum = models.HairColorEnumBlack\n\tcase models.HairColorEnumBlonde:\n\t\tmodelsHairColorEnum = models.HairColorEnumBlonde\n\tcase models.HairColorEnumBrunette:\n\t\tmodelsHairColorEnum = models.HairColorEnumBrunette\n\tcase models.HairColorEnumGrey:\n\t\tmodelsHairColorEnum = models.HairColorEnumGrey\n\tcase models.HairColorEnumOther:\n\t\tmodelsHairColorEnum = models.HairColorEnumOther\n\tcase models.HairColorEnumRed:\n\t\tmodelsHairColorEnum = models.HairColorEnumRed\n\tcase models.HairColorEnumVarious:\n\t\tmodelsHairColorEnum = models.HairColorEnumVarious\n\tcase models.HairColorEnumWhite:\n\t\tmodelsHairColorEnum = models.HairColorEnumWhite\n\tdefault: // ignored\n\t}\n\treturn modelsHairColorEnum\n}\nfunc (c *UpdateParamsConverterImpl) pTimeTimeToPTimeTime2(source *time.Time) *time.Time {\n\tvar pTimeTime *time.Time\n\tif source != nil {\n\t\ttimeTime := ConvertTime((*source))\n\t\tpTimeTime = &timeTime\n\t}\n\treturn pTimeTime\n}\nfunc (c *UpdateParamsConverterImpl) uuidNullUUIDToUuidNullUUID3(source uuid.NullUUID) uuid.NullUUID {\n\tvar uuidNullUUID uuid.NullUUID\n\tuuidNullUUID.UUID = c.uuidUUIDToUuidUUID4(source.UUID)\n\tuuidNullUUID.Valid = source.Valid\n\treturn uuidNullUUID\n}\nfunc (c *UpdateParamsConverterImpl) uuidUUIDToUuidUUID4(source uuid.UUID) uuid.UUID {\n\tvar uuidUUID uuid.UUID\n\tfor i := 0; i < len(source); i++ {\n\t\tuuidUUID[i] = source[i]\n\t}\n\treturn uuidUUID\n}\n"
  },
  {
    "path": "internal/converter/gen/interfaces.go",
    "content": "package gen\n\n//go:generate go run github.com/jmattheis/goverter/cmd/goverter gen .\n\nimport (\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n)\n\n// ModelConverter handles all DB to Model conversions\n// goverter:converter\n// goverter:output:file ./generated.go\n// goverter:enum:unknown @ignore\n// goverter:extend ConvertNullIntToInt ConvertTime\ntype ModelConverter interface {\n\t// goverter:map Url RemoteURL\n\tConvertImage(source queries.Image) models.Image\n\n\t// goverter:map CreatedAt Created\n\t// goverter:map UpdatedAt Updated\n\t// goverter:map Birthdate BirthDate\n\t// goverter:map Deathdate DeathDate\n\tConvertPerformer(source queries.Performer) models.Performer\n\n\t// goverter:map CreatedAt CreatedAt\n\t// goverter:map UpdatedAt UpdatedAt\n\tConvertScene(source queries.Scene) models.Scene\n\n\t// goverter:map Url URL\n\tConvertSite(source queries.Site) models.Site\n\n\t// goverter:map CreatedAt CreatedAt\n\t// goverter:map UpdatedAt UpdatedAt\n\tConvertStudio(source queries.Studio) models.Studio\n\n\t// goverter:map CreatedAt CreatedAt\n\t// goverter:map UpdatedAt UpdatedAt\n\tConvertTagCategory(source queries.TagCategory) models.TagCategory\n\n\t// goverter:map CreatedAt Created\n\t// goverter:map UpdatedAt Updated\n\tConvertTag(source queries.Tag) models.Tag\n\n\t// goverter:map CreatedAt CreatedAt\n\t// goverter:map ExpiresAt ExpiresAt\n\tConvertUserToken(source queries.UserToken) models.UserToken\n\n\t// goverter:map Votes VoteCount\n\tConvertEdit(source queries.Edit) models.Edit\n\n\tConvertEditVote(source queries.EditVote) models.EditVote\n\n\tConvertEditComment(source queries.EditComment) models.EditComment\n\n\t// goverter:map ApiKey APIKey\n\t// goverter:map ApiCalls APICalls\n\t// goverter:map InvitedBy InvitedByID\n\t// goverter:map LastApiCall LastAPICall\n\tConvertUser(source queries.User) models.User\n\n\t// goverter:map ExpireTime Expires\n\tConvertInviteKey(source queries.InviteKey) models.InviteKey\n\n\t// goverter:map ID TargetID\n\t// goverter:map Type Type | ConvertNotificationType\n\tConvertNotification(source queries.Notification) models.Notification\n\n\t// Slice converters\n\tConvertImages(source []queries.Image) []models.Image\n\tConvertEdits(source []queries.Edit) []models.Edit\n\tConvertEditComments(source []queries.EditComment) []models.EditComment\n\tConvertEditVotes(source []queries.EditVote) []models.EditVote\n\tConvertPerformers(source []queries.Performer) []models.Performer\n\tConvertScenes(source []queries.Scene) []models.Scene\n\tConvertStudios(source []queries.Studio) []models.Studio\n\tConvertTagCategories(source []queries.TagCategory) []models.TagCategory\n\tConvertTags(source []queries.Tag) []models.Tag\n\tConvertInviteKeys(source []queries.InviteKey) []models.InviteKey\n\tConvertNotifications(source []queries.Notification) []models.Notification\n}\n\n// InputConverter handles all Input to Model conversions\n// goverter:converter\n// goverter:output:file ./generated.go\n// goverter:enum:unknown @ignore\ntype InputConverter interface {\n\t// goverter:map Urls URLs\n\t// goverter:map Studio\n\t// goverter:ignore Tags\n\t// goverter:ignore Image\n\tConvertSceneDraftInput(source models.SceneDraftInput) models.SceneDraft\n\n\tConvertBodyModInputSlice(source []models.BodyModificationInput) []models.BodyModification\n}\n\n// CreateParamsConverter handles all Model to DB Create Params conversions\n// goverter:converter\n// goverter:output:file ./generated.go\n// goverter:enum:unknown @ignore\n// goverter:extend ConvertTime\ntype CreateParamsConverter interface {\n\tConvertTagToCreateParams(source models.Tag) queries.CreateTagParams\n\n\tConvertStudioToCreateParams(source models.Studio) queries.CreateStudioParams\n\n\tConvertSceneToCreateParams(source models.Scene) queries.CreateSceneParams\n\n\t// goverter:map BirthDate Birthdate\n\t// goverter:map DeathDate Deathdate\n\tConvertPerformerToCreateParams(source models.Performer) queries.CreatePerformerParams\n\n\t// goverter:map UserID\n\t// goverter:map VoteCount Votes\n\tConvertEditToCreateParams(source models.Edit) queries.CreateEditParams\n\n\t// goverter:map URL Url\n\tConvertSiteToCreateParams(source models.Site) queries.CreateSiteParams\n\n\tConvertEditCommentToCreateParams(source models.EditComment) queries.CreateEditCommentParams\n}\n\n// UpdateParamsConverter handles all Model to DB Update Params conversions\n// goverter:converter\n// goverter:output:file ./generated.go\n// goverter:enum:unknown @ignore\n// goverter:extend ConvertTime\ntype UpdateParamsConverter interface {\n\tConvertSceneToUpdateParams(source models.Scene) queries.UpdateSceneParams\n\n\t// goverter:map BirthDate Birthdate\n\t// goverter:map DeathDate Deathdate\n\tConvertPerformerToUpdateParams(source models.Performer) queries.UpdatePerformerParams\n\n\t// goverter:map VoteCount Votes\n\tConvertEditToUpdateParams(source models.Edit) queries.UpdateEditParams\n\n\t// goverter:map URL Url\n\tConvertSiteToUpdateParams(source models.Site) queries.UpdateSiteParams\n\n\tConvertTagToUpdateParams(source models.Tag) queries.UpdateTagParams\n\n\tConvertStudioToUpdateParams(source models.Studio) queries.UpdateStudioParams\n}\n"
  },
  {
    "path": "internal/cron/cron.go",
    "content": "package cron\n\nimport (\n\t\"context\"\n\n\t\"github.com/robfig/cron/v3\"\n\t\"golang.org/x/sync/semaphore\"\n\n\t\"github.com/stashapp/stash-box/internal/autocert\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/service\"\n\t\"github.com/stashapp/stash-box/pkg/logger\"\n)\n\nvar sem = semaphore.NewWeighted(1)\n\ntype Cron struct {\n\tfac service.Factory\n}\n\n// processEdits runs at set intervals and closes edits where the voting period has ended,\n// either by applying the edit if enough positive votes have been cast, or by rejecting it.\nfunc (c Cron) processEdits() {\n\tif !sem.TryAcquire(1) {\n\t\tlogger.Debug(\"Edit cronjob failed to start, already running.\")\n\t\treturn\n\t}\n\tdefer sem.Release(1)\n\n\tctx := context.Background()\n\tclosedEdits, err := c.fac.Edit().CloseCompleted(ctx)\n\n\tif err != nil {\n\t\tlogger.Errorf(\"Error processing edits: %s\", err)\n\t}\n\n\t// Trigger notifications for all closed edits\n\tfor _, edit := range closedEdits {\n\t\tc.fac.Notification().OnApplyEdit(context.Background(), edit)\n\t}\n}\n\nfunc (c Cron) cleanDrafts() {\n\tctx := context.Background()\n\terr := c.fac.Draft().DeleteExpired(ctx)\n\n\tif err != nil {\n\t\tlogger.Errorf(\"Error cleaning drafts: %s\", err)\n\t}\n}\n\nfunc (c Cron) cleanTokens() {\n\tctx := context.Background()\n\terr := c.fac.UserToken().DestroyExpired(ctx)\n\n\tif err != nil {\n\t\tlogger.Errorf(\"Error cleaning user tokens: %s\", err)\n\t}\n}\n\nfunc (c Cron) cleanInvites() {\n\tctx := context.Background()\n\terr := c.fac.Invite().DestroyExpired(ctx)\n\n\tif err != nil {\n\t\tlogger.Errorf(\"Error cleaning invites: %s\", err)\n\t}\n}\n\nfunc (c Cron) cleanNotifications() {\n\tctx := context.Background()\n\n\terr := c.fac.Notification().DestroyExpired(ctx)\n\tif err != nil {\n\t\tlogger.Errorf(\"Error cleaning notifications: %s\", err)\n\t}\n}\n\nfunc (c Cron) cleanModAudits() {\n\tctx := context.Background()\n\tretentionDays := config.GetModAuditRetentionDays()\n\n\tif retentionDays <= 0 {\n\t\treturn\n\t}\n\n\terr := c.fac.ModAudit().DeleteExpired(ctx, retentionDays)\n\tif err != nil {\n\t\tlogger.Errorf(\"Error cleaning mod audit logs: %s\", err)\n\t}\n}\n\nfunc Init(fac service.Factory) {\n\tc := cron.New()\n\tcronJobs := Cron{fac}\n\n\t_, err := c.AddFunc(\"@every 5m\", cronJobs.cleanDrafts)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\t_, err = c.AddFunc(\"@every 1m\", cronJobs.cleanTokens)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\t_, err = c.AddFunc(\"@every 60m\", cronJobs.cleanNotifications)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\t_, err = c.AddFunc(\"@every 60m\", cronJobs.cleanInvites)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\t_, err = c.AddFunc(\"@every 12h\", cronJobs.cleanModAudits)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\tif config.GetAutocertConfig() != nil {\n\t\t_, err = c.AddFunc(\"@daily\", autocert.CheckAndRenew)\n\t\tif err != nil {\n\t\t\tpanic(err.Error())\n\t\t}\n\t}\n\n\tinterval := config.GetVoteCronInterval()\n\tif interval != \"\" {\n\t\t_, err := c.AddFunc(\"@every \"+config.GetVoteCronInterval(), cronJobs.processEdits)\n\t\tif err != nil {\n\t\t\tpanic(err.Error())\n\t\t}\n\n\t\tc.Start()\n\t\tlogger.Debugf(\"Edit cronjob initialized to run every %s\", interval)\n\t}\n}\n"
  },
  {
    "path": "internal/database/database.go",
    "content": "package database\n\nimport (\n\t\"context\"\n\t\"embed\"\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/exaring/otelpgx\"\n\t\"github.com/golang-migrate/migrate/v4\"\n\t\"github.com/golang-migrate/migrate/v4/source/iofs\"\n\t\"github.com/jackc/pgx/v5/pgxpool\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/pkg/logger\"\n\n\t// Register pgx stdlib driver and postgres migrate driver\n\t_ \"github.com/golang-migrate/migrate/v4/database/postgres\"\n\t_ \"github.com/jackc/pgx/v5/stdlib\"\n)\n\nconst (\n\tpostgresDriver = \"postgres\"\n\tschemaVersion  = 57\n)\n\n//go:embed migrations/postgres/*.sql\nvar migrationsFS embed.FS\n\n// extractSQLCQueryName extracts the query name from sqlc-generated SQL comments\n// sqlc embeds query names as comments like: \"-- name: GetUser :one\"\n// For non-sqlc queries, returns the full query (otelpgx default behavior)\nfunc extractSQLCQueryName(query string) string {\n\t// Check if the query starts with a sqlc name comment\n\tif strings.HasPrefix(query, \"-- name:\") {\n\t\tparts := strings.Fields(query)\n\t\tif len(parts) > 2 {\n\t\t\treturn parts[2] // Return the query name (e.g., \"GetUser\")\n\t\t}\n\t}\n\treturn query // Fallback to full query for non-sqlc queries (default otelpgx behavior)\n}\n\n// Initialize opens a PostgreSQL connection pool and runs migrations\nfunc Initialize(databasePath string) *pgxpool.Pool {\n\tif err := runMigrations(databasePath); err != nil {\n\t\tlogger.Fatal(err)\n\t}\n\n\t// Parse connection string into pgxpool config\n\tpoolConfig, err := pgxpool.ParseConfig(\"postgres://\" + databasePath)\n\tif err != nil {\n\t\tlogger.Fatal(err)\n\t}\n\n\t// Set connection pool configuration\n\tpoolConfig.MaxConns = int32(config.GetMaxOpenConns())\n\tpoolConfig.MinConns = int32(config.GetMaxIdleConns())\n\tpoolConfig.MaxConnLifetime = time.Duration(config.GetConnMaxLifetime()) * time.Minute\n\n\t// Add otelpgx tracing with custom span name function to use sqlc query names\n\tpoolConfig.ConnConfig.Tracer = otelpgx.NewTracer(\n\t\totelpgx.WithTrimSQLInSpanName(),\n\t\totelpgx.WithSpanNameFunc(extractSQLCQueryName),\n\t)\n\n\t// Create connection pool\n\tpool, err := pgxpool.NewWithConfig(context.Background(), poolConfig)\n\tif err != nil {\n\t\tlogger.Fatal(err)\n\t}\n\n\treturn pool\n}\n\n// runMigrations runs database migrations\nfunc runMigrations(databasePath string) error {\n\tmigrations, err := iofs.New(migrationsFS, \"migrations/postgres\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create migration source: %w\", err)\n\t}\n\n\tm, err := migrate.NewWithSourceInstance(\n\t\t\"iofs\",\n\t\tmigrations,\n\t\tfmt.Sprintf(\"%s://%s\", postgresDriver, databasePath),\n\t)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to initialize migration: %w\", err)\n\t}\n\tdefer m.Close()\n\n\tm.Log = &migrateLogger{}\n\n\tdatabaseSchemaVersion, _, _ := m.Version()\n\tstepNumber := schemaVersion - databaseSchemaVersion\n\tif stepNumber != 0 {\n\t\terr = m.Steps(int(stepNumber))\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to run database migrations: %w\", err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\ntype migrateLogger struct {\n\tmigrate.Logger\n}\n\n// Printf is like fmt.Printf\nfunc (*migrateLogger) Printf(format string, v ...any) {\n\tlogger.Debugf(\"Migration: \"+format, v...)\n}\n\n// Verbose should return true when verbose logging output is wanted\nfunc (*migrateLogger) Verbose() bool {\n\treturn true\n}\n"
  },
  {
    "path": "internal/database/migrations/postgres/01_initial.down.sql",
    "content": "DROP TABLE IF EXISTS \"scene_fingerprints\";\nDROP TABLE IF EXISTS \"scene_performers\";\nDROP TABLE IF EXISTS \"scene_tags\";\nDROP TABLE IF EXISTS \"studio_urls\";\nDROP TABLE IF EXISTS \"tag_aliases\";\nDROP TABLE IF EXISTS \"performer_aliases\";\nDROP TABLE IF EXISTS \"performer_urls\";\nDROP TABLE IF EXISTS \"performer_piercings\";\nDROP TABLE IF EXISTS \"performer_tattoos\";\nDROP TABLE IF EXISTS \"scenes\";\nDROP TABLE IF EXISTS \"scene_urls\";\nDROP TABLE IF EXISTS \"tags\";\nDROP TABLE IF EXISTS \"performers\";\nDROP TABLE IF EXISTS \"studios\";\n\n\n"
  },
  {
    "path": "internal/database/migrations/postgres/01_initial.up.sql",
    "content": "CREATE TABLE \"performers\" (\n  \"id\" uuid not null primary key,\n  \"name\" varchar(255) not null,\n  \"disambiguation\" varchar(255),\n  \"gender\" varchar(20),\n  \"birthdate\" date,\n  \"birthdate_accuracy\" varchar(10),\n  \"ethnicity\" varchar(20),\n  \"country\" varchar(255),\n  \"eye_color\" varchar(10),\n  \"hair_color\" varchar(10),\n  \"height\" integer,\n  \"cup_size\" varchar(5),\n  \"band_size\" integer,\n  \"hip_size\" integer,\n  \"waist_size\" integer,\n  \"breast_type\" varchar(10),\n  \"career_start_year\" integer,\n  \"career_end_year\" integer,\n  \"created_at\" timestamp not null,\n  \"updated_at\" timestamp not null\n);\n\nCREATE TABLE \"performer_aliases\" (\n  \"performer_id\" uuid not null,\n  \"alias\" varchar(255) not null,\n  foreign key(\"performer_id\") references \"performers\"(\"id\") ON DELETE CASCADE,\n  unique (\"performer_id\", \"alias\")\n);\n\nCREATE TABLE \"performer_urls\" (\n  \"performer_id\" uuid not null,\n  \"url\" varchar not null,\n  \"type\" varchar(255) not null,\n  foreign key(\"performer_id\") references \"performers\"(\"id\") ON DELETE CASCADE,\n  unique (\"performer_id\", \"url\"),\n  unique (\"performer_id\", \"type\")\n);\n\nCREATE TABLE \"performer_piercings\" (\n  \"performer_id\" uuid not null,\n  \"location\" varchar(255),\n  \"description\" varchar(255),\n  foreign key(\"performer_id\") references \"performers\"(\"id\") ON DELETE CASCADE,\n  unique (\"performer_id\", \"location\")\n);\n\nCREATE TABLE \"performer_tattoos\" (\n  \"performer_id\" uuid not null,\n  \"location\" varchar(255),\n  \"description\" varchar(255),\n  foreign key(\"performer_id\") references \"performers\"(\"id\") ON DELETE CASCADE,\n  unique (\"performer_id\", \"location\")\n);\n\nCREATE INDEX \"index_performers_on_name\" on \"performers\" (\"name\");\nCREATE INDEX \"index_performers_on_alias\" on \"performer_aliases\" (\"alias\");\nCREATE INDEX \"index_performers_on_piercing_location\" on \"performer_piercings\" (\"location\");\nCREATE INDEX \"index_performers_on_tattoo_location\" on \"performer_tattoos\" (\"location\");\nCREATE INDEX \"index_performers_on_tattoo_description\" on \"performer_tattoos\" (\"description\");\n\nCREATE TABLE \"tags\" (\n  \"id\" uuid not null primary key,\n  \"name\" varchar(255) not null,\n  \"description\" varchar(255),\n  \"created_at\" timestamp  not null,\n  \"updated_at\" timestamp  not null,\n  unique (\"name\")\n);\n\nCREATE TABLE \"tag_aliases\" (\n  \"tag_id\" uuid not null,\n  \"alias\" varchar(255) not null,\n  foreign key(\"tag_id\") references \"tags\"(\"id\") ON DELETE CASCADE,\n  unique (\"alias\")\n);\n\nCREATE TABLE \"studios\" (\n  \"id\" uuid not null primary key,\n  \"name\" varchar(255) not null,\n  \"parent_studio_id\" uuid,\n  \"created_at\" timestamp  not null,\n  \"updated_at\" timestamp  not null,\n  foreign key(\"parent_studio_id\") references \"studios\"(\"id\") ON DELETE CASCADE\n);\n\nCREATE TABLE \"studio_urls\" (\n  \"studio_id\" uuid not null,\n  \"url\" varchar not null,\n  \"type\" varchar(255) not null,\n  foreign key(\"studio_id\") references \"studios\"(\"id\") ON DELETE CASCADE,\n  unique (\"studio_id\", \"url\"),\n  unique (\"studio_id\", \"type\")\n);\n\nCREATE TABLE \"scenes\" (\n  \"id\" uuid not null primary key,\n  \"title\" varchar(255),\n  \"details\" text,\n  \"date\" date,\n  \"studio_id\" uuid,\n  \"created_at\" timestamp  not null,\n  \"updated_at\" timestamp  not null,\n  foreign key(\"studio_id\") references \"studios\"(\"id\") ON DELETE SET NULL\n);\n\nCREATE TABLE \"scene_urls\" (\n  \"scene_id\" uuid not null,\n  \"url\" varchar not null,\n  \"type\" varchar(255) not null,\n  foreign key(\"scene_id\") references \"scenes\"(\"id\") ON DELETE CASCADE,\n  unique (\"scene_id\", \"url\"),\n  unique (\"scene_id\", \"type\")\n);\n\nCREATE TABLE \"scene_fingerprints\" (\n  \"scene_id\" uuid not null,\n  \"hash\" varchar(255) not null,\n  \"algorithm\" varchar(20) not null,\n  foreign key(\"scene_id\") references \"scenes\"(\"id\") ON DELETE CASCADE,\n  unique (\"scene_id\", \"algorithm\", \"hash\")\n);\n\nCREATE INDEX \"index_scene_fingerprints_on_hash\" on \"scene_fingerprints\" (\"algorithm\", \"hash\");\n\nCREATE TABLE \"scene_performers\" (\n  \"scene_id\" uuid not null,\n  \"as\" varchar(255),\n  \"performer_id\" uuid not null,\n  foreign key(\"scene_id\") references \"scenes\"(\"id\") ON DELETE CASCADE,\n  foreign key(\"performer_id\") references \"performers\"(\"id\") ON DELETE CASCADE,\n  unique(\"scene_id\", \"performer_id\")\n);\n\nCREATE TABLE \"scene_tags\" (\n  \"scene_id\" uuid not null,\n  \"tag_id\" uuid not null,\n  foreign key(\"scene_id\") references \"scenes\"(\"id\") ON DELETE CASCADE,\n  foreign key(\"tag_id\") references \"tags\"(\"id\") ON DELETE CASCADE,\n  unique(\"scene_id\", \"tag_id\")\n);\n\nCREATE TABLE \"users\" (\n  \"id\" uuid not null primary key,\n  \"name\" varchar(255) not null,\n  \"password_hash\" varchar(60) not null,\n  \"email\" varchar(255) not null,\n  \"api_key\" varchar(255) not null,\n  \"api_calls\" integer default 0,\n  \"last_api_call\" timestamp not null,\n  \"created_at\" timestamp not null,\n  \"updated_at\" timestamp not null,\n  unique (\"name\"),\n  unique (\"email\")\n);\n\nCREATE TABLE \"user_roles\" (\n  \"user_id\" uuid not null,\n  \"role\" varchar(10) not null,\n  foreign key(\"user_id\") references \"users\"(\"id\") ON DELETE CASCADE,\n  unique (\"user_id\", \"role\")\n);\n\nCREATE INDEX \"index_users_on_name\" on \"users\" (\"name\");\nCREATE INDEX \"index_users_on_email\" on \"users\" (\"email\");\nCREATE INDEX \"index_users_on_api_key\" on \"users\" (\"api_key\");\n\n"
  },
  {
    "path": "internal/database/migrations/postgres/02_create_search.down.sql",
    "content": "DROP TABLE scene_search;\nDROP INDEX name_trgm_idx;\n\nDROP FUNCTION update_performers CASCADE;\n\nDROP FUNCTION update_scene CASCADE;\n\nDROP FUNCTION insert_scene CASCADE;\n\nDROP FUNCTION update_studio CASCADE;\n\nDROP FUNCTION update_scene_performers CASCADE;\n"
  },
  {
    "path": "internal/database/migrations/postgres/02_create_search.up.sql",
    "content": "DO $$\nBEGIN\n  IF current_setting('is_superuser') = 'on' THEN\n    CREATE EXTENSION IF NOT EXISTS pg_trgm;\n  END IF;\nEND$$;\n\nCREATE TABLE scene_search AS \nSELECT\n\tS.id as scene_id,\n\tREGEXP_REPLACE(S.title, '[^a-zA-Z0-9 ]+', '', 'g') AS scene_title,\n\tS.date::TEXT AS scene_date,\n\tT.name || ' ' || REGEXP_REPLACE(T.name, '[^a-zA-Z0-9]', '', 'g') || ' ' || CASE WHEN TP.name IS NOT NULL THEN (TP.name || ' ' || REGEXP_REPLACE(TP.name, '[^a-zA-Z0-9]', '', 'g') ) ELSE '' END AS studio_name,\n\tSTRING_AGG(P.name, ' ') || COALESCE(STRING_AGG(PS.as , ''), '') AS performer_names\nFROM scenes S\nLEFT JOIN scene_performers PS ON PS.scene_id = S.id\nLEFT JOIN performers P ON PS.performer_id = P.id\nLEFT JOIN studios T ON T.id = S.studio_id\nLEFT JOIN studios TP ON T.parent_studio_id = TP.id\nGROUP BY S.id, S.title, T.name, TP.name;\n\nCREATE INDEX name_trgm_idx ON performers USING GIN (name gin_trgm_ops);\nCREATE INDEX ts_idx ON scene_search USING gist (\n\t(\n        to_tsvector('simple', COALESCE(scene_date, '')) ||\n        to_tsvector('english', studio_name) ||\n        to_tsvector('english', COALESCE(performer_names, '')) ||\n        to_tsvector('english', scene_title)\n\t)\n);\n\nCREATE OR REPLACE FUNCTION update_performers() RETURNS TRIGGER AS $$\nBEGIN\nIF (NEW.name != OLD.name) THEN\nUPDATE scene_search SET performer_names = SUBQUERY.performer_names\nFROM (\nSELECT S.id as scene_id, STRING_AGG(P.name, ' ') || COALESCE(STRING_AGG(PS.as , ''), '') AS performer_names\nFROM scenes S\n LEFT JOIN scene_performers PS ON PS.scene_id = S.id\n LEFT JOIN performers P ON PS.performer_id = P.id\n WHERE P.id = NEW.id\n GROUP BY S.id\n) SUBQUERY\nWHERE scene_search.scene_id = SUBQUERY.scene_id;\nEND IF;\nRETURN NULL;\nEND;\n$$ LANGUAGE plpgsql; --The trigger used to update a table.\n\nDROP TRIGGER IF EXISTS update_performer_search_name ON performers;\nCREATE TRIGGER update_performer_search_name AFTER UPDATE ON performers FOR EACH ROW EXECUTE PROCEDURE update_performers();\n\nCREATE OR REPLACE FUNCTION update_scene() RETURNS TRIGGER AS $$\nBEGIN\nIF (NEW.title != OLD.title OR New.date != OLD.date) THEN\nUPDATE scene_search\nSET scene_title = REGEXP_REPLACE(NEW.title, '[^a-zA-Z0-9 ]+', '', 'g'), scene_date = NEW.date\nWHERE scene_id = NEW.id;\nEND IF;\nRETURN NULL;\nEND;\n$$ LANGUAGE plpgsql; --The trigger used to update a table.\n\nDROP TRIGGER IF EXISTS update_scene_search_title ON scenes;\nCREATE TRIGGER update_scene_search_title AFTER UPDATE ON scenes FOR EACH ROW EXECUTE PROCEDURE update_scene();\n\nCREATE OR REPLACE FUNCTION insert_scene() RETURNS TRIGGER AS $$\nBEGIN\nINSERT INTO scene_search (scene_id, scene_title, scene_date, studio_name)\nSELECT\n\tNEW.id,\n\tREGEXP_REPLACE(NEW.title, '[^a-zA-Z0-9 ]+', '', 'g'),\n\tNEW.date,\n\tT.name || ' ' || REGEXP_REPLACE(T.name, '[^a-zA-Z0-9]', '', 'g') || ' ' || CASE WHEN TP.name IS NOT NULL THEN (TP.name || ' ' || REGEXP_REPLACE(TP.name, '[^a-zA-Z0-9]', '', 'g') ) ELSE '' END\nFROM studios T\nLEFT JOIN studios TP ON T.parent_studio_id = TP.id\nWHERE T.id = NEW.studio_id;\nRETURN NULL;\nEND;\n$$ LANGUAGE plpgsql; --The trigger used to update a table.\n\nDROP TRIGGER IF EXISTS insert_scene_search ON scenes;\nCREATE TRIGGER insert_scene_search AFTER INSERT ON scenes FOR EACH ROW EXECUTE PROCEDURE insert_scene();\n\nCREATE OR REPLACE FUNCTION update_studio() RETURNS TRIGGER AS $$\nBEGIN\nIF (NEW.name != OLD.name) THEN\nUPDATE scene_search SET studio_name = SUBQUERY.name\nFROM (\n\tSELECT\n\t\tS.id,\n\t\tT.name || ' ' || REGEXP_REPLACE(T.name, '[^a-zA-Z0-9]', '', 'g') || ' ' || CASE WHEN TP.name IS NOT NULL THEN (TP.name || ' ' || REGEXP_REPLACE(TP.name, '[^a-zA-Z0-9]', '', 'g') ) ELSE '' END AS name\n\tFROM scenes S\n\tLEFT JOIN studios T ON T.id = S.studio_id \n\tLEFT JOIN studios TP ON T.parent_studio_id = TP.id\n\tWHERE T.id = NEW.id\n    OR TP.id = NEW.id\n) SUBQUERY\nWHERE scene_id = SUBQUERY.id;\nEND IF;\nRETURN NULL;\nEND;\n$$ LANGUAGE plpgsql; --The trigger used to update a table.\n\nDROP TRIGGER IF EXISTS update_studio_search_name ON studios;\nCREATE TRIGGER update_studio_search_name AFTER UPDATE ON studios FOR EACH ROW EXECUTE PROCEDURE update_studio();\n\nCREATE OR REPLACE FUNCTION update_scene_performers() RETURNS TRIGGER AS $$\nBEGIN\nUPDATE scene_search SET performer_names = SUBQUERY.performer_names\nFROM (\nSELECT S.id as scene_id, STRING_AGG(P.name, ' ') || COALESCE(STRING_AGG(PS.as , ''), '') AS performer_names\nFROM scenes S\n LEFT JOIN scene_performers PS ON PS.scene_id = S.id\n LEFT JOIN performers P ON PS.performer_id = P.id\n WHERE S.id = OLD.scene_id\n GROUP BY S.id\n) SUBQUERY\nWHERE scene_search.scene_id = SUBQUERY.scene_id;\nRETURN NULL;\nEND;\n$$ LANGUAGE plpgsql; --The trigger used to update a table.\n\nDROP TRIGGER IF EXISTS update_scene_performers_search ON scene_performers;\nCREATE TRIGGER update_scene_performers_search AFTER INSERT OR UPDATE OR DELETE ON scene_performers FOR EACH ROW EXECUTE PROCEDURE update_scene_performers();\n"
  },
  {
    "path": "internal/database/migrations/postgres/03_misc.up.sql",
    "content": "ALTER TABLE \"scenes\"\nADD COLUMN duration integer,\nADD COLUMN director TEXT;\n\nALTER TABLE \"scene_fingerprints\"\nADD COLUMN duration int;\n"
  },
  {
    "path": "internal/database/migrations/postgres/04_image_tables.up.sql",
    "content": "CREATE TABLE images (\n    id uuid PRIMARY KEY,\n    url VARCHAR NOT NULL,\n    width INT,\n    height INT\n);\n\nCREATE TABLE scene_images (\n    scene_id uuid REFERENCES scenes(id) NOT NULL,\n    image_id uuid REFERENCES images(id) NOT NULL\n);\n\nCREATE TABLE performer_images (\n    performer_id uuid REFERENCES performers(id) NOT NULL,\n    image_id uuid REFERENCES images(id) NOT NULL\n);\n\nCREATE TABLE studio_images (\n    studio_id uuid REFERENCES studios(id) NOT NULL,\n    image_id uuid REFERENCES images(id) NOT NULL\n);\n"
  },
  {
    "path": "internal/database/migrations/postgres/05_edits.up.sql",
    "content": "CREATE TABLE \"edits\" (\n  \"id\" uuid not null primary key,\n  \"user_id\" uuid,\n  \"operation\" varchar(10) not null,\n  \"target_type\" varchar(10) not null,\n  \"data\" jsonb,\n  \"votes\" integer not null default 0,\n  \"status\" varchar(20) not null,\n  \"applied\" boolean default FALSE not null,\n  \"created_at\" timestamp not null,\n  \"updated_at\" timestamp not null,\n  foreign key(\"user_id\") references \"users\"(\"id\") on delete set null\n);\nCREATE INDEX edit_merge_sources_idx ON edits USING gin ((data->'merge_sources') jsonb_path_ops);\n\nCREATE TABLE \"edit_comments\" (\n  \"id\" UUID not null primary key,\n  \"edit_id\" UUID not null,\n  \"user_id\" UUID,\n  \"created_at\" TIMESTAMP not null,\n  \"text\" TEXT not null,\n  FOREIGN KEY(\"edit_id\") REFERENCES \"edits\"(\"id\") ON DELETE CASCADE,\n  FOREIGN KEY(\"user_id\") REFERENCES \"users\"(\"id\") ON DELETE SET NULL \n);\n\nCREATE TABLE \"performer_edits\" (\n  \"edit_id\" uuid not null,\n  \"performer_id\" uuid not null,\n  foreign key(\"edit_id\") references \"edits\"(\"id\"),\n  foreign key(\"performer_id\") references \"performers\"(\"id\")\n);\n\nCREATE TABLE \"studio_edits\" (\n  \"edit_id\" uuid not null,\n  \"studio_id\" uuid not null,\n  foreign key(\"edit_id\") references \"edits\"(\"id\"),\n  foreign key(\"studio_id\") references \"studios\"(\"id\")\n);\n\nCREATE TABLE \"tag_edits\" (\n  \"edit_id\" uuid not null,\n  \"tag_id\" uuid not null,\n  foreign key(\"edit_id\") references \"edits\"(\"id\"),\n  foreign key(\"tag_id\") references \"tags\"(\"id\")\n);\n\nCREATE TABLE \"scene_edits\" (\n  \"edit_id\" uuid not null,\n  \"scene_id\" uuid not null,\n  foreign key(\"edit_id\") references \"edits\"(\"id\"),\n  foreign key(\"scene_id\") references \"scenes\"(\"id\")\n);\n"
  },
  {
    "path": "internal/database/migrations/postgres/06_deletion_and_redirects.up.sql",
    "content": "ALTER TABLE tags ADD COLUMN \"deleted\" BOOLEAN NOT NULL DEFAULT FALSE;\nALTER TABLE performers ADD COLUMN \"deleted\" BOOLEAN NOT NULL DEFAULT FALSE;\nALTER TABLE scenes ADD COLUMN \"deleted\" BOOLEAN NOT NULL DEFAULT FALSE;\nALTER TABLE studios ADD COLUMN \"deleted\" BOOLEAN NOT NULL DEFAULT FALSE;\n\nALTER TABLE tags DROP CONSTRAINT \"tags_name_key\";\nCREATE UNIQUE INDEX \"index_active_tags_on_name\" on \"tags\" (\"name\") WHERE NOT \"deleted\";\nDROP INDEX \"index_performers_on_name\";\nCREATE UNIQUE INDEX \"index_active_performers_on_name\" on \"performers\" (\"name\", \"disambiguation\") WHERE NOT \"deleted\";\n\nCREATE TABLE \"tag_redirects\" (\n  \"source_id\" UUID NOT NULL,\n  \"target_id\" UUID NOT NULL,\n  FOREIGN KEY(\"source_id\") REFERENCES \"tags\"(\"id\") ON DELETE CASCADE,\n  FOREIGN KEY(\"target_id\") REFERENCES \"tags\"(\"id\") ON DELETE CASCADE,\n  PRIMARY KEY (\"source_id\")\n);\n\nCREATE TABLE \"performer_redirects\" (\n  \"source_id\" UUID NOT NULL,\n  \"target_id\" UUID NOT NULL,\n  FOREIGN KEY(\"source_id\") REFERENCES \"performers\"(\"id\") ON DELETE CASCADE,\n  FOREIGN KEY(\"target_id\") REFERENCES \"performers\"(\"id\") ON DELETE CASCADE,\n  PRIMARY KEY (\"source_id\")\n);\n\nCREATE TABLE \"scene_redirects\" (\n  \"source_id\" UUID NOT NULL,\n  \"target_id\" UUID NOT NULL,\n  FOREIGN KEY(\"source_id\") REFERENCES \"scenes\"(\"id\") ON DELETE CASCADE,\n  FOREIGN KEY(\"target_id\") REFERENCES \"scenes\"(\"id\") ON DELETE CASCADE,\n  PRIMARY KEY (\"source_id\")\n);\n\nCREATE TABLE \"studio_redirects\" (\n  \"source_id\" UUID NOT NULL,\n  \"target_id\" UUID NOT NULL,\n  FOREIGN KEY(\"source_id\") REFERENCES \"studios\"(\"id\") ON DELETE CASCADE,\n  FOREIGN KEY(\"target_id\") REFERENCES \"studios\"(\"id\") ON DELETE CASCADE,\n  PRIMARY KEY (\"source_id\")\n);\n"
  },
  {
    "path": "internal/database/migrations/postgres/07_optimization_indexes.up.sql",
    "content": "CREATE INDEX performer_images_performer_id_idx ON performer_images (performer_id);\nCREATE INDEX scenes_date_idx ON scenes (date DESC NULLS LAST);\nCREATE INDEX scene_images_scene_id_idx ON scene_images (scene_id);\nCREATE INDEX scene_performers_performer_idx ON scene_performers (performer_id);\nCREATE INDEX scene_tags_tag_id_idx ON scene_tags (tag_id);\nCREATE INDEX scene_fingerprints_hash_idx ON scene_fingerprints (hash);\nCREATE INDEX studio_images_studio_id_idx ON studio_images (studio_id);\nCREATE INDEX tag_aliases_tag_id_idx ON tag_aliases (tag_id);\nCREATE INDEX tags_name_idx ON tags (name);\n"
  },
  {
    "path": "internal/database/migrations/postgres/08_user_invite.up.sql",
    "content": "ALTER TABLE \"users\"\n  ADD COLUMN \"invited_by\" uuid,\n  ADD COLUMN \"invite_tokens\" integer not null default 0,\n  ADD foreign key(\"invited_by\") references \"users\"(\"id\") ON DELETE SET NULL;\n\nCREATE INDEX \"user_invited_by_idx\" ON \"users\" (\"invited_by\");\n\nCREATE TABLE \"invite_keys\" (\n  \"id\" uuid not null primary key,\n  \"generated_by\" uuid not null,\n  \"generated_at\" timestamp not null,\n  foreign key(\"generated_by\") references \"users\"(\"id\") on delete cascade\n);\n\nCREATE INDEX \"invite_keys_generated_by_idx\" ON \"invite_keys\" (\"generated_by\");\n\nCREATE TABLE \"pending_activations\" (\n  \"id\" uuid not null primary key,\n  \"email\" varchar(255) not null,\n  \"invite_key\" uuid,\n  \"type\" varchar(255) not null,\n  \"time\" timestamp not null,\n  foreign key(\"invite_key\") references \"invite_keys\"(\"id\")\n);\n\nCREATE UNIQUE INDEX \"pending_activation_email_idx\" on \"pending_activations\" (\"email\");\nCREATE UNIQUE INDEX \"pending_activation_invite_key_idx\" on \"pending_activations\" (\"invite_key\");\n"
  },
  {
    "path": "internal/database/migrations/postgres/09_image_data.up.sql",
    "content": "ALTER TABLE \"images\" ADD COLUMN \"checksum\" varchar(255) NOT NULL;\nALTER TABLE \"images\" ALTER COLUMN \"url\" DROP NOT NULL;\nALTER TABLE \"images\" ALTER COLUMN \"width\" SET NOT NULL;\nALTER TABLE \"images\" ALTER COLUMN \"height\" SET NOT NULL;\n\nCREATE UNIQUE INDEX \"images_checksum_idx\" ON \"images\" (\"checksum\");\n"
  },
  {
    "path": "internal/database/migrations/postgres/10_tag_categories.up.sql",
    "content": "CREATE TABLE tag_categories (\n  \"id\" uuid not null primary key,\n  \"group\" text not null,\n  \"name\" text not null,\n  \"description\" text,\n  \"created_at\" timestamp not null,\n  \"updated_at\" timestamp not null,\n  unique (\"name\")\n);\n\nALTER TABLE tags\nADD COLUMN \"category_id\" uuid,\nADD FOREIGN KEY (\"category_id\") REFERENCES \"tag_categories\"(\"id\");\n"
  },
  {
    "path": "internal/database/migrations/postgres/11_image_constraints.up.sql",
    "content": "ALTER TABLE \"scene_images\"\nDROP CONSTRAINT \"scene_images_image_id_fkey\",\nDROP CONSTRAINT \"scene_images_scene_id_fkey\",\nADD CONSTRAINT \"scene_images_image_id_fkey\"\nFOREIGN KEY (\"image_id\") REFERENCES \"images\"(\"id\") ON DELETE CASCADE,\nADD CONSTRAINT \"scene_images_scene_id_fkey\"\nFOREIGN KEY (\"scene_id\") REFERENCES \"scenes\"(\"id\") ON DELETE CASCADE;\n\nALTER TABLE \"performer_images\"\nDROP CONSTRAINT \"performer_images_image_id_fkey\",\nDROP CONSTRAINT \"performer_images_performer_id_fkey\",\nADD CONSTRAINT \"performer_images_image_id_fkey\"\nFOREIGN KEY (\"image_id\") REFERENCES \"images\"(\"id\") ON DELETE CASCADE,\nADD CONSTRAINT \"performer_images_performer_id_fkey\"\nFOREIGN KEY (\"performer_id\") REFERENCES \"performers\"(\"id\") ON DELETE CASCADE;\n\nALTER TABLE \"studio_images\"\nDROP CONSTRAINT \"studio_images_image_id_fkey\",\nDROP CONSTRAINT \"studio_images_studio_id_fkey\",\nADD CONSTRAINT \"studio_images_image_id_fkey\"\nFOREIGN KEY (\"image_id\") REFERENCES \"images\"(\"id\") ON DELETE CASCADE,\nADD CONSTRAINT \"studio_images_studio_id_fkey\"\nFOREIGN KEY (\"studio_id\") REFERENCES \"studios\"(\"id\") ON DELETE CASCADE;\n"
  },
  {
    "path": "internal/database/migrations/postgres/12_fix_performer_trigger.up.sql",
    "content": "TRUNCATE TABLE scene_search;\n\nINSERT INTO scene_search\nSELECT\n\tS.id as scene_id,\n\tREGEXP_REPLACE(S.title, '[^a-zA-Z0-9 ]+', '', 'g') AS scene_title,\n\tS.date::TEXT AS scene_date,\n\tT.name || ' ' || REGEXP_REPLACE(T.name, '[^a-zA-Z0-9]', '', 'g') || ' ' || CASE WHEN TP.name IS NOT NULL THEN (TP.name || ' ' || REGEXP_REPLACE(TP.name, '[^a-zA-Z0-9]', '', 'g') ) ELSE '' END AS studio_name,\n  ARRAY_TO_STRING(ARRAY_CAT(ARRAY_AGG(P.name), ARRAY_AGG(PS.as)), ' ', '') AS performer_names\nFROM scenes S\nLEFT JOIN scene_performers PS ON PS.scene_id = S.id\nLEFT JOIN performers P ON PS.performer_id = P.id\nLEFT JOIN studios T ON T.id = S.studio_id\nLEFT JOIN studios TP ON T.parent_studio_id = TP.id\nGROUP BY S.id, S.title, T.name, TP.name;\n\nCREATE OR REPLACE FUNCTION update_performers() RETURNS TRIGGER AS $$\nBEGIN\nIF (NEW.name != OLD.name) THEN\nUPDATE scene_search SET performer_names = SUBQUERY.performer_names\nFROM (\nSELECT S.id as scene_id, ARRAY_TO_STRING(ARRAY_CAT(ARRAY_AGG(P.name), ARRAY_AGG(PPS.as)), ' ', '') AS performer_names\n FROM scene_performers PS\n JOIN scenes S ON PS.scene_id = S.id\n LEFT JOIN scene_performers PPS ON S.id = PPS.scene_id\n LEFT JOIN performers P ON PPS.performer_id = P.id\n WHERE PS.performer_id = NEW.id\n GROUP BY S.id\n) SUBQUERY\nWHERE scene_search.scene_id = SUBQUERY.scene_id;\nEND IF;\nRETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\n\nCREATE OR REPLACE FUNCTION update_scene_performers() RETURNS TRIGGER AS $$\nBEGIN\nUPDATE scene_search SET performer_names = SUBQUERY.performer_names\nFROM (\nSELECT PS.scene_id as scene_id, ARRAY_TO_STRING(ARRAY_CAT(ARRAY_AGG(P.name), ARRAY_AGG(PS.as)), ' ', '') AS performer_names\n FROM scene_performers PS\n LEFT JOIN performers P ON PS.performer_id = P.id\n WHERE PS.scene_id = NEW.scene_id\n GROUP BY PS.scene_id\n) SUBQUERY\nWHERE scene_search.scene_id = COALESCE(NEW.scene_id, OLD.scene_id);\nRETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\n"
  },
  {
    "path": "internal/database/migrations/postgres/13_sort_indexes.up.sql",
    "content": "CREATE INDEX \"scene_search_scene_id_idx\" ON \"scene_search\" (\"scene_id\");\n"
  },
  {
    "path": "internal/database/migrations/postgres/14_phash_distance_search.up.sql",
    "content": "-- Enable bktree extension if available and user is superuser\nDO $$\nDECLARE\n  extension pg_available_extensions%rowtype;\nBEGIN\n\n  SELECT *\n  INTO extension\n  FROM pg_available_extensions\n  WHERE name='bktree';\n\n  IF found and current_setting('is_superuser') = 'on' THEN\n    CREATE EXTENSION IF NOT EXISTS bktree;\n  END IF;\n\nEND$$;\n\n-- Create phash index if bktree is available\nDO $$\nDECLARE\n  extension pg_extension%rowtype;\nBEGIN\n\n  SELECT *\n  INTO extension\n  FROM pg_extension\n  WHERE extname='bktree';\n\n  IF found THEN\n    CREATE INDEX scene_fingerprints_phash_index\n    ON scene_fingerprints\n    USING spgist ((('x' || hash)::bit(64)::bigint) bktree_ops)\n    WHERE algorithm = 'PHASH';\n  END IF;\n\nEND$$;\n"
  },
  {
    "path": "internal/database/migrations/postgres/15_scene_fingerprint_submissions.up.sql",
    "content": "-- Unused index\nDROP INDEX \"index_scene_fingerprints_on_hash\";\n\nALTER TABLE \"scene_fingerprints\" ADD CONSTRAINT \"scene_hash_unique\" UNIQUE (\"scene_id\", \"hash\"); \nALTER TABLE \"scene_fingerprints\" DROP CONSTRAINT \"scene_fingerprints_scene_id_algorithm_hash_key\";\n\nALTER TABLE \"scene_fingerprints\" ADD COLUMN \"submissions\" INTEGER NOT NULL DEFAULT 1;\nALTER TABLE \"scene_fingerprints\" ADD COLUMN \"created_at\" TIMESTAMP NOT NULL DEFAULT NOW();\nALTER TABLE \"scene_fingerprints\" ADD COLUMN \"updated_at\" TIMESTAMP NOT NULL DEFAULT NOW();\n"
  },
  {
    "path": "internal/database/migrations/postgres/16_fix_scene_update_trigger.up.sql",
    "content": "TRUNCATE TABLE scene_search;\n\nINSERT INTO scene_search\nSELECT\n\tS.id as scene_id,\n\tREGEXP_REPLACE(S.title, '[^a-zA-Z0-9 ]+', '', 'g') AS scene_title,\n\tS.date::TEXT AS scene_date,\n\tT.name || ' ' || REGEXP_REPLACE(T.name, '[^a-zA-Z0-9]', '', 'g') || ' ' || CASE WHEN TP.name IS NOT NULL THEN (TP.name || ' ' || REGEXP_REPLACE(TP.name, '[^a-zA-Z0-9]', '', 'g') ) ELSE '' END AS studio_name,\n  ARRAY_TO_STRING(ARRAY_CAT(ARRAY_AGG(P.name), ARRAY_AGG(PS.as)), ' ', '') AS performer_names\nFROM scenes S\nLEFT JOIN scene_performers PS ON PS.scene_id = S.id\nLEFT JOIN performers P ON PS.performer_id = P.id\nLEFT JOIN studios T ON T.id = S.studio_id\nLEFT JOIN studios TP ON T.parent_studio_id = TP.id\nGROUP BY S.id, S.title, T.name, TP.name;\n\nCREATE OR REPLACE FUNCTION update_scene() RETURNS TRIGGER AS $$\nBEGIN\nIF (NEW.title != OLD.title OR New.date != OLD.date OR New.studio_id != OLD.studio_id) THEN\nUPDATE scene_search\nSET\n  scene_title = REGEXP_REPLACE(NEW.title, '[^a-zA-Z0-9 ]+', '', 'g'),\n  scene_date = NEW.date,\n  studio_name = SUBQUERY.studio_name\nFROM (\n  SELECT S.id as sid, T.name || ' ' || REGEXP_REPLACE(T.name, '[^a-zA-Z0-9]', '', 'g') || ' ' || CASE WHEN TP.name IS NOT NULL THEN (TP.name || ' ' || REGEXP_REPLACE(TP.name, '[^a-zA-Z0-9]', '', 'g') ) ELSE '' END AS studio_name\n  FROM scenes S\n  JOIN studios T ON S.studio_id = T.id\n  LEFT JOIN studios TP ON T.parent_studio_id = TP.id\n) SUBQUERY\nWHERE scene_id = NEW.id\nAND scene_id = SUBQUERY.sid;\nEND IF;\nRETURN NULL;\nEND;\n$$ LANGUAGE plpgsql; --The trigger used to update a table.\n"
  },
  {
    "path": "internal/database/migrations/postgres/17_edit_votes.up.sql",
    "content": "UPDATE edits SET status = 'REJECTED', updated_at = NOW() WHERE status = 'PENDING';\nUPDATE edits SET status = 'CANCELED' WHERE status = 'IMMEDIATE_REJECTED';\n\nCREATE TABLE \"edit_votes\" (\n  \"edit_id\" UUID NOT NULL,\n  \"user_id\" UUID NOT NULL,\n  \"created_at\" TIMESTAMP NOT NULL,\n  \"vote\" TEXT NOT NULL,\n  PRIMARY KEY(\"edit_id\", \"user_id\"),\n  FOREIGN KEY(\"user_id\") REFERENCES \"users\"(\"id\"),\n  FOREIGN KEY(\"edit_id\") REFERENCES \"edits\"(\"id\")\n);\n\nCREATE OR REPLACE FUNCTION update_vote_count() RETURNS TRIGGER AS $$\nBEGIN\n  UPDATE edits SET votes = SUBQUERY.votesum\n  FROM (\n    SELECT SUM(\n      CASE\n        WHEN vote = 'ACCEPT' THEN 1\n        WHEN vote = 'REJECT' THEN -1\n        ELSE 0\n      END\n    ) as votesum\n    FROM edit_votes\n    WHERE edit_id = NEW.edit_id\n  ) SUBQUERY\n  WHERE id = NEW.edit_id;\n  RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql; --The trigger used to update a table.\n\nDROP TRIGGER IF EXISTS update_edit_vote_count ON edit_votes;\nDROP TRIGGER IF EXISTS insert_edit_vote_count ON edit_votes;\nCREATE TRIGGER update_edit_vote_count AFTER UPDATE ON edit_votes FOR EACH ROW EXECUTE PROCEDURE update_vote_count();\nCREATE TRIGGER insert_edit_vote_count AFTER INSERT ON edit_votes FOR EACH ROW EXECUTE PROCEDURE update_vote_count();\n"
  },
  {
    "path": "internal/database/migrations/postgres/18_fingerprint_user.up.sql",
    "content": "DO $$\nBEGIN\n  IF current_setting('is_superuser') = 'on' THEN\n    CREATE EXTENSION IF NOT EXISTS pgcrypto;\n  END IF;\nEND$$;\n\nALTER TABLE \"scene_fingerprints\" ADD COLUMN user_id uuid references \"users\"(\"id\") ON DELETE CASCADE;\n\n-- if there are existing fingerprints, create a user to assign them to it\nDO $$\nBEGIN\n  IF EXISTS (SELECT FROM \"scene_fingerprints\") THEN\n    WITH \"rows\" AS (\n      INSERT INTO \"users\" \n        (\"id\", \"name\", \"password_hash\", \"email\", \"api_key\", \"last_api_call\", \"created_at\", \"updated_at\")\n        VALUES\n        (gen_random_uuid(), '_legacy_submissions', '', 'N/A', '', LOCALTIMESTAMP, LOCALTIMESTAMP, LOCALTIMESTAMP)\n        RETURNING \"id\"\n    ) UPDATE \"scene_fingerprints\" SET \"user_id\" = (SELECT \"id\" FROM \"rows\");\n  END IF;\nEND$$;\n\nALTER TABLE \"scene_fingerprints\" ALTER COLUMN \"user_id\" SET NOT NULL;\n\nALTER TABLE \"scene_fingerprints\" DROP CONSTRAINT \"scene_hash_unique\";\nALTER TABLE \"scene_fingerprints\" ADD CONSTRAINT \"scene_hash_unique\" UNIQUE (\"scene_id\", \"algorithm\", \"hash\", \"user_id\"); \n\nCREATE INDEX \"index_scene_fingerprints_on_hash\" on \"scene_fingerprints\" (\"algorithm\", \"hash\");\nCREATE INDEX \"index_scene_fingerprints_on_user\" on \"scene_fingerprints\" (\"user_id\", \"algorithm\", \"hash\");\nCREATE INDEX \"index_scene_fingerprints_on_created_at\" on \"scene_fingerprints\" (\"created_at\");\n"
  },
  {
    "path": "internal/database/migrations/postgres/19_scene_created_index.up.sql",
    "content": "CREATE INDEX scenes_created_idx ON scenes(created_at DESC NULLS LAST);\n"
  },
  {
    "path": "internal/database/migrations/postgres/20_edit_constraints.up.sql",
    "content": "ALTER TABLE \"performer_edits\"\n  DROP CONSTRAINT \"performer_edits_edit_id_fkey\",\n  DROP CONSTRAINT \"performer_edits_performer_id_fkey\",\n  ADD CONSTRAINT \"performer_edits_edit_id_fkey\"\n    FOREIGN KEY (\"edit_id\") REFERENCES \"edits\"(\"id\") ON DELETE CASCADE,\n  ADD CONSTRAINT \"performer_edits_performer_id_fkey\"\n    FOREIGN KEY (\"performer_id\") REFERENCES \"performers\"(\"id\") ON DELETE CASCADE;\n\nALTER TABLE \"studio_edits\"\n  DROP CONSTRAINT \"studio_edits_edit_id_fkey\",\n  DROP CONSTRAINT \"studio_edits_studio_id_fkey\",\n  ADD CONSTRAINT \"studio_edits_edit_id_fkey\"\n    FOREIGN KEY (\"edit_id\") REFERENCES \"edits\"(\"id\") ON DELETE CASCADE,\n  ADD CONSTRAINT \"studio_edits_studio_id_fkey\"\n    FOREIGN KEY (\"studio_id\") REFERENCES \"studios\"(\"id\") ON DELETE CASCADE;\n\nALTER TABLE \"tag_edits\"\n  DROP CONSTRAINT \"tag_edits_edit_id_fkey\",\n  DROP CONSTRAINT \"tag_edits_tag_id_fkey\",\n  ADD CONSTRAINT \"tag_edits_edit_id_fkey\"\n    FOREIGN KEY (\"edit_id\") REFERENCES \"edits\"(\"id\") ON DELETE CASCADE,\n  ADD CONSTRAINT \"tag_edits_tag_id_fkey\"\n    FOREIGN KEY (\"tag_id\") REFERENCES \"tags\"(\"id\") ON DELETE CASCADE;\n\nALTER TABLE \"scene_edits\"\n  DROP CONSTRAINT \"scene_edits_edit_id_fkey\",\n  DROP CONSTRAINT \"scene_edits_scene_id_fkey\",\n  ADD CONSTRAINT \"scene_edits_edit_id_fkey\"\n    FOREIGN KEY (\"edit_id\") REFERENCES \"edits\"(\"id\") ON DELETE CASCADE,\n  ADD CONSTRAINT \"scene_edits_scene_id_fkey\"\n    FOREIGN KEY (\"scene_id\") REFERENCES \"scenes\"(\"id\") ON DELETE CASCADE;\n"
  },
  {
    "path": "internal/database/migrations/postgres/21_site_urls.up.sql",
    "content": "CREATE TABLE \"sites\" (\n  \"id\" UUID NOT NULL PRIMARY KEY,\n  \"name\" TEXT NOT NULL,\n  \"description\" TEXT,\n  \"url\" TEXT,\n  \"regex\" TEXT,\n  \"valid_types\" TEXT[] CHECK (\"valid_types\" <@ ARRAY['SCENE', 'PERFORMER', 'STUDIO']) NOT NULL,\n  \"created_at\" TIMESTAMP NOT NULL,\n  \"updated_at\" TIMESTAMP NOT NULL,\n  UNIQUE (\"name\")\n);\n\nINSERT INTO \"sites\" (\n  \"id\",\n  \"name\",\n  \"valid_types\",\n  \"created_at\",\n  \"updated_at\"\n) VALUES (\n  '96d68ff6-cd18-4277-8633-5119abbdb635',\n  'Studio',\n  ARRAY['SCENE'],\n  NOW(),\n  NOW()\n);\n\nINSERT INTO \"sites\" (\n  \"id\",\n  \"name\",\n  \"valid_types\",\n  \"created_at\",\n  \"updated_at\"\n) VALUES (\n  '1cda874a-bab4-44d8-b32b-c1e485e66b6f',\n  'Home',\n  ARRAY['STUDIO'],\n  NOW(),\n  NOW()\n);\n\nUPDATE \"scene_urls\" SET \"type\" = '96d68ff6-cd18-4277-8633-5119abbdb635' WHERE type = 'STUDIO';\nUPDATE \"studio_urls\" SET \"type\" = '1cda874a-bab4-44d8-b32b-c1e485e66b6f' WHERE type = 'HOME';\n\nALTER TABLE \"scene_urls\" ALTER COLUMN \"type\" TYPE UUID USING type::uuid;\nALTER TABLE \"scene_urls\" RENAME \"type\" TO \"site_id\";\nALTER TABLE \"scene_urls\"\nDROP CONSTRAINT IF EXISTS \"scene_urls_scene_id_type_key\";\nALTER TABLE \"scene_urls\"\nADD CONSTRAINT \"scene_urls_site_id_fkey\"\n  FOREIGN KEY (\"site_id\")\n  REFERENCES \"sites\"(\"id\");\n\nALTER TABLE \"studio_urls\" ALTER COLUMN \"type\" TYPE UUID USING type::uuid;\nALTER TABLE \"studio_urls\" RENAME \"type\" TO \"site_id\";\nALTER TABLE \"studio_urls\"\nDROP CONSTRAINT IF EXISTS \"studio_urls_studio_id_type_key\";\nALTER TABLE \"studio_urls\"\n  ADD CONSTRAINT \"studio_urls_site_id_fkey\"\n    FOREIGN KEY (\"site_id\")\n    REFERENCES \"sites\"(\"id\");\n\nALTER TABLE \"performer_urls\" ALTER COLUMN \"type\" TYPE UUID USING type::uuid;\nALTER TABLE \"performer_urls\" RENAME \"type\" TO \"site_id\";\nALTER TABLE \"performer_urls\"\nDROP CONSTRAINT IF EXISTS \"performer_urls_performer_id_type_key\";\nALTER TABLE \"performer_urls\"\n  ADD CONSTRAINT \"performer_urls_site_id_fkey\"\n    FOREIGN KEY (\"site_id\")\n    REFERENCES \"sites\"(\"id\");\n"
  },
  {
    "path": "internal/database/migrations/postgres/22_performer_search_indexes.up.sql",
    "content": "CREATE INDEX disambiguation_trgm_idx ON \"performers\" USING GIN (\"disambiguation\" gin_trgm_ops);\nCREATE INDEX performer_alias_trgm_idx ON \"performer_aliases\" USING GIN (\"alias\" gin_trgm_ops);\n"
  },
  {
    "path": "internal/database/migrations/postgres/23_favorites.up.sql",
    "content": "CREATE TABLE performer_favorites (\n    performer_id uuid REFERENCES performers(id) ON DELETE CASCADE NOT NULL,\n    user_id uuid REFERENCES users(id) ON DELETE CASCADE NOT NULL\n);\n\nCREATE TABLE studio_favorites (\n    studio_id uuid REFERENCES studios(id) ON DELETE CASCADE NOT NULL,\n    user_id uuid REFERENCES users(id) ON DELETE CASCADE NOT NULL\n);\n\nCREATE INDEX scene_edit_performers_added_idx ON edits USING GIN\n(jsonb_path_query_array(data, '$.new_data.added_performers[*].performer_id'))\nWHERE target_type = 'SCENE';\n\nCREATE INDEX scene_edit_performers_removed_idx ON edits USING GIN\n(jsonb_path_query_array(data, '$.new_data.removed_performers[*].performer_id'))\nWHERE target_type = 'SCENE';\n"
  },
  {
    "path": "internal/database/migrations/postgres/24_drafts.up.sql",
    "content": "CREATE TABLE \"drafts\" (\n  \"id\" UUID PRIMARY KEY,\n  \"user_id\" UUID NOT NULL,\n  \"type\" TEXT CHECK (\"type\" in ('SCENE', 'PERFORMER', 'STUDIO')) NOT NULL,\n  \"data\" JSONB NOT NULL,\n  \"created_at\" TIMESTAMP NOT NULL,\n  FOREIGN KEY(\"user_id\") REFERENCES \"users\"(\"id\") ON DELETE CASCADE\n);\n"
  },
  {
    "path": "internal/database/migrations/postgres/25_scene_codes.up.sql",
    "content": "ALTER TABLE \"scenes\"\nADD COLUMN code TEXT;\n\nALTER TABLE \"scene_search\"\nADD COLUMN scene_code TEXT;\n\nCREATE OR REPLACE FUNCTION update_scene() RETURNS TRIGGER AS $$\nBEGIN\nIF (NEW.title != OLD.title OR NEW.date != OLD.date OR NEW.studio_id != OLD.studio_id OR COALESCE(NEW.code, '') != COALESCE(OLD.code, '')) THEN\nUPDATE scene_search\nSET\n  scene_title = REGEXP_REPLACE(NEW.title, '[^a-zA-Z0-9 ]+', '', 'g'),\n  scene_date = NEW.date,\n  studio_name = SUBQUERY.studio_name,\n  scene_code = NEW.code\nFROM (\n  SELECT S.id as sid, T.name || ' ' || REGEXP_REPLACE(T.name, '[^a-zA-Z0-9]', '', 'g') || ' ' || CASE WHEN TP.name IS NOT NULL THEN (TP.name || ' ' || REGEXP_REPLACE(TP.name, '[^a-zA-Z0-9]', '', 'g') ) ELSE '' END AS studio_name\n  FROM scenes S\n  JOIN studios T ON S.studio_id = T.id\n  LEFT JOIN studios TP ON T.parent_studio_id = TP.id\n) SUBQUERY\nWHERE scene_id = NEW.id\nAND scene_id = SUBQUERY.sid;\nEND IF;\nRETURN NULL;\nEND;\n$$ LANGUAGE plpgsql; --The trigger used to update a table.\n\nCREATE OR REPLACE FUNCTION insert_scene() RETURNS TRIGGER AS $$\nBEGIN\nINSERT INTO scene_search (scene_id, scene_title, scene_date, studio_name, scene_code)\nSELECT\n\tNEW.id,\n\tREGEXP_REPLACE(NEW.title, '[^a-zA-Z0-9 ]+', '', 'g'),\n\tNEW.date,\n\tT.name || ' ' || REGEXP_REPLACE(T.name, '[^a-zA-Z0-9]', '', 'g') || ' ' || CASE WHEN TP.name IS NOT NULL THEN (TP.name || ' ' || REGEXP_REPLACE(TP.name, '[^a-zA-Z0-9]', '', 'g') ) ELSE '' END,\n  NEW.code\nFROM studios T\nLEFT JOIN studios TP ON T.parent_studio_id = TP.id\nWHERE T.id = NEW.studio_id;\nRETURN NULL;\nEND;\n$$ LANGUAGE plpgsql; --The trigger used to update a table.\n\nDROP INDEX ts_idx;\nCREATE INDEX scene_search_ts_idx ON scene_search USING gist (\n\t(\n        to_tsvector('simple', COALESCE(scene_date, '')) ||\n        to_tsvector('english', studio_name) ||\n        to_tsvector('english', COALESCE(performer_names, '')) ||\n        to_tsvector('english', scene_title) ||\n        to_tsvector('simple', COALESCE(scene_code, ''))\n\t)\n);\n"
  },
  {
    "path": "internal/database/migrations/postgres/26_scene_partial_date.down.sql",
    "content": "ALTER TABLE \"scenes\"\nDROP COLUMN \"date_accuracy\";\n"
  },
  {
    "path": "internal/database/migrations/postgres/26_scene_partial_date.up.sql",
    "content": "ALTER TABLE \"scenes\"\nADD COLUMN \"date_accuracy\" varchar(10);\n\nUPDATE \"scenes\"\nSET \"date_accuracy\" = 'DAY';\n"
  },
  {
    "path": "internal/database/migrations/postgres/27_edit_closed_at.up.sql",
    "content": "ALTER TABLE \"edits\"\nADD COLUMN \"closed_at\" timestamp;\n\nALTER TABLE \"edits\"\nALTER COLUMN \"updated_at\" DROP NOT NULL;\n\nUPDATE \"edits\"\nSET \"closed_at\" = \"updated_at\"\nWHERE \"updated_at\" > \"created_at\"\nAND \"status\" != 'PENDING';\n\nUPDATE \"edits\"\nSET \"updated_at\" = NULL; \n"
  },
  {
    "path": "internal/database/migrations/postgres/28_studio_favorite_index.up.sql",
    "content": "CREATE INDEX scene_edit_studio_added_idx ON edits\n((data->'old_data'->>'studio_id'))\nWHERE target_type = 'SCENE';\n\nCREATE INDEX scene_edit_studio_removed_idx ON edits\n((data->'new_data'->>'studio_id'))\nWHERE target_type = 'SCENE';\n"
  },
  {
    "path": "internal/database/migrations/postgres/29_scene_edit_fingerprint_index.up.sql",
    "content": "CREATE INDEX scene_edit_fingerprint_added_idx ON edits USING GIN\n(jsonb_path_query_array(data, '$.new_data.added_fingerprints[*].hash'))\nWHERE target_type = 'SCENE';\n"
  },
  {
    "path": "internal/database/migrations/postgres/30_edit_bot.up.sql",
    "content": "ALTER TABLE \"edits\"\nADD COLUMN \"bot\" BOOLEAN NOT NULL DEFAULT False;\n"
  },
  {
    "path": "internal/database/migrations/postgres/31_scenes_deleted_idx.up.sql",
    "content": "CREATE INDEX \"scenes_deleted_idx\" ON \"scenes\"(\"deleted\");\nCREATE INDEX \"scenes_id_deleted_idx\" ON \"scenes\"(\"id\", \"deleted\");\nCREATE INDEX \"studio_favorites_idx\" ON \"studio_favorites\"(\"studio_id\", \"user_id\");\nCREATE INDEX \"performer_favorites_idx\" ON \"performer_favorites\"(\"performer_id\", \"user_id\");\n"
  },
  {
    "path": "internal/database/migrations/postgres/32_edit_indexes.up.sql",
    "content": "CREATE INDEX \"edit_votes_user_edit_idx\" ON \"edit_votes\" (\"user_id\", \"edit_id\");\nCREATE INDEX \"edit_status_idx\" ON edits (\"status\");\nCREATE INDEX \"edit_comments_edit_idx\" ON \"edit_comments\" (\"edit_id\");\nCREATE INDEX \"scene_edits_scene_idx\" ON \"scene_edits\" (\"scene_id\");\nCREATE INDEX \"scene_edits_edit_idx\" ON \"scene_edits\" (\"edit_id\");\nCREATE INDEX \"performer_edits_edit_idx\" ON \"performer_edits\" (\"edit_id\");\nCREATE INDEX \"tag_edits_edit_idx\" ON \"tag_edits\" (\"edit_id\");\nCREATE INDEX \"studio_edits_edit_idx\" ON \"studio_edits\" (\"edit_id\");\nCREATE INDEX \"studio_deleted_parent_idx\" ON \"studios\" (\"deleted\", \"parent_studio_id\");\n"
  },
  {
    "path": "internal/database/migrations/postgres/33_invite_key_uses.up.sql",
    "content": "ALTER TABLE \"invite_keys\" ADD COLUMN \"uses\" integer;\nALTER TABLE \"invite_keys\" ADD COLUMN \"expire_time\" timestamp;\n"
  },
  {
    "path": "internal/database/migrations/postgres/34_fingerprints.up.sql",
    "content": "CREATE TABLE \"fingerprints\" (\n  \"id\" SERIAL PRIMARY KEY,\n  \"hash\" VARCHAR(255) NOT NULL,\n  \"algorithm\" VARCHAR(20) NOT NULL,\n  UNIQUE (\"hash\", \"algorithm\")\n);\n\nINSERT INTO \"fingerprints\" (hash, algorithm)\nSELECT hash, algorithm\nFROM \"scene_fingerprints\"\nGROUP BY hash, algorithm;\n\nALTER TABLE \"scene_fingerprints\" RENAME TO \"_scene_fingerprints\";\n\nCREATE TABLE \"scene_fingerprints\" (\n  \"fingerprint_id\" INT NOT NULL,\n  \"scene_id\" UUID NOT NULL,\n  \"user_id\" UUID NOT NULL,\n  \"duration\" INT NOT NULL,\n  \"created_at\" TIMESTAMP NOT NULL DEFAULT now(),\n  FOREIGN KEY(\"fingerprint_id\") REFERENCES \"fingerprints\"(\"id\") ON DELETE CASCADE,\n  FOREIGN KEY(\"scene_id\") REFERENCES \"scenes\"(\"id\") ON DELETE CASCADE,\n  FOREIGN KEY(\"user_id\") REFERENCES \"users\"(\"id\") ON DELETE CASCADE,\n  UNIQUE (\"scene_id\", \"fingerprint_id\", \"user_id\")\n);\n\nINSERT INTO \"scene_fingerprints\"\nSELECT F.id, scene_id, user_id, duration, created_at\nFROM \"_scene_fingerprints\" SF\nJOIN \"fingerprints\" F ON SF.hash = F.hash AND SF.algorithm = F.algorithm;\n\nDROP TABLE \"_scene_fingerprints\";\n\nCREATE INDEX \"scene_fingerprints_fingerprint_idx\" ON \"scene_fingerprints\" (fingerprint_id);\nCREATE INDEX \"scene_fingerprints_user_idx\" on \"scene_fingerprints\" (user_id);\nCREATE INDEX \"scene_fingerprints_created_at\" on \"scene_fingerprints\" (created_at, scene_id);\n\n\n-- Create phash index if bktree is available\nDO $$\nDECLARE\n  extension pg_extension%rowtype;\nBEGIN\n\n  SELECT *\n  INTO extension\n  FROM pg_extension\n  WHERE extname='bktree';\n\n  IF found THEN\n    CREATE INDEX fingerprints_phash_idx\n    ON fingerprints\n    USING spgist ((('x' || hash)::bit(64)::bigint) bktree_ops)\n    WHERE algorithm = 'PHASH';\n  END IF;\n\nEND$$;\n"
  },
  {
    "path": "internal/database/migrations/postgres/35_websearch.up.sql",
    "content": "-- Update the index to match the format of querybuilder_scene.SearchScenes()\nDROP INDEX scene_search_ts_idx;\nCREATE INDEX scene_search_ts_idx ON scene_search USING gist (\n    (\n        to_tsvector('english', COALESCE(scene_date, '')) ||\n        to_tsvector('english', studio_name) ||\n        to_tsvector('english', COALESCE(performer_names, '')) ||\n        to_tsvector('english', scene_title) ||\n        to_tsvector('english', COALESCE(scene_code, ''))\n    )\n);\n\n-- Update the scene_search functions to allow hyphens in the title when immediately followed by digit, to allow for JAV titles ex EMS-259\nCREATE OR REPLACE FUNCTION update_scene() RETURNS TRIGGER AS $$\nBEGIN\nIF (NEW.title != OLD.title OR NEW.date != OLD.date OR NEW.studio_id != OLD.studio_id OR COALESCE(NEW.code, '') != COALESCE(OLD.code, '')) THEN\nUPDATE scene_search\nSET\n    scene_title = REGEXP_REPLACE(NEW.title, '[^a-zA-Z0-9 -:]+', '', 'g'),\n    scene_date = NEW.date,\n    studio_name = SUBQUERY.studio_name,\n    scene_code = NEW.code\nFROM (\n    SELECT S.id as sid, T.name || ' ' || REGEXP_REPLACE(T.name, '[^a-zA-Z0-9]', '', 'g') || ' ' || CASE WHEN TP.name IS NOT NULL THEN (TP.name || ' ' || REGEXP_REPLACE(TP.name, '[^a-zA-Z0-9]', '', 'g') ) ELSE '' END AS studio_name\n    FROM scenes S\n    JOIN studios T ON S.studio_id = T.id\n    LEFT JOIN studios TP ON T.parent_studio_id = TP.id\n) SUBQUERY\nWHERE scene_id = NEW.id\nAND scene_id = SUBQUERY.sid;\nEND IF;\nRETURN NULL;\nEND;\n$$ LANGUAGE plpgsql; --The trigger used to update a table.\n\nCREATE OR REPLACE FUNCTION insert_scene() RETURNS TRIGGER AS $$\nBEGIN\nINSERT INTO scene_search (scene_id, scene_title, scene_date, studio_name, scene_code)\nSELECT\n    NEW.id,\n    REGEXP_REPLACE(NEW.title, '[^a-zA-Z0-9 -:]+', '', 'g'),\n    NEW.date,\n    T.name || ' ' || REGEXP_REPLACE(T.name, '[^a-zA-Z0-9]', '', 'g') || ' ' || CASE WHEN TP.name IS NOT NULL THEN (TP.name || ' ' || REGEXP_REPLACE(TP.name, '[^a-zA-Z0-9]', '', 'g') ) ELSE '' END,\n    NEW.code\nFROM studios T\nLEFT JOIN studios TP ON T.parent_studio_id = TP.id\nWHERE T.id = NEW.studio_id;\nRETURN NULL;\nEND;\n$$ LANGUAGE plpgsql; --The trigger used to update a table.\n\n\nTRUNCATE TABLE scene_search;\n\n-- Recreate the table, allowing for JAV style titles like EMS-259\nINSERT INTO scene_search\nSELECT\n    S.id as scene_id,\n    REGEXP_REPLACE(S.title, '[^a-zA-Z0-9 -:]+', '', 'g') AS scene_title,\n    S.date::TEXT AS scene_date,\n    T.name || ' ' || REGEXP_REPLACE(T.name, '[^a-zA-Z0-9]', '', 'g') || ' ' || CASE WHEN TP.name IS NOT NULL THEN (TP.name || ' ' || REGEXP_REPLACE(TP.name, '[^a-zA-Z0-9]', '', 'g') ) ELSE '' END AS studio_name,\n    ARRAY_TO_STRING(ARRAY_CAT(ARRAY_AGG(P.name), ARRAY_AGG(PS.as)), ' ', '') AS performer_names,\n    S.code as scene_code\nFROM scenes S\nLEFT JOIN scene_performers PS ON PS.scene_id = S.id\nLEFT JOIN performers P ON PS.performer_id = P.id\nLEFT JOIN studios T ON T.id = S.studio_id\nLEFT JOIN studios TP ON T.parent_studio_id = TP.id\nGROUP BY S.id, S.title, T.name, TP.name;\n\n"
  },
  {
    "path": "internal/database/migrations/postgres/36_drop_unique_invite.up.sql",
    "content": "DROP INDEX IF EXISTS \"pending_activation_invite_key_idx\";\n"
  },
  {
    "path": "internal/database/migrations/postgres/37_tokens.up.sql",
    "content": "DROP TABLE \"pending_activations\";\n\nCREATE TABLE \"user_tokens\" (\n  \"id\" UUID NOT NULL,\n  \"data\" JSONB,\n  \"type\" TEXT NOT NULL,\n  \"created_at\" TIMESTAMP NOT NULL DEFAULT now(),\n  \"expires_at\" TIMESTAMP NOT NULL\n);\n"
  },
  {
    "path": "internal/database/migrations/postgres/38_scenes_studio_id_index.up.sql",
    "content": " CREATE INDEX \"scenes_studio_id_idx\" ON \"scenes\" (\"studio_id\");\n"
  },
  {
    "path": "internal/database/migrations/postgres/39_edits_updates.up.sql",
    "content": "ALTER TABLE \"edits\"\nADD COLUMN \"update_count\" integer NOT NULL DEFAULT 0;\n\nUPDATE \"edits\"\nSET \"update_count\" = 1\nWHERE \"updated_at\" IS NOT NULL;\n"
  },
  {
    "path": "internal/database/migrations/postgres/40_fingerprint_vote.up.sql",
    "content": "ALTER TABLE \"scene_fingerprints\" \n ADD COLUMN \"vote\" SMALLINT NOT NULL DEFAULT 1 CHECK (vote = -1 OR vote = 1);\n"
  },
  {
    "path": "internal/database/migrations/postgres/41_notifications.up.sql",
    "content": "DROP TYPE IF EXISTS notification_type;\nCREATE TYPE notification_type AS ENUM (\n  'FAVORITE_PERFORMER_SCENE',\n  'FAVORITE_PERFORMER_EDIT',\n  'FAVORITE_STUDIO_SCENE',\n  'FAVORITE_STUDIO_EDIT',\n  'COMMENT_OWN_EDIT',\n  'DOWNVOTE_OWN_EDIT',\n  'FAILED_OWN_EDIT',\n  'COMMENT_COMMENTED_EDIT',\n  'COMMENT_VOTED_EDIT',\n  'UPDATED_EDIT'\n);\n\nCREATE TABLE notifications (\n    user_id UUID REFERENCES users(id) ON DELETE CASCADE NOT NULL,\n    type notification_type NOT NULL,\n    id UUID NOT NULL,\n    created_at TIMESTAMP NOT NULL DEFAULT NOW(),\n    read_at TIMESTAMP\n);\nCREATE INDEX notifications_user_read_idx ON notifications (user_id, read_at);\n\nCREATE TABLE user_notifications (\n    user_id UUID REFERENCES users(id) ON DELETE CASCADE NOT NULL,\n    type notification_type NOT NULL\n);\nCREATE INDEX user_notifications_user_id_idx ON user_notifications (user_id);\nCREATE INDEX user_notifications_type_idx ON user_notifications (type);\n\nINSERT INTO user_notifications\nSELECT id, type FROM unnest(enum_range(NULL::notification_type)) AS type CROSS JOIN users;\n"
  },
  {
    "path": "internal/database/migrations/postgres/42_date_columns.up.sql",
    "content": "-- Transform scene date columns to single string column\nALTER TABLE \"scenes\" RENAME COLUMN \"date\" TO \"date_old\";\nALTER TABLE \"scenes\" ADD COLUMN \"date\" TEXT;\n\nUPDATE \"scenes\" SET \"date\" = (\n  CASE\n    WHEN \"date_accuracy\" = 'DAY' THEN TO_CHAR(\"date_old\", 'YYYY-MM-DD')\n    WHEN \"date_accuracy\" = 'MONTH' THEN TO_CHAR(\"date_old\", 'YYYY-MM')\n    WHEN \"date_accuracy\" = 'YEAR' THEN TO_CHAR(\"date_old\", 'YYYY')\n  END\n);\n\nALTER TABLE \"scenes\" DROP COLUMN \"date_old\";\nALTER TABLE \"scenes\" DROP COLUMN \"date_accuracy\";\n\n-- Transform performers birthdate columns to single string column\nALTER TABLE \"performers\" RENAME COLUMN \"birthdate\" TO \"birthdate_old\";\nALTER TABLE \"performers\" ADD COLUMN \"birthdate\" TEXT;\n\nUPDATE \"performers\" SET \"birthdate\" = (\n  CASE\n    WHEN \"birthdate_accuracy\" = 'DAY' THEN TO_CHAR(\"birthdate_old\", 'YYYY-MM-DD')\n    WHEN \"birthdate_accuracy\" = 'MONTH' THEN TO_CHAR(\"birthdate_old\", 'YYYY-MM')\n    WHEN \"birthdate_accuracy\" = 'YEAR' THEN TO_CHAR(\"birthdate_old\", 'YYYY')\n  END\n);\n\nALTER TABLE \"performers\" DROP COLUMN \"birthdate_old\";\nALTER TABLE \"performers\" DROP COLUMN \"birthdate_accuracy\";\n"
  },
  {
    "path": "internal/database/migrations/postgres/43_studio_aliases.up.sql",
    "content": "CREATE TABLE \"studio_aliases\" (\n  \"studio_id\" uuid not null,\n  \"alias\" varchar(255) not null,\n  foreign key(\"studio_id\") references \"studios\"(\"id\") ON DELETE CASCADE,\n  unique (\"alias\")\n);"
  },
  {
    "path": "internal/database/migrations/postgres/44_performer_death_date.up.sql",
    "content": "ALTER TABLE \"performers\" ADD COLUMN \"deathdate\" TEXT;\n"
  },
  {
    "path": "internal/database/migrations/postgres/45_scene_production_date.up.sql",
    "content": "ALTER TABLE \"scenes\" ADD COLUMN \"production_date\" TEXT;\n"
  },
  {
    "path": "internal/database/migrations/postgres/46_update_default_notifications.up.sql",
    "content": "DELETE FROM \"user_notifications\"\nWHERE type IN (\n  'FAVORITE_PERFORMER_EDIT',\n  'FAVORITE_STUDIO_EDIT',\n  'FAVORITE_STUDIO_SCENE',\n  'FAVORITE_PERFORMER_SCENE'\n);\n"
  },
  {
    "path": "internal/database/migrations/postgres/47_favorite_unique.up.sql",
    "content": "DELETE FROM \"performer_favorites\" PF\nWHERE  EXISTS (\n   SELECT FROM \"performer_favorites\"\n   WHERE  performer_id = PF.performer_id\n   AND    user_id = PF.user_id\n   AND    ctid < PF.ctid\n);\n\nCREATE UNIQUE INDEX \"performer_favorites_unique_idx\" ON \"performer_favorites\" (performer_id, user_id);\n\nDROP INDEX performer_favorites_idx;\n\nDELETE FROM \"studio_favorites\" SF\nWHERE  EXISTS (\n   SELECT FROM \"studio_favorites\"\n   WHERE  studio_id = SF.studio_id\n   AND    user_id = SF.user_id\n   AND    ctid < SF.ctid\n);\n\nCREATE UNIQUE INDEX \"studio_favorites_unique_idx\" ON \"studio_favorites\" (studio_id, user_id);\n\nDROP INDEX studio_favorites_idx;\n\nALTER TABLE \"performer_favorites\" ADD COLUMN \"created_at\" TIMESTAMP;\nALTER TABLE \"performer_favorites\" ALTER \"created_at\" SET DEFAULT NOW();\nALTER TABLE \"studio_favorites\" ADD COLUMN \"created_at\" TIMESTAMP;\nALTER TABLE \"studio_favorites\" ALTER \"created_at\" SET DEFAULT NOW();\n"
  },
  {
    "path": "internal/database/migrations/postgres/48_fingerprinted_scene_edit_notification.up.sql",
    "content": "ALTER TYPE notification_type ADD VALUE 'FINGERPRINTED_SCENE_EDIT';\n"
  },
  {
    "path": "internal/database/migrations/postgres/49_entity_search_lower_idx.up.sql",
    "content": "CREATE INDEX performer_urls_url_lower_idx ON performer_urls (LOWER(url));\nCREATE INDEX scene_urls_url_lower_idx ON scene_urls (LOWER(url));\n"
  },
  {
    "path": "internal/database/migrations/postgres/50_rename_url_siteid.up.sql",
    "content": "-- Rename SiteID to site_id in URL objects within JSONB data\n\n-- Update added_urls in new_data\nUPDATE edits\nSET data = jsonb_set(\n  data,\n  '{new_data,added_urls}',\n  (\n    SELECT COALESCE(jsonb_agg(\n      CASE\n        WHEN elem ? 'SiteID' THEN\n          (elem - 'SiteID') || jsonb_build_object('site_id', elem->'SiteID')\n        ELSE elem\n      END\n    ), '[]'::jsonb)\n    FROM jsonb_array_elements(data->'new_data'->'added_urls') elem\n  )\n)\nWHERE data->'new_data' ? 'added_urls'\n  AND jsonb_typeof(data->'new_data'->'added_urls') = 'array';\n\n-- Update removed_urls in new_data\nUPDATE edits\nSET data = jsonb_set(\n  data,\n  '{new_data,removed_urls}',\n  (\n    SELECT COALESCE(jsonb_agg(\n      CASE\n        WHEN elem ? 'SiteID' THEN\n          (elem - 'SiteID') || jsonb_build_object('site_id', elem->'SiteID')\n        ELSE elem\n      END\n    ), '[]'::jsonb)\n    FROM jsonb_array_elements(data->'new_data'->'removed_urls') elem\n  )\n)\nWHERE data->'new_data' ? 'removed_urls'\n  AND jsonb_typeof(data->'new_data'->'removed_urls') = 'array';\n"
  },
  {
    "path": "internal/database/migrations/postgres/51_scene_deleted_sort_indexes.up.sql",
    "content": "DROP INDEX scenes_created_idx;\nDROP INDEX scenes_deleted_idx;\nDROP INDEX scenes_id_deleted_idx;\n\nCREATE INDEX scenes_deleted_created_at_id_idx ON scenes (created_at DESC, id DESC) WHERE deleted = false;\nCREATE INDEX scenes_deleted_updated_at_id_idx ON scenes (updated_at DESC, id DESC) WHERE deleted = false;\nCREATE INDEX scenes_deleted_date_id_idx ON scenes (date DESC, id DESC) WHERE deleted = false;\nCREATE INDEX scenes_deleted_title_id_idx ON scenes (title, id DESC) WHERE deleted = false;\n"
  },
  {
    "path": "internal/database/migrations/postgres/52_fingerprint_hash_bigint.up.sql",
    "content": "-- Remove MD5 hashes from fingerprints table\nDELETE FROM fingerprints WHERE algorithm = 'MD5';\n\n-- Delete any hashes with non-hex values (must be valid 16-char hex for 64-bit conversion)\nDELETE FROM fingerprints WHERE hash !~ '^[0-9a-fA-F]{16}$';\n\n-- Remove MD5 fingerprints from edit data (added_fingerprints)\nUPDATE edits\nSET data = jsonb_set(\n    data,\n    '{new_data,added_fingerprints}',\n    (\n        SELECT COALESCE(jsonb_agg(fp), '[]'::jsonb)\n        FROM jsonb_array_elements(data->'new_data'->'added_fingerprints') AS fp\n        WHERE fp->>'algorithm' != 'MD5'\n    )\n)\nWHERE data->'new_data'->'added_fingerprints' IS NOT NULL\n  AND jsonb_array_length(data->'new_data'->'added_fingerprints') > 0;\n\n-- Remove MD5 fingerprints from drafts\nUPDATE drafts\nSET data = jsonb_set(\n    data,\n    '{fingerprints}',\n    (\n        SELECT COALESCE(jsonb_agg(fp), '[]'::jsonb)\n        FROM jsonb_array_elements(data->'fingerprints') AS fp\n        WHERE fp->>'algorithm' != 'MD5'\n    )\n)\nWHERE data->'fingerprints' IS NOT NULL\n  AND jsonb_array_length(data->'fingerprints') > 0;\n\nALTER TABLE fingerprints DROP CONSTRAINT fingerprints_hash_algorithm_key;\nDROP INDEX IF EXISTS fingerprints_phash_idx;\n\nALTER TABLE fingerprints RENAME COLUMN hash TO hash_old;\n\nALTER TABLE fingerprints ADD COLUMN hash BIGINT;\nUPDATE fingerprints SET hash = ('x' || hash_old)::bit(64)::bigint;\nALTER TABLE fingerprints ALTER COLUMN hash SET NOT NULL;\n\nALTER TABLE fingerprints DROP COLUMN hash_old;\n\nALTER TABLE fingerprints ADD CONSTRAINT fingerprints_hash_algorithm_key UNIQUE (hash, algorithm);\n\n-- Recreate bktree index on new bigint hash column if extension is available\nDO $$\nDECLARE\n  extension pg_extension%rowtype;\nBEGIN\n  SELECT *\n  INTO extension\n  FROM pg_extension\n  WHERE extname='bktree';\n\n  IF found THEN\n    CREATE INDEX fingerprints_phash_idx\n    ON fingerprints\n    USING spgist (hash bktree_ops)\n    WHERE algorithm = 'PHASH';\n  END IF;\nEND$$;\n"
  },
  {
    "path": "internal/database/migrations/postgres/53_varchar_to_text.up.sql",
    "content": "-- Body modifications\nALTER TABLE performer_tattoos ALTER COLUMN location TYPE text;\nALTER TABLE performer_tattoos ALTER COLUMN description TYPE text;\nALTER TABLE performer_piercings ALTER COLUMN location TYPE text;\nALTER TABLE performer_piercings ALTER COLUMN description TYPE text;\n\n-- Descriptions\nALTER TABLE tags ALTER COLUMN description TYPE text;\nALTER TABLE performers ALTER COLUMN disambiguation TYPE text;\n\n-- Aliases\nALTER TABLE performer_aliases ALTER COLUMN alias TYPE text;\nALTER TABLE studio_aliases ALTER COLUMN alias TYPE text;\nALTER TABLE tag_aliases ALTER COLUMN alias TYPE text;\n\n-- Scene fields\nALTER TABLE scenes ALTER COLUMN title TYPE text;\nALTER TABLE scene_performers ALTER COLUMN \"as\" TYPE text;\n"
  },
  {
    "path": "internal/database/migrations/postgres/54_delete_soft_deleted_aliases.up.sql",
    "content": "DELETE FROM studio_aliases WHERE studio_id IN (SELECT id FROM studios WHERE deleted = true);\nDELETE FROM tag_aliases WHERE tag_id IN (SELECT id FROM tags WHERE deleted = true);\n"
  },
  {
    "path": "internal/database/migrations/postgres/55_fix_edit_data_dates.up.sql",
    "content": "-- Related to migration 42_date_columns.up.sql\n\n-- Transform scene date in edit data (date, date_accuracy)\nUPDATE edits\nSET data =\n      data\n      ||\n      CASE\n        WHEN data->'old_data' ? 'date_accuracy' THEN\n          -- build `{'old_data': <object>}` to replace the existing object\n          jsonb_build_object(\n            'old_data',\n            ( -- base object: the existing 'old_data', without `date_accuracy`\n              (data->'old_data') - 'date_accuracy'\n            )\n            ||\n            -- override object: `{'date': <new value>}` to replace the existing value in `new_data`\n            jsonb_build_object(\n              'date',\n              CASE data->'old_data'->>'date_accuracy'\n                WHEN 'YEAR'  THEN left(data->'old_data'->>'date', 4)\n                WHEN 'MONTH' THEN left(data->'old_data'->>'date', 7)\n                ELSE data->'old_data'->>'date'\n              END\n            )\n          )\n        -- if `date_accuracy` does not exist, override nothing and continue\n        ELSE '{}'::jsonb\n      END\n      ||\n      CASE\n        WHEN data->'new_data' ? 'date_accuracy' THEN\n          -- build `{'new_data': <object>}` to replace the existing object\n          jsonb_build_object(\n            'new_data',\n            ( -- base object: the existing 'new_data', without `date_accuracy`\n              (data->'new_data') - 'date_accuracy'\n            )\n            ||\n            -- override object: `{'date': <new value>}` to replace the existing value in `new_data`\n            jsonb_build_object(\n              'date',\n              CASE data->'new_data'->>'date_accuracy'\n                WHEN 'YEAR'  THEN left(data->'new_data'->>'date', 4)\n                WHEN 'MONTH' THEN left(data->'new_data'->>'date', 7)\n                ELSE data->'new_data'->>'date'\n              END\n            )\n          )\n        -- if `date_accuracy` does not exist, override nothing and continue\n        ELSE '{}'::jsonb\n      END\nWHERE\n    (data->'old_data' ? 'date_accuracy')\n    OR\n    (data->'new_data' ? 'date_accuracy');\n\n\n-- Transform performers birthdate in edit data (birthdate, birthdate_accuracy)\nUPDATE edits\nSET data =\n      data\n      ||\n      CASE\n        WHEN data->'old_data' ? 'birthdate_accuracy' THEN\n          -- build `{'old_data': <object>}` to replace the existing object\n          jsonb_build_object(\n            'old_data',\n            ( -- base object: the existing 'old_data', without `birthdate_accuracy`\n              (data->'old_data') - 'birthdate_accuracy'\n            )\n            ||\n            -- override object: `{'birthdate': <new value>}` to replace the existing value in `new_data`\n            jsonb_build_object(\n              'birthdate',\n              CASE data->'old_data'->>'birthdate_accuracy'\n                WHEN 'YEAR'  THEN left(data->'old_data'->>'birthdate', 4)\n                WHEN 'MONTH' THEN left(data->'old_data'->>'birthdate', 7)\n                ELSE data->'old_data'->>'birthdate'\n              END\n            )\n          )\n        -- if `birthdate_accuracy` does not exist, override nothing and continue\n        ELSE '{}'::jsonb\n      END\n      ||\n      CASE\n        WHEN data->'new_data' ? 'birthdate_accuracy' THEN\n          -- build `{'new_data': <object>}` to replace the existing object\n          jsonb_build_object(\n            'new_data',\n            ( -- base object: the existing 'new_data', without `birthdate_accuracy`\n              (data->'new_data') - 'birthdate_accuracy'\n            )\n            ||\n            -- build `{'birthdate': <new value>}` to replace the existing value in `new_data`\n            jsonb_build_object(\n              'birthdate',\n              CASE data->'new_data'->>'birthdate_accuracy'\n                WHEN 'YEAR'  THEN left(data->'new_data'->>'birthdate', 4)\n                WHEN 'MONTH' THEN left(data->'new_data'->>'birthdate', 7)\n                ELSE data->'new_data'->>'birthdate'\n              END\n            )\n          )\n        -- if `birthdate_accuracy` does not exist, override nothing and continue\n        ELSE '{}'::jsonb\n      END\nWHERE\n    (data->'old_data' ? 'birthdate_accuracy')\n    OR\n    (data->'new_data' ? 'birthdate_accuracy');\n"
  },
  {
    "path": "internal/database/migrations/postgres/56_paradedb_search.up.sql",
    "content": "CREATE EXTENSION IF NOT EXISTS pg_search;\n\n-- ===========================================\n-- Remove old scene_search infrastructure\n-- ===========================================\nDROP TRIGGER IF EXISTS update_performer_search_name ON performers;\nDROP TRIGGER IF EXISTS update_scene_search_title ON scenes;\nDROP TRIGGER IF EXISTS insert_scene_search ON scenes;\nDROP TRIGGER IF EXISTS update_studio_search_name ON studios;\nDROP TRIGGER IF EXISTS update_scene_performers_search ON scene_performers;\nDROP FUNCTION IF EXISTS update_performers();\nDROP FUNCTION IF EXISTS update_scene();\nDROP FUNCTION IF EXISTS insert_scene();\nDROP FUNCTION IF EXISTS update_studio();\nDROP FUNCTION IF EXISTS update_scene_performers();\nDROP INDEX IF EXISTS scene_search_ts_idx;\nDROP INDEX IF EXISTS scene_search_scene_id_idx;\nDROP TABLE IF EXISTS scene_search;\n\n-- ===========================================\n-- Scene search\n-- ===========================================\nCREATE TABLE scene_search (\n    scene_id UUID PRIMARY KEY REFERENCES scenes(id) ON DELETE CASCADE,\n    scene_title TEXT,\n    scene_date TEXT,\n    studio_name TEXT,\n    network_name TEXT,\n    performer_names TEXT[],\n    scene_code TEXT\n);\n\nINSERT INTO scene_search\nSELECT S.id, S.title, S.date::TEXT, T.name, TP.name,\n       COALESCE(ARRAY_AGG(DISTINCT P.name) FILTER (WHERE P.name IS NOT NULL), '{}') ||\n       COALESCE(ARRAY_AGG(DISTINCT PS.\"as\") FILTER (WHERE PS.\"as\" IS NOT NULL), '{}'),\n       S.code\nFROM scenes S\nLEFT JOIN scene_performers PS ON PS.scene_id = S.id\nLEFT JOIN performers P ON PS.performer_id = P.id\nLEFT JOIN studios T ON T.id = S.studio_id\nLEFT JOIN studios TP ON T.parent_studio_id = TP.id\nWHERE S.deleted = false\nGROUP BY S.id, T.name, TP.name;\n\nCREATE INDEX scene_search_bm25_idx ON scene_search\nUSING bm25 (\n    scene_id,\n    scene_title,\n    scene_date,\n    studio_name,\n    network_name,\n    performer_names,\n    scene_code\n)\nWITH (key_field='scene_id');\n\nCREATE OR REPLACE FUNCTION upsert_scene_search(sid UUID) RETURNS VOID AS $$\nBEGIN\n    -- Remove from search if soft-deleted\n    DELETE FROM scene_search WHERE scene_id = sid\n        AND EXISTS (SELECT 1 FROM scenes WHERE id = sid AND deleted = true);\n\n    -- Insert/update only if not deleted\n    INSERT INTO scene_search (scene_id, scene_title, scene_date, studio_name, network_name, performer_names, scene_code)\n    SELECT S.id, S.title, S.date::TEXT, T.name, TP.name,\n           COALESCE(ARRAY_AGG(DISTINCT P.name) FILTER (WHERE P.name IS NOT NULL), '{}') ||\n           COALESCE(ARRAY_AGG(DISTINCT PS.\"as\") FILTER (WHERE PS.\"as\" IS NOT NULL), '{}'),\n           S.code\n    FROM scenes S\n    LEFT JOIN scene_performers PS ON PS.scene_id = S.id\n    LEFT JOIN performers P ON PS.performer_id = P.id\n    LEFT JOIN studios T ON T.id = S.studio_id\n    LEFT JOIN studios TP ON T.parent_studio_id = TP.id\n    WHERE S.id = sid AND S.deleted = false\n    GROUP BY S.id, T.name, TP.name\n    ON CONFLICT (scene_id) DO UPDATE SET\n        scene_title = EXCLUDED.scene_title, scene_date = EXCLUDED.scene_date,\n        studio_name = EXCLUDED.studio_name, network_name = EXCLUDED.network_name,\n        performer_names = EXCLUDED.performer_names, scene_code = EXCLUDED.scene_code;\nEND;\n$$ LANGUAGE plpgsql;\n\n-- On scene insert/update\nCREATE OR REPLACE FUNCTION trg_scene_changed() RETURNS TRIGGER AS $$\nBEGIN PERFORM upsert_scene_search(NEW.id); RETURN NULL; END;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_scene_search_on_scene\nAFTER INSERT OR UPDATE ON scenes\nFOR EACH ROW EXECUTE FUNCTION trg_scene_changed();\n\n-- On performer name change -> repopulate all their scenes\nCREATE OR REPLACE FUNCTION trg_performer_changed_scenes() RETURNS TRIGGER AS $$\nBEGIN\n    PERFORM upsert_scene_search(scene_id)\n    FROM scene_performers WHERE performer_id = NEW.id;\n    RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_scene_search_on_performer\nAFTER UPDATE ON performers\nFOR EACH ROW EXECUTE FUNCTION trg_performer_changed_scenes();\n\n-- Studio name change -> populate scenes under this studio and its child studios\nCREATE OR REPLACE FUNCTION trg_studio_changed_scenes() RETURNS TRIGGER AS $$\nBEGIN\n    -- Scenes directly under this studio\n    PERFORM upsert_scene_search(id)\n    FROM scenes WHERE studio_id = NEW.id;\n    -- Scenes under child studios (network name changed)\n    PERFORM upsert_scene_search(S.id)\n    FROM scenes S\n    JOIN studios ST ON S.studio_id = ST.id\n    WHERE ST.parent_studio_id = NEW.id;\n    RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_scene_search_on_studio\nAFTER UPDATE ON studios\nFOR EACH ROW EXECUTE FUNCTION trg_studio_changed_scenes();\n\n-- On scene_performers insert\nCREATE OR REPLACE FUNCTION trg_scene_performers_inserted() RETURNS TRIGGER AS $$\nBEGIN\n    PERFORM upsert_scene_search(scene_id)\n    FROM (SELECT DISTINCT scene_id FROM new_rows) affected;\n    RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_scene_search_on_sp_insert\nAFTER INSERT ON scene_performers\nREFERENCING NEW TABLE AS new_rows\nFOR EACH STATEMENT EXECUTE FUNCTION trg_scene_performers_inserted();\n\n-- On scene_performers delete\nCREATE OR REPLACE FUNCTION trg_scene_performers_deleted() RETURNS TRIGGER AS $$\nBEGIN\n    PERFORM upsert_scene_search(scene_id)\n    FROM (SELECT DISTINCT scene_id FROM old_rows) affected;\n    RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_scene_search_on_sp_delete\nAFTER DELETE ON scene_performers\nREFERENCING OLD TABLE AS old_rows\nFOR EACH STATEMENT EXECUTE FUNCTION trg_scene_performers_deleted();\n\n-- ===========================================\n-- Performer search\n-- ===========================================\nCREATE TABLE performer_search (\n    performer_id UUID PRIMARY KEY REFERENCES performers(id) ON DELETE CASCADE,\n    name TEXT,\n    disambiguation TEXT,\n    aliases TEXT[],\n    gender TEXT\n);\n\nINSERT INTO performer_search\nSELECT P.id, P.name, P.disambiguation,\n       ARRAY_AGG(PA.alias) FILTER (WHERE PA.alias IS NOT NULL),\n       P.gender\nFROM performers P\nLEFT JOIN performer_aliases PA ON PA.performer_id = P.id\nWHERE P.deleted = false\nGROUP BY P.id;\n\nCREATE INDEX performer_search_bm25_idx ON performer_search\nUSING bm25 (\n    performer_id,\n    name,\n    disambiguation,\n    aliases,\n    (gender::pdb.literal)\n)\nWITH (key_field='performer_id');\n\nCREATE OR REPLACE FUNCTION upsert_performer_search(pid UUID) RETURNS VOID AS $$\nBEGIN\n    -- Remove from search if soft-deleted\n    DELETE FROM performer_search WHERE performer_id = pid\n        AND EXISTS (SELECT 1 FROM performers WHERE id = pid AND deleted = true);\n\n    -- Insert/update only if not deleted\n    INSERT INTO performer_search (performer_id, name, disambiguation, aliases, gender)\n    SELECT P.id, P.name, P.disambiguation,\n           ARRAY_AGG(PA.alias) FILTER (WHERE PA.alias IS NOT NULL),\n           P.gender\n    FROM performers P\n    LEFT JOIN performer_aliases PA ON PA.performer_id = P.id\n    WHERE P.id = pid AND P.deleted = false\n    GROUP BY P.id\n    ON CONFLICT (performer_id) DO UPDATE SET\n        name = EXCLUDED.name, disambiguation = EXCLUDED.disambiguation, aliases = EXCLUDED.aliases,\n        gender = EXCLUDED.gender;\nEND;\n$$ LANGUAGE plpgsql;\n\n-- On performer insert/update\nCREATE OR REPLACE FUNCTION trg_performer_changed() RETURNS TRIGGER AS $$\nBEGIN PERFORM upsert_performer_search(NEW.id); RETURN NULL; END;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_performer_search_on_performer\nAFTER INSERT OR UPDATE ON performers\nFOR EACH ROW EXECUTE FUNCTION trg_performer_changed();\n\n-- On performer_aliases insert\nCREATE OR REPLACE FUNCTION trg_performer_aliases_inserted() RETURNS TRIGGER AS $$\nBEGIN\n    PERFORM upsert_performer_search(performer_id)\n    FROM (SELECT DISTINCT performer_id FROM new_rows) affected;\n    RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_performer_search_on_alias_insert\nAFTER INSERT ON performer_aliases\nREFERENCING NEW TABLE AS new_rows\nFOR EACH STATEMENT EXECUTE FUNCTION trg_performer_aliases_inserted();\n\n-- On performer_aliases delete\nCREATE OR REPLACE FUNCTION trg_performer_aliases_deleted() RETURNS TRIGGER AS $$\nBEGIN\n    PERFORM upsert_performer_search(performer_id)\n    FROM (SELECT DISTINCT performer_id FROM old_rows) affected;\n    RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_performer_search_on_alias_delete\nAFTER DELETE ON performer_aliases\nREFERENCING OLD TABLE AS old_rows\nFOR EACH STATEMENT EXECUTE FUNCTION trg_performer_aliases_deleted();\n\n-- ===========================================\n-- Studio search\n-- ===========================================\nCREATE TABLE studio_search (\n    studio_id UUID PRIMARY KEY REFERENCES studios(id) ON DELETE CASCADE,\n    name TEXT,\n    network TEXT,\n    aliases TEXT[]\n);\n\nINSERT INTO studio_search\nSELECT S.id, S.name, SP.name,\n       ARRAY_AGG(SA.alias) FILTER (WHERE SA.alias IS NOT NULL)\nFROM studios S\nLEFT JOIN studios SP ON S.parent_studio_id = SP.id\nLEFT JOIN studio_aliases SA ON SA.studio_id = S.id\nWHERE S.deleted = false\nGROUP BY S.id, SP.name;\n\nCREATE INDEX studio_search_bm25_idx ON studio_search\nUSING bm25 (studio_id, name, network, aliases)\nWITH (key_field='studio_id');\n\nCREATE OR REPLACE FUNCTION upsert_studio_search(sid UUID) RETURNS VOID AS $$\nBEGIN\n    -- Remove from search if soft-deleted\n    DELETE FROM studio_search WHERE studio_id = sid\n        AND EXISTS (SELECT 1 FROM studios WHERE id = sid AND deleted = true);\n\n    -- Insert/update only if not deleted\n    INSERT INTO studio_search (studio_id, name, network, aliases)\n    SELECT S.id, S.name, SP.name,\n           ARRAY_AGG(SA.alias) FILTER (WHERE SA.alias IS NOT NULL)\n    FROM studios S\n    LEFT JOIN studios SP ON S.parent_studio_id = SP.id\n    LEFT JOIN studio_aliases SA ON SA.studio_id = S.id\n    WHERE S.id = sid AND S.deleted = false\n    GROUP BY S.id, SP.name\n    ON CONFLICT (studio_id) DO UPDATE SET\n        name = EXCLUDED.name, network = EXCLUDED.network, aliases = EXCLUDED.aliases;\nEND;\n$$ LANGUAGE plpgsql;\n\n-- On studio insert/update -> upsert self + upsert child studios (parent name changed)\nCREATE OR REPLACE FUNCTION trg_studio_changed() RETURNS TRIGGER AS $$\nBEGIN\n    PERFORM upsert_studio_search(NEW.id);\n    -- If name changed, update child studios that reference this as parent\n    PERFORM upsert_studio_search(id)\n    FROM studios WHERE parent_studio_id = NEW.id;\n    RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_studio_search_on_studio\nAFTER INSERT OR UPDATE ON studios\nFOR EACH ROW EXECUTE FUNCTION trg_studio_changed();\n\n-- On studio_aliases insert\nCREATE OR REPLACE FUNCTION trg_studio_aliases_inserted() RETURNS TRIGGER AS $$\nBEGIN\n    PERFORM upsert_studio_search(studio_id)\n    FROM (SELECT DISTINCT studio_id FROM new_rows) affected;\n    RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_studio_search_on_alias_insert\nAFTER INSERT ON studio_aliases\nREFERENCING NEW TABLE AS new_rows\nFOR EACH STATEMENT EXECUTE FUNCTION trg_studio_aliases_inserted();\n\n-- On studio_aliases delete\nCREATE OR REPLACE FUNCTION trg_studio_aliases_deleted() RETURNS TRIGGER AS $$\nBEGIN\n    PERFORM upsert_studio_search(studio_id)\n    FROM (SELECT DISTINCT studio_id FROM old_rows) affected;\n    RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_studio_search_on_alias_delete\nAFTER DELETE ON studio_aliases\nREFERENCING OLD TABLE AS old_rows\nFOR EACH STATEMENT EXECUTE FUNCTION trg_studio_aliases_deleted();\n\n-- ===========================================\n-- Tag search\n-- ===========================================\nCREATE TABLE tag_search (\n    tag_id UUID PRIMARY KEY REFERENCES tags(id) ON DELETE CASCADE,\n    name TEXT,\n    aliases TEXT[]\n);\n\nINSERT INTO tag_search\nSELECT T.id, T.name,\n       ARRAY_AGG(TA.alias) FILTER (WHERE TA.alias IS NOT NULL)\nFROM tags T\nLEFT JOIN tag_aliases TA ON TA.tag_id = T.id\nWHERE T.deleted = false\nGROUP BY T.id;\n\nCREATE INDEX tag_search_bm25_idx ON tag_search\nUSING bm25 (tag_id, name, aliases)\nWITH (key_field='tag_id');\n\nCREATE OR REPLACE FUNCTION upsert_tag_search(tid UUID) RETURNS VOID AS $$\nBEGIN\n    -- Remove from search if soft-deleted\n    DELETE FROM tag_search WHERE tag_id = tid\n        AND EXISTS (SELECT 1 FROM tags WHERE id = tid AND deleted = true);\n\n    -- Insert/update only if not deleted\n    INSERT INTO tag_search (tag_id, name, aliases)\n    SELECT T.id, T.name,\n           ARRAY_AGG(TA.alias) FILTER (WHERE TA.alias IS NOT NULL)\n    FROM tags T\n    LEFT JOIN tag_aliases TA ON TA.tag_id = T.id\n    WHERE T.id = tid AND T.deleted = false\n    GROUP BY T.id\n    ON CONFLICT (tag_id) DO UPDATE SET\n        name = EXCLUDED.name, aliases = EXCLUDED.aliases;\nEND;\n$$ LANGUAGE plpgsql;\n\n-- On tag insert/update\nCREATE OR REPLACE FUNCTION trg_tag_changed() RETURNS TRIGGER AS $$\nBEGIN PERFORM upsert_tag_search(NEW.id); RETURN NULL; END;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_tag_search_on_tag\nAFTER INSERT OR UPDATE ON tags\nFOR EACH ROW EXECUTE FUNCTION trg_tag_changed();\n\n-- On tag_aliases insert\nCREATE OR REPLACE FUNCTION trg_tag_aliases_inserted() RETURNS TRIGGER AS $$\nBEGIN\n    PERFORM upsert_tag_search(tag_id)\n    FROM (SELECT DISTINCT tag_id FROM new_rows) affected;\n    RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_tag_search_on_alias_insert\nAFTER INSERT ON tag_aliases\nREFERENCING NEW TABLE AS new_rows\nFOR EACH STATEMENT EXECUTE FUNCTION trg_tag_aliases_inserted();\n\n-- On tag_aliases delete\nCREATE OR REPLACE FUNCTION trg_tag_aliases_deleted() RETURNS TRIGGER AS $$\nBEGIN\n    PERFORM upsert_tag_search(tag_id)\n    FROM (SELECT DISTINCT tag_id FROM old_rows) affected;\n    RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER trg_tag_search_on_alias_delete\nAFTER DELETE ON tag_aliases\nREFERENCING OLD TABLE AS old_rows\nFOR EACH STATEMENT EXECUTE FUNCTION trg_tag_aliases_deleted();\n\n-- ===========================================\n-- Drop old trigram indexes\n-- ===========================================\nDROP INDEX IF EXISTS name_trgm_idx;\nDROP INDEX IF EXISTS disambiguation_trgm_idx;\nDROP INDEX IF EXISTS performer_alias_trgm_idx;\n"
  },
  {
    "path": "internal/database/migrations/postgres/57_mod_audit.up.sql",
    "content": "-- Create enum for moderator audit action types\nDROP TYPE IF EXISTS mod_audit_action;\nCREATE TYPE mod_audit_action AS ENUM (\n    'EDIT_DELETE',\n    'EDIT_AMENDMENT'\n);\n\n-- Create mod_audit table for tracking moderator actions\nCREATE TABLE mod_audit (\n    id UUID PRIMARY KEY,\n    action mod_audit_action NOT NULL,\n    user_id UUID REFERENCES users(id) ON DELETE SET NULL,\n    target_id UUID NOT NULL,\n    target_type VARCHAR(20) NOT NULL,\n    data JSONB NOT NULL,\n    reason TEXT,\n    created_at TIMESTAMP NOT NULL DEFAULT NOW()\n);\n\n-- Create indexes for common queries\nCREATE INDEX mod_audit_user_id_idx ON mod_audit(user_id);\nCREATE INDEX mod_audit_target_id_idx ON mod_audit(target_id);\nCREATE INDEX mod_audit_action_idx ON mod_audit(action);\nCREATE INDEX mod_audit_created_at_idx ON mod_audit(created_at DESC);\n\n-- Fix missing CASCADE on edit_votes\nALTER TABLE edit_votes\n  DROP CONSTRAINT IF EXISTS edit_votes_edit_id_fkey,\n  ADD CONSTRAINT edit_votes_edit_id_fkey\n    FOREIGN KEY (edit_id) REFERENCES edits(id) ON DELETE CASCADE;\n"
  },
  {
    "path": "internal/database/testutil/testutil.go",
    "content": "package testutil\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/jackc/pgx/v5/pgxpool\"\n\n\t\"github.com/stashapp/stash-box/internal/database\"\n\t\"github.com/stashapp/stash-box/internal/service\"\n)\n\nvar (\n\tdb      *pgxpool.Pool\n\tfactory *service.Factory\n)\n\nconst defaultTestDB = \"postgres@localhost/stash-box-test?sslmode=disable\"\n\ntype DatabasePopulater interface {\n\tPopulateDB(factory *service.Factory) error\n}\n\nfunc pgDropAll(conn *pgxpool.Pool) {\n\t// we want to drop all tables so that the migration initialises\n\t// the schema\n\trows, err := conn.Query(context.TODO(), `select 'drop table if exists \"' || tablename || '\" cascade;' from pg_tables`)\n\n\tif err != nil {\n\t\tpanic(\"Error dropping tables: \" + err.Error())\n\t}\n\tdefer rows.Close()\n\n\tfor rows.Next() {\n\t\tvar stmt string\n\t\tif err := rows.Scan(&stmt); err != nil {\n\t\t\tpanic(\"Error dropping tables: \" + err.Error())\n\t\t}\n\n\t\t_, _ = conn.Exec(context.TODO(), stmt)\n\t}\n}\n\nfunc initPostgres(connString string) func() {\n\tconn, err := pgxpool.New(context.TODO(), \"postgres://\"+connString)\n\n\tif err != nil {\n\t\tpanic(fmt.Sprintf(\"Could not connect to postgres database at %s: %s\", connString, err.Error()))\n\t}\n\n\tpgDropAll(conn)\n\tconn.Close()\n\n\tdb = database.Initialize(connString)\n\tfactory = service.NewFactory(db, nil) // nil EmailManager is fine for tests\n\n\t// Create system users (root, StashBot, etc.) just like main.go does\n\tfactory.User().CreateSystemUsers(context.TODO())\n\n\treturn teardownPostgres\n}\n\nfunc teardownPostgres() {\n\tnoDrop := os.Getenv(\"POSTGRES_NODROP\")\n\tif noDrop == \"\" {\n\t\tpgDropAll(db)\n\t}\n\tdb.Close()\n}\n\nfunc runTests(m *testing.M, populater DatabasePopulater) int {\n\tvar deferFn func()\n\n\tpgConnStr := os.Getenv(\"POSTGRES_DB\")\n\tif pgConnStr == \"\" {\n\t\tpgConnStr = defaultTestDB\n\t}\n\tdeferFn = initPostgres(pgConnStr)\n\t// defer close and delete the database\n\tif deferFn != nil {\n\t\tdefer deferFn()\n\t}\n\n\tif populater != nil {\n\t\terr := populater.PopulateDB(factory)\n\t\tif err != nil {\n\t\t\tpanic(fmt.Sprintf(\"Could not populate database: %s\", err.Error()))\n\t\t}\n\t}\n\n\t// run the tests\n\treturn m.Run()\n}\n\nfunc TestWithDatabase(m *testing.M, populater DatabasePopulater) {\n\tret := runTests(m, populater)\n\tos.Exit(ret)\n}\n\nfunc Factory() *service.Factory {\n\treturn factory\n}\n"
  },
  {
    "path": "internal/dataloader/bodymodificationsloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// BodyModificationsLoaderConfig captures the config to create a new BodyModificationsLoader\ntype BodyModificationsLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([][]models.BodyModification, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewBodyModificationsLoader creates a new BodyModificationsLoader given a fetch, wait, and maxBatch\nfunc NewBodyModificationsLoader(config BodyModificationsLoaderConfig) *BodyModificationsLoader {\n\treturn &BodyModificationsLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// BodyModificationsLoader batches and caches requests\ntype BodyModificationsLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([][]models.BodyModification, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID][]models.BodyModification\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *bodyModificationsLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype bodyModificationsLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    [][]models.BodyModification\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a BodyModification by key, batching and caching will be applied automatically\nfunc (l *BodyModificationsLoader) Load(key uuid.UUID) ([]models.BodyModification, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a BodyModification.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *BodyModificationsLoader) LoadThunk(key uuid.UUID) func() ([]models.BodyModification, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() ([]models.BodyModification, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &bodyModificationsLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() ([]models.BodyModification, error) {\n\t\t<-batch.done\n\n\t\tvar data []models.BodyModification\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *BodyModificationsLoader) LoadAll(keys []uuid.UUID) ([][]models.BodyModification, []error) {\n\tresults := make([]func() ([]models.BodyModification, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\tbodyModifications := make([][]models.BodyModification, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\tbodyModifications[i], errors[i] = thunk()\n\t}\n\treturn bodyModifications, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a BodyModifications.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *BodyModificationsLoader) LoadAllThunk(keys []uuid.UUID) func() ([][]models.BodyModification, []error) {\n\tresults := make([]func() ([]models.BodyModification, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([][]models.BodyModification, []error) {\n\t\tbodyModifications := make([][]models.BodyModification, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\tbodyModifications[i], errors[i] = thunk()\n\t\t}\n\t\treturn bodyModifications, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *BodyModificationsLoader) Prime(key uuid.UUID, value []models.BodyModification) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := make([]models.BodyModification, len(value))\n\t\tcopy(cpy, value)\n\t\tl.unsafeSet(key, cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *BodyModificationsLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *BodyModificationsLoader) unsafeSet(key uuid.UUID, value []models.BodyModification) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID][]models.BodyModification{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *bodyModificationsLoaderBatch) keyIndex(l *BodyModificationsLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *bodyModificationsLoaderBatch) startTimer(l *BodyModificationsLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *bodyModificationsLoaderBatch) end(l *BodyModificationsLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/boolsloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\n// BoolsLoaderConfig captures the config to create a new BoolsLoader\ntype BoolsLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([]bool, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewBoolsLoader creates a new BoolsLoader given a fetch, wait, and maxBatch\nfunc NewBoolsLoader(config BoolsLoaderConfig) *BoolsLoader {\n\treturn &BoolsLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// BoolsLoader batches and caches requests\ntype BoolsLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([]bool, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID]bool\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *boolsLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype boolsLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    []bool\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a bool by key, batching and caching will be applied automatically\nfunc (l *BoolsLoader) Load(key uuid.UUID) (bool, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a bool.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *BoolsLoader) LoadThunk(key uuid.UUID) func() (bool, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() (bool, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &boolsLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() (bool, error) {\n\t\t<-batch.done\n\n\t\tvar data bool\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *BoolsLoader) LoadAll(keys []uuid.UUID) ([]bool, []error) {\n\tresults := make([]func() (bool, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\tbools := make([]bool, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\tbools[i], errors[i] = thunk()\n\t}\n\treturn bools, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a bools.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *BoolsLoader) LoadAllThunk(keys []uuid.UUID) func() ([]bool, []error) {\n\tresults := make([]func() (bool, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([]bool, []error) {\n\t\tbools := make([]bool, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\tbools[i], errors[i] = thunk()\n\t\t}\n\t\treturn bools, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *BoolsLoader) Prime(key uuid.UUID, value bool) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\tl.unsafeSet(key, value)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *BoolsLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *BoolsLoader) unsafeSet(key uuid.UUID, value bool) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID]bool{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *boolsLoaderBatch) keyIndex(l *BoolsLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *boolsLoaderBatch) startTimer(l *BoolsLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *boolsLoaderBatch) end(l *BoolsLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/editcommentloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// EditCommentLoaderConfig captures the config to create a new EditCommentLoader\ntype EditCommentLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([]*models.EditComment, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewEditCommentLoader creates a new EditCommentLoader given a fetch, wait, and maxBatch\nfunc NewEditCommentLoader(config EditCommentLoaderConfig) *EditCommentLoader {\n\treturn &EditCommentLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// EditCommentLoader batches and caches requests\ntype EditCommentLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([]*models.EditComment, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID]*models.EditComment\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *editCommentLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype editCommentLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    []*models.EditComment\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a EditComment by key, batching and caching will be applied automatically\nfunc (l *EditCommentLoader) Load(key uuid.UUID) (*models.EditComment, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a EditComment.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *EditCommentLoader) LoadThunk(key uuid.UUID) func() (*models.EditComment, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() (*models.EditComment, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &editCommentLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() (*models.EditComment, error) {\n\t\t<-batch.done\n\n\t\tvar data *models.EditComment\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *EditCommentLoader) LoadAll(keys []uuid.UUID) ([]*models.EditComment, []error) {\n\tresults := make([]func() (*models.EditComment, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\teditComments := make([]*models.EditComment, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\teditComments[i], errors[i] = thunk()\n\t}\n\treturn editComments, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a EditComments.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *EditCommentLoader) LoadAllThunk(keys []uuid.UUID) func() ([]*models.EditComment, []error) {\n\tresults := make([]func() (*models.EditComment, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([]*models.EditComment, []error) {\n\t\teditComments := make([]*models.EditComment, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\teditComments[i], errors[i] = thunk()\n\t\t}\n\t\treturn editComments, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *EditCommentLoader) Prime(key uuid.UUID, value *models.EditComment) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := *value\n\t\tl.unsafeSet(key, &cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *EditCommentLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *EditCommentLoader) unsafeSet(key uuid.UUID, value *models.EditComment) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID]*models.EditComment{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *editCommentLoaderBatch) keyIndex(l *EditCommentLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *editCommentLoaderBatch) startTimer(l *EditCommentLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *editCommentLoaderBatch) end(l *EditCommentLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/editloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// EditLoaderConfig captures the config to create a new EditLoader\ntype EditLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([]*models.Edit, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewEditLoader creates a new EditLoader given a fetch, wait, and maxBatch\nfunc NewEditLoader(config EditLoaderConfig) *EditLoader {\n\treturn &EditLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// EditLoader batches and caches requests\ntype EditLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([]*models.Edit, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID]*models.Edit\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *editLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype editLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    []*models.Edit\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a Edit by key, batching and caching will be applied automatically\nfunc (l *EditLoader) Load(key uuid.UUID) (*models.Edit, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a Edit.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *EditLoader) LoadThunk(key uuid.UUID) func() (*models.Edit, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() (*models.Edit, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &editLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() (*models.Edit, error) {\n\t\t<-batch.done\n\n\t\tvar data *models.Edit\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *EditLoader) LoadAll(keys []uuid.UUID) ([]*models.Edit, []error) {\n\tresults := make([]func() (*models.Edit, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\tedits := make([]*models.Edit, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\tedits[i], errors[i] = thunk()\n\t}\n\treturn edits, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a Edits.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *EditLoader) LoadAllThunk(keys []uuid.UUID) func() ([]*models.Edit, []error) {\n\tresults := make([]func() (*models.Edit, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([]*models.Edit, []error) {\n\t\tedits := make([]*models.Edit, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\tedits[i], errors[i] = thunk()\n\t\t}\n\t\treturn edits, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *EditLoader) Prime(key uuid.UUID, value *models.Edit) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := *value\n\t\tl.unsafeSet(key, &cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *EditLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *EditLoader) unsafeSet(key uuid.UUID, value *models.Edit) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID]*models.Edit{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *editLoaderBatch) keyIndex(l *EditLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *editLoaderBatch) startTimer(l *EditLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *editLoaderBatch) end(l *EditLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/fingerprintsloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// FingerprintsLoaderConfig captures the config to create a new FingerprintsLoader\ntype FingerprintsLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([][]models.Fingerprint, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewFingerprintsLoader creates a new FingerprintsLoader given a fetch, wait, and maxBatch\nfunc NewFingerprintsLoader(config FingerprintsLoaderConfig) *FingerprintsLoader {\n\treturn &FingerprintsLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// FingerprintsLoader batches and caches requests\ntype FingerprintsLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([][]models.Fingerprint, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID][]models.Fingerprint\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *fingerprintsLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype fingerprintsLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    [][]models.Fingerprint\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a Fingerprint by key, batching and caching will be applied automatically\nfunc (l *FingerprintsLoader) Load(key uuid.UUID) ([]models.Fingerprint, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a Fingerprint.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *FingerprintsLoader) LoadThunk(key uuid.UUID) func() ([]models.Fingerprint, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() ([]models.Fingerprint, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &fingerprintsLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() ([]models.Fingerprint, error) {\n\t\t<-batch.done\n\n\t\tvar data []models.Fingerprint\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *FingerprintsLoader) LoadAll(keys []uuid.UUID) ([][]models.Fingerprint, []error) {\n\tresults := make([]func() ([]models.Fingerprint, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\tfingerprints := make([][]models.Fingerprint, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\tfingerprints[i], errors[i] = thunk()\n\t}\n\treturn fingerprints, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a Fingerprints.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *FingerprintsLoader) LoadAllThunk(keys []uuid.UUID) func() ([][]models.Fingerprint, []error) {\n\tresults := make([]func() ([]models.Fingerprint, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([][]models.Fingerprint, []error) {\n\t\tfingerprints := make([][]models.Fingerprint, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\tfingerprints[i], errors[i] = thunk()\n\t\t}\n\t\treturn fingerprints, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *FingerprintsLoader) Prime(key uuid.UUID, value []models.Fingerprint) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := make([]models.Fingerprint, len(value))\n\t\tcopy(cpy, value)\n\t\tl.unsafeSet(key, cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *FingerprintsLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *FingerprintsLoader) unsafeSet(key uuid.UUID, value []models.Fingerprint) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID][]models.Fingerprint{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *fingerprintsLoaderBatch) keyIndex(l *FingerprintsLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *fingerprintsLoaderBatch) startTimer(l *FingerprintsLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *fingerprintsLoaderBatch) end(l *FingerprintsLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/imageloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// ImageLoaderConfig captures the config to create a new ImageLoader\ntype ImageLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([]*models.Image, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewImageLoader creates a new ImageLoader given a fetch, wait, and maxBatch\nfunc NewImageLoader(config ImageLoaderConfig) *ImageLoader {\n\treturn &ImageLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// ImageLoader batches and caches requests\ntype ImageLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([]*models.Image, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID]*models.Image\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *imageLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype imageLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    []*models.Image\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a Image by key, batching and caching will be applied automatically\nfunc (l *ImageLoader) Load(key uuid.UUID) (*models.Image, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a Image.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *ImageLoader) LoadThunk(key uuid.UUID) func() (*models.Image, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() (*models.Image, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &imageLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() (*models.Image, error) {\n\t\t<-batch.done\n\n\t\tvar data *models.Image\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *ImageLoader) LoadAll(keys []uuid.UUID) ([]*models.Image, []error) {\n\tresults := make([]func() (*models.Image, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\timages := make([]*models.Image, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\timages[i], errors[i] = thunk()\n\t}\n\treturn images, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a Images.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *ImageLoader) LoadAllThunk(keys []uuid.UUID) func() ([]*models.Image, []error) {\n\tresults := make([]func() (*models.Image, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([]*models.Image, []error) {\n\t\timages := make([]*models.Image, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\timages[i], errors[i] = thunk()\n\t\t}\n\t\treturn images, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *ImageLoader) Prime(key uuid.UUID, value *models.Image) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := *value\n\t\tl.unsafeSet(key, &cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *ImageLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *ImageLoader) unsafeSet(key uuid.UUID, value *models.Image) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID]*models.Image{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *imageLoaderBatch) keyIndex(l *ImageLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *imageLoaderBatch) startTimer(l *ImageLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *imageLoaderBatch) end(l *ImageLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/loaders.go",
    "content": "package dataloader\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/service\"\n)\n\ntype contextKey int\n\nconst (\n\tloadersKey contextKey = iota\n)\n\ntype Loaders struct {\n\tSceneFingerprintsByID          FingerprintsLoader\n\tSubmittedSceneFingerprintsByID FingerprintsLoader\n\tImageByID                      ImageLoader\n\tPerformerByID                  PerformerLoader\n\tPerformerAliasesByID           StringsLoader\n\tPerformerImageIDsByID          UUIDsLoader\n\tPerformerMergeIDsByID          UUIDsLoader\n\tPerformerMergeIDsBySourceID    UUIDsLoader\n\tPerformerPiercingsByID         BodyModificationsLoader\n\tPerformerTattoosByID           BodyModificationsLoader\n\tPerformerUrlsByID              URLLoader\n\tPerformerIsFavoriteByID        BoolsLoader\n\tSceneByID                      SceneLoader\n\tSceneImageIDsByID              UUIDsLoader\n\tSceneAppearancesByID           SceneAppearancesLoader\n\tSceneUrlsByID                  URLLoader\n\tStudioImageIDsByID             UUIDsLoader\n\tStudioIsFavoriteByID           BoolsLoader\n\tStudioUrlsByID                 URLLoader\n\tStudioAliasesByID              StringsLoader\n\tSceneTagIDsByID                UUIDsLoader\n\tSiteByID                       SiteLoader\n\tStudioByID                     StudioLoader\n\tTagByID                        TagLoader\n\tTagCategoryByID                TagCategoryLoader\n\tEditByID                       EditLoader\n\tEditCommentByID                EditCommentLoader\n}\n\nfunc Middleware(fac service.Factory) func(next http.Handler) http.Handler {\n\treturn func(next http.Handler) http.Handler {\n\t\treturn http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\t\tctx := r.Context()\n\t\t\tctx = context.WithValue(ctx, loadersKey, GetLoaders(r.Context(), fac))\n\t\t\tr = r.WithContext(ctx)\n\t\t\tnext.ServeHTTP(w, r)\n\t\t})\n\t}\n}\n\nfunc For(ctx context.Context) *Loaders {\n\treturn ctx.Value(loadersKey).(*Loaders)\n}\n\nfunc GetLoadersKey() contextKey {\n\treturn loadersKey\n}\nfunc GetLoaders(ctx context.Context, fac service.Factory) *Loaders {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\n\treturn &Loaders{\n\t\tSceneFingerprintsByID: FingerprintsLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]models.Fingerprint, []error) {\n\t\t\t\ts := fac.Scene()\n\t\t\t\treturn s.LoadFingerprints(ctx, currentUser.ID, ids, false)\n\t\t\t},\n\t\t},\n\t\tSubmittedSceneFingerprintsByID: FingerprintsLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]models.Fingerprint, []error) {\n\t\t\t\ts := fac.Scene()\n\t\t\t\treturn s.LoadFingerprints(ctx, currentUser.ID, ids, true)\n\t\t\t},\n\t\t},\n\t\tPerformerByID: PerformerLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([]*models.Performer, []error) {\n\t\t\t\ts := fac.Performer()\n\t\t\t\treturn s.LoadByIds(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tSceneImageIDsByID: UUIDsLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]uuid.UUID, []error) {\n\t\t\t\ts := fac.Image()\n\t\t\t\treturn s.LoadBySceneIds(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tPerformerImageIDsByID: UUIDsLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]uuid.UUID, []error) {\n\t\t\t\ts := fac.Image()\n\t\t\t\treturn s.LoadByPerformerIds(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tPerformerMergeIDsByID: UUIDsLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]uuid.UUID, []error) {\n\t\t\t\ts := fac.Performer()\n\t\t\t\treturn s.LoadMergeIDsByPerformerIDs(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tPerformerMergeIDsBySourceID: UUIDsLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]uuid.UUID, []error) {\n\t\t\t\ts := fac.Performer()\n\t\t\t\treturn s.LoadMergeIDsBySourcePerformerIDs(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tPerformerAliasesByID: StringsLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]string, []error) {\n\t\t\t\ts := fac.Performer()\n\t\t\t\treturn s.LoadAliases(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tPerformerTattoosByID: BodyModificationsLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]models.BodyModification, []error) {\n\t\t\t\ts := fac.Performer()\n\t\t\t\treturn s.LoadTattoos(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tPerformerPiercingsByID: BodyModificationsLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]models.BodyModification, []error) {\n\t\t\t\ts := fac.Performer()\n\t\t\t\treturn s.LoadPiercings(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tSceneAppearancesByID: SceneAppearancesLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]models.PerformerScene, []error) {\n\t\t\t\ts := fac.Scene()\n\t\t\t\treturn s.LoadAppearances(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tSceneUrlsByID: URLLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]models.URL, []error) {\n\t\t\t\ts := fac.Scene()\n\t\t\t\treturn s.LoadURLs(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tPerformerUrlsByID: URLLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]models.URL, []error) {\n\t\t\t\ts := fac.Performer()\n\t\t\t\treturn s.LoadURLs(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tStudioUrlsByID: URLLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]models.URL, []error) {\n\t\t\t\ts := fac.Studio()\n\t\t\t\treturn s.LoadURLs(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tImageByID: ImageLoader{\n\t\t\tmaxBatch: 1000,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([]*models.Image, []error) {\n\t\t\t\ts := fac.Image()\n\t\t\t\treturn s.LoadIds(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tStudioImageIDsByID: UUIDsLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]uuid.UUID, []error) {\n\t\t\t\ts := fac.Image()\n\t\t\t\treturn s.LoadByStudioIds(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tSceneTagIDsByID: UUIDsLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]uuid.UUID, []error) {\n\t\t\t\ts := fac.Tag()\n\t\t\t\treturn s.FindIdsBySceneIds(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tSiteByID: SiteLoader{\n\t\t\tmaxBatch: 1000,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([]*models.Site, []error) {\n\t\t\t\ts := fac.Site()\n\t\t\t\treturn s.LoadIds(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tStudioByID: StudioLoader{\n\t\t\tmaxBatch: 1000,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([]*models.Studio, []error) {\n\t\t\t\ts := fac.Studio()\n\t\t\t\treturn s.LoadIds(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tTagByID: TagLoader{\n\t\t\tmaxBatch: 1000,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([]*models.Tag, []error) {\n\t\t\t\ts := fac.Tag()\n\t\t\t\treturn s.LoadIds(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tTagCategoryByID: TagCategoryLoader{\n\t\t\tmaxBatch: 1000,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([]*models.TagCategory, []error) {\n\t\t\t\ts := fac.Tag()\n\t\t\t\treturn s.LoadCategoriesByIds(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tEditByID: EditLoader{\n\t\t\tmaxBatch: 1000,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([]*models.Edit, []error) {\n\t\t\t\ts := fac.Edit()\n\t\t\t\treturn s.LoadIds(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tEditCommentByID: EditCommentLoader{\n\t\t\tmaxBatch: 1000,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([]*models.EditComment, []error) {\n\t\t\t\ts := fac.Edit()\n\t\t\t\treturn s.LoadCommentsByIds(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tSceneByID: SceneLoader{\n\t\t\tmaxBatch: 1000,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([]*models.Scene, []error) {\n\t\t\t\ts := fac.Scene()\n\t\t\t\treturn s.LoadIds(ctx, ids)\n\t\t\t},\n\t\t},\n\t\tPerformerIsFavoriteByID: BoolsLoader{\n\t\t\tmaxBatch: 1000,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([]bool, []error) {\n\t\t\t\ts := fac.Performer()\n\t\t\t\treturn s.LoadIsFavorite(ctx, currentUser.ID, ids)\n\t\t\t},\n\t\t},\n\t\tStudioIsFavoriteByID: BoolsLoader{\n\t\t\tmaxBatch: 1000,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([]bool, []error) {\n\t\t\t\ts := fac.Studio()\n\t\t\t\treturn s.LoadIsFavorite(ctx, currentUser.ID, ids)\n\t\t\t},\n\t\t},\n\t\tStudioAliasesByID: StringsLoader{\n\t\t\tmaxBatch: 100,\n\t\t\twait:     1 * time.Millisecond,\n\t\t\tfetch: func(ids []uuid.UUID) ([][]string, []error) {\n\t\t\t\ts := fac.Studio()\n\t\t\t\treturn s.LoadAliases(ctx, ids)\n\t\t\t},\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "internal/dataloader/performerloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// PerformerLoaderConfig captures the config to create a new PerformerLoader\ntype PerformerLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([]*models.Performer, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewPerformerLoader creates a new PerformerLoader given a fetch, wait, and maxBatch\nfunc NewPerformerLoader(config PerformerLoaderConfig) *PerformerLoader {\n\treturn &PerformerLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// PerformerLoader batches and caches requests\ntype PerformerLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([]*models.Performer, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID]*models.Performer\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *performerLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype performerLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    []*models.Performer\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a Performer by key, batching and caching will be applied automatically\nfunc (l *PerformerLoader) Load(key uuid.UUID) (*models.Performer, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a Performer.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *PerformerLoader) LoadThunk(key uuid.UUID) func() (*models.Performer, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() (*models.Performer, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &performerLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() (*models.Performer, error) {\n\t\t<-batch.done\n\n\t\tvar data *models.Performer\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *PerformerLoader) LoadAll(keys []uuid.UUID) ([]*models.Performer, []error) {\n\tresults := make([]func() (*models.Performer, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\tperformers := make([]*models.Performer, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\tperformers[i], errors[i] = thunk()\n\t}\n\treturn performers, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a Performers.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *PerformerLoader) LoadAllThunk(keys []uuid.UUID) func() ([]*models.Performer, []error) {\n\tresults := make([]func() (*models.Performer, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([]*models.Performer, []error) {\n\t\tperformers := make([]*models.Performer, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\tperformers[i], errors[i] = thunk()\n\t\t}\n\t\treturn performers, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *PerformerLoader) Prime(key uuid.UUID, value *models.Performer) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := *value\n\t\tl.unsafeSet(key, &cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *PerformerLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *PerformerLoader) unsafeSet(key uuid.UUID, value *models.Performer) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID]*models.Performer{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *performerLoaderBatch) keyIndex(l *PerformerLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *performerLoaderBatch) startTimer(l *PerformerLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *performerLoaderBatch) end(l *PerformerLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/sceneappearancesloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// SceneAppearancesLoaderConfig captures the config to create a new SceneAppearancesLoader\ntype SceneAppearancesLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([][]models.PerformerScene, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewSceneAppearancesLoader creates a new SceneAppearancesLoader given a fetch, wait, and maxBatch\nfunc NewSceneAppearancesLoader(config SceneAppearancesLoaderConfig) *SceneAppearancesLoader {\n\treturn &SceneAppearancesLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// SceneAppearancesLoader batches and caches requests\ntype SceneAppearancesLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([][]models.PerformerScene, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID][]models.PerformerScene\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *sceneAppearancesLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype sceneAppearancesLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    [][]models.PerformerScene\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a PerformerScene by key, batching and caching will be applied automatically\nfunc (l *SceneAppearancesLoader) Load(key uuid.UUID) ([]models.PerformerScene, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a PerformerScene.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *SceneAppearancesLoader) LoadThunk(key uuid.UUID) func() ([]models.PerformerScene, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() ([]models.PerformerScene, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &sceneAppearancesLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() ([]models.PerformerScene, error) {\n\t\t<-batch.done\n\n\t\tvar data []models.PerformerScene\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *SceneAppearancesLoader) LoadAll(keys []uuid.UUID) ([][]models.PerformerScene, []error) {\n\tresults := make([]func() ([]models.PerformerScene, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\tperformerScenes := make([][]models.PerformerScene, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\tperformerScenes[i], errors[i] = thunk()\n\t}\n\treturn performerScenes, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a PerformerScenes.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *SceneAppearancesLoader) LoadAllThunk(keys []uuid.UUID) func() ([][]models.PerformerScene, []error) {\n\tresults := make([]func() ([]models.PerformerScene, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([][]models.PerformerScene, []error) {\n\t\tperformerScenes := make([][]models.PerformerScene, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\tperformerScenes[i], errors[i] = thunk()\n\t\t}\n\t\treturn performerScenes, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *SceneAppearancesLoader) Prime(key uuid.UUID, value []models.PerformerScene) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := make([]models.PerformerScene, len(value))\n\t\tcopy(cpy, value)\n\t\tl.unsafeSet(key, cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *SceneAppearancesLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *SceneAppearancesLoader) unsafeSet(key uuid.UUID, value []models.PerformerScene) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID][]models.PerformerScene{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *sceneAppearancesLoaderBatch) keyIndex(l *SceneAppearancesLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *sceneAppearancesLoaderBatch) startTimer(l *SceneAppearancesLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *sceneAppearancesLoaderBatch) end(l *SceneAppearancesLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/sceneloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// SceneLoaderConfig captures the config to create a new SceneLoader\ntype SceneLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([]*models.Scene, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewSceneLoader creates a new SceneLoader given a fetch, wait, and maxBatch\nfunc NewSceneLoader(config SceneLoaderConfig) *SceneLoader {\n\treturn &SceneLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// SceneLoader batches and caches requests\ntype SceneLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([]*models.Scene, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID]*models.Scene\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *sceneLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype sceneLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    []*models.Scene\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a Scene by key, batching and caching will be applied automatically\nfunc (l *SceneLoader) Load(key uuid.UUID) (*models.Scene, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a Scene.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *SceneLoader) LoadThunk(key uuid.UUID) func() (*models.Scene, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() (*models.Scene, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &sceneLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() (*models.Scene, error) {\n\t\t<-batch.done\n\n\t\tvar data *models.Scene\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *SceneLoader) LoadAll(keys []uuid.UUID) ([]*models.Scene, []error) {\n\tresults := make([]func() (*models.Scene, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\tscenes := make([]*models.Scene, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\tscenes[i], errors[i] = thunk()\n\t}\n\treturn scenes, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a Scenes.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *SceneLoader) LoadAllThunk(keys []uuid.UUID) func() ([]*models.Scene, []error) {\n\tresults := make([]func() (*models.Scene, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([]*models.Scene, []error) {\n\t\tscenes := make([]*models.Scene, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\tscenes[i], errors[i] = thunk()\n\t\t}\n\t\treturn scenes, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *SceneLoader) Prime(key uuid.UUID, value *models.Scene) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := *value\n\t\tl.unsafeSet(key, &cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *SceneLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *SceneLoader) unsafeSet(key uuid.UUID, value *models.Scene) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID]*models.Scene{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *sceneLoaderBatch) keyIndex(l *SceneLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *sceneLoaderBatch) startTimer(l *SceneLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *sceneLoaderBatch) end(l *SceneLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/siteloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// SiteLoaderConfig captures the config to create a new SiteLoader\ntype SiteLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([]*models.Site, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewSiteLoader creates a new SiteLoader given a fetch, wait, and maxBatch\nfunc NewSiteLoader(config SiteLoaderConfig) *SiteLoader {\n\treturn &SiteLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// SiteLoader batches and caches requests\ntype SiteLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([]*models.Site, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID]*models.Site\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *siteLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype siteLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    []*models.Site\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a Site by key, batching and caching will be applied automatically\nfunc (l *SiteLoader) Load(key uuid.UUID) (*models.Site, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a Site.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *SiteLoader) LoadThunk(key uuid.UUID) func() (*models.Site, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() (*models.Site, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &siteLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() (*models.Site, error) {\n\t\t<-batch.done\n\n\t\tvar data *models.Site\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *SiteLoader) LoadAll(keys []uuid.UUID) ([]*models.Site, []error) {\n\tresults := make([]func() (*models.Site, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\tsites := make([]*models.Site, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\tsites[i], errors[i] = thunk()\n\t}\n\treturn sites, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a Sites.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *SiteLoader) LoadAllThunk(keys []uuid.UUID) func() ([]*models.Site, []error) {\n\tresults := make([]func() (*models.Site, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([]*models.Site, []error) {\n\t\tsites := make([]*models.Site, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\tsites[i], errors[i] = thunk()\n\t\t}\n\t\treturn sites, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *SiteLoader) Prime(key uuid.UUID, value *models.Site) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := *value\n\t\tl.unsafeSet(key, &cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *SiteLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *SiteLoader) unsafeSet(key uuid.UUID, value *models.Site) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID]*models.Site{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *siteLoaderBatch) keyIndex(l *SiteLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *siteLoaderBatch) startTimer(l *SiteLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *siteLoaderBatch) end(l *SiteLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/stringsloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\n// StringsLoaderConfig captures the config to create a new StringsLoader\ntype StringsLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([][]string, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewStringsLoader creates a new StringsLoader given a fetch, wait, and maxBatch\nfunc NewStringsLoader(config StringsLoaderConfig) *StringsLoader {\n\treturn &StringsLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// StringsLoader batches and caches requests\ntype StringsLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([][]string, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID][]string\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *stringsLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype stringsLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    [][]string\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a string by key, batching and caching will be applied automatically\nfunc (l *StringsLoader) Load(key uuid.UUID) ([]string, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a string.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *StringsLoader) LoadThunk(key uuid.UUID) func() ([]string, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() ([]string, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &stringsLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() ([]string, error) {\n\t\t<-batch.done\n\n\t\tvar data []string\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *StringsLoader) LoadAll(keys []uuid.UUID) ([][]string, []error) {\n\tresults := make([]func() ([]string, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\tstrings := make([][]string, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\tstrings[i], errors[i] = thunk()\n\t}\n\treturn strings, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a strings.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *StringsLoader) LoadAllThunk(keys []uuid.UUID) func() ([][]string, []error) {\n\tresults := make([]func() ([]string, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([][]string, []error) {\n\t\tstrings := make([][]string, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\tstrings[i], errors[i] = thunk()\n\t\t}\n\t\treturn strings, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *StringsLoader) Prime(key uuid.UUID, value []string) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := make([]string, len(value))\n\t\tcopy(cpy, value)\n\t\tl.unsafeSet(key, cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *StringsLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *StringsLoader) unsafeSet(key uuid.UUID, value []string) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID][]string{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *stringsLoaderBatch) keyIndex(l *StringsLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *stringsLoaderBatch) startTimer(l *StringsLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *stringsLoaderBatch) end(l *StringsLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/studioloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// StudioLoaderConfig captures the config to create a new StudioLoader\ntype StudioLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([]*models.Studio, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewStudioLoader creates a new StudioLoader given a fetch, wait, and maxBatch\nfunc NewStudioLoader(config StudioLoaderConfig) *StudioLoader {\n\treturn &StudioLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// StudioLoader batches and caches requests\ntype StudioLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([]*models.Studio, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID]*models.Studio\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *studioLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype studioLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    []*models.Studio\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a Studio by key, batching and caching will be applied automatically\nfunc (l *StudioLoader) Load(key uuid.UUID) (*models.Studio, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a Studio.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *StudioLoader) LoadThunk(key uuid.UUID) func() (*models.Studio, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() (*models.Studio, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &studioLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() (*models.Studio, error) {\n\t\t<-batch.done\n\n\t\tvar data *models.Studio\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *StudioLoader) LoadAll(keys []uuid.UUID) ([]*models.Studio, []error) {\n\tresults := make([]func() (*models.Studio, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\tstudios := make([]*models.Studio, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\tstudios[i], errors[i] = thunk()\n\t}\n\treturn studios, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a Studios.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *StudioLoader) LoadAllThunk(keys []uuid.UUID) func() ([]*models.Studio, []error) {\n\tresults := make([]func() (*models.Studio, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([]*models.Studio, []error) {\n\t\tstudios := make([]*models.Studio, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\tstudios[i], errors[i] = thunk()\n\t\t}\n\t\treturn studios, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *StudioLoader) Prime(key uuid.UUID, value *models.Studio) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := *value\n\t\tl.unsafeSet(key, &cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *StudioLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *StudioLoader) unsafeSet(key uuid.UUID, value *models.Studio) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID]*models.Studio{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *studioLoaderBatch) keyIndex(l *StudioLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *studioLoaderBatch) startTimer(l *StudioLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *studioLoaderBatch) end(l *StudioLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/submittedfingerprintsloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// SubmittedFingerprintsLoaderConfig captures the config to create a new SubmittedFingerprintsLoader\ntype SubmittedFingerprintsLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([][]models.Fingerprint, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewSubmittedFingerprintsLoader creates a new SubmittedFingerprintsLoader given a fetch, wait, and maxBatch\nfunc NewSubmittedFingerprintsLoader(config SubmittedFingerprintsLoaderConfig) *SubmittedFingerprintsLoader {\n\treturn &SubmittedFingerprintsLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// SubmittedFingerprintsLoader batches and caches requests\ntype SubmittedFingerprintsLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([][]models.Fingerprint, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID][]models.Fingerprint\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *submittedFingerprintsLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype submittedFingerprintsLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    [][]models.Fingerprint\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a Fingerprint by key, batching and caching will be applied automatically\nfunc (l *SubmittedFingerprintsLoader) Load(key uuid.UUID) ([]models.Fingerprint, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a Fingerprint.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *SubmittedFingerprintsLoader) LoadThunk(key uuid.UUID) func() ([]models.Fingerprint, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() ([]models.Fingerprint, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &submittedFingerprintsLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() ([]models.Fingerprint, error) {\n\t\t<-batch.done\n\n\t\tvar data []models.Fingerprint\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *SubmittedFingerprintsLoader) LoadAll(keys []uuid.UUID) ([][]models.Fingerprint, []error) {\n\tresults := make([]func() ([]models.Fingerprint, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\tfingerprints := make([][]models.Fingerprint, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\tfingerprints[i], errors[i] = thunk()\n\t}\n\treturn fingerprints, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a Fingerprints.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *SubmittedFingerprintsLoader) LoadAllThunk(keys []uuid.UUID) func() ([][]models.Fingerprint, []error) {\n\tresults := make([]func() ([]models.Fingerprint, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([][]models.Fingerprint, []error) {\n\t\tfingerprints := make([][]models.Fingerprint, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\tfingerprints[i], errors[i] = thunk()\n\t\t}\n\t\treturn fingerprints, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *SubmittedFingerprintsLoader) Prime(key uuid.UUID, value []models.Fingerprint) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := make([]models.Fingerprint, len(value))\n\t\tcopy(cpy, value)\n\t\tl.unsafeSet(key, cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *SubmittedFingerprintsLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *SubmittedFingerprintsLoader) unsafeSet(key uuid.UUID, value []models.Fingerprint) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID][]models.Fingerprint{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *submittedFingerprintsLoaderBatch) keyIndex(l *SubmittedFingerprintsLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *submittedFingerprintsLoaderBatch) startTimer(l *SubmittedFingerprintsLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *submittedFingerprintsLoaderBatch) end(l *SubmittedFingerprintsLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/tagcategoryloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// TagCategoryLoaderConfig captures the config to create a new TagCategoryLoader\ntype TagCategoryLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([]*models.TagCategory, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewTagCategoryLoader creates a new TagCategoryLoader given a fetch, wait, and maxBatch\nfunc NewTagCategoryLoader(config TagCategoryLoaderConfig) *TagCategoryLoader {\n\treturn &TagCategoryLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// TagCategoryLoader batches and caches requests\ntype TagCategoryLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([]*models.TagCategory, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID]*models.TagCategory\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *tagCategoryLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype tagCategoryLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    []*models.TagCategory\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a TagCategory by key, batching and caching will be applied automatically\nfunc (l *TagCategoryLoader) Load(key uuid.UUID) (*models.TagCategory, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a TagCategory.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *TagCategoryLoader) LoadThunk(key uuid.UUID) func() (*models.TagCategory, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() (*models.TagCategory, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &tagCategoryLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() (*models.TagCategory, error) {\n\t\t<-batch.done\n\n\t\tvar data *models.TagCategory\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *TagCategoryLoader) LoadAll(keys []uuid.UUID) ([]*models.TagCategory, []error) {\n\tresults := make([]func() (*models.TagCategory, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\ttagCategorys := make([]*models.TagCategory, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\ttagCategorys[i], errors[i] = thunk()\n\t}\n\treturn tagCategorys, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a TagCategorys.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *TagCategoryLoader) LoadAllThunk(keys []uuid.UUID) func() ([]*models.TagCategory, []error) {\n\tresults := make([]func() (*models.TagCategory, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([]*models.TagCategory, []error) {\n\t\ttagCategorys := make([]*models.TagCategory, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\ttagCategorys[i], errors[i] = thunk()\n\t\t}\n\t\treturn tagCategorys, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *TagCategoryLoader) Prime(key uuid.UUID, value *models.TagCategory) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := *value\n\t\tl.unsafeSet(key, &cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *TagCategoryLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *TagCategoryLoader) unsafeSet(key uuid.UUID, value *models.TagCategory) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID]*models.TagCategory{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *tagCategoryLoaderBatch) keyIndex(l *TagCategoryLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *tagCategoryLoaderBatch) startTimer(l *TagCategoryLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *tagCategoryLoaderBatch) end(l *TagCategoryLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/tagloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// TagLoaderConfig captures the config to create a new TagLoader\ntype TagLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([]*models.Tag, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewTagLoader creates a new TagLoader given a fetch, wait, and maxBatch\nfunc NewTagLoader(config TagLoaderConfig) *TagLoader {\n\treturn &TagLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// TagLoader batches and caches requests\ntype TagLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([]*models.Tag, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID]*models.Tag\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *tagLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype tagLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    []*models.Tag\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a Tag by key, batching and caching will be applied automatically\nfunc (l *TagLoader) Load(key uuid.UUID) (*models.Tag, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a Tag.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *TagLoader) LoadThunk(key uuid.UUID) func() (*models.Tag, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() (*models.Tag, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &tagLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() (*models.Tag, error) {\n\t\t<-batch.done\n\n\t\tvar data *models.Tag\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *TagLoader) LoadAll(keys []uuid.UUID) ([]*models.Tag, []error) {\n\tresults := make([]func() (*models.Tag, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\ttags := make([]*models.Tag, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\ttags[i], errors[i] = thunk()\n\t}\n\treturn tags, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a Tags.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *TagLoader) LoadAllThunk(keys []uuid.UUID) func() ([]*models.Tag, []error) {\n\tresults := make([]func() (*models.Tag, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([]*models.Tag, []error) {\n\t\ttags := make([]*models.Tag, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\ttags[i], errors[i] = thunk()\n\t\t}\n\t\treturn tags, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *TagLoader) Prime(key uuid.UUID, value *models.Tag) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := *value\n\t\tl.unsafeSet(key, &cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *TagLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *TagLoader) unsafeSet(key uuid.UUID, value *models.Tag) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID]*models.Tag{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *tagLoaderBatch) keyIndex(l *TagLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *tagLoaderBatch) startTimer(l *TagLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *tagLoaderBatch) end(l *TagLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/urlloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// URLLoaderConfig captures the config to create a new URLLoader\ntype URLLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([][]models.URL, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewURLLoader creates a new URLLoader given a fetch, wait, and maxBatch\nfunc NewURLLoader(config URLLoaderConfig) *URLLoader {\n\treturn &URLLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// URLLoader batches and caches requests\ntype URLLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([][]models.URL, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID][]models.URL\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *uRLLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype uRLLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    [][]models.URL\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a URL by key, batching and caching will be applied automatically\nfunc (l *URLLoader) Load(key uuid.UUID) ([]models.URL, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a URL.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *URLLoader) LoadThunk(key uuid.UUID) func() ([]models.URL, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() ([]models.URL, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &uRLLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() ([]models.URL, error) {\n\t\t<-batch.done\n\n\t\tvar data []models.URL\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *URLLoader) LoadAll(keys []uuid.UUID) ([][]models.URL, []error) {\n\tresults := make([]func() ([]models.URL, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\tuRLs := make([][]models.URL, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\tuRLs[i], errors[i] = thunk()\n\t}\n\treturn uRLs, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a URLs.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *URLLoader) LoadAllThunk(keys []uuid.UUID) func() ([][]models.URL, []error) {\n\tresults := make([]func() ([]models.URL, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([][]models.URL, []error) {\n\t\tuRLs := make([][]models.URL, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\tuRLs[i], errors[i] = thunk()\n\t\t}\n\t\treturn uRLs, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *URLLoader) Prime(key uuid.UUID, value []models.URL) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := make([]models.URL, len(value))\n\t\tcopy(cpy, value)\n\t\tl.unsafeSet(key, cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *URLLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *URLLoader) unsafeSet(key uuid.UUID, value []models.URL) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID][]models.URL{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *uRLLoaderBatch) keyIndex(l *URLLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *uRLLoaderBatch) startTimer(l *URLLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *uRLLoaderBatch) end(l *URLLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/dataloader/uuidsloader_gen.go",
    "content": "// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.\n\npackage dataloader\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\n// UUIDsLoaderConfig captures the config to create a new UUIDsLoader\ntype UUIDsLoaderConfig struct {\n\t// Fetch is a method that provides the data for the loader\n\tFetch func(keys []uuid.UUID) ([][]uuid.UUID, []error)\n\n\t// Wait is how long wait before sending a batch\n\tWait time.Duration\n\n\t// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit\n\tMaxBatch int\n}\n\n// NewUUIDsLoader creates a new UUIDsLoader given a fetch, wait, and maxBatch\nfunc NewUUIDsLoader(config UUIDsLoaderConfig) *UUIDsLoader {\n\treturn &UUIDsLoader{\n\t\tfetch:    config.Fetch,\n\t\twait:     config.Wait,\n\t\tmaxBatch: config.MaxBatch,\n\t}\n}\n\n// UUIDsLoader batches and caches requests\ntype UUIDsLoader struct {\n\t// this method provides the data for the loader\n\tfetch func(keys []uuid.UUID) ([][]uuid.UUID, []error)\n\n\t// how long to done before sending a batch\n\twait time.Duration\n\n\t// this will limit the maximum number of keys to send in one batch, 0 = no limit\n\tmaxBatch int\n\n\t// INTERNAL\n\n\t// lazily created cache\n\tcache map[uuid.UUID][]uuid.UUID\n\n\t// the current batch. keys will continue to be collected until timeout is hit,\n\t// then everything will be sent to the fetch method and out to the listeners\n\tbatch *uUIDsLoaderBatch\n\n\t// mutex to prevent races\n\tmu sync.Mutex\n}\n\ntype uUIDsLoaderBatch struct {\n\tkeys    []uuid.UUID\n\tdata    [][]uuid.UUID\n\terror   []error\n\tclosing bool\n\tdone    chan struct{}\n}\n\n// Load a UUID by key, batching and caching will be applied automatically\nfunc (l *UUIDsLoader) Load(key uuid.UUID) ([]uuid.UUID, error) {\n\treturn l.LoadThunk(key)()\n}\n\n// LoadThunk returns a function that when called will block waiting for a UUID.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *UUIDsLoader) LoadThunk(key uuid.UUID) func() ([]uuid.UUID, error) {\n\tl.mu.Lock()\n\tif it, ok := l.cache[key]; ok {\n\t\tl.mu.Unlock()\n\t\treturn func() ([]uuid.UUID, error) {\n\t\t\treturn it, nil\n\t\t}\n\t}\n\tif l.batch == nil {\n\t\tl.batch = &uUIDsLoaderBatch{done: make(chan struct{})}\n\t}\n\tbatch := l.batch\n\tpos := batch.keyIndex(l, key)\n\tl.mu.Unlock()\n\n\treturn func() ([]uuid.UUID, error) {\n\t\t<-batch.done\n\n\t\tvar data []uuid.UUID\n\t\tif pos < len(batch.data) {\n\t\t\tdata = batch.data[pos]\n\t\t}\n\n\t\tvar err error\n\t\t// its convenient to be able to return a single error for everything\n\t\tif len(batch.error) == 1 {\n\t\t\terr = batch.error[0]\n\t\t} else if batch.error != nil {\n\t\t\terr = batch.error[pos]\n\t\t}\n\n\t\tif err == nil {\n\t\t\tl.mu.Lock()\n\t\t\tl.unsafeSet(key, data)\n\t\t\tl.mu.Unlock()\n\t\t}\n\n\t\treturn data, err\n\t}\n}\n\n// LoadAll fetches many keys at once. It will be broken into appropriate sized\n// sub batches depending on how the loader is configured\nfunc (l *UUIDsLoader) LoadAll(keys []uuid.UUID) ([][]uuid.UUID, []error) {\n\tresults := make([]func() ([]uuid.UUID, error), len(keys))\n\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\n\tuUIDs := make([][]uuid.UUID, len(keys))\n\terrors := make([]error, len(keys))\n\tfor i, thunk := range results {\n\t\tuUIDs[i], errors[i] = thunk()\n\t}\n\treturn uUIDs, errors\n}\n\n// LoadAllThunk returns a function that when called will block waiting for a UUIDs.\n// This method should be used if you want one goroutine to make requests to many\n// different data loaders without blocking until the thunk is called.\nfunc (l *UUIDsLoader) LoadAllThunk(keys []uuid.UUID) func() ([][]uuid.UUID, []error) {\n\tresults := make([]func() ([]uuid.UUID, error), len(keys))\n\tfor i, key := range keys {\n\t\tresults[i] = l.LoadThunk(key)\n\t}\n\treturn func() ([][]uuid.UUID, []error) {\n\t\tuUIDs := make([][]uuid.UUID, len(keys))\n\t\terrors := make([]error, len(keys))\n\t\tfor i, thunk := range results {\n\t\t\tuUIDs[i], errors[i] = thunk()\n\t\t}\n\t\treturn uUIDs, errors\n\t}\n}\n\n// Prime the cache with the provided key and value. If the key already exists, no change is made\n// and false is returned.\n// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)\nfunc (l *UUIDsLoader) Prime(key uuid.UUID, value []uuid.UUID) bool {\n\tl.mu.Lock()\n\tvar found bool\n\tif _, found = l.cache[key]; !found {\n\t\t// make a copy when writing to the cache, its easy to pass a pointer in from a loop var\n\t\t// and end up with the whole cache pointing to the same value.\n\t\tcpy := make([]uuid.UUID, len(value))\n\t\tcopy(cpy, value)\n\t\tl.unsafeSet(key, cpy)\n\t}\n\tl.mu.Unlock()\n\treturn !found\n}\n\n// Clear the value at key from the cache, if it exists\nfunc (l *UUIDsLoader) Clear(key uuid.UUID) {\n\tl.mu.Lock()\n\tdelete(l.cache, key)\n\tl.mu.Unlock()\n}\n\nfunc (l *UUIDsLoader) unsafeSet(key uuid.UUID, value []uuid.UUID) {\n\tif l.cache == nil {\n\t\tl.cache = map[uuid.UUID][]uuid.UUID{}\n\t}\n\tl.cache[key] = value\n}\n\n// keyIndex will return the location of the key in the batch, if its not found\n// it will add the key to the batch\nfunc (b *uUIDsLoaderBatch) keyIndex(l *UUIDsLoader, key uuid.UUID) int {\n\tfor i, existingKey := range b.keys {\n\t\tif key == existingKey {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tpos := len(b.keys)\n\tb.keys = append(b.keys, key)\n\tif pos == 0 {\n\t\tgo b.startTimer(l)\n\t}\n\n\tif l.maxBatch != 0 && pos >= l.maxBatch-1 {\n\t\tif !b.closing {\n\t\t\tb.closing = true\n\t\t\tl.batch = nil\n\t\t\tgo b.end(l)\n\t\t}\n\t}\n\n\treturn pos\n}\n\nfunc (b *uUIDsLoaderBatch) startTimer(l *UUIDsLoader) {\n\ttime.Sleep(l.wait)\n\tl.mu.Lock()\n\n\t// we must have hit a batch limit and are already finalizing this batch\n\tif b.closing {\n\t\tl.mu.Unlock()\n\t\treturn\n\t}\n\n\tl.batch = nil\n\tl.mu.Unlock()\n\n\tb.end(l)\n}\n\nfunc (b *uUIDsLoaderBatch) end(l *UUIDsLoader) {\n\tb.data, b.error = l.fetch(b.keys)\n\tclose(b.done)\n}\n"
  },
  {
    "path": "internal/email/manager.go",
    "content": "package email\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/wneessen/go-mail\"\n\n\t\"github.com/stashapp/stash-box/internal/config\"\n)\n\ntype Manager struct {\n\tlastEmailed map[string]time.Time\n}\n\nfunc NewManager() *Manager {\n\treturn &Manager{\n\t\tlastEmailed: make(map[string]time.Time),\n\t}\n}\n\nfunc (m *Manager) validateEmailCooldown(email string) error {\n\tm.clearExpired()\n\n\tif _, found := m.lastEmailed[email]; found {\n\t\treturn errors.New(\"pending-email-change\")\n\t}\n\n\treturn nil\n}\n\nfunc (m *Manager) clearExpired() {\n\tcd := config.GetEmailCooldown()\n\texpireTime := time.Now()\n\texpireTime = expireTime.Add(-cd)\n\n\tfor e, t := range m.lastEmailed {\n\t\tif t.Before(expireTime) {\n\t\t\tdelete(m.lastEmailed, e)\n\t\t}\n\t}\n}\n\nfunc (m *Manager) Send(email, subject, text, html string) error {\n\terr := m.validateEmailCooldown(email)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif len(config.GetMissingEmailSettings()) > 0 {\n\t\treturn errors.New(\"email settings not configured\")\n\t}\n\n\tmessage := mail.NewMsg()\n\tif err := message.FromFormat(config.GetTitle(), config.GetEmailFrom()); err != nil {\n\t\treturn fmt.Errorf(\"failed to set From address: %w\", err)\n\t}\n\n\tif err := message.To(email); err != nil {\n\t\treturn fmt.Errorf(\"failed to set To address: %w\", err)\n\t}\n\n\tmessage.Subject(subject)\n\tmessage.SetBodyString(mail.TypeTextPlain, text)\n\tmessage.AddAlternativeString(mail.TypeTextHTML, html)\n\n\tclient, err := mail.NewClient(config.GetEmailHost(), mail.WithPort(config.GetEmailPort()), mail.WithSMTPAuth(mail.SMTPAuthPlain),\n\t\tmail.WithUsername(config.GetEmailUser()), mail.WithPassword(config.GetEmailPassword()))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create mail client: %w\", err)\n\t}\n\n\tif err := client.DialAndSend(message); err != nil {\n\t\treturn fmt.Errorf(\"failed to send mail: %w\", err)\n\t}\n\n\t// add to email map\n\tm.lastEmailed[email] = time.Now()\n\n\treturn nil\n}\n"
  },
  {
    "path": "internal/email/templates/email.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <meta name=\"x-apple-disable-message-reformatting\" />\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n    <meta name=\"color-scheme\" content=\"light dark\" />\n    <meta name=\"supported-color-schemes\" content=\"light dark\" />\n    <title></title>\n    <style type=\"text/css\" rel=\"stylesheet\" media=\"all\">\n    /* Base ------------------------------ */\n    \n    @import url(\"https://fonts.googleapis.com/css?family=Nunito+Sans:400,700&display=swap\");\n    body {\n      width: 100% !important;\n      height: 100%;\n      margin: 0;\n      -webkit-text-size-adjust: none;\n    }\n    \n    a {\n      color: #3869D4;\n    }\n    \n    a img {\n      border: none;\n    }\n    \n    td {\n      word-break: break-word;\n    }\n    \n    .preheader {\n      display: none !important;\n      visibility: hidden;\n      mso-hide: all;\n      font-size: 1px;\n      line-height: 1px;\n      max-height: 0;\n      max-width: 0;\n      opacity: 0;\n      overflow: hidden;\n    }\n    /* Type ------------------------------ */\n    \n    body,\n    td,\n    th {\n      font-family: \"Nunito Sans\", Helvetica, Arial, sans-serif;\n    }\n    \n    h1 {\n      margin-top: 0;\n      color: #333333;\n      font-size: 22px;\n      font-weight: bold;\n      text-align: left;\n    }\n    \n    h2 {\n      margin-top: 0;\n      color: #333333;\n      font-size: 16px;\n      font-weight: bold;\n      text-align: left;\n    }\n    \n    h3 {\n      margin-top: 0;\n      color: #333333;\n      font-size: 14px;\n      font-weight: bold;\n      text-align: left;\n    }\n    \n    td,\n    th {\n      font-size: 16px;\n    }\n    \n    p,\n    ul,\n    ol,\n    blockquote {\n      margin: .4em 0 1.1875em;\n      font-size: 16px;\n      line-height: 1.625;\n    }\n    \n    p.sub {\n      font-size: 13px;\n    }\n    /* Utilities ------------------------------ */\n    \n    .align-right {\n      text-align: right;\n    }\n    \n    .align-left {\n      text-align: left;\n    }\n    \n    .align-center {\n      text-align: center;\n    }\n    \n    .u-margin-bottom-none {\n      margin-bottom: 0;\n    }\n    /* Buttons ------------------------------ */\n    \n    .button {\n      background-color: #3869D4;\n      border-top: 10px solid #3869D4;\n      border-right: 18px solid #3869D4;\n      border-bottom: 10px solid #3869D4;\n      border-left: 18px solid #3869D4;\n      display: inline-block;\n      color: #FFF !important;\n      text-decoration: none;\n      border-radius: 3px;\n      box-shadow: 0 2px 3px rgba(0, 0, 0, 0.16);\n      -webkit-text-size-adjust: none;\n      box-sizing: border-box;\n    }\n    \n    .button--green {\n      background-color: #22BC66;\n      border-top: 10px solid #22BC66;\n      border-right: 18px solid #22BC66;\n      border-bottom: 10px solid #22BC66;\n      border-left: 18px solid #22BC66;\n    }\n    \n    .button--red {\n      background-color: #FF6136;\n      border-top: 10px solid #FF6136;\n      border-right: 18px solid #FF6136;\n      border-bottom: 10px solid #FF6136;\n      border-left: 18px solid #FF6136;\n    }\n    \n    @media only screen and (max-width: 500px) {\n      .button {\n        width: 100% !important;\n        text-align: center !important;\n      }\n    }\n    /* Attribute list ------------------------------ */\n    \n    .attributes {\n      margin: 0 0 21px;\n    }\n    \n    .attributes_content {\n      background-color: #F4F4F7;\n      padding: 16px;\n    }\n    \n    .attributes_item {\n      padding: 0;\n    }\n    /* Related Items ------------------------------ */\n    \n    .related {\n      width: 100%;\n      margin: 0;\n      padding: 25px 0 0 0;\n      -premailer-width: 100%;\n      -premailer-cellpadding: 0;\n      -premailer-cellspacing: 0;\n    }\n    \n    .related_item {\n      padding: 10px 0;\n      color: #CBCCCF;\n      font-size: 15px;\n      line-height: 18px;\n    }\n    \n    .related_item-title {\n      display: block;\n      margin: .5em 0 0;\n    }\n    \n    .related_item-thumb {\n      display: block;\n      padding-bottom: 10px;\n    }\n    \n    .related_heading {\n      border-top: 1px solid #CBCCCF;\n      text-align: center;\n      padding: 25px 0 10px;\n    }\n    /* Discount Code ------------------------------ */\n    \n    .discount {\n      width: 100%;\n      margin: 0;\n      padding: 24px;\n      -premailer-width: 100%;\n      -premailer-cellpadding: 0;\n      -premailer-cellspacing: 0;\n      background-color: #F4F4F7;\n      border: 2px dashed #CBCCCF;\n    }\n    \n    .discount_heading {\n      text-align: center;\n    }\n    \n    .discount_body {\n      text-align: center;\n      font-size: 15px;\n    }\n    /* Social Icons ------------------------------ */\n    \n    .social {\n      width: auto;\n    }\n    \n    .social td {\n      padding: 0;\n      width: auto;\n    }\n    \n    .social_icon {\n      height: 20px;\n      margin: 0 8px 10px 8px;\n      padding: 0;\n    }\n    /* Data table ------------------------------ */\n    \n    .purchase {\n      width: 100%;\n      margin: 0;\n      padding: 35px 0;\n      -premailer-width: 100%;\n      -premailer-cellpadding: 0;\n      -premailer-cellspacing: 0;\n    }\n    \n    .purchase_content {\n      width: 100%;\n      margin: 0;\n      padding: 25px 0 0 0;\n      -premailer-width: 100%;\n      -premailer-cellpadding: 0;\n      -premailer-cellspacing: 0;\n    }\n    \n    .purchase_item {\n      padding: 10px 0;\n      color: #51545E;\n      font-size: 15px;\n      line-height: 18px;\n    }\n    \n    .purchase_heading {\n      padding-bottom: 8px;\n      border-bottom: 1px solid #EAEAEC;\n    }\n    \n    .purchase_heading p {\n      margin: 0;\n      color: #85878E;\n      font-size: 12px;\n    }\n    \n    .purchase_footer {\n      padding-top: 15px;\n      border-top: 1px solid #EAEAEC;\n    }\n    \n    .purchase_total {\n      margin: 0;\n      text-align: right;\n      font-weight: bold;\n      color: #333333;\n    }\n    \n    .purchase_total--label {\n      padding: 0 15px 0 0;\n    }\n    \n    body {\n      background-color: #F2F4F6;\n      color: #51545E;\n    }\n    \n    p {\n      color: #51545E;\n    }\n    \n    .email-wrapper {\n      width: 100%;\n      margin: 0;\n      padding: 0;\n      -premailer-width: 100%;\n      -premailer-cellpadding: 0;\n      -premailer-cellspacing: 0;\n      background-color: #F2F4F6;\n    }\n    \n    .email-content {\n      width: 100%;\n      margin: 0;\n      padding: 0;\n      -premailer-width: 100%;\n      -premailer-cellpadding: 0;\n      -premailer-cellspacing: 0;\n    }\n    /* Masthead ----------------------- */\n    \n    .email-masthead {\n      padding: 25px 0;\n      text-align: center;\n    }\n    \n    .email-masthead_logo {\n      width: 94px;\n    }\n    \n    .email-masthead_name {\n      font-size: 16px;\n      font-weight: bold;\n      color: #A8AAAF !important;\n      text-decoration: none;\n      text-shadow: 0 1px 0 white;\n    }\n    /* Body ------------------------------ */\n    \n    .email-body {\n      width: 100%;\n      margin: 0;\n      padding: 0;\n      -premailer-width: 100%;\n      -premailer-cellpadding: 0;\n      -premailer-cellspacing: 0;\n    }\n    \n    .email-body_inner {\n      width: 570px;\n      margin: 0 auto;\n      padding: 0;\n      -premailer-width: 570px;\n      -premailer-cellpadding: 0;\n      -premailer-cellspacing: 0;\n      background-color: #FFFFFF;\n    }\n    \n    .email-footer {\n      width: 570px;\n      margin: 0 auto;\n      padding: 0;\n      -premailer-width: 570px;\n      -premailer-cellpadding: 0;\n      -premailer-cellspacing: 0;\n      text-align: center;\n    }\n    \n    .email-footer p {\n      color: #A8AAAF;\n    }\n    \n    .body-action {\n      width: 100%;\n      margin: 30px auto;\n      padding: 0;\n      -premailer-width: 100%;\n      -premailer-cellpadding: 0;\n      -premailer-cellspacing: 0;\n      text-align: center;\n    }\n    \n    .body-sub {\n      margin-top: 25px;\n      padding-top: 25px;\n      border-top: 1px solid #EAEAEC;\n    }\n    \n    .content-cell {\n      padding: 45px;\n    }\n    /*Media Queries ------------------------------ */\n    \n    @media only screen and (max-width: 600px) {\n      .email-body_inner,\n      .email-footer {\n        width: 100% !important;\n      }\n    }\n    \n    @media (prefers-color-scheme: dark) {\n      body,\n      .email-body,\n      .email-body_inner,\n      .email-content,\n      .email-wrapper,\n      .email-masthead,\n      .email-footer {\n        background-color: #333333 !important;\n        color: #FFF !important;\n      }\n      p,\n      ul,\n      ol,\n      blockquote,\n      h1,\n      h2,\n      h3,\n      span,\n      .purchase_item {\n        color: #FFF !important;\n      }\n      .attributes_content,\n      .discount {\n        background-color: #222 !important;\n      }\n      .email-masthead_name {\n        text-shadow: none !important;\n      }\n    }\n    \n    :root {\n      color-scheme: light dark;\n      supported-color-schemes: light dark;\n    }\n    </style>\n    <!--[if mso]>\n    <style type=\"text/css\">\n      .f-fallback  {\n        font-family: Arial, sans-serif;\n      }\n    </style>\n  <![endif]-->\n  </head>\n  <body>\n    <span class=\"preheader\">{{ .PreHeader }}</span>\n    <table class=\"email-wrapper\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\n      <tr>\n        <td align=\"center\">\n          <table class=\"email-content\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\n            <tr>\n              <td class=\"email-masthead\">\n            <!--\n                <a href=\"{{ .SiteURL }}\" class=\"f-fallback email-masthead_name\">\n                  {{ .SiteName }}\n              </a>\n            -->\n              </td>\n            </tr>\n            <!-- Email Body -->\n            <tr>\n              <td class=\"email-body\" width=\"570\" cellpadding=\"0\" cellspacing=\"0\">\n                <table class=\"email-body_inner\" align=\"center\" width=\"570\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\n                  <!-- Body content -->\n                  <tr>\n                    <td class=\"content-cell\">\n                      <div class=\"f-fallback\">\n                        <h1>{{ .Greeting }}</h1>\n                        <p>{{ .Content }}</p>\n                        <!-- Action -->\n                        <table class=\"body-action\" align=\"center\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\n                          <tr>\n                            <td align=\"center\">\n                              <!-- Border based button\n           https://litmus.com/blog/a-guide-to-bulletproof-buttons-in-email-design -->\n                              <table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" role=\"presentation\">\n                                <tr>\n                                  <td align=\"center\">\n                                    <a href=\"{{ .ActionURL }}\" class=\"f-fallback button button--green\" target=\"_blank\">{{ .ActionText }}</a>\n                                  </td>\n                                </tr>\n                              </table>\n                            </td>\n                          </tr>\n                        </table>\n                        <!-- Sub copy -->\n                        <table class=\"body-sub\" role=\"presentation\">\n                          <tr>\n                            <td>\n                              <p class=\"f-fallback sub\">If you’re having trouble with the button above, copy and paste the URL below into your web browser.</p>\n                              <p class=\"f-fallback sub\">{{ .ActionURL }}</p>\n                            </td>\n                          </tr>\n                        </table>\n\n                      </div>\n                    </td>\n                  </tr>\n                </table>\n              </td>\n            </tr>\n            <tr>\n              <td>\n                <table class=\"email-footer\" align=\"center\" width=\"570\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\n                  <tr>\n                    <td class=\"content-cell\" align=\"center\">\n                      <p class=\"f-fallback sub align-center\">\n                        This is an automatically generated message. Replies are not monitored or answered.\n                      </p>\n                    </td>\n                  </tr>\n                </table>\n              </td>\n            </tr>\n          </table>\n        </td>\n      </tr>\n    </table>\n  </body>\n</html>\n"
  },
  {
    "path": "internal/email/templates/email.txt",
    "content": "************\n{{ .Greeting }}\n************\n\n{{ .Content }}\n\n{{ .ActionURL }}\n\n- {{ .SiteName }}\n"
  },
  {
    "path": "internal/email/user.go",
    "content": "package email\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"embed\"\n\t\"fmt\"\n\t\"text/template\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n)\n\n//go:embed templates/*.html\n//go:embed templates/*.txt\nvar templateFS embed.FS\n\nfunc ConfirmOldEmail(ctx context.Context, tx *queries.Queries, user models.User, mgr *Manager) error {\n\t// generate an activation key and email\n\tkey, err := generateConfirmOldEmailKey(ctx, tx, user.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn sendConfirmOldEmail(mgr, user, *key)\n}\n\nfunc generateConfirmOldEmailKey(ctx context.Context, tx *queries.Queries, userID uuid.UUID) (*uuid.UUID, error) {\n\tdata := models.UserTokenData{\n\t\tUserID: userID,\n\t}\n\tparam, err := converter.CreateUserTokenParamsFromData(models.UserTokenTypeConfirmOldEmail, data)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttoken, err := tx.CreateUserToken(ctx, param)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &token.ID, nil\n}\n\nfunc ConfirmNewEmail(ctx context.Context, tx *queries.Queries, user models.User, email string, mgr *Manager) error {\n\t// generate an activation key and email\n\tkey, err := generateConfirmNewEmailKey(ctx, tx, user.ID, email)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn sendConfirmNewEmail(mgr, &user, email, *key)\n}\n\nfunc generateConfirmNewEmailKey(ctx context.Context, tx *queries.Queries, userID uuid.UUID, email string) (*uuid.UUID, error) {\n\tdata := models.ChangeEmailTokenData{\n\t\tUserID: userID,\n\t\tEmail:  email,\n\t}\n\tparam, err := converter.CreateUserTokenParamsFromData(models.UserTokenTypeConfirmNewEmail, data)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tobj, err := tx.CreateUserToken(ctx, param)\n\treturn &obj.ID, err\n}\n\nfunc ChangeEmail(ctx context.Context, tx *queries.Queries, token models.ChangeEmailTokenData) error {\n\tuser, err := tx.FindUser(ctx, token.UserID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn tx.UpdateUserEmail(ctx, queries.UpdateUserEmailParams{\n\t\tID:    user.ID,\n\t\tEmail: token.Email,\n\t})\n}\n\nfunc sendTemplatedEmail(mgr *Manager, email, subject, preHeader, greeting, content, link, cta string) error {\n\thtmlTemplates, err := template.ParseFS(templateFS,\n\t\t\"templates/email.html\",\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdata := struct {\n\t\tSiteName   string\n\t\tSiteURL    string\n\t\tContent    string\n\t\tActionURL  string\n\t\tActionText string\n\t\tGreeting   string\n\t\tPreHeader  string\n\t}{\n\t\tSiteURL:    config.GetHostURL(),\n\t\tSiteName:   config.GetTitle(),\n\t\tContent:    content,\n\t\tActionURL:  link,\n\t\tActionText: cta,\n\t\tGreeting:   greeting,\n\t\tPreHeader:  preHeader,\n\t}\n\n\tvar html bytes.Buffer\n\tif err := htmlTemplates.Execute(&html, data); err != nil {\n\t\treturn err\n\t}\n\n\ttextTemplate, err := template.ParseFS(templateFS,\n\t\t\"templates/email.txt\",\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar text bytes.Buffer\n\tif err := textTemplate.Execute(&text, data); err != nil {\n\t\treturn err\n\t}\n\n\treturn mgr.Send(email, subject, text.String(), html.String())\n}\n\nfunc sendConfirmOldEmail(mgr *Manager, user models.User, activationKey uuid.UUID) error {\n\tsubject := \"Email change requested\"\n\tlink := fmt.Sprintf(\"%s/users/%s/change-email?key=%s\", config.GetHostURL(), user.Name, activationKey)\n\tpreHeader := \"Confirm you want to change your email.\"\n\tgreeting := fmt.Sprintf(\"Hi %s,\", user.Name)\n\tcontent := \"An email change was requested for your account. Click the button below to confirm you want to continue. <strong>The link is only valid for 15 minutes.</strong>\"\n\tcta := \"Confirm email change\"\n\n\treturn sendTemplatedEmail(mgr, user.Email, subject, preHeader, greeting, content, link, cta)\n}\n\nfunc SendNewUserEmail(email string, activationKey uuid.UUID, mgr *Manager) error {\n\tsubject := \"Activate your account\"\n\tlink := fmt.Sprintf(\"%s/activate?key=%s\", config.GetHostURL(), activationKey)\n\tpreHeader := fmt.Sprintf(\"Welcome, to activate your %s account, click the button below.\", config.GetTitle())\n\tgreeting := \"Welcome!\"\n\tcontent := fmt.Sprintf(\"To activate your %s account, click the button below. <strong>The activation link is valid for %s.</strong>\", config.GetTitle(), config.GetActivationExpiry())\n\tcta := \"Activate account\"\n\n\treturn sendTemplatedEmail(mgr, email, subject, preHeader, greeting, content, link, cta)\n}\n\nfunc SendResetPasswordEmail(user queries.User, activationKey uuid.UUID, mgr *Manager) error {\n\tsubject := fmt.Sprintf(\"Confirm %s password reset\", config.GetTitle())\n\tlink := fmt.Sprintf(\"%s/reset-password?key=%s\", config.GetHostURL(), activationKey)\n\tpreHeader := fmt.Sprintf(\"A password reset was requested for your %s account. Click the button to continue.\", config.GetTitle())\n\tgreeting := fmt.Sprintf(\"Hi %s,\", user.Name)\n\tcontent := fmt.Sprintf(\"A password reset was requested for your %s account. Click the button below to continue. <strong>The link is only valid for 15 minutes.</strong>\", config.GetTitle())\n\tcta := \"Reset password\"\n\n\treturn sendTemplatedEmail(mgr, user.Email, subject, preHeader, greeting, content, link, cta)\n}\n\nfunc sendConfirmNewEmail(mgr *Manager, user *models.User, email string, activationKey uuid.UUID) error {\n\tsubject := fmt.Sprintf(\"Confirm %s email change\", config.GetTitle())\n\tlink := fmt.Sprintf(\"%s/users/%s/confirm-email?key=%s\", config.GetHostURL(), user.Name, activationKey)\n\tpreHeader := fmt.Sprintf(\"To confirm you want to change your %s account email, click the button to continue.\", config.GetTitle())\n\tgreeting := fmt.Sprintf(\"Hi %s,\", user.Name)\n\tcontent := fmt.Sprintf(\"To confirm you want to change your %s account email, click the button to continue. <strong>The link is only valid for 15 minutes.</strong>\", config.GetTitle())\n\tcta := \"Confirm email change\"\n\n\treturn sendTemplatedEmail(mgr, email, subject, preHeader, greeting, content, link, cta)\n}\n"
  },
  {
    "path": "internal/image/cache/cache.go",
    "content": "package cache\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/pkg/logger\"\n)\n\n// CacheManager handles caching of resized images\ntype cacheManager struct {\n\tpath string\n}\n\nvar (\n\tinstance *cacheManager\n\tonce     sync.Once\n)\n\nfunc GetCacheManager() *cacheManager {\n\tonce.Do(func() {\n\t\tresizeConfig := config.GetImageResizeConfig()\n\t\tif resizeConfig == nil || !resizeConfig.Enabled || len(resizeConfig.CachePath) == 0 {\n\t\t\tlogger.Debugf(\"image cache not enabled\")\n\t\t\treturn\n\t\t}\n\n\t\tif err := os.MkdirAll(resizeConfig.CachePath, 0755); err != nil {\n\t\t\tlogger.Errorf(\"Failed to initialize cache directory: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tlogger.Debugf(\"image cache enabled in: %s\", resizeConfig.CachePath)\n\n\t\tinstance = &cacheManager{}\n\t\tinstance.path = resizeConfig.CachePath\n\t})\n\treturn instance\n}\n\nfunc (c *cacheManager) getItemPath(id uuid.UUID, size int) string {\n\tfilename := fmt.Sprintf(\"%s_%d\", id.String(), size)\n\treturn filepath.Join(c.path, filename)\n}\n\nfunc (c *cacheManager) Read(id uuid.UUID, size int) (io.ReadCloser, error) {\n\tfilePath := c.getItemPath(id, size)\n\treturn os.Open(filePath)\n}\n\nfunc (c *cacheManager) Write(id uuid.UUID, size int, data []byte) error {\n\tfilePath := c.getItemPath(id, size)\n\treturn os.WriteFile(filePath, data, 0644)\n}\n\nfunc (c *cacheManager) Delete(id uuid.UUID) error {\n\tglobPath := filepath.Join(c.path, fmt.Sprintf(\"%s_*\", id.String()))\n\tfiles, err := filepath.Glob(globPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, f := range files {\n\t\tif err := os.Remove(f); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tlogger.Debugf(\"deleted cached image: %s\", f)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "internal/image/resize_unix.go",
    "content": "//go:build unix\n\npackage image\n\nimport (\n\t\"io\"\n\n\t\"github.com/davidbyttow/govips/v2/vips\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc Resize(reader io.Reader, maxSize int, dbimage *models.Image, fileSize int64) ([]byte, error) {\n\tdefer vips.ShutdownThread()\n\n\tbuffer := make([]byte, fileSize)\n\tif _, err := io.ReadFull(reader, buffer); err != nil {\n\t\treturn nil, err\n\t}\n\n\timage, err := vips.NewThumbnailFromBuffer(buffer, maxSize, maxSize, vips.InterestingNone)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tformat := image.Format()\n\n\tif format == vips.ImageTypePNG {\n\t\tep := vips.NewWebpExportParams()\n\t\tep.StripMetadata = true\n\t\tep.Lossless = true\n\n\t\timageBytes, _, err := image.ExportWebp(ep)\n\t\treturn imageBytes, err\n\t}\n\n\tep := vips.NewJpegExportParams()\n\tep.StripMetadata = true\n\tep.Quality = config.GetImageJpegQuality()\n\tep.Interlace = true\n\tep.OptimizeCoding = true\n\tep.SubsampleMode = vips.VipsForeignSubsampleAuto\n\n\timageBytes, _, err := image.ExportJpeg(ep)\n\treturn imageBytes, err\n}\n\nfunc InitResizer() error {\n\tvips.LoggingSettings(nil, vips.LogLevelWarning)\n\treturn vips.Startup(&vips.Config{MaxCacheSize: 0, MaxCacheMem: 0})\n}\n"
  },
  {
    "path": "internal/image/resize_windows.go",
    "content": "//go:build windows || darwin\n\npackage image\n\nimport (\n\t\"bytes\"\n\t\"image\"\n\t\"image/jpeg\"\n\t\"image/png\"\n\t\"io\"\n\n\t\"github.com/disintegration/imaging\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc Resize(reader io.Reader, max int, dbimage *models.Image, fileSize int64) ([]byte, error) {\n\treturn resizeImage(reader, int64(max))\n}\n\nfunc InitResizer() error { return nil }\n\nfunc resizeImage(srcReader io.Reader, maxDimension int64) ([]byte, error) {\n\tvar resizedImage image.Image\n\tsrcImage, format, err := image.Decode(srcReader)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// if height is longer then resize by height instead of width\n\tif dim := srcImage.Bounds().Max; dim.Y > dim.X {\n\t\tresizedImage = imaging.Resize(srcImage, 0, int(maxDimension), imaging.MitchellNetravali)\n\t} else {\n\t\tresizedImage = imaging.Resize(srcImage, int(maxDimension), 0, imaging.MitchellNetravali)\n\t}\n\n\tbuf := new(bytes.Buffer)\n\n\tif format == \"png\" {\n\t\terr = png.Encode(buf, resizedImage)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t} else {\n\t\toptions := jpeg.Options{\n\t\t\tQuality: config.GetImageJpegQuality(),\n\t\t}\n\t\terr = jpeg.Encode(buf, resizedImage, &options)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn buf.Bytes(), nil\n}\n"
  },
  {
    "path": "internal/image/sort.go",
    "content": "package image\n\nimport (\n\t\"sort\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nfunc OrderLandscape(p []models.Image) {\n\tsort.Slice(p, func(a, b int) bool {\n\t\tif p[a].Height == 0 || p[b].Height == 0 {\n\t\t\treturn false\n\t\t}\n\t\taspectA := p[a].Width / p[a].Height\n\t\taspectB := p[b].Width / p[b].Height\n\t\tif aspectA > aspectB {\n\t\t\treturn true\n\t\t} else if aspectA < aspectB {\n\t\t\treturn false\n\t\t}\n\t\treturn p[a].Width > p[b].Width\n\t})\n}\n\nfunc OrderPortrait(p []models.Image) {\n\tsort.Slice(p, func(a, b int) bool {\n\t\tif p[a].Width == 0 || p[b].Width == 0 {\n\t\t\treturn false\n\t\t}\n\t\taspectA := p[a].Height / p[a].Width\n\t\taspectB := p[b].Height / p[b].Width\n\t\tif aspectA > aspectB {\n\t\t\treturn true\n\t\t} else if aspectA < aspectB {\n\t\t\treturn false\n\t\t}\n\t\treturn p[a].Height > p[b].Height\n\t})\n}\n"
  },
  {
    "path": "internal/models/assign/assign.go",
    "content": "package assign\n\nimport (\n\t\"reflect\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\ntype StringEnum interface {\n\tIsValid() bool\n\tString() string\n}\n\n// String assigns string value from input if not nil\nfunc String(out *string, in *string) {\n\tif in != nil {\n\t\t*out = *in\n\t}\n}\n\n// StringPtr assigns string pointer value with three-way logic: input, old, or keep existing\nfunc StringPtr(out **string, in *string, old *string) {\n\tif in != nil {\n\t\t*out = in\n\t} else if old != nil {\n\t\t*out = nil\n\t}\n}\n\n// IntPtr assigns int pointer value from int input with three-way logic\nfunc IntPtr(out **int, in *int, old *int) {\n\tif in != nil {\n\t\tval := int(*in)\n\t\t*out = &val\n\t} else if old != nil {\n\t\t*out = nil\n\t}\n}\n\n// NullUUID assigns uuid.NullUUID value with three-way logic\nfunc NullUUID(out *uuid.NullUUID, in *uuid.UUID, old *uuid.UUID) {\n\tif in != nil {\n\t\tout.UUID = *in\n\t\tout.Valid = true\n\t} else if old != nil {\n\t\t*out = uuid.NullUUID{}\n\t}\n}\n\n// EnumPtr assigns enum pointer value with three-way logic using generics\nfunc EnumPtr[T StringEnum](out **T, in *string, old *string) {\n\tif in != nil {\n\t\t// Use reflection to create an enum from string\n\t\tvar zero T\n\t\tenumType := reflect.TypeOf(zero)\n\t\tenumVal := reflect.New(enumType).Elem()\n\t\tenumVal.SetString(*in)\n\t\tenum := enumVal.Interface().(T)\n\t\t*out = &enum\n\t} else if old != nil {\n\t\t*out = nil\n\t}\n}\n"
  },
  {
    "path": "internal/models/extension_criterion_input.go",
    "content": "package models\n\ntype MultiCriterionInput interface {\n\tCount() int\n\tGetValues() []interface{}\n\tGetModifier() CriterionModifier\n}\n\nfunc (i MultiIDCriterionInput) Count() int {\n\treturn len(i.Value)\n}\n\nfunc (i MultiIDCriterionInput) GetValues() []interface{} {\n\targs := make([]interface{}, len(i.Value))\n\tfor index := range i.Value {\n\t\targs[index] = i.Value[index]\n\t}\n\treturn args\n}\n\nfunc (i MultiIDCriterionInput) GetModifier() CriterionModifier {\n\treturn i.Modifier\n}\n\nfunc (i MultiStringCriterionInput) Count() int {\n\treturn len(i.Value)\n}\n\nfunc (i MultiStringCriterionInput) GetModifier() CriterionModifier {\n\treturn i.Modifier\n}\n\nfunc (i MultiStringCriterionInput) GetValues() []interface{} {\n\targs := make([]interface{}, len(i.Value))\n\tfor index := range i.Value {\n\t\targs[index] = i.Value[index]\n\t}\n\treturn args\n}\n"
  },
  {
    "path": "internal/models/extension_edit_details.go",
    "content": "package models\n\nimport (\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\nfunc (e TagEditDetailsInput) TagEditFromDiff(orig Tag, inputArgs utils.ArgumentsQuery) TagEditData {\n\tnewData := &TagEdit{}\n\toldData := &TagEdit{}\n\n\ted := editDiff{}\n\n\tif e.Name != nil || inputArgs.Field(\"name\").IsNull() {\n\t\toldData.Name, newData.Name = ed.string(&orig.Name, e.Name)\n\t}\n\tif e.Description != nil || inputArgs.Field(\"description\").IsNull() {\n\t\toldData.Description, newData.Description = ed.string(orig.Description, e.Description)\n\t}\n\tif e.CategoryID != nil || inputArgs.Field(\"category_id\").IsNull() {\n\t\toldData.CategoryID, newData.CategoryID = ed.nullUUID(orig.CategoryID, e.CategoryID)\n\t}\n\n\treturn TagEditData{\n\t\tNew: newData,\n\t\tOld: oldData,\n\t}\n}\n\nfunc (e TagEditDetailsInput) TagEditFromMerge(orig Tag, sources []uuid.UUID, inputArgs utils.ArgumentsQuery) TagEditData {\n\tdata := e.TagEditFromDiff(orig, inputArgs)\n\tdata.MergeSources = sources\n\n\treturn data\n}\n\nfunc (e TagEditDetailsInput) TagEditFromCreate(inputArgs utils.ArgumentsQuery) TagEditData {\n\tret := e.TagEditFromDiff(Tag{}, inputArgs)\n\n\treturn TagEditData{\n\t\tNew: ret.New,\n\t}\n}\n\nfunc (e PerformerEditDetailsInput) PerformerEditFromDiff(orig Performer, inputArgs utils.ArgumentsQuery) (*PerformerEditData, error) {\n\tif err := ValidateFuzzyString(e.Birthdate); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err := ValidateFuzzyString(e.Deathdate); err != nil {\n\t\treturn nil, err\n\t}\n\n\tnewData := &PerformerEdit{}\n\toldData := &PerformerEdit{}\n\n\ted := editDiff{}\n\tif e.Name != nil || inputArgs.Field(\"name\").IsNull() {\n\t\toldData.Name, newData.Name = ed.string(&orig.Name, e.Name)\n\t}\n\tif e.Disambiguation != nil || inputArgs.Field(\"disambiguation\").IsNull() {\n\t\toldData.Disambiguation, newData.Disambiguation = ed.string(orig.Disambiguation, e.Disambiguation)\n\t}\n\tif e.Gender != nil || inputArgs.Field(\"gender\").IsNull() {\n\t\toldData.Gender, newData.Gender = ed.enum(orig.Gender, e.Gender)\n\t}\n\tif e.Birthdate != nil || inputArgs.Field(\"birthdate\").IsNull() {\n\t\toldData.Birthdate, newData.Birthdate = ed.string(orig.BirthDate, e.Birthdate)\n\t}\n\tif e.Deathdate != nil || inputArgs.Field(\"deathdate\").IsNull() {\n\t\toldData.Deathdate, newData.Deathdate = ed.string(orig.DeathDate, e.Deathdate)\n\t}\n\tif e.Ethnicity != nil || inputArgs.Field(\"ethnicity\").IsNull() {\n\t\toldData.Ethnicity, newData.Ethnicity = ed.enum(orig.Ethnicity, e.Ethnicity)\n\t}\n\tif e.Country != nil || inputArgs.Field(\"country\").IsNull() {\n\t\toldData.Country, newData.Country = ed.string(orig.Country, e.Country)\n\t}\n\tif e.EyeColor != nil || inputArgs.Field(\"eye_color\").IsNull() {\n\t\toldData.EyeColor, newData.EyeColor = ed.enum(orig.EyeColor, e.EyeColor)\n\t}\n\tif e.HairColor != nil || inputArgs.Field(\"hair_color\").IsNull() {\n\t\toldData.HairColor, newData.HairColor = ed.enum(orig.HairColor, e.HairColor)\n\t}\n\tif e.Height != nil || inputArgs.Field(\"height\").IsNull() {\n\t\toldData.Height, newData.Height = ed.int(orig.Height, e.Height)\n\t}\n\n\tif e.CupSize != nil || inputArgs.Field(\"cup_size\").IsNull() {\n\t\toldData.CupSize, newData.CupSize = ed.string(orig.CupSize, e.CupSize)\n\t}\n\tif e.BandSize != nil || inputArgs.Field(\"band_size\").IsNull() {\n\t\toldData.BandSize, newData.BandSize = ed.int(orig.BandSize, e.BandSize)\n\t}\n\tif e.WaistSize != nil || inputArgs.Field(\"waist_size\").IsNull() {\n\t\toldData.WaistSize, newData.WaistSize = ed.int(orig.WaistSize, e.WaistSize)\n\t}\n\tif e.HipSize != nil || inputArgs.Field(\"hip_size\").IsNull() {\n\t\toldData.HipSize, newData.HipSize = ed.int(orig.HipSize, e.HipSize)\n\t}\n\n\tif e.BreastType != nil || inputArgs.Field(\"breast_type\").IsNull() {\n\t\toldData.BreastType, newData.BreastType = ed.enum(orig.BreastType, e.BreastType)\n\t}\n\tif e.CareerStartYear != nil || inputArgs.Field(\"career_start_year\").IsNull() {\n\t\toldData.CareerStartYear, newData.CareerStartYear = ed.int(orig.CareerStartYear, e.CareerStartYear)\n\t}\n\tif e.CareerEndYear != nil || inputArgs.Field(\"career_end_year\").IsNull() {\n\t\toldData.CareerEndYear, newData.CareerEndYear = ed.int(orig.CareerEndYear, e.CareerEndYear)\n\t}\n\n\treturn &PerformerEditData{\n\t\tNew: newData,\n\t\tOld: oldData,\n\t}, nil\n}\n\nfunc (e PerformerEditDetailsInput) PerformerEditFromMerge(orig Performer, sources []uuid.UUID, inputArgs utils.ArgumentsQuery) (*PerformerEditData, error) {\n\tdata, err := e.PerformerEditFromDiff(orig, inputArgs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdata.MergeSources = sources\n\n\treturn data, nil\n}\n\nfunc (e PerformerEditDetailsInput) PerformerEditFromCreate(inputArgs utils.ArgumentsQuery) (*PerformerEditData, error) {\n\tret, err := e.PerformerEditFromDiff(Performer{}, inputArgs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &PerformerEditData{\n\t\tNew: ret.New,\n\t}, nil\n}\n\nfunc (e StudioEditDetailsInput) StudioEditFromDiff(orig Studio, inputArgs utils.ArgumentsQuery) (*StudioEditData, error) {\n\tnewData := &StudioEdit{}\n\toldData := &StudioEdit{}\n\n\ted := editDiff{}\n\tif e.Name != nil || inputArgs.Field(\"name\").IsNull() {\n\t\toldData.Name, newData.Name = ed.string(&orig.Name, e.Name)\n\t}\n\n\tif e.ParentID != nil || inputArgs.Field(\"parent_id\").IsNull() {\n\t\toldData.ParentID, newData.ParentID = ed.nullUUID(orig.ParentStudioID, e.ParentID)\n\t}\n\n\treturn &StudioEditData{\n\t\tNew: newData,\n\t\tOld: oldData,\n\t}, nil\n}\n\nfunc (e StudioEditDetailsInput) StudioEditFromMerge(orig Studio, sources []uuid.UUID, inputArgs utils.ArgumentsQuery) (*StudioEditData, error) {\n\tdata, err := e.StudioEditFromDiff(orig, inputArgs)\n\tdata.MergeSources = sources\n\n\treturn data, err\n}\n\nfunc (e StudioEditDetailsInput) StudioEditFromCreate() StudioEditData {\n\tnewData := &StudioEdit{}\n\n\ted := editDiff{}\n\t_, newData.Name = ed.string(nil, e.Name)\n\t_, newData.ParentID = ed.nullUUID(uuid.NullUUID{}, e.ParentID)\n\n\treturn StudioEditData{\n\t\tNew: newData,\n\t}\n}\n\nfunc (e SceneEditDetailsInput) SceneEditFromDiff(orig Scene, inputArgs utils.ArgumentsQuery) (*SceneEditData, error) {\n\tif err := ValidateFuzzyString(e.Date); err != nil {\n\t\treturn nil, err\n\t}\n\n\tnewData := &SceneEdit{}\n\toldData := &SceneEdit{}\n\n\ted := editDiff{}\n\tif e.Title != nil || inputArgs.Field(\"title\").IsNull() {\n\t\toldData.Title, newData.Title = ed.string(orig.Title, e.Title)\n\t}\n\tif e.Details != nil || inputArgs.Field(\"details\").IsNull() {\n\t\toldData.Details, newData.Details = ed.string(orig.Details, e.Details)\n\t}\n\tif e.Date != nil || inputArgs.Field(\"date\").IsNull() {\n\t\toldData.Date, newData.Date = ed.string(orig.Date, e.Date)\n\t}\n\tif e.ProductionDate != nil || inputArgs.Field(\"production_date\").IsNull() {\n\t\toldData.ProductionDate, newData.ProductionDate = ed.string(orig.ProductionDate, e.ProductionDate)\n\t}\n\tif e.StudioID != nil || inputArgs.Field(\"studio_id\").IsNull() {\n\t\toldData.StudioID, newData.StudioID = ed.nullUUID(orig.StudioID, e.StudioID)\n\t}\n\tif e.Duration != nil || inputArgs.Field(\"duration\").IsNull() {\n\t\toldData.Duration, newData.Duration = ed.int(orig.Duration, e.Duration)\n\t}\n\tif e.Director != nil || inputArgs.Field(\"director\").IsNull() {\n\t\toldData.Director, newData.Director = ed.string(orig.Director, e.Director)\n\t}\n\tif e.Code != nil || inputArgs.Field(\"code\").IsNull() {\n\t\toldData.Code, newData.Code = ed.string(orig.Code, e.Code)\n\t}\n\n\treturn &SceneEditData{\n\t\tNew: newData,\n\t\tOld: oldData,\n\t}, nil\n}\n\nfunc (e SceneEditDetailsInput) SceneEditFromMerge(orig Scene, sources []uuid.UUID, inputArgs utils.ArgumentsQuery) (*SceneEditData, error) {\n\tdata, err := e.SceneEditFromDiff(orig, inputArgs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdata.MergeSources = sources\n\n\treturn data, nil\n}\n\nfunc (e SceneEditDetailsInput) SceneEditFromCreate(inputArgs utils.ArgumentsQuery) (*SceneEditData, error) {\n\tret, err := e.SceneEditFromDiff(Scene{}, inputArgs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &SceneEditData{\n\t\tNew: ret.New,\n\t}, nil\n}\n"
  },
  {
    "path": "internal/models/extension_edit_details_test.go",
    "content": "package models\n\nimport (\n\t\"testing\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\nvar (\n\taName        = \"aName\"\n\tbName        = \"bName\"\n\taDescription = \"aDescription\"\n\tbDescription = \"bDescription\"\n\taCategoryID  = uuid.FromStringOrNil(\"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa\")\n\tbCategoryID  = uuid.FromStringOrNil(\"bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb\")\n\n\taDisambiguation = \"aDisambiguation\"\n\tbDisambiguation = \"bDisambiguation\"\n\taGender         = GenderEnumMale\n\tbGender         = GenderEnumFemale\n\taGenderStr      = aGender.String()\n\tbGenderStr      = bGender.String()\n\taDate           = \"2001-01-01\"\n\tbDate           = \"2002-01\"\n\tdDate           = \"2024-11\"\n\taEthnicity      = EthnicityEnumAsian\n\tbEthnicity      = EthnicityEnumBlack\n\taEthnicityStr   = aEthnicity.String()\n\tbEthnicityStr   = bEthnicity.String()\n\taCountry        = \"aCountry\"\n\tbCountry        = \"bCountry\"\n\taEyeColor       = EyeColorEnumBlue\n\tbEyeColor       = EyeColorEnumBrown\n\taEyeColorStr    = aEyeColor.String()\n\tbEyeColorStr    = bEyeColor.String()\n\taHairColor      = HairColorEnumAuburn\n\tbHairColor      = HairColorEnumBlack\n\taHairColorStr   = aHairColor.String()\n\tbHairColorStr   = bHairColor.String()\n\taHeight         = 100\n\tbHeight         = 200\n\taHeight64       = aHeight\n\tbHeight64       = bHeight\n\taCupSize        = \"aCupSize\"\n\tbCupSize        = \"bCupSize\"\n\taBandSize       = 30\n\tbBandSize       = 40\n\taWaistSize      = 50\n\tbWaistSize      = 60\n\taHipSize        = 70\n\tbHipSize        = 80\n\taBandSize64     = aBandSize\n\tbBandSize64     = bBandSize\n\taWaistSize64    = aWaistSize\n\tbWaistSize64    = bWaistSize\n\taHipSize64      = aHipSize\n\tbHipSize64      = bHipSize\n\taBreastType     = BreastTypeEnumFake\n\tbBreastType     = BreastTypeEnumNatural\n\taBreastTypeStr  = aBreastType.String()\n\tbBreastTypeStr  = bBreastType.String()\n\taStartYear      = 2001\n\taEndYear        = 2002\n\tbStartYear      = 2003\n\tbEndYear        = 2004\n\taStartYear64    = aStartYear\n\taEndYear64      = aEndYear\n\tbStartYear64    = bStartYear\n\tbEndYear64      = bEndYear\n)\n\nvar mockedArguments = utils.ArgumentsQuery{}\n\nfunc TestTagEditFromDiff(t *testing.T) {\n\torig := Tag{\n\t\tName:        aName,\n\t\tDescription: &aDescription,\n\t\tCategoryID:  uuid.NullUUID{UUID: aCategoryID, Valid: true},\n\t}\n\tinput := TagEditDetailsInput{\n\t\tName:        &bName,\n\t\tDescription: &bDescription,\n\t\tCategoryID:  &bCategoryID,\n\t}\n\n\tout := input.TagEditFromDiff(orig, mockedArguments)\n\n\tassert.Equal(t, TagEditData{\n\t\tNew: &TagEdit{\n\t\t\tName:        &bName,\n\t\t\tDescription: &bDescription,\n\t\t\tCategoryID:  &bCategoryID,\n\t\t},\n\t\tOld: &TagEdit{\n\t\t\tName:        &aName,\n\t\t\tDescription: &aDescription,\n\t\t\tCategoryID:  &aCategoryID,\n\t\t},\n\t}, out)\n\n\temptyOrig := Tag{\n\t\tName: aName,\n\t}\n\n\tout = input.TagEditFromDiff(emptyOrig, mockedArguments)\n\tassert.Equal(t, TagEditData{\n\t\tNew: &TagEdit{\n\t\t\tName:        &bName,\n\t\t\tDescription: &bDescription,\n\t\t\tCategoryID:  &bCategoryID,\n\t\t},\n\t\tOld: &TagEdit{\n\t\t\tName: &aName,\n\t\t},\n\t}, out)\n\n\temptyInput := TagEditDetailsInput{}\n\n\tout = emptyInput.TagEditFromDiff(orig, mockedArguments)\n\tassert.Equal(t, TagEditData{\n\t\tNew: &TagEdit{},\n\t\tOld: &TagEdit{},\n\t}, out)\n\n\tequalInput := TagEditDetailsInput{\n\t\tName:        &aName,\n\t\tDescription: &aDescription,\n\t\tCategoryID:  &aCategoryID,\n\t}\n\n\tout = equalInput.TagEditFromDiff(orig, mockedArguments)\n\tassert.Equal(t, TagEditData{\n\t\tNew: &TagEdit{},\n\t\tOld: &TagEdit{},\n\t}, out)\n}\n\nfunc TestPerformerEditFromDiff(t *testing.T) {\n\torig := Performer{\n\t\tName:            aName,\n\t\tDisambiguation:  &aDisambiguation,\n\t\tGender:          &aGender,\n\t\tBirthDate:       &aDate,\n\t\tEthnicity:       &aEthnicity,\n\t\tCountry:         &aCountry,\n\t\tEyeColor:        &aEyeColor,\n\t\tHairColor:       &aHairColor,\n\t\tHeight:          &aHeight,\n\t\tCupSize:         &aCupSize,\n\t\tBandSize:        &aBandSize,\n\t\tWaistSize:       &aWaistSize,\n\t\tHipSize:         &aHipSize,\n\t\tBreastType:      &aBreastType,\n\t\tCareerStartYear: &aStartYear,\n\t\tCareerEndYear:   &aEndYear,\n\t}\n\tinput := PerformerEditDetailsInput{\n\t\tName:            &bName,\n\t\tDisambiguation:  &bDisambiguation,\n\t\tGender:          &bGender,\n\t\tBirthdate:       &bDate,\n\t\tDeathdate:       &dDate,\n\t\tEthnicity:       &bEthnicity,\n\t\tCountry:         &bCountry,\n\t\tEyeColor:        &bEyeColor,\n\t\tHairColor:       &bHairColor,\n\t\tHeight:          &bHeight,\n\t\tCupSize:         &bCupSize,\n\t\tBandSize:        &bBandSize,\n\t\tWaistSize:       &bWaistSize,\n\t\tHipSize:         &bHipSize,\n\t\tBreastType:      &bBreastType,\n\t\tCareerStartYear: &bStartYear,\n\t\tCareerEndYear:   &bEndYear,\n\t}\n\n\tout, _ := input.PerformerEditFromDiff(orig, mockedArguments)\n\n\tassert.Equal(t, PerformerEditData{\n\t\tNew: &PerformerEdit{\n\t\t\tName:            &bName,\n\t\t\tDisambiguation:  &bDisambiguation,\n\t\t\tGender:          &bGenderStr,\n\t\t\tBirthdate:       &bDate,\n\t\t\tDeathdate:       &dDate,\n\t\t\tEthnicity:       &bEthnicityStr,\n\t\t\tCountry:         &bCountry,\n\t\t\tEyeColor:        &bEyeColorStr,\n\t\t\tHairColor:       &bHairColorStr,\n\t\t\tHeight:          &bHeight64,\n\t\t\tCupSize:         &bCupSize,\n\t\t\tBandSize:        &bBandSize64,\n\t\t\tWaistSize:       &bWaistSize64,\n\t\t\tHipSize:         &bHipSize64,\n\t\t\tBreastType:      &bBreastTypeStr,\n\t\t\tCareerStartYear: &bStartYear64,\n\t\t\tCareerEndYear:   &bEndYear64,\n\t\t},\n\t\tOld: &PerformerEdit{\n\t\t\tName:            &aName,\n\t\t\tDisambiguation:  &aDisambiguation,\n\t\t\tGender:          &aGenderStr,\n\t\t\tBirthdate:       &aDate,\n\t\t\tEthnicity:       &aEthnicityStr,\n\t\t\tCountry:         &aCountry,\n\t\t\tEyeColor:        &aEyeColorStr,\n\t\t\tHairColor:       &aHairColorStr,\n\t\t\tHeight:          &aHeight64,\n\t\t\tCupSize:         &aCupSize,\n\t\t\tBandSize:        &aBandSize64,\n\t\t\tWaistSize:       &aWaistSize64,\n\t\t\tHipSize:         &aHipSize64,\n\t\t\tBreastType:      &aBreastTypeStr,\n\t\t\tCareerStartYear: &aStartYear64,\n\t\t\tCareerEndYear:   &aEndYear64,\n\t\t},\n\t}, *out)\n\n\temptyOrig := Performer{\n\t\tName: aName,\n\t}\n\n\tout, _ = input.PerformerEditFromDiff(emptyOrig, mockedArguments)\n\tassert.Equal(t, PerformerEditData{\n\t\tNew: &PerformerEdit{\n\t\t\tName:            &bName,\n\t\t\tDisambiguation:  &bDisambiguation,\n\t\t\tGender:          &bGenderStr,\n\t\t\tBirthdate:       &bDate,\n\t\t\tDeathdate:       &dDate,\n\t\t\tEthnicity:       &bEthnicityStr,\n\t\t\tCountry:         &bCountry,\n\t\t\tEyeColor:        &bEyeColorStr,\n\t\t\tHairColor:       &bHairColorStr,\n\t\t\tHeight:          &bHeight64,\n\t\t\tCupSize:         &bCupSize,\n\t\t\tBandSize:        &bBandSize64,\n\t\t\tWaistSize:       &bWaistSize64,\n\t\t\tHipSize:         &bHipSize64,\n\t\t\tBreastType:      &bBreastTypeStr,\n\t\t\tCareerStartYear: &bStartYear64,\n\t\t\tCareerEndYear:   &bEndYear64,\n\t\t},\n\t\tOld: &PerformerEdit{\n\t\t\tName: &aName,\n\t\t},\n\t}, *out)\n\n\temptyInput := PerformerEditDetailsInput{}\n\n\tout, _ = emptyInput.PerformerEditFromDiff(orig, mockedArguments)\n\tassert.Equal(t, PerformerEditData{\n\t\tNew: &PerformerEdit{},\n\t\tOld: &PerformerEdit{},\n\t}, *out)\n\n\tequalInput := PerformerEditDetailsInput{\n\t\tName:            &aName,\n\t\tDisambiguation:  &aDisambiguation,\n\t\tGender:          &aGender,\n\t\tBirthdate:       &aDate,\n\t\tEthnicity:       &aEthnicity,\n\t\tCountry:         &aCountry,\n\t\tEyeColor:        &aEyeColor,\n\t\tHairColor:       &aHairColor,\n\t\tHeight:          &aHeight,\n\t\tCupSize:         &aCupSize,\n\t\tBandSize:        &aBandSize,\n\t\tWaistSize:       &aWaistSize,\n\t\tHipSize:         &aHipSize,\n\t\tBreastType:      &aBreastType,\n\t\tCareerStartYear: &aStartYear,\n\t\tCareerEndYear:   &aEndYear,\n\t}\n\n\tout, _ = equalInput.PerformerEditFromDiff(orig, mockedArguments)\n\tassert.Equal(t, PerformerEditData{\n\t\tNew: &PerformerEdit{},\n\t\tOld: &PerformerEdit{},\n\t}, *out)\n}\n"
  },
  {
    "path": "internal/models/extension_role_enum.go",
    "content": "package models\n\nfunc (r RoleEnum) Implies(other RoleEnum) bool {\n\t// admin has all roles\n\tif r == RoleEnumAdmin {\n\t\treturn true\n\t}\n\n\t// MANAGE_INVITES implies INVITE\n\tif r == RoleEnumManageInvites && other == RoleEnumInvite {\n\t\treturn true\n\t}\n\n\t// until we add a NONE value, all values imply read\n\tif r.IsValid() && other == RoleEnumRead {\n\t\treturn true\n\t}\n\n\t// all others only imply themselves\n\treturn r == other\n}\n"
  },
  {
    "path": "internal/models/generate.go",
    "content": "//go:generate go run github.com/99designs/gqlgen\npackage models\n"
  },
  {
    "path": "internal/models/generated_exec.go",
    "content": "// Code generated by github.com/99designs/gqlgen, DO NOT EDIT.\n\npackage models\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/99designs/gqlgen/graphql\"\n\t\"github.com/99designs/gqlgen/graphql/introspection\"\n\t\"github.com/gofrs/uuid\"\n\tgqlparser \"github.com/vektah/gqlparser/v2\"\n\t\"github.com/vektah/gqlparser/v2/ast\"\n)\n\n// region    ************************** generated!.gotpl **************************\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{SchemaData: cfg.Schema, Resolvers: cfg.Resolvers, Directives: cfg.Directives, ComplexityRoot: cfg.Complexity}\n}\n\ntype Config = graphql.Config[ResolverRoot, DirectiveRoot, ComplexityRoot]\n\ntype ResolverRoot interface {\n\tDraft() DraftResolver\n\tEdit() EditResolver\n\tEditComment() EditCommentResolver\n\tEditVote() EditVoteResolver\n\tImage() ImageResolver\n\tModAudit() ModAuditResolver\n\tMutation() MutationResolver\n\tNotification() NotificationResolver\n\tPerformer() PerformerResolver\n\tPerformerDraft() PerformerDraftResolver\n\tPerformerEdit() PerformerEditResolver\n\tQuery() QueryResolver\n\tQueryEditsResultType() QueryEditsResultTypeResolver\n\tQueryExistingPerformerResult() QueryExistingPerformerResultResolver\n\tQueryExistingSceneResult() QueryExistingSceneResultResolver\n\tQueryModAuditsResultType() QueryModAuditsResultTypeResolver\n\tQueryNotificationsResult() QueryNotificationsResultResolver\n\tQueryPerformersResultType() QueryPerformersResultTypeResolver\n\tQueryScenesResultType() QueryScenesResultTypeResolver\n\tScene() SceneResolver\n\tSceneDraft() SceneDraftResolver\n\tSceneEdit() SceneEditResolver\n\tSite() SiteResolver\n\tStudio() StudioResolver\n\tStudioEdit() StudioEditResolver\n\tTag() TagResolver\n\tTagCategory() TagCategoryResolver\n\tTagEdit() TagEditResolver\n\tURL() URLResolver\n\tUser() UserResolver\n}\n\ntype DirectiveRoot struct {\n\tHasRole     func(ctx context.Context, obj any, next graphql.Resolver, role RoleEnum) (res any, err error)\n\tIsUserOwner func(ctx context.Context, obj any, next graphql.Resolver) (res any, err error)\n}\n\ntype ComplexityRoot struct {\n\tBodyModification struct {\n\t\tDescription func(childComplexity int) int\n\t\tLocation    func(childComplexity int) int\n\t}\n\n\tCommentCommentedEdit struct {\n\t\tComment func(childComplexity int) int\n\t}\n\n\tCommentOwnEdit struct {\n\t\tComment func(childComplexity int) int\n\t}\n\n\tCommentVotedEdit struct {\n\t\tComment func(childComplexity int) int\n\t}\n\n\tDownvoteOwnEdit struct {\n\t\tEdit func(childComplexity int) int\n\t}\n\n\tDraft struct {\n\t\tCreated func(childComplexity int) int\n\t\tData    func(childComplexity int) int\n\t\tExpires func(childComplexity int) int\n\t\tID      func(childComplexity int) int\n\t}\n\n\tDraftEntity struct {\n\t\tID   func(childComplexity int) int\n\t\tName func(childComplexity int) int\n\t}\n\n\tDraftFingerprint struct {\n\t\tAlgorithm func(childComplexity int) int\n\t\tDuration  func(childComplexity int) int\n\t\tHash      func(childComplexity int) int\n\t}\n\n\tDraftSubmissionStatus struct {\n\t\tID func(childComplexity int) int\n\t}\n\n\tEdit struct {\n\t\tApplied      func(childComplexity int) int\n\t\tBot          func(childComplexity int) int\n\t\tClosed       func(childComplexity int) int\n\t\tComments     func(childComplexity int) int\n\t\tCreated      func(childComplexity int) int\n\t\tDestructive  func(childComplexity int) int\n\t\tDetails      func(childComplexity int) int\n\t\tExpires      func(childComplexity int) int\n\t\tID           func(childComplexity int) int\n\t\tMergeSources func(childComplexity int) int\n\t\tOldDetails   func(childComplexity int) int\n\t\tOperation    func(childComplexity int) int\n\t\tOptions      func(childComplexity int) int\n\t\tStatus       func(childComplexity int) int\n\t\tTarget       func(childComplexity int) int\n\t\tTargetType   func(childComplexity int) int\n\t\tUpdatable    func(childComplexity int) int\n\t\tUpdateCount  func(childComplexity int) int\n\t\tUpdated      func(childComplexity int) int\n\t\tUser         func(childComplexity int) int\n\t\tVoteCount    func(childComplexity int) int\n\t\tVotes        func(childComplexity int) int\n\t}\n\n\tEditComment struct {\n\t\tComment func(childComplexity int) int\n\t\tDate    func(childComplexity int) int\n\t\tEdit    func(childComplexity int) int\n\t\tID      func(childComplexity int) int\n\t\tUser    func(childComplexity int) int\n\t}\n\n\tEditVote struct {\n\t\tDate func(childComplexity int) int\n\t\tUser func(childComplexity int) int\n\t\tVote func(childComplexity int) int\n\t}\n\n\tFailedOwnEdit struct {\n\t\tEdit func(childComplexity int) int\n\t}\n\n\tFavoritePerformerEdit struct {\n\t\tEdit func(childComplexity int) int\n\t}\n\n\tFavoritePerformerScene struct {\n\t\tScene func(childComplexity int) int\n\t}\n\n\tFavoriteStudioEdit struct {\n\t\tEdit func(childComplexity int) int\n\t}\n\n\tFavoriteStudioScene struct {\n\t\tScene func(childComplexity int) int\n\t}\n\n\tFingerprint struct {\n\t\tAlgorithm     func(childComplexity int) int\n\t\tCreated       func(childComplexity int) int\n\t\tDuration      func(childComplexity int) int\n\t\tHash          func(childComplexity int) int\n\t\tReports       func(childComplexity int) int\n\t\tSubmissions   func(childComplexity int) int\n\t\tUpdated       func(childComplexity int) int\n\t\tUserReported  func(childComplexity int) int\n\t\tUserSubmitted func(childComplexity int) int\n\t}\n\n\tFingerprintSubmissionResult struct {\n\t\tError   func(childComplexity int) int\n\t\tHash    func(childComplexity int) int\n\t\tSceneID func(childComplexity int) int\n\t}\n\n\tFingerprintedSceneEdit struct {\n\t\tEdit func(childComplexity int) int\n\t}\n\n\tFuzzyDate struct {\n\t\tAccuracy func(childComplexity int) int\n\t\tDate     func(childComplexity int) int\n\t}\n\n\tGenderFacet struct {\n\t\tCount  func(childComplexity int) int\n\t\tGender func(childComplexity int) int\n\t}\n\n\tImage struct {\n\t\tHeight func(childComplexity int) int\n\t\tID     func(childComplexity int) int\n\t\tURL    func(childComplexity int) int\n\t\tWidth  func(childComplexity int) int\n\t}\n\n\tInviteKey struct {\n\t\tExpires func(childComplexity int) int\n\t\tID      func(childComplexity int) int\n\t\tUses    func(childComplexity int) int\n\t}\n\n\tMeasurements struct {\n\t\tBandSize func(childComplexity int) int\n\t\tCupSize  func(childComplexity int) int\n\t\tHip      func(childComplexity int) int\n\t\tWaist    func(childComplexity int) int\n\t}\n\n\tModAudit struct {\n\t\tAction     func(childComplexity int) int\n\t\tCreatedAt  func(childComplexity int) int\n\t\tData       func(childComplexity int) int\n\t\tID         func(childComplexity int) int\n\t\tReason     func(childComplexity int) int\n\t\tTargetID   func(childComplexity int) int\n\t\tTargetType func(childComplexity int) int\n\t\tUser       func(childComplexity int) int\n\t}\n\n\tMutation struct {\n\t\tActivateNewUser                   func(childComplexity int, input ActivateNewUserInput) int\n\t\tAmendEdit                         func(childComplexity int, input AmendEditInput) int\n\t\tApplyEdit                         func(childComplexity int, input ApplyEditInput) int\n\t\tCancelEdit                        func(childComplexity int, input CancelEditInput) int\n\t\tChangePassword                    func(childComplexity int, input UserChangePasswordInput) int\n\t\tConfirmChangeEmail                func(childComplexity int, token uuid.UUID) int\n\t\tDeleteEdit                        func(childComplexity int, input DeleteEditInput) int\n\t\tDestroyDraft                      func(childComplexity int, id uuid.UUID) int\n\t\tEditComment                       func(childComplexity int, input EditCommentInput) int\n\t\tEditVote                          func(childComplexity int, input EditVoteInput) int\n\t\tFavoritePerformer                 func(childComplexity int, id uuid.UUID, favorite bool) int\n\t\tFavoriteStudio                    func(childComplexity int, id uuid.UUID, favorite bool) int\n\t\tGenerateInviteCode                func(childComplexity int) int\n\t\tGenerateInviteCodes               func(childComplexity int, input *GenerateInviteCodeInput) int\n\t\tGrantInvite                       func(childComplexity int, input GrantInviteInput) int\n\t\tImageCreate                       func(childComplexity int, input ImageCreateInput) int\n\t\tImageDestroy                      func(childComplexity int, input ImageDestroyInput) int\n\t\tMarkNotificationsRead             func(childComplexity int, notification *MarkNotificationReadInput) int\n\t\tNewUser                           func(childComplexity int, input NewUserInput) int\n\t\tPerformerCreate                   func(childComplexity int, input PerformerCreateInput) int\n\t\tPerformerDestroy                  func(childComplexity int, input PerformerDestroyInput) int\n\t\tPerformerEdit                     func(childComplexity int, input PerformerEditInput) int\n\t\tPerformerEditUpdate               func(childComplexity int, id uuid.UUID, input PerformerEditInput) int\n\t\tPerformerUpdate                   func(childComplexity int, input PerformerUpdateInput) int\n\t\tRegenerateAPIKey                  func(childComplexity int, userID *uuid.UUID) int\n\t\tRequestChangeEmail                func(childComplexity int) int\n\t\tRescindInviteCode                 func(childComplexity int, code uuid.UUID) int\n\t\tResetPassword                     func(childComplexity int, input ResetPasswordInput) int\n\t\tRevokeInvite                      func(childComplexity int, input RevokeInviteInput) int\n\t\tSceneCreate                       func(childComplexity int, input SceneCreateInput) int\n\t\tSceneDeleteFingerprintSubmissions func(childComplexity int, input DeleteFingerprintSubmissionsInput) int\n\t\tSceneDestroy                      func(childComplexity int, input SceneDestroyInput) int\n\t\tSceneEdit                         func(childComplexity int, input SceneEditInput) int\n\t\tSceneEditUpdate                   func(childComplexity int, id uuid.UUID, input SceneEditInput) int\n\t\tSceneMoveFingerprintSubmissions   func(childComplexity int, input MoveFingerprintSubmissionsInput) int\n\t\tSceneUpdate                       func(childComplexity int, input SceneUpdateInput) int\n\t\tSiteCreate                        func(childComplexity int, input SiteCreateInput) int\n\t\tSiteDestroy                       func(childComplexity int, input SiteDestroyInput) int\n\t\tSiteUpdate                        func(childComplexity int, input SiteUpdateInput) int\n\t\tStudioCreate                      func(childComplexity int, input StudioCreateInput) int\n\t\tStudioDestroy                     func(childComplexity int, input StudioDestroyInput) int\n\t\tStudioEdit                        func(childComplexity int, input StudioEditInput) int\n\t\tStudioEditUpdate                  func(childComplexity int, id uuid.UUID, input StudioEditInput) int\n\t\tStudioUpdate                      func(childComplexity int, input StudioUpdateInput) int\n\t\tSubmitFingerprint                 func(childComplexity int, input FingerprintSubmission) int\n\t\tSubmitFingerprints                func(childComplexity int, input []FingerprintBatchSubmission) int\n\t\tSubmitPerformerDraft              func(childComplexity int, input PerformerDraftInput) int\n\t\tSubmitSceneDraft                  func(childComplexity int, input SceneDraftInput) int\n\t\tTagCategoryCreate                 func(childComplexity int, input TagCategoryCreateInput) int\n\t\tTagCategoryDestroy                func(childComplexity int, input TagCategoryDestroyInput) int\n\t\tTagCategoryUpdate                 func(childComplexity int, input TagCategoryUpdateInput) int\n\t\tTagCreate                         func(childComplexity int, input TagCreateInput) int\n\t\tTagDestroy                        func(childComplexity int, input TagDestroyInput) int\n\t\tTagEdit                           func(childComplexity int, input TagEditInput) int\n\t\tTagEditUpdate                     func(childComplexity int, id uuid.UUID, input TagEditInput) int\n\t\tTagUpdate                         func(childComplexity int, input TagUpdateInput) int\n\t\tUpdateNotificationSubscriptions   func(childComplexity int, subscriptions []NotificationEnum) int\n\t\tUserCreate                        func(childComplexity int, input UserCreateInput) int\n\t\tUserDestroy                       func(childComplexity int, input UserDestroyInput) int\n\t\tUserUpdate                        func(childComplexity int, input UserUpdateInput) int\n\t\tValidateChangeEmail               func(childComplexity int, token uuid.UUID, email string) int\n\t}\n\n\tNotification struct {\n\t\tCreated func(childComplexity int) int\n\t\tData    func(childComplexity int) int\n\t\tRead    func(childComplexity int) int\n\t}\n\n\tPerformer struct {\n\t\tAge             func(childComplexity int) int\n\t\tAliases         func(childComplexity int) int\n\t\tBandSize        func(childComplexity int) int\n\t\tBirthDate       func(childComplexity int) int\n\t\tBirthdate       func(childComplexity int) int\n\t\tBreastType      func(childComplexity int) int\n\t\tCareerEndYear   func(childComplexity int) int\n\t\tCareerStartYear func(childComplexity int) int\n\t\tCountry         func(childComplexity int) int\n\t\tCreated         func(childComplexity int) int\n\t\tCupSize         func(childComplexity int) int\n\t\tDeathDate       func(childComplexity int) int\n\t\tDeleted         func(childComplexity int) int\n\t\tDisambiguation  func(childComplexity int) int\n\t\tEdits           func(childComplexity int) int\n\t\tEthnicity       func(childComplexity int) int\n\t\tEyeColor        func(childComplexity int) int\n\t\tGender          func(childComplexity int) int\n\t\tHairColor       func(childComplexity int) int\n\t\tHeight          func(childComplexity int) int\n\t\tHipSize         func(childComplexity int) int\n\t\tID              func(childComplexity int) int\n\t\tImages          func(childComplexity int) int\n\t\tIsFavorite      func(childComplexity int) int\n\t\tMeasurements    func(childComplexity int) int\n\t\tMergedIds       func(childComplexity int) int\n\t\tMergedIntoID    func(childComplexity int) int\n\t\tName            func(childComplexity int) int\n\t\tPiercings       func(childComplexity int) int\n\t\tSceneCount      func(childComplexity int) int\n\t\tScenes          func(childComplexity int, input *PerformerScenesInput) int\n\t\tStudios         func(childComplexity int, studioID *uuid.UUID) int\n\t\tTattoos         func(childComplexity int) int\n\t\tUpdated         func(childComplexity int) int\n\t\tUrls            func(childComplexity int) int\n\t\tWaistSize       func(childComplexity int) int\n\t}\n\n\tPerformerAppearance struct {\n\t\tAs        func(childComplexity int) int\n\t\tPerformer func(childComplexity int) int\n\t}\n\n\tPerformerDraft struct {\n\t\tAliases         func(childComplexity int) int\n\t\tBirthdate       func(childComplexity int) int\n\t\tBreastType      func(childComplexity int) int\n\t\tCareerEndYear   func(childComplexity int) int\n\t\tCareerStartYear func(childComplexity int) int\n\t\tCountry         func(childComplexity int) int\n\t\tDeathdate       func(childComplexity int) int\n\t\tDisambiguation  func(childComplexity int) int\n\t\tEthnicity       func(childComplexity int) int\n\t\tEyeColor        func(childComplexity int) int\n\t\tGender          func(childComplexity int) int\n\t\tHairColor       func(childComplexity int) int\n\t\tHeight          func(childComplexity int) int\n\t\tID              func(childComplexity int) int\n\t\tImage           func(childComplexity int) int\n\t\tMeasurements    func(childComplexity int) int\n\t\tName            func(childComplexity int) int\n\t\tPiercings       func(childComplexity int) int\n\t\tTattoos         func(childComplexity int) int\n\t\tUrls            func(childComplexity int) int\n\t}\n\n\tPerformerEdit struct {\n\t\tAddedAliases     func(childComplexity int) int\n\t\tAddedImages      func(childComplexity int) int\n\t\tAddedPiercings   func(childComplexity int) int\n\t\tAddedTattoos     func(childComplexity int) int\n\t\tAddedUrls        func(childComplexity int) int\n\t\tAliases          func(childComplexity int) int\n\t\tBandSize         func(childComplexity int) int\n\t\tBirthdate        func(childComplexity int) int\n\t\tBreastType       func(childComplexity int) int\n\t\tCareerEndYear    func(childComplexity int) int\n\t\tCareerStartYear  func(childComplexity int) int\n\t\tCountry          func(childComplexity int) int\n\t\tCupSize          func(childComplexity int) int\n\t\tDeathdate        func(childComplexity int) int\n\t\tDisambiguation   func(childComplexity int) int\n\t\tDraftID          func(childComplexity int) int\n\t\tEthnicity        func(childComplexity int) int\n\t\tEyeColor         func(childComplexity int) int\n\t\tGender           func(childComplexity int) int\n\t\tHairColor        func(childComplexity int) int\n\t\tHeight           func(childComplexity int) int\n\t\tHipSize          func(childComplexity int) int\n\t\tImages           func(childComplexity int) int\n\t\tName             func(childComplexity int) int\n\t\tPiercings        func(childComplexity int) int\n\t\tRemovedAliases   func(childComplexity int) int\n\t\tRemovedImages    func(childComplexity int) int\n\t\tRemovedPiercings func(childComplexity int) int\n\t\tRemovedTattoos   func(childComplexity int) int\n\t\tRemovedUrls      func(childComplexity int) int\n\t\tTattoos          func(childComplexity int) int\n\t\tUrls             func(childComplexity int) int\n\t\tWaistSize        func(childComplexity int) int\n\t}\n\n\tPerformerEditOptions struct {\n\t\tSetMergeAliases  func(childComplexity int) int\n\t\tSetModifyAliases func(childComplexity int) int\n\t}\n\n\tPerformerSearchFacets struct {\n\t\tGenders func(childComplexity int) int\n\t}\n\n\tPerformerStudio struct {\n\t\tSceneCount func(childComplexity int) int\n\t\tStudio     func(childComplexity int) int\n\t}\n\n\tQuery struct {\n\t\tFindDraft                     func(childComplexity int, id uuid.UUID) int\n\t\tFindDrafts                    func(childComplexity int) int\n\t\tFindEdit                      func(childComplexity int, id uuid.UUID) int\n\t\tFindPerformer                 func(childComplexity int, id uuid.UUID) int\n\t\tFindScene                     func(childComplexity int, id uuid.UUID) int\n\t\tFindScenesBySceneFingerprints func(childComplexity int, fingerprints [][]FingerprintQueryInput) int\n\t\tFindSite                      func(childComplexity int, id uuid.UUID) int\n\t\tFindStudio                    func(childComplexity int, id *uuid.UUID, name *string) int\n\t\tFindTag                       func(childComplexity int, id *uuid.UUID, name *string) int\n\t\tFindTagCategory               func(childComplexity int, id uuid.UUID) int\n\t\tFindTagOrAlias                func(childComplexity int, name string) int\n\t\tFindUser                      func(childComplexity int, id *uuid.UUID, username *string) int\n\t\tGetConfig                     func(childComplexity int) int\n\t\tGetUnreadNotificationCount    func(childComplexity int) int\n\t\tMe                            func(childComplexity int) int\n\t\tQueryEdits                    func(childComplexity int, input EditQueryInput) int\n\t\tQueryExistingPerformer        func(childComplexity int, input QueryExistingPerformerInput) int\n\t\tQueryExistingScene            func(childComplexity int, input QueryExistingSceneInput) int\n\t\tQueryModAudits                func(childComplexity int, input ModAuditQueryInput) int\n\t\tQueryNotifications            func(childComplexity int, input QueryNotificationsInput) int\n\t\tQueryPerformers               func(childComplexity int, input PerformerQueryInput) int\n\t\tQueryScenes                   func(childComplexity int, input SceneQueryInput) int\n\t\tQuerySites                    func(childComplexity int) int\n\t\tQueryStudios                  func(childComplexity int, input StudioQueryInput) int\n\t\tQueryTagCategories            func(childComplexity int) int\n\t\tQueryTags                     func(childComplexity int, input TagQueryInput) int\n\t\tQueryUsers                    func(childComplexity int, input UserQueryInput) int\n\t\tSearchPerformer               func(childComplexity int, term string, limit *int) int\n\t\tSearchPerformers              func(childComplexity int, term string, limit *int, page *int, perPage *int, filter *PerformerSearchFilter) int\n\t\tSearchScene                   func(childComplexity int, term string, limit *int) int\n\t\tSearchScenes                  func(childComplexity int, term string, limit *int, page *int, perPage *int) int\n\t\tSearchStudio                  func(childComplexity int, term string, limit *int) int\n\t\tSearchTag                     func(childComplexity int, term string, limit *int) int\n\t\tVersion                       func(childComplexity int) int\n\t}\n\n\tQueryEditsResultType struct {\n\t\tCount func(childComplexity int) int\n\t\tEdits func(childComplexity int) int\n\t}\n\n\tQueryExistingPerformerResult struct {\n\t\tEdits      func(childComplexity int) int\n\t\tPerformers func(childComplexity int) int\n\t}\n\n\tQueryExistingSceneResult struct {\n\t\tEdits  func(childComplexity int) int\n\t\tScenes func(childComplexity int) int\n\t}\n\n\tQueryModAuditsResultType struct {\n\t\tAudits func(childComplexity int) int\n\t\tCount  func(childComplexity int) int\n\t}\n\n\tQueryNotificationsResult struct {\n\t\tCount         func(childComplexity int) int\n\t\tNotifications func(childComplexity int) int\n\t}\n\n\tQueryPerformersResultType struct {\n\t\tCount      func(childComplexity int) int\n\t\tFacets     func(childComplexity int) int\n\t\tPerformers func(childComplexity int) int\n\t}\n\n\tQueryScenesResultType struct {\n\t\tCount  func(childComplexity int) int\n\t\tScenes func(childComplexity int) int\n\t}\n\n\tQuerySitesResultType struct {\n\t\tCount func(childComplexity int) int\n\t\tSites func(childComplexity int) int\n\t}\n\n\tQueryStudiosResultType struct {\n\t\tCount   func(childComplexity int) int\n\t\tStudios func(childComplexity int) int\n\t}\n\n\tQueryTagCategoriesResultType struct {\n\t\tCount         func(childComplexity int) int\n\t\tTagCategories func(childComplexity int) int\n\t}\n\n\tQueryTagsResultType struct {\n\t\tCount func(childComplexity int) int\n\t\tTags  func(childComplexity int) int\n\t}\n\n\tQueryUsersResultType struct {\n\t\tCount func(childComplexity int) int\n\t\tUsers func(childComplexity int) int\n\t}\n\n\tScene struct {\n\t\tCode           func(childComplexity int) int\n\t\tCreated        func(childComplexity int) int\n\t\tDate           func(childComplexity int) int\n\t\tDeleted        func(childComplexity int) int\n\t\tDetails        func(childComplexity int) int\n\t\tDirector       func(childComplexity int) int\n\t\tDuration       func(childComplexity int) int\n\t\tEdits          func(childComplexity int) int\n\t\tFingerprints   func(childComplexity int, isSubmitted *bool) int\n\t\tID             func(childComplexity int) int\n\t\tImages         func(childComplexity int) int\n\t\tPerformers     func(childComplexity int) int\n\t\tProductionDate func(childComplexity int) int\n\t\tReleaseDate    func(childComplexity int) int\n\t\tStudio         func(childComplexity int) int\n\t\tTags           func(childComplexity int) int\n\t\tTitle          func(childComplexity int) int\n\t\tUpdated        func(childComplexity int) int\n\t\tUrls           func(childComplexity int) int\n\t}\n\n\tSceneDraft struct {\n\t\tCode           func(childComplexity int) int\n\t\tDate           func(childComplexity int) int\n\t\tDetails        func(childComplexity int) int\n\t\tDirector       func(childComplexity int) int\n\t\tFingerprints   func(childComplexity int) int\n\t\tID             func(childComplexity int) int\n\t\tImage          func(childComplexity int) int\n\t\tPerformers     func(childComplexity int) int\n\t\tProductionDate func(childComplexity int) int\n\t\tStudio         func(childComplexity int) int\n\t\tTags           func(childComplexity int) int\n\t\tTitle          func(childComplexity int) int\n\t\tURLs           func(childComplexity int) int\n\t}\n\n\tSceneEdit struct {\n\t\tAddedFingerprints   func(childComplexity int) int\n\t\tAddedImages         func(childComplexity int) int\n\t\tAddedPerformers     func(childComplexity int) int\n\t\tAddedTags           func(childComplexity int) int\n\t\tAddedUrls           func(childComplexity int) int\n\t\tCode                func(childComplexity int) int\n\t\tDate                func(childComplexity int) int\n\t\tDetails             func(childComplexity int) int\n\t\tDirector            func(childComplexity int) int\n\t\tDraftID             func(childComplexity int) int\n\t\tDuration            func(childComplexity int) int\n\t\tFingerprints        func(childComplexity int) int\n\t\tImages              func(childComplexity int) int\n\t\tPerformers          func(childComplexity int) int\n\t\tProductionDate      func(childComplexity int) int\n\t\tRemovedFingerprints func(childComplexity int) int\n\t\tRemovedImages       func(childComplexity int) int\n\t\tRemovedPerformers   func(childComplexity int) int\n\t\tRemovedTags         func(childComplexity int) int\n\t\tRemovedUrls         func(childComplexity int) int\n\t\tStudio              func(childComplexity int) int\n\t\tTags                func(childComplexity int) int\n\t\tTitle               func(childComplexity int) int\n\t\tUrls                func(childComplexity int) int\n\t}\n\n\tSite struct {\n\t\tCreated     func(childComplexity int) int\n\t\tDescription func(childComplexity int) int\n\t\tID          func(childComplexity int) int\n\t\tIcon        func(childComplexity int) int\n\t\tName        func(childComplexity int) int\n\t\tRegex       func(childComplexity int) int\n\t\tURL         func(childComplexity int) int\n\t\tUpdated     func(childComplexity int) int\n\t\tValidTypes  func(childComplexity int) int\n\t}\n\n\tStashBoxConfig struct {\n\t\tEditUpdateLimit            func(childComplexity int) int\n\t\tGuidelinesURL              func(childComplexity int) int\n\t\tHostURL                    func(childComplexity int) int\n\t\tMinDestructiveVotingPeriod func(childComplexity int) int\n\t\tRequireActivation          func(childComplexity int) int\n\t\tRequireInvite              func(childComplexity int) int\n\t\tRequireSceneDraft          func(childComplexity int) int\n\t\tRequireTagRole             func(childComplexity int) int\n\t\tVoteApplicationThreshold   func(childComplexity int) int\n\t\tVoteCronInterval           func(childComplexity int) int\n\t\tVotePromotionThreshold     func(childComplexity int) int\n\t\tVotingPeriod               func(childComplexity int) int\n\t}\n\n\tStudio struct {\n\t\tAliases      func(childComplexity int) int\n\t\tChildStudios func(childComplexity int) int\n\t\tCreated      func(childComplexity int) int\n\t\tDeleted      func(childComplexity int) int\n\t\tID           func(childComplexity int) int\n\t\tImages       func(childComplexity int) int\n\t\tIsFavorite   func(childComplexity int) int\n\t\tName         func(childComplexity int) int\n\t\tParent       func(childComplexity int) int\n\t\tPerformers   func(childComplexity int, input PerformerQueryInput) int\n\t\tSubStudios   func(childComplexity int, input *StudioQueryInput) int\n\t\tUpdated      func(childComplexity int) int\n\t\tUrls         func(childComplexity int) int\n\t}\n\n\tStudioEdit struct {\n\t\tAddedAliases   func(childComplexity int) int\n\t\tAddedImages    func(childComplexity int) int\n\t\tAddedUrls      func(childComplexity int) int\n\t\tImages         func(childComplexity int) int\n\t\tName           func(childComplexity int) int\n\t\tParent         func(childComplexity int) int\n\t\tRemovedAliases func(childComplexity int) int\n\t\tRemovedImages  func(childComplexity int) int\n\t\tRemovedUrls    func(childComplexity int) int\n\t\tUrls           func(childComplexity int) int\n\t}\n\n\tTag struct {\n\t\tAliases     func(childComplexity int) int\n\t\tCategory    func(childComplexity int) int\n\t\tCreated     func(childComplexity int) int\n\t\tDeleted     func(childComplexity int) int\n\t\tDescription func(childComplexity int) int\n\t\tEdits       func(childComplexity int) int\n\t\tID          func(childComplexity int) int\n\t\tName        func(childComplexity int) int\n\t\tUpdated     func(childComplexity int) int\n\t}\n\n\tTagCategory struct {\n\t\tDescription func(childComplexity int) int\n\t\tGroup       func(childComplexity int) int\n\t\tID          func(childComplexity int) int\n\t\tName        func(childComplexity int) int\n\t}\n\n\tTagEdit struct {\n\t\tAddedAliases   func(childComplexity int) int\n\t\tAliases        func(childComplexity int) int\n\t\tCategory       func(childComplexity int) int\n\t\tDescription    func(childComplexity int) int\n\t\tName           func(childComplexity int) int\n\t\tRemovedAliases func(childComplexity int) int\n\t}\n\n\tURL struct {\n\t\tSite func(childComplexity int) int\n\t\tType func(childComplexity int) int\n\t\tURL  func(childComplexity int) int\n\t}\n\n\tUpdatedEdit struct {\n\t\tEdit func(childComplexity int) int\n\t}\n\n\tUser struct {\n\t\tAPICalls                  func(childComplexity int) int\n\t\tAPIKey                    func(childComplexity int) int\n\t\tActiveInviteCodes         func(childComplexity int) int\n\t\tEditCount                 func(childComplexity int) int\n\t\tEmail                     func(childComplexity int) int\n\t\tID                        func(childComplexity int) int\n\t\tInviteCodes               func(childComplexity int) int\n\t\tInviteTokens              func(childComplexity int) int\n\t\tInvitedBy                 func(childComplexity int) int\n\t\tName                      func(childComplexity int) int\n\t\tNotificationSubscriptions func(childComplexity int) int\n\t\tRoles                     func(childComplexity int) int\n\t\tVoteCount                 func(childComplexity int) int\n\t}\n\n\tUserEditCount struct {\n\t\tAccepted          func(childComplexity int) int\n\t\tCanceled          func(childComplexity int) int\n\t\tFailed            func(childComplexity int) int\n\t\tImmediateAccepted func(childComplexity int) int\n\t\tImmediateRejected func(childComplexity int) int\n\t\tPending           func(childComplexity int) int\n\t\tRejected          func(childComplexity int) int\n\t}\n\n\tUserVoteCount struct {\n\t\tAbstain         func(childComplexity int) int\n\t\tAccept          func(childComplexity int) int\n\t\tImmediateAccept func(childComplexity int) int\n\t\tImmediateReject func(childComplexity int) int\n\t\tReject          func(childComplexity int) int\n\t}\n\n\tVersion struct {\n\t\tBuildTime func(childComplexity int) int\n\t\tBuildType func(childComplexity int) int\n\t\tHash      func(childComplexity int) int\n\t\tVersion   func(childComplexity int) int\n\t}\n}\n\ntype DraftResolver interface {\n\tCreated(ctx context.Context, obj *Draft) (*time.Time, error)\n\tExpires(ctx context.Context, obj *Draft) (*time.Time, error)\n\tData(ctx context.Context, obj *Draft) (DraftData, error)\n}\ntype EditResolver interface {\n\tUser(ctx context.Context, obj *Edit) (*User, error)\n\tTarget(ctx context.Context, obj *Edit) (EditTarget, error)\n\tTargetType(ctx context.Context, obj *Edit) (TargetTypeEnum, error)\n\tMergeSources(ctx context.Context, obj *Edit) ([]EditTarget, error)\n\tOperation(ctx context.Context, obj *Edit) (OperationEnum, error)\n\n\tDetails(ctx context.Context, obj *Edit) (EditDetails, error)\n\tOldDetails(ctx context.Context, obj *Edit) (EditDetails, error)\n\tOptions(ctx context.Context, obj *Edit) (*PerformerEditOptions, error)\n\tComments(ctx context.Context, obj *Edit) ([]EditComment, error)\n\tVotes(ctx context.Context, obj *Edit) ([]EditVote, error)\n\n\tDestructive(ctx context.Context, obj *Edit) (bool, error)\n\tStatus(ctx context.Context, obj *Edit) (VoteStatusEnum, error)\n\n\tUpdatable(ctx context.Context, obj *Edit) (bool, error)\n\tCreated(ctx context.Context, obj *Edit) (*time.Time, error)\n\tUpdated(ctx context.Context, obj *Edit) (*time.Time, error)\n\tClosed(ctx context.Context, obj *Edit) (*time.Time, error)\n\tExpires(ctx context.Context, obj *Edit) (*time.Time, error)\n}\ntype EditCommentResolver interface {\n\tUser(ctx context.Context, obj *EditComment) (*User, error)\n\tDate(ctx context.Context, obj *EditComment) (*time.Time, error)\n\tComment(ctx context.Context, obj *EditComment) (string, error)\n\tEdit(ctx context.Context, obj *EditComment) (*Edit, error)\n}\ntype EditVoteResolver interface {\n\tUser(ctx context.Context, obj *EditVote) (*User, error)\n\tDate(ctx context.Context, obj *EditVote) (*time.Time, error)\n\tVote(ctx context.Context, obj *EditVote) (VoteTypeEnum, error)\n}\ntype ImageResolver interface {\n\tURL(ctx context.Context, obj *Image) (string, error)\n}\ntype ModAuditResolver interface {\n\tAction(ctx context.Context, obj *ModAudit) (ModAuditActionEnum, error)\n\tUser(ctx context.Context, obj *ModAudit) (*User, error)\n}\ntype MutationResolver interface {\n\tSceneCreate(ctx context.Context, input SceneCreateInput) (*Scene, error)\n\tSceneUpdate(ctx context.Context, input SceneUpdateInput) (*Scene, error)\n\tSceneDestroy(ctx context.Context, input SceneDestroyInput) (bool, error)\n\tPerformerCreate(ctx context.Context, input PerformerCreateInput) (*Performer, error)\n\tPerformerUpdate(ctx context.Context, input PerformerUpdateInput) (*Performer, error)\n\tPerformerDestroy(ctx context.Context, input PerformerDestroyInput) (bool, error)\n\tStudioCreate(ctx context.Context, input StudioCreateInput) (*Studio, error)\n\tStudioUpdate(ctx context.Context, input StudioUpdateInput) (*Studio, error)\n\tStudioDestroy(ctx context.Context, input StudioDestroyInput) (bool, error)\n\tTagCreate(ctx context.Context, input TagCreateInput) (*Tag, error)\n\tTagUpdate(ctx context.Context, input TagUpdateInput) (*Tag, error)\n\tTagDestroy(ctx context.Context, input TagDestroyInput) (bool, error)\n\tUserCreate(ctx context.Context, input UserCreateInput) (*User, error)\n\tUserUpdate(ctx context.Context, input UserUpdateInput) (*User, error)\n\tUserDestroy(ctx context.Context, input UserDestroyInput) (bool, error)\n\tImageCreate(ctx context.Context, input ImageCreateInput) (*Image, error)\n\tImageDestroy(ctx context.Context, input ImageDestroyInput) (bool, error)\n\tNewUser(ctx context.Context, input NewUserInput) (*uuid.UUID, error)\n\tActivateNewUser(ctx context.Context, input ActivateNewUserInput) (*User, error)\n\tGenerateInviteCode(ctx context.Context) (*uuid.UUID, error)\n\tGenerateInviteCodes(ctx context.Context, input *GenerateInviteCodeInput) ([]uuid.UUID, error)\n\tRescindInviteCode(ctx context.Context, code uuid.UUID) (bool, error)\n\tGrantInvite(ctx context.Context, input GrantInviteInput) (int, error)\n\tRevokeInvite(ctx context.Context, input RevokeInviteInput) (int, error)\n\tTagCategoryCreate(ctx context.Context, input TagCategoryCreateInput) (*TagCategory, error)\n\tTagCategoryUpdate(ctx context.Context, input TagCategoryUpdateInput) (*TagCategory, error)\n\tTagCategoryDestroy(ctx context.Context, input TagCategoryDestroyInput) (bool, error)\n\tSiteCreate(ctx context.Context, input SiteCreateInput) (*Site, error)\n\tSiteUpdate(ctx context.Context, input SiteUpdateInput) (*Site, error)\n\tSiteDestroy(ctx context.Context, input SiteDestroyInput) (bool, error)\n\tRegenerateAPIKey(ctx context.Context, userID *uuid.UUID) (string, error)\n\tResetPassword(ctx context.Context, input ResetPasswordInput) (bool, error)\n\tChangePassword(ctx context.Context, input UserChangePasswordInput) (bool, error)\n\tRequestChangeEmail(ctx context.Context) (UserChangeEmailStatus, error)\n\tValidateChangeEmail(ctx context.Context, token uuid.UUID, email string) (UserChangeEmailStatus, error)\n\tConfirmChangeEmail(ctx context.Context, token uuid.UUID) (UserChangeEmailStatus, error)\n\tSceneEdit(ctx context.Context, input SceneEditInput) (*Edit, error)\n\tPerformerEdit(ctx context.Context, input PerformerEditInput) (*Edit, error)\n\tStudioEdit(ctx context.Context, input StudioEditInput) (*Edit, error)\n\tTagEdit(ctx context.Context, input TagEditInput) (*Edit, error)\n\tSceneEditUpdate(ctx context.Context, id uuid.UUID, input SceneEditInput) (*Edit, error)\n\tPerformerEditUpdate(ctx context.Context, id uuid.UUID, input PerformerEditInput) (*Edit, error)\n\tStudioEditUpdate(ctx context.Context, id uuid.UUID, input StudioEditInput) (*Edit, error)\n\tTagEditUpdate(ctx context.Context, id uuid.UUID, input TagEditInput) (*Edit, error)\n\tEditVote(ctx context.Context, input EditVoteInput) (*Edit, error)\n\tEditComment(ctx context.Context, input EditCommentInput) (*Edit, error)\n\tApplyEdit(ctx context.Context, input ApplyEditInput) (*Edit, error)\n\tCancelEdit(ctx context.Context, input CancelEditInput) (*Edit, error)\n\tDeleteEdit(ctx context.Context, input DeleteEditInput) (bool, error)\n\tAmendEdit(ctx context.Context, input AmendEditInput) (*Edit, error)\n\tSubmitFingerprint(ctx context.Context, input FingerprintSubmission) (bool, error)\n\tSubmitFingerprints(ctx context.Context, input []FingerprintBatchSubmission) ([]FingerprintSubmissionResult, error)\n\tSceneMoveFingerprintSubmissions(ctx context.Context, input MoveFingerprintSubmissionsInput) (bool, error)\n\tSceneDeleteFingerprintSubmissions(ctx context.Context, input DeleteFingerprintSubmissionsInput) (bool, error)\n\tSubmitSceneDraft(ctx context.Context, input SceneDraftInput) (*DraftSubmissionStatus, error)\n\tSubmitPerformerDraft(ctx context.Context, input PerformerDraftInput) (*DraftSubmissionStatus, error)\n\tDestroyDraft(ctx context.Context, id uuid.UUID) (bool, error)\n\tFavoritePerformer(ctx context.Context, id uuid.UUID, favorite bool) (bool, error)\n\tFavoriteStudio(ctx context.Context, id uuid.UUID, favorite bool) (bool, error)\n\tMarkNotificationsRead(ctx context.Context, notification *MarkNotificationReadInput) (bool, error)\n\tUpdateNotificationSubscriptions(ctx context.Context, subscriptions []NotificationEnum) (bool, error)\n}\ntype NotificationResolver interface {\n\tCreated(ctx context.Context, obj *Notification) (*time.Time, error)\n\tRead(ctx context.Context, obj *Notification) (bool, error)\n\tData(ctx context.Context, obj *Notification) (NotificationData, error)\n}\ntype PerformerResolver interface {\n\tAliases(ctx context.Context, obj *Performer) ([]string, error)\n\n\tUrls(ctx context.Context, obj *Performer) ([]URL, error)\n\tBirthdate(ctx context.Context, obj *Performer) (*FuzzyDate, error)\n\n\tAge(ctx context.Context, obj *Performer) (*int, error)\n\n\tMeasurements(ctx context.Context, obj *Performer) (*Measurements, error)\n\n\tTattoos(ctx context.Context, obj *Performer) ([]BodyModification, error)\n\tPiercings(ctx context.Context, obj *Performer) ([]BodyModification, error)\n\tImages(ctx context.Context, obj *Performer) ([]Image, error)\n\n\tEdits(ctx context.Context, obj *Performer) ([]Edit, error)\n\tSceneCount(ctx context.Context, obj *Performer) (int, error)\n\tScenes(ctx context.Context, obj *Performer, input *PerformerScenesInput) ([]Scene, error)\n\tMergedIds(ctx context.Context, obj *Performer) ([]uuid.UUID, error)\n\tMergedIntoID(ctx context.Context, obj *Performer) (*uuid.UUID, error)\n\tStudios(ctx context.Context, obj *Performer, studioID *uuid.UUID) ([]PerformerStudio, error)\n\tIsFavorite(ctx context.Context, obj *Performer) (bool, error)\n}\ntype PerformerDraftResolver interface {\n\tImage(ctx context.Context, obj *PerformerDraft) (*Image, error)\n}\ntype PerformerEditResolver interface {\n\tGender(ctx context.Context, obj *PerformerEdit) (*GenderEnum, error)\n\n\tEthnicity(ctx context.Context, obj *PerformerEdit) (*EthnicityEnum, error)\n\n\tEyeColor(ctx context.Context, obj *PerformerEdit) (*EyeColorEnum, error)\n\tHairColor(ctx context.Context, obj *PerformerEdit) (*HairColorEnum, error)\n\n\tBreastType(ctx context.Context, obj *PerformerEdit) (*BreastTypeEnum, error)\n\n\tAddedImages(ctx context.Context, obj *PerformerEdit) ([]Image, error)\n\tRemovedImages(ctx context.Context, obj *PerformerEdit) ([]Image, error)\n\n\tAliases(ctx context.Context, obj *PerformerEdit) ([]string, error)\n\tUrls(ctx context.Context, obj *PerformerEdit) ([]URL, error)\n\tImages(ctx context.Context, obj *PerformerEdit) ([]Image, error)\n\tTattoos(ctx context.Context, obj *PerformerEdit) ([]BodyModification, error)\n\tPiercings(ctx context.Context, obj *PerformerEdit) ([]BodyModification, error)\n}\ntype QueryResolver interface {\n\tFindPerformer(ctx context.Context, id uuid.UUID) (*Performer, error)\n\tQueryPerformers(ctx context.Context, input PerformerQueryInput) (*PerformerQuery, error)\n\tFindStudio(ctx context.Context, id *uuid.UUID, name *string) (*Studio, error)\n\tQueryStudios(ctx context.Context, input StudioQueryInput) (*QueryStudiosResultType, error)\n\tFindTag(ctx context.Context, id *uuid.UUID, name *string) (*Tag, error)\n\tFindTagOrAlias(ctx context.Context, name string) (*Tag, error)\n\tQueryTags(ctx context.Context, input TagQueryInput) (*QueryTagsResultType, error)\n\tFindTagCategory(ctx context.Context, id uuid.UUID) (*TagCategory, error)\n\tQueryTagCategories(ctx context.Context) (*QueryTagCategoriesResultType, error)\n\tFindScene(ctx context.Context, id uuid.UUID) (*Scene, error)\n\tFindScenesBySceneFingerprints(ctx context.Context, fingerprints [][]FingerprintQueryInput) ([][]*Scene, error)\n\tQueryScenes(ctx context.Context, input SceneQueryInput) (*SceneQuery, error)\n\tFindSite(ctx context.Context, id uuid.UUID) (*Site, error)\n\tQuerySites(ctx context.Context) (*QuerySitesResultType, error)\n\tFindEdit(ctx context.Context, id uuid.UUID) (*Edit, error)\n\tQueryEdits(ctx context.Context, input EditQueryInput) (*EditQuery, error)\n\tFindUser(ctx context.Context, id *uuid.UUID, username *string) (*User, error)\n\tQueryUsers(ctx context.Context, input UserQueryInput) (*QueryUsersResultType, error)\n\tMe(ctx context.Context) (*User, error)\n\tSearchPerformer(ctx context.Context, term string, limit *int) ([]Performer, error)\n\tSearchPerformers(ctx context.Context, term string, limit *int, page *int, perPage *int, filter *PerformerSearchFilter) (*PerformerQuery, error)\n\tSearchScene(ctx context.Context, term string, limit *int) ([]Scene, error)\n\tSearchScenes(ctx context.Context, term string, limit *int, page *int, perPage *int) (*SceneQuery, error)\n\tSearchTag(ctx context.Context, term string, limit *int) ([]Tag, error)\n\tSearchStudio(ctx context.Context, term string, limit *int) ([]Studio, error)\n\tFindDraft(ctx context.Context, id uuid.UUID) (*Draft, error)\n\tFindDrafts(ctx context.Context) ([]Draft, error)\n\tQueryExistingScene(ctx context.Context, input QueryExistingSceneInput) (*QueryExistingSceneResult, error)\n\tQueryExistingPerformer(ctx context.Context, input QueryExistingPerformerInput) (*QueryExistingPerformerResult, error)\n\tVersion(ctx context.Context) (*Version, error)\n\tGetConfig(ctx context.Context) (*StashBoxConfig, error)\n\tQueryNotifications(ctx context.Context, input QueryNotificationsInput) (*QueryNotificationsResult, error)\n\tGetUnreadNotificationCount(ctx context.Context) (int, error)\n\tQueryModAudits(ctx context.Context, input ModAuditQueryInput) (*ModAuditQuery, error)\n}\ntype QueryEditsResultTypeResolver interface {\n\tCount(ctx context.Context, obj *EditQuery) (int, error)\n\tEdits(ctx context.Context, obj *EditQuery) ([]Edit, error)\n}\ntype QueryExistingPerformerResultResolver interface {\n\tEdits(ctx context.Context, obj *QueryExistingPerformerResult) ([]Edit, error)\n\tPerformers(ctx context.Context, obj *QueryExistingPerformerResult) ([]Performer, error)\n}\ntype QueryExistingSceneResultResolver interface {\n\tEdits(ctx context.Context, obj *QueryExistingSceneResult) ([]Edit, error)\n\tScenes(ctx context.Context, obj *QueryExistingSceneResult) ([]Scene, error)\n}\ntype QueryModAuditsResultTypeResolver interface {\n\tCount(ctx context.Context, obj *ModAuditQuery) (int, error)\n\tAudits(ctx context.Context, obj *ModAuditQuery) ([]ModAudit, error)\n}\ntype QueryNotificationsResultResolver interface {\n\tCount(ctx context.Context, obj *QueryNotificationsResult) (int, error)\n\tNotifications(ctx context.Context, obj *QueryNotificationsResult) ([]Notification, error)\n}\ntype QueryPerformersResultTypeResolver interface {\n\tCount(ctx context.Context, obj *PerformerQuery) (int, error)\n\tPerformers(ctx context.Context, obj *PerformerQuery) ([]Performer, error)\n\tFacets(ctx context.Context, obj *PerformerQuery) (*PerformerSearchFacets, error)\n}\ntype QueryScenesResultTypeResolver interface {\n\tCount(ctx context.Context, obj *SceneQuery) (int, error)\n\tScenes(ctx context.Context, obj *SceneQuery) ([]Scene, error)\n}\ntype SceneResolver interface {\n\tReleaseDate(ctx context.Context, obj *Scene) (*string, error)\n\n\tUrls(ctx context.Context, obj *Scene) ([]URL, error)\n\tStudio(ctx context.Context, obj *Scene) (*Studio, error)\n\tTags(ctx context.Context, obj *Scene) ([]Tag, error)\n\tImages(ctx context.Context, obj *Scene) ([]Image, error)\n\tPerformers(ctx context.Context, obj *Scene) ([]PerformerAppearance, error)\n\tFingerprints(ctx context.Context, obj *Scene, isSubmitted *bool) ([]Fingerprint, error)\n\n\tEdits(ctx context.Context, obj *Scene) ([]Edit, error)\n\tCreated(ctx context.Context, obj *Scene) (*time.Time, error)\n\tUpdated(ctx context.Context, obj *Scene) (*time.Time, error)\n}\ntype SceneDraftResolver interface {\n\tStudio(ctx context.Context, obj *SceneDraft) (SceneDraftStudio, error)\n\tPerformers(ctx context.Context, obj *SceneDraft) ([]SceneDraftPerformer, error)\n\tTags(ctx context.Context, obj *SceneDraft) ([]SceneDraftTag, error)\n\tImage(ctx context.Context, obj *SceneDraft) (*Image, error)\n}\ntype SceneEditResolver interface {\n\tStudio(ctx context.Context, obj *SceneEdit) (*Studio, error)\n\tAddedPerformers(ctx context.Context, obj *SceneEdit) ([]PerformerAppearance, error)\n\tRemovedPerformers(ctx context.Context, obj *SceneEdit) ([]PerformerAppearance, error)\n\tAddedTags(ctx context.Context, obj *SceneEdit) ([]Tag, error)\n\tRemovedTags(ctx context.Context, obj *SceneEdit) ([]Tag, error)\n\tAddedImages(ctx context.Context, obj *SceneEdit) ([]Image, error)\n\tRemovedImages(ctx context.Context, obj *SceneEdit) ([]Image, error)\n\tAddedFingerprints(ctx context.Context, obj *SceneEdit) ([]Fingerprint, error)\n\tRemovedFingerprints(ctx context.Context, obj *SceneEdit) ([]Fingerprint, error)\n\n\tUrls(ctx context.Context, obj *SceneEdit) ([]URL, error)\n\tPerformers(ctx context.Context, obj *SceneEdit) ([]PerformerAppearance, error)\n\tTags(ctx context.Context, obj *SceneEdit) ([]Tag, error)\n\tImages(ctx context.Context, obj *SceneEdit) ([]Image, error)\n\tFingerprints(ctx context.Context, obj *SceneEdit) ([]Fingerprint, error)\n}\ntype SiteResolver interface {\n\tValidTypes(ctx context.Context, obj *Site) ([]ValidSiteTypeEnum, error)\n\tIcon(ctx context.Context, obj *Site) (string, error)\n\tCreated(ctx context.Context, obj *Site) (*time.Time, error)\n\tUpdated(ctx context.Context, obj *Site) (*time.Time, error)\n}\ntype StudioResolver interface {\n\tAliases(ctx context.Context, obj *Studio) ([]string, error)\n\tUrls(ctx context.Context, obj *Studio) ([]URL, error)\n\tParent(ctx context.Context, obj *Studio) (*Studio, error)\n\tChildStudios(ctx context.Context, obj *Studio) ([]Studio, error)\n\tSubStudios(ctx context.Context, obj *Studio, input *StudioQueryInput) (*QueryStudiosResultType, error)\n\tImages(ctx context.Context, obj *Studio) ([]Image, error)\n\n\tIsFavorite(ctx context.Context, obj *Studio) (bool, error)\n\tCreated(ctx context.Context, obj *Studio) (*time.Time, error)\n\tUpdated(ctx context.Context, obj *Studio) (*time.Time, error)\n\tPerformers(ctx context.Context, obj *Studio, input PerformerQueryInput) (*PerformerQuery, error)\n}\ntype StudioEditResolver interface {\n\tParent(ctx context.Context, obj *StudioEdit) (*Studio, error)\n\tAddedImages(ctx context.Context, obj *StudioEdit) ([]Image, error)\n\tRemovedImages(ctx context.Context, obj *StudioEdit) ([]Image, error)\n\n\tImages(ctx context.Context, obj *StudioEdit) ([]Image, error)\n\tUrls(ctx context.Context, obj *StudioEdit) ([]URL, error)\n}\ntype TagResolver interface {\n\tAliases(ctx context.Context, obj *Tag) ([]string, error)\n\n\tEdits(ctx context.Context, obj *Tag) ([]Edit, error)\n\tCategory(ctx context.Context, obj *Tag) (*TagCategory, error)\n}\ntype TagCategoryResolver interface {\n\tGroup(ctx context.Context, obj *TagCategory) (TagGroupEnum, error)\n}\ntype TagEditResolver interface {\n\tCategory(ctx context.Context, obj *TagEdit) (*TagCategory, error)\n\tAliases(ctx context.Context, obj *TagEdit) ([]string, error)\n}\ntype URLResolver interface {\n\tType(ctx context.Context, obj *URL) (string, error)\n\tSite(ctx context.Context, obj *URL) (*Site, error)\n}\ntype UserResolver interface {\n\tRoles(ctx context.Context, obj *User) ([]RoleEnum, error)\n\n\tNotificationSubscriptions(ctx context.Context, obj *User) ([]NotificationEnum, error)\n\tVoteCount(ctx context.Context, obj *User) (*UserVoteCount, error)\n\tEditCount(ctx context.Context, obj *User) (*UserEditCount, error)\n\n\tInvitedBy(ctx context.Context, obj *User) (*User, error)\n\n\tActiveInviteCodes(ctx context.Context, obj *User) ([]string, error)\n\tInviteCodes(ctx context.Context, obj *User) ([]InviteKey, error)\n}\n\ntype executableSchema graphql.ExecutableSchemaState[ResolverRoot, DirectiveRoot, ComplexityRoot]\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\tif e.SchemaData != nil {\n\t\treturn e.SchemaData\n\t}\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Complexity(ctx context.Context, typeName, field string, childComplexity int, rawArgs map[string]any) (int, bool) {\n\tec := newExecutionContext(nil, e, nil)\n\t_ = ec\n\tswitch typeName + \".\" + field {\n\n\tcase \"BodyModification.description\":\n\t\tif e.ComplexityRoot.BodyModification.Description == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.BodyModification.Description(childComplexity), true\n\tcase \"BodyModification.location\":\n\t\tif e.ComplexityRoot.BodyModification.Location == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.BodyModification.Location(childComplexity), true\n\n\tcase \"CommentCommentedEdit.comment\":\n\t\tif e.ComplexityRoot.CommentCommentedEdit.Comment == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.CommentCommentedEdit.Comment(childComplexity), true\n\n\tcase \"CommentOwnEdit.comment\":\n\t\tif e.ComplexityRoot.CommentOwnEdit.Comment == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.CommentOwnEdit.Comment(childComplexity), true\n\n\tcase \"CommentVotedEdit.comment\":\n\t\tif e.ComplexityRoot.CommentVotedEdit.Comment == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.CommentVotedEdit.Comment(childComplexity), true\n\n\tcase \"DownvoteOwnEdit.edit\":\n\t\tif e.ComplexityRoot.DownvoteOwnEdit.Edit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.DownvoteOwnEdit.Edit(childComplexity), true\n\n\tcase \"Draft.created\":\n\t\tif e.ComplexityRoot.Draft.Created == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Draft.Created(childComplexity), true\n\tcase \"Draft.data\":\n\t\tif e.ComplexityRoot.Draft.Data == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Draft.Data(childComplexity), true\n\tcase \"Draft.expires\":\n\t\tif e.ComplexityRoot.Draft.Expires == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Draft.Expires(childComplexity), true\n\tcase \"Draft.id\":\n\t\tif e.ComplexityRoot.Draft.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Draft.ID(childComplexity), true\n\n\tcase \"DraftEntity.id\":\n\t\tif e.ComplexityRoot.DraftEntity.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.DraftEntity.ID(childComplexity), true\n\tcase \"DraftEntity.name\":\n\t\tif e.ComplexityRoot.DraftEntity.Name == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.DraftEntity.Name(childComplexity), true\n\n\tcase \"DraftFingerprint.algorithm\":\n\t\tif e.ComplexityRoot.DraftFingerprint.Algorithm == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.DraftFingerprint.Algorithm(childComplexity), true\n\tcase \"DraftFingerprint.duration\":\n\t\tif e.ComplexityRoot.DraftFingerprint.Duration == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.DraftFingerprint.Duration(childComplexity), true\n\tcase \"DraftFingerprint.hash\":\n\t\tif e.ComplexityRoot.DraftFingerprint.Hash == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.DraftFingerprint.Hash(childComplexity), true\n\n\tcase \"DraftSubmissionStatus.id\":\n\t\tif e.ComplexityRoot.DraftSubmissionStatus.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.DraftSubmissionStatus.ID(childComplexity), true\n\n\tcase \"Edit.applied\":\n\t\tif e.ComplexityRoot.Edit.Applied == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Applied(childComplexity), true\n\tcase \"Edit.bot\":\n\t\tif e.ComplexityRoot.Edit.Bot == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Bot(childComplexity), true\n\tcase \"Edit.closed\":\n\t\tif e.ComplexityRoot.Edit.Closed == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Closed(childComplexity), true\n\tcase \"Edit.comments\":\n\t\tif e.ComplexityRoot.Edit.Comments == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Comments(childComplexity), true\n\tcase \"Edit.created\":\n\t\tif e.ComplexityRoot.Edit.Created == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Created(childComplexity), true\n\tcase \"Edit.destructive\":\n\t\tif e.ComplexityRoot.Edit.Destructive == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Destructive(childComplexity), true\n\tcase \"Edit.details\":\n\t\tif e.ComplexityRoot.Edit.Details == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Details(childComplexity), true\n\tcase \"Edit.expires\":\n\t\tif e.ComplexityRoot.Edit.Expires == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Expires(childComplexity), true\n\tcase \"Edit.id\":\n\t\tif e.ComplexityRoot.Edit.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.ID(childComplexity), true\n\tcase \"Edit.merge_sources\":\n\t\tif e.ComplexityRoot.Edit.MergeSources == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.MergeSources(childComplexity), true\n\tcase \"Edit.old_details\":\n\t\tif e.ComplexityRoot.Edit.OldDetails == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.OldDetails(childComplexity), true\n\tcase \"Edit.operation\":\n\t\tif e.ComplexityRoot.Edit.Operation == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Operation(childComplexity), true\n\tcase \"Edit.options\":\n\t\tif e.ComplexityRoot.Edit.Options == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Options(childComplexity), true\n\tcase \"Edit.status\":\n\t\tif e.ComplexityRoot.Edit.Status == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Status(childComplexity), true\n\tcase \"Edit.target\":\n\t\tif e.ComplexityRoot.Edit.Target == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Target(childComplexity), true\n\tcase \"Edit.target_type\":\n\t\tif e.ComplexityRoot.Edit.TargetType == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.TargetType(childComplexity), true\n\tcase \"Edit.updatable\":\n\t\tif e.ComplexityRoot.Edit.Updatable == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Updatable(childComplexity), true\n\tcase \"Edit.update_count\":\n\t\tif e.ComplexityRoot.Edit.UpdateCount == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.UpdateCount(childComplexity), true\n\tcase \"Edit.updated\":\n\t\tif e.ComplexityRoot.Edit.Updated == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Updated(childComplexity), true\n\tcase \"Edit.user\":\n\t\tif e.ComplexityRoot.Edit.User == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.User(childComplexity), true\n\tcase \"Edit.vote_count\":\n\t\tif e.ComplexityRoot.Edit.VoteCount == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.VoteCount(childComplexity), true\n\tcase \"Edit.votes\":\n\t\tif e.ComplexityRoot.Edit.Votes == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Edit.Votes(childComplexity), true\n\n\tcase \"EditComment.comment\":\n\t\tif e.ComplexityRoot.EditComment.Comment == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.EditComment.Comment(childComplexity), true\n\tcase \"EditComment.date\":\n\t\tif e.ComplexityRoot.EditComment.Date == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.EditComment.Date(childComplexity), true\n\tcase \"EditComment.edit\":\n\t\tif e.ComplexityRoot.EditComment.Edit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.EditComment.Edit(childComplexity), true\n\tcase \"EditComment.id\":\n\t\tif e.ComplexityRoot.EditComment.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.EditComment.ID(childComplexity), true\n\tcase \"EditComment.user\":\n\t\tif e.ComplexityRoot.EditComment.User == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.EditComment.User(childComplexity), true\n\n\tcase \"EditVote.date\":\n\t\tif e.ComplexityRoot.EditVote.Date == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.EditVote.Date(childComplexity), true\n\tcase \"EditVote.user\":\n\t\tif e.ComplexityRoot.EditVote.User == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.EditVote.User(childComplexity), true\n\tcase \"EditVote.vote\":\n\t\tif e.ComplexityRoot.EditVote.Vote == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.EditVote.Vote(childComplexity), true\n\n\tcase \"FailedOwnEdit.edit\":\n\t\tif e.ComplexityRoot.FailedOwnEdit.Edit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.FailedOwnEdit.Edit(childComplexity), true\n\n\tcase \"FavoritePerformerEdit.edit\":\n\t\tif e.ComplexityRoot.FavoritePerformerEdit.Edit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.FavoritePerformerEdit.Edit(childComplexity), true\n\n\tcase \"FavoritePerformerScene.scene\":\n\t\tif e.ComplexityRoot.FavoritePerformerScene.Scene == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.FavoritePerformerScene.Scene(childComplexity), true\n\n\tcase \"FavoriteStudioEdit.edit\":\n\t\tif e.ComplexityRoot.FavoriteStudioEdit.Edit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.FavoriteStudioEdit.Edit(childComplexity), true\n\n\tcase \"FavoriteStudioScene.scene\":\n\t\tif e.ComplexityRoot.FavoriteStudioScene.Scene == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.FavoriteStudioScene.Scene(childComplexity), true\n\n\tcase \"Fingerprint.algorithm\":\n\t\tif e.ComplexityRoot.Fingerprint.Algorithm == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Fingerprint.Algorithm(childComplexity), true\n\tcase \"Fingerprint.created\":\n\t\tif e.ComplexityRoot.Fingerprint.Created == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Fingerprint.Created(childComplexity), true\n\tcase \"Fingerprint.duration\":\n\t\tif e.ComplexityRoot.Fingerprint.Duration == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Fingerprint.Duration(childComplexity), true\n\tcase \"Fingerprint.hash\":\n\t\tif e.ComplexityRoot.Fingerprint.Hash == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Fingerprint.Hash(childComplexity), true\n\tcase \"Fingerprint.reports\":\n\t\tif e.ComplexityRoot.Fingerprint.Reports == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Fingerprint.Reports(childComplexity), true\n\tcase \"Fingerprint.submissions\":\n\t\tif e.ComplexityRoot.Fingerprint.Submissions == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Fingerprint.Submissions(childComplexity), true\n\tcase \"Fingerprint.updated\":\n\t\tif e.ComplexityRoot.Fingerprint.Updated == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Fingerprint.Updated(childComplexity), true\n\tcase \"Fingerprint.user_reported\":\n\t\tif e.ComplexityRoot.Fingerprint.UserReported == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Fingerprint.UserReported(childComplexity), true\n\tcase \"Fingerprint.user_submitted\":\n\t\tif e.ComplexityRoot.Fingerprint.UserSubmitted == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Fingerprint.UserSubmitted(childComplexity), true\n\n\tcase \"FingerprintSubmissionResult.error\":\n\t\tif e.ComplexityRoot.FingerprintSubmissionResult.Error == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.FingerprintSubmissionResult.Error(childComplexity), true\n\tcase \"FingerprintSubmissionResult.hash\":\n\t\tif e.ComplexityRoot.FingerprintSubmissionResult.Hash == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.FingerprintSubmissionResult.Hash(childComplexity), true\n\tcase \"FingerprintSubmissionResult.scene_id\":\n\t\tif e.ComplexityRoot.FingerprintSubmissionResult.SceneID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.FingerprintSubmissionResult.SceneID(childComplexity), true\n\n\tcase \"FingerprintedSceneEdit.edit\":\n\t\tif e.ComplexityRoot.FingerprintedSceneEdit.Edit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.FingerprintedSceneEdit.Edit(childComplexity), true\n\n\tcase \"FuzzyDate.accuracy\":\n\t\tif e.ComplexityRoot.FuzzyDate.Accuracy == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.FuzzyDate.Accuracy(childComplexity), true\n\tcase \"FuzzyDate.date\":\n\t\tif e.ComplexityRoot.FuzzyDate.Date == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.FuzzyDate.Date(childComplexity), true\n\n\tcase \"GenderFacet.count\":\n\t\tif e.ComplexityRoot.GenderFacet.Count == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.GenderFacet.Count(childComplexity), true\n\tcase \"GenderFacet.gender\":\n\t\tif e.ComplexityRoot.GenderFacet.Gender == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.GenderFacet.Gender(childComplexity), true\n\n\tcase \"Image.height\":\n\t\tif e.ComplexityRoot.Image.Height == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Image.Height(childComplexity), true\n\tcase \"Image.id\":\n\t\tif e.ComplexityRoot.Image.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Image.ID(childComplexity), true\n\tcase \"Image.url\":\n\t\tif e.ComplexityRoot.Image.URL == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Image.URL(childComplexity), true\n\tcase \"Image.width\":\n\t\tif e.ComplexityRoot.Image.Width == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Image.Width(childComplexity), true\n\n\tcase \"InviteKey.expires\":\n\t\tif e.ComplexityRoot.InviteKey.Expires == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.InviteKey.Expires(childComplexity), true\n\tcase \"InviteKey.id\":\n\t\tif e.ComplexityRoot.InviteKey.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.InviteKey.ID(childComplexity), true\n\tcase \"InviteKey.uses\":\n\t\tif e.ComplexityRoot.InviteKey.Uses == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.InviteKey.Uses(childComplexity), true\n\n\tcase \"Measurements.band_size\":\n\t\tif e.ComplexityRoot.Measurements.BandSize == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Measurements.BandSize(childComplexity), true\n\tcase \"Measurements.cup_size\":\n\t\tif e.ComplexityRoot.Measurements.CupSize == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Measurements.CupSize(childComplexity), true\n\tcase \"Measurements.hip\":\n\t\tif e.ComplexityRoot.Measurements.Hip == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Measurements.Hip(childComplexity), true\n\tcase \"Measurements.waist\":\n\t\tif e.ComplexityRoot.Measurements.Waist == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Measurements.Waist(childComplexity), true\n\n\tcase \"ModAudit.action\":\n\t\tif e.ComplexityRoot.ModAudit.Action == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.ModAudit.Action(childComplexity), true\n\tcase \"ModAudit.created_at\":\n\t\tif e.ComplexityRoot.ModAudit.CreatedAt == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.ModAudit.CreatedAt(childComplexity), true\n\tcase \"ModAudit.data\":\n\t\tif e.ComplexityRoot.ModAudit.Data == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.ModAudit.Data(childComplexity), true\n\tcase \"ModAudit.id\":\n\t\tif e.ComplexityRoot.ModAudit.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.ModAudit.ID(childComplexity), true\n\tcase \"ModAudit.reason\":\n\t\tif e.ComplexityRoot.ModAudit.Reason == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.ModAudit.Reason(childComplexity), true\n\tcase \"ModAudit.target_id\":\n\t\tif e.ComplexityRoot.ModAudit.TargetID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.ModAudit.TargetID(childComplexity), true\n\tcase \"ModAudit.target_type\":\n\t\tif e.ComplexityRoot.ModAudit.TargetType == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.ModAudit.TargetType(childComplexity), true\n\tcase \"ModAudit.user\":\n\t\tif e.ComplexityRoot.ModAudit.User == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.ModAudit.User(childComplexity), true\n\n\tcase \"Mutation.activateNewUser\":\n\t\tif e.ComplexityRoot.Mutation.ActivateNewUser == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_activateNewUser_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.ActivateNewUser(childComplexity, args[\"input\"].(ActivateNewUserInput)), true\n\tcase \"Mutation.amendEdit\":\n\t\tif e.ComplexityRoot.Mutation.AmendEdit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_amendEdit_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.AmendEdit(childComplexity, args[\"input\"].(AmendEditInput)), true\n\tcase \"Mutation.applyEdit\":\n\t\tif e.ComplexityRoot.Mutation.ApplyEdit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_applyEdit_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.ApplyEdit(childComplexity, args[\"input\"].(ApplyEditInput)), true\n\tcase \"Mutation.cancelEdit\":\n\t\tif e.ComplexityRoot.Mutation.CancelEdit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_cancelEdit_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.CancelEdit(childComplexity, args[\"input\"].(CancelEditInput)), true\n\tcase \"Mutation.changePassword\":\n\t\tif e.ComplexityRoot.Mutation.ChangePassword == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_changePassword_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.ChangePassword(childComplexity, args[\"input\"].(UserChangePasswordInput)), true\n\tcase \"Mutation.confirmChangeEmail\":\n\t\tif e.ComplexityRoot.Mutation.ConfirmChangeEmail == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_confirmChangeEmail_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.ConfirmChangeEmail(childComplexity, args[\"token\"].(uuid.UUID)), true\n\tcase \"Mutation.deleteEdit\":\n\t\tif e.ComplexityRoot.Mutation.DeleteEdit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_deleteEdit_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.DeleteEdit(childComplexity, args[\"input\"].(DeleteEditInput)), true\n\tcase \"Mutation.destroyDraft\":\n\t\tif e.ComplexityRoot.Mutation.DestroyDraft == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_destroyDraft_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.DestroyDraft(childComplexity, args[\"id\"].(uuid.UUID)), true\n\tcase \"Mutation.editComment\":\n\t\tif e.ComplexityRoot.Mutation.EditComment == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_editComment_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.EditComment(childComplexity, args[\"input\"].(EditCommentInput)), true\n\tcase \"Mutation.editVote\":\n\t\tif e.ComplexityRoot.Mutation.EditVote == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_editVote_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.EditVote(childComplexity, args[\"input\"].(EditVoteInput)), true\n\tcase \"Mutation.favoritePerformer\":\n\t\tif e.ComplexityRoot.Mutation.FavoritePerformer == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_favoritePerformer_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.FavoritePerformer(childComplexity, args[\"id\"].(uuid.UUID), args[\"favorite\"].(bool)), true\n\tcase \"Mutation.favoriteStudio\":\n\t\tif e.ComplexityRoot.Mutation.FavoriteStudio == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_favoriteStudio_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.FavoriteStudio(childComplexity, args[\"id\"].(uuid.UUID), args[\"favorite\"].(bool)), true\n\tcase \"Mutation.generateInviteCode\":\n\t\tif e.ComplexityRoot.Mutation.GenerateInviteCode == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.GenerateInviteCode(childComplexity), true\n\tcase \"Mutation.generateInviteCodes\":\n\t\tif e.ComplexityRoot.Mutation.GenerateInviteCodes == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_generateInviteCodes_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.GenerateInviteCodes(childComplexity, args[\"input\"].(*GenerateInviteCodeInput)), true\n\tcase \"Mutation.grantInvite\":\n\t\tif e.ComplexityRoot.Mutation.GrantInvite == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_grantInvite_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.GrantInvite(childComplexity, args[\"input\"].(GrantInviteInput)), true\n\tcase \"Mutation.imageCreate\":\n\t\tif e.ComplexityRoot.Mutation.ImageCreate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_imageCreate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.ImageCreate(childComplexity, args[\"input\"].(ImageCreateInput)), true\n\tcase \"Mutation.imageDestroy\":\n\t\tif e.ComplexityRoot.Mutation.ImageDestroy == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_imageDestroy_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.ImageDestroy(childComplexity, args[\"input\"].(ImageDestroyInput)), true\n\tcase \"Mutation.markNotificationsRead\":\n\t\tif e.ComplexityRoot.Mutation.MarkNotificationsRead == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_markNotificationsRead_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.MarkNotificationsRead(childComplexity, args[\"notification\"].(*MarkNotificationReadInput)), true\n\tcase \"Mutation.newUser\":\n\t\tif e.ComplexityRoot.Mutation.NewUser == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_newUser_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.NewUser(childComplexity, args[\"input\"].(NewUserInput)), true\n\tcase \"Mutation.performerCreate\":\n\t\tif e.ComplexityRoot.Mutation.PerformerCreate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_performerCreate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.PerformerCreate(childComplexity, args[\"input\"].(PerformerCreateInput)), true\n\tcase \"Mutation.performerDestroy\":\n\t\tif e.ComplexityRoot.Mutation.PerformerDestroy == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_performerDestroy_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.PerformerDestroy(childComplexity, args[\"input\"].(PerformerDestroyInput)), true\n\tcase \"Mutation.performerEdit\":\n\t\tif e.ComplexityRoot.Mutation.PerformerEdit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_performerEdit_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.PerformerEdit(childComplexity, args[\"input\"].(PerformerEditInput)), true\n\tcase \"Mutation.performerEditUpdate\":\n\t\tif e.ComplexityRoot.Mutation.PerformerEditUpdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_performerEditUpdate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.PerformerEditUpdate(childComplexity, args[\"id\"].(uuid.UUID), args[\"input\"].(PerformerEditInput)), true\n\tcase \"Mutation.performerUpdate\":\n\t\tif e.ComplexityRoot.Mutation.PerformerUpdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_performerUpdate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.PerformerUpdate(childComplexity, args[\"input\"].(PerformerUpdateInput)), true\n\tcase \"Mutation.regenerateAPIKey\":\n\t\tif e.ComplexityRoot.Mutation.RegenerateAPIKey == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_regenerateAPIKey_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.RegenerateAPIKey(childComplexity, args[\"userID\"].(*uuid.UUID)), true\n\tcase \"Mutation.requestChangeEmail\":\n\t\tif e.ComplexityRoot.Mutation.RequestChangeEmail == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.RequestChangeEmail(childComplexity), true\n\tcase \"Mutation.rescindInviteCode\":\n\t\tif e.ComplexityRoot.Mutation.RescindInviteCode == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_rescindInviteCode_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.RescindInviteCode(childComplexity, args[\"code\"].(uuid.UUID)), true\n\tcase \"Mutation.resetPassword\":\n\t\tif e.ComplexityRoot.Mutation.ResetPassword == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_resetPassword_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.ResetPassword(childComplexity, args[\"input\"].(ResetPasswordInput)), true\n\tcase \"Mutation.revokeInvite\":\n\t\tif e.ComplexityRoot.Mutation.RevokeInvite == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_revokeInvite_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.RevokeInvite(childComplexity, args[\"input\"].(RevokeInviteInput)), true\n\tcase \"Mutation.sceneCreate\":\n\t\tif e.ComplexityRoot.Mutation.SceneCreate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_sceneCreate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SceneCreate(childComplexity, args[\"input\"].(SceneCreateInput)), true\n\tcase \"Mutation.sceneDeleteFingerprintSubmissions\":\n\t\tif e.ComplexityRoot.Mutation.SceneDeleteFingerprintSubmissions == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_sceneDeleteFingerprintSubmissions_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SceneDeleteFingerprintSubmissions(childComplexity, args[\"input\"].(DeleteFingerprintSubmissionsInput)), true\n\tcase \"Mutation.sceneDestroy\":\n\t\tif e.ComplexityRoot.Mutation.SceneDestroy == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_sceneDestroy_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SceneDestroy(childComplexity, args[\"input\"].(SceneDestroyInput)), true\n\tcase \"Mutation.sceneEdit\":\n\t\tif e.ComplexityRoot.Mutation.SceneEdit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_sceneEdit_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SceneEdit(childComplexity, args[\"input\"].(SceneEditInput)), true\n\tcase \"Mutation.sceneEditUpdate\":\n\t\tif e.ComplexityRoot.Mutation.SceneEditUpdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_sceneEditUpdate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SceneEditUpdate(childComplexity, args[\"id\"].(uuid.UUID), args[\"input\"].(SceneEditInput)), true\n\tcase \"Mutation.sceneMoveFingerprintSubmissions\":\n\t\tif e.ComplexityRoot.Mutation.SceneMoveFingerprintSubmissions == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_sceneMoveFingerprintSubmissions_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SceneMoveFingerprintSubmissions(childComplexity, args[\"input\"].(MoveFingerprintSubmissionsInput)), true\n\tcase \"Mutation.sceneUpdate\":\n\t\tif e.ComplexityRoot.Mutation.SceneUpdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_sceneUpdate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SceneUpdate(childComplexity, args[\"input\"].(SceneUpdateInput)), true\n\tcase \"Mutation.siteCreate\":\n\t\tif e.ComplexityRoot.Mutation.SiteCreate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_siteCreate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SiteCreate(childComplexity, args[\"input\"].(SiteCreateInput)), true\n\tcase \"Mutation.siteDestroy\":\n\t\tif e.ComplexityRoot.Mutation.SiteDestroy == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_siteDestroy_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SiteDestroy(childComplexity, args[\"input\"].(SiteDestroyInput)), true\n\tcase \"Mutation.siteUpdate\":\n\t\tif e.ComplexityRoot.Mutation.SiteUpdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_siteUpdate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SiteUpdate(childComplexity, args[\"input\"].(SiteUpdateInput)), true\n\tcase \"Mutation.studioCreate\":\n\t\tif e.ComplexityRoot.Mutation.StudioCreate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_studioCreate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.StudioCreate(childComplexity, args[\"input\"].(StudioCreateInput)), true\n\tcase \"Mutation.studioDestroy\":\n\t\tif e.ComplexityRoot.Mutation.StudioDestroy == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_studioDestroy_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.StudioDestroy(childComplexity, args[\"input\"].(StudioDestroyInput)), true\n\tcase \"Mutation.studioEdit\":\n\t\tif e.ComplexityRoot.Mutation.StudioEdit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_studioEdit_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.StudioEdit(childComplexity, args[\"input\"].(StudioEditInput)), true\n\tcase \"Mutation.studioEditUpdate\":\n\t\tif e.ComplexityRoot.Mutation.StudioEditUpdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_studioEditUpdate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.StudioEditUpdate(childComplexity, args[\"id\"].(uuid.UUID), args[\"input\"].(StudioEditInput)), true\n\tcase \"Mutation.studioUpdate\":\n\t\tif e.ComplexityRoot.Mutation.StudioUpdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_studioUpdate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.StudioUpdate(childComplexity, args[\"input\"].(StudioUpdateInput)), true\n\tcase \"Mutation.submitFingerprint\":\n\t\tif e.ComplexityRoot.Mutation.SubmitFingerprint == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_submitFingerprint_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SubmitFingerprint(childComplexity, args[\"input\"].(FingerprintSubmission)), true\n\tcase \"Mutation.submitFingerprints\":\n\t\tif e.ComplexityRoot.Mutation.SubmitFingerprints == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_submitFingerprints_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SubmitFingerprints(childComplexity, args[\"input\"].([]FingerprintBatchSubmission)), true\n\tcase \"Mutation.submitPerformerDraft\":\n\t\tif e.ComplexityRoot.Mutation.SubmitPerformerDraft == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_submitPerformerDraft_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SubmitPerformerDraft(childComplexity, args[\"input\"].(PerformerDraftInput)), true\n\tcase \"Mutation.submitSceneDraft\":\n\t\tif e.ComplexityRoot.Mutation.SubmitSceneDraft == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_submitSceneDraft_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.SubmitSceneDraft(childComplexity, args[\"input\"].(SceneDraftInput)), true\n\tcase \"Mutation.tagCategoryCreate\":\n\t\tif e.ComplexityRoot.Mutation.TagCategoryCreate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_tagCategoryCreate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.TagCategoryCreate(childComplexity, args[\"input\"].(TagCategoryCreateInput)), true\n\tcase \"Mutation.tagCategoryDestroy\":\n\t\tif e.ComplexityRoot.Mutation.TagCategoryDestroy == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_tagCategoryDestroy_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.TagCategoryDestroy(childComplexity, args[\"input\"].(TagCategoryDestroyInput)), true\n\tcase \"Mutation.tagCategoryUpdate\":\n\t\tif e.ComplexityRoot.Mutation.TagCategoryUpdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_tagCategoryUpdate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.TagCategoryUpdate(childComplexity, args[\"input\"].(TagCategoryUpdateInput)), true\n\tcase \"Mutation.tagCreate\":\n\t\tif e.ComplexityRoot.Mutation.TagCreate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_tagCreate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.TagCreate(childComplexity, args[\"input\"].(TagCreateInput)), true\n\tcase \"Mutation.tagDestroy\":\n\t\tif e.ComplexityRoot.Mutation.TagDestroy == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_tagDestroy_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.TagDestroy(childComplexity, args[\"input\"].(TagDestroyInput)), true\n\tcase \"Mutation.tagEdit\":\n\t\tif e.ComplexityRoot.Mutation.TagEdit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_tagEdit_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.TagEdit(childComplexity, args[\"input\"].(TagEditInput)), true\n\tcase \"Mutation.tagEditUpdate\":\n\t\tif e.ComplexityRoot.Mutation.TagEditUpdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_tagEditUpdate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.TagEditUpdate(childComplexity, args[\"id\"].(uuid.UUID), args[\"input\"].(TagEditInput)), true\n\tcase \"Mutation.tagUpdate\":\n\t\tif e.ComplexityRoot.Mutation.TagUpdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_tagUpdate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.TagUpdate(childComplexity, args[\"input\"].(TagUpdateInput)), true\n\tcase \"Mutation.updateNotificationSubscriptions\":\n\t\tif e.ComplexityRoot.Mutation.UpdateNotificationSubscriptions == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_updateNotificationSubscriptions_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.UpdateNotificationSubscriptions(childComplexity, args[\"subscriptions\"].([]NotificationEnum)), true\n\tcase \"Mutation.userCreate\":\n\t\tif e.ComplexityRoot.Mutation.UserCreate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_userCreate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.UserCreate(childComplexity, args[\"input\"].(UserCreateInput)), true\n\tcase \"Mutation.userDestroy\":\n\t\tif e.ComplexityRoot.Mutation.UserDestroy == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_userDestroy_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.UserDestroy(childComplexity, args[\"input\"].(UserDestroyInput)), true\n\tcase \"Mutation.userUpdate\":\n\t\tif e.ComplexityRoot.Mutation.UserUpdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_userUpdate_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.UserUpdate(childComplexity, args[\"input\"].(UserUpdateInput)), true\n\tcase \"Mutation.validateChangeEmail\":\n\t\tif e.ComplexityRoot.Mutation.ValidateChangeEmail == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Mutation_validateChangeEmail_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Mutation.ValidateChangeEmail(childComplexity, args[\"token\"].(uuid.UUID), args[\"email\"].(string)), true\n\n\tcase \"Notification.created\":\n\t\tif e.ComplexityRoot.Notification.Created == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Notification.Created(childComplexity), true\n\tcase \"Notification.data\":\n\t\tif e.ComplexityRoot.Notification.Data == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Notification.Data(childComplexity), true\n\tcase \"Notification.read\":\n\t\tif e.ComplexityRoot.Notification.Read == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Notification.Read(childComplexity), true\n\n\tcase \"Performer.age\":\n\t\tif e.ComplexityRoot.Performer.Age == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Age(childComplexity), true\n\tcase \"Performer.aliases\":\n\t\tif e.ComplexityRoot.Performer.Aliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Aliases(childComplexity), true\n\tcase \"Performer.band_size\":\n\t\tif e.ComplexityRoot.Performer.BandSize == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.BandSize(childComplexity), true\n\tcase \"Performer.birth_date\":\n\t\tif e.ComplexityRoot.Performer.BirthDate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.BirthDate(childComplexity), true\n\tcase \"Performer.birthdate\":\n\t\tif e.ComplexityRoot.Performer.Birthdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Birthdate(childComplexity), true\n\tcase \"Performer.breast_type\":\n\t\tif e.ComplexityRoot.Performer.BreastType == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.BreastType(childComplexity), true\n\tcase \"Performer.career_end_year\":\n\t\tif e.ComplexityRoot.Performer.CareerEndYear == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.CareerEndYear(childComplexity), true\n\tcase \"Performer.career_start_year\":\n\t\tif e.ComplexityRoot.Performer.CareerStartYear == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.CareerStartYear(childComplexity), true\n\tcase \"Performer.country\":\n\t\tif e.ComplexityRoot.Performer.Country == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Country(childComplexity), true\n\tcase \"Performer.created\":\n\t\tif e.ComplexityRoot.Performer.Created == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Created(childComplexity), true\n\tcase \"Performer.cup_size\":\n\t\tif e.ComplexityRoot.Performer.CupSize == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.CupSize(childComplexity), true\n\tcase \"Performer.death_date\":\n\t\tif e.ComplexityRoot.Performer.DeathDate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.DeathDate(childComplexity), true\n\tcase \"Performer.deleted\":\n\t\tif e.ComplexityRoot.Performer.Deleted == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Deleted(childComplexity), true\n\tcase \"Performer.disambiguation\":\n\t\tif e.ComplexityRoot.Performer.Disambiguation == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Disambiguation(childComplexity), true\n\tcase \"Performer.edits\":\n\t\tif e.ComplexityRoot.Performer.Edits == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Edits(childComplexity), true\n\tcase \"Performer.ethnicity\":\n\t\tif e.ComplexityRoot.Performer.Ethnicity == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Ethnicity(childComplexity), true\n\tcase \"Performer.eye_color\":\n\t\tif e.ComplexityRoot.Performer.EyeColor == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.EyeColor(childComplexity), true\n\tcase \"Performer.gender\":\n\t\tif e.ComplexityRoot.Performer.Gender == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Gender(childComplexity), true\n\tcase \"Performer.hair_color\":\n\t\tif e.ComplexityRoot.Performer.HairColor == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.HairColor(childComplexity), true\n\tcase \"Performer.height\":\n\t\tif e.ComplexityRoot.Performer.Height == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Height(childComplexity), true\n\tcase \"Performer.hip_size\":\n\t\tif e.ComplexityRoot.Performer.HipSize == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.HipSize(childComplexity), true\n\tcase \"Performer.id\":\n\t\tif e.ComplexityRoot.Performer.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.ID(childComplexity), true\n\tcase \"Performer.images\":\n\t\tif e.ComplexityRoot.Performer.Images == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Images(childComplexity), true\n\tcase \"Performer.is_favorite\":\n\t\tif e.ComplexityRoot.Performer.IsFavorite == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.IsFavorite(childComplexity), true\n\tcase \"Performer.measurements\":\n\t\tif e.ComplexityRoot.Performer.Measurements == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Measurements(childComplexity), true\n\tcase \"Performer.merged_ids\":\n\t\tif e.ComplexityRoot.Performer.MergedIds == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.MergedIds(childComplexity), true\n\tcase \"Performer.merged_into_id\":\n\t\tif e.ComplexityRoot.Performer.MergedIntoID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.MergedIntoID(childComplexity), true\n\tcase \"Performer.name\":\n\t\tif e.ComplexityRoot.Performer.Name == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Name(childComplexity), true\n\tcase \"Performer.piercings\":\n\t\tif e.ComplexityRoot.Performer.Piercings == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Piercings(childComplexity), true\n\tcase \"Performer.scene_count\":\n\t\tif e.ComplexityRoot.Performer.SceneCount == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.SceneCount(childComplexity), true\n\tcase \"Performer.scenes\":\n\t\tif e.ComplexityRoot.Performer.Scenes == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Performer_scenes_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Scenes(childComplexity, args[\"input\"].(*PerformerScenesInput)), true\n\tcase \"Performer.studios\":\n\t\tif e.ComplexityRoot.Performer.Studios == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Performer_studios_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Studios(childComplexity, args[\"studio_id\"].(*uuid.UUID)), true\n\tcase \"Performer.tattoos\":\n\t\tif e.ComplexityRoot.Performer.Tattoos == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Tattoos(childComplexity), true\n\tcase \"Performer.updated\":\n\t\tif e.ComplexityRoot.Performer.Updated == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Updated(childComplexity), true\n\tcase \"Performer.urls\":\n\t\tif e.ComplexityRoot.Performer.Urls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.Urls(childComplexity), true\n\tcase \"Performer.waist_size\":\n\t\tif e.ComplexityRoot.Performer.WaistSize == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Performer.WaistSize(childComplexity), true\n\n\tcase \"PerformerAppearance.as\":\n\t\tif e.ComplexityRoot.PerformerAppearance.As == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerAppearance.As(childComplexity), true\n\tcase \"PerformerAppearance.performer\":\n\t\tif e.ComplexityRoot.PerformerAppearance.Performer == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerAppearance.Performer(childComplexity), true\n\n\tcase \"PerformerDraft.aliases\":\n\t\tif e.ComplexityRoot.PerformerDraft.Aliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Aliases(childComplexity), true\n\tcase \"PerformerDraft.birthdate\":\n\t\tif e.ComplexityRoot.PerformerDraft.Birthdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Birthdate(childComplexity), true\n\tcase \"PerformerDraft.breast_type\":\n\t\tif e.ComplexityRoot.PerformerDraft.BreastType == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.BreastType(childComplexity), true\n\tcase \"PerformerDraft.career_end_year\":\n\t\tif e.ComplexityRoot.PerformerDraft.CareerEndYear == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.CareerEndYear(childComplexity), true\n\tcase \"PerformerDraft.career_start_year\":\n\t\tif e.ComplexityRoot.PerformerDraft.CareerStartYear == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.CareerStartYear(childComplexity), true\n\tcase \"PerformerDraft.country\":\n\t\tif e.ComplexityRoot.PerformerDraft.Country == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Country(childComplexity), true\n\tcase \"PerformerDraft.deathdate\":\n\t\tif e.ComplexityRoot.PerformerDraft.Deathdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Deathdate(childComplexity), true\n\tcase \"PerformerDraft.disambiguation\":\n\t\tif e.ComplexityRoot.PerformerDraft.Disambiguation == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Disambiguation(childComplexity), true\n\tcase \"PerformerDraft.ethnicity\":\n\t\tif e.ComplexityRoot.PerformerDraft.Ethnicity == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Ethnicity(childComplexity), true\n\tcase \"PerformerDraft.eye_color\":\n\t\tif e.ComplexityRoot.PerformerDraft.EyeColor == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.EyeColor(childComplexity), true\n\tcase \"PerformerDraft.gender\":\n\t\tif e.ComplexityRoot.PerformerDraft.Gender == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Gender(childComplexity), true\n\tcase \"PerformerDraft.hair_color\":\n\t\tif e.ComplexityRoot.PerformerDraft.HairColor == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.HairColor(childComplexity), true\n\tcase \"PerformerDraft.height\":\n\t\tif e.ComplexityRoot.PerformerDraft.Height == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Height(childComplexity), true\n\tcase \"PerformerDraft.id\":\n\t\tif e.ComplexityRoot.PerformerDraft.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.ID(childComplexity), true\n\tcase \"PerformerDraft.image\":\n\t\tif e.ComplexityRoot.PerformerDraft.Image == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Image(childComplexity), true\n\tcase \"PerformerDraft.measurements\":\n\t\tif e.ComplexityRoot.PerformerDraft.Measurements == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Measurements(childComplexity), true\n\tcase \"PerformerDraft.name\":\n\t\tif e.ComplexityRoot.PerformerDraft.Name == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Name(childComplexity), true\n\tcase \"PerformerDraft.piercings\":\n\t\tif e.ComplexityRoot.PerformerDraft.Piercings == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Piercings(childComplexity), true\n\tcase \"PerformerDraft.tattoos\":\n\t\tif e.ComplexityRoot.PerformerDraft.Tattoos == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Tattoos(childComplexity), true\n\tcase \"PerformerDraft.urls\":\n\t\tif e.ComplexityRoot.PerformerDraft.Urls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerDraft.Urls(childComplexity), true\n\n\tcase \"PerformerEdit.added_aliases\":\n\t\tif e.ComplexityRoot.PerformerEdit.AddedAliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.AddedAliases(childComplexity), true\n\tcase \"PerformerEdit.added_images\":\n\t\tif e.ComplexityRoot.PerformerEdit.AddedImages == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.AddedImages(childComplexity), true\n\tcase \"PerformerEdit.added_piercings\":\n\t\tif e.ComplexityRoot.PerformerEdit.AddedPiercings == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.AddedPiercings(childComplexity), true\n\tcase \"PerformerEdit.added_tattoos\":\n\t\tif e.ComplexityRoot.PerformerEdit.AddedTattoos == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.AddedTattoos(childComplexity), true\n\tcase \"PerformerEdit.added_urls\":\n\t\tif e.ComplexityRoot.PerformerEdit.AddedUrls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.AddedUrls(childComplexity), true\n\tcase \"PerformerEdit.aliases\":\n\t\tif e.ComplexityRoot.PerformerEdit.Aliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.Aliases(childComplexity), true\n\tcase \"PerformerEdit.band_size\":\n\t\tif e.ComplexityRoot.PerformerEdit.BandSize == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.BandSize(childComplexity), true\n\tcase \"PerformerEdit.birthdate\":\n\t\tif e.ComplexityRoot.PerformerEdit.Birthdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.Birthdate(childComplexity), true\n\tcase \"PerformerEdit.breast_type\":\n\t\tif e.ComplexityRoot.PerformerEdit.BreastType == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.BreastType(childComplexity), true\n\tcase \"PerformerEdit.career_end_year\":\n\t\tif e.ComplexityRoot.PerformerEdit.CareerEndYear == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.CareerEndYear(childComplexity), true\n\tcase \"PerformerEdit.career_start_year\":\n\t\tif e.ComplexityRoot.PerformerEdit.CareerStartYear == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.CareerStartYear(childComplexity), true\n\tcase \"PerformerEdit.country\":\n\t\tif e.ComplexityRoot.PerformerEdit.Country == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.Country(childComplexity), true\n\tcase \"PerformerEdit.cup_size\":\n\t\tif e.ComplexityRoot.PerformerEdit.CupSize == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.CupSize(childComplexity), true\n\tcase \"PerformerEdit.deathdate\":\n\t\tif e.ComplexityRoot.PerformerEdit.Deathdate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.Deathdate(childComplexity), true\n\tcase \"PerformerEdit.disambiguation\":\n\t\tif e.ComplexityRoot.PerformerEdit.Disambiguation == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.Disambiguation(childComplexity), true\n\tcase \"PerformerEdit.draft_id\":\n\t\tif e.ComplexityRoot.PerformerEdit.DraftID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.DraftID(childComplexity), true\n\tcase \"PerformerEdit.ethnicity\":\n\t\tif e.ComplexityRoot.PerformerEdit.Ethnicity == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.Ethnicity(childComplexity), true\n\tcase \"PerformerEdit.eye_color\":\n\t\tif e.ComplexityRoot.PerformerEdit.EyeColor == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.EyeColor(childComplexity), true\n\tcase \"PerformerEdit.gender\":\n\t\tif e.ComplexityRoot.PerformerEdit.Gender == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.Gender(childComplexity), true\n\tcase \"PerformerEdit.hair_color\":\n\t\tif e.ComplexityRoot.PerformerEdit.HairColor == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.HairColor(childComplexity), true\n\tcase \"PerformerEdit.height\":\n\t\tif e.ComplexityRoot.PerformerEdit.Height == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.Height(childComplexity), true\n\tcase \"PerformerEdit.hip_size\":\n\t\tif e.ComplexityRoot.PerformerEdit.HipSize == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.HipSize(childComplexity), true\n\tcase \"PerformerEdit.images\":\n\t\tif e.ComplexityRoot.PerformerEdit.Images == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.Images(childComplexity), true\n\tcase \"PerformerEdit.name\":\n\t\tif e.ComplexityRoot.PerformerEdit.Name == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.Name(childComplexity), true\n\tcase \"PerformerEdit.piercings\":\n\t\tif e.ComplexityRoot.PerformerEdit.Piercings == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.Piercings(childComplexity), true\n\tcase \"PerformerEdit.removed_aliases\":\n\t\tif e.ComplexityRoot.PerformerEdit.RemovedAliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.RemovedAliases(childComplexity), true\n\tcase \"PerformerEdit.removed_images\":\n\t\tif e.ComplexityRoot.PerformerEdit.RemovedImages == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.RemovedImages(childComplexity), true\n\tcase \"PerformerEdit.removed_piercings\":\n\t\tif e.ComplexityRoot.PerformerEdit.RemovedPiercings == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.RemovedPiercings(childComplexity), true\n\tcase \"PerformerEdit.removed_tattoos\":\n\t\tif e.ComplexityRoot.PerformerEdit.RemovedTattoos == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.RemovedTattoos(childComplexity), true\n\tcase \"PerformerEdit.removed_urls\":\n\t\tif e.ComplexityRoot.PerformerEdit.RemovedUrls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.RemovedUrls(childComplexity), true\n\tcase \"PerformerEdit.tattoos\":\n\t\tif e.ComplexityRoot.PerformerEdit.Tattoos == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.Tattoos(childComplexity), true\n\tcase \"PerformerEdit.urls\":\n\t\tif e.ComplexityRoot.PerformerEdit.Urls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.Urls(childComplexity), true\n\tcase \"PerformerEdit.waist_size\":\n\t\tif e.ComplexityRoot.PerformerEdit.WaistSize == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEdit.WaistSize(childComplexity), true\n\n\tcase \"PerformerEditOptions.set_merge_aliases\":\n\t\tif e.ComplexityRoot.PerformerEditOptions.SetMergeAliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEditOptions.SetMergeAliases(childComplexity), true\n\tcase \"PerformerEditOptions.set_modify_aliases\":\n\t\tif e.ComplexityRoot.PerformerEditOptions.SetModifyAliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerEditOptions.SetModifyAliases(childComplexity), true\n\n\tcase \"PerformerSearchFacets.genders\":\n\t\tif e.ComplexityRoot.PerformerSearchFacets.Genders == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerSearchFacets.Genders(childComplexity), true\n\n\tcase \"PerformerStudio.scene_count\":\n\t\tif e.ComplexityRoot.PerformerStudio.SceneCount == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerStudio.SceneCount(childComplexity), true\n\tcase \"PerformerStudio.studio\":\n\t\tif e.ComplexityRoot.PerformerStudio.Studio == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.PerformerStudio.Studio(childComplexity), true\n\n\tcase \"Query.findDraft\":\n\t\tif e.ComplexityRoot.Query.FindDraft == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_findDraft_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.FindDraft(childComplexity, args[\"id\"].(uuid.UUID)), true\n\tcase \"Query.findDrafts\":\n\t\tif e.ComplexityRoot.Query.FindDrafts == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.FindDrafts(childComplexity), true\n\tcase \"Query.findEdit\":\n\t\tif e.ComplexityRoot.Query.FindEdit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_findEdit_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.FindEdit(childComplexity, args[\"id\"].(uuid.UUID)), true\n\tcase \"Query.findPerformer\":\n\t\tif e.ComplexityRoot.Query.FindPerformer == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_findPerformer_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.FindPerformer(childComplexity, args[\"id\"].(uuid.UUID)), true\n\tcase \"Query.findScene\":\n\t\tif e.ComplexityRoot.Query.FindScene == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_findScene_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.FindScene(childComplexity, args[\"id\"].(uuid.UUID)), true\n\tcase \"Query.findScenesBySceneFingerprints\":\n\t\tif e.ComplexityRoot.Query.FindScenesBySceneFingerprints == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_findScenesBySceneFingerprints_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.FindScenesBySceneFingerprints(childComplexity, args[\"fingerprints\"].([][]FingerprintQueryInput)), true\n\tcase \"Query.findSite\":\n\t\tif e.ComplexityRoot.Query.FindSite == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_findSite_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.FindSite(childComplexity, args[\"id\"].(uuid.UUID)), true\n\tcase \"Query.findStudio\":\n\t\tif e.ComplexityRoot.Query.FindStudio == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_findStudio_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.FindStudio(childComplexity, args[\"id\"].(*uuid.UUID), args[\"name\"].(*string)), true\n\tcase \"Query.findTag\":\n\t\tif e.ComplexityRoot.Query.FindTag == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_findTag_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.FindTag(childComplexity, args[\"id\"].(*uuid.UUID), args[\"name\"].(*string)), true\n\tcase \"Query.findTagCategory\":\n\t\tif e.ComplexityRoot.Query.FindTagCategory == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_findTagCategory_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.FindTagCategory(childComplexity, args[\"id\"].(uuid.UUID)), true\n\tcase \"Query.findTagOrAlias\":\n\t\tif e.ComplexityRoot.Query.FindTagOrAlias == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_findTagOrAlias_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.FindTagOrAlias(childComplexity, args[\"name\"].(string)), true\n\tcase \"Query.findUser\":\n\t\tif e.ComplexityRoot.Query.FindUser == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_findUser_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.FindUser(childComplexity, args[\"id\"].(*uuid.UUID), args[\"username\"].(*string)), true\n\tcase \"Query.getConfig\":\n\t\tif e.ComplexityRoot.Query.GetConfig == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.GetConfig(childComplexity), true\n\tcase \"Query.getUnreadNotificationCount\":\n\t\tif e.ComplexityRoot.Query.GetUnreadNotificationCount == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.GetUnreadNotificationCount(childComplexity), true\n\n\tcase \"Query.me\":\n\t\tif e.ComplexityRoot.Query.Me == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.Me(childComplexity), true\n\tcase \"Query.queryEdits\":\n\t\tif e.ComplexityRoot.Query.QueryEdits == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_queryEdits_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.QueryEdits(childComplexity, args[\"input\"].(EditQueryInput)), true\n\tcase \"Query.queryExistingPerformer\":\n\t\tif e.ComplexityRoot.Query.QueryExistingPerformer == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_queryExistingPerformer_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.QueryExistingPerformer(childComplexity, args[\"input\"].(QueryExistingPerformerInput)), true\n\tcase \"Query.queryExistingScene\":\n\t\tif e.ComplexityRoot.Query.QueryExistingScene == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_queryExistingScene_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.QueryExistingScene(childComplexity, args[\"input\"].(QueryExistingSceneInput)), true\n\tcase \"Query.queryModAudits\":\n\t\tif e.ComplexityRoot.Query.QueryModAudits == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_queryModAudits_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.QueryModAudits(childComplexity, args[\"input\"].(ModAuditQueryInput)), true\n\tcase \"Query.queryNotifications\":\n\t\tif e.ComplexityRoot.Query.QueryNotifications == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_queryNotifications_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.QueryNotifications(childComplexity, args[\"input\"].(QueryNotificationsInput)), true\n\tcase \"Query.queryPerformers\":\n\t\tif e.ComplexityRoot.Query.QueryPerformers == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_queryPerformers_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.QueryPerformers(childComplexity, args[\"input\"].(PerformerQueryInput)), true\n\tcase \"Query.queryScenes\":\n\t\tif e.ComplexityRoot.Query.QueryScenes == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_queryScenes_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.QueryScenes(childComplexity, args[\"input\"].(SceneQueryInput)), true\n\tcase \"Query.querySites\":\n\t\tif e.ComplexityRoot.Query.QuerySites == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.QuerySites(childComplexity), true\n\tcase \"Query.queryStudios\":\n\t\tif e.ComplexityRoot.Query.QueryStudios == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_queryStudios_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.QueryStudios(childComplexity, args[\"input\"].(StudioQueryInput)), true\n\tcase \"Query.queryTagCategories\":\n\t\tif e.ComplexityRoot.Query.QueryTagCategories == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.QueryTagCategories(childComplexity), true\n\tcase \"Query.queryTags\":\n\t\tif e.ComplexityRoot.Query.QueryTags == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_queryTags_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.QueryTags(childComplexity, args[\"input\"].(TagQueryInput)), true\n\tcase \"Query.queryUsers\":\n\t\tif e.ComplexityRoot.Query.QueryUsers == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_queryUsers_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.QueryUsers(childComplexity, args[\"input\"].(UserQueryInput)), true\n\tcase \"Query.searchPerformer\":\n\t\tif e.ComplexityRoot.Query.SearchPerformer == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_searchPerformer_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.SearchPerformer(childComplexity, args[\"term\"].(string), args[\"limit\"].(*int)), true\n\tcase \"Query.searchPerformers\":\n\t\tif e.ComplexityRoot.Query.SearchPerformers == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_searchPerformers_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.SearchPerformers(childComplexity, args[\"term\"].(string), args[\"limit\"].(*int), args[\"page\"].(*int), args[\"per_page\"].(*int), args[\"filter\"].(*PerformerSearchFilter)), true\n\tcase \"Query.searchScene\":\n\t\tif e.ComplexityRoot.Query.SearchScene == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_searchScene_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.SearchScene(childComplexity, args[\"term\"].(string), args[\"limit\"].(*int)), true\n\tcase \"Query.searchScenes\":\n\t\tif e.ComplexityRoot.Query.SearchScenes == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_searchScenes_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.SearchScenes(childComplexity, args[\"term\"].(string), args[\"limit\"].(*int), args[\"page\"].(*int), args[\"per_page\"].(*int)), true\n\tcase \"Query.searchStudio\":\n\t\tif e.ComplexityRoot.Query.SearchStudio == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_searchStudio_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.SearchStudio(childComplexity, args[\"term\"].(string), args[\"limit\"].(*int)), true\n\tcase \"Query.searchTag\":\n\t\tif e.ComplexityRoot.Query.SearchTag == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Query_searchTag_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.SearchTag(childComplexity, args[\"term\"].(string), args[\"limit\"].(*int)), true\n\tcase \"Query.version\":\n\t\tif e.ComplexityRoot.Query.Version == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Query.Version(childComplexity), true\n\n\tcase \"QueryEditsResultType.count\":\n\t\tif e.ComplexityRoot.QueryEditsResultType.Count == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryEditsResultType.Count(childComplexity), true\n\tcase \"QueryEditsResultType.edits\":\n\t\tif e.ComplexityRoot.QueryEditsResultType.Edits == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryEditsResultType.Edits(childComplexity), true\n\n\tcase \"QueryExistingPerformerResult.edits\":\n\t\tif e.ComplexityRoot.QueryExistingPerformerResult.Edits == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryExistingPerformerResult.Edits(childComplexity), true\n\tcase \"QueryExistingPerformerResult.performers\":\n\t\tif e.ComplexityRoot.QueryExistingPerformerResult.Performers == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryExistingPerformerResult.Performers(childComplexity), true\n\n\tcase \"QueryExistingSceneResult.edits\":\n\t\tif e.ComplexityRoot.QueryExistingSceneResult.Edits == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryExistingSceneResult.Edits(childComplexity), true\n\tcase \"QueryExistingSceneResult.scenes\":\n\t\tif e.ComplexityRoot.QueryExistingSceneResult.Scenes == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryExistingSceneResult.Scenes(childComplexity), true\n\n\tcase \"QueryModAuditsResultType.audits\":\n\t\tif e.ComplexityRoot.QueryModAuditsResultType.Audits == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryModAuditsResultType.Audits(childComplexity), true\n\tcase \"QueryModAuditsResultType.count\":\n\t\tif e.ComplexityRoot.QueryModAuditsResultType.Count == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryModAuditsResultType.Count(childComplexity), true\n\n\tcase \"QueryNotificationsResult.count\":\n\t\tif e.ComplexityRoot.QueryNotificationsResult.Count == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryNotificationsResult.Count(childComplexity), true\n\tcase \"QueryNotificationsResult.notifications\":\n\t\tif e.ComplexityRoot.QueryNotificationsResult.Notifications == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryNotificationsResult.Notifications(childComplexity), true\n\n\tcase \"QueryPerformersResultType.count\":\n\t\tif e.ComplexityRoot.QueryPerformersResultType.Count == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryPerformersResultType.Count(childComplexity), true\n\tcase \"QueryPerformersResultType.facets\":\n\t\tif e.ComplexityRoot.QueryPerformersResultType.Facets == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryPerformersResultType.Facets(childComplexity), true\n\tcase \"QueryPerformersResultType.performers\":\n\t\tif e.ComplexityRoot.QueryPerformersResultType.Performers == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryPerformersResultType.Performers(childComplexity), true\n\n\tcase \"QueryScenesResultType.count\":\n\t\tif e.ComplexityRoot.QueryScenesResultType.Count == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryScenesResultType.Count(childComplexity), true\n\tcase \"QueryScenesResultType.scenes\":\n\t\tif e.ComplexityRoot.QueryScenesResultType.Scenes == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryScenesResultType.Scenes(childComplexity), true\n\n\tcase \"QuerySitesResultType.count\":\n\t\tif e.ComplexityRoot.QuerySitesResultType.Count == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QuerySitesResultType.Count(childComplexity), true\n\tcase \"QuerySitesResultType.sites\":\n\t\tif e.ComplexityRoot.QuerySitesResultType.Sites == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QuerySitesResultType.Sites(childComplexity), true\n\n\tcase \"QueryStudiosResultType.count\":\n\t\tif e.ComplexityRoot.QueryStudiosResultType.Count == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryStudiosResultType.Count(childComplexity), true\n\tcase \"QueryStudiosResultType.studios\":\n\t\tif e.ComplexityRoot.QueryStudiosResultType.Studios == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryStudiosResultType.Studios(childComplexity), true\n\n\tcase \"QueryTagCategoriesResultType.count\":\n\t\tif e.ComplexityRoot.QueryTagCategoriesResultType.Count == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryTagCategoriesResultType.Count(childComplexity), true\n\tcase \"QueryTagCategoriesResultType.tag_categories\":\n\t\tif e.ComplexityRoot.QueryTagCategoriesResultType.TagCategories == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryTagCategoriesResultType.TagCategories(childComplexity), true\n\n\tcase \"QueryTagsResultType.count\":\n\t\tif e.ComplexityRoot.QueryTagsResultType.Count == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryTagsResultType.Count(childComplexity), true\n\tcase \"QueryTagsResultType.tags\":\n\t\tif e.ComplexityRoot.QueryTagsResultType.Tags == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryTagsResultType.Tags(childComplexity), true\n\n\tcase \"QueryUsersResultType.count\":\n\t\tif e.ComplexityRoot.QueryUsersResultType.Count == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryUsersResultType.Count(childComplexity), true\n\tcase \"QueryUsersResultType.users\":\n\t\tif e.ComplexityRoot.QueryUsersResultType.Users == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.QueryUsersResultType.Users(childComplexity), true\n\n\tcase \"Scene.code\":\n\t\tif e.ComplexityRoot.Scene.Code == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Code(childComplexity), true\n\tcase \"Scene.created\":\n\t\tif e.ComplexityRoot.Scene.Created == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Created(childComplexity), true\n\tcase \"Scene.date\":\n\t\tif e.ComplexityRoot.Scene.Date == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Date(childComplexity), true\n\tcase \"Scene.deleted\":\n\t\tif e.ComplexityRoot.Scene.Deleted == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Deleted(childComplexity), true\n\tcase \"Scene.details\":\n\t\tif e.ComplexityRoot.Scene.Details == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Details(childComplexity), true\n\tcase \"Scene.director\":\n\t\tif e.ComplexityRoot.Scene.Director == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Director(childComplexity), true\n\tcase \"Scene.duration\":\n\t\tif e.ComplexityRoot.Scene.Duration == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Duration(childComplexity), true\n\tcase \"Scene.edits\":\n\t\tif e.ComplexityRoot.Scene.Edits == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Edits(childComplexity), true\n\tcase \"Scene.fingerprints\":\n\t\tif e.ComplexityRoot.Scene.Fingerprints == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Scene_fingerprints_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Fingerprints(childComplexity, args[\"is_submitted\"].(*bool)), true\n\tcase \"Scene.id\":\n\t\tif e.ComplexityRoot.Scene.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.ID(childComplexity), true\n\tcase \"Scene.images\":\n\t\tif e.ComplexityRoot.Scene.Images == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Images(childComplexity), true\n\tcase \"Scene.performers\":\n\t\tif e.ComplexityRoot.Scene.Performers == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Performers(childComplexity), true\n\tcase \"Scene.production_date\":\n\t\tif e.ComplexityRoot.Scene.ProductionDate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.ProductionDate(childComplexity), true\n\tcase \"Scene.release_date\":\n\t\tif e.ComplexityRoot.Scene.ReleaseDate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.ReleaseDate(childComplexity), true\n\tcase \"Scene.studio\":\n\t\tif e.ComplexityRoot.Scene.Studio == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Studio(childComplexity), true\n\tcase \"Scene.tags\":\n\t\tif e.ComplexityRoot.Scene.Tags == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Tags(childComplexity), true\n\tcase \"Scene.title\":\n\t\tif e.ComplexityRoot.Scene.Title == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Title(childComplexity), true\n\tcase \"Scene.updated\":\n\t\tif e.ComplexityRoot.Scene.Updated == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Updated(childComplexity), true\n\tcase \"Scene.urls\":\n\t\tif e.ComplexityRoot.Scene.Urls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Scene.Urls(childComplexity), true\n\n\tcase \"SceneDraft.code\":\n\t\tif e.ComplexityRoot.SceneDraft.Code == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneDraft.Code(childComplexity), true\n\tcase \"SceneDraft.date\":\n\t\tif e.ComplexityRoot.SceneDraft.Date == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneDraft.Date(childComplexity), true\n\tcase \"SceneDraft.details\":\n\t\tif e.ComplexityRoot.SceneDraft.Details == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneDraft.Details(childComplexity), true\n\tcase \"SceneDraft.director\":\n\t\tif e.ComplexityRoot.SceneDraft.Director == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneDraft.Director(childComplexity), true\n\tcase \"SceneDraft.fingerprints\":\n\t\tif e.ComplexityRoot.SceneDraft.Fingerprints == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneDraft.Fingerprints(childComplexity), true\n\tcase \"SceneDraft.id\":\n\t\tif e.ComplexityRoot.SceneDraft.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneDraft.ID(childComplexity), true\n\tcase \"SceneDraft.image\":\n\t\tif e.ComplexityRoot.SceneDraft.Image == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneDraft.Image(childComplexity), true\n\tcase \"SceneDraft.performers\":\n\t\tif e.ComplexityRoot.SceneDraft.Performers == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneDraft.Performers(childComplexity), true\n\tcase \"SceneDraft.production_date\":\n\t\tif e.ComplexityRoot.SceneDraft.ProductionDate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneDraft.ProductionDate(childComplexity), true\n\tcase \"SceneDraft.studio\":\n\t\tif e.ComplexityRoot.SceneDraft.Studio == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneDraft.Studio(childComplexity), true\n\tcase \"SceneDraft.tags\":\n\t\tif e.ComplexityRoot.SceneDraft.Tags == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneDraft.Tags(childComplexity), true\n\tcase \"SceneDraft.title\":\n\t\tif e.ComplexityRoot.SceneDraft.Title == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneDraft.Title(childComplexity), true\n\tcase \"SceneDraft.urls\":\n\t\tif e.ComplexityRoot.SceneDraft.URLs == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneDraft.URLs(childComplexity), true\n\n\tcase \"SceneEdit.added_fingerprints\":\n\t\tif e.ComplexityRoot.SceneEdit.AddedFingerprints == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.AddedFingerprints(childComplexity), true\n\tcase \"SceneEdit.added_images\":\n\t\tif e.ComplexityRoot.SceneEdit.AddedImages == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.AddedImages(childComplexity), true\n\tcase \"SceneEdit.added_performers\":\n\t\tif e.ComplexityRoot.SceneEdit.AddedPerformers == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.AddedPerformers(childComplexity), true\n\tcase \"SceneEdit.added_tags\":\n\t\tif e.ComplexityRoot.SceneEdit.AddedTags == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.AddedTags(childComplexity), true\n\tcase \"SceneEdit.added_urls\":\n\t\tif e.ComplexityRoot.SceneEdit.AddedUrls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.AddedUrls(childComplexity), true\n\tcase \"SceneEdit.code\":\n\t\tif e.ComplexityRoot.SceneEdit.Code == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.Code(childComplexity), true\n\tcase \"SceneEdit.date\":\n\t\tif e.ComplexityRoot.SceneEdit.Date == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.Date(childComplexity), true\n\tcase \"SceneEdit.details\":\n\t\tif e.ComplexityRoot.SceneEdit.Details == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.Details(childComplexity), true\n\tcase \"SceneEdit.director\":\n\t\tif e.ComplexityRoot.SceneEdit.Director == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.Director(childComplexity), true\n\tcase \"SceneEdit.draft_id\":\n\t\tif e.ComplexityRoot.SceneEdit.DraftID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.DraftID(childComplexity), true\n\tcase \"SceneEdit.duration\":\n\t\tif e.ComplexityRoot.SceneEdit.Duration == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.Duration(childComplexity), true\n\tcase \"SceneEdit.fingerprints\":\n\t\tif e.ComplexityRoot.SceneEdit.Fingerprints == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.Fingerprints(childComplexity), true\n\tcase \"SceneEdit.images\":\n\t\tif e.ComplexityRoot.SceneEdit.Images == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.Images(childComplexity), true\n\tcase \"SceneEdit.performers\":\n\t\tif e.ComplexityRoot.SceneEdit.Performers == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.Performers(childComplexity), true\n\tcase \"SceneEdit.production_date\":\n\t\tif e.ComplexityRoot.SceneEdit.ProductionDate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.ProductionDate(childComplexity), true\n\tcase \"SceneEdit.removed_fingerprints\":\n\t\tif e.ComplexityRoot.SceneEdit.RemovedFingerprints == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.RemovedFingerprints(childComplexity), true\n\tcase \"SceneEdit.removed_images\":\n\t\tif e.ComplexityRoot.SceneEdit.RemovedImages == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.RemovedImages(childComplexity), true\n\tcase \"SceneEdit.removed_performers\":\n\t\tif e.ComplexityRoot.SceneEdit.RemovedPerformers == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.RemovedPerformers(childComplexity), true\n\tcase \"SceneEdit.removed_tags\":\n\t\tif e.ComplexityRoot.SceneEdit.RemovedTags == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.RemovedTags(childComplexity), true\n\tcase \"SceneEdit.removed_urls\":\n\t\tif e.ComplexityRoot.SceneEdit.RemovedUrls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.RemovedUrls(childComplexity), true\n\tcase \"SceneEdit.studio\":\n\t\tif e.ComplexityRoot.SceneEdit.Studio == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.Studio(childComplexity), true\n\tcase \"SceneEdit.tags\":\n\t\tif e.ComplexityRoot.SceneEdit.Tags == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.Tags(childComplexity), true\n\tcase \"SceneEdit.title\":\n\t\tif e.ComplexityRoot.SceneEdit.Title == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.Title(childComplexity), true\n\tcase \"SceneEdit.urls\":\n\t\tif e.ComplexityRoot.SceneEdit.Urls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.SceneEdit.Urls(childComplexity), true\n\n\tcase \"Site.created\":\n\t\tif e.ComplexityRoot.Site.Created == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Site.Created(childComplexity), true\n\tcase \"Site.description\":\n\t\tif e.ComplexityRoot.Site.Description == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Site.Description(childComplexity), true\n\tcase \"Site.id\":\n\t\tif e.ComplexityRoot.Site.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Site.ID(childComplexity), true\n\tcase \"Site.icon\":\n\t\tif e.ComplexityRoot.Site.Icon == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Site.Icon(childComplexity), true\n\tcase \"Site.name\":\n\t\tif e.ComplexityRoot.Site.Name == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Site.Name(childComplexity), true\n\tcase \"Site.regex\":\n\t\tif e.ComplexityRoot.Site.Regex == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Site.Regex(childComplexity), true\n\tcase \"Site.url\":\n\t\tif e.ComplexityRoot.Site.URL == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Site.URL(childComplexity), true\n\tcase \"Site.updated\":\n\t\tif e.ComplexityRoot.Site.Updated == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Site.Updated(childComplexity), true\n\tcase \"Site.valid_types\":\n\t\tif e.ComplexityRoot.Site.ValidTypes == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Site.ValidTypes(childComplexity), true\n\n\tcase \"StashBoxConfig.edit_update_limit\":\n\t\tif e.ComplexityRoot.StashBoxConfig.EditUpdateLimit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StashBoxConfig.EditUpdateLimit(childComplexity), true\n\tcase \"StashBoxConfig.guidelines_url\":\n\t\tif e.ComplexityRoot.StashBoxConfig.GuidelinesURL == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StashBoxConfig.GuidelinesURL(childComplexity), true\n\tcase \"StashBoxConfig.host_url\":\n\t\tif e.ComplexityRoot.StashBoxConfig.HostURL == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StashBoxConfig.HostURL(childComplexity), true\n\tcase \"StashBoxConfig.min_destructive_voting_period\":\n\t\tif e.ComplexityRoot.StashBoxConfig.MinDestructiveVotingPeriod == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StashBoxConfig.MinDestructiveVotingPeriod(childComplexity), true\n\tcase \"StashBoxConfig.require_activation\":\n\t\tif e.ComplexityRoot.StashBoxConfig.RequireActivation == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StashBoxConfig.RequireActivation(childComplexity), true\n\tcase \"StashBoxConfig.require_invite\":\n\t\tif e.ComplexityRoot.StashBoxConfig.RequireInvite == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StashBoxConfig.RequireInvite(childComplexity), true\n\tcase \"StashBoxConfig.require_scene_draft\":\n\t\tif e.ComplexityRoot.StashBoxConfig.RequireSceneDraft == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StashBoxConfig.RequireSceneDraft(childComplexity), true\n\tcase \"StashBoxConfig.require_tag_role\":\n\t\tif e.ComplexityRoot.StashBoxConfig.RequireTagRole == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StashBoxConfig.RequireTagRole(childComplexity), true\n\tcase \"StashBoxConfig.vote_application_threshold\":\n\t\tif e.ComplexityRoot.StashBoxConfig.VoteApplicationThreshold == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StashBoxConfig.VoteApplicationThreshold(childComplexity), true\n\tcase \"StashBoxConfig.vote_cron_interval\":\n\t\tif e.ComplexityRoot.StashBoxConfig.VoteCronInterval == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StashBoxConfig.VoteCronInterval(childComplexity), true\n\tcase \"StashBoxConfig.vote_promotion_threshold\":\n\t\tif e.ComplexityRoot.StashBoxConfig.VotePromotionThreshold == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StashBoxConfig.VotePromotionThreshold(childComplexity), true\n\tcase \"StashBoxConfig.voting_period\":\n\t\tif e.ComplexityRoot.StashBoxConfig.VotingPeriod == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StashBoxConfig.VotingPeriod(childComplexity), true\n\n\tcase \"Studio.aliases\":\n\t\tif e.ComplexityRoot.Studio.Aliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Studio.Aliases(childComplexity), true\n\tcase \"Studio.child_studios\":\n\t\tif e.ComplexityRoot.Studio.ChildStudios == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Studio.ChildStudios(childComplexity), true\n\tcase \"Studio.created\":\n\t\tif e.ComplexityRoot.Studio.Created == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Studio.Created(childComplexity), true\n\tcase \"Studio.deleted\":\n\t\tif e.ComplexityRoot.Studio.Deleted == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Studio.Deleted(childComplexity), true\n\tcase \"Studio.id\":\n\t\tif e.ComplexityRoot.Studio.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Studio.ID(childComplexity), true\n\tcase \"Studio.images\":\n\t\tif e.ComplexityRoot.Studio.Images == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Studio.Images(childComplexity), true\n\tcase \"Studio.is_favorite\":\n\t\tif e.ComplexityRoot.Studio.IsFavorite == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Studio.IsFavorite(childComplexity), true\n\tcase \"Studio.name\":\n\t\tif e.ComplexityRoot.Studio.Name == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Studio.Name(childComplexity), true\n\tcase \"Studio.parent\":\n\t\tif e.ComplexityRoot.Studio.Parent == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Studio.Parent(childComplexity), true\n\tcase \"Studio.performers\":\n\t\tif e.ComplexityRoot.Studio.Performers == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Studio_performers_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Studio.Performers(childComplexity, args[\"input\"].(PerformerQueryInput)), true\n\tcase \"Studio.sub_studios\":\n\t\tif e.ComplexityRoot.Studio.SubStudios == nil {\n\t\t\tbreak\n\t\t}\n\n\t\targs, err := ec.field_Studio_sub_studios_args(ctx, rawArgs)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\treturn e.ComplexityRoot.Studio.SubStudios(childComplexity, args[\"input\"].(*StudioQueryInput)), true\n\tcase \"Studio.updated\":\n\t\tif e.ComplexityRoot.Studio.Updated == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Studio.Updated(childComplexity), true\n\tcase \"Studio.urls\":\n\t\tif e.ComplexityRoot.Studio.Urls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Studio.Urls(childComplexity), true\n\n\tcase \"StudioEdit.added_aliases\":\n\t\tif e.ComplexityRoot.StudioEdit.AddedAliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StudioEdit.AddedAliases(childComplexity), true\n\tcase \"StudioEdit.added_images\":\n\t\tif e.ComplexityRoot.StudioEdit.AddedImages == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StudioEdit.AddedImages(childComplexity), true\n\tcase \"StudioEdit.added_urls\":\n\t\tif e.ComplexityRoot.StudioEdit.AddedUrls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StudioEdit.AddedUrls(childComplexity), true\n\tcase \"StudioEdit.images\":\n\t\tif e.ComplexityRoot.StudioEdit.Images == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StudioEdit.Images(childComplexity), true\n\tcase \"StudioEdit.name\":\n\t\tif e.ComplexityRoot.StudioEdit.Name == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StudioEdit.Name(childComplexity), true\n\tcase \"StudioEdit.parent\":\n\t\tif e.ComplexityRoot.StudioEdit.Parent == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StudioEdit.Parent(childComplexity), true\n\tcase \"StudioEdit.removed_aliases\":\n\t\tif e.ComplexityRoot.StudioEdit.RemovedAliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StudioEdit.RemovedAliases(childComplexity), true\n\tcase \"StudioEdit.removed_images\":\n\t\tif e.ComplexityRoot.StudioEdit.RemovedImages == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StudioEdit.RemovedImages(childComplexity), true\n\tcase \"StudioEdit.removed_urls\":\n\t\tif e.ComplexityRoot.StudioEdit.RemovedUrls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StudioEdit.RemovedUrls(childComplexity), true\n\tcase \"StudioEdit.urls\":\n\t\tif e.ComplexityRoot.StudioEdit.Urls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.StudioEdit.Urls(childComplexity), true\n\n\tcase \"Tag.aliases\":\n\t\tif e.ComplexityRoot.Tag.Aliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Tag.Aliases(childComplexity), true\n\tcase \"Tag.category\":\n\t\tif e.ComplexityRoot.Tag.Category == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Tag.Category(childComplexity), true\n\tcase \"Tag.created\":\n\t\tif e.ComplexityRoot.Tag.Created == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Tag.Created(childComplexity), true\n\tcase \"Tag.deleted\":\n\t\tif e.ComplexityRoot.Tag.Deleted == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Tag.Deleted(childComplexity), true\n\tcase \"Tag.description\":\n\t\tif e.ComplexityRoot.Tag.Description == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Tag.Description(childComplexity), true\n\tcase \"Tag.edits\":\n\t\tif e.ComplexityRoot.Tag.Edits == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Tag.Edits(childComplexity), true\n\tcase \"Tag.id\":\n\t\tif e.ComplexityRoot.Tag.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Tag.ID(childComplexity), true\n\tcase \"Tag.name\":\n\t\tif e.ComplexityRoot.Tag.Name == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Tag.Name(childComplexity), true\n\tcase \"Tag.updated\":\n\t\tif e.ComplexityRoot.Tag.Updated == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Tag.Updated(childComplexity), true\n\n\tcase \"TagCategory.description\":\n\t\tif e.ComplexityRoot.TagCategory.Description == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.TagCategory.Description(childComplexity), true\n\tcase \"TagCategory.group\":\n\t\tif e.ComplexityRoot.TagCategory.Group == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.TagCategory.Group(childComplexity), true\n\tcase \"TagCategory.id\":\n\t\tif e.ComplexityRoot.TagCategory.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.TagCategory.ID(childComplexity), true\n\tcase \"TagCategory.name\":\n\t\tif e.ComplexityRoot.TagCategory.Name == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.TagCategory.Name(childComplexity), true\n\n\tcase \"TagEdit.added_aliases\":\n\t\tif e.ComplexityRoot.TagEdit.AddedAliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.TagEdit.AddedAliases(childComplexity), true\n\tcase \"TagEdit.aliases\":\n\t\tif e.ComplexityRoot.TagEdit.Aliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.TagEdit.Aliases(childComplexity), true\n\tcase \"TagEdit.category\":\n\t\tif e.ComplexityRoot.TagEdit.Category == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.TagEdit.Category(childComplexity), true\n\tcase \"TagEdit.description\":\n\t\tif e.ComplexityRoot.TagEdit.Description == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.TagEdit.Description(childComplexity), true\n\tcase \"TagEdit.name\":\n\t\tif e.ComplexityRoot.TagEdit.Name == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.TagEdit.Name(childComplexity), true\n\tcase \"TagEdit.removed_aliases\":\n\t\tif e.ComplexityRoot.TagEdit.RemovedAliases == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.TagEdit.RemovedAliases(childComplexity), true\n\n\tcase \"URL.site\":\n\t\tif e.ComplexityRoot.URL.Site == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.URL.Site(childComplexity), true\n\tcase \"URL.type\":\n\t\tif e.ComplexityRoot.URL.Type == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.URL.Type(childComplexity), true\n\tcase \"URL.url\":\n\t\tif e.ComplexityRoot.URL.URL == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.URL.URL(childComplexity), true\n\n\tcase \"UpdatedEdit.edit\":\n\t\tif e.ComplexityRoot.UpdatedEdit.Edit == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.UpdatedEdit.Edit(childComplexity), true\n\n\tcase \"User.api_calls\":\n\t\tif e.ComplexityRoot.User.APICalls == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.User.APICalls(childComplexity), true\n\tcase \"User.api_key\":\n\t\tif e.ComplexityRoot.User.APIKey == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.User.APIKey(childComplexity), true\n\tcase \"User.active_invite_codes\":\n\t\tif e.ComplexityRoot.User.ActiveInviteCodes == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.User.ActiveInviteCodes(childComplexity), true\n\tcase \"User.edit_count\":\n\t\tif e.ComplexityRoot.User.EditCount == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.User.EditCount(childComplexity), true\n\tcase \"User.email\":\n\t\tif e.ComplexityRoot.User.Email == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.User.Email(childComplexity), true\n\tcase \"User.id\":\n\t\tif e.ComplexityRoot.User.ID == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.User.ID(childComplexity), true\n\tcase \"User.invite_codes\":\n\t\tif e.ComplexityRoot.User.InviteCodes == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.User.InviteCodes(childComplexity), true\n\tcase \"User.invite_tokens\":\n\t\tif e.ComplexityRoot.User.InviteTokens == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.User.InviteTokens(childComplexity), true\n\tcase \"User.invited_by\":\n\t\tif e.ComplexityRoot.User.InvitedBy == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.User.InvitedBy(childComplexity), true\n\tcase \"User.name\":\n\t\tif e.ComplexityRoot.User.Name == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.User.Name(childComplexity), true\n\tcase \"User.notification_subscriptions\":\n\t\tif e.ComplexityRoot.User.NotificationSubscriptions == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.User.NotificationSubscriptions(childComplexity), true\n\tcase \"User.roles\":\n\t\tif e.ComplexityRoot.User.Roles == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.User.Roles(childComplexity), true\n\tcase \"User.vote_count\":\n\t\tif e.ComplexityRoot.User.VoteCount == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.User.VoteCount(childComplexity), true\n\n\tcase \"UserEditCount.accepted\":\n\t\tif e.ComplexityRoot.UserEditCount.Accepted == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.UserEditCount.Accepted(childComplexity), true\n\tcase \"UserEditCount.canceled\":\n\t\tif e.ComplexityRoot.UserEditCount.Canceled == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.UserEditCount.Canceled(childComplexity), true\n\tcase \"UserEditCount.failed\":\n\t\tif e.ComplexityRoot.UserEditCount.Failed == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.UserEditCount.Failed(childComplexity), true\n\tcase \"UserEditCount.immediate_accepted\":\n\t\tif e.ComplexityRoot.UserEditCount.ImmediateAccepted == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.UserEditCount.ImmediateAccepted(childComplexity), true\n\tcase \"UserEditCount.immediate_rejected\":\n\t\tif e.ComplexityRoot.UserEditCount.ImmediateRejected == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.UserEditCount.ImmediateRejected(childComplexity), true\n\tcase \"UserEditCount.pending\":\n\t\tif e.ComplexityRoot.UserEditCount.Pending == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.UserEditCount.Pending(childComplexity), true\n\tcase \"UserEditCount.rejected\":\n\t\tif e.ComplexityRoot.UserEditCount.Rejected == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.UserEditCount.Rejected(childComplexity), true\n\n\tcase \"UserVoteCount.abstain\":\n\t\tif e.ComplexityRoot.UserVoteCount.Abstain == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.UserVoteCount.Abstain(childComplexity), true\n\tcase \"UserVoteCount.accept\":\n\t\tif e.ComplexityRoot.UserVoteCount.Accept == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.UserVoteCount.Accept(childComplexity), true\n\tcase \"UserVoteCount.immediate_accept\":\n\t\tif e.ComplexityRoot.UserVoteCount.ImmediateAccept == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.UserVoteCount.ImmediateAccept(childComplexity), true\n\tcase \"UserVoteCount.immediate_reject\":\n\t\tif e.ComplexityRoot.UserVoteCount.ImmediateReject == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.UserVoteCount.ImmediateReject(childComplexity), true\n\tcase \"UserVoteCount.reject\":\n\t\tif e.ComplexityRoot.UserVoteCount.Reject == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.UserVoteCount.Reject(childComplexity), true\n\n\tcase \"Version.build_time\":\n\t\tif e.ComplexityRoot.Version.BuildTime == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Version.BuildTime(childComplexity), true\n\tcase \"Version.build_type\":\n\t\tif e.ComplexityRoot.Version.BuildType == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Version.BuildType(childComplexity), true\n\tcase \"Version.hash\":\n\t\tif e.ComplexityRoot.Version.Hash == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Version.Hash(childComplexity), true\n\tcase \"Version.version\":\n\t\tif e.ComplexityRoot.Version.Version == nil {\n\t\t\tbreak\n\t\t}\n\n\t\treturn e.ComplexityRoot.Version.Version(childComplexity), true\n\n\t}\n\treturn 0, false\n}\n\nfunc (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler {\n\topCtx := graphql.GetOperationContext(ctx)\n\tec := newExecutionContext(opCtx, e, make(chan graphql.DeferredResult))\n\tinputUnmarshalMap := graphql.BuildUnmarshalerMap(\n\t\tec.unmarshalInputActivateNewUserInput,\n\t\tec.unmarshalInputAmendEditInput,\n\t\tec.unmarshalInputAmendItemRemoval,\n\t\tec.unmarshalInputApplyEditInput,\n\t\tec.unmarshalInputBodyModificationCriterionInput,\n\t\tec.unmarshalInputBodyModificationInput,\n\t\tec.unmarshalInputBreastTypeCriterionInput,\n\t\tec.unmarshalInputCancelEditInput,\n\t\tec.unmarshalInputDateCriterionInput,\n\t\tec.unmarshalInputDeleteEditInput,\n\t\tec.unmarshalInputDeleteFingerprintSubmissionsInput,\n\t\tec.unmarshalInputDraftEntityInput,\n\t\tec.unmarshalInputEditCommentInput,\n\t\tec.unmarshalInputEditInput,\n\t\tec.unmarshalInputEditQueryInput,\n\t\tec.unmarshalInputEditVoteInput,\n\t\tec.unmarshalInputEyeColorCriterionInput,\n\t\tec.unmarshalInputFingerprintBatchSubmission,\n\t\tec.unmarshalInputFingerprintEditInput,\n\t\tec.unmarshalInputFingerprintInput,\n\t\tec.unmarshalInputFingerprintQueryInput,\n\t\tec.unmarshalInputFingerprintSubmission,\n\t\tec.unmarshalInputGenerateInviteCodeInput,\n\t\tec.unmarshalInputGrantInviteInput,\n\t\tec.unmarshalInputHairColorCriterionInput,\n\t\tec.unmarshalInputIDCriterionInput,\n\t\tec.unmarshalInputImageCreateInput,\n\t\tec.unmarshalInputImageDestroyInput,\n\t\tec.unmarshalInputImageUpdateInput,\n\t\tec.unmarshalInputIntCriterionInput,\n\t\tec.unmarshalInputMarkNotificationReadInput,\n\t\tec.unmarshalInputModAuditQueryInput,\n\t\tec.unmarshalInputMoveFingerprintSubmissionsInput,\n\t\tec.unmarshalInputMultiIDCriterionInput,\n\t\tec.unmarshalInputMultiStringCriterionInput,\n\t\tec.unmarshalInputNewUserInput,\n\t\tec.unmarshalInputPerformerAppearanceInput,\n\t\tec.unmarshalInputPerformerCreateInput,\n\t\tec.unmarshalInputPerformerDestroyInput,\n\t\tec.unmarshalInputPerformerDraftInput,\n\t\tec.unmarshalInputPerformerEditDetailsInput,\n\t\tec.unmarshalInputPerformerEditInput,\n\t\tec.unmarshalInputPerformerEditOptionsInput,\n\t\tec.unmarshalInputPerformerQueryInput,\n\t\tec.unmarshalInputPerformerScenesInput,\n\t\tec.unmarshalInputPerformerSearchFilter,\n\t\tec.unmarshalInputPerformerUpdateInput,\n\t\tec.unmarshalInputQueryExistingPerformerInput,\n\t\tec.unmarshalInputQueryExistingSceneInput,\n\t\tec.unmarshalInputQueryNotificationsInput,\n\t\tec.unmarshalInputResetPasswordInput,\n\t\tec.unmarshalInputRevokeInviteInput,\n\t\tec.unmarshalInputRoleCriterionInput,\n\t\tec.unmarshalInputSceneCreateInput,\n\t\tec.unmarshalInputSceneDestroyInput,\n\t\tec.unmarshalInputSceneDraftInput,\n\t\tec.unmarshalInputSceneEditDetailsInput,\n\t\tec.unmarshalInputSceneEditInput,\n\t\tec.unmarshalInputSceneQueryInput,\n\t\tec.unmarshalInputSceneUpdateInput,\n\t\tec.unmarshalInputSiteCreateInput,\n\t\tec.unmarshalInputSiteDestroyInput,\n\t\tec.unmarshalInputSiteUpdateInput,\n\t\tec.unmarshalInputStringCriterionInput,\n\t\tec.unmarshalInputStudioCreateInput,\n\t\tec.unmarshalInputStudioDestroyInput,\n\t\tec.unmarshalInputStudioEditDetailsInput,\n\t\tec.unmarshalInputStudioEditInput,\n\t\tec.unmarshalInputStudioQueryInput,\n\t\tec.unmarshalInputStudioUpdateInput,\n\t\tec.unmarshalInputTagCategoryCreateInput,\n\t\tec.unmarshalInputTagCategoryDestroyInput,\n\t\tec.unmarshalInputTagCategoryUpdateInput,\n\t\tec.unmarshalInputTagCreateInput,\n\t\tec.unmarshalInputTagDestroyInput,\n\t\tec.unmarshalInputTagEditDetailsInput,\n\t\tec.unmarshalInputTagEditInput,\n\t\tec.unmarshalInputTagQueryInput,\n\t\tec.unmarshalInputTagUpdateInput,\n\t\tec.unmarshalInputURLInput,\n\t\tec.unmarshalInputUserChangeEmailInput,\n\t\tec.unmarshalInputUserChangePasswordInput,\n\t\tec.unmarshalInputUserCreateInput,\n\t\tec.unmarshalInputUserDestroyInput,\n\t\tec.unmarshalInputUserQueryInput,\n\t\tec.unmarshalInputUserUpdateInput,\n\t)\n\tfirst := true\n\n\tswitch opCtx.Operation.Operation {\n\tcase ast.Query:\n\t\treturn func(ctx context.Context) *graphql.Response {\n\t\t\tvar response graphql.Response\n\t\t\tvar data graphql.Marshaler\n\t\t\tif first {\n\t\t\t\tfirst = false\n\t\t\t\tctx = graphql.WithUnmarshalerMap(ctx, inputUnmarshalMap)\n\t\t\t\tdata = ec._Query(ctx, opCtx.Operation.SelectionSet)\n\t\t\t} else {\n\t\t\t\tif atomic.LoadInt32(&ec.PendingDeferred) > 0 {\n\t\t\t\t\tresult := <-ec.DeferredResults\n\t\t\t\t\tatomic.AddInt32(&ec.PendingDeferred, -1)\n\t\t\t\t\tdata = result.Result\n\t\t\t\t\tresponse.Path = result.Path\n\t\t\t\t\tresponse.Label = result.Label\n\t\t\t\t\tresponse.Errors = result.Errors\n\t\t\t\t} else {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\tresponse.Data = buf.Bytes()\n\t\t\tif atomic.LoadInt32(&ec.Deferred) > 0 {\n\t\t\t\thasNext := atomic.LoadInt32(&ec.PendingDeferred) > 0\n\t\t\t\tresponse.HasNext = &hasNext\n\t\t\t}\n\n\t\t\treturn &response\n\t\t}\n\tcase ast.Mutation:\n\t\treturn func(ctx context.Context) *graphql.Response {\n\t\t\tif !first {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tfirst = false\n\t\t\tctx = graphql.WithUnmarshalerMap(ctx, inputUnmarshalMap)\n\t\t\tdata := ec._Mutation(ctx, opCtx.Operation.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf.Bytes(),\n\t\t\t}\n\t\t}\n\n\tdefault:\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"unsupported GraphQL operation\"))\n\t}\n}\n\ntype executionContext struct {\n\t*graphql.ExecutionContextState[ResolverRoot, DirectiveRoot, ComplexityRoot]\n}\n\nfunc newExecutionContext(\n\topCtx *graphql.OperationContext,\n\texecSchema *executableSchema,\n\tdeferredResults chan graphql.DeferredResult,\n) executionContext {\n\treturn executionContext{\n\t\tExecutionContextState: graphql.NewExecutionContextState[ResolverRoot, DirectiveRoot, ComplexityRoot](\n\t\t\topCtx,\n\t\t\t(*graphql.ExecutableSchemaState[ResolverRoot, DirectiveRoot, ComplexityRoot])(execSchema),\n\t\t\tparsedSchema,\n\t\t\tdeferredResults,\n\t\t),\n\t}\n}\n\nvar sources = []*ast.Source{\n\t{Name: \"../../graphql/schema/types/config.graphql\", Input: `type StashBoxConfig {\n  host_url: String!\n  require_invite: Boolean!\n  require_activation: Boolean!\n  vote_promotion_threshold: Int\n  vote_application_threshold: Int!\n  voting_period: Int!\n  min_destructive_voting_period: Int!\n  vote_cron_interval: String!\n  guidelines_url: String!\n  require_scene_draft: Boolean!\n  edit_update_limit: Int!\n  require_tag_role: Boolean!\n}\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/draft.graphql\", Input: `type DraftSubmissionStatus {\n  id: ID\n}\n\ntype DraftEntity {\n  name: String!\n  id: ID\n}\n\ninput DraftEntityInput {\n  name: String!\n  id: ID\n}\n\ntype Draft {\n  id: ID!\n  created: Time!\n  expires: Time!\n  data: DraftData!\n}\n\nunion DraftData = SceneDraft | PerformerDraft\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/edit.graphql\", Input: `enum OperationEnum {\n    CREATE\n    MODIFY\n    DESTROY\n    MERGE\n}\n\nenum VoteTypeEnum {\n    ABSTAIN\n    ACCEPT\n    REJECT\n    \"\"\"Immediately accepts the edit - bypassing the vote\"\"\"\n    IMMEDIATE_ACCEPT\n    \"\"\"Immediately rejects the edit - bypassing the vote\"\"\"\n    IMMEDIATE_REJECT\n}\n\nenum VoteStatusEnum {\n    ACCEPTED\n    REJECTED\n    PENDING\n    IMMEDIATE_ACCEPTED\n    IMMEDIATE_REJECTED\n    FAILED\n    CANCELED\n}\n\ntype EditVote {\n    user: User\n    date: Time!\n    vote: VoteTypeEnum!\n}\n\ntype EditComment {\n    id: ID!\n    user: User\n    date: Time!\n    comment: String!\n    edit: Edit!\n}\n\nunion EditDetails = PerformerEdit | SceneEdit | StudioEdit | TagEdit\n\nenum TargetTypeEnum {\n    SCENE\n    STUDIO\n    PERFORMER\n    TAG\n}\n\nunion EditTarget = Performer | Scene | Studio | Tag\n\ntype Edit {\n    id: ID!\n    user: User\n    \"\"\"Object being edited - null if creating a new object\"\"\"\n    target: EditTarget\n    target_type: TargetTypeEnum!\n    \"\"\"Objects to merge with the target. Only applicable to merges\"\"\"\n    merge_sources: [EditTarget!]!\n    operation: OperationEnum!\n    bot: Boolean!\n    details: EditDetails\n    \"\"\"Previous state of fields being modified - null if operation is create or delete.\"\"\"\n    old_details: EditDetails\n    \"\"\"Entity specific options\"\"\"\n    options: PerformerEditOptions\n    comments: [EditComment!]!\n    votes: [EditVote!]!\n    \"\"\" = Accepted - Rejected\"\"\"\n    vote_count: Int!\n    \"\"\"Is the edit considered destructive.\"\"\"\n    destructive: Boolean!\n    status: VoteStatusEnum!\n    applied: Boolean!\n    update_count: Int!\n    updatable: Boolean!\n    created: Time!\n    updated: Time\n    closed: Time\n    expires: Time\n}\n\ninput EditInput {\n  \"\"\"Not required for create type\"\"\"\n  id: ID\n  operation: OperationEnum!\n  \"\"\"Only required for merge type\"\"\"\n  merge_source_ids: [ID!]\n  comment: String\n  \"\"\"Edit submitted by an automated script. Requires bot permission\"\"\"\n  bot: Boolean\n}\n\ninput EditVoteInput {\n    id: ID!\n    vote: VoteTypeEnum!\n}\n\ninput EditCommentInput {\n    id: ID!\n    comment: String!\n}\n\ntype QueryEditsResultType {\n  count: Int!\n  edits: [Edit!]!\n}\n\nenum EditSortEnum {\n  CREATED_AT\n  UPDATED_AT\n  CLOSED_AT\n}\n\nenum UserVotedFilterEnum {\n    ABSTAIN\n    ACCEPT\n    REJECT\n    NOT_VOTED\n}\n\ninput EditQueryInput {\n  \"\"\"Filter by user id\"\"\"\n  user_id: ID\n  \"\"\"Filter by status\"\"\"\n  status: VoteStatusEnum\n  \"\"\"Filter by operation\"\"\"\n  operation: OperationEnum\n  \"\"\"Filter by vote count\"\"\"\n  vote_count: IntCriterionInput\n  \"\"\"Filter by applied status\"\"\"\n  applied: Boolean\n  \"\"\"Filter by target type\"\"\"\n  target_type: TargetTypeEnum\n  \"\"\"Filter by target id\"\"\"\n  target_id: ID\n  \"\"\"Filter by favorite status\"\"\"\n  is_favorite: Boolean\n  \"\"\"Filter by user voted status\"\"\"\n  voted: UserVotedFilterEnum\n  \"\"\"Filter to bot edits only\"\"\"\n  is_bot: Boolean\n  \"\"\"Filter out user's own edits\"\"\"\n  include_user_submitted: Boolean\n\n  page: Int! = 1\n  per_page: Int! = 25\n  direction: SortDirectionEnum! = DESC\n  sort: EditSortEnum! = CREATED_AT\n}\n\ninput ApplyEditInput {\n    id: ID!\n}\ninput CancelEditInput {\n    id: ID!\n}\ninput DeleteEditInput {\n    id: ID!\n    reason: String!\n}\n\ninput AmendEditInput {\n    id: ID!\n    reason: String!\n    \"\"\"Fields to remove from the diff (e.g., [\"name\", \"disambiguation\"])\"\"\"\n    remove_fields: [String!]\n    \"\"\"Array items to remove from added arrays\"\"\"\n    remove_added_items: [AmendItemRemoval!]\n    \"\"\"Array items to remove from removed arrays\"\"\"\n    remove_removed_items: [AmendItemRemoval!]\n}\n\ninput AmendItemRemoval {\n    \"\"\"Field name (e.g., \"aliases\", \"urls\", \"images\")\"\"\"\n    field: String!\n    \"\"\"Indices to remove from the array\"\"\"\n    indices: [Int!]!\n}\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/filter.graphql\", Input: `input MultiIDCriterionInput {\n  value: [ID!]\n  modifier: CriterionModifier!\n}\n\ninput IDCriterionInput {\n  value: [ID!]!\n  modifier: CriterionModifier!\n}\n\ninput StringCriterionInput {\n  value: String!\n  modifier: CriterionModifier!\n}\n\ninput MultiStringCriterionInput {\n  value: [String!]!\n  modifier: CriterionModifier!\n}\n\ninput IntCriterionInput {\n  value: Int!\n  modifier: CriterionModifier!\n}\n\ninput DateCriterionInput {\n  value: Date!\n  modifier: CriterionModifier!\n}\n\nenum CriterionModifier {\n  \"\"\"=\"\"\"\n  EQUALS,\n  \"\"\"!=\"\"\"\n  NOT_EQUALS,\n  \"\"\">\"\"\"\n  GREATER_THAN,\n  \"\"\"<\"\"\"\n  LESS_THAN,\n  \"\"\"IS NULL\"\"\"\n  IS_NULL,\n  \"\"\"IS NOT NULL\"\"\"\n  NOT_NULL,\n  \"\"\"INCLUDES ALL\"\"\"\n  INCLUDES_ALL,\n  INCLUDES,\n  EXCLUDES,\n}`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/image.graphql\", Input: `scalar Upload\n\ntype Image {\n  id: ID!\n  url: String!\n  width: Int!\n  height: Int!\n}\n\ninput ImageCreateInput {\n  url: String\n  file: Upload\n}\n\ninput ImageUpdateInput {\n  id: ID!\n  url: String\n}\n\ninput ImageDestroyInput {\n  id: ID!\n}\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/misc.graphql\", Input: `scalar Date\nscalar DateTime\nscalar Time\nscalar FingerprintHash\n\nenum DateAccuracyEnum {\n  YEAR\n  MONTH\n  DAY\n}\n\ntype FuzzyDate {\n  date: Date!\n  accuracy: DateAccuracyEnum!\n}\n\nenum SortDirectionEnum {\n  ASC\n  DESC\n}\n\ntype URL {\n  url: String!\n  type: String! @deprecated(reason: \"Use the site field instead\")\n  site: Site!\n}\n\ninput URLInput {\n  url: String!\n  site_id: ID!\n}\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/mod_audit.graphql\", Input: `enum ModAuditActionEnum {\n  EDIT_DELETE\n  EDIT_AMENDMENT\n}\n\ntype ModAudit {\n  id: ID!\n  action: ModAuditActionEnum!\n  user: User\n  target_id: ID!\n  target_type: String!\n  data: String!\n  reason: String\n  created_at: Time!\n}\n\ntype QueryModAuditsResultType {\n  count: Int!\n  audits: [ModAudit!]!\n}\n\ninput ModAuditQueryInput {\n  page: Int! = 1\n  per_page: Int! = 25\n  action: ModAuditActionEnum\n  user_id: ID\n}\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/notifications.graphql\", Input: `type Notification {\n  created: Time!\n  read: Boolean!\n  data: NotificationData!\n}\n\nenum NotificationEnum {\n  FAVORITE_PERFORMER_SCENE\n  FAVORITE_PERFORMER_EDIT\n  FAVORITE_STUDIO_SCENE\n  FAVORITE_STUDIO_EDIT\n  COMMENT_OWN_EDIT\n  DOWNVOTE_OWN_EDIT\n  FAILED_OWN_EDIT\n  COMMENT_COMMENTED_EDIT\n  COMMENT_VOTED_EDIT\n  UPDATED_EDIT\n  FINGERPRINTED_SCENE_EDIT\n}\n\nunion NotificationData =\n   | FavoritePerformerScene\n   | FavoritePerformerEdit\n   | FavoriteStudioScene \n   | FavoriteStudioEdit\n   | CommentOwnEdit\n   | CommentCommentedEdit\n   | CommentVotedEdit\n   | DownvoteOwnEdit\n   | FailedOwnEdit\n   | UpdatedEdit\n   | FingerprintedSceneEdit\n\ntype FavoritePerformerScene {\n  scene: Scene!\n}\n\ntype FavoritePerformerEdit {\n  edit: Edit!\n}\n\ntype FavoriteStudioScene {\n  scene: Scene!\n}\n\ntype FavoriteStudioEdit {\n  edit: Edit!\n}\n\ntype CommentOwnEdit {\n  comment: EditComment!\n}\n\ntype DownvoteOwnEdit {\n  edit: Edit!\n}\n\ntype FailedOwnEdit {\n  edit: Edit!\n}\n\ntype CommentCommentedEdit {\n  comment: EditComment!\n}\n\ntype CommentVotedEdit {\n  comment: EditComment!\n}\n\ntype UpdatedEdit {\n  edit: Edit!\n}\n\ntype FingerprintedSceneEdit {\n  edit: Edit!\n}\n\ninput QueryNotificationsInput {\n  page: Int! = 1\n  per_page: Int! = 25\n  type: NotificationEnum\n  unread_only: Boolean\n}\n\ntype QueryNotificationsResult {\n  count: Int!\n  notifications: [Notification!]!\n}\n\ninput MarkNotificationReadInput {\n  type: NotificationEnum!\n  id: ID!\n}\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/performer.graphql\", Input: `enum GenderEnum {\n  MALE\n  FEMALE\n  TRANSGENDER_MALE\n  TRANSGENDER_FEMALE\n  INTERSEX\n  NON_BINARY\n}\n\nenum GenderFilterEnum {\n  UNKNOWN\n  MALE\n  FEMALE\n  TRANSGENDER_MALE\n  TRANSGENDER_FEMALE\n  INTERSEX\n  NON_BINARY\n}\n\nenum BreastTypeEnum {\n  NATURAL\n  FAKE\n  NA\n}\n\ntype Measurements {\n  cup_size: String\n  band_size: Int\n  waist: Int\n  hip: Int\n}\n\nenum EthnicityEnum {\n  CAUCASIAN\n  BLACK\n  ASIAN\n  INDIAN\n  LATIN\n  MIDDLE_EASTERN\n  MIXED\n  OTHER\n}\nenum EthnicityFilterEnum {\n  UNKNOWN\n  CAUCASIAN\n  BLACK\n  ASIAN\n  INDIAN\n  LATIN\n  MIDDLE_EASTERN\n  MIXED\n  OTHER\n}\n\nenum EyeColorEnum {\n  BLUE\n  BROWN\n  GREY\n  GREEN\n  HAZEL\n  RED\n}\n\nenum HairColorEnum {\n  BLONDE\n  BRUNETTE\n  BLACK\n  RED\n  AUBURN\n  GREY\n  BALD\n  VARIOUS\n  WHITE\n  OTHER\n}\n\ntype BodyModification {\n  location: String!\n  description: String\n}\n\ninput BodyModificationInput {\n  location: String!\n  description: String\n}\n\ntype Performer {\n  id: ID!\n  name: String!\n  disambiguation: String\n  aliases: [String!]!\n  gender: GenderEnum\n  urls: [URL!]!\n  birthdate: FuzzyDate @deprecated(reason: \"Please use ` + \"`\" + `birth_date` + \"`\" + `\")\n  birth_date: String\n  death_date: String\n  age: Int # resolver\n  ethnicity: EthnicityEnum\n  country: String\n  eye_color: EyeColorEnum\n  hair_color: HairColorEnum\n  \"\"\"Height in cm\"\"\"\n  height: Int\n  measurements: Measurements! @deprecated(reason: \"Use individual fields, cup/band/waist/hip_size\")\n  cup_size: String\n  band_size: Int\n  waist_size: Int\n  hip_size: Int\n  breast_type: BreastTypeEnum\n  career_start_year: Int\n  career_end_year: Int\n  tattoos: [BodyModification!]\n  piercings: [BodyModification!]\n  images: [Image!]!\n  deleted: Boolean!\n  edits: [Edit!]!\n  scene_count: Int!\n  scenes(input: PerformerScenesInput): [Scene!]!\n  \"\"\"IDs of performers that were merged into this one\"\"\"\n  merged_ids: [ID!]!\n  \"\"\"ID of performer that replaces this one\"\"\"\n  merged_into_id: ID\n  studios(studio_id: ID): [PerformerStudio!]!\n  is_favorite: Boolean!\n  created: Time!\n  updated: Time!\n}\n\ninput PerformerScenesInput {\n  \"\"\"Filter by another performer that also performs in the scenes\"\"\"\n  performed_with: ID\n\n  \"\"\"Filter by a studio\"\"\"\n  studio_id: ID\n\n  \"\"\"Filter by tags\"\"\"\n  tags: MultiIDCriterionInput\n}\n\ntype PerformerStudio {\n  studio: Studio!\n  scene_count: Int!\n}\n\ninput PerformerCreateInput {\n  name: String!\n  disambiguation: String\n  aliases: [String!]\n  gender: GenderEnum\n  urls: [URLInput!]\n  birthdate: String\n  deathdate: String\n  ethnicity: EthnicityEnum\n  country: String\n  eye_color: EyeColorEnum\n  hair_color: HairColorEnum\n  height: Int\n  cup_size: String\n  band_size: Int\n  waist_size: Int\n  hip_size: Int\n  breast_type: BreastTypeEnum\n  career_start_year: Int\n  career_end_year: Int\n  tattoos: [BodyModificationInput!]\n  piercings: [BodyModificationInput!]\n  image_ids: [ID!]\n  draft_id: ID\n}\n\ninput PerformerUpdateInput {\n  id: ID!\n  name: String\n  disambiguation: String\n  aliases: [String!]\n  gender: GenderEnum\n  urls: [URLInput!]\n  birthdate: String\n  deathdate: String\n  ethnicity: EthnicityEnum\n  country: String\n  eye_color: EyeColorEnum\n  hair_color: HairColorEnum\n  height: Int\n  cup_size: String\n  band_size: Int\n  waist_size: Int\n  hip_size: Int\n  breast_type: BreastTypeEnum\n  career_start_year: Int\n  career_end_year: Int\n  tattoos: [BodyModificationInput!]\n  piercings: [BodyModificationInput!]\n  image_ids: [ID!]\n}\n\ninput PerformerDestroyInput {\n  id: ID!\n}\n\ninput PerformerEditDetailsInput {\n  name: String\n  disambiguation: String\n  aliases: [String!]\n  gender: GenderEnum\n  urls: [URLInput!]\n  birthdate: String\n  deathdate: String\n  ethnicity: EthnicityEnum\n  country: String\n  eye_color: EyeColorEnum\n  hair_color: HairColorEnum\n  height: Int\n  cup_size: String\n  band_size: Int\n  waist_size: Int\n  hip_size: Int\n  breast_type: BreastTypeEnum\n  career_start_year: Int\n  career_end_year: Int\n  tattoos: [BodyModificationInput!]\n  piercings: [BodyModificationInput!]\n  image_ids: [ID!]\n  draft_id: ID\n}\n\ninput PerformerEditOptionsInput {\n  \"\"\"Set performer alias on scenes without alias to old name if name is changed\"\"\"\n  set_modify_aliases: Boolean = false\n  \"\"\"Set performer alias on scenes attached to merge sources to old name\"\"\"\n  set_merge_aliases: Boolean = true\n}\n\ninput PerformerEditInput {\n  edit: EditInput!\n  \"\"\"Not required for destroy type\"\"\"\n  details: PerformerEditDetailsInput\n  \"\"\"Controls aliases modification for merges and name modifications\"\"\"\n  options: PerformerEditOptionsInput\n}\n\ntype PerformerEdit {\n  name: String\n  disambiguation: String\n  added_aliases: [String!]\n  removed_aliases: [String!]\n  gender: GenderEnum\n  added_urls: [URL!]\n  removed_urls: [URL!]\n  birthdate: String\n  deathdate: String\n  ethnicity: EthnicityEnum\n  country: String\n  eye_color: EyeColorEnum\n  hair_color: HairColorEnum\n  \"\"\"Height in cm\"\"\"\n  height: Int\n  cup_size: String\n  band_size: Int\n  waist_size: Int\n  hip_size: Int\n  breast_type: BreastTypeEnum\n  career_start_year: Int\n  career_end_year: Int\n  added_tattoos: [BodyModification!]\n  removed_tattoos: [BodyModification!]\n  added_piercings: [BodyModification!]\n  removed_piercings: [BodyModification!]\n  added_images: [Image!]\n  removed_images: [Image!]\n  draft_id: ID\n\n  aliases: [String!]!\n  urls: [URL!]!\n  images: [Image!]!\n  tattoos: [BodyModification!]!\n  piercings: [BodyModification!]!\n}\n\ntype PerformerEditOptions {\n  \"\"\"Set performer alias on scenes without alias to old name if name is changed\"\"\"\n  set_modify_aliases: Boolean!\n  \"\"\"Set performer alias on scenes attached to merge sources to old name\"\"\"\n  set_merge_aliases: Boolean!\n}\n\ntype GenderFacet {\n  gender: GenderEnum!\n  count: Int!\n}\n\ntype PerformerSearchFacets {\n  genders: [GenderFacet!]!\n}\n\ntype QueryPerformersResultType {\n  count: Int!\n  performers: [Performer!]!\n  \"\"\"Search facets, only available for searchPerformer queries\"\"\"\n  facets: PerformerSearchFacets\n}\n\ninput BreastTypeCriterionInput {\n  value: BreastTypeEnum\n  modifier: CriterionModifier!\n}\n\ninput EyeColorCriterionInput {\n  value: EyeColorEnum\n  modifier: CriterionModifier!\n}\n\ninput HairColorCriterionInput {\n  value: HairColorEnum\n  modifier: CriterionModifier!\n}\n\ninput BodyModificationCriterionInput {\n  location: String\n  description: String\n  modifier: CriterionModifier!\n}\n\nenum PerformerSortEnum {\n  NAME\n  BIRTHDATE\n  DEATHDATE\n  SCENE_COUNT\n  CAREER_START_YEAR\n  DEBUT\n  LAST_SCENE\n  CREATED_AT\n  UPDATED_AT\n}\n\ninput PerformerSearchFilter {\n  \"\"\"Filter by gender\"\"\"\n  gender: GenderEnum\n}\n\ninput PerformerQueryInput {\n  \"\"\"Searches name and disambiguation - assumes like query unless quoted\"\"\"\n  names: String\n\n  \"\"\"Searches name only - assumes like query unless quoted\"\"\"\n  name: String\n\n  \"\"\"Search aliases only - assumes like query unless quoted\"\"\"\n  alias: String\n\n  disambiguation: StringCriterionInput\n\n  gender: GenderFilterEnum\n\n  \"\"\"Filter to search urls - assumes like query unless quoted\"\"\"\n  url: String\n\n  birthdate: DateCriterionInput\n  deathdate: DateCriterionInput\n  birth_year: IntCriterionInput\n  age: IntCriterionInput\n\n  ethnicity: EthnicityFilterEnum\n  country: StringCriterionInput\n  eye_color: EyeColorCriterionInput\n  hair_color: HairColorCriterionInput\n  height: IntCriterionInput\n\n  cup_size: StringCriterionInput\n  band_size: IntCriterionInput\n  waist_size: IntCriterionInput\n  hip_size: IntCriterionInput\n\n  breast_type: BreastTypeCriterionInput\n\n  career_start_year: IntCriterionInput\n  career_end_year: IntCriterionInput\n  tattoos: BodyModificationCriterionInput\n  piercings: BodyModificationCriterionInput\n  \"\"\"Filter by performerfavorite status for the current user\"\"\"\n  is_favorite: Boolean\n\n  \"\"\"Filter by a performer they have performed in scenes with\"\"\"\n  performed_with: ID\n\n  \"\"\"Filter by a studio\"\"\"\n  studio_id: ID\n\n  page: Int! = 1\n  per_page: Int! = 25\n  direction: SortDirectionEnum! = DESC\n  sort: PerformerSortEnum! = CREATED_AT\n}\n\ntype PerformerDraft {\n  id: ID\n  name: String!\n  disambiguation: String\n  aliases: String\n  gender: String\n  birthdate: String\n  deathdate: String\n  urls: [String!]\n  ethnicity: String\n  country: String\n  eye_color: String\n  hair_color: String\n  height: String\n  measurements: String\n  breast_type: String\n  tattoos: String\n  piercings: String\n  career_start_year: Int\n  career_end_year: Int\n  image: Image\n}\n\ninput PerformerDraftInput {\n  id: ID\n  disambiguation: String\n  name: String!\n  aliases: String\n  gender: String\n  birthdate: String\n  deathdate: String\n  urls: [String!]\n  ethnicity: String\n  country: String\n  eye_color: String\n  hair_color: String\n  height: String\n  measurements: String\n  breast_type: String\n  tattoos: String\n  piercings: String\n  career_start_year: Int\n  career_end_year: Int\n  image: Upload\n}\n\ninput QueryExistingPerformerInput {\n  name: String\n  disambiguation: String\n  urls: [String!]!\n}\n\ntype QueryExistingPerformerResult {\n  edits: [Edit!]!\n  performers: [Performer!]!\n}\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/scene.graphql\", Input: `type PerformerAppearance {\n  performer: Performer!\n  \"\"\"Performing as alias\"\"\"\n  as: String\n}\n\ninput PerformerAppearanceInput {\n  performer_id: ID!\n  \"\"\"Performing as alias\"\"\"\n  as: String\n}\n\nenum FingerprintAlgorithm {\n  MD5\n  OSHASH\n  PHASH\n}\n\nenum FavoriteFilter {\n  PERFORMER\n  STUDIO\n  ALL\n}\n\nenum FingerprintSubmissionType {\n  \"Positive vote\"\n  VALID\n  \"Report as invalid\"\n  INVALID\n  \"Remove vote\"\n  REMOVE\n}\n\ntype Fingerprint {\n  hash: FingerprintHash!\n  algorithm: FingerprintAlgorithm!\n  duration: Int!\n  \"number of times this fingerprint has been submitted (excluding reports)\"\n  submissions: Int!\n  \"number of times this fingerprint has been reported\"\n  reports: Int!\n  created: Time!\n  updated: Time!\n  \"true if the current user submitted this fingerprint\"\n  user_submitted: Boolean!\n  \"true if the current user reported this fingerprint\"\n  user_reported: Boolean!\n}\n\ntype DraftFingerprint {\n  hash: FingerprintHash!\n  algorithm: FingerprintAlgorithm!\n  duration: Int!\n}\n\ninput FingerprintInput {\n  \"\"\"assumes current user if omitted. Ignored for non-modify Users\"\"\"\n  user_ids: [ID!]\n  hash: FingerprintHash!\n  algorithm: FingerprintAlgorithm!\n  duration: Int!\n}\n\ninput FingerprintEditInput {\n  user_ids: [ID!]\n  hash: FingerprintHash!\n  algorithm: FingerprintAlgorithm!\n  duration: Int!\n  created: Time!\n  submissions: Int @deprecated(reason: \"Unused\")\n  updated: Time @deprecated(reason: \"Unused\")\n}\n\ninput FingerprintQueryInput {\n  hash: FingerprintHash!\n  algorithm: FingerprintAlgorithm!\n}\n\ninput FingerprintSubmission {\n  scene_id: ID!\n  fingerprint: FingerprintInput!\n  unmatch: Boolean @deprecated(reason: \"Use ` + \"`\" + `vote` + \"`\" + ` with REMOVE instead\")\n  vote: FingerprintSubmissionType = VALID\n}\n\ninput FingerprintBatchSubmission {\n  scene_id: ID!\n  hash: FingerprintHash!\n  algorithm: FingerprintAlgorithm!\n  duration: Int!\n}\n\ntype FingerprintSubmissionResult {\n  \"\"\"The fingerprint hash that was submitted\"\"\"\n  hash: FingerprintHash!\n  \"\"\"The scene ID that was submitted to\"\"\"\n  scene_id: ID!\n  \"\"\"Error message if submission failed\"\"\"\n  error: String\n}\n\ninput MoveFingerprintSubmissionsInput {\n  fingerprints: [FingerprintQueryInput!]!\n  source_scene_id: ID!\n  target_scene_id: ID!\n}\n\ninput DeleteFingerprintSubmissionsInput {\n  fingerprints: [FingerprintQueryInput!]!\n  scene_id: ID!\n}\n\ntype Scene {\n  id: ID!\n  title: String\n  details: String\n  date: String @deprecated(reason: \"Please use ` + \"`\" + `release_date` + \"`\" + ` instead\")\n  release_date: String\n  production_date: String\n  urls: [URL!]!\n  studio: Studio\n  tags: [Tag!]!\n  images: [Image!]!\n  performers: [PerformerAppearance!]!\n  fingerprints(is_submitted: Boolean = False): [Fingerprint!]!\n  duration: Int\n  director: String\n  code: String\n  deleted: Boolean!\n  edits: [Edit!]!\n  created: Time!\n  updated: Time!\n}\n\ninput SceneCreateInput {\n  title: String\n  details: String\n  urls: [URLInput!]\n  date: String!\n  production_date: String\n  studio_id: ID\n  performers: [PerformerAppearanceInput!]\n  tag_ids: [ID!]\n  image_ids: [ID!]\n  fingerprints: [FingerprintEditInput!]!\n  duration: Int\n  director: String\n  code: String\n}\n\ninput SceneUpdateInput {\n  id: ID!\n  title: String\n  details: String\n  urls: [URLInput!]\n  date: String\n  production_date: String\n  studio_id: ID\n  performers: [PerformerAppearanceInput!]\n  tag_ids: [ID!]\n  image_ids: [ID!]\n  fingerprints: [FingerprintEditInput!]\n  duration: Int\n  director: String\n  code: String\n}\n\ninput SceneDestroyInput {\n  id: ID!\n}\n\ninput SceneEditDetailsInput {\n  title: String\n  details: String\n  urls: [URLInput!]\n  date: String\n  production_date: String\n  studio_id: ID\n  performers: [PerformerAppearanceInput!]\n  tag_ids: [ID!]\n  image_ids: [ID!]\n  duration: Int\n  director: String\n  code: String\n  fingerprints: [FingerprintInput!]\n  draft_id: ID\n}\n\ninput SceneEditInput {\n  edit: EditInput!\n  \"\"\"Not required for destroy type\"\"\"\n  details: SceneEditDetailsInput\n}\n\ntype SceneEdit {\n  title: String\n  details: String\n  added_urls: [URL!]\n  removed_urls: [URL!]\n  date: String\n  production_date: String\n  studio: Studio\n  \"\"\"Added or modified performer appearance entries\"\"\"\n  added_performers: [PerformerAppearance!]\n  removed_performers: [PerformerAppearance!]\n  added_tags: [Tag!]\n  removed_tags: [Tag!]\n  added_images: [Image!]\n  removed_images: [Image!]\n  added_fingerprints: [Fingerprint!]\n  removed_fingerprints: [Fingerprint!]\n  duration: Int\n  director: String\n  code: String\n  draft_id: ID\n\n  urls: [URL!]!\n  performers: [PerformerAppearance!]!\n  tags: [Tag!]!\n  images: [Image!]!\n  fingerprints: [Fingerprint!]!\n}\n\ntype QueryScenesResultType {\n  count: Int!\n  scenes: [Scene!]!\n}\n\nenum SceneSortEnum {\n  TITLE\n  DATE\n  TRENDING\n  CREATED_AT\n  UPDATED_AT\n}\n\ninput SceneQueryInput {\n  \"\"\"Filter to search title and details - assumes like query unless quoted\"\"\"\n  text: String\n  \"\"\"Filter to search title - assumes like query unless quoted\"\"\"\n  title: String\n  \"\"\"Filter to search urls - assumes like query unless quoted\"\"\"\n  url: String\n  \"\"\"Filter by date\"\"\"\n  date: DateCriterionInput\n  \"\"\"Filter by production date\"\"\"\n  production_date: DateCriterionInput\n  \"\"\"Filter to only include scenes with this studio\"\"\"\n  studios: MultiIDCriterionInput\n  \"\"\"Filter to only include scenes with this studio as primary or parent\"\"\"\n  parentStudio: String\n  \"\"\"Filter to only include scenes with these tags\"\"\"\n  tags: MultiIDCriterionInput\n  \"\"\"Filter to only include scenes with these performers\"\"\"\n  performers: MultiIDCriterionInput\n  \"\"\"Filter to include scenes with performer appearing as alias\"\"\"\n  alias: StringCriterionInput\n  \"\"\"Filter to only include scenes with these fingerprints\"\"\"\n  fingerprints: MultiStringCriterionInput\n  \"\"\"Filter by favorited entity\"\"\"\n  favorites: FavoriteFilter\n  \"\"\"Filter to scenes with fingerprints submitted by the user\"\"\"\n  has_fingerprint_submissions: Boolean = False\n\n  page: Int! = 1\n  per_page: Int! = 25\n  direction: SortDirectionEnum! = DESC\n  sort: SceneSortEnum! = DATE\n}\n\nunion SceneDraftStudio = Studio | DraftEntity\nunion SceneDraftPerformer = Performer | DraftEntity\nunion SceneDraftTag = Tag | DraftEntity\n\ntype SceneDraft {\n  id: ID\n  title: String\n  code: String\n  details: String\n  director: String\n  urls: [String!]\n  date: String\n  production_date: String\n  studio: SceneDraftStudio\n  performers: [SceneDraftPerformer!]!\n  tags: [SceneDraftTag!]\n  image: Image\n  fingerprints: [DraftFingerprint!]!\n}\n\ninput SceneDraftInput {\n  id: ID\n  title: String\n  code: String\n  details: String\n  director: String\n  url: String @deprecated(reason: \"Use urls field instead.\")\n  urls: [String!]\n  date: String\n  production_date: String\n  studio: DraftEntityInput\n  performers: [DraftEntityInput!]!\n  tags: [DraftEntityInput!]\n  image: Upload\n  fingerprints: [FingerprintInput!]!\n}\n\ninput QueryExistingSceneInput {\n  title: String\n  studio_id: ID\n  fingerprints: [FingerprintInput!]!\n}\n\ntype QueryExistingSceneResult {\n  edits: [Edit!]!\n  scenes: [Scene!]!\n}\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/site.graphql\", Input: `type Site {\n  id: ID!\n  name: String!\n  description:  String\n  url:  String\n  regex:  String\n  valid_types: [ValidSiteTypeEnum!]!\n  icon: String!\n  created: Time!\n  updated: Time!\n}\n\ninput SiteCreateInput {\n  name: String!\n  description: String\n  url: String\n  regex: String\n  valid_types: [ValidSiteTypeEnum!]!\n}\n\ninput SiteUpdateInput {\n  id: ID!\n  name: String!\n  description: String\n  url: String\n  regex: String\n  valid_types: [ValidSiteTypeEnum!]!\n}\n\ninput SiteDestroyInput {\n  id: ID!\n}\n\ntype QuerySitesResultType {\n  count: Int!\n  sites: [Site!]!\n}\n\nenum ValidSiteTypeEnum {\n  PERFORMER\n  SCENE\n  STUDIO\n}\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/studio.graphql\", Input: `type Studio {\n  id: ID!\n  name: String!\n  aliases: [String!]!\n  urls: [URL!]!\n  parent: Studio\n  child_studios: [Studio!]! @deprecated(reason: \"Use sub_studios instead\")\n  sub_studios(input: StudioQueryInput): QueryStudiosResultType!\n  images: [Image!]!\n  deleted: Boolean!\n  is_favorite: Boolean!\n  created: Time!\n  updated: Time!\n\n  performers(input: PerformerQueryInput!): QueryPerformersResultType!\n}\n\ninput StudioCreateInput {\n  name: String!\n  aliases: [String!]\n  urls: [URLInput!]\n  parent_id: ID\n  image_ids: [ID!]\n}\n\ninput StudioUpdateInput {\n  id: ID!\n  name: String\n  aliases: [String!]\n  urls: [URLInput!]\n  parent_id: ID\n  image_ids: [ID!]\n}\n\ninput StudioDestroyInput {\n  id: ID!\n}\n\ninput StudioEditDetailsInput {\n  name: String\n  aliases: [String!]\n  urls: [URLInput!]\n  parent_id: ID\n  image_ids: [ID!]\n}\n\ninput StudioEditInput {\n  edit: EditInput!\n  \"\"\"Not required for destroy type\"\"\"\n  details: StudioEditDetailsInput\n}\n\ntype StudioEdit {\n  name: String\n  \"\"\"Added and modified URLs\"\"\"\n  added_urls: [URL!]\n  removed_urls: [URL!]\n  parent: Studio\n  added_images: [Image!]\n  removed_images: [Image!]\n  added_aliases: [String!]\n  removed_aliases: [String!]\n\n  images: [Image!]!\n  urls: [URL!]!\n}\n\ntype QueryStudiosResultType {\n  count: Int!\n  studios: [Studio!]!\n}\n\nenum StudioSortEnum {\n  NAME\n  CREATED_AT\n  UPDATED_AT\n}\n\ninput StudioQueryInput {\n  \"\"\"Filter to search name - assumes like query unless quoted\"\"\"\n  name: String\n  \"\"\"Filter to search studio name, aliases and parent studio name - assumes like query unless quoted\"\"\"\n  names: String\n  \"\"\"Filter to search url - assumes like query unless quoted\"\"\"\n  url: String\n  parent: IDCriterionInput\n  has_parent: Boolean\n  \"\"\"Filter by studio favorite status for the current user\"\"\"\n  is_favorite: Boolean\n\n  page: Int! = 1\n  per_page: Int! = 25\n  direction: SortDirectionEnum! = ASC\n  sort: StudioSortEnum! = NAME\n}\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/tag.graphql\", Input: `enum TagGroupEnum {\n  PEOPLE\n  SCENE\n  ACTION\n}\n\ntype Tag {\n  id: ID!\n  name: String!\n  description: String\n  aliases: [String!]!\n  deleted: Boolean!\n  edits: [Edit!]!\n  category: TagCategory\n  created: Time!\n  updated: Time!\n}\n\ninput TagCreateInput {\n  name: String!\n  description: String\n  aliases: [String!]\n  category_id: ID\n}\n\ninput TagUpdateInput {\n  id: ID!\n  name: String\n  description: String\n  aliases: [String!]\n  category_id: ID\n}\n\ninput TagDestroyInput {\n  id: ID!\n}\n\ninput TagEditDetailsInput {\n  name: String\n  description: String\n  aliases: [String!]\n  category_id: ID\n}\n\ninput TagEditInput {\n  edit: EditInput!\n  \"\"\"Not required for destroy type\"\"\"\n  details: TagEditDetailsInput\n}\n\ntype TagEdit {\n  name: String\n  description: String\n  added_aliases: [String!]\n  removed_aliases: [String!]\n  category: TagCategory\n\n  aliases: [String!]!\n}\n\ntype QueryTagsResultType {\n  count: Int!\n  tags: [Tag!]!\n}\n\ntype QueryTagCategoriesResultType {\n  count: Int!\n  tag_categories: [TagCategory!]!\n}\n\nenum TagSortEnum {\n  NAME\n  CREATED_AT\n  UPDATED_AT\n}\n\ninput TagQueryInput {\n  \"\"\"Filter to search name, aliases and description - assumes like query unless quoted\"\"\"\n  text: String\n  \"\"\"Searches name and aliases - assumes like query unless quoted\"\"\"\n  names: String\n  \"\"\"Filter to search name - assumes like query unless quoted\"\"\"\n  name: String\n  \"\"\"Filter to category ID\"\"\"\n  category_id: ID\n\n  page: Int! = 1\n  per_page: Int! = 25\n  direction: SortDirectionEnum! = ASC\n  sort: TagSortEnum! = NAME\n}\n\ntype TagCategory {\n  id: ID!\n  name: String!\n  group:  TagGroupEnum!\n  description: String\n}\n\ninput TagCategoryCreateInput {\n  name: String!\n  group:  TagGroupEnum!\n  description: String\n}\n\ninput TagCategoryUpdateInput {\n  id: ID!\n  name: String\n  group:  TagGroupEnum\n  description: String\n}\n\ninput TagCategoryDestroyInput {\n  id: ID!\n}\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/user.graphql\", Input: `directive @isUserOwner on FIELD_DEFINITION\ndirective @hasRole(role: RoleEnum!) on FIELD_DEFINITION\n\nenum RoleEnum {\n  READ\n  VOTE\n  EDIT\n  MODIFY\n  MODERATE\n  ADMIN\n  \"\"\"May generate invites without tokens\"\"\"\n  INVITE\n  \"\"\"May grant and rescind invite tokens and resind invite keys\"\"\"\n  MANAGE_INVITES\n  BOT\n  READ_ONLY\n  EDIT_TAGS\n}\n\ntype InviteKey {\n  id: ID!\n  uses: Int\n  expires: Time\n}\n\ntype User {\n  id: ID!\n  name: String!\n  \"\"\"Should not be visible to other users\"\"\"\n  roles: [RoleEnum!] @isUserOwner\n  \"\"\"Should not be visible to other users\"\"\"\n  email: String @isUserOwner\n  \"\"\"Should not be visible to other users\"\"\"\n  api_key: String @isUserOwner\n  notification_subscriptions: [NotificationEnum!]! @isUserOwner\n\n  \"\"\" Vote counts by type \"\"\"\n  vote_count: UserVoteCount!\n  \"\"\" Edit counts by status \"\"\"\n  edit_count: UserEditCount!\n\n  \"\"\"Calls to the API from this user over a configurable time period\"\"\"\n  api_calls: Int! @isUserOwner\n  invited_by: User @isUserOwner\n  invite_tokens: Int @isUserOwner\n  active_invite_codes: [String!] @isUserOwner @deprecated(reason: \"Use invite_codes instead\")\n  invite_codes: [InviteKey!] @isUserOwner\n}\n\ninput UserCreateInput {\n  name: String!\n  \"\"\"Password in plain text\"\"\"\n  password: String!\n  roles: [RoleEnum!]!\n  email: String!\n  invited_by_id: ID\n}\n\ninput UserUpdateInput {\n  id: ID!\n  name: String\n  \"\"\"Password in plain text\"\"\"\n  password: String\n  roles: [RoleEnum!]\n  email: String\n}\n\ninput NewUserInput {\n  email: String!\n  invite_key: ID \n}\n\ninput ActivateNewUserInput {\n  name: String!\n  activation_key: ID!\n  password: String!\n}\n\ninput ResetPasswordInput {\n  email: String!\n}\n\ninput UserChangePasswordInput {\n  \"\"\"Password in plain text\"\"\"\n  existing_password: String\n  new_password: String!\n  reset_key: ID\n}\n\ninput UserDestroyInput {\n    id: ID!\n}\n\ninput GrantInviteInput {\n  user_id: ID!\n  amount: Int!\n}\n\ninput RevokeInviteInput {\n  user_id: ID!\n  amount: Int!\n}\n\ntype QueryUsersResultType {\n  count: Int!\n  users: [User!]!\n}\n\ninput RoleCriterionInput {\n  value: [RoleEnum!]!\n  modifier: CriterionModifier!\n}\n\ninput UserQueryInput {\n  \"\"\"Filter to search user name - assumes like query unless quoted\"\"\"\n  name: String\n  \"\"\"Filter to search email - assumes like query unless quoted\"\"\"\n  email: String\n  \"\"\"Filter by roles\"\"\"\n  roles: RoleCriterionInput\n  \"\"\"Filter by api key\"\"\"\n  apiKey: String\n\n  \"\"\"Filter by successful edits\"\"\"\n  successful_edits: IntCriterionInput\n  \"\"\"Filter by unsuccessful edits\"\"\"\n  unsuccessful_edits: IntCriterionInput\n  \"\"\"Filter by votes on successful edits\"\"\"\n  successful_votes: IntCriterionInput\n  \"\"\"Filter by votes on unsuccessful edits\"\"\"\n  unsuccessful_votes: IntCriterionInput\n  \"\"\"Filter by number of API calls\"\"\"\n  api_calls: IntCriterionInput\n  \"\"\"Filter by user that invited\"\"\"\n  invited_by: ID\n\n  page: Int! = 1\n  per_page: Int! = 25\n}\n\ntype UserEditCount {\n  accepted: Int!\n  rejected: Int!\n  pending: Int!\n  immediate_accepted: Int!\n  immediate_rejected: Int!\n  failed: Int!\n  canceled: Int!\n}\n\ntype UserVoteCount {\n  abstain: Int!\n  accept: Int!\n  reject: Int!\n  immediate_accept: Int!\n  immediate_reject: Int!\n}\n\ninput GenerateInviteCodeInput {\n  # the number of invite keys to generate. If not set, a single invite key will be generated\n  keys: Int\n  # the number of uses for each invite key. If not set, the invite key will have one use\n  uses: Int\n  # the number of seconds until the invite code expires. If not set, the invite code will never expire\n  ttl: Int\n}\n\ninput UserChangeEmailInput {\n  existing_email_token: ID\n  new_email_token: ID\n  new_email: String\n}\n\nenum UserChangeEmailStatus {\n  CONFIRM_OLD\n  CONFIRM_NEW\n  EXPIRED\n  INVALID_TOKEN\n  SUCCESS\n  ERROR\n}\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/types/version.graphql\", Input: `type Version {\n  hash: String!\n  build_time: String!\n  build_type: String!\n  version: String!\n}\n`, BuiltIn: false},\n\t{Name: \"../../graphql/schema/schema.graphql\", Input: `\"\"\"The query root for this schema\"\"\"\ntype Query {\n  #### Performers ####\n\n  # performer names may not be unique\n  \"\"\"Find a performer by ID\"\"\"\n  findPerformer(id: ID!): Performer @hasRole(role: READ)\n  queryPerformers(input: PerformerQueryInput!): QueryPerformersResultType! @hasRole(role: READ)\n\n  #### Studios ####\n\n  # studio names should be unique\n  \"\"\"Find a studio by ID or name\"\"\"\n  findStudio(id: ID, name: String): Studio @hasRole(role: READ)\n  queryStudios(input: StudioQueryInput!): QueryStudiosResultType! @hasRole(role: READ)\n\n  #### Tags ####\n\n  # tag names will be unique\n  \"\"\"Find a tag by ID or name\"\"\"\n  findTag(id: ID, name: String): Tag @hasRole(role: READ)\n  \"\"\"Find a tag with a matching name or alias\"\"\"\n  findTagOrAlias(name: String!): Tag @hasRole(role: READ)\n  queryTags(input: TagQueryInput!): QueryTagsResultType! @hasRole(role: READ)\n\n  \"\"\"Find a tag category by ID\"\"\"\n  findTagCategory(id: ID!): TagCategory @hasRole(role: READ)\n  queryTagCategories: QueryTagCategoriesResultType! @hasRole(role: READ)\n\n  #### Scenes ####\n\n  # ids should be unique\n  \"\"\"Find a scene by ID\"\"\"\n  findScene(id: ID!): Scene @hasRole(role: READ)\n\n  \"\"\"Finds scenes that match a list of hashes\"\"\"\n  findScenesBySceneFingerprints(fingerprints: [[FingerprintQueryInput!]!]!): [[Scene]!]! @hasRole(role: READ)\n\n  queryScenes(input: SceneQueryInput!): QueryScenesResultType! @hasRole(role: READ)\n\n  \"\"\"Find an external site by ID\"\"\"\n  findSite(id: ID!): Site @hasRole(role: READ)\n  querySites: QuerySitesResultType! @hasRole(role: READ)\n\n  #### Edits ####\n\n  findEdit(id: ID!): Edit @hasRole(role: READ)\n  queryEdits(input: EditQueryInput!): QueryEditsResultType! @hasRole(role: READ)\n\n  #### Users ####\n\n  \"\"\"Find user by ID or username\"\"\"\n  findUser(id: ID, username: String): User @hasRole(role: READ)\n  queryUsers(input: UserQueryInput!): QueryUsersResultType! @hasRole(role: ADMIN)\n\n  \"\"\"Returns currently authenticated user\"\"\"\n  me: User\n\n  ### Full text search ###\n  searchPerformer(term: String!, limit: Int): [Performer!]! @hasRole(role: READ) @deprecated(reason: \"Use searchPerformers\")\n  searchPerformers(term: String!, limit: Int, page: Int, per_page: Int, filter: PerformerSearchFilter): QueryPerformersResultType! @hasRole(role: READ)\n  searchScene(term: String!, limit: Int): [Scene!]! @hasRole(role: READ) @deprecated(reason: \"Use searchScenes\")\n  searchScenes(term: String!, limit: Int, page: Int, per_page: Int): QueryScenesResultType! @hasRole(role: READ)\n  searchTag(term: String!, limit: Int): [Tag!]! @hasRole(role: READ)\n  searchStudio(term: String!, limit: Int): [Studio!]! @hasRole(role: READ)\n\n  ### Drafts ###\n  findDraft(id: ID!): Draft @hasRole(role: READ)\n  findDrafts: [Draft!]! @hasRole(role: READ)\n\n  ###Find scenes or pending scenes which match scene input###\n  queryExistingScene(input: QueryExistingSceneInput!): QueryExistingSceneResult! @hasRole(role: READ)\n\n  ###Find performers or pending performers which match performer input###\n  queryExistingPerformer(input: QueryExistingPerformerInput!): QueryExistingPerformerResult! @hasRole(role: READ)\n\n  #### Version ####\n  version: Version! @hasRole(role: READ)\n\n  ### Instance Config ###\n  getConfig: StashBoxConfig!\n\n  queryNotifications(input: QueryNotificationsInput!): QueryNotificationsResult! @hasRole(role: READ)\n  getUnreadNotificationCount: Int! @hasRole(role: READ)\n\n  ### Moderator Audits ###\n  queryModAudits(input: ModAuditQueryInput!): QueryModAuditsResultType! @hasRole(role: ADMIN)\n}\n\ntype Mutation {\n  # Admin-only interface\n  sceneCreate(input: SceneCreateInput!): Scene @hasRole(role: MODIFY)\n  sceneUpdate(input: SceneUpdateInput!): Scene @hasRole(role: MODIFY)\n  sceneDestroy(input: SceneDestroyInput!): Boolean! @hasRole(role: MODIFY)\n\n  performerCreate(input: PerformerCreateInput!): Performer @hasRole(role: MODIFY)\n  performerUpdate(input: PerformerUpdateInput!): Performer @hasRole(role: MODIFY)\n  performerDestroy(input: PerformerDestroyInput!): Boolean! @hasRole(role: MODIFY)\n\n  studioCreate(input: StudioCreateInput!): Studio @hasRole(role: MODIFY)\n  studioUpdate(input: StudioUpdateInput!): Studio @hasRole(role: MODIFY)\n  studioDestroy(input: StudioDestroyInput!): Boolean! @hasRole(role: MODIFY)\n\n  tagCreate(input: TagCreateInput!): Tag @hasRole(role: MODIFY)\n  tagUpdate(input: TagUpdateInput!): Tag @hasRole(role: MODIFY)\n  tagDestroy(input: TagDestroyInput!): Boolean! @hasRole(role: MODIFY)\n\n  userCreate(input: UserCreateInput!): User @hasRole(role: ADMIN)\n  userUpdate(input: UserUpdateInput!): User @hasRole(role: ADMIN)\n  userDestroy(input: UserDestroyInput!): Boolean! @hasRole(role: ADMIN)\n\n  imageCreate(input: ImageCreateInput!): Image @hasRole(role: EDIT)\n  imageDestroy(input: ImageDestroyInput!): Boolean! @hasRole(role: MODIFY)\n\n  \"\"\"User interface for registering\"\"\"\n  newUser(input: NewUserInput!): ID\n  activateNewUser(input: ActivateNewUserInput!): User\n\n  generateInviteCode: ID @deprecated(reason: \"Use generateInviteCodes\")\n  \"\"\"Generates an invite code using an invite token\"\"\"\n  generateInviteCodes(input: GenerateInviteCodeInput): [ID!]!\n  \"\"\"Removes a pending invite code - refunding the token\"\"\"\n  rescindInviteCode(code: ID!): Boolean!\n  \"\"\"Adds invite tokens for a user\"\"\"\n  grantInvite(input: GrantInviteInput!): Int!\n  \"\"\"Removes invite tokens from a user\"\"\"\n  revokeInvite(input: RevokeInviteInput!): Int!\n\n  tagCategoryCreate(input: TagCategoryCreateInput!): TagCategory @hasRole(role: ADMIN)\n  tagCategoryUpdate(input: TagCategoryUpdateInput!): TagCategory @hasRole(role: ADMIN)\n  tagCategoryDestroy(input: TagCategoryDestroyInput!): Boolean! @hasRole(role: ADMIN)\n\n  siteCreate(input: SiteCreateInput!): Site @hasRole(role: ADMIN)\n  siteUpdate(input: SiteUpdateInput!): Site @hasRole(role: ADMIN)\n  siteDestroy(input: SiteDestroyInput!): Boolean! @hasRole(role: ADMIN)\n\n  \"\"\"Regenerates the api key for the given user, or the current user if id not provided\"\"\"\n  regenerateAPIKey(userID: ID): String!\n\n  \"\"\"Generates an email to reset a user password\"\"\"\n  resetPassword(input: ResetPasswordInput!): Boolean!\n\n  \"\"\"Changes the password for the current user\"\"\"\n  changePassword(input: UserChangePasswordInput!): Boolean!\n\n  \"\"\"Request an email change for the current user\"\"\"\n  requestChangeEmail: UserChangeEmailStatus! @hasRole(role: READ)\n  validateChangeEmail(token: ID!, email: String!): UserChangeEmailStatus! @hasRole(role: READ)\n  confirmChangeEmail(token: ID!): UserChangeEmailStatus! @hasRole(role: READ)\n\n  # Edit interfaces\n  \"\"\"Propose a new scene or modification to a scene\"\"\"\n  sceneEdit(input: SceneEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Propose a new performer or modification to a performer\"\"\"\n  performerEdit(input: PerformerEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Propose a new studio or modification to a studio\"\"\"\n  studioEdit(input: StudioEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Propose a new tag or modification to a tag\"\"\"\n  tagEdit(input: TagEditInput!): Edit! @hasRole(role: EDIT)\n\n  \"\"\"Update a pending scene edit\"\"\"\n  sceneEditUpdate(id: ID!, input: SceneEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Update a pending performer edit\"\"\"\n  performerEditUpdate(id: ID!, input: PerformerEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Update a pending studio edit\"\"\"\n  studioEditUpdate(id: ID!, input: StudioEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Update a pending tag edit\"\"\"\n  tagEditUpdate(id: ID!, input: TagEditInput!): Edit! @hasRole(role: EDIT)\n\n  \"\"\"Vote to accept/reject an edit\"\"\"\n  editVote(input: EditVoteInput!): Edit! @hasRole(role: VOTE)\n  \"\"\"Comment on an edit\"\"\"\n  editComment(input: EditCommentInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Apply edit without voting\"\"\"\n  applyEdit(input: ApplyEditInput!): Edit! @hasRole(role: ADMIN)\n  \"\"\"Cancel edit without voting\"\"\"\n  cancelEdit(input: CancelEditInput!): Edit! @hasRole(role: EDIT)\n  \"\"\"Delete a closed edit - moderator only\"\"\"\n  deleteEdit(input: DeleteEditInput!): Boolean! @hasRole(role: MODERATE)\n  \"\"\"Amend a closed edit by removing fields - moderator only\"\"\"\n  amendEdit(input: AmendEditInput!): Edit! @hasRole(role: MODERATE)\n\n  \"\"\"Matches/unmatches a scene to fingerprint\"\"\"\n  submitFingerprint(input: FingerprintSubmission!): Boolean! @hasRole(role: READ)\n  \"\"\"Batch submit up to 1000 fingerprint matches\"\"\"\n  submitFingerprints(input: [FingerprintBatchSubmission!]!): [FingerprintSubmissionResult!]! @hasRole(role: READ)\n\n  \"\"\"Move all fingerprint submissions from source scene to target scene\"\"\"\n  sceneMoveFingerprintSubmissions(input: MoveFingerprintSubmissionsInput!): Boolean! @hasRole(role: MODERATE)\n  \"\"\"Delete all fingerprint submissions for a specific fingerprint on a scene\"\"\"\n  sceneDeleteFingerprintSubmissions(input: DeleteFingerprintSubmissionsInput!): Boolean! @hasRole(role: MODERATE)\n\n  \"\"\"Draft submissions\"\"\"\n  submitSceneDraft(input: SceneDraftInput!): DraftSubmissionStatus! @hasRole(role: EDIT)\n  submitPerformerDraft(input: PerformerDraftInput!): DraftSubmissionStatus! @hasRole(role: EDIT)\n  destroyDraft(id: ID!): Boolean! @hasRole(role: EDIT)\n\n  \"\"\"Favorite or unfavorite a performer\"\"\"\n  favoritePerformer(id: ID!, favorite: Boolean!): Boolean! @hasRole(role: READ)\n  \"\"\"Favorite or unfavorite a studio\"\"\"\n  favoriteStudio(id: ID!, favorite: Boolean!): Boolean! @hasRole(role: READ)\n\n  \"\"\"Mark all of the current users notifications as read.\"\"\"\n  markNotificationsRead(notification: MarkNotificationReadInput): Boolean! @hasRole(role: READ)\n  \"\"\"Update notification subscriptions for current user.\"\"\"\n  updateNotificationSubscriptions(subscriptions: [NotificationEnum!]!): Boolean! @hasRole(role: READ)\n}\n\nschema {\n  query: Query\n  mutation: Mutation\n}\n`, BuiltIn: false},\n}\nvar parsedSchema = gqlparser.MustLoadSchema(sources...)\n\n// endregion ************************** generated!.gotpl **************************\n\n// region    ***************************** args.gotpl *****************************\n\nfunc (ec *executionContext) dir_hasRole_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"role\", ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"role\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_activateNewUser_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNActivateNewUserInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐActivateNewUserInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_amendEdit_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNAmendEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐAmendEditInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_applyEdit_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNApplyEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐApplyEditInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_cancelEdit_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNCancelEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCancelEditInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_changePassword_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNUserChangePasswordInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserChangePasswordInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_confirmChangeEmail_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"token\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"token\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_deleteEdit_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNDeleteEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDeleteEditInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_destroyDraft_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_editComment_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNEditCommentInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditCommentInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_editVote_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNEditVoteInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditVoteInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_favoritePerformer_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"favorite\", ec.unmarshalNBoolean2bool)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"favorite\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_favoriteStudio_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"favorite\", ec.unmarshalNBoolean2bool)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"favorite\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_generateInviteCodes_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalOGenerateInviteCodeInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenerateInviteCodeInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_grantInvite_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNGrantInviteInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGrantInviteInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_imageCreate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNImageCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageCreateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_imageDestroy_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNImageDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageDestroyInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_markNotificationsRead_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"notification\", ec.unmarshalOMarkNotificationReadInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMarkNotificationReadInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"notification\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_newUser_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNNewUserInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNewUserInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_performerCreate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNPerformerCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerCreateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_performerDestroy_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNPerformerDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerDestroyInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_performerEditUpdate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNPerformerEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerEditInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_performerEdit_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNPerformerEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerEditInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_performerUpdate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNPerformerUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerUpdateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_regenerateAPIKey_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"userID\", ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"userID\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_rescindInviteCode_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"code\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"code\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_resetPassword_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNResetPasswordInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐResetPasswordInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_revokeInvite_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNRevokeInviteInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRevokeInviteInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_sceneCreate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNSceneCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneCreateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_sceneDeleteFingerprintSubmissions_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNDeleteFingerprintSubmissionsInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDeleteFingerprintSubmissionsInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_sceneDestroy_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNSceneDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDestroyInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_sceneEditUpdate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNSceneEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneEditInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_sceneEdit_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNSceneEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneEditInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_sceneMoveFingerprintSubmissions_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNMoveFingerprintSubmissionsInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMoveFingerprintSubmissionsInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_sceneUpdate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNSceneUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneUpdateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_siteCreate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNSiteCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSiteCreateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_siteDestroy_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNSiteDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSiteDestroyInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_siteUpdate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNSiteUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSiteUpdateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_studioCreate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNStudioCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioCreateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_studioDestroy_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNStudioDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioDestroyInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_studioEditUpdate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNStudioEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioEditInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_studioEdit_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNStudioEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioEditInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_studioUpdate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNStudioUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioUpdateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_submitFingerprint_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNFingerprintSubmission2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintSubmission)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_submitFingerprints_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNFingerprintBatchSubmission2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintBatchSubmissionᚄ)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_submitPerformerDraft_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNPerformerDraftInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerDraftInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_submitSceneDraft_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNSceneDraftInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDraftInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_tagCategoryCreate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNTagCategoryCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategoryCreateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_tagCategoryDestroy_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNTagCategoryDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategoryDestroyInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_tagCategoryUpdate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNTagCategoryUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategoryUpdateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_tagCreate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNTagCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCreateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_tagDestroy_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNTagDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagDestroyInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_tagEditUpdate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNTagEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagEditInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_tagEdit_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNTagEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagEditInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_tagUpdate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNTagUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagUpdateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_updateNotificationSubscriptions_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"subscriptions\", ec.unmarshalNNotificationEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationEnumᚄ)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"subscriptions\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_userCreate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNUserCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserCreateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_userDestroy_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNUserDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserDestroyInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_userUpdate_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNUserUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserUpdateInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Mutation_validateChangeEmail_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"token\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"token\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"email\", ec.unmarshalNString2string)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"email\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Performer_scenes_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalOPerformerScenesInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerScenesInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Performer_studios_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"studio_id\", ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"studio_id\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"name\", ec.unmarshalNString2string)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"name\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_findDraft_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_findEdit_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_findPerformer_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_findScene_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_findScenesBySceneFingerprints_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"fingerprints\", ec.unmarshalNFingerprintQueryInput2ᚕᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintQueryInputᚄ)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"fingerprints\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_findSite_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_findStudio_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"name\", ec.unmarshalOString2ᚖstring)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"name\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_findTagCategory_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_findTagOrAlias_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"name\", ec.unmarshalNString2string)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"name\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_findTag_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"name\", ec.unmarshalOString2ᚖstring)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"name\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_findUser_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"id\", ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"id\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"username\", ec.unmarshalOString2ᚖstring)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"username\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_queryEdits_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNEditQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditQueryInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_queryExistingPerformer_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNQueryExistingPerformerInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryExistingPerformerInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_queryExistingScene_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNQueryExistingSceneInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryExistingSceneInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_queryModAudits_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNModAuditQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAuditQueryInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_queryNotifications_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNQueryNotificationsInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryNotificationsInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_queryPerformers_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNPerformerQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerQueryInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_queryScenes_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNSceneQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneQueryInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_queryStudios_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNStudioQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioQueryInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_queryTags_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNTagQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagQueryInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_queryUsers_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNUserQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserQueryInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_searchPerformer_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"term\", ec.unmarshalNString2string)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"term\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"limit\", ec.unmarshalOInt2ᚖint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"limit\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_searchPerformers_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"term\", ec.unmarshalNString2string)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"term\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"limit\", ec.unmarshalOInt2ᚖint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"limit\"] = arg1\n\targ2, err := graphql.ProcessArgField(ctx, rawArgs, \"page\", ec.unmarshalOInt2ᚖint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"page\"] = arg2\n\targ3, err := graphql.ProcessArgField(ctx, rawArgs, \"per_page\", ec.unmarshalOInt2ᚖint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"per_page\"] = arg3\n\targ4, err := graphql.ProcessArgField(ctx, rawArgs, \"filter\", ec.unmarshalOPerformerSearchFilter2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerSearchFilter)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"filter\"] = arg4\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_searchScene_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"term\", ec.unmarshalNString2string)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"term\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"limit\", ec.unmarshalOInt2ᚖint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"limit\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_searchScenes_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"term\", ec.unmarshalNString2string)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"term\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"limit\", ec.unmarshalOInt2ᚖint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"limit\"] = arg1\n\targ2, err := graphql.ProcessArgField(ctx, rawArgs, \"page\", ec.unmarshalOInt2ᚖint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"page\"] = arg2\n\targ3, err := graphql.ProcessArgField(ctx, rawArgs, \"per_page\", ec.unmarshalOInt2ᚖint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"per_page\"] = arg3\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_searchStudio_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"term\", ec.unmarshalNString2string)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"term\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"limit\", ec.unmarshalOInt2ᚖint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"limit\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Query_searchTag_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"term\", ec.unmarshalNString2string)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"term\"] = arg0\n\targ1, err := graphql.ProcessArgField(ctx, rawArgs, \"limit\", ec.unmarshalOInt2ᚖint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"limit\"] = arg1\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Scene_fingerprints_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"is_submitted\", ec.unmarshalOBoolean2ᚖbool)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"is_submitted\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Studio_performers_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalNPerformerQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerQueryInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field_Studio_sub_studios_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"input\", ec.unmarshalOStudioQueryInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioQueryInput)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"input\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field___Directive_args_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"includeDeprecated\", ec.unmarshalOBoolean2ᚖbool)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"includeDeprecated\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field___Field_args_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"includeDeprecated\", ec.unmarshalOBoolean2ᚖbool)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"includeDeprecated\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field___Type_enumValues_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"includeDeprecated\", ec.unmarshalOBoolean2bool)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"includeDeprecated\"] = arg0\n\treturn args, nil\n}\n\nfunc (ec *executionContext) field___Type_fields_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {\n\tvar err error\n\targs := map[string]any{}\n\targ0, err := graphql.ProcessArgField(ctx, rawArgs, \"includeDeprecated\", ec.unmarshalOBoolean2bool)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs[\"includeDeprecated\"] = arg0\n\treturn args, nil\n}\n\n// endregion ***************************** args.gotpl *****************************\n\n// region    ************************** directives.gotpl **************************\n\n// endregion ************************** directives.gotpl **************************\n\n// region    **************************** field.gotpl *****************************\n\nfunc (ec *executionContext) _BodyModification_location(ctx context.Context, field graphql.CollectedField, obj *BodyModification) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_BodyModification_location,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Location, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_BodyModification_location(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"BodyModification\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _BodyModification_description(ctx context.Context, field graphql.CollectedField, obj *BodyModification) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_BodyModification_description,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Description, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_BodyModification_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"BodyModification\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _CommentCommentedEdit_comment(ctx context.Context, field graphql.CollectedField, obj *CommentCommentedEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_CommentCommentedEdit_comment,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Comment, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNEditComment2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditComment,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_CommentCommentedEdit_comment(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"CommentCommentedEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_EditComment_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_EditComment_user(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_EditComment_date(ctx, field)\n\t\t\tcase \"comment\":\n\t\t\t\treturn ec.fieldContext_EditComment_comment(ctx, field)\n\t\t\tcase \"edit\":\n\t\t\t\treturn ec.fieldContext_EditComment_edit(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type EditComment\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _CommentOwnEdit_comment(ctx context.Context, field graphql.CollectedField, obj *CommentOwnEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_CommentOwnEdit_comment,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Comment, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNEditComment2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditComment,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_CommentOwnEdit_comment(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"CommentOwnEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_EditComment_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_EditComment_user(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_EditComment_date(ctx, field)\n\t\t\tcase \"comment\":\n\t\t\t\treturn ec.fieldContext_EditComment_comment(ctx, field)\n\t\t\tcase \"edit\":\n\t\t\t\treturn ec.fieldContext_EditComment_edit(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type EditComment\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _CommentVotedEdit_comment(ctx context.Context, field graphql.CollectedField, obj *CommentVotedEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_CommentVotedEdit_comment,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Comment, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNEditComment2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditComment,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_CommentVotedEdit_comment(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"CommentVotedEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_EditComment_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_EditComment_user(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_EditComment_date(ctx, field)\n\t\t\tcase \"comment\":\n\t\t\t\treturn ec.fieldContext_EditComment_comment(ctx, field)\n\t\t\tcase \"edit\":\n\t\t\t\treturn ec.fieldContext_EditComment_edit(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type EditComment\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _DownvoteOwnEdit_edit(ctx context.Context, field graphql.CollectedField, obj *DownvoteOwnEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_DownvoteOwnEdit_edit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Edit, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_DownvoteOwnEdit_edit(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"DownvoteOwnEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Draft_id(ctx context.Context, field graphql.CollectedField, obj *Draft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Draft_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Draft_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Draft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Draft_created(ctx context.Context, field graphql.CollectedField, obj *Draft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Draft_created,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Draft().Created(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Draft_created(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Draft\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Draft_expires(ctx context.Context, field graphql.CollectedField, obj *Draft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Draft_expires,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Draft().Expires(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Draft_expires(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Draft\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Draft_data(ctx context.Context, field graphql.CollectedField, obj *Draft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Draft_data,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Draft().Data(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNDraftData2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftData,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Draft_data(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Draft\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type DraftData does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _DraftEntity_name(ctx context.Context, field graphql.CollectedField, obj *DraftEntity) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_DraftEntity_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_DraftEntity_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"DraftEntity\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _DraftEntity_id(ctx context.Context, field graphql.CollectedField, obj *DraftEntity) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_DraftEntity_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_DraftEntity_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"DraftEntity\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _DraftFingerprint_hash(ctx context.Context, field graphql.CollectedField, obj *DraftFingerprint) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_DraftFingerprint_hash,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Hash, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNFingerprintHash2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintHash,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_DraftFingerprint_hash(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"DraftFingerprint\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type FingerprintHash does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _DraftFingerprint_algorithm(ctx context.Context, field graphql.CollectedField, obj *DraftFingerprint) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_DraftFingerprint_algorithm,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Algorithm, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNFingerprintAlgorithm2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintAlgorithm,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_DraftFingerprint_algorithm(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"DraftFingerprint\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type FingerprintAlgorithm does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _DraftFingerprint_duration(ctx context.Context, field graphql.CollectedField, obj *DraftFingerprint) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_DraftFingerprint_duration,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Duration, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_DraftFingerprint_duration(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"DraftFingerprint\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _DraftSubmissionStatus_id(ctx context.Context, field graphql.CollectedField, obj *DraftSubmissionStatus) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_DraftSubmissionStatus_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_DraftSubmissionStatus_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"DraftSubmissionStatus\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_id(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_user(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_user,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().User(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOUser2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUser,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_user(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_User_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_User_name(ctx, field)\n\t\t\tcase \"roles\":\n\t\t\t\treturn ec.fieldContext_User_roles(ctx, field)\n\t\t\tcase \"email\":\n\t\t\t\treturn ec.fieldContext_User_email(ctx, field)\n\t\t\tcase \"api_key\":\n\t\t\t\treturn ec.fieldContext_User_api_key(ctx, field)\n\t\t\tcase \"notification_subscriptions\":\n\t\t\t\treturn ec.fieldContext_User_notification_subscriptions(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_User_vote_count(ctx, field)\n\t\t\tcase \"edit_count\":\n\t\t\t\treturn ec.fieldContext_User_edit_count(ctx, field)\n\t\t\tcase \"api_calls\":\n\t\t\t\treturn ec.fieldContext_User_api_calls(ctx, field)\n\t\t\tcase \"invited_by\":\n\t\t\t\treturn ec.fieldContext_User_invited_by(ctx, field)\n\t\t\tcase \"invite_tokens\":\n\t\t\t\treturn ec.fieldContext_User_invite_tokens(ctx, field)\n\t\t\tcase \"active_invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_active_invite_codes(ctx, field)\n\t\t\tcase \"invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_invite_codes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type User\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_target(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_target,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().Target(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOEditTarget2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditTarget,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_target(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type EditTarget does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_target_type(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_target_type,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().TargetType(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTargetTypeEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTargetTypeEnum,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_target_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type TargetTypeEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_merge_sources(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_merge_sources,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().MergeSources(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNEditTarget2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditTargetᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_merge_sources(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type EditTarget does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_operation(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_operation,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().Operation(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNOperationEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐOperationEnum,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_operation(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type OperationEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_bot(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_bot,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Bot, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_bot(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_details(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_details,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().Details(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOEditDetails2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditDetails,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_details(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type EditDetails does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_old_details(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_old_details,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().OldDetails(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOEditDetails2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditDetails,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_old_details(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type EditDetails does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_options(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_options,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().Options(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOPerformerEditOptions2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerEditOptions,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_options(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"set_modify_aliases\":\n\t\t\t\treturn ec.fieldContext_PerformerEditOptions_set_modify_aliases(ctx, field)\n\t\t\tcase \"set_merge_aliases\":\n\t\t\t\treturn ec.fieldContext_PerformerEditOptions_set_merge_aliases(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type PerformerEditOptions\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_comments(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_comments,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().Comments(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNEditComment2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditCommentᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_comments(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_EditComment_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_EditComment_user(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_EditComment_date(ctx, field)\n\t\t\tcase \"comment\":\n\t\t\t\treturn ec.fieldContext_EditComment_comment(ctx, field)\n\t\t\tcase \"edit\":\n\t\t\t\treturn ec.fieldContext_EditComment_edit(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type EditComment\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_votes(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_votes,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().Votes(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNEditVote2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditVoteᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_votes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_EditVote_user(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_EditVote_date(ctx, field)\n\t\t\tcase \"vote\":\n\t\t\t\treturn ec.fieldContext_EditVote_vote(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type EditVote\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_vote_count(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_vote_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.VoteCount, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_vote_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_destructive(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_destructive,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().Destructive(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_destructive(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_status(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_status,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().Status(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNVoteStatusEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐVoteStatusEnum,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_status(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type VoteStatusEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_applied(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_applied,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Applied, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_applied(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_update_count(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_update_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.UpdateCount, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_update_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_updatable(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_updatable,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().Updatable(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_updatable(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_created(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_created,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().Created(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_created(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_updated(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_updated,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().Updated(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_updated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_closed(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_closed,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().Closed(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_closed(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Edit_expires(ctx context.Context, field graphql.CollectedField, obj *Edit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Edit_expires,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Edit().Expires(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Edit_expires(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Edit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _EditComment_id(ctx context.Context, field graphql.CollectedField, obj *EditComment) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_EditComment_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_EditComment_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"EditComment\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _EditComment_user(ctx context.Context, field graphql.CollectedField, obj *EditComment) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_EditComment_user,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.EditComment().User(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOUser2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUser,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_EditComment_user(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"EditComment\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_User_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_User_name(ctx, field)\n\t\t\tcase \"roles\":\n\t\t\t\treturn ec.fieldContext_User_roles(ctx, field)\n\t\t\tcase \"email\":\n\t\t\t\treturn ec.fieldContext_User_email(ctx, field)\n\t\t\tcase \"api_key\":\n\t\t\t\treturn ec.fieldContext_User_api_key(ctx, field)\n\t\t\tcase \"notification_subscriptions\":\n\t\t\t\treturn ec.fieldContext_User_notification_subscriptions(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_User_vote_count(ctx, field)\n\t\t\tcase \"edit_count\":\n\t\t\t\treturn ec.fieldContext_User_edit_count(ctx, field)\n\t\t\tcase \"api_calls\":\n\t\t\t\treturn ec.fieldContext_User_api_calls(ctx, field)\n\t\t\tcase \"invited_by\":\n\t\t\t\treturn ec.fieldContext_User_invited_by(ctx, field)\n\t\t\tcase \"invite_tokens\":\n\t\t\t\treturn ec.fieldContext_User_invite_tokens(ctx, field)\n\t\t\tcase \"active_invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_active_invite_codes(ctx, field)\n\t\t\tcase \"invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_invite_codes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type User\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _EditComment_date(ctx context.Context, field graphql.CollectedField, obj *EditComment) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_EditComment_date,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.EditComment().Date(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_EditComment_date(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"EditComment\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _EditComment_comment(ctx context.Context, field graphql.CollectedField, obj *EditComment) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_EditComment_comment,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.EditComment().Comment(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_EditComment_comment(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"EditComment\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _EditComment_edit(ctx context.Context, field graphql.CollectedField, obj *EditComment) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_EditComment_edit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.EditComment().Edit(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_EditComment_edit(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"EditComment\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _EditVote_user(ctx context.Context, field graphql.CollectedField, obj *EditVote) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_EditVote_user,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.EditVote().User(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOUser2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUser,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_EditVote_user(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"EditVote\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_User_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_User_name(ctx, field)\n\t\t\tcase \"roles\":\n\t\t\t\treturn ec.fieldContext_User_roles(ctx, field)\n\t\t\tcase \"email\":\n\t\t\t\treturn ec.fieldContext_User_email(ctx, field)\n\t\t\tcase \"api_key\":\n\t\t\t\treturn ec.fieldContext_User_api_key(ctx, field)\n\t\t\tcase \"notification_subscriptions\":\n\t\t\t\treturn ec.fieldContext_User_notification_subscriptions(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_User_vote_count(ctx, field)\n\t\t\tcase \"edit_count\":\n\t\t\t\treturn ec.fieldContext_User_edit_count(ctx, field)\n\t\t\tcase \"api_calls\":\n\t\t\t\treturn ec.fieldContext_User_api_calls(ctx, field)\n\t\t\tcase \"invited_by\":\n\t\t\t\treturn ec.fieldContext_User_invited_by(ctx, field)\n\t\t\tcase \"invite_tokens\":\n\t\t\t\treturn ec.fieldContext_User_invite_tokens(ctx, field)\n\t\t\tcase \"active_invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_active_invite_codes(ctx, field)\n\t\t\tcase \"invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_invite_codes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type User\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _EditVote_date(ctx context.Context, field graphql.CollectedField, obj *EditVote) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_EditVote_date,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.EditVote().Date(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_EditVote_date(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"EditVote\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _EditVote_vote(ctx context.Context, field graphql.CollectedField, obj *EditVote) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_EditVote_vote,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.EditVote().Vote(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNVoteTypeEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐVoteTypeEnum,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_EditVote_vote(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"EditVote\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type VoteTypeEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _FailedOwnEdit_edit(ctx context.Context, field graphql.CollectedField, obj *FailedOwnEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_FailedOwnEdit_edit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Edit, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_FailedOwnEdit_edit(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"FailedOwnEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _FavoritePerformerEdit_edit(ctx context.Context, field graphql.CollectedField, obj *FavoritePerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_FavoritePerformerEdit_edit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Edit, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_FavoritePerformerEdit_edit(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"FavoritePerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _FavoritePerformerScene_scene(ctx context.Context, field graphql.CollectedField, obj *FavoritePerformerScene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_FavoritePerformerScene_scene,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Scene, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNScene2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐScene,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_FavoritePerformerScene_scene(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"FavoritePerformerScene\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Scene_id(ctx, field)\n\t\t\tcase \"title\":\n\t\t\t\treturn ec.fieldContext_Scene_title(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Scene_details(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_Scene_date(ctx, field)\n\t\t\tcase \"release_date\":\n\t\t\t\treturn ec.fieldContext_Scene_release_date(ctx, field)\n\t\t\tcase \"production_date\":\n\t\t\t\treturn ec.fieldContext_Scene_production_date(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Scene_urls(ctx, field)\n\t\t\tcase \"studio\":\n\t\t\t\treturn ec.fieldContext_Scene_studio(ctx, field)\n\t\t\tcase \"tags\":\n\t\t\t\treturn ec.fieldContext_Scene_tags(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Scene_images(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Scene_performers(ctx, field)\n\t\t\tcase \"fingerprints\":\n\t\t\t\treturn ec.fieldContext_Scene_fingerprints(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Scene_duration(ctx, field)\n\t\t\tcase \"director\":\n\t\t\t\treturn ec.fieldContext_Scene_director(ctx, field)\n\t\t\tcase \"code\":\n\t\t\t\treturn ec.fieldContext_Scene_code(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Scene_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Scene_edits(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Scene_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Scene_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Scene\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _FavoriteStudioEdit_edit(ctx context.Context, field graphql.CollectedField, obj *FavoriteStudioEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_FavoriteStudioEdit_edit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Edit, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_FavoriteStudioEdit_edit(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"FavoriteStudioEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _FavoriteStudioScene_scene(ctx context.Context, field graphql.CollectedField, obj *FavoriteStudioScene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_FavoriteStudioScene_scene,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Scene, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNScene2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐScene,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_FavoriteStudioScene_scene(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"FavoriteStudioScene\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Scene_id(ctx, field)\n\t\t\tcase \"title\":\n\t\t\t\treturn ec.fieldContext_Scene_title(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Scene_details(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_Scene_date(ctx, field)\n\t\t\tcase \"release_date\":\n\t\t\t\treturn ec.fieldContext_Scene_release_date(ctx, field)\n\t\t\tcase \"production_date\":\n\t\t\t\treturn ec.fieldContext_Scene_production_date(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Scene_urls(ctx, field)\n\t\t\tcase \"studio\":\n\t\t\t\treturn ec.fieldContext_Scene_studio(ctx, field)\n\t\t\tcase \"tags\":\n\t\t\t\treturn ec.fieldContext_Scene_tags(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Scene_images(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Scene_performers(ctx, field)\n\t\t\tcase \"fingerprints\":\n\t\t\t\treturn ec.fieldContext_Scene_fingerprints(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Scene_duration(ctx, field)\n\t\t\tcase \"director\":\n\t\t\t\treturn ec.fieldContext_Scene_director(ctx, field)\n\t\t\tcase \"code\":\n\t\t\t\treturn ec.fieldContext_Scene_code(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Scene_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Scene_edits(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Scene_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Scene_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Scene\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Fingerprint_hash(ctx context.Context, field graphql.CollectedField, obj *Fingerprint) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Fingerprint_hash,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Hash, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNFingerprintHash2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintHash,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Fingerprint_hash(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Fingerprint\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type FingerprintHash does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Fingerprint_algorithm(ctx context.Context, field graphql.CollectedField, obj *Fingerprint) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Fingerprint_algorithm,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Algorithm, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNFingerprintAlgorithm2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintAlgorithm,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Fingerprint_algorithm(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Fingerprint\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type FingerprintAlgorithm does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Fingerprint_duration(ctx context.Context, field graphql.CollectedField, obj *Fingerprint) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Fingerprint_duration,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Duration, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Fingerprint_duration(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Fingerprint\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Fingerprint_submissions(ctx context.Context, field graphql.CollectedField, obj *Fingerprint) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Fingerprint_submissions,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Submissions, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Fingerprint_submissions(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Fingerprint\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Fingerprint_reports(ctx context.Context, field graphql.CollectedField, obj *Fingerprint) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Fingerprint_reports,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Reports, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Fingerprint_reports(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Fingerprint\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Fingerprint_created(ctx context.Context, field graphql.CollectedField, obj *Fingerprint) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Fingerprint_created,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Created, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2timeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Fingerprint_created(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Fingerprint\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Fingerprint_updated(ctx context.Context, field graphql.CollectedField, obj *Fingerprint) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Fingerprint_updated,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Updated, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2timeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Fingerprint_updated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Fingerprint\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Fingerprint_user_submitted(ctx context.Context, field graphql.CollectedField, obj *Fingerprint) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Fingerprint_user_submitted,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.UserSubmitted, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Fingerprint_user_submitted(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Fingerprint\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Fingerprint_user_reported(ctx context.Context, field graphql.CollectedField, obj *Fingerprint) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Fingerprint_user_reported,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.UserReported, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Fingerprint_user_reported(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Fingerprint\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _FingerprintSubmissionResult_hash(ctx context.Context, field graphql.CollectedField, obj *FingerprintSubmissionResult) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_FingerprintSubmissionResult_hash,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Hash, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNFingerprintHash2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintHash,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_FingerprintSubmissionResult_hash(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"FingerprintSubmissionResult\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type FingerprintHash does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _FingerprintSubmissionResult_scene_id(ctx context.Context, field graphql.CollectedField, obj *FingerprintSubmissionResult) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_FingerprintSubmissionResult_scene_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.SceneID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_FingerprintSubmissionResult_scene_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"FingerprintSubmissionResult\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _FingerprintSubmissionResult_error(ctx context.Context, field graphql.CollectedField, obj *FingerprintSubmissionResult) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_FingerprintSubmissionResult_error,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Error, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_FingerprintSubmissionResult_error(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"FingerprintSubmissionResult\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _FingerprintedSceneEdit_edit(ctx context.Context, field graphql.CollectedField, obj *FingerprintedSceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_FingerprintedSceneEdit_edit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Edit, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_FingerprintedSceneEdit_edit(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"FingerprintedSceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _FuzzyDate_date(ctx context.Context, field graphql.CollectedField, obj *FuzzyDate) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_FuzzyDate_date,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Date, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNDate2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_FuzzyDate_date(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"FuzzyDate\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Date does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _FuzzyDate_accuracy(ctx context.Context, field graphql.CollectedField, obj *FuzzyDate) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_FuzzyDate_accuracy,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Accuracy, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNDateAccuracyEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDateAccuracyEnum,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_FuzzyDate_accuracy(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"FuzzyDate\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type DateAccuracyEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _GenderFacet_gender(ctx context.Context, field graphql.CollectedField, obj *GenderFacet) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_GenderFacet_gender,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Gender, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNGenderEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderEnum,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_GenderFacet_gender(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"GenderFacet\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type GenderEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _GenderFacet_count(ctx context.Context, field graphql.CollectedField, obj *GenderFacet) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_GenderFacet_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Count, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_GenderFacet_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"GenderFacet\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Image_id(ctx context.Context, field graphql.CollectedField, obj *Image) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Image_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Image_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Image\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Image_url(ctx context.Context, field graphql.CollectedField, obj *Image) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Image_url,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Image().URL(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Image_url(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Image\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Image_width(ctx context.Context, field graphql.CollectedField, obj *Image) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Image_width,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Width, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Image_width(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Image\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Image_height(ctx context.Context, field graphql.CollectedField, obj *Image) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Image_height,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Height, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Image_height(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Image\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _InviteKey_id(ctx context.Context, field graphql.CollectedField, obj *InviteKey) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_InviteKey_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_InviteKey_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"InviteKey\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _InviteKey_uses(ctx context.Context, field graphql.CollectedField, obj *InviteKey) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_InviteKey_uses,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Uses, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_InviteKey_uses(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"InviteKey\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _InviteKey_expires(ctx context.Context, field graphql.CollectedField, obj *InviteKey) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_InviteKey_expires,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Expires, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_InviteKey_expires(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"InviteKey\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Measurements_cup_size(ctx context.Context, field graphql.CollectedField, obj *Measurements) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Measurements_cup_size,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.CupSize, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Measurements_cup_size(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Measurements\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Measurements_band_size(ctx context.Context, field graphql.CollectedField, obj *Measurements) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Measurements_band_size,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.BandSize, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Measurements_band_size(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Measurements\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Measurements_waist(ctx context.Context, field graphql.CollectedField, obj *Measurements) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Measurements_waist,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Waist, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Measurements_waist(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Measurements\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Measurements_hip(ctx context.Context, field graphql.CollectedField, obj *Measurements) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Measurements_hip,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Hip, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Measurements_hip(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Measurements\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _ModAudit_id(ctx context.Context, field graphql.CollectedField, obj *ModAudit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_ModAudit_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_ModAudit_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"ModAudit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _ModAudit_action(ctx context.Context, field graphql.CollectedField, obj *ModAudit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_ModAudit_action,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.ModAudit().Action(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNModAuditActionEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAuditActionEnum,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_ModAudit_action(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"ModAudit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ModAuditActionEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _ModAudit_user(ctx context.Context, field graphql.CollectedField, obj *ModAudit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_ModAudit_user,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.ModAudit().User(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOUser2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUser,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_ModAudit_user(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"ModAudit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_User_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_User_name(ctx, field)\n\t\t\tcase \"roles\":\n\t\t\t\treturn ec.fieldContext_User_roles(ctx, field)\n\t\t\tcase \"email\":\n\t\t\t\treturn ec.fieldContext_User_email(ctx, field)\n\t\t\tcase \"api_key\":\n\t\t\t\treturn ec.fieldContext_User_api_key(ctx, field)\n\t\t\tcase \"notification_subscriptions\":\n\t\t\t\treturn ec.fieldContext_User_notification_subscriptions(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_User_vote_count(ctx, field)\n\t\t\tcase \"edit_count\":\n\t\t\t\treturn ec.fieldContext_User_edit_count(ctx, field)\n\t\t\tcase \"api_calls\":\n\t\t\t\treturn ec.fieldContext_User_api_calls(ctx, field)\n\t\t\tcase \"invited_by\":\n\t\t\t\treturn ec.fieldContext_User_invited_by(ctx, field)\n\t\t\tcase \"invite_tokens\":\n\t\t\t\treturn ec.fieldContext_User_invite_tokens(ctx, field)\n\t\t\tcase \"active_invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_active_invite_codes(ctx, field)\n\t\t\tcase \"invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_invite_codes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type User\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _ModAudit_target_id(ctx context.Context, field graphql.CollectedField, obj *ModAudit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_ModAudit_target_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.TargetID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_ModAudit_target_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"ModAudit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _ModAudit_target_type(ctx context.Context, field graphql.CollectedField, obj *ModAudit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_ModAudit_target_type,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.TargetType, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_ModAudit_target_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"ModAudit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _ModAudit_data(ctx context.Context, field graphql.CollectedField, obj *ModAudit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_ModAudit_data,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Data, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_ModAudit_data(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"ModAudit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _ModAudit_reason(ctx context.Context, field graphql.CollectedField, obj *ModAudit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_ModAudit_reason,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Reason, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_ModAudit_reason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"ModAudit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _ModAudit_created_at(ctx context.Context, field graphql.CollectedField, obj *ModAudit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_ModAudit_created_at,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.CreatedAt, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2timeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_ModAudit_created_at(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"ModAudit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_sceneCreate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_sceneCreate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SceneCreate(ctx, fc.Args[\"input\"].(SceneCreateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODIFY\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Scene\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Scene\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOScene2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐScene,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_sceneCreate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Scene_id(ctx, field)\n\t\t\tcase \"title\":\n\t\t\t\treturn ec.fieldContext_Scene_title(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Scene_details(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_Scene_date(ctx, field)\n\t\t\tcase \"release_date\":\n\t\t\t\treturn ec.fieldContext_Scene_release_date(ctx, field)\n\t\t\tcase \"production_date\":\n\t\t\t\treturn ec.fieldContext_Scene_production_date(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Scene_urls(ctx, field)\n\t\t\tcase \"studio\":\n\t\t\t\treturn ec.fieldContext_Scene_studio(ctx, field)\n\t\t\tcase \"tags\":\n\t\t\t\treturn ec.fieldContext_Scene_tags(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Scene_images(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Scene_performers(ctx, field)\n\t\t\tcase \"fingerprints\":\n\t\t\t\treturn ec.fieldContext_Scene_fingerprints(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Scene_duration(ctx, field)\n\t\t\tcase \"director\":\n\t\t\t\treturn ec.fieldContext_Scene_director(ctx, field)\n\t\t\tcase \"code\":\n\t\t\t\treturn ec.fieldContext_Scene_code(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Scene_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Scene_edits(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Scene_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Scene_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Scene\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_sceneCreate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_sceneUpdate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_sceneUpdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SceneUpdate(ctx, fc.Args[\"input\"].(SceneUpdateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODIFY\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Scene\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Scene\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOScene2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐScene,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_sceneUpdate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Scene_id(ctx, field)\n\t\t\tcase \"title\":\n\t\t\t\treturn ec.fieldContext_Scene_title(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Scene_details(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_Scene_date(ctx, field)\n\t\t\tcase \"release_date\":\n\t\t\t\treturn ec.fieldContext_Scene_release_date(ctx, field)\n\t\t\tcase \"production_date\":\n\t\t\t\treturn ec.fieldContext_Scene_production_date(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Scene_urls(ctx, field)\n\t\t\tcase \"studio\":\n\t\t\t\treturn ec.fieldContext_Scene_studio(ctx, field)\n\t\t\tcase \"tags\":\n\t\t\t\treturn ec.fieldContext_Scene_tags(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Scene_images(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Scene_performers(ctx, field)\n\t\t\tcase \"fingerprints\":\n\t\t\t\treturn ec.fieldContext_Scene_fingerprints(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Scene_duration(ctx, field)\n\t\t\tcase \"director\":\n\t\t\t\treturn ec.fieldContext_Scene_director(ctx, field)\n\t\t\tcase \"code\":\n\t\t\t\treturn ec.fieldContext_Scene_code(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Scene_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Scene_edits(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Scene_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Scene_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Scene\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_sceneUpdate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_sceneDestroy(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_sceneDestroy,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SceneDestroy(ctx, fc.Args[\"input\"].(SceneDestroyInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODIFY\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_sceneDestroy(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_sceneDestroy_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_performerCreate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_performerCreate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().PerformerCreate(ctx, fc.Args[\"input\"].(PerformerCreateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODIFY\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Performer\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Performer\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOPerformer2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformer,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_performerCreate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Performer_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Performer_name(ctx, field)\n\t\t\tcase \"disambiguation\":\n\t\t\t\treturn ec.fieldContext_Performer_disambiguation(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Performer_aliases(ctx, field)\n\t\t\tcase \"gender\":\n\t\t\t\treturn ec.fieldContext_Performer_gender(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Performer_urls(ctx, field)\n\t\t\tcase \"birthdate\":\n\t\t\t\treturn ec.fieldContext_Performer_birthdate(ctx, field)\n\t\t\tcase \"birth_date\":\n\t\t\t\treturn ec.fieldContext_Performer_birth_date(ctx, field)\n\t\t\tcase \"death_date\":\n\t\t\t\treturn ec.fieldContext_Performer_death_date(ctx, field)\n\t\t\tcase \"age\":\n\t\t\t\treturn ec.fieldContext_Performer_age(ctx, field)\n\t\t\tcase \"ethnicity\":\n\t\t\t\treturn ec.fieldContext_Performer_ethnicity(ctx, field)\n\t\t\tcase \"country\":\n\t\t\t\treturn ec.fieldContext_Performer_country(ctx, field)\n\t\t\tcase \"eye_color\":\n\t\t\t\treturn ec.fieldContext_Performer_eye_color(ctx, field)\n\t\t\tcase \"hair_color\":\n\t\t\t\treturn ec.fieldContext_Performer_hair_color(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Performer_height(ctx, field)\n\t\t\tcase \"measurements\":\n\t\t\t\treturn ec.fieldContext_Performer_measurements(ctx, field)\n\t\t\tcase \"cup_size\":\n\t\t\t\treturn ec.fieldContext_Performer_cup_size(ctx, field)\n\t\t\tcase \"band_size\":\n\t\t\t\treturn ec.fieldContext_Performer_band_size(ctx, field)\n\t\t\tcase \"waist_size\":\n\t\t\t\treturn ec.fieldContext_Performer_waist_size(ctx, field)\n\t\t\tcase \"hip_size\":\n\t\t\t\treturn ec.fieldContext_Performer_hip_size(ctx, field)\n\t\t\tcase \"breast_type\":\n\t\t\t\treturn ec.fieldContext_Performer_breast_type(ctx, field)\n\t\t\tcase \"career_start_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_start_year(ctx, field)\n\t\t\tcase \"career_end_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_end_year(ctx, field)\n\t\t\tcase \"tattoos\":\n\t\t\t\treturn ec.fieldContext_Performer_tattoos(ctx, field)\n\t\t\tcase \"piercings\":\n\t\t\t\treturn ec.fieldContext_Performer_piercings(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Performer_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Performer_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Performer_edits(ctx, field)\n\t\t\tcase \"scene_count\":\n\t\t\t\treturn ec.fieldContext_Performer_scene_count(ctx, field)\n\t\t\tcase \"scenes\":\n\t\t\t\treturn ec.fieldContext_Performer_scenes(ctx, field)\n\t\t\tcase \"merged_ids\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_ids(ctx, field)\n\t\t\tcase \"merged_into_id\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_into_id(ctx, field)\n\t\t\tcase \"studios\":\n\t\t\t\treturn ec.fieldContext_Performer_studios(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Performer_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Performer_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Performer_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Performer\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_performerCreate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_performerUpdate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_performerUpdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().PerformerUpdate(ctx, fc.Args[\"input\"].(PerformerUpdateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODIFY\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Performer\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Performer\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOPerformer2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformer,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_performerUpdate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Performer_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Performer_name(ctx, field)\n\t\t\tcase \"disambiguation\":\n\t\t\t\treturn ec.fieldContext_Performer_disambiguation(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Performer_aliases(ctx, field)\n\t\t\tcase \"gender\":\n\t\t\t\treturn ec.fieldContext_Performer_gender(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Performer_urls(ctx, field)\n\t\t\tcase \"birthdate\":\n\t\t\t\treturn ec.fieldContext_Performer_birthdate(ctx, field)\n\t\t\tcase \"birth_date\":\n\t\t\t\treturn ec.fieldContext_Performer_birth_date(ctx, field)\n\t\t\tcase \"death_date\":\n\t\t\t\treturn ec.fieldContext_Performer_death_date(ctx, field)\n\t\t\tcase \"age\":\n\t\t\t\treturn ec.fieldContext_Performer_age(ctx, field)\n\t\t\tcase \"ethnicity\":\n\t\t\t\treturn ec.fieldContext_Performer_ethnicity(ctx, field)\n\t\t\tcase \"country\":\n\t\t\t\treturn ec.fieldContext_Performer_country(ctx, field)\n\t\t\tcase \"eye_color\":\n\t\t\t\treturn ec.fieldContext_Performer_eye_color(ctx, field)\n\t\t\tcase \"hair_color\":\n\t\t\t\treturn ec.fieldContext_Performer_hair_color(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Performer_height(ctx, field)\n\t\t\tcase \"measurements\":\n\t\t\t\treturn ec.fieldContext_Performer_measurements(ctx, field)\n\t\t\tcase \"cup_size\":\n\t\t\t\treturn ec.fieldContext_Performer_cup_size(ctx, field)\n\t\t\tcase \"band_size\":\n\t\t\t\treturn ec.fieldContext_Performer_band_size(ctx, field)\n\t\t\tcase \"waist_size\":\n\t\t\t\treturn ec.fieldContext_Performer_waist_size(ctx, field)\n\t\t\tcase \"hip_size\":\n\t\t\t\treturn ec.fieldContext_Performer_hip_size(ctx, field)\n\t\t\tcase \"breast_type\":\n\t\t\t\treturn ec.fieldContext_Performer_breast_type(ctx, field)\n\t\t\tcase \"career_start_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_start_year(ctx, field)\n\t\t\tcase \"career_end_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_end_year(ctx, field)\n\t\t\tcase \"tattoos\":\n\t\t\t\treturn ec.fieldContext_Performer_tattoos(ctx, field)\n\t\t\tcase \"piercings\":\n\t\t\t\treturn ec.fieldContext_Performer_piercings(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Performer_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Performer_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Performer_edits(ctx, field)\n\t\t\tcase \"scene_count\":\n\t\t\t\treturn ec.fieldContext_Performer_scene_count(ctx, field)\n\t\t\tcase \"scenes\":\n\t\t\t\treturn ec.fieldContext_Performer_scenes(ctx, field)\n\t\t\tcase \"merged_ids\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_ids(ctx, field)\n\t\t\tcase \"merged_into_id\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_into_id(ctx, field)\n\t\t\tcase \"studios\":\n\t\t\t\treturn ec.fieldContext_Performer_studios(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Performer_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Performer_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Performer_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Performer\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_performerUpdate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_performerDestroy(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_performerDestroy,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().PerformerDestroy(ctx, fc.Args[\"input\"].(PerformerDestroyInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODIFY\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_performerDestroy(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_performerDestroy_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_studioCreate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_studioCreate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().StudioCreate(ctx, fc.Args[\"input\"].(StudioCreateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODIFY\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Studio\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Studio\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOStudio2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudio,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_studioCreate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Studio_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Studio_name(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Studio_aliases(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Studio_urls(ctx, field)\n\t\t\tcase \"parent\":\n\t\t\t\treturn ec.fieldContext_Studio_parent(ctx, field)\n\t\t\tcase \"child_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_child_studios(ctx, field)\n\t\t\tcase \"sub_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_sub_studios(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Studio_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Studio_deleted(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Studio_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Studio_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Studio_updated(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Studio_performers(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Studio\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_studioCreate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_studioUpdate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_studioUpdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().StudioUpdate(ctx, fc.Args[\"input\"].(StudioUpdateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODIFY\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Studio\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Studio\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOStudio2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudio,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_studioUpdate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Studio_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Studio_name(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Studio_aliases(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Studio_urls(ctx, field)\n\t\t\tcase \"parent\":\n\t\t\t\treturn ec.fieldContext_Studio_parent(ctx, field)\n\t\t\tcase \"child_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_child_studios(ctx, field)\n\t\t\tcase \"sub_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_sub_studios(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Studio_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Studio_deleted(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Studio_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Studio_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Studio_updated(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Studio_performers(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Studio\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_studioUpdate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_studioDestroy(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_studioDestroy,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().StudioDestroy(ctx, fc.Args[\"input\"].(StudioDestroyInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODIFY\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_studioDestroy(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_studioDestroy_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_tagCreate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_tagCreate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().TagCreate(ctx, fc.Args[\"input\"].(TagCreateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODIFY\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Tag\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Tag\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOTag2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTag,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_tagCreate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Tag_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Tag_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Tag_description(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Tag_aliases(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Tag_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Tag_edits(ctx, field)\n\t\t\tcase \"category\":\n\t\t\t\treturn ec.fieldContext_Tag_category(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Tag_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Tag_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Tag\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_tagCreate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_tagUpdate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_tagUpdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().TagUpdate(ctx, fc.Args[\"input\"].(TagUpdateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODIFY\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Tag\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Tag\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOTag2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTag,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_tagUpdate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Tag_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Tag_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Tag_description(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Tag_aliases(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Tag_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Tag_edits(ctx, field)\n\t\t\tcase \"category\":\n\t\t\t\treturn ec.fieldContext_Tag_category(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Tag_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Tag_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Tag\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_tagUpdate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_tagDestroy(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_tagDestroy,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().TagDestroy(ctx, fc.Args[\"input\"].(TagDestroyInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODIFY\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_tagDestroy(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_tagDestroy_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_userCreate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_userCreate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().UserCreate(ctx, fc.Args[\"input\"].(UserCreateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"ADMIN\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *User\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *User\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOUser2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUser,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_userCreate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_User_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_User_name(ctx, field)\n\t\t\tcase \"roles\":\n\t\t\t\treturn ec.fieldContext_User_roles(ctx, field)\n\t\t\tcase \"email\":\n\t\t\t\treturn ec.fieldContext_User_email(ctx, field)\n\t\t\tcase \"api_key\":\n\t\t\t\treturn ec.fieldContext_User_api_key(ctx, field)\n\t\t\tcase \"notification_subscriptions\":\n\t\t\t\treturn ec.fieldContext_User_notification_subscriptions(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_User_vote_count(ctx, field)\n\t\t\tcase \"edit_count\":\n\t\t\t\treturn ec.fieldContext_User_edit_count(ctx, field)\n\t\t\tcase \"api_calls\":\n\t\t\t\treturn ec.fieldContext_User_api_calls(ctx, field)\n\t\t\tcase \"invited_by\":\n\t\t\t\treturn ec.fieldContext_User_invited_by(ctx, field)\n\t\t\tcase \"invite_tokens\":\n\t\t\t\treturn ec.fieldContext_User_invite_tokens(ctx, field)\n\t\t\tcase \"active_invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_active_invite_codes(ctx, field)\n\t\t\tcase \"invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_invite_codes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type User\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_userCreate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_userUpdate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_userUpdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().UserUpdate(ctx, fc.Args[\"input\"].(UserUpdateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"ADMIN\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *User\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *User\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOUser2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUser,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_userUpdate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_User_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_User_name(ctx, field)\n\t\t\tcase \"roles\":\n\t\t\t\treturn ec.fieldContext_User_roles(ctx, field)\n\t\t\tcase \"email\":\n\t\t\t\treturn ec.fieldContext_User_email(ctx, field)\n\t\t\tcase \"api_key\":\n\t\t\t\treturn ec.fieldContext_User_api_key(ctx, field)\n\t\t\tcase \"notification_subscriptions\":\n\t\t\t\treturn ec.fieldContext_User_notification_subscriptions(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_User_vote_count(ctx, field)\n\t\t\tcase \"edit_count\":\n\t\t\t\treturn ec.fieldContext_User_edit_count(ctx, field)\n\t\t\tcase \"api_calls\":\n\t\t\t\treturn ec.fieldContext_User_api_calls(ctx, field)\n\t\t\tcase \"invited_by\":\n\t\t\t\treturn ec.fieldContext_User_invited_by(ctx, field)\n\t\t\tcase \"invite_tokens\":\n\t\t\t\treturn ec.fieldContext_User_invite_tokens(ctx, field)\n\t\t\tcase \"active_invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_active_invite_codes(ctx, field)\n\t\t\tcase \"invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_invite_codes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type User\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_userUpdate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_userDestroy(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_userDestroy,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().UserDestroy(ctx, fc.Args[\"input\"].(UserDestroyInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"ADMIN\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_userDestroy(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_userDestroy_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_imageCreate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_imageCreate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().ImageCreate(ctx, fc.Args[\"input\"].(ImageCreateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Image\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Image\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOImage2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImage,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_imageCreate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_imageCreate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_imageDestroy(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_imageDestroy,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().ImageDestroy(ctx, fc.Args[\"input\"].(ImageDestroyInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODIFY\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_imageDestroy(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_imageDestroy_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_newUser(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_newUser,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().NewUser(ctx, fc.Args[\"input\"].(NewUserInput))\n\t\t},\n\t\tnil,\n\t\tec.marshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_newUser(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_newUser_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_activateNewUser(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_activateNewUser,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().ActivateNewUser(ctx, fc.Args[\"input\"].(ActivateNewUserInput))\n\t\t},\n\t\tnil,\n\t\tec.marshalOUser2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUser,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_activateNewUser(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_User_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_User_name(ctx, field)\n\t\t\tcase \"roles\":\n\t\t\t\treturn ec.fieldContext_User_roles(ctx, field)\n\t\t\tcase \"email\":\n\t\t\t\treturn ec.fieldContext_User_email(ctx, field)\n\t\t\tcase \"api_key\":\n\t\t\t\treturn ec.fieldContext_User_api_key(ctx, field)\n\t\t\tcase \"notification_subscriptions\":\n\t\t\t\treturn ec.fieldContext_User_notification_subscriptions(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_User_vote_count(ctx, field)\n\t\t\tcase \"edit_count\":\n\t\t\t\treturn ec.fieldContext_User_edit_count(ctx, field)\n\t\t\tcase \"api_calls\":\n\t\t\t\treturn ec.fieldContext_User_api_calls(ctx, field)\n\t\t\tcase \"invited_by\":\n\t\t\t\treturn ec.fieldContext_User_invited_by(ctx, field)\n\t\t\tcase \"invite_tokens\":\n\t\t\t\treturn ec.fieldContext_User_invite_tokens(ctx, field)\n\t\t\tcase \"active_invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_active_invite_codes(ctx, field)\n\t\t\tcase \"invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_invite_codes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type User\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_activateNewUser_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_generateInviteCode(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_generateInviteCode,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Mutation().GenerateInviteCode(ctx)\n\t\t},\n\t\tnil,\n\t\tec.marshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_generateInviteCode(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_generateInviteCodes(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_generateInviteCodes,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().GenerateInviteCodes(ctx, fc.Args[\"input\"].(*GenerateInviteCodeInput))\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_generateInviteCodes(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_generateInviteCodes_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_rescindInviteCode(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_rescindInviteCode,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().RescindInviteCode(ctx, fc.Args[\"code\"].(uuid.UUID))\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_rescindInviteCode(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_rescindInviteCode_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_grantInvite(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_grantInvite,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().GrantInvite(ctx, fc.Args[\"input\"].(GrantInviteInput))\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_grantInvite(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_grantInvite_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_revokeInvite(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_revokeInvite,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().RevokeInvite(ctx, fc.Args[\"input\"].(RevokeInviteInput))\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_revokeInvite(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_revokeInvite_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_tagCategoryCreate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_tagCategoryCreate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().TagCategoryCreate(ctx, fc.Args[\"input\"].(TagCategoryCreateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"ADMIN\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *TagCategory\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *TagCategory\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOTagCategory2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategory,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_tagCategoryCreate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_TagCategory_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_TagCategory_name(ctx, field)\n\t\t\tcase \"group\":\n\t\t\t\treturn ec.fieldContext_TagCategory_group(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_TagCategory_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type TagCategory\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_tagCategoryCreate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_tagCategoryUpdate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_tagCategoryUpdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().TagCategoryUpdate(ctx, fc.Args[\"input\"].(TagCategoryUpdateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"ADMIN\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *TagCategory\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *TagCategory\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOTagCategory2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategory,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_tagCategoryUpdate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_TagCategory_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_TagCategory_name(ctx, field)\n\t\t\tcase \"group\":\n\t\t\t\treturn ec.fieldContext_TagCategory_group(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_TagCategory_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type TagCategory\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_tagCategoryUpdate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_tagCategoryDestroy(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_tagCategoryDestroy,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().TagCategoryDestroy(ctx, fc.Args[\"input\"].(TagCategoryDestroyInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"ADMIN\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_tagCategoryDestroy(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_tagCategoryDestroy_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_siteCreate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_siteCreate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SiteCreate(ctx, fc.Args[\"input\"].(SiteCreateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"ADMIN\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Site\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Site\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOSite2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSite,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_siteCreate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Site_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Site_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Site_description(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Site_url(ctx, field)\n\t\t\tcase \"regex\":\n\t\t\t\treturn ec.fieldContext_Site_regex(ctx, field)\n\t\t\tcase \"valid_types\":\n\t\t\t\treturn ec.fieldContext_Site_valid_types(ctx, field)\n\t\t\tcase \"icon\":\n\t\t\t\treturn ec.fieldContext_Site_icon(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Site_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Site_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Site\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_siteCreate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_siteUpdate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_siteUpdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SiteUpdate(ctx, fc.Args[\"input\"].(SiteUpdateInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"ADMIN\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Site\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Site\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOSite2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSite,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_siteUpdate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Site_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Site_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Site_description(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Site_url(ctx, field)\n\t\t\tcase \"regex\":\n\t\t\t\treturn ec.fieldContext_Site_regex(ctx, field)\n\t\t\tcase \"valid_types\":\n\t\t\t\treturn ec.fieldContext_Site_valid_types(ctx, field)\n\t\t\tcase \"icon\":\n\t\t\t\treturn ec.fieldContext_Site_icon(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Site_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Site_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Site\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_siteUpdate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_siteDestroy(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_siteDestroy,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SiteDestroy(ctx, fc.Args[\"input\"].(SiteDestroyInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"ADMIN\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_siteDestroy(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_siteDestroy_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_regenerateAPIKey(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_regenerateAPIKey,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().RegenerateAPIKey(ctx, fc.Args[\"userID\"].(*uuid.UUID))\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_regenerateAPIKey(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_regenerateAPIKey_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_resetPassword(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_resetPassword,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().ResetPassword(ctx, fc.Args[\"input\"].(ResetPasswordInput))\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_resetPassword(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_resetPassword_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_changePassword(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_changePassword,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().ChangePassword(ctx, fc.Args[\"input\"].(UserChangePasswordInput))\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_changePassword(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_changePassword_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_requestChangeEmail(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_requestChangeEmail,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Mutation().RequestChangeEmail(ctx)\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal UserChangeEmailStatus\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal UserChangeEmailStatus\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNUserChangeEmailStatus2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserChangeEmailStatus,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_requestChangeEmail(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type UserChangeEmailStatus does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_validateChangeEmail(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_validateChangeEmail,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().ValidateChangeEmail(ctx, fc.Args[\"token\"].(uuid.UUID), fc.Args[\"email\"].(string))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal UserChangeEmailStatus\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal UserChangeEmailStatus\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNUserChangeEmailStatus2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserChangeEmailStatus,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_validateChangeEmail(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type UserChangeEmailStatus does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_validateChangeEmail_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_confirmChangeEmail(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_confirmChangeEmail,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().ConfirmChangeEmail(ctx, fc.Args[\"token\"].(uuid.UUID))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal UserChangeEmailStatus\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal UserChangeEmailStatus\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNUserChangeEmailStatus2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserChangeEmailStatus,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_confirmChangeEmail(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type UserChangeEmailStatus does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_confirmChangeEmail_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_sceneEdit(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_sceneEdit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SceneEdit(ctx, fc.Args[\"input\"].(SceneEditInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_sceneEdit(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_sceneEdit_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_performerEdit(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_performerEdit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().PerformerEdit(ctx, fc.Args[\"input\"].(PerformerEditInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_performerEdit(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_performerEdit_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_studioEdit(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_studioEdit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().StudioEdit(ctx, fc.Args[\"input\"].(StudioEditInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_studioEdit(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_studioEdit_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_tagEdit(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_tagEdit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().TagEdit(ctx, fc.Args[\"input\"].(TagEditInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_tagEdit(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_tagEdit_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_sceneEditUpdate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_sceneEditUpdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SceneEditUpdate(ctx, fc.Args[\"id\"].(uuid.UUID), fc.Args[\"input\"].(SceneEditInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_sceneEditUpdate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_sceneEditUpdate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_performerEditUpdate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_performerEditUpdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().PerformerEditUpdate(ctx, fc.Args[\"id\"].(uuid.UUID), fc.Args[\"input\"].(PerformerEditInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_performerEditUpdate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_performerEditUpdate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_studioEditUpdate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_studioEditUpdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().StudioEditUpdate(ctx, fc.Args[\"id\"].(uuid.UUID), fc.Args[\"input\"].(StudioEditInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_studioEditUpdate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_studioEditUpdate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_tagEditUpdate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_tagEditUpdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().TagEditUpdate(ctx, fc.Args[\"id\"].(uuid.UUID), fc.Args[\"input\"].(TagEditInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_tagEditUpdate(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_tagEditUpdate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_editVote(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_editVote,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().EditVote(ctx, fc.Args[\"input\"].(EditVoteInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"VOTE\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_editVote(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_editVote_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_editComment(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_editComment,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().EditComment(ctx, fc.Args[\"input\"].(EditCommentInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_editComment(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_editComment_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_applyEdit(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_applyEdit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().ApplyEdit(ctx, fc.Args[\"input\"].(ApplyEditInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"ADMIN\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_applyEdit(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_applyEdit_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_cancelEdit(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_cancelEdit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().CancelEdit(ctx, fc.Args[\"input\"].(CancelEditInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_cancelEdit(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_cancelEdit_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_deleteEdit(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_deleteEdit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().DeleteEdit(ctx, fc.Args[\"input\"].(DeleteEditInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODERATE\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_deleteEdit(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_deleteEdit_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_amendEdit(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_amendEdit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().AmendEdit(ctx, fc.Args[\"input\"].(AmendEditInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODERATE\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_amendEdit(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_amendEdit_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_submitFingerprint(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_submitFingerprint,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SubmitFingerprint(ctx, fc.Args[\"input\"].(FingerprintSubmission))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_submitFingerprint(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_submitFingerprint_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_submitFingerprints(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_submitFingerprints,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SubmitFingerprints(ctx, fc.Args[\"input\"].([]FingerprintBatchSubmission))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal []FingerprintSubmissionResult\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal []FingerprintSubmissionResult\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNFingerprintSubmissionResult2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintSubmissionResultᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_submitFingerprints(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"hash\":\n\t\t\t\treturn ec.fieldContext_FingerprintSubmissionResult_hash(ctx, field)\n\t\t\tcase \"scene_id\":\n\t\t\t\treturn ec.fieldContext_FingerprintSubmissionResult_scene_id(ctx, field)\n\t\t\tcase \"error\":\n\t\t\t\treturn ec.fieldContext_FingerprintSubmissionResult_error(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type FingerprintSubmissionResult\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_submitFingerprints_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_sceneMoveFingerprintSubmissions(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_sceneMoveFingerprintSubmissions,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SceneMoveFingerprintSubmissions(ctx, fc.Args[\"input\"].(MoveFingerprintSubmissionsInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODERATE\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_sceneMoveFingerprintSubmissions(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_sceneMoveFingerprintSubmissions_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_sceneDeleteFingerprintSubmissions(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_sceneDeleteFingerprintSubmissions,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SceneDeleteFingerprintSubmissions(ctx, fc.Args[\"input\"].(DeleteFingerprintSubmissionsInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"MODERATE\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_sceneDeleteFingerprintSubmissions(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_sceneDeleteFingerprintSubmissions_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_submitSceneDraft(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_submitSceneDraft,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SubmitSceneDraft(ctx, fc.Args[\"input\"].(SceneDraftInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *DraftSubmissionStatus\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *DraftSubmissionStatus\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNDraftSubmissionStatus2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftSubmissionStatus,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_submitSceneDraft(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_DraftSubmissionStatus_id(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type DraftSubmissionStatus\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_submitSceneDraft_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_submitPerformerDraft(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_submitPerformerDraft,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().SubmitPerformerDraft(ctx, fc.Args[\"input\"].(PerformerDraftInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *DraftSubmissionStatus\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *DraftSubmissionStatus\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNDraftSubmissionStatus2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftSubmissionStatus,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_submitPerformerDraft(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_DraftSubmissionStatus_id(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type DraftSubmissionStatus\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_submitPerformerDraft_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_destroyDraft(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_destroyDraft,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().DestroyDraft(ctx, fc.Args[\"id\"].(uuid.UUID))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"EDIT\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_destroyDraft(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_destroyDraft_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_favoritePerformer(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_favoritePerformer,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().FavoritePerformer(ctx, fc.Args[\"id\"].(uuid.UUID), fc.Args[\"favorite\"].(bool))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_favoritePerformer(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_favoritePerformer_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_favoriteStudio(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_favoriteStudio,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().FavoriteStudio(ctx, fc.Args[\"id\"].(uuid.UUID), fc.Args[\"favorite\"].(bool))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_favoriteStudio(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_favoriteStudio_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_markNotificationsRead(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_markNotificationsRead,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().MarkNotificationsRead(ctx, fc.Args[\"notification\"].(*MarkNotificationReadInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_markNotificationsRead(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_markNotificationsRead_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Mutation_updateNotificationSubscriptions(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Mutation_updateNotificationSubscriptions,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Mutation().UpdateNotificationSubscriptions(ctx, fc.Args[\"subscriptions\"].([]NotificationEnum))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal bool\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Mutation_updateNotificationSubscriptions(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Mutation\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Mutation_updateNotificationSubscriptions_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Notification_created(ctx context.Context, field graphql.CollectedField, obj *Notification) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Notification_created,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Notification().Created(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Notification_created(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Notification\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Notification_read(ctx context.Context, field graphql.CollectedField, obj *Notification) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Notification_read,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Notification().Read(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Notification_read(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Notification\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Notification_data(ctx context.Context, field graphql.CollectedField, obj *Notification) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Notification_data,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Notification().Data(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNNotificationData2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationData,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Notification_data(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Notification\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type NotificationData does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_id(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_name(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_disambiguation(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_disambiguation,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Disambiguation, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_disambiguation(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_aliases(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Performer().Aliases(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2ᚕstringᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_gender(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_gender,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Gender, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOGenderEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderEnum,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_gender(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type GenderEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_urls(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Performer().Urls(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_URL_url(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext_URL_type(ctx, field)\n\t\t\tcase \"site\":\n\t\t\t\treturn ec.fieldContext_URL_site(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type URL\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_birthdate(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_birthdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Performer().Birthdate(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOFuzzyDate2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFuzzyDate,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_birthdate(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_FuzzyDate_date(ctx, field)\n\t\t\tcase \"accuracy\":\n\t\t\t\treturn ec.fieldContext_FuzzyDate_accuracy(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type FuzzyDate\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_birth_date(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_birth_date,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.BirthDate, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_birth_date(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_death_date(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_death_date,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.DeathDate, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_death_date(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_age(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_age,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Performer().Age(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_age(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_ethnicity(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_ethnicity,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Ethnicity, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOEthnicityEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEthnicityEnum,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_ethnicity(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type EthnicityEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_country(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_country,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Country, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_country(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_eye_color(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_eye_color,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.EyeColor, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOEyeColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEyeColorEnum,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_eye_color(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type EyeColorEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_hair_color(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_hair_color,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.HairColor, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOHairColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐHairColorEnum,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_hair_color(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type HairColorEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_height(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_height,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Height, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_height(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_measurements(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_measurements,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Performer().Measurements(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNMeasurements2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMeasurements,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_measurements(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"cup_size\":\n\t\t\t\treturn ec.fieldContext_Measurements_cup_size(ctx, field)\n\t\t\tcase \"band_size\":\n\t\t\t\treturn ec.fieldContext_Measurements_band_size(ctx, field)\n\t\t\tcase \"waist\":\n\t\t\t\treturn ec.fieldContext_Measurements_waist(ctx, field)\n\t\t\tcase \"hip\":\n\t\t\t\treturn ec.fieldContext_Measurements_hip(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Measurements\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_cup_size(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_cup_size,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.CupSize, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_cup_size(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_band_size(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_band_size,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.BandSize, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_band_size(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_waist_size(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_waist_size,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.WaistSize, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_waist_size(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_hip_size(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_hip_size,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.HipSize, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_hip_size(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_breast_type(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_breast_type,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.BreastType, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOBreastTypeEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBreastTypeEnum,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_breast_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type BreastTypeEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_career_start_year(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_career_start_year,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.CareerStartYear, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_career_start_year(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_career_end_year(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_career_end_year,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.CareerEndYear, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_career_end_year(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_tattoos(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_tattoos,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Performer().Tattoos(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOBodyModification2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_tattoos(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"location\":\n\t\t\t\treturn ec.fieldContext_BodyModification_location(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_BodyModification_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type BodyModification\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_piercings(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_piercings,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Performer().Piercings(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOBodyModification2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_piercings(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"location\":\n\t\t\t\treturn ec.fieldContext_BodyModification_location(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_BodyModification_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type BodyModification\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_images(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_images,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Performer().Images(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_images(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_deleted(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_deleted,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Deleted, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_deleted(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_edits(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_edits,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Performer().Edits(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNEdit2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_edits(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_scene_count(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_scene_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Performer().SceneCount(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_scene_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_scenes(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_scenes,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Performer().Scenes(ctx, obj, fc.Args[\"input\"].(*PerformerScenesInput))\n\t\t},\n\t\tnil,\n\t\tec.marshalNScene2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_scenes(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Scene_id(ctx, field)\n\t\t\tcase \"title\":\n\t\t\t\treturn ec.fieldContext_Scene_title(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Scene_details(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_Scene_date(ctx, field)\n\t\t\tcase \"release_date\":\n\t\t\t\treturn ec.fieldContext_Scene_release_date(ctx, field)\n\t\t\tcase \"production_date\":\n\t\t\t\treturn ec.fieldContext_Scene_production_date(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Scene_urls(ctx, field)\n\t\t\tcase \"studio\":\n\t\t\t\treturn ec.fieldContext_Scene_studio(ctx, field)\n\t\t\tcase \"tags\":\n\t\t\t\treturn ec.fieldContext_Scene_tags(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Scene_images(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Scene_performers(ctx, field)\n\t\t\tcase \"fingerprints\":\n\t\t\t\treturn ec.fieldContext_Scene_fingerprints(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Scene_duration(ctx, field)\n\t\t\tcase \"director\":\n\t\t\t\treturn ec.fieldContext_Scene_director(ctx, field)\n\t\t\tcase \"code\":\n\t\t\t\treturn ec.fieldContext_Scene_code(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Scene_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Scene_edits(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Scene_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Scene_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Scene\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Performer_scenes_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_merged_ids(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_merged_ids,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Performer().MergedIds(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_merged_ids(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_merged_into_id(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_merged_into_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Performer().MergedIntoID(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_merged_into_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_studios(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_studios,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Performer().Studios(ctx, obj, fc.Args[\"studio_id\"].(*uuid.UUID))\n\t\t},\n\t\tnil,\n\t\tec.marshalNPerformerStudio2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerStudioᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_studios(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"studio\":\n\t\t\t\treturn ec.fieldContext_PerformerStudio_studio(ctx, field)\n\t\t\tcase \"scene_count\":\n\t\t\t\treturn ec.fieldContext_PerformerStudio_scene_count(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type PerformerStudio\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Performer_studios_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_is_favorite(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_is_favorite,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Performer().IsFavorite(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_is_favorite(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_created(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_created,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Created, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2timeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_created(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Performer_updated(ctx context.Context, field graphql.CollectedField, obj *Performer) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Performer_updated,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Updated, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2timeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Performer_updated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Performer\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerAppearance_performer(ctx context.Context, field graphql.CollectedField, obj *PerformerAppearance) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerAppearance_performer,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Performer, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNPerformer2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformer,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerAppearance_performer(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerAppearance\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Performer_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Performer_name(ctx, field)\n\t\t\tcase \"disambiguation\":\n\t\t\t\treturn ec.fieldContext_Performer_disambiguation(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Performer_aliases(ctx, field)\n\t\t\tcase \"gender\":\n\t\t\t\treturn ec.fieldContext_Performer_gender(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Performer_urls(ctx, field)\n\t\t\tcase \"birthdate\":\n\t\t\t\treturn ec.fieldContext_Performer_birthdate(ctx, field)\n\t\t\tcase \"birth_date\":\n\t\t\t\treturn ec.fieldContext_Performer_birth_date(ctx, field)\n\t\t\tcase \"death_date\":\n\t\t\t\treturn ec.fieldContext_Performer_death_date(ctx, field)\n\t\t\tcase \"age\":\n\t\t\t\treturn ec.fieldContext_Performer_age(ctx, field)\n\t\t\tcase \"ethnicity\":\n\t\t\t\treturn ec.fieldContext_Performer_ethnicity(ctx, field)\n\t\t\tcase \"country\":\n\t\t\t\treturn ec.fieldContext_Performer_country(ctx, field)\n\t\t\tcase \"eye_color\":\n\t\t\t\treturn ec.fieldContext_Performer_eye_color(ctx, field)\n\t\t\tcase \"hair_color\":\n\t\t\t\treturn ec.fieldContext_Performer_hair_color(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Performer_height(ctx, field)\n\t\t\tcase \"measurements\":\n\t\t\t\treturn ec.fieldContext_Performer_measurements(ctx, field)\n\t\t\tcase \"cup_size\":\n\t\t\t\treturn ec.fieldContext_Performer_cup_size(ctx, field)\n\t\t\tcase \"band_size\":\n\t\t\t\treturn ec.fieldContext_Performer_band_size(ctx, field)\n\t\t\tcase \"waist_size\":\n\t\t\t\treturn ec.fieldContext_Performer_waist_size(ctx, field)\n\t\t\tcase \"hip_size\":\n\t\t\t\treturn ec.fieldContext_Performer_hip_size(ctx, field)\n\t\t\tcase \"breast_type\":\n\t\t\t\treturn ec.fieldContext_Performer_breast_type(ctx, field)\n\t\t\tcase \"career_start_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_start_year(ctx, field)\n\t\t\tcase \"career_end_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_end_year(ctx, field)\n\t\t\tcase \"tattoos\":\n\t\t\t\treturn ec.fieldContext_Performer_tattoos(ctx, field)\n\t\t\tcase \"piercings\":\n\t\t\t\treturn ec.fieldContext_Performer_piercings(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Performer_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Performer_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Performer_edits(ctx, field)\n\t\t\tcase \"scene_count\":\n\t\t\t\treturn ec.fieldContext_Performer_scene_count(ctx, field)\n\t\t\tcase \"scenes\":\n\t\t\t\treturn ec.fieldContext_Performer_scenes(ctx, field)\n\t\t\tcase \"merged_ids\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_ids(ctx, field)\n\t\t\tcase \"merged_into_id\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_into_id(ctx, field)\n\t\t\tcase \"studios\":\n\t\t\t\treturn ec.fieldContext_Performer_studios(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Performer_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Performer_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Performer_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Performer\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerAppearance_as(ctx context.Context, field graphql.CollectedField, obj *PerformerAppearance) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerAppearance_as,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.As, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerAppearance_as(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerAppearance\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_id(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_name(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_disambiguation(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_disambiguation,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Disambiguation, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_disambiguation(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_aliases(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Aliases, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_gender(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_gender,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Gender, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_gender(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_birthdate(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_birthdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Birthdate, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_birthdate(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_deathdate(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_deathdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Deathdate, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_deathdate(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_urls(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Urls, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚕstringᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_ethnicity(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_ethnicity,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Ethnicity, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_ethnicity(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_country(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_country,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Country, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_country(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_eye_color(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_eye_color,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.EyeColor, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_eye_color(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_hair_color(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_hair_color,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.HairColor, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_hair_color(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_height(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_height,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Height, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_height(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_measurements(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_measurements,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Measurements, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_measurements(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_breast_type(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_breast_type,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.BreastType, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_breast_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_tattoos(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_tattoos,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Tattoos, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_tattoos(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_piercings(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_piercings,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Piercings, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_piercings(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_career_start_year(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_career_start_year,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.CareerStartYear, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_career_start_year(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_career_end_year(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_career_end_year,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.CareerEndYear, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_career_end_year(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerDraft_image(ctx context.Context, field graphql.CollectedField, obj *PerformerDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerDraft_image,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.PerformerDraft().Image(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOImage2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImage,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerDraft_image(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerDraft\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_name(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_disambiguation(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_disambiguation,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Disambiguation, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_disambiguation(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_added_aliases(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_added_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.AddedAliases, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚕstringᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_added_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_removed_aliases(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_removed_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.RemovedAliases, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚕstringᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_removed_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_gender(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_gender,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.PerformerEdit().Gender(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOGenderEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderEnum,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_gender(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type GenderEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_added_urls(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_added_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.AddedUrls, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_added_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_URL_url(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext_URL_type(ctx, field)\n\t\t\tcase \"site\":\n\t\t\t\treturn ec.fieldContext_URL_site(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type URL\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_removed_urls(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_removed_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.RemovedUrls, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_removed_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_URL_url(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext_URL_type(ctx, field)\n\t\t\tcase \"site\":\n\t\t\t\treturn ec.fieldContext_URL_site(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type URL\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_birthdate(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_birthdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Birthdate, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_birthdate(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_deathdate(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_deathdate,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Deathdate, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_deathdate(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_ethnicity(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_ethnicity,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.PerformerEdit().Ethnicity(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOEthnicityEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEthnicityEnum,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_ethnicity(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type EthnicityEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_country(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_country,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Country, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_country(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_eye_color(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_eye_color,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.PerformerEdit().EyeColor(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOEyeColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEyeColorEnum,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_eye_color(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type EyeColorEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_hair_color(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_hair_color,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.PerformerEdit().HairColor(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOHairColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐHairColorEnum,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_hair_color(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type HairColorEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_height(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_height,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Height, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_height(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_cup_size(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_cup_size,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.CupSize, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_cup_size(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_band_size(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_band_size,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.BandSize, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_band_size(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_waist_size(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_waist_size,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.WaistSize, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_waist_size(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_hip_size(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_hip_size,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.HipSize, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_hip_size(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_breast_type(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_breast_type,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.PerformerEdit().BreastType(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOBreastTypeEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBreastTypeEnum,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_breast_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type BreastTypeEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_career_start_year(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_career_start_year,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.CareerStartYear, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_career_start_year(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_career_end_year(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_career_end_year,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.CareerEndYear, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_career_end_year(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_added_tattoos(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_added_tattoos,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.AddedTattoos, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOBodyModification2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_added_tattoos(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"location\":\n\t\t\t\treturn ec.fieldContext_BodyModification_location(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_BodyModification_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type BodyModification\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_removed_tattoos(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_removed_tattoos,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.RemovedTattoos, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOBodyModification2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_removed_tattoos(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"location\":\n\t\t\t\treturn ec.fieldContext_BodyModification_location(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_BodyModification_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type BodyModification\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_added_piercings(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_added_piercings,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.AddedPiercings, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOBodyModification2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_added_piercings(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"location\":\n\t\t\t\treturn ec.fieldContext_BodyModification_location(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_BodyModification_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type BodyModification\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_removed_piercings(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_removed_piercings,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.RemovedPiercings, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOBodyModification2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_removed_piercings(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"location\":\n\t\t\t\treturn ec.fieldContext_BodyModification_location(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_BodyModification_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type BodyModification\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_added_images(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_added_images,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.PerformerEdit().AddedImages(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_added_images(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_removed_images(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_removed_images,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.PerformerEdit().RemovedImages(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_removed_images(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_draft_id(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_draft_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.DraftID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_draft_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_aliases(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.PerformerEdit().Aliases(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2ᚕstringᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_urls(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.PerformerEdit().Urls(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_URL_url(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext_URL_type(ctx, field)\n\t\t\tcase \"site\":\n\t\t\t\treturn ec.fieldContext_URL_site(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type URL\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_images(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_images,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.PerformerEdit().Images(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_images(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_tattoos(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_tattoos,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.PerformerEdit().Tattoos(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNBodyModification2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_tattoos(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"location\":\n\t\t\t\treturn ec.fieldContext_BodyModification_location(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_BodyModification_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type BodyModification\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEdit_piercings(ctx context.Context, field graphql.CollectedField, obj *PerformerEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEdit_piercings,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.PerformerEdit().Piercings(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNBodyModification2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEdit_piercings(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"location\":\n\t\t\t\treturn ec.fieldContext_BodyModification_location(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_BodyModification_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type BodyModification\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEditOptions_set_modify_aliases(ctx context.Context, field graphql.CollectedField, obj *PerformerEditOptions) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEditOptions_set_modify_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.SetModifyAliases, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEditOptions_set_modify_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEditOptions\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerEditOptions_set_merge_aliases(ctx context.Context, field graphql.CollectedField, obj *PerformerEditOptions) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerEditOptions_set_merge_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.SetMergeAliases, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerEditOptions_set_merge_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerEditOptions\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerSearchFacets_genders(ctx context.Context, field graphql.CollectedField, obj *PerformerSearchFacets) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerSearchFacets_genders,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Genders, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNGenderFacet2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderFacetᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerSearchFacets_genders(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerSearchFacets\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"gender\":\n\t\t\t\treturn ec.fieldContext_GenderFacet_gender(ctx, field)\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_GenderFacet_count(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type GenderFacet\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerStudio_studio(ctx context.Context, field graphql.CollectedField, obj *PerformerStudio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerStudio_studio,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Studio, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNStudio2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudio,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerStudio_studio(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerStudio\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Studio_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Studio_name(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Studio_aliases(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Studio_urls(ctx, field)\n\t\t\tcase \"parent\":\n\t\t\t\treturn ec.fieldContext_Studio_parent(ctx, field)\n\t\t\tcase \"child_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_child_studios(ctx, field)\n\t\t\tcase \"sub_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_sub_studios(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Studio_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Studio_deleted(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Studio_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Studio_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Studio_updated(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Studio_performers(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Studio\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _PerformerStudio_scene_count(ctx context.Context, field graphql.CollectedField, obj *PerformerStudio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_PerformerStudio_scene_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.SceneCount, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_PerformerStudio_scene_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"PerformerStudio\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_findPerformer(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_findPerformer,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().FindPerformer(ctx, fc.Args[\"id\"].(uuid.UUID))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Performer\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Performer\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOPerformer2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformer,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_findPerformer(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Performer_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Performer_name(ctx, field)\n\t\t\tcase \"disambiguation\":\n\t\t\t\treturn ec.fieldContext_Performer_disambiguation(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Performer_aliases(ctx, field)\n\t\t\tcase \"gender\":\n\t\t\t\treturn ec.fieldContext_Performer_gender(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Performer_urls(ctx, field)\n\t\t\tcase \"birthdate\":\n\t\t\t\treturn ec.fieldContext_Performer_birthdate(ctx, field)\n\t\t\tcase \"birth_date\":\n\t\t\t\treturn ec.fieldContext_Performer_birth_date(ctx, field)\n\t\t\tcase \"death_date\":\n\t\t\t\treturn ec.fieldContext_Performer_death_date(ctx, field)\n\t\t\tcase \"age\":\n\t\t\t\treturn ec.fieldContext_Performer_age(ctx, field)\n\t\t\tcase \"ethnicity\":\n\t\t\t\treturn ec.fieldContext_Performer_ethnicity(ctx, field)\n\t\t\tcase \"country\":\n\t\t\t\treturn ec.fieldContext_Performer_country(ctx, field)\n\t\t\tcase \"eye_color\":\n\t\t\t\treturn ec.fieldContext_Performer_eye_color(ctx, field)\n\t\t\tcase \"hair_color\":\n\t\t\t\treturn ec.fieldContext_Performer_hair_color(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Performer_height(ctx, field)\n\t\t\tcase \"measurements\":\n\t\t\t\treturn ec.fieldContext_Performer_measurements(ctx, field)\n\t\t\tcase \"cup_size\":\n\t\t\t\treturn ec.fieldContext_Performer_cup_size(ctx, field)\n\t\t\tcase \"band_size\":\n\t\t\t\treturn ec.fieldContext_Performer_band_size(ctx, field)\n\t\t\tcase \"waist_size\":\n\t\t\t\treturn ec.fieldContext_Performer_waist_size(ctx, field)\n\t\t\tcase \"hip_size\":\n\t\t\t\treturn ec.fieldContext_Performer_hip_size(ctx, field)\n\t\t\tcase \"breast_type\":\n\t\t\t\treturn ec.fieldContext_Performer_breast_type(ctx, field)\n\t\t\tcase \"career_start_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_start_year(ctx, field)\n\t\t\tcase \"career_end_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_end_year(ctx, field)\n\t\t\tcase \"tattoos\":\n\t\t\t\treturn ec.fieldContext_Performer_tattoos(ctx, field)\n\t\t\tcase \"piercings\":\n\t\t\t\treturn ec.fieldContext_Performer_piercings(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Performer_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Performer_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Performer_edits(ctx, field)\n\t\t\tcase \"scene_count\":\n\t\t\t\treturn ec.fieldContext_Performer_scene_count(ctx, field)\n\t\t\tcase \"scenes\":\n\t\t\t\treturn ec.fieldContext_Performer_scenes(ctx, field)\n\t\t\tcase \"merged_ids\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_ids(ctx, field)\n\t\t\tcase \"merged_into_id\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_into_id(ctx, field)\n\t\t\tcase \"studios\":\n\t\t\t\treturn ec.fieldContext_Performer_studios(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Performer_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Performer_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Performer_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Performer\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_findPerformer_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_queryPerformers(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_queryPerformers,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().QueryPerformers(ctx, fc.Args[\"input\"].(PerformerQueryInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *PerformerQuery\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *PerformerQuery\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQueryPerformersResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerQuery,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_queryPerformers(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QueryPerformersResultType_count(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_QueryPerformersResultType_performers(ctx, field)\n\t\t\tcase \"facets\":\n\t\t\t\treturn ec.fieldContext_QueryPerformersResultType_facets(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryPerformersResultType\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_queryPerformers_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_findStudio(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_findStudio,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().FindStudio(ctx, fc.Args[\"id\"].(*uuid.UUID), fc.Args[\"name\"].(*string))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Studio\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Studio\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOStudio2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudio,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_findStudio(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Studio_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Studio_name(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Studio_aliases(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Studio_urls(ctx, field)\n\t\t\tcase \"parent\":\n\t\t\t\treturn ec.fieldContext_Studio_parent(ctx, field)\n\t\t\tcase \"child_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_child_studios(ctx, field)\n\t\t\tcase \"sub_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_sub_studios(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Studio_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Studio_deleted(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Studio_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Studio_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Studio_updated(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Studio_performers(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Studio\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_findStudio_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_queryStudios(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_queryStudios,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().QueryStudios(ctx, fc.Args[\"input\"].(StudioQueryInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *QueryStudiosResultType\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *QueryStudiosResultType\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQueryStudiosResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryStudiosResultType,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_queryStudios(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QueryStudiosResultType_count(ctx, field)\n\t\t\tcase \"studios\":\n\t\t\t\treturn ec.fieldContext_QueryStudiosResultType_studios(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryStudiosResultType\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_queryStudios_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_findTag(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_findTag,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().FindTag(ctx, fc.Args[\"id\"].(*uuid.UUID), fc.Args[\"name\"].(*string))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Tag\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Tag\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOTag2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTag,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_findTag(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Tag_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Tag_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Tag_description(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Tag_aliases(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Tag_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Tag_edits(ctx, field)\n\t\t\tcase \"category\":\n\t\t\t\treturn ec.fieldContext_Tag_category(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Tag_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Tag_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Tag\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_findTag_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_findTagOrAlias(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_findTagOrAlias,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().FindTagOrAlias(ctx, fc.Args[\"name\"].(string))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Tag\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Tag\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOTag2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTag,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_findTagOrAlias(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Tag_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Tag_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Tag_description(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Tag_aliases(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Tag_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Tag_edits(ctx, field)\n\t\t\tcase \"category\":\n\t\t\t\treturn ec.fieldContext_Tag_category(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Tag_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Tag_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Tag\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_findTagOrAlias_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_queryTags(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_queryTags,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().QueryTags(ctx, fc.Args[\"input\"].(TagQueryInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *QueryTagsResultType\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *QueryTagsResultType\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQueryTagsResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryTagsResultType,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_queryTags(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QueryTagsResultType_count(ctx, field)\n\t\t\tcase \"tags\":\n\t\t\t\treturn ec.fieldContext_QueryTagsResultType_tags(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryTagsResultType\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_queryTags_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_findTagCategory(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_findTagCategory,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().FindTagCategory(ctx, fc.Args[\"id\"].(uuid.UUID))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *TagCategory\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *TagCategory\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOTagCategory2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategory,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_findTagCategory(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_TagCategory_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_TagCategory_name(ctx, field)\n\t\t\tcase \"group\":\n\t\t\t\treturn ec.fieldContext_TagCategory_group(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_TagCategory_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type TagCategory\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_findTagCategory_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_queryTagCategories(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_queryTagCategories,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Query().QueryTagCategories(ctx)\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *QueryTagCategoriesResultType\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *QueryTagCategoriesResultType\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQueryTagCategoriesResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryTagCategoriesResultType,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_queryTagCategories(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QueryTagCategoriesResultType_count(ctx, field)\n\t\t\tcase \"tag_categories\":\n\t\t\t\treturn ec.fieldContext_QueryTagCategoriesResultType_tag_categories(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryTagCategoriesResultType\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_findScene(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_findScene,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().FindScene(ctx, fc.Args[\"id\"].(uuid.UUID))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Scene\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Scene\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOScene2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐScene,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_findScene(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Scene_id(ctx, field)\n\t\t\tcase \"title\":\n\t\t\t\treturn ec.fieldContext_Scene_title(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Scene_details(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_Scene_date(ctx, field)\n\t\t\tcase \"release_date\":\n\t\t\t\treturn ec.fieldContext_Scene_release_date(ctx, field)\n\t\t\tcase \"production_date\":\n\t\t\t\treturn ec.fieldContext_Scene_production_date(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Scene_urls(ctx, field)\n\t\t\tcase \"studio\":\n\t\t\t\treturn ec.fieldContext_Scene_studio(ctx, field)\n\t\t\tcase \"tags\":\n\t\t\t\treturn ec.fieldContext_Scene_tags(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Scene_images(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Scene_performers(ctx, field)\n\t\t\tcase \"fingerprints\":\n\t\t\t\treturn ec.fieldContext_Scene_fingerprints(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Scene_duration(ctx, field)\n\t\t\tcase \"director\":\n\t\t\t\treturn ec.fieldContext_Scene_director(ctx, field)\n\t\t\tcase \"code\":\n\t\t\t\treturn ec.fieldContext_Scene_code(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Scene_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Scene_edits(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Scene_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Scene_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Scene\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_findScene_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_findScenesBySceneFingerprints(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_findScenesBySceneFingerprints,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().FindScenesBySceneFingerprints(ctx, fc.Args[\"fingerprints\"].([][]FingerprintQueryInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal [][]*Scene\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal [][]*Scene\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNScene2ᚕᚕᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_findScenesBySceneFingerprints(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Scene_id(ctx, field)\n\t\t\tcase \"title\":\n\t\t\t\treturn ec.fieldContext_Scene_title(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Scene_details(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_Scene_date(ctx, field)\n\t\t\tcase \"release_date\":\n\t\t\t\treturn ec.fieldContext_Scene_release_date(ctx, field)\n\t\t\tcase \"production_date\":\n\t\t\t\treturn ec.fieldContext_Scene_production_date(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Scene_urls(ctx, field)\n\t\t\tcase \"studio\":\n\t\t\t\treturn ec.fieldContext_Scene_studio(ctx, field)\n\t\t\tcase \"tags\":\n\t\t\t\treturn ec.fieldContext_Scene_tags(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Scene_images(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Scene_performers(ctx, field)\n\t\t\tcase \"fingerprints\":\n\t\t\t\treturn ec.fieldContext_Scene_fingerprints(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Scene_duration(ctx, field)\n\t\t\tcase \"director\":\n\t\t\t\treturn ec.fieldContext_Scene_director(ctx, field)\n\t\t\tcase \"code\":\n\t\t\t\treturn ec.fieldContext_Scene_code(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Scene_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Scene_edits(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Scene_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Scene_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Scene\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_findScenesBySceneFingerprints_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_queryScenes(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_queryScenes,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().QueryScenes(ctx, fc.Args[\"input\"].(SceneQueryInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *SceneQuery\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *SceneQuery\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQueryScenesResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneQuery,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_queryScenes(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QueryScenesResultType_count(ctx, field)\n\t\t\tcase \"scenes\":\n\t\t\t\treturn ec.fieldContext_QueryScenesResultType_scenes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryScenesResultType\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_queryScenes_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_findSite(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_findSite,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().FindSite(ctx, fc.Args[\"id\"].(uuid.UUID))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Site\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Site\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOSite2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSite,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_findSite(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Site_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Site_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Site_description(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Site_url(ctx, field)\n\t\t\tcase \"regex\":\n\t\t\t\treturn ec.fieldContext_Site_regex(ctx, field)\n\t\t\tcase \"valid_types\":\n\t\t\t\treturn ec.fieldContext_Site_valid_types(ctx, field)\n\t\t\tcase \"icon\":\n\t\t\t\treturn ec.fieldContext_Site_icon(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Site_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Site_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Site\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_findSite_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_querySites(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_querySites,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Query().QuerySites(ctx)\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *QuerySitesResultType\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *QuerySitesResultType\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQuerySitesResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQuerySitesResultType,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_querySites(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QuerySitesResultType_count(ctx, field)\n\t\t\tcase \"sites\":\n\t\t\t\treturn ec.fieldContext_QuerySitesResultType_sites(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QuerySitesResultType\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_findEdit(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_findEdit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().FindEdit(ctx, fc.Args[\"id\"].(uuid.UUID))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Edit\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_findEdit(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_findEdit_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_queryEdits(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_queryEdits,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().QueryEdits(ctx, fc.Args[\"input\"].(EditQueryInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *EditQuery\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *EditQuery\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQueryEditsResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditQuery,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_queryEdits(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QueryEditsResultType_count(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_QueryEditsResultType_edits(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryEditsResultType\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_queryEdits_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_findUser(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_findUser,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().FindUser(ctx, fc.Args[\"id\"].(*uuid.UUID), fc.Args[\"username\"].(*string))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *User\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *User\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOUser2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUser,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_findUser(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_User_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_User_name(ctx, field)\n\t\t\tcase \"roles\":\n\t\t\t\treturn ec.fieldContext_User_roles(ctx, field)\n\t\t\tcase \"email\":\n\t\t\t\treturn ec.fieldContext_User_email(ctx, field)\n\t\t\tcase \"api_key\":\n\t\t\t\treturn ec.fieldContext_User_api_key(ctx, field)\n\t\t\tcase \"notification_subscriptions\":\n\t\t\t\treturn ec.fieldContext_User_notification_subscriptions(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_User_vote_count(ctx, field)\n\t\t\tcase \"edit_count\":\n\t\t\t\treturn ec.fieldContext_User_edit_count(ctx, field)\n\t\t\tcase \"api_calls\":\n\t\t\t\treturn ec.fieldContext_User_api_calls(ctx, field)\n\t\t\tcase \"invited_by\":\n\t\t\t\treturn ec.fieldContext_User_invited_by(ctx, field)\n\t\t\tcase \"invite_tokens\":\n\t\t\t\treturn ec.fieldContext_User_invite_tokens(ctx, field)\n\t\t\tcase \"active_invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_active_invite_codes(ctx, field)\n\t\t\tcase \"invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_invite_codes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type User\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_findUser_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_queryUsers(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_queryUsers,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().QueryUsers(ctx, fc.Args[\"input\"].(UserQueryInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"ADMIN\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *QueryUsersResultType\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *QueryUsersResultType\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQueryUsersResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryUsersResultType,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_queryUsers(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QueryUsersResultType_count(ctx, field)\n\t\t\tcase \"users\":\n\t\t\t\treturn ec.fieldContext_QueryUsersResultType_users(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryUsersResultType\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_queryUsers_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_me(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_me,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Query().Me(ctx)\n\t\t},\n\t\tnil,\n\t\tec.marshalOUser2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUser,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_me(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_User_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_User_name(ctx, field)\n\t\t\tcase \"roles\":\n\t\t\t\treturn ec.fieldContext_User_roles(ctx, field)\n\t\t\tcase \"email\":\n\t\t\t\treturn ec.fieldContext_User_email(ctx, field)\n\t\t\tcase \"api_key\":\n\t\t\t\treturn ec.fieldContext_User_api_key(ctx, field)\n\t\t\tcase \"notification_subscriptions\":\n\t\t\t\treturn ec.fieldContext_User_notification_subscriptions(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_User_vote_count(ctx, field)\n\t\t\tcase \"edit_count\":\n\t\t\t\treturn ec.fieldContext_User_edit_count(ctx, field)\n\t\t\tcase \"api_calls\":\n\t\t\t\treturn ec.fieldContext_User_api_calls(ctx, field)\n\t\t\tcase \"invited_by\":\n\t\t\t\treturn ec.fieldContext_User_invited_by(ctx, field)\n\t\t\tcase \"invite_tokens\":\n\t\t\t\treturn ec.fieldContext_User_invite_tokens(ctx, field)\n\t\t\tcase \"active_invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_active_invite_codes(ctx, field)\n\t\t\tcase \"invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_invite_codes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type User\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_searchPerformer(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_searchPerformer,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().SearchPerformer(ctx, fc.Args[\"term\"].(string), fc.Args[\"limit\"].(*int))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal []Performer\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal []Performer\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNPerformer2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_searchPerformer(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Performer_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Performer_name(ctx, field)\n\t\t\tcase \"disambiguation\":\n\t\t\t\treturn ec.fieldContext_Performer_disambiguation(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Performer_aliases(ctx, field)\n\t\t\tcase \"gender\":\n\t\t\t\treturn ec.fieldContext_Performer_gender(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Performer_urls(ctx, field)\n\t\t\tcase \"birthdate\":\n\t\t\t\treturn ec.fieldContext_Performer_birthdate(ctx, field)\n\t\t\tcase \"birth_date\":\n\t\t\t\treturn ec.fieldContext_Performer_birth_date(ctx, field)\n\t\t\tcase \"death_date\":\n\t\t\t\treturn ec.fieldContext_Performer_death_date(ctx, field)\n\t\t\tcase \"age\":\n\t\t\t\treturn ec.fieldContext_Performer_age(ctx, field)\n\t\t\tcase \"ethnicity\":\n\t\t\t\treturn ec.fieldContext_Performer_ethnicity(ctx, field)\n\t\t\tcase \"country\":\n\t\t\t\treturn ec.fieldContext_Performer_country(ctx, field)\n\t\t\tcase \"eye_color\":\n\t\t\t\treturn ec.fieldContext_Performer_eye_color(ctx, field)\n\t\t\tcase \"hair_color\":\n\t\t\t\treturn ec.fieldContext_Performer_hair_color(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Performer_height(ctx, field)\n\t\t\tcase \"measurements\":\n\t\t\t\treturn ec.fieldContext_Performer_measurements(ctx, field)\n\t\t\tcase \"cup_size\":\n\t\t\t\treturn ec.fieldContext_Performer_cup_size(ctx, field)\n\t\t\tcase \"band_size\":\n\t\t\t\treturn ec.fieldContext_Performer_band_size(ctx, field)\n\t\t\tcase \"waist_size\":\n\t\t\t\treturn ec.fieldContext_Performer_waist_size(ctx, field)\n\t\t\tcase \"hip_size\":\n\t\t\t\treturn ec.fieldContext_Performer_hip_size(ctx, field)\n\t\t\tcase \"breast_type\":\n\t\t\t\treturn ec.fieldContext_Performer_breast_type(ctx, field)\n\t\t\tcase \"career_start_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_start_year(ctx, field)\n\t\t\tcase \"career_end_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_end_year(ctx, field)\n\t\t\tcase \"tattoos\":\n\t\t\t\treturn ec.fieldContext_Performer_tattoos(ctx, field)\n\t\t\tcase \"piercings\":\n\t\t\t\treturn ec.fieldContext_Performer_piercings(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Performer_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Performer_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Performer_edits(ctx, field)\n\t\t\tcase \"scene_count\":\n\t\t\t\treturn ec.fieldContext_Performer_scene_count(ctx, field)\n\t\t\tcase \"scenes\":\n\t\t\t\treturn ec.fieldContext_Performer_scenes(ctx, field)\n\t\t\tcase \"merged_ids\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_ids(ctx, field)\n\t\t\tcase \"merged_into_id\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_into_id(ctx, field)\n\t\t\tcase \"studios\":\n\t\t\t\treturn ec.fieldContext_Performer_studios(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Performer_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Performer_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Performer_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Performer\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_searchPerformer_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_searchPerformers(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_searchPerformers,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().SearchPerformers(ctx, fc.Args[\"term\"].(string), fc.Args[\"limit\"].(*int), fc.Args[\"page\"].(*int), fc.Args[\"per_page\"].(*int), fc.Args[\"filter\"].(*PerformerSearchFilter))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *PerformerQuery\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *PerformerQuery\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQueryPerformersResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerQuery,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_searchPerformers(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QueryPerformersResultType_count(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_QueryPerformersResultType_performers(ctx, field)\n\t\t\tcase \"facets\":\n\t\t\t\treturn ec.fieldContext_QueryPerformersResultType_facets(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryPerformersResultType\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_searchPerformers_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_searchScene(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_searchScene,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().SearchScene(ctx, fc.Args[\"term\"].(string), fc.Args[\"limit\"].(*int))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal []Scene\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal []Scene\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNScene2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_searchScene(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Scene_id(ctx, field)\n\t\t\tcase \"title\":\n\t\t\t\treturn ec.fieldContext_Scene_title(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Scene_details(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_Scene_date(ctx, field)\n\t\t\tcase \"release_date\":\n\t\t\t\treturn ec.fieldContext_Scene_release_date(ctx, field)\n\t\t\tcase \"production_date\":\n\t\t\t\treturn ec.fieldContext_Scene_production_date(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Scene_urls(ctx, field)\n\t\t\tcase \"studio\":\n\t\t\t\treturn ec.fieldContext_Scene_studio(ctx, field)\n\t\t\tcase \"tags\":\n\t\t\t\treturn ec.fieldContext_Scene_tags(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Scene_images(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Scene_performers(ctx, field)\n\t\t\tcase \"fingerprints\":\n\t\t\t\treturn ec.fieldContext_Scene_fingerprints(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Scene_duration(ctx, field)\n\t\t\tcase \"director\":\n\t\t\t\treturn ec.fieldContext_Scene_director(ctx, field)\n\t\t\tcase \"code\":\n\t\t\t\treturn ec.fieldContext_Scene_code(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Scene_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Scene_edits(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Scene_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Scene_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Scene\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_searchScene_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_searchScenes(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_searchScenes,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().SearchScenes(ctx, fc.Args[\"term\"].(string), fc.Args[\"limit\"].(*int), fc.Args[\"page\"].(*int), fc.Args[\"per_page\"].(*int))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *SceneQuery\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *SceneQuery\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQueryScenesResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneQuery,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_searchScenes(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QueryScenesResultType_count(ctx, field)\n\t\t\tcase \"scenes\":\n\t\t\t\treturn ec.fieldContext_QueryScenesResultType_scenes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryScenesResultType\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_searchScenes_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_searchTag(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_searchTag,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().SearchTag(ctx, fc.Args[\"term\"].(string), fc.Args[\"limit\"].(*int))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal []Tag\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal []Tag\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNTag2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_searchTag(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Tag_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Tag_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Tag_description(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Tag_aliases(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Tag_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Tag_edits(ctx, field)\n\t\t\tcase \"category\":\n\t\t\t\treturn ec.fieldContext_Tag_category(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Tag_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Tag_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Tag\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_searchTag_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_searchStudio(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_searchStudio,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().SearchStudio(ctx, fc.Args[\"term\"].(string), fc.Args[\"limit\"].(*int))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal []Studio\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal []Studio\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNStudio2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_searchStudio(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Studio_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Studio_name(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Studio_aliases(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Studio_urls(ctx, field)\n\t\t\tcase \"parent\":\n\t\t\t\treturn ec.fieldContext_Studio_parent(ctx, field)\n\t\t\tcase \"child_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_child_studios(ctx, field)\n\t\t\tcase \"sub_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_sub_studios(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Studio_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Studio_deleted(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Studio_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Studio_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Studio_updated(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Studio_performers(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Studio\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_searchStudio_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_findDraft(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_findDraft,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().FindDraft(ctx, fc.Args[\"id\"].(uuid.UUID))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Draft\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Draft\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalODraft2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraft,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_findDraft(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Draft_id(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Draft_created(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Draft_expires(ctx, field)\n\t\t\tcase \"data\":\n\t\t\t\treturn ec.fieldContext_Draft_data(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Draft\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_findDraft_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_findDrafts(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_findDrafts,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Query().FindDrafts(ctx)\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal []Draft\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal []Draft\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNDraft2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_findDrafts(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Draft_id(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Draft_created(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Draft_expires(ctx, field)\n\t\t\tcase \"data\":\n\t\t\t\treturn ec.fieldContext_Draft_data(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Draft\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_queryExistingScene(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_queryExistingScene,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().QueryExistingScene(ctx, fc.Args[\"input\"].(QueryExistingSceneInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *QueryExistingSceneResult\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *QueryExistingSceneResult\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQueryExistingSceneResult2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryExistingSceneResult,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_queryExistingScene(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_QueryExistingSceneResult_edits(ctx, field)\n\t\t\tcase \"scenes\":\n\t\t\t\treturn ec.fieldContext_QueryExistingSceneResult_scenes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryExistingSceneResult\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_queryExistingScene_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_queryExistingPerformer(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_queryExistingPerformer,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().QueryExistingPerformer(ctx, fc.Args[\"input\"].(QueryExistingPerformerInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *QueryExistingPerformerResult\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *QueryExistingPerformerResult\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQueryExistingPerformerResult2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryExistingPerformerResult,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_queryExistingPerformer(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_QueryExistingPerformerResult_edits(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_QueryExistingPerformerResult_performers(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryExistingPerformerResult\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_queryExistingPerformer_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_version(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_version,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Query().Version(ctx)\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *Version\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *Version\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNVersion2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐVersion,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_version(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"hash\":\n\t\t\t\treturn ec.fieldContext_Version_hash(ctx, field)\n\t\t\tcase \"build_time\":\n\t\t\t\treturn ec.fieldContext_Version_build_time(ctx, field)\n\t\t\tcase \"build_type\":\n\t\t\t\treturn ec.fieldContext_Version_build_type(ctx, field)\n\t\t\tcase \"version\":\n\t\t\t\treturn ec.fieldContext_Version_version(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Version\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_getConfig(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_getConfig,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Query().GetConfig(ctx)\n\t\t},\n\t\tnil,\n\t\tec.marshalNStashBoxConfig2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStashBoxConfig,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_getConfig(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"host_url\":\n\t\t\t\treturn ec.fieldContext_StashBoxConfig_host_url(ctx, field)\n\t\t\tcase \"require_invite\":\n\t\t\t\treturn ec.fieldContext_StashBoxConfig_require_invite(ctx, field)\n\t\t\tcase \"require_activation\":\n\t\t\t\treturn ec.fieldContext_StashBoxConfig_require_activation(ctx, field)\n\t\t\tcase \"vote_promotion_threshold\":\n\t\t\t\treturn ec.fieldContext_StashBoxConfig_vote_promotion_threshold(ctx, field)\n\t\t\tcase \"vote_application_threshold\":\n\t\t\t\treturn ec.fieldContext_StashBoxConfig_vote_application_threshold(ctx, field)\n\t\t\tcase \"voting_period\":\n\t\t\t\treturn ec.fieldContext_StashBoxConfig_voting_period(ctx, field)\n\t\t\tcase \"min_destructive_voting_period\":\n\t\t\t\treturn ec.fieldContext_StashBoxConfig_min_destructive_voting_period(ctx, field)\n\t\t\tcase \"vote_cron_interval\":\n\t\t\t\treturn ec.fieldContext_StashBoxConfig_vote_cron_interval(ctx, field)\n\t\t\tcase \"guidelines_url\":\n\t\t\t\treturn ec.fieldContext_StashBoxConfig_guidelines_url(ctx, field)\n\t\t\tcase \"require_scene_draft\":\n\t\t\t\treturn ec.fieldContext_StashBoxConfig_require_scene_draft(ctx, field)\n\t\t\tcase \"edit_update_limit\":\n\t\t\t\treturn ec.fieldContext_StashBoxConfig_edit_update_limit(ctx, field)\n\t\t\tcase \"require_tag_role\":\n\t\t\t\treturn ec.fieldContext_StashBoxConfig_require_tag_role(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type StashBoxConfig\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_queryNotifications(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_queryNotifications,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().QueryNotifications(ctx, fc.Args[\"input\"].(QueryNotificationsInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *QueryNotificationsResult\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *QueryNotificationsResult\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQueryNotificationsResult2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryNotificationsResult,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_queryNotifications(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QueryNotificationsResult_count(ctx, field)\n\t\t\tcase \"notifications\":\n\t\t\t\treturn ec.fieldContext_QueryNotificationsResult_notifications(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryNotificationsResult\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_queryNotifications_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_getUnreadNotificationCount(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_getUnreadNotificationCount,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Query().GetUnreadNotificationCount(ctx)\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"READ\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal int\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal int\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_getUnreadNotificationCount(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query_queryModAudits(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query_queryModAudits,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Query().QueryModAudits(ctx, fc.Args[\"input\"].(ModAuditQueryInput))\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\trole, err := ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, \"ADMIN\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tvar zeroVal *ModAuditQuery\n\t\t\t\t\treturn zeroVal, err\n\t\t\t\t}\n\t\t\t\tif ec.Directives.HasRole == nil {\n\t\t\t\t\tvar zeroVal *ModAuditQuery\n\t\t\t\t\treturn zeroVal, errors.New(\"directive hasRole is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.HasRole(ctx, nil, directive0, role)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNQueryModAuditsResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAuditQuery,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query_queryModAudits(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QueryModAuditsResultType_count(ctx, field)\n\t\t\tcase \"audits\":\n\t\t\t\treturn ec.fieldContext_QueryModAuditsResultType_audits(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryModAuditsResultType\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query_queryModAudits_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query___type,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.IntrospectType(fc.Args[\"name\"].(string))\n\t\t},\n\t\tnil,\n\t\tec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query___type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"kind\":\n\t\t\t\treturn ec.fieldContext___Type_kind(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___Type_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___Type_description(ctx, field)\n\t\t\tcase \"specifiedByURL\":\n\t\t\t\treturn ec.fieldContext___Type_specifiedByURL(ctx, field)\n\t\t\tcase \"fields\":\n\t\t\t\treturn ec.fieldContext___Type_fields(ctx, field)\n\t\t\tcase \"interfaces\":\n\t\t\t\treturn ec.fieldContext___Type_interfaces(ctx, field)\n\t\t\tcase \"possibleTypes\":\n\t\t\t\treturn ec.fieldContext___Type_possibleTypes(ctx, field)\n\t\t\tcase \"enumValues\":\n\t\t\t\treturn ec.fieldContext___Type_enumValues(ctx, field)\n\t\t\tcase \"inputFields\":\n\t\t\t\treturn ec.fieldContext___Type_inputFields(ctx, field)\n\t\t\tcase \"ofType\":\n\t\t\t\treturn ec.fieldContext___Type_ofType(ctx, field)\n\t\t\tcase \"isOneOf\":\n\t\t\t\treturn ec.fieldContext___Type_isOneOf(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __Type\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Query___type_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Query___schema,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.IntrospectSchema()\n\t\t},\n\t\tnil,\n\t\tec.marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Query___schema(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Query\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___Schema_description(ctx, field)\n\t\t\tcase \"types\":\n\t\t\t\treturn ec.fieldContext___Schema_types(ctx, field)\n\t\t\tcase \"queryType\":\n\t\t\t\treturn ec.fieldContext___Schema_queryType(ctx, field)\n\t\t\tcase \"mutationType\":\n\t\t\t\treturn ec.fieldContext___Schema_mutationType(ctx, field)\n\t\t\tcase \"subscriptionType\":\n\t\t\t\treturn ec.fieldContext___Schema_subscriptionType(ctx, field)\n\t\t\tcase \"directives\":\n\t\t\t\treturn ec.fieldContext___Schema_directives(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __Schema\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryEditsResultType_count(ctx context.Context, field graphql.CollectedField, obj *EditQuery) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryEditsResultType_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryEditsResultType().Count(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryEditsResultType_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryEditsResultType\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryEditsResultType_edits(ctx context.Context, field graphql.CollectedField, obj *EditQuery) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryEditsResultType_edits,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryEditsResultType().Edits(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNEdit2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryEditsResultType_edits(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryEditsResultType\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryExistingPerformerResult_edits(ctx context.Context, field graphql.CollectedField, obj *QueryExistingPerformerResult) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryExistingPerformerResult_edits,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryExistingPerformerResult().Edits(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNEdit2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryExistingPerformerResult_edits(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryExistingPerformerResult\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryExistingPerformerResult_performers(ctx context.Context, field graphql.CollectedField, obj *QueryExistingPerformerResult) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryExistingPerformerResult_performers,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryExistingPerformerResult().Performers(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNPerformer2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryExistingPerformerResult_performers(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryExistingPerformerResult\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Performer_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Performer_name(ctx, field)\n\t\t\tcase \"disambiguation\":\n\t\t\t\treturn ec.fieldContext_Performer_disambiguation(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Performer_aliases(ctx, field)\n\t\t\tcase \"gender\":\n\t\t\t\treturn ec.fieldContext_Performer_gender(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Performer_urls(ctx, field)\n\t\t\tcase \"birthdate\":\n\t\t\t\treturn ec.fieldContext_Performer_birthdate(ctx, field)\n\t\t\tcase \"birth_date\":\n\t\t\t\treturn ec.fieldContext_Performer_birth_date(ctx, field)\n\t\t\tcase \"death_date\":\n\t\t\t\treturn ec.fieldContext_Performer_death_date(ctx, field)\n\t\t\tcase \"age\":\n\t\t\t\treturn ec.fieldContext_Performer_age(ctx, field)\n\t\t\tcase \"ethnicity\":\n\t\t\t\treturn ec.fieldContext_Performer_ethnicity(ctx, field)\n\t\t\tcase \"country\":\n\t\t\t\treturn ec.fieldContext_Performer_country(ctx, field)\n\t\t\tcase \"eye_color\":\n\t\t\t\treturn ec.fieldContext_Performer_eye_color(ctx, field)\n\t\t\tcase \"hair_color\":\n\t\t\t\treturn ec.fieldContext_Performer_hair_color(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Performer_height(ctx, field)\n\t\t\tcase \"measurements\":\n\t\t\t\treturn ec.fieldContext_Performer_measurements(ctx, field)\n\t\t\tcase \"cup_size\":\n\t\t\t\treturn ec.fieldContext_Performer_cup_size(ctx, field)\n\t\t\tcase \"band_size\":\n\t\t\t\treturn ec.fieldContext_Performer_band_size(ctx, field)\n\t\t\tcase \"waist_size\":\n\t\t\t\treturn ec.fieldContext_Performer_waist_size(ctx, field)\n\t\t\tcase \"hip_size\":\n\t\t\t\treturn ec.fieldContext_Performer_hip_size(ctx, field)\n\t\t\tcase \"breast_type\":\n\t\t\t\treturn ec.fieldContext_Performer_breast_type(ctx, field)\n\t\t\tcase \"career_start_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_start_year(ctx, field)\n\t\t\tcase \"career_end_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_end_year(ctx, field)\n\t\t\tcase \"tattoos\":\n\t\t\t\treturn ec.fieldContext_Performer_tattoos(ctx, field)\n\t\t\tcase \"piercings\":\n\t\t\t\treturn ec.fieldContext_Performer_piercings(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Performer_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Performer_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Performer_edits(ctx, field)\n\t\t\tcase \"scene_count\":\n\t\t\t\treturn ec.fieldContext_Performer_scene_count(ctx, field)\n\t\t\tcase \"scenes\":\n\t\t\t\treturn ec.fieldContext_Performer_scenes(ctx, field)\n\t\t\tcase \"merged_ids\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_ids(ctx, field)\n\t\t\tcase \"merged_into_id\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_into_id(ctx, field)\n\t\t\tcase \"studios\":\n\t\t\t\treturn ec.fieldContext_Performer_studios(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Performer_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Performer_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Performer_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Performer\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryExistingSceneResult_edits(ctx context.Context, field graphql.CollectedField, obj *QueryExistingSceneResult) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryExistingSceneResult_edits,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryExistingSceneResult().Edits(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNEdit2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryExistingSceneResult_edits(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryExistingSceneResult\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryExistingSceneResult_scenes(ctx context.Context, field graphql.CollectedField, obj *QueryExistingSceneResult) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryExistingSceneResult_scenes,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryExistingSceneResult().Scenes(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNScene2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryExistingSceneResult_scenes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryExistingSceneResult\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Scene_id(ctx, field)\n\t\t\tcase \"title\":\n\t\t\t\treturn ec.fieldContext_Scene_title(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Scene_details(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_Scene_date(ctx, field)\n\t\t\tcase \"release_date\":\n\t\t\t\treturn ec.fieldContext_Scene_release_date(ctx, field)\n\t\t\tcase \"production_date\":\n\t\t\t\treturn ec.fieldContext_Scene_production_date(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Scene_urls(ctx, field)\n\t\t\tcase \"studio\":\n\t\t\t\treturn ec.fieldContext_Scene_studio(ctx, field)\n\t\t\tcase \"tags\":\n\t\t\t\treturn ec.fieldContext_Scene_tags(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Scene_images(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Scene_performers(ctx, field)\n\t\t\tcase \"fingerprints\":\n\t\t\t\treturn ec.fieldContext_Scene_fingerprints(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Scene_duration(ctx, field)\n\t\t\tcase \"director\":\n\t\t\t\treturn ec.fieldContext_Scene_director(ctx, field)\n\t\t\tcase \"code\":\n\t\t\t\treturn ec.fieldContext_Scene_code(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Scene_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Scene_edits(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Scene_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Scene_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Scene\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryModAuditsResultType_count(ctx context.Context, field graphql.CollectedField, obj *ModAuditQuery) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryModAuditsResultType_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryModAuditsResultType().Count(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryModAuditsResultType_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryModAuditsResultType\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryModAuditsResultType_audits(ctx context.Context, field graphql.CollectedField, obj *ModAuditQuery) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryModAuditsResultType_audits,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryModAuditsResultType().Audits(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNModAudit2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAuditᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryModAuditsResultType_audits(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryModAuditsResultType\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_ModAudit_id(ctx, field)\n\t\t\tcase \"action\":\n\t\t\t\treturn ec.fieldContext_ModAudit_action(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_ModAudit_user(ctx, field)\n\t\t\tcase \"target_id\":\n\t\t\t\treturn ec.fieldContext_ModAudit_target_id(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_ModAudit_target_type(ctx, field)\n\t\t\tcase \"data\":\n\t\t\t\treturn ec.fieldContext_ModAudit_data(ctx, field)\n\t\t\tcase \"reason\":\n\t\t\t\treturn ec.fieldContext_ModAudit_reason(ctx, field)\n\t\t\tcase \"created_at\":\n\t\t\t\treturn ec.fieldContext_ModAudit_created_at(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type ModAudit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryNotificationsResult_count(ctx context.Context, field graphql.CollectedField, obj *QueryNotificationsResult) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryNotificationsResult_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryNotificationsResult().Count(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryNotificationsResult_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryNotificationsResult\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryNotificationsResult_notifications(ctx context.Context, field graphql.CollectedField, obj *QueryNotificationsResult) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryNotificationsResult_notifications,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryNotificationsResult().Notifications(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNNotification2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryNotificationsResult_notifications(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryNotificationsResult\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Notification_created(ctx, field)\n\t\t\tcase \"read\":\n\t\t\t\treturn ec.fieldContext_Notification_read(ctx, field)\n\t\t\tcase \"data\":\n\t\t\t\treturn ec.fieldContext_Notification_data(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Notification\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryPerformersResultType_count(ctx context.Context, field graphql.CollectedField, obj *PerformerQuery) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryPerformersResultType_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryPerformersResultType().Count(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryPerformersResultType_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryPerformersResultType\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryPerformersResultType_performers(ctx context.Context, field graphql.CollectedField, obj *PerformerQuery) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryPerformersResultType_performers,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryPerformersResultType().Performers(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNPerformer2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryPerformersResultType_performers(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryPerformersResultType\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Performer_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Performer_name(ctx, field)\n\t\t\tcase \"disambiguation\":\n\t\t\t\treturn ec.fieldContext_Performer_disambiguation(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Performer_aliases(ctx, field)\n\t\t\tcase \"gender\":\n\t\t\t\treturn ec.fieldContext_Performer_gender(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Performer_urls(ctx, field)\n\t\t\tcase \"birthdate\":\n\t\t\t\treturn ec.fieldContext_Performer_birthdate(ctx, field)\n\t\t\tcase \"birth_date\":\n\t\t\t\treturn ec.fieldContext_Performer_birth_date(ctx, field)\n\t\t\tcase \"death_date\":\n\t\t\t\treturn ec.fieldContext_Performer_death_date(ctx, field)\n\t\t\tcase \"age\":\n\t\t\t\treturn ec.fieldContext_Performer_age(ctx, field)\n\t\t\tcase \"ethnicity\":\n\t\t\t\treturn ec.fieldContext_Performer_ethnicity(ctx, field)\n\t\t\tcase \"country\":\n\t\t\t\treturn ec.fieldContext_Performer_country(ctx, field)\n\t\t\tcase \"eye_color\":\n\t\t\t\treturn ec.fieldContext_Performer_eye_color(ctx, field)\n\t\t\tcase \"hair_color\":\n\t\t\t\treturn ec.fieldContext_Performer_hair_color(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Performer_height(ctx, field)\n\t\t\tcase \"measurements\":\n\t\t\t\treturn ec.fieldContext_Performer_measurements(ctx, field)\n\t\t\tcase \"cup_size\":\n\t\t\t\treturn ec.fieldContext_Performer_cup_size(ctx, field)\n\t\t\tcase \"band_size\":\n\t\t\t\treturn ec.fieldContext_Performer_band_size(ctx, field)\n\t\t\tcase \"waist_size\":\n\t\t\t\treturn ec.fieldContext_Performer_waist_size(ctx, field)\n\t\t\tcase \"hip_size\":\n\t\t\t\treturn ec.fieldContext_Performer_hip_size(ctx, field)\n\t\t\tcase \"breast_type\":\n\t\t\t\treturn ec.fieldContext_Performer_breast_type(ctx, field)\n\t\t\tcase \"career_start_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_start_year(ctx, field)\n\t\t\tcase \"career_end_year\":\n\t\t\t\treturn ec.fieldContext_Performer_career_end_year(ctx, field)\n\t\t\tcase \"tattoos\":\n\t\t\t\treturn ec.fieldContext_Performer_tattoos(ctx, field)\n\t\t\tcase \"piercings\":\n\t\t\t\treturn ec.fieldContext_Performer_piercings(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Performer_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Performer_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Performer_edits(ctx, field)\n\t\t\tcase \"scene_count\":\n\t\t\t\treturn ec.fieldContext_Performer_scene_count(ctx, field)\n\t\t\tcase \"scenes\":\n\t\t\t\treturn ec.fieldContext_Performer_scenes(ctx, field)\n\t\t\tcase \"merged_ids\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_ids(ctx, field)\n\t\t\tcase \"merged_into_id\":\n\t\t\t\treturn ec.fieldContext_Performer_merged_into_id(ctx, field)\n\t\t\tcase \"studios\":\n\t\t\t\treturn ec.fieldContext_Performer_studios(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Performer_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Performer_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Performer_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Performer\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryPerformersResultType_facets(ctx context.Context, field graphql.CollectedField, obj *PerformerQuery) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryPerformersResultType_facets,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryPerformersResultType().Facets(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOPerformerSearchFacets2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerSearchFacets,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryPerformersResultType_facets(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryPerformersResultType\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"genders\":\n\t\t\t\treturn ec.fieldContext_PerformerSearchFacets_genders(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type PerformerSearchFacets\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryScenesResultType_count(ctx context.Context, field graphql.CollectedField, obj *SceneQuery) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryScenesResultType_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryScenesResultType().Count(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryScenesResultType_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryScenesResultType\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryScenesResultType_scenes(ctx context.Context, field graphql.CollectedField, obj *SceneQuery) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryScenesResultType_scenes,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.QueryScenesResultType().Scenes(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNScene2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryScenesResultType_scenes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryScenesResultType\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Scene_id(ctx, field)\n\t\t\tcase \"title\":\n\t\t\t\treturn ec.fieldContext_Scene_title(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Scene_details(ctx, field)\n\t\t\tcase \"date\":\n\t\t\t\treturn ec.fieldContext_Scene_date(ctx, field)\n\t\t\tcase \"release_date\":\n\t\t\t\treturn ec.fieldContext_Scene_release_date(ctx, field)\n\t\t\tcase \"production_date\":\n\t\t\t\treturn ec.fieldContext_Scene_production_date(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Scene_urls(ctx, field)\n\t\t\tcase \"studio\":\n\t\t\t\treturn ec.fieldContext_Scene_studio(ctx, field)\n\t\t\tcase \"tags\":\n\t\t\t\treturn ec.fieldContext_Scene_tags(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Scene_images(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Scene_performers(ctx, field)\n\t\t\tcase \"fingerprints\":\n\t\t\t\treturn ec.fieldContext_Scene_fingerprints(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Scene_duration(ctx, field)\n\t\t\tcase \"director\":\n\t\t\t\treturn ec.fieldContext_Scene_director(ctx, field)\n\t\t\tcase \"code\":\n\t\t\t\treturn ec.fieldContext_Scene_code(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Scene_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Scene_edits(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Scene_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Scene_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Scene\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QuerySitesResultType_count(ctx context.Context, field graphql.CollectedField, obj *QuerySitesResultType) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QuerySitesResultType_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Count, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QuerySitesResultType_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QuerySitesResultType\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QuerySitesResultType_sites(ctx context.Context, field graphql.CollectedField, obj *QuerySitesResultType) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QuerySitesResultType_sites,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Sites, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNSite2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSiteᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QuerySitesResultType_sites(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QuerySitesResultType\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Site_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Site_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Site_description(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Site_url(ctx, field)\n\t\t\tcase \"regex\":\n\t\t\t\treturn ec.fieldContext_Site_regex(ctx, field)\n\t\t\tcase \"valid_types\":\n\t\t\t\treturn ec.fieldContext_Site_valid_types(ctx, field)\n\t\t\tcase \"icon\":\n\t\t\t\treturn ec.fieldContext_Site_icon(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Site_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Site_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Site\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryStudiosResultType_count(ctx context.Context, field graphql.CollectedField, obj *QueryStudiosResultType) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryStudiosResultType_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Count, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryStudiosResultType_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryStudiosResultType\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryStudiosResultType_studios(ctx context.Context, field graphql.CollectedField, obj *QueryStudiosResultType) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryStudiosResultType_studios,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Studios, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNStudio2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryStudiosResultType_studios(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryStudiosResultType\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Studio_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Studio_name(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Studio_aliases(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Studio_urls(ctx, field)\n\t\t\tcase \"parent\":\n\t\t\t\treturn ec.fieldContext_Studio_parent(ctx, field)\n\t\t\tcase \"child_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_child_studios(ctx, field)\n\t\t\tcase \"sub_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_sub_studios(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Studio_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Studio_deleted(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Studio_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Studio_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Studio_updated(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Studio_performers(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Studio\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryTagCategoriesResultType_count(ctx context.Context, field graphql.CollectedField, obj *QueryTagCategoriesResultType) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryTagCategoriesResultType_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Count, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryTagCategoriesResultType_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryTagCategoriesResultType\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryTagCategoriesResultType_tag_categories(ctx context.Context, field graphql.CollectedField, obj *QueryTagCategoriesResultType) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryTagCategoriesResultType_tag_categories,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.TagCategories, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNTagCategory2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategoryᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryTagCategoriesResultType_tag_categories(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryTagCategoriesResultType\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_TagCategory_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_TagCategory_name(ctx, field)\n\t\t\tcase \"group\":\n\t\t\t\treturn ec.fieldContext_TagCategory_group(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_TagCategory_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type TagCategory\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryTagsResultType_count(ctx context.Context, field graphql.CollectedField, obj *QueryTagsResultType) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryTagsResultType_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Count, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryTagsResultType_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryTagsResultType\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryTagsResultType_tags(ctx context.Context, field graphql.CollectedField, obj *QueryTagsResultType) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryTagsResultType_tags,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Tags, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNTag2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryTagsResultType_tags(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryTagsResultType\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Tag_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Tag_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Tag_description(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Tag_aliases(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Tag_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Tag_edits(ctx, field)\n\t\t\tcase \"category\":\n\t\t\t\treturn ec.fieldContext_Tag_category(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Tag_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Tag_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Tag\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryUsersResultType_count(ctx context.Context, field graphql.CollectedField, obj *QueryUsersResultType) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryUsersResultType_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Count, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryUsersResultType_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryUsersResultType\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _QueryUsersResultType_users(ctx context.Context, field graphql.CollectedField, obj *QueryUsersResultType) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_QueryUsersResultType_users,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Users, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNUser2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_QueryUsersResultType_users(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"QueryUsersResultType\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_User_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_User_name(ctx, field)\n\t\t\tcase \"roles\":\n\t\t\t\treturn ec.fieldContext_User_roles(ctx, field)\n\t\t\tcase \"email\":\n\t\t\t\treturn ec.fieldContext_User_email(ctx, field)\n\t\t\tcase \"api_key\":\n\t\t\t\treturn ec.fieldContext_User_api_key(ctx, field)\n\t\t\tcase \"notification_subscriptions\":\n\t\t\t\treturn ec.fieldContext_User_notification_subscriptions(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_User_vote_count(ctx, field)\n\t\t\tcase \"edit_count\":\n\t\t\t\treturn ec.fieldContext_User_edit_count(ctx, field)\n\t\t\tcase \"api_calls\":\n\t\t\t\treturn ec.fieldContext_User_api_calls(ctx, field)\n\t\t\tcase \"invited_by\":\n\t\t\t\treturn ec.fieldContext_User_invited_by(ctx, field)\n\t\t\tcase \"invite_tokens\":\n\t\t\t\treturn ec.fieldContext_User_invite_tokens(ctx, field)\n\t\t\tcase \"active_invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_active_invite_codes(ctx, field)\n\t\t\tcase \"invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_invite_codes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type User\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_id(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_title(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_title,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Title, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_title(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_details(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_details,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Details, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_details(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_date(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_date,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Date, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_date(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_release_date(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_release_date,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Scene().ReleaseDate(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_release_date(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_production_date(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_production_date,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ProductionDate, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_production_date(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_urls(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Scene().Urls(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_URL_url(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext_URL_type(ctx, field)\n\t\t\tcase \"site\":\n\t\t\t\treturn ec.fieldContext_URL_site(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type URL\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_studio(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_studio,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Scene().Studio(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOStudio2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudio,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_studio(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Studio_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Studio_name(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Studio_aliases(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Studio_urls(ctx, field)\n\t\t\tcase \"parent\":\n\t\t\t\treturn ec.fieldContext_Studio_parent(ctx, field)\n\t\t\tcase \"child_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_child_studios(ctx, field)\n\t\t\tcase \"sub_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_sub_studios(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Studio_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Studio_deleted(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Studio_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Studio_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Studio_updated(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Studio_performers(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Studio\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_tags(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_tags,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Scene().Tags(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTag2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_tags(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Tag_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Tag_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Tag_description(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Tag_aliases(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Tag_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Tag_edits(ctx, field)\n\t\t\tcase \"category\":\n\t\t\t\treturn ec.fieldContext_Tag_category(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Tag_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Tag_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Tag\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_images(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_images,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Scene().Images(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_images(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_performers(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_performers,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Scene().Performers(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNPerformerAppearance2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearanceᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_performers(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"performer\":\n\t\t\t\treturn ec.fieldContext_PerformerAppearance_performer(ctx, field)\n\t\t\tcase \"as\":\n\t\t\t\treturn ec.fieldContext_PerformerAppearance_as(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type PerformerAppearance\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_fingerprints(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_fingerprints,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Scene().Fingerprints(ctx, obj, fc.Args[\"is_submitted\"].(*bool))\n\t\t},\n\t\tnil,\n\t\tec.marshalNFingerprint2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_fingerprints(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"hash\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_hash(ctx, field)\n\t\t\tcase \"algorithm\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_algorithm(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_duration(ctx, field)\n\t\t\tcase \"submissions\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_submissions(ctx, field)\n\t\t\tcase \"reports\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_reports(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_updated(ctx, field)\n\t\t\tcase \"user_submitted\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_user_submitted(ctx, field)\n\t\t\tcase \"user_reported\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_user_reported(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Fingerprint\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Scene_fingerprints_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_duration(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_duration,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Duration, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_duration(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_director(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_director,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Director, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_director(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_code(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_code,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Code, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_code(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_deleted(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_deleted,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Deleted, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_deleted(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_edits(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_edits,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Scene().Edits(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNEdit2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_edits(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_created(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_created,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Scene().Created(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_created(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Scene_updated(ctx context.Context, field graphql.CollectedField, obj *Scene) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Scene_updated,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Scene().Updated(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Scene_updated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Scene\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneDraft_id(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneDraft_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneDraft_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneDraft_title(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneDraft_title,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Title, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneDraft_title(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneDraft_code(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneDraft_code,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Code, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneDraft_code(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneDraft_details(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneDraft_details,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Details, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneDraft_details(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneDraft_director(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneDraft_director,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Director, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneDraft_director(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneDraft_urls(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneDraft_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.URLs, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚕstringᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneDraft_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneDraft_date(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneDraft_date,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Date, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneDraft_date(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneDraft_production_date(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneDraft_production_date,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ProductionDate, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneDraft_production_date(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneDraft_studio(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneDraft_studio,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneDraft().Studio(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOSceneDraftStudio2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDraftStudio,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneDraft_studio(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneDraft\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type SceneDraftStudio does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneDraft_performers(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneDraft_performers,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneDraft().Performers(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNSceneDraftPerformer2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDraftPerformerᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneDraft_performers(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneDraft\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type SceneDraftPerformer does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneDraft_tags(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneDraft_tags,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneDraft().Tags(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOSceneDraftTag2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDraftTagᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneDraft_tags(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneDraft\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type SceneDraftTag does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneDraft_image(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneDraft_image,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneDraft().Image(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOImage2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImage,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneDraft_image(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneDraft\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneDraft_fingerprints(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneDraft_fingerprints,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Fingerprints, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNDraftFingerprint2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftFingerprintᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneDraft_fingerprints(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneDraft\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"hash\":\n\t\t\t\treturn ec.fieldContext_DraftFingerprint_hash(ctx, field)\n\t\t\tcase \"algorithm\":\n\t\t\t\treturn ec.fieldContext_DraftFingerprint_algorithm(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_DraftFingerprint_duration(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type DraftFingerprint\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_title(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_title,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Title, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_title(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_details(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_details,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Details, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_details(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_added_urls(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_added_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.AddedUrls, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_added_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_URL_url(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext_URL_type(ctx, field)\n\t\t\tcase \"site\":\n\t\t\t\treturn ec.fieldContext_URL_site(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type URL\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_removed_urls(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_removed_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.RemovedUrls, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_removed_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_URL_url(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext_URL_type(ctx, field)\n\t\t\tcase \"site\":\n\t\t\t\treturn ec.fieldContext_URL_site(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type URL\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_date(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_date,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Date, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_date(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_production_date(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_production_date,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ProductionDate, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_production_date(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_studio(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_studio,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().Studio(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOStudio2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudio,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_studio(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Studio_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Studio_name(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Studio_aliases(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Studio_urls(ctx, field)\n\t\t\tcase \"parent\":\n\t\t\t\treturn ec.fieldContext_Studio_parent(ctx, field)\n\t\t\tcase \"child_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_child_studios(ctx, field)\n\t\t\tcase \"sub_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_sub_studios(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Studio_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Studio_deleted(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Studio_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Studio_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Studio_updated(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Studio_performers(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Studio\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_added_performers(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_added_performers,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().AddedPerformers(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOPerformerAppearance2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearanceᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_added_performers(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"performer\":\n\t\t\t\treturn ec.fieldContext_PerformerAppearance_performer(ctx, field)\n\t\t\tcase \"as\":\n\t\t\t\treturn ec.fieldContext_PerformerAppearance_as(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type PerformerAppearance\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_removed_performers(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_removed_performers,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().RemovedPerformers(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOPerformerAppearance2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearanceᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_removed_performers(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"performer\":\n\t\t\t\treturn ec.fieldContext_PerformerAppearance_performer(ctx, field)\n\t\t\tcase \"as\":\n\t\t\t\treturn ec.fieldContext_PerformerAppearance_as(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type PerformerAppearance\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_added_tags(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_added_tags,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().AddedTags(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOTag2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_added_tags(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Tag_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Tag_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Tag_description(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Tag_aliases(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Tag_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Tag_edits(ctx, field)\n\t\t\tcase \"category\":\n\t\t\t\treturn ec.fieldContext_Tag_category(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Tag_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Tag_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Tag\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_removed_tags(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_removed_tags,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().RemovedTags(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOTag2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_removed_tags(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Tag_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Tag_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Tag_description(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Tag_aliases(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Tag_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Tag_edits(ctx, field)\n\t\t\tcase \"category\":\n\t\t\t\treturn ec.fieldContext_Tag_category(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Tag_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Tag_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Tag\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_added_images(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_added_images,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().AddedImages(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_added_images(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_removed_images(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_removed_images,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().RemovedImages(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_removed_images(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_added_fingerprints(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_added_fingerprints,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().AddedFingerprints(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOFingerprint2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_added_fingerprints(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"hash\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_hash(ctx, field)\n\t\t\tcase \"algorithm\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_algorithm(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_duration(ctx, field)\n\t\t\tcase \"submissions\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_submissions(ctx, field)\n\t\t\tcase \"reports\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_reports(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_updated(ctx, field)\n\t\t\tcase \"user_submitted\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_user_submitted(ctx, field)\n\t\t\tcase \"user_reported\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_user_reported(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Fingerprint\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_removed_fingerprints(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_removed_fingerprints,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().RemovedFingerprints(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOFingerprint2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_removed_fingerprints(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"hash\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_hash(ctx, field)\n\t\t\tcase \"algorithm\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_algorithm(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_duration(ctx, field)\n\t\t\tcase \"submissions\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_submissions(ctx, field)\n\t\t\tcase \"reports\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_reports(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_updated(ctx, field)\n\t\t\tcase \"user_submitted\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_user_submitted(ctx, field)\n\t\t\tcase \"user_reported\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_user_reported(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Fingerprint\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_duration(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_duration,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Duration, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_duration(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_director(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_director,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Director, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_director(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_code(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_code,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Code, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_code(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_draft_id(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_draft_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.DraftID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_draft_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_urls(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().Urls(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_URL_url(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext_URL_type(ctx, field)\n\t\t\tcase \"site\":\n\t\t\t\treturn ec.fieldContext_URL_site(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type URL\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_performers(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_performers,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().Performers(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNPerformerAppearance2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearanceᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_performers(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"performer\":\n\t\t\t\treturn ec.fieldContext_PerformerAppearance_performer(ctx, field)\n\t\t\tcase \"as\":\n\t\t\t\treturn ec.fieldContext_PerformerAppearance_as(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type PerformerAppearance\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_tags(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_tags,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().Tags(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTag2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_tags(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Tag_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Tag_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Tag_description(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Tag_aliases(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Tag_deleted(ctx, field)\n\t\t\tcase \"edits\":\n\t\t\t\treturn ec.fieldContext_Tag_edits(ctx, field)\n\t\t\tcase \"category\":\n\t\t\t\treturn ec.fieldContext_Tag_category(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Tag_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Tag_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Tag\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_images(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_images,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().Images(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_images(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _SceneEdit_fingerprints(ctx context.Context, field graphql.CollectedField, obj *SceneEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_SceneEdit_fingerprints,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.SceneEdit().Fingerprints(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNFingerprint2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_SceneEdit_fingerprints(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"SceneEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"hash\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_hash(ctx, field)\n\t\t\tcase \"algorithm\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_algorithm(ctx, field)\n\t\t\tcase \"duration\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_duration(ctx, field)\n\t\t\tcase \"submissions\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_submissions(ctx, field)\n\t\t\tcase \"reports\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_reports(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_updated(ctx, field)\n\t\t\tcase \"user_submitted\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_user_submitted(ctx, field)\n\t\t\tcase \"user_reported\":\n\t\t\t\treturn ec.fieldContext_Fingerprint_user_reported(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Fingerprint\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Site_id(ctx context.Context, field graphql.CollectedField, obj *Site) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Site_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Site_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Site\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Site_name(ctx context.Context, field graphql.CollectedField, obj *Site) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Site_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Site_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Site\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Site_description(ctx context.Context, field graphql.CollectedField, obj *Site) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Site_description,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Description, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Site_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Site\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Site_url(ctx context.Context, field graphql.CollectedField, obj *Site) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Site_url,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.URL, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Site_url(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Site\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Site_regex(ctx context.Context, field graphql.CollectedField, obj *Site) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Site_regex,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Regex, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Site_regex(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Site\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Site_valid_types(ctx context.Context, field graphql.CollectedField, obj *Site) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Site_valid_types,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Site().ValidTypes(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNValidSiteTypeEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐValidSiteTypeEnumᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Site_valid_types(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Site\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ValidSiteTypeEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Site_icon(ctx context.Context, field graphql.CollectedField, obj *Site) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Site_icon,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Site().Icon(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Site_icon(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Site\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Site_created(ctx context.Context, field graphql.CollectedField, obj *Site) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Site_created,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Site().Created(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Site_created(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Site\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Site_updated(ctx context.Context, field graphql.CollectedField, obj *Site) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Site_updated,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Site().Updated(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Site_updated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Site\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StashBoxConfig_host_url(ctx context.Context, field graphql.CollectedField, obj *StashBoxConfig) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StashBoxConfig_host_url,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.HostURL, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StashBoxConfig_host_url(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StashBoxConfig\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StashBoxConfig_require_invite(ctx context.Context, field graphql.CollectedField, obj *StashBoxConfig) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StashBoxConfig_require_invite,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.RequireInvite, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StashBoxConfig_require_invite(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StashBoxConfig\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StashBoxConfig_require_activation(ctx context.Context, field graphql.CollectedField, obj *StashBoxConfig) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StashBoxConfig_require_activation,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.RequireActivation, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StashBoxConfig_require_activation(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StashBoxConfig\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StashBoxConfig_vote_promotion_threshold(ctx context.Context, field graphql.CollectedField, obj *StashBoxConfig) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StashBoxConfig_vote_promotion_threshold,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.VotePromotionThreshold, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOInt2ᚖint,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StashBoxConfig_vote_promotion_threshold(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StashBoxConfig\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StashBoxConfig_vote_application_threshold(ctx context.Context, field graphql.CollectedField, obj *StashBoxConfig) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StashBoxConfig_vote_application_threshold,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.VoteApplicationThreshold, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StashBoxConfig_vote_application_threshold(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StashBoxConfig\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StashBoxConfig_voting_period(ctx context.Context, field graphql.CollectedField, obj *StashBoxConfig) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StashBoxConfig_voting_period,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.VotingPeriod, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StashBoxConfig_voting_period(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StashBoxConfig\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StashBoxConfig_min_destructive_voting_period(ctx context.Context, field graphql.CollectedField, obj *StashBoxConfig) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StashBoxConfig_min_destructive_voting_period,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.MinDestructiveVotingPeriod, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StashBoxConfig_min_destructive_voting_period(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StashBoxConfig\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StashBoxConfig_vote_cron_interval(ctx context.Context, field graphql.CollectedField, obj *StashBoxConfig) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StashBoxConfig_vote_cron_interval,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.VoteCronInterval, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StashBoxConfig_vote_cron_interval(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StashBoxConfig\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StashBoxConfig_guidelines_url(ctx context.Context, field graphql.CollectedField, obj *StashBoxConfig) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StashBoxConfig_guidelines_url,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.GuidelinesURL, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StashBoxConfig_guidelines_url(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StashBoxConfig\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StashBoxConfig_require_scene_draft(ctx context.Context, field graphql.CollectedField, obj *StashBoxConfig) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StashBoxConfig_require_scene_draft,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.RequireSceneDraft, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StashBoxConfig_require_scene_draft(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StashBoxConfig\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StashBoxConfig_edit_update_limit(ctx context.Context, field graphql.CollectedField, obj *StashBoxConfig) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StashBoxConfig_edit_update_limit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.EditUpdateLimit, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StashBoxConfig_edit_update_limit(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StashBoxConfig\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StashBoxConfig_require_tag_role(ctx context.Context, field graphql.CollectedField, obj *StashBoxConfig) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StashBoxConfig_require_tag_role,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.RequireTagRole, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StashBoxConfig_require_tag_role(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StashBoxConfig\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Studio_id(ctx context.Context, field graphql.CollectedField, obj *Studio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Studio_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Studio_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Studio\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Studio_name(ctx context.Context, field graphql.CollectedField, obj *Studio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Studio_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Studio_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Studio\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Studio_aliases(ctx context.Context, field graphql.CollectedField, obj *Studio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Studio_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Studio().Aliases(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2ᚕstringᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Studio_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Studio\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Studio_urls(ctx context.Context, field graphql.CollectedField, obj *Studio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Studio_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Studio().Urls(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Studio_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Studio\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_URL_url(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext_URL_type(ctx, field)\n\t\t\tcase \"site\":\n\t\t\t\treturn ec.fieldContext_URL_site(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type URL\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Studio_parent(ctx context.Context, field graphql.CollectedField, obj *Studio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Studio_parent,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Studio().Parent(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOStudio2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudio,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Studio_parent(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Studio\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Studio_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Studio_name(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Studio_aliases(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Studio_urls(ctx, field)\n\t\t\tcase \"parent\":\n\t\t\t\treturn ec.fieldContext_Studio_parent(ctx, field)\n\t\t\tcase \"child_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_child_studios(ctx, field)\n\t\t\tcase \"sub_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_sub_studios(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Studio_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Studio_deleted(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Studio_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Studio_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Studio_updated(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Studio_performers(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Studio\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Studio_child_studios(ctx context.Context, field graphql.CollectedField, obj *Studio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Studio_child_studios,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Studio().ChildStudios(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNStudio2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Studio_child_studios(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Studio\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Studio_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Studio_name(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Studio_aliases(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Studio_urls(ctx, field)\n\t\t\tcase \"parent\":\n\t\t\t\treturn ec.fieldContext_Studio_parent(ctx, field)\n\t\t\tcase \"child_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_child_studios(ctx, field)\n\t\t\tcase \"sub_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_sub_studios(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Studio_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Studio_deleted(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Studio_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Studio_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Studio_updated(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Studio_performers(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Studio\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Studio_sub_studios(ctx context.Context, field graphql.CollectedField, obj *Studio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Studio_sub_studios,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Studio().SubStudios(ctx, obj, fc.Args[\"input\"].(*StudioQueryInput))\n\t\t},\n\t\tnil,\n\t\tec.marshalNQueryStudiosResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryStudiosResultType,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Studio_sub_studios(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Studio\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QueryStudiosResultType_count(ctx, field)\n\t\t\tcase \"studios\":\n\t\t\t\treturn ec.fieldContext_QueryStudiosResultType_studios(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryStudiosResultType\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Studio_sub_studios_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Studio_images(ctx context.Context, field graphql.CollectedField, obj *Studio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Studio_images,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Studio().Images(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Studio_images(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Studio\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Studio_deleted(ctx context.Context, field graphql.CollectedField, obj *Studio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Studio_deleted,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Deleted, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Studio_deleted(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Studio\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Studio_is_favorite(ctx context.Context, field graphql.CollectedField, obj *Studio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Studio_is_favorite,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Studio().IsFavorite(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Studio_is_favorite(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Studio\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Studio_created(ctx context.Context, field graphql.CollectedField, obj *Studio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Studio_created,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Studio().Created(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Studio_created(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Studio\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Studio_updated(ctx context.Context, field graphql.CollectedField, obj *Studio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Studio_updated,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Studio().Updated(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2ᚖtimeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Studio_updated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Studio\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Studio_performers(ctx context.Context, field graphql.CollectedField, obj *Studio) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Studio_performers,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn ec.Resolvers.Studio().Performers(ctx, obj, fc.Args[\"input\"].(PerformerQueryInput))\n\t\t},\n\t\tnil,\n\t\tec.marshalNQueryPerformersResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerQuery,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Studio_performers(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Studio\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"count\":\n\t\t\t\treturn ec.fieldContext_QueryPerformersResultType_count(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_QueryPerformersResultType_performers(ctx, field)\n\t\t\tcase \"facets\":\n\t\t\t\treturn ec.fieldContext_QueryPerformersResultType_facets(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type QueryPerformersResultType\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field_Studio_performers_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StudioEdit_name(ctx context.Context, field graphql.CollectedField, obj *StudioEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StudioEdit_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StudioEdit_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StudioEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StudioEdit_added_urls(ctx context.Context, field graphql.CollectedField, obj *StudioEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StudioEdit_added_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.AddedUrls, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StudioEdit_added_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StudioEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_URL_url(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext_URL_type(ctx, field)\n\t\t\tcase \"site\":\n\t\t\t\treturn ec.fieldContext_URL_site(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type URL\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StudioEdit_removed_urls(ctx context.Context, field graphql.CollectedField, obj *StudioEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StudioEdit_removed_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.RemovedUrls, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StudioEdit_removed_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StudioEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_URL_url(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext_URL_type(ctx, field)\n\t\t\tcase \"site\":\n\t\t\t\treturn ec.fieldContext_URL_site(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type URL\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StudioEdit_parent(ctx context.Context, field graphql.CollectedField, obj *StudioEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StudioEdit_parent,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.StudioEdit().Parent(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOStudio2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudio,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StudioEdit_parent(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StudioEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Studio_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Studio_name(ctx, field)\n\t\t\tcase \"aliases\":\n\t\t\t\treturn ec.fieldContext_Studio_aliases(ctx, field)\n\t\t\tcase \"urls\":\n\t\t\t\treturn ec.fieldContext_Studio_urls(ctx, field)\n\t\t\tcase \"parent\":\n\t\t\t\treturn ec.fieldContext_Studio_parent(ctx, field)\n\t\t\tcase \"child_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_child_studios(ctx, field)\n\t\t\tcase \"sub_studios\":\n\t\t\t\treturn ec.fieldContext_Studio_sub_studios(ctx, field)\n\t\t\tcase \"images\":\n\t\t\t\treturn ec.fieldContext_Studio_images(ctx, field)\n\t\t\tcase \"deleted\":\n\t\t\t\treturn ec.fieldContext_Studio_deleted(ctx, field)\n\t\t\tcase \"is_favorite\":\n\t\t\t\treturn ec.fieldContext_Studio_is_favorite(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Studio_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Studio_updated(ctx, field)\n\t\t\tcase \"performers\":\n\t\t\t\treturn ec.fieldContext_Studio_performers(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Studio\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StudioEdit_added_images(ctx context.Context, field graphql.CollectedField, obj *StudioEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StudioEdit_added_images,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.StudioEdit().AddedImages(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StudioEdit_added_images(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StudioEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StudioEdit_removed_images(ctx context.Context, field graphql.CollectedField, obj *StudioEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StudioEdit_removed_images,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.StudioEdit().RemovedImages(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StudioEdit_removed_images(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StudioEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StudioEdit_added_aliases(ctx context.Context, field graphql.CollectedField, obj *StudioEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StudioEdit_added_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.AddedAliases, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚕstringᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StudioEdit_added_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StudioEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StudioEdit_removed_aliases(ctx context.Context, field graphql.CollectedField, obj *StudioEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StudioEdit_removed_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.RemovedAliases, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚕstringᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StudioEdit_removed_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StudioEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StudioEdit_images(ctx context.Context, field graphql.CollectedField, obj *StudioEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StudioEdit_images,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.StudioEdit().Images(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StudioEdit_images(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StudioEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Image_id(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Image_url(ctx, field)\n\t\t\tcase \"width\":\n\t\t\t\treturn ec.fieldContext_Image_width(ctx, field)\n\t\t\tcase \"height\":\n\t\t\t\treturn ec.fieldContext_Image_height(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Image\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _StudioEdit_urls(ctx context.Context, field graphql.CollectedField, obj *StudioEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_StudioEdit_urls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.StudioEdit().Urls(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_StudioEdit_urls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"StudioEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_URL_url(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext_URL_type(ctx, field)\n\t\t\tcase \"site\":\n\t\t\t\treturn ec.fieldContext_URL_site(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type URL\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Tag_id(ctx context.Context, field graphql.CollectedField, obj *Tag) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Tag_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Tag_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Tag\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Tag_name(ctx context.Context, field graphql.CollectedField, obj *Tag) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Tag_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Tag_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Tag\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Tag_description(ctx context.Context, field graphql.CollectedField, obj *Tag) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Tag_description,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Description, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Tag_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Tag\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Tag_aliases(ctx context.Context, field graphql.CollectedField, obj *Tag) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Tag_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Tag().Aliases(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2ᚕstringᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Tag_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Tag\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Tag_deleted(ctx context.Context, field graphql.CollectedField, obj *Tag) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Tag_deleted,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Deleted, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Tag_deleted(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Tag\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Tag_edits(ctx context.Context, field graphql.CollectedField, obj *Tag) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Tag_edits,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Tag().Edits(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNEdit2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Tag_edits(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Tag\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Tag_category(ctx context.Context, field graphql.CollectedField, obj *Tag) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Tag_category,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.Tag().Category(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOTagCategory2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategory,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Tag_category(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Tag\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_TagCategory_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_TagCategory_name(ctx, field)\n\t\t\tcase \"group\":\n\t\t\t\treturn ec.fieldContext_TagCategory_group(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_TagCategory_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type TagCategory\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Tag_created(ctx context.Context, field graphql.CollectedField, obj *Tag) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Tag_created,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Created, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2timeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Tag_created(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Tag\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Tag_updated(ctx context.Context, field graphql.CollectedField, obj *Tag) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Tag_updated,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Updated, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNTime2timeᚐTime,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Tag_updated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Tag\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Time does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _TagCategory_id(ctx context.Context, field graphql.CollectedField, obj *TagCategory) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_TagCategory_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_TagCategory_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"TagCategory\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _TagCategory_name(ctx context.Context, field graphql.CollectedField, obj *TagCategory) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_TagCategory_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_TagCategory_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"TagCategory\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _TagCategory_group(ctx context.Context, field graphql.CollectedField, obj *TagCategory) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_TagCategory_group,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.TagCategory().Group(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNTagGroupEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagGroupEnum,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_TagCategory_group(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"TagCategory\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type TagGroupEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _TagCategory_description(ctx context.Context, field graphql.CollectedField, obj *TagCategory) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_TagCategory_description,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Description, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_TagCategory_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"TagCategory\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _TagEdit_name(ctx context.Context, field graphql.CollectedField, obj *TagEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_TagEdit_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_TagEdit_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"TagEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _TagEdit_description(ctx context.Context, field graphql.CollectedField, obj *TagEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_TagEdit_description,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Description, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_TagEdit_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"TagEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _TagEdit_added_aliases(ctx context.Context, field graphql.CollectedField, obj *TagEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_TagEdit_added_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.AddedAliases, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚕstringᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_TagEdit_added_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"TagEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _TagEdit_removed_aliases(ctx context.Context, field graphql.CollectedField, obj *TagEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_TagEdit_removed_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.RemovedAliases, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚕstringᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_TagEdit_removed_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"TagEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _TagEdit_category(ctx context.Context, field graphql.CollectedField, obj *TagEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_TagEdit_category,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.TagEdit().Category(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalOTagCategory2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategory,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_TagEdit_category(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"TagEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_TagCategory_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_TagCategory_name(ctx, field)\n\t\t\tcase \"group\":\n\t\t\t\treturn ec.fieldContext_TagCategory_group(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_TagCategory_description(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type TagCategory\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _TagEdit_aliases(ctx context.Context, field graphql.CollectedField, obj *TagEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_TagEdit_aliases,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.TagEdit().Aliases(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2ᚕstringᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_TagEdit_aliases(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"TagEdit\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _URL_url(ctx context.Context, field graphql.CollectedField, obj *URL) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_URL_url,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.URL, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_URL_url(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"URL\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _URL_type(ctx context.Context, field graphql.CollectedField, obj *URL) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_URL_type,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.URL().Type(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_URL_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"URL\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _URL_site(ctx context.Context, field graphql.CollectedField, obj *URL) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_URL_site,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.URL().Site(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNSite2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSite,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_URL_site(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"URL\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Site_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_Site_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext_Site_description(ctx, field)\n\t\t\tcase \"url\":\n\t\t\t\treturn ec.fieldContext_Site_url(ctx, field)\n\t\t\tcase \"regex\":\n\t\t\t\treturn ec.fieldContext_Site_regex(ctx, field)\n\t\t\tcase \"valid_types\":\n\t\t\t\treturn ec.fieldContext_Site_valid_types(ctx, field)\n\t\t\tcase \"icon\":\n\t\t\t\treturn ec.fieldContext_Site_icon(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Site_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Site_updated(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Site\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _UpdatedEdit_edit(ctx context.Context, field graphql.CollectedField, obj *UpdatedEdit) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_UpdatedEdit_edit,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Edit, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_UpdatedEdit_edit(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"UpdatedEdit\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_Edit_id(ctx, field)\n\t\t\tcase \"user\":\n\t\t\t\treturn ec.fieldContext_Edit_user(ctx, field)\n\t\t\tcase \"target\":\n\t\t\t\treturn ec.fieldContext_Edit_target(ctx, field)\n\t\t\tcase \"target_type\":\n\t\t\t\treturn ec.fieldContext_Edit_target_type(ctx, field)\n\t\t\tcase \"merge_sources\":\n\t\t\t\treturn ec.fieldContext_Edit_merge_sources(ctx, field)\n\t\t\tcase \"operation\":\n\t\t\t\treturn ec.fieldContext_Edit_operation(ctx, field)\n\t\t\tcase \"bot\":\n\t\t\t\treturn ec.fieldContext_Edit_bot(ctx, field)\n\t\t\tcase \"details\":\n\t\t\t\treturn ec.fieldContext_Edit_details(ctx, field)\n\t\t\tcase \"old_details\":\n\t\t\t\treturn ec.fieldContext_Edit_old_details(ctx, field)\n\t\t\tcase \"options\":\n\t\t\t\treturn ec.fieldContext_Edit_options(ctx, field)\n\t\t\tcase \"comments\":\n\t\t\t\treturn ec.fieldContext_Edit_comments(ctx, field)\n\t\t\tcase \"votes\":\n\t\t\t\treturn ec.fieldContext_Edit_votes(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_Edit_vote_count(ctx, field)\n\t\t\tcase \"destructive\":\n\t\t\t\treturn ec.fieldContext_Edit_destructive(ctx, field)\n\t\t\tcase \"status\":\n\t\t\t\treturn ec.fieldContext_Edit_status(ctx, field)\n\t\t\tcase \"applied\":\n\t\t\t\treturn ec.fieldContext_Edit_applied(ctx, field)\n\t\t\tcase \"update_count\":\n\t\t\t\treturn ec.fieldContext_Edit_update_count(ctx, field)\n\t\t\tcase \"updatable\":\n\t\t\t\treturn ec.fieldContext_Edit_updatable(ctx, field)\n\t\t\tcase \"created\":\n\t\t\t\treturn ec.fieldContext_Edit_created(ctx, field)\n\t\t\tcase \"updated\":\n\t\t\t\treturn ec.fieldContext_Edit_updated(ctx, field)\n\t\t\tcase \"closed\":\n\t\t\t\treturn ec.fieldContext_Edit_closed(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_Edit_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type Edit\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _User_id(ctx context.Context, field graphql.CollectedField, obj *User) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_User_id,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ID, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_User_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"User\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type ID does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _User_name(ctx context.Context, field graphql.CollectedField, obj *User) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_User_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_User_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"User\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _User_roles(ctx context.Context, field graphql.CollectedField, obj *User) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_User_roles,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.User().Roles(ctx, obj)\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\tif ec.Directives.IsUserOwner == nil {\n\t\t\t\t\tvar zeroVal []RoleEnum\n\t\t\t\t\treturn zeroVal, errors.New(\"directive isUserOwner is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.IsUserOwner(ctx, obj, directive0)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalORoleEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnumᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_User_roles(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"User\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type RoleEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _User_email(ctx context.Context, field graphql.CollectedField, obj *User) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_User_email,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Email, nil\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\tif ec.Directives.IsUserOwner == nil {\n\t\t\t\t\tvar zeroVal string\n\t\t\t\t\treturn zeroVal, errors.New(\"directive isUserOwner is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.IsUserOwner(ctx, obj, directive0)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOString2string,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_User_email(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"User\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _User_api_key(ctx context.Context, field graphql.CollectedField, obj *User) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_User_api_key,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.APIKey, nil\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\tif ec.Directives.IsUserOwner == nil {\n\t\t\t\t\tvar zeroVal string\n\t\t\t\t\treturn zeroVal, errors.New(\"directive isUserOwner is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.IsUserOwner(ctx, obj, directive0)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOString2string,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_User_api_key(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"User\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _User_notification_subscriptions(ctx context.Context, field graphql.CollectedField, obj *User) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_User_notification_subscriptions,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.User().NotificationSubscriptions(ctx, obj)\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\tif ec.Directives.IsUserOwner == nil {\n\t\t\t\t\tvar zeroVal []NotificationEnum\n\t\t\t\t\treturn zeroVal, errors.New(\"directive isUserOwner is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.IsUserOwner(ctx, obj, directive0)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNNotificationEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationEnumᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_User_notification_subscriptions(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"User\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type NotificationEnum does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _User_vote_count(ctx context.Context, field graphql.CollectedField, obj *User) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_User_vote_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.User().VoteCount(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNUserVoteCount2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserVoteCount,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_User_vote_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"User\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"abstain\":\n\t\t\t\treturn ec.fieldContext_UserVoteCount_abstain(ctx, field)\n\t\t\tcase \"accept\":\n\t\t\t\treturn ec.fieldContext_UserVoteCount_accept(ctx, field)\n\t\t\tcase \"reject\":\n\t\t\t\treturn ec.fieldContext_UserVoteCount_reject(ctx, field)\n\t\t\tcase \"immediate_accept\":\n\t\t\t\treturn ec.fieldContext_UserVoteCount_immediate_accept(ctx, field)\n\t\t\tcase \"immediate_reject\":\n\t\t\t\treturn ec.fieldContext_UserVoteCount_immediate_reject(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type UserVoteCount\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _User_edit_count(ctx context.Context, field graphql.CollectedField, obj *User) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_User_edit_count,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.User().EditCount(ctx, obj)\n\t\t},\n\t\tnil,\n\t\tec.marshalNUserEditCount2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserEditCount,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_User_edit_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"User\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"accepted\":\n\t\t\t\treturn ec.fieldContext_UserEditCount_accepted(ctx, field)\n\t\t\tcase \"rejected\":\n\t\t\t\treturn ec.fieldContext_UserEditCount_rejected(ctx, field)\n\t\t\tcase \"pending\":\n\t\t\t\treturn ec.fieldContext_UserEditCount_pending(ctx, field)\n\t\t\tcase \"immediate_accepted\":\n\t\t\t\treturn ec.fieldContext_UserEditCount_immediate_accepted(ctx, field)\n\t\t\tcase \"immediate_rejected\":\n\t\t\t\treturn ec.fieldContext_UserEditCount_immediate_rejected(ctx, field)\n\t\t\tcase \"failed\":\n\t\t\t\treturn ec.fieldContext_UserEditCount_failed(ctx, field)\n\t\t\tcase \"canceled\":\n\t\t\t\treturn ec.fieldContext_UserEditCount_canceled(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type UserEditCount\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _User_api_calls(ctx context.Context, field graphql.CollectedField, obj *User) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_User_api_calls,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.APICalls, nil\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\tif ec.Directives.IsUserOwner == nil {\n\t\t\t\t\tvar zeroVal int\n\t\t\t\t\treturn zeroVal, errors.New(\"directive isUserOwner is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.IsUserOwner(ctx, obj, directive0)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_User_api_calls(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"User\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _User_invited_by(ctx context.Context, field graphql.CollectedField, obj *User) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_User_invited_by,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.User().InvitedBy(ctx, obj)\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\tif ec.Directives.IsUserOwner == nil {\n\t\t\t\t\tvar zeroVal *User\n\t\t\t\t\treturn zeroVal, errors.New(\"directive isUserOwner is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.IsUserOwner(ctx, obj, directive0)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOUser2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUser,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_User_invited_by(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"User\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_User_id(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext_User_name(ctx, field)\n\t\t\tcase \"roles\":\n\t\t\t\treturn ec.fieldContext_User_roles(ctx, field)\n\t\t\tcase \"email\":\n\t\t\t\treturn ec.fieldContext_User_email(ctx, field)\n\t\t\tcase \"api_key\":\n\t\t\t\treturn ec.fieldContext_User_api_key(ctx, field)\n\t\t\tcase \"notification_subscriptions\":\n\t\t\t\treturn ec.fieldContext_User_notification_subscriptions(ctx, field)\n\t\t\tcase \"vote_count\":\n\t\t\t\treturn ec.fieldContext_User_vote_count(ctx, field)\n\t\t\tcase \"edit_count\":\n\t\t\t\treturn ec.fieldContext_User_edit_count(ctx, field)\n\t\t\tcase \"api_calls\":\n\t\t\t\treturn ec.fieldContext_User_api_calls(ctx, field)\n\t\t\tcase \"invited_by\":\n\t\t\t\treturn ec.fieldContext_User_invited_by(ctx, field)\n\t\t\tcase \"invite_tokens\":\n\t\t\t\treturn ec.fieldContext_User_invite_tokens(ctx, field)\n\t\t\tcase \"active_invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_active_invite_codes(ctx, field)\n\t\t\tcase \"invite_codes\":\n\t\t\t\treturn ec.fieldContext_User_invite_codes(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type User\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _User_invite_tokens(ctx context.Context, field graphql.CollectedField, obj *User) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_User_invite_tokens,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.InviteTokens, nil\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\tif ec.Directives.IsUserOwner == nil {\n\t\t\t\t\tvar zeroVal int\n\t\t\t\t\treturn zeroVal, errors.New(\"directive isUserOwner is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.IsUserOwner(ctx, obj, directive0)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOInt2int,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_User_invite_tokens(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"User\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _User_active_invite_codes(ctx context.Context, field graphql.CollectedField, obj *User) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_User_active_invite_codes,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.User().ActiveInviteCodes(ctx, obj)\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\tif ec.Directives.IsUserOwner == nil {\n\t\t\t\t\tvar zeroVal []string\n\t\t\t\t\treturn zeroVal, errors.New(\"directive isUserOwner is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.IsUserOwner(ctx, obj, directive0)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOString2ᚕstringᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_User_active_invite_codes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"User\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _User_invite_codes(ctx context.Context, field graphql.CollectedField, obj *User) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_User_invite_codes,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn ec.Resolvers.User().InviteCodes(ctx, obj)\n\t\t},\n\t\tfunc(ctx context.Context, next graphql.Resolver) graphql.Resolver {\n\t\t\tdirective0 := next\n\n\t\t\tdirective1 := func(ctx context.Context) (any, error) {\n\t\t\t\tif ec.Directives.IsUserOwner == nil {\n\t\t\t\t\tvar zeroVal []InviteKey\n\t\t\t\t\treturn zeroVal, errors.New(\"directive isUserOwner is not implemented\")\n\t\t\t\t}\n\t\t\t\treturn ec.Directives.IsUserOwner(ctx, obj, directive0)\n\t\t\t}\n\n\t\t\tnext = directive1\n\t\t\treturn next\n\t\t},\n\t\tec.marshalOInviteKey2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐInviteKeyᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_User_invite_codes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"User\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: true,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"id\":\n\t\t\t\treturn ec.fieldContext_InviteKey_id(ctx, field)\n\t\t\tcase \"uses\":\n\t\t\t\treturn ec.fieldContext_InviteKey_uses(ctx, field)\n\t\t\tcase \"expires\":\n\t\t\t\treturn ec.fieldContext_InviteKey_expires(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type InviteKey\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _UserEditCount_accepted(ctx context.Context, field graphql.CollectedField, obj *UserEditCount) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_UserEditCount_accepted,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Accepted, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_UserEditCount_accepted(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"UserEditCount\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _UserEditCount_rejected(ctx context.Context, field graphql.CollectedField, obj *UserEditCount) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_UserEditCount_rejected,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Rejected, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_UserEditCount_rejected(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"UserEditCount\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _UserEditCount_pending(ctx context.Context, field graphql.CollectedField, obj *UserEditCount) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_UserEditCount_pending,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Pending, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_UserEditCount_pending(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"UserEditCount\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _UserEditCount_immediate_accepted(ctx context.Context, field graphql.CollectedField, obj *UserEditCount) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_UserEditCount_immediate_accepted,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ImmediateAccepted, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_UserEditCount_immediate_accepted(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"UserEditCount\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _UserEditCount_immediate_rejected(ctx context.Context, field graphql.CollectedField, obj *UserEditCount) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_UserEditCount_immediate_rejected,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ImmediateRejected, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_UserEditCount_immediate_rejected(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"UserEditCount\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _UserEditCount_failed(ctx context.Context, field graphql.CollectedField, obj *UserEditCount) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_UserEditCount_failed,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Failed, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_UserEditCount_failed(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"UserEditCount\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _UserEditCount_canceled(ctx context.Context, field graphql.CollectedField, obj *UserEditCount) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_UserEditCount_canceled,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Canceled, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_UserEditCount_canceled(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"UserEditCount\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _UserVoteCount_abstain(ctx context.Context, field graphql.CollectedField, obj *UserVoteCount) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_UserVoteCount_abstain,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Abstain, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_UserVoteCount_abstain(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"UserVoteCount\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _UserVoteCount_accept(ctx context.Context, field graphql.CollectedField, obj *UserVoteCount) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_UserVoteCount_accept,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Accept, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_UserVoteCount_accept(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"UserVoteCount\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _UserVoteCount_reject(ctx context.Context, field graphql.CollectedField, obj *UserVoteCount) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_UserVoteCount_reject,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Reject, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_UserVoteCount_reject(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"UserVoteCount\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _UserVoteCount_immediate_accept(ctx context.Context, field graphql.CollectedField, obj *UserVoteCount) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_UserVoteCount_immediate_accept,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ImmediateAccept, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_UserVoteCount_immediate_accept(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"UserVoteCount\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _UserVoteCount_immediate_reject(ctx context.Context, field graphql.CollectedField, obj *UserVoteCount) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_UserVoteCount_immediate_reject,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.ImmediateReject, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNInt2int,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_UserVoteCount_immediate_reject(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"UserVoteCount\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Int does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Version_hash(ctx context.Context, field graphql.CollectedField, obj *Version) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Version_hash,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Hash, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Version_hash(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Version\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Version_build_time(ctx context.Context, field graphql.CollectedField, obj *Version) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Version_build_time,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.BuildTime, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Version_build_time(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Version\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Version_build_type(ctx context.Context, field graphql.CollectedField, obj *Version) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Version_build_type,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.BuildType, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Version_build_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Version\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) _Version_version(ctx context.Context, field graphql.CollectedField, obj *Version) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext_Version_version,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Version, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext_Version_version(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"Version\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Directive_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Directive_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Directive_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Directive\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Directive_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Directive_description,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Description(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Directive_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Directive\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Directive_isRepeatable(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Directive_isRepeatable,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.IsRepeatable, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Directive_isRepeatable(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Directive\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Directive_locations,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Locations, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalN__DirectiveLocation2ᚕstringᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Directive_locations(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Directive\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type __DirectiveLocation does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Directive_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Directive_args,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Args, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Directive_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Directive\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___InputValue_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___InputValue_description(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext___InputValue_type(ctx, field)\n\t\t\tcase \"defaultValue\":\n\t\t\t\treturn ec.fieldContext___InputValue_defaultValue(ctx, field)\n\t\t\tcase \"isDeprecated\":\n\t\t\t\treturn ec.fieldContext___InputValue_isDeprecated(ctx, field)\n\t\t\tcase \"deprecationReason\":\n\t\t\t\treturn ec.fieldContext___InputValue_deprecationReason(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __InputValue\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field___Directive_args_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___EnumValue_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___EnumValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__EnumValue\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___EnumValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___EnumValue_description,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Description(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___EnumValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__EnumValue\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___EnumValue_isDeprecated,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.IsDeprecated(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___EnumValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__EnumValue\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___EnumValue_deprecationReason,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.DeprecationReason(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___EnumValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__EnumValue\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Field_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Field_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Field_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Field\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Field_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Field_description,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Description(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Field_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Field\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Field_args,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Args, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Field_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Field\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___InputValue_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___InputValue_description(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext___InputValue_type(ctx, field)\n\t\t\tcase \"defaultValue\":\n\t\t\t\treturn ec.fieldContext___InputValue_defaultValue(ctx, field)\n\t\t\tcase \"isDeprecated\":\n\t\t\t\treturn ec.fieldContext___InputValue_isDeprecated(ctx, field)\n\t\t\tcase \"deprecationReason\":\n\t\t\t\treturn ec.fieldContext___InputValue_deprecationReason(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __InputValue\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field___Field_args_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Field_type(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Field_type,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Type, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Field_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Field\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"kind\":\n\t\t\t\treturn ec.fieldContext___Type_kind(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___Type_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___Type_description(ctx, field)\n\t\t\tcase \"specifiedByURL\":\n\t\t\t\treturn ec.fieldContext___Type_specifiedByURL(ctx, field)\n\t\t\tcase \"fields\":\n\t\t\t\treturn ec.fieldContext___Type_fields(ctx, field)\n\t\t\tcase \"interfaces\":\n\t\t\t\treturn ec.fieldContext___Type_interfaces(ctx, field)\n\t\t\tcase \"possibleTypes\":\n\t\t\t\treturn ec.fieldContext___Type_possibleTypes(ctx, field)\n\t\t\tcase \"enumValues\":\n\t\t\t\treturn ec.fieldContext___Type_enumValues(ctx, field)\n\t\t\tcase \"inputFields\":\n\t\t\t\treturn ec.fieldContext___Type_inputFields(ctx, field)\n\t\t\tcase \"ofType\":\n\t\t\t\treturn ec.fieldContext___Type_ofType(ctx, field)\n\t\t\tcase \"isOneOf\":\n\t\t\t\treturn ec.fieldContext___Type_isOneOf(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __Type\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Field_isDeprecated,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.IsDeprecated(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Field_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Field\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Field_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Field_deprecationReason,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.DeprecationReason(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Field_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Field\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___InputValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___InputValue_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNString2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___InputValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__InputValue\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___InputValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___InputValue_description,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Description(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___InputValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__InputValue\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___InputValue_type,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Type, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___InputValue_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__InputValue\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"kind\":\n\t\t\t\treturn ec.fieldContext___Type_kind(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___Type_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___Type_description(ctx, field)\n\t\t\tcase \"specifiedByURL\":\n\t\t\t\treturn ec.fieldContext___Type_specifiedByURL(ctx, field)\n\t\t\tcase \"fields\":\n\t\t\t\treturn ec.fieldContext___Type_fields(ctx, field)\n\t\t\tcase \"interfaces\":\n\t\t\t\treturn ec.fieldContext___Type_interfaces(ctx, field)\n\t\t\tcase \"possibleTypes\":\n\t\t\t\treturn ec.fieldContext___Type_possibleTypes(ctx, field)\n\t\t\tcase \"enumValues\":\n\t\t\t\treturn ec.fieldContext___Type_enumValues(ctx, field)\n\t\t\tcase \"inputFields\":\n\t\t\t\treturn ec.fieldContext___Type_inputFields(ctx, field)\n\t\t\tcase \"ofType\":\n\t\t\t\treturn ec.fieldContext___Type_ofType(ctx, field)\n\t\t\tcase \"isOneOf\":\n\t\t\t\treturn ec.fieldContext___Type_isOneOf(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __Type\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___InputValue_defaultValue,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.DefaultValue, nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___InputValue_defaultValue(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__InputValue\",\n\t\tField:      field,\n\t\tIsMethod:   false,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___InputValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___InputValue_isDeprecated,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.IsDeprecated(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalNBoolean2bool,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___InputValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__InputValue\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___InputValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___InputValue_deprecationReason,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.DeprecationReason(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___InputValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__InputValue\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Schema_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Schema_description,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Description(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Schema_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Schema\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Schema_types,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Types(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Schema_types(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Schema\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"kind\":\n\t\t\t\treturn ec.fieldContext___Type_kind(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___Type_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___Type_description(ctx, field)\n\t\t\tcase \"specifiedByURL\":\n\t\t\t\treturn ec.fieldContext___Type_specifiedByURL(ctx, field)\n\t\t\tcase \"fields\":\n\t\t\t\treturn ec.fieldContext___Type_fields(ctx, field)\n\t\t\tcase \"interfaces\":\n\t\t\t\treturn ec.fieldContext___Type_interfaces(ctx, field)\n\t\t\tcase \"possibleTypes\":\n\t\t\t\treturn ec.fieldContext___Type_possibleTypes(ctx, field)\n\t\t\tcase \"enumValues\":\n\t\t\t\treturn ec.fieldContext___Type_enumValues(ctx, field)\n\t\t\tcase \"inputFields\":\n\t\t\t\treturn ec.fieldContext___Type_inputFields(ctx, field)\n\t\t\tcase \"ofType\":\n\t\t\t\treturn ec.fieldContext___Type_ofType(ctx, field)\n\t\t\tcase \"isOneOf\":\n\t\t\t\treturn ec.fieldContext___Type_isOneOf(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __Type\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Schema_queryType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Schema_queryType,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.QueryType(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Schema_queryType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Schema\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"kind\":\n\t\t\t\treturn ec.fieldContext___Type_kind(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___Type_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___Type_description(ctx, field)\n\t\t\tcase \"specifiedByURL\":\n\t\t\t\treturn ec.fieldContext___Type_specifiedByURL(ctx, field)\n\t\t\tcase \"fields\":\n\t\t\t\treturn ec.fieldContext___Type_fields(ctx, field)\n\t\t\tcase \"interfaces\":\n\t\t\t\treturn ec.fieldContext___Type_interfaces(ctx, field)\n\t\t\tcase \"possibleTypes\":\n\t\t\t\treturn ec.fieldContext___Type_possibleTypes(ctx, field)\n\t\t\tcase \"enumValues\":\n\t\t\t\treturn ec.fieldContext___Type_enumValues(ctx, field)\n\t\t\tcase \"inputFields\":\n\t\t\t\treturn ec.fieldContext___Type_inputFields(ctx, field)\n\t\t\tcase \"ofType\":\n\t\t\t\treturn ec.fieldContext___Type_ofType(ctx, field)\n\t\t\tcase \"isOneOf\":\n\t\t\t\treturn ec.fieldContext___Type_isOneOf(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __Type\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Schema_mutationType,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.MutationType(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Schema_mutationType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Schema\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"kind\":\n\t\t\t\treturn ec.fieldContext___Type_kind(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___Type_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___Type_description(ctx, field)\n\t\t\tcase \"specifiedByURL\":\n\t\t\t\treturn ec.fieldContext___Type_specifiedByURL(ctx, field)\n\t\t\tcase \"fields\":\n\t\t\t\treturn ec.fieldContext___Type_fields(ctx, field)\n\t\t\tcase \"interfaces\":\n\t\t\t\treturn ec.fieldContext___Type_interfaces(ctx, field)\n\t\t\tcase \"possibleTypes\":\n\t\t\t\treturn ec.fieldContext___Type_possibleTypes(ctx, field)\n\t\t\tcase \"enumValues\":\n\t\t\t\treturn ec.fieldContext___Type_enumValues(ctx, field)\n\t\t\tcase \"inputFields\":\n\t\t\t\treturn ec.fieldContext___Type_inputFields(ctx, field)\n\t\t\tcase \"ofType\":\n\t\t\t\treturn ec.fieldContext___Type_ofType(ctx, field)\n\t\t\tcase \"isOneOf\":\n\t\t\t\treturn ec.fieldContext___Type_isOneOf(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __Type\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Schema_subscriptionType,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.SubscriptionType(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Schema_subscriptionType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Schema\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"kind\":\n\t\t\t\treturn ec.fieldContext___Type_kind(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___Type_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___Type_description(ctx, field)\n\t\t\tcase \"specifiedByURL\":\n\t\t\t\treturn ec.fieldContext___Type_specifiedByURL(ctx, field)\n\t\t\tcase \"fields\":\n\t\t\t\treturn ec.fieldContext___Type_fields(ctx, field)\n\t\t\tcase \"interfaces\":\n\t\t\t\treturn ec.fieldContext___Type_interfaces(ctx, field)\n\t\t\tcase \"possibleTypes\":\n\t\t\t\treturn ec.fieldContext___Type_possibleTypes(ctx, field)\n\t\t\tcase \"enumValues\":\n\t\t\t\treturn ec.fieldContext___Type_enumValues(ctx, field)\n\t\t\tcase \"inputFields\":\n\t\t\t\treturn ec.fieldContext___Type_inputFields(ctx, field)\n\t\t\tcase \"ofType\":\n\t\t\t\treturn ec.fieldContext___Type_ofType(ctx, field)\n\t\t\tcase \"isOneOf\":\n\t\t\t\treturn ec.fieldContext___Type_isOneOf(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __Type\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Schema_directives(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Schema_directives,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Directives(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Schema_directives(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Schema\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___Directive_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___Directive_description(ctx, field)\n\t\t\tcase \"isRepeatable\":\n\t\t\t\treturn ec.fieldContext___Directive_isRepeatable(ctx, field)\n\t\t\tcase \"locations\":\n\t\t\t\treturn ec.fieldContext___Directive_locations(ctx, field)\n\t\t\tcase \"args\":\n\t\t\t\treturn ec.fieldContext___Directive_args(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __Directive\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Type_kind,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Kind(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalN__TypeKind2string,\n\t\ttrue,\n\t\ttrue,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Type_kind(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Type\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type __TypeKind does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Type_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Type_name,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Name(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Type_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Type\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Type_description,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Description(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Type_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Type\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Type_specifiedByURL(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Type_specifiedByURL,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.SpecifiedByURL(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOString2ᚖstring,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Type_specifiedByURL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Type\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type String does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Type_fields,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn obj.Fields(fc.Args[\"includeDeprecated\"].(bool)), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Type_fields(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Type\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___Field_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___Field_description(ctx, field)\n\t\t\tcase \"args\":\n\t\t\t\treturn ec.fieldContext___Field_args(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext___Field_type(ctx, field)\n\t\t\tcase \"isDeprecated\":\n\t\t\t\treturn ec.fieldContext___Field_isDeprecated(ctx, field)\n\t\t\tcase \"deprecationReason\":\n\t\t\t\treturn ec.fieldContext___Field_deprecationReason(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __Field\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field___Type_fields_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Type_interfaces,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.Interfaces(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Type_interfaces(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Type\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"kind\":\n\t\t\t\treturn ec.fieldContext___Type_kind(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___Type_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___Type_description(ctx, field)\n\t\t\tcase \"specifiedByURL\":\n\t\t\t\treturn ec.fieldContext___Type_specifiedByURL(ctx, field)\n\t\t\tcase \"fields\":\n\t\t\t\treturn ec.fieldContext___Type_fields(ctx, field)\n\t\t\tcase \"interfaces\":\n\t\t\t\treturn ec.fieldContext___Type_interfaces(ctx, field)\n\t\t\tcase \"possibleTypes\":\n\t\t\t\treturn ec.fieldContext___Type_possibleTypes(ctx, field)\n\t\t\tcase \"enumValues\":\n\t\t\t\treturn ec.fieldContext___Type_enumValues(ctx, field)\n\t\t\tcase \"inputFields\":\n\t\t\t\treturn ec.fieldContext___Type_inputFields(ctx, field)\n\t\t\tcase \"ofType\":\n\t\t\t\treturn ec.fieldContext___Type_ofType(ctx, field)\n\t\t\tcase \"isOneOf\":\n\t\t\t\treturn ec.fieldContext___Type_isOneOf(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __Type\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Type_possibleTypes,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.PossibleTypes(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Type_possibleTypes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Type\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"kind\":\n\t\t\t\treturn ec.fieldContext___Type_kind(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___Type_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___Type_description(ctx, field)\n\t\t\tcase \"specifiedByURL\":\n\t\t\t\treturn ec.fieldContext___Type_specifiedByURL(ctx, field)\n\t\t\tcase \"fields\":\n\t\t\t\treturn ec.fieldContext___Type_fields(ctx, field)\n\t\t\tcase \"interfaces\":\n\t\t\t\treturn ec.fieldContext___Type_interfaces(ctx, field)\n\t\t\tcase \"possibleTypes\":\n\t\t\t\treturn ec.fieldContext___Type_possibleTypes(ctx, field)\n\t\t\tcase \"enumValues\":\n\t\t\t\treturn ec.fieldContext___Type_enumValues(ctx, field)\n\t\t\tcase \"inputFields\":\n\t\t\t\treturn ec.fieldContext___Type_inputFields(ctx, field)\n\t\t\tcase \"ofType\":\n\t\t\t\treturn ec.fieldContext___Type_ofType(ctx, field)\n\t\t\tcase \"isOneOf\":\n\t\t\t\treturn ec.fieldContext___Type_isOneOf(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __Type\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Type_enumValues,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\tfc := graphql.GetFieldContext(ctx)\n\t\t\treturn obj.EnumValues(fc.Args[\"includeDeprecated\"].(bool)), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Type_enumValues(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Type\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___EnumValue_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___EnumValue_description(ctx, field)\n\t\t\tcase \"isDeprecated\":\n\t\t\t\treturn ec.fieldContext___EnumValue_isDeprecated(ctx, field)\n\t\t\tcase \"deprecationReason\":\n\t\t\t\treturn ec.fieldContext___EnumValue_deprecationReason(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __EnumValue\", field.Name)\n\t\t},\n\t}\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = ec.Recover(ctx, r)\n\t\t\tec.Error(ctx, err)\n\t\t}\n\t}()\n\tctx = graphql.WithFieldContext(ctx, fc)\n\tif fc.Args, err = ec.field___Type_enumValues_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn fc, err\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Type_inputFields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Type_inputFields,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.InputFields(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Type_inputFields(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Type\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___InputValue_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___InputValue_description(ctx, field)\n\t\t\tcase \"type\":\n\t\t\t\treturn ec.fieldContext___InputValue_type(ctx, field)\n\t\t\tcase \"defaultValue\":\n\t\t\t\treturn ec.fieldContext___InputValue_defaultValue(ctx, field)\n\t\t\tcase \"isDeprecated\":\n\t\t\t\treturn ec.fieldContext___InputValue_isDeprecated(ctx, field)\n\t\t\tcase \"deprecationReason\":\n\t\t\t\treturn ec.fieldContext___InputValue_deprecationReason(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __InputValue\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Type_ofType,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.OfType(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Type_ofType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Type\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\tswitch field.Name {\n\t\t\tcase \"kind\":\n\t\t\t\treturn ec.fieldContext___Type_kind(ctx, field)\n\t\t\tcase \"name\":\n\t\t\t\treturn ec.fieldContext___Type_name(ctx, field)\n\t\t\tcase \"description\":\n\t\t\t\treturn ec.fieldContext___Type_description(ctx, field)\n\t\t\tcase \"specifiedByURL\":\n\t\t\t\treturn ec.fieldContext___Type_specifiedByURL(ctx, field)\n\t\t\tcase \"fields\":\n\t\t\t\treturn ec.fieldContext___Type_fields(ctx, field)\n\t\t\tcase \"interfaces\":\n\t\t\t\treturn ec.fieldContext___Type_interfaces(ctx, field)\n\t\t\tcase \"possibleTypes\":\n\t\t\t\treturn ec.fieldContext___Type_possibleTypes(ctx, field)\n\t\t\tcase \"enumValues\":\n\t\t\t\treturn ec.fieldContext___Type_enumValues(ctx, field)\n\t\t\tcase \"inputFields\":\n\t\t\t\treturn ec.fieldContext___Type_inputFields(ctx, field)\n\t\t\tcase \"ofType\":\n\t\t\t\treturn ec.fieldContext___Type_ofType(ctx, field)\n\t\t\tcase \"isOneOf\":\n\t\t\t\treturn ec.fieldContext___Type_isOneOf(ctx, field)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"no field named %q was found under type __Type\", field.Name)\n\t\t},\n\t}\n\treturn fc, nil\n}\n\nfunc (ec *executionContext) ___Type_isOneOf(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {\n\treturn graphql.ResolveField(\n\t\tctx,\n\t\tec.OperationContext,\n\t\tfield,\n\t\tec.fieldContext___Type_isOneOf,\n\t\tfunc(ctx context.Context) (any, error) {\n\t\t\treturn obj.IsOneOf(), nil\n\t\t},\n\t\tnil,\n\t\tec.marshalOBoolean2bool,\n\t\ttrue,\n\t\tfalse,\n\t)\n}\n\nfunc (ec *executionContext) fieldContext___Type_isOneOf(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {\n\tfc = &graphql.FieldContext{\n\t\tObject:     \"__Type\",\n\t\tField:      field,\n\t\tIsMethod:   true,\n\t\tIsResolver: false,\n\t\tChild: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {\n\t\t\treturn nil, errors.New(\"field of type Boolean does not have child fields\")\n\t\t},\n\t}\n\treturn fc, nil\n}\n\n// endregion **************************** field.gotpl *****************************\n\n// region    **************************** input.gotpl *****************************\n\nfunc (ec *executionContext) unmarshalInputActivateNewUserInput(ctx context.Context, obj any) (ActivateNewUserInput, error) {\n\tvar it ActivateNewUserInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"activation_key\", \"password\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"activation_key\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"activation_key\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ActivationKey = data\n\t\tcase \"password\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"password\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Password = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputAmendEditInput(ctx context.Context, obj any) (AmendEditInput, error) {\n\tvar it AmendEditInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"reason\", \"remove_fields\", \"remove_added_items\", \"remove_removed_items\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"reason\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"reason\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Reason = data\n\t\tcase \"remove_fields\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"remove_fields\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.RemoveFields = data\n\t\tcase \"remove_added_items\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"remove_added_items\"))\n\t\t\tdata, err := ec.unmarshalOAmendItemRemoval2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐAmendItemRemovalᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.RemoveAddedItems = data\n\t\tcase \"remove_removed_items\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"remove_removed_items\"))\n\t\t\tdata, err := ec.unmarshalOAmendItemRemoval2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐAmendItemRemovalᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.RemoveRemovedItems = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputAmendItemRemoval(ctx context.Context, obj any) (AmendItemRemoval, error) {\n\tvar it AmendItemRemoval\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"field\", \"indices\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"field\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"field\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Field = data\n\t\tcase \"indices\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"indices\"))\n\t\t\tdata, err := ec.unmarshalNInt2ᚕintᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Indices = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputApplyEditInput(ctx context.Context, obj any) (ApplyEditInput, error) {\n\tvar it ApplyEditInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputBodyModificationCriterionInput(ctx context.Context, obj any) (BodyModificationCriterionInput, error) {\n\tvar it BodyModificationCriterionInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"location\", \"description\", \"modifier\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"location\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"location\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Location = data\n\t\tcase \"description\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"description\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Description = data\n\t\tcase \"modifier\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"modifier\"))\n\t\t\tdata, err := ec.unmarshalNCriterionModifier2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCriterionModifier(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Modifier = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputBodyModificationInput(ctx context.Context, obj any) (BodyModificationInput, error) {\n\tvar it BodyModificationInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"location\", \"description\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"location\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"location\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Location = data\n\t\tcase \"description\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"description\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Description = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputBreastTypeCriterionInput(ctx context.Context, obj any) (BreastTypeCriterionInput, error) {\n\tvar it BreastTypeCriterionInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"value\", \"modifier\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"value\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"value\"))\n\t\t\tdata, err := ec.unmarshalOBreastTypeEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBreastTypeEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Value = data\n\t\tcase \"modifier\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"modifier\"))\n\t\t\tdata, err := ec.unmarshalNCriterionModifier2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCriterionModifier(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Modifier = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputCancelEditInput(ctx context.Context, obj any) (CancelEditInput, error) {\n\tvar it CancelEditInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputDateCriterionInput(ctx context.Context, obj any) (DateCriterionInput, error) {\n\tvar it DateCriterionInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"value\", \"modifier\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"value\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"value\"))\n\t\t\tdata, err := ec.unmarshalNDate2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Value = data\n\t\tcase \"modifier\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"modifier\"))\n\t\t\tdata, err := ec.unmarshalNCriterionModifier2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCriterionModifier(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Modifier = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputDeleteEditInput(ctx context.Context, obj any) (DeleteEditInput, error) {\n\tvar it DeleteEditInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"reason\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"reason\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"reason\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Reason = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputDeleteFingerprintSubmissionsInput(ctx context.Context, obj any) (DeleteFingerprintSubmissionsInput, error) {\n\tvar it DeleteFingerprintSubmissionsInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"fingerprints\", \"scene_id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"fingerprints\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"fingerprints\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintQueryInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintQueryInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Fingerprints = data\n\t\tcase \"scene_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"scene_id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.SceneID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputDraftEntityInput(ctx context.Context, obj any) (DraftEntityInput, error) {\n\tvar it DraftEntityInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputEditCommentInput(ctx context.Context, obj any) (EditCommentInput, error) {\n\tvar it EditCommentInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"comment\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"comment\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"comment\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Comment = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputEditInput(ctx context.Context, obj any) (EditInput, error) {\n\tvar it EditInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"operation\", \"merge_source_ids\", \"comment\", \"bot\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"operation\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"operation\"))\n\t\t\tdata, err := ec.unmarshalNOperationEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐOperationEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Operation = data\n\t\tcase \"merge_source_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"merge_source_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.MergeSourceIds = data\n\t\tcase \"comment\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"comment\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Comment = data\n\t\tcase \"bot\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"bot\"))\n\t\t\tdata, err := ec.unmarshalOBoolean2ᚖbool(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Bot = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputEditQueryInput(ctx context.Context, obj any) (EditQueryInput, error) {\n\tvar it EditQueryInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tif _, present := asMap[\"page\"]; !present {\n\t\tasMap[\"page\"] = 1\n\t}\n\tif _, present := asMap[\"per_page\"]; !present {\n\t\tasMap[\"per_page\"] = 25\n\t}\n\tif _, present := asMap[\"direction\"]; !present {\n\t\tasMap[\"direction\"] = \"DESC\"\n\t}\n\tif _, present := asMap[\"sort\"]; !present {\n\t\tasMap[\"sort\"] = \"CREATED_AT\"\n\t}\n\n\tfieldsInOrder := [...]string{\"user_id\", \"status\", \"operation\", \"vote_count\", \"applied\", \"target_type\", \"target_id\", \"is_favorite\", \"voted\", \"is_bot\", \"include_user_submitted\", \"page\", \"per_page\", \"direction\", \"sort\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"user_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"user_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.UserID = data\n\t\tcase \"status\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"status\"))\n\t\t\tdata, err := ec.unmarshalOVoteStatusEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐVoteStatusEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Status = data\n\t\tcase \"operation\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"operation\"))\n\t\t\tdata, err := ec.unmarshalOOperationEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐOperationEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Operation = data\n\t\tcase \"vote_count\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"vote_count\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.VoteCount = data\n\t\tcase \"applied\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"applied\"))\n\t\t\tdata, err := ec.unmarshalOBoolean2ᚖbool(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Applied = data\n\t\tcase \"target_type\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"target_type\"))\n\t\t\tdata, err := ec.unmarshalOTargetTypeEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTargetTypeEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.TargetType = data\n\t\tcase \"target_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"target_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.TargetID = data\n\t\tcase \"is_favorite\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"is_favorite\"))\n\t\t\tdata, err := ec.unmarshalOBoolean2ᚖbool(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.IsFavorite = data\n\t\tcase \"voted\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"voted\"))\n\t\t\tdata, err := ec.unmarshalOUserVotedFilterEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserVotedFilterEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Voted = data\n\t\tcase \"is_bot\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"is_bot\"))\n\t\t\tdata, err := ec.unmarshalOBoolean2ᚖbool(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.IsBot = data\n\t\tcase \"include_user_submitted\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"include_user_submitted\"))\n\t\t\tdata, err := ec.unmarshalOBoolean2ᚖbool(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.IncludeUserSubmitted = data\n\t\tcase \"page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Page = data\n\t\tcase \"per_page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"per_page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.PerPage = data\n\t\tcase \"direction\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"direction\"))\n\t\t\tdata, err := ec.unmarshalNSortDirectionEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSortDirectionEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Direction = data\n\t\tcase \"sort\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"sort\"))\n\t\t\tdata, err := ec.unmarshalNEditSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditSortEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Sort = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputEditVoteInput(ctx context.Context, obj any) (EditVoteInput, error) {\n\tvar it EditVoteInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"vote\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"vote\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"vote\"))\n\t\t\tdata, err := ec.unmarshalNVoteTypeEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐVoteTypeEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Vote = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputEyeColorCriterionInput(ctx context.Context, obj any) (EyeColorCriterionInput, error) {\n\tvar it EyeColorCriterionInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"value\", \"modifier\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"value\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"value\"))\n\t\t\tdata, err := ec.unmarshalOEyeColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEyeColorEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Value = data\n\t\tcase \"modifier\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"modifier\"))\n\t\t\tdata, err := ec.unmarshalNCriterionModifier2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCriterionModifier(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Modifier = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputFingerprintBatchSubmission(ctx context.Context, obj any) (FingerprintBatchSubmission, error) {\n\tvar it FingerprintBatchSubmission\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"scene_id\", \"hash\", \"algorithm\", \"duration\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"scene_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"scene_id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.SceneID = data\n\t\tcase \"hash\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"hash\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintHash2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintHash(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Hash = data\n\t\tcase \"algorithm\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"algorithm\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintAlgorithm2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintAlgorithm(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Algorithm = data\n\t\tcase \"duration\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"duration\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Duration = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputFingerprintEditInput(ctx context.Context, obj any) (FingerprintEditInput, error) {\n\tvar it FingerprintEditInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"user_ids\", \"hash\", \"algorithm\", \"duration\", \"created\", \"submissions\", \"updated\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"user_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"user_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.UserIds = data\n\t\tcase \"hash\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"hash\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintHash2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintHash(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Hash = data\n\t\tcase \"algorithm\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"algorithm\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintAlgorithm2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintAlgorithm(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Algorithm = data\n\t\tcase \"duration\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"duration\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Duration = data\n\t\tcase \"created\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"created\"))\n\t\t\tdata, err := ec.unmarshalNTime2timeᚐTime(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Created = data\n\t\tcase \"submissions\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"submissions\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Submissions = data\n\t\tcase \"updated\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"updated\"))\n\t\t\tdata, err := ec.unmarshalOTime2ᚖtimeᚐTime(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Updated = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputFingerprintInput(ctx context.Context, obj any) (FingerprintInput, error) {\n\tvar it FingerprintInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"user_ids\", \"hash\", \"algorithm\", \"duration\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"user_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"user_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.UserIds = data\n\t\tcase \"hash\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"hash\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintHash2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintHash(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Hash = data\n\t\tcase \"algorithm\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"algorithm\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintAlgorithm2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintAlgorithm(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Algorithm = data\n\t\tcase \"duration\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"duration\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Duration = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputFingerprintQueryInput(ctx context.Context, obj any) (FingerprintQueryInput, error) {\n\tvar it FingerprintQueryInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"hash\", \"algorithm\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"hash\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"hash\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintHash2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintHash(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Hash = data\n\t\tcase \"algorithm\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"algorithm\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintAlgorithm2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintAlgorithm(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Algorithm = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputFingerprintSubmission(ctx context.Context, obj any) (FingerprintSubmission, error) {\n\tvar it FingerprintSubmission\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tif _, present := asMap[\"vote\"]; !present {\n\t\tasMap[\"vote\"] = \"VALID\"\n\t}\n\n\tfieldsInOrder := [...]string{\"scene_id\", \"fingerprint\", \"unmatch\", \"vote\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"scene_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"scene_id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.SceneID = data\n\t\tcase \"fingerprint\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"fingerprint\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Fingerprint = data\n\t\tcase \"unmatch\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"unmatch\"))\n\t\t\tdata, err := ec.unmarshalOBoolean2ᚖbool(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Unmatch = data\n\t\tcase \"vote\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"vote\"))\n\t\t\tdata, err := ec.unmarshalOFingerprintSubmissionType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintSubmissionType(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Vote = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputGenerateInviteCodeInput(ctx context.Context, obj any) (GenerateInviteCodeInput, error) {\n\tvar it GenerateInviteCodeInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"keys\", \"uses\", \"ttl\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"keys\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"keys\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Keys = data\n\t\tcase \"uses\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"uses\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Uses = data\n\t\tcase \"ttl\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"ttl\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.TTL = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputGrantInviteInput(ctx context.Context, obj any) (GrantInviteInput, error) {\n\tvar it GrantInviteInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"user_id\", \"amount\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"user_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"user_id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.UserID = data\n\t\tcase \"amount\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"amount\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Amount = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputHairColorCriterionInput(ctx context.Context, obj any) (HairColorCriterionInput, error) {\n\tvar it HairColorCriterionInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"value\", \"modifier\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"value\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"value\"))\n\t\t\tdata, err := ec.unmarshalOHairColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐHairColorEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Value = data\n\t\tcase \"modifier\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"modifier\"))\n\t\t\tdata, err := ec.unmarshalNCriterionModifier2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCriterionModifier(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Modifier = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputIDCriterionInput(ctx context.Context, obj any) (IDCriterionInput, error) {\n\tvar it IDCriterionInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"value\", \"modifier\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"value\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"value\"))\n\t\t\tdata, err := ec.unmarshalNID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Value = data\n\t\tcase \"modifier\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"modifier\"))\n\t\t\tdata, err := ec.unmarshalNCriterionModifier2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCriterionModifier(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Modifier = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputImageCreateInput(ctx context.Context, obj any) (ImageCreateInput, error) {\n\tvar it ImageCreateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"url\", \"file\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"url\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"url\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.URL = data\n\t\tcase \"file\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"file\"))\n\t\t\tdata, err := ec.unmarshalOUpload2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚐUpload(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.File = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputImageDestroyInput(ctx context.Context, obj any) (ImageDestroyInput, error) {\n\tvar it ImageDestroyInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputImageUpdateInput(ctx context.Context, obj any) (ImageUpdateInput, error) {\n\tvar it ImageUpdateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"url\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"url\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"url\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.URL = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputIntCriterionInput(ctx context.Context, obj any) (IntCriterionInput, error) {\n\tvar it IntCriterionInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"value\", \"modifier\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"value\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"value\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Value = data\n\t\tcase \"modifier\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"modifier\"))\n\t\t\tdata, err := ec.unmarshalNCriterionModifier2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCriterionModifier(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Modifier = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputMarkNotificationReadInput(ctx context.Context, obj any) (MarkNotificationReadInput, error) {\n\tvar it MarkNotificationReadInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"type\", \"id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"type\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"type\"))\n\t\t\tdata, err := ec.unmarshalNNotificationEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Type = data\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputModAuditQueryInput(ctx context.Context, obj any) (ModAuditQueryInput, error) {\n\tvar it ModAuditQueryInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tif _, present := asMap[\"page\"]; !present {\n\t\tasMap[\"page\"] = 1\n\t}\n\tif _, present := asMap[\"per_page\"]; !present {\n\t\tasMap[\"per_page\"] = 25\n\t}\n\n\tfieldsInOrder := [...]string{\"page\", \"per_page\", \"action\", \"user_id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Page = data\n\t\tcase \"per_page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"per_page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.PerPage = data\n\t\tcase \"action\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"action\"))\n\t\t\tdata, err := ec.unmarshalOModAuditActionEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAuditActionEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Action = data\n\t\tcase \"user_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"user_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.UserID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputMoveFingerprintSubmissionsInput(ctx context.Context, obj any) (MoveFingerprintSubmissionsInput, error) {\n\tvar it MoveFingerprintSubmissionsInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"fingerprints\", \"source_scene_id\", \"target_scene_id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"fingerprints\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"fingerprints\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintQueryInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintQueryInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Fingerprints = data\n\t\tcase \"source_scene_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"source_scene_id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.SourceSceneID = data\n\t\tcase \"target_scene_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"target_scene_id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.TargetSceneID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputMultiIDCriterionInput(ctx context.Context, obj any) (MultiIDCriterionInput, error) {\n\tvar it MultiIDCriterionInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"value\", \"modifier\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"value\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"value\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Value = data\n\t\tcase \"modifier\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"modifier\"))\n\t\t\tdata, err := ec.unmarshalNCriterionModifier2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCriterionModifier(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Modifier = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputMultiStringCriterionInput(ctx context.Context, obj any) (MultiStringCriterionInput, error) {\n\tvar it MultiStringCriterionInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"value\", \"modifier\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"value\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"value\"))\n\t\t\tdata, err := ec.unmarshalNString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Value = data\n\t\tcase \"modifier\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"modifier\"))\n\t\t\tdata, err := ec.unmarshalNCriterionModifier2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCriterionModifier(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Modifier = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputNewUserInput(ctx context.Context, obj any) (NewUserInput, error) {\n\tvar it NewUserInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"email\", \"invite_key\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"email\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"email\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Email = data\n\t\tcase \"invite_key\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"invite_key\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.InviteKey = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputPerformerAppearanceInput(ctx context.Context, obj any) (PerformerAppearanceInput, error) {\n\tvar it PerformerAppearanceInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"performer_id\", \"as\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"performer_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"performer_id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.PerformerID = data\n\t\tcase \"as\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"as\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.As = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputPerformerCreateInput(ctx context.Context, obj any) (PerformerCreateInput, error) {\n\tvar it PerformerCreateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"disambiguation\", \"aliases\", \"gender\", \"urls\", \"birthdate\", \"deathdate\", \"ethnicity\", \"country\", \"eye_color\", \"hair_color\", \"height\", \"cup_size\", \"band_size\", \"waist_size\", \"hip_size\", \"breast_type\", \"career_start_year\", \"career_end_year\", \"tattoos\", \"piercings\", \"image_ids\", \"draft_id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"disambiguation\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"disambiguation\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Disambiguation = data\n\t\tcase \"aliases\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"aliases\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Aliases = data\n\t\tcase \"gender\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"gender\"))\n\t\t\tdata, err := ec.unmarshalOGenderEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Gender = data\n\t\tcase \"urls\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"urls\"))\n\t\t\tdata, err := ec.unmarshalOURLInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Urls = data\n\t\tcase \"birthdate\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"birthdate\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Birthdate = data\n\t\tcase \"deathdate\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"deathdate\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Deathdate = data\n\t\tcase \"ethnicity\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"ethnicity\"))\n\t\t\tdata, err := ec.unmarshalOEthnicityEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEthnicityEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Ethnicity = data\n\t\tcase \"country\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"country\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Country = data\n\t\tcase \"eye_color\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"eye_color\"))\n\t\t\tdata, err := ec.unmarshalOEyeColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEyeColorEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.EyeColor = data\n\t\tcase \"hair_color\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"hair_color\"))\n\t\t\tdata, err := ec.unmarshalOHairColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐHairColorEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.HairColor = data\n\t\tcase \"height\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"height\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Height = data\n\t\tcase \"cup_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"cup_size\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CupSize = data\n\t\tcase \"band_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"band_size\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.BandSize = data\n\t\tcase \"waist_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"waist_size\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.WaistSize = data\n\t\tcase \"hip_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"hip_size\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.HipSize = data\n\t\tcase \"breast_type\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"breast_type\"))\n\t\t\tdata, err := ec.unmarshalOBreastTypeEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBreastTypeEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.BreastType = data\n\t\tcase \"career_start_year\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"career_start_year\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CareerStartYear = data\n\t\tcase \"career_end_year\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"career_end_year\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CareerEndYear = data\n\t\tcase \"tattoos\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"tattoos\"))\n\t\t\tdata, err := ec.unmarshalOBodyModificationInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Tattoos = data\n\t\tcase \"piercings\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"piercings\"))\n\t\t\tdata, err := ec.unmarshalOBodyModificationInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Piercings = data\n\t\tcase \"image_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"image_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ImageIds = data\n\t\tcase \"draft_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"draft_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.DraftID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputPerformerDestroyInput(ctx context.Context, obj any) (PerformerDestroyInput, error) {\n\tvar it PerformerDestroyInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputPerformerDraftInput(ctx context.Context, obj any) (PerformerDraftInput, error) {\n\tvar it PerformerDraftInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"disambiguation\", \"name\", \"aliases\", \"gender\", \"birthdate\", \"deathdate\", \"urls\", \"ethnicity\", \"country\", \"eye_color\", \"hair_color\", \"height\", \"measurements\", \"breast_type\", \"tattoos\", \"piercings\", \"career_start_year\", \"career_end_year\", \"image\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"disambiguation\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"disambiguation\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Disambiguation = data\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"aliases\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"aliases\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Aliases = data\n\t\tcase \"gender\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"gender\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Gender = data\n\t\tcase \"birthdate\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"birthdate\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Birthdate = data\n\t\tcase \"deathdate\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"deathdate\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Deathdate = data\n\t\tcase \"urls\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"urls\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Urls = data\n\t\tcase \"ethnicity\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"ethnicity\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Ethnicity = data\n\t\tcase \"country\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"country\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Country = data\n\t\tcase \"eye_color\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"eye_color\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.EyeColor = data\n\t\tcase \"hair_color\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"hair_color\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.HairColor = data\n\t\tcase \"height\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"height\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Height = data\n\t\tcase \"measurements\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"measurements\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Measurements = data\n\t\tcase \"breast_type\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"breast_type\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.BreastType = data\n\t\tcase \"tattoos\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"tattoos\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Tattoos = data\n\t\tcase \"piercings\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"piercings\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Piercings = data\n\t\tcase \"career_start_year\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"career_start_year\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CareerStartYear = data\n\t\tcase \"career_end_year\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"career_end_year\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CareerEndYear = data\n\t\tcase \"image\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"image\"))\n\t\t\tdata, err := ec.unmarshalOUpload2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚐUpload(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Image = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputPerformerEditDetailsInput(ctx context.Context, obj any) (PerformerEditDetailsInput, error) {\n\tvar it PerformerEditDetailsInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"disambiguation\", \"aliases\", \"gender\", \"urls\", \"birthdate\", \"deathdate\", \"ethnicity\", \"country\", \"eye_color\", \"hair_color\", \"height\", \"cup_size\", \"band_size\", \"waist_size\", \"hip_size\", \"breast_type\", \"career_start_year\", \"career_end_year\", \"tattoos\", \"piercings\", \"image_ids\", \"draft_id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"disambiguation\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"disambiguation\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Disambiguation = data\n\t\tcase \"aliases\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"aliases\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Aliases = data\n\t\tcase \"gender\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"gender\"))\n\t\t\tdata, err := ec.unmarshalOGenderEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Gender = data\n\t\tcase \"urls\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"urls\"))\n\t\t\tdata, err := ec.unmarshalOURLInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Urls = data\n\t\tcase \"birthdate\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"birthdate\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Birthdate = data\n\t\tcase \"deathdate\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"deathdate\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Deathdate = data\n\t\tcase \"ethnicity\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"ethnicity\"))\n\t\t\tdata, err := ec.unmarshalOEthnicityEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEthnicityEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Ethnicity = data\n\t\tcase \"country\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"country\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Country = data\n\t\tcase \"eye_color\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"eye_color\"))\n\t\t\tdata, err := ec.unmarshalOEyeColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEyeColorEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.EyeColor = data\n\t\tcase \"hair_color\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"hair_color\"))\n\t\t\tdata, err := ec.unmarshalOHairColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐHairColorEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.HairColor = data\n\t\tcase \"height\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"height\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Height = data\n\t\tcase \"cup_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"cup_size\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CupSize = data\n\t\tcase \"band_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"band_size\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.BandSize = data\n\t\tcase \"waist_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"waist_size\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.WaistSize = data\n\t\tcase \"hip_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"hip_size\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.HipSize = data\n\t\tcase \"breast_type\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"breast_type\"))\n\t\t\tdata, err := ec.unmarshalOBreastTypeEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBreastTypeEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.BreastType = data\n\t\tcase \"career_start_year\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"career_start_year\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CareerStartYear = data\n\t\tcase \"career_end_year\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"career_end_year\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CareerEndYear = data\n\t\tcase \"tattoos\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"tattoos\"))\n\t\t\tdata, err := ec.unmarshalOBodyModificationInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Tattoos = data\n\t\tcase \"piercings\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"piercings\"))\n\t\t\tdata, err := ec.unmarshalOBodyModificationInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Piercings = data\n\t\tcase \"image_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"image_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ImageIds = data\n\t\tcase \"draft_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"draft_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.DraftID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputPerformerEditInput(ctx context.Context, obj any) (PerformerEditInput, error) {\n\tvar it PerformerEditInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"edit\", \"details\", \"options\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"edit\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"edit\"))\n\t\t\tdata, err := ec.unmarshalNEditInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Edit = data\n\t\tcase \"details\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"details\"))\n\t\t\tdata, err := ec.unmarshalOPerformerEditDetailsInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerEditDetailsInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Details = data\n\t\tcase \"options\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"options\"))\n\t\t\tdata, err := ec.unmarshalOPerformerEditOptionsInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerEditOptionsInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Options = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputPerformerEditOptionsInput(ctx context.Context, obj any) (PerformerEditOptionsInput, error) {\n\tvar it PerformerEditOptionsInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tif _, present := asMap[\"set_modify_aliases\"]; !present {\n\t\tasMap[\"set_modify_aliases\"] = false\n\t}\n\tif _, present := asMap[\"set_merge_aliases\"]; !present {\n\t\tasMap[\"set_merge_aliases\"] = true\n\t}\n\n\tfieldsInOrder := [...]string{\"set_modify_aliases\", \"set_merge_aliases\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"set_modify_aliases\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"set_modify_aliases\"))\n\t\t\tdata, err := ec.unmarshalOBoolean2ᚖbool(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.SetModifyAliases = data\n\t\tcase \"set_merge_aliases\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"set_merge_aliases\"))\n\t\t\tdata, err := ec.unmarshalOBoolean2ᚖbool(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.SetMergeAliases = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputPerformerQueryInput(ctx context.Context, obj any) (PerformerQueryInput, error) {\n\tvar it PerformerQueryInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tif _, present := asMap[\"page\"]; !present {\n\t\tasMap[\"page\"] = 1\n\t}\n\tif _, present := asMap[\"per_page\"]; !present {\n\t\tasMap[\"per_page\"] = 25\n\t}\n\tif _, present := asMap[\"direction\"]; !present {\n\t\tasMap[\"direction\"] = \"DESC\"\n\t}\n\tif _, present := asMap[\"sort\"]; !present {\n\t\tasMap[\"sort\"] = \"CREATED_AT\"\n\t}\n\n\tfieldsInOrder := [...]string{\"names\", \"name\", \"alias\", \"disambiguation\", \"gender\", \"url\", \"birthdate\", \"deathdate\", \"birth_year\", \"age\", \"ethnicity\", \"country\", \"eye_color\", \"hair_color\", \"height\", \"cup_size\", \"band_size\", \"waist_size\", \"hip_size\", \"breast_type\", \"career_start_year\", \"career_end_year\", \"tattoos\", \"piercings\", \"is_favorite\", \"performed_with\", \"studio_id\", \"page\", \"per_page\", \"direction\", \"sort\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"names\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"names\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Names = data\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"alias\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"alias\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Alias = data\n\t\tcase \"disambiguation\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"disambiguation\"))\n\t\t\tdata, err := ec.unmarshalOStringCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStringCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Disambiguation = data\n\t\tcase \"gender\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"gender\"))\n\t\t\tdata, err := ec.unmarshalOGenderFilterEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderFilterEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Gender = data\n\t\tcase \"url\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"url\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.URL = data\n\t\tcase \"birthdate\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"birthdate\"))\n\t\t\tdata, err := ec.unmarshalODateCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDateCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Birthdate = data\n\t\tcase \"deathdate\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"deathdate\"))\n\t\t\tdata, err := ec.unmarshalODateCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDateCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Deathdate = data\n\t\tcase \"birth_year\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"birth_year\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.BirthYear = data\n\t\tcase \"age\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"age\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Age = data\n\t\tcase \"ethnicity\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"ethnicity\"))\n\t\t\tdata, err := ec.unmarshalOEthnicityFilterEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEthnicityFilterEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Ethnicity = data\n\t\tcase \"country\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"country\"))\n\t\t\tdata, err := ec.unmarshalOStringCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStringCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Country = data\n\t\tcase \"eye_color\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"eye_color\"))\n\t\t\tdata, err := ec.unmarshalOEyeColorCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEyeColorCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.EyeColor = data\n\t\tcase \"hair_color\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"hair_color\"))\n\t\t\tdata, err := ec.unmarshalOHairColorCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐHairColorCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.HairColor = data\n\t\tcase \"height\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"height\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Height = data\n\t\tcase \"cup_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"cup_size\"))\n\t\t\tdata, err := ec.unmarshalOStringCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStringCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CupSize = data\n\t\tcase \"band_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"band_size\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.BandSize = data\n\t\tcase \"waist_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"waist_size\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.WaistSize = data\n\t\tcase \"hip_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"hip_size\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.HipSize = data\n\t\tcase \"breast_type\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"breast_type\"))\n\t\t\tdata, err := ec.unmarshalOBreastTypeCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBreastTypeCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.BreastType = data\n\t\tcase \"career_start_year\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"career_start_year\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CareerStartYear = data\n\t\tcase \"career_end_year\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"career_end_year\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CareerEndYear = data\n\t\tcase \"tattoos\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"tattoos\"))\n\t\t\tdata, err := ec.unmarshalOBodyModificationCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Tattoos = data\n\t\tcase \"piercings\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"piercings\"))\n\t\t\tdata, err := ec.unmarshalOBodyModificationCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Piercings = data\n\t\tcase \"is_favorite\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"is_favorite\"))\n\t\t\tdata, err := ec.unmarshalOBoolean2ᚖbool(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.IsFavorite = data\n\t\tcase \"performed_with\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"performed_with\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.PerformedWith = data\n\t\tcase \"studio_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"studio_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.StudioID = data\n\t\tcase \"page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Page = data\n\t\tcase \"per_page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"per_page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.PerPage = data\n\t\tcase \"direction\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"direction\"))\n\t\t\tdata, err := ec.unmarshalNSortDirectionEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSortDirectionEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Direction = data\n\t\tcase \"sort\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"sort\"))\n\t\t\tdata, err := ec.unmarshalNPerformerSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerSortEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Sort = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputPerformerScenesInput(ctx context.Context, obj any) (PerformerScenesInput, error) {\n\tvar it PerformerScenesInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"performed_with\", \"studio_id\", \"tags\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"performed_with\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"performed_with\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.PerformedWith = data\n\t\tcase \"studio_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"studio_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.StudioID = data\n\t\tcase \"tags\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"tags\"))\n\t\t\tdata, err := ec.unmarshalOMultiIDCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMultiIDCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Tags = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputPerformerSearchFilter(ctx context.Context, obj any) (PerformerSearchFilter, error) {\n\tvar it PerformerSearchFilter\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"gender\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"gender\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"gender\"))\n\t\t\tdata, err := ec.unmarshalOGenderEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Gender = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputPerformerUpdateInput(ctx context.Context, obj any) (PerformerUpdateInput, error) {\n\tvar it PerformerUpdateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"name\", \"disambiguation\", \"aliases\", \"gender\", \"urls\", \"birthdate\", \"deathdate\", \"ethnicity\", \"country\", \"eye_color\", \"hair_color\", \"height\", \"cup_size\", \"band_size\", \"waist_size\", \"hip_size\", \"breast_type\", \"career_start_year\", \"career_end_year\", \"tattoos\", \"piercings\", \"image_ids\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"disambiguation\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"disambiguation\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Disambiguation = data\n\t\tcase \"aliases\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"aliases\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Aliases = data\n\t\tcase \"gender\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"gender\"))\n\t\t\tdata, err := ec.unmarshalOGenderEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Gender = data\n\t\tcase \"urls\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"urls\"))\n\t\t\tdata, err := ec.unmarshalOURLInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Urls = data\n\t\tcase \"birthdate\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"birthdate\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Birthdate = data\n\t\tcase \"deathdate\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"deathdate\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Deathdate = data\n\t\tcase \"ethnicity\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"ethnicity\"))\n\t\t\tdata, err := ec.unmarshalOEthnicityEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEthnicityEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Ethnicity = data\n\t\tcase \"country\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"country\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Country = data\n\t\tcase \"eye_color\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"eye_color\"))\n\t\t\tdata, err := ec.unmarshalOEyeColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEyeColorEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.EyeColor = data\n\t\tcase \"hair_color\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"hair_color\"))\n\t\t\tdata, err := ec.unmarshalOHairColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐHairColorEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.HairColor = data\n\t\tcase \"height\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"height\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Height = data\n\t\tcase \"cup_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"cup_size\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CupSize = data\n\t\tcase \"band_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"band_size\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.BandSize = data\n\t\tcase \"waist_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"waist_size\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.WaistSize = data\n\t\tcase \"hip_size\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"hip_size\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.HipSize = data\n\t\tcase \"breast_type\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"breast_type\"))\n\t\t\tdata, err := ec.unmarshalOBreastTypeEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBreastTypeEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.BreastType = data\n\t\tcase \"career_start_year\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"career_start_year\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CareerStartYear = data\n\t\tcase \"career_end_year\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"career_end_year\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CareerEndYear = data\n\t\tcase \"tattoos\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"tattoos\"))\n\t\t\tdata, err := ec.unmarshalOBodyModificationInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Tattoos = data\n\t\tcase \"piercings\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"piercings\"))\n\t\t\tdata, err := ec.unmarshalOBodyModificationInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Piercings = data\n\t\tcase \"image_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"image_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ImageIds = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputQueryExistingPerformerInput(ctx context.Context, obj any) (QueryExistingPerformerInput, error) {\n\tvar it QueryExistingPerformerInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"disambiguation\", \"urls\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"disambiguation\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"disambiguation\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Disambiguation = data\n\t\tcase \"urls\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"urls\"))\n\t\t\tdata, err := ec.unmarshalNString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Urls = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputQueryExistingSceneInput(ctx context.Context, obj any) (QueryExistingSceneInput, error) {\n\tvar it QueryExistingSceneInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"title\", \"studio_id\", \"fingerprints\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"title\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"title\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Title = data\n\t\tcase \"studio_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"studio_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.StudioID = data\n\t\tcase \"fingerprints\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"fingerprints\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Fingerprints = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputQueryNotificationsInput(ctx context.Context, obj any) (QueryNotificationsInput, error) {\n\tvar it QueryNotificationsInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tif _, present := asMap[\"page\"]; !present {\n\t\tasMap[\"page\"] = 1\n\t}\n\tif _, present := asMap[\"per_page\"]; !present {\n\t\tasMap[\"per_page\"] = 25\n\t}\n\n\tfieldsInOrder := [...]string{\"page\", \"per_page\", \"type\", \"unread_only\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Page = data\n\t\tcase \"per_page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"per_page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.PerPage = data\n\t\tcase \"type\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"type\"))\n\t\t\tdata, err := ec.unmarshalONotificationEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Type = data\n\t\tcase \"unread_only\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"unread_only\"))\n\t\t\tdata, err := ec.unmarshalOBoolean2ᚖbool(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.UnreadOnly = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputResetPasswordInput(ctx context.Context, obj any) (ResetPasswordInput, error) {\n\tvar it ResetPasswordInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"email\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"email\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"email\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Email = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputRevokeInviteInput(ctx context.Context, obj any) (RevokeInviteInput, error) {\n\tvar it RevokeInviteInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"user_id\", \"amount\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"user_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"user_id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.UserID = data\n\t\tcase \"amount\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"amount\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Amount = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputRoleCriterionInput(ctx context.Context, obj any) (RoleCriterionInput, error) {\n\tvar it RoleCriterionInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"value\", \"modifier\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"value\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"value\"))\n\t\t\tdata, err := ec.unmarshalNRoleEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnumᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Value = data\n\t\tcase \"modifier\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"modifier\"))\n\t\t\tdata, err := ec.unmarshalNCriterionModifier2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCriterionModifier(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Modifier = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputSceneCreateInput(ctx context.Context, obj any) (SceneCreateInput, error) {\n\tvar it SceneCreateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"title\", \"details\", \"urls\", \"date\", \"production_date\", \"studio_id\", \"performers\", \"tag_ids\", \"image_ids\", \"fingerprints\", \"duration\", \"director\", \"code\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"title\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"title\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Title = data\n\t\tcase \"details\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"details\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Details = data\n\t\tcase \"urls\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"urls\"))\n\t\t\tdata, err := ec.unmarshalOURLInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Urls = data\n\t\tcase \"date\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"date\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Date = data\n\t\tcase \"production_date\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"production_date\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ProductionDate = data\n\t\tcase \"studio_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"studio_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.StudioID = data\n\t\tcase \"performers\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"performers\"))\n\t\t\tdata, err := ec.unmarshalOPerformerAppearanceInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearanceInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Performers = data\n\t\tcase \"tag_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"tag_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.TagIds = data\n\t\tcase \"image_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"image_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ImageIds = data\n\t\tcase \"fingerprints\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"fingerprints\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintEditInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintEditInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Fingerprints = data\n\t\tcase \"duration\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"duration\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Duration = data\n\t\tcase \"director\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"director\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Director = data\n\t\tcase \"code\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"code\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Code = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputSceneDestroyInput(ctx context.Context, obj any) (SceneDestroyInput, error) {\n\tvar it SceneDestroyInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputSceneDraftInput(ctx context.Context, obj any) (SceneDraftInput, error) {\n\tvar it SceneDraftInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"title\", \"code\", \"details\", \"director\", \"url\", \"urls\", \"date\", \"production_date\", \"studio\", \"performers\", \"tags\", \"image\", \"fingerprints\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"title\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"title\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Title = data\n\t\tcase \"code\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"code\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Code = data\n\t\tcase \"details\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"details\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Details = data\n\t\tcase \"director\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"director\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Director = data\n\t\tcase \"url\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"url\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.URL = data\n\t\tcase \"urls\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"urls\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Urls = data\n\t\tcase \"date\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"date\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Date = data\n\t\tcase \"production_date\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"production_date\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ProductionDate = data\n\t\tcase \"studio\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"studio\"))\n\t\t\tdata, err := ec.unmarshalODraftEntityInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftEntityInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Studio = data\n\t\tcase \"performers\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"performers\"))\n\t\t\tdata, err := ec.unmarshalNDraftEntityInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftEntityInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Performers = data\n\t\tcase \"tags\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"tags\"))\n\t\t\tdata, err := ec.unmarshalODraftEntityInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftEntityInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Tags = data\n\t\tcase \"image\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"image\"))\n\t\t\tdata, err := ec.unmarshalOUpload2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚐUpload(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Image = data\n\t\tcase \"fingerprints\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"fingerprints\"))\n\t\t\tdata, err := ec.unmarshalNFingerprintInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Fingerprints = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputSceneEditDetailsInput(ctx context.Context, obj any) (SceneEditDetailsInput, error) {\n\tvar it SceneEditDetailsInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"title\", \"details\", \"urls\", \"date\", \"production_date\", \"studio_id\", \"performers\", \"tag_ids\", \"image_ids\", \"duration\", \"director\", \"code\", \"fingerprints\", \"draft_id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"title\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"title\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Title = data\n\t\tcase \"details\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"details\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Details = data\n\t\tcase \"urls\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"urls\"))\n\t\t\tdata, err := ec.unmarshalOURLInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Urls = data\n\t\tcase \"date\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"date\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Date = data\n\t\tcase \"production_date\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"production_date\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ProductionDate = data\n\t\tcase \"studio_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"studio_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.StudioID = data\n\t\tcase \"performers\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"performers\"))\n\t\t\tdata, err := ec.unmarshalOPerformerAppearanceInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearanceInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Performers = data\n\t\tcase \"tag_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"tag_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.TagIds = data\n\t\tcase \"image_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"image_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ImageIds = data\n\t\tcase \"duration\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"duration\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Duration = data\n\t\tcase \"director\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"director\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Director = data\n\t\tcase \"code\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"code\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Code = data\n\t\tcase \"fingerprints\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"fingerprints\"))\n\t\t\tdata, err := ec.unmarshalOFingerprintInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Fingerprints = data\n\t\tcase \"draft_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"draft_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.DraftID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputSceneEditInput(ctx context.Context, obj any) (SceneEditInput, error) {\n\tvar it SceneEditInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"edit\", \"details\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"edit\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"edit\"))\n\t\t\tdata, err := ec.unmarshalNEditInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Edit = data\n\t\tcase \"details\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"details\"))\n\t\t\tdata, err := ec.unmarshalOSceneEditDetailsInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneEditDetailsInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Details = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputSceneQueryInput(ctx context.Context, obj any) (SceneQueryInput, error) {\n\tvar it SceneQueryInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tif _, present := asMap[\"has_fingerprint_submissions\"]; !present {\n\t\tasMap[\"has_fingerprint_submissions\"] = \"False\"\n\t}\n\tif _, present := asMap[\"page\"]; !present {\n\t\tasMap[\"page\"] = 1\n\t}\n\tif _, present := asMap[\"per_page\"]; !present {\n\t\tasMap[\"per_page\"] = 25\n\t}\n\tif _, present := asMap[\"direction\"]; !present {\n\t\tasMap[\"direction\"] = \"DESC\"\n\t}\n\tif _, present := asMap[\"sort\"]; !present {\n\t\tasMap[\"sort\"] = \"DATE\"\n\t}\n\n\tfieldsInOrder := [...]string{\"text\", \"title\", \"url\", \"date\", \"production_date\", \"studios\", \"parentStudio\", \"tags\", \"performers\", \"alias\", \"fingerprints\", \"favorites\", \"has_fingerprint_submissions\", \"page\", \"per_page\", \"direction\", \"sort\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"text\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"text\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Text = data\n\t\tcase \"title\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"title\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Title = data\n\t\tcase \"url\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"url\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.URL = data\n\t\tcase \"date\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"date\"))\n\t\t\tdata, err := ec.unmarshalODateCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDateCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Date = data\n\t\tcase \"production_date\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"production_date\"))\n\t\t\tdata, err := ec.unmarshalODateCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDateCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ProductionDate = data\n\t\tcase \"studios\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"studios\"))\n\t\t\tdata, err := ec.unmarshalOMultiIDCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMultiIDCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Studios = data\n\t\tcase \"parentStudio\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"parentStudio\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ParentStudio = data\n\t\tcase \"tags\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"tags\"))\n\t\t\tdata, err := ec.unmarshalOMultiIDCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMultiIDCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Tags = data\n\t\tcase \"performers\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"performers\"))\n\t\t\tdata, err := ec.unmarshalOMultiIDCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMultiIDCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Performers = data\n\t\tcase \"alias\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"alias\"))\n\t\t\tdata, err := ec.unmarshalOStringCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStringCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Alias = data\n\t\tcase \"fingerprints\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"fingerprints\"))\n\t\t\tdata, err := ec.unmarshalOMultiStringCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMultiStringCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Fingerprints = data\n\t\tcase \"favorites\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"favorites\"))\n\t\t\tdata, err := ec.unmarshalOFavoriteFilter2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFavoriteFilter(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Favorites = data\n\t\tcase \"has_fingerprint_submissions\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"has_fingerprint_submissions\"))\n\t\t\tdata, err := ec.unmarshalOBoolean2ᚖbool(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.HasFingerprintSubmissions = data\n\t\tcase \"page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Page = data\n\t\tcase \"per_page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"per_page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.PerPage = data\n\t\tcase \"direction\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"direction\"))\n\t\t\tdata, err := ec.unmarshalNSortDirectionEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSortDirectionEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Direction = data\n\t\tcase \"sort\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"sort\"))\n\t\t\tdata, err := ec.unmarshalNSceneSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneSortEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Sort = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputSceneUpdateInput(ctx context.Context, obj any) (SceneUpdateInput, error) {\n\tvar it SceneUpdateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"title\", \"details\", \"urls\", \"date\", \"production_date\", \"studio_id\", \"performers\", \"tag_ids\", \"image_ids\", \"fingerprints\", \"duration\", \"director\", \"code\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"title\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"title\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Title = data\n\t\tcase \"details\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"details\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Details = data\n\t\tcase \"urls\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"urls\"))\n\t\t\tdata, err := ec.unmarshalOURLInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Urls = data\n\t\tcase \"date\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"date\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Date = data\n\t\tcase \"production_date\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"production_date\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ProductionDate = data\n\t\tcase \"studio_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"studio_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.StudioID = data\n\t\tcase \"performers\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"performers\"))\n\t\t\tdata, err := ec.unmarshalOPerformerAppearanceInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearanceInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Performers = data\n\t\tcase \"tag_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"tag_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.TagIds = data\n\t\tcase \"image_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"image_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ImageIds = data\n\t\tcase \"fingerprints\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"fingerprints\"))\n\t\t\tdata, err := ec.unmarshalOFingerprintEditInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintEditInputᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Fingerprints = data\n\t\tcase \"duration\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"duration\"))\n\t\t\tdata, err := ec.unmarshalOInt2ᚖint(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Duration = data\n\t\tcase \"director\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"director\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Director = data\n\t\tcase \"code\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"code\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Code = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputSiteCreateInput(ctx context.Context, obj any) (SiteCreateInput, error) {\n\tvar it SiteCreateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"description\", \"url\", \"regex\", \"valid_types\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"description\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"description\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Description = data\n\t\tcase \"url\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"url\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.URL = data\n\t\tcase \"regex\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"regex\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Regex = data\n\t\tcase \"valid_types\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"valid_types\"))\n\t\t\tdata, err := ec.unmarshalNValidSiteTypeEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐValidSiteTypeEnumᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ValidTypes = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputSiteDestroyInput(ctx context.Context, obj any) (SiteDestroyInput, error) {\n\tvar it SiteDestroyInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputSiteUpdateInput(ctx context.Context, obj any) (SiteUpdateInput, error) {\n\tvar it SiteUpdateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"name\", \"description\", \"url\", \"regex\", \"valid_types\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"description\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"description\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Description = data\n\t\tcase \"url\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"url\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.URL = data\n\t\tcase \"regex\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"regex\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Regex = data\n\t\tcase \"valid_types\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"valid_types\"))\n\t\t\tdata, err := ec.unmarshalNValidSiteTypeEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐValidSiteTypeEnumᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ValidTypes = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputStringCriterionInput(ctx context.Context, obj any) (StringCriterionInput, error) {\n\tvar it StringCriterionInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"value\", \"modifier\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"value\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"value\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Value = data\n\t\tcase \"modifier\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"modifier\"))\n\t\t\tdata, err := ec.unmarshalNCriterionModifier2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCriterionModifier(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Modifier = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputStudioCreateInput(ctx context.Context, obj any) (StudioCreateInput, error) {\n\tvar it StudioCreateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"aliases\", \"urls\", \"parent_id\", \"image_ids\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"aliases\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"aliases\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Aliases = data\n\t\tcase \"urls\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"urls\"))\n\t\t\tdata, err := ec.unmarshalOURLInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Urls = data\n\t\tcase \"parent_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"parent_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ParentID = data\n\t\tcase \"image_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"image_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ImageIds = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputStudioDestroyInput(ctx context.Context, obj any) (StudioDestroyInput, error) {\n\tvar it StudioDestroyInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputStudioEditDetailsInput(ctx context.Context, obj any) (StudioEditDetailsInput, error) {\n\tvar it StudioEditDetailsInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"aliases\", \"urls\", \"parent_id\", \"image_ids\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"aliases\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"aliases\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Aliases = data\n\t\tcase \"urls\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"urls\"))\n\t\t\tdata, err := ec.unmarshalOURLInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Urls = data\n\t\tcase \"parent_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"parent_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ParentID = data\n\t\tcase \"image_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"image_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ImageIds = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputStudioEditInput(ctx context.Context, obj any) (StudioEditInput, error) {\n\tvar it StudioEditInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"edit\", \"details\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"edit\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"edit\"))\n\t\t\tdata, err := ec.unmarshalNEditInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Edit = data\n\t\tcase \"details\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"details\"))\n\t\t\tdata, err := ec.unmarshalOStudioEditDetailsInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioEditDetailsInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Details = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputStudioQueryInput(ctx context.Context, obj any) (StudioQueryInput, error) {\n\tvar it StudioQueryInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tif _, present := asMap[\"page\"]; !present {\n\t\tasMap[\"page\"] = 1\n\t}\n\tif _, present := asMap[\"per_page\"]; !present {\n\t\tasMap[\"per_page\"] = 25\n\t}\n\tif _, present := asMap[\"direction\"]; !present {\n\t\tasMap[\"direction\"] = \"ASC\"\n\t}\n\tif _, present := asMap[\"sort\"]; !present {\n\t\tasMap[\"sort\"] = \"NAME\"\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"names\", \"url\", \"parent\", \"has_parent\", \"is_favorite\", \"page\", \"per_page\", \"direction\", \"sort\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"names\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"names\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Names = data\n\t\tcase \"url\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"url\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.URL = data\n\t\tcase \"parent\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"parent\"))\n\t\t\tdata, err := ec.unmarshalOIDCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIDCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Parent = data\n\t\tcase \"has_parent\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"has_parent\"))\n\t\t\tdata, err := ec.unmarshalOBoolean2ᚖbool(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.HasParent = data\n\t\tcase \"is_favorite\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"is_favorite\"))\n\t\t\tdata, err := ec.unmarshalOBoolean2ᚖbool(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.IsFavorite = data\n\t\tcase \"page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Page = data\n\t\tcase \"per_page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"per_page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.PerPage = data\n\t\tcase \"direction\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"direction\"))\n\t\t\tdata, err := ec.unmarshalNSortDirectionEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSortDirectionEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Direction = data\n\t\tcase \"sort\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"sort\"))\n\t\t\tdata, err := ec.unmarshalNStudioSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioSortEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Sort = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputStudioUpdateInput(ctx context.Context, obj any) (StudioUpdateInput, error) {\n\tvar it StudioUpdateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"name\", \"aliases\", \"urls\", \"parent_id\", \"image_ids\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"aliases\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"aliases\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Aliases = data\n\t\tcase \"urls\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"urls\"))\n\t\t\tdata, err := ec.unmarshalOURLInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Urls = data\n\t\tcase \"parent_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"parent_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ParentID = data\n\t\tcase \"image_ids\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"image_ids\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ImageIds = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputTagCategoryCreateInput(ctx context.Context, obj any) (TagCategoryCreateInput, error) {\n\tvar it TagCategoryCreateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"group\", \"description\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"group\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"group\"))\n\t\t\tdata, err := ec.unmarshalNTagGroupEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagGroupEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Group = data\n\t\tcase \"description\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"description\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Description = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputTagCategoryDestroyInput(ctx context.Context, obj any) (TagCategoryDestroyInput, error) {\n\tvar it TagCategoryDestroyInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputTagCategoryUpdateInput(ctx context.Context, obj any) (TagCategoryUpdateInput, error) {\n\tvar it TagCategoryUpdateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"name\", \"group\", \"description\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"group\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"group\"))\n\t\t\tdata, err := ec.unmarshalOTagGroupEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagGroupEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Group = data\n\t\tcase \"description\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"description\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Description = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputTagCreateInput(ctx context.Context, obj any) (TagCreateInput, error) {\n\tvar it TagCreateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"description\", \"aliases\", \"category_id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"description\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"description\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Description = data\n\t\tcase \"aliases\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"aliases\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Aliases = data\n\t\tcase \"category_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"category_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CategoryID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputTagDestroyInput(ctx context.Context, obj any) (TagDestroyInput, error) {\n\tvar it TagDestroyInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputTagEditDetailsInput(ctx context.Context, obj any) (TagEditDetailsInput, error) {\n\tvar it TagEditDetailsInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"description\", \"aliases\", \"category_id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"description\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"description\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Description = data\n\t\tcase \"aliases\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"aliases\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Aliases = data\n\t\tcase \"category_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"category_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CategoryID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputTagEditInput(ctx context.Context, obj any) (TagEditInput, error) {\n\tvar it TagEditInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"edit\", \"details\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"edit\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"edit\"))\n\t\t\tdata, err := ec.unmarshalNEditInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Edit = data\n\t\tcase \"details\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"details\"))\n\t\t\tdata, err := ec.unmarshalOTagEditDetailsInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagEditDetailsInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Details = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputTagQueryInput(ctx context.Context, obj any) (TagQueryInput, error) {\n\tvar it TagQueryInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tif _, present := asMap[\"page\"]; !present {\n\t\tasMap[\"page\"] = 1\n\t}\n\tif _, present := asMap[\"per_page\"]; !present {\n\t\tasMap[\"per_page\"] = 25\n\t}\n\tif _, present := asMap[\"direction\"]; !present {\n\t\tasMap[\"direction\"] = \"ASC\"\n\t}\n\tif _, present := asMap[\"sort\"]; !present {\n\t\tasMap[\"sort\"] = \"NAME\"\n\t}\n\n\tfieldsInOrder := [...]string{\"text\", \"names\", \"name\", \"category_id\", \"page\", \"per_page\", \"direction\", \"sort\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"text\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"text\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Text = data\n\t\tcase \"names\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"names\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Names = data\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"category_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"category_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CategoryID = data\n\t\tcase \"page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Page = data\n\t\tcase \"per_page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"per_page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.PerPage = data\n\t\tcase \"direction\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"direction\"))\n\t\t\tdata, err := ec.unmarshalNSortDirectionEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSortDirectionEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Direction = data\n\t\tcase \"sort\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"sort\"))\n\t\t\tdata, err := ec.unmarshalNTagSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagSortEnum(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Sort = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputTagUpdateInput(ctx context.Context, obj any) (TagUpdateInput, error) {\n\tvar it TagUpdateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"name\", \"description\", \"aliases\", \"category_id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"description\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"description\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Description = data\n\t\tcase \"aliases\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"aliases\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Aliases = data\n\t\tcase \"category_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"category_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.CategoryID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputURLInput(ctx context.Context, obj any) (URL, error) {\n\tvar it URL\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"url\", \"site_id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"url\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"url\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.URL = data\n\t\tcase \"site_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"site_id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.SiteID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputUserChangeEmailInput(ctx context.Context, obj any) (UserChangeEmailInput, error) {\n\tvar it UserChangeEmailInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"existing_email_token\", \"new_email_token\", \"new_email\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"existing_email_token\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"existing_email_token\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ExistingEmailToken = data\n\t\tcase \"new_email_token\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"new_email_token\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.NewEmailToken = data\n\t\tcase \"new_email\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"new_email\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.NewEmail = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputUserChangePasswordInput(ctx context.Context, obj any) (UserChangePasswordInput, error) {\n\tvar it UserChangePasswordInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"existing_password\", \"new_password\", \"reset_key\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"existing_password\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"existing_password\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ExistingPassword = data\n\t\tcase \"new_password\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"new_password\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.NewPassword = data\n\t\tcase \"reset_key\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"reset_key\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ResetKey = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputUserCreateInput(ctx context.Context, obj any) (UserCreateInput, error) {\n\tvar it UserCreateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"password\", \"roles\", \"email\", \"invited_by_id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"password\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"password\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Password = data\n\t\tcase \"roles\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"roles\"))\n\t\t\tdata, err := ec.unmarshalNRoleEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnumᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Roles = data\n\t\tcase \"email\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"email\"))\n\t\t\tdata, err := ec.unmarshalNString2string(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Email = data\n\t\tcase \"invited_by_id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"invited_by_id\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.InvitedByID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputUserDestroyInput(ctx context.Context, obj any) (UserDestroyInput, error) {\n\tvar it UserDestroyInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputUserQueryInput(ctx context.Context, obj any) (UserQueryInput, error) {\n\tvar it UserQueryInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tif _, present := asMap[\"page\"]; !present {\n\t\tasMap[\"page\"] = 1\n\t}\n\tif _, present := asMap[\"per_page\"]; !present {\n\t\tasMap[\"per_page\"] = 25\n\t}\n\n\tfieldsInOrder := [...]string{\"name\", \"email\", \"roles\", \"apiKey\", \"successful_edits\", \"unsuccessful_edits\", \"successful_votes\", \"unsuccessful_votes\", \"api_calls\", \"invited_by\", \"page\", \"per_page\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"email\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"email\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Email = data\n\t\tcase \"roles\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"roles\"))\n\t\t\tdata, err := ec.unmarshalORoleCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Roles = data\n\t\tcase \"apiKey\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"apiKey\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.APIKey = data\n\t\tcase \"successful_edits\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"successful_edits\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.SuccessfulEdits = data\n\t\tcase \"unsuccessful_edits\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"unsuccessful_edits\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.UnsuccessfulEdits = data\n\t\tcase \"successful_votes\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"successful_votes\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.SuccessfulVotes = data\n\t\tcase \"unsuccessful_votes\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"unsuccessful_votes\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.UnsuccessfulVotes = data\n\t\tcase \"api_calls\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"api_calls\"))\n\t\t\tdata, err := ec.unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.APICalls = data\n\t\tcase \"invited_by\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"invited_by\"))\n\t\t\tdata, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.InvitedBy = data\n\t\tcase \"page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Page = data\n\t\tcase \"per_page\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"per_page\"))\n\t\t\tdata, err := ec.unmarshalNInt2int(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.PerPage = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\nfunc (ec *executionContext) unmarshalInputUserUpdateInput(ctx context.Context, obj any) (UserUpdateInput, error) {\n\tvar it UserUpdateInput\n\tif obj == nil {\n\t\treturn it, nil\n\t}\n\n\tasMap := map[string]any{}\n\tfor k, v := range obj.(map[string]any) {\n\t\tasMap[k] = v\n\t}\n\n\tfieldsInOrder := [...]string{\"id\", \"name\", \"password\", \"roles\", \"email\"}\n\tfor _, k := range fieldsInOrder {\n\t\tv, ok := asMap[k]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tswitch k {\n\t\tcase \"id\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"id\"))\n\t\t\tdata, err := ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.ID = data\n\t\tcase \"name\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"name\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Name = data\n\t\tcase \"password\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"password\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Password = data\n\t\tcase \"roles\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"roles\"))\n\t\t\tdata, err := ec.unmarshalORoleEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnumᚄ(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Roles = data\n\t\tcase \"email\":\n\t\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithField(\"email\"))\n\t\t\tdata, err := ec.unmarshalOString2ᚖstring(ctx, v)\n\t\t\tif err != nil {\n\t\t\t\treturn it, err\n\t\t\t}\n\t\t\tit.Email = data\n\t\t}\n\t}\n\treturn it, nil\n}\n\n// endregion **************************** input.gotpl *****************************\n\n// region    ************************** interface.gotpl ***************************\n\nfunc (ec *executionContext) _DraftData(ctx context.Context, sel ast.SelectionSet, obj DraftData) graphql.Marshaler {\n\tswitch obj := (obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\tcase SceneDraft:\n\t\treturn ec._SceneDraft(ctx, sel, &obj)\n\tcase *SceneDraft:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._SceneDraft(ctx, sel, obj)\n\tcase PerformerDraft:\n\t\treturn ec._PerformerDraft(ctx, sel, &obj)\n\tcase *PerformerDraft:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._PerformerDraft(ctx, sel, obj)\n\tdefault:\n\t\tif typedObj, ok := obj.(graphql.Marshaler); ok {\n\t\t\treturn typedObj\n\t\t} else {\n\t\t\tpanic(fmt.Errorf(\"unexpected type %T; non-generated variants of DraftData must implement graphql.Marshaler\", obj))\n\t\t}\n\t}\n}\n\nfunc (ec *executionContext) _EditDetails(ctx context.Context, sel ast.SelectionSet, obj EditDetails) graphql.Marshaler {\n\tswitch obj := (obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\tcase TagEdit:\n\t\treturn ec._TagEdit(ctx, sel, &obj)\n\tcase *TagEdit:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._TagEdit(ctx, sel, obj)\n\tcase StudioEdit:\n\t\treturn ec._StudioEdit(ctx, sel, &obj)\n\tcase *StudioEdit:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._StudioEdit(ctx, sel, obj)\n\tcase SceneEdit:\n\t\treturn ec._SceneEdit(ctx, sel, &obj)\n\tcase *SceneEdit:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._SceneEdit(ctx, sel, obj)\n\tcase PerformerEdit:\n\t\treturn ec._PerformerEdit(ctx, sel, &obj)\n\tcase *PerformerEdit:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._PerformerEdit(ctx, sel, obj)\n\tdefault:\n\t\tif typedObj, ok := obj.(graphql.Marshaler); ok {\n\t\t\treturn typedObj\n\t\t} else {\n\t\t\tpanic(fmt.Errorf(\"unexpected type %T; non-generated variants of EditDetails must implement graphql.Marshaler\", obj))\n\t\t}\n\t}\n}\n\nfunc (ec *executionContext) _EditTarget(ctx context.Context, sel ast.SelectionSet, obj EditTarget) graphql.Marshaler {\n\tswitch obj := (obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\tcase *Tag:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._Tag(ctx, sel, obj)\n\tcase *Studio:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._Studio(ctx, sel, obj)\n\tcase *Scene:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._Scene(ctx, sel, obj)\n\tcase *Performer:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._Performer(ctx, sel, obj)\n\tdefault:\n\t\tif typedObj, ok := obj.(graphql.Marshaler); ok {\n\t\t\treturn typedObj\n\t\t} else {\n\t\t\tpanic(fmt.Errorf(\"unexpected type %T; non-generated variants of EditTarget must implement graphql.Marshaler\", obj))\n\t\t}\n\t}\n}\n\nfunc (ec *executionContext) _NotificationData(ctx context.Context, sel ast.SelectionSet, obj NotificationData) graphql.Marshaler {\n\tswitch obj := (obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\tcase UpdatedEdit:\n\t\treturn ec._UpdatedEdit(ctx, sel, &obj)\n\tcase *UpdatedEdit:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._UpdatedEdit(ctx, sel, obj)\n\tcase FingerprintedSceneEdit:\n\t\treturn ec._FingerprintedSceneEdit(ctx, sel, &obj)\n\tcase *FingerprintedSceneEdit:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._FingerprintedSceneEdit(ctx, sel, obj)\n\tcase FavoriteStudioScene:\n\t\treturn ec._FavoriteStudioScene(ctx, sel, &obj)\n\tcase *FavoriteStudioScene:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._FavoriteStudioScene(ctx, sel, obj)\n\tcase FavoriteStudioEdit:\n\t\treturn ec._FavoriteStudioEdit(ctx, sel, &obj)\n\tcase *FavoriteStudioEdit:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._FavoriteStudioEdit(ctx, sel, obj)\n\tcase FavoritePerformerScene:\n\t\treturn ec._FavoritePerformerScene(ctx, sel, &obj)\n\tcase *FavoritePerformerScene:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._FavoritePerformerScene(ctx, sel, obj)\n\tcase FavoritePerformerEdit:\n\t\treturn ec._FavoritePerformerEdit(ctx, sel, &obj)\n\tcase *FavoritePerformerEdit:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._FavoritePerformerEdit(ctx, sel, obj)\n\tcase FailedOwnEdit:\n\t\treturn ec._FailedOwnEdit(ctx, sel, &obj)\n\tcase *FailedOwnEdit:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._FailedOwnEdit(ctx, sel, obj)\n\tcase DownvoteOwnEdit:\n\t\treturn ec._DownvoteOwnEdit(ctx, sel, &obj)\n\tcase *DownvoteOwnEdit:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._DownvoteOwnEdit(ctx, sel, obj)\n\tcase CommentVotedEdit:\n\t\treturn ec._CommentVotedEdit(ctx, sel, &obj)\n\tcase *CommentVotedEdit:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._CommentVotedEdit(ctx, sel, obj)\n\tcase CommentOwnEdit:\n\t\treturn ec._CommentOwnEdit(ctx, sel, &obj)\n\tcase *CommentOwnEdit:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._CommentOwnEdit(ctx, sel, obj)\n\tcase CommentCommentedEdit:\n\t\treturn ec._CommentCommentedEdit(ctx, sel, &obj)\n\tcase *CommentCommentedEdit:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._CommentCommentedEdit(ctx, sel, obj)\n\tdefault:\n\t\tif typedObj, ok := obj.(graphql.Marshaler); ok {\n\t\t\treturn typedObj\n\t\t} else {\n\t\t\tpanic(fmt.Errorf(\"unexpected type %T; non-generated variants of NotificationData must implement graphql.Marshaler\", obj))\n\t\t}\n\t}\n}\n\nfunc (ec *executionContext) _SceneDraftPerformer(ctx context.Context, sel ast.SelectionSet, obj SceneDraftPerformer) graphql.Marshaler {\n\tswitch obj := (obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\tcase Performer:\n\t\treturn ec._Performer(ctx, sel, &obj)\n\tcase *Performer:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._Performer(ctx, sel, obj)\n\tcase DraftEntity:\n\t\treturn ec._DraftEntity(ctx, sel, &obj)\n\tcase *DraftEntity:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._DraftEntity(ctx, sel, obj)\n\tdefault:\n\t\tif typedObj, ok := obj.(graphql.Marshaler); ok {\n\t\t\treturn typedObj\n\t\t} else {\n\t\t\tpanic(fmt.Errorf(\"unexpected type %T; non-generated variants of SceneDraftPerformer must implement graphql.Marshaler\", obj))\n\t\t}\n\t}\n}\n\nfunc (ec *executionContext) _SceneDraftStudio(ctx context.Context, sel ast.SelectionSet, obj SceneDraftStudio) graphql.Marshaler {\n\tswitch obj := (obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\tcase Studio:\n\t\treturn ec._Studio(ctx, sel, &obj)\n\tcase *Studio:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._Studio(ctx, sel, obj)\n\tcase DraftEntity:\n\t\treturn ec._DraftEntity(ctx, sel, &obj)\n\tcase *DraftEntity:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._DraftEntity(ctx, sel, obj)\n\tdefault:\n\t\tif typedObj, ok := obj.(graphql.Marshaler); ok {\n\t\t\treturn typedObj\n\t\t} else {\n\t\t\tpanic(fmt.Errorf(\"unexpected type %T; non-generated variants of SceneDraftStudio must implement graphql.Marshaler\", obj))\n\t\t}\n\t}\n}\n\nfunc (ec *executionContext) _SceneDraftTag(ctx context.Context, sel ast.SelectionSet, obj SceneDraftTag) graphql.Marshaler {\n\tswitch obj := (obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\tcase Tag:\n\t\treturn ec._Tag(ctx, sel, &obj)\n\tcase *Tag:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._Tag(ctx, sel, obj)\n\tcase DraftEntity:\n\t\treturn ec._DraftEntity(ctx, sel, &obj)\n\tcase *DraftEntity:\n\t\tif obj == nil {\n\t\t\treturn graphql.Null\n\t\t}\n\t\treturn ec._DraftEntity(ctx, sel, obj)\n\tdefault:\n\t\tif typedObj, ok := obj.(graphql.Marshaler); ok {\n\t\t\treturn typedObj\n\t\t} else {\n\t\t\tpanic(fmt.Errorf(\"unexpected type %T; non-generated variants of SceneDraftTag must implement graphql.Marshaler\", obj))\n\t\t}\n\t}\n}\n\n// endregion ************************** interface.gotpl ***************************\n\n// region    **************************** object.gotpl ****************************\n\nvar bodyModificationImplementors = []string{\"BodyModification\"}\n\nfunc (ec *executionContext) _BodyModification(ctx context.Context, sel ast.SelectionSet, obj *BodyModification) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, bodyModificationImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"BodyModification\")\n\t\tcase \"location\":\n\t\t\tout.Values[i] = ec._BodyModification_location(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"description\":\n\t\t\tout.Values[i] = ec._BodyModification_description(ctx, field, obj)\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar commentCommentedEditImplementors = []string{\"CommentCommentedEdit\", \"NotificationData\"}\n\nfunc (ec *executionContext) _CommentCommentedEdit(ctx context.Context, sel ast.SelectionSet, obj *CommentCommentedEdit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, commentCommentedEditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"CommentCommentedEdit\")\n\t\tcase \"comment\":\n\t\t\tout.Values[i] = ec._CommentCommentedEdit_comment(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar commentOwnEditImplementors = []string{\"CommentOwnEdit\", \"NotificationData\"}\n\nfunc (ec *executionContext) _CommentOwnEdit(ctx context.Context, sel ast.SelectionSet, obj *CommentOwnEdit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, commentOwnEditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"CommentOwnEdit\")\n\t\tcase \"comment\":\n\t\t\tout.Values[i] = ec._CommentOwnEdit_comment(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar commentVotedEditImplementors = []string{\"CommentVotedEdit\", \"NotificationData\"}\n\nfunc (ec *executionContext) _CommentVotedEdit(ctx context.Context, sel ast.SelectionSet, obj *CommentVotedEdit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, commentVotedEditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"CommentVotedEdit\")\n\t\tcase \"comment\":\n\t\t\tout.Values[i] = ec._CommentVotedEdit_comment(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar downvoteOwnEditImplementors = []string{\"DownvoteOwnEdit\", \"NotificationData\"}\n\nfunc (ec *executionContext) _DownvoteOwnEdit(ctx context.Context, sel ast.SelectionSet, obj *DownvoteOwnEdit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, downvoteOwnEditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"DownvoteOwnEdit\")\n\t\tcase \"edit\":\n\t\t\tout.Values[i] = ec._DownvoteOwnEdit_edit(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar draftImplementors = []string{\"Draft\"}\n\nfunc (ec *executionContext) _Draft(ctx context.Context, sel ast.SelectionSet, obj *Draft) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, draftImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Draft\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._Draft_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"created\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Draft_created(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"expires\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Draft_expires(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"data\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Draft_data(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar draftEntityImplementors = []string{\"DraftEntity\", \"SceneDraftStudio\", \"SceneDraftPerformer\", \"SceneDraftTag\"}\n\nfunc (ec *executionContext) _DraftEntity(ctx context.Context, sel ast.SelectionSet, obj *DraftEntity) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, draftEntityImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"DraftEntity\")\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec._DraftEntity_name(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._DraftEntity_id(ctx, field, obj)\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar draftFingerprintImplementors = []string{\"DraftFingerprint\"}\n\nfunc (ec *executionContext) _DraftFingerprint(ctx context.Context, sel ast.SelectionSet, obj *DraftFingerprint) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, draftFingerprintImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"DraftFingerprint\")\n\t\tcase \"hash\":\n\t\t\tout.Values[i] = ec._DraftFingerprint_hash(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"algorithm\":\n\t\t\tout.Values[i] = ec._DraftFingerprint_algorithm(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"duration\":\n\t\t\tout.Values[i] = ec._DraftFingerprint_duration(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar draftSubmissionStatusImplementors = []string{\"DraftSubmissionStatus\"}\n\nfunc (ec *executionContext) _DraftSubmissionStatus(ctx context.Context, sel ast.SelectionSet, obj *DraftSubmissionStatus) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, draftSubmissionStatusImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"DraftSubmissionStatus\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._DraftSubmissionStatus_id(ctx, field, obj)\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar editImplementors = []string{\"Edit\"}\n\nfunc (ec *executionContext) _Edit(ctx context.Context, sel ast.SelectionSet, obj *Edit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, editImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Edit\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._Edit_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"user\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_user(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"target\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_target(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"target_type\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_target_type(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"merge_sources\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_merge_sources(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"operation\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_operation(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"bot\":\n\t\t\tout.Values[i] = ec._Edit_bot(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"details\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_details(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"old_details\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_old_details(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"options\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_options(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"comments\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_comments(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"votes\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_votes(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"vote_count\":\n\t\t\tout.Values[i] = ec._Edit_vote_count(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"destructive\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_destructive(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"status\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_status(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"applied\":\n\t\t\tout.Values[i] = ec._Edit_applied(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"update_count\":\n\t\t\tout.Values[i] = ec._Edit_update_count(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"updatable\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_updatable(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"created\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_created(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"updated\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_updated(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"closed\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_closed(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"expires\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Edit_expires(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar editCommentImplementors = []string{\"EditComment\"}\n\nfunc (ec *executionContext) _EditComment(ctx context.Context, sel ast.SelectionSet, obj *EditComment) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, editCommentImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"EditComment\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._EditComment_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"user\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._EditComment_user(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"date\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._EditComment_date(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"comment\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._EditComment_comment(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"edit\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._EditComment_edit(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar editVoteImplementors = []string{\"EditVote\"}\n\nfunc (ec *executionContext) _EditVote(ctx context.Context, sel ast.SelectionSet, obj *EditVote) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, editVoteImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"EditVote\")\n\t\tcase \"user\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._EditVote_user(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"date\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._EditVote_date(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"vote\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._EditVote_vote(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar failedOwnEditImplementors = []string{\"FailedOwnEdit\", \"NotificationData\"}\n\nfunc (ec *executionContext) _FailedOwnEdit(ctx context.Context, sel ast.SelectionSet, obj *FailedOwnEdit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, failedOwnEditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"FailedOwnEdit\")\n\t\tcase \"edit\":\n\t\t\tout.Values[i] = ec._FailedOwnEdit_edit(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar favoritePerformerEditImplementors = []string{\"FavoritePerformerEdit\", \"NotificationData\"}\n\nfunc (ec *executionContext) _FavoritePerformerEdit(ctx context.Context, sel ast.SelectionSet, obj *FavoritePerformerEdit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, favoritePerformerEditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"FavoritePerformerEdit\")\n\t\tcase \"edit\":\n\t\t\tout.Values[i] = ec._FavoritePerformerEdit_edit(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar favoritePerformerSceneImplementors = []string{\"FavoritePerformerScene\", \"NotificationData\"}\n\nfunc (ec *executionContext) _FavoritePerformerScene(ctx context.Context, sel ast.SelectionSet, obj *FavoritePerformerScene) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, favoritePerformerSceneImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"FavoritePerformerScene\")\n\t\tcase \"scene\":\n\t\t\tout.Values[i] = ec._FavoritePerformerScene_scene(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar favoriteStudioEditImplementors = []string{\"FavoriteStudioEdit\", \"NotificationData\"}\n\nfunc (ec *executionContext) _FavoriteStudioEdit(ctx context.Context, sel ast.SelectionSet, obj *FavoriteStudioEdit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, favoriteStudioEditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"FavoriteStudioEdit\")\n\t\tcase \"edit\":\n\t\t\tout.Values[i] = ec._FavoriteStudioEdit_edit(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar favoriteStudioSceneImplementors = []string{\"FavoriteStudioScene\", \"NotificationData\"}\n\nfunc (ec *executionContext) _FavoriteStudioScene(ctx context.Context, sel ast.SelectionSet, obj *FavoriteStudioScene) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, favoriteStudioSceneImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"FavoriteStudioScene\")\n\t\tcase \"scene\":\n\t\t\tout.Values[i] = ec._FavoriteStudioScene_scene(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar fingerprintImplementors = []string{\"Fingerprint\"}\n\nfunc (ec *executionContext) _Fingerprint(ctx context.Context, sel ast.SelectionSet, obj *Fingerprint) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, fingerprintImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Fingerprint\")\n\t\tcase \"hash\":\n\t\t\tout.Values[i] = ec._Fingerprint_hash(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"algorithm\":\n\t\t\tout.Values[i] = ec._Fingerprint_algorithm(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"duration\":\n\t\t\tout.Values[i] = ec._Fingerprint_duration(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"submissions\":\n\t\t\tout.Values[i] = ec._Fingerprint_submissions(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"reports\":\n\t\t\tout.Values[i] = ec._Fingerprint_reports(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"created\":\n\t\t\tout.Values[i] = ec._Fingerprint_created(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"updated\":\n\t\t\tout.Values[i] = ec._Fingerprint_updated(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"user_submitted\":\n\t\t\tout.Values[i] = ec._Fingerprint_user_submitted(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"user_reported\":\n\t\t\tout.Values[i] = ec._Fingerprint_user_reported(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar fingerprintSubmissionResultImplementors = []string{\"FingerprintSubmissionResult\"}\n\nfunc (ec *executionContext) _FingerprintSubmissionResult(ctx context.Context, sel ast.SelectionSet, obj *FingerprintSubmissionResult) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, fingerprintSubmissionResultImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"FingerprintSubmissionResult\")\n\t\tcase \"hash\":\n\t\t\tout.Values[i] = ec._FingerprintSubmissionResult_hash(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"scene_id\":\n\t\t\tout.Values[i] = ec._FingerprintSubmissionResult_scene_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"error\":\n\t\t\tout.Values[i] = ec._FingerprintSubmissionResult_error(ctx, field, obj)\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar fingerprintedSceneEditImplementors = []string{\"FingerprintedSceneEdit\", \"NotificationData\"}\n\nfunc (ec *executionContext) _FingerprintedSceneEdit(ctx context.Context, sel ast.SelectionSet, obj *FingerprintedSceneEdit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, fingerprintedSceneEditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"FingerprintedSceneEdit\")\n\t\tcase \"edit\":\n\t\t\tout.Values[i] = ec._FingerprintedSceneEdit_edit(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar fuzzyDateImplementors = []string{\"FuzzyDate\"}\n\nfunc (ec *executionContext) _FuzzyDate(ctx context.Context, sel ast.SelectionSet, obj *FuzzyDate) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, fuzzyDateImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"FuzzyDate\")\n\t\tcase \"date\":\n\t\t\tout.Values[i] = ec._FuzzyDate_date(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"accuracy\":\n\t\t\tout.Values[i] = ec._FuzzyDate_accuracy(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar genderFacetImplementors = []string{\"GenderFacet\"}\n\nfunc (ec *executionContext) _GenderFacet(ctx context.Context, sel ast.SelectionSet, obj *GenderFacet) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, genderFacetImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"GenderFacet\")\n\t\tcase \"gender\":\n\t\t\tout.Values[i] = ec._GenderFacet_gender(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"count\":\n\t\t\tout.Values[i] = ec._GenderFacet_count(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar imageImplementors = []string{\"Image\"}\n\nfunc (ec *executionContext) _Image(ctx context.Context, sel ast.SelectionSet, obj *Image) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, imageImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Image\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._Image_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"url\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Image_url(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"width\":\n\t\t\tout.Values[i] = ec._Image_width(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"height\":\n\t\t\tout.Values[i] = ec._Image_height(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar inviteKeyImplementors = []string{\"InviteKey\"}\n\nfunc (ec *executionContext) _InviteKey(ctx context.Context, sel ast.SelectionSet, obj *InviteKey) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, inviteKeyImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"InviteKey\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._InviteKey_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"uses\":\n\t\t\tout.Values[i] = ec._InviteKey_uses(ctx, field, obj)\n\t\tcase \"expires\":\n\t\t\tout.Values[i] = ec._InviteKey_expires(ctx, field, obj)\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar measurementsImplementors = []string{\"Measurements\"}\n\nfunc (ec *executionContext) _Measurements(ctx context.Context, sel ast.SelectionSet, obj *Measurements) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, measurementsImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Measurements\")\n\t\tcase \"cup_size\":\n\t\t\tout.Values[i] = ec._Measurements_cup_size(ctx, field, obj)\n\t\tcase \"band_size\":\n\t\t\tout.Values[i] = ec._Measurements_band_size(ctx, field, obj)\n\t\tcase \"waist\":\n\t\t\tout.Values[i] = ec._Measurements_waist(ctx, field, obj)\n\t\tcase \"hip\":\n\t\t\tout.Values[i] = ec._Measurements_hip(ctx, field, obj)\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar modAuditImplementors = []string{\"ModAudit\"}\n\nfunc (ec *executionContext) _ModAudit(ctx context.Context, sel ast.SelectionSet, obj *ModAudit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, modAuditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"ModAudit\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._ModAudit_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"action\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._ModAudit_action(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"user\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._ModAudit_user(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"target_id\":\n\t\t\tout.Values[i] = ec._ModAudit_target_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"target_type\":\n\t\t\tout.Values[i] = ec._ModAudit_target_type(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"data\":\n\t\t\tout.Values[i] = ec._ModAudit_data(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"reason\":\n\t\t\tout.Values[i] = ec._ModAudit_reason(ctx, field, obj)\n\t\tcase \"created_at\":\n\t\t\tout.Values[i] = ec._ModAudit_created_at(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar mutationImplementors = []string{\"Mutation\"}\n\nfunc (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, mutationImplementors)\n\tctx = graphql.WithFieldContext(ctx, &graphql.FieldContext{\n\t\tObject: \"Mutation\",\n\t})\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tinnerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{\n\t\t\tObject: field.Name,\n\t\t\tField:  field,\n\t\t})\n\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Mutation\")\n\t\tcase \"sceneCreate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_sceneCreate(ctx, field)\n\t\t\t})\n\t\tcase \"sceneUpdate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_sceneUpdate(ctx, field)\n\t\t\t})\n\t\tcase \"sceneDestroy\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_sceneDestroy(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"performerCreate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_performerCreate(ctx, field)\n\t\t\t})\n\t\tcase \"performerUpdate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_performerUpdate(ctx, field)\n\t\t\t})\n\t\tcase \"performerDestroy\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_performerDestroy(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"studioCreate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_studioCreate(ctx, field)\n\t\t\t})\n\t\tcase \"studioUpdate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_studioUpdate(ctx, field)\n\t\t\t})\n\t\tcase \"studioDestroy\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_studioDestroy(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"tagCreate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_tagCreate(ctx, field)\n\t\t\t})\n\t\tcase \"tagUpdate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_tagUpdate(ctx, field)\n\t\t\t})\n\t\tcase \"tagDestroy\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_tagDestroy(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"userCreate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_userCreate(ctx, field)\n\t\t\t})\n\t\tcase \"userUpdate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_userUpdate(ctx, field)\n\t\t\t})\n\t\tcase \"userDestroy\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_userDestroy(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"imageCreate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_imageCreate(ctx, field)\n\t\t\t})\n\t\tcase \"imageDestroy\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_imageDestroy(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"newUser\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_newUser(ctx, field)\n\t\t\t})\n\t\tcase \"activateNewUser\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_activateNewUser(ctx, field)\n\t\t\t})\n\t\tcase \"generateInviteCode\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_generateInviteCode(ctx, field)\n\t\t\t})\n\t\tcase \"generateInviteCodes\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_generateInviteCodes(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"rescindInviteCode\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_rescindInviteCode(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"grantInvite\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_grantInvite(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"revokeInvite\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_revokeInvite(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"tagCategoryCreate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_tagCategoryCreate(ctx, field)\n\t\t\t})\n\t\tcase \"tagCategoryUpdate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_tagCategoryUpdate(ctx, field)\n\t\t\t})\n\t\tcase \"tagCategoryDestroy\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_tagCategoryDestroy(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"siteCreate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_siteCreate(ctx, field)\n\t\t\t})\n\t\tcase \"siteUpdate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_siteUpdate(ctx, field)\n\t\t\t})\n\t\tcase \"siteDestroy\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_siteDestroy(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"regenerateAPIKey\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_regenerateAPIKey(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"resetPassword\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_resetPassword(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"changePassword\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_changePassword(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"requestChangeEmail\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_requestChangeEmail(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"validateChangeEmail\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_validateChangeEmail(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"confirmChangeEmail\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_confirmChangeEmail(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"sceneEdit\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_sceneEdit(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"performerEdit\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_performerEdit(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"studioEdit\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_studioEdit(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"tagEdit\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_tagEdit(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"sceneEditUpdate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_sceneEditUpdate(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"performerEditUpdate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_performerEditUpdate(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"studioEditUpdate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_studioEditUpdate(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"tagEditUpdate\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_tagEditUpdate(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"editVote\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_editVote(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"editComment\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_editComment(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"applyEdit\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_applyEdit(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"cancelEdit\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_cancelEdit(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"deleteEdit\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_deleteEdit(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"amendEdit\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_amendEdit(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"submitFingerprint\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_submitFingerprint(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"submitFingerprints\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_submitFingerprints(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"sceneMoveFingerprintSubmissions\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_sceneMoveFingerprintSubmissions(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"sceneDeleteFingerprintSubmissions\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_sceneDeleteFingerprintSubmissions(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"submitSceneDraft\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_submitSceneDraft(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"submitPerformerDraft\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_submitPerformerDraft(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"destroyDraft\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_destroyDraft(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"favoritePerformer\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_favoritePerformer(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"favoriteStudio\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_favoriteStudio(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"markNotificationsRead\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_markNotificationsRead(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"updateNotificationSubscriptions\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Mutation_updateNotificationSubscriptions(ctx, field)\n\t\t\t})\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar notificationImplementors = []string{\"Notification\"}\n\nfunc (ec *executionContext) _Notification(ctx context.Context, sel ast.SelectionSet, obj *Notification) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, notificationImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Notification\")\n\t\tcase \"created\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Notification_created(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"read\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Notification_read(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"data\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Notification_data(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar performerImplementors = []string{\"Performer\", \"EditTarget\", \"SceneDraftPerformer\"}\n\nfunc (ec *executionContext) _Performer(ctx context.Context, sel ast.SelectionSet, obj *Performer) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, performerImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Performer\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._Performer_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec._Performer_name(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"disambiguation\":\n\t\t\tout.Values[i] = ec._Performer_disambiguation(ctx, field, obj)\n\t\tcase \"aliases\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_aliases(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"gender\":\n\t\t\tout.Values[i] = ec._Performer_gender(ctx, field, obj)\n\t\tcase \"urls\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_urls(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"birthdate\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_birthdate(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"birth_date\":\n\t\t\tout.Values[i] = ec._Performer_birth_date(ctx, field, obj)\n\t\tcase \"death_date\":\n\t\t\tout.Values[i] = ec._Performer_death_date(ctx, field, obj)\n\t\tcase \"age\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_age(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"ethnicity\":\n\t\t\tout.Values[i] = ec._Performer_ethnicity(ctx, field, obj)\n\t\tcase \"country\":\n\t\t\tout.Values[i] = ec._Performer_country(ctx, field, obj)\n\t\tcase \"eye_color\":\n\t\t\tout.Values[i] = ec._Performer_eye_color(ctx, field, obj)\n\t\tcase \"hair_color\":\n\t\t\tout.Values[i] = ec._Performer_hair_color(ctx, field, obj)\n\t\tcase \"height\":\n\t\t\tout.Values[i] = ec._Performer_height(ctx, field, obj)\n\t\tcase \"measurements\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_measurements(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"cup_size\":\n\t\t\tout.Values[i] = ec._Performer_cup_size(ctx, field, obj)\n\t\tcase \"band_size\":\n\t\t\tout.Values[i] = ec._Performer_band_size(ctx, field, obj)\n\t\tcase \"waist_size\":\n\t\t\tout.Values[i] = ec._Performer_waist_size(ctx, field, obj)\n\t\tcase \"hip_size\":\n\t\t\tout.Values[i] = ec._Performer_hip_size(ctx, field, obj)\n\t\tcase \"breast_type\":\n\t\t\tout.Values[i] = ec._Performer_breast_type(ctx, field, obj)\n\t\tcase \"career_start_year\":\n\t\t\tout.Values[i] = ec._Performer_career_start_year(ctx, field, obj)\n\t\tcase \"career_end_year\":\n\t\t\tout.Values[i] = ec._Performer_career_end_year(ctx, field, obj)\n\t\tcase \"tattoos\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_tattoos(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"piercings\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_piercings(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"images\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_images(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"deleted\":\n\t\t\tout.Values[i] = ec._Performer_deleted(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"edits\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_edits(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"scene_count\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_scene_count(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"scenes\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_scenes(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"merged_ids\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_merged_ids(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"merged_into_id\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_merged_into_id(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"studios\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_studios(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"is_favorite\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Performer_is_favorite(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"created\":\n\t\t\tout.Values[i] = ec._Performer_created(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"updated\":\n\t\t\tout.Values[i] = ec._Performer_updated(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar performerAppearanceImplementors = []string{\"PerformerAppearance\"}\n\nfunc (ec *executionContext) _PerformerAppearance(ctx context.Context, sel ast.SelectionSet, obj *PerformerAppearance) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, performerAppearanceImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"PerformerAppearance\")\n\t\tcase \"performer\":\n\t\t\tout.Values[i] = ec._PerformerAppearance_performer(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"as\":\n\t\t\tout.Values[i] = ec._PerformerAppearance_as(ctx, field, obj)\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar performerDraftImplementors = []string{\"PerformerDraft\", \"DraftData\"}\n\nfunc (ec *executionContext) _PerformerDraft(ctx context.Context, sel ast.SelectionSet, obj *PerformerDraft) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, performerDraftImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"PerformerDraft\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._PerformerDraft_id(ctx, field, obj)\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec._PerformerDraft_name(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"disambiguation\":\n\t\t\tout.Values[i] = ec._PerformerDraft_disambiguation(ctx, field, obj)\n\t\tcase \"aliases\":\n\t\t\tout.Values[i] = ec._PerformerDraft_aliases(ctx, field, obj)\n\t\tcase \"gender\":\n\t\t\tout.Values[i] = ec._PerformerDraft_gender(ctx, field, obj)\n\t\tcase \"birthdate\":\n\t\t\tout.Values[i] = ec._PerformerDraft_birthdate(ctx, field, obj)\n\t\tcase \"deathdate\":\n\t\t\tout.Values[i] = ec._PerformerDraft_deathdate(ctx, field, obj)\n\t\tcase \"urls\":\n\t\t\tout.Values[i] = ec._PerformerDraft_urls(ctx, field, obj)\n\t\tcase \"ethnicity\":\n\t\t\tout.Values[i] = ec._PerformerDraft_ethnicity(ctx, field, obj)\n\t\tcase \"country\":\n\t\t\tout.Values[i] = ec._PerformerDraft_country(ctx, field, obj)\n\t\tcase \"eye_color\":\n\t\t\tout.Values[i] = ec._PerformerDraft_eye_color(ctx, field, obj)\n\t\tcase \"hair_color\":\n\t\t\tout.Values[i] = ec._PerformerDraft_hair_color(ctx, field, obj)\n\t\tcase \"height\":\n\t\t\tout.Values[i] = ec._PerformerDraft_height(ctx, field, obj)\n\t\tcase \"measurements\":\n\t\t\tout.Values[i] = ec._PerformerDraft_measurements(ctx, field, obj)\n\t\tcase \"breast_type\":\n\t\t\tout.Values[i] = ec._PerformerDraft_breast_type(ctx, field, obj)\n\t\tcase \"tattoos\":\n\t\t\tout.Values[i] = ec._PerformerDraft_tattoos(ctx, field, obj)\n\t\tcase \"piercings\":\n\t\t\tout.Values[i] = ec._PerformerDraft_piercings(ctx, field, obj)\n\t\tcase \"career_start_year\":\n\t\t\tout.Values[i] = ec._PerformerDraft_career_start_year(ctx, field, obj)\n\t\tcase \"career_end_year\":\n\t\t\tout.Values[i] = ec._PerformerDraft_career_end_year(ctx, field, obj)\n\t\tcase \"image\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._PerformerDraft_image(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar performerEditImplementors = []string{\"PerformerEdit\", \"EditDetails\"}\n\nfunc (ec *executionContext) _PerformerEdit(ctx context.Context, sel ast.SelectionSet, obj *PerformerEdit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, performerEditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"PerformerEdit\")\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec._PerformerEdit_name(ctx, field, obj)\n\t\tcase \"disambiguation\":\n\t\t\tout.Values[i] = ec._PerformerEdit_disambiguation(ctx, field, obj)\n\t\tcase \"added_aliases\":\n\t\t\tout.Values[i] = ec._PerformerEdit_added_aliases(ctx, field, obj)\n\t\tcase \"removed_aliases\":\n\t\t\tout.Values[i] = ec._PerformerEdit_removed_aliases(ctx, field, obj)\n\t\tcase \"gender\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._PerformerEdit_gender(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"added_urls\":\n\t\t\tout.Values[i] = ec._PerformerEdit_added_urls(ctx, field, obj)\n\t\tcase \"removed_urls\":\n\t\t\tout.Values[i] = ec._PerformerEdit_removed_urls(ctx, field, obj)\n\t\tcase \"birthdate\":\n\t\t\tout.Values[i] = ec._PerformerEdit_birthdate(ctx, field, obj)\n\t\tcase \"deathdate\":\n\t\t\tout.Values[i] = ec._PerformerEdit_deathdate(ctx, field, obj)\n\t\tcase \"ethnicity\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._PerformerEdit_ethnicity(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"country\":\n\t\t\tout.Values[i] = ec._PerformerEdit_country(ctx, field, obj)\n\t\tcase \"eye_color\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._PerformerEdit_eye_color(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"hair_color\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._PerformerEdit_hair_color(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"height\":\n\t\t\tout.Values[i] = ec._PerformerEdit_height(ctx, field, obj)\n\t\tcase \"cup_size\":\n\t\t\tout.Values[i] = ec._PerformerEdit_cup_size(ctx, field, obj)\n\t\tcase \"band_size\":\n\t\t\tout.Values[i] = ec._PerformerEdit_band_size(ctx, field, obj)\n\t\tcase \"waist_size\":\n\t\t\tout.Values[i] = ec._PerformerEdit_waist_size(ctx, field, obj)\n\t\tcase \"hip_size\":\n\t\t\tout.Values[i] = ec._PerformerEdit_hip_size(ctx, field, obj)\n\t\tcase \"breast_type\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._PerformerEdit_breast_type(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"career_start_year\":\n\t\t\tout.Values[i] = ec._PerformerEdit_career_start_year(ctx, field, obj)\n\t\tcase \"career_end_year\":\n\t\t\tout.Values[i] = ec._PerformerEdit_career_end_year(ctx, field, obj)\n\t\tcase \"added_tattoos\":\n\t\t\tout.Values[i] = ec._PerformerEdit_added_tattoos(ctx, field, obj)\n\t\tcase \"removed_tattoos\":\n\t\t\tout.Values[i] = ec._PerformerEdit_removed_tattoos(ctx, field, obj)\n\t\tcase \"added_piercings\":\n\t\t\tout.Values[i] = ec._PerformerEdit_added_piercings(ctx, field, obj)\n\t\tcase \"removed_piercings\":\n\t\t\tout.Values[i] = ec._PerformerEdit_removed_piercings(ctx, field, obj)\n\t\tcase \"added_images\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._PerformerEdit_added_images(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"removed_images\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._PerformerEdit_removed_images(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"draft_id\":\n\t\t\tout.Values[i] = ec._PerformerEdit_draft_id(ctx, field, obj)\n\t\tcase \"aliases\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._PerformerEdit_aliases(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"urls\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._PerformerEdit_urls(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"images\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._PerformerEdit_images(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"tattoos\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._PerformerEdit_tattoos(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"piercings\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._PerformerEdit_piercings(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar performerEditOptionsImplementors = []string{\"PerformerEditOptions\"}\n\nfunc (ec *executionContext) _PerformerEditOptions(ctx context.Context, sel ast.SelectionSet, obj *PerformerEditOptions) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, performerEditOptionsImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"PerformerEditOptions\")\n\t\tcase \"set_modify_aliases\":\n\t\t\tout.Values[i] = ec._PerformerEditOptions_set_modify_aliases(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"set_merge_aliases\":\n\t\t\tout.Values[i] = ec._PerformerEditOptions_set_merge_aliases(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar performerSearchFacetsImplementors = []string{\"PerformerSearchFacets\"}\n\nfunc (ec *executionContext) _PerformerSearchFacets(ctx context.Context, sel ast.SelectionSet, obj *PerformerSearchFacets) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, performerSearchFacetsImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"PerformerSearchFacets\")\n\t\tcase \"genders\":\n\t\t\tout.Values[i] = ec._PerformerSearchFacets_genders(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar performerStudioImplementors = []string{\"PerformerStudio\"}\n\nfunc (ec *executionContext) _PerformerStudio(ctx context.Context, sel ast.SelectionSet, obj *PerformerStudio) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, performerStudioImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"PerformerStudio\")\n\t\tcase \"studio\":\n\t\t\tout.Values[i] = ec._PerformerStudio_studio(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"scene_count\":\n\t\t\tout.Values[i] = ec._PerformerStudio_scene_count(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar queryImplementors = []string{\"Query\"}\n\nfunc (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, queryImplementors)\n\tctx = graphql.WithFieldContext(ctx, &graphql.FieldContext{\n\t\tObject: \"Query\",\n\t})\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tinnerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{\n\t\t\tObject: field.Name,\n\t\t\tField:  field,\n\t\t})\n\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Query\")\n\t\tcase \"findPerformer\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_findPerformer(ctx, field)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"queryPerformers\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_queryPerformers(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"findStudio\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_findStudio(ctx, field)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"queryStudios\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_queryStudios(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"findTag\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_findTag(ctx, field)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"findTagOrAlias\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_findTagOrAlias(ctx, field)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"queryTags\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_queryTags(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"findTagCategory\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_findTagCategory(ctx, field)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"queryTagCategories\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_queryTagCategories(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"findScene\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_findScene(ctx, field)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"findScenesBySceneFingerprints\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_findScenesBySceneFingerprints(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"queryScenes\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_queryScenes(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"findSite\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_findSite(ctx, field)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"querySites\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_querySites(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"findEdit\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_findEdit(ctx, field)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"queryEdits\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_queryEdits(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"findUser\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_findUser(ctx, field)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"queryUsers\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_queryUsers(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"me\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_me(ctx, field)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"searchPerformer\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_searchPerformer(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"searchPerformers\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_searchPerformers(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"searchScene\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_searchScene(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"searchScenes\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_searchScenes(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"searchTag\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_searchTag(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"searchStudio\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_searchStudio(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"findDraft\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_findDraft(ctx, field)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"findDrafts\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_findDrafts(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"queryExistingScene\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_queryExistingScene(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"queryExistingPerformer\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_queryExistingPerformer(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"version\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_version(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"getConfig\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_getConfig(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"queryNotifications\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_queryNotifications(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"getUnreadNotificationCount\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_getUnreadNotificationCount(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"queryModAudits\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Query_queryModAudits(ctx, field)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\trrm := func(ctx context.Context) graphql.Marshaler {\n\t\t\t\treturn ec.OperationContext.RootResolverMiddleware(ctx,\n\t\t\t\t\tfunc(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })\n\t\tcase \"__type\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Query___type(ctx, field)\n\t\t\t})\n\t\tcase \"__schema\":\n\t\t\tout.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {\n\t\t\t\treturn ec._Query___schema(ctx, field)\n\t\t\t})\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar queryEditsResultTypeImplementors = []string{\"QueryEditsResultType\"}\n\nfunc (ec *executionContext) _QueryEditsResultType(ctx context.Context, sel ast.SelectionSet, obj *EditQuery) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, queryEditsResultTypeImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"QueryEditsResultType\")\n\t\tcase \"count\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryEditsResultType_count(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"edits\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryEditsResultType_edits(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar queryExistingPerformerResultImplementors = []string{\"QueryExistingPerformerResult\"}\n\nfunc (ec *executionContext) _QueryExistingPerformerResult(ctx context.Context, sel ast.SelectionSet, obj *QueryExistingPerformerResult) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, queryExistingPerformerResultImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"QueryExistingPerformerResult\")\n\t\tcase \"edits\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryExistingPerformerResult_edits(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"performers\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryExistingPerformerResult_performers(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar queryExistingSceneResultImplementors = []string{\"QueryExistingSceneResult\"}\n\nfunc (ec *executionContext) _QueryExistingSceneResult(ctx context.Context, sel ast.SelectionSet, obj *QueryExistingSceneResult) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, queryExistingSceneResultImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"QueryExistingSceneResult\")\n\t\tcase \"edits\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryExistingSceneResult_edits(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"scenes\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryExistingSceneResult_scenes(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar queryModAuditsResultTypeImplementors = []string{\"QueryModAuditsResultType\"}\n\nfunc (ec *executionContext) _QueryModAuditsResultType(ctx context.Context, sel ast.SelectionSet, obj *ModAuditQuery) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, queryModAuditsResultTypeImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"QueryModAuditsResultType\")\n\t\tcase \"count\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryModAuditsResultType_count(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"audits\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryModAuditsResultType_audits(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar queryNotificationsResultImplementors = []string{\"QueryNotificationsResult\"}\n\nfunc (ec *executionContext) _QueryNotificationsResult(ctx context.Context, sel ast.SelectionSet, obj *QueryNotificationsResult) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, queryNotificationsResultImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"QueryNotificationsResult\")\n\t\tcase \"count\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryNotificationsResult_count(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"notifications\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryNotificationsResult_notifications(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar queryPerformersResultTypeImplementors = []string{\"QueryPerformersResultType\"}\n\nfunc (ec *executionContext) _QueryPerformersResultType(ctx context.Context, sel ast.SelectionSet, obj *PerformerQuery) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, queryPerformersResultTypeImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"QueryPerformersResultType\")\n\t\tcase \"count\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryPerformersResultType_count(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"performers\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryPerformersResultType_performers(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"facets\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryPerformersResultType_facets(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar queryScenesResultTypeImplementors = []string{\"QueryScenesResultType\"}\n\nfunc (ec *executionContext) _QueryScenesResultType(ctx context.Context, sel ast.SelectionSet, obj *SceneQuery) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, queryScenesResultTypeImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"QueryScenesResultType\")\n\t\tcase \"count\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryScenesResultType_count(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"scenes\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._QueryScenesResultType_scenes(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar querySitesResultTypeImplementors = []string{\"QuerySitesResultType\"}\n\nfunc (ec *executionContext) _QuerySitesResultType(ctx context.Context, sel ast.SelectionSet, obj *QuerySitesResultType) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, querySitesResultTypeImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"QuerySitesResultType\")\n\t\tcase \"count\":\n\t\t\tout.Values[i] = ec._QuerySitesResultType_count(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"sites\":\n\t\t\tout.Values[i] = ec._QuerySitesResultType_sites(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar queryStudiosResultTypeImplementors = []string{\"QueryStudiosResultType\"}\n\nfunc (ec *executionContext) _QueryStudiosResultType(ctx context.Context, sel ast.SelectionSet, obj *QueryStudiosResultType) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, queryStudiosResultTypeImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"QueryStudiosResultType\")\n\t\tcase \"count\":\n\t\t\tout.Values[i] = ec._QueryStudiosResultType_count(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"studios\":\n\t\t\tout.Values[i] = ec._QueryStudiosResultType_studios(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar queryTagCategoriesResultTypeImplementors = []string{\"QueryTagCategoriesResultType\"}\n\nfunc (ec *executionContext) _QueryTagCategoriesResultType(ctx context.Context, sel ast.SelectionSet, obj *QueryTagCategoriesResultType) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, queryTagCategoriesResultTypeImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"QueryTagCategoriesResultType\")\n\t\tcase \"count\":\n\t\t\tout.Values[i] = ec._QueryTagCategoriesResultType_count(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"tag_categories\":\n\t\t\tout.Values[i] = ec._QueryTagCategoriesResultType_tag_categories(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar queryTagsResultTypeImplementors = []string{\"QueryTagsResultType\"}\n\nfunc (ec *executionContext) _QueryTagsResultType(ctx context.Context, sel ast.SelectionSet, obj *QueryTagsResultType) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, queryTagsResultTypeImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"QueryTagsResultType\")\n\t\tcase \"count\":\n\t\t\tout.Values[i] = ec._QueryTagsResultType_count(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"tags\":\n\t\t\tout.Values[i] = ec._QueryTagsResultType_tags(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar queryUsersResultTypeImplementors = []string{\"QueryUsersResultType\"}\n\nfunc (ec *executionContext) _QueryUsersResultType(ctx context.Context, sel ast.SelectionSet, obj *QueryUsersResultType) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, queryUsersResultTypeImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"QueryUsersResultType\")\n\t\tcase \"count\":\n\t\t\tout.Values[i] = ec._QueryUsersResultType_count(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"users\":\n\t\t\tout.Values[i] = ec._QueryUsersResultType_users(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar sceneImplementors = []string{\"Scene\", \"EditTarget\"}\n\nfunc (ec *executionContext) _Scene(ctx context.Context, sel ast.SelectionSet, obj *Scene) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, sceneImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Scene\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._Scene_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"title\":\n\t\t\tout.Values[i] = ec._Scene_title(ctx, field, obj)\n\t\tcase \"details\":\n\t\t\tout.Values[i] = ec._Scene_details(ctx, field, obj)\n\t\tcase \"date\":\n\t\t\tout.Values[i] = ec._Scene_date(ctx, field, obj)\n\t\tcase \"release_date\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Scene_release_date(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"production_date\":\n\t\t\tout.Values[i] = ec._Scene_production_date(ctx, field, obj)\n\t\tcase \"urls\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Scene_urls(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"studio\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Scene_studio(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"tags\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Scene_tags(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"images\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Scene_images(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"performers\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Scene_performers(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"fingerprints\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Scene_fingerprints(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"duration\":\n\t\t\tout.Values[i] = ec._Scene_duration(ctx, field, obj)\n\t\tcase \"director\":\n\t\t\tout.Values[i] = ec._Scene_director(ctx, field, obj)\n\t\tcase \"code\":\n\t\t\tout.Values[i] = ec._Scene_code(ctx, field, obj)\n\t\tcase \"deleted\":\n\t\t\tout.Values[i] = ec._Scene_deleted(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"edits\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Scene_edits(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"created\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Scene_created(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"updated\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Scene_updated(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar sceneDraftImplementors = []string{\"SceneDraft\", \"DraftData\"}\n\nfunc (ec *executionContext) _SceneDraft(ctx context.Context, sel ast.SelectionSet, obj *SceneDraft) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, sceneDraftImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"SceneDraft\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._SceneDraft_id(ctx, field, obj)\n\t\tcase \"title\":\n\t\t\tout.Values[i] = ec._SceneDraft_title(ctx, field, obj)\n\t\tcase \"code\":\n\t\t\tout.Values[i] = ec._SceneDraft_code(ctx, field, obj)\n\t\tcase \"details\":\n\t\t\tout.Values[i] = ec._SceneDraft_details(ctx, field, obj)\n\t\tcase \"director\":\n\t\t\tout.Values[i] = ec._SceneDraft_director(ctx, field, obj)\n\t\tcase \"urls\":\n\t\t\tout.Values[i] = ec._SceneDraft_urls(ctx, field, obj)\n\t\tcase \"date\":\n\t\t\tout.Values[i] = ec._SceneDraft_date(ctx, field, obj)\n\t\tcase \"production_date\":\n\t\t\tout.Values[i] = ec._SceneDraft_production_date(ctx, field, obj)\n\t\tcase \"studio\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneDraft_studio(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"performers\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneDraft_performers(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"tags\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneDraft_tags(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"image\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneDraft_image(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"fingerprints\":\n\t\t\tout.Values[i] = ec._SceneDraft_fingerprints(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar sceneEditImplementors = []string{\"SceneEdit\", \"EditDetails\"}\n\nfunc (ec *executionContext) _SceneEdit(ctx context.Context, sel ast.SelectionSet, obj *SceneEdit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, sceneEditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"SceneEdit\")\n\t\tcase \"title\":\n\t\t\tout.Values[i] = ec._SceneEdit_title(ctx, field, obj)\n\t\tcase \"details\":\n\t\t\tout.Values[i] = ec._SceneEdit_details(ctx, field, obj)\n\t\tcase \"added_urls\":\n\t\t\tout.Values[i] = ec._SceneEdit_added_urls(ctx, field, obj)\n\t\tcase \"removed_urls\":\n\t\t\tout.Values[i] = ec._SceneEdit_removed_urls(ctx, field, obj)\n\t\tcase \"date\":\n\t\t\tout.Values[i] = ec._SceneEdit_date(ctx, field, obj)\n\t\tcase \"production_date\":\n\t\t\tout.Values[i] = ec._SceneEdit_production_date(ctx, field, obj)\n\t\tcase \"studio\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_studio(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"added_performers\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_added_performers(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"removed_performers\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_removed_performers(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"added_tags\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_added_tags(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"removed_tags\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_removed_tags(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"added_images\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_added_images(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"removed_images\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_removed_images(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"added_fingerprints\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_added_fingerprints(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"removed_fingerprints\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_removed_fingerprints(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"duration\":\n\t\t\tout.Values[i] = ec._SceneEdit_duration(ctx, field, obj)\n\t\tcase \"director\":\n\t\t\tout.Values[i] = ec._SceneEdit_director(ctx, field, obj)\n\t\tcase \"code\":\n\t\t\tout.Values[i] = ec._SceneEdit_code(ctx, field, obj)\n\t\tcase \"draft_id\":\n\t\t\tout.Values[i] = ec._SceneEdit_draft_id(ctx, field, obj)\n\t\tcase \"urls\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_urls(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"performers\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_performers(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"tags\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_tags(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"images\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_images(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"fingerprints\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._SceneEdit_fingerprints(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar siteImplementors = []string{\"Site\"}\n\nfunc (ec *executionContext) _Site(ctx context.Context, sel ast.SelectionSet, obj *Site) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, siteImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Site\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._Site_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec._Site_name(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"description\":\n\t\t\tout.Values[i] = ec._Site_description(ctx, field, obj)\n\t\tcase \"url\":\n\t\t\tout.Values[i] = ec._Site_url(ctx, field, obj)\n\t\tcase \"regex\":\n\t\t\tout.Values[i] = ec._Site_regex(ctx, field, obj)\n\t\tcase \"valid_types\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Site_valid_types(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"icon\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Site_icon(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"created\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Site_created(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"updated\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Site_updated(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar stashBoxConfigImplementors = []string{\"StashBoxConfig\"}\n\nfunc (ec *executionContext) _StashBoxConfig(ctx context.Context, sel ast.SelectionSet, obj *StashBoxConfig) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, stashBoxConfigImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"StashBoxConfig\")\n\t\tcase \"host_url\":\n\t\t\tout.Values[i] = ec._StashBoxConfig_host_url(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"require_invite\":\n\t\t\tout.Values[i] = ec._StashBoxConfig_require_invite(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"require_activation\":\n\t\t\tout.Values[i] = ec._StashBoxConfig_require_activation(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"vote_promotion_threshold\":\n\t\t\tout.Values[i] = ec._StashBoxConfig_vote_promotion_threshold(ctx, field, obj)\n\t\tcase \"vote_application_threshold\":\n\t\t\tout.Values[i] = ec._StashBoxConfig_vote_application_threshold(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"voting_period\":\n\t\t\tout.Values[i] = ec._StashBoxConfig_voting_period(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"min_destructive_voting_period\":\n\t\t\tout.Values[i] = ec._StashBoxConfig_min_destructive_voting_period(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"vote_cron_interval\":\n\t\t\tout.Values[i] = ec._StashBoxConfig_vote_cron_interval(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"guidelines_url\":\n\t\t\tout.Values[i] = ec._StashBoxConfig_guidelines_url(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"require_scene_draft\":\n\t\t\tout.Values[i] = ec._StashBoxConfig_require_scene_draft(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"edit_update_limit\":\n\t\t\tout.Values[i] = ec._StashBoxConfig_edit_update_limit(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"require_tag_role\":\n\t\t\tout.Values[i] = ec._StashBoxConfig_require_tag_role(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar studioImplementors = []string{\"Studio\", \"EditTarget\", \"SceneDraftStudio\"}\n\nfunc (ec *executionContext) _Studio(ctx context.Context, sel ast.SelectionSet, obj *Studio) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, studioImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Studio\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._Studio_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec._Studio_name(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"aliases\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Studio_aliases(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"urls\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Studio_urls(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"parent\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Studio_parent(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"child_studios\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Studio_child_studios(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"sub_studios\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Studio_sub_studios(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"images\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Studio_images(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"deleted\":\n\t\t\tout.Values[i] = ec._Studio_deleted(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"is_favorite\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Studio_is_favorite(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"created\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Studio_created(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"updated\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Studio_updated(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"performers\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Studio_performers(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar studioEditImplementors = []string{\"StudioEdit\", \"EditDetails\"}\n\nfunc (ec *executionContext) _StudioEdit(ctx context.Context, sel ast.SelectionSet, obj *StudioEdit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, studioEditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"StudioEdit\")\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec._StudioEdit_name(ctx, field, obj)\n\t\tcase \"added_urls\":\n\t\t\tout.Values[i] = ec._StudioEdit_added_urls(ctx, field, obj)\n\t\tcase \"removed_urls\":\n\t\t\tout.Values[i] = ec._StudioEdit_removed_urls(ctx, field, obj)\n\t\tcase \"parent\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._StudioEdit_parent(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"added_images\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._StudioEdit_added_images(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"removed_images\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._StudioEdit_removed_images(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"added_aliases\":\n\t\t\tout.Values[i] = ec._StudioEdit_added_aliases(ctx, field, obj)\n\t\tcase \"removed_aliases\":\n\t\t\tout.Values[i] = ec._StudioEdit_removed_aliases(ctx, field, obj)\n\t\tcase \"images\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._StudioEdit_images(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"urls\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._StudioEdit_urls(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar tagImplementors = []string{\"Tag\", \"EditTarget\", \"SceneDraftTag\"}\n\nfunc (ec *executionContext) _Tag(ctx context.Context, sel ast.SelectionSet, obj *Tag) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, tagImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Tag\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._Tag_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec._Tag_name(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"description\":\n\t\t\tout.Values[i] = ec._Tag_description(ctx, field, obj)\n\t\tcase \"aliases\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Tag_aliases(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"deleted\":\n\t\t\tout.Values[i] = ec._Tag_deleted(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"edits\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Tag_edits(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"category\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._Tag_category(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"created\":\n\t\t\tout.Values[i] = ec._Tag_created(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"updated\":\n\t\t\tout.Values[i] = ec._Tag_updated(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar tagCategoryImplementors = []string{\"TagCategory\"}\n\nfunc (ec *executionContext) _TagCategory(ctx context.Context, sel ast.SelectionSet, obj *TagCategory) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, tagCategoryImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"TagCategory\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._TagCategory_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec._TagCategory_name(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"group\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._TagCategory_group(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"description\":\n\t\t\tout.Values[i] = ec._TagCategory_description(ctx, field, obj)\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar tagEditImplementors = []string{\"TagEdit\", \"EditDetails\"}\n\nfunc (ec *executionContext) _TagEdit(ctx context.Context, sel ast.SelectionSet, obj *TagEdit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, tagEditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"TagEdit\")\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec._TagEdit_name(ctx, field, obj)\n\t\tcase \"description\":\n\t\t\tout.Values[i] = ec._TagEdit_description(ctx, field, obj)\n\t\tcase \"added_aliases\":\n\t\t\tout.Values[i] = ec._TagEdit_added_aliases(ctx, field, obj)\n\t\tcase \"removed_aliases\":\n\t\t\tout.Values[i] = ec._TagEdit_removed_aliases(ctx, field, obj)\n\t\tcase \"category\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._TagEdit_category(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"aliases\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._TagEdit_aliases(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar uRLImplementors = []string{\"URL\"}\n\nfunc (ec *executionContext) _URL(ctx context.Context, sel ast.SelectionSet, obj *URL) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, uRLImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"URL\")\n\t\tcase \"url\":\n\t\t\tout.Values[i] = ec._URL_url(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"type\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._URL_type(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"site\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._URL_site(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar updatedEditImplementors = []string{\"UpdatedEdit\", \"NotificationData\"}\n\nfunc (ec *executionContext) _UpdatedEdit(ctx context.Context, sel ast.SelectionSet, obj *UpdatedEdit) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, updatedEditImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"UpdatedEdit\")\n\t\tcase \"edit\":\n\t\t\tout.Values[i] = ec._UpdatedEdit_edit(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar userImplementors = []string{\"User\"}\n\nfunc (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj *User) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, userImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"User\")\n\t\tcase \"id\":\n\t\t\tout.Values[i] = ec._User_id(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec._User_name(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"roles\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._User_roles(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"email\":\n\t\t\tout.Values[i] = ec._User_email(ctx, field, obj)\n\t\tcase \"api_key\":\n\t\t\tout.Values[i] = ec._User_api_key(ctx, field, obj)\n\t\tcase \"notification_subscriptions\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._User_notification_subscriptions(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"vote_count\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._User_vote_count(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"edit_count\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._User_edit_count(ctx, field, obj)\n\t\t\t\tif res == graphql.Null {\n\t\t\t\t\tatomic.AddUint32(&fs.Invalids, 1)\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"api_calls\":\n\t\t\tout.Values[i] = ec._User_api_calls(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tatomic.AddUint32(&out.Invalids, 1)\n\t\t\t}\n\t\tcase \"invited_by\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._User_invited_by(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"invite_tokens\":\n\t\t\tout.Values[i] = ec._User_invite_tokens(ctx, field, obj)\n\t\tcase \"active_invite_codes\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._User_active_invite_codes(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tcase \"invite_codes\":\n\t\t\tfield := field\n\n\t\t\tinnerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tec.Error(ctx, ec.Recover(ctx, r))\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tres = ec._User_invite_codes(ctx, field, obj)\n\t\t\t\treturn res\n\t\t\t}\n\n\t\t\tif field.Deferrable != nil {\n\t\t\t\tdfs, ok := deferred[field.Deferrable.Label]\n\t\t\t\tdi := 0\n\t\t\t\tif ok {\n\t\t\t\t\tdfs.AddField(field)\n\t\t\t\t\tdi = len(dfs.Values) - 1\n\t\t\t\t} else {\n\t\t\t\t\tdfs = graphql.NewFieldSet([]graphql.CollectedField{field})\n\t\t\t\t\tdeferred[field.Deferrable.Label] = dfs\n\t\t\t\t}\n\t\t\t\tdfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {\n\t\t\t\t\treturn innerFunc(ctx, dfs)\n\t\t\t\t})\n\n\t\t\t\t// don't run the out.Concurrently() call below\n\t\t\t\tout.Values[i] = graphql.Null\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tout.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar userEditCountImplementors = []string{\"UserEditCount\"}\n\nfunc (ec *executionContext) _UserEditCount(ctx context.Context, sel ast.SelectionSet, obj *UserEditCount) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, userEditCountImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"UserEditCount\")\n\t\tcase \"accepted\":\n\t\t\tout.Values[i] = ec._UserEditCount_accepted(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"rejected\":\n\t\t\tout.Values[i] = ec._UserEditCount_rejected(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"pending\":\n\t\t\tout.Values[i] = ec._UserEditCount_pending(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"immediate_accepted\":\n\t\t\tout.Values[i] = ec._UserEditCount_immediate_accepted(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"immediate_rejected\":\n\t\t\tout.Values[i] = ec._UserEditCount_immediate_rejected(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"failed\":\n\t\t\tout.Values[i] = ec._UserEditCount_failed(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"canceled\":\n\t\t\tout.Values[i] = ec._UserEditCount_canceled(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar userVoteCountImplementors = []string{\"UserVoteCount\"}\n\nfunc (ec *executionContext) _UserVoteCount(ctx context.Context, sel ast.SelectionSet, obj *UserVoteCount) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, userVoteCountImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"UserVoteCount\")\n\t\tcase \"abstain\":\n\t\t\tout.Values[i] = ec._UserVoteCount_abstain(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"accept\":\n\t\t\tout.Values[i] = ec._UserVoteCount_accept(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"reject\":\n\t\t\tout.Values[i] = ec._UserVoteCount_reject(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"immediate_accept\":\n\t\t\tout.Values[i] = ec._UserVoteCount_immediate_accept(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"immediate_reject\":\n\t\t\tout.Values[i] = ec._UserVoteCount_immediate_reject(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar versionImplementors = []string{\"Version\"}\n\nfunc (ec *executionContext) _Version(ctx context.Context, sel ast.SelectionSet, obj *Version) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, versionImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"Version\")\n\t\tcase \"hash\":\n\t\t\tout.Values[i] = ec._Version_hash(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"build_time\":\n\t\t\tout.Values[i] = ec._Version_build_time(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"build_type\":\n\t\t\tout.Values[i] = ec._Version_build_type(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"version\":\n\t\t\tout.Values[i] = ec._Version_version(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar __DirectiveImplementors = []string{\"__Directive\"}\n\nfunc (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, __DirectiveImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"__Directive\")\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec.___Directive_name(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"description\":\n\t\t\tout.Values[i] = ec.___Directive_description(ctx, field, obj)\n\t\tcase \"isRepeatable\":\n\t\t\tout.Values[i] = ec.___Directive_isRepeatable(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"locations\":\n\t\t\tout.Values[i] = ec.___Directive_locations(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"args\":\n\t\t\tout.Values[i] = ec.___Directive_args(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar __EnumValueImplementors = []string{\"__EnumValue\"}\n\nfunc (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, __EnumValueImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"__EnumValue\")\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec.___EnumValue_name(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"description\":\n\t\t\tout.Values[i] = ec.___EnumValue_description(ctx, field, obj)\n\t\tcase \"isDeprecated\":\n\t\t\tout.Values[i] = ec.___EnumValue_isDeprecated(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"deprecationReason\":\n\t\t\tout.Values[i] = ec.___EnumValue_deprecationReason(ctx, field, obj)\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar __FieldImplementors = []string{\"__Field\"}\n\nfunc (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, __FieldImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"__Field\")\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec.___Field_name(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"description\":\n\t\t\tout.Values[i] = ec.___Field_description(ctx, field, obj)\n\t\tcase \"args\":\n\t\t\tout.Values[i] = ec.___Field_args(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"type\":\n\t\t\tout.Values[i] = ec.___Field_type(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"isDeprecated\":\n\t\t\tout.Values[i] = ec.___Field_isDeprecated(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"deprecationReason\":\n\t\t\tout.Values[i] = ec.___Field_deprecationReason(ctx, field, obj)\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar __InputValueImplementors = []string{\"__InputValue\"}\n\nfunc (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, __InputValueImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"__InputValue\")\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec.___InputValue_name(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"description\":\n\t\t\tout.Values[i] = ec.___InputValue_description(ctx, field, obj)\n\t\tcase \"type\":\n\t\t\tout.Values[i] = ec.___InputValue_type(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"defaultValue\":\n\t\t\tout.Values[i] = ec.___InputValue_defaultValue(ctx, field, obj)\n\t\tcase \"isDeprecated\":\n\t\t\tout.Values[i] = ec.___InputValue_isDeprecated(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"deprecationReason\":\n\t\t\tout.Values[i] = ec.___InputValue_deprecationReason(ctx, field, obj)\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar __SchemaImplementors = []string{\"__Schema\"}\n\nfunc (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, __SchemaImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"__Schema\")\n\t\tcase \"description\":\n\t\t\tout.Values[i] = ec.___Schema_description(ctx, field, obj)\n\t\tcase \"types\":\n\t\t\tout.Values[i] = ec.___Schema_types(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"queryType\":\n\t\t\tout.Values[i] = ec.___Schema_queryType(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"mutationType\":\n\t\t\tout.Values[i] = ec.___Schema_mutationType(ctx, field, obj)\n\t\tcase \"subscriptionType\":\n\t\t\tout.Values[i] = ec.___Schema_subscriptionType(ctx, field, obj)\n\t\tcase \"directives\":\n\t\t\tout.Values[i] = ec.___Schema_directives(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\nvar __TypeImplementors = []string{\"__Type\"}\n\nfunc (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.OperationContext, sel, __TypeImplementors)\n\n\tout := graphql.NewFieldSet(fields)\n\tdeferred := make(map[string]*graphql.FieldSet)\n\tfor i, field := range fields {\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString(\"__Type\")\n\t\tcase \"kind\":\n\t\t\tout.Values[i] = ec.___Type_kind(ctx, field, obj)\n\t\t\tif out.Values[i] == graphql.Null {\n\t\t\t\tout.Invalids++\n\t\t\t}\n\t\tcase \"name\":\n\t\t\tout.Values[i] = ec.___Type_name(ctx, field, obj)\n\t\tcase \"description\":\n\t\t\tout.Values[i] = ec.___Type_description(ctx, field, obj)\n\t\tcase \"specifiedByURL\":\n\t\t\tout.Values[i] = ec.___Type_specifiedByURL(ctx, field, obj)\n\t\tcase \"fields\":\n\t\t\tout.Values[i] = ec.___Type_fields(ctx, field, obj)\n\t\tcase \"interfaces\":\n\t\t\tout.Values[i] = ec.___Type_interfaces(ctx, field, obj)\n\t\tcase \"possibleTypes\":\n\t\t\tout.Values[i] = ec.___Type_possibleTypes(ctx, field, obj)\n\t\tcase \"enumValues\":\n\t\t\tout.Values[i] = ec.___Type_enumValues(ctx, field, obj)\n\t\tcase \"inputFields\":\n\t\t\tout.Values[i] = ec.___Type_inputFields(ctx, field, obj)\n\t\tcase \"ofType\":\n\t\t\tout.Values[i] = ec.___Type_ofType(ctx, field, obj)\n\t\tcase \"isOneOf\":\n\t\t\tout.Values[i] = ec.___Type_isOneOf(ctx, field, obj)\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\tout.Dispatch(ctx)\n\tif out.Invalids > 0 {\n\t\treturn graphql.Null\n\t}\n\n\tatomic.AddInt32(&ec.Deferred, int32(len(deferred)))\n\n\tfor label, dfs := range deferred {\n\t\tec.ProcessDeferredGroup(graphql.DeferredGroup{\n\t\t\tLabel:    label,\n\t\t\tPath:     graphql.GetPath(ctx),\n\t\t\tFieldSet: dfs,\n\t\t\tContext:  ctx,\n\t\t})\n\t}\n\n\treturn out\n}\n\n// endregion **************************** object.gotpl ****************************\n\n// region    ***************************** type.gotpl *****************************\n\nfunc (ec *executionContext) unmarshalNActivateNewUserInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐActivateNewUserInput(ctx context.Context, v any) (ActivateNewUserInput, error) {\n\tres, err := ec.unmarshalInputActivateNewUserInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNAmendEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐAmendEditInput(ctx context.Context, v any) (AmendEditInput, error) {\n\tres, err := ec.unmarshalInputAmendEditInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNAmendItemRemoval2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐAmendItemRemoval(ctx context.Context, v any) (AmendItemRemoval, error) {\n\tres, err := ec.unmarshalInputAmendItemRemoval(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNApplyEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐApplyEditInput(ctx context.Context, v any) (ApplyEditInput, error) {\n\tres, err := ec.unmarshalInputApplyEditInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNBodyModification2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModification(ctx context.Context, sel ast.SelectionSet, v BodyModification) graphql.Marshaler {\n\treturn ec._BodyModification(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNBodyModification2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationᚄ(ctx context.Context, sel ast.SelectionSet, v []BodyModification) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNBodyModification2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModification(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalNBodyModificationInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationInput(ctx context.Context, v any) (BodyModificationInput, error) {\n\tres, err := ec.unmarshalInputBodyModificationInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNBoolean2bool(ctx context.Context, v any) (bool, error) {\n\tres, err := graphql.UnmarshalBoolean(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler {\n\t_ = sel\n\tres := graphql.MarshalBoolean(v)\n\tif res == graphql.Null {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalNCancelEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCancelEditInput(ctx context.Context, v any) (CancelEditInput, error) {\n\tres, err := ec.unmarshalInputCancelEditInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNCriterionModifier2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCriterionModifier(ctx context.Context, v any) (CriterionModifier, error) {\n\tvar res CriterionModifier\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNCriterionModifier2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐCriterionModifier(ctx context.Context, sel ast.SelectionSet, v CriterionModifier) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNDate2string(ctx context.Context, v any) (string, error) {\n\tres, err := graphql.UnmarshalString(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNDate2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler {\n\t_ = sel\n\tres := graphql.MarshalString(v)\n\tif res == graphql.Null {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalNDateAccuracyEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDateAccuracyEnum(ctx context.Context, v any) (DateAccuracyEnum, error) {\n\tvar res DateAccuracyEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNDateAccuracyEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDateAccuracyEnum(ctx context.Context, sel ast.SelectionSet, v DateAccuracyEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNDeleteEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDeleteEditInput(ctx context.Context, v any) (DeleteEditInput, error) {\n\tres, err := ec.unmarshalInputDeleteEditInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNDeleteFingerprintSubmissionsInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDeleteFingerprintSubmissionsInput(ctx context.Context, v any) (DeleteFingerprintSubmissionsInput, error) {\n\tres, err := ec.unmarshalInputDeleteFingerprintSubmissionsInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNDraft2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraft(ctx context.Context, sel ast.SelectionSet, v Draft) graphql.Marshaler {\n\treturn ec._Draft(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNDraft2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftᚄ(ctx context.Context, sel ast.SelectionSet, v []Draft) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNDraft2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraft(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNDraftData2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftData(ctx context.Context, sel ast.SelectionSet, v DraftData) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._DraftData(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNDraftEntityInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftEntityInput(ctx context.Context, v any) (DraftEntityInput, error) {\n\tres, err := ec.unmarshalInputDraftEntityInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNDraftEntityInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftEntityInputᚄ(ctx context.Context, v any) ([]DraftEntityInput, error) {\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]DraftEntityInput, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNDraftEntityInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftEntityInput(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) marshalNDraftFingerprint2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftFingerprint(ctx context.Context, sel ast.SelectionSet, v DraftFingerprint) graphql.Marshaler {\n\treturn ec._DraftFingerprint(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNDraftFingerprint2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftFingerprintᚄ(ctx context.Context, sel ast.SelectionSet, v []DraftFingerprint) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNDraftFingerprint2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftFingerprint(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNDraftSubmissionStatus2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftSubmissionStatus(ctx context.Context, sel ast.SelectionSet, v DraftSubmissionStatus) graphql.Marshaler {\n\treturn ec._DraftSubmissionStatus(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNDraftSubmissionStatus2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftSubmissionStatus(ctx context.Context, sel ast.SelectionSet, v *DraftSubmissionStatus) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._DraftSubmissionStatus(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNEdit2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit(ctx context.Context, sel ast.SelectionSet, v Edit) graphql.Marshaler {\n\treturn ec._Edit(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNEdit2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditᚄ(ctx context.Context, sel ast.SelectionSet, v []Edit) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNEdit2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit(ctx context.Context, sel ast.SelectionSet, v *Edit) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._Edit(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNEditComment2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditComment(ctx context.Context, sel ast.SelectionSet, v EditComment) graphql.Marshaler {\n\treturn ec._EditComment(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNEditComment2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditCommentᚄ(ctx context.Context, sel ast.SelectionSet, v []EditComment) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNEditComment2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditComment(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNEditComment2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditComment(ctx context.Context, sel ast.SelectionSet, v *EditComment) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._EditComment(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNEditCommentInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditCommentInput(ctx context.Context, v any) (EditCommentInput, error) {\n\tres, err := ec.unmarshalInputEditCommentInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNEditInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditInput(ctx context.Context, v any) (*EditInput, error) {\n\tres, err := ec.unmarshalInputEditInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNEditQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditQueryInput(ctx context.Context, v any) (EditQueryInput, error) {\n\tres, err := ec.unmarshalInputEditQueryInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNEditSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditSortEnum(ctx context.Context, v any) (EditSortEnum, error) {\n\tvar res EditSortEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNEditSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditSortEnum(ctx context.Context, sel ast.SelectionSet, v EditSortEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) marshalNEditTarget2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditTarget(ctx context.Context, sel ast.SelectionSet, v EditTarget) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._EditTarget(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNEditTarget2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditTargetᚄ(ctx context.Context, sel ast.SelectionSet, v []EditTarget) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNEditTarget2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditTarget(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNEditVote2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditVote(ctx context.Context, sel ast.SelectionSet, v EditVote) graphql.Marshaler {\n\treturn ec._EditVote(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNEditVote2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditVoteᚄ(ctx context.Context, sel ast.SelectionSet, v []EditVote) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNEditVote2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditVote(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalNEditVoteInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditVoteInput(ctx context.Context, v any) (EditVoteInput, error) {\n\tres, err := ec.unmarshalInputEditVoteInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNFingerprint2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprint(ctx context.Context, sel ast.SelectionSet, v Fingerprint) graphql.Marshaler {\n\treturn ec._Fingerprint(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNFingerprint2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintᚄ(ctx context.Context, sel ast.SelectionSet, v []Fingerprint) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNFingerprint2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprint(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalNFingerprintAlgorithm2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintAlgorithm(ctx context.Context, v any) (FingerprintAlgorithm, error) {\n\tvar res FingerprintAlgorithm\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNFingerprintAlgorithm2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintAlgorithm(ctx context.Context, sel ast.SelectionSet, v FingerprintAlgorithm) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNFingerprintBatchSubmission2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintBatchSubmission(ctx context.Context, v any) (FingerprintBatchSubmission, error) {\n\tres, err := ec.unmarshalInputFingerprintBatchSubmission(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNFingerprintBatchSubmission2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintBatchSubmissionᚄ(ctx context.Context, v any) ([]FingerprintBatchSubmission, error) {\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]FingerprintBatchSubmission, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNFingerprintBatchSubmission2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintBatchSubmission(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) unmarshalNFingerprintEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintEditInput(ctx context.Context, v any) (FingerprintEditInput, error) {\n\tres, err := ec.unmarshalInputFingerprintEditInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNFingerprintEditInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintEditInputᚄ(ctx context.Context, v any) ([]FingerprintEditInput, error) {\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]FingerprintEditInput, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNFingerprintEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintEditInput(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) unmarshalNFingerprintHash2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintHash(ctx context.Context, v any) (FingerprintHash, error) {\n\tres, err := UnmarshalFingerprintHash(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNFingerprintHash2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintHash(ctx context.Context, sel ast.SelectionSet, v FingerprintHash) graphql.Marshaler {\n\t_ = sel\n\tres := MarshalFingerprintHash(v)\n\tif res == graphql.Null {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalNFingerprintInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintInput(ctx context.Context, v any) (FingerprintInput, error) {\n\tres, err := ec.unmarshalInputFingerprintInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNFingerprintInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintInputᚄ(ctx context.Context, v any) ([]FingerprintInput, error) {\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]FingerprintInput, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNFingerprintInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintInput(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) unmarshalNFingerprintInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintInput(ctx context.Context, v any) (*FingerprintInput, error) {\n\tres, err := ec.unmarshalInputFingerprintInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNFingerprintQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintQueryInput(ctx context.Context, v any) (FingerprintQueryInput, error) {\n\tres, err := ec.unmarshalInputFingerprintQueryInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNFingerprintQueryInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintQueryInputᚄ(ctx context.Context, v any) ([]FingerprintQueryInput, error) {\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]FingerprintQueryInput, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNFingerprintQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintQueryInput(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) unmarshalNFingerprintQueryInput2ᚕᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintQueryInputᚄ(ctx context.Context, v any) ([][]FingerprintQueryInput, error) {\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([][]FingerprintQueryInput, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNFingerprintQueryInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintQueryInputᚄ(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) unmarshalNFingerprintSubmission2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintSubmission(ctx context.Context, v any) (FingerprintSubmission, error) {\n\tres, err := ec.unmarshalInputFingerprintSubmission(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNFingerprintSubmissionResult2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintSubmissionResult(ctx context.Context, sel ast.SelectionSet, v FingerprintSubmissionResult) graphql.Marshaler {\n\treturn ec._FingerprintSubmissionResult(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNFingerprintSubmissionResult2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintSubmissionResultᚄ(ctx context.Context, sel ast.SelectionSet, v []FingerprintSubmissionResult) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNFingerprintSubmissionResult2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintSubmissionResult(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalNGenderEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderEnum(ctx context.Context, v any) (GenderEnum, error) {\n\tvar res GenderEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNGenderEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderEnum(ctx context.Context, sel ast.SelectionSet, v GenderEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) marshalNGenderFacet2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderFacet(ctx context.Context, sel ast.SelectionSet, v GenderFacet) graphql.Marshaler {\n\treturn ec._GenderFacet(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNGenderFacet2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderFacetᚄ(ctx context.Context, sel ast.SelectionSet, v []GenderFacet) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNGenderFacet2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderFacet(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalNGrantInviteInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGrantInviteInput(ctx context.Context, v any) (GrantInviteInput, error) {\n\tres, err := ec.unmarshalInputGrantInviteInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx context.Context, v any) (uuid.UUID, error) {\n\tres, err := UnmarshalID(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx context.Context, sel ast.SelectionSet, v uuid.UUID) graphql.Marshaler {\n\t_ = sel\n\tres := MarshalID(v)\n\tif res == graphql.Null {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalNID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx context.Context, v any) ([]uuid.UUID, error) {\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]uuid.UUID, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) marshalNID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx context.Context, sel ast.SelectionSet, v []uuid.UUID) graphql.Marshaler {\n\tret := make(graphql.Array, len(v))\n\tfor i := range v {\n\t\tret[i] = ec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, sel, v[i])\n\t}\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNImage2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImage(ctx context.Context, sel ast.SelectionSet, v Image) graphql.Marshaler {\n\treturn ec._Image(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ(ctx context.Context, sel ast.SelectionSet, v []Image) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNImage2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImage(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalNImageCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageCreateInput(ctx context.Context, v any) (ImageCreateInput, error) {\n\tres, err := ec.unmarshalInputImageCreateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNImageDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageDestroyInput(ctx context.Context, v any) (ImageDestroyInput, error) {\n\tres, err := ec.unmarshalInputImageDestroyInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNInt2int(ctx context.Context, v any) (int, error) {\n\tres, err := graphql.UnmarshalInt(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNInt2int(ctx context.Context, sel ast.SelectionSet, v int) graphql.Marshaler {\n\t_ = sel\n\tres := graphql.MarshalInt(v)\n\tif res == graphql.Null {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalNInt2ᚕintᚄ(ctx context.Context, v any) ([]int, error) {\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]int, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNInt2int(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) marshalNInt2ᚕintᚄ(ctx context.Context, sel ast.SelectionSet, v []int) graphql.Marshaler {\n\tret := make(graphql.Array, len(v))\n\tfor i := range v {\n\t\tret[i] = ec.marshalNInt2int(ctx, sel, v[i])\n\t}\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNInviteKey2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐInviteKey(ctx context.Context, sel ast.SelectionSet, v InviteKey) graphql.Marshaler {\n\treturn ec._InviteKey(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNMeasurements2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMeasurements(ctx context.Context, sel ast.SelectionSet, v Measurements) graphql.Marshaler {\n\treturn ec._Measurements(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNMeasurements2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMeasurements(ctx context.Context, sel ast.SelectionSet, v *Measurements) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._Measurements(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNModAudit2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAudit(ctx context.Context, sel ast.SelectionSet, v ModAudit) graphql.Marshaler {\n\treturn ec._ModAudit(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNModAudit2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAuditᚄ(ctx context.Context, sel ast.SelectionSet, v []ModAudit) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNModAudit2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAudit(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalNModAuditActionEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAuditActionEnum(ctx context.Context, v any) (ModAuditActionEnum, error) {\n\tvar res ModAuditActionEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNModAuditActionEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAuditActionEnum(ctx context.Context, sel ast.SelectionSet, v ModAuditActionEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNModAuditQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAuditQueryInput(ctx context.Context, v any) (ModAuditQueryInput, error) {\n\tres, err := ec.unmarshalInputModAuditQueryInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNMoveFingerprintSubmissionsInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMoveFingerprintSubmissionsInput(ctx context.Context, v any) (MoveFingerprintSubmissionsInput, error) {\n\tres, err := ec.unmarshalInputMoveFingerprintSubmissionsInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNNewUserInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNewUserInput(ctx context.Context, v any) (NewUserInput, error) {\n\tres, err := ec.unmarshalInputNewUserInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNNotification2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotification(ctx context.Context, sel ast.SelectionSet, v Notification) graphql.Marshaler {\n\treturn ec._Notification(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNNotification2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationᚄ(ctx context.Context, sel ast.SelectionSet, v []Notification) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNNotification2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotification(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNNotificationData2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationData(ctx context.Context, sel ast.SelectionSet, v NotificationData) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._NotificationData(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNNotificationEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationEnum(ctx context.Context, v any) (NotificationEnum, error) {\n\tvar res NotificationEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNNotificationEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationEnum(ctx context.Context, sel ast.SelectionSet, v NotificationEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNNotificationEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationEnumᚄ(ctx context.Context, v any) ([]NotificationEnum, error) {\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]NotificationEnum, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNNotificationEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationEnum(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) marshalNNotificationEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationEnumᚄ(ctx context.Context, sel ast.SelectionSet, v []NotificationEnum) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNNotificationEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationEnum(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalNOperationEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐOperationEnum(ctx context.Context, v any) (OperationEnum, error) {\n\tvar res OperationEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNOperationEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐOperationEnum(ctx context.Context, sel ast.SelectionSet, v OperationEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) marshalNPerformer2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformer(ctx context.Context, sel ast.SelectionSet, v Performer) graphql.Marshaler {\n\treturn ec._Performer(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNPerformer2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerᚄ(ctx context.Context, sel ast.SelectionSet, v []Performer) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNPerformer2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformer(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNPerformer2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformer(ctx context.Context, sel ast.SelectionSet, v *Performer) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._Performer(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNPerformerAppearance2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearance(ctx context.Context, sel ast.SelectionSet, v PerformerAppearance) graphql.Marshaler {\n\treturn ec._PerformerAppearance(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNPerformerAppearance2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearanceᚄ(ctx context.Context, sel ast.SelectionSet, v []PerformerAppearance) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNPerformerAppearance2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearance(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalNPerformerAppearanceInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearanceInput(ctx context.Context, v any) (PerformerAppearanceInput, error) {\n\tres, err := ec.unmarshalInputPerformerAppearanceInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNPerformerCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerCreateInput(ctx context.Context, v any) (PerformerCreateInput, error) {\n\tres, err := ec.unmarshalInputPerformerCreateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNPerformerDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerDestroyInput(ctx context.Context, v any) (PerformerDestroyInput, error) {\n\tres, err := ec.unmarshalInputPerformerDestroyInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNPerformerDraftInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerDraftInput(ctx context.Context, v any) (PerformerDraftInput, error) {\n\tres, err := ec.unmarshalInputPerformerDraftInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNPerformerEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerEditInput(ctx context.Context, v any) (PerformerEditInput, error) {\n\tres, err := ec.unmarshalInputPerformerEditInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNPerformerQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerQueryInput(ctx context.Context, v any) (PerformerQueryInput, error) {\n\tres, err := ec.unmarshalInputPerformerQueryInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNPerformerSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerSortEnum(ctx context.Context, v any) (PerformerSortEnum, error) {\n\tvar res PerformerSortEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNPerformerSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerSortEnum(ctx context.Context, sel ast.SelectionSet, v PerformerSortEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) marshalNPerformerStudio2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerStudio(ctx context.Context, sel ast.SelectionSet, v PerformerStudio) graphql.Marshaler {\n\treturn ec._PerformerStudio(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNPerformerStudio2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerStudioᚄ(ctx context.Context, sel ast.SelectionSet, v []PerformerStudio) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNPerformerStudio2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerStudio(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalNPerformerUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerUpdateInput(ctx context.Context, v any) (PerformerUpdateInput, error) {\n\tres, err := ec.unmarshalInputPerformerUpdateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNQueryEditsResultType2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditQuery(ctx context.Context, sel ast.SelectionSet, v EditQuery) graphql.Marshaler {\n\treturn ec._QueryEditsResultType(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNQueryEditsResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditQuery(ctx context.Context, sel ast.SelectionSet, v *EditQuery) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._QueryEditsResultType(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNQueryExistingPerformerInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryExistingPerformerInput(ctx context.Context, v any) (QueryExistingPerformerInput, error) {\n\tres, err := ec.unmarshalInputQueryExistingPerformerInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNQueryExistingPerformerResult2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryExistingPerformerResult(ctx context.Context, sel ast.SelectionSet, v QueryExistingPerformerResult) graphql.Marshaler {\n\treturn ec._QueryExistingPerformerResult(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNQueryExistingPerformerResult2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryExistingPerformerResult(ctx context.Context, sel ast.SelectionSet, v *QueryExistingPerformerResult) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._QueryExistingPerformerResult(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNQueryExistingSceneInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryExistingSceneInput(ctx context.Context, v any) (QueryExistingSceneInput, error) {\n\tres, err := ec.unmarshalInputQueryExistingSceneInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNQueryExistingSceneResult2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryExistingSceneResult(ctx context.Context, sel ast.SelectionSet, v QueryExistingSceneResult) graphql.Marshaler {\n\treturn ec._QueryExistingSceneResult(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNQueryExistingSceneResult2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryExistingSceneResult(ctx context.Context, sel ast.SelectionSet, v *QueryExistingSceneResult) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._QueryExistingSceneResult(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNQueryModAuditsResultType2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAuditQuery(ctx context.Context, sel ast.SelectionSet, v ModAuditQuery) graphql.Marshaler {\n\treturn ec._QueryModAuditsResultType(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNQueryModAuditsResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAuditQuery(ctx context.Context, sel ast.SelectionSet, v *ModAuditQuery) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._QueryModAuditsResultType(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNQueryNotificationsInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryNotificationsInput(ctx context.Context, v any) (QueryNotificationsInput, error) {\n\tres, err := ec.unmarshalInputQueryNotificationsInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNQueryNotificationsResult2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryNotificationsResult(ctx context.Context, sel ast.SelectionSet, v QueryNotificationsResult) graphql.Marshaler {\n\treturn ec._QueryNotificationsResult(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNQueryNotificationsResult2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryNotificationsResult(ctx context.Context, sel ast.SelectionSet, v *QueryNotificationsResult) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._QueryNotificationsResult(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNQueryPerformersResultType2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerQuery(ctx context.Context, sel ast.SelectionSet, v PerformerQuery) graphql.Marshaler {\n\treturn ec._QueryPerformersResultType(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNQueryPerformersResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerQuery(ctx context.Context, sel ast.SelectionSet, v *PerformerQuery) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._QueryPerformersResultType(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNQueryScenesResultType2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneQuery(ctx context.Context, sel ast.SelectionSet, v SceneQuery) graphql.Marshaler {\n\treturn ec._QueryScenesResultType(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNQueryScenesResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneQuery(ctx context.Context, sel ast.SelectionSet, v *SceneQuery) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._QueryScenesResultType(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNQuerySitesResultType2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQuerySitesResultType(ctx context.Context, sel ast.SelectionSet, v QuerySitesResultType) graphql.Marshaler {\n\treturn ec._QuerySitesResultType(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNQuerySitesResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQuerySitesResultType(ctx context.Context, sel ast.SelectionSet, v *QuerySitesResultType) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._QuerySitesResultType(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNQueryStudiosResultType2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryStudiosResultType(ctx context.Context, sel ast.SelectionSet, v QueryStudiosResultType) graphql.Marshaler {\n\treturn ec._QueryStudiosResultType(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNQueryStudiosResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryStudiosResultType(ctx context.Context, sel ast.SelectionSet, v *QueryStudiosResultType) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._QueryStudiosResultType(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNQueryTagCategoriesResultType2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryTagCategoriesResultType(ctx context.Context, sel ast.SelectionSet, v QueryTagCategoriesResultType) graphql.Marshaler {\n\treturn ec._QueryTagCategoriesResultType(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNQueryTagCategoriesResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryTagCategoriesResultType(ctx context.Context, sel ast.SelectionSet, v *QueryTagCategoriesResultType) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._QueryTagCategoriesResultType(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNQueryTagsResultType2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryTagsResultType(ctx context.Context, sel ast.SelectionSet, v QueryTagsResultType) graphql.Marshaler {\n\treturn ec._QueryTagsResultType(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNQueryTagsResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryTagsResultType(ctx context.Context, sel ast.SelectionSet, v *QueryTagsResultType) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._QueryTagsResultType(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNQueryUsersResultType2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryUsersResultType(ctx context.Context, sel ast.SelectionSet, v QueryUsersResultType) graphql.Marshaler {\n\treturn ec._QueryUsersResultType(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNQueryUsersResultType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐQueryUsersResultType(ctx context.Context, sel ast.SelectionSet, v *QueryUsersResultType) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._QueryUsersResultType(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNResetPasswordInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐResetPasswordInput(ctx context.Context, v any) (ResetPasswordInput, error) {\n\tres, err := ec.unmarshalInputResetPasswordInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNRevokeInviteInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRevokeInviteInput(ctx context.Context, v any) (RevokeInviteInput, error) {\n\tres, err := ec.unmarshalInputRevokeInviteInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx context.Context, v any) (RoleEnum, error) {\n\tvar res RoleEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx context.Context, sel ast.SelectionSet, v RoleEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNRoleEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnumᚄ(ctx context.Context, v any) ([]RoleEnum, error) {\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]RoleEnum, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) marshalNRoleEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnumᚄ(ctx context.Context, sel ast.SelectionSet, v []RoleEnum) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNScene2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐScene(ctx context.Context, sel ast.SelectionSet, v Scene) graphql.Marshaler {\n\treturn ec._Scene(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNScene2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneᚄ(ctx context.Context, sel ast.SelectionSet, v []Scene) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNScene2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐScene(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNScene2ᚕᚕᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneᚄ(ctx context.Context, sel ast.SelectionSet, v [][]*Scene) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNScene2ᚕᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐScene(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNScene2ᚕᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐScene(ctx context.Context, sel ast.SelectionSet, v []*Scene) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalOScene2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐScene(ctx, sel, v[i])\n\t})\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNScene2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐScene(ctx context.Context, sel ast.SelectionSet, v *Scene) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._Scene(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNSceneCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneCreateInput(ctx context.Context, v any) (SceneCreateInput, error) {\n\tres, err := ec.unmarshalInputSceneCreateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNSceneDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDestroyInput(ctx context.Context, v any) (SceneDestroyInput, error) {\n\tres, err := ec.unmarshalInputSceneDestroyInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNSceneDraftInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDraftInput(ctx context.Context, v any) (SceneDraftInput, error) {\n\tres, err := ec.unmarshalInputSceneDraftInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNSceneDraftPerformer2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDraftPerformer(ctx context.Context, sel ast.SelectionSet, v SceneDraftPerformer) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._SceneDraftPerformer(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalNSceneDraftPerformer2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDraftPerformerᚄ(ctx context.Context, sel ast.SelectionSet, v []SceneDraftPerformer) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNSceneDraftPerformer2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDraftPerformer(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNSceneDraftTag2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDraftTag(ctx context.Context, sel ast.SelectionSet, v SceneDraftTag) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._SceneDraftTag(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNSceneEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneEditInput(ctx context.Context, v any) (SceneEditInput, error) {\n\tres, err := ec.unmarshalInputSceneEditInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNSceneQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneQueryInput(ctx context.Context, v any) (SceneQueryInput, error) {\n\tres, err := ec.unmarshalInputSceneQueryInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNSceneSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneSortEnum(ctx context.Context, v any) (SceneSortEnum, error) {\n\tvar res SceneSortEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNSceneSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneSortEnum(ctx context.Context, sel ast.SelectionSet, v SceneSortEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNSceneUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneUpdateInput(ctx context.Context, v any) (SceneUpdateInput, error) {\n\tres, err := ec.unmarshalInputSceneUpdateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNSite2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSite(ctx context.Context, sel ast.SelectionSet, v Site) graphql.Marshaler {\n\treturn ec._Site(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNSite2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSiteᚄ(ctx context.Context, sel ast.SelectionSet, v []Site) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNSite2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSite(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNSite2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSite(ctx context.Context, sel ast.SelectionSet, v *Site) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._Site(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNSiteCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSiteCreateInput(ctx context.Context, v any) (SiteCreateInput, error) {\n\tres, err := ec.unmarshalInputSiteCreateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNSiteDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSiteDestroyInput(ctx context.Context, v any) (SiteDestroyInput, error) {\n\tres, err := ec.unmarshalInputSiteDestroyInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNSiteUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSiteUpdateInput(ctx context.Context, v any) (SiteUpdateInput, error) {\n\tres, err := ec.unmarshalInputSiteUpdateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNSortDirectionEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSortDirectionEnum(ctx context.Context, v any) (SortDirectionEnum, error) {\n\tvar res SortDirectionEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNSortDirectionEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSortDirectionEnum(ctx context.Context, sel ast.SelectionSet, v SortDirectionEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) marshalNStashBoxConfig2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStashBoxConfig(ctx context.Context, sel ast.SelectionSet, v StashBoxConfig) graphql.Marshaler {\n\treturn ec._StashBoxConfig(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNStashBoxConfig2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStashBoxConfig(ctx context.Context, sel ast.SelectionSet, v *StashBoxConfig) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._StashBoxConfig(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNString2string(ctx context.Context, v any) (string, error) {\n\tres, err := graphql.UnmarshalString(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNString2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler {\n\t_ = sel\n\tres := graphql.MarshalString(v)\n\tif res == graphql.Null {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalNString2ᚕstringᚄ(ctx context.Context, v any) ([]string, error) {\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]string, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNString2string(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) marshalNString2ᚕstringᚄ(ctx context.Context, sel ast.SelectionSet, v []string) graphql.Marshaler {\n\tret := make(graphql.Array, len(v))\n\tfor i := range v {\n\t\tret[i] = ec.marshalNString2string(ctx, sel, v[i])\n\t}\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNStudio2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudio(ctx context.Context, sel ast.SelectionSet, v Studio) graphql.Marshaler {\n\treturn ec._Studio(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNStudio2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioᚄ(ctx context.Context, sel ast.SelectionSet, v []Studio) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNStudio2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudio(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNStudio2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudio(ctx context.Context, sel ast.SelectionSet, v *Studio) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._Studio(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNStudioCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioCreateInput(ctx context.Context, v any) (StudioCreateInput, error) {\n\tres, err := ec.unmarshalInputStudioCreateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNStudioDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioDestroyInput(ctx context.Context, v any) (StudioDestroyInput, error) {\n\tres, err := ec.unmarshalInputStudioDestroyInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNStudioEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioEditInput(ctx context.Context, v any) (StudioEditInput, error) {\n\tres, err := ec.unmarshalInputStudioEditInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNStudioQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioQueryInput(ctx context.Context, v any) (StudioQueryInput, error) {\n\tres, err := ec.unmarshalInputStudioQueryInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNStudioSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioSortEnum(ctx context.Context, v any) (StudioSortEnum, error) {\n\tvar res StudioSortEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNStudioSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioSortEnum(ctx context.Context, sel ast.SelectionSet, v StudioSortEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNStudioUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioUpdateInput(ctx context.Context, v any) (StudioUpdateInput, error) {\n\tres, err := ec.unmarshalInputStudioUpdateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNTag2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTag(ctx context.Context, sel ast.SelectionSet, v Tag) graphql.Marshaler {\n\treturn ec._Tag(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNTag2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagᚄ(ctx context.Context, sel ast.SelectionSet, v []Tag) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNTag2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTag(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNTagCategory2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategory(ctx context.Context, sel ast.SelectionSet, v TagCategory) graphql.Marshaler {\n\treturn ec._TagCategory(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNTagCategory2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategoryᚄ(ctx context.Context, sel ast.SelectionSet, v []TagCategory) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNTagCategory2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategory(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalNTagCategoryCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategoryCreateInput(ctx context.Context, v any) (TagCategoryCreateInput, error) {\n\tres, err := ec.unmarshalInputTagCategoryCreateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNTagCategoryDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategoryDestroyInput(ctx context.Context, v any) (TagCategoryDestroyInput, error) {\n\tres, err := ec.unmarshalInputTagCategoryDestroyInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNTagCategoryUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategoryUpdateInput(ctx context.Context, v any) (TagCategoryUpdateInput, error) {\n\tres, err := ec.unmarshalInputTagCategoryUpdateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNTagCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCreateInput(ctx context.Context, v any) (TagCreateInput, error) {\n\tres, err := ec.unmarshalInputTagCreateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNTagDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagDestroyInput(ctx context.Context, v any) (TagDestroyInput, error) {\n\tres, err := ec.unmarshalInputTagDestroyInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNTagEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagEditInput(ctx context.Context, v any) (TagEditInput, error) {\n\tres, err := ec.unmarshalInputTagEditInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNTagGroupEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagGroupEnum(ctx context.Context, v any) (TagGroupEnum, error) {\n\tvar res TagGroupEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNTagGroupEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagGroupEnum(ctx context.Context, sel ast.SelectionSet, v TagGroupEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNTagQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagQueryInput(ctx context.Context, v any) (TagQueryInput, error) {\n\tres, err := ec.unmarshalInputTagQueryInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNTagSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagSortEnum(ctx context.Context, v any) (TagSortEnum, error) {\n\tvar res TagSortEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNTagSortEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagSortEnum(ctx context.Context, sel ast.SelectionSet, v TagSortEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNTagUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagUpdateInput(ctx context.Context, v any) (TagUpdateInput, error) {\n\tres, err := ec.unmarshalInputTagUpdateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNTargetTypeEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTargetTypeEnum(ctx context.Context, v any) (TargetTypeEnum, error) {\n\tvar res TargetTypeEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNTargetTypeEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTargetTypeEnum(ctx context.Context, sel ast.SelectionSet, v TargetTypeEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNTime2timeᚐTime(ctx context.Context, v any) (time.Time, error) {\n\tres, err := graphql.UnmarshalTime(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNTime2timeᚐTime(ctx context.Context, sel ast.SelectionSet, v time.Time) graphql.Marshaler {\n\t_ = sel\n\tres := graphql.MarshalTime(v)\n\tif res == graphql.Null {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalNTime2ᚖtimeᚐTime(ctx context.Context, v any) (*time.Time, error) {\n\tres, err := graphql.UnmarshalTime(v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNTime2ᚖtimeᚐTime(ctx context.Context, sel ast.SelectionSet, v *time.Time) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\t_ = sel\n\tres := graphql.MarshalTime(*v)\n\tif res == graphql.Null {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) marshalNURL2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURL(ctx context.Context, sel ast.SelectionSet, v URL) graphql.Marshaler {\n\treturn ec._URL(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ(ctx context.Context, sel ast.SelectionSet, v []URL) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNURL2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURL(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalNURLInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURL(ctx context.Context, v any) (URL, error) {\n\tres, err := ec.unmarshalInputURLInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNUser2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUser(ctx context.Context, sel ast.SelectionSet, v User) graphql.Marshaler {\n\treturn ec._User(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNUser2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserᚄ(ctx context.Context, sel ast.SelectionSet, v []User) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNUser2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUser(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalNUserChangeEmailStatus2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserChangeEmailStatus(ctx context.Context, v any) (UserChangeEmailStatus, error) {\n\tvar res UserChangeEmailStatus\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNUserChangeEmailStatus2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserChangeEmailStatus(ctx context.Context, sel ast.SelectionSet, v UserChangeEmailStatus) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNUserChangePasswordInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserChangePasswordInput(ctx context.Context, v any) (UserChangePasswordInput, error) {\n\tres, err := ec.unmarshalInputUserChangePasswordInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNUserCreateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserCreateInput(ctx context.Context, v any) (UserCreateInput, error) {\n\tres, err := ec.unmarshalInputUserCreateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNUserDestroyInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserDestroyInput(ctx context.Context, v any) (UserDestroyInput, error) {\n\tres, err := ec.unmarshalInputUserDestroyInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNUserEditCount2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserEditCount(ctx context.Context, sel ast.SelectionSet, v UserEditCount) graphql.Marshaler {\n\treturn ec._UserEditCount(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNUserEditCount2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserEditCount(ctx context.Context, sel ast.SelectionSet, v *UserEditCount) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._UserEditCount(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNUserQueryInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserQueryInput(ctx context.Context, v any) (UserQueryInput, error) {\n\tres, err := ec.unmarshalInputUserQueryInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalNUserUpdateInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserUpdateInput(ctx context.Context, v any) (UserUpdateInput, error) {\n\tres, err := ec.unmarshalInputUserUpdateInput(ctx, v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNUserVoteCount2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserVoteCount(ctx context.Context, sel ast.SelectionSet, v UserVoteCount) graphql.Marshaler {\n\treturn ec._UserVoteCount(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNUserVoteCount2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserVoteCount(ctx context.Context, sel ast.SelectionSet, v *UserVoteCount) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._UserVoteCount(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNValidSiteTypeEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐValidSiteTypeEnum(ctx context.Context, v any) (ValidSiteTypeEnum, error) {\n\tvar res ValidSiteTypeEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNValidSiteTypeEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐValidSiteTypeEnum(ctx context.Context, sel ast.SelectionSet, v ValidSiteTypeEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNValidSiteTypeEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐValidSiteTypeEnumᚄ(ctx context.Context, v any) ([]ValidSiteTypeEnum, error) {\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]ValidSiteTypeEnum, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNValidSiteTypeEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐValidSiteTypeEnum(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) marshalNValidSiteTypeEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐValidSiteTypeEnumᚄ(ctx context.Context, sel ast.SelectionSet, v []ValidSiteTypeEnum) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNValidSiteTypeEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐValidSiteTypeEnum(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalNVersion2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐVersion(ctx context.Context, sel ast.SelectionSet, v Version) graphql.Marshaler {\n\treturn ec._Version(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalNVersion2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐVersion(ctx context.Context, sel ast.SelectionSet, v *Version) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec._Version(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalNVoteStatusEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐVoteStatusEnum(ctx context.Context, v any) (VoteStatusEnum, error) {\n\tvar res VoteStatusEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNVoteStatusEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐVoteStatusEnum(ctx context.Context, sel ast.SelectionSet, v VoteStatusEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalNVoteTypeEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐVoteTypeEnum(ctx context.Context, v any) (VoteTypeEnum, error) {\n\tvar res VoteTypeEnum\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalNVoteTypeEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐVoteTypeEnum(ctx context.Context, sel ast.SelectionSet, v VoteTypeEnum) graphql.Marshaler {\n\treturn v\n}\n\nfunc (ec *executionContext) marshalN__Directive2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirective(ctx context.Context, sel ast.SelectionSet, v introspection.Directive) graphql.Marshaler {\n\treturn ec.___Directive(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Directive) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalN__Directive2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirective(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalN__DirectiveLocation2string(ctx context.Context, v any) (string, error) {\n\tres, err := graphql.UnmarshalString(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalN__DirectiveLocation2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler {\n\t_ = sel\n\tres := graphql.MarshalString(v)\n\tif res == graphql.Null {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalN__DirectiveLocation2ᚕstringᚄ(ctx context.Context, v any) ([]string, error) {\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]string, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalN__DirectiveLocation2string(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) marshalN__DirectiveLocation2ᚕstringᚄ(ctx context.Context, sel ast.SelectionSet, v []string) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalN__DirectiveLocation2string(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalN__EnumValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValue(ctx context.Context, sel ast.SelectionSet, v introspection.EnumValue) graphql.Marshaler {\n\treturn ec.___EnumValue(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalN__Field2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐField(ctx context.Context, sel ast.SelectionSet, v introspection.Field) graphql.Marshaler {\n\treturn ec.___Field(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx context.Context, sel ast.SelectionSet, v introspection.InputValue) graphql.Marshaler {\n\treturn ec.___InputValue(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v introspection.Type) graphql.Marshaler {\n\treturn ec.___Type(ctx, sel, &v)\n}\n\nfunc (ec *executionContext) marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Type) graphql.Marshaler {\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v *introspection.Type) graphql.Marshaler {\n\tif v == nil {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t\treturn graphql.Null\n\t}\n\treturn ec.___Type(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalN__TypeKind2string(ctx context.Context, v any) (string, error) {\n\tres, err := graphql.UnmarshalString(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalN__TypeKind2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler {\n\t_ = sel\n\tres := graphql.MarshalString(v)\n\tif res == graphql.Null {\n\t\tif !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {\n\t\t\tgraphql.AddErrorf(ctx, \"the requested element is null which the schema does not allow\")\n\t\t}\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalOAmendItemRemoval2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐAmendItemRemovalᚄ(ctx context.Context, v any) ([]AmendItemRemoval, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]AmendItemRemoval, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNAmendItemRemoval2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐAmendItemRemoval(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) marshalOBodyModification2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationᚄ(ctx context.Context, sel ast.SelectionSet, v []BodyModification) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNBodyModification2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModification(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalOBodyModificationCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationCriterionInput(ctx context.Context, v any) (*BodyModificationCriterionInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputBodyModificationCriterionInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalOBodyModificationInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationInputᚄ(ctx context.Context, v any) ([]BodyModificationInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]BodyModificationInput, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNBodyModificationInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBodyModificationInput(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) unmarshalOBoolean2bool(ctx context.Context, v any) (bool, error) {\n\tres, err := graphql.UnmarshalBoolean(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler {\n\t_ = sel\n\t_ = ctx\n\tres := graphql.MarshalBoolean(v)\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalOBoolean2ᚖbool(ctx context.Context, v any) (*bool, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := graphql.UnmarshalBoolean(v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOBoolean2ᚖbool(ctx context.Context, sel ast.SelectionSet, v *bool) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\t_ = sel\n\t_ = ctx\n\tres := graphql.MarshalBoolean(*v)\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalOBreastTypeCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBreastTypeCriterionInput(ctx context.Context, v any) (*BreastTypeCriterionInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputBreastTypeCriterionInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalOBreastTypeEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBreastTypeEnum(ctx context.Context, v any) (*BreastTypeEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(BreastTypeEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOBreastTypeEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐBreastTypeEnum(ctx context.Context, sel ast.SelectionSet, v *BreastTypeEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalODateCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDateCriterionInput(ctx context.Context, v any) (*DateCriterionInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputDateCriterionInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalODraft2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraft(ctx context.Context, sel ast.SelectionSet, v *Draft) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._Draft(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalODraftEntityInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftEntityInputᚄ(ctx context.Context, v any) ([]DraftEntityInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]DraftEntityInput, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNDraftEntityInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftEntityInput(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) unmarshalODraftEntityInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐDraftEntityInput(ctx context.Context, v any) (*DraftEntityInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputDraftEntityInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOEdit2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEdit(ctx context.Context, sel ast.SelectionSet, v *Edit) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._Edit(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalOEditDetails2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditDetails(ctx context.Context, sel ast.SelectionSet, v EditDetails) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._EditDetails(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalOEditTarget2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEditTarget(ctx context.Context, sel ast.SelectionSet, v EditTarget) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._EditTarget(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalOEthnicityEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEthnicityEnum(ctx context.Context, v any) (*EthnicityEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(EthnicityEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOEthnicityEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEthnicityEnum(ctx context.Context, sel ast.SelectionSet, v *EthnicityEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalOEthnicityFilterEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEthnicityFilterEnum(ctx context.Context, v any) (*EthnicityFilterEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(EthnicityFilterEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOEthnicityFilterEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEthnicityFilterEnum(ctx context.Context, sel ast.SelectionSet, v *EthnicityFilterEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalOEyeColorCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEyeColorCriterionInput(ctx context.Context, v any) (*EyeColorCriterionInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputEyeColorCriterionInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalOEyeColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEyeColorEnum(ctx context.Context, v any) (*EyeColorEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(EyeColorEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOEyeColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐEyeColorEnum(ctx context.Context, sel ast.SelectionSet, v *EyeColorEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalOFavoriteFilter2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFavoriteFilter(ctx context.Context, v any) (*FavoriteFilter, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(FavoriteFilter)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOFavoriteFilter2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFavoriteFilter(ctx context.Context, sel ast.SelectionSet, v *FavoriteFilter) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) marshalOFingerprint2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintᚄ(ctx context.Context, sel ast.SelectionSet, v []Fingerprint) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNFingerprint2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprint(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalOFingerprintEditInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintEditInputᚄ(ctx context.Context, v any) ([]FingerprintEditInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]FingerprintEditInput, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNFingerprintEditInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintEditInput(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) unmarshalOFingerprintInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintInputᚄ(ctx context.Context, v any) ([]FingerprintInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]FingerprintInput, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNFingerprintInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintInput(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) unmarshalOFingerprintSubmissionType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintSubmissionType(ctx context.Context, v any) (*FingerprintSubmissionType, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(FingerprintSubmissionType)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOFingerprintSubmissionType2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFingerprintSubmissionType(ctx context.Context, sel ast.SelectionSet, v *FingerprintSubmissionType) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) marshalOFuzzyDate2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐFuzzyDate(ctx context.Context, sel ast.SelectionSet, v *FuzzyDate) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._FuzzyDate(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalOGenderEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderEnum(ctx context.Context, v any) (*GenderEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(GenderEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOGenderEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderEnum(ctx context.Context, sel ast.SelectionSet, v *GenderEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalOGenderFilterEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderFilterEnum(ctx context.Context, v any) (*GenderFilterEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(GenderFilterEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOGenderFilterEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenderFilterEnum(ctx context.Context, sel ast.SelectionSet, v *GenderFilterEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalOGenerateInviteCodeInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐGenerateInviteCodeInput(ctx context.Context, v any) (*GenerateInviteCodeInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputGenerateInviteCodeInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalOHairColorCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐHairColorCriterionInput(ctx context.Context, v any) (*HairColorCriterionInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputHairColorCriterionInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalOHairColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐHairColorEnum(ctx context.Context, v any) (*HairColorEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(HairColorEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOHairColorEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐHairColorEnum(ctx context.Context, sel ast.SelectionSet, v *HairColorEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx context.Context, v any) ([]uuid.UUID, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]uuid.UUID, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) marshalOID2ᚕgithubᚗcomᚋgofrsᚋuuidᚐUUIDᚄ(ctx context.Context, sel ast.SelectionSet, v []uuid.UUID) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := make(graphql.Array, len(v))\n\tfor i := range v {\n\t\tret[i] = ec.marshalNID2githubᚗcomᚋgofrsᚋuuidᚐUUID(ctx, sel, v[i])\n\t}\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx context.Context, v any) (*uuid.UUID, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := UnmarshalID(v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOID2ᚖgithubᚗcomᚋgofrsᚋuuidᚐUUID(ctx context.Context, sel ast.SelectionSet, v *uuid.UUID) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\t_ = sel\n\t_ = ctx\n\tres := MarshalID(*v)\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalOIDCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIDCriterionInput(ctx context.Context, v any) (*IDCriterionInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputIDCriterionInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOImage2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImageᚄ(ctx context.Context, sel ast.SelectionSet, v []Image) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNImage2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImage(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalOImage2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐImage(ctx context.Context, sel ast.SelectionSet, v *Image) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._Image(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalOInt2int(ctx context.Context, v any) (int, error) {\n\tres, err := graphql.UnmarshalInt(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOInt2int(ctx context.Context, sel ast.SelectionSet, v int) graphql.Marshaler {\n\t_ = sel\n\t_ = ctx\n\tres := graphql.MarshalInt(v)\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalOInt2ᚖint(ctx context.Context, v any) (*int, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := graphql.UnmarshalInt(v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOInt2ᚖint(ctx context.Context, sel ast.SelectionSet, v *int) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\t_ = sel\n\t_ = ctx\n\tres := graphql.MarshalInt(*v)\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalOIntCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐIntCriterionInput(ctx context.Context, v any) (*IntCriterionInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputIntCriterionInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOInviteKey2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐInviteKeyᚄ(ctx context.Context, sel ast.SelectionSet, v []InviteKey) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNInviteKey2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐInviteKey(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalOMarkNotificationReadInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMarkNotificationReadInput(ctx context.Context, v any) (*MarkNotificationReadInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputMarkNotificationReadInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalOModAuditActionEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAuditActionEnum(ctx context.Context, v any) (*ModAuditActionEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(ModAuditActionEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOModAuditActionEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐModAuditActionEnum(ctx context.Context, sel ast.SelectionSet, v *ModAuditActionEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalOMultiIDCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMultiIDCriterionInput(ctx context.Context, v any) (*MultiIDCriterionInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputMultiIDCriterionInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalOMultiStringCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐMultiStringCriterionInput(ctx context.Context, v any) (*MultiStringCriterionInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputMultiStringCriterionInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalONotificationEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationEnum(ctx context.Context, v any) (*NotificationEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(NotificationEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalONotificationEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐNotificationEnum(ctx context.Context, sel ast.SelectionSet, v *NotificationEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalOOperationEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐOperationEnum(ctx context.Context, v any) (*OperationEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(OperationEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOOperationEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐOperationEnum(ctx context.Context, sel ast.SelectionSet, v *OperationEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) marshalOPerformer2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformer(ctx context.Context, sel ast.SelectionSet, v *Performer) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._Performer(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalOPerformerAppearance2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearanceᚄ(ctx context.Context, sel ast.SelectionSet, v []PerformerAppearance) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNPerformerAppearance2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearance(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalOPerformerAppearanceInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearanceInputᚄ(ctx context.Context, v any) ([]PerformerAppearanceInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]PerformerAppearanceInput, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNPerformerAppearanceInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerAppearanceInput(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) unmarshalOPerformerEditDetailsInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerEditDetailsInput(ctx context.Context, v any) (*PerformerEditDetailsInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputPerformerEditDetailsInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOPerformerEditOptions2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerEditOptions(ctx context.Context, sel ast.SelectionSet, v *PerformerEditOptions) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._PerformerEditOptions(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalOPerformerEditOptionsInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerEditOptionsInput(ctx context.Context, v any) (*PerformerEditOptionsInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputPerformerEditOptionsInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalOPerformerScenesInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerScenesInput(ctx context.Context, v any) (*PerformerScenesInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputPerformerScenesInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOPerformerSearchFacets2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerSearchFacets(ctx context.Context, sel ast.SelectionSet, v *PerformerSearchFacets) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._PerformerSearchFacets(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalOPerformerSearchFilter2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐPerformerSearchFilter(ctx context.Context, v any) (*PerformerSearchFilter, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputPerformerSearchFilter(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalORoleCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleCriterionInput(ctx context.Context, v any) (*RoleCriterionInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputRoleCriterionInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalORoleEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnumᚄ(ctx context.Context, v any) ([]RoleEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]RoleEnum, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) marshalORoleEnum2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnumᚄ(ctx context.Context, sel ast.SelectionSet, v []RoleEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNRoleEnum2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐRoleEnum(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalOScene2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐScene(ctx context.Context, sel ast.SelectionSet, v *Scene) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._Scene(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalOSceneDraftStudio2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDraftStudio(ctx context.Context, sel ast.SelectionSet, v SceneDraftStudio) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._SceneDraftStudio(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalOSceneDraftTag2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDraftTagᚄ(ctx context.Context, sel ast.SelectionSet, v []SceneDraftTag) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNSceneDraftTag2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneDraftTag(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalOSceneEditDetailsInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSceneEditDetailsInput(ctx context.Context, v any) (*SceneEditDetailsInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputSceneEditDetailsInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOSite2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐSite(ctx context.Context, sel ast.SelectionSet, v *Site) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._Site(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalOString2string(ctx context.Context, v any) (string, error) {\n\tres, err := graphql.UnmarshalString(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOString2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler {\n\t_ = sel\n\t_ = ctx\n\tres := graphql.MarshalString(v)\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalOString2ᚕstringᚄ(ctx context.Context, v any) ([]string, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]string, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNString2string(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) marshalOString2ᚕstringᚄ(ctx context.Context, sel ast.SelectionSet, v []string) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := make(graphql.Array, len(v))\n\tfor i := range v {\n\t\tret[i] = ec.marshalNString2string(ctx, sel, v[i])\n\t}\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalOString2ᚖstring(ctx context.Context, v any) (*string, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := graphql.UnmarshalString(v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOString2ᚖstring(ctx context.Context, sel ast.SelectionSet, v *string) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\t_ = sel\n\t_ = ctx\n\tres := graphql.MarshalString(*v)\n\treturn res\n}\n\nfunc (ec *executionContext) unmarshalOStringCriterionInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStringCriterionInput(ctx context.Context, v any) (*StringCriterionInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputStringCriterionInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOStudio2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudio(ctx context.Context, sel ast.SelectionSet, v *Studio) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._Studio(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalOStudioEditDetailsInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioEditDetailsInput(ctx context.Context, v any) (*StudioEditDetailsInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputStudioEditDetailsInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalOStudioQueryInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐStudioQueryInput(ctx context.Context, v any) (*StudioQueryInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputStudioQueryInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOTag2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagᚄ(ctx context.Context, sel ast.SelectionSet, v []Tag) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNTag2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTag(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalOTag2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTag(ctx context.Context, sel ast.SelectionSet, v *Tag) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._Tag(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalOTagCategory2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagCategory(ctx context.Context, sel ast.SelectionSet, v *TagCategory) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._TagCategory(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalOTagEditDetailsInput2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagEditDetailsInput(ctx context.Context, v any) (*TagEditDetailsInput, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := ec.unmarshalInputTagEditDetailsInput(ctx, v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) unmarshalOTagGroupEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagGroupEnum(ctx context.Context, v any) (*TagGroupEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(TagGroupEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOTagGroupEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTagGroupEnum(ctx context.Context, sel ast.SelectionSet, v *TagGroupEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalOTargetTypeEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTargetTypeEnum(ctx context.Context, v any) (*TargetTypeEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(TargetTypeEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOTargetTypeEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐTargetTypeEnum(ctx context.Context, sel ast.SelectionSet, v *TargetTypeEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalOTime2ᚖtimeᚐTime(ctx context.Context, v any) (*time.Time, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := graphql.UnmarshalTime(v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOTime2ᚖtimeᚐTime(ctx context.Context, sel ast.SelectionSet, v *time.Time) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\t_ = sel\n\t_ = ctx\n\tres := graphql.MarshalTime(*v)\n\treturn res\n}\n\nfunc (ec *executionContext) marshalOURL2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ(ctx context.Context, sel ast.SelectionSet, v []URL) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalNURL2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURL(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) unmarshalOURLInput2ᚕgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURLᚄ(ctx context.Context, v any) ([]URL, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar vSlice []any\n\tvSlice = graphql.CoerceList(v)\n\tvar err error\n\tres := make([]URL, len(vSlice))\n\tfor i := range vSlice {\n\t\tctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))\n\t\tres[i], err = ec.unmarshalNURLInput2githubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐURL(ctx, vSlice[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn res, nil\n}\n\nfunc (ec *executionContext) unmarshalOUpload2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚐUpload(ctx context.Context, v any) (*graphql.Upload, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tres, err := graphql.UnmarshalUpload(v)\n\treturn &res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOUpload2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚐUpload(ctx context.Context, sel ast.SelectionSet, v *graphql.Upload) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\t_ = sel\n\t_ = ctx\n\tres := graphql.MarshalUpload(*v)\n\treturn res\n}\n\nfunc (ec *executionContext) marshalOUser2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUser(ctx context.Context, sel ast.SelectionSet, v *User) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec._User(ctx, sel, v)\n}\n\nfunc (ec *executionContext) unmarshalOUserVotedFilterEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserVotedFilterEnum(ctx context.Context, v any) (*UserVotedFilterEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(UserVotedFilterEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOUserVotedFilterEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐUserVotedFilterEnum(ctx context.Context, sel ast.SelectionSet, v *UserVotedFilterEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) unmarshalOVoteStatusEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐVoteStatusEnum(ctx context.Context, v any) (*VoteStatusEnum, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tvar res = new(VoteStatusEnum)\n\terr := res.UnmarshalGQL(v)\n\treturn res, graphql.ErrorOnPath(ctx, err)\n}\n\nfunc (ec *executionContext) marshalOVoteStatusEnum2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋinternalᚋmodelsᚐVoteStatusEnum(ctx context.Context, sel ast.SelectionSet, v *VoteStatusEnum) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn v\n}\n\nfunc (ec *executionContext) marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.EnumValue) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalN__EnumValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValue(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Field) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalN__Field2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐField(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx context.Context, sel ast.SelectionSet, v *introspection.Schema) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec.___Schema(ctx, sel, v)\n}\n\nfunc (ec *executionContext) marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Type) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\tret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {\n\t\tfc := graphql.GetFieldContext(ctx)\n\t\tfc.Result = &v[i]\n\t\treturn ec.marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, sel, v[i])\n\t})\n\n\tfor _, e := range ret {\n\t\tif e == graphql.Null {\n\t\t\treturn graphql.Null\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc (ec *executionContext) marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v *introspection.Type) graphql.Marshaler {\n\tif v == nil {\n\t\treturn graphql.Null\n\t}\n\treturn ec.___Type(ctx, sel, v)\n}\n\n// endregion ***************************** type.gotpl *****************************\n"
  },
  {
    "path": "internal/models/generated_models.go",
    "content": "// Code generated by github.com/99designs/gqlgen, DO NOT EDIT.\n\npackage models\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/99designs/gqlgen/graphql\"\n\t\"github.com/gofrs/uuid\"\n)\n\ntype DraftData interface {\n\tIsDraftData()\n}\n\ntype EditDetails interface {\n\tIsEditDetails()\n}\n\ntype EditTarget interface {\n\tIsEditTarget()\n}\n\ntype NotificationData interface {\n\tIsNotificationData()\n}\n\ntype SceneDraftPerformer interface {\n\tIsSceneDraftPerformer()\n}\n\ntype SceneDraftStudio interface {\n\tIsSceneDraftStudio()\n}\n\ntype SceneDraftTag interface {\n\tIsSceneDraftTag()\n}\n\ntype ActivateNewUserInput struct {\n\tName          string    `json:\"name\"`\n\tActivationKey uuid.UUID `json:\"activation_key\"`\n\tPassword      string    `json:\"password\"`\n}\n\ntype AmendEditInput struct {\n\tID     uuid.UUID `json:\"id\"`\n\tReason string    `json:\"reason\"`\n\t// Fields to remove from the diff (e.g., [\"name\", \"disambiguation\"])\n\tRemoveFields []string `json:\"remove_fields,omitempty\"`\n\t// Array items to remove from added arrays\n\tRemoveAddedItems []AmendItemRemoval `json:\"remove_added_items,omitempty\"`\n\t// Array items to remove from removed arrays\n\tRemoveRemovedItems []AmendItemRemoval `json:\"remove_removed_items,omitempty\"`\n}\n\ntype AmendItemRemoval struct {\n\t// Field name (e.g., \"aliases\", \"urls\", \"images\")\n\tField string `json:\"field\"`\n\t// Indices to remove from the array\n\tIndices []int `json:\"indices\"`\n}\n\ntype ApplyEditInput struct {\n\tID uuid.UUID `json:\"id\"`\n}\n\ntype BodyModification struct {\n\tLocation    string  `json:\"location\"`\n\tDescription *string `json:\"description,omitempty\"`\n}\n\ntype BodyModificationCriterionInput struct {\n\tLocation    *string           `json:\"location,omitempty\"`\n\tDescription *string           `json:\"description,omitempty\"`\n\tModifier    CriterionModifier `json:\"modifier\"`\n}\n\ntype BodyModificationInput struct {\n\tLocation    string  `json:\"location\"`\n\tDescription *string `json:\"description,omitempty\"`\n}\n\ntype BreastTypeCriterionInput struct {\n\tValue    *BreastTypeEnum   `json:\"value,omitempty\"`\n\tModifier CriterionModifier `json:\"modifier\"`\n}\n\ntype CancelEditInput struct {\n\tID uuid.UUID `json:\"id\"`\n}\n\ntype CommentCommentedEdit struct {\n\tComment *EditComment `json:\"comment\"`\n}\n\nfunc (CommentCommentedEdit) IsNotificationData() {}\n\ntype CommentOwnEdit struct {\n\tComment *EditComment `json:\"comment\"`\n}\n\nfunc (CommentOwnEdit) IsNotificationData() {}\n\ntype CommentVotedEdit struct {\n\tComment *EditComment `json:\"comment\"`\n}\n\nfunc (CommentVotedEdit) IsNotificationData() {}\n\ntype DateCriterionInput struct {\n\tValue    string            `json:\"value\"`\n\tModifier CriterionModifier `json:\"modifier\"`\n}\n\ntype DeleteEditInput struct {\n\tID     uuid.UUID `json:\"id\"`\n\tReason string    `json:\"reason\"`\n}\n\ntype DeleteFingerprintSubmissionsInput struct {\n\tFingerprints []FingerprintQueryInput `json:\"fingerprints\"`\n\tSceneID      uuid.UUID               `json:\"scene_id\"`\n}\n\ntype DownvoteOwnEdit struct {\n\tEdit *Edit `json:\"edit\"`\n}\n\nfunc (DownvoteOwnEdit) IsNotificationData() {}\n\ntype DraftEntityInput struct {\n\tName string     `json:\"name\"`\n\tID   *uuid.UUID `json:\"id,omitempty\"`\n}\n\ntype DraftFingerprint struct {\n\tHash      FingerprintHash      `json:\"hash\"`\n\tAlgorithm FingerprintAlgorithm `json:\"algorithm\"`\n\tDuration  int                  `json:\"duration\"`\n}\n\ntype DraftSubmissionStatus struct {\n\tID *uuid.UUID `json:\"id,omitempty\"`\n}\n\ntype EditCommentInput struct {\n\tID      uuid.UUID `json:\"id\"`\n\tComment string    `json:\"comment\"`\n}\n\ntype EditInput struct {\n\t// Not required for create type\n\tID        *uuid.UUID    `json:\"id,omitempty\"`\n\tOperation OperationEnum `json:\"operation\"`\n\t// Only required for merge type\n\tMergeSourceIds []uuid.UUID `json:\"merge_source_ids,omitempty\"`\n\tComment        *string     `json:\"comment,omitempty\"`\n\t// Edit submitted by an automated script. Requires bot permission\n\tBot *bool `json:\"bot,omitempty\"`\n}\n\ntype EditQueryInput struct {\n\t// Filter by user id\n\tUserID *uuid.UUID `json:\"user_id,omitempty\"`\n\t// Filter by status\n\tStatus *VoteStatusEnum `json:\"status,omitempty\"`\n\t// Filter by operation\n\tOperation *OperationEnum `json:\"operation,omitempty\"`\n\t// Filter by vote count\n\tVoteCount *IntCriterionInput `json:\"vote_count,omitempty\"`\n\t// Filter by applied status\n\tApplied *bool `json:\"applied,omitempty\"`\n\t// Filter by target type\n\tTargetType *TargetTypeEnum `json:\"target_type,omitempty\"`\n\t// Filter by target id\n\tTargetID *uuid.UUID `json:\"target_id,omitempty\"`\n\t// Filter by favorite status\n\tIsFavorite *bool `json:\"is_favorite,omitempty\"`\n\t// Filter by user voted status\n\tVoted *UserVotedFilterEnum `json:\"voted,omitempty\"`\n\t// Filter to bot edits only\n\tIsBot *bool `json:\"is_bot,omitempty\"`\n\t// Filter out user's own edits\n\tIncludeUserSubmitted *bool             `json:\"include_user_submitted,omitempty\"`\n\tPage                 int               `json:\"page\"`\n\tPerPage              int               `json:\"per_page\"`\n\tDirection            SortDirectionEnum `json:\"direction\"`\n\tSort                 EditSortEnum      `json:\"sort\"`\n}\n\ntype EditVoteInput struct {\n\tID   uuid.UUID    `json:\"id\"`\n\tVote VoteTypeEnum `json:\"vote\"`\n}\n\ntype EyeColorCriterionInput struct {\n\tValue    *EyeColorEnum     `json:\"value,omitempty\"`\n\tModifier CriterionModifier `json:\"modifier\"`\n}\n\ntype FailedOwnEdit struct {\n\tEdit *Edit `json:\"edit\"`\n}\n\nfunc (FailedOwnEdit) IsNotificationData() {}\n\ntype FavoritePerformerEdit struct {\n\tEdit *Edit `json:\"edit\"`\n}\n\nfunc (FavoritePerformerEdit) IsNotificationData() {}\n\ntype FavoritePerformerScene struct {\n\tScene *Scene `json:\"scene\"`\n}\n\nfunc (FavoritePerformerScene) IsNotificationData() {}\n\ntype FavoriteStudioEdit struct {\n\tEdit *Edit `json:\"edit\"`\n}\n\nfunc (FavoriteStudioEdit) IsNotificationData() {}\n\ntype FavoriteStudioScene struct {\n\tScene *Scene `json:\"scene\"`\n}\n\nfunc (FavoriteStudioScene) IsNotificationData() {}\n\ntype Fingerprint struct {\n\tHash      FingerprintHash      `json:\"hash\"`\n\tAlgorithm FingerprintAlgorithm `json:\"algorithm\"`\n\tDuration  int                  `json:\"duration\"`\n\t// number of times this fingerprint has been submitted (excluding reports)\n\tSubmissions int `json:\"submissions\"`\n\t// number of times this fingerprint has been reported\n\tReports int       `json:\"reports\"`\n\tCreated time.Time `json:\"created\"`\n\tUpdated time.Time `json:\"updated\"`\n\t// true if the current user submitted this fingerprint\n\tUserSubmitted bool `json:\"user_submitted\"`\n\t// true if the current user reported this fingerprint\n\tUserReported bool `json:\"user_reported\"`\n}\n\ntype FingerprintBatchSubmission struct {\n\tSceneID   uuid.UUID            `json:\"scene_id\"`\n\tHash      FingerprintHash      `json:\"hash\"`\n\tAlgorithm FingerprintAlgorithm `json:\"algorithm\"`\n\tDuration  int                  `json:\"duration\"`\n}\n\ntype FingerprintEditInput struct {\n\tUserIds     []uuid.UUID          `json:\"user_ids,omitempty\"`\n\tHash        FingerprintHash      `json:\"hash\"`\n\tAlgorithm   FingerprintAlgorithm `json:\"algorithm\"`\n\tDuration    int                  `json:\"duration\"`\n\tCreated     time.Time            `json:\"created\"`\n\tSubmissions *int                 `json:\"submissions,omitempty\"`\n\tUpdated     *time.Time           `json:\"updated,omitempty\"`\n}\n\ntype FingerprintInput struct {\n\t// assumes current user if omitted. Ignored for non-modify Users\n\tUserIds   []uuid.UUID          `json:\"user_ids,omitempty\"`\n\tHash      FingerprintHash      `json:\"hash\"`\n\tAlgorithm FingerprintAlgorithm `json:\"algorithm\"`\n\tDuration  int                  `json:\"duration\"`\n}\n\ntype FingerprintQueryInput struct {\n\tHash      FingerprintHash      `json:\"hash\"`\n\tAlgorithm FingerprintAlgorithm `json:\"algorithm\"`\n}\n\ntype FingerprintSubmission struct {\n\tSceneID     uuid.UUID                  `json:\"scene_id\"`\n\tFingerprint *FingerprintInput          `json:\"fingerprint\"`\n\tUnmatch     *bool                      `json:\"unmatch,omitempty\"`\n\tVote        *FingerprintSubmissionType `json:\"vote,omitempty\"`\n}\n\ntype FingerprintSubmissionResult struct {\n\t// The fingerprint hash that was submitted\n\tHash FingerprintHash `json:\"hash\"`\n\t// The scene ID that was submitted to\n\tSceneID uuid.UUID `json:\"scene_id\"`\n\t// Error message if submission failed\n\tError *string `json:\"error,omitempty\"`\n}\n\ntype FingerprintedSceneEdit struct {\n\tEdit *Edit `json:\"edit\"`\n}\n\nfunc (FingerprintedSceneEdit) IsNotificationData() {}\n\ntype FuzzyDate struct {\n\tDate     string           `json:\"date\"`\n\tAccuracy DateAccuracyEnum `json:\"accuracy\"`\n}\n\ntype GenerateInviteCodeInput struct {\n\tKeys *int `json:\"keys,omitempty\"`\n\tUses *int `json:\"uses,omitempty\"`\n\tTTL  *int `json:\"ttl,omitempty\"`\n}\n\ntype GrantInviteInput struct {\n\tUserID uuid.UUID `json:\"user_id\"`\n\tAmount int       `json:\"amount\"`\n}\n\ntype HairColorCriterionInput struct {\n\tValue    *HairColorEnum    `json:\"value,omitempty\"`\n\tModifier CriterionModifier `json:\"modifier\"`\n}\n\ntype IDCriterionInput struct {\n\tValue    []uuid.UUID       `json:\"value\"`\n\tModifier CriterionModifier `json:\"modifier\"`\n}\n\ntype ImageCreateInput struct {\n\tURL  *string         `json:\"url,omitempty\"`\n\tFile *graphql.Upload `json:\"file,omitempty\"`\n}\n\ntype ImageDestroyInput struct {\n\tID uuid.UUID `json:\"id\"`\n}\n\ntype ImageUpdateInput struct {\n\tID  uuid.UUID `json:\"id\"`\n\tURL *string   `json:\"url,omitempty\"`\n}\n\ntype IntCriterionInput struct {\n\tValue    int               `json:\"value\"`\n\tModifier CriterionModifier `json:\"modifier\"`\n}\n\ntype MarkNotificationReadInput struct {\n\tType NotificationEnum `json:\"type\"`\n\tID   uuid.UUID        `json:\"id\"`\n}\n\ntype Measurements struct {\n\tCupSize  *string `json:\"cup_size,omitempty\"`\n\tBandSize *int    `json:\"band_size,omitempty\"`\n\tWaist    *int    `json:\"waist,omitempty\"`\n\tHip      *int    `json:\"hip,omitempty\"`\n}\n\ntype ModAuditQueryInput struct {\n\tPage    int                 `json:\"page\"`\n\tPerPage int                 `json:\"per_page\"`\n\tAction  *ModAuditActionEnum `json:\"action,omitempty\"`\n\tUserID  *uuid.UUID          `json:\"user_id,omitempty\"`\n}\n\ntype MoveFingerprintSubmissionsInput struct {\n\tFingerprints  []FingerprintQueryInput `json:\"fingerprints\"`\n\tSourceSceneID uuid.UUID               `json:\"source_scene_id\"`\n\tTargetSceneID uuid.UUID               `json:\"target_scene_id\"`\n}\n\ntype MultiIDCriterionInput struct {\n\tValue    []uuid.UUID       `json:\"value,omitempty\"`\n\tModifier CriterionModifier `json:\"modifier\"`\n}\n\ntype MultiStringCriterionInput struct {\n\tValue    []string          `json:\"value\"`\n\tModifier CriterionModifier `json:\"modifier\"`\n}\n\ntype Mutation struct {\n}\n\ntype NewUserInput struct {\n\tEmail     string     `json:\"email\"`\n\tInviteKey *uuid.UUID `json:\"invite_key,omitempty\"`\n}\n\ntype PerformerAppearance struct {\n\tPerformer *Performer `json:\"performer\"`\n\t// Performing as alias\n\tAs *string `json:\"as,omitempty\"`\n}\n\ntype PerformerAppearanceInput struct {\n\tPerformerID uuid.UUID `json:\"performer_id\"`\n\t// Performing as alias\n\tAs *string `json:\"as,omitempty\"`\n}\n\ntype PerformerCreateInput struct {\n\tName            string                  `json:\"name\"`\n\tDisambiguation  *string                 `json:\"disambiguation,omitempty\"`\n\tAliases         []string                `json:\"aliases,omitempty\"`\n\tGender          *GenderEnum             `json:\"gender,omitempty\"`\n\tUrls            []URL                   `json:\"urls,omitempty\"`\n\tBirthdate       *string                 `json:\"birthdate,omitempty\"`\n\tDeathdate       *string                 `json:\"deathdate,omitempty\"`\n\tEthnicity       *EthnicityEnum          `json:\"ethnicity,omitempty\"`\n\tCountry         *string                 `json:\"country,omitempty\"`\n\tEyeColor        *EyeColorEnum           `json:\"eye_color,omitempty\"`\n\tHairColor       *HairColorEnum          `json:\"hair_color,omitempty\"`\n\tHeight          *int                    `json:\"height,omitempty\"`\n\tCupSize         *string                 `json:\"cup_size,omitempty\"`\n\tBandSize        *int                    `json:\"band_size,omitempty\"`\n\tWaistSize       *int                    `json:\"waist_size,omitempty\"`\n\tHipSize         *int                    `json:\"hip_size,omitempty\"`\n\tBreastType      *BreastTypeEnum         `json:\"breast_type,omitempty\"`\n\tCareerStartYear *int                    `json:\"career_start_year,omitempty\"`\n\tCareerEndYear   *int                    `json:\"career_end_year,omitempty\"`\n\tTattoos         []BodyModificationInput `json:\"tattoos,omitempty\"`\n\tPiercings       []BodyModificationInput `json:\"piercings,omitempty\"`\n\tImageIds        []uuid.UUID             `json:\"image_ids,omitempty\"`\n\tDraftID         *uuid.UUID              `json:\"draft_id,omitempty\"`\n}\n\ntype PerformerDestroyInput struct {\n\tID uuid.UUID `json:\"id\"`\n}\n\ntype PerformerDraftInput struct {\n\tID              *uuid.UUID      `json:\"id,omitempty\"`\n\tDisambiguation  *string         `json:\"disambiguation,omitempty\"`\n\tName            string          `json:\"name\"`\n\tAliases         *string         `json:\"aliases,omitempty\"`\n\tGender          *string         `json:\"gender,omitempty\"`\n\tBirthdate       *string         `json:\"birthdate,omitempty\"`\n\tDeathdate       *string         `json:\"deathdate,omitempty\"`\n\tUrls            []string        `json:\"urls,omitempty\"`\n\tEthnicity       *string         `json:\"ethnicity,omitempty\"`\n\tCountry         *string         `json:\"country,omitempty\"`\n\tEyeColor        *string         `json:\"eye_color,omitempty\"`\n\tHairColor       *string         `json:\"hair_color,omitempty\"`\n\tHeight          *string         `json:\"height,omitempty\"`\n\tMeasurements    *string         `json:\"measurements,omitempty\"`\n\tBreastType      *string         `json:\"breast_type,omitempty\"`\n\tTattoos         *string         `json:\"tattoos,omitempty\"`\n\tPiercings       *string         `json:\"piercings,omitempty\"`\n\tCareerStartYear *int            `json:\"career_start_year,omitempty\"`\n\tCareerEndYear   *int            `json:\"career_end_year,omitempty\"`\n\tImage           *graphql.Upload `json:\"image,omitempty\"`\n}\n\ntype PerformerEditDetailsInput struct {\n\tName            *string                 `json:\"name,omitempty\"`\n\tDisambiguation  *string                 `json:\"disambiguation,omitempty\"`\n\tAliases         []string                `json:\"aliases,omitempty\"`\n\tGender          *GenderEnum             `json:\"gender,omitempty\"`\n\tUrls            []URL                   `json:\"urls,omitempty\"`\n\tBirthdate       *string                 `json:\"birthdate,omitempty\"`\n\tDeathdate       *string                 `json:\"deathdate,omitempty\"`\n\tEthnicity       *EthnicityEnum          `json:\"ethnicity,omitempty\"`\n\tCountry         *string                 `json:\"country,omitempty\"`\n\tEyeColor        *EyeColorEnum           `json:\"eye_color,omitempty\"`\n\tHairColor       *HairColorEnum          `json:\"hair_color,omitempty\"`\n\tHeight          *int                    `json:\"height,omitempty\"`\n\tCupSize         *string                 `json:\"cup_size,omitempty\"`\n\tBandSize        *int                    `json:\"band_size,omitempty\"`\n\tWaistSize       *int                    `json:\"waist_size,omitempty\"`\n\tHipSize         *int                    `json:\"hip_size,omitempty\"`\n\tBreastType      *BreastTypeEnum         `json:\"breast_type,omitempty\"`\n\tCareerStartYear *int                    `json:\"career_start_year,omitempty\"`\n\tCareerEndYear   *int                    `json:\"career_end_year,omitempty\"`\n\tTattoos         []BodyModificationInput `json:\"tattoos,omitempty\"`\n\tPiercings       []BodyModificationInput `json:\"piercings,omitempty\"`\n\tImageIds        []uuid.UUID             `json:\"image_ids,omitempty\"`\n\tDraftID         *uuid.UUID              `json:\"draft_id,omitempty\"`\n}\n\ntype PerformerEditInput struct {\n\tEdit *EditInput `json:\"edit\"`\n\t// Not required for destroy type\n\tDetails *PerformerEditDetailsInput `json:\"details,omitempty\"`\n\t// Controls aliases modification for merges and name modifications\n\tOptions *PerformerEditOptionsInput `json:\"options,omitempty\"`\n}\n\ntype PerformerEditOptions struct {\n\t// Set performer alias on scenes without alias to old name if name is changed\n\tSetModifyAliases bool `json:\"set_modify_aliases\"`\n\t// Set performer alias on scenes attached to merge sources to old name\n\tSetMergeAliases bool `json:\"set_merge_aliases\"`\n}\n\ntype PerformerEditOptionsInput struct {\n\t// Set performer alias on scenes without alias to old name if name is changed\n\tSetModifyAliases *bool `json:\"set_modify_aliases,omitempty\"`\n\t// Set performer alias on scenes attached to merge sources to old name\n\tSetMergeAliases *bool `json:\"set_merge_aliases,omitempty\"`\n}\n\ntype PerformerQueryInput struct {\n\t// Searches name and disambiguation - assumes like query unless quoted\n\tNames *string `json:\"names,omitempty\"`\n\t// Searches name only - assumes like query unless quoted\n\tName *string `json:\"name,omitempty\"`\n\t// Search aliases only - assumes like query unless quoted\n\tAlias          *string               `json:\"alias,omitempty\"`\n\tDisambiguation *StringCriterionInput `json:\"disambiguation,omitempty\"`\n\tGender         *GenderFilterEnum     `json:\"gender,omitempty\"`\n\t// Filter to search urls - assumes like query unless quoted\n\tURL             *string                         `json:\"url,omitempty\"`\n\tBirthdate       *DateCriterionInput             `json:\"birthdate,omitempty\"`\n\tDeathdate       *DateCriterionInput             `json:\"deathdate,omitempty\"`\n\tBirthYear       *IntCriterionInput              `json:\"birth_year,omitempty\"`\n\tAge             *IntCriterionInput              `json:\"age,omitempty\"`\n\tEthnicity       *EthnicityFilterEnum            `json:\"ethnicity,omitempty\"`\n\tCountry         *StringCriterionInput           `json:\"country,omitempty\"`\n\tEyeColor        *EyeColorCriterionInput         `json:\"eye_color,omitempty\"`\n\tHairColor       *HairColorCriterionInput        `json:\"hair_color,omitempty\"`\n\tHeight          *IntCriterionInput              `json:\"height,omitempty\"`\n\tCupSize         *StringCriterionInput           `json:\"cup_size,omitempty\"`\n\tBandSize        *IntCriterionInput              `json:\"band_size,omitempty\"`\n\tWaistSize       *IntCriterionInput              `json:\"waist_size,omitempty\"`\n\tHipSize         *IntCriterionInput              `json:\"hip_size,omitempty\"`\n\tBreastType      *BreastTypeCriterionInput       `json:\"breast_type,omitempty\"`\n\tCareerStartYear *IntCriterionInput              `json:\"career_start_year,omitempty\"`\n\tCareerEndYear   *IntCriterionInput              `json:\"career_end_year,omitempty\"`\n\tTattoos         *BodyModificationCriterionInput `json:\"tattoos,omitempty\"`\n\tPiercings       *BodyModificationCriterionInput `json:\"piercings,omitempty\"`\n\t// Filter by performerfavorite status for the current user\n\tIsFavorite *bool `json:\"is_favorite,omitempty\"`\n\t// Filter by a performer they have performed in scenes with\n\tPerformedWith *uuid.UUID `json:\"performed_with,omitempty\"`\n\t// Filter by a studio\n\tStudioID  *uuid.UUID        `json:\"studio_id,omitempty\"`\n\tPage      int               `json:\"page\"`\n\tPerPage   int               `json:\"per_page\"`\n\tDirection SortDirectionEnum `json:\"direction\"`\n\tSort      PerformerSortEnum `json:\"sort\"`\n}\n\ntype PerformerScenesInput struct {\n\t// Filter by another performer that also performs in the scenes\n\tPerformedWith *uuid.UUID `json:\"performed_with,omitempty\"`\n\t// Filter by a studio\n\tStudioID *uuid.UUID `json:\"studio_id,omitempty\"`\n\t// Filter by tags\n\tTags *MultiIDCriterionInput `json:\"tags,omitempty\"`\n}\n\ntype PerformerSearchFilter struct {\n\t// Filter by gender\n\tGender *GenderEnum `json:\"gender,omitempty\"`\n}\n\ntype PerformerStudio struct {\n\tStudio     *Studio `json:\"studio\"`\n\tSceneCount int     `json:\"scene_count\"`\n}\n\ntype PerformerUpdateInput struct {\n\tID              uuid.UUID               `json:\"id\"`\n\tName            *string                 `json:\"name,omitempty\"`\n\tDisambiguation  *string                 `json:\"disambiguation,omitempty\"`\n\tAliases         []string                `json:\"aliases,omitempty\"`\n\tGender          *GenderEnum             `json:\"gender,omitempty\"`\n\tUrls            []URL                   `json:\"urls,omitempty\"`\n\tBirthdate       *string                 `json:\"birthdate,omitempty\"`\n\tDeathdate       *string                 `json:\"deathdate,omitempty\"`\n\tEthnicity       *EthnicityEnum          `json:\"ethnicity,omitempty\"`\n\tCountry         *string                 `json:\"country,omitempty\"`\n\tEyeColor        *EyeColorEnum           `json:\"eye_color,omitempty\"`\n\tHairColor       *HairColorEnum          `json:\"hair_color,omitempty\"`\n\tHeight          *int                    `json:\"height,omitempty\"`\n\tCupSize         *string                 `json:\"cup_size,omitempty\"`\n\tBandSize        *int                    `json:\"band_size,omitempty\"`\n\tWaistSize       *int                    `json:\"waist_size,omitempty\"`\n\tHipSize         *int                    `json:\"hip_size,omitempty\"`\n\tBreastType      *BreastTypeEnum         `json:\"breast_type,omitempty\"`\n\tCareerStartYear *int                    `json:\"career_start_year,omitempty\"`\n\tCareerEndYear   *int                    `json:\"career_end_year,omitempty\"`\n\tTattoos         []BodyModificationInput `json:\"tattoos,omitempty\"`\n\tPiercings       []BodyModificationInput `json:\"piercings,omitempty\"`\n\tImageIds        []uuid.UUID             `json:\"image_ids,omitempty\"`\n}\n\n// The query root for this schema\ntype Query struct {\n}\n\ntype QueryExistingPerformerInput struct {\n\tName           *string  `json:\"name,omitempty\"`\n\tDisambiguation *string  `json:\"disambiguation,omitempty\"`\n\tUrls           []string `json:\"urls\"`\n}\n\ntype QueryExistingSceneInput struct {\n\tTitle        *string            `json:\"title,omitempty\"`\n\tStudioID     *uuid.UUID         `json:\"studio_id,omitempty\"`\n\tFingerprints []FingerprintInput `json:\"fingerprints\"`\n}\n\ntype QueryNotificationsInput struct {\n\tPage       int               `json:\"page\"`\n\tPerPage    int               `json:\"per_page\"`\n\tType       *NotificationEnum `json:\"type,omitempty\"`\n\tUnreadOnly *bool             `json:\"unread_only,omitempty\"`\n}\n\ntype QuerySitesResultType struct {\n\tCount int    `json:\"count\"`\n\tSites []Site `json:\"sites\"`\n}\n\ntype QueryStudiosResultType struct {\n\tCount   int      `json:\"count\"`\n\tStudios []Studio `json:\"studios\"`\n}\n\ntype QueryTagCategoriesResultType struct {\n\tCount         int           `json:\"count\"`\n\tTagCategories []TagCategory `json:\"tag_categories\"`\n}\n\ntype QueryTagsResultType struct {\n\tCount int   `json:\"count\"`\n\tTags  []Tag `json:\"tags\"`\n}\n\ntype QueryUsersResultType struct {\n\tCount int    `json:\"count\"`\n\tUsers []User `json:\"users\"`\n}\n\ntype ResetPasswordInput struct {\n\tEmail string `json:\"email\"`\n}\n\ntype RevokeInviteInput struct {\n\tUserID uuid.UUID `json:\"user_id\"`\n\tAmount int       `json:\"amount\"`\n}\n\ntype RoleCriterionInput struct {\n\tValue    []RoleEnum        `json:\"value\"`\n\tModifier CriterionModifier `json:\"modifier\"`\n}\n\ntype SceneCreateInput struct {\n\tTitle          *string                    `json:\"title,omitempty\"`\n\tDetails        *string                    `json:\"details,omitempty\"`\n\tUrls           []URL                      `json:\"urls,omitempty\"`\n\tDate           string                     `json:\"date\"`\n\tProductionDate *string                    `json:\"production_date,omitempty\"`\n\tStudioID       *uuid.UUID                 `json:\"studio_id,omitempty\"`\n\tPerformers     []PerformerAppearanceInput `json:\"performers,omitempty\"`\n\tTagIds         []uuid.UUID                `json:\"tag_ids,omitempty\"`\n\tImageIds       []uuid.UUID                `json:\"image_ids,omitempty\"`\n\tFingerprints   []FingerprintEditInput     `json:\"fingerprints\"`\n\tDuration       *int                       `json:\"duration,omitempty\"`\n\tDirector       *string                    `json:\"director,omitempty\"`\n\tCode           *string                    `json:\"code,omitempty\"`\n}\n\ntype SceneDestroyInput struct {\n\tID uuid.UUID `json:\"id\"`\n}\n\ntype SceneDraftInput struct {\n\tID             *uuid.UUID         `json:\"id,omitempty\"`\n\tTitle          *string            `json:\"title,omitempty\"`\n\tCode           *string            `json:\"code,omitempty\"`\n\tDetails        *string            `json:\"details,omitempty\"`\n\tDirector       *string            `json:\"director,omitempty\"`\n\tURL            *string            `json:\"url,omitempty\"`\n\tUrls           []string           `json:\"urls,omitempty\"`\n\tDate           *string            `json:\"date,omitempty\"`\n\tProductionDate *string            `json:\"production_date,omitempty\"`\n\tStudio         *DraftEntityInput  `json:\"studio,omitempty\"`\n\tPerformers     []DraftEntityInput `json:\"performers\"`\n\tTags           []DraftEntityInput `json:\"tags,omitempty\"`\n\tImage          *graphql.Upload    `json:\"image,omitempty\"`\n\tFingerprints   []FingerprintInput `json:\"fingerprints\"`\n}\n\ntype SceneEditDetailsInput struct {\n\tTitle          *string                    `json:\"title,omitempty\"`\n\tDetails        *string                    `json:\"details,omitempty\"`\n\tUrls           []URL                      `json:\"urls,omitempty\"`\n\tDate           *string                    `json:\"date,omitempty\"`\n\tProductionDate *string                    `json:\"production_date,omitempty\"`\n\tStudioID       *uuid.UUID                 `json:\"studio_id,omitempty\"`\n\tPerformers     []PerformerAppearanceInput `json:\"performers,omitempty\"`\n\tTagIds         []uuid.UUID                `json:\"tag_ids,omitempty\"`\n\tImageIds       []uuid.UUID                `json:\"image_ids,omitempty\"`\n\tDuration       *int                       `json:\"duration,omitempty\"`\n\tDirector       *string                    `json:\"director,omitempty\"`\n\tCode           *string                    `json:\"code,omitempty\"`\n\tFingerprints   []FingerprintInput         `json:\"fingerprints,omitempty\"`\n\tDraftID        *uuid.UUID                 `json:\"draft_id,omitempty\"`\n}\n\ntype SceneEditInput struct {\n\tEdit *EditInput `json:\"edit\"`\n\t// Not required for destroy type\n\tDetails *SceneEditDetailsInput `json:\"details,omitempty\"`\n}\n\ntype SceneQueryInput struct {\n\t// Filter to search title and details - assumes like query unless quoted\n\tText *string `json:\"text,omitempty\"`\n\t// Filter to search title - assumes like query unless quoted\n\tTitle *string `json:\"title,omitempty\"`\n\t// Filter to search urls - assumes like query unless quoted\n\tURL *string `json:\"url,omitempty\"`\n\t// Filter by date\n\tDate *DateCriterionInput `json:\"date,omitempty\"`\n\t// Filter by production date\n\tProductionDate *DateCriterionInput `json:\"production_date,omitempty\"`\n\t// Filter to only include scenes with this studio\n\tStudios *MultiIDCriterionInput `json:\"studios,omitempty\"`\n\t// Filter to only include scenes with this studio as primary or parent\n\tParentStudio *string `json:\"parentStudio,omitempty\"`\n\t// Filter to only include scenes with these tags\n\tTags *MultiIDCriterionInput `json:\"tags,omitempty\"`\n\t// Filter to only include scenes with these performers\n\tPerformers *MultiIDCriterionInput `json:\"performers,omitempty\"`\n\t// Filter to include scenes with performer appearing as alias\n\tAlias *StringCriterionInput `json:\"alias,omitempty\"`\n\t// Filter to only include scenes with these fingerprints\n\tFingerprints *MultiStringCriterionInput `json:\"fingerprints,omitempty\"`\n\t// Filter by favorited entity\n\tFavorites *FavoriteFilter `json:\"favorites,omitempty\"`\n\t// Filter to scenes with fingerprints submitted by the user\n\tHasFingerprintSubmissions *bool             `json:\"has_fingerprint_submissions,omitempty\"`\n\tPage                      int               `json:\"page\"`\n\tPerPage                   int               `json:\"per_page\"`\n\tDirection                 SortDirectionEnum `json:\"direction\"`\n\tSort                      SceneSortEnum     `json:\"sort\"`\n}\n\ntype SceneUpdateInput struct {\n\tID             uuid.UUID                  `json:\"id\"`\n\tTitle          *string                    `json:\"title,omitempty\"`\n\tDetails        *string                    `json:\"details,omitempty\"`\n\tUrls           []URL                      `json:\"urls,omitempty\"`\n\tDate           *string                    `json:\"date,omitempty\"`\n\tProductionDate *string                    `json:\"production_date,omitempty\"`\n\tStudioID       *uuid.UUID                 `json:\"studio_id,omitempty\"`\n\tPerformers     []PerformerAppearanceInput `json:\"performers,omitempty\"`\n\tTagIds         []uuid.UUID                `json:\"tag_ids,omitempty\"`\n\tImageIds       []uuid.UUID                `json:\"image_ids,omitempty\"`\n\tFingerprints   []FingerprintEditInput     `json:\"fingerprints,omitempty\"`\n\tDuration       *int                       `json:\"duration,omitempty\"`\n\tDirector       *string                    `json:\"director,omitempty\"`\n\tCode           *string                    `json:\"code,omitempty\"`\n}\n\ntype SiteCreateInput struct {\n\tName        string              `json:\"name\"`\n\tDescription *string             `json:\"description,omitempty\"`\n\tURL         *string             `json:\"url,omitempty\"`\n\tRegex       *string             `json:\"regex,omitempty\"`\n\tValidTypes  []ValidSiteTypeEnum `json:\"valid_types\"`\n}\n\ntype SiteDestroyInput struct {\n\tID uuid.UUID `json:\"id\"`\n}\n\ntype SiteUpdateInput struct {\n\tID          uuid.UUID           `json:\"id\"`\n\tName        string              `json:\"name\"`\n\tDescription *string             `json:\"description,omitempty\"`\n\tURL         *string             `json:\"url,omitempty\"`\n\tRegex       *string             `json:\"regex,omitempty\"`\n\tValidTypes  []ValidSiteTypeEnum `json:\"valid_types\"`\n}\n\ntype StashBoxConfig struct {\n\tHostURL                    string `json:\"host_url\"`\n\tRequireInvite              bool   `json:\"require_invite\"`\n\tRequireActivation          bool   `json:\"require_activation\"`\n\tVotePromotionThreshold     *int   `json:\"vote_promotion_threshold,omitempty\"`\n\tVoteApplicationThreshold   int    `json:\"vote_application_threshold\"`\n\tVotingPeriod               int    `json:\"voting_period\"`\n\tMinDestructiveVotingPeriod int    `json:\"min_destructive_voting_period\"`\n\tVoteCronInterval           string `json:\"vote_cron_interval\"`\n\tGuidelinesURL              string `json:\"guidelines_url\"`\n\tRequireSceneDraft          bool   `json:\"require_scene_draft\"`\n\tEditUpdateLimit            int    `json:\"edit_update_limit\"`\n\tRequireTagRole             bool   `json:\"require_tag_role\"`\n}\n\ntype StringCriterionInput struct {\n\tValue    string            `json:\"value\"`\n\tModifier CriterionModifier `json:\"modifier\"`\n}\n\ntype StudioCreateInput struct {\n\tName     string      `json:\"name\"`\n\tAliases  []string    `json:\"aliases,omitempty\"`\n\tUrls     []URL       `json:\"urls,omitempty\"`\n\tParentID *uuid.UUID  `json:\"parent_id,omitempty\"`\n\tImageIds []uuid.UUID `json:\"image_ids,omitempty\"`\n}\n\ntype StudioDestroyInput struct {\n\tID uuid.UUID `json:\"id\"`\n}\n\ntype StudioEditDetailsInput struct {\n\tName     *string     `json:\"name,omitempty\"`\n\tAliases  []string    `json:\"aliases,omitempty\"`\n\tUrls     []URL       `json:\"urls,omitempty\"`\n\tParentID *uuid.UUID  `json:\"parent_id,omitempty\"`\n\tImageIds []uuid.UUID `json:\"image_ids,omitempty\"`\n}\n\ntype StudioEditInput struct {\n\tEdit *EditInput `json:\"edit\"`\n\t// Not required for destroy type\n\tDetails *StudioEditDetailsInput `json:\"details,omitempty\"`\n}\n\ntype StudioQueryInput struct {\n\t// Filter to search name - assumes like query unless quoted\n\tName *string `json:\"name,omitempty\"`\n\t// Filter to search studio name, aliases and parent studio name - assumes like query unless quoted\n\tNames *string `json:\"names,omitempty\"`\n\t// Filter to search url - assumes like query unless quoted\n\tURL       *string           `json:\"url,omitempty\"`\n\tParent    *IDCriterionInput `json:\"parent,omitempty\"`\n\tHasParent *bool             `json:\"has_parent,omitempty\"`\n\t// Filter by studio favorite status for the current user\n\tIsFavorite *bool             `json:\"is_favorite,omitempty\"`\n\tPage       int               `json:\"page\"`\n\tPerPage    int               `json:\"per_page\"`\n\tDirection  SortDirectionEnum `json:\"direction\"`\n\tSort       StudioSortEnum    `json:\"sort\"`\n}\n\ntype StudioUpdateInput struct {\n\tID       uuid.UUID   `json:\"id\"`\n\tName     *string     `json:\"name,omitempty\"`\n\tAliases  []string    `json:\"aliases,omitempty\"`\n\tUrls     []URL       `json:\"urls,omitempty\"`\n\tParentID *uuid.UUID  `json:\"parent_id,omitempty\"`\n\tImageIds []uuid.UUID `json:\"image_ids,omitempty\"`\n}\n\ntype TagCategoryCreateInput struct {\n\tName        string       `json:\"name\"`\n\tGroup       TagGroupEnum `json:\"group\"`\n\tDescription *string      `json:\"description,omitempty\"`\n}\n\ntype TagCategoryDestroyInput struct {\n\tID uuid.UUID `json:\"id\"`\n}\n\ntype TagCategoryUpdateInput struct {\n\tID          uuid.UUID     `json:\"id\"`\n\tName        *string       `json:\"name,omitempty\"`\n\tGroup       *TagGroupEnum `json:\"group,omitempty\"`\n\tDescription *string       `json:\"description,omitempty\"`\n}\n\ntype TagCreateInput struct {\n\tName        string     `json:\"name\"`\n\tDescription *string    `json:\"description,omitempty\"`\n\tAliases     []string   `json:\"aliases,omitempty\"`\n\tCategoryID  *uuid.UUID `json:\"category_id,omitempty\"`\n}\n\ntype TagDestroyInput struct {\n\tID uuid.UUID `json:\"id\"`\n}\n\ntype TagEditDetailsInput struct {\n\tName        *string    `json:\"name,omitempty\"`\n\tDescription *string    `json:\"description,omitempty\"`\n\tAliases     []string   `json:\"aliases,omitempty\"`\n\tCategoryID  *uuid.UUID `json:\"category_id,omitempty\"`\n}\n\ntype TagEditInput struct {\n\tEdit *EditInput `json:\"edit\"`\n\t// Not required for destroy type\n\tDetails *TagEditDetailsInput `json:\"details,omitempty\"`\n}\n\ntype TagQueryInput struct {\n\t// Filter to search name, aliases and description - assumes like query unless quoted\n\tText *string `json:\"text,omitempty\"`\n\t// Searches name and aliases - assumes like query unless quoted\n\tNames *string `json:\"names,omitempty\"`\n\t// Filter to search name - assumes like query unless quoted\n\tName *string `json:\"name,omitempty\"`\n\t// Filter to category ID\n\tCategoryID *uuid.UUID        `json:\"category_id,omitempty\"`\n\tPage       int               `json:\"page\"`\n\tPerPage    int               `json:\"per_page\"`\n\tDirection  SortDirectionEnum `json:\"direction\"`\n\tSort       TagSortEnum       `json:\"sort\"`\n}\n\ntype TagUpdateInput struct {\n\tID          uuid.UUID  `json:\"id\"`\n\tName        *string    `json:\"name,omitempty\"`\n\tDescription *string    `json:\"description,omitempty\"`\n\tAliases     []string   `json:\"aliases,omitempty\"`\n\tCategoryID  *uuid.UUID `json:\"category_id,omitempty\"`\n}\n\ntype UpdatedEdit struct {\n\tEdit *Edit `json:\"edit\"`\n}\n\nfunc (UpdatedEdit) IsNotificationData() {}\n\ntype UserChangeEmailInput struct {\n\tExistingEmailToken *uuid.UUID `json:\"existing_email_token,omitempty\"`\n\tNewEmailToken      *uuid.UUID `json:\"new_email_token,omitempty\"`\n\tNewEmail           *string    `json:\"new_email,omitempty\"`\n}\n\ntype UserChangePasswordInput struct {\n\t// Password in plain text\n\tExistingPassword *string    `json:\"existing_password,omitempty\"`\n\tNewPassword      string     `json:\"new_password\"`\n\tResetKey         *uuid.UUID `json:\"reset_key,omitempty\"`\n}\n\ntype UserCreateInput struct {\n\tName string `json:\"name\"`\n\t// Password in plain text\n\tPassword    string     `json:\"password\"`\n\tRoles       []RoleEnum `json:\"roles\"`\n\tEmail       string     `json:\"email\"`\n\tInvitedByID *uuid.UUID `json:\"invited_by_id,omitempty\"`\n}\n\ntype UserDestroyInput struct {\n\tID uuid.UUID `json:\"id\"`\n}\n\ntype UserEditCount struct {\n\tAccepted          int `json:\"accepted\"`\n\tRejected          int `json:\"rejected\"`\n\tPending           int `json:\"pending\"`\n\tImmediateAccepted int `json:\"immediate_accepted\"`\n\tImmediateRejected int `json:\"immediate_rejected\"`\n\tFailed            int `json:\"failed\"`\n\tCanceled          int `json:\"canceled\"`\n}\n\ntype UserQueryInput struct {\n\t// Filter to search user name - assumes like query unless quoted\n\tName *string `json:\"name,omitempty\"`\n\t// Filter to search email - assumes like query unless quoted\n\tEmail *string `json:\"email,omitempty\"`\n\t// Filter by roles\n\tRoles *RoleCriterionInput `json:\"roles,omitempty\"`\n\t// Filter by api key\n\tAPIKey *string `json:\"apiKey,omitempty\"`\n\t// Filter by successful edits\n\tSuccessfulEdits *IntCriterionInput `json:\"successful_edits,omitempty\"`\n\t// Filter by unsuccessful edits\n\tUnsuccessfulEdits *IntCriterionInput `json:\"unsuccessful_edits,omitempty\"`\n\t// Filter by votes on successful edits\n\tSuccessfulVotes *IntCriterionInput `json:\"successful_votes,omitempty\"`\n\t// Filter by votes on unsuccessful edits\n\tUnsuccessfulVotes *IntCriterionInput `json:\"unsuccessful_votes,omitempty\"`\n\t// Filter by number of API calls\n\tAPICalls *IntCriterionInput `json:\"api_calls,omitempty\"`\n\t// Filter by user that invited\n\tInvitedBy *uuid.UUID `json:\"invited_by,omitempty\"`\n\tPage      int        `json:\"page\"`\n\tPerPage   int        `json:\"per_page\"`\n}\n\ntype UserUpdateInput struct {\n\tID   uuid.UUID `json:\"id\"`\n\tName *string   `json:\"name,omitempty\"`\n\t// Password in plain text\n\tPassword *string    `json:\"password,omitempty\"`\n\tRoles    []RoleEnum `json:\"roles,omitempty\"`\n\tEmail    *string    `json:\"email,omitempty\"`\n}\n\ntype UserVoteCount struct {\n\tAbstain         int `json:\"abstain\"`\n\tAccept          int `json:\"accept\"`\n\tReject          int `json:\"reject\"`\n\tImmediateAccept int `json:\"immediate_accept\"`\n\tImmediateReject int `json:\"immediate_reject\"`\n}\n\ntype Version struct {\n\tHash      string `json:\"hash\"`\n\tBuildTime string `json:\"build_time\"`\n\tBuildType string `json:\"build_type\"`\n\tVersion   string `json:\"version\"`\n}\n\ntype BreastTypeEnum string\n\nconst (\n\tBreastTypeEnumNatural BreastTypeEnum = \"NATURAL\"\n\tBreastTypeEnumFake    BreastTypeEnum = \"FAKE\"\n\tBreastTypeEnumNa      BreastTypeEnum = \"NA\"\n)\n\nvar AllBreastTypeEnum = []BreastTypeEnum{\n\tBreastTypeEnumNatural,\n\tBreastTypeEnumFake,\n\tBreastTypeEnumNa,\n}\n\nfunc (e BreastTypeEnum) IsValid() bool {\n\tswitch e {\n\tcase BreastTypeEnumNatural, BreastTypeEnumFake, BreastTypeEnumNa:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e BreastTypeEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *BreastTypeEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = BreastTypeEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid BreastTypeEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e BreastTypeEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *BreastTypeEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e BreastTypeEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype CriterionModifier string\n\nconst (\n\t// =\n\tCriterionModifierEquals CriterionModifier = \"EQUALS\"\n\t// !=\n\tCriterionModifierNotEquals CriterionModifier = \"NOT_EQUALS\"\n\t// >\n\tCriterionModifierGreaterThan CriterionModifier = \"GREATER_THAN\"\n\t// <\n\tCriterionModifierLessThan CriterionModifier = \"LESS_THAN\"\n\t// IS NULL\n\tCriterionModifierIsNull CriterionModifier = \"IS_NULL\"\n\t// IS NOT NULL\n\tCriterionModifierNotNull CriterionModifier = \"NOT_NULL\"\n\t// INCLUDES ALL\n\tCriterionModifierIncludesAll CriterionModifier = \"INCLUDES_ALL\"\n\tCriterionModifierIncludes    CriterionModifier = \"INCLUDES\"\n\tCriterionModifierExcludes    CriterionModifier = \"EXCLUDES\"\n)\n\nvar AllCriterionModifier = []CriterionModifier{\n\tCriterionModifierEquals,\n\tCriterionModifierNotEquals,\n\tCriterionModifierGreaterThan,\n\tCriterionModifierLessThan,\n\tCriterionModifierIsNull,\n\tCriterionModifierNotNull,\n\tCriterionModifierIncludesAll,\n\tCriterionModifierIncludes,\n\tCriterionModifierExcludes,\n}\n\nfunc (e CriterionModifier) IsValid() bool {\n\tswitch e {\n\tcase CriterionModifierEquals, CriterionModifierNotEquals, CriterionModifierGreaterThan, CriterionModifierLessThan, CriterionModifierIsNull, CriterionModifierNotNull, CriterionModifierIncludesAll, CriterionModifierIncludes, CriterionModifierExcludes:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e CriterionModifier) String() string {\n\treturn string(e)\n}\n\nfunc (e *CriterionModifier) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = CriterionModifier(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid CriterionModifier\", str)\n\t}\n\treturn nil\n}\n\nfunc (e CriterionModifier) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *CriterionModifier) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e CriterionModifier) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype DateAccuracyEnum string\n\nconst (\n\tDateAccuracyEnumYear  DateAccuracyEnum = \"YEAR\"\n\tDateAccuracyEnumMonth DateAccuracyEnum = \"MONTH\"\n\tDateAccuracyEnumDay   DateAccuracyEnum = \"DAY\"\n)\n\nvar AllDateAccuracyEnum = []DateAccuracyEnum{\n\tDateAccuracyEnumYear,\n\tDateAccuracyEnumMonth,\n\tDateAccuracyEnumDay,\n}\n\nfunc (e DateAccuracyEnum) IsValid() bool {\n\tswitch e {\n\tcase DateAccuracyEnumYear, DateAccuracyEnumMonth, DateAccuracyEnumDay:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e DateAccuracyEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *DateAccuracyEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = DateAccuracyEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid DateAccuracyEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e DateAccuracyEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *DateAccuracyEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e DateAccuracyEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype EditSortEnum string\n\nconst (\n\tEditSortEnumCreatedAt EditSortEnum = \"CREATED_AT\"\n\tEditSortEnumUpdatedAt EditSortEnum = \"UPDATED_AT\"\n\tEditSortEnumClosedAt  EditSortEnum = \"CLOSED_AT\"\n)\n\nvar AllEditSortEnum = []EditSortEnum{\n\tEditSortEnumCreatedAt,\n\tEditSortEnumUpdatedAt,\n\tEditSortEnumClosedAt,\n}\n\nfunc (e EditSortEnum) IsValid() bool {\n\tswitch e {\n\tcase EditSortEnumCreatedAt, EditSortEnumUpdatedAt, EditSortEnumClosedAt:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e EditSortEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *EditSortEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = EditSortEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid EditSortEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e EditSortEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *EditSortEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e EditSortEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype EthnicityEnum string\n\nconst (\n\tEthnicityEnumCaucasian     EthnicityEnum = \"CAUCASIAN\"\n\tEthnicityEnumBlack         EthnicityEnum = \"BLACK\"\n\tEthnicityEnumAsian         EthnicityEnum = \"ASIAN\"\n\tEthnicityEnumIndian        EthnicityEnum = \"INDIAN\"\n\tEthnicityEnumLatin         EthnicityEnum = \"LATIN\"\n\tEthnicityEnumMiddleEastern EthnicityEnum = \"MIDDLE_EASTERN\"\n\tEthnicityEnumMixed         EthnicityEnum = \"MIXED\"\n\tEthnicityEnumOther         EthnicityEnum = \"OTHER\"\n)\n\nvar AllEthnicityEnum = []EthnicityEnum{\n\tEthnicityEnumCaucasian,\n\tEthnicityEnumBlack,\n\tEthnicityEnumAsian,\n\tEthnicityEnumIndian,\n\tEthnicityEnumLatin,\n\tEthnicityEnumMiddleEastern,\n\tEthnicityEnumMixed,\n\tEthnicityEnumOther,\n}\n\nfunc (e EthnicityEnum) IsValid() bool {\n\tswitch e {\n\tcase EthnicityEnumCaucasian, EthnicityEnumBlack, EthnicityEnumAsian, EthnicityEnumIndian, EthnicityEnumLatin, EthnicityEnumMiddleEastern, EthnicityEnumMixed, EthnicityEnumOther:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e EthnicityEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *EthnicityEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = EthnicityEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid EthnicityEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e EthnicityEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *EthnicityEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e EthnicityEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype EthnicityFilterEnum string\n\nconst (\n\tEthnicityFilterEnumUnknown       EthnicityFilterEnum = \"UNKNOWN\"\n\tEthnicityFilterEnumCaucasian     EthnicityFilterEnum = \"CAUCASIAN\"\n\tEthnicityFilterEnumBlack         EthnicityFilterEnum = \"BLACK\"\n\tEthnicityFilterEnumAsian         EthnicityFilterEnum = \"ASIAN\"\n\tEthnicityFilterEnumIndian        EthnicityFilterEnum = \"INDIAN\"\n\tEthnicityFilterEnumLatin         EthnicityFilterEnum = \"LATIN\"\n\tEthnicityFilterEnumMiddleEastern EthnicityFilterEnum = \"MIDDLE_EASTERN\"\n\tEthnicityFilterEnumMixed         EthnicityFilterEnum = \"MIXED\"\n\tEthnicityFilterEnumOther         EthnicityFilterEnum = \"OTHER\"\n)\n\nvar AllEthnicityFilterEnum = []EthnicityFilterEnum{\n\tEthnicityFilterEnumUnknown,\n\tEthnicityFilterEnumCaucasian,\n\tEthnicityFilterEnumBlack,\n\tEthnicityFilterEnumAsian,\n\tEthnicityFilterEnumIndian,\n\tEthnicityFilterEnumLatin,\n\tEthnicityFilterEnumMiddleEastern,\n\tEthnicityFilterEnumMixed,\n\tEthnicityFilterEnumOther,\n}\n\nfunc (e EthnicityFilterEnum) IsValid() bool {\n\tswitch e {\n\tcase EthnicityFilterEnumUnknown, EthnicityFilterEnumCaucasian, EthnicityFilterEnumBlack, EthnicityFilterEnumAsian, EthnicityFilterEnumIndian, EthnicityFilterEnumLatin, EthnicityFilterEnumMiddleEastern, EthnicityFilterEnumMixed, EthnicityFilterEnumOther:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e EthnicityFilterEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *EthnicityFilterEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = EthnicityFilterEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid EthnicityFilterEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e EthnicityFilterEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *EthnicityFilterEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e EthnicityFilterEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype EyeColorEnum string\n\nconst (\n\tEyeColorEnumBlue  EyeColorEnum = \"BLUE\"\n\tEyeColorEnumBrown EyeColorEnum = \"BROWN\"\n\tEyeColorEnumGrey  EyeColorEnum = \"GREY\"\n\tEyeColorEnumGreen EyeColorEnum = \"GREEN\"\n\tEyeColorEnumHazel EyeColorEnum = \"HAZEL\"\n\tEyeColorEnumRed   EyeColorEnum = \"RED\"\n)\n\nvar AllEyeColorEnum = []EyeColorEnum{\n\tEyeColorEnumBlue,\n\tEyeColorEnumBrown,\n\tEyeColorEnumGrey,\n\tEyeColorEnumGreen,\n\tEyeColorEnumHazel,\n\tEyeColorEnumRed,\n}\n\nfunc (e EyeColorEnum) IsValid() bool {\n\tswitch e {\n\tcase EyeColorEnumBlue, EyeColorEnumBrown, EyeColorEnumGrey, EyeColorEnumGreen, EyeColorEnumHazel, EyeColorEnumRed:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e EyeColorEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *EyeColorEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = EyeColorEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid EyeColorEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e EyeColorEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *EyeColorEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e EyeColorEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype FavoriteFilter string\n\nconst (\n\tFavoriteFilterPerformer FavoriteFilter = \"PERFORMER\"\n\tFavoriteFilterStudio    FavoriteFilter = \"STUDIO\"\n\tFavoriteFilterAll       FavoriteFilter = \"ALL\"\n)\n\nvar AllFavoriteFilter = []FavoriteFilter{\n\tFavoriteFilterPerformer,\n\tFavoriteFilterStudio,\n\tFavoriteFilterAll,\n}\n\nfunc (e FavoriteFilter) IsValid() bool {\n\tswitch e {\n\tcase FavoriteFilterPerformer, FavoriteFilterStudio, FavoriteFilterAll:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e FavoriteFilter) String() string {\n\treturn string(e)\n}\n\nfunc (e *FavoriteFilter) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = FavoriteFilter(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid FavoriteFilter\", str)\n\t}\n\treturn nil\n}\n\nfunc (e FavoriteFilter) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *FavoriteFilter) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e FavoriteFilter) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype FingerprintAlgorithm string\n\nconst (\n\tFingerprintAlgorithmMd5    FingerprintAlgorithm = \"MD5\"\n\tFingerprintAlgorithmOshash FingerprintAlgorithm = \"OSHASH\"\n\tFingerprintAlgorithmPhash  FingerprintAlgorithm = \"PHASH\"\n)\n\nvar AllFingerprintAlgorithm = []FingerprintAlgorithm{\n\tFingerprintAlgorithmMd5,\n\tFingerprintAlgorithmOshash,\n\tFingerprintAlgorithmPhash,\n}\n\nfunc (e FingerprintAlgorithm) IsValid() bool {\n\tswitch e {\n\tcase FingerprintAlgorithmMd5, FingerprintAlgorithmOshash, FingerprintAlgorithmPhash:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e FingerprintAlgorithm) String() string {\n\treturn string(e)\n}\n\nfunc (e *FingerprintAlgorithm) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = FingerprintAlgorithm(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid FingerprintAlgorithm\", str)\n\t}\n\treturn nil\n}\n\nfunc (e FingerprintAlgorithm) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *FingerprintAlgorithm) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e FingerprintAlgorithm) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype FingerprintSubmissionType string\n\nconst (\n\t// Positive vote\n\tFingerprintSubmissionTypeValid FingerprintSubmissionType = \"VALID\"\n\t// Report as invalid\n\tFingerprintSubmissionTypeInvalid FingerprintSubmissionType = \"INVALID\"\n\t// Remove vote\n\tFingerprintSubmissionTypeRemove FingerprintSubmissionType = \"REMOVE\"\n)\n\nvar AllFingerprintSubmissionType = []FingerprintSubmissionType{\n\tFingerprintSubmissionTypeValid,\n\tFingerprintSubmissionTypeInvalid,\n\tFingerprintSubmissionTypeRemove,\n}\n\nfunc (e FingerprintSubmissionType) IsValid() bool {\n\tswitch e {\n\tcase FingerprintSubmissionTypeValid, FingerprintSubmissionTypeInvalid, FingerprintSubmissionTypeRemove:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e FingerprintSubmissionType) String() string {\n\treturn string(e)\n}\n\nfunc (e *FingerprintSubmissionType) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = FingerprintSubmissionType(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid FingerprintSubmissionType\", str)\n\t}\n\treturn nil\n}\n\nfunc (e FingerprintSubmissionType) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *FingerprintSubmissionType) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e FingerprintSubmissionType) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype GenderEnum string\n\nconst (\n\tGenderEnumMale              GenderEnum = \"MALE\"\n\tGenderEnumFemale            GenderEnum = \"FEMALE\"\n\tGenderEnumTransgenderMale   GenderEnum = \"TRANSGENDER_MALE\"\n\tGenderEnumTransgenderFemale GenderEnum = \"TRANSGENDER_FEMALE\"\n\tGenderEnumIntersex          GenderEnum = \"INTERSEX\"\n\tGenderEnumNonBinary         GenderEnum = \"NON_BINARY\"\n)\n\nvar AllGenderEnum = []GenderEnum{\n\tGenderEnumMale,\n\tGenderEnumFemale,\n\tGenderEnumTransgenderMale,\n\tGenderEnumTransgenderFemale,\n\tGenderEnumIntersex,\n\tGenderEnumNonBinary,\n}\n\nfunc (e GenderEnum) IsValid() bool {\n\tswitch e {\n\tcase GenderEnumMale, GenderEnumFemale, GenderEnumTransgenderMale, GenderEnumTransgenderFemale, GenderEnumIntersex, GenderEnumNonBinary:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e GenderEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *GenderEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = GenderEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid GenderEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e GenderEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *GenderEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e GenderEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype GenderFilterEnum string\n\nconst (\n\tGenderFilterEnumUnknown           GenderFilterEnum = \"UNKNOWN\"\n\tGenderFilterEnumMale              GenderFilterEnum = \"MALE\"\n\tGenderFilterEnumFemale            GenderFilterEnum = \"FEMALE\"\n\tGenderFilterEnumTransgenderMale   GenderFilterEnum = \"TRANSGENDER_MALE\"\n\tGenderFilterEnumTransgenderFemale GenderFilterEnum = \"TRANSGENDER_FEMALE\"\n\tGenderFilterEnumIntersex          GenderFilterEnum = \"INTERSEX\"\n\tGenderFilterEnumNonBinary         GenderFilterEnum = \"NON_BINARY\"\n)\n\nvar AllGenderFilterEnum = []GenderFilterEnum{\n\tGenderFilterEnumUnknown,\n\tGenderFilterEnumMale,\n\tGenderFilterEnumFemale,\n\tGenderFilterEnumTransgenderMale,\n\tGenderFilterEnumTransgenderFemale,\n\tGenderFilterEnumIntersex,\n\tGenderFilterEnumNonBinary,\n}\n\nfunc (e GenderFilterEnum) IsValid() bool {\n\tswitch e {\n\tcase GenderFilterEnumUnknown, GenderFilterEnumMale, GenderFilterEnumFemale, GenderFilterEnumTransgenderMale, GenderFilterEnumTransgenderFemale, GenderFilterEnumIntersex, GenderFilterEnumNonBinary:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e GenderFilterEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *GenderFilterEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = GenderFilterEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid GenderFilterEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e GenderFilterEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *GenderFilterEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e GenderFilterEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype HairColorEnum string\n\nconst (\n\tHairColorEnumBlonde   HairColorEnum = \"BLONDE\"\n\tHairColorEnumBrunette HairColorEnum = \"BRUNETTE\"\n\tHairColorEnumBlack    HairColorEnum = \"BLACK\"\n\tHairColorEnumRed      HairColorEnum = \"RED\"\n\tHairColorEnumAuburn   HairColorEnum = \"AUBURN\"\n\tHairColorEnumGrey     HairColorEnum = \"GREY\"\n\tHairColorEnumBald     HairColorEnum = \"BALD\"\n\tHairColorEnumVarious  HairColorEnum = \"VARIOUS\"\n\tHairColorEnumWhite    HairColorEnum = \"WHITE\"\n\tHairColorEnumOther    HairColorEnum = \"OTHER\"\n)\n\nvar AllHairColorEnum = []HairColorEnum{\n\tHairColorEnumBlonde,\n\tHairColorEnumBrunette,\n\tHairColorEnumBlack,\n\tHairColorEnumRed,\n\tHairColorEnumAuburn,\n\tHairColorEnumGrey,\n\tHairColorEnumBald,\n\tHairColorEnumVarious,\n\tHairColorEnumWhite,\n\tHairColorEnumOther,\n}\n\nfunc (e HairColorEnum) IsValid() bool {\n\tswitch e {\n\tcase HairColorEnumBlonde, HairColorEnumBrunette, HairColorEnumBlack, HairColorEnumRed, HairColorEnumAuburn, HairColorEnumGrey, HairColorEnumBald, HairColorEnumVarious, HairColorEnumWhite, HairColorEnumOther:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e HairColorEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *HairColorEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = HairColorEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid HairColorEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e HairColorEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *HairColorEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e HairColorEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype ModAuditActionEnum string\n\nconst (\n\tModAuditActionEnumEditDelete    ModAuditActionEnum = \"EDIT_DELETE\"\n\tModAuditActionEnumEditAmendment ModAuditActionEnum = \"EDIT_AMENDMENT\"\n)\n\nvar AllModAuditActionEnum = []ModAuditActionEnum{\n\tModAuditActionEnumEditDelete,\n\tModAuditActionEnumEditAmendment,\n}\n\nfunc (e ModAuditActionEnum) IsValid() bool {\n\tswitch e {\n\tcase ModAuditActionEnumEditDelete, ModAuditActionEnumEditAmendment:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e ModAuditActionEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *ModAuditActionEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = ModAuditActionEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid ModAuditActionEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e ModAuditActionEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *ModAuditActionEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e ModAuditActionEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype NotificationEnum string\n\nconst (\n\tNotificationEnumFavoritePerformerScene NotificationEnum = \"FAVORITE_PERFORMER_SCENE\"\n\tNotificationEnumFavoritePerformerEdit  NotificationEnum = \"FAVORITE_PERFORMER_EDIT\"\n\tNotificationEnumFavoriteStudioScene    NotificationEnum = \"FAVORITE_STUDIO_SCENE\"\n\tNotificationEnumFavoriteStudioEdit     NotificationEnum = \"FAVORITE_STUDIO_EDIT\"\n\tNotificationEnumCommentOwnEdit         NotificationEnum = \"COMMENT_OWN_EDIT\"\n\tNotificationEnumDownvoteOwnEdit        NotificationEnum = \"DOWNVOTE_OWN_EDIT\"\n\tNotificationEnumFailedOwnEdit          NotificationEnum = \"FAILED_OWN_EDIT\"\n\tNotificationEnumCommentCommentedEdit   NotificationEnum = \"COMMENT_COMMENTED_EDIT\"\n\tNotificationEnumCommentVotedEdit       NotificationEnum = \"COMMENT_VOTED_EDIT\"\n\tNotificationEnumUpdatedEdit            NotificationEnum = \"UPDATED_EDIT\"\n\tNotificationEnumFingerprintedSceneEdit NotificationEnum = \"FINGERPRINTED_SCENE_EDIT\"\n)\n\nvar AllNotificationEnum = []NotificationEnum{\n\tNotificationEnumFavoritePerformerScene,\n\tNotificationEnumFavoritePerformerEdit,\n\tNotificationEnumFavoriteStudioScene,\n\tNotificationEnumFavoriteStudioEdit,\n\tNotificationEnumCommentOwnEdit,\n\tNotificationEnumDownvoteOwnEdit,\n\tNotificationEnumFailedOwnEdit,\n\tNotificationEnumCommentCommentedEdit,\n\tNotificationEnumCommentVotedEdit,\n\tNotificationEnumUpdatedEdit,\n\tNotificationEnumFingerprintedSceneEdit,\n}\n\nfunc (e NotificationEnum) IsValid() bool {\n\tswitch e {\n\tcase NotificationEnumFavoritePerformerScene, NotificationEnumFavoritePerformerEdit, NotificationEnumFavoriteStudioScene, NotificationEnumFavoriteStudioEdit, NotificationEnumCommentOwnEdit, NotificationEnumDownvoteOwnEdit, NotificationEnumFailedOwnEdit, NotificationEnumCommentCommentedEdit, NotificationEnumCommentVotedEdit, NotificationEnumUpdatedEdit, NotificationEnumFingerprintedSceneEdit:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e NotificationEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *NotificationEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = NotificationEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid NotificationEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e NotificationEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *NotificationEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e NotificationEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype OperationEnum string\n\nconst (\n\tOperationEnumCreate  OperationEnum = \"CREATE\"\n\tOperationEnumModify  OperationEnum = \"MODIFY\"\n\tOperationEnumDestroy OperationEnum = \"DESTROY\"\n\tOperationEnumMerge   OperationEnum = \"MERGE\"\n)\n\nvar AllOperationEnum = []OperationEnum{\n\tOperationEnumCreate,\n\tOperationEnumModify,\n\tOperationEnumDestroy,\n\tOperationEnumMerge,\n}\n\nfunc (e OperationEnum) IsValid() bool {\n\tswitch e {\n\tcase OperationEnumCreate, OperationEnumModify, OperationEnumDestroy, OperationEnumMerge:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e OperationEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *OperationEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = OperationEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid OperationEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e OperationEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *OperationEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e OperationEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype PerformerSortEnum string\n\nconst (\n\tPerformerSortEnumName            PerformerSortEnum = \"NAME\"\n\tPerformerSortEnumBirthdate       PerformerSortEnum = \"BIRTHDATE\"\n\tPerformerSortEnumDeathdate       PerformerSortEnum = \"DEATHDATE\"\n\tPerformerSortEnumSceneCount      PerformerSortEnum = \"SCENE_COUNT\"\n\tPerformerSortEnumCareerStartYear PerformerSortEnum = \"CAREER_START_YEAR\"\n\tPerformerSortEnumDebut           PerformerSortEnum = \"DEBUT\"\n\tPerformerSortEnumLastScene       PerformerSortEnum = \"LAST_SCENE\"\n\tPerformerSortEnumCreatedAt       PerformerSortEnum = \"CREATED_AT\"\n\tPerformerSortEnumUpdatedAt       PerformerSortEnum = \"UPDATED_AT\"\n)\n\nvar AllPerformerSortEnum = []PerformerSortEnum{\n\tPerformerSortEnumName,\n\tPerformerSortEnumBirthdate,\n\tPerformerSortEnumDeathdate,\n\tPerformerSortEnumSceneCount,\n\tPerformerSortEnumCareerStartYear,\n\tPerformerSortEnumDebut,\n\tPerformerSortEnumLastScene,\n\tPerformerSortEnumCreatedAt,\n\tPerformerSortEnumUpdatedAt,\n}\n\nfunc (e PerformerSortEnum) IsValid() bool {\n\tswitch e {\n\tcase PerformerSortEnumName, PerformerSortEnumBirthdate, PerformerSortEnumDeathdate, PerformerSortEnumSceneCount, PerformerSortEnumCareerStartYear, PerformerSortEnumDebut, PerformerSortEnumLastScene, PerformerSortEnumCreatedAt, PerformerSortEnumUpdatedAt:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e PerformerSortEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *PerformerSortEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = PerformerSortEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid PerformerSortEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e PerformerSortEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *PerformerSortEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e PerformerSortEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype RoleEnum string\n\nconst (\n\tRoleEnumRead     RoleEnum = \"READ\"\n\tRoleEnumVote     RoleEnum = \"VOTE\"\n\tRoleEnumEdit     RoleEnum = \"EDIT\"\n\tRoleEnumModify   RoleEnum = \"MODIFY\"\n\tRoleEnumModerate RoleEnum = \"MODERATE\"\n\tRoleEnumAdmin    RoleEnum = \"ADMIN\"\n\t// May generate invites without tokens\n\tRoleEnumInvite RoleEnum = \"INVITE\"\n\t// May grant and rescind invite tokens and resind invite keys\n\tRoleEnumManageInvites RoleEnum = \"MANAGE_INVITES\"\n\tRoleEnumBot           RoleEnum = \"BOT\"\n\tRoleEnumReadOnly      RoleEnum = \"READ_ONLY\"\n\tRoleEnumEditTags      RoleEnum = \"EDIT_TAGS\"\n)\n\nvar AllRoleEnum = []RoleEnum{\n\tRoleEnumRead,\n\tRoleEnumVote,\n\tRoleEnumEdit,\n\tRoleEnumModify,\n\tRoleEnumModerate,\n\tRoleEnumAdmin,\n\tRoleEnumInvite,\n\tRoleEnumManageInvites,\n\tRoleEnumBot,\n\tRoleEnumReadOnly,\n\tRoleEnumEditTags,\n}\n\nfunc (e RoleEnum) IsValid() bool {\n\tswitch e {\n\tcase RoleEnumRead, RoleEnumVote, RoleEnumEdit, RoleEnumModify, RoleEnumModerate, RoleEnumAdmin, RoleEnumInvite, RoleEnumManageInvites, RoleEnumBot, RoleEnumReadOnly, RoleEnumEditTags:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e RoleEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *RoleEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = RoleEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid RoleEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e RoleEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *RoleEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e RoleEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype SceneSortEnum string\n\nconst (\n\tSceneSortEnumTitle     SceneSortEnum = \"TITLE\"\n\tSceneSortEnumDate      SceneSortEnum = \"DATE\"\n\tSceneSortEnumTrending  SceneSortEnum = \"TRENDING\"\n\tSceneSortEnumCreatedAt SceneSortEnum = \"CREATED_AT\"\n\tSceneSortEnumUpdatedAt SceneSortEnum = \"UPDATED_AT\"\n)\n\nvar AllSceneSortEnum = []SceneSortEnum{\n\tSceneSortEnumTitle,\n\tSceneSortEnumDate,\n\tSceneSortEnumTrending,\n\tSceneSortEnumCreatedAt,\n\tSceneSortEnumUpdatedAt,\n}\n\nfunc (e SceneSortEnum) IsValid() bool {\n\tswitch e {\n\tcase SceneSortEnumTitle, SceneSortEnumDate, SceneSortEnumTrending, SceneSortEnumCreatedAt, SceneSortEnumUpdatedAt:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e SceneSortEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *SceneSortEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = SceneSortEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid SceneSortEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e SceneSortEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *SceneSortEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e SceneSortEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype SortDirectionEnum string\n\nconst (\n\tSortDirectionEnumAsc  SortDirectionEnum = \"ASC\"\n\tSortDirectionEnumDesc SortDirectionEnum = \"DESC\"\n)\n\nvar AllSortDirectionEnum = []SortDirectionEnum{\n\tSortDirectionEnumAsc,\n\tSortDirectionEnumDesc,\n}\n\nfunc (e SortDirectionEnum) IsValid() bool {\n\tswitch e {\n\tcase SortDirectionEnumAsc, SortDirectionEnumDesc:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e SortDirectionEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *SortDirectionEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = SortDirectionEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid SortDirectionEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e SortDirectionEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *SortDirectionEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e SortDirectionEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype StudioSortEnum string\n\nconst (\n\tStudioSortEnumName      StudioSortEnum = \"NAME\"\n\tStudioSortEnumCreatedAt StudioSortEnum = \"CREATED_AT\"\n\tStudioSortEnumUpdatedAt StudioSortEnum = \"UPDATED_AT\"\n)\n\nvar AllStudioSortEnum = []StudioSortEnum{\n\tStudioSortEnumName,\n\tStudioSortEnumCreatedAt,\n\tStudioSortEnumUpdatedAt,\n}\n\nfunc (e StudioSortEnum) IsValid() bool {\n\tswitch e {\n\tcase StudioSortEnumName, StudioSortEnumCreatedAt, StudioSortEnumUpdatedAt:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e StudioSortEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *StudioSortEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = StudioSortEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid StudioSortEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e StudioSortEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *StudioSortEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e StudioSortEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype TagGroupEnum string\n\nconst (\n\tTagGroupEnumPeople TagGroupEnum = \"PEOPLE\"\n\tTagGroupEnumScene  TagGroupEnum = \"SCENE\"\n\tTagGroupEnumAction TagGroupEnum = \"ACTION\"\n)\n\nvar AllTagGroupEnum = []TagGroupEnum{\n\tTagGroupEnumPeople,\n\tTagGroupEnumScene,\n\tTagGroupEnumAction,\n}\n\nfunc (e TagGroupEnum) IsValid() bool {\n\tswitch e {\n\tcase TagGroupEnumPeople, TagGroupEnumScene, TagGroupEnumAction:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e TagGroupEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *TagGroupEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = TagGroupEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid TagGroupEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e TagGroupEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *TagGroupEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e TagGroupEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype TagSortEnum string\n\nconst (\n\tTagSortEnumName      TagSortEnum = \"NAME\"\n\tTagSortEnumCreatedAt TagSortEnum = \"CREATED_AT\"\n\tTagSortEnumUpdatedAt TagSortEnum = \"UPDATED_AT\"\n)\n\nvar AllTagSortEnum = []TagSortEnum{\n\tTagSortEnumName,\n\tTagSortEnumCreatedAt,\n\tTagSortEnumUpdatedAt,\n}\n\nfunc (e TagSortEnum) IsValid() bool {\n\tswitch e {\n\tcase TagSortEnumName, TagSortEnumCreatedAt, TagSortEnumUpdatedAt:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e TagSortEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *TagSortEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = TagSortEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid TagSortEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e TagSortEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *TagSortEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e TagSortEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype TargetTypeEnum string\n\nconst (\n\tTargetTypeEnumScene     TargetTypeEnum = \"SCENE\"\n\tTargetTypeEnumStudio    TargetTypeEnum = \"STUDIO\"\n\tTargetTypeEnumPerformer TargetTypeEnum = \"PERFORMER\"\n\tTargetTypeEnumTag       TargetTypeEnum = \"TAG\"\n)\n\nvar AllTargetTypeEnum = []TargetTypeEnum{\n\tTargetTypeEnumScene,\n\tTargetTypeEnumStudio,\n\tTargetTypeEnumPerformer,\n\tTargetTypeEnumTag,\n}\n\nfunc (e TargetTypeEnum) IsValid() bool {\n\tswitch e {\n\tcase TargetTypeEnumScene, TargetTypeEnumStudio, TargetTypeEnumPerformer, TargetTypeEnumTag:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e TargetTypeEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *TargetTypeEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = TargetTypeEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid TargetTypeEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e TargetTypeEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *TargetTypeEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e TargetTypeEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype UserChangeEmailStatus string\n\nconst (\n\tUserChangeEmailStatusConfirmOld   UserChangeEmailStatus = \"CONFIRM_OLD\"\n\tUserChangeEmailStatusConfirmNew   UserChangeEmailStatus = \"CONFIRM_NEW\"\n\tUserChangeEmailStatusExpired      UserChangeEmailStatus = \"EXPIRED\"\n\tUserChangeEmailStatusInvalidToken UserChangeEmailStatus = \"INVALID_TOKEN\"\n\tUserChangeEmailStatusSuccess      UserChangeEmailStatus = \"SUCCESS\"\n\tUserChangeEmailStatusError        UserChangeEmailStatus = \"ERROR\"\n)\n\nvar AllUserChangeEmailStatus = []UserChangeEmailStatus{\n\tUserChangeEmailStatusConfirmOld,\n\tUserChangeEmailStatusConfirmNew,\n\tUserChangeEmailStatusExpired,\n\tUserChangeEmailStatusInvalidToken,\n\tUserChangeEmailStatusSuccess,\n\tUserChangeEmailStatusError,\n}\n\nfunc (e UserChangeEmailStatus) IsValid() bool {\n\tswitch e {\n\tcase UserChangeEmailStatusConfirmOld, UserChangeEmailStatusConfirmNew, UserChangeEmailStatusExpired, UserChangeEmailStatusInvalidToken, UserChangeEmailStatusSuccess, UserChangeEmailStatusError:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e UserChangeEmailStatus) String() string {\n\treturn string(e)\n}\n\nfunc (e *UserChangeEmailStatus) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = UserChangeEmailStatus(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid UserChangeEmailStatus\", str)\n\t}\n\treturn nil\n}\n\nfunc (e UserChangeEmailStatus) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *UserChangeEmailStatus) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e UserChangeEmailStatus) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype UserVotedFilterEnum string\n\nconst (\n\tUserVotedFilterEnumAbstain  UserVotedFilterEnum = \"ABSTAIN\"\n\tUserVotedFilterEnumAccept   UserVotedFilterEnum = \"ACCEPT\"\n\tUserVotedFilterEnumReject   UserVotedFilterEnum = \"REJECT\"\n\tUserVotedFilterEnumNotVoted UserVotedFilterEnum = \"NOT_VOTED\"\n)\n\nvar AllUserVotedFilterEnum = []UserVotedFilterEnum{\n\tUserVotedFilterEnumAbstain,\n\tUserVotedFilterEnumAccept,\n\tUserVotedFilterEnumReject,\n\tUserVotedFilterEnumNotVoted,\n}\n\nfunc (e UserVotedFilterEnum) IsValid() bool {\n\tswitch e {\n\tcase UserVotedFilterEnumAbstain, UserVotedFilterEnumAccept, UserVotedFilterEnumReject, UserVotedFilterEnumNotVoted:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e UserVotedFilterEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *UserVotedFilterEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = UserVotedFilterEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid UserVotedFilterEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e UserVotedFilterEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *UserVotedFilterEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e UserVotedFilterEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype ValidSiteTypeEnum string\n\nconst (\n\tValidSiteTypeEnumPerformer ValidSiteTypeEnum = \"PERFORMER\"\n\tValidSiteTypeEnumScene     ValidSiteTypeEnum = \"SCENE\"\n\tValidSiteTypeEnumStudio    ValidSiteTypeEnum = \"STUDIO\"\n)\n\nvar AllValidSiteTypeEnum = []ValidSiteTypeEnum{\n\tValidSiteTypeEnumPerformer,\n\tValidSiteTypeEnumScene,\n\tValidSiteTypeEnumStudio,\n}\n\nfunc (e ValidSiteTypeEnum) IsValid() bool {\n\tswitch e {\n\tcase ValidSiteTypeEnumPerformer, ValidSiteTypeEnumScene, ValidSiteTypeEnumStudio:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e ValidSiteTypeEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *ValidSiteTypeEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = ValidSiteTypeEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid ValidSiteTypeEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e ValidSiteTypeEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *ValidSiteTypeEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e ValidSiteTypeEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype VoteStatusEnum string\n\nconst (\n\tVoteStatusEnumAccepted          VoteStatusEnum = \"ACCEPTED\"\n\tVoteStatusEnumRejected          VoteStatusEnum = \"REJECTED\"\n\tVoteStatusEnumPending           VoteStatusEnum = \"PENDING\"\n\tVoteStatusEnumImmediateAccepted VoteStatusEnum = \"IMMEDIATE_ACCEPTED\"\n\tVoteStatusEnumImmediateRejected VoteStatusEnum = \"IMMEDIATE_REJECTED\"\n\tVoteStatusEnumFailed            VoteStatusEnum = \"FAILED\"\n\tVoteStatusEnumCanceled          VoteStatusEnum = \"CANCELED\"\n)\n\nvar AllVoteStatusEnum = []VoteStatusEnum{\n\tVoteStatusEnumAccepted,\n\tVoteStatusEnumRejected,\n\tVoteStatusEnumPending,\n\tVoteStatusEnumImmediateAccepted,\n\tVoteStatusEnumImmediateRejected,\n\tVoteStatusEnumFailed,\n\tVoteStatusEnumCanceled,\n}\n\nfunc (e VoteStatusEnum) IsValid() bool {\n\tswitch e {\n\tcase VoteStatusEnumAccepted, VoteStatusEnumRejected, VoteStatusEnumPending, VoteStatusEnumImmediateAccepted, VoteStatusEnumImmediateRejected, VoteStatusEnumFailed, VoteStatusEnumCanceled:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e VoteStatusEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *VoteStatusEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = VoteStatusEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid VoteStatusEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e VoteStatusEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *VoteStatusEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e VoteStatusEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n\ntype VoteTypeEnum string\n\nconst (\n\tVoteTypeEnumAbstain VoteTypeEnum = \"ABSTAIN\"\n\tVoteTypeEnumAccept  VoteTypeEnum = \"ACCEPT\"\n\tVoteTypeEnumReject  VoteTypeEnum = \"REJECT\"\n\t// Immediately accepts the edit - bypassing the vote\n\tVoteTypeEnumImmediateAccept VoteTypeEnum = \"IMMEDIATE_ACCEPT\"\n\t// Immediately rejects the edit - bypassing the vote\n\tVoteTypeEnumImmediateReject VoteTypeEnum = \"IMMEDIATE_REJECT\"\n)\n\nvar AllVoteTypeEnum = []VoteTypeEnum{\n\tVoteTypeEnumAbstain,\n\tVoteTypeEnumAccept,\n\tVoteTypeEnumReject,\n\tVoteTypeEnumImmediateAccept,\n\tVoteTypeEnumImmediateReject,\n}\n\nfunc (e VoteTypeEnum) IsValid() bool {\n\tswitch e {\n\tcase VoteTypeEnumAbstain, VoteTypeEnumAccept, VoteTypeEnumReject, VoteTypeEnumImmediateAccept, VoteTypeEnumImmediateReject:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e VoteTypeEnum) String() string {\n\treturn string(e)\n}\n\nfunc (e *VoteTypeEnum) UnmarshalGQL(v any) error {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"enums must be strings\")\n\t}\n\n\t*e = VoteTypeEnum(str)\n\tif !e.IsValid() {\n\t\treturn fmt.Errorf(\"%s is not a valid VoteTypeEnum\", str)\n\t}\n\treturn nil\n}\n\nfunc (e VoteTypeEnum) MarshalGQL(w io.Writer) {\n\tfmt.Fprint(w, strconv.Quote(e.String()))\n}\n\nfunc (e *VoteTypeEnum) UnmarshalJSON(b []byte) error {\n\ts, err := strconv.Unquote(string(b))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn e.UnmarshalGQL(s)\n}\n\nfunc (e VoteTypeEnum) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\te.MarshalGQL(&buf)\n\treturn buf.Bytes(), nil\n}\n"
  },
  {
    "path": "internal/models/model_draft.go",
    "content": "package models\n\nimport (\n\t\"encoding/json\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\ntype Draft struct {\n\tID        uuid.UUID       `db:\"id\" json:\"id\"`\n\tUserID    uuid.UUID       `db:\"user_id\" json:\"user_id\"`\n\tType      string          `db:\"type\" json:\"type\"`\n\tData      json.RawMessage `db:\"data\" json:\"data\"`\n\tCreatedAt time.Time       `db:\"created_at\" json:\"created_at\"`\n}\n\ntype DraftEntity struct {\n\tName string     `json:\"name\"`\n\tID   *uuid.UUID `json:\"id,omitempty\"`\n}\n\nfunc (DraftEntity) IsSceneDraftTag()       {}\nfunc (DraftEntity) IsSceneDraftPerformer() {}\nfunc (DraftEntity) IsSceneDraftStudio()    {}\n\ntype SceneDraft struct {\n\tID             *uuid.UUID         `json:\"id,omitempty\"`\n\tTitle          *string            `json:\"title,omitempty\"`\n\tCode           *string            `json:\"code,omitempty\"`\n\tDetails        *string            `json:\"details,omitempty\"`\n\tDirector       *string            `json:\"director,omitempty\"`\n\tURLs           []string           `json:\"urls,omitempty\"`\n\tDate           *string            `json:\"date,omitempty\"`\n\tProductionDate *string            `json:\"production_date,omitempty\"`\n\tStudio         *DraftEntity       `json:\"studio,omitempty\"`\n\tPerformers     []DraftEntity      `json:\"performers,omitempty\"`\n\tTags           []DraftEntity      `json:\"tags,omitempty\"`\n\tImage          *uuid.UUID         `json:\"image,omitempty\"`\n\tFingerprints   []DraftFingerprint `json:\"fingerprints\"`\n}\n\nfunc (SceneDraft) IsDraftData() {}\n\ntype PerformerDraft struct {\n\tID              *uuid.UUID `json:\"id,omitempty\"`\n\tName            string     `json:\"name\"`\n\tDisambiguation  *string    `json:\"disambiguation,omitempty\"`\n\tAliases         *string    `json:\"aliases,omitempty\"`\n\tGender          *string    `json:\"gender,omitempty\"`\n\tBirthdate       *string    `json:\"birthdate,omitempty\"`\n\tDeathdate       *string    `json:\"deathdate,omitempty\"`\n\tUrls            []string   `json:\"urls,omitempty\"`\n\tEthnicity       *string    `json:\"ethnicity,omitempty\"`\n\tCountry         *string    `json:\"country,omitempty\"`\n\tEyeColor        *string    `json:\"eye_color,omitempty\"`\n\tHairColor       *string    `json:\"hair_color,omitempty\"`\n\tHeight          *string    `json:\"height,omitempty\"`\n\tMeasurements    *string    `json:\"measurements,omitempty\"`\n\tBreastType      *string    `json:\"breast_type,omitempty\"`\n\tTattoos         *string    `json:\"tattoos,omitempty\"`\n\tPiercings       *string    `json:\"piercings,omitempty\"`\n\tCareerStartYear *int       `json:\"career_start_year,omitempty\"`\n\tCareerEndYear   *int       `json:\"career_end_year,omitempty\"`\n\tImage           *uuid.UUID `json:\"image,omitempty\"`\n}\n\nfunc (PerformerDraft) IsDraftData() {}\n\nfunc (e *Draft) GetPerformerData() (*PerformerDraft, error) {\n\tdata := PerformerDraft{}\n\terr := json.Unmarshal(e.Data, &data)\n\treturn &data, err\n}\n\nfunc (e *Draft) GetSceneData() (*SceneDraft, error) {\n\tdata := SceneDraft{}\n\terr := json.Unmarshal(e.Data, &data)\n\treturn &data, err\n}\n"
  },
  {
    "path": "internal/models/model_edit.go",
    "content": "package models\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\ntype Edit struct {\n\tID          uuid.UUID       `json:\"id\"`\n\tUserID      uuid.NullUUID   `json:\"user_id\"`\n\tTargetType  string          `json:\"target_type\"`\n\tOperation   string          `json:\"operation\"`\n\tVoteCount   int             `json:\"votes\"`\n\tStatus      string          `json:\"status\"`\n\tApplied     bool            `json:\"applied\"`\n\tData        json.RawMessage `json:\"data\"`\n\tBot         bool            `json:\"bot\"`\n\tCreatedAt   time.Time       `json:\"created_at\"`\n\tUpdateCount int             `json:\"update_count\"`\n\tUpdatedAt   *time.Time      `json:\"updated_at\"`\n\tClosedAt    *time.Time      `json:\"closed_at\"`\n}\n\ntype EditComment struct {\n\tID        uuid.UUID     `json:\"id\"`\n\tEditID    uuid.UUID     `json:\"edit_id\"`\n\tUserID    uuid.NullUUID `json:\"user_id\"`\n\tCreatedAt time.Time     `json:\"created_at\"`\n\tText      string        `json:\"text\"`\n}\n\ntype EditVote struct {\n\tEditID    uuid.UUID `json:\"edit_id\"`\n\tUserID    uuid.UUID `json:\"user_id\"`\n\tCreatedAt time.Time `json:\"created_at\"`\n\tVote      string    `json:\"vote\"`\n}\n\nfunc NewEdit(id uuid.UUID, user *User, targetType TargetTypeEnum, input *EditInput) *Edit {\n\tuserID := uuid.NullUUID{UUID: user.ID, Valid: true}\n\tret := &Edit{\n\t\tID:         id,\n\t\tUserID:     userID,\n\t\tTargetType: targetType.String(),\n\t\tStatus:     VoteStatusEnumPending.String(),\n\t\tOperation:  input.Operation.String(),\n\t}\n\n\tif input.Bot != nil && *input.Bot {\n\t\tret.Bot = true\n\t} else {\n\t\tret.Bot = false\n\t}\n\n\treturn ret\n}\n\nfunc NewEditComment(id uuid.UUID, userID uuid.UUID, edit *Edit, text string) *EditComment {\n\tret := &EditComment{\n\t\tID:     id,\n\t\tEditID: edit.ID,\n\t\tUserID: uuid.NullUUID{UUID: userID, Valid: true},\n\t\tText:   text,\n\t}\n\n\treturn ret\n}\n\nfunc (e *Edit) Accept() {\n\te.Status = VoteStatusEnumAccepted.String()\n\te.Applied = true\n\tnow := time.Now()\n\te.ClosedAt = &now\n}\n\nfunc (e *Edit) ImmediateAccept() {\n\te.Status = VoteStatusEnumImmediateAccepted.String()\n\te.Applied = true\n\tnow := time.Now()\n\te.ClosedAt = &now\n}\n\nfunc (e *Edit) ImmediateReject() {\n\te.Status = VoteStatusEnumImmediateRejected.String()\n\tnow := time.Now()\n\te.ClosedAt = &now\n}\n\nfunc (e *Edit) Reject() {\n\te.Status = VoteStatusEnumRejected.String()\n\tnow := time.Now()\n\te.ClosedAt = &now\n}\n\nfunc (e *Edit) Fail() {\n\te.Status = VoteStatusEnumFailed.String()\n\tnow := time.Now()\n\te.ClosedAt = &now\n}\n\nfunc (e *Edit) Cancel() {\n\te.Status = VoteStatusEnumCanceled.String()\n\tnow := time.Now()\n\te.ClosedAt = &now\n}\n\nfunc (e *Edit) SetData(data any) error {\n\tbuffer := &bytes.Buffer{}\n\tencoder := json.NewEncoder(buffer)\n\tencoder.SetEscapeHTML(false)\n\tencoder.SetIndent(\"\", \"  \")\n\tif err := encoder.Encode(data); err != nil {\n\t\treturn err\n\t}\n\te.Data = buffer.Bytes()\n\treturn nil\n}\n\ntype EditData struct {\n\tNew          *json.RawMessage `json:\"new_data,omitempty\"`\n\tOld          *json.RawMessage `json:\"old_data,omitempty\"`\n\tMergeSources []uuid.UUID      `json:\"merge_sources,omitempty\"`\n}\n\nfunc (e *Edit) GetData() *EditData {\n\tdata := EditData{}\n\terr := json.Unmarshal(e.Data, &data)\n\tif err != nil {\n\t\treturn nil\n\t}\n\treturn &data\n}\n\nfunc (e *Edit) GetTagData() (*TagEditData, error) {\n\tdata := TagEditData{}\n\t_ = json.Unmarshal(e.Data, &data)\n\treturn &data, nil\n}\n\nfunc (e *Edit) GetPerformerData() (*PerformerEditData, error) {\n\tdata := PerformerEditData{}\n\t_ = json.Unmarshal(e.Data, &data)\n\treturn &data, nil\n}\n\nfunc (e *Edit) GetStudioData() (*StudioEditData, error) {\n\tdata := StudioEditData{}\n\t_ = json.Unmarshal(e.Data, &data)\n\treturn &data, nil\n}\n\nfunc (e *Edit) GetSceneData() (*SceneEditData, error) {\n\tdata := SceneEditData{}\n\t_ = json.Unmarshal(e.Data, &data)\n\treturn &data, nil\n}\n\nfunc (e *Edit) IsDestructive() bool {\n\tif e.Operation == OperationEnumDestroy.String() || e.Operation == OperationEnumMerge.String() {\n\t\treturn true\n\t}\n\t// When renaming a performer and not updating the performance aliases\n\tif (e.Operation == OperationEnumModify.String() || e.Operation == OperationEnumMerge.String()) && e.TargetType == TargetTypeEnumPerformer.String() {\n\t\tdata, _ := e.GetPerformerData()\n\t\tif data.New.Name != nil {\n\t\t\toldName := \"\"\n\t\t\tif data.Old.Name != nil {\n\t\t\t\toldName = strings.TrimSpace(*data.Old.Name)\n\t\t\t}\n\t\t\treturn oldName != *data.New.Name && !data.SetModifyAliases\n\t\t}\n\t}\n\treturn false\n}\n\ntype TagEdit struct {\n\tEditID         uuid.UUID  `json:\"-\"`\n\tName           *string    `json:\"name,omitempty\"`\n\tDescription    *string    `json:\"description,omitempty\"`\n\tAddedAliases   []string   `json:\"added_aliases,omitempty\"`\n\tRemovedAliases []string   `json:\"removed_aliases,omitempty\"`\n\tCategoryID     *uuid.UUID `json:\"category_id,omitempty\"`\n}\n\nfunc (TagEdit) IsEditDetails() {}\n\ntype TagEditData struct {\n\tNew          *TagEdit    `json:\"new_data,omitempty\"`\n\tOld          *TagEdit    `json:\"old_data,omitempty\"`\n\tMergeSources []uuid.UUID `json:\"merge_sources,omitempty\"`\n}\n\ntype PerformerEdit struct {\n\tEditID           uuid.UUID          `json:\"-\"`\n\tName             *string            `json:\"name,omitempty\"`\n\tDisambiguation   *string            `json:\"disambiguation,omitempty\"`\n\tAddedAliases     []string           `json:\"added_aliases,omitempty\"`\n\tRemovedAliases   []string           `json:\"removed_aliases,omitempty\"`\n\tGender           *string            `json:\"gender,omitempty\"`\n\tAddedUrls        []URL              `json:\"added_urls,omitempty\"`\n\tRemovedUrls      []URL              `json:\"removed_urls,omitempty\"`\n\tBirthdate        *string            `json:\"birthdate,omitempty\"`\n\tDeathdate        *string            `json:\"deathdate,omitempty\"`\n\tEthnicity        *string            `json:\"ethnicity,omitempty\"`\n\tCountry          *string            `json:\"country,omitempty\"`\n\tEyeColor         *string            `json:\"eye_color,omitempty\"`\n\tHairColor        *string            `json:\"hair_color,omitempty\"`\n\tHeight           *int               `json:\"height,omitempty\"`\n\tCupSize          *string            `json:\"cup_size,omitempty\"`\n\tBandSize         *int               `json:\"band_size,omitempty\"`\n\tWaistSize        *int               `json:\"waist_size,omitempty\"`\n\tHipSize          *int               `json:\"hip_size,omitempty\"`\n\tBreastType       *string            `json:\"breast_type,omitempty\"`\n\tCareerStartYear  *int               `json:\"career_start_year,omitempty\"`\n\tCareerEndYear    *int               `json:\"career_end_year,omitempty\"`\n\tAddedTattoos     []BodyModification `json:\"added_tattoos,omitempty\"`\n\tRemovedTattoos   []BodyModification `json:\"removed_tattoos,omitempty\"`\n\tAddedPiercings   []BodyModification `json:\"added_piercings,omitempty\"`\n\tRemovedPiercings []BodyModification `json:\"removed_piercings,omitempty\"`\n\tAddedImages      []uuid.UUID        `json:\"added_images,omitempty\"`\n\tRemovedImages    []uuid.UUID        `json:\"removed_images,omitempty\"`\n\tDraftID          *uuid.UUID         `json:\"draft_id,omitempty\"`\n}\n\nfunc (PerformerEdit) IsEditDetails() {}\n\ntype PerformerEditData struct {\n\tNew              *PerformerEdit `json:\"new_data,omitempty\"`\n\tOld              *PerformerEdit `json:\"old_data,omitempty\"`\n\tMergeSources     []uuid.UUID    `json:\"merge_sources,omitempty\"`\n\tSetModifyAliases bool           `json:\"modify_aliases,omitempty\"`\n\tSetMergeAliases  bool           `json:\"merge_aliases,omitempty\"`\n}\n\ntype StudioEdit struct {\n\tEditID uuid.UUID `json:\"-\"`\n\tName   *string   `json:\"name\"`\n\t// Added and modified URLs\n\tAddedUrls      []URL       `json:\"added_urls,omitempty\"`\n\tRemovedUrls    []URL       `json:\"removed_urls,omitempty\"`\n\tParentID       *uuid.UUID  `json:\"parent_id,omitempty\"`\n\tAddedImages    []uuid.UUID `json:\"added_images,omitempty\"`\n\tRemovedImages  []uuid.UUID `json:\"removed_images,omitempty\"`\n\tAddedAliases   []string    `json:\"added_aliases,omitempty\"`\n\tRemovedAliases []string    `json:\"removed_aliases,omitempty\"`\n}\n\nfunc (StudioEdit) IsEditDetails() {}\n\ntype StudioEditData struct {\n\tNew          *StudioEdit `json:\"new_data,omitempty\"`\n\tOld          *StudioEdit `json:\"old_data,omitempty\"`\n\tMergeSources []uuid.UUID `json:\"merge_sources,omitempty\"`\n}\n\ntype SceneEdit struct {\n\tEditID              uuid.UUID                  `json:\"-\"`\n\tTitle               *string                    `json:\"title,omitempty\"`\n\tDetails             *string                    `json:\"details,omitempty\"`\n\tAddedUrls           []URL                      `json:\"added_urls,omitempty\"`\n\tRemovedUrls         []URL                      `json:\"removed_urls,omitempty\"`\n\tDate                *string                    `json:\"date,omitempty\"`\n\tProductionDate      *string                    `json:\"production_date,omitempty\"`\n\tStudioID            *uuid.UUID                 `json:\"studio_id,omitempty\"`\n\tAddedPerformers     []PerformerAppearanceInput `json:\"added_performers,omitempty\"`\n\tRemovedPerformers   []PerformerAppearanceInput `json:\"removed_performers,omitempty\"`\n\tAddedTags           []uuid.UUID                `json:\"added_tags,omitempty\"`\n\tRemovedTags         []uuid.UUID                `json:\"removed_tags,omitempty\"`\n\tAddedImages         []uuid.UUID                `json:\"added_images,omitempty\"`\n\tRemovedImages       []uuid.UUID                `json:\"removed_images,omitempty\"`\n\tAddedFingerprints   []FingerprintInput         `json:\"added_fingerprints,omitempty\"`\n\tRemovedFingerprints []FingerprintInput         `json:\"removed_fingerprints,omitempty\"`\n\tDuration            *int                       `json:\"duration,omitempty\"`\n\tDirector            *string                    `json:\"director,omitempty\"`\n\tCode                *string                    `json:\"code,omitempty\"`\n\tDraftID             *uuid.UUID                 `json:\"draft_id,omitempty\"`\n}\n\nfunc (SceneEdit) IsEditDetails() {}\n\ntype SceneEditData struct {\n\tNew          *SceneEdit  `json:\"new_data,omitempty\"`\n\tOld          *SceneEdit  `json:\"old_data,omitempty\"`\n\tMergeSources []uuid.UUID `json:\"merge_sources,omitempty\"`\n}\n\ntype EditQuery struct {\n\tFilter EditQueryInput\n}\n"
  },
  {
    "path": "internal/models/model_image.go",
    "content": "package models\n\nimport (\n\t\"github.com/gofrs/uuid\"\n)\n\ntype Image struct {\n\tID        uuid.UUID `json:\"id\"`\n\tRemoteURL *string   `json:\"url\"`\n\tChecksum  string    `json:\"checksum\"`\n\tWidth     int       `json:\"width\"`\n\tHeight    int       `json:\"height\"`\n}\n"
  },
  {
    "path": "internal/models/model_invite_key.go",
    "content": "package models\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\ntype InviteKey struct {\n\tID          uuid.UUID  `json:\"id\"`\n\tUses        *int       `json:\"uses\"`\n\tGeneratedBy uuid.UUID  `json:\"generated_by\"`\n\tGeneratedAt time.Time  `json:\"generated_at\"`\n\tExpires     *time.Time `json:\"expires\"`\n}\n\nfunc (p InviteKey) String() string {\n\tuses := \"unlimited\"\n\texpires := \"never\"\n\n\tif p.Uses != nil {\n\t\tuses = fmt.Sprintf(\"%d\", *p.Uses)\n\t}\n\tif p.Expires != nil {\n\t\texpires = p.Expires.Format(time.RFC3339)\n\t}\n\n\treturn fmt.Sprintf(\"%s: [%s] expires %s\", p.ID, uses, expires)\n}\n"
  },
  {
    "path": "internal/models/model_mod_audit.go",
    "content": "package models\n\nimport (\n\t\"encoding/json\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\ntype ModAudit struct {\n\tID         uuid.UUID     `json:\"id\"`\n\tAction     string        `json:\"action\"`\n\tUserID     uuid.NullUUID `json:\"user_id\"`\n\tTargetID   uuid.UUID     `json:\"target_id\"`\n\tTargetType string        `json:\"target_type\"`\n\tData       string        `json:\"data\"`\n\tReason     *string       `json:\"reason,omitempty\"`\n\tCreatedAt  time.Time     `json:\"created_at\"`\n}\n\ntype ModAuditQuery struct {\n\tFilter ModAuditQueryInput\n}\n\ntype EditAmendmentAuditData struct {\n\tEditID      uuid.UUID       `json:\"edit_id\"`\n\tAmendedBy   uuid.UUID       `json:\"amended_by\"`\n\tAmendedAt   time.Time       `json:\"amended_at\"`\n\tRemovedData json.RawMessage `json:\"removed_data\"`\n}\n"
  },
  {
    "path": "internal/models/model_notification.go",
    "content": "package models\n\nimport (\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\ntype Notification struct {\n\tUserID    uuid.UUID        `json:\"user_id\"`\n\tType      NotificationEnum `json:\"type\"`\n\tTargetID  uuid.UUID        `json:\"id\"`\n\tCreatedAt time.Time        `json:\"created_at\"`\n\tReadAt    *time.Time       `json:\"read_at\"`\n}\n\ntype QueryNotificationsResult struct {\n\tInput QueryNotificationsInput\n}\n\nvar defaultSubscriptions = []NotificationEnum{\n\tNotificationEnumCommentOwnEdit,\n\tNotificationEnumDownvoteOwnEdit,\n\tNotificationEnumFailedOwnEdit,\n\tNotificationEnumCommentCommentedEdit,\n\tNotificationEnumCommentVotedEdit,\n\tNotificationEnumUpdatedEdit,\n}\n\nfunc GetDefaultNotificationSubscriptions() []NotificationEnum {\n\treturn defaultSubscriptions\n}\n"
  },
  {
    "path": "internal/models/model_performer.go",
    "content": "package models\n\nimport (\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models/assign\"\n\t\"github.com/stashapp/stash-box/internal/models/validator\"\n)\n\ntype Performer struct {\n\tID              uuid.UUID       `json:\"id\"`\n\tName            string          `json:\"name\"`\n\tDisambiguation  *string         `json:\"disambiguation,omitempty\"`\n\tGender          *GenderEnum     `json:\"gender,omitempty\"`\n\tBirthDate       *string         `json:\"birth_date,omitempty\"`\n\tDeathDate       *string         `json:\"death_date,omitempty\"`\n\tEthnicity       *EthnicityEnum  `json:\"ethnicity,omitempty\"`\n\tCountry         *string         `json:\"country,omitempty\"`\n\tEyeColor        *EyeColorEnum   `json:\"eye_color,omitempty\"`\n\tHairColor       *HairColorEnum  `json:\"hair_color,omitempty\"`\n\tHeight          *int            `json:\"height,omitempty\"`\n\tCupSize         *string         `json:\"cup_size,omitempty\"`\n\tBandSize        *int            `json:\"band_size,omitempty\"`\n\tWaistSize       *int            `json:\"waist_size,omitempty\"`\n\tHipSize         *int            `json:\"hip_size,omitempty\"`\n\tBreastType      *BreastTypeEnum `json:\"breast_type,omitempty\"`\n\tCareerStartYear *int            `json:\"career_start_year,omitempty\"`\n\tCareerEndYear   *int            `json:\"career_end_year,omitempty\"`\n\tDeleted         bool            `json:\"deleted\"`\n\tCreated         time.Time       `json:\"created\"`\n\tUpdated         time.Time       `json:\"updated\"`\n}\n\nfunc (Performer) IsSceneDraftPerformer() {}\nfunc (p *Performer) IsEditTarget()       {}\n\ntype PerformerQuery struct {\n\tFilter PerformerQueryInput\n\n\tSearchResults *PerformerSearchResults\n}\n\ntype GenderFacet struct {\n\tGender GenderEnum\n\tCount  int\n}\n\ntype PerformerSearchFacets struct {\n\tGenders []GenderFacet\n}\n\ntype PerformerSearchResults struct {\n\tPerformers []Performer\n\tCount      int\n\tFacets     *PerformerSearchFacets\n}\n\ntype QueryExistingPerformerResult struct {\n\tInput QueryExistingPerformerInput\n}\n\nfunc (p Performer) IsDeleted() bool {\n\treturn p.Deleted\n}\n\nfunc (p *Performer) CopyFromPerformerEdit(input PerformerEdit, old PerformerEdit) {\n\tassign.String(&p.Name, input.Name)\n\tassign.StringPtr(&p.Disambiguation, input.Disambiguation, old.Disambiguation)\n\tassign.EnumPtr(&p.Gender, input.Gender, old.Gender)\n\tassign.EnumPtr(&p.Ethnicity, input.Ethnicity, old.Ethnicity)\n\tassign.StringPtr(&p.Country, input.Country, old.Country)\n\tassign.EnumPtr(&p.EyeColor, input.EyeColor, old.EyeColor)\n\tassign.EnumPtr(&p.HairColor, input.HairColor, old.HairColor)\n\tassign.IntPtr(&p.Height, input.Height, old.Height)\n\tassign.EnumPtr(&p.BreastType, input.BreastType, old.BreastType)\n\tassign.IntPtr(&p.CareerStartYear, input.CareerStartYear, old.CareerStartYear)\n\tassign.IntPtr(&p.CareerEndYear, input.CareerEndYear, old.CareerEndYear)\n\tassign.StringPtr(&p.CupSize, input.CupSize, old.CupSize)\n\tassign.IntPtr(&p.BandSize, input.BandSize, old.BandSize)\n\tassign.IntPtr(&p.HipSize, input.HipSize, old.HipSize)\n\tassign.IntPtr(&p.WaistSize, input.WaistSize, old.WaistSize)\n\tassign.StringPtr(&p.BirthDate, input.Birthdate, old.Birthdate)\n\tassign.StringPtr(&p.DeathDate, input.Deathdate, old.Deathdate)\n}\n\nfunc (p *Performer) ValidateModifyEdit(edit PerformerEditData) error {\n\tif err := validator.String(\"name\", edit.Old.Name, p.Name); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.StringPtr(\"disambiguation\", edit.Old.Disambiguation, p.Disambiguation); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.EnumPtr(\"gender\", edit.Old.Gender, p.Gender); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.EnumPtr(\"ethnicity\", edit.Old.Ethnicity, p.Ethnicity); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.StringPtr(\"country\", edit.Old.Country, p.Country); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.EnumPtr(\"eye color\", edit.Old.EyeColor, p.EyeColor); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.EnumPtr(\"hair color\", edit.Old.HairColor, p.HairColor); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.IntPtr(\"height\", edit.Old.Height, p.Height); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.EnumPtr(\"breast type\", edit.Old.BreastType, p.BreastType); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.IntPtr(\"career start year\", edit.Old.CareerStartYear, p.CareerStartYear); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.IntPtr(\"career end year\", edit.Old.CareerEndYear, p.CareerEndYear); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.StringPtr(\"cup size\", edit.Old.CupSize, p.CupSize); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.IntPtr(\"band size\", edit.Old.BandSize, p.BandSize); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.IntPtr(\"hip size\", edit.Old.HipSize, p.HipSize); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.IntPtr(\"waist size\", edit.Old.WaistSize, p.WaistSize); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.StringPtr(\"birthdate\", edit.Old.Birthdate, p.BirthDate); err != nil {\n\t\treturn err\n\t}\n\treturn validator.StringPtr(\"deathdate\", edit.Old.Deathdate, p.DeathDate)\n}\n"
  },
  {
    "path": "internal/models/model_scene.go",
    "content": "package models\n\nimport (\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models/assign\"\n\t\"github.com/stashapp/stash-box/internal/models/validator\"\n)\n\ntype Scene struct {\n\tID             uuid.UUID     `json:\"id\"`\n\tTitle          *string       `json:\"title\"`\n\tDetails        *string       `json:\"details\"`\n\tDate           *string       `json:\"date\"`\n\tProductionDate *string       `json:\"production_date\"`\n\tStudioID       uuid.NullUUID `json:\"studio_id\"`\n\tCreatedAt      time.Time     `json:\"created_at\"`\n\tUpdatedAt      time.Time     `json:\"updated_at\"`\n\tDuration       *int          `json:\"duration\"`\n\tDirector       *string       `json:\"director\"`\n\tCode           *string       `json:\"code\"`\n\tDeleted        bool          `json:\"deleted\"`\n}\n\nfunc (s *Scene) IsEditTarget() {}\n\ntype SceneFingerprint struct {\n\tSceneID   uuid.UUID       `json:\"scene_id\"`\n\tUserID    uuid.UUID       `json:\"user_id\"`\n\tHash      FingerprintHash `json:\"hash\"`\n\tAlgorithm string          `json:\"algorithm\"`\n\tDuration  int             `json:\"duration\"`\n\tCreatedAt time.Time       `json:\"created_at\"`\n\tVote      int             `json:\"vote\"`\n}\n\ntype SceneQuery struct {\n\tFilter SceneQueryInput\n\n\tSearchResults *SceneSearchResults\n}\n\ntype SceneSearchResults struct {\n\tScenes []Scene\n\tCount  int\n}\n\ntype QueryExistingSceneResult struct {\n\tInput QueryExistingSceneInput\n}\n\nfunc (s Scene) IsDeleted() bool {\n\treturn s.Deleted\n}\n\nfunc (s *Scene) CopyFromSceneEdit(input SceneEdit, old *SceneEdit) {\n\tassign.StringPtr(&s.Title, input.Title, old.Title)\n\tassign.StringPtr(&s.Details, input.Details, old.Details)\n\tassign.NullUUID(&s.StudioID, input.StudioID, old.StudioID)\n\tassign.IntPtr(&s.Duration, input.Duration, old.Duration)\n\tassign.StringPtr(&s.Director, input.Director, old.Director)\n\tassign.StringPtr(&s.Code, input.Code, old.Code)\n\tassign.StringPtr(&s.Date, input.Date, old.Date)\n\tassign.StringPtr(&s.ProductionDate, input.ProductionDate, old.ProductionDate)\n}\n\nfunc (s *Scene) ValidateModifyEdit(edit SceneEditData) error {\n\tif err := validator.StringPtr(\"Title\", edit.Old.Title, s.Title); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.StringPtr(\"Details\", edit.Old.Details, s.Details); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.StringPtr(\"Date\", edit.Old.Date, s.Date); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.StringPtr(\"ProductionDate\", edit.Old.ProductionDate, s.ProductionDate); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.UUID(\"StudioID\", edit.Old.StudioID, s.StudioID); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.IntPtr(\"Duration\", edit.Old.Duration, s.Duration); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.StringPtr(\"Director\", edit.Old.Director, s.Director); err != nil {\n\t\treturn err\n\t}\n\treturn validator.StringPtr(\"Code\", edit.Old.Code, s.Code)\n}\n\ntype PerformerScene struct {\n\tPerformerID uuid.UUID\n\tAs          *string\n\tSceneID     uuid.UUID\n}\n"
  },
  {
    "path": "internal/models/model_site.go",
    "content": "package models\n\nimport (\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\ntype Site struct {\n\tID          uuid.UUID `json:\"id\"`\n\tName        string    `json:\"name\"`\n\tDescription *string   `json:\"description\"`\n\tURL         *string   `json:\"url\"`\n\tRegex       *string   `json:\"regex\"`\n\tValidTypes  []string  `json:\"valid_types\"`\n\tCreatedAt   time.Time `json:\"created_at\"`\n\tUpdatedAt   time.Time `json:\"updated_at\"`\n}\n"
  },
  {
    "path": "internal/models/model_studio.go",
    "content": "package models\n\nimport (\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models/assign\"\n\t\"github.com/stashapp/stash-box/internal/models/validator\"\n)\n\ntype Studio struct {\n\tID             uuid.UUID     `json:\"id\"`\n\tName           string        `json:\"name\"`\n\tParentStudioID uuid.NullUUID `json:\"parent_studio_id\"`\n\tCreatedAt      time.Time     `json:\"created_at\"`\n\tUpdatedAt      time.Time     `json:\"updated_at\"`\n\tDeleted        bool          `json:\"deleted\"`\n}\n\nfunc (Studio) IsSceneDraftStudio() {}\nfunc (s *Studio) IsEditTarget()    {}\n\nfunc (s Studio) IsDeleted() bool {\n\treturn s.Deleted\n}\n\nfunc (s *Studio) CopyFromStudioEdit(input StudioEdit, existing *StudioEdit) {\n\tassign.String(&s.Name, input.Name)\n\tassign.NullUUID(&s.ParentStudioID, input.ParentID, existing.ParentID)\n}\n\nfunc (s *Studio) ValidateModifyEdit(edit StudioEditData) error {\n\tif err := validator.String(\"name\", edit.Old.Name, s.Name); err != nil {\n\t\treturn err\n\t}\n\treturn validator.UUID(\"ParentID\", edit.Old.ParentID, s.ParentStudioID)\n}\n"
  },
  {
    "path": "internal/models/model_tag.go",
    "content": "package models\n\nimport (\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models/assign\"\n\t\"github.com/stashapp/stash-box/internal/models/validator\"\n)\n\ntype Tag struct {\n\tID          uuid.UUID `json:\"id\"`\n\tName        string    `json:\"name\"`\n\tDescription *string   `json:\"description,omitempty\"`\n\tDeleted     bool      `json:\"deleted\"`\n\tCategoryID  uuid.NullUUID\n\tCreated     time.Time `json:\"created\"`\n\tUpdated     time.Time `json:\"updated\"`\n}\n\nfunc (Tag) IsSceneDraftTag() {}\nfunc (t *Tag) IsEditTarget() {}\n\nfunc (t Tag) IsDeleted() bool {\n\treturn t.Deleted\n}\n\nfunc (t *Tag) CopyFromTagEdit(input TagEdit, existing *TagEdit) {\n\tassign.String(&t.Name, input.Name)\n\tassign.StringPtr(&t.Description, input.Description, existing.Description)\n\tassign.NullUUID(&t.CategoryID, input.CategoryID, existing.CategoryID)\n}\n\nfunc (t *Tag) ValidateModifyEdit(edit TagEditData) error {\n\tif err := validator.String(\"name\", edit.Old.Name, t.Name); err != nil {\n\t\treturn err\n\t}\n\tif err := validator.StringPtr(\"description\", edit.Old.Description, t.Description); err != nil {\n\t\treturn err\n\t}\n\treturn validator.UUID(\"CategoryID\", edit.Old.CategoryID, t.CategoryID)\n}\n"
  },
  {
    "path": "internal/models/model_tag_category.go",
    "content": "package models\n\nimport (\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\ntype TagCategory struct {\n\tID          uuid.UUID `json:\"id\"`\n\tName        string    `json:\"name\"`\n\tGroup       string    `json:\"group\"`\n\tDescription *string   `json:\"description\"`\n\tCreatedAt   time.Time `json:\"created_at\"`\n\tUpdatedAt   time.Time `json:\"updated_at\"`\n}\n"
  },
  {
    "path": "internal/models/model_user.go",
    "content": "package models\n\nimport (\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\ntype User struct {\n\tID           uuid.UUID     `json:\"id\"`\n\tName         string        `json:\"name\"`\n\tPasswordHash string        `json:\"password_hash\"`\n\tEmail        string        `json:\"email\"`\n\tAPIKey       string        `json:\"api_key\"`\n\tAPICalls     int           `json:\"api_calls\"`\n\tInviteTokens int           `json:\"invite_tokens\"`\n\tInvitedByID  uuid.NullUUID `json:\"invited_by\"`\n\tLastAPICall  time.Time     `json:\"last_api_call\"`\n\tCreatedAt    time.Time     `json:\"created_at\"`\n\tUpdatedAt    time.Time     `json:\"updated_at\"`\n}\n\nfunc (p *User) SetPasswordHash(pw string) error {\n\t// generate password from input\n\thash, err := bcrypt.GenerateFromPassword([]byte(pw), bcrypt.DefaultCost)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tp.PasswordHash = string(hash)\n\n\treturn nil\n}\n\nfunc (p User) IsPasswordCorrect(pw string) bool {\n\terr := bcrypt.CompareHashAndPassword([]byte(p.PasswordHash), []byte(pw))\n\treturn err == nil\n}\n"
  },
  {
    "path": "internal/models/model_user_tokens.go",
    "content": "package models\n\nimport (\n\t\"encoding/json\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\nconst (\n\tUserTokenTypeNewUser         = \"NEW_USER\"\n\tUserTokenTypeResetPassword   = \"RESET_PASSWORD\"\n\tUserTokenTypeConfirmOldEmail = \"CONFIRM_OLD_EMAIL\"\n\tUserTokenTypeConfirmNewEmail = \"CONFIRM_NEW_EMAIL\"\n)\n\ntype UserToken struct {\n\tID        uuid.UUID       `json:\"id\"`\n\tData      json.RawMessage `json:\"data\"`\n\tType      string          `json:\"type\"`\n\tCreatedAt time.Time       `json:\"created_at\"`\n\tExpiresAt time.Time       `json:\"expires_at\"`\n}\n\nfunc (t *UserToken) SetData(data interface{}) error {\n\tjsonData, err := utils.ToJSON(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\tt.Data = jsonData\n\treturn nil\n}\n\ntype NewUserTokenData struct {\n\tEmail     string     `json:\"email\"`\n\tInviteKey *uuid.UUID `json:\"invite_key,omitempty\"`\n}\n\nfunc (t *UserToken) GetNewUserTokenData() (*NewUserTokenData, error) {\n\tvar obj NewUserTokenData\n\terr := utils.FromJSON(t.Data, &obj)\n\treturn &obj, err\n}\n\ntype UserTokenData struct {\n\tUserID uuid.UUID `json:\"user_id\"`\n}\n\nfunc (t *UserToken) GetUserTokenData() (*UserTokenData, error) {\n\tvar obj UserTokenData\n\terr := utils.FromJSON(t.Data, &obj)\n\treturn &obj, err\n}\n\ntype ChangeEmailTokenData struct {\n\tUserID uuid.UUID `json:\"user_id\"`\n\tEmail  string    `json:\"email\"`\n}\n\nfunc (t *UserToken) GetChangeEmailTokenData() (*ChangeEmailTokenData, error) {\n\tvar obj ChangeEmailTokenData\n\terr := utils.FromJSON(t.Data, &obj)\n\treturn &obj, err\n}\n"
  },
  {
    "path": "internal/models/scalars.go",
    "content": "package models\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/99designs/gqlgen/graphql\"\n\t\"github.com/gofrs/uuid\"\n)\n\ntype ID uuid.UUID\n\n// Creates a marshaller which converts a uuid to a string\nfunc MarshalID(id uuid.UUID) graphql.Marshaler {\n\treturn graphql.WriterFunc(func(w io.Writer) {\n\t\t_, e := io.WriteString(w, fmt.Sprintf(\"%s%s%s\", \"\\\"\", id.String(), \"\\\"\"))\n\t\tif e != nil {\n\t\t\tpanic(e)\n\t\t}\n\t})\n}\n\n// Unmarshalls a string to a uuid\nfunc UnmarshalID(v any) (uuid.UUID, error) {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn uuid.UUID{}, fmt.Errorf(\"ids must be strings\")\n\t}\n\twithoutQuotes := strings.ReplaceAll(str, \"\\\"\", \"\")\n\ti, err := uuid.FromString(withoutQuotes)\n\treturn i, err\n}\n\n// FingerprintHash stores fingerprint hashes as int64 internally\n// but serializes as hex string\ntype FingerprintHash int64\n\nfunc (h FingerprintHash) Int64() int64 {\n\treturn int64(h)\n}\n\n// Hex returns the hash as a 16-character zero-padded hex string\nfunc (h FingerprintHash) Hex() string {\n\treturn fmt.Sprintf(\"%016x\", uint64(h))\n}\n\n// MarshalJSON serializes as hex string for JSONB storage compatibility\nfunc (h FingerprintHash) MarshalJSON() ([]byte, error) {\n\treturn fmt.Appendf(nil, \"\\\"%016x\\\"\", uint64(h)), nil\n}\n\n// UnmarshalJSON deserializes from hex string\nfunc (h *FingerprintHash) UnmarshalJSON(data []byte) error {\n\tstr := strings.Trim(string(data), \"\\\"\")\n\thashUint, err := strconv.ParseUint(str, 16, 64)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid fingerprint hash: %w\", err)\n\t}\n\t*h = FingerprintHash(int64(hashUint))\n\treturn nil\n}\n\n// MarshalFingerprintHash converts int64 to hex string for GraphQL output\nfunc MarshalFingerprintHash(h FingerprintHash) graphql.Marshaler {\n\treturn graphql.WriterFunc(func(w io.Writer) {\n\t\t_, e := io.WriteString(w, fmt.Sprintf(\"\\\"%016x\\\"\", uint64(h)))\n\t\tif e != nil {\n\t\t\tpanic(e)\n\t\t}\n\t})\n}\n\n// UnmarshalFingerprintHash converts hex string from clients to int64.\n// Returns 0 for oversized hashes (e.g. MD5)\nfunc UnmarshalFingerprintHash(v any) (FingerprintHash, error) {\n\tstr, ok := v.(string)\n\tif !ok {\n\t\treturn 0, fmt.Errorf(\"fingerprint hash must be a string\")\n\t}\n\twithoutQuotes := strings.ReplaceAll(str, \"\\\"\", \"\")\n\t// Return 0 for hashes that don't fit in 64 bits (e.g. MD5 is 128 bits)\n\tif len(withoutQuotes) > 16 {\n\t\treturn 0, nil\n\t}\n\thashUint, err := strconv.ParseUint(withoutQuotes, 16, 64)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"invalid fingerprint hash: %w\", err)\n\t}\n\treturn FingerprintHash(int64(hashUint)), nil\n}\n"
  },
  {
    "path": "internal/models/translate.go",
    "content": "package models\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\n// editDiff translates edit details input fields into edit data\ntype editDiff struct {\n}\n\ntype stringEnum interface {\n\tIsValid() bool\n\tString() string\n}\n\nfunc (d *editDiff) string(oldVal *string, newVal *string) (oldOut *string, newOut *string) {\n\tif oldVal != nil && (newVal == nil || *newVal != *oldVal) {\n\t\tvalue := *oldVal\n\t\toldOut = &value\n\t}\n\n\tif newVal != nil && (oldVal == nil || *newVal != *oldVal) {\n\t\tvalue := *newVal\n\t\tnewOut = &value\n\t}\n\n\treturn\n}\n\nfunc (d *editDiff) int(oldVal *int, newVal *int) (oldOut *int, newOut *int) {\n\tif oldVal != nil && (newVal == nil || *newVal != *oldVal) {\n\t\toldOut = oldVal\n\t}\n\n\tif newVal != nil && (oldVal == nil || *newVal != *oldVal) {\n\t\tnewOut = newVal\n\t}\n\n\treturn\n}\n\nfunc (d *editDiff) nullUUID(oldVal uuid.NullUUID, newVal *uuid.UUID) (oldOut *uuid.UUID, newOut *uuid.UUID) {\n\tif oldVal.Valid && (newVal == nil || *newVal != oldVal.UUID) {\n\t\toldOut = &oldVal.UUID\n\t}\n\n\tif newVal != nil && (!oldVal.Valid || *newVal != oldVal.UUID) {\n\t\tnewOut = newVal\n\t}\n\n\treturn\n}\n\nfunc (d *editDiff) enum(oldVal stringEnum, newVal stringEnum) (oldOut *string, newOut *string) {\n\toldNil := reflect.ValueOf(oldVal).IsNil()\n\tnewNil := reflect.ValueOf(newVal).IsNil()\n\n\tif !oldNil && oldVal.IsValid() && (newNil || !newVal.IsValid() || newVal.String() != oldVal.String()) {\n\t\tvalue := oldVal.String()\n\t\toldOut = &value\n\t}\n\n\tif !newNil && newVal.IsValid() && (oldNil || !oldVal.IsValid() || newVal.String() != oldVal.String()) {\n\t\tvalue := newVal.String()\n\t\tnewOut = &value\n\t}\n\n\treturn\n}\n\nvar ErrInvalidDate = fmt.Errorf(\"invalid fuzzy date\")\nvar dateValidator = regexp.MustCompile(`^\\d{4}(-\\d{2}){0,2}$`)\n\nfunc ValidateFuzzyString(date *string) error {\n\tif date == nil {\n\t\treturn nil\n\t}\n\n\tif !dateValidator.MatchString(*date) {\n\t\treturn ErrInvalidDate\n\t}\n\n\tfuzzyDate := *date\n\tif len(fuzzyDate) == 4 {\n\t\tfuzzyDate += \"-01-01\"\n\t} else if len(fuzzyDate) == 7 {\n\t\tfuzzyDate += \"-01\"\n\t}\n\n\t_, err := time.Parse(\"2006-01-02\", fuzzyDate)\n\tif err != nil {\n\t\treturn ErrInvalidDate\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "internal/models/url.go",
    "content": "package models\n\nimport \"github.com/gofrs/uuid\"\n\ntype URL struct {\n\tURL    string    `json:\"url\"`\n\tSiteID uuid.UUID `json:\"site_id\"`\n}\n"
  },
  {
    "path": "internal/models/validator/validator.go",
    "content": "package validator\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\ntype StringEnum interface {\n\tIsValid() bool\n\tString() string\n}\n\ntype ErrEditPrerequisiteFailed struct {\n\tfield    string\n\texpected interface{}\n\tactual   interface{}\n}\n\nfunc (e *ErrEditPrerequisiteFailed) Error() string {\n\texpected := \"_blank_\"\n\tif e.expected != \"\" {\n\t\texpected = fmt.Sprintf(\"**%v**\", e.expected)\n\t}\n\tactual := \"_blank_\"\n\tif e.actual != \"\" {\n\t\tactual = fmt.Sprintf(\"**%v**\", e.actual)\n\t}\n\treturn fmt.Sprintf(\"Expected %s to be %s, but was %s.\", e.field, expected, actual)\n}\n\nfunc newError(field string, expected interface{}, actual interface{}) error {\n\treturn &ErrEditPrerequisiteFailed{field, expected, actual}\n}\n\n// String validates string fields\nfunc String(field string, old *string, current string) error {\n\tif old != nil && *old != current {\n\t\treturn newError(field, *old, current)\n\t}\n\treturn nil\n}\n\n// StringPtr validates string pointer fields\nfunc StringPtr(field string, old *string, current *string) error {\n\tif old != nil && current != nil {\n\t\tif *old != *current {\n\t\t\treturn newError(field, *old, *current)\n\t\t}\n\t}\n\treturn nil\n}\n\n// IntPtr validates int pointer fields\nfunc IntPtr(field string, old *int, current *int) error {\n\tif old != nil && current != nil {\n\t\tif *old != *current {\n\t\t\treturn newError(field, *old, current)\n\t\t}\n\t}\n\treturn nil\n}\n\n// UUID validates UUID fields\nfunc UUID(field string, old *uuid.UUID, current uuid.NullUUID) error {\n\tif old != nil && (!current.Valid || (*old != current.UUID)) {\n\t\tcurrentUUID := \"\"\n\t\tif current.Valid {\n\t\t\tcurrentUUID = current.UUID.String()\n\t\t}\n\t\treturn newError(field, old.String(), currentUUID)\n\t}\n\treturn nil\n}\n\n// EnumPtr validates enum pointer fields using generics\nfunc EnumPtr[T StringEnum](field string, old *string, current *T) error {\n\tif old != nil && current != nil {\n\t\tcurrentVal := reflect.ValueOf(current)\n\t\tif !currentVal.IsNil() {\n\t\t\tcurrentEnum := currentVal.Elem().Interface().(T)\n\t\t\tif currentEnum.IsValid() && *old != currentEnum.String() {\n\t\t\t\treturn newError(field, *old, currentEnum.String())\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "internal/queries/copyfrom.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: copyfrom.go\n\npackage queries\n\nimport (\n\t\"context\"\n)\n\n// iteratorForCreatePerformerAliases implements pgx.CopyFromSource.\ntype iteratorForCreatePerformerAliases struct {\n\trows                 []CreatePerformerAliasesParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreatePerformerAliases) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreatePerformerAliases) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].PerformerID,\n\t\tr.rows[0].Alias,\n\t}, nil\n}\n\nfunc (r iteratorForCreatePerformerAliases) Err() error {\n\treturn nil\n}\n\nfunc (q *Queries) CreatePerformerAliases(ctx context.Context, arg []CreatePerformerAliasesParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"performer_aliases\"}, []string{\"performer_id\", \"alias\"}, &iteratorForCreatePerformerAliases{rows: arg})\n}\n\n// iteratorForCreatePerformerImages implements pgx.CopyFromSource.\ntype iteratorForCreatePerformerImages struct {\n\trows                 []CreatePerformerImagesParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreatePerformerImages) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreatePerformerImages) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].PerformerID,\n\t\tr.rows[0].ImageID,\n\t}, nil\n}\n\nfunc (r iteratorForCreatePerformerImages) Err() error {\n\treturn nil\n}\n\nfunc (q *Queries) CreatePerformerImages(ctx context.Context, arg []CreatePerformerImagesParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"performer_images\"}, []string{\"performer_id\", \"image_id\"}, &iteratorForCreatePerformerImages{rows: arg})\n}\n\n// iteratorForCreatePerformerPiercings implements pgx.CopyFromSource.\ntype iteratorForCreatePerformerPiercings struct {\n\trows                 []CreatePerformerPiercingsParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreatePerformerPiercings) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreatePerformerPiercings) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].PerformerID,\n\t\tr.rows[0].Location,\n\t\tr.rows[0].Description,\n\t}, nil\n}\n\nfunc (r iteratorForCreatePerformerPiercings) Err() error {\n\treturn nil\n}\n\nfunc (q *Queries) CreatePerformerPiercings(ctx context.Context, arg []CreatePerformerPiercingsParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"performer_piercings\"}, []string{\"performer_id\", \"location\", \"description\"}, &iteratorForCreatePerformerPiercings{rows: arg})\n}\n\n// iteratorForCreatePerformerTattoos implements pgx.CopyFromSource.\ntype iteratorForCreatePerformerTattoos struct {\n\trows                 []CreatePerformerTattoosParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreatePerformerTattoos) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreatePerformerTattoos) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].PerformerID,\n\t\tr.rows[0].Location,\n\t\tr.rows[0].Description,\n\t}, nil\n}\n\nfunc (r iteratorForCreatePerformerTattoos) Err() error {\n\treturn nil\n}\n\nfunc (q *Queries) CreatePerformerTattoos(ctx context.Context, arg []CreatePerformerTattoosParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"performer_tattoos\"}, []string{\"performer_id\", \"location\", \"description\"}, &iteratorForCreatePerformerTattoos{rows: arg})\n}\n\n// iteratorForCreatePerformerURLs implements pgx.CopyFromSource.\ntype iteratorForCreatePerformerURLs struct {\n\trows                 []CreatePerformerURLsParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreatePerformerURLs) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreatePerformerURLs) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].PerformerID,\n\t\tr.rows[0].Url,\n\t\tr.rows[0].SiteID,\n\t}, nil\n}\n\nfunc (r iteratorForCreatePerformerURLs) Err() error {\n\treturn nil\n}\n\nfunc (q *Queries) CreatePerformerURLs(ctx context.Context, arg []CreatePerformerURLsParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"performer_urls\"}, []string{\"performer_id\", \"url\", \"site_id\"}, &iteratorForCreatePerformerURLs{rows: arg})\n}\n\n// iteratorForCreateSceneFingerprints implements pgx.CopyFromSource.\ntype iteratorForCreateSceneFingerprints struct {\n\trows                 []CreateSceneFingerprintsParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreateSceneFingerprints) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreateSceneFingerprints) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].FingerprintID,\n\t\tr.rows[0].SceneID,\n\t\tr.rows[0].UserID,\n\t\tr.rows[0].Duration,\n\t}, nil\n}\n\nfunc (r iteratorForCreateSceneFingerprints) Err() error {\n\treturn nil\n}\n\nfunc (q *Queries) CreateSceneFingerprints(ctx context.Context, arg []CreateSceneFingerprintsParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"scene_fingerprints\"}, []string{\"fingerprint_id\", \"scene_id\", \"user_id\", \"duration\"}, &iteratorForCreateSceneFingerprints{rows: arg})\n}\n\n// iteratorForCreateSceneImages implements pgx.CopyFromSource.\ntype iteratorForCreateSceneImages struct {\n\trows                 []CreateSceneImagesParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreateSceneImages) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreateSceneImages) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].SceneID,\n\t\tr.rows[0].ImageID,\n\t}, nil\n}\n\nfunc (r iteratorForCreateSceneImages) Err() error {\n\treturn nil\n}\n\nfunc (q *Queries) CreateSceneImages(ctx context.Context, arg []CreateSceneImagesParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"scene_images\"}, []string{\"scene_id\", \"image_id\"}, &iteratorForCreateSceneImages{rows: arg})\n}\n\n// iteratorForCreateScenePerformers implements pgx.CopyFromSource.\ntype iteratorForCreateScenePerformers struct {\n\trows                 []CreateScenePerformersParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreateScenePerformers) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreateScenePerformers) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].SceneID,\n\t\tr.rows[0].PerformerID,\n\t\tr.rows[0].As,\n\t}, nil\n}\n\nfunc (r iteratorForCreateScenePerformers) Err() error {\n\treturn nil\n}\n\n// Scene performers\nfunc (q *Queries) CreateScenePerformers(ctx context.Context, arg []CreateScenePerformersParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"scene_performers\"}, []string{\"scene_id\", \"performer_id\", \"as\"}, &iteratorForCreateScenePerformers{rows: arg})\n}\n\n// iteratorForCreateSceneTags implements pgx.CopyFromSource.\ntype iteratorForCreateSceneTags struct {\n\trows                 []CreateSceneTagsParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreateSceneTags) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreateSceneTags) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].SceneID,\n\t\tr.rows[0].TagID,\n\t}, nil\n}\n\nfunc (r iteratorForCreateSceneTags) Err() error {\n\treturn nil\n}\n\n// Scene tags management\nfunc (q *Queries) CreateSceneTags(ctx context.Context, arg []CreateSceneTagsParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"scene_tags\"}, []string{\"scene_id\", \"tag_id\"}, &iteratorForCreateSceneTags{rows: arg})\n}\n\n// iteratorForCreateSceneURLs implements pgx.CopyFromSource.\ntype iteratorForCreateSceneURLs struct {\n\trows                 []CreateSceneURLsParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreateSceneURLs) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreateSceneURLs) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].SceneID,\n\t\tr.rows[0].Url,\n\t\tr.rows[0].SiteID,\n\t}, nil\n}\n\nfunc (r iteratorForCreateSceneURLs) Err() error {\n\treturn nil\n}\n\n// Scene URLs\nfunc (q *Queries) CreateSceneURLs(ctx context.Context, arg []CreateSceneURLsParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"scene_urls\"}, []string{\"scene_id\", \"url\", \"site_id\"}, &iteratorForCreateSceneURLs{rows: arg})\n}\n\n// iteratorForCreateStudioAliases implements pgx.CopyFromSource.\ntype iteratorForCreateStudioAliases struct {\n\trows                 []CreateStudioAliasesParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreateStudioAliases) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreateStudioAliases) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].StudioID,\n\t\tr.rows[0].Alias,\n\t}, nil\n}\n\nfunc (r iteratorForCreateStudioAliases) Err() error {\n\treturn nil\n}\n\n// Studio aliases\nfunc (q *Queries) CreateStudioAliases(ctx context.Context, arg []CreateStudioAliasesParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"studio_aliases\"}, []string{\"studio_id\", \"alias\"}, &iteratorForCreateStudioAliases{rows: arg})\n}\n\n// iteratorForCreateStudioImages implements pgx.CopyFromSource.\ntype iteratorForCreateStudioImages struct {\n\trows                 []CreateStudioImagesParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreateStudioImages) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreateStudioImages) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].StudioID,\n\t\tr.rows[0].ImageID,\n\t}, nil\n}\n\nfunc (r iteratorForCreateStudioImages) Err() error {\n\treturn nil\n}\n\n// Studio images\nfunc (q *Queries) CreateStudioImages(ctx context.Context, arg []CreateStudioImagesParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"studio_images\"}, []string{\"studio_id\", \"image_id\"}, &iteratorForCreateStudioImages{rows: arg})\n}\n\n// iteratorForCreateStudioURLs implements pgx.CopyFromSource.\ntype iteratorForCreateStudioURLs struct {\n\trows                 []CreateStudioURLsParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreateStudioURLs) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreateStudioURLs) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].StudioID,\n\t\tr.rows[0].Url,\n\t\tr.rows[0].SiteID,\n\t}, nil\n}\n\nfunc (r iteratorForCreateStudioURLs) Err() error {\n\treturn nil\n}\n\n// Studio URLs\nfunc (q *Queries) CreateStudioURLs(ctx context.Context, arg []CreateStudioURLsParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"studio_urls\"}, []string{\"studio_id\", \"url\", \"site_id\"}, &iteratorForCreateStudioURLs{rows: arg})\n}\n\n// iteratorForCreateTagAliases implements pgx.CopyFromSource.\ntype iteratorForCreateTagAliases struct {\n\trows                 []CreateTagAliasesParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreateTagAliases) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreateTagAliases) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].TagID,\n\t\tr.rows[0].Alias,\n\t}, nil\n}\n\nfunc (r iteratorForCreateTagAliases) Err() error {\n\treturn nil\n}\n\n// Tag aliases\nfunc (q *Queries) CreateTagAliases(ctx context.Context, arg []CreateTagAliasesParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"tag_aliases\"}, []string{\"tag_id\", \"alias\"}, &iteratorForCreateTagAliases{rows: arg})\n}\n\n// iteratorForCreateUserNotificationSubscriptions implements pgx.CopyFromSource.\ntype iteratorForCreateUserNotificationSubscriptions struct {\n\trows                 []CreateUserNotificationSubscriptionsParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreateUserNotificationSubscriptions) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreateUserNotificationSubscriptions) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].UserID,\n\t\tr.rows[0].Type,\n\t}, nil\n}\n\nfunc (r iteratorForCreateUserNotificationSubscriptions) Err() error {\n\treturn nil\n}\n\n// User notification subscriptions\nfunc (q *Queries) CreateUserNotificationSubscriptions(ctx context.Context, arg []CreateUserNotificationSubscriptionsParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"user_notifications\"}, []string{\"user_id\", \"type\"}, &iteratorForCreateUserNotificationSubscriptions{rows: arg})\n}\n\n// iteratorForCreateUserRoles implements pgx.CopyFromSource.\ntype iteratorForCreateUserRoles struct {\n\trows                 []CreateUserRolesParams\n\tskippedFirstNextCall bool\n}\n\nfunc (r *iteratorForCreateUserRoles) Next() bool {\n\tif len(r.rows) == 0 {\n\t\treturn false\n\t}\n\tif !r.skippedFirstNextCall {\n\t\tr.skippedFirstNextCall = true\n\t\treturn true\n\t}\n\tr.rows = r.rows[1:]\n\treturn len(r.rows) > 0\n}\n\nfunc (r iteratorForCreateUserRoles) Values() ([]interface{}, error) {\n\treturn []interface{}{\n\t\tr.rows[0].UserID,\n\t\tr.rows[0].Role,\n\t}, nil\n}\n\nfunc (r iteratorForCreateUserRoles) Err() error {\n\treturn nil\n}\n\n// User roles\nfunc (q *Queries) CreateUserRoles(ctx context.Context, arg []CreateUserRolesParams) (int64, error) {\n\treturn q.db.CopyFrom(ctx, []string{\"user_roles\"}, []string{\"user_id\", \"role\"}, &iteratorForCreateUserRoles{rows: arg})\n}\n"
  },
  {
    "path": "internal/queries/db.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n\npackage queries\n\nimport (\n\t\"context\"\n\n\t\"github.com/jackc/pgx/v5\"\n\t\"github.com/jackc/pgx/v5/pgconn\"\n)\n\ntype DBTX interface {\n\tExec(context.Context, string, ...interface{}) (pgconn.CommandTag, error)\n\tQuery(context.Context, string, ...interface{}) (pgx.Rows, error)\n\tQueryRow(context.Context, string, ...interface{}) pgx.Row\n\tCopyFrom(ctx context.Context, tableName pgx.Identifier, columnNames []string, rowSrc pgx.CopyFromSource) (int64, error)\n}\n\nfunc New(db DBTX) *Queries {\n\treturn &Queries{db: db}\n}\n\ntype Queries struct {\n\tdb DBTX\n}\n\nfunc (q *Queries) WithTx(tx pgx.Tx) *Queries {\n\treturn &Queries{\n\t\tdb: tx,\n\t}\n}\n"
  },
  {
    "path": "internal/queries/draft.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: draft.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\nconst createDraft = `-- name: CreateDraft :one\n\nINSERT INTO drafts (id, user_id, type, data, created_at)\nVALUES ($1, $2, $3, $4, now())\nRETURNING id, user_id, type, data, created_at\n`\n\ntype CreateDraftParams struct {\n\tID     uuid.UUID       `db:\"id\" json:\"id\"`\n\tUserID uuid.UUID       `db:\"user_id\" json:\"user_id\"`\n\tType   string          `db:\"type\" json:\"type\"`\n\tData   json.RawMessage `db:\"data\" json:\"data\"`\n}\n\n// Draft queries\nfunc (q *Queries) CreateDraft(ctx context.Context, arg CreateDraftParams) (Draft, error) {\n\trow := q.db.QueryRow(ctx, createDraft,\n\t\targ.ID,\n\t\targ.UserID,\n\t\targ.Type,\n\t\targ.Data,\n\t)\n\tvar i Draft\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.UserID,\n\t\t&i.Type,\n\t\t&i.Data,\n\t\t&i.CreatedAt,\n\t)\n\treturn i, err\n}\n\nconst deleteDraft = `-- name: DeleteDraft :exec\nDELETE FROM drafts WHERE id = $1\n`\n\nfunc (q *Queries) DeleteDraft(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteDraft, id)\n\treturn err\n}\n\nconst deleteExpiredDrafts = `-- name: DeleteExpiredDrafts :exec\nDELETE FROM drafts WHERE created_at <= (now()::timestamp - (INTERVAL '1 second' * $1))\n`\n\nfunc (q *Queries) DeleteExpiredDrafts(ctx context.Context, dollar_1 interface{}) error {\n\t_, err := q.db.Exec(ctx, deleteExpiredDrafts, dollar_1)\n\treturn err\n}\n\nconst findDraft = `-- name: FindDraft :one\nSELECT id, user_id, type, data, created_at FROM drafts WHERE id = $1\n`\n\nfunc (q *Queries) FindDraft(ctx context.Context, id uuid.UUID) (Draft, error) {\n\trow := q.db.QueryRow(ctx, findDraft, id)\n\tvar i Draft\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.UserID,\n\t\t&i.Type,\n\t\t&i.Data,\n\t\t&i.CreatedAt,\n\t)\n\treturn i, err\n}\n\nconst findDraftsByUser = `-- name: FindDraftsByUser :many\nSELECT id, user_id, type, data, created_at FROM drafts WHERE user_id = $1\n`\n\nfunc (q *Queries) FindDraftsByUser(ctx context.Context, userID uuid.UUID) ([]Draft, error) {\n\trows, err := q.db.Query(ctx, findDraftsByUser, userID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Draft{}\n\tfor rows.Next() {\n\t\tvar i Draft\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.UserID,\n\t\t\t&i.Type,\n\t\t\t&i.Data,\n\t\t\t&i.CreatedAt,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n"
  },
  {
    "path": "internal/queries/edit.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: edit.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\nconst cancelUserEdits = `-- name: CancelUserEdits :exec\nUPDATE edits SET status = 'CANCELED', updated_at = NOW() WHERE user_id = $1\n`\n\nfunc (q *Queries) CancelUserEdits(ctx context.Context, userID uuid.NullUUID) error {\n\t_, err := q.db.Exec(ctx, cancelUserEdits, userID)\n\treturn err\n}\n\nconst createEdit = `-- name: CreateEdit :one\n\nINSERT INTO edits (\n    id, user_id, target_type, operation, data, votes, status, applied, bot,\n    created_at\n)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, now())\nRETURNING id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count\n`\n\ntype CreateEditParams struct {\n\tID         uuid.UUID     `db:\"id\" json:\"id\"`\n\tUserID     uuid.NullUUID `db:\"user_id\" json:\"user_id\"`\n\tTargetType string        `db:\"target_type\" json:\"target_type\"`\n\tOperation  string        `db:\"operation\" json:\"operation\"`\n\tData       []byte        `db:\"data\" json:\"data\"`\n\tVotes      int           `db:\"votes\" json:\"votes\"`\n\tStatus     string        `db:\"status\" json:\"status\"`\n\tApplied    bool          `db:\"applied\" json:\"applied\"`\n\tBot        bool          `db:\"bot\" json:\"bot\"`\n}\n\n// Edit queries\nfunc (q *Queries) CreateEdit(ctx context.Context, arg CreateEditParams) (Edit, error) {\n\trow := q.db.QueryRow(ctx, createEdit,\n\t\targ.ID,\n\t\targ.UserID,\n\t\targ.TargetType,\n\t\targ.Operation,\n\t\targ.Data,\n\t\targ.Votes,\n\t\targ.Status,\n\t\targ.Applied,\n\t\targ.Bot,\n\t)\n\tvar i Edit\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.UserID,\n\t\t&i.Operation,\n\t\t&i.TargetType,\n\t\t&i.Data,\n\t\t&i.Votes,\n\t\t&i.Status,\n\t\t&i.Applied,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.ClosedAt,\n\t\t&i.Bot,\n\t\t&i.UpdateCount,\n\t)\n\treturn i, err\n}\n\nconst createEditComment = `-- name: CreateEditComment :one\n\nINSERT INTO edit_comments (id, edit_id, user_id, text, created_at)\nVALUES ($1, $2, $3, $4, NOW())\nRETURNING id, edit_id, user_id, created_at, text\n`\n\ntype CreateEditCommentParams struct {\n\tID     uuid.UUID     `db:\"id\" json:\"id\"`\n\tEditID uuid.UUID     `db:\"edit_id\" json:\"edit_id\"`\n\tUserID uuid.NullUUID `db:\"user_id\" json:\"user_id\"`\n\tText   string        `db:\"text\" json:\"text\"`\n}\n\n// Edit comments\nfunc (q *Queries) CreateEditComment(ctx context.Context, arg CreateEditCommentParams) (EditComment, error) {\n\trow := q.db.QueryRow(ctx, createEditComment,\n\t\targ.ID,\n\t\targ.EditID,\n\t\targ.UserID,\n\t\targ.Text,\n\t)\n\tvar i EditComment\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.EditID,\n\t\t&i.UserID,\n\t\t&i.CreatedAt,\n\t\t&i.Text,\n\t)\n\treturn i, err\n}\n\nconst createEditVote = `-- name: CreateEditVote :exec\n\nINSERT INTO edit_votes (edit_id, user_id, vote, created_at) VALUES ($1, $2, $3, NOW())\nON CONFLICT(edit_id, user_id)\nDO UPDATE SET (vote, created_at) = ($3, NOW())\n`\n\ntype CreateEditVoteParams struct {\n\tEditID uuid.UUID `db:\"edit_id\" json:\"edit_id\"`\n\tUserID uuid.UUID `db:\"user_id\" json:\"user_id\"`\n\tVote   string    `db:\"vote\" json:\"vote\"`\n}\n\n// Edit votes\nfunc (q *Queries) CreateEditVote(ctx context.Context, arg CreateEditVoteParams) error {\n\t_, err := q.db.Exec(ctx, createEditVote, arg.EditID, arg.UserID, arg.Vote)\n\treturn err\n}\n\nconst createPerformerEdit = `-- name: CreatePerformerEdit :exec\nINSERT INTO performer_edits (edit_id, performer_id) VALUES ($1, $2)\n`\n\ntype CreatePerformerEditParams struct {\n\tEditID      uuid.UUID `db:\"edit_id\" json:\"edit_id\"`\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n}\n\nfunc (q *Queries) CreatePerformerEdit(ctx context.Context, arg CreatePerformerEditParams) error {\n\t_, err := q.db.Exec(ctx, createPerformerEdit, arg.EditID, arg.PerformerID)\n\treturn err\n}\n\nconst createSceneEdit = `-- name: CreateSceneEdit :exec\nINSERT INTO scene_edits (edit_id, scene_id) VALUES ($1, $2)\n`\n\ntype CreateSceneEditParams struct {\n\tEditID  uuid.UUID `db:\"edit_id\" json:\"edit_id\"`\n\tSceneID uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n}\n\nfunc (q *Queries) CreateSceneEdit(ctx context.Context, arg CreateSceneEditParams) error {\n\t_, err := q.db.Exec(ctx, createSceneEdit, arg.EditID, arg.SceneID)\n\treturn err\n}\n\nconst createStudioEdit = `-- name: CreateStudioEdit :exec\nINSERT INTO studio_edits (edit_id, studio_id) VALUES ($1, $2)\n`\n\ntype CreateStudioEditParams struct {\n\tEditID   uuid.UUID `db:\"edit_id\" json:\"edit_id\"`\n\tStudioID uuid.UUID `db:\"studio_id\" json:\"studio_id\"`\n}\n\nfunc (q *Queries) CreateStudioEdit(ctx context.Context, arg CreateStudioEditParams) error {\n\t_, err := q.db.Exec(ctx, createStudioEdit, arg.EditID, arg.StudioID)\n\treturn err\n}\n\nconst createTagEdit = `-- name: CreateTagEdit :exec\nINSERT INTO tag_edits (edit_id, tag_id) VALUES ($1, $2)\n`\n\ntype CreateTagEditParams struct {\n\tEditID uuid.UUID `db:\"edit_id\" json:\"edit_id\"`\n\tTagID  uuid.UUID `db:\"tag_id\" json:\"tag_id\"`\n}\n\nfunc (q *Queries) CreateTagEdit(ctx context.Context, arg CreateTagEditParams) error {\n\t_, err := q.db.Exec(ctx, createTagEdit, arg.EditID, arg.TagID)\n\treturn err\n}\n\nconst deleteEdit = `-- name: DeleteEdit :exec\nDELETE FROM edits WHERE id = $1\n`\n\nfunc (q *Queries) DeleteEdit(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteEdit, id)\n\treturn err\n}\n\nconst findCompletedEdits = `-- name: FindCompletedEdits :many\nSELECT id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count FROM edits\nWHERE status = 'PENDING'\nAND (\n    (created_at <= (now()::timestamp - (INTERVAL '1 second' * $1)) AND updated_at IS NULL)\n    OR\n    (updated_at <= (now()::timestamp - (INTERVAL '1 second' * $1)) AND updated_at IS NOT NULL)\n    OR (\n        votes >= $2\n        AND (\n            (created_at <= (now()::timestamp - (INTERVAL '1 second' * $3)) AND updated_at IS NULL)\n            OR\n            (updated_at <= (now()::timestamp - (INTERVAL '1 second' * $3)) AND updated_at IS NOT NULL)\n        )\n    )\n)\n`\n\ntype FindCompletedEditsParams struct {\n\tVotingPeriod        interface{} `db:\"voting_period\" json:\"voting_period\"`\n\tMinimumVotes        int         `db:\"minimum_votes\" json:\"minimum_votes\"`\n\tMinimumVotingPeriod interface{} `db:\"minimum_voting_period\" json:\"minimum_voting_period\"`\n}\n\n// Returns pending edits that fulfill one of the criteria for being closed:\n// * The full voting period has passed\n// * The minimum voting period has passed, and the number of votes has crossed the voting threshold.\n// The latter only applies for destructive edits. Non-destructive edits get auto-applied when sufficient votes are cast.\nfunc (q *Queries) FindCompletedEdits(ctx context.Context, arg FindCompletedEditsParams) ([]Edit, error) {\n\trows, err := q.db.Query(ctx, findCompletedEdits, arg.VotingPeriod, arg.MinimumVotes, arg.MinimumVotingPeriod)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Edit{}\n\tfor rows.Next() {\n\t\tvar i Edit\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.UserID,\n\t\t\t&i.Operation,\n\t\t\t&i.TargetType,\n\t\t\t&i.Data,\n\t\t\t&i.Votes,\n\t\t\t&i.Status,\n\t\t\t&i.Applied,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.ClosedAt,\n\t\t\t&i.Bot,\n\t\t\t&i.UpdateCount,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findEdit = `-- name: FindEdit :one\nSELECT id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count FROM edits WHERE id = $1\n`\n\nfunc (q *Queries) FindEdit(ctx context.Context, id uuid.UUID) (Edit, error) {\n\trow := q.db.QueryRow(ctx, findEdit, id)\n\tvar i Edit\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.UserID,\n\t\t&i.Operation,\n\t\t&i.TargetType,\n\t\t&i.Data,\n\t\t&i.Votes,\n\t\t&i.Status,\n\t\t&i.Applied,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.ClosedAt,\n\t\t&i.Bot,\n\t\t&i.UpdateCount,\n\t)\n\treturn i, err\n}\n\nconst findPendingPerformerCreation = `-- name: FindPendingPerformerCreation :many\nSELECT id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count FROM edits\nWHERE status = 'PENDING'\nAND target_type = 'PERFORMER'\nAND (\n    ($1::text IS NOT NULL AND data->'new_data'->>'name' = $1)\n    OR\n    ($2::text[] IS NOT NULL AND jsonb_exists_any(jsonb_path_query_array(data, '$.new_data.added_urls[*].url'), $2))\n)\n`\n\ntype FindPendingPerformerCreationParams struct {\n\tName *string  `db:\"name\" json:\"name\"`\n\tUrls []string `db:\"urls\" json:\"urls\"`\n}\n\nfunc (q *Queries) FindPendingPerformerCreation(ctx context.Context, arg FindPendingPerformerCreationParams) ([]Edit, error) {\n\trows, err := q.db.Query(ctx, findPendingPerformerCreation, arg.Name, arg.Urls)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Edit{}\n\tfor rows.Next() {\n\t\tvar i Edit\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.UserID,\n\t\t\t&i.Operation,\n\t\t\t&i.TargetType,\n\t\t\t&i.Data,\n\t\t\t&i.Votes,\n\t\t\t&i.Status,\n\t\t\t&i.Applied,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.ClosedAt,\n\t\t\t&i.Bot,\n\t\t\t&i.UpdateCount,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findPendingSceneCreation = `-- name: FindPendingSceneCreation :many\nSELECT id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count FROM edits\nWHERE status = 'PENDING'\nAND target_type = 'SCENE'\nAND (\n    ($1::text IS NOT NULL AND $2::uuid IS NOT NULL\n     AND data->'new_data'->>'title' = $1\n     AND (data->'new_data'->>'studio_id')::uuid = $2)\n    OR\n    ($3::text[] IS NOT NULL AND jsonb_exists_any(jsonb_path_query_array(data, '$.new_data.added_fingerprints[*].hash'), $3))\n)\n`\n\ntype FindPendingSceneCreationParams struct {\n\tTitle    *string       `db:\"title\" json:\"title\"`\n\tStudioID uuid.NullUUID `db:\"studio_id\" json:\"studio_id\"`\n\tHashes   []string      `db:\"hashes\" json:\"hashes\"`\n}\n\nfunc (q *Queries) FindPendingSceneCreation(ctx context.Context, arg FindPendingSceneCreationParams) ([]Edit, error) {\n\trows, err := q.db.Query(ctx, findPendingSceneCreation, arg.Title, arg.StudioID, arg.Hashes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Edit{}\n\tfor rows.Next() {\n\t\tvar i Edit\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.UserID,\n\t\t\t&i.Operation,\n\t\t\t&i.TargetType,\n\t\t\t&i.Data,\n\t\t\t&i.Votes,\n\t\t\t&i.Status,\n\t\t\t&i.Applied,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.ClosedAt,\n\t\t\t&i.Bot,\n\t\t\t&i.UpdateCount,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getEditComments = `-- name: GetEditComments :many\nSELECT id, edit_id, user_id, created_at, text FROM edit_comments WHERE edit_id = $1 ORDER BY created_at ASC\n`\n\nfunc (q *Queries) GetEditComments(ctx context.Context, editID uuid.UUID) ([]EditComment, error) {\n\trows, err := q.db.Query(ctx, getEditComments, editID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []EditComment{}\n\tfor rows.Next() {\n\t\tvar i EditComment\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.EditID,\n\t\t\t&i.UserID,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.Text,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getEditCommentsByIds = `-- name: GetEditCommentsByIds :many\nSELECT id, edit_id, user_id, created_at, text FROM edit_comments WHERE id = ANY($1::UUID[])\n`\n\nfunc (q *Queries) GetEditCommentsByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]EditComment, error) {\n\trows, err := q.db.Query(ctx, getEditCommentsByIds, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []EditComment{}\n\tfor rows.Next() {\n\t\tvar i EditComment\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.EditID,\n\t\t\t&i.UserID,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.Text,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getEditPerformerAliases = `-- name: GetEditPerformerAliases :many\nWITH edit AS (\n  SELECT id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count FROM edits WHERE id = $1\n)\n(\n  SELECT alias\n  FROM edit E\n  JOIN performer_edits PE ON E.id = PE.edit_id\n  JOIN performer_aliases PA ON PE.performer_id = PA.performer_id\n  EXCEPT\n  SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'removed_aliases', '[]'::jsonb)) AS alias FROM edit\n)\nUNION\nSELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'added_aliases', '[]'::jsonb)) AS alias FROM edit\n`\n\nfunc (q *Queries) GetEditPerformerAliases(ctx context.Context, id uuid.UUID) ([]string, error) {\n\trows, err := q.db.Query(ctx, getEditPerformerAliases, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []string{}\n\tfor rows.Next() {\n\t\tvar alias string\n\t\tif err := rows.Scan(&alias); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, alias)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getEditPerformerPiercings = `-- name: GetEditPerformerPiercings :many\nWITH edit AS (\n  SELECT id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count FROM edits WHERE id = $1\n),\ncurrent_piercings AS (\n    SELECT location, description\n    FROM edit E\n    JOIN performer_edits PE ON E.id = PE.edit_id\n    JOIN performer_piercings PP ON PE.performer_id = PP.performer_id\n),\nremoved_piercings AS (\n    SELECT\n        elem->>'location' AS location,\n        elem->>'description' AS description\n    FROM edit, jsonb_array_elements(COALESCE(data->'new_data'->'removed_piercings', '[]'::jsonb)) AS elem\n),\nadded_piercings AS (\n    SELECT\n        elem->>'location' AS location,\n        elem->>'description' AS description\n    FROM edit, jsonb_array_elements(COALESCE(data->'new_data'->'added_piercings', '[]'::jsonb)) AS elem\n),\nfinal_piercings AS (\n    SELECT location, description FROM current_piercings\n    EXCEPT\n    SELECT location, description FROM removed_piercings\n    UNION\n    SELECT location, description FROM added_piercings\n)\nSELECT DISTINCT location, description FROM final_piercings\n`\n\ntype GetEditPerformerPiercingsRow struct {\n\tLocation    *string `db:\"location\" json:\"location\"`\n\tDescription *string `db:\"description\" json:\"description\"`\n}\n\nfunc (q *Queries) GetEditPerformerPiercings(ctx context.Context, id uuid.UUID) ([]GetEditPerformerPiercingsRow, error) {\n\trows, err := q.db.Query(ctx, getEditPerformerPiercings, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []GetEditPerformerPiercingsRow{}\n\tfor rows.Next() {\n\t\tvar i GetEditPerformerPiercingsRow\n\t\tif err := rows.Scan(&i.Location, &i.Description); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getEditPerformerTattoos = `-- name: GetEditPerformerTattoos :many\nWITH edit AS (\n  SELECT id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count FROM edits WHERE id = $1\n),\ncurrent_tattoos AS (\n    SELECT location, description\n    FROM edit E\n    JOIN performer_edits PE ON E.id = PE.edit_id\n    JOIN performer_tattoos PT ON PE.performer_id = PT.performer_id\n),\nremoved_tattoos AS (\n    SELECT\n        elem->>'location' AS location,\n        elem->>'description' AS description\n    FROM edit, jsonb_array_elements(COALESCE(data->'new_data'->'removed_tattoos', '[]'::jsonb)) AS elem\n),\nadded_tattoos AS (\n    SELECT\n        elem->>'location' AS location,\n        elem->>'description' AS description\n    FROM edit, jsonb_array_elements(COALESCE(data->'new_data'->'added_tattoos', '[]'::jsonb)) AS elem\n),\nfinal_tattoos AS (\n    SELECT location, description FROM current_tattoos\n    EXCEPT\n    SELECT location, description FROM removed_tattoos\n    UNION\n    SELECT location, description FROM added_tattoos\n)\nSELECT DISTINCT location, description FROM final_tattoos\n`\n\ntype GetEditPerformerTattoosRow struct {\n\tLocation    *string `db:\"location\" json:\"location\"`\n\tDescription *string `db:\"description\" json:\"description\"`\n}\n\nfunc (q *Queries) GetEditPerformerTattoos(ctx context.Context, id uuid.UUID) ([]GetEditPerformerTattoosRow, error) {\n\trows, err := q.db.Query(ctx, getEditPerformerTattoos, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []GetEditPerformerTattoosRow{}\n\tfor rows.Next() {\n\t\tvar i GetEditPerformerTattoosRow\n\t\tif err := rows.Scan(&i.Location, &i.Description); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getEditTargetID = `-- name: GetEditTargetID :one\nSELECT CASE e.target_type\n            WHEN 'SCENE' THEN se.scene_id\n            WHEN 'PERFORMER' THEN pe.performer_id\n            WHEN 'STUDIO' THEN ste.studio_id\n            WHEN 'TAG' THEN te.tag_id\n       END::UUID AS id, e.target_type\nFROM edits e\nLEFT JOIN scene_edits se ON e.id = se.edit_id\nLEFT JOIN performer_edits pe ON e.id = pe.edit_id\nLEFT JOIN studio_edits ste ON e.id = ste.edit_id\nLEFT JOIN tag_edits te ON e.id = te.edit_id\nWHERE e.id = $1\n`\n\ntype GetEditTargetIDRow struct {\n\tID         uuid.UUID `db:\"id\" json:\"id\"`\n\tTargetType string    `db:\"target_type\" json:\"target_type\"`\n}\n\nfunc (q *Queries) GetEditTargetID(ctx context.Context, id uuid.UUID) (GetEditTargetIDRow, error) {\n\trow := q.db.QueryRow(ctx, getEditTargetID, id)\n\tvar i GetEditTargetIDRow\n\terr := row.Scan(&i.ID, &i.TargetType)\n\treturn i, err\n}\n\nconst getEditVotes = `-- name: GetEditVotes :many\nSELECT edit_id, user_id, created_at, vote FROM edit_votes WHERE edit_id = $1\n`\n\nfunc (q *Queries) GetEditVotes(ctx context.Context, editID uuid.UUID) ([]EditVote, error) {\n\trows, err := q.db.Query(ctx, getEditVotes, editID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []EditVote{}\n\tfor rows.Next() {\n\t\tvar i EditVote\n\t\tif err := rows.Scan(\n\t\t\t&i.EditID,\n\t\t\t&i.UserID,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.Vote,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getEditsByIds = `-- name: GetEditsByIds :many\nSELECT id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count FROM edits WHERE id = ANY($1::UUID[])\n`\n\nfunc (q *Queries) GetEditsByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]Edit, error) {\n\trows, err := q.db.Query(ctx, getEditsByIds, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Edit{}\n\tfor rows.Next() {\n\t\tvar i Edit\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.UserID,\n\t\t\t&i.Operation,\n\t\t\t&i.TargetType,\n\t\t\t&i.Data,\n\t\t\t&i.Votes,\n\t\t\t&i.Status,\n\t\t\t&i.Applied,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.ClosedAt,\n\t\t\t&i.Bot,\n\t\t\t&i.UpdateCount,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getEditsByPerformer = `-- name: GetEditsByPerformer :many\nSELECT e.id, e.user_id, e.operation, e.target_type, e.data, e.votes, e.status, e.applied, e.created_at, e.updated_at, e.closed_at, e.bot, e.update_count FROM edits e\nJOIN performer_edits pe ON e.id = pe.edit_id\nWHERE pe.performer_id = $1\nORDER BY e.created_at DESC\n`\n\nfunc (q *Queries) GetEditsByPerformer(ctx context.Context, performerID uuid.UUID) ([]Edit, error) {\n\trows, err := q.db.Query(ctx, getEditsByPerformer, performerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Edit{}\n\tfor rows.Next() {\n\t\tvar i Edit\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.UserID,\n\t\t\t&i.Operation,\n\t\t\t&i.TargetType,\n\t\t\t&i.Data,\n\t\t\t&i.Votes,\n\t\t\t&i.Status,\n\t\t\t&i.Applied,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.ClosedAt,\n\t\t\t&i.Bot,\n\t\t\t&i.UpdateCount,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getEditsByScene = `-- name: GetEditsByScene :many\nSELECT e.id, e.user_id, e.operation, e.target_type, e.data, e.votes, e.status, e.applied, e.created_at, e.updated_at, e.closed_at, e.bot, e.update_count FROM edits e\nJOIN scene_edits se ON e.id = se.edit_id\nWHERE se.scene_id = $1\nORDER BY e.created_at DESC\n`\n\nfunc (q *Queries) GetEditsByScene(ctx context.Context, sceneID uuid.UUID) ([]Edit, error) {\n\trows, err := q.db.Query(ctx, getEditsByScene, sceneID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Edit{}\n\tfor rows.Next() {\n\t\tvar i Edit\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.UserID,\n\t\t\t&i.Operation,\n\t\t\t&i.TargetType,\n\t\t\t&i.Data,\n\t\t\t&i.Votes,\n\t\t\t&i.Status,\n\t\t\t&i.Applied,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.ClosedAt,\n\t\t\t&i.Bot,\n\t\t\t&i.UpdateCount,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getEditsByStudio = `-- name: GetEditsByStudio :many\nSELECT e.id, e.user_id, e.operation, e.target_type, e.data, e.votes, e.status, e.applied, e.created_at, e.updated_at, e.closed_at, e.bot, e.update_count FROM edits e\nJOIN studio_edits se ON e.id = se.edit_id\nWHERE se.studio_id = $1\nORDER BY e.created_at DESC\n`\n\nfunc (q *Queries) GetEditsByStudio(ctx context.Context, studioID uuid.UUID) ([]Edit, error) {\n\trows, err := q.db.Query(ctx, getEditsByStudio, studioID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Edit{}\n\tfor rows.Next() {\n\t\tvar i Edit\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.UserID,\n\t\t\t&i.Operation,\n\t\t\t&i.TargetType,\n\t\t\t&i.Data,\n\t\t\t&i.Votes,\n\t\t\t&i.Status,\n\t\t\t&i.Applied,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.ClosedAt,\n\t\t\t&i.Bot,\n\t\t\t&i.UpdateCount,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getEditsByTag = `-- name: GetEditsByTag :many\nSELECT e.id, e.user_id, e.operation, e.target_type, e.data, e.votes, e.status, e.applied, e.created_at, e.updated_at, e.closed_at, e.bot, e.update_count FROM edits e\nJOIN tag_edits te ON e.id = te.edit_id\nWHERE te.tag_id = $1\nORDER BY e.created_at DESC\n`\n\nfunc (q *Queries) GetEditsByTag(ctx context.Context, tagID uuid.UUID) ([]Edit, error) {\n\trows, err := q.db.Query(ctx, getEditsByTag, tagID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Edit{}\n\tfor rows.Next() {\n\t\tvar i Edit\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.UserID,\n\t\t\t&i.Operation,\n\t\t\t&i.TargetType,\n\t\t\t&i.Data,\n\t\t\t&i.Votes,\n\t\t\t&i.Status,\n\t\t\t&i.Applied,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.ClosedAt,\n\t\t\t&i.Bot,\n\t\t\t&i.UpdateCount,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getImagesForEdit = `-- name: GetImagesForEdit :many\nWITH edit AS (\n  SELECT id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count FROM edits WHERE edits.id = $1\n), current_images AS (\n    SELECT si.image_id FROM edit e\n    JOIN scene_edits se ON e.id = se.edit_id\n    JOIN scene_images si ON se.scene_id = si.scene_id\n    UNION ALL\n    SELECT pi.image_id FROM edit e\n    JOIN performer_edits pe ON e.id = pe.edit_id\n    JOIN performer_images pi ON pe.performer_id = pi.performer_id\n    UNION ALL\n    SELECT sti.image_id FROM edit e\n    JOIN studio_edits ste ON e.id = ste.edit_id\n    JOIN studio_images sti ON ste.studio_id = sti.studio_id\n),\nremoved_images AS (\n    SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'removed_images', '[]'::jsonb))::uuid AS image_id\n    FROM edit\n),\nadded_images AS (\n    SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'added_images', '[]'::jsonb))::uuid AS image_id\n    FROM edit\n),\nfinal_images AS (\n    SELECT image_id FROM current_images\n    WHERE image_id NOT IN (SELECT image_id FROM removed_images)\n    UNION\n    SELECT image_id FROM added_images\n)\nSELECT i.id, i.url, i.width, i.height, i.checksum FROM final_images fi\nJOIN images i ON fi.image_id = i.id\nORDER BY i.id\n`\n\n// Gets current images for target entity and merges with edit's added_images/removed_images\nfunc (q *Queries) GetImagesForEdit(ctx context.Context, id uuid.UUID) ([]Image, error) {\n\trows, err := q.db.Query(ctx, getImagesForEdit, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Image{}\n\tfor rows.Next() {\n\t\tvar i Image\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Url,\n\t\t\t&i.Width,\n\t\t\t&i.Height,\n\t\t\t&i.Checksum,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getMergedPerformersForEdit = `-- name: GetMergedPerformersForEdit :many\nWITH edit AS (\n  SELECT id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count FROM edits WHERE edits.id = $1\n), current_performers AS (\n    SELECT sp.performer_id, sp.\"as\" FROM edit e\n    JOIN scene_edits se ON e.id = se.edit_id\n    JOIN scene_performers sp ON se.scene_id = sp.scene_id\n    WHERE e.target_type = 'SCENE'\n),\nremoved_performers AS (\n    SELECT\n        (elem->>'performer_id')::uuid AS performer_id,\n        elem->>'as' AS \"as\"\n    FROM edit, jsonb_array_elements(COALESCE(data->'new_data'->'removed_performers', '[]'::jsonb)) AS elem\n),\nadded_performers AS (\n    SELECT\n        (elem->>'performer_id')::uuid AS performer_id,\n        elem->>'as' AS \"as\"\n    FROM edit, jsonb_array_elements(COALESCE(data->'new_data'->'added_performers', '[]'::jsonb)) AS elem\n),\nfinal_performers AS (\n    SELECT performer_id, \"as\" FROM current_performers\n    EXCEPT\n    SELECT performer_id, \"as\" FROM removed_performers\n    UNION\n    SELECT performer_id, \"as\" FROM added_performers\n)\nSELECT p.id, p.name, p.disambiguation, p.gender, p.ethnicity, p.country, p.eye_color, p.hair_color, p.height, p.cup_size, p.band_size, p.hip_size, p.waist_size, p.breast_type, p.career_start_year, p.career_end_year, p.created_at, p.updated_at, p.deleted, p.birthdate, p.deathdate, fp.\"as\" FROM final_performers fp\nJOIN performers p ON fp.performer_id = p.id\nWHERE p.deleted = FALSE\nORDER BY p.name\n`\n\ntype GetMergedPerformersForEditRow struct {\n\tPerformer Performer `db:\"performer\" json:\"performer\"`\n\tAs        *string   `db:\"as\" json:\"as\"`\n}\n\n// Gets current performers for target entity and merges with edit's added_performers/removed_performers\nfunc (q *Queries) GetMergedPerformersForEdit(ctx context.Context, id uuid.UUID) ([]GetMergedPerformersForEditRow, error) {\n\trows, err := q.db.Query(ctx, getMergedPerformersForEdit, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []GetMergedPerformersForEditRow{}\n\tfor rows.Next() {\n\t\tvar i GetMergedPerformersForEditRow\n\t\tif err := rows.Scan(\n\t\t\t&i.Performer.ID,\n\t\t\t&i.Performer.Name,\n\t\t\t&i.Performer.Disambiguation,\n\t\t\t&i.Performer.Gender,\n\t\t\t&i.Performer.Ethnicity,\n\t\t\t&i.Performer.Country,\n\t\t\t&i.Performer.EyeColor,\n\t\t\t&i.Performer.HairColor,\n\t\t\t&i.Performer.Height,\n\t\t\t&i.Performer.CupSize,\n\t\t\t&i.Performer.BandSize,\n\t\t\t&i.Performer.HipSize,\n\t\t\t&i.Performer.WaistSize,\n\t\t\t&i.Performer.BreastType,\n\t\t\t&i.Performer.CareerStartYear,\n\t\t\t&i.Performer.CareerEndYear,\n\t\t\t&i.Performer.CreatedAt,\n\t\t\t&i.Performer.UpdatedAt,\n\t\t\t&i.Performer.Deleted,\n\t\t\t&i.Performer.Birthdate,\n\t\t\t&i.Performer.Deathdate,\n\t\t\t&i.As,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getMergedStudioAliasesForEdit = `-- name: GetMergedStudioAliasesForEdit :many\nWITH edit AS (\n  SELECT id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count FROM edits WHERE id = $1\n)\n(\n  SELECT alias\n  FROM edit E\n  JOIN studio_edits SE ON E.id = SE.edit_id\n  JOIN studio_aliases SA ON SE.studio_id = SA.studio_id\n  WHERE E.target_type = 'STUDIO'\n  EXCEPT\n  SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'removed_aliases', '[]'::jsonb)) AS alias FROM edit\n)\nUNION\nSELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'added_aliases', '[]'::jsonb)) AS alias FROM edit\n`\n\n// Gets current aliases for target studio entity and merges with edit's added_aliases/removed_aliases\nfunc (q *Queries) GetMergedStudioAliasesForEdit(ctx context.Context, id uuid.UUID) ([]string, error) {\n\trows, err := q.db.Query(ctx, getMergedStudioAliasesForEdit, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []string{}\n\tfor rows.Next() {\n\t\tvar alias string\n\t\tif err := rows.Scan(&alias); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, alias)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getMergedTagAliasesForEdit = `-- name: GetMergedTagAliasesForEdit :many\nWITH edit AS (\n  SELECT id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count FROM edits WHERE id = $1\n)\n(\n  SELECT alias\n  FROM edit E\n  JOIN tag_edits TE ON E.id = TE.edit_id\n  JOIN tag_aliases TA ON TE.tag_id = TA.tag_id\n  EXCEPT\n  SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'removed_aliases', '[]'::jsonb)) AS alias FROM edit\n)\nUNION\nSELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'added_aliases', '[]'::jsonb)) AS alias FROM edit\n`\n\n// Gets current aliases for target tag entity and merges with edit's added_aliases/removed_aliases\nfunc (q *Queries) GetMergedTagAliasesForEdit(ctx context.Context, id uuid.UUID) ([]string, error) {\n\trows, err := q.db.Query(ctx, getMergedTagAliasesForEdit, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []string{}\n\tfor rows.Next() {\n\t\tvar alias string\n\t\tif err := rows.Scan(&alias); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, alias)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getMergedTagsForEdit = `-- name: GetMergedTagsForEdit :many\nWITH edit AS (\n  SELECT id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count FROM edits WHERE edits.id = $1\n), current_tags AS (\n    SELECT st.tag_id FROM edit e\n    JOIN scene_edits se ON e.id = se.edit_id\n    JOIN scene_tags st ON se.scene_id = st.scene_id\n    WHERE e.target_type = 'SCENE'\n),\nremoved_tags AS (\n    SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'removed_tags', '[]'::jsonb))::uuid AS tag_id\n    FROM edit\n),\nadded_tags AS (\n    SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'added_tags', '[]'::jsonb))::uuid AS tag_id\n    FROM edit\n),\nfinal_tags AS (\n    SELECT tag_id FROM current_tags\n    EXCEPT\n    SELECT tag_id FROM removed_tags\n    UNION\n    SELECT tag_id FROM added_tags\n)\nSELECT t.id, t.name, t.description, t.created_at, t.updated_at, t.deleted, t.category_id FROM final_tags ft\nJOIN tags t ON ft.tag_id = t.id\nWHERE t.deleted = FALSE\nORDER BY t.name\n`\n\n// Gets current tags for target entity and merges with edit's added_tags/removed_tags\nfunc (q *Queries) GetMergedTagsForEdit(ctx context.Context, id uuid.UUID) ([]Tag, error) {\n\trows, err := q.db.Query(ctx, getMergedTagsForEdit, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Tag{}\n\tfor rows.Next() {\n\t\tvar i Tag\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Name,\n\t\t\t&i.Description,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Deleted,\n\t\t\t&i.CategoryID,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getMergedURLsForEdit = `-- name: GetMergedURLsForEdit :many\n\nWITH current_urls AS (\n    SELECT su.url, su.site_id FROM edits e\n    JOIN scene_edits se ON e.id = se.edit_id \n    JOIN scene_urls su ON se.scene_id = su.scene_id\n    WHERE e.id = $1 AND e.target_type = 'SCENE'\n    UNION ALL\n    SELECT pu.url, pu.site_id FROM edits e  \n    JOIN performer_edits pe ON e.id = pe.edit_id\n    JOIN performer_urls pu ON pe.performer_id = pu.performer_id  \n    WHERE e.id = $1 AND e.target_type = 'PERFORMER'\n    UNION ALL\n    SELECT stu.url, stu.site_id FROM edits e\n    JOIN studio_edits ste ON e.id = ste.edit_id\n    JOIN studio_urls stu ON ste.studio_id = stu.studio_id\n    WHERE e.id = $1 AND e.target_type = 'STUDIO'\n),\nremoved_urls AS (\n    SELECT\n        elem->>'url' AS url,\n        (elem->>'site_id')::uuid AS site_id\n    FROM edits, jsonb_array_elements(COALESCE(data->'new_data'->'removed_urls', '[]'::jsonb)) AS elem\n    WHERE id = $1\n),\nadded_urls AS (\n    SELECT\n        elem->>'url' AS url,\n        (elem->>'site_id')::uuid AS site_id\n    FROM edits, jsonb_array_elements(COALESCE(data->'new_data'->'added_urls', '[]'::jsonb)) AS elem\n    WHERE id = $1\n),\nfinal_urls AS (\n    SELECT url, site_id FROM current_urls\n    WHERE (url, site_id) NOT IN (SELECT url, site_id FROM removed_urls)\n    UNION\n    SELECT url, site_id FROM added_urls\n)\nSELECT DISTINCT url, site_id FROM final_urls\nORDER BY url\n`\n\ntype GetMergedURLsForEditRow struct {\n\tUrl    string    `db:\"url\" json:\"url\"`\n\tSiteID uuid.UUID `db:\"site_id\" json:\"site_id\"`\n}\n\n// URL merging queries for edits\n// result: URL\n// Gets current URLs for target entity and merges with edit's added_urls/removed_urls\nfunc (q *Queries) GetMergedURLsForEdit(ctx context.Context, id uuid.UUID) ([]GetMergedURLsForEditRow, error) {\n\trows, err := q.db.Query(ctx, getMergedURLsForEdit, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []GetMergedURLsForEditRow{}\n\tfor rows.Next() {\n\t\tvar i GetMergedURLsForEditRow\n\t\tif err := rows.Scan(&i.Url, &i.SiteID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst resetVotes = `-- name: ResetVotes :exec\nUPDATE edit_votes\nSET vote = 'ABSTAIN'\nWHERE edit_id = $1\n`\n\nfunc (q *Queries) ResetVotes(ctx context.Context, editID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, resetVotes, editID)\n\treturn err\n}\n\nconst updateEdit = `-- name: UpdateEdit :one\nUPDATE edits \nSET data = $2, votes = $3,\n    status = $4, applied = $5, closed_at = $6, update_count = $7, updated_at = now()\nWHERE id = $1\nRETURNING id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count\n`\n\ntype UpdateEditParams struct {\n\tID          uuid.UUID  `db:\"id\" json:\"id\"`\n\tData        []byte     `db:\"data\" json:\"data\"`\n\tVotes       int        `db:\"votes\" json:\"votes\"`\n\tStatus      string     `db:\"status\" json:\"status\"`\n\tApplied     bool       `db:\"applied\" json:\"applied\"`\n\tClosedAt    *time.Time `db:\"closed_at\" json:\"closed_at\"`\n\tUpdateCount int        `db:\"update_count\" json:\"update_count\"`\n}\n\nfunc (q *Queries) UpdateEdit(ctx context.Context, arg UpdateEditParams) (Edit, error) {\n\trow := q.db.QueryRow(ctx, updateEdit,\n\t\targ.ID,\n\t\targ.Data,\n\t\targ.Votes,\n\t\targ.Status,\n\t\targ.Applied,\n\t\targ.ClosedAt,\n\t\targ.UpdateCount,\n\t)\n\tvar i Edit\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.UserID,\n\t\t&i.Operation,\n\t\t&i.TargetType,\n\t\t&i.Data,\n\t\t&i.Votes,\n\t\t&i.Status,\n\t\t&i.Applied,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.ClosedAt,\n\t\t&i.Bot,\n\t\t&i.UpdateCount,\n\t)\n\treturn i, err\n}\n\nconst updateEditData = `-- name: UpdateEditData :one\nUPDATE edits SET data = $2, updated_at = now() WHERE id = $1 RETURNING id, user_id, operation, target_type, data, votes, status, applied, created_at, updated_at, closed_at, bot, update_count\n`\n\ntype UpdateEditDataParams struct {\n\tID   uuid.UUID `db:\"id\" json:\"id\"`\n\tData []byte    `db:\"data\" json:\"data\"`\n}\n\nfunc (q *Queries) UpdateEditData(ctx context.Context, arg UpdateEditDataParams) (Edit, error) {\n\trow := q.db.QueryRow(ctx, updateEditData, arg.ID, arg.Data)\n\tvar i Edit\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.UserID,\n\t\t&i.Operation,\n\t\t&i.TargetType,\n\t\t&i.Data,\n\t\t&i.Votes,\n\t\t&i.Status,\n\t\t&i.Applied,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.ClosedAt,\n\t\t&i.Bot,\n\t\t&i.UpdateCount,\n\t)\n\treturn i, err\n}\n"
  },
  {
    "path": "internal/queries/fingerprint.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: fingerprint.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\nconst createFingerprint = `-- name: CreateFingerprint :one\n\nINSERT INTO fingerprints (hash, algorithm) VALUES ($1, $2)\nON CONFLICT (hash, algorithm) DO UPDATE SET hash = EXCLUDED.hash\nRETURNING id, algorithm, hash\n`\n\ntype CreateFingerprintParams struct {\n\tHash      int64  `db:\"hash\" json:\"hash\"`\n\tAlgorithm string `db:\"algorithm\" json:\"algorithm\"`\n}\n\n// Fingerprint queries (normalized schema)\nfunc (q *Queries) CreateFingerprint(ctx context.Context, arg CreateFingerprintParams) (Fingerprint, error) {\n\trow := q.db.QueryRow(ctx, createFingerprint, arg.Hash, arg.Algorithm)\n\tvar i Fingerprint\n\terr := row.Scan(&i.ID, &i.Algorithm, &i.Hash)\n\treturn i, err\n}\n\nconst createOrReplaceFingerprint = `-- name: CreateOrReplaceFingerprint :exec\nINSERT INTO scene_fingerprints (fingerprint_id, scene_id, user_id, duration, vote)\nVALUES ($1, $2, $3, $4, $5)\nON CONFLICT ON CONSTRAINT scene_fingerprints_scene_id_fingerprint_id_user_id_key\nDO UPDATE SET\n    duration = EXCLUDED.duration,\n    vote = EXCLUDED.vote\n`\n\ntype CreateOrReplaceFingerprintParams struct {\n\tFingerprintID int       `db:\"fingerprint_id\" json:\"fingerprint_id\"`\n\tSceneID       uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tUserID        uuid.UUID `db:\"user_id\" json:\"user_id\"`\n\tDuration      int       `db:\"duration\" json:\"duration\"`\n\tVote          int16     `db:\"vote\" json:\"vote\"`\n}\n\nfunc (q *Queries) CreateOrReplaceFingerprint(ctx context.Context, arg CreateOrReplaceFingerprintParams) error {\n\t_, err := q.db.Exec(ctx, createOrReplaceFingerprint,\n\t\targ.FingerprintID,\n\t\targ.SceneID,\n\t\targ.UserID,\n\t\targ.Duration,\n\t\targ.Vote,\n\t)\n\treturn err\n}\n\ntype CreateSceneFingerprintsParams struct {\n\tFingerprintID int       `db:\"fingerprint_id\" json:\"fingerprint_id\"`\n\tSceneID       uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tUserID        uuid.UUID `db:\"user_id\" json:\"user_id\"`\n\tDuration      int       `db:\"duration\" json:\"duration\"`\n}\n\nconst deleteAllSceneFingerprintSubmissions = `-- name: DeleteAllSceneFingerprintSubmissions :execrows\nDELETE FROM scene_fingerprints SFP\nUSING fingerprints FP\nWHERE SFP.fingerprint_id = FP.id\n  AND FP.hash = $1\n  AND FP.algorithm = $2\n  AND SFP.scene_id = $3\n`\n\ntype DeleteAllSceneFingerprintSubmissionsParams struct {\n\tHash      int64     `db:\"hash\" json:\"hash\"`\n\tAlgorithm string    `db:\"algorithm\" json:\"algorithm\"`\n\tSceneID   uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n}\n\nfunc (q *Queries) DeleteAllSceneFingerprintSubmissions(ctx context.Context, arg DeleteAllSceneFingerprintSubmissionsParams) (int64, error) {\n\tresult, err := q.db.Exec(ctx, deleteAllSceneFingerprintSubmissions, arg.Hash, arg.Algorithm, arg.SceneID)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn result.RowsAffected(), nil\n}\n\nconst deleteSceneFingerprint = `-- name: DeleteSceneFingerprint :exec\nDELETE FROM scene_fingerprints SFP\nUSING fingerprints FP\nWHERE SFP.fingerprint_id = FP.id\nAND FP.hash = $1\nAND FP.algorithm = $2\nAND user_id = $3\nAND scene_id = $4\n`\n\ntype DeleteSceneFingerprintParams struct {\n\tHash      int64     `db:\"hash\" json:\"hash\"`\n\tAlgorithm string    `db:\"algorithm\" json:\"algorithm\"`\n\tUserID    uuid.UUID `db:\"user_id\" json:\"user_id\"`\n\tSceneID   uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n}\n\nfunc (q *Queries) DeleteSceneFingerprint(ctx context.Context, arg DeleteSceneFingerprintParams) error {\n\t_, err := q.db.Exec(ctx, deleteSceneFingerprint,\n\t\targ.Hash,\n\t\targ.Algorithm,\n\t\targ.UserID,\n\t\targ.SceneID,\n\t)\n\treturn err\n}\n\nconst deleteSceneFingerprintsByScene = `-- name: DeleteSceneFingerprintsByScene :exec\nDELETE FROM scene_fingerprints WHERE scene_id = $1\n`\n\nfunc (q *Queries) DeleteSceneFingerprintsByScene(ctx context.Context, sceneID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteSceneFingerprintsByScene, sceneID)\n\treturn err\n}\n\nconst getAllFingerprints = `-- name: GetAllFingerprints :many\nSELECT\n    SFP.scene_id,\n    FP.hash,\n    FP.algorithm,\n    mode() WITHIN GROUP (ORDER BY SFP.duration)::INTEGER as duration,\n    COUNT(CASE WHEN SFP.vote = 1 THEN 1 END) as submissions,\n    COUNT(CASE WHEN SFP.vote = -1 THEN 1 END) as reports,\n    SUM(SFP.vote) as net_submissions,\n    MIN(SFP.created_at)::TIMESTAMP as created_at,\n    MAX(SFP.created_at)::TIMESTAMP as updated_at,\n    bool_or(SFP.user_id = $1 AND SFP.vote = 1) as user_submitted,\n    bool_or(SFP.user_id = $1 AND SFP.vote = -1) as user_reported\nFROM scene_fingerprints SFP\nJOIN fingerprints FP ON SFP.fingerprint_id = FP.id\nWHERE SFP.scene_id = ANY($2::UUID[])\n  AND ($3::uuid IS NULL OR SFP.user_id = $3)\nGROUP BY SFP.scene_id, FP.algorithm, FP.hash\nORDER BY net_submissions DESC\n`\n\ntype GetAllFingerprintsParams struct {\n\tCurrentUserID uuid.UUID     `db:\"current_user_id\" json:\"current_user_id\"`\n\tSceneIds      []uuid.UUID   `db:\"scene_ids\" json:\"scene_ids\"`\n\tFilterUserID  uuid.NullUUID `db:\"filter_user_id\" json:\"filter_user_id\"`\n}\n\ntype GetAllFingerprintsRow struct {\n\tSceneID        uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tHash           int64     `db:\"hash\" json:\"hash\"`\n\tAlgorithm      string    `db:\"algorithm\" json:\"algorithm\"`\n\tDuration       int       `db:\"duration\" json:\"duration\"`\n\tSubmissions    int64     `db:\"submissions\" json:\"submissions\"`\n\tReports        int64     `db:\"reports\" json:\"reports\"`\n\tNetSubmissions int64     `db:\"net_submissions\" json:\"net_submissions\"`\n\tCreatedAt      time.Time `db:\"created_at\" json:\"created_at\"`\n\tUpdatedAt      time.Time `db:\"updated_at\" json:\"updated_at\"`\n\tUserSubmitted  bool      `db:\"user_submitted\" json:\"user_submitted\"`\n\tUserReported   bool      `db:\"user_reported\" json:\"user_reported\"`\n}\n\n// Get all fingerprints for multiple scenes with aggregated vote data\n// When onlySubmitted is true, pass the actual user ID, when false pass NULL\nfunc (q *Queries) GetAllFingerprints(ctx context.Context, arg GetAllFingerprintsParams) ([]GetAllFingerprintsRow, error) {\n\trows, err := q.db.Query(ctx, getAllFingerprints, arg.CurrentUserID, arg.SceneIds, arg.FilterUserID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []GetAllFingerprintsRow{}\n\tfor rows.Next() {\n\t\tvar i GetAllFingerprintsRow\n\t\tif err := rows.Scan(\n\t\t\t&i.SceneID,\n\t\t\t&i.Hash,\n\t\t\t&i.Algorithm,\n\t\t\t&i.Duration,\n\t\t\t&i.Submissions,\n\t\t\t&i.Reports,\n\t\t\t&i.NetSubmissions,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.UserSubmitted,\n\t\t\t&i.UserReported,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getAllSceneFingerprints = `-- name: GetAllSceneFingerprints :many\nSELECT f.algorithm, f.hash, sf.duration, sf.created_at, sf.user_id\nFROM scene_fingerprints sf\nJOIN fingerprints f ON sf.fingerprint_id = f.id\nWHERE sf.scene_id = $1\nORDER BY f.algorithm, sf.created_at\n`\n\ntype GetAllSceneFingerprintsRow struct {\n\tAlgorithm string    `db:\"algorithm\" json:\"algorithm\"`\n\tHash      int64     `db:\"hash\" json:\"hash\"`\n\tDuration  int       `db:\"duration\" json:\"duration\"`\n\tCreatedAt time.Time `db:\"created_at\" json:\"created_at\"`\n\tUserID    uuid.UUID `db:\"user_id\" json:\"user_id\"`\n}\n\nfunc (q *Queries) GetAllSceneFingerprints(ctx context.Context, sceneID uuid.UUID) ([]GetAllSceneFingerprintsRow, error) {\n\trows, err := q.db.Query(ctx, getAllSceneFingerprints, sceneID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []GetAllSceneFingerprintsRow{}\n\tfor rows.Next() {\n\t\tvar i GetAllSceneFingerprintsRow\n\t\tif err := rows.Scan(\n\t\t\t&i.Algorithm,\n\t\t\t&i.Hash,\n\t\t\t&i.Duration,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UserID,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getFingerprint = `-- name: GetFingerprint :one\nSELECT id, algorithm, hash FROM fingerprints WHERE hash = $1 AND algorithm = $2\n`\n\ntype GetFingerprintParams struct {\n\tHash      int64  `db:\"hash\" json:\"hash\"`\n\tAlgorithm string `db:\"algorithm\" json:\"algorithm\"`\n}\n\nfunc (q *Queries) GetFingerprint(ctx context.Context, arg GetFingerprintParams) (Fingerprint, error) {\n\trow := q.db.QueryRow(ctx, getFingerprint, arg.Hash, arg.Algorithm)\n\tvar i Fingerprint\n\terr := row.Scan(&i.ID, &i.Algorithm, &i.Hash)\n\treturn i, err\n}\n\nconst moveSceneFingerprintSubmissions = `-- name: MoveSceneFingerprintSubmissions :execrows\nWITH to_move AS (\n  SELECT SFP.fingerprint_id, SFP.user_id\n  FROM scene_fingerprints SFP\n  JOIN fingerprints FP ON SFP.fingerprint_id = FP.id\n  WHERE FP.hash = $2\n    AND FP.algorithm = $3\n    AND SFP.scene_id = $4\n),\ndeleted AS (\n  DELETE FROM scene_fingerprints\n  WHERE scene_id = $1\n    AND (fingerprint_id, user_id) IN (SELECT fingerprint_id, user_id FROM to_move)\n)\nUPDATE scene_fingerprints SFP\nSET scene_id = $1\nFROM fingerprints FP\nWHERE SFP.fingerprint_id = FP.id\n  AND FP.hash = $2\n  AND FP.algorithm = $3\n  AND SFP.scene_id = $4\n`\n\ntype MoveSceneFingerprintSubmissionsParams struct {\n\tTargetSceneID uuid.UUID `db:\"target_scene_id\" json:\"target_scene_id\"`\n\tHash          int64     `db:\"hash\" json:\"hash\"`\n\tAlgorithm     string    `db:\"algorithm\" json:\"algorithm\"`\n\tSourceSceneID uuid.UUID `db:\"source_scene_id\" json:\"source_scene_id\"`\n}\n\nfunc (q *Queries) MoveSceneFingerprintSubmissions(ctx context.Context, arg MoveSceneFingerprintSubmissionsParams) (int64, error) {\n\tresult, err := q.db.Exec(ctx, moveSceneFingerprintSubmissions,\n\t\targ.TargetSceneID,\n\t\targ.Hash,\n\t\targ.Algorithm,\n\t\targ.SourceSceneID,\n\t)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn result.RowsAffected(), nil\n}\n\nconst submittedHashExists = `-- name: SubmittedHashExists :one\nSELECT EXISTS(\n\t\tSELECT\n\t\t\t1\n\t\tFROM scene_fingerprints f\n\t\tJOIN fingerprints fp ON f.fingerprint_id = fp.id\n\t\tWHERE f.scene_id = $1 AND fp.hash = $2 AND fp.algorithm = $3 AND f.vote = 1\n) AS exists\n`\n\ntype SubmittedHashExistsParams struct {\n\tSceneID   uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tHash      int64     `db:\"hash\" json:\"hash\"`\n\tAlgorithm string    `db:\"algorithm\" json:\"algorithm\"`\n}\n\nfunc (q *Queries) SubmittedHashExists(ctx context.Context, arg SubmittedHashExistsParams) (bool, error) {\n\trow := q.db.QueryRow(ctx, submittedHashExists, arg.SceneID, arg.Hash, arg.Algorithm)\n\tvar exists bool\n\terr := row.Scan(&exists)\n\treturn exists, err\n}\n"
  },
  {
    "path": "internal/queries/helpers.go",
    "content": "package queries\n\n// DB returns the underlying DBTX interface from Queries\nfunc (q *Queries) DB() DBTX {\n\treturn q.db\n}\n"
  },
  {
    "path": "internal/queries/image.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: image.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\nconst createImage = `-- name: CreateImage :one\n\nINSERT INTO images (id, url, width, height, checksum)\nVALUES ($1, $2, $3, $4, $5)\nRETURNING id, url, width, height, checksum\n`\n\ntype CreateImageParams struct {\n\tID       uuid.UUID `db:\"id\" json:\"id\"`\n\tUrl      *string   `db:\"url\" json:\"url\"`\n\tWidth    int       `db:\"width\" json:\"width\"`\n\tHeight   int       `db:\"height\" json:\"height\"`\n\tChecksum string    `db:\"checksum\" json:\"checksum\"`\n}\n\n// Image queries\nfunc (q *Queries) CreateImage(ctx context.Context, arg CreateImageParams) (Image, error) {\n\trow := q.db.QueryRow(ctx, createImage,\n\t\targ.ID,\n\t\targ.Url,\n\t\targ.Width,\n\t\targ.Height,\n\t\targ.Checksum,\n\t)\n\tvar i Image\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Url,\n\t\t&i.Width,\n\t\t&i.Height,\n\t\t&i.Checksum,\n\t)\n\treturn i, err\n}\n\nconst deleteImage = `-- name: DeleteImage :exec\nDELETE FROM images WHERE id = $1\n`\n\nfunc (q *Queries) DeleteImage(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteImage, id)\n\treturn err\n}\n\nconst findImage = `-- name: FindImage :one\nSELECT id, url, width, height, checksum FROM images WHERE id = $1\n`\n\nfunc (q *Queries) FindImage(ctx context.Context, id uuid.UUID) (Image, error) {\n\trow := q.db.QueryRow(ctx, findImage, id)\n\tvar i Image\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Url,\n\t\t&i.Width,\n\t\t&i.Height,\n\t\t&i.Checksum,\n\t)\n\treturn i, err\n}\n\nconst findImageByChecksum = `-- name: FindImageByChecksum :one\nSELECT id, url, width, height, checksum FROM images WHERE checksum = $1\n`\n\nfunc (q *Queries) FindImageByChecksum(ctx context.Context, checksum string) (Image, error) {\n\trow := q.db.QueryRow(ctx, findImageByChecksum, checksum)\n\tvar i Image\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Url,\n\t\t&i.Width,\n\t\t&i.Height,\n\t\t&i.Checksum,\n\t)\n\treturn i, err\n}\n\nconst findImageIdsByPerformerIds = `-- name: FindImageIdsByPerformerIds :many\nSELECT performer_images.performer_id, performer_images.image_id\nFROM performer_images\nWHERE performer_images.performer_id = ANY($1::UUID[])\n`\n\nfunc (q *Queries) FindImageIdsByPerformerIds(ctx context.Context, dollar_1 []uuid.UUID) ([]PerformerImage, error) {\n\trows, err := q.db.Query(ctx, findImageIdsByPerformerIds, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []PerformerImage{}\n\tfor rows.Next() {\n\t\tvar i PerformerImage\n\t\tif err := rows.Scan(&i.PerformerID, &i.ImageID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findImageIdsBySceneIds = `-- name: FindImageIdsBySceneIds :many\nSELECT scene_images.scene_id, scene_images.image_id\nFROM scene_images\nWHERE scene_images.scene_id = ANY($1::UUID[])\n`\n\nfunc (q *Queries) FindImageIdsBySceneIds(ctx context.Context, dollar_1 []uuid.UUID) ([]SceneImage, error) {\n\trows, err := q.db.Query(ctx, findImageIdsBySceneIds, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []SceneImage{}\n\tfor rows.Next() {\n\t\tvar i SceneImage\n\t\tif err := rows.Scan(&i.SceneID, &i.ImageID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findImageIdsByStudioIds = `-- name: FindImageIdsByStudioIds :many\nSELECT studio_images.studio_id, studio_images.image_id\nFROM studio_images\nWHERE studio_images.studio_id = ANY($1::UUID[])\n`\n\nfunc (q *Queries) FindImageIdsByStudioIds(ctx context.Context, dollar_1 []uuid.UUID) ([]StudioImage, error) {\n\trows, err := q.db.Query(ctx, findImageIdsByStudioIds, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []StudioImage{}\n\tfor rows.Next() {\n\t\tvar i StudioImage\n\t\tif err := rows.Scan(&i.StudioID, &i.ImageID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findImagesByIds = `-- name: FindImagesByIds :many\nSELECT id, url, width, height, checksum FROM images WHERE id = ANY($1::UUID[])\n`\n\nfunc (q *Queries) FindImagesByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]Image, error) {\n\trows, err := q.db.Query(ctx, findImagesByIds, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Image{}\n\tfor rows.Next() {\n\t\tvar i Image\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Url,\n\t\t\t&i.Width,\n\t\t\t&i.Height,\n\t\t\t&i.Checksum,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findImagesBySceneID = `-- name: FindImagesBySceneID :many\nSELECT images.id, images.url, images.width, images.height, images.checksum FROM images\nLEFT JOIN scene_images as scenes_join on scenes_join.image_id = images.id\nLEFT JOIN scenes on scenes_join.scene_id = scenes.id\nWHERE scenes.id = $1\n`\n\nfunc (q *Queries) FindImagesBySceneID(ctx context.Context, id uuid.UUID) ([]Image, error) {\n\trows, err := q.db.Query(ctx, findImagesBySceneID, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Image{}\n\tfor rows.Next() {\n\t\tvar i Image\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Url,\n\t\t\t&i.Width,\n\t\t\t&i.Height,\n\t\t\t&i.Checksum,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findImagesByStudioID = `-- name: FindImagesByStudioID :many\nSELECT images.id, images.url, images.width, images.height, images.checksum FROM images\nLEFT JOIN studio_images as studios_join on studios_join.image_id = images.id\nLEFT JOIN studios on studios_join.studio_id = studios.id\nWHERE studios.id = $1\n`\n\nfunc (q *Queries) FindImagesByStudioID(ctx context.Context, id uuid.UUID) ([]Image, error) {\n\trows, err := q.db.Query(ctx, findImagesByStudioID, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Image{}\n\tfor rows.Next() {\n\t\tvar i Image\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Url,\n\t\t\t&i.Width,\n\t\t\t&i.Height,\n\t\t\t&i.Checksum,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findUnusedImages = `-- name: FindUnusedImages :many\nSELECT images.id, images.url, images.width, images.height, images.checksum from images\nLEFT JOIN scene_images ON scene_images.image_id = images.id\nLEFT JOIN performer_images ON performer_images.image_id = images.id\nLEFT JOIN studio_images ON studio_images.image_id = images.id\nLEFT JOIN (\n    SELECT (jsonb_array_elements(data#>'{new_data,added_images}')->>0)::uuid AS image_id\n    FROM edits\n    WHERE status = 'PENDING'\n) edit_images ON edit_images.image_id = images.id\nLEFT JOIN (\n    SELECT id, (data->>'image')::uuid AS image_id\n    FROM drafts\n) drafts ON images.id = drafts.image_id\nWHERE scene_images.scene_id IS NULL\nAND performer_images.performer_id IS NULL\nAND studio_images.studio_id IS NULL\nAND edit_images.image_id IS NULL\nAND drafts.id IS NULL\nLIMIT 1000\n`\n\nfunc (q *Queries) FindUnusedImages(ctx context.Context) ([]Image, error) {\n\trows, err := q.db.Query(ctx, findUnusedImages)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Image{}\n\tfor rows.Next() {\n\t\tvar i Image\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Url,\n\t\t\t&i.Width,\n\t\t\t&i.Height,\n\t\t\t&i.Checksum,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst isImageUnused = `-- name: IsImageUnused :one\nSELECT COUNT(*) > 0 AS unused from images\nLEFT JOIN scene_images ON scene_images.image_id = images.id\nLEFT JOIN performer_images ON performer_images.image_id = images.id\nLEFT JOIN studio_images ON studio_images.image_id = images.id\nLEFT JOIN (\n    SELECT (jsonb_array_elements(data#>'{new_data,added_images}')->>0)::uuid AS image_id\n    FROM edits\n    WHERE status = 'PENDING'\n) edit_images ON edit_images.image_id = images.id\nLEFT JOIN (\n    SELECT id, (data->>'image')::uuid AS image_id\n    FROM drafts\n) drafts ON images.id = drafts.image_id\nWHERE images.id = $1\nAND scene_images.scene_id IS NULL\nAND performer_images.performer_id IS NULL\nAND studio_images.studio_id IS NULL\nAND edit_images.image_id IS NULL\nAND drafts.id IS NULL\n`\n\nfunc (q *Queries) IsImageUnused(ctx context.Context, id uuid.UUID) (bool, error) {\n\trow := q.db.QueryRow(ctx, isImageUnused, id)\n\tvar unused bool\n\terr := row.Scan(&unused)\n\treturn unused, err\n}\n"
  },
  {
    "path": "internal/queries/invite_key.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: invite_key.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\nconst createInviteKey = `-- name: CreateInviteKey :one\n\nINSERT INTO invite_keys (id, generated_by, uses, expire_time, generated_at)\nVALUES ($1, $2, $3, $4, now())\nRETURNING id, generated_by, generated_at, uses, expire_time\n`\n\ntype CreateInviteKeyParams struct {\n\tID          uuid.UUID  `db:\"id\" json:\"id\"`\n\tGeneratedBy uuid.UUID  `db:\"generated_by\" json:\"generated_by\"`\n\tUses        *int       `db:\"uses\" json:\"uses\"`\n\tExpireTime  *time.Time `db:\"expire_time\" json:\"expire_time\"`\n}\n\n// Invite key queries\nfunc (q *Queries) CreateInviteKey(ctx context.Context, arg CreateInviteKeyParams) (InviteKey, error) {\n\trow := q.db.QueryRow(ctx, createInviteKey,\n\t\targ.ID,\n\t\targ.GeneratedBy,\n\t\targ.Uses,\n\t\targ.ExpireTime,\n\t)\n\tvar i InviteKey\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.GeneratedBy,\n\t\t&i.GeneratedAt,\n\t\t&i.Uses,\n\t\t&i.ExpireTime,\n\t)\n\treturn i, err\n}\n\nconst deleteInviteKey = `-- name: DeleteInviteKey :exec\nDELETE FROM invite_keys WHERE id = $1\n`\n\nfunc (q *Queries) DeleteInviteKey(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteInviteKey, id)\n\treturn err\n}\n\nconst destroyExpiredInvites = `-- name: DestroyExpiredInvites :exec\nDELETE FROM invite_keys WHERE expire_time IS NOT NULL AND expire_time < NOW()\n`\n\nfunc (q *Queries) DestroyExpiredInvites(ctx context.Context) error {\n\t_, err := q.db.Exec(ctx, destroyExpiredInvites)\n\treturn err\n}\n\nconst findActiveInviteKeysForUser = `-- name: FindActiveInviteKeysForUser :many\nSELECT i.id, i.generated_by, i.generated_at, i.uses, i.expire_time FROM invite_keys i\nLEFT JOIN (\n  SELECT uuid(data->>'invite_key') as invite_key, COUNT(*) as count\n  FROM user_tokens\n  WHERE expires_at > NOW()\n  GROUP BY data->>'invite_key'\n) AS used ON used.invite_key = i.id\nWHERE i.generated_by = $1\nAND (i.expire_time IS NULL OR i.expire_time > NOW())\nAND (used.invite_key IS NULL OR i.uses IS NULL OR used.count < i.uses)\n`\n\nfunc (q *Queries) FindActiveInviteKeysForUser(ctx context.Context, generatedBy uuid.UUID) ([]InviteKey, error) {\n\trows, err := q.db.Query(ctx, findActiveInviteKeysForUser, generatedBy)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []InviteKey{}\n\tfor rows.Next() {\n\t\tvar i InviteKey\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.GeneratedBy,\n\t\t\t&i.GeneratedAt,\n\t\t\t&i.Uses,\n\t\t\t&i.ExpireTime,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findInviteKey = `-- name: FindInviteKey :one\nSELECT id, generated_by, generated_at, uses, expire_time FROM invite_keys WHERE id = $1\n`\n\nfunc (q *Queries) FindInviteKey(ctx context.Context, id uuid.UUID) (InviteKey, error) {\n\trow := q.db.QueryRow(ctx, findInviteKey, id)\n\tvar i InviteKey\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.GeneratedBy,\n\t\t&i.GeneratedAt,\n\t\t&i.Uses,\n\t\t&i.ExpireTime,\n\t)\n\treturn i, err\n}\n\nconst inviteKeyUsed = `-- name: InviteKeyUsed :one\nUPDATE invite_keys\nSET uses = GREATEST(0, uses - 1)\nWHERE id = $1 AND uses IS NOT NULL AND uses > 0\nRETURNING uses\n`\n\nfunc (q *Queries) InviteKeyUsed(ctx context.Context, id uuid.UUID) (*int, error) {\n\trow := q.db.QueryRow(ctx, inviteKeyUsed, id)\n\tvar uses *int\n\terr := row.Scan(&uses)\n\treturn uses, err\n}\n"
  },
  {
    "path": "internal/queries/mod_audit.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: mod_audit.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\nconst createModAudit = `-- name: CreateModAudit :one\nINSERT INTO mod_audit (\n    id, action, user_id, target_id, target_type, data, reason, created_at\n)\nVALUES ($1, $2, $3, $4, $5, $6, $7, NOW())\nRETURNING id, action, user_id, target_id, target_type, data, reason, created_at\n`\n\ntype CreateModAuditParams struct {\n\tID         uuid.UUID       `db:\"id\" json:\"id\"`\n\tAction     ModAuditAction  `db:\"action\" json:\"action\"`\n\tUserID     uuid.NullUUID   `db:\"user_id\" json:\"user_id\"`\n\tTargetID   uuid.UUID       `db:\"target_id\" json:\"target_id\"`\n\tTargetType string          `db:\"target_type\" json:\"target_type\"`\n\tData       json.RawMessage `db:\"data\" json:\"data\"`\n\tReason     *string         `db:\"reason\" json:\"reason\"`\n}\n\nfunc (q *Queries) CreateModAudit(ctx context.Context, arg CreateModAuditParams) (ModAudit, error) {\n\trow := q.db.QueryRow(ctx, createModAudit,\n\t\targ.ID,\n\t\targ.Action,\n\t\targ.UserID,\n\t\targ.TargetID,\n\t\targ.TargetType,\n\t\targ.Data,\n\t\targ.Reason,\n\t)\n\tvar i ModAudit\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Action,\n\t\t&i.UserID,\n\t\t&i.TargetID,\n\t\t&i.TargetType,\n\t\t&i.Data,\n\t\t&i.Reason,\n\t\t&i.CreatedAt,\n\t)\n\treturn i, err\n}\n\nconst deleteExpiredModAudits = `-- name: DeleteExpiredModAudits :exec\nDELETE FROM mod_audit\nWHERE created_at < NOW() - INTERVAL '1 day' * $1\n`\n\nfunc (q *Queries) DeleteExpiredModAudits(ctx context.Context, dollar_1 interface{}) error {\n\t_, err := q.db.Exec(ctx, deleteExpiredModAudits, dollar_1)\n\treturn err\n}\n\nconst getModAuditCount = `-- name: GetModAuditCount :one\nSELECT COUNT(*) FROM mod_audit\nWHERE ($1::mod_audit_action IS NULL OR action = $1)\n  AND ($2::uuid IS NULL OR user_id = $2)\n`\n\ntype GetModAuditCountParams struct {\n\tAction NullModAuditAction `db:\"action\" json:\"action\"`\n\tUserID uuid.NullUUID      `db:\"user_id\" json:\"user_id\"`\n}\n\nfunc (q *Queries) GetModAuditCount(ctx context.Context, arg GetModAuditCountParams) (int64, error) {\n\trow := q.db.QueryRow(ctx, getModAuditCount, arg.Action, arg.UserID)\n\tvar count int64\n\terr := row.Scan(&count)\n\treturn count, err\n}\n\nconst queryModAudits = `-- name: QueryModAudits :many\nSELECT id, action, user_id, target_id, target_type, data, reason, created_at FROM mod_audit\nWHERE ($3::mod_audit_action IS NULL OR action = $3)\n  AND ($4::uuid IS NULL OR user_id = $4)\nORDER BY created_at DESC\nLIMIT $1 OFFSET $2\n`\n\ntype QueryModAuditsParams struct {\n\tLimit  int32              `db:\"limit\" json:\"limit\"`\n\tOffset int32              `db:\"offset\" json:\"offset\"`\n\tAction NullModAuditAction `db:\"action\" json:\"action\"`\n\tUserID uuid.NullUUID      `db:\"user_id\" json:\"user_id\"`\n}\n\nfunc (q *Queries) QueryModAudits(ctx context.Context, arg QueryModAuditsParams) ([]ModAudit, error) {\n\trows, err := q.db.Query(ctx, queryModAudits,\n\t\targ.Limit,\n\t\targ.Offset,\n\t\targ.Action,\n\t\targ.UserID,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []ModAudit{}\n\tfor rows.Next() {\n\t\tvar i ModAudit\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Action,\n\t\t\t&i.UserID,\n\t\t\t&i.TargetID,\n\t\t\t&i.TargetType,\n\t\t\t&i.Data,\n\t\t\t&i.Reason,\n\t\t\t&i.CreatedAt,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n"
  },
  {
    "path": "internal/queries/models.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n\npackage queries\n\nimport (\n\t\"database/sql/driver\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype ModAuditAction string\n\nconst (\n\tModAuditActionEDITDELETE    ModAuditAction = \"EDIT_DELETE\"\n\tModAuditActionEDITAMENDMENT ModAuditAction = \"EDIT_AMENDMENT\"\n)\n\nfunc (e *ModAuditAction) Scan(src interface{}) error {\n\tswitch s := src.(type) {\n\tcase []byte:\n\t\t*e = ModAuditAction(s)\n\tcase string:\n\t\t*e = ModAuditAction(s)\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported scan type for ModAuditAction: %T\", src)\n\t}\n\treturn nil\n}\n\ntype NullModAuditAction struct {\n\tModAuditAction ModAuditAction `json:\"mod_audit_action\"`\n\tValid          bool           `json:\"valid\"` // Valid is true if ModAuditAction is not NULL\n}\n\n// Scan implements the Scanner interface.\nfunc (ns *NullModAuditAction) Scan(value interface{}) error {\n\tif value == nil {\n\t\tns.ModAuditAction, ns.Valid = \"\", false\n\t\treturn nil\n\t}\n\tns.Valid = true\n\treturn ns.ModAuditAction.Scan(value)\n}\n\n// Value implements the driver Valuer interface.\nfunc (ns NullModAuditAction) Value() (driver.Value, error) {\n\tif !ns.Valid {\n\t\treturn nil, nil\n\t}\n\treturn string(ns.ModAuditAction), nil\n}\n\ntype NotificationType string\n\nconst (\n\tNotificationTypeFAVORITEPERFORMERSCENE NotificationType = \"FAVORITE_PERFORMER_SCENE\"\n\tNotificationTypeFAVORITEPERFORMEREDIT  NotificationType = \"FAVORITE_PERFORMER_EDIT\"\n\tNotificationTypeFAVORITESTUDIOSCENE    NotificationType = \"FAVORITE_STUDIO_SCENE\"\n\tNotificationTypeFAVORITESTUDIOEDIT     NotificationType = \"FAVORITE_STUDIO_EDIT\"\n\tNotificationTypeCOMMENTOWNEDIT         NotificationType = \"COMMENT_OWN_EDIT\"\n\tNotificationTypeDOWNVOTEOWNEDIT        NotificationType = \"DOWNVOTE_OWN_EDIT\"\n\tNotificationTypeFAILEDOWNEDIT          NotificationType = \"FAILED_OWN_EDIT\"\n\tNotificationTypeCOMMENTCOMMENTEDEDIT   NotificationType = \"COMMENT_COMMENTED_EDIT\"\n\tNotificationTypeCOMMENTVOTEDEDIT       NotificationType = \"COMMENT_VOTED_EDIT\"\n\tNotificationTypeUPDATEDEDIT            NotificationType = \"UPDATED_EDIT\"\n\tNotificationTypeFINGERPRINTEDSCENEEDIT NotificationType = \"FINGERPRINTED_SCENE_EDIT\"\n)\n\nfunc (e *NotificationType) Scan(src interface{}) error {\n\tswitch s := src.(type) {\n\tcase []byte:\n\t\t*e = NotificationType(s)\n\tcase string:\n\t\t*e = NotificationType(s)\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported scan type for NotificationType: %T\", src)\n\t}\n\treturn nil\n}\n\ntype NullNotificationType struct {\n\tNotificationType NotificationType `json:\"notification_type\"`\n\tValid            bool             `json:\"valid\"` // Valid is true if NotificationType is not NULL\n}\n\n// Scan implements the Scanner interface.\nfunc (ns *NullNotificationType) Scan(value interface{}) error {\n\tif value == nil {\n\t\tns.NotificationType, ns.Valid = \"\", false\n\t\treturn nil\n\t}\n\tns.Valid = true\n\treturn ns.NotificationType.Scan(value)\n}\n\n// Value implements the driver Valuer interface.\nfunc (ns NullNotificationType) Value() (driver.Value, error) {\n\tif !ns.Valid {\n\t\treturn nil, nil\n\t}\n\treturn string(ns.NotificationType), nil\n}\n\ntype Draft struct {\n\tID        uuid.UUID       `db:\"id\" json:\"id\"`\n\tUserID    uuid.UUID       `db:\"user_id\" json:\"user_id\"`\n\tType      string          `db:\"type\" json:\"type\"`\n\tData      json.RawMessage `db:\"data\" json:\"data\"`\n\tCreatedAt time.Time       `db:\"created_at\" json:\"created_at\"`\n}\n\ntype Edit struct {\n\tID          uuid.UUID     `db:\"id\" json:\"id\"`\n\tUserID      uuid.NullUUID `db:\"user_id\" json:\"user_id\"`\n\tOperation   string        `db:\"operation\" json:\"operation\"`\n\tTargetType  string        `db:\"target_type\" json:\"target_type\"`\n\tData        []byte        `db:\"data\" json:\"data\"`\n\tVotes       int           `db:\"votes\" json:\"votes\"`\n\tStatus      string        `db:\"status\" json:\"status\"`\n\tApplied     bool          `db:\"applied\" json:\"applied\"`\n\tCreatedAt   time.Time     `db:\"created_at\" json:\"created_at\"`\n\tUpdatedAt   *time.Time    `db:\"updated_at\" json:\"updated_at\"`\n\tClosedAt    *time.Time    `db:\"closed_at\" json:\"closed_at\"`\n\tBot         bool          `db:\"bot\" json:\"bot\"`\n\tUpdateCount int           `db:\"update_count\" json:\"update_count\"`\n}\n\ntype EditComment struct {\n\tID        uuid.UUID     `db:\"id\" json:\"id\"`\n\tEditID    uuid.UUID     `db:\"edit_id\" json:\"edit_id\"`\n\tUserID    uuid.NullUUID `db:\"user_id\" json:\"user_id\"`\n\tCreatedAt time.Time     `db:\"created_at\" json:\"created_at\"`\n\tText      string        `db:\"text\" json:\"text\"`\n}\n\ntype EditVote struct {\n\tEditID    uuid.UUID `db:\"edit_id\" json:\"edit_id\"`\n\tUserID    uuid.UUID `db:\"user_id\" json:\"user_id\"`\n\tCreatedAt time.Time `db:\"created_at\" json:\"created_at\"`\n\tVote      string    `db:\"vote\" json:\"vote\"`\n}\n\ntype Fingerprint struct {\n\tID        int    `db:\"id\" json:\"id\"`\n\tAlgorithm string `db:\"algorithm\" json:\"algorithm\"`\n\tHash      int64  `db:\"hash\" json:\"hash\"`\n}\n\ntype Image struct {\n\tID       uuid.UUID `db:\"id\" json:\"id\"`\n\tUrl      *string   `db:\"url\" json:\"url\"`\n\tWidth    int       `db:\"width\" json:\"width\"`\n\tHeight   int       `db:\"height\" json:\"height\"`\n\tChecksum string    `db:\"checksum\" json:\"checksum\"`\n}\n\ntype InviteKey struct {\n\tID          uuid.UUID  `db:\"id\" json:\"id\"`\n\tGeneratedBy uuid.UUID  `db:\"generated_by\" json:\"generated_by\"`\n\tGeneratedAt time.Time  `db:\"generated_at\" json:\"generated_at\"`\n\tUses        *int       `db:\"uses\" json:\"uses\"`\n\tExpireTime  *time.Time `db:\"expire_time\" json:\"expire_time\"`\n}\n\ntype ModAudit struct {\n\tID         uuid.UUID       `db:\"id\" json:\"id\"`\n\tAction     ModAuditAction  `db:\"action\" json:\"action\"`\n\tUserID     uuid.NullUUID   `db:\"user_id\" json:\"user_id\"`\n\tTargetID   uuid.UUID       `db:\"target_id\" json:\"target_id\"`\n\tTargetType string          `db:\"target_type\" json:\"target_type\"`\n\tData       json.RawMessage `db:\"data\" json:\"data\"`\n\tReason     *string         `db:\"reason\" json:\"reason\"`\n\tCreatedAt  time.Time       `db:\"created_at\" json:\"created_at\"`\n}\n\ntype Notification struct {\n\tUserID    uuid.UUID        `db:\"user_id\" json:\"user_id\"`\n\tType      NotificationType `db:\"type\" json:\"type\"`\n\tID        uuid.UUID        `db:\"id\" json:\"id\"`\n\tCreatedAt time.Time        `db:\"created_at\" json:\"created_at\"`\n\tReadAt    *time.Time       `db:\"read_at\" json:\"read_at\"`\n}\n\ntype Performer struct {\n\tID              uuid.UUID              `db:\"id\" json:\"id\"`\n\tName            string                 `db:\"name\" json:\"name\"`\n\tDisambiguation  *string                `db:\"disambiguation\" json:\"disambiguation\"`\n\tGender          *models.GenderEnum     `db:\"gender\" json:\"gender\"`\n\tEthnicity       *models.EthnicityEnum  `db:\"ethnicity\" json:\"ethnicity\"`\n\tCountry         *string                `db:\"country\" json:\"country\"`\n\tEyeColor        *models.EyeColorEnum   `db:\"eye_color\" json:\"eye_color\"`\n\tHairColor       *models.HairColorEnum  `db:\"hair_color\" json:\"hair_color\"`\n\tHeight          *int                   `db:\"height\" json:\"height\"`\n\tCupSize         *string                `db:\"cup_size\" json:\"cup_size\"`\n\tBandSize        *int                   `db:\"band_size\" json:\"band_size\"`\n\tHipSize         *int                   `db:\"hip_size\" json:\"hip_size\"`\n\tWaistSize       *int                   `db:\"waist_size\" json:\"waist_size\"`\n\tBreastType      *models.BreastTypeEnum `db:\"breast_type\" json:\"breast_type\"`\n\tCareerStartYear *int                   `db:\"career_start_year\" json:\"career_start_year\"`\n\tCareerEndYear   *int                   `db:\"career_end_year\" json:\"career_end_year\"`\n\tCreatedAt       time.Time              `db:\"created_at\" json:\"created_at\"`\n\tUpdatedAt       time.Time              `db:\"updated_at\" json:\"updated_at\"`\n\tDeleted         bool                   `db:\"deleted\" json:\"deleted\"`\n\tBirthdate       *string                `db:\"birthdate\" json:\"birthdate\"`\n\tDeathdate       *string                `db:\"deathdate\" json:\"deathdate\"`\n}\n\ntype PerformerAlias struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tAlias       string    `db:\"alias\" json:\"alias\"`\n}\n\ntype PerformerEdit struct {\n\tEditID      uuid.UUID `db:\"edit_id\" json:\"edit_id\"`\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n}\n\ntype PerformerFavorite struct {\n\tPerformerID uuid.UUID  `db:\"performer_id\" json:\"performer_id\"`\n\tUserID      uuid.UUID  `db:\"user_id\" json:\"user_id\"`\n\tCreatedAt   *time.Time `db:\"created_at\" json:\"created_at\"`\n}\n\ntype PerformerImage struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tImageID     uuid.UUID `db:\"image_id\" json:\"image_id\"`\n}\n\ntype PerformerPiercing struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tLocation    *string   `db:\"location\" json:\"location\"`\n\tDescription *string   `db:\"description\" json:\"description\"`\n}\n\ntype PerformerRedirect struct {\n\tSourceID uuid.UUID `db:\"source_id\" json:\"source_id\"`\n\tTargetID uuid.UUID `db:\"target_id\" json:\"target_id\"`\n}\n\ntype PerformerSearch struct {\n\tPerformerID    uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tName           *string   `db:\"name\" json:\"name\"`\n\tDisambiguation *string   `db:\"disambiguation\" json:\"disambiguation\"`\n\tAliases        []string  `db:\"aliases\" json:\"aliases\"`\n\tGender         *string   `db:\"gender\" json:\"gender\"`\n}\n\ntype PerformerTattoo struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tLocation    *string   `db:\"location\" json:\"location\"`\n\tDescription *string   `db:\"description\" json:\"description\"`\n}\n\ntype PerformerUrl struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tUrl         string    `db:\"url\" json:\"url\"`\n\tSiteID      uuid.UUID `db:\"site_id\" json:\"site_id\"`\n}\n\ntype Scene struct {\n\tID             uuid.UUID     `db:\"id\" json:\"id\"`\n\tTitle          *string       `db:\"title\" json:\"title\"`\n\tDetails        *string       `db:\"details\" json:\"details\"`\n\tStudioID       uuid.NullUUID `db:\"studio_id\" json:\"studio_id\"`\n\tCreatedAt      time.Time     `db:\"created_at\" json:\"created_at\"`\n\tUpdatedAt      time.Time     `db:\"updated_at\" json:\"updated_at\"`\n\tDuration       *int          `db:\"duration\" json:\"duration\"`\n\tDirector       *string       `db:\"director\" json:\"director\"`\n\tDeleted        bool          `db:\"deleted\" json:\"deleted\"`\n\tCode           *string       `db:\"code\" json:\"code\"`\n\tDate           *string       `db:\"date\" json:\"date\"`\n\tProductionDate *string       `db:\"production_date\" json:\"production_date\"`\n}\n\ntype SceneEdit struct {\n\tEditID  uuid.UUID `db:\"edit_id\" json:\"edit_id\"`\n\tSceneID uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n}\n\ntype SceneFingerprint struct {\n\tFingerprintID int       `db:\"fingerprint_id\" json:\"fingerprint_id\"`\n\tSceneID       uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tUserID        uuid.UUID `db:\"user_id\" json:\"user_id\"`\n\tDuration      int       `db:\"duration\" json:\"duration\"`\n\tCreatedAt     time.Time `db:\"created_at\" json:\"created_at\"`\n\tVote          int16     `db:\"vote\" json:\"vote\"`\n}\n\ntype SceneImage struct {\n\tSceneID uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tImageID uuid.UUID `db:\"image_id\" json:\"image_id\"`\n}\n\ntype ScenePerformer struct {\n\tSceneID     uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tAs          *string   `db:\"as\" json:\"as\"`\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n}\n\ntype SceneRedirect struct {\n\tSourceID uuid.UUID `db:\"source_id\" json:\"source_id\"`\n\tTargetID uuid.UUID `db:\"target_id\" json:\"target_id\"`\n}\n\ntype SceneSearch struct {\n\tSceneID        uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tSceneTitle     *string   `db:\"scene_title\" json:\"scene_title\"`\n\tSceneDate      *string   `db:\"scene_date\" json:\"scene_date\"`\n\tStudioName     *string   `db:\"studio_name\" json:\"studio_name\"`\n\tNetworkName    *string   `db:\"network_name\" json:\"network_name\"`\n\tPerformerNames []string  `db:\"performer_names\" json:\"performer_names\"`\n\tSceneCode      *string   `db:\"scene_code\" json:\"scene_code\"`\n}\n\ntype SceneTag struct {\n\tSceneID uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tTagID   uuid.UUID `db:\"tag_id\" json:\"tag_id\"`\n}\n\ntype SceneUrl struct {\n\tSceneID uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tUrl     string    `db:\"url\" json:\"url\"`\n\tSiteID  uuid.UUID `db:\"site_id\" json:\"site_id\"`\n}\n\ntype Site struct {\n\tID          uuid.UUID `db:\"id\" json:\"id\"`\n\tName        string    `db:\"name\" json:\"name\"`\n\tDescription *string   `db:\"description\" json:\"description\"`\n\tUrl         *string   `db:\"url\" json:\"url\"`\n\tRegex       *string   `db:\"regex\" json:\"regex\"`\n\tValidTypes  []string  `db:\"valid_types\" json:\"valid_types\"`\n\tCreatedAt   time.Time `db:\"created_at\" json:\"created_at\"`\n\tUpdatedAt   time.Time `db:\"updated_at\" json:\"updated_at\"`\n}\n\ntype Studio struct {\n\tID             uuid.UUID     `db:\"id\" json:\"id\"`\n\tName           string        `db:\"name\" json:\"name\"`\n\tParentStudioID uuid.NullUUID `db:\"parent_studio_id\" json:\"parent_studio_id\"`\n\tCreatedAt      time.Time     `db:\"created_at\" json:\"created_at\"`\n\tUpdatedAt      time.Time     `db:\"updated_at\" json:\"updated_at\"`\n\tDeleted        bool          `db:\"deleted\" json:\"deleted\"`\n}\n\ntype StudioAlias struct {\n\tStudioID uuid.UUID `db:\"studio_id\" json:\"studio_id\"`\n\tAlias    string    `db:\"alias\" json:\"alias\"`\n}\n\ntype StudioEdit struct {\n\tEditID   uuid.UUID `db:\"edit_id\" json:\"edit_id\"`\n\tStudioID uuid.UUID `db:\"studio_id\" json:\"studio_id\"`\n}\n\ntype StudioFavorite struct {\n\tStudioID  uuid.UUID  `db:\"studio_id\" json:\"studio_id\"`\n\tUserID    uuid.UUID  `db:\"user_id\" json:\"user_id\"`\n\tCreatedAt *time.Time `db:\"created_at\" json:\"created_at\"`\n}\n\ntype StudioImage struct {\n\tStudioID uuid.UUID `db:\"studio_id\" json:\"studio_id\"`\n\tImageID  uuid.UUID `db:\"image_id\" json:\"image_id\"`\n}\n\ntype StudioRedirect struct {\n\tSourceID uuid.UUID `db:\"source_id\" json:\"source_id\"`\n\tTargetID uuid.UUID `db:\"target_id\" json:\"target_id\"`\n}\n\ntype StudioSearch struct {\n\tStudioID uuid.UUID `db:\"studio_id\" json:\"studio_id\"`\n\tName     *string   `db:\"name\" json:\"name\"`\n\tNetwork  *string   `db:\"network\" json:\"network\"`\n\tAliases  []string  `db:\"aliases\" json:\"aliases\"`\n}\n\ntype StudioUrl struct {\n\tStudioID uuid.UUID `db:\"studio_id\" json:\"studio_id\"`\n\tUrl      string    `db:\"url\" json:\"url\"`\n\tSiteID   uuid.UUID `db:\"site_id\" json:\"site_id\"`\n}\n\ntype Tag struct {\n\tID          uuid.UUID     `db:\"id\" json:\"id\"`\n\tName        string        `db:\"name\" json:\"name\"`\n\tDescription *string       `db:\"description\" json:\"description\"`\n\tCreatedAt   time.Time     `db:\"created_at\" json:\"created_at\"`\n\tUpdatedAt   time.Time     `db:\"updated_at\" json:\"updated_at\"`\n\tDeleted     bool          `db:\"deleted\" json:\"deleted\"`\n\tCategoryID  uuid.NullUUID `db:\"category_id\" json:\"category_id\"`\n}\n\ntype TagAlias struct {\n\tTagID uuid.UUID `db:\"tag_id\" json:\"tag_id\"`\n\tAlias string    `db:\"alias\" json:\"alias\"`\n}\n\ntype TagCategory struct {\n\tID          uuid.UUID `db:\"id\" json:\"id\"`\n\tGroup       string    `db:\"group\" json:\"group\"`\n\tName        string    `db:\"name\" json:\"name\"`\n\tDescription *string   `db:\"description\" json:\"description\"`\n\tCreatedAt   time.Time `db:\"created_at\" json:\"created_at\"`\n\tUpdatedAt   time.Time `db:\"updated_at\" json:\"updated_at\"`\n}\n\ntype TagEdit struct {\n\tEditID uuid.UUID `db:\"edit_id\" json:\"edit_id\"`\n\tTagID  uuid.UUID `db:\"tag_id\" json:\"tag_id\"`\n}\n\ntype TagRedirect struct {\n\tSourceID uuid.UUID `db:\"source_id\" json:\"source_id\"`\n\tTargetID uuid.UUID `db:\"target_id\" json:\"target_id\"`\n}\n\ntype TagSearch struct {\n\tTagID   uuid.UUID `db:\"tag_id\" json:\"tag_id\"`\n\tName    *string   `db:\"name\" json:\"name\"`\n\tAliases []string  `db:\"aliases\" json:\"aliases\"`\n}\n\ntype User struct {\n\tID           uuid.UUID     `db:\"id\" json:\"id\"`\n\tName         string        `db:\"name\" json:\"name\"`\n\tPasswordHash string        `db:\"password_hash\" json:\"password_hash\"`\n\tEmail        string        `db:\"email\" json:\"email\"`\n\tApiKey       string        `db:\"api_key\" json:\"api_key\"`\n\tApiCalls     *int          `db:\"api_calls\" json:\"api_calls\"`\n\tLastApiCall  time.Time     `db:\"last_api_call\" json:\"last_api_call\"`\n\tCreatedAt    time.Time     `db:\"created_at\" json:\"created_at\"`\n\tUpdatedAt    time.Time     `db:\"updated_at\" json:\"updated_at\"`\n\tInvitedBy    uuid.NullUUID `db:\"invited_by\" json:\"invited_by\"`\n\tInviteTokens int           `db:\"invite_tokens\" json:\"invite_tokens\"`\n}\n\ntype UserNotification struct {\n\tUserID uuid.UUID        `db:\"user_id\" json:\"user_id\"`\n\tType   NotificationType `db:\"type\" json:\"type\"`\n}\n\ntype UserRole struct {\n\tUserID uuid.UUID `db:\"user_id\" json:\"user_id\"`\n\tRole   string    `db:\"role\" json:\"role\"`\n}\n\ntype UserToken struct {\n\tID        uuid.UUID `db:\"id\" json:\"id\"`\n\tData      []byte    `db:\"data\" json:\"data\"`\n\tType      string    `db:\"type\" json:\"type\"`\n\tCreatedAt time.Time `db:\"created_at\" json:\"created_at\"`\n\tExpiresAt time.Time `db:\"expires_at\" json:\"expires_at\"`\n}\n"
  },
  {
    "path": "internal/queries/notification.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: notification.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\nconst countNotificationsByUser = `-- name: CountNotificationsByUser :one\nSELECT COUNT(*) FROM notifications WHERE user_id = $1 AND ($2::boolean = FALSE OR read_at IS NULL) AND ($3::notification_type IS NULL OR type = $3::notification_type)\n`\n\ntype CountNotificationsByUserParams struct {\n\tUserID     uuid.UUID            `db:\"user_id\" json:\"user_id\"`\n\tUnreadOnly bool                 `db:\"unread_only\" json:\"unread_only\"`\n\tType       NullNotificationType `db:\"type\" json:\"type\"`\n}\n\nfunc (q *Queries) CountNotificationsByUser(ctx context.Context, arg CountNotificationsByUserParams) (int64, error) {\n\trow := q.db.QueryRow(ctx, countNotificationsByUser, arg.UserID, arg.UnreadOnly, arg.Type)\n\tvar count int64\n\terr := row.Scan(&count)\n\treturn count, err\n}\n\ntype CreateUserNotificationSubscriptionsParams struct {\n\tUserID uuid.UUID        `db:\"user_id\" json:\"user_id\"`\n\tType   NotificationType `db:\"type\" json:\"type\"`\n}\n\nconst deleteUserNotificationSubscriptions = `-- name: DeleteUserNotificationSubscriptions :exec\nDELETE FROM user_notifications WHERE user_id = $1\n`\n\nfunc (q *Queries) DeleteUserNotificationSubscriptions(ctx context.Context, userID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteUserNotificationSubscriptions, userID)\n\treturn err\n}\n\nconst destroyExpiredNotifications = `-- name: DestroyExpiredNotifications :exec\nDELETE FROM notifications\nWHERE read_at < CURRENT_DATE - INTERVAL '1 day'\n   OR created_at < CURRENT_DATE - INTERVAL '14 day'\n`\n\nfunc (q *Queries) DestroyExpiredNotifications(ctx context.Context) error {\n\t_, err := q.db.Exec(ctx, destroyExpiredNotifications)\n\treturn err\n}\n\nconst findNotificationsByUser = `-- name: FindNotificationsByUser :many\n\nSELECT user_id, type, id, created_at, read_at FROM notifications WHERE user_id = $1 AND ($4::notification_type IS NULL OR type = $4::notification_type) ORDER BY created_at DESC LIMIT $2 OFFSET $3\n`\n\ntype FindNotificationsByUserParams struct {\n\tUserID uuid.UUID            `db:\"user_id\" json:\"user_id\"`\n\tLimit  int32                `db:\"limit\" json:\"limit\"`\n\tOffset int32                `db:\"offset\" json:\"offset\"`\n\tType   NullNotificationType `db:\"type\" json:\"type\"`\n}\n\n// Notification queries\nfunc (q *Queries) FindNotificationsByUser(ctx context.Context, arg FindNotificationsByUserParams) ([]Notification, error) {\n\trows, err := q.db.Query(ctx, findNotificationsByUser,\n\t\targ.UserID,\n\t\targ.Limit,\n\t\targ.Offset,\n\t\targ.Type,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Notification{}\n\tfor rows.Next() {\n\t\tvar i Notification\n\t\tif err := rows.Scan(\n\t\t\t&i.UserID,\n\t\t\t&i.Type,\n\t\t\t&i.ID,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.ReadAt,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findUnreadNotificationsByUser = `-- name: FindUnreadNotificationsByUser :many\nSELECT user_id, type, id, created_at, read_at FROM notifications WHERE user_id = $1 AND read_at IS NULL AND ($4::notification_type IS NULL OR type = $4::notification_type) ORDER BY created_at DESC LIMIT $2 OFFSET $3\n`\n\ntype FindUnreadNotificationsByUserParams struct {\n\tUserID uuid.UUID            `db:\"user_id\" json:\"user_id\"`\n\tLimit  int32                `db:\"limit\" json:\"limit\"`\n\tOffset int32                `db:\"offset\" json:\"offset\"`\n\tType   NullNotificationType `db:\"type\" json:\"type\"`\n}\n\nfunc (q *Queries) FindUnreadNotificationsByUser(ctx context.Context, arg FindUnreadNotificationsByUserParams) ([]Notification, error) {\n\trows, err := q.db.Query(ctx, findUnreadNotificationsByUser,\n\t\targ.UserID,\n\t\targ.Limit,\n\t\targ.Offset,\n\t\targ.Type,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Notification{}\n\tfor rows.Next() {\n\t\tvar i Notification\n\t\tif err := rows.Scan(\n\t\t\t&i.UserID,\n\t\t\t&i.Type,\n\t\t\t&i.ID,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.ReadAt,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst markAllNotificationsRead = `-- name: MarkAllNotificationsRead :exec\nUPDATE notifications SET read_at = NOW() WHERE user_id = $1 AND read_at IS NULL\n`\n\nfunc (q *Queries) MarkAllNotificationsRead(ctx context.Context, userID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, markAllNotificationsRead, userID)\n\treturn err\n}\n\nconst markNotificationRead = `-- name: MarkNotificationRead :exec\nUPDATE notifications SET read_at = NOW() WHERE user_id = $1 AND type = $2 AND id = $3 AND read_at IS NULL\n`\n\ntype MarkNotificationReadParams struct {\n\tUserID uuid.UUID        `db:\"user_id\" json:\"user_id\"`\n\tType   NotificationType `db:\"type\" json:\"type\"`\n\tID     uuid.UUID        `db:\"id\" json:\"id\"`\n}\n\nfunc (q *Queries) MarkNotificationRead(ctx context.Context, arg MarkNotificationReadParams) error {\n\t_, err := q.db.Exec(ctx, markNotificationRead, arg.UserID, arg.Type, arg.ID)\n\treturn err\n}\n\nconst triggerDownvoteEditNotifications = `-- name: TriggerDownvoteEditNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT N.user_id, N.type, $1\nFROM edits E\nJOIN user_notifications N ON E.user_id = N.user_id AND N.type = 'DOWNVOTE_OWN_EDIT'\nWHERE E.id = $1\n`\n\nfunc (q *Queries) TriggerDownvoteEditNotifications(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, triggerDownvoteEditNotifications, id)\n\treturn err\n}\n\nconst triggerEditCommentNotifications = `-- name: TriggerEditCommentNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT DISTINCT ON (user_id) user_id, type, $1 FROM (\n    SELECT N.user_id, N.type, 1 as ordering\n    FROM edit_comments EC\n    JOIN edits E ON EC.edit_id = E.id\n    JOIN user_notifications N ON E.user_id = N.user_id AND N.type = 'COMMENT_OWN_EDIT'\n    WHERE E.user_id != EC.user_id\n    AND EC.id = $1\n    UNION\n    SELECT N.user_id, N.type, 2 as ordering\n    FROM edit_comments EC\n    JOIN edits E ON EC.edit_id = E.id\n    JOIN edit_comments EO ON EO.edit_id = E.id\n    JOIN user_notifications N ON EO.user_id = N.user_id AND N.type = 'COMMENT_COMMENTED_EDIT'\n    WHERE EO.user_id != E.user_id\n    AND EO.user_id != EC.user_id\n    AND EC.id = $1\n    UNION\n    SELECT N.user_id, N.type, 3 as ordering\n    FROM edit_comments EC\n    JOIN edits E ON EC.edit_id = E.id\n    JOIN edit_votes EV ON EV.edit_id = E.id\n    JOIN user_notifications N ON EV.user_id = N.user_id AND N.type = 'COMMENT_VOTED_EDIT'\n    WHERE EV.vote != 'ABSTAIN'\n    AND EV.user_id != E.user_id\n    AND EV.user_id != EC.user_id\n    AND EC.id = $1\n) notifications\nORDER BY user_id, ordering ASC\n`\n\nfunc (q *Queries) TriggerEditCommentNotifications(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, triggerEditCommentNotifications, id)\n\treturn err\n}\n\nconst triggerFailedEditNotifications = `-- name: TriggerFailedEditNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT N.user_id, N.type, $1\nFROM edits E\nJOIN user_notifications N ON E.user_id = N.user_id AND N.type = 'FAILED_OWN_EDIT'\nWHERE E.id = $1\n`\n\nfunc (q *Queries) TriggerFailedEditNotifications(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, triggerFailedEditNotifications, id)\n\treturn err\n}\n\nconst triggerPerformerEditNotifications = `-- name: TriggerPerformerEditNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT N.user_id, N.type, $1\nFROM performer_edits PE\nJOIN edits E ON PE.edit_id = E.id\nJOIN performer_favorites PF ON PE.performer_id = PF.performer_id\nJOIN user_notifications N ON PF.user_id = N.user_id AND N.type = 'FAVORITE_PERFORMER_EDIT' AND N.user_id != E.user_id\nWHERE PE.edit_id = $1\n`\n\nfunc (q *Queries) TriggerPerformerEditNotifications(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, triggerPerformerEditNotifications, id)\n\treturn err\n}\n\nconst triggerSceneCreationNotifications = `-- name: TriggerSceneCreationNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT N.user_id, N.type, $1 as id\nFROM scenes S\nJOIN scene_edits SE ON S.id = SE.scene_id\nJOIN edits E ON SE.edit_id = E.id AND E.operation = 'CREATE'\nJOIN studio_favorites SF ON S.studio_id = SF.studio_id\nJOIN user_notifications N ON SF.user_id = N.user_id AND N.type = 'FAVORITE_STUDIO_SCENE' AND E.user_id != N.user_id\nWHERE S.id = $1\nUNION\nSELECT N.user_id, N.type, $1 as id\nFROM scene_performers SP\nJOIN scene_edits SE ON SP.scene_id = SE.scene_id\nJOIN edits E ON SE.edit_id = E.id AND E.operation = 'CREATE'\nJOIN performer_favorites PF ON SP.performer_id = PF.performer_id\nJOIN user_notifications N ON PF.user_id = N.user_id AND N.type = 'FAVORITE_PERFORMER_SCENE' AND E.user_id != N.user_id\nWHERE SP.scene_id = $1\n`\n\nfunc (q *Queries) TriggerSceneCreationNotifications(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, triggerSceneCreationNotifications, id)\n\treturn err\n}\n\nconst triggerSceneEditNotifications = `-- name: TriggerSceneEditNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT DISTINCT ON (user_id) user_id, type, $1 FROM (\n    SELECT N.user_id, N.type\n    FROM edits E JOIN studio_favorites SF ON (E.data->'new_data'->>'studio_id')::uuid = SF.studio_id\n    JOIN user_notifications N ON SF.user_id = N.user_id AND N.type = 'FAVORITE_STUDIO_EDIT' AND N.user_id != E.user_id\n    WHERE E.id = $1\n    UNION\n    SELECT N.user_id, N.type\n    FROM edits E\n    JOIN scene_edits SE ON E.id = SE.edit_id\n    JOIN scenes S ON SE.scene_id = S.id\n    JOIN studio_favorites SF ON S.studio_id = SF.studio_id\n    JOIN user_notifications N ON SF.user_id = N.user_id AND N.type = 'FAVORITE_STUDIO_EDIT' AND N.user_id != E.user_id\n    WHERE E.id = $1\n    UNION\n    SELECT N.user_id, N.type\n    FROM (\n        SELECT id, (jsonb_array_elements(edits.data->'new_data'->'added_performers')->>'performer_id')::uuid AS performer_id, user_id\n        FROM edits\n    ) E JOIN performer_favorites PF ON E.performer_id = PF.performer_id\n    JOIN user_notifications N ON PF.user_id = N.user_id AND N.type = 'FAVORITE_PERFORMER_EDIT' AND N.user_id != E.user_id\n    WHERE E.id = $1\n    UNION\n    SELECT N.user_id, N.type\n    FROM edits E\n    JOIN scene_edits SE ON E.id = SE.edit_id\n    JOIN scene_performers SP ON SP.scene_id = SE.scene_id\n    JOIN performer_favorites PF ON PF.performer_id = SP.performer_id\n    JOIN user_notifications N ON PF.user_id = N.user_id AND N.type = 'FAVORITE_PERFORMER_EDIT' AND N.user_id != E.user_id\n    WHERE E.id = $1\n    UNION\n    SELECT N.user_id, N.type\n    FROM edits E\n    JOIN scene_edits SE ON E.id = SE.edit_id\n    JOIN scene_fingerprints SF ON SE.scene_id = SF.scene_id\n    JOIN user_notifications N ON SF.user_id = N.user_id AND N.type = 'FINGERPRINTED_SCENE_EDIT' AND N.user_id != E.user_id\n    WHERE E.id = $1\n) notifications\n`\n\nfunc (q *Queries) TriggerSceneEditNotifications(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, triggerSceneEditNotifications, id)\n\treturn err\n}\n\nconst triggerStudioEditNotifications = `-- name: TriggerStudioEditNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT N.user_id, N.type, $1\nFROM studio_edits SE\nJOIN edits E ON SE.edit_id = E.id\nJOIN studio_favorites SF ON SE.studio_id = SF.studio_id\nJOIN user_notifications N ON SF.user_id = N.user_id AND N.type = 'FAVORITE_STUDIO_EDIT' AND N.user_id != E.user_id\nWHERE SE.edit_id = $1\n`\n\nfunc (q *Queries) TriggerStudioEditNotifications(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, triggerStudioEditNotifications, id)\n\treturn err\n}\n\nconst triggerUpdatedEditNotifications = `-- name: TriggerUpdatedEditNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT N.user_id, N.type, $1\nFROM edits E\nJOIN edit_votes EV ON E.id = EV.edit_id\nJOIN user_notifications N ON EV.user_id = N.user_id AND N.type = 'UPDATED_EDIT'\nWHERE E.id = $1\n`\n\nfunc (q *Queries) TriggerUpdatedEditNotifications(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, triggerUpdatedEditNotifications, id)\n\treturn err\n}\n"
  },
  {
    "path": "internal/queries/performer.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: performer.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nconst clearScenePerformerAlias = `-- name: ClearScenePerformerAlias :exec\nUPDATE scene_performers\nSET \"as\" = NULL\nWHERE performer_id = $1\nAND \"as\" = $2\n`\n\ntype ClearScenePerformerAliasParams struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tAs          *string   `db:\"as\" json:\"as\"`\n}\n\nfunc (q *Queries) ClearScenePerformerAlias(ctx context.Context, arg ClearScenePerformerAliasParams) error {\n\t_, err := q.db.Exec(ctx, clearScenePerformerAlias, arg.PerformerID, arg.As)\n\treturn err\n}\n\nconst createPerformer = `-- name: CreatePerformer :one\n\nINSERT INTO performers (\n    id, name, disambiguation, gender, birthdate, \n    ethnicity, country, eye_color, hair_color, height, cup_size, \n    band_size, hip_size, waist_size, breast_type, career_start_year, \n    career_end_year, deathdate, created_at, updated_at\n)\nVALUES (\n    $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, \n    $13, $14, $15, $16, $17, $18, now(), now()\n)\nRETURNING id, name, disambiguation, gender, ethnicity, country, eye_color, hair_color, height, cup_size, band_size, hip_size, waist_size, breast_type, career_start_year, career_end_year, created_at, updated_at, deleted, birthdate, deathdate\n`\n\ntype CreatePerformerParams struct {\n\tID              uuid.UUID              `db:\"id\" json:\"id\"`\n\tName            string                 `db:\"name\" json:\"name\"`\n\tDisambiguation  *string                `db:\"disambiguation\" json:\"disambiguation\"`\n\tGender          *models.GenderEnum     `db:\"gender\" json:\"gender\"`\n\tBirthdate       *string                `db:\"birthdate\" json:\"birthdate\"`\n\tEthnicity       *models.EthnicityEnum  `db:\"ethnicity\" json:\"ethnicity\"`\n\tCountry         *string                `db:\"country\" json:\"country\"`\n\tEyeColor        *models.EyeColorEnum   `db:\"eye_color\" json:\"eye_color\"`\n\tHairColor       *models.HairColorEnum  `db:\"hair_color\" json:\"hair_color\"`\n\tHeight          *int                   `db:\"height\" json:\"height\"`\n\tCupSize         *string                `db:\"cup_size\" json:\"cup_size\"`\n\tBandSize        *int                   `db:\"band_size\" json:\"band_size\"`\n\tHipSize         *int                   `db:\"hip_size\" json:\"hip_size\"`\n\tWaistSize       *int                   `db:\"waist_size\" json:\"waist_size\"`\n\tBreastType      *models.BreastTypeEnum `db:\"breast_type\" json:\"breast_type\"`\n\tCareerStartYear *int                   `db:\"career_start_year\" json:\"career_start_year\"`\n\tCareerEndYear   *int                   `db:\"career_end_year\" json:\"career_end_year\"`\n\tDeathdate       *string                `db:\"deathdate\" json:\"deathdate\"`\n}\n\n// Performer queries\nfunc (q *Queries) CreatePerformer(ctx context.Context, arg CreatePerformerParams) (Performer, error) {\n\trow := q.db.QueryRow(ctx, createPerformer,\n\t\targ.ID,\n\t\targ.Name,\n\t\targ.Disambiguation,\n\t\targ.Gender,\n\t\targ.Birthdate,\n\t\targ.Ethnicity,\n\t\targ.Country,\n\t\targ.EyeColor,\n\t\targ.HairColor,\n\t\targ.Height,\n\t\targ.CupSize,\n\t\targ.BandSize,\n\t\targ.HipSize,\n\t\targ.WaistSize,\n\t\targ.BreastType,\n\t\targ.CareerStartYear,\n\t\targ.CareerEndYear,\n\t\targ.Deathdate,\n\t)\n\tvar i Performer\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Disambiguation,\n\t\t&i.Gender,\n\t\t&i.Ethnicity,\n\t\t&i.Country,\n\t\t&i.EyeColor,\n\t\t&i.HairColor,\n\t\t&i.Height,\n\t\t&i.CupSize,\n\t\t&i.BandSize,\n\t\t&i.HipSize,\n\t\t&i.WaistSize,\n\t\t&i.BreastType,\n\t\t&i.CareerStartYear,\n\t\t&i.CareerEndYear,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t\t&i.Birthdate,\n\t\t&i.Deathdate,\n\t)\n\treturn i, err\n}\n\ntype CreatePerformerAliasesParams struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tAlias       string    `db:\"alias\" json:\"alias\"`\n}\n\nconst createPerformerFavorite = `-- name: CreatePerformerFavorite :exec\nINSERT INTO performer_favorites (performer_id, user_id, created_at) VALUES ($1, $2, now())\n`\n\ntype CreatePerformerFavoriteParams struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tUserID      uuid.UUID `db:\"user_id\" json:\"user_id\"`\n}\n\nfunc (q *Queries) CreatePerformerFavorite(ctx context.Context, arg CreatePerformerFavoriteParams) error {\n\t_, err := q.db.Exec(ctx, createPerformerFavorite, arg.PerformerID, arg.UserID)\n\treturn err\n}\n\ntype CreatePerformerImagesParams struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tImageID     uuid.UUID `db:\"image_id\" json:\"image_id\"`\n}\n\ntype CreatePerformerPiercingsParams struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tLocation    *string   `db:\"location\" json:\"location\"`\n\tDescription *string   `db:\"description\" json:\"description\"`\n}\n\nconst createPerformerRedirect = `-- name: CreatePerformerRedirect :exec\n\nINSERT INTO performer_redirects (source_id, target_id) VALUES ($1, $2)\n`\n\ntype CreatePerformerRedirectParams struct {\n\tSourceID uuid.UUID `db:\"source_id\" json:\"source_id\"`\n\tTargetID uuid.UUID `db:\"target_id\" json:\"target_id\"`\n}\n\n// Performer redirects\nfunc (q *Queries) CreatePerformerRedirect(ctx context.Context, arg CreatePerformerRedirectParams) error {\n\t_, err := q.db.Exec(ctx, createPerformerRedirect, arg.SourceID, arg.TargetID)\n\treturn err\n}\n\ntype CreatePerformerTattoosParams struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tLocation    *string   `db:\"location\" json:\"location\"`\n\tDescription *string   `db:\"description\" json:\"description\"`\n}\n\ntype CreatePerformerURLsParams struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tUrl         string    `db:\"url\" json:\"url\"`\n\tSiteID      uuid.UUID `db:\"site_id\" json:\"site_id\"`\n}\n\nconst deletePerformer = `-- name: DeletePerformer :exec\nDELETE FROM performers WHERE id = $1\n`\n\nfunc (q *Queries) DeletePerformer(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deletePerformer, id)\n\treturn err\n}\n\nconst deletePerformerAliases = `-- name: DeletePerformerAliases :exec\n\nDELETE FROM performer_aliases WHERE performer_id = $1\n`\n\n// Performer aliases\nfunc (q *Queries) DeletePerformerAliases(ctx context.Context, performerID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deletePerformerAliases, performerID)\n\treturn err\n}\n\nconst deletePerformerFavorite = `-- name: DeletePerformerFavorite :exec\nDELETE FROM performer_favorites WHERE performer_id = $1 AND user_id = $2\n`\n\ntype DeletePerformerFavoriteParams struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tUserID      uuid.UUID `db:\"user_id\" json:\"user_id\"`\n}\n\nfunc (q *Queries) DeletePerformerFavorite(ctx context.Context, arg DeletePerformerFavoriteParams) error {\n\t_, err := q.db.Exec(ctx, deletePerformerFavorite, arg.PerformerID, arg.UserID)\n\treturn err\n}\n\nconst deletePerformerFavorites = `-- name: DeletePerformerFavorites :exec\n\nDELETE FROM performer_favorites WHERE performer_id = $1\n`\n\n// Performer favorites\nfunc (q *Queries) DeletePerformerFavorites(ctx context.Context, performerID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deletePerformerFavorites, performerID)\n\treturn err\n}\n\nconst deletePerformerImages = `-- name: DeletePerformerImages :exec\nDELETE FROM performer_images WHERE performer_id = $1\n`\n\nfunc (q *Queries) DeletePerformerImages(ctx context.Context, performerID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deletePerformerImages, performerID)\n\treturn err\n}\n\nconst deletePerformerPiercings = `-- name: DeletePerformerPiercings :exec\n\nDELETE FROM performer_piercings WHERE performer_id = $1\n`\n\n// Performer piercings\nfunc (q *Queries) DeletePerformerPiercings(ctx context.Context, performerID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deletePerformerPiercings, performerID)\n\treturn err\n}\n\nconst deletePerformerScenes = `-- name: DeletePerformerScenes :exec\nDELETE FROM scene_performers WHERE performer_id = $1\n`\n\nfunc (q *Queries) DeletePerformerScenes(ctx context.Context, performerID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deletePerformerScenes, performerID)\n\treturn err\n}\n\nconst deletePerformerTattoos = `-- name: DeletePerformerTattoos :exec\n\nDELETE FROM performer_tattoos WHERE performer_id = $1\n`\n\n// Performer tattoos\nfunc (q *Queries) DeletePerformerTattoos(ctx context.Context, performerID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deletePerformerTattoos, performerID)\n\treturn err\n}\n\nconst deletePerformerURLs = `-- name: DeletePerformerURLs :exec\n\nDELETE FROM performer_urls WHERE performer_id = $1\n`\n\n// Performer URLs\nfunc (q *Queries) DeletePerformerURLs(ctx context.Context, performerID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deletePerformerURLs, performerID)\n\treturn err\n}\n\nconst findExistingPerformers = `-- name: FindExistingPerformers :many\nSELECT id, name, disambiguation, gender, ethnicity, country, eye_color, hair_color, height, cup_size, band_size, hip_size, waist_size, breast_type, career_start_year, career_end_year, created_at, updated_at, deleted, birthdate, deathdate FROM performers\nWHERE (\n    ($1::text IS NOT NULL AND TRIM(LOWER(name)) = TRIM(LOWER($1)) AND\n     CASE\n       WHEN $2::text IS NOT NULL\n       THEN TRIM(LOWER(disambiguation)) = TRIM(LOWER($2))\n       ELSE (disambiguation IS NULL OR disambiguation = '')\n     END)\n    OR\n    ($3::text[] IS NOT NULL AND\n     id IN (\n       SELECT performer_id\n       FROM performer_urls\n       WHERE url = ANY($3)\n       GROUP BY performer_id\n     ))\n)\n`\n\ntype FindExistingPerformersParams struct {\n\tName           *string  `db:\"name\" json:\"name\"`\n\tDisambiguation *string  `db:\"disambiguation\" json:\"disambiguation\"`\n\tUrls           []string `db:\"urls\" json:\"urls\"`\n}\n\nfunc (q *Queries) FindExistingPerformers(ctx context.Context, arg FindExistingPerformersParams) ([]Performer, error) {\n\trows, err := q.db.Query(ctx, findExistingPerformers, arg.Name, arg.Disambiguation, arg.Urls)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Performer{}\n\tfor rows.Next() {\n\t\tvar i Performer\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Name,\n\t\t\t&i.Disambiguation,\n\t\t\t&i.Gender,\n\t\t\t&i.Ethnicity,\n\t\t\t&i.Country,\n\t\t\t&i.EyeColor,\n\t\t\t&i.HairColor,\n\t\t\t&i.Height,\n\t\t\t&i.CupSize,\n\t\t\t&i.BandSize,\n\t\t\t&i.HipSize,\n\t\t\t&i.WaistSize,\n\t\t\t&i.BreastType,\n\t\t\t&i.CareerStartYear,\n\t\t\t&i.CareerEndYear,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Deleted,\n\t\t\t&i.Birthdate,\n\t\t\t&i.Deathdate,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findMergeIDsByPerformerIds = `-- name: FindMergeIDsByPerformerIds :many\nSELECT source_id as performer_id, target_id as merge_id FROM performer_redirects WHERE source_id = ANY($1::UUID[])\n`\n\ntype FindMergeIDsByPerformerIdsRow struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tMergeID     uuid.UUID `db:\"merge_id\" json:\"merge_id\"`\n}\n\n// Find merge target IDs for performers (for merges where these are sources)\nfunc (q *Queries) FindMergeIDsByPerformerIds(ctx context.Context, performerIds []uuid.UUID) ([]FindMergeIDsByPerformerIdsRow, error) {\n\trows, err := q.db.Query(ctx, findMergeIDsByPerformerIds, performerIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []FindMergeIDsByPerformerIdsRow{}\n\tfor rows.Next() {\n\t\tvar i FindMergeIDsByPerformerIdsRow\n\t\tif err := rows.Scan(&i.PerformerID, &i.MergeID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findMergeIDsBySourcePerformerIds = `-- name: FindMergeIDsBySourcePerformerIds :many\nSELECT target_id as performer_id, source_id as merge_id FROM performer_redirects WHERE target_id = ANY($1::UUID[])\n`\n\ntype FindMergeIDsBySourcePerformerIdsRow struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tMergeID     uuid.UUID `db:\"merge_id\" json:\"merge_id\"`\n}\n\n// Find merge source IDs for performers (for merges where these are targets)\nfunc (q *Queries) FindMergeIDsBySourcePerformerIds(ctx context.Context, performerIds []uuid.UUID) ([]FindMergeIDsBySourcePerformerIdsRow, error) {\n\trows, err := q.db.Query(ctx, findMergeIDsBySourcePerformerIds, performerIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []FindMergeIDsBySourcePerformerIdsRow{}\n\tfor rows.Next() {\n\t\tvar i FindMergeIDsBySourcePerformerIdsRow\n\t\tif err := rows.Scan(&i.PerformerID, &i.MergeID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findPerformer = `-- name: FindPerformer :one\nSELECT id, name, disambiguation, gender, ethnicity, country, eye_color, hair_color, height, cup_size, band_size, hip_size, waist_size, breast_type, career_start_year, career_end_year, created_at, updated_at, deleted, birthdate, deathdate FROM performers WHERE id = $1\n`\n\nfunc (q *Queries) FindPerformer(ctx context.Context, id uuid.UUID) (Performer, error) {\n\trow := q.db.QueryRow(ctx, findPerformer, id)\n\tvar i Performer\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Disambiguation,\n\t\t&i.Gender,\n\t\t&i.Ethnicity,\n\t\t&i.Country,\n\t\t&i.EyeColor,\n\t\t&i.HairColor,\n\t\t&i.Height,\n\t\t&i.CupSize,\n\t\t&i.BandSize,\n\t\t&i.HipSize,\n\t\t&i.WaistSize,\n\t\t&i.BreastType,\n\t\t&i.CareerStartYear,\n\t\t&i.CareerEndYear,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t\t&i.Birthdate,\n\t\t&i.Deathdate,\n\t)\n\treturn i, err\n}\n\nconst findPerformerAliasesByIds = `-- name: FindPerformerAliasesByIds :many\nSELECT performer_id, alias FROM performer_aliases WHERE performer_id = ANY($1::UUID[])\n`\n\n// Get aliases for multiple performers\nfunc (q *Queries) FindPerformerAliasesByIds(ctx context.Context, performerIds []uuid.UUID) ([]PerformerAlias, error) {\n\trows, err := q.db.Query(ctx, findPerformerAliasesByIds, performerIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []PerformerAlias{}\n\tfor rows.Next() {\n\t\tvar i PerformerAlias\n\t\tif err := rows.Scan(&i.PerformerID, &i.Alias); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findPerformerByAlias = `-- name: FindPerformerByAlias :one\nSELECT p.id, p.name, p.disambiguation, p.gender, p.ethnicity, p.country, p.eye_color, p.hair_color, p.height, p.cup_size, p.band_size, p.hip_size, p.waist_size, p.breast_type, p.career_start_year, p.career_end_year, p.created_at, p.updated_at, p.deleted, p.birthdate, p.deathdate FROM performers p\nJOIN performer_aliases pa ON p.id = pa.performer_id\nWHERE UPPER(pa.alias) = UPPER($1) AND p.deleted = false\n`\n\nfunc (q *Queries) FindPerformerByAlias(ctx context.Context, upper interface{}) (Performer, error) {\n\trow := q.db.QueryRow(ctx, findPerformerByAlias, upper)\n\tvar i Performer\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Disambiguation,\n\t\t&i.Gender,\n\t\t&i.Ethnicity,\n\t\t&i.Country,\n\t\t&i.EyeColor,\n\t\t&i.HairColor,\n\t\t&i.Height,\n\t\t&i.CupSize,\n\t\t&i.BandSize,\n\t\t&i.HipSize,\n\t\t&i.WaistSize,\n\t\t&i.BreastType,\n\t\t&i.CareerStartYear,\n\t\t&i.CareerEndYear,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t\t&i.Birthdate,\n\t\t&i.Deathdate,\n\t)\n\treturn i, err\n}\n\nconst findPerformerByName = `-- name: FindPerformerByName :one\nSELECT id, name, disambiguation, gender, ethnicity, country, eye_color, hair_color, height, cup_size, band_size, hip_size, waist_size, breast_type, career_start_year, career_end_year, created_at, updated_at, deleted, birthdate, deathdate FROM performers WHERE UPPER(name) = UPPER($1) AND deleted = false\n`\n\nfunc (q *Queries) FindPerformerByName(ctx context.Context, upper interface{}) (Performer, error) {\n\trow := q.db.QueryRow(ctx, findPerformerByName, upper)\n\tvar i Performer\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Disambiguation,\n\t\t&i.Gender,\n\t\t&i.Ethnicity,\n\t\t&i.Country,\n\t\t&i.EyeColor,\n\t\t&i.HairColor,\n\t\t&i.Height,\n\t\t&i.CupSize,\n\t\t&i.BandSize,\n\t\t&i.HipSize,\n\t\t&i.WaistSize,\n\t\t&i.BreastType,\n\t\t&i.CareerStartYear,\n\t\t&i.CareerEndYear,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t\t&i.Birthdate,\n\t\t&i.Deathdate,\n\t)\n\treturn i, err\n}\n\nconst findPerformerFavoritesByIds = `-- name: FindPerformerFavoritesByIds :many\nSELECT performer_id, (performer_id IS NOT NULL)::BOOLEAN as is_favorite\nFROM performer_favorites\nWHERE performer_id = ANY($1::UUID[]) AND user_id = $2\n`\n\ntype FindPerformerFavoritesByIdsParams struct {\n\tPerformerIds []uuid.UUID `db:\"performer_ids\" json:\"performer_ids\"`\n\tUserID       uuid.UUID   `db:\"user_id\" json:\"user_id\"`\n}\n\ntype FindPerformerFavoritesByIdsRow struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tIsFavorite  bool      `db:\"is_favorite\" json:\"is_favorite\"`\n}\n\n// Check favorite status for multiple performers for a specific user\nfunc (q *Queries) FindPerformerFavoritesByIds(ctx context.Context, arg FindPerformerFavoritesByIdsParams) ([]FindPerformerFavoritesByIdsRow, error) {\n\trows, err := q.db.Query(ctx, findPerformerFavoritesByIds, arg.PerformerIds, arg.UserID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []FindPerformerFavoritesByIdsRow{}\n\tfor rows.Next() {\n\t\tvar i FindPerformerFavoritesByIdsRow\n\t\tif err := rows.Scan(&i.PerformerID, &i.IsFavorite); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findPerformerPiercingsByIds = `-- name: FindPerformerPiercingsByIds :many\nSELECT performer_id, location, description FROM performer_piercings WHERE performer_id = ANY($1::UUID[])\n`\n\n// Get piercings for multiple performers\nfunc (q *Queries) FindPerformerPiercingsByIds(ctx context.Context, performerIds []uuid.UUID) ([]PerformerPiercing, error) {\n\trows, err := q.db.Query(ctx, findPerformerPiercingsByIds, performerIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []PerformerPiercing{}\n\tfor rows.Next() {\n\t\tvar i PerformerPiercing\n\t\tif err := rows.Scan(&i.PerformerID, &i.Location, &i.Description); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findPerformerTattoosByIds = `-- name: FindPerformerTattoosByIds :many\nSELECT performer_id, location, description FROM performer_tattoos WHERE performer_id = ANY($1::UUID[])\n`\n\n// Get tattoos for multiple performers\nfunc (q *Queries) FindPerformerTattoosByIds(ctx context.Context, performerIds []uuid.UUID) ([]PerformerTattoo, error) {\n\trows, err := q.db.Query(ctx, findPerformerTattoosByIds, performerIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []PerformerTattoo{}\n\tfor rows.Next() {\n\t\tvar i PerformerTattoo\n\t\tif err := rows.Scan(&i.PerformerID, &i.Location, &i.Description); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findPerformerUrlsByIds = `-- name: FindPerformerUrlsByIds :many\nSELECT performer_id, url, site_id FROM performer_urls WHERE performer_id = ANY($1::UUID[])\n`\n\n// Get URLs for multiple performers\nfunc (q *Queries) FindPerformerUrlsByIds(ctx context.Context, performerIds []uuid.UUID) ([]PerformerUrl, error) {\n\trows, err := q.db.Query(ctx, findPerformerUrlsByIds, performerIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []PerformerUrl{}\n\tfor rows.Next() {\n\t\tvar i PerformerUrl\n\t\tif err := rows.Scan(&i.PerformerID, &i.Url, &i.SiteID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findPerformerWithRedirect = `-- name: FindPerformerWithRedirect :many\nSELECT p.id, p.name, p.disambiguation, p.gender, p.ethnicity, p.country, p.eye_color, p.hair_color, p.height, p.cup_size, p.band_size, p.hip_size, p.waist_size, p.breast_type, p.career_start_year, p.career_end_year, p.created_at, p.updated_at, p.deleted, p.birthdate, p.deathdate FROM performers P\nWHERE P.id = $1 AND P.deleted = FALSE\nUNION\nSELECT t.id, t.name, t.disambiguation, t.gender, t.ethnicity, t.country, t.eye_color, t.hair_color, t.height, t.cup_size, t.band_size, t.hip_size, t.waist_size, t.breast_type, t.career_start_year, t.career_end_year, t.created_at, t.updated_at, t.deleted, t.birthdate, t.deathdate FROM performer_redirects R\nJOIN performers T ON T.id = R.target_id\nWHERE R.source_id = $1 AND T.deleted = FALSE\n`\n\nfunc (q *Queries) FindPerformerWithRedirect(ctx context.Context, id uuid.UUID) ([]Performer, error) {\n\trows, err := q.db.Query(ctx, findPerformerWithRedirect, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Performer{}\n\tfor rows.Next() {\n\t\tvar i Performer\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Name,\n\t\t\t&i.Disambiguation,\n\t\t\t&i.Gender,\n\t\t\t&i.Ethnicity,\n\t\t\t&i.Country,\n\t\t\t&i.EyeColor,\n\t\t\t&i.HairColor,\n\t\t\t&i.Height,\n\t\t\t&i.CupSize,\n\t\t\t&i.BandSize,\n\t\t\t&i.HipSize,\n\t\t\t&i.WaistSize,\n\t\t\t&i.BreastType,\n\t\t\t&i.CareerStartYear,\n\t\t\t&i.CareerEndYear,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Deleted,\n\t\t\t&i.Birthdate,\n\t\t\t&i.Deathdate,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findPerformersByIds = `-- name: FindPerformersByIds :many\nSELECT id, name, disambiguation, gender, ethnicity, country, eye_color, hair_color, height, cup_size, band_size, hip_size, waist_size, breast_type, career_start_year, career_end_year, created_at, updated_at, deleted, birthdate, deathdate FROM performers WHERE id = ANY($1::UUID[])\n`\n\nfunc (q *Queries) FindPerformersByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]Performer, error) {\n\trows, err := q.db.Query(ctx, findPerformersByIds, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Performer{}\n\tfor rows.Next() {\n\t\tvar i Performer\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Name,\n\t\t\t&i.Disambiguation,\n\t\t\t&i.Gender,\n\t\t\t&i.Ethnicity,\n\t\t\t&i.Country,\n\t\t\t&i.EyeColor,\n\t\t\t&i.HairColor,\n\t\t\t&i.Height,\n\t\t\t&i.CupSize,\n\t\t\t&i.BandSize,\n\t\t\t&i.HipSize,\n\t\t\t&i.WaistSize,\n\t\t\t&i.BreastType,\n\t\t\t&i.CareerStartYear,\n\t\t\t&i.CareerEndYear,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Deleted,\n\t\t\t&i.Birthdate,\n\t\t\t&i.Deathdate,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findPerformersByURL = `-- name: FindPerformersByURL :many\nSELECT p.id, p.name, p.disambiguation, p.gender, p.ethnicity, p.country, p.eye_color, p.hair_color, p.height, p.cup_size, p.band_size, p.hip_size, p.waist_size, p.breast_type, p.career_start_year, p.career_end_year, p.created_at, p.updated_at, p.deleted, p.birthdate, p.deathdate\nFROM performers P\nJOIN performer_urls PU ON PU.performer_id = P.id\nWHERE LOWER(PU.url) = LOWER($1)\nLIMIT $2\n`\n\ntype FindPerformersByURLParams struct {\n\tUrl   *string `db:\"url\" json:\"url\"`\n\tLimit int32   `db:\"limit\" json:\"limit\"`\n}\n\nfunc (q *Queries) FindPerformersByURL(ctx context.Context, arg FindPerformersByURLParams) ([]Performer, error) {\n\trows, err := q.db.Query(ctx, findPerformersByURL, arg.Url, arg.Limit)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Performer{}\n\tfor rows.Next() {\n\t\tvar i Performer\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Name,\n\t\t\t&i.Disambiguation,\n\t\t\t&i.Gender,\n\t\t\t&i.Ethnicity,\n\t\t\t&i.Country,\n\t\t\t&i.EyeColor,\n\t\t\t&i.HairColor,\n\t\t\t&i.Height,\n\t\t\t&i.CupSize,\n\t\t\t&i.BandSize,\n\t\t\t&i.HipSize,\n\t\t\t&i.WaistSize,\n\t\t\t&i.BreastType,\n\t\t\t&i.CareerStartYear,\n\t\t\t&i.CareerEndYear,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Deleted,\n\t\t\t&i.Birthdate,\n\t\t\t&i.Deathdate,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getPerformerAliases = `-- name: GetPerformerAliases :many\nSELECT alias FROM performer_aliases WHERE performer_id = $1\n`\n\nfunc (q *Queries) GetPerformerAliases(ctx context.Context, performerID uuid.UUID) ([]string, error) {\n\trows, err := q.db.Query(ctx, getPerformerAliases, performerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []string{}\n\tfor rows.Next() {\n\t\tvar alias string\n\t\tif err := rows.Scan(&alias); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, alias)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getPerformerImages = `-- name: GetPerformerImages :many\n\nSELECT images.id, images.url, images.width, images.height, images.checksum FROM images\nJOIN performer_images ON performer_images.image_id = images.id\nWHERE performer_images.performer_id = $1\n`\n\n// Performer images\nfunc (q *Queries) GetPerformerImages(ctx context.Context, performerID uuid.UUID) ([]Image, error) {\n\trows, err := q.db.Query(ctx, getPerformerImages, performerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Image{}\n\tfor rows.Next() {\n\t\tvar i Image\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Url,\n\t\t\t&i.Width,\n\t\t\t&i.Height,\n\t\t\t&i.Checksum,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getPerformerPiercings = `-- name: GetPerformerPiercings :many\nSELECT location, description FROM performer_piercings WHERE performer_id = $1\n`\n\ntype GetPerformerPiercingsRow struct {\n\tLocation    *string `db:\"location\" json:\"location\"`\n\tDescription *string `db:\"description\" json:\"description\"`\n}\n\nfunc (q *Queries) GetPerformerPiercings(ctx context.Context, performerID uuid.UUID) ([]GetPerformerPiercingsRow, error) {\n\trows, err := q.db.Query(ctx, getPerformerPiercings, performerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []GetPerformerPiercingsRow{}\n\tfor rows.Next() {\n\t\tvar i GetPerformerPiercingsRow\n\t\tif err := rows.Scan(&i.Location, &i.Description); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getPerformerTattoos = `-- name: GetPerformerTattoos :many\nSELECT location, description FROM performer_tattoos WHERE performer_id = $1\n`\n\ntype GetPerformerTattoosRow struct {\n\tLocation    *string `db:\"location\" json:\"location\"`\n\tDescription *string `db:\"description\" json:\"description\"`\n}\n\nfunc (q *Queries) GetPerformerTattoos(ctx context.Context, performerID uuid.UUID) ([]GetPerformerTattoosRow, error) {\n\trows, err := q.db.Query(ctx, getPerformerTattoos, performerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []GetPerformerTattoosRow{}\n\tfor rows.Next() {\n\t\tvar i GetPerformerTattoosRow\n\t\tif err := rows.Scan(&i.Location, &i.Description); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getPerformerURLs = `-- name: GetPerformerURLs :many\nSELECT url, site_id FROM performer_urls WHERE performer_id = $1\n`\n\ntype GetPerformerURLsRow struct {\n\tUrl    string    `db:\"url\" json:\"url\"`\n\tSiteID uuid.UUID `db:\"site_id\" json:\"site_id\"`\n}\n\nfunc (q *Queries) GetPerformerURLs(ctx context.Context, performerID uuid.UUID) ([]GetPerformerURLsRow, error) {\n\trows, err := q.db.Query(ctx, getPerformerURLs, performerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []GetPerformerURLsRow{}\n\tfor rows.Next() {\n\t\tvar i GetPerformerURLsRow\n\t\tif err := rows.Scan(&i.Url, &i.SiteID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst reassignPerformerAliases = `-- name: ReassignPerformerAliases :exec\nUPDATE scene_performers\nSET performer_id = $1\nWHERE scene_performers.performer_id = $2\nAND scene_id NOT IN (SELECT scene_id from scene_performers sp WHERE sp.performer_id = $1)\n`\n\ntype ReassignPerformerAliasesParams struct {\n\tNewPerformerID uuid.UUID `db:\"new_performer_id\" json:\"new_performer_id\"`\n\tOldPerformerID uuid.UUID `db:\"old_performer_id\" json:\"old_performer_id\"`\n}\n\nfunc (q *Queries) ReassignPerformerAliases(ctx context.Context, arg ReassignPerformerAliasesParams) error {\n\t_, err := q.db.Exec(ctx, reassignPerformerAliases, arg.NewPerformerID, arg.OldPerformerID)\n\treturn err\n}\n\nconst reassignPerformerFavorites = `-- name: ReassignPerformerFavorites :exec\nUPDATE performer_favorites\n   SET performer_id = $1\n   WHERE performer_favorites.performer_id = $2\n   AND user_id NOT IN (\n    SELECT user_id\n    FROM performer_favorites PF\n    WHERE PF.performer_id = $1\n  )\n`\n\ntype ReassignPerformerFavoritesParams struct {\n\tNewPerformerID uuid.UUID `db:\"new_performer_id\" json:\"new_performer_id\"`\n\tOldPerformerID uuid.UUID `db:\"old_performer_id\" json:\"old_performer_id\"`\n}\n\nfunc (q *Queries) ReassignPerformerFavorites(ctx context.Context, arg ReassignPerformerFavoritesParams) error {\n\t_, err := q.db.Exec(ctx, reassignPerformerFavorites, arg.NewPerformerID, arg.OldPerformerID)\n\treturn err\n}\n\nconst searchPerformersWithFacets = `-- name: SearchPerformersWithFacets :many\nSELECT\n    performer_id,\n    pdb.agg('{\"terms\": {\"field\": \"gender\"}}') OVER () as gender_facets,\n    pdb.agg('{\"value_count\": {\"field\": \"performer_id\"}}') OVER () as total_count\nFROM performer_search\nWHERE performer_id @@@ paradedb.disjunction_max(disjuncts => ARRAY[\n    paradedb.boolean(\n        should => ARRAY[\n            paradedb.boost(factor => 1.5, query => paradedb.match(field => 'name', value => $1::TEXT)),\n            paradedb.match(field => 'disambiguation', value => $1::TEXT)\n        ]\n    ),\n    paradedb.match(field => 'aliases', value => $1::TEXT)\n])\nAND ($2::TEXT IS NULL OR gender = $2::TEXT)\nORDER BY pdb.score(performer_id) DESC\nLIMIT $4 OFFSET $3\n`\n\ntype SearchPerformersWithFacetsParams struct {\n\tTerm         *string `db:\"term\" json:\"term\"`\n\tFilterGender *string `db:\"filter_gender\" json:\"filter_gender\"`\n\tOffset       int32   `db:\"offset\" json:\"offset\"`\n\tLimit        int32   `db:\"limit\" json:\"limit\"`\n}\n\ntype SearchPerformersWithFacetsRow struct {\n\tPerformerID  uuid.UUID   `db:\"performer_id\" json:\"performer_id\"`\n\tGenderFacets interface{} `db:\"gender_facets\" json:\"gender_facets\"`\n\tTotalCount   interface{} `db:\"total_count\" json:\"total_count\"`\n}\n\nfunc (q *Queries) SearchPerformersWithFacets(ctx context.Context, arg SearchPerformersWithFacetsParams) ([]SearchPerformersWithFacetsRow, error) {\n\trows, err := q.db.Query(ctx, searchPerformersWithFacets,\n\t\targ.Term,\n\t\targ.FilterGender,\n\t\targ.Offset,\n\t\targ.Limit,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []SearchPerformersWithFacetsRow{}\n\tfor rows.Next() {\n\t\tvar i SearchPerformersWithFacetsRow\n\t\tif err := rows.Scan(&i.PerformerID, &i.GenderFacets, &i.TotalCount); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst setScenePerformerAlias = `-- name: SetScenePerformerAlias :exec\nUPDATE scene_performers\nSET \"as\" = $2\nWHERE performer_id = $1\nAND \"as\" IS NULL\n`\n\ntype SetScenePerformerAliasParams struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tAs          *string   `db:\"as\" json:\"as\"`\n}\n\nfunc (q *Queries) SetScenePerformerAlias(ctx context.Context, arg SetScenePerformerAliasParams) error {\n\t_, err := q.db.Exec(ctx, setScenePerformerAlias, arg.PerformerID, arg.As)\n\treturn err\n}\n\nconst softDeletePerformer = `-- name: SoftDeletePerformer :one\nUPDATE performers SET deleted = true, updated_at = NOW() WHERE id = $1\nRETURNING id, name, disambiguation, gender, ethnicity, country, eye_color, hair_color, height, cup_size, band_size, hip_size, waist_size, breast_type, career_start_year, career_end_year, created_at, updated_at, deleted, birthdate, deathdate\n`\n\nfunc (q *Queries) SoftDeletePerformer(ctx context.Context, id uuid.UUID) (Performer, error) {\n\trow := q.db.QueryRow(ctx, softDeletePerformer, id)\n\tvar i Performer\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Disambiguation,\n\t\t&i.Gender,\n\t\t&i.Ethnicity,\n\t\t&i.Country,\n\t\t&i.EyeColor,\n\t\t&i.HairColor,\n\t\t&i.Height,\n\t\t&i.CupSize,\n\t\t&i.BandSize,\n\t\t&i.HipSize,\n\t\t&i.WaistSize,\n\t\t&i.BreastType,\n\t\t&i.CareerStartYear,\n\t\t&i.CareerEndYear,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t\t&i.Birthdate,\n\t\t&i.Deathdate,\n\t)\n\treturn i, err\n}\n\nconst updatePerformer = `-- name: UpdatePerformer :one\nUPDATE performers \nSET name = $2, disambiguation = $3, gender = $4, birthdate = $5, \n    ethnicity = $6, country = $7, eye_color = $8, hair_color = $9, \n    height = $10, cup_size = $11, band_size = $12, hip_size = $13, \n    waist_size = $14, breast_type = $15, career_start_year = $16, \n    career_end_year = $17, deathdate = $18, updated_at = now()\nWHERE id = $1\nRETURNING id, name, disambiguation, gender, ethnicity, country, eye_color, hair_color, height, cup_size, band_size, hip_size, waist_size, breast_type, career_start_year, career_end_year, created_at, updated_at, deleted, birthdate, deathdate\n`\n\ntype UpdatePerformerParams struct {\n\tID              uuid.UUID              `db:\"id\" json:\"id\"`\n\tName            string                 `db:\"name\" json:\"name\"`\n\tDisambiguation  *string                `db:\"disambiguation\" json:\"disambiguation\"`\n\tGender          *models.GenderEnum     `db:\"gender\" json:\"gender\"`\n\tBirthdate       *string                `db:\"birthdate\" json:\"birthdate\"`\n\tEthnicity       *models.EthnicityEnum  `db:\"ethnicity\" json:\"ethnicity\"`\n\tCountry         *string                `db:\"country\" json:\"country\"`\n\tEyeColor        *models.EyeColorEnum   `db:\"eye_color\" json:\"eye_color\"`\n\tHairColor       *models.HairColorEnum  `db:\"hair_color\" json:\"hair_color\"`\n\tHeight          *int                   `db:\"height\" json:\"height\"`\n\tCupSize         *string                `db:\"cup_size\" json:\"cup_size\"`\n\tBandSize        *int                   `db:\"band_size\" json:\"band_size\"`\n\tHipSize         *int                   `db:\"hip_size\" json:\"hip_size\"`\n\tWaistSize       *int                   `db:\"waist_size\" json:\"waist_size\"`\n\tBreastType      *models.BreastTypeEnum `db:\"breast_type\" json:\"breast_type\"`\n\tCareerStartYear *int                   `db:\"career_start_year\" json:\"career_start_year\"`\n\tCareerEndYear   *int                   `db:\"career_end_year\" json:\"career_end_year\"`\n\tDeathdate       *string                `db:\"deathdate\" json:\"deathdate\"`\n}\n\nfunc (q *Queries) UpdatePerformer(ctx context.Context, arg UpdatePerformerParams) (Performer, error) {\n\trow := q.db.QueryRow(ctx, updatePerformer,\n\t\targ.ID,\n\t\targ.Name,\n\t\targ.Disambiguation,\n\t\targ.Gender,\n\t\targ.Birthdate,\n\t\targ.Ethnicity,\n\t\targ.Country,\n\t\targ.EyeColor,\n\t\targ.HairColor,\n\t\targ.Height,\n\t\targ.CupSize,\n\t\targ.BandSize,\n\t\targ.HipSize,\n\t\targ.WaistSize,\n\t\targ.BreastType,\n\t\targ.CareerStartYear,\n\t\targ.CareerEndYear,\n\t\targ.Deathdate,\n\t)\n\tvar i Performer\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Disambiguation,\n\t\t&i.Gender,\n\t\t&i.Ethnicity,\n\t\t&i.Country,\n\t\t&i.EyeColor,\n\t\t&i.HairColor,\n\t\t&i.Height,\n\t\t&i.CupSize,\n\t\t&i.BandSize,\n\t\t&i.HipSize,\n\t\t&i.WaistSize,\n\t\t&i.BreastType,\n\t\t&i.CareerStartYear,\n\t\t&i.CareerEndYear,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t\t&i.Birthdate,\n\t\t&i.Deathdate,\n\t)\n\treturn i, err\n}\n\nconst updatePerformerRedirects = `-- name: UpdatePerformerRedirects :exec\nUPDATE performer_redirects SET target_id = $1 WHERE target_id = $2\n`\n\ntype UpdatePerformerRedirectsParams struct {\n\tNewPerformerID uuid.UUID `db:\"new_performer_id\" json:\"new_performer_id\"`\n\tOldPerformerID uuid.UUID `db:\"old_performer_id\" json:\"old_performer_id\"`\n}\n\nfunc (q *Queries) UpdatePerformerRedirects(ctx context.Context, arg UpdatePerformerRedirectsParams) error {\n\t_, err := q.db.Exec(ctx, updatePerformerRedirects, arg.NewPerformerID, arg.OldPerformerID)\n\treturn err\n}\n"
  },
  {
    "path": "internal/queries/querier.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n\npackage queries\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\ntype Querier interface {\n\tCancelUserEdits(ctx context.Context, userID uuid.NullUUID) error\n\tClearScenePerformerAlias(ctx context.Context, arg ClearScenePerformerAliasParams) error\n\tCountNotificationsByUser(ctx context.Context, arg CountNotificationsByUserParams) (int64, error)\n\tCountScenesByPerformer(ctx context.Context, performerID uuid.UUID) (int64, error)\n\tCountUserEditsByStatus(ctx context.Context, userID uuid.NullUUID) ([]CountUserEditsByStatusRow, error)\n\tCountUsers(ctx context.Context) (int64, error)\n\tCountVotesByType(ctx context.Context, userID uuid.UUID) ([]CountVotesByTypeRow, error)\n\t// Draft queries\n\tCreateDraft(ctx context.Context, arg CreateDraftParams) (Draft, error)\n\t// Edit queries\n\tCreateEdit(ctx context.Context, arg CreateEditParams) (Edit, error)\n\t// Edit comments\n\tCreateEditComment(ctx context.Context, arg CreateEditCommentParams) (EditComment, error)\n\t// Edit votes\n\tCreateEditVote(ctx context.Context, arg CreateEditVoteParams) error\n\t// Fingerprint queries (normalized schema)\n\tCreateFingerprint(ctx context.Context, arg CreateFingerprintParams) (Fingerprint, error)\n\t// Image queries\n\tCreateImage(ctx context.Context, arg CreateImageParams) (Image, error)\n\t// Invite key queries\n\tCreateInviteKey(ctx context.Context, arg CreateInviteKeyParams) (InviteKey, error)\n\tCreateModAudit(ctx context.Context, arg CreateModAuditParams) (ModAudit, error)\n\tCreateOrReplaceFingerprint(ctx context.Context, arg CreateOrReplaceFingerprintParams) error\n\t// Performer queries\n\tCreatePerformer(ctx context.Context, arg CreatePerformerParams) (Performer, error)\n\tCreatePerformerAliases(ctx context.Context, arg []CreatePerformerAliasesParams) (int64, error)\n\tCreatePerformerEdit(ctx context.Context, arg CreatePerformerEditParams) error\n\tCreatePerformerFavorite(ctx context.Context, arg CreatePerformerFavoriteParams) error\n\tCreatePerformerImages(ctx context.Context, arg []CreatePerformerImagesParams) (int64, error)\n\tCreatePerformerPiercings(ctx context.Context, arg []CreatePerformerPiercingsParams) (int64, error)\n\t// Performer redirects\n\tCreatePerformerRedirect(ctx context.Context, arg CreatePerformerRedirectParams) error\n\tCreatePerformerTattoos(ctx context.Context, arg []CreatePerformerTattoosParams) (int64, error)\n\tCreatePerformerURLs(ctx context.Context, arg []CreatePerformerURLsParams) (int64, error)\n\t// Scene queries\n\tCreateScene(ctx context.Context, arg CreateSceneParams) (Scene, error)\n\tCreateSceneEdit(ctx context.Context, arg CreateSceneEditParams) error\n\tCreateSceneFingerprints(ctx context.Context, arg []CreateSceneFingerprintsParams) (int64, error)\n\tCreateSceneImages(ctx context.Context, arg []CreateSceneImagesParams) (int64, error)\n\t// Scene performers\n\tCreateScenePerformers(ctx context.Context, arg []CreateScenePerformersParams) (int64, error)\n\t// Scene redirects\n\tCreateSceneRedirect(ctx context.Context, arg CreateSceneRedirectParams) error\n\t// Scene tags management\n\tCreateSceneTags(ctx context.Context, arg []CreateSceneTagsParams) (int64, error)\n\t// Scene URLs\n\tCreateSceneURLs(ctx context.Context, arg []CreateSceneURLsParams) (int64, error)\n\t// Site queries\n\tCreateSite(ctx context.Context, arg CreateSiteParams) (Site, error)\n\t// Studio queries\n\tCreateStudio(ctx context.Context, arg CreateStudioParams) (Studio, error)\n\t// Studio aliases\n\tCreateStudioAliases(ctx context.Context, arg []CreateStudioAliasesParams) (int64, error)\n\tCreateStudioEdit(ctx context.Context, arg CreateStudioEditParams) error\n\t// Studio favorites\n\tCreateStudioFavorite(ctx context.Context, arg CreateStudioFavoriteParams) error\n\t// Studio images\n\tCreateStudioImages(ctx context.Context, arg []CreateStudioImagesParams) (int64, error)\n\t// Studio redirects\n\tCreateStudioRedirect(ctx context.Context, arg CreateStudioRedirectParams) error\n\t// Studio URLs\n\tCreateStudioURLs(ctx context.Context, arg []CreateStudioURLsParams) (int64, error)\n\t// Tag queries\n\tCreateTag(ctx context.Context, arg CreateTagParams) (Tag, error)\n\t// Tag aliases\n\tCreateTagAliases(ctx context.Context, arg []CreateTagAliasesParams) (int64, error)\n\t// Tag category queries\n\tCreateTagCategory(ctx context.Context, arg CreateTagCategoryParams) (TagCategory, error)\n\tCreateTagEdit(ctx context.Context, arg CreateTagEditParams) error\n\t// Tag redirects\n\tCreateTagRedirect(ctx context.Context, arg CreateTagRedirectParams) error\n\t// User queries\n\tCreateUser(ctx context.Context, arg CreateUserParams) (User, error)\n\t// User notification subscriptions\n\tCreateUserNotificationSubscriptions(ctx context.Context, arg []CreateUserNotificationSubscriptionsParams) (int64, error)\n\t// User roles\n\tCreateUserRoles(ctx context.Context, arg []CreateUserRolesParams) (int64, error)\n\t// User token queries\n\tCreateUserToken(ctx context.Context, arg CreateUserTokenParams) (UserToken, error)\n\tDeleteAllSceneFingerprintSubmissions(ctx context.Context, arg DeleteAllSceneFingerprintSubmissionsParams) (int64, error)\n\tDeleteDraft(ctx context.Context, id uuid.UUID) error\n\tDeleteEdit(ctx context.Context, id uuid.UUID) error\n\tDeleteExpiredDrafts(ctx context.Context, dollar_1 interface{}) error\n\tDeleteExpiredModAudits(ctx context.Context, dollar_1 interface{}) error\n\tDeleteExpiredUserTokens(ctx context.Context) error\n\tDeleteImage(ctx context.Context, id uuid.UUID) error\n\tDeleteInviteKey(ctx context.Context, id uuid.UUID) error\n\tDeletePerformer(ctx context.Context, id uuid.UUID) error\n\t// Performer aliases\n\tDeletePerformerAliases(ctx context.Context, performerID uuid.UUID) error\n\tDeletePerformerFavorite(ctx context.Context, arg DeletePerformerFavoriteParams) error\n\t// Performer favorites\n\tDeletePerformerFavorites(ctx context.Context, performerID uuid.UUID) error\n\tDeletePerformerImages(ctx context.Context, performerID uuid.UUID) error\n\t// Performer piercings\n\tDeletePerformerPiercings(ctx context.Context, performerID uuid.UUID) error\n\tDeletePerformerScenes(ctx context.Context, performerID uuid.UUID) error\n\t// Performer tattoos\n\tDeletePerformerTattoos(ctx context.Context, performerID uuid.UUID) error\n\t// Performer URLs\n\tDeletePerformerURLs(ctx context.Context, performerID uuid.UUID) error\n\tDeleteScene(ctx context.Context, id uuid.UUID) error\n\tDeleteSceneFingerprint(ctx context.Context, arg DeleteSceneFingerprintParams) error\n\tDeleteSceneFingerprintsByScene(ctx context.Context, sceneID uuid.UUID) error\n\t// Scene images\n\tDeleteSceneImages(ctx context.Context, sceneID uuid.UUID) error\n\tDeleteScenePerformers(ctx context.Context, sceneID uuid.UUID) error\n\tDeleteSceneStudios(ctx context.Context, studioID uuid.NullUUID) error\n\tDeleteSceneTagsByScene(ctx context.Context, sceneID uuid.UUID) error\n\tDeleteSceneTagsByTag(ctx context.Context, tagID uuid.UUID) error\n\tDeleteSceneURLs(ctx context.Context, sceneID uuid.UUID) error\n\tDeleteSite(ctx context.Context, id uuid.UUID) error\n\tDeleteStudio(ctx context.Context, id uuid.UUID) error\n\tDeleteStudioAliases(ctx context.Context, studioID uuid.UUID) error\n\tDeleteStudioFavorite(ctx context.Context, arg DeleteStudioFavoriteParams) error\n\tDeleteStudioFavorites(ctx context.Context, studioID uuid.UUID) error\n\tDeleteStudioImages(ctx context.Context, studioID uuid.UUID) error\n\tDeleteStudioURLs(ctx context.Context, studioID uuid.UUID) error\n\tDeleteTag(ctx context.Context, id uuid.UUID) error\n\tDeleteTagAliases(ctx context.Context, tagID uuid.UUID) error\n\tDeleteTagAliasesByNames(ctx context.Context, arg DeleteTagAliasesByNamesParams) error\n\tDeleteTagCategory(ctx context.Context, id uuid.UUID) error\n\tDeleteUser(ctx context.Context, id uuid.UUID) error\n\tDeleteUserNotificationSubscriptions(ctx context.Context, userID uuid.UUID) error\n\tDeleteUserRoles(ctx context.Context, userID uuid.UUID) error\n\tDeleteUserToken(ctx context.Context, id uuid.UUID) error\n\tDestroyExpiredInvites(ctx context.Context) error\n\tDestroyExpiredNotifications(ctx context.Context) error\n\tFindActiveInviteKeysForUser(ctx context.Context, generatedBy uuid.UUID) ([]InviteKey, error)\n\t// Returns pending edits that fulfill one of the criteria for being closed:\n\t// * The full voting period has passed\n\t// * The minimum voting period has passed, and the number of votes has crossed the voting threshold.\n\t// The latter only applies for destructive edits. Non-destructive edits get auto-applied when sufficient votes are cast.\n\tFindCompletedEdits(ctx context.Context, arg FindCompletedEditsParams) ([]Edit, error)\n\tFindDraft(ctx context.Context, id uuid.UUID) (Draft, error)\n\tFindDraftsByUser(ctx context.Context, userID uuid.UUID) ([]Draft, error)\n\tFindEdit(ctx context.Context, id uuid.UUID) (Edit, error)\n\tFindExistingPerformers(ctx context.Context, arg FindExistingPerformersParams) ([]Performer, error)\n\tFindExistingScenes(ctx context.Context, arg FindExistingScenesParams) ([]Scene, error)\n\tFindImage(ctx context.Context, id uuid.UUID) (Image, error)\n\tFindImageByChecksum(ctx context.Context, checksum string) (Image, error)\n\tFindImageIdsByPerformerIds(ctx context.Context, dollar_1 []uuid.UUID) ([]PerformerImage, error)\n\tFindImageIdsBySceneIds(ctx context.Context, dollar_1 []uuid.UUID) ([]SceneImage, error)\n\tFindImageIdsByStudioIds(ctx context.Context, dollar_1 []uuid.UUID) ([]StudioImage, error)\n\tFindImagesByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]Image, error)\n\tFindImagesBySceneID(ctx context.Context, id uuid.UUID) ([]Image, error)\n\tFindImagesByStudioID(ctx context.Context, id uuid.UUID) ([]Image, error)\n\tFindInviteKey(ctx context.Context, id uuid.UUID) (InviteKey, error)\n\t// Find merge target IDs for performers (for merges where these are sources)\n\tFindMergeIDsByPerformerIds(ctx context.Context, performerIds []uuid.UUID) ([]FindMergeIDsByPerformerIdsRow, error)\n\t// Find merge source IDs for performers (for merges where these are targets)\n\tFindMergeIDsBySourcePerformerIds(ctx context.Context, performerIds []uuid.UUID) ([]FindMergeIDsBySourcePerformerIdsRow, error)\n\t// Notification queries\n\tFindNotificationsByUser(ctx context.Context, arg FindNotificationsByUserParams) ([]Notification, error)\n\tFindPendingPerformerCreation(ctx context.Context, arg FindPendingPerformerCreationParams) ([]Edit, error)\n\tFindPendingSceneCreation(ctx context.Context, arg FindPendingSceneCreationParams) ([]Edit, error)\n\tFindPerformer(ctx context.Context, id uuid.UUID) (Performer, error)\n\t// Get aliases for multiple performers\n\tFindPerformerAliasesByIds(ctx context.Context, performerIds []uuid.UUID) ([]PerformerAlias, error)\n\tFindPerformerByAlias(ctx context.Context, upper interface{}) (Performer, error)\n\tFindPerformerByName(ctx context.Context, upper interface{}) (Performer, error)\n\t// Check favorite status for multiple performers for a specific user\n\tFindPerformerFavoritesByIds(ctx context.Context, arg FindPerformerFavoritesByIdsParams) ([]FindPerformerFavoritesByIdsRow, error)\n\t// Get piercings for multiple performers\n\tFindPerformerPiercingsByIds(ctx context.Context, performerIds []uuid.UUID) ([]PerformerPiercing, error)\n\t// Get tattoos for multiple performers\n\tFindPerformerTattoosByIds(ctx context.Context, performerIds []uuid.UUID) ([]PerformerTattoo, error)\n\t// Get URLs for multiple performers\n\tFindPerformerUrlsByIds(ctx context.Context, performerIds []uuid.UUID) ([]PerformerUrl, error)\n\tFindPerformerWithRedirect(ctx context.Context, id uuid.UUID) ([]Performer, error)\n\tFindPerformersByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]Performer, error)\n\tFindPerformersByURL(ctx context.Context, arg FindPerformersByURLParams) ([]Performer, error)\n\tFindScene(ctx context.Context, id uuid.UUID) (Scene, error)\n\t// Get performer appearances for multiple scenes\n\tFindSceneAppearancesByIds(ctx context.Context, sceneIds []uuid.UUID) ([]FindSceneAppearancesByIdsRow, error)\n\tFindSceneByURL(ctx context.Context, arg FindSceneByURLParams) ([]Scene, error)\n\t// Get URLs for multiple scenes\n\tFindSceneUrlsByIds(ctx context.Context, sceneIds []uuid.UUID) ([]SceneUrl, error)\n\t// Scene fingerprints (use fingerprint.sql for most fingerprint operations)\n\tFindScenesByFullFingerprintsWithHash(ctx context.Context, arg FindScenesByFullFingerprintsWithHashParams) ([]FindScenesByFullFingerprintsWithHashRow, error)\n\tFindSitesByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]Site, error)\n\tFindStudio(ctx context.Context, id uuid.UUID) (Studio, error)\n\t// Get aliases for multiple studios\n\tFindStudioAliasesByIds(ctx context.Context, studioIds []uuid.UUID) ([]StudioAlias, error)\n\tFindStudioByAlias(ctx context.Context, upper interface{}) (Studio, error)\n\tFindStudioByName(ctx context.Context, upper interface{}) (Studio, error)\n\t// Check favorite status for multiple studios for a specific user\n\tFindStudioFavoritesByIds(ctx context.Context, arg FindStudioFavoritesByIdsParams) ([]FindStudioFavoritesByIdsRow, error)\n\t// Get URLs for multiple studios\n\tFindStudioUrlsByIds(ctx context.Context, studioIds []uuid.UUID) ([]StudioUrl, error)\n\tFindStudioWithRedirect(ctx context.Context, id uuid.UUID) (Studio, error)\n\tFindTag(ctx context.Context, id uuid.UUID) (Tag, error)\n\tFindTagByAlias(ctx context.Context, upper interface{}) (Tag, error)\n\tFindTagByName(ctx context.Context, upper interface{}) (Tag, error)\n\tFindTagByNameOrAlias(ctx context.Context, lower string) (Tag, error)\n\tFindTagCategory(ctx context.Context, id uuid.UUID) (TagCategory, error)\n\t// Bulk query to find tag IDs for multiple scene IDs\n\tFindTagIdsBySceneIds(ctx context.Context, sceneIds []uuid.UUID) ([]SceneTag, error)\n\tFindTagWithRedirect(ctx context.Context, id uuid.UUID) ([]Tag, error)\n\tFindTagsByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]Tag, error)\n\tFindTagsBySceneID(ctx context.Context, sceneID uuid.UUID) ([]Tag, error)\n\tFindUnreadNotificationsByUser(ctx context.Context, arg FindUnreadNotificationsByUserParams) ([]Notification, error)\n\tFindUnusedImages(ctx context.Context) ([]Image, error)\n\tFindUser(ctx context.Context, id uuid.UUID) (User, error)\n\tFindUserByEmail(ctx context.Context, upper interface{}) (User, error)\n\tFindUserByName(ctx context.Context, name string) (User, error)\n\tFindUserToken(ctx context.Context, id uuid.UUID) (UserToken, error)\n\tFindUserTokensByEmail(ctx context.Context, dollar_1 string) ([]UserToken, error)\n\tFindUserTokensByInviteKey(ctx context.Context, dollar_1 uuid.UUID) ([]UserToken, error)\n\t// Get all fingerprints for multiple scenes with aggregated vote data\n\t// When onlySubmitted is true, pass the actual user ID, when false pass NULL\n\tGetAllFingerprints(ctx context.Context, arg GetAllFingerprintsParams) ([]GetAllFingerprintsRow, error)\n\tGetAllSceneFingerprints(ctx context.Context, sceneID uuid.UUID) ([]GetAllSceneFingerprintsRow, error)\n\tGetAllTagCategories(ctx context.Context) ([]TagCategory, error)\n\tGetChildStudios(ctx context.Context, parentStudioID uuid.NullUUID) ([]Studio, error)\n\tGetEditComments(ctx context.Context, editID uuid.UUID) ([]EditComment, error)\n\tGetEditCommentsByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]EditComment, error)\n\tGetEditPerformerAliases(ctx context.Context, id uuid.UUID) ([]string, error)\n\tGetEditPerformerPiercings(ctx context.Context, id uuid.UUID) ([]GetEditPerformerPiercingsRow, error)\n\tGetEditPerformerTattoos(ctx context.Context, id uuid.UUID) ([]GetEditPerformerTattoosRow, error)\n\tGetEditTargetID(ctx context.Context, id uuid.UUID) (GetEditTargetIDRow, error)\n\tGetEditVotes(ctx context.Context, editID uuid.UUID) ([]EditVote, error)\n\tGetEditsByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]Edit, error)\n\tGetEditsByPerformer(ctx context.Context, performerID uuid.UUID) ([]Edit, error)\n\tGetEditsByScene(ctx context.Context, sceneID uuid.UUID) ([]Edit, error)\n\tGetEditsByStudio(ctx context.Context, studioID uuid.UUID) ([]Edit, error)\n\tGetEditsByTag(ctx context.Context, tagID uuid.UUID) ([]Edit, error)\n\tGetFingerprint(ctx context.Context, arg GetFingerprintParams) (Fingerprint, error)\n\t// Gets current images for target entity and merges with edit's added_images/removed_images\n\tGetImagesForEdit(ctx context.Context, id uuid.UUID) ([]Image, error)\n\t// Gets current performers for target entity and merges with edit's added_performers/removed_performers\n\tGetMergedPerformersForEdit(ctx context.Context, id uuid.UUID) ([]GetMergedPerformersForEditRow, error)\n\t// Gets current aliases for target studio entity and merges with edit's added_aliases/removed_aliases\n\tGetMergedStudioAliasesForEdit(ctx context.Context, id uuid.UUID) ([]string, error)\n\t// Gets current aliases for target tag entity and merges with edit's added_aliases/removed_aliases\n\tGetMergedTagAliasesForEdit(ctx context.Context, id uuid.UUID) ([]string, error)\n\t// Gets current tags for target entity and merges with edit's added_tags/removed_tags\n\tGetMergedTagsForEdit(ctx context.Context, id uuid.UUID) ([]Tag, error)\n\t// URL merging queries for edits\n\t// result: URL\n\t// Gets current URLs for target entity and merges with edit's added_urls/removed_urls\n\tGetMergedURLsForEdit(ctx context.Context, id uuid.UUID) ([]GetMergedURLsForEditRow, error)\n\tGetModAuditCount(ctx context.Context, arg GetModAuditCountParams) (int64, error)\n\tGetPerformerAliases(ctx context.Context, performerID uuid.UUID) ([]string, error)\n\t// Performer images\n\tGetPerformerImages(ctx context.Context, performerID uuid.UUID) ([]Image, error)\n\tGetPerformerPiercings(ctx context.Context, performerID uuid.UUID) ([]GetPerformerPiercingsRow, error)\n\tGetPerformerTattoos(ctx context.Context, performerID uuid.UUID) ([]GetPerformerTattoosRow, error)\n\tGetPerformerURLs(ctx context.Context, performerID uuid.UUID) ([]GetPerformerURLsRow, error)\n\tGetScenePerformers(ctx context.Context, sceneID uuid.UUID) ([]GetScenePerformersRow, error)\n\tGetSceneTags(ctx context.Context, sceneID uuid.UUID) ([]Tag, error)\n\tGetSceneURLs(ctx context.Context, sceneID uuid.UUID) ([]GetSceneURLsRow, error)\n\tGetScenes(ctx context.Context, dollar_1 []uuid.UUID) ([]Scene, error)\n\tGetSite(ctx context.Context, id uuid.UUID) (Site, error)\n\tGetStudioAliases(ctx context.Context, studioID uuid.UUID) ([]string, error)\n\tGetStudioImages(ctx context.Context, studioID uuid.UUID) ([]uuid.UUID, error)\n\tGetStudioURLs(ctx context.Context, studioID uuid.UUID) ([]StudioUrl, error)\n\tGetStudios(ctx context.Context, dollar_1 []uuid.UUID) ([]Studio, error)\n\tGetStudiosByPerformer(ctx context.Context, performerID uuid.UUID) ([]GetStudiosByPerformerRow, error)\n\t// Get studios where performer has scenes, filtered to a studio network (the studio, its parent, and children)\n\tGetStudiosByPerformerAndNetwork(ctx context.Context, arg GetStudiosByPerformerAndNetworkParams) ([]GetStudiosByPerformerAndNetworkRow, error)\n\tGetTagAliases(ctx context.Context, tagID uuid.UUID) ([]string, error)\n\tGetTagCategoriesByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]TagCategory, error)\n\tGetUserNotificationSubscriptions(ctx context.Context, userID uuid.UUID) ([]NotificationType, error)\n\tGetUserRoles(ctx context.Context, userID uuid.UUID) ([]string, error)\n\tInviteKeyUsed(ctx context.Context, id uuid.UUID) (*int, error)\n\tIsImageUnused(ctx context.Context, id uuid.UUID) (bool, error)\n\tMarkAllNotificationsRead(ctx context.Context, userID uuid.UUID) error\n\tMarkNotificationRead(ctx context.Context, arg MarkNotificationReadParams) error\n\tMoveSceneFingerprintSubmissions(ctx context.Context, arg MoveSceneFingerprintSubmissionsParams) (int64, error)\n\tQueryModAudits(ctx context.Context, arg QueryModAuditsParams) ([]ModAudit, error)\n\tReassignPerformerAliases(ctx context.Context, arg ReassignPerformerAliasesParams) error\n\tReassignPerformerFavorites(ctx context.Context, arg ReassignPerformerFavoritesParams) error\n\tReassignStudioFavorites(ctx context.Context, arg ReassignStudioFavoritesParams) error\n\tResetVotes(ctx context.Context, editID uuid.UUID) error\n\tSearchPerformersWithFacets(ctx context.Context, arg SearchPerformersWithFacetsParams) ([]SearchPerformersWithFacetsRow, error)\n\tSearchScenes(ctx context.Context, arg SearchScenesParams) ([]SearchScenesRow, error)\n\tSearchStudios(ctx context.Context, arg SearchStudiosParams) ([]SearchStudiosRow, error)\n\tSearchTags(ctx context.Context, arg SearchTagsParams) ([]Tag, error)\n\tSetScenePerformerAlias(ctx context.Context, arg SetScenePerformerAliasParams) error\n\tSoftDeletePerformer(ctx context.Context, id uuid.UUID) (Performer, error)\n\tSoftDeleteScene(ctx context.Context, id uuid.UUID) (Scene, error)\n\tSoftDeleteStudio(ctx context.Context, id uuid.UUID) (Studio, error)\n\tSoftDeleteTag(ctx context.Context, id uuid.UUID) (Tag, error)\n\tSubmittedHashExists(ctx context.Context, arg SubmittedHashExistsParams) (bool, error)\n\tTriggerDownvoteEditNotifications(ctx context.Context, id uuid.UUID) error\n\tTriggerEditCommentNotifications(ctx context.Context, id uuid.UUID) error\n\tTriggerFailedEditNotifications(ctx context.Context, id uuid.UUID) error\n\tTriggerPerformerEditNotifications(ctx context.Context, id uuid.UUID) error\n\tTriggerSceneCreationNotifications(ctx context.Context, id uuid.UUID) error\n\tTriggerSceneEditNotifications(ctx context.Context, id uuid.UUID) error\n\tTriggerStudioEditNotifications(ctx context.Context, id uuid.UUID) error\n\tTriggerUpdatedEditNotifications(ctx context.Context, id uuid.UUID) error\n\tUpdateEdit(ctx context.Context, arg UpdateEditParams) (Edit, error)\n\tUpdateEditData(ctx context.Context, arg UpdateEditDataParams) (Edit, error)\n\tUpdatePerformer(ctx context.Context, arg UpdatePerformerParams) (Performer, error)\n\tUpdatePerformerRedirects(ctx context.Context, arg UpdatePerformerRedirectsParams) error\n\tUpdateScene(ctx context.Context, arg UpdateSceneParams) (Scene, error)\n\tUpdateSceneRedirects(ctx context.Context, arg UpdateSceneRedirectsParams) error\n\tUpdateSceneStudios(ctx context.Context, arg UpdateSceneStudiosParams) error\n\tUpdateSceneTagsForMerge(ctx context.Context, arg UpdateSceneTagsForMergeParams) error\n\tUpdateSite(ctx context.Context, arg UpdateSiteParams) (Site, error)\n\tUpdateStudio(ctx context.Context, arg UpdateStudioParams) (Studio, error)\n\tUpdateStudioRedirects(ctx context.Context, arg UpdateStudioRedirectsParams) error\n\tUpdateTag(ctx context.Context, arg UpdateTagParams) (Tag, error)\n\tUpdateTagCategory(ctx context.Context, arg UpdateTagCategoryParams) (TagCategory, error)\n\tUpdateTagRedirects(ctx context.Context, arg UpdateTagRedirectsParams) error\n\tUpdateUser(ctx context.Context, arg UpdateUserParams) (User, error)\n\tUpdateUserAPIKey(ctx context.Context, arg UpdateUserAPIKeyParams) error\n\tUpdateUserEmail(ctx context.Context, arg UpdateUserEmailParams) error\n\tUpdateUserInviteTokenCount(ctx context.Context, arg UpdateUserInviteTokenCountParams) error\n\tUpdateUserPassword(ctx context.Context, arg UpdateUserPasswordParams) error\n}\n\nvar _ Querier = (*Queries)(nil)\n"
  },
  {
    "path": "internal/queries/scene.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: scene.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\nconst countScenesByPerformer = `-- name: CountScenesByPerformer :one\nSELECT COUNT(*) FROM scene_performers WHERE performer_id = $1\n`\n\nfunc (q *Queries) CountScenesByPerformer(ctx context.Context, performerID uuid.UUID) (int64, error) {\n\trow := q.db.QueryRow(ctx, countScenesByPerformer, performerID)\n\tvar count int64\n\terr := row.Scan(&count)\n\treturn count, err\n}\n\nconst createScene = `-- name: CreateScene :one\n\nINSERT INTO scenes (id, title, details, date, production_date, studio_id, duration, director, code, created_at, updated_at)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, now(), now())\nRETURNING id, title, details, studio_id, created_at, updated_at, duration, director, deleted, code, date, production_date\n`\n\ntype CreateSceneParams struct {\n\tID             uuid.UUID     `db:\"id\" json:\"id\"`\n\tTitle          *string       `db:\"title\" json:\"title\"`\n\tDetails        *string       `db:\"details\" json:\"details\"`\n\tDate           *string       `db:\"date\" json:\"date\"`\n\tProductionDate *string       `db:\"production_date\" json:\"production_date\"`\n\tStudioID       uuid.NullUUID `db:\"studio_id\" json:\"studio_id\"`\n\tDuration       *int          `db:\"duration\" json:\"duration\"`\n\tDirector       *string       `db:\"director\" json:\"director\"`\n\tCode           *string       `db:\"code\" json:\"code\"`\n}\n\n// Scene queries\nfunc (q *Queries) CreateScene(ctx context.Context, arg CreateSceneParams) (Scene, error) {\n\trow := q.db.QueryRow(ctx, createScene,\n\t\targ.ID,\n\t\targ.Title,\n\t\targ.Details,\n\t\targ.Date,\n\t\targ.ProductionDate,\n\t\targ.StudioID,\n\t\targ.Duration,\n\t\targ.Director,\n\t\targ.Code,\n\t)\n\tvar i Scene\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Title,\n\t\t&i.Details,\n\t\t&i.StudioID,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Duration,\n\t\t&i.Director,\n\t\t&i.Deleted,\n\t\t&i.Code,\n\t\t&i.Date,\n\t\t&i.ProductionDate,\n\t)\n\treturn i, err\n}\n\ntype CreateSceneImagesParams struct {\n\tSceneID uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tImageID uuid.UUID `db:\"image_id\" json:\"image_id\"`\n}\n\ntype CreateScenePerformersParams struct {\n\tSceneID     uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tAs          *string   `db:\"as\" json:\"as\"`\n}\n\nconst createSceneRedirect = `-- name: CreateSceneRedirect :exec\n\nINSERT INTO scene_redirects (source_id, target_id) VALUES ($1, $2)\n`\n\ntype CreateSceneRedirectParams struct {\n\tSourceID uuid.UUID `db:\"source_id\" json:\"source_id\"`\n\tTargetID uuid.UUID `db:\"target_id\" json:\"target_id\"`\n}\n\n// Scene redirects\nfunc (q *Queries) CreateSceneRedirect(ctx context.Context, arg CreateSceneRedirectParams) error {\n\t_, err := q.db.Exec(ctx, createSceneRedirect, arg.SourceID, arg.TargetID)\n\treturn err\n}\n\ntype CreateSceneURLsParams struct {\n\tSceneID uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tUrl     string    `db:\"url\" json:\"url\"`\n\tSiteID  uuid.UUID `db:\"site_id\" json:\"site_id\"`\n}\n\nconst deleteScene = `-- name: DeleteScene :exec\nDELETE FROM scenes WHERE id = $1\n`\n\nfunc (q *Queries) DeleteScene(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteScene, id)\n\treturn err\n}\n\nconst deleteSceneImages = `-- name: DeleteSceneImages :exec\n\nDELETE FROM scene_images WHERE scene_id = $1\n`\n\n// Scene images\nfunc (q *Queries) DeleteSceneImages(ctx context.Context, sceneID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteSceneImages, sceneID)\n\treturn err\n}\n\nconst deleteScenePerformers = `-- name: DeleteScenePerformers :exec\nDELETE FROM scene_performers WHERE scene_id = $1\n`\n\nfunc (q *Queries) DeleteScenePerformers(ctx context.Context, sceneID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteScenePerformers, sceneID)\n\treturn err\n}\n\nconst deleteSceneStudios = `-- name: DeleteSceneStudios :exec\nUPDATE scenes SET studio_id = NULL WHERE studio_id = $1\n`\n\nfunc (q *Queries) DeleteSceneStudios(ctx context.Context, studioID uuid.NullUUID) error {\n\t_, err := q.db.Exec(ctx, deleteSceneStudios, studioID)\n\treturn err\n}\n\nconst deleteSceneURLs = `-- name: DeleteSceneURLs :exec\nDELETE FROM scene_urls WHERE scene_id = $1\n`\n\nfunc (q *Queries) DeleteSceneURLs(ctx context.Context, sceneID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteSceneURLs, sceneID)\n\treturn err\n}\n\nconst findExistingScenes = `-- name: FindExistingScenes :many\nSELECT id, title, details, studio_id, created_at, updated_at, duration, director, deleted, code, date, production_date FROM scenes WHERE (\n    ($1::text IS NOT NULL AND $2::uuid IS NOT NULL\n     AND TRIM(LOWER(title)) = TRIM(LOWER($1))\n     AND studio_id = $2)\n    OR\n    ($3::BIGINT[] IS NOT NULL AND array_length($3::BIGINT[], 1) > 0\n     AND id IN (\n        SELECT scene_id\n        FROM scene_fingerprints SFP\n        JOIN fingerprints FP ON SFP.fingerprint_id = FP.id\n        WHERE FP.hash = ANY($3::BIGINT[])\n        GROUP BY scene_id\n    ))\n)\nAND deleted = FALSE\n`\n\ntype FindExistingScenesParams struct {\n\tTitle    *string       `db:\"title\" json:\"title\"`\n\tStudioID uuid.NullUUID `db:\"studio_id\" json:\"studio_id\"`\n\tHashes   []int64       `db:\"hashes\" json:\"hashes\"`\n}\n\nfunc (q *Queries) FindExistingScenes(ctx context.Context, arg FindExistingScenesParams) ([]Scene, error) {\n\trows, err := q.db.Query(ctx, findExistingScenes, arg.Title, arg.StudioID, arg.Hashes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Scene{}\n\tfor rows.Next() {\n\t\tvar i Scene\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Title,\n\t\t\t&i.Details,\n\t\t\t&i.StudioID,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Duration,\n\t\t\t&i.Director,\n\t\t\t&i.Deleted,\n\t\t\t&i.Code,\n\t\t\t&i.Date,\n\t\t\t&i.ProductionDate,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findScene = `-- name: FindScene :one\nSELECT id, title, details, studio_id, created_at, updated_at, duration, director, deleted, code, date, production_date FROM scenes WHERE id = $1\n`\n\nfunc (q *Queries) FindScene(ctx context.Context, id uuid.UUID) (Scene, error) {\n\trow := q.db.QueryRow(ctx, findScene, id)\n\tvar i Scene\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Title,\n\t\t&i.Details,\n\t\t&i.StudioID,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Duration,\n\t\t&i.Director,\n\t\t&i.Deleted,\n\t\t&i.Code,\n\t\t&i.Date,\n\t\t&i.ProductionDate,\n\t)\n\treturn i, err\n}\n\nconst findSceneAppearancesByIds = `-- name: FindSceneAppearancesByIds :many\nSELECT scene_id, performer_id, \"as\" FROM scene_performers WHERE scene_id = ANY($1::UUID[])\n`\n\ntype FindSceneAppearancesByIdsRow struct {\n\tSceneID     uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tAs          *string   `db:\"as\" json:\"as\"`\n}\n\n// Get performer appearances for multiple scenes\nfunc (q *Queries) FindSceneAppearancesByIds(ctx context.Context, sceneIds []uuid.UUID) ([]FindSceneAppearancesByIdsRow, error) {\n\trows, err := q.db.Query(ctx, findSceneAppearancesByIds, sceneIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []FindSceneAppearancesByIdsRow{}\n\tfor rows.Next() {\n\t\tvar i FindSceneAppearancesByIdsRow\n\t\tif err := rows.Scan(&i.SceneID, &i.PerformerID, &i.As); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findSceneByURL = `-- name: FindSceneByURL :many\nSELECT s.id, s.title, s.details, s.studio_id, s.created_at, s.updated_at, s.duration, s.director, s.deleted, s.code, s.date, s.production_date\nFROM scenes S\nJOIN scene_urls SU ON SU.scene_id = S.id\nWHERE LOWER(SU.url) = LOWER($1)\nAND S.deleted = FALSE\nLIMIT $2\n`\n\ntype FindSceneByURLParams struct {\n\tUrl   *string `db:\"url\" json:\"url\"`\n\tLimit int32   `db:\"limit\" json:\"limit\"`\n}\n\nfunc (q *Queries) FindSceneByURL(ctx context.Context, arg FindSceneByURLParams) ([]Scene, error) {\n\trows, err := q.db.Query(ctx, findSceneByURL, arg.Url, arg.Limit)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Scene{}\n\tfor rows.Next() {\n\t\tvar i Scene\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Title,\n\t\t\t&i.Details,\n\t\t\t&i.StudioID,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Duration,\n\t\t\t&i.Director,\n\t\t\t&i.Deleted,\n\t\t\t&i.Code,\n\t\t\t&i.Date,\n\t\t\t&i.ProductionDate,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findSceneUrlsByIds = `-- name: FindSceneUrlsByIds :many\nSELECT scene_id, url, site_id FROM scene_urls WHERE scene_id = ANY($1::UUID[])\n`\n\n// Get URLs for multiple scenes\nfunc (q *Queries) FindSceneUrlsByIds(ctx context.Context, sceneIds []uuid.UUID) ([]SceneUrl, error) {\n\trows, err := q.db.Query(ctx, findSceneUrlsByIds, sceneIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []SceneUrl{}\n\tfor rows.Next() {\n\t\tvar i SceneUrl\n\t\tif err := rows.Scan(&i.SceneID, &i.Url, &i.SiteID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findScenesByFullFingerprintsWithHash = `-- name: FindScenesByFullFingerprintsWithHash :many\n\nSELECT scenes.id, scenes.title, scenes.details, scenes.studio_id, scenes.created_at, scenes.updated_at, scenes.duration, scenes.director, scenes.deleted, scenes.code, scenes.date, scenes.production_date, matches.hash FROM (\n    SELECT SFP.scene_id AS id, FP.hash\n    FROM UNNEST($1::BIGINT[]) phash\n    JOIN fingerprints FP ON FP.hash <@ (phash, $2::INTEGER)\n        AND FP.algorithm = 'PHASH'\n    JOIN scene_fingerprints SFP ON SFP.fingerprint_id = FP.id\n    WHERE $1::BIGINT[] IS NOT NULL AND array_length($1::BIGINT[], 1) > 0\n    GROUP BY SFP.scene_id, FP.hash\n\n    UNION\n\n    SELECT SFP.scene_id AS id, FP.hash\n    FROM scene_fingerprints SFP\n    JOIN fingerprints FP ON SFP.fingerprint_id = FP.id\n    WHERE FP.hash = ANY($3::BIGINT[])\n        AND $3::BIGINT[] IS NOT NULL AND array_length($3::BIGINT[], 1) > 0\n    GROUP BY SFP.scene_id, FP.hash\n) matches\nJOIN scenes ON scenes.id = matches.id AND scenes.deleted = FALSE\n`\n\ntype FindScenesByFullFingerprintsWithHashParams struct {\n\tPhashes  []int64 `db:\"phashes\" json:\"phashes\"`\n\tDistance int     `db:\"distance\" json:\"distance\"`\n\tHashes   []int64 `db:\"hashes\" json:\"hashes\"`\n}\n\ntype FindScenesByFullFingerprintsWithHashRow struct {\n\tScene Scene `db:\"scene\" json:\"scene\"`\n\tHash  int64 `db:\"hash\" json:\"hash\"`\n}\n\n// Scene fingerprints (use fingerprint.sql for most fingerprint operations)\nfunc (q *Queries) FindScenesByFullFingerprintsWithHash(ctx context.Context, arg FindScenesByFullFingerprintsWithHashParams) ([]FindScenesByFullFingerprintsWithHashRow, error) {\n\trows, err := q.db.Query(ctx, findScenesByFullFingerprintsWithHash, arg.Phashes, arg.Distance, arg.Hashes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []FindScenesByFullFingerprintsWithHashRow{}\n\tfor rows.Next() {\n\t\tvar i FindScenesByFullFingerprintsWithHashRow\n\t\tif err := rows.Scan(\n\t\t\t&i.Scene.ID,\n\t\t\t&i.Scene.Title,\n\t\t\t&i.Scene.Details,\n\t\t\t&i.Scene.StudioID,\n\t\t\t&i.Scene.CreatedAt,\n\t\t\t&i.Scene.UpdatedAt,\n\t\t\t&i.Scene.Duration,\n\t\t\t&i.Scene.Director,\n\t\t\t&i.Scene.Deleted,\n\t\t\t&i.Scene.Code,\n\t\t\t&i.Scene.Date,\n\t\t\t&i.Scene.ProductionDate,\n\t\t\t&i.Hash,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getScenePerformers = `-- name: GetScenePerformers :many\nSELECT p.id, p.name, p.disambiguation, p.gender, p.ethnicity, p.country, p.eye_color, p.hair_color, p.height, p.cup_size, p.band_size, p.hip_size, p.waist_size, p.breast_type, p.career_start_year, p.career_end_year, p.created_at, p.updated_at, p.deleted, p.birthdate, p.deathdate, \"as\" FROM scene_performers SP JOIN performers P ON SP.performer_id = P.id WHERE scene_id = $1\n`\n\ntype GetScenePerformersRow struct {\n\tPerformer Performer `db:\"performer\" json:\"performer\"`\n\tAs        *string   `db:\"as\" json:\"as\"`\n}\n\nfunc (q *Queries) GetScenePerformers(ctx context.Context, sceneID uuid.UUID) ([]GetScenePerformersRow, error) {\n\trows, err := q.db.Query(ctx, getScenePerformers, sceneID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []GetScenePerformersRow{}\n\tfor rows.Next() {\n\t\tvar i GetScenePerformersRow\n\t\tif err := rows.Scan(\n\t\t\t&i.Performer.ID,\n\t\t\t&i.Performer.Name,\n\t\t\t&i.Performer.Disambiguation,\n\t\t\t&i.Performer.Gender,\n\t\t\t&i.Performer.Ethnicity,\n\t\t\t&i.Performer.Country,\n\t\t\t&i.Performer.EyeColor,\n\t\t\t&i.Performer.HairColor,\n\t\t\t&i.Performer.Height,\n\t\t\t&i.Performer.CupSize,\n\t\t\t&i.Performer.BandSize,\n\t\t\t&i.Performer.HipSize,\n\t\t\t&i.Performer.WaistSize,\n\t\t\t&i.Performer.BreastType,\n\t\t\t&i.Performer.CareerStartYear,\n\t\t\t&i.Performer.CareerEndYear,\n\t\t\t&i.Performer.CreatedAt,\n\t\t\t&i.Performer.UpdatedAt,\n\t\t\t&i.Performer.Deleted,\n\t\t\t&i.Performer.Birthdate,\n\t\t\t&i.Performer.Deathdate,\n\t\t\t&i.As,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getSceneURLs = `-- name: GetSceneURLs :many\nSELECT url, site_id FROM scene_urls WHERE scene_id = $1\n`\n\ntype GetSceneURLsRow struct {\n\tUrl    string    `db:\"url\" json:\"url\"`\n\tSiteID uuid.UUID `db:\"site_id\" json:\"site_id\"`\n}\n\nfunc (q *Queries) GetSceneURLs(ctx context.Context, sceneID uuid.UUID) ([]GetSceneURLsRow, error) {\n\trows, err := q.db.Query(ctx, getSceneURLs, sceneID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []GetSceneURLsRow{}\n\tfor rows.Next() {\n\t\tvar i GetSceneURLsRow\n\t\tif err := rows.Scan(&i.Url, &i.SiteID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getScenes = `-- name: GetScenes :many\nSELECT id, title, details, studio_id, created_at, updated_at, duration, director, deleted, code, date, production_date FROM scenes WHERE id = ANY($1::UUID[]) ORDER BY title\n`\n\nfunc (q *Queries) GetScenes(ctx context.Context, dollar_1 []uuid.UUID) ([]Scene, error) {\n\trows, err := q.db.Query(ctx, getScenes, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Scene{}\n\tfor rows.Next() {\n\t\tvar i Scene\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Title,\n\t\t\t&i.Details,\n\t\t\t&i.StudioID,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Duration,\n\t\t\t&i.Director,\n\t\t\t&i.Deleted,\n\t\t\t&i.Code,\n\t\t\t&i.Date,\n\t\t\t&i.ProductionDate,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst searchScenes = `-- name: SearchScenes :many\nSELECT\n    scene_id,\n    pdb.agg('{\"value_count\": {\"field\": \"scene_id\"}}') OVER () as total_count\nFROM scene_search\nWHERE scene_id @@@ paradedb.disjunction_max(disjuncts => ARRAY[\n    paradedb.match(field => 'scene_title', value => $1::TEXT),\n    paradedb.match(field => 'scene_code', value => $1::TEXT),\n    paradedb.boolean(\n        should => ARRAY[\n            paradedb.match(field => 'performer_names', value => $1::TEXT),\n            paradedb.match(field => 'studio_name', value => $1::TEXT),\n            paradedb.match(field => 'network_name', value => $1::TEXT)\n        ]\n    )\n])\nORDER BY pdb.score(scene_id) DESC\nLIMIT $3 OFFSET $2\n`\n\ntype SearchScenesParams struct {\n\tTerm   *string `db:\"term\" json:\"term\"`\n\tOffset int32   `db:\"offset\" json:\"offset\"`\n\tLimit  int32   `db:\"limit\" json:\"limit\"`\n}\n\ntype SearchScenesRow struct {\n\tSceneID    uuid.UUID   `db:\"scene_id\" json:\"scene_id\"`\n\tTotalCount interface{} `db:\"total_count\" json:\"total_count\"`\n}\n\nfunc (q *Queries) SearchScenes(ctx context.Context, arg SearchScenesParams) ([]SearchScenesRow, error) {\n\trows, err := q.db.Query(ctx, searchScenes, arg.Term, arg.Offset, arg.Limit)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []SearchScenesRow{}\n\tfor rows.Next() {\n\t\tvar i SearchScenesRow\n\t\tif err := rows.Scan(&i.SceneID, &i.TotalCount); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst softDeleteScene = `-- name: SoftDeleteScene :one\nUPDATE scenes SET deleted = true, updated_at = NOW() WHERE id = $1\nRETURNING id, title, details, studio_id, created_at, updated_at, duration, director, deleted, code, date, production_date\n`\n\nfunc (q *Queries) SoftDeleteScene(ctx context.Context, id uuid.UUID) (Scene, error) {\n\trow := q.db.QueryRow(ctx, softDeleteScene, id)\n\tvar i Scene\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Title,\n\t\t&i.Details,\n\t\t&i.StudioID,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Duration,\n\t\t&i.Director,\n\t\t&i.Deleted,\n\t\t&i.Code,\n\t\t&i.Date,\n\t\t&i.ProductionDate,\n\t)\n\treturn i, err\n}\n\nconst updateScene = `-- name: UpdateScene :one\nUPDATE scenes \nSET title = $2, details = $3, date = $4, production_date = $5, studio_id = $6, \n    duration = $7, director = $8, code = $9, updated_at = now()\nWHERE id = $1\nRETURNING id, title, details, studio_id, created_at, updated_at, duration, director, deleted, code, date, production_date\n`\n\ntype UpdateSceneParams struct {\n\tID             uuid.UUID     `db:\"id\" json:\"id\"`\n\tTitle          *string       `db:\"title\" json:\"title\"`\n\tDetails        *string       `db:\"details\" json:\"details\"`\n\tDate           *string       `db:\"date\" json:\"date\"`\n\tProductionDate *string       `db:\"production_date\" json:\"production_date\"`\n\tStudioID       uuid.NullUUID `db:\"studio_id\" json:\"studio_id\"`\n\tDuration       *int          `db:\"duration\" json:\"duration\"`\n\tDirector       *string       `db:\"director\" json:\"director\"`\n\tCode           *string       `db:\"code\" json:\"code\"`\n}\n\nfunc (q *Queries) UpdateScene(ctx context.Context, arg UpdateSceneParams) (Scene, error) {\n\trow := q.db.QueryRow(ctx, updateScene,\n\t\targ.ID,\n\t\targ.Title,\n\t\targ.Details,\n\t\targ.Date,\n\t\targ.ProductionDate,\n\t\targ.StudioID,\n\t\targ.Duration,\n\t\targ.Director,\n\t\targ.Code,\n\t)\n\tvar i Scene\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Title,\n\t\t&i.Details,\n\t\t&i.StudioID,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Duration,\n\t\t&i.Director,\n\t\t&i.Deleted,\n\t\t&i.Code,\n\t\t&i.Date,\n\t\t&i.ProductionDate,\n\t)\n\treturn i, err\n}\n\nconst updateSceneRedirects = `-- name: UpdateSceneRedirects :exec\nUPDATE scene_redirects SET target_id = $1 WHERE target_id = $2\n`\n\ntype UpdateSceneRedirectsParams struct {\n\tNewTargetID uuid.UUID `db:\"new_target_id\" json:\"new_target_id\"`\n\tOldTargetID uuid.UUID `db:\"old_target_id\" json:\"old_target_id\"`\n}\n\nfunc (q *Queries) UpdateSceneRedirects(ctx context.Context, arg UpdateSceneRedirectsParams) error {\n\t_, err := q.db.Exec(ctx, updateSceneRedirects, arg.NewTargetID, arg.OldTargetID)\n\treturn err\n}\n\nconst updateSceneStudios = `-- name: UpdateSceneStudios :exec\nUPDATE scenes SET studio_id = $1 WHERE studio_id = $2\n`\n\ntype UpdateSceneStudiosParams struct {\n\tTargetID uuid.NullUUID `db:\"target_id\" json:\"target_id\"`\n\tSourceID uuid.NullUUID `db:\"source_id\" json:\"source_id\"`\n}\n\nfunc (q *Queries) UpdateSceneStudios(ctx context.Context, arg UpdateSceneStudiosParams) error {\n\t_, err := q.db.Exec(ctx, updateSceneStudios, arg.TargetID, arg.SourceID)\n\treturn err\n}\n"
  },
  {
    "path": "internal/queries/site.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: site.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\nconst createSite = `-- name: CreateSite :one\n\nINSERT INTO sites (id, name, description, url, regex, valid_types, created_at, updated_at)\nVALUES ($1, $2, $3, $4, $5, $6, now(), now())\nRETURNING id, name, description, url, regex, valid_types, created_at, updated_at\n`\n\ntype CreateSiteParams struct {\n\tID          uuid.UUID `db:\"id\" json:\"id\"`\n\tName        string    `db:\"name\" json:\"name\"`\n\tDescription *string   `db:\"description\" json:\"description\"`\n\tUrl         *string   `db:\"url\" json:\"url\"`\n\tRegex       *string   `db:\"regex\" json:\"regex\"`\n\tValidTypes  []string  `db:\"valid_types\" json:\"valid_types\"`\n}\n\n// Site queries\nfunc (q *Queries) CreateSite(ctx context.Context, arg CreateSiteParams) (Site, error) {\n\trow := q.db.QueryRow(ctx, createSite,\n\t\targ.ID,\n\t\targ.Name,\n\t\targ.Description,\n\t\targ.Url,\n\t\targ.Regex,\n\t\targ.ValidTypes,\n\t)\n\tvar i Site\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Description,\n\t\t&i.Url,\n\t\t&i.Regex,\n\t\t&i.ValidTypes,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t)\n\treturn i, err\n}\n\nconst deleteSite = `-- name: DeleteSite :exec\nDELETE FROM sites WHERE id = $1\n`\n\nfunc (q *Queries) DeleteSite(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteSite, id)\n\treturn err\n}\n\nconst findSitesByIds = `-- name: FindSitesByIds :many\nSELECT id, name, description, url, regex, valid_types, created_at, updated_at FROM sites WHERE id = ANY($1::UUID[])\n`\n\nfunc (q *Queries) FindSitesByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]Site, error) {\n\trows, err := q.db.Query(ctx, findSitesByIds, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Site{}\n\tfor rows.Next() {\n\t\tvar i Site\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Name,\n\t\t\t&i.Description,\n\t\t\t&i.Url,\n\t\t\t&i.Regex,\n\t\t\t&i.ValidTypes,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getSite = `-- name: GetSite :one\nSELECT id, name, description, url, regex, valid_types, created_at, updated_at FROM sites WHERE id = $1\n`\n\nfunc (q *Queries) GetSite(ctx context.Context, id uuid.UUID) (Site, error) {\n\trow := q.db.QueryRow(ctx, getSite, id)\n\tvar i Site\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Description,\n\t\t&i.Url,\n\t\t&i.Regex,\n\t\t&i.ValidTypes,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t)\n\treturn i, err\n}\n\nconst updateSite = `-- name: UpdateSite :one\nUPDATE sites \nSET name = $2, description = $3, url = $4, regex = $5, valid_types = $6, updated_at = now()\nWHERE id = $1\nRETURNING id, name, description, url, regex, valid_types, created_at, updated_at\n`\n\ntype UpdateSiteParams struct {\n\tID          uuid.UUID `db:\"id\" json:\"id\"`\n\tName        string    `db:\"name\" json:\"name\"`\n\tDescription *string   `db:\"description\" json:\"description\"`\n\tUrl         *string   `db:\"url\" json:\"url\"`\n\tRegex       *string   `db:\"regex\" json:\"regex\"`\n\tValidTypes  []string  `db:\"valid_types\" json:\"valid_types\"`\n}\n\nfunc (q *Queries) UpdateSite(ctx context.Context, arg UpdateSiteParams) (Site, error) {\n\trow := q.db.QueryRow(ctx, updateSite,\n\t\targ.ID,\n\t\targ.Name,\n\t\targ.Description,\n\t\targ.Url,\n\t\targ.Regex,\n\t\targ.ValidTypes,\n\t)\n\tvar i Site\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Description,\n\t\t&i.Url,\n\t\t&i.Regex,\n\t\t&i.ValidTypes,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t)\n\treturn i, err\n}\n"
  },
  {
    "path": "internal/queries/sql/draft.sql",
    "content": "-- Draft queries\n\n-- name: CreateDraft :one\nINSERT INTO drafts (id, user_id, type, data, created_at)\nVALUES ($1, $2, $3, $4, now())\nRETURNING *;\n\n-- name: DeleteDraft :exec\nDELETE FROM drafts WHERE id = $1;\n\n-- name: FindDraft :one\nSELECT * FROM drafts WHERE id = $1;\n\n-- name: FindDraftsByUser :many\nSELECT * FROM drafts WHERE user_id = $1;\n\n-- name: DeleteExpiredDrafts :exec\nDELETE FROM drafts WHERE created_at <= (now()::timestamp - (INTERVAL '1 second' * $1));\n"
  },
  {
    "path": "internal/queries/sql/edit.sql",
    "content": "-- Edit queries\n\n-- name: CreateEdit :one\nINSERT INTO edits (\n    id, user_id, target_type, operation, data, votes, status, applied, bot,\n    created_at\n)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, now())\nRETURNING *;\n\n-- name: UpdateEdit :one\nUPDATE edits \nSET data = $2, votes = $3,\n    status = $4, applied = $5, closed_at = $6, update_count = $7, updated_at = now()\nWHERE id = $1\nRETURNING *;\n\n-- name: DeleteEdit :exec\nDELETE FROM edits WHERE id = $1;\n\n-- name: FindEdit :one\nSELECT * FROM edits WHERE id = $1;\n\n-- name: CancelUserEdits :exec\nUPDATE edits SET status = 'CANCELED', updated_at = NOW() WHERE user_id = $1;\n\n-- name: FindPendingPerformerCreation :many\nSELECT * FROM edits\nWHERE status = 'PENDING'\nAND target_type = 'PERFORMER'\nAND (\n    (sqlc.narg('name')::text IS NOT NULL AND data->'new_data'->>'name' = sqlc.narg('name'))\n    OR\n    (sqlc.narg('urls')::text[] IS NOT NULL AND jsonb_exists_any(jsonb_path_query_array(data, '$.new_data.added_urls[*].url'), sqlc.narg('urls')))\n);\n\n-- name: FindPendingSceneCreation :many\nSELECT * FROM edits\nWHERE status = 'PENDING'\nAND target_type = 'SCENE'\nAND (\n    (sqlc.narg('title')::text IS NOT NULL AND sqlc.narg('studio_id')::uuid IS NOT NULL\n     AND data->'new_data'->>'title' = sqlc.narg('title')\n     AND (data->'new_data'->>'studio_id')::uuid = sqlc.narg('studio_id'))\n    OR\n    (sqlc.narg('hashes')::text[] IS NOT NULL AND jsonb_exists_any(jsonb_path_query_array(data, '$.new_data.added_fingerprints[*].hash'), sqlc.narg('hashes')))\n);\n\n-- name: GetEditsByPerformer :many\nSELECT e.* FROM edits e\nJOIN performer_edits pe ON e.id = pe.edit_id\nWHERE pe.performer_id = $1\nORDER BY e.created_at DESC;\n\n-- name: GetEditsByStudio :many\nSELECT e.* FROM edits e\nJOIN studio_edits se ON e.id = se.edit_id\nWHERE se.studio_id = $1\nORDER BY e.created_at DESC;\n\n-- name: CreateTagEdit :exec\nINSERT INTO tag_edits (edit_id, tag_id) VALUES ($1, $2);\n\n-- name: CreateStudioEdit :exec\nINSERT INTO studio_edits (edit_id, studio_id) VALUES ($1, $2);\n\n-- name: CreateSceneEdit :exec\nINSERT INTO scene_edits (edit_id, scene_id) VALUES ($1, $2);\n\n-- name: CreatePerformerEdit :exec\nINSERT INTO performer_edits (edit_id, performer_id) VALUES ($1, $2);\n\n-- name: GetEditsByTag :many\nSELECT e.* FROM edits e\nJOIN tag_edits te ON e.id = te.edit_id\nWHERE te.tag_id = $1\nORDER BY e.created_at DESC;\n\n-- name: GetEditsByScene :many\nSELECT e.* FROM edits e\nJOIN scene_edits se ON e.id = se.edit_id\nWHERE se.scene_id = $1\nORDER BY e.created_at DESC;\n\n-- Edit comments\n\n-- name: CreateEditComment :one\nINSERT INTO edit_comments (id, edit_id, user_id, text, created_at)\nVALUES ($1, $2, $3, $4, NOW())\nRETURNING *;\n\n-- name: GetEditComments :many\nSELECT * FROM edit_comments WHERE edit_id = $1 ORDER BY created_at ASC;\n\n-- Edit votes\n\n-- name: CreateEditVote :exec\nINSERT INTO edit_votes (edit_id, user_id, vote, created_at) VALUES ($1, $2, $3, NOW())\nON CONFLICT(edit_id, user_id)\nDO UPDATE SET (vote, created_at) = ($3, NOW());\n\n-- name: GetEditVotes :many\nSELECT * FROM edit_votes WHERE edit_id = $1;\n\n-- name: ResetVotes :exec\nUPDATE edit_votes\nSET vote = 'ABSTAIN'\nWHERE edit_id = $1;\n\n-- URL merging queries for edits\n\n-- name: GetMergedURLsForEdit :many\n-- result: URL\n-- Gets current URLs for target entity and merges with edit's added_urls/removed_urls\nWITH current_urls AS (\n    SELECT su.url, su.site_id FROM edits e\n    JOIN scene_edits se ON e.id = se.edit_id \n    JOIN scene_urls su ON se.scene_id = su.scene_id\n    WHERE e.id = $1 AND e.target_type = 'SCENE'\n    UNION ALL\n    SELECT pu.url, pu.site_id FROM edits e  \n    JOIN performer_edits pe ON e.id = pe.edit_id\n    JOIN performer_urls pu ON pe.performer_id = pu.performer_id  \n    WHERE e.id = $1 AND e.target_type = 'PERFORMER'\n    UNION ALL\n    SELECT stu.url, stu.site_id FROM edits e\n    JOIN studio_edits ste ON e.id = ste.edit_id\n    JOIN studio_urls stu ON ste.studio_id = stu.studio_id\n    WHERE e.id = $1 AND e.target_type = 'STUDIO'\n),\nremoved_urls AS (\n    SELECT\n        elem->>'url' AS url,\n        (elem->>'site_id')::uuid AS site_id\n    FROM edits, jsonb_array_elements(COALESCE(data->'new_data'->'removed_urls', '[]'::jsonb)) AS elem\n    WHERE id = $1\n),\nadded_urls AS (\n    SELECT\n        elem->>'url' AS url,\n        (elem->>'site_id')::uuid AS site_id\n    FROM edits, jsonb_array_elements(COALESCE(data->'new_data'->'added_urls', '[]'::jsonb)) AS elem\n    WHERE id = $1\n),\nfinal_urls AS (\n    SELECT url, site_id FROM current_urls\n    WHERE (url, site_id) NOT IN (SELECT url, site_id FROM removed_urls)\n    UNION\n    SELECT url, site_id FROM added_urls\n)\nSELECT DISTINCT url, site_id FROM final_urls\nORDER BY url;\n\n-- name: GetImagesForEdit :many\n-- Gets current images for target entity and merges with edit's added_images/removed_images\nWITH edit AS (\n  SELECT * FROM edits WHERE edits.id = $1\n), current_images AS (\n    SELECT si.image_id FROM edit e\n    JOIN scene_edits se ON e.id = se.edit_id\n    JOIN scene_images si ON se.scene_id = si.scene_id\n    UNION ALL\n    SELECT pi.image_id FROM edit e\n    JOIN performer_edits pe ON e.id = pe.edit_id\n    JOIN performer_images pi ON pe.performer_id = pi.performer_id\n    UNION ALL\n    SELECT sti.image_id FROM edit e\n    JOIN studio_edits ste ON e.id = ste.edit_id\n    JOIN studio_images sti ON ste.studio_id = sti.studio_id\n),\nremoved_images AS (\n    SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'removed_images', '[]'::jsonb))::uuid AS image_id\n    FROM edit\n),\nadded_images AS (\n    SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'added_images', '[]'::jsonb))::uuid AS image_id\n    FROM edit\n),\nfinal_images AS (\n    SELECT image_id FROM current_images\n    WHERE image_id NOT IN (SELECT image_id FROM removed_images)\n    UNION\n    SELECT image_id FROM added_images\n)\nSELECT i.* FROM final_images fi\nJOIN images i ON fi.image_id = i.id\nORDER BY i.id;\n\n-- name: GetEditTargetID :one\nSELECT CASE e.target_type\n            WHEN 'SCENE' THEN se.scene_id\n            WHEN 'PERFORMER' THEN pe.performer_id\n            WHEN 'STUDIO' THEN ste.studio_id\n            WHEN 'TAG' THEN te.tag_id\n       END::UUID AS id, e.target_type\nFROM edits e\nLEFT JOIN scene_edits se ON e.id = se.edit_id\nLEFT JOIN performer_edits pe ON e.id = pe.edit_id\nLEFT JOIN studio_edits ste ON e.id = ste.edit_id\nLEFT JOIN tag_edits te ON e.id = te.edit_id\nWHERE e.id = $1;\n\n-- name: GetEditPerformerAliases :many\nWITH edit AS (\n  SELECT * FROM edits WHERE id = $1\n)\n(\n  SELECT alias\n  FROM edit E\n  JOIN performer_edits PE ON E.id = PE.edit_id\n  JOIN performer_aliases PA ON PE.performer_id = PA.performer_id\n  EXCEPT\n  SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'removed_aliases', '[]'::jsonb)) AS alias FROM edit\n)\nUNION\nSELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'added_aliases', '[]'::jsonb)) AS alias FROM edit;\n\n-- name: GetEditPerformerTattoos :many\nWITH edit AS (\n  SELECT * FROM edits WHERE id = $1\n),\ncurrent_tattoos AS (\n    SELECT location, description\n    FROM edit E\n    JOIN performer_edits PE ON E.id = PE.edit_id\n    JOIN performer_tattoos PT ON PE.performer_id = PT.performer_id\n),\nremoved_tattoos AS (\n    SELECT\n        elem->>'location' AS location,\n        elem->>'description' AS description\n    FROM edit, jsonb_array_elements(COALESCE(data->'new_data'->'removed_tattoos', '[]'::jsonb)) AS elem\n),\nadded_tattoos AS (\n    SELECT\n        elem->>'location' AS location,\n        elem->>'description' AS description\n    FROM edit, jsonb_array_elements(COALESCE(data->'new_data'->'added_tattoos', '[]'::jsonb)) AS elem\n),\nfinal_tattoos AS (\n    SELECT * FROM current_tattoos\n    EXCEPT\n    SELECT * FROM removed_tattoos\n    UNION\n    SELECT * FROM added_tattoos\n)\nSELECT DISTINCT location, description FROM final_tattoos;\n\n-- name: GetEditPerformerPiercings :many\nWITH edit AS (\n  SELECT * FROM edits WHERE id = $1\n),\ncurrent_piercings AS (\n    SELECT location, description\n    FROM edit E\n    JOIN performer_edits PE ON E.id = PE.edit_id\n    JOIN performer_piercings PP ON PE.performer_id = PP.performer_id\n),\nremoved_piercings AS (\n    SELECT\n        elem->>'location' AS location,\n        elem->>'description' AS description\n    FROM edit, jsonb_array_elements(COALESCE(data->'new_data'->'removed_piercings', '[]'::jsonb)) AS elem\n),\nadded_piercings AS (\n    SELECT\n        elem->>'location' AS location,\n        elem->>'description' AS description\n    FROM edit, jsonb_array_elements(COALESCE(data->'new_data'->'added_piercings', '[]'::jsonb)) AS elem\n),\nfinal_piercings AS (\n    SELECT * FROM current_piercings\n    EXCEPT\n    SELECT * FROM removed_piercings\n    UNION\n    SELECT * FROM added_piercings\n)\nSELECT DISTINCT location, description FROM final_piercings;\n\n-- name: GetMergedTagsForEdit :many\n-- Gets current tags for target entity and merges with edit's added_tags/removed_tags\nWITH edit AS (\n  SELECT * FROM edits WHERE edits.id = $1\n), current_tags AS (\n    SELECT st.tag_id FROM edit e\n    JOIN scene_edits se ON e.id = se.edit_id\n    JOIN scene_tags st ON se.scene_id = st.scene_id\n    WHERE e.target_type = 'SCENE'\n),\nremoved_tags AS (\n    SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'removed_tags', '[]'::jsonb))::uuid AS tag_id\n    FROM edit\n),\nadded_tags AS (\n    SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'added_tags', '[]'::jsonb))::uuid AS tag_id\n    FROM edit\n),\nfinal_tags AS (\n    SELECT tag_id FROM current_tags\n    EXCEPT\n    SELECT tag_id FROM removed_tags\n    UNION\n    SELECT tag_id FROM added_tags\n)\nSELECT t.* FROM final_tags ft\nJOIN tags t ON ft.tag_id = t.id\nWHERE t.deleted = FALSE\nORDER BY t.name;\n\n-- name: GetMergedPerformersForEdit :many\n-- Gets current performers for target entity and merges with edit's added_performers/removed_performers\nWITH edit AS (\n  SELECT * FROM edits WHERE edits.id = $1\n), current_performers AS (\n    SELECT sp.performer_id, sp.\"as\" FROM edit e\n    JOIN scene_edits se ON e.id = se.edit_id\n    JOIN scene_performers sp ON se.scene_id = sp.scene_id\n    WHERE e.target_type = 'SCENE'\n),\nremoved_performers AS (\n    SELECT\n        (elem->>'performer_id')::uuid AS performer_id,\n        elem->>'as' AS \"as\"\n    FROM edit, jsonb_array_elements(COALESCE(data->'new_data'->'removed_performers', '[]'::jsonb)) AS elem\n),\nadded_performers AS (\n    SELECT\n        (elem->>'performer_id')::uuid AS performer_id,\n        elem->>'as' AS \"as\"\n    FROM edit, jsonb_array_elements(COALESCE(data->'new_data'->'added_performers', '[]'::jsonb)) AS elem\n),\nfinal_performers AS (\n    SELECT performer_id, \"as\" FROM current_performers\n    EXCEPT\n    SELECT performer_id, \"as\" FROM removed_performers\n    UNION\n    SELECT performer_id, \"as\" FROM added_performers\n)\nSELECT sqlc.embed(p), fp.\"as\" FROM final_performers fp\nJOIN performers p ON fp.performer_id = p.id\nWHERE p.deleted = FALSE\nORDER BY p.name;\n\n-- name: GetMergedStudioAliasesForEdit :many\n-- Gets current aliases for target studio entity and merges with edit's added_aliases/removed_aliases\nWITH edit AS (\n  SELECT * FROM edits WHERE id = $1\n)\n(\n  SELECT alias\n  FROM edit E\n  JOIN studio_edits SE ON E.id = SE.edit_id\n  JOIN studio_aliases SA ON SE.studio_id = SA.studio_id\n  WHERE E.target_type = 'STUDIO'\n  EXCEPT\n  SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'removed_aliases', '[]'::jsonb)) AS alias FROM edit\n)\nUNION\nSELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'added_aliases', '[]'::jsonb)) AS alias FROM edit;\n\n-- name: GetMergedTagAliasesForEdit :many\n-- Gets current aliases for target tag entity and merges with edit's added_aliases/removed_aliases\nWITH edit AS (\n  SELECT * FROM edits WHERE id = $1\n)\n(\n  SELECT alias\n  FROM edit E\n  JOIN tag_edits TE ON E.id = TE.edit_id\n  JOIN tag_aliases TA ON TE.tag_id = TA.tag_id\n  EXCEPT\n  SELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'removed_aliases', '[]'::jsonb)) AS alias FROM edit\n)\nUNION\nSELECT jsonb_array_elements_text(COALESCE(data->'new_data'->'added_aliases', '[]'::jsonb)) AS alias FROM edit;\n\n-- name: FindCompletedEdits :many\n-- Returns pending edits that fulfill one of the criteria for being closed:\n-- * The full voting period has passed\n-- * The minimum voting period has passed, and the number of votes has crossed the voting threshold.\n-- The latter only applies for destructive edits. Non-destructive edits get auto-applied when sufficient votes are cast.\nSELECT * FROM edits\nWHERE status = 'PENDING'\nAND (\n    (created_at <= (now()::timestamp - (INTERVAL '1 second' * sqlc.arg('voting_period'))) AND updated_at IS NULL)\n    OR\n    (updated_at <= (now()::timestamp - (INTERVAL '1 second' * sqlc.arg('voting_period'))) AND updated_at IS NOT NULL)\n    OR (\n        votes >= sqlc.arg('minimum_votes')\n        AND (\n            (created_at <= (now()::timestamp - (INTERVAL '1 second' * sqlc.arg('minimum_voting_period'))) AND updated_at IS NULL)\n            OR\n            (updated_at <= (now()::timestamp - (INTERVAL '1 second' * sqlc.arg('minimum_voting_period'))) AND updated_at IS NOT NULL)\n        )\n    )\n);\n\n-- name: GetEditsByIds :many\nSELECT * FROM edits WHERE id = ANY($1::UUID[]);\n\n-- name: GetEditCommentsByIds :many\nSELECT * FROM edit_comments WHERE id = ANY($1::UUID[]);\n\n-- name: UpdateEditData :one\nUPDATE edits SET data = $2, updated_at = now() WHERE id = $1 RETURNING *;\n"
  },
  {
    "path": "internal/queries/sql/fingerprint.sql",
    "content": "-- Fingerprint queries (normalized schema)\n\n-- name: CreateFingerprint :one\nINSERT INTO fingerprints (hash, algorithm) VALUES ($1, $2)\nON CONFLICT (hash, algorithm) DO UPDATE SET hash = EXCLUDED.hash\nRETURNING *;\n\n-- name: GetFingerprint :one\nSELECT * FROM fingerprints WHERE hash = $1 AND algorithm = $2;\n\n-- name: SubmittedHashExists :one\nSELECT EXISTS(\n\t\tSELECT\n\t\t\t1\n\t\tFROM scene_fingerprints f\n\t\tJOIN fingerprints fp ON f.fingerprint_id = fp.id\n\t\tWHERE f.scene_id = $1 AND fp.hash = $2 AND fp.algorithm = $3 AND f.vote = 1\n) AS exists;\n\n-- name: CreateSceneFingerprints :copyfrom\nINSERT INTO scene_fingerprints (fingerprint_id, scene_id, user_id, duration) VALUES ($1, $2, $3, $4);\n\n-- name: CreateOrReplaceFingerprint :exec\nINSERT INTO scene_fingerprints (fingerprint_id, scene_id, user_id, duration, vote)\nVALUES ($1, $2, $3, $4, $5)\nON CONFLICT ON CONSTRAINT scene_fingerprints_scene_id_fingerprint_id_user_id_key\nDO UPDATE SET\n    duration = EXCLUDED.duration,\n    vote = EXCLUDED.vote;\n\n-- name: DeleteSceneFingerprintsByScene :exec\nDELETE FROM scene_fingerprints WHERE scene_id = $1;\n\n-- name: DeleteSceneFingerprint :exec\nDELETE FROM scene_fingerprints SFP\nUSING fingerprints FP\nWHERE SFP.fingerprint_id = FP.id\nAND FP.hash = $1\nAND FP.algorithm = $2\nAND user_id = $3\nAND scene_id = $4;\n\n-- name: GetAllSceneFingerprints :many\nSELECT f.algorithm, f.hash, sf.duration, sf.created_at, sf.user_id\nFROM scene_fingerprints sf\nJOIN fingerprints f ON sf.fingerprint_id = f.id\nWHERE sf.scene_id = $1\nORDER BY f.algorithm, sf.created_at;\n\n-- name: GetAllFingerprints :many\n-- Get all fingerprints for multiple scenes with aggregated vote data\n-- When onlySubmitted is true, pass the actual user ID, when false pass NULL\nSELECT\n    SFP.scene_id,\n    FP.hash,\n    FP.algorithm,\n    mode() WITHIN GROUP (ORDER BY SFP.duration)::INTEGER as duration,\n    COUNT(CASE WHEN SFP.vote = 1 THEN 1 END) as submissions,\n    COUNT(CASE WHEN SFP.vote = -1 THEN 1 END) as reports,\n    SUM(SFP.vote) as net_submissions,\n    MIN(SFP.created_at)::TIMESTAMP as created_at,\n    MAX(SFP.created_at)::TIMESTAMP as updated_at,\n    bool_or(SFP.user_id = sqlc.arg(current_user_id) AND SFP.vote = 1) as user_submitted,\n    bool_or(SFP.user_id = sqlc.arg(current_user_id) AND SFP.vote = -1) as user_reported\nFROM scene_fingerprints SFP\nJOIN fingerprints FP ON SFP.fingerprint_id = FP.id\nWHERE SFP.scene_id = ANY(sqlc.arg(scene_ids)::UUID[])\n  AND (sqlc.narg(filter_user_id)::uuid IS NULL OR SFP.user_id = sqlc.narg(filter_user_id))\nGROUP BY SFP.scene_id, FP.algorithm, FP.hash\nORDER BY net_submissions DESC;\n\n-- name: MoveSceneFingerprintSubmissions :execrows\nWITH to_move AS (\n  SELECT SFP.fingerprint_id, SFP.user_id\n  FROM scene_fingerprints SFP\n  JOIN fingerprints FP ON SFP.fingerprint_id = FP.id\n  WHERE FP.hash = sqlc.arg(hash)\n    AND FP.algorithm = sqlc.arg(algorithm)\n    AND SFP.scene_id = sqlc.arg(source_scene_id)\n),\ndeleted AS (\n  DELETE FROM scene_fingerprints\n  WHERE scene_id = sqlc.arg(target_scene_id)\n    AND (fingerprint_id, user_id) IN (SELECT fingerprint_id, user_id FROM to_move)\n)\nUPDATE scene_fingerprints SFP\nSET scene_id = sqlc.arg(target_scene_id)\nFROM fingerprints FP\nWHERE SFP.fingerprint_id = FP.id\n  AND FP.hash = sqlc.arg(hash)\n  AND FP.algorithm = sqlc.arg(algorithm)\n  AND SFP.scene_id = sqlc.arg(source_scene_id);\n\n-- name: DeleteAllSceneFingerprintSubmissions :execrows\nDELETE FROM scene_fingerprints SFP\nUSING fingerprints FP\nWHERE SFP.fingerprint_id = FP.id\n  AND FP.hash = $1\n  AND FP.algorithm = $2\n  AND SFP.scene_id = $3;\n"
  },
  {
    "path": "internal/queries/sql/image.sql",
    "content": "-- Image queries\n\n-- name: CreateImage :one\nINSERT INTO images (id, url, width, height, checksum)\nVALUES ($1, $2, $3, $4, $5)\nRETURNING *;\n\n-- name: DeleteImage :exec\nDELETE FROM images WHERE id = $1;\n\n-- name: FindImage :one\nSELECT * FROM images WHERE id = $1;\n\n-- name: FindImageByChecksum :one\nSELECT * FROM images WHERE checksum = $1;\n\n-- name: FindImagesBySceneID :many\nSELECT images.* FROM images\nLEFT JOIN scene_images as scenes_join on scenes_join.image_id = images.id\nLEFT JOIN scenes on scenes_join.scene_id = scenes.id\nWHERE scenes.id = $1;\n\n-- name: FindImagesByStudioID :many\nSELECT images.* FROM images\nLEFT JOIN studio_images as studios_join on studios_join.image_id = images.id\nLEFT JOIN studios on studios_join.studio_id = studios.id\nWHERE studios.id = $1;\n\n-- name: FindImagesByIds :many\nSELECT * FROM images WHERE id = ANY($1::UUID[]);\n\n-- name: FindUnusedImages :many\nSELECT images.* from images\nLEFT JOIN scene_images ON scene_images.image_id = images.id\nLEFT JOIN performer_images ON performer_images.image_id = images.id\nLEFT JOIN studio_images ON studio_images.image_id = images.id\nLEFT JOIN (\n    SELECT (jsonb_array_elements(data#>'{new_data,added_images}')->>0)::uuid AS image_id\n    FROM edits\n    WHERE status = 'PENDING'\n) edit_images ON edit_images.image_id = images.id\nLEFT JOIN (\n    SELECT id, (data->>'image')::uuid AS image_id\n    FROM drafts\n) drafts ON images.id = drafts.image_id\nWHERE scene_images.scene_id IS NULL\nAND performer_images.performer_id IS NULL\nAND studio_images.studio_id IS NULL\nAND edit_images.image_id IS NULL\nAND drafts.id IS NULL\nLIMIT 1000;\n\n-- name: IsImageUnused :one\nSELECT COUNT(*) > 0 AS unused from images\nLEFT JOIN scene_images ON scene_images.image_id = images.id\nLEFT JOIN performer_images ON performer_images.image_id = images.id\nLEFT JOIN studio_images ON studio_images.image_id = images.id\nLEFT JOIN (\n    SELECT (jsonb_array_elements(data#>'{new_data,added_images}')->>0)::uuid AS image_id\n    FROM edits\n    WHERE status = 'PENDING'\n) edit_images ON edit_images.image_id = images.id\nLEFT JOIN (\n    SELECT id, (data->>'image')::uuid AS image_id\n    FROM drafts\n) drafts ON images.id = drafts.image_id\nWHERE images.id = $1\nAND scene_images.scene_id IS NULL\nAND performer_images.performer_id IS NULL\nAND studio_images.studio_id IS NULL\nAND edit_images.image_id IS NULL\nAND drafts.id IS NULL;\n\n-- name: FindImageIdsBySceneIds :many\nSELECT scene_images.scene_id, scene_images.image_id\nFROM scene_images\nWHERE scene_images.scene_id = ANY($1::UUID[]);\n\n-- name: FindImageIdsByPerformerIds :many\nSELECT performer_images.performer_id, performer_images.image_id\nFROM performer_images\nWHERE performer_images.performer_id = ANY($1::UUID[]);\n\n-- name: FindImageIdsByStudioIds :many\nSELECT studio_images.studio_id, studio_images.image_id\nFROM studio_images\nWHERE studio_images.studio_id = ANY($1::UUID[]);\n"
  },
  {
    "path": "internal/queries/sql/invite_key.sql",
    "content": "-- Invite key queries\n\n-- name: CreateInviteKey :one\nINSERT INTO invite_keys (id, generated_by, uses, expire_time, generated_at)\nVALUES ($1, $2, $3, $4, now())\nRETURNING *;\n\n-- name: DeleteInviteKey :exec\nDELETE FROM invite_keys WHERE id = $1;\n\n-- name: FindInviteKey :one\nSELECT * FROM invite_keys WHERE id = $1;\n\n-- name: FindActiveInviteKeysForUser :many\nSELECT i.* FROM invite_keys i\nLEFT JOIN (\n  SELECT uuid(data->>'invite_key') as invite_key, COUNT(*) as count\n  FROM user_tokens\n  WHERE expires_at > NOW()\n  GROUP BY data->>'invite_key'\n) AS used ON used.invite_key = i.id\nWHERE i.generated_by = $1\nAND (i.expire_time IS NULL OR i.expire_time > NOW())\nAND (used.invite_key IS NULL OR i.uses IS NULL OR used.count < i.uses);\n\n-- name: InviteKeyUsed :one\nUPDATE invite_keys\nSET uses = GREATEST(0, uses - 1)\nWHERE id = $1 AND uses IS NOT NULL AND uses > 0\nRETURNING uses;\n\n-- name: DestroyExpiredInvites :exec\nDELETE FROM invite_keys WHERE expire_time IS NOT NULL AND expire_time < NOW();\n"
  },
  {
    "path": "internal/queries/sql/mod_audit.sql",
    "content": "-- name: CreateModAudit :one\nINSERT INTO mod_audit (\n    id, action, user_id, target_id, target_type, data, reason, created_at\n)\nVALUES ($1, $2, $3, $4, $5, $6, $7, NOW())\nRETURNING *;\n\n-- name: GetModAuditCount :one\nSELECT COUNT(*) FROM mod_audit\nWHERE (sqlc.narg('action')::mod_audit_action IS NULL OR action = sqlc.narg('action'))\n  AND (sqlc.narg('user_id')::uuid IS NULL OR user_id = sqlc.narg('user_id'));\n\n-- name: QueryModAudits :many\nSELECT * FROM mod_audit\nWHERE (sqlc.narg('action')::mod_audit_action IS NULL OR action = sqlc.narg('action'))\n  AND (sqlc.narg('user_id')::uuid IS NULL OR user_id = sqlc.narg('user_id'))\nORDER BY created_at DESC\nLIMIT $1 OFFSET $2;\n\n-- name: DeleteExpiredModAudits :exec\nDELETE FROM mod_audit\nWHERE created_at < NOW() - INTERVAL '1 day' * $1;\n"
  },
  {
    "path": "internal/queries/sql/notification.sql",
    "content": "-- Notification queries\n\n-- name: FindNotificationsByUser :many\nSELECT * FROM notifications WHERE user_id = $1 AND (sqlc.narg(type)::notification_type IS NULL OR type = sqlc.narg(type)::notification_type) ORDER BY created_at DESC LIMIT $2 OFFSET $3;\n\n-- name: FindUnreadNotificationsByUser :many\nSELECT * FROM notifications WHERE user_id = $1 AND read_at IS NULL AND (sqlc.narg(type)::notification_type IS NULL OR type = sqlc.narg(type)::notification_type) ORDER BY created_at DESC LIMIT $2 OFFSET $3;\n\n-- name: CountNotificationsByUser :one\nSELECT COUNT(*) FROM notifications WHERE user_id = $1 AND (sqlc.arg(unread_only)::boolean = FALSE OR read_at IS NULL) AND (sqlc.narg(type)::notification_type IS NULL OR type = sqlc.narg(type)::notification_type);\n\n-- name: MarkAllNotificationsRead :exec\nUPDATE notifications SET read_at = NOW() WHERE user_id = $1 AND read_at IS NULL;\n\n-- name: MarkNotificationRead :exec\nUPDATE notifications SET read_at = NOW() WHERE user_id = $1 AND type = $2 AND id = $3 AND read_at IS NULL;\n\n-- User notification subscriptions\n\n-- name: CreateUserNotificationSubscriptions :copyfrom\nINSERT INTO user_notifications (user_id, type) VALUES ($1, $2);\n\n-- name: DeleteUserNotificationSubscriptions :exec\nDELETE FROM user_notifications WHERE user_id = $1;\n\n-- name: DestroyExpiredNotifications :exec\nDELETE FROM notifications\nWHERE read_at < CURRENT_DATE - INTERVAL '1 day'\n   OR created_at < CURRENT_DATE - INTERVAL '14 day';\n\n-- name: TriggerSceneCreationNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT N.user_id, N.type, $1 as id\nFROM scenes S\nJOIN scene_edits SE ON S.id = SE.scene_id\nJOIN edits E ON SE.edit_id = E.id AND E.operation = 'CREATE'\nJOIN studio_favorites SF ON S.studio_id = SF.studio_id\nJOIN user_notifications N ON SF.user_id = N.user_id AND N.type = 'FAVORITE_STUDIO_SCENE' AND E.user_id != N.user_id\nWHERE S.id = $1\nUNION\nSELECT N.user_id, N.type, $1 as id\nFROM scene_performers SP\nJOIN scene_edits SE ON SP.scene_id = SE.scene_id\nJOIN edits E ON SE.edit_id = E.id AND E.operation = 'CREATE'\nJOIN performer_favorites PF ON SP.performer_id = PF.performer_id\nJOIN user_notifications N ON PF.user_id = N.user_id AND N.type = 'FAVORITE_PERFORMER_SCENE' AND E.user_id != N.user_id\nWHERE SP.scene_id = $1;\n\n-- name: TriggerPerformerEditNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT N.user_id, N.type, $1\nFROM performer_edits PE\nJOIN edits E ON PE.edit_id = E.id\nJOIN performer_favorites PF ON PE.performer_id = PF.performer_id\nJOIN user_notifications N ON PF.user_id = N.user_id AND N.type = 'FAVORITE_PERFORMER_EDIT' AND N.user_id != E.user_id\nWHERE PE.edit_id = $1;\n\n-- name: TriggerStudioEditNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT N.user_id, N.type, $1\nFROM studio_edits SE\nJOIN edits E ON SE.edit_id = E.id\nJOIN studio_favorites SF ON SE.studio_id = SF.studio_id\nJOIN user_notifications N ON SF.user_id = N.user_id AND N.type = 'FAVORITE_STUDIO_EDIT' AND N.user_id != E.user_id\nWHERE SE.edit_id = $1;\n\n-- name: TriggerDownvoteEditNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT N.user_id, N.type, $1\nFROM edits E\nJOIN user_notifications N ON E.user_id = N.user_id AND N.type = 'DOWNVOTE_OWN_EDIT'\nWHERE E.id = $1;\n\n-- name: TriggerFailedEditNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT N.user_id, N.type, $1\nFROM edits E\nJOIN user_notifications N ON E.user_id = N.user_id AND N.type = 'FAILED_OWN_EDIT'\nWHERE E.id = $1;\n\n-- name: TriggerUpdatedEditNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT N.user_id, N.type, $1\nFROM edits E\nJOIN edit_votes EV ON E.id = EV.edit_id\nJOIN user_notifications N ON EV.user_id = N.user_id AND N.type = 'UPDATED_EDIT'\nWHERE E.id = $1;\n\n-- name: TriggerSceneEditNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT DISTINCT ON (user_id) user_id, type, $1 FROM (\n    SELECT N.user_id, N.type\n    FROM edits E JOIN studio_favorites SF ON (E.data->'new_data'->>'studio_id')::uuid = SF.studio_id\n    JOIN user_notifications N ON SF.user_id = N.user_id AND N.type = 'FAVORITE_STUDIO_EDIT' AND N.user_id != E.user_id\n    WHERE E.id = $1\n    UNION\n    SELECT N.user_id, N.type\n    FROM edits E\n    JOIN scene_edits SE ON E.id = SE.edit_id\n    JOIN scenes S ON SE.scene_id = S.id\n    JOIN studio_favorites SF ON S.studio_id = SF.studio_id\n    JOIN user_notifications N ON SF.user_id = N.user_id AND N.type = 'FAVORITE_STUDIO_EDIT' AND N.user_id != E.user_id\n    WHERE E.id = $1\n    UNION\n    SELECT N.user_id, N.type\n    FROM (\n        SELECT id, (jsonb_array_elements(edits.data->'new_data'->'added_performers')->>'performer_id')::uuid AS performer_id, user_id\n        FROM edits\n    ) E JOIN performer_favorites PF ON E.performer_id = PF.performer_id\n    JOIN user_notifications N ON PF.user_id = N.user_id AND N.type = 'FAVORITE_PERFORMER_EDIT' AND N.user_id != E.user_id\n    WHERE E.id = $1\n    UNION\n    SELECT N.user_id, N.type\n    FROM edits E\n    JOIN scene_edits SE ON E.id = SE.edit_id\n    JOIN scene_performers SP ON SP.scene_id = SE.scene_id\n    JOIN performer_favorites PF ON PF.performer_id = SP.performer_id\n    JOIN user_notifications N ON PF.user_id = N.user_id AND N.type = 'FAVORITE_PERFORMER_EDIT' AND N.user_id != E.user_id\n    WHERE E.id = $1\n    UNION\n    SELECT N.user_id, N.type\n    FROM edits E\n    JOIN scene_edits SE ON E.id = SE.edit_id\n    JOIN scene_fingerprints SF ON SE.scene_id = SF.scene_id\n    JOIN user_notifications N ON SF.user_id = N.user_id AND N.type = 'FINGERPRINTED_SCENE_EDIT' AND N.user_id != E.user_id\n    WHERE E.id = $1\n) notifications;\n\n-- name: TriggerEditCommentNotifications :exec\nINSERT INTO notifications (user_id, type, id)\nSELECT DISTINCT ON (user_id) user_id, type, $1 FROM (\n    SELECT N.user_id, N.type, 1 as ordering\n    FROM edit_comments EC\n    JOIN edits E ON EC.edit_id = E.id\n    JOIN user_notifications N ON E.user_id = N.user_id AND N.type = 'COMMENT_OWN_EDIT'\n    WHERE E.user_id != EC.user_id\n    AND EC.id = $1\n    UNION\n    SELECT N.user_id, N.type, 2 as ordering\n    FROM edit_comments EC\n    JOIN edits E ON EC.edit_id = E.id\n    JOIN edit_comments EO ON EO.edit_id = E.id\n    JOIN user_notifications N ON EO.user_id = N.user_id AND N.type = 'COMMENT_COMMENTED_EDIT'\n    WHERE EO.user_id != E.user_id\n    AND EO.user_id != EC.user_id\n    AND EC.id = $1\n    UNION\n    SELECT N.user_id, N.type, 3 as ordering\n    FROM edit_comments EC\n    JOIN edits E ON EC.edit_id = E.id\n    JOIN edit_votes EV ON EV.edit_id = E.id\n    JOIN user_notifications N ON EV.user_id = N.user_id AND N.type = 'COMMENT_VOTED_EDIT'\n    WHERE EV.vote != 'ABSTAIN'\n    AND EV.user_id != E.user_id\n    AND EV.user_id != EC.user_id\n    AND EC.id = $1\n) notifications\nORDER BY user_id, ordering ASC;\n"
  },
  {
    "path": "internal/queries/sql/performer.sql",
    "content": "-- Performer queries\n\n-- name: CreatePerformer :one\nINSERT INTO performers (\n    id, name, disambiguation, gender, birthdate, \n    ethnicity, country, eye_color, hair_color, height, cup_size, \n    band_size, hip_size, waist_size, breast_type, career_start_year, \n    career_end_year, deathdate, created_at, updated_at\n)\nVALUES (\n    $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, \n    $13, $14, $15, $16, $17, $18, now(), now()\n)\nRETURNING *;\n\n-- name: UpdatePerformer :one\nUPDATE performers \nSET name = $2, disambiguation = $3, gender = $4, birthdate = $5, \n    ethnicity = $6, country = $7, eye_color = $8, hair_color = $9, \n    height = $10, cup_size = $11, band_size = $12, hip_size = $13, \n    waist_size = $14, breast_type = $15, career_start_year = $16, \n    career_end_year = $17, deathdate = $18, updated_at = now()\nWHERE id = $1\nRETURNING *;\n\n-- name: DeletePerformer :exec\nDELETE FROM performers WHERE id = $1;\n\n-- name: SoftDeletePerformer :one\nUPDATE performers SET deleted = true, updated_at = NOW() WHERE id = $1\nRETURNING *;\n\n-- name: FindPerformer :one\nSELECT * FROM performers WHERE id = $1;\n\n-- name: FindPerformerWithRedirect :many\nSELECT P.* FROM performers P\nWHERE P.id = $1 AND P.deleted = FALSE\nUNION\nSELECT T.* FROM performer_redirects R\nJOIN performers T ON T.id = R.target_id\nWHERE R.source_id = $1 AND T.deleted = FALSE;\n\n-- name: FindPerformersByIds :many\nSELECT * FROM performers WHERE id = ANY($1::UUID[]);\n\n-- name: FindPerformerByName :one\nSELECT * FROM performers WHERE UPPER(name) = UPPER($1) AND deleted = false;\n\n-- name: FindExistingPerformers :many\nSELECT * FROM performers\nWHERE (\n    (sqlc.narg('name')::text IS NOT NULL AND TRIM(LOWER(name)) = TRIM(LOWER(sqlc.narg('name'))) AND\n     CASE\n       WHEN sqlc.narg('disambiguation')::text IS NOT NULL\n       THEN TRIM(LOWER(disambiguation)) = TRIM(LOWER(sqlc.narg('disambiguation')))\n       ELSE (disambiguation IS NULL OR disambiguation = '')\n     END)\n    OR\n    (sqlc.narg('urls')::text[] IS NOT NULL AND\n     id IN (\n       SELECT performer_id\n       FROM performer_urls\n       WHERE url = ANY(sqlc.narg('urls'))\n       GROUP BY performer_id\n     ))\n);\n\n-- name: FindPerformersByURL :many\nSELECT P.*\nFROM performers P\nJOIN performer_urls PU ON PU.performer_id = P.id\nWHERE LOWER(PU.url) = LOWER(sqlc.narg('url'))\nLIMIT sqlc.arg('limit');\n\n-- name: SearchPerformersWithFacets :many\nSELECT\n    performer_id,\n    pdb.agg('{\"terms\": {\"field\": \"gender\"}}') OVER () as gender_facets,\n    pdb.agg('{\"value_count\": {\"field\": \"performer_id\"}}') OVER () as total_count\nFROM performer_search\nWHERE performer_id @@@ paradedb.disjunction_max(disjuncts => ARRAY[\n    paradedb.boolean(\n        should => ARRAY[\n            paradedb.boost(factor => 1.5, query => paradedb.match(field => 'name', value => sqlc.narg('term')::TEXT)),\n            paradedb.match(field => 'disambiguation', value => sqlc.narg('term')::TEXT)\n        ]\n    ),\n    paradedb.match(field => 'aliases', value => sqlc.narg('term')::TEXT)\n])\nAND (sqlc.narg('filter_gender')::TEXT IS NULL OR gender = sqlc.narg('filter_gender')::TEXT)\nORDER BY pdb.score(performer_id) DESC\nLIMIT sqlc.arg('limit') OFFSET sqlc.arg('offset');\n\n-- Performer aliases\n\n-- name: DeletePerformerAliases :exec\nDELETE FROM performer_aliases WHERE performer_id = $1;\n\n-- name: GetPerformerAliases :many\nSELECT alias FROM performer_aliases WHERE performer_id = $1;\n\n-- name: FindPerformerByAlias :one\nSELECT p.* FROM performers p\nJOIN performer_aliases pa ON p.id = pa.performer_id\nWHERE UPPER(pa.alias) = UPPER($1) AND p.deleted = false;\n\n-- Performer URLs\n\n-- name: DeletePerformerURLs :exec\nDELETE FROM performer_urls WHERE performer_id = $1;\n\n-- name: GetPerformerURLs :many\nSELECT url, site_id FROM performer_urls WHERE performer_id = $1;\n\n-- Performer tattoos\n\n-- name: DeletePerformerTattoos :exec\nDELETE FROM performer_tattoos WHERE performer_id = $1;\n\n-- name: GetPerformerTattoos :many\nSELECT location, description FROM performer_tattoos WHERE performer_id = $1;\n\n-- Performer piercings\n\n-- name: DeletePerformerPiercings :exec\nDELETE FROM performer_piercings WHERE performer_id = $1;\n\n-- name: GetPerformerPiercings :many\nSELECT location, description FROM performer_piercings WHERE performer_id = $1;\n\n-- Performer redirects\n\n-- name: CreatePerformerRedirect :exec\nINSERT INTO performer_redirects (source_id, target_id) VALUES ($1, $2);\n\n-- name: UpdatePerformerRedirects :exec\nUPDATE performer_redirects SET target_id = @new_performer_id WHERE target_id = @old_performer_id;\n\n-- Performer favorites\n\n-- name: DeletePerformerFavorites :exec\nDELETE FROM performer_favorites WHERE performer_id = $1;\n\n-- name: ReassignPerformerFavorites :exec\nUPDATE performer_favorites\n   SET performer_id = @new_performer_id\n   WHERE performer_favorites.performer_id = @old_performer_id\n   AND user_id NOT IN (\n    SELECT user_id\n    FROM performer_favorites PF\n    WHERE PF.performer_id = @new_performer_id\n  );\n\n-- name: CreatePerformerFavorite :exec\nINSERT INTO performer_favorites (performer_id, user_id, created_at) VALUES ($1, $2, now());\n\n-- name: DeletePerformerFavorite :exec\nDELETE FROM performer_favorites WHERE performer_id = $1 AND user_id = $2;\n\n-- name: FindPerformerFavoritesByIds :many\n-- Check favorite status for multiple performers for a specific user\nSELECT performer_id, (performer_id IS NOT NULL)::BOOLEAN as is_favorite\nFROM performer_favorites\nWHERE performer_id = ANY(sqlc.arg(performer_ids)::UUID[]) AND user_id = sqlc.arg(user_id);\n\n-- Performer images\n\n-- name: GetPerformerImages :many\nSELECT images.* FROM images\nJOIN performer_images ON performer_images.image_id = images.id\nWHERE performer_images.performer_id = $1;\n\n-- name: DeletePerformerImages :exec\nDELETE FROM performer_images WHERE performer_id = $1;\n\n-- name: CreatePerformerImages :copyfrom\nINSERT INTO performer_images (performer_id, image_id) VALUES ($1, $2);\n\n-- name: CreatePerformerAliases :copyfrom\nINSERT INTO performer_aliases (performer_id, alias) VALUES ($1, $2);\n\n-- name: CreatePerformerTattoos :copyfrom\nINSERT INTO performer_tattoos (performer_id, location, description) VALUES ($1, $2, $3);\n\n-- name: CreatePerformerPiercings :copyfrom\nINSERT INTO performer_piercings (performer_id, location, description) VALUES ($1, $2, $3);\n\n-- name: CreatePerformerURLs :copyfrom\nINSERT INTO performer_urls (performer_id, url, site_id) VALUES ($1, $2, $3);\n\n-- name: SetScenePerformerAlias :exec\nUPDATE scene_performers\nSET \"as\" = $2\nWHERE performer_id = $1\nAND \"as\" IS NULL;\n\n-- name: ClearScenePerformerAlias :exec\nUPDATE scene_performers\nSET \"as\" = NULL\nWHERE performer_id = $1\nAND \"as\" = $2;\n\n-- name: ReassignPerformerAliases :exec\nUPDATE scene_performers\nSET performer_id = @new_performer_id\nWHERE scene_performers.performer_id = @old_performer_id\nAND scene_id NOT IN (SELECT scene_id from scene_performers sp WHERE sp.performer_id = @new_performer_id);\n\n-- name: DeletePerformerScenes :exec\nDELETE FROM scene_performers WHERE performer_id = $1;\n\n-- name: FindMergeIDsByPerformerIds :many\n-- Find merge target IDs for performers (for merges where these are sources)\nSELECT source_id as performer_id, target_id as merge_id FROM performer_redirects WHERE source_id = ANY(sqlc.arg(performer_ids)::UUID[]);\n\n-- name: FindMergeIDsBySourcePerformerIds :many\n-- Find merge source IDs for performers (for merges where these are targets)\nSELECT target_id as performer_id, source_id as merge_id FROM performer_redirects WHERE target_id = ANY(sqlc.arg(performer_ids)::UUID[]);\n\n-- name: FindPerformerAliasesByIds :many\n-- Get aliases for multiple performers\nSELECT performer_id, alias FROM performer_aliases WHERE performer_id = ANY(sqlc.arg(performer_ids)::UUID[]);\n\n-- name: FindPerformerTattoosByIds :many\n-- Get tattoos for multiple performers\nSELECT performer_id, location, description FROM performer_tattoos WHERE performer_id = ANY(sqlc.arg(performer_ids)::UUID[]);\n\n-- name: FindPerformerPiercingsByIds :many\n-- Get piercings for multiple performers\nSELECT performer_id, location, description FROM performer_piercings WHERE performer_id = ANY(sqlc.arg(performer_ids)::UUID[]);\n\n-- name: FindPerformerUrlsByIds :many\n-- Get URLs for multiple performers\nSELECT performer_id, url, site_id FROM performer_urls WHERE performer_id = ANY(sqlc.arg(performer_ids)::UUID[]);\n"
  },
  {
    "path": "internal/queries/sql/scene.sql",
    "content": "-- Scene queries\n\n-- name: CreateScene :one\nINSERT INTO scenes (id, title, details, date, production_date, studio_id, duration, director, code, created_at, updated_at)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, now(), now())\nRETURNING *;\n\n-- name: UpdateScene :one\nUPDATE scenes \nSET title = $2, details = $3, date = $4, production_date = $5, studio_id = $6, \n    duration = $7, director = $8, code = $9, updated_at = now()\nWHERE id = $1\nRETURNING *;\n\n-- name: DeleteScene :exec\nDELETE FROM scenes WHERE id = $1;\n\n-- name: SoftDeleteScene :one\nUPDATE scenes SET deleted = true, updated_at = NOW() WHERE id = $1\nRETURNING *;\n\n-- name: DeleteSceneStudios :exec\nUPDATE scenes SET studio_id = NULL WHERE studio_id = $1;\n\n-- name: UpdateSceneStudios :exec\nUPDATE scenes SET studio_id = @target_id WHERE studio_id = @source_id;\n\n-- name: FindScene :one\nSELECT * FROM scenes WHERE id = $1;\n\n-- name: GetScenes :many\nSELECT * FROM scenes WHERE id = ANY($1::UUID[]) ORDER BY title;\n\n-- name: FindExistingScenes :many\nSELECT * FROM scenes WHERE (\n    (sqlc.narg('title')::text IS NOT NULL AND sqlc.narg('studio_id')::uuid IS NOT NULL\n     AND TRIM(LOWER(title)) = TRIM(LOWER(sqlc.narg('title')))\n     AND studio_id = sqlc.narg('studio_id'))\n    OR\n    (sqlc.narg('hashes')::BIGINT[] IS NOT NULL AND array_length(sqlc.narg('hashes')::BIGINT[], 1) > 0\n     AND id IN (\n        SELECT scene_id\n        FROM scene_fingerprints SFP\n        JOIN fingerprints FP ON SFP.fingerprint_id = FP.id\n        WHERE FP.hash = ANY(sqlc.narg('hashes')::BIGINT[])\n        GROUP BY scene_id\n    ))\n)\nAND deleted = FALSE;\n\n-- name: FindSceneByURL :many\nSELECT S.*\nFROM scenes S\nJOIN scene_urls SU ON SU.scene_id = S.id\nWHERE LOWER(SU.url) = LOWER(sqlc.narg('url'))\nAND S.deleted = FALSE\nLIMIT sqlc.arg('limit');\n\n-- name: SearchScenes :many\nSELECT\n    scene_id,\n    pdb.agg('{\"value_count\": {\"field\": \"scene_id\"}}') OVER () as total_count\nFROM scene_search\nWHERE scene_id @@@ paradedb.disjunction_max(disjuncts => ARRAY[\n    paradedb.match(field => 'scene_title', value => sqlc.narg('term')::TEXT),\n    paradedb.match(field => 'scene_code', value => sqlc.narg('term')::TEXT),\n    paradedb.boolean(\n        should => ARRAY[\n            paradedb.match(field => 'performer_names', value => sqlc.narg('term')::TEXT),\n            paradedb.match(field => 'studio_name', value => sqlc.narg('term')::TEXT),\n            paradedb.match(field => 'network_name', value => sqlc.narg('term')::TEXT)\n        ]\n    )\n])\nORDER BY pdb.score(scene_id) DESC\nLIMIT sqlc.arg('limit') OFFSET sqlc.arg('offset');\n\n-- name: CountScenesByPerformer :one\nSELECT COUNT(*) FROM scene_performers WHERE performer_id = $1;\n\n-- Scene fingerprints (use fingerprint.sql for most fingerprint operations)\n\n-- name: FindScenesByFullFingerprintsWithHash :many\nSELECT sqlc.embed(scenes), matches.hash FROM (\n    SELECT SFP.scene_id AS id, FP.hash\n    FROM UNNEST(sqlc.narg('phashes')::BIGINT[]) phash\n    JOIN fingerprints FP ON FP.hash <@ (phash, sqlc.arg('distance')::INTEGER)\n        AND FP.algorithm = 'PHASH'\n    JOIN scene_fingerprints SFP ON SFP.fingerprint_id = FP.id\n    WHERE sqlc.narg('phashes')::BIGINT[] IS NOT NULL AND array_length(sqlc.narg('phashes')::BIGINT[], 1) > 0\n    GROUP BY SFP.scene_id, FP.hash\n\n    UNION\n\n    SELECT SFP.scene_id AS id, FP.hash\n    FROM scene_fingerprints SFP\n    JOIN fingerprints FP ON SFP.fingerprint_id = FP.id\n    WHERE FP.hash = ANY(sqlc.narg('hashes')::BIGINT[])\n        AND sqlc.narg('hashes')::BIGINT[] IS NOT NULL AND array_length(sqlc.narg('hashes')::BIGINT[], 1) > 0\n    GROUP BY SFP.scene_id, FP.hash\n) matches\nJOIN scenes ON scenes.id = matches.id AND scenes.deleted = FALSE;\n\n-- Scene URLs\n\n-- name: CreateSceneURLs :copyfrom\nINSERT INTO scene_urls (scene_id, url, site_id) VALUES ($1, $2, $3);\n\n-- name: DeleteSceneURLs :exec\nDELETE FROM scene_urls WHERE scene_id = $1;\n\n-- name: GetSceneURLs :many\nSELECT url, site_id FROM scene_urls WHERE scene_id = $1;\n\n-- Scene performers\n\n-- name: CreateScenePerformers :copyfrom\nINSERT INTO scene_performers (scene_id, performer_id, \"as\") VALUES ($1, $2, $3);\n\n-- name: DeleteScenePerformers :exec\nDELETE FROM scene_performers WHERE scene_id = $1;\n\n-- name: GetScenePerformers :many\nSELECT sqlc.embed(P), \"as\" FROM scene_performers SP JOIN performers P ON SP.performer_id = P.id WHERE scene_id = $1;\n\n-- Scene images\n\n-- name: DeleteSceneImages :exec\nDELETE FROM scene_images WHERE scene_id = $1;\n\n-- name: CreateSceneImages :copyfrom\nINSERT INTO scene_images (scene_id, image_id) VALUES ($1, $2);\n\n-- Scene redirects\n\n-- name: CreateSceneRedirect :exec\nINSERT INTO scene_redirects (source_id, target_id) VALUES ($1, $2);\n\n-- name: UpdateSceneRedirects :exec\nUPDATE scene_redirects SET target_id = @new_target_id WHERE target_id = @old_target_id;\n\n-- name: FindSceneAppearancesByIds :many\n-- Get performer appearances for multiple scenes\nSELECT scene_id, performer_id, \"as\" FROM scene_performers WHERE scene_id = ANY(sqlc.arg(scene_ids)::UUID[]);\n\n-- name: FindSceneUrlsByIds :many\n-- Get URLs for multiple scenes\nSELECT scene_id, url, site_id FROM scene_urls WHERE scene_id = ANY(sqlc.arg(scene_ids)::UUID[]);\n"
  },
  {
    "path": "internal/queries/sql/site.sql",
    "content": "-- Site queries\n\n-- name: CreateSite :one\nINSERT INTO sites (id, name, description, url, regex, valid_types, created_at, updated_at)\nVALUES ($1, $2, $3, $4, $5, $6, now(), now())\nRETURNING *;\n\n-- name: UpdateSite :one\nUPDATE sites \nSET name = $2, description = $3, url = $4, regex = $5, valid_types = $6, updated_at = now()\nWHERE id = $1\nRETURNING *;\n\n-- name: DeleteSite :exec\nDELETE FROM sites WHERE id = $1;\n\n-- name: GetSite :one\nSELECT * FROM sites WHERE id = $1;\n\n-- name: FindSitesByIds :many\nSELECT * FROM sites WHERE id = ANY($1::UUID[]);\n"
  },
  {
    "path": "internal/queries/sql/studio.sql",
    "content": "-- Studio queries\n\n-- name: CreateStudio :one\nINSERT INTO studios (id, name, parent_studio_id, created_at, updated_at)\nVALUES ($1, $2, $3, now(), now())\nRETURNING *;\n\n-- name: UpdateStudio :one\nUPDATE studios \nSET name = $2, parent_studio_id = $3, updated_at = NOW()\nWHERE id = $1\nRETURNING *;\n\n-- name: DeleteStudio :exec\nDELETE FROM studios WHERE id = $1;\n\n-- name: SoftDeleteStudio :one\nUPDATE studios SET deleted = true, updated_at = NOW() WHERE id = $1\nRETURNING *;\n\n-- name: FindStudio :one\nSELECT * FROM studios WHERE id = $1;\n\n-- name: GetStudios :many\nSELECT * FROM studios WHERE id = ANY($1::UUID[]) ORDER BY name;\n\n-- name: FindStudioByName :one\nSELECT * FROM studios WHERE UPPER(name) = UPPER($1) AND deleted = false;\n\n-- name: SearchStudios :many\nSELECT\n    studio_id,\n    pdb.agg('{\"value_count\": {\"field\": \"studio_id\"}}') OVER () as total_count\nFROM studio_search\nWHERE studio_id @@@ paradedb.boolean(\n    should => ARRAY[\n        paradedb.boost(factor => 2, query => paradedb.match(field => 'name', value => sqlc.narg('term')::TEXT)),\n        paradedb.match(field => 'network', value => sqlc.narg('term')::TEXT),\n        paradedb.match(field => 'aliases', value => sqlc.narg('term')::TEXT)\n    ]\n)\nORDER BY pdb.score(studio_id) DESC\nLIMIT sqlc.arg('limit');\n\n-- name: GetStudiosByPerformer :many\nSELECT\n    sqlc.embed(studios),\n    COUNT(scenes.id) as scene_count\nFROM studios\nJOIN scenes ON studios.id = scenes.studio_id\nJOIN scene_performers SP ON scenes.id = SP.scene_id\nWHERE SP.performer_id = $1\nGROUP BY studios.id;\n\n-- name: GetStudiosByPerformerAndNetwork :many\n-- Get studios where performer has scenes, filtered to a studio network (the studio, its parent, and children)\nWITH studio_network AS (\n    -- The studio itself\n    SELECT sqlc.arg('studio_id')::uuid AS id\n    UNION\n    -- Parent studio (if exists)\n    SELECT parent_studio_id AS id FROM studios WHERE id = sqlc.arg('studio_id') AND parent_studio_id IS NOT NULL\n    UNION\n    -- Child studios\n    SELECT id FROM studios WHERE parent_studio_id = sqlc.arg('studio_id') AND deleted = FALSE\n)\nSELECT\n    sqlc.embed(studios),\n    COUNT(scenes.id) as scene_count\nFROM studios\nJOIN scenes ON studios.id = scenes.studio_id\nJOIN scene_performers SP ON scenes.id = SP.scene_id\nWHERE SP.performer_id = sqlc.arg('performer_id')\n  AND studios.id IN (SELECT id FROM studio_network WHERE id IS NOT NULL)\nGROUP BY studios.id;\n\n-- name: GetChildStudios :many\nSELECT * FROM studios WHERE parent_studio_id = $1 AND deleted = false ORDER BY name;\n\n-- Studio URLs\n\n-- name: CreateStudioURLs :copyfrom\nINSERT INTO studio_urls (studio_id, url, site_id) VALUES ($1, $2, $3);\n\n-- name: DeleteStudioURLs :exec\nDELETE FROM studio_urls WHERE studio_id = $1;\n\n-- name: GetStudioURLs :many\nSELECT * FROM studio_urls WHERE studio_id = $1;\n\n-- Studio images\n\n-- name: CreateStudioImages :copyfrom\nINSERT INTO studio_images (studio_id, image_id) VALUES ($1, $2);\n\n-- name: GetStudioImages :many\nSELECT image_id FROM studio_images WHERE studio_id = $1;\n\n-- name: DeleteStudioImages :exec\nDELETE FROM studio_images WHERE studio_id = $1;\n\n-- Studio aliases\n\n-- name: CreateStudioAliases :copyfrom\nINSERT INTO studio_aliases (studio_id, alias) VALUES ($1, $2);\n\n-- name: DeleteStudioAliases :exec\nDELETE FROM studio_aliases WHERE studio_id = $1;\n\n-- name: GetStudioAliases :many\nSELECT alias FROM studio_aliases WHERE studio_id = $1;\n\n-- name: FindStudioByAlias :one\nSELECT s.* FROM studios s\nJOIN studio_aliases sa ON s.id = sa.studio_id\nWHERE UPPER(sa.alias) = UPPER($1) AND s.deleted = false;\n\n-- Studio redirects\n\n-- name: CreateStudioRedirect :exec\nINSERT INTO studio_redirects (source_id, target_id) VALUES ($1, $2);\n\n-- name: UpdateStudioRedirects :exec\nUPDATE studio_redirects SET target_id = @new_target_id WHERE target_id = @old_target_id;\n\n-- name: FindStudioWithRedirect :one\nSELECT S.* FROM studios S\nWHERE S.id = $1 AND S.deleted = FALSE\nUNION\nSELECT SS.* FROM studio_redirects R\nJOIN studios SS ON SS.id = R.target_id\nWHERE R.source_id = $1 AND SS.deleted = FALSE;\n\n-- name: FindStudioUrlsByIds :many\n-- Get URLs for multiple studios\nSELECT studio_id, url, site_id FROM studio_urls WHERE studio_id = ANY(sqlc.arg(studio_ids)::UUID[]);\n\n-- name: FindStudioAliasesByIds :many\n-- Get aliases for multiple studios\nSELECT studio_id, alias FROM studio_aliases WHERE studio_id = ANY(sqlc.arg(studio_ids)::UUID[]);\n\n-- name: FindStudioFavoritesByIds :many\n-- Check favorite status for multiple studios for a specific user\nSELECT studio_id, (studio_id IS NOT NULL)::BOOLEAN as is_favorite\nFROM studio_favorites\nWHERE studio_id = ANY(sqlc.arg(studio_ids)::UUID[]) AND user_id = sqlc.arg(user_id);\n\n-- Studio favorites\n\n-- name: CreateStudioFavorite :exec\nINSERT INTO studio_favorites (studio_id, user_id, created_at) VALUES ($1, $2, NOW());\n\n-- name: DeleteStudioFavorite :exec\nDELETE FROM studio_favorites WHERE studio_id = $1 AND user_id = $2;\n\n-- name: DeleteStudioFavorites :exec\nDELETE FROM studio_favorites WHERE studio_id = $1;\n\n-- name: ReassignStudioFavorites :exec\nUPDATE studio_favorites\n   SET studio_id = @new_studio_id\n   WHERE studio_favorites.studio_id = @old_studio_id\n   AND user_id NOT IN (\n    SELECT user_id\n    FROM studio_favorites SF\n    WHERE SF.studio_id = @new_studio_id\n  );\n"
  },
  {
    "path": "internal/queries/sql/tag.sql",
    "content": "-- Tag queries\n\n-- name: CreateTag :one\nINSERT INTO tags (id, name, category_id, description, created_at, updated_at)\nVALUES ($1, $2, $3, $4, now(), now())\nRETURNING *;\n\n-- name: UpdateTag :one\nUPDATE tags \nSET name = $2, category_id = $3, description = $4, updated_at = NOW()\nWHERE id = $1\nRETURNING *;\n\n-- name: DeleteTag :exec\nDELETE FROM tags WHERE id = $1;\n\n-- name: SoftDeleteTag :one\nUPDATE tags SET deleted = true, updated_at = NOW() WHERE id = $1\nRETURNING *;\n\n-- name: FindTag :one\nSELECT * FROM tags WHERE id = $1;\n\n-- name: FindTagByName :one\nSELECT * FROM tags WHERE UPPER(name) = UPPER($1) AND deleted = false;\n\n-- name: SearchTags :many\nSELECT T.* FROM tags T\nJOIN tag_search TS ON TS.tag_id = T.id\nWHERE TS.tag_id @@@ paradedb.boolean(should => ARRAY[\n    paradedb.fuzzy_term(field => 'name', value => sqlc.narg('term')::TEXT, distance => 1, prefix => true),\n    paradedb.fuzzy_term(field => 'aliases', value => sqlc.narg('term')::TEXT, distance => 1, prefix => true)\n])\nAND T.deleted = FALSE\nORDER BY paradedb.score(TS.tag_id) DESC\nLIMIT sqlc.arg('limit');\n\n-- name: FindTagsByIds :many\nSELECT * FROM tags WHERE id = ANY($1::UUID[]);\n\n-- Tag aliases\n\n-- name: CreateTagAliases :copyfrom\nINSERT INTO tag_aliases (tag_id, alias) VALUES ($1, $2);\n\n-- name: DeleteTagAliases :exec\nDELETE FROM tag_aliases WHERE tag_id = $1;\n\n-- name: DeleteTagAliasesByNames :exec\nDELETE FROM tag_aliases WHERE tag_id = $1 AND alias = ANY($2::TEXT[]);\n\n-- name: GetTagAliases :many\nSELECT alias FROM tag_aliases WHERE tag_id = $1;\n\n-- name: FindTagByAlias :one\nSELECT t.* FROM tags t\nJOIN tag_aliases ta ON t.id = ta.tag_id\nWHERE UPPER(ta.alias) = UPPER($1) AND t.deleted = false;\n\n-- name: FindTagByNameOrAlias :one\nSELECT T.* FROM tags T\nLEFT JOIN tag_aliases TA ON T.id = TA.tag_id\nWHERE (\n  LOWER(TA.alias) = LOWER($1)\n  OR LOWER(T.name) = LOWER($1)\n) AND T.deleted = FALSE;\n\n-- Tag redirects\n\n-- name: CreateTagRedirect :exec\nINSERT INTO tag_redirects (source_id, target_id) VALUES ($1, $2);\n\n-- name: UpdateTagRedirects :exec\nUPDATE tag_redirects SET target_id = @new_target_id WHERE target_id = @old_target_id;\n\n-- name: FindTagWithRedirect :many\nSELECT T.* FROM tags T\nWHERE T.id = $1 AND T.deleted = FALSE\nUNION\nSELECT TT.* FROM tag_redirects R\nJOIN tags TT ON TT.id = R.target_id\nWHERE R.source_id = $1 AND TT.deleted = FALSE;\n\n-- Scene tags management\n\n-- name: CreateSceneTags :copyfrom\nINSERT INTO scene_tags (scene_id, tag_id) VALUES ($1, $2);\n\n-- name: DeleteSceneTagsByTag :exec\nDELETE FROM scene_tags WHERE tag_id = $1;\n\n-- name: DeleteSceneTagsByScene :exec\nDELETE FROM scene_tags WHERE scene_id = $1;\n\n-- name: GetSceneTags :many\nSELECT T.* FROM scene_tags ST JOIN tags T ON ST.tag_id = T.id WHERE scene_id = $1;\n\n-- name: FindTagsBySceneID :many\nSELECT t.* FROM tags t\nINNER JOIN scene_tags st ON st.tag_id = t.id\nWHERE st.scene_id = $1;\n\n-- name: UpdateSceneTagsForMerge :exec\nUPDATE scene_tags\nSET tag_id = @new_tag_id\nWHERE scene_tags.tag_id = @old_tag_id\nAND scene_id NOT IN (SELECT scene_id from scene_tags st WHERE st.tag_id = @new_tag_id);\n\n-- name: FindTagIdsBySceneIds :many\n-- Bulk query to find tag IDs for multiple scene IDs\nSELECT scene_id, tag_id FROM scene_tags WHERE scene_id = ANY(sqlc.arg(scene_ids)::UUID[]);\n"
  },
  {
    "path": "internal/queries/sql/tag_category.sql",
    "content": "-- Tag category queries\n\n-- name: CreateTagCategory :one\nINSERT INTO tag_categories (id, \"group\", name, description, created_at, updated_at)\nVALUES ($1, $2, $3, $4, now(), now())\nRETURNING *;\n\n-- name: UpdateTagCategory :one\nUPDATE tag_categories \nSET \"group\" = $2, name = $3, description = $4, updated_at = now()\nWHERE id = $1\nRETURNING *;\n\n-- name: DeleteTagCategory :exec\nDELETE FROM tag_categories WHERE id = $1;\n\n-- name: FindTagCategory :one\nSELECT * FROM tag_categories WHERE id = $1;\n\n-- name: GetAllTagCategories :many\nSELECT * FROM tag_categories ORDER BY name ASC;\n\n-- name: GetTagCategoriesByIds :many\nSELECT * FROM tag_categories WHERE id = ANY($1::UUID[]);\n"
  },
  {
    "path": "internal/queries/sql/user.sql",
    "content": "-- User queries\n\n-- name: CreateUser :one\nINSERT INTO users (id, name, password_hash, email, api_key, api_calls, invite_tokens, invited_by, last_api_call, created_at, updated_at)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, NOW(), NOW(), NOW())\nRETURNING *;\n\n-- name: UpdateUser :one\nUPDATE users \nSET name = $2, password_hash = $3, email = $4, updated_at = NOW()\nWHERE id = $1\nRETURNING *;\n\n-- name: DeleteUser :exec\nDELETE FROM users WHERE id = $1;\n\n-- name: FindUser :one\nSELECT * FROM users WHERE id = $1;\n\n-- name: FindUserByName :one\nSELECT * FROM users WHERE UPPER(name) = UPPER(sqlc.arg(name)::text);\n\n-- name: FindUserByEmail :one\nSELECT * FROM users WHERE UPPER(email) = UPPER($1);\n\n-- name: CountUsers :one\nSELECT COUNT(*) FROM users;\n\n-- name: UpdateUserAPIKey :exec\nUPDATE users\nSET api_key = $2, updated_at = NOW()\nWHERE id = $1;\n\n-- name: UpdateUserPassword :exec\nUPDATE users\nSET password_hash = $2, updated_at = NOW()\nWHERE id = $1;\n\n-- name: UpdateUserInviteTokenCount :exec\nUPDATE users\nSET invite_tokens = $2\nWHERE id = $1;\n\n-- name: UpdateUserEmail :exec\nUPDATE users\nSET email = $2, updated_at = NOW()\nWHERE id = $1;\n\n-- User roles\n\n-- name: CreateUserRoles :copyfrom\nINSERT INTO user_roles (user_id, role) VALUES ($1, $2);\n\n-- name: DeleteUserRoles :exec\nDELETE FROM user_roles WHERE user_id = $1;\n\n-- name: GetUserRoles :many\nSELECT role FROM user_roles WHERE user_id = $1;\n\n-- name: CountVotesByType :many\nSELECT vote, COUNT(*) as count FROM edit_votes WHERE user_id = $1 GROUP BY vote;\n\n-- name: CountUserEditsByStatus :many\nSELECT status, COUNT(*) as count FROM edits WHERE user_id = $1 GROUP BY status;\n\n-- name: GetUserNotificationSubscriptions :many\nSELECT type FROM user_notifications WHERE user_id = $1;\n"
  },
  {
    "path": "internal/queries/sql/user_token.sql",
    "content": "-- User token queries\n\n-- name: CreateUserToken :one\nINSERT INTO user_tokens (id, data, type, created_at, expires_at)\nVALUES ($1, $2, $3, $4, $5)\nRETURNING *;\n\n-- name: DeleteUserToken :exec\nDELETE FROM user_tokens WHERE id = $1;\n\n-- name: DeleteExpiredUserTokens :exec\nDELETE FROM user_tokens WHERE expires_at <= now();\n\n-- name: FindUserToken :one\nSELECT * FROM user_tokens WHERE id = $1;\n\n-- name: FindUserTokensByInviteKey :many\nSELECT * FROM user_tokens WHERE (data->>'invite_key')::UUID = $1::UUID;\n\n-- name: FindUserTokensByEmail :many\nSELECT * FROM user_tokens WHERE data->>'email' = $1::text;\n"
  },
  {
    "path": "internal/queries/studio.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: studio.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\nconst createStudio = `-- name: CreateStudio :one\n\nINSERT INTO studios (id, name, parent_studio_id, created_at, updated_at)\nVALUES ($1, $2, $3, now(), now())\nRETURNING id, name, parent_studio_id, created_at, updated_at, deleted\n`\n\ntype CreateStudioParams struct {\n\tID             uuid.UUID     `db:\"id\" json:\"id\"`\n\tName           string        `db:\"name\" json:\"name\"`\n\tParentStudioID uuid.NullUUID `db:\"parent_studio_id\" json:\"parent_studio_id\"`\n}\n\n// Studio queries\nfunc (q *Queries) CreateStudio(ctx context.Context, arg CreateStudioParams) (Studio, error) {\n\trow := q.db.QueryRow(ctx, createStudio, arg.ID, arg.Name, arg.ParentStudioID)\n\tvar i Studio\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.ParentStudioID,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t)\n\treturn i, err\n}\n\ntype CreateStudioAliasesParams struct {\n\tStudioID uuid.UUID `db:\"studio_id\" json:\"studio_id\"`\n\tAlias    string    `db:\"alias\" json:\"alias\"`\n}\n\nconst createStudioFavorite = `-- name: CreateStudioFavorite :exec\n\nINSERT INTO studio_favorites (studio_id, user_id, created_at) VALUES ($1, $2, NOW())\n`\n\ntype CreateStudioFavoriteParams struct {\n\tStudioID uuid.UUID `db:\"studio_id\" json:\"studio_id\"`\n\tUserID   uuid.UUID `db:\"user_id\" json:\"user_id\"`\n}\n\n// Studio favorites\nfunc (q *Queries) CreateStudioFavorite(ctx context.Context, arg CreateStudioFavoriteParams) error {\n\t_, err := q.db.Exec(ctx, createStudioFavorite, arg.StudioID, arg.UserID)\n\treturn err\n}\n\ntype CreateStudioImagesParams struct {\n\tStudioID uuid.UUID `db:\"studio_id\" json:\"studio_id\"`\n\tImageID  uuid.UUID `db:\"image_id\" json:\"image_id\"`\n}\n\nconst createStudioRedirect = `-- name: CreateStudioRedirect :exec\n\nINSERT INTO studio_redirects (source_id, target_id) VALUES ($1, $2)\n`\n\ntype CreateStudioRedirectParams struct {\n\tSourceID uuid.UUID `db:\"source_id\" json:\"source_id\"`\n\tTargetID uuid.UUID `db:\"target_id\" json:\"target_id\"`\n}\n\n// Studio redirects\nfunc (q *Queries) CreateStudioRedirect(ctx context.Context, arg CreateStudioRedirectParams) error {\n\t_, err := q.db.Exec(ctx, createStudioRedirect, arg.SourceID, arg.TargetID)\n\treturn err\n}\n\ntype CreateStudioURLsParams struct {\n\tStudioID uuid.UUID `db:\"studio_id\" json:\"studio_id\"`\n\tUrl      string    `db:\"url\" json:\"url\"`\n\tSiteID   uuid.UUID `db:\"site_id\" json:\"site_id\"`\n}\n\nconst deleteStudio = `-- name: DeleteStudio :exec\nDELETE FROM studios WHERE id = $1\n`\n\nfunc (q *Queries) DeleteStudio(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteStudio, id)\n\treturn err\n}\n\nconst deleteStudioAliases = `-- name: DeleteStudioAliases :exec\nDELETE FROM studio_aliases WHERE studio_id = $1\n`\n\nfunc (q *Queries) DeleteStudioAliases(ctx context.Context, studioID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteStudioAliases, studioID)\n\treturn err\n}\n\nconst deleteStudioFavorite = `-- name: DeleteStudioFavorite :exec\nDELETE FROM studio_favorites WHERE studio_id = $1 AND user_id = $2\n`\n\ntype DeleteStudioFavoriteParams struct {\n\tStudioID uuid.UUID `db:\"studio_id\" json:\"studio_id\"`\n\tUserID   uuid.UUID `db:\"user_id\" json:\"user_id\"`\n}\n\nfunc (q *Queries) DeleteStudioFavorite(ctx context.Context, arg DeleteStudioFavoriteParams) error {\n\t_, err := q.db.Exec(ctx, deleteStudioFavorite, arg.StudioID, arg.UserID)\n\treturn err\n}\n\nconst deleteStudioFavorites = `-- name: DeleteStudioFavorites :exec\nDELETE FROM studio_favorites WHERE studio_id = $1\n`\n\nfunc (q *Queries) DeleteStudioFavorites(ctx context.Context, studioID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteStudioFavorites, studioID)\n\treturn err\n}\n\nconst deleteStudioImages = `-- name: DeleteStudioImages :exec\nDELETE FROM studio_images WHERE studio_id = $1\n`\n\nfunc (q *Queries) DeleteStudioImages(ctx context.Context, studioID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteStudioImages, studioID)\n\treturn err\n}\n\nconst deleteStudioURLs = `-- name: DeleteStudioURLs :exec\nDELETE FROM studio_urls WHERE studio_id = $1\n`\n\nfunc (q *Queries) DeleteStudioURLs(ctx context.Context, studioID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteStudioURLs, studioID)\n\treturn err\n}\n\nconst findStudio = `-- name: FindStudio :one\nSELECT id, name, parent_studio_id, created_at, updated_at, deleted FROM studios WHERE id = $1\n`\n\nfunc (q *Queries) FindStudio(ctx context.Context, id uuid.UUID) (Studio, error) {\n\trow := q.db.QueryRow(ctx, findStudio, id)\n\tvar i Studio\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.ParentStudioID,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t)\n\treturn i, err\n}\n\nconst findStudioAliasesByIds = `-- name: FindStudioAliasesByIds :many\nSELECT studio_id, alias FROM studio_aliases WHERE studio_id = ANY($1::UUID[])\n`\n\n// Get aliases for multiple studios\nfunc (q *Queries) FindStudioAliasesByIds(ctx context.Context, studioIds []uuid.UUID) ([]StudioAlias, error) {\n\trows, err := q.db.Query(ctx, findStudioAliasesByIds, studioIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []StudioAlias{}\n\tfor rows.Next() {\n\t\tvar i StudioAlias\n\t\tif err := rows.Scan(&i.StudioID, &i.Alias); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findStudioByAlias = `-- name: FindStudioByAlias :one\nSELECT s.id, s.name, s.parent_studio_id, s.created_at, s.updated_at, s.deleted FROM studios s\nJOIN studio_aliases sa ON s.id = sa.studio_id\nWHERE UPPER(sa.alias) = UPPER($1) AND s.deleted = false\n`\n\nfunc (q *Queries) FindStudioByAlias(ctx context.Context, upper interface{}) (Studio, error) {\n\trow := q.db.QueryRow(ctx, findStudioByAlias, upper)\n\tvar i Studio\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.ParentStudioID,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t)\n\treturn i, err\n}\n\nconst findStudioByName = `-- name: FindStudioByName :one\nSELECT id, name, parent_studio_id, created_at, updated_at, deleted FROM studios WHERE UPPER(name) = UPPER($1) AND deleted = false\n`\n\nfunc (q *Queries) FindStudioByName(ctx context.Context, upper interface{}) (Studio, error) {\n\trow := q.db.QueryRow(ctx, findStudioByName, upper)\n\tvar i Studio\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.ParentStudioID,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t)\n\treturn i, err\n}\n\nconst findStudioFavoritesByIds = `-- name: FindStudioFavoritesByIds :many\nSELECT studio_id, (studio_id IS NOT NULL)::BOOLEAN as is_favorite\nFROM studio_favorites\nWHERE studio_id = ANY($1::UUID[]) AND user_id = $2\n`\n\ntype FindStudioFavoritesByIdsParams struct {\n\tStudioIds []uuid.UUID `db:\"studio_ids\" json:\"studio_ids\"`\n\tUserID    uuid.UUID   `db:\"user_id\" json:\"user_id\"`\n}\n\ntype FindStudioFavoritesByIdsRow struct {\n\tStudioID   uuid.UUID `db:\"studio_id\" json:\"studio_id\"`\n\tIsFavorite bool      `db:\"is_favorite\" json:\"is_favorite\"`\n}\n\n// Check favorite status for multiple studios for a specific user\nfunc (q *Queries) FindStudioFavoritesByIds(ctx context.Context, arg FindStudioFavoritesByIdsParams) ([]FindStudioFavoritesByIdsRow, error) {\n\trows, err := q.db.Query(ctx, findStudioFavoritesByIds, arg.StudioIds, arg.UserID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []FindStudioFavoritesByIdsRow{}\n\tfor rows.Next() {\n\t\tvar i FindStudioFavoritesByIdsRow\n\t\tif err := rows.Scan(&i.StudioID, &i.IsFavorite); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findStudioUrlsByIds = `-- name: FindStudioUrlsByIds :many\nSELECT studio_id, url, site_id FROM studio_urls WHERE studio_id = ANY($1::UUID[])\n`\n\n// Get URLs for multiple studios\nfunc (q *Queries) FindStudioUrlsByIds(ctx context.Context, studioIds []uuid.UUID) ([]StudioUrl, error) {\n\trows, err := q.db.Query(ctx, findStudioUrlsByIds, studioIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []StudioUrl{}\n\tfor rows.Next() {\n\t\tvar i StudioUrl\n\t\tif err := rows.Scan(&i.StudioID, &i.Url, &i.SiteID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findStudioWithRedirect = `-- name: FindStudioWithRedirect :one\nSELECT s.id, s.name, s.parent_studio_id, s.created_at, s.updated_at, s.deleted FROM studios S\nWHERE S.id = $1 AND S.deleted = FALSE\nUNION\nSELECT ss.id, ss.name, ss.parent_studio_id, ss.created_at, ss.updated_at, ss.deleted FROM studio_redirects R\nJOIN studios SS ON SS.id = R.target_id\nWHERE R.source_id = $1 AND SS.deleted = FALSE\n`\n\nfunc (q *Queries) FindStudioWithRedirect(ctx context.Context, id uuid.UUID) (Studio, error) {\n\trow := q.db.QueryRow(ctx, findStudioWithRedirect, id)\n\tvar i Studio\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.ParentStudioID,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t)\n\treturn i, err\n}\n\nconst getChildStudios = `-- name: GetChildStudios :many\nSELECT id, name, parent_studio_id, created_at, updated_at, deleted FROM studios WHERE parent_studio_id = $1 AND deleted = false ORDER BY name\n`\n\nfunc (q *Queries) GetChildStudios(ctx context.Context, parentStudioID uuid.NullUUID) ([]Studio, error) {\n\trows, err := q.db.Query(ctx, getChildStudios, parentStudioID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Studio{}\n\tfor rows.Next() {\n\t\tvar i Studio\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Name,\n\t\t\t&i.ParentStudioID,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Deleted,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getStudioAliases = `-- name: GetStudioAliases :many\nSELECT alias FROM studio_aliases WHERE studio_id = $1\n`\n\nfunc (q *Queries) GetStudioAliases(ctx context.Context, studioID uuid.UUID) ([]string, error) {\n\trows, err := q.db.Query(ctx, getStudioAliases, studioID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []string{}\n\tfor rows.Next() {\n\t\tvar alias string\n\t\tif err := rows.Scan(&alias); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, alias)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getStudioImages = `-- name: GetStudioImages :many\nSELECT image_id FROM studio_images WHERE studio_id = $1\n`\n\nfunc (q *Queries) GetStudioImages(ctx context.Context, studioID uuid.UUID) ([]uuid.UUID, error) {\n\trows, err := q.db.Query(ctx, getStudioImages, studioID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []uuid.UUID{}\n\tfor rows.Next() {\n\t\tvar image_id uuid.UUID\n\t\tif err := rows.Scan(&image_id); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, image_id)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getStudioURLs = `-- name: GetStudioURLs :many\nSELECT studio_id, url, site_id FROM studio_urls WHERE studio_id = $1\n`\n\nfunc (q *Queries) GetStudioURLs(ctx context.Context, studioID uuid.UUID) ([]StudioUrl, error) {\n\trows, err := q.db.Query(ctx, getStudioURLs, studioID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []StudioUrl{}\n\tfor rows.Next() {\n\t\tvar i StudioUrl\n\t\tif err := rows.Scan(&i.StudioID, &i.Url, &i.SiteID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getStudios = `-- name: GetStudios :many\nSELECT id, name, parent_studio_id, created_at, updated_at, deleted FROM studios WHERE id = ANY($1::UUID[]) ORDER BY name\n`\n\nfunc (q *Queries) GetStudios(ctx context.Context, dollar_1 []uuid.UUID) ([]Studio, error) {\n\trows, err := q.db.Query(ctx, getStudios, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Studio{}\n\tfor rows.Next() {\n\t\tvar i Studio\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Name,\n\t\t\t&i.ParentStudioID,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Deleted,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getStudiosByPerformer = `-- name: GetStudiosByPerformer :many\nSELECT\n    studios.id, studios.name, studios.parent_studio_id, studios.created_at, studios.updated_at, studios.deleted,\n    COUNT(scenes.id) as scene_count\nFROM studios\nJOIN scenes ON studios.id = scenes.studio_id\nJOIN scene_performers SP ON scenes.id = SP.scene_id\nWHERE SP.performer_id = $1\nGROUP BY studios.id\n`\n\ntype GetStudiosByPerformerRow struct {\n\tStudio     Studio `db:\"studio\" json:\"studio\"`\n\tSceneCount int64  `db:\"scene_count\" json:\"scene_count\"`\n}\n\nfunc (q *Queries) GetStudiosByPerformer(ctx context.Context, performerID uuid.UUID) ([]GetStudiosByPerformerRow, error) {\n\trows, err := q.db.Query(ctx, getStudiosByPerformer, performerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []GetStudiosByPerformerRow{}\n\tfor rows.Next() {\n\t\tvar i GetStudiosByPerformerRow\n\t\tif err := rows.Scan(\n\t\t\t&i.Studio.ID,\n\t\t\t&i.Studio.Name,\n\t\t\t&i.Studio.ParentStudioID,\n\t\t\t&i.Studio.CreatedAt,\n\t\t\t&i.Studio.UpdatedAt,\n\t\t\t&i.Studio.Deleted,\n\t\t\t&i.SceneCount,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getStudiosByPerformerAndNetwork = `-- name: GetStudiosByPerformerAndNetwork :many\nWITH studio_network AS (\n    -- The studio itself\n    SELECT $2::uuid AS id\n    UNION\n    -- Parent studio (if exists)\n    SELECT parent_studio_id AS id FROM studios WHERE id = $2 AND parent_studio_id IS NOT NULL\n    UNION\n    -- Child studios\n    SELECT id FROM studios WHERE parent_studio_id = $2 AND deleted = FALSE\n)\nSELECT\n    studios.id, studios.name, studios.parent_studio_id, studios.created_at, studios.updated_at, studios.deleted,\n    COUNT(scenes.id) as scene_count\nFROM studios\nJOIN scenes ON studios.id = scenes.studio_id\nJOIN scene_performers SP ON scenes.id = SP.scene_id\nWHERE SP.performer_id = $1\n  AND studios.id IN (SELECT id FROM studio_network WHERE id IS NOT NULL)\nGROUP BY studios.id\n`\n\ntype GetStudiosByPerformerAndNetworkParams struct {\n\tPerformerID uuid.UUID `db:\"performer_id\" json:\"performer_id\"`\n\tStudioID    uuid.UUID `db:\"studio_id\" json:\"studio_id\"`\n}\n\ntype GetStudiosByPerformerAndNetworkRow struct {\n\tStudio     Studio `db:\"studio\" json:\"studio\"`\n\tSceneCount int64  `db:\"scene_count\" json:\"scene_count\"`\n}\n\n// Get studios where performer has scenes, filtered to a studio network (the studio, its parent, and children)\nfunc (q *Queries) GetStudiosByPerformerAndNetwork(ctx context.Context, arg GetStudiosByPerformerAndNetworkParams) ([]GetStudiosByPerformerAndNetworkRow, error) {\n\trows, err := q.db.Query(ctx, getStudiosByPerformerAndNetwork, arg.PerformerID, arg.StudioID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []GetStudiosByPerformerAndNetworkRow{}\n\tfor rows.Next() {\n\t\tvar i GetStudiosByPerformerAndNetworkRow\n\t\tif err := rows.Scan(\n\t\t\t&i.Studio.ID,\n\t\t\t&i.Studio.Name,\n\t\t\t&i.Studio.ParentStudioID,\n\t\t\t&i.Studio.CreatedAt,\n\t\t\t&i.Studio.UpdatedAt,\n\t\t\t&i.Studio.Deleted,\n\t\t\t&i.SceneCount,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst reassignStudioFavorites = `-- name: ReassignStudioFavorites :exec\nUPDATE studio_favorites\n   SET studio_id = $1\n   WHERE studio_favorites.studio_id = $2\n   AND user_id NOT IN (\n    SELECT user_id\n    FROM studio_favorites SF\n    WHERE SF.studio_id = $1\n  )\n`\n\ntype ReassignStudioFavoritesParams struct {\n\tNewStudioID uuid.UUID `db:\"new_studio_id\" json:\"new_studio_id\"`\n\tOldStudioID uuid.UUID `db:\"old_studio_id\" json:\"old_studio_id\"`\n}\n\nfunc (q *Queries) ReassignStudioFavorites(ctx context.Context, arg ReassignStudioFavoritesParams) error {\n\t_, err := q.db.Exec(ctx, reassignStudioFavorites, arg.NewStudioID, arg.OldStudioID)\n\treturn err\n}\n\nconst searchStudios = `-- name: SearchStudios :many\nSELECT\n    studio_id,\n    pdb.agg('{\"value_count\": {\"field\": \"studio_id\"}}') OVER () as total_count\nFROM studio_search\nWHERE studio_id @@@ paradedb.boolean(\n    should => ARRAY[\n        paradedb.boost(factor => 2, query => paradedb.match(field => 'name', value => $1::TEXT)),\n        paradedb.match(field => 'network', value => $1::TEXT),\n        paradedb.match(field => 'aliases', value => $1::TEXT)\n    ]\n)\nORDER BY pdb.score(studio_id) DESC\nLIMIT $2\n`\n\ntype SearchStudiosParams struct {\n\tTerm  *string `db:\"term\" json:\"term\"`\n\tLimit int32   `db:\"limit\" json:\"limit\"`\n}\n\ntype SearchStudiosRow struct {\n\tStudioID   uuid.UUID   `db:\"studio_id\" json:\"studio_id\"`\n\tTotalCount interface{} `db:\"total_count\" json:\"total_count\"`\n}\n\nfunc (q *Queries) SearchStudios(ctx context.Context, arg SearchStudiosParams) ([]SearchStudiosRow, error) {\n\trows, err := q.db.Query(ctx, searchStudios, arg.Term, arg.Limit)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []SearchStudiosRow{}\n\tfor rows.Next() {\n\t\tvar i SearchStudiosRow\n\t\tif err := rows.Scan(&i.StudioID, &i.TotalCount); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst softDeleteStudio = `-- name: SoftDeleteStudio :one\nUPDATE studios SET deleted = true, updated_at = NOW() WHERE id = $1\nRETURNING id, name, parent_studio_id, created_at, updated_at, deleted\n`\n\nfunc (q *Queries) SoftDeleteStudio(ctx context.Context, id uuid.UUID) (Studio, error) {\n\trow := q.db.QueryRow(ctx, softDeleteStudio, id)\n\tvar i Studio\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.ParentStudioID,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t)\n\treturn i, err\n}\n\nconst updateStudio = `-- name: UpdateStudio :one\nUPDATE studios \nSET name = $2, parent_studio_id = $3, updated_at = NOW()\nWHERE id = $1\nRETURNING id, name, parent_studio_id, created_at, updated_at, deleted\n`\n\ntype UpdateStudioParams struct {\n\tID             uuid.UUID     `db:\"id\" json:\"id\"`\n\tName           string        `db:\"name\" json:\"name\"`\n\tParentStudioID uuid.NullUUID `db:\"parent_studio_id\" json:\"parent_studio_id\"`\n}\n\nfunc (q *Queries) UpdateStudio(ctx context.Context, arg UpdateStudioParams) (Studio, error) {\n\trow := q.db.QueryRow(ctx, updateStudio, arg.ID, arg.Name, arg.ParentStudioID)\n\tvar i Studio\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.ParentStudioID,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t)\n\treturn i, err\n}\n\nconst updateStudioRedirects = `-- name: UpdateStudioRedirects :exec\nUPDATE studio_redirects SET target_id = $1 WHERE target_id = $2\n`\n\ntype UpdateStudioRedirectsParams struct {\n\tNewTargetID uuid.UUID `db:\"new_target_id\" json:\"new_target_id\"`\n\tOldTargetID uuid.UUID `db:\"old_target_id\" json:\"old_target_id\"`\n}\n\nfunc (q *Queries) UpdateStudioRedirects(ctx context.Context, arg UpdateStudioRedirectsParams) error {\n\t_, err := q.db.Exec(ctx, updateStudioRedirects, arg.NewTargetID, arg.OldTargetID)\n\treturn err\n}\n"
  },
  {
    "path": "internal/queries/tag.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: tag.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\ntype CreateSceneTagsParams struct {\n\tSceneID uuid.UUID `db:\"scene_id\" json:\"scene_id\"`\n\tTagID   uuid.UUID `db:\"tag_id\" json:\"tag_id\"`\n}\n\nconst createTag = `-- name: CreateTag :one\n\nINSERT INTO tags (id, name, category_id, description, created_at, updated_at)\nVALUES ($1, $2, $3, $4, now(), now())\nRETURNING id, name, description, created_at, updated_at, deleted, category_id\n`\n\ntype CreateTagParams struct {\n\tID          uuid.UUID     `db:\"id\" json:\"id\"`\n\tName        string        `db:\"name\" json:\"name\"`\n\tCategoryID  uuid.NullUUID `db:\"category_id\" json:\"category_id\"`\n\tDescription *string       `db:\"description\" json:\"description\"`\n}\n\n// Tag queries\nfunc (q *Queries) CreateTag(ctx context.Context, arg CreateTagParams) (Tag, error) {\n\trow := q.db.QueryRow(ctx, createTag,\n\t\targ.ID,\n\t\targ.Name,\n\t\targ.CategoryID,\n\t\targ.Description,\n\t)\n\tvar i Tag\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Description,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t\t&i.CategoryID,\n\t)\n\treturn i, err\n}\n\ntype CreateTagAliasesParams struct {\n\tTagID uuid.UUID `db:\"tag_id\" json:\"tag_id\"`\n\tAlias string    `db:\"alias\" json:\"alias\"`\n}\n\nconst createTagRedirect = `-- name: CreateTagRedirect :exec\n\nINSERT INTO tag_redirects (source_id, target_id) VALUES ($1, $2)\n`\n\ntype CreateTagRedirectParams struct {\n\tSourceID uuid.UUID `db:\"source_id\" json:\"source_id\"`\n\tTargetID uuid.UUID `db:\"target_id\" json:\"target_id\"`\n}\n\n// Tag redirects\nfunc (q *Queries) CreateTagRedirect(ctx context.Context, arg CreateTagRedirectParams) error {\n\t_, err := q.db.Exec(ctx, createTagRedirect, arg.SourceID, arg.TargetID)\n\treturn err\n}\n\nconst deleteSceneTagsByScene = `-- name: DeleteSceneTagsByScene :exec\nDELETE FROM scene_tags WHERE scene_id = $1\n`\n\nfunc (q *Queries) DeleteSceneTagsByScene(ctx context.Context, sceneID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteSceneTagsByScene, sceneID)\n\treturn err\n}\n\nconst deleteSceneTagsByTag = `-- name: DeleteSceneTagsByTag :exec\nDELETE FROM scene_tags WHERE tag_id = $1\n`\n\nfunc (q *Queries) DeleteSceneTagsByTag(ctx context.Context, tagID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteSceneTagsByTag, tagID)\n\treturn err\n}\n\nconst deleteTag = `-- name: DeleteTag :exec\nDELETE FROM tags WHERE id = $1\n`\n\nfunc (q *Queries) DeleteTag(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteTag, id)\n\treturn err\n}\n\nconst deleteTagAliases = `-- name: DeleteTagAliases :exec\nDELETE FROM tag_aliases WHERE tag_id = $1\n`\n\nfunc (q *Queries) DeleteTagAliases(ctx context.Context, tagID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteTagAliases, tagID)\n\treturn err\n}\n\nconst deleteTagAliasesByNames = `-- name: DeleteTagAliasesByNames :exec\nDELETE FROM tag_aliases WHERE tag_id = $1 AND alias = ANY($2::TEXT[])\n`\n\ntype DeleteTagAliasesByNamesParams struct {\n\tTagID   uuid.UUID `db:\"tag_id\" json:\"tag_id\"`\n\tColumn2 []string  `db:\"column_2\" json:\"column_2\"`\n}\n\nfunc (q *Queries) DeleteTagAliasesByNames(ctx context.Context, arg DeleteTagAliasesByNamesParams) error {\n\t_, err := q.db.Exec(ctx, deleteTagAliasesByNames, arg.TagID, arg.Column2)\n\treturn err\n}\n\nconst findTag = `-- name: FindTag :one\nSELECT id, name, description, created_at, updated_at, deleted, category_id FROM tags WHERE id = $1\n`\n\nfunc (q *Queries) FindTag(ctx context.Context, id uuid.UUID) (Tag, error) {\n\trow := q.db.QueryRow(ctx, findTag, id)\n\tvar i Tag\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Description,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t\t&i.CategoryID,\n\t)\n\treturn i, err\n}\n\nconst findTagByAlias = `-- name: FindTagByAlias :one\nSELECT t.id, t.name, t.description, t.created_at, t.updated_at, t.deleted, t.category_id FROM tags t\nJOIN tag_aliases ta ON t.id = ta.tag_id\nWHERE UPPER(ta.alias) = UPPER($1) AND t.deleted = false\n`\n\nfunc (q *Queries) FindTagByAlias(ctx context.Context, upper interface{}) (Tag, error) {\n\trow := q.db.QueryRow(ctx, findTagByAlias, upper)\n\tvar i Tag\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Description,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t\t&i.CategoryID,\n\t)\n\treturn i, err\n}\n\nconst findTagByName = `-- name: FindTagByName :one\nSELECT id, name, description, created_at, updated_at, deleted, category_id FROM tags WHERE UPPER(name) = UPPER($1) AND deleted = false\n`\n\nfunc (q *Queries) FindTagByName(ctx context.Context, upper interface{}) (Tag, error) {\n\trow := q.db.QueryRow(ctx, findTagByName, upper)\n\tvar i Tag\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Description,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t\t&i.CategoryID,\n\t)\n\treturn i, err\n}\n\nconst findTagByNameOrAlias = `-- name: FindTagByNameOrAlias :one\nSELECT t.id, t.name, t.description, t.created_at, t.updated_at, t.deleted, t.category_id FROM tags T\nLEFT JOIN tag_aliases TA ON T.id = TA.tag_id\nWHERE (\n  LOWER(TA.alias) = LOWER($1)\n  OR LOWER(T.name) = LOWER($1)\n) AND T.deleted = FALSE\n`\n\nfunc (q *Queries) FindTagByNameOrAlias(ctx context.Context, lower string) (Tag, error) {\n\trow := q.db.QueryRow(ctx, findTagByNameOrAlias, lower)\n\tvar i Tag\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Description,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t\t&i.CategoryID,\n\t)\n\treturn i, err\n}\n\nconst findTagIdsBySceneIds = `-- name: FindTagIdsBySceneIds :many\nSELECT scene_id, tag_id FROM scene_tags WHERE scene_id = ANY($1::UUID[])\n`\n\n// Bulk query to find tag IDs for multiple scene IDs\nfunc (q *Queries) FindTagIdsBySceneIds(ctx context.Context, sceneIds []uuid.UUID) ([]SceneTag, error) {\n\trows, err := q.db.Query(ctx, findTagIdsBySceneIds, sceneIds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []SceneTag{}\n\tfor rows.Next() {\n\t\tvar i SceneTag\n\t\tif err := rows.Scan(&i.SceneID, &i.TagID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findTagWithRedirect = `-- name: FindTagWithRedirect :many\nSELECT t.id, t.name, t.description, t.created_at, t.updated_at, t.deleted, t.category_id FROM tags T\nWHERE T.id = $1 AND T.deleted = FALSE\nUNION\nSELECT tt.id, tt.name, tt.description, tt.created_at, tt.updated_at, tt.deleted, tt.category_id FROM tag_redirects R\nJOIN tags TT ON TT.id = R.target_id\nWHERE R.source_id = $1 AND TT.deleted = FALSE\n`\n\nfunc (q *Queries) FindTagWithRedirect(ctx context.Context, id uuid.UUID) ([]Tag, error) {\n\trows, err := q.db.Query(ctx, findTagWithRedirect, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Tag{}\n\tfor rows.Next() {\n\t\tvar i Tag\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Name,\n\t\t\t&i.Description,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Deleted,\n\t\t\t&i.CategoryID,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findTagsByIds = `-- name: FindTagsByIds :many\nSELECT id, name, description, created_at, updated_at, deleted, category_id FROM tags WHERE id = ANY($1::UUID[])\n`\n\nfunc (q *Queries) FindTagsByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]Tag, error) {\n\trows, err := q.db.Query(ctx, findTagsByIds, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Tag{}\n\tfor rows.Next() {\n\t\tvar i Tag\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Name,\n\t\t\t&i.Description,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Deleted,\n\t\t\t&i.CategoryID,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findTagsBySceneID = `-- name: FindTagsBySceneID :many\nSELECT t.id, t.name, t.description, t.created_at, t.updated_at, t.deleted, t.category_id FROM tags t\nINNER JOIN scene_tags st ON st.tag_id = t.id\nWHERE st.scene_id = $1\n`\n\nfunc (q *Queries) FindTagsBySceneID(ctx context.Context, sceneID uuid.UUID) ([]Tag, error) {\n\trows, err := q.db.Query(ctx, findTagsBySceneID, sceneID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Tag{}\n\tfor rows.Next() {\n\t\tvar i Tag\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Name,\n\t\t\t&i.Description,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Deleted,\n\t\t\t&i.CategoryID,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getSceneTags = `-- name: GetSceneTags :many\nSELECT t.id, t.name, t.description, t.created_at, t.updated_at, t.deleted, t.category_id FROM scene_tags ST JOIN tags T ON ST.tag_id = T.id WHERE scene_id = $1\n`\n\nfunc (q *Queries) GetSceneTags(ctx context.Context, sceneID uuid.UUID) ([]Tag, error) {\n\trows, err := q.db.Query(ctx, getSceneTags, sceneID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Tag{}\n\tfor rows.Next() {\n\t\tvar i Tag\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Name,\n\t\t\t&i.Description,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Deleted,\n\t\t\t&i.CategoryID,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getTagAliases = `-- name: GetTagAliases :many\nSELECT alias FROM tag_aliases WHERE tag_id = $1\n`\n\nfunc (q *Queries) GetTagAliases(ctx context.Context, tagID uuid.UUID) ([]string, error) {\n\trows, err := q.db.Query(ctx, getTagAliases, tagID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []string{}\n\tfor rows.Next() {\n\t\tvar alias string\n\t\tif err := rows.Scan(&alias); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, alias)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst searchTags = `-- name: SearchTags :many\nSELECT t.id, t.name, t.description, t.created_at, t.updated_at, t.deleted, t.category_id FROM tags T\nJOIN tag_search TS ON TS.tag_id = T.id\nWHERE TS.tag_id @@@ paradedb.boolean(should => ARRAY[\n    paradedb.fuzzy_term(field => 'name', value => $1::TEXT, distance => 1, prefix => true),\n    paradedb.fuzzy_term(field => 'aliases', value => $1::TEXT, distance => 1, prefix => true)\n])\nAND T.deleted = FALSE\nORDER BY paradedb.score(TS.tag_id) DESC\nLIMIT $2\n`\n\ntype SearchTagsParams struct {\n\tTerm  *string `db:\"term\" json:\"term\"`\n\tLimit int32   `db:\"limit\" json:\"limit\"`\n}\n\nfunc (q *Queries) SearchTags(ctx context.Context, arg SearchTagsParams) ([]Tag, error) {\n\trows, err := q.db.Query(ctx, searchTags, arg.Term, arg.Limit)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []Tag{}\n\tfor rows.Next() {\n\t\tvar i Tag\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Name,\n\t\t\t&i.Description,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t\t&i.Deleted,\n\t\t\t&i.CategoryID,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst softDeleteTag = `-- name: SoftDeleteTag :one\nUPDATE tags SET deleted = true, updated_at = NOW() WHERE id = $1\nRETURNING id, name, description, created_at, updated_at, deleted, category_id\n`\n\nfunc (q *Queries) SoftDeleteTag(ctx context.Context, id uuid.UUID) (Tag, error) {\n\trow := q.db.QueryRow(ctx, softDeleteTag, id)\n\tvar i Tag\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Description,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t\t&i.CategoryID,\n\t)\n\treturn i, err\n}\n\nconst updateSceneTagsForMerge = `-- name: UpdateSceneTagsForMerge :exec\nUPDATE scene_tags\nSET tag_id = $1\nWHERE scene_tags.tag_id = $2\nAND scene_id NOT IN (SELECT scene_id from scene_tags st WHERE st.tag_id = $1)\n`\n\ntype UpdateSceneTagsForMergeParams struct {\n\tNewTagID uuid.UUID `db:\"new_tag_id\" json:\"new_tag_id\"`\n\tOldTagID uuid.UUID `db:\"old_tag_id\" json:\"old_tag_id\"`\n}\n\nfunc (q *Queries) UpdateSceneTagsForMerge(ctx context.Context, arg UpdateSceneTagsForMergeParams) error {\n\t_, err := q.db.Exec(ctx, updateSceneTagsForMerge, arg.NewTagID, arg.OldTagID)\n\treturn err\n}\n\nconst updateTag = `-- name: UpdateTag :one\nUPDATE tags \nSET name = $2, category_id = $3, description = $4, updated_at = NOW()\nWHERE id = $1\nRETURNING id, name, description, created_at, updated_at, deleted, category_id\n`\n\ntype UpdateTagParams struct {\n\tID          uuid.UUID     `db:\"id\" json:\"id\"`\n\tName        string        `db:\"name\" json:\"name\"`\n\tCategoryID  uuid.NullUUID `db:\"category_id\" json:\"category_id\"`\n\tDescription *string       `db:\"description\" json:\"description\"`\n}\n\nfunc (q *Queries) UpdateTag(ctx context.Context, arg UpdateTagParams) (Tag, error) {\n\trow := q.db.QueryRow(ctx, updateTag,\n\t\targ.ID,\n\t\targ.Name,\n\t\targ.CategoryID,\n\t\targ.Description,\n\t)\n\tvar i Tag\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.Description,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.Deleted,\n\t\t&i.CategoryID,\n\t)\n\treturn i, err\n}\n\nconst updateTagRedirects = `-- name: UpdateTagRedirects :exec\nUPDATE tag_redirects SET target_id = $1 WHERE target_id = $2\n`\n\ntype UpdateTagRedirectsParams struct {\n\tNewTargetID uuid.UUID `db:\"new_target_id\" json:\"new_target_id\"`\n\tOldTargetID uuid.UUID `db:\"old_target_id\" json:\"old_target_id\"`\n}\n\nfunc (q *Queries) UpdateTagRedirects(ctx context.Context, arg UpdateTagRedirectsParams) error {\n\t_, err := q.db.Exec(ctx, updateTagRedirects, arg.NewTargetID, arg.OldTargetID)\n\treturn err\n}\n"
  },
  {
    "path": "internal/queries/tag_category.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: tag_category.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\nconst createTagCategory = `-- name: CreateTagCategory :one\n\nINSERT INTO tag_categories (id, \"group\", name, description, created_at, updated_at)\nVALUES ($1, $2, $3, $4, now(), now())\nRETURNING id, \"group\", name, description, created_at, updated_at\n`\n\ntype CreateTagCategoryParams struct {\n\tID          uuid.UUID `db:\"id\" json:\"id\"`\n\tGroup       string    `db:\"group\" json:\"group\"`\n\tName        string    `db:\"name\" json:\"name\"`\n\tDescription *string   `db:\"description\" json:\"description\"`\n}\n\n// Tag category queries\nfunc (q *Queries) CreateTagCategory(ctx context.Context, arg CreateTagCategoryParams) (TagCategory, error) {\n\trow := q.db.QueryRow(ctx, createTagCategory,\n\t\targ.ID,\n\t\targ.Group,\n\t\targ.Name,\n\t\targ.Description,\n\t)\n\tvar i TagCategory\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Group,\n\t\t&i.Name,\n\t\t&i.Description,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t)\n\treturn i, err\n}\n\nconst deleteTagCategory = `-- name: DeleteTagCategory :exec\nDELETE FROM tag_categories WHERE id = $1\n`\n\nfunc (q *Queries) DeleteTagCategory(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteTagCategory, id)\n\treturn err\n}\n\nconst findTagCategory = `-- name: FindTagCategory :one\nSELECT id, \"group\", name, description, created_at, updated_at FROM tag_categories WHERE id = $1\n`\n\nfunc (q *Queries) FindTagCategory(ctx context.Context, id uuid.UUID) (TagCategory, error) {\n\trow := q.db.QueryRow(ctx, findTagCategory, id)\n\tvar i TagCategory\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Group,\n\t\t&i.Name,\n\t\t&i.Description,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t)\n\treturn i, err\n}\n\nconst getAllTagCategories = `-- name: GetAllTagCategories :many\nSELECT id, \"group\", name, description, created_at, updated_at FROM tag_categories ORDER BY name ASC\n`\n\nfunc (q *Queries) GetAllTagCategories(ctx context.Context) ([]TagCategory, error) {\n\trows, err := q.db.Query(ctx, getAllTagCategories)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []TagCategory{}\n\tfor rows.Next() {\n\t\tvar i TagCategory\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Group,\n\t\t\t&i.Name,\n\t\t\t&i.Description,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getTagCategoriesByIds = `-- name: GetTagCategoriesByIds :many\nSELECT id, \"group\", name, description, created_at, updated_at FROM tag_categories WHERE id = ANY($1::UUID[])\n`\n\nfunc (q *Queries) GetTagCategoriesByIds(ctx context.Context, dollar_1 []uuid.UUID) ([]TagCategory, error) {\n\trows, err := q.db.Query(ctx, getTagCategoriesByIds, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []TagCategory{}\n\tfor rows.Next() {\n\t\tvar i TagCategory\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Group,\n\t\t\t&i.Name,\n\t\t\t&i.Description,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.UpdatedAt,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst updateTagCategory = `-- name: UpdateTagCategory :one\nUPDATE tag_categories \nSET \"group\" = $2, name = $3, description = $4, updated_at = now()\nWHERE id = $1\nRETURNING id, \"group\", name, description, created_at, updated_at\n`\n\ntype UpdateTagCategoryParams struct {\n\tID          uuid.UUID `db:\"id\" json:\"id\"`\n\tGroup       string    `db:\"group\" json:\"group\"`\n\tName        string    `db:\"name\" json:\"name\"`\n\tDescription *string   `db:\"description\" json:\"description\"`\n}\n\nfunc (q *Queries) UpdateTagCategory(ctx context.Context, arg UpdateTagCategoryParams) (TagCategory, error) {\n\trow := q.db.QueryRow(ctx, updateTagCategory,\n\t\targ.ID,\n\t\targ.Group,\n\t\targ.Name,\n\t\targ.Description,\n\t)\n\tvar i TagCategory\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Group,\n\t\t&i.Name,\n\t\t&i.Description,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t)\n\treturn i, err\n}\n"
  },
  {
    "path": "internal/queries/types.go",
    "content": "package queries\n\n// WithTxnFunc is a function type for handling transactions\n// The function receives a *Queries object initialized with the transaction\ntype WithTxnFunc func(func(*Queries) error) error\n\n// Service interface that all services should implement\ntype Service interface {\n\tWithTxn(func(*Queries) error) error\n}\n"
  },
  {
    "path": "internal/queries/user.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: user.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\nconst countUserEditsByStatus = `-- name: CountUserEditsByStatus :many\nSELECT status, COUNT(*) as count FROM edits WHERE user_id = $1 GROUP BY status\n`\n\ntype CountUserEditsByStatusRow struct {\n\tStatus string `db:\"status\" json:\"status\"`\n\tCount  int64  `db:\"count\" json:\"count\"`\n}\n\nfunc (q *Queries) CountUserEditsByStatus(ctx context.Context, userID uuid.NullUUID) ([]CountUserEditsByStatusRow, error) {\n\trows, err := q.db.Query(ctx, countUserEditsByStatus, userID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []CountUserEditsByStatusRow{}\n\tfor rows.Next() {\n\t\tvar i CountUserEditsByStatusRow\n\t\tif err := rows.Scan(&i.Status, &i.Count); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst countUsers = `-- name: CountUsers :one\nSELECT COUNT(*) FROM users\n`\n\nfunc (q *Queries) CountUsers(ctx context.Context) (int64, error) {\n\trow := q.db.QueryRow(ctx, countUsers)\n\tvar count int64\n\terr := row.Scan(&count)\n\treturn count, err\n}\n\nconst countVotesByType = `-- name: CountVotesByType :many\nSELECT vote, COUNT(*) as count FROM edit_votes WHERE user_id = $1 GROUP BY vote\n`\n\ntype CountVotesByTypeRow struct {\n\tVote  string `db:\"vote\" json:\"vote\"`\n\tCount int64  `db:\"count\" json:\"count\"`\n}\n\nfunc (q *Queries) CountVotesByType(ctx context.Context, userID uuid.UUID) ([]CountVotesByTypeRow, error) {\n\trows, err := q.db.Query(ctx, countVotesByType, userID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []CountVotesByTypeRow{}\n\tfor rows.Next() {\n\t\tvar i CountVotesByTypeRow\n\t\tif err := rows.Scan(&i.Vote, &i.Count); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst createUser = `-- name: CreateUser :one\n\nINSERT INTO users (id, name, password_hash, email, api_key, api_calls, invite_tokens, invited_by, last_api_call, created_at, updated_at)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, NOW(), NOW(), NOW())\nRETURNING id, name, password_hash, email, api_key, api_calls, last_api_call, created_at, updated_at, invited_by, invite_tokens\n`\n\ntype CreateUserParams struct {\n\tID           uuid.UUID     `db:\"id\" json:\"id\"`\n\tName         string        `db:\"name\" json:\"name\"`\n\tPasswordHash string        `db:\"password_hash\" json:\"password_hash\"`\n\tEmail        string        `db:\"email\" json:\"email\"`\n\tApiKey       string        `db:\"api_key\" json:\"api_key\"`\n\tApiCalls     *int          `db:\"api_calls\" json:\"api_calls\"`\n\tInviteTokens int           `db:\"invite_tokens\" json:\"invite_tokens\"`\n\tInvitedBy    uuid.NullUUID `db:\"invited_by\" json:\"invited_by\"`\n}\n\n// User queries\nfunc (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (User, error) {\n\trow := q.db.QueryRow(ctx, createUser,\n\t\targ.ID,\n\t\targ.Name,\n\t\targ.PasswordHash,\n\t\targ.Email,\n\t\targ.ApiKey,\n\t\targ.ApiCalls,\n\t\targ.InviteTokens,\n\t\targ.InvitedBy,\n\t)\n\tvar i User\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.PasswordHash,\n\t\t&i.Email,\n\t\t&i.ApiKey,\n\t\t&i.ApiCalls,\n\t\t&i.LastApiCall,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.InvitedBy,\n\t\t&i.InviteTokens,\n\t)\n\treturn i, err\n}\n\ntype CreateUserRolesParams struct {\n\tUserID uuid.UUID `db:\"user_id\" json:\"user_id\"`\n\tRole   string    `db:\"role\" json:\"role\"`\n}\n\nconst deleteUser = `-- name: DeleteUser :exec\nDELETE FROM users WHERE id = $1\n`\n\nfunc (q *Queries) DeleteUser(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteUser, id)\n\treturn err\n}\n\nconst deleteUserRoles = `-- name: DeleteUserRoles :exec\nDELETE FROM user_roles WHERE user_id = $1\n`\n\nfunc (q *Queries) DeleteUserRoles(ctx context.Context, userID uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteUserRoles, userID)\n\treturn err\n}\n\nconst findUser = `-- name: FindUser :one\nSELECT id, name, password_hash, email, api_key, api_calls, last_api_call, created_at, updated_at, invited_by, invite_tokens FROM users WHERE id = $1\n`\n\nfunc (q *Queries) FindUser(ctx context.Context, id uuid.UUID) (User, error) {\n\trow := q.db.QueryRow(ctx, findUser, id)\n\tvar i User\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.PasswordHash,\n\t\t&i.Email,\n\t\t&i.ApiKey,\n\t\t&i.ApiCalls,\n\t\t&i.LastApiCall,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.InvitedBy,\n\t\t&i.InviteTokens,\n\t)\n\treturn i, err\n}\n\nconst findUserByEmail = `-- name: FindUserByEmail :one\nSELECT id, name, password_hash, email, api_key, api_calls, last_api_call, created_at, updated_at, invited_by, invite_tokens FROM users WHERE UPPER(email) = UPPER($1)\n`\n\nfunc (q *Queries) FindUserByEmail(ctx context.Context, upper interface{}) (User, error) {\n\trow := q.db.QueryRow(ctx, findUserByEmail, upper)\n\tvar i User\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.PasswordHash,\n\t\t&i.Email,\n\t\t&i.ApiKey,\n\t\t&i.ApiCalls,\n\t\t&i.LastApiCall,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.InvitedBy,\n\t\t&i.InviteTokens,\n\t)\n\treturn i, err\n}\n\nconst findUserByName = `-- name: FindUserByName :one\nSELECT id, name, password_hash, email, api_key, api_calls, last_api_call, created_at, updated_at, invited_by, invite_tokens FROM users WHERE UPPER(name) = UPPER($1::text)\n`\n\nfunc (q *Queries) FindUserByName(ctx context.Context, name string) (User, error) {\n\trow := q.db.QueryRow(ctx, findUserByName, name)\n\tvar i User\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.PasswordHash,\n\t\t&i.Email,\n\t\t&i.ApiKey,\n\t\t&i.ApiCalls,\n\t\t&i.LastApiCall,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.InvitedBy,\n\t\t&i.InviteTokens,\n\t)\n\treturn i, err\n}\n\nconst getUserNotificationSubscriptions = `-- name: GetUserNotificationSubscriptions :many\nSELECT type FROM user_notifications WHERE user_id = $1\n`\n\nfunc (q *Queries) GetUserNotificationSubscriptions(ctx context.Context, userID uuid.UUID) ([]NotificationType, error) {\n\trows, err := q.db.Query(ctx, getUserNotificationSubscriptions, userID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []NotificationType{}\n\tfor rows.Next() {\n\t\tvar type_ NotificationType\n\t\tif err := rows.Scan(&type_); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, type_)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst getUserRoles = `-- name: GetUserRoles :many\nSELECT role FROM user_roles WHERE user_id = $1\n`\n\nfunc (q *Queries) GetUserRoles(ctx context.Context, userID uuid.UUID) ([]string, error) {\n\trows, err := q.db.Query(ctx, getUserRoles, userID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []string{}\n\tfor rows.Next() {\n\t\tvar role string\n\t\tif err := rows.Scan(&role); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, role)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst updateUser = `-- name: UpdateUser :one\nUPDATE users \nSET name = $2, password_hash = $3, email = $4, updated_at = NOW()\nWHERE id = $1\nRETURNING id, name, password_hash, email, api_key, api_calls, last_api_call, created_at, updated_at, invited_by, invite_tokens\n`\n\ntype UpdateUserParams struct {\n\tID           uuid.UUID `db:\"id\" json:\"id\"`\n\tName         string    `db:\"name\" json:\"name\"`\n\tPasswordHash string    `db:\"password_hash\" json:\"password_hash\"`\n\tEmail        string    `db:\"email\" json:\"email\"`\n}\n\nfunc (q *Queries) UpdateUser(ctx context.Context, arg UpdateUserParams) (User, error) {\n\trow := q.db.QueryRow(ctx, updateUser,\n\t\targ.ID,\n\t\targ.Name,\n\t\targ.PasswordHash,\n\t\targ.Email,\n\t)\n\tvar i User\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Name,\n\t\t&i.PasswordHash,\n\t\t&i.Email,\n\t\t&i.ApiKey,\n\t\t&i.ApiCalls,\n\t\t&i.LastApiCall,\n\t\t&i.CreatedAt,\n\t\t&i.UpdatedAt,\n\t\t&i.InvitedBy,\n\t\t&i.InviteTokens,\n\t)\n\treturn i, err\n}\n\nconst updateUserAPIKey = `-- name: UpdateUserAPIKey :exec\nUPDATE users\nSET api_key = $2, updated_at = NOW()\nWHERE id = $1\n`\n\ntype UpdateUserAPIKeyParams struct {\n\tID     uuid.UUID `db:\"id\" json:\"id\"`\n\tApiKey string    `db:\"api_key\" json:\"api_key\"`\n}\n\nfunc (q *Queries) UpdateUserAPIKey(ctx context.Context, arg UpdateUserAPIKeyParams) error {\n\t_, err := q.db.Exec(ctx, updateUserAPIKey, arg.ID, arg.ApiKey)\n\treturn err\n}\n\nconst updateUserEmail = `-- name: UpdateUserEmail :exec\nUPDATE users\nSET email = $2, updated_at = NOW()\nWHERE id = $1\n`\n\ntype UpdateUserEmailParams struct {\n\tID    uuid.UUID `db:\"id\" json:\"id\"`\n\tEmail string    `db:\"email\" json:\"email\"`\n}\n\nfunc (q *Queries) UpdateUserEmail(ctx context.Context, arg UpdateUserEmailParams) error {\n\t_, err := q.db.Exec(ctx, updateUserEmail, arg.ID, arg.Email)\n\treturn err\n}\n\nconst updateUserInviteTokenCount = `-- name: UpdateUserInviteTokenCount :exec\nUPDATE users\nSET invite_tokens = $2\nWHERE id = $1\n`\n\ntype UpdateUserInviteTokenCountParams struct {\n\tID           uuid.UUID `db:\"id\" json:\"id\"`\n\tInviteTokens int       `db:\"invite_tokens\" json:\"invite_tokens\"`\n}\n\nfunc (q *Queries) UpdateUserInviteTokenCount(ctx context.Context, arg UpdateUserInviteTokenCountParams) error {\n\t_, err := q.db.Exec(ctx, updateUserInviteTokenCount, arg.ID, arg.InviteTokens)\n\treturn err\n}\n\nconst updateUserPassword = `-- name: UpdateUserPassword :exec\nUPDATE users\nSET password_hash = $2, updated_at = NOW()\nWHERE id = $1\n`\n\ntype UpdateUserPasswordParams struct {\n\tID           uuid.UUID `db:\"id\" json:\"id\"`\n\tPasswordHash string    `db:\"password_hash\" json:\"password_hash\"`\n}\n\nfunc (q *Queries) UpdateUserPassword(ctx context.Context, arg UpdateUserPasswordParams) error {\n\t_, err := q.db.Exec(ctx, updateUserPassword, arg.ID, arg.PasswordHash)\n\treturn err\n}\n"
  },
  {
    "path": "internal/queries/user_token.sql.go",
    "content": "// Code generated by sqlc. DO NOT EDIT.\n// versions:\n//   sqlc v1.29.0\n// source: user_token.sql\n\npackage queries\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\nconst createUserToken = `-- name: CreateUserToken :one\n\nINSERT INTO user_tokens (id, data, type, created_at, expires_at)\nVALUES ($1, $2, $3, $4, $5)\nRETURNING id, data, type, created_at, expires_at\n`\n\ntype CreateUserTokenParams struct {\n\tID        uuid.UUID `db:\"id\" json:\"id\"`\n\tData      []byte    `db:\"data\" json:\"data\"`\n\tType      string    `db:\"type\" json:\"type\"`\n\tCreatedAt time.Time `db:\"created_at\" json:\"created_at\"`\n\tExpiresAt time.Time `db:\"expires_at\" json:\"expires_at\"`\n}\n\n// User token queries\nfunc (q *Queries) CreateUserToken(ctx context.Context, arg CreateUserTokenParams) (UserToken, error) {\n\trow := q.db.QueryRow(ctx, createUserToken,\n\t\targ.ID,\n\t\targ.Data,\n\t\targ.Type,\n\t\targ.CreatedAt,\n\t\targ.ExpiresAt,\n\t)\n\tvar i UserToken\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Data,\n\t\t&i.Type,\n\t\t&i.CreatedAt,\n\t\t&i.ExpiresAt,\n\t)\n\treturn i, err\n}\n\nconst deleteExpiredUserTokens = `-- name: DeleteExpiredUserTokens :exec\nDELETE FROM user_tokens WHERE expires_at <= now()\n`\n\nfunc (q *Queries) DeleteExpiredUserTokens(ctx context.Context) error {\n\t_, err := q.db.Exec(ctx, deleteExpiredUserTokens)\n\treturn err\n}\n\nconst deleteUserToken = `-- name: DeleteUserToken :exec\nDELETE FROM user_tokens WHERE id = $1\n`\n\nfunc (q *Queries) DeleteUserToken(ctx context.Context, id uuid.UUID) error {\n\t_, err := q.db.Exec(ctx, deleteUserToken, id)\n\treturn err\n}\n\nconst findUserToken = `-- name: FindUserToken :one\nSELECT id, data, type, created_at, expires_at FROM user_tokens WHERE id = $1\n`\n\nfunc (q *Queries) FindUserToken(ctx context.Context, id uuid.UUID) (UserToken, error) {\n\trow := q.db.QueryRow(ctx, findUserToken, id)\n\tvar i UserToken\n\terr := row.Scan(\n\t\t&i.ID,\n\t\t&i.Data,\n\t\t&i.Type,\n\t\t&i.CreatedAt,\n\t\t&i.ExpiresAt,\n\t)\n\treturn i, err\n}\n\nconst findUserTokensByEmail = `-- name: FindUserTokensByEmail :many\nSELECT id, data, type, created_at, expires_at FROM user_tokens WHERE data->>'email' = $1::text\n`\n\nfunc (q *Queries) FindUserTokensByEmail(ctx context.Context, dollar_1 string) ([]UserToken, error) {\n\trows, err := q.db.Query(ctx, findUserTokensByEmail, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []UserToken{}\n\tfor rows.Next() {\n\t\tvar i UserToken\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Data,\n\t\t\t&i.Type,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.ExpiresAt,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n\nconst findUserTokensByInviteKey = `-- name: FindUserTokensByInviteKey :many\nSELECT id, data, type, created_at, expires_at FROM user_tokens WHERE (data->>'invite_key')::UUID = $1::UUID\n`\n\nfunc (q *Queries) FindUserTokensByInviteKey(ctx context.Context, dollar_1 uuid.UUID) ([]UserToken, error) {\n\trows, err := q.db.Query(ctx, findUserTokensByInviteKey, dollar_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\titems := []UserToken{}\n\tfor rows.Next() {\n\t\tvar i UserToken\n\t\tif err := rows.Scan(\n\t\t\t&i.ID,\n\t\t\t&i.Data,\n\t\t\t&i.Type,\n\t\t\t&i.CreatedAt,\n\t\t\t&i.ExpiresAt,\n\t\t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\titems = append(items, i)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn items, nil\n}\n"
  },
  {
    "path": "internal/service/draft/service.go",
    "content": "package draft\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\ntype Draft struct {\n\tqueries *queries.Queries\n\twithTxn queries.WithTxnFunc\n}\n\nfunc NewDraft(queries *queries.Queries, withTxn queries.WithTxnFunc) *Draft {\n\treturn &Draft{\n\t\tqueries: queries,\n\t\twithTxn: withTxn,\n\t}\n}\n\n// FindPerformers takes a slice of DraftEntity performers and returns SceneDraftPerformer models\n// by using FindPerformersWithRedirects to resolve existing performers or keep as DraftEntity\nfunc (s *Draft) FindPerformers(ctx context.Context, draftPerformers []models.DraftEntity) ([]models.SceneDraftPerformer, error) {\n\tvar result []models.SceneDraftPerformer\n\tfor _, p := range draftPerformers {\n\t\tif p.ID != nil {\n\t\t\tdbPerformers, err := s.queries.FindPerformerWithRedirect(ctx, *p.ID)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tif len(dbPerformers) > 0 {\n\t\t\t\tresult = append(result, converter.PerformerToModel(dbPerformers[0]))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tresult = append(result, p)\n\t}\n\n\treturn result, nil\n}\n\n// FindTags takes a slice of DraftEntity tags and returns SceneDraftTag models\n// by using FindTagsWithRedirects to resolve existing tags or keep as DraftEntity\nfunc (s *Draft) FindTags(ctx context.Context, draftTags []models.DraftEntity) ([]models.SceneDraftTag, error) {\n\tvar result []models.SceneDraftTag\n\tfor _, t := range draftTags {\n\t\tif t.ID != nil {\n\t\t\tdbTags, err := s.queries.FindTagWithRedirect(ctx, *t.ID)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tif len(dbTags) > 0 {\n\t\t\t\tresult = append(result, converter.TagToModel(dbTags[0]))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tresult = append(result, t)\n\t}\n\n\treturn result, nil\n}\n\n// FindStudio takes a DraftEntity studio and returns SceneDraftStudio model\n// by using FindStudioWithRedirect to resolve existing studio or keep as DraftEntity\nfunc (s *Draft) FindStudio(ctx context.Context, draftStudio *models.DraftEntity) (models.SceneDraftStudio, error) {\n\tif draftStudio == nil {\n\t\treturn nil, nil\n\t}\n\n\t// If the draft studio has an ID, try to find the actual studio\n\tif draftStudio.ID != nil {\n\t\tstudio, err := s.queries.FindStudioWithRedirect(ctx, *draftStudio.ID)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Return the converted studio\n\t\tconvertedStudio := converter.StudioToModel(studio)\n\t\treturn convertedStudio, nil\n\t}\n\n\t// If no ID, return the draft entity\n\treturn *draftStudio, nil\n}\n\nfunc (s *Draft) SubmitScene(ctx context.Context, input models.SceneDraftInput, imageID *uuid.UUID) (*models.DraftSubmissionStatus, error) {\n\tUUID, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tuser := auth.GetCurrentUser(ctx)\n\tnewDraft := queries.CreateDraftParams{\n\t\tID:     UUID,\n\t\tUserID: user.ID,\n\t\tType:   models.TargetTypeEnumScene.String(),\n\t}\n\n\tdata := converter.SceneDraftInputToSceneDraft(input)\n\tdata.Image = imageID\n\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tif len(input.Tags) > 0 {\n\t\t\ttags, err := s.resolveTags(ctx, input.Tags)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tdata.Tags = tags\n\t\t}\n\n\t\t// Temporary code, while we deprecate the URL parameter.\n\t\tif input.URL != nil {\n\t\t\tdata.URLs = []string{*input.URL}\n\t\t}\n\n\t\tjson, err := utils.ToJSON(data)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tnewDraft.Data = json\n\n\t\t_, err = tx.CreateDraft(ctx, newDraft)\n\t\treturn err\n\t})\n\n\tstatus := models.DraftSubmissionStatus{}\n\tif err == nil {\n\t\tstatus.ID = &newDraft.ID\n\t}\n\n\treturn &status, err\n}\n\nfunc (s *Draft) SubmitPerformer(ctx context.Context, input models.PerformerDraftInput, imageID *uuid.UUID) (*models.DraftSubmissionStatus, error) {\n\tUUID, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tuser := auth.GetCurrentUser(ctx)\n\tnewDraft := queries.CreateDraftParams{\n\t\tID:     UUID,\n\t\tUserID: user.ID,\n\t\tType:   models.TargetTypeEnumPerformer.String(),\n\t}\n\n\tdata := models.PerformerDraft{\n\t\tID:              input.ID,\n\t\tName:            input.Name,\n\t\tDisambiguation:  input.Disambiguation,\n\t\tAliases:         input.Aliases,\n\t\tGender:          input.Gender,\n\t\tBirthdate:       input.Birthdate,\n\t\tDeathdate:       input.Deathdate,\n\t\tUrls:            input.Urls,\n\t\tEthnicity:       input.Ethnicity,\n\t\tCountry:         input.Country,\n\t\tEyeColor:        input.EyeColor,\n\t\tHairColor:       input.HairColor,\n\t\tHeight:          input.Height,\n\t\tMeasurements:    input.Measurements,\n\t\tBreastType:      input.BreastType,\n\t\tTattoos:         input.Tattoos,\n\t\tPiercings:       input.Piercings,\n\t\tCareerStartYear: input.CareerStartYear,\n\t\tCareerEndYear:   input.CareerEndYear,\n\t\tImage:           imageID,\n\t}\n\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tjson, err := utils.ToJSON(data)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tnewDraft.Data = json\n\n\t\t_, err = tx.CreateDraft(ctx, newDraft)\n\t\treturn err\n\t})\n\n\tstatus := models.DraftSubmissionStatus{}\n\tif err == nil {\n\t\tstatus.ID = &newDraft.ID\n\t}\n\n\treturn &status, err\n}\n\nfunc (s *Draft) Destroy(ctx context.Context, user *models.User, id uuid.UUID) (bool, error) {\n\tdraft, err := s.queries.FindDraft(ctx, id)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tif user == nil || draft.UserID != user.ID {\n\t\treturn false, fmt.Errorf(\"unauthorized\")\n\t}\n\n\terr = s.queries.DeleteDraft(ctx, id)\n\treturn err == nil, err\n}\n\nfunc (s *Draft) resolveTags(ctx context.Context, tags []models.DraftEntityInput) ([]models.DraftEntity, error) {\n\tvar results []models.DraftEntity\n\tresultMap := make(map[string]bool)\n\n\tfor _, tag := range tags {\n\t\tres := models.DraftEntity{}\n\n\t\tif tag.ID != nil {\n\t\t\tdbTag, err := s.queries.FindTag(ctx, *tag.ID)\n\t\t\tif err == nil && dbTag.ID == *tag.ID {\n\t\t\t\tres.Name = dbTag.Name\n\t\t\t\tres.ID = &dbTag.ID\n\t\t\t}\n\t\t} else {\n\t\t\tfoundTag, err := s.queries.FindTagByNameOrAlias(ctx, tag.Name)\n\t\t\tif err == nil {\n\t\t\t\tres.Name = foundTag.Name\n\t\t\t\tres.ID = &foundTag.ID\n\t\t\t}\n\t\t}\n\n\t\tif res.Name == \"\" {\n\t\t\tres = models.DraftEntity{\n\t\t\t\tName: tag.Name,\n\t\t\t}\n\t\t}\n\n\t\tif _, exists := resultMap[res.Name]; !exists {\n\t\t\tresultMap[res.Name] = true\n\t\t\tresults = append(results, res)\n\t\t}\n\t}\n\n\treturn results, nil\n}\n\nfunc (s *Draft) FindByUser(ctx context.Context, userID uuid.UUID) ([]models.Draft, error) {\n\tdbDrafts, err := s.queries.FindDraftsByUser(ctx, userID)\n\tvar drafts []models.Draft\n\tfor _, draft := range dbDrafts {\n\t\tdrafts = append(drafts, converter.DraftToModel(draft))\n\t}\n\n\treturn drafts, err\n}\n\nfunc (s *Draft) FindByID(ctx context.Context, draftID uuid.UUID) (*models.Draft, error) {\n\tdraft, err := s.queries.FindDraft(ctx, draftID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn converter.DraftToModelPtr(draft), err\n}\n\nfunc (s *Draft) DeleteExpired(ctx context.Context) error {\n\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\treturn tx.DeleteExpiredDrafts(ctx, config.GetDraftTimeLimit())\n\t})\n}\n"
  },
  {
    "path": "internal/service/edit/edit.go",
    "content": "package edit\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\nvar ErrNoChanges = errors.New(\"edit contains no changes\")\nvar ErrMergeIDMissing = errors.New(\"merge target ID is required\")\nvar ErrMergeTargetIsSource = errors.New(\"merge target cannot be used as source\")\nvar ErrNoMergeSources = errors.New(\"no merge sources found\")\n\n// InputSpecifiedFunc is function that returns true if the qualified field name\n// was specified in the input. Used to distinguish between nil/empty fields and\n// unspecified fields\ntype InputSpecifiedFunc func(qualifiedField string) bool\n\ntype mutator struct {\n\tcontext context.Context\n\tedit    *models.Edit\n\tqueries *queries.Queries\n}\n\nfunc (m *mutator) operation() models.OperationEnum {\n\tvar operation models.OperationEnum\n\tutils.ResolveEnumString(m.edit.Operation, &operation)\n\treturn operation\n}\n\nfunc (m *mutator) CreateEdit() (*models.Edit, error) {\n\tcreated, err := m.queries.CreateEdit(m.context, converter.EditToCreateParams(*m.edit))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tconverted := converter.EditToModelPtr(created)\n\tm.edit = converted\n\treturn converted, nil\n}\n\nfunc (m *mutator) UpdateEdit() (*models.Edit, error) {\n\tm.edit.UpdateCount++\n\tupdatedEdit, err := m.queries.UpdateEdit(m.context, converter.EditToUpdateParams(*m.edit))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err := m.queries.ResetVotes(m.context, m.edit.ID); err != nil {\n\t\treturn nil, err\n\t}\n\treturn converter.EditToModelPtr(updatedEdit), nil\n}\n\nfunc (m *mutator) CreateComment(user *models.User, comment *string) error {\n\tif comment != nil && len(*comment) > 0 {\n\t\tcommentID, _ := uuid.NewV7()\n\t\tcomment := models.NewEditComment(commentID, user.ID, m.edit, *comment)\n\t\t_, err := m.queries.CreateEditComment(m.context, converter.EditCommentToCreateParams(*comment))\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\ntype editApplyer interface {\n\tapply() error\n}\n\nfunc urlCompare(subject []models.URL, against []models.URL) (added []models.URL, missing []models.URL) {\n\tfor _, s := range subject {\n\t\tnewMod := true\n\t\tfor _, a := range against {\n\t\t\tif s.URL == a.URL && s.SiteID == a.SiteID {\n\t\t\t\tnewMod = false\n\t\t\t}\n\t\t}\n\n\t\tfor _, a := range added {\n\t\t\tif s.URL == a.URL && s.SiteID == a.SiteID {\n\t\t\t\tnewMod = false\n\t\t\t}\n\t\t}\n\n\t\tif newMod {\n\t\t\tadded = append(added, s)\n\t\t}\n\t}\n\n\tfor _, s := range against {\n\t\tremovedMod := true\n\t\tfor _, a := range subject {\n\t\t\tif s.URL == a.URL && s.SiteID == a.SiteID {\n\t\t\t\tremovedMod = false\n\t\t\t}\n\t\t}\n\n\t\tfor _, a := range missing {\n\t\t\tif s.URL == a.URL && s.SiteID == a.SiteID {\n\t\t\t\tremovedMod = false\n\t\t\t}\n\t\t}\n\n\t\tif removedMod {\n\t\t\tmissing = append(missing, s)\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "internal/service/edit/modbot.go",
    "content": "package edit\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n)\n\nconst modUserName = \"StashBot\"\n\nvar modUserID *uuid.UUID\n\nfunc getModBot(ctx context.Context, tx *queries.Queries) uuid.UUID {\n\tif modUserID == nil {\n\t\tmodUser, err := tx.FindUserByName(ctx, modUserName)\n\t\tif err != nil {\n\t\t\tpanic(fmt.Errorf(\"mod user not found: %w\", err))\n\t\t}\n\t\tmodUserID = &modUser.ID\n\t}\n\n\treturn *modUserID\n}\n"
  },
  {
    "path": "internal/service/edit/performer.go",
    "content": "package edit\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\ntype PerformerEditProcessor struct {\n\tmutator\n}\n\nfunc Performer(ctx context.Context, queries *queries.Queries, edit *models.Edit) *PerformerEditProcessor {\n\treturn &PerformerEditProcessor{\n\t\tmutator{\n\t\t\tcontext: ctx,\n\t\t\tqueries: queries,\n\t\t\tedit:    edit,\n\t\t},\n\t}\n}\n\nfunc (m *PerformerEditProcessor) Edit(input models.PerformerEditInput, inputArgs utils.ArgumentsQuery, update bool) error {\n\tif err := validatePerformerEditInput(m.context, m.queries, input, m.edit, update); err != nil {\n\t\treturn err\n\t}\n\n\tvar err error\n\tswitch input.Edit.Operation {\n\tcase models.OperationEnumModify:\n\t\terr = m.modifyEdit(input, inputArgs)\n\tcase models.OperationEnumMerge:\n\t\terr = m.mergeEdit(input, inputArgs)\n\tcase models.OperationEnumDestroy:\n\t\terr = m.destroyEdit(input)\n\tcase models.OperationEnumCreate:\n\t\terr = m.createEdit(input, inputArgs)\n\t}\n\n\treturn err\n}\n\nfunc (m *PerformerEditProcessor) modifyEdit(input models.PerformerEditInput, inputArgs utils.ArgumentsQuery) error {\n\t// get the existing performer\n\tperformerID := *input.Edit.ID\n\tdbPerformer, err := m.queries.FindPerformer(m.context, performerID)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tperformer := converter.PerformerToModel(dbPerformer)\n\tvar entity editEntity = performer\n\tif err := validateEditEntity(&entity, *input.Edit.ID, \"performer\"); err != nil {\n\t\treturn err\n\t}\n\n\t// perform a diff against the input and the current object\n\tdetailArgs := inputArgs.Field(\"details\")\n\tperformerEdit, err := input.Details.PerformerEditFromDiff(performer, detailArgs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err = m.diffRelationships(performerEdit, performerID, input, inputArgs); err != nil {\n\t\treturn err\n\t}\n\n\tif input.Options != nil && input.Options.SetModifyAliases != nil {\n\t\tperformerEdit.SetModifyAliases = *input.Options.SetModifyAliases\n\t}\n\n\tif reflect.DeepEqual(performerEdit.Old, performerEdit.New) {\n\t\treturn ErrNoChanges\n\t}\n\n\tperformerEdit.New.DraftID = input.Details.DraftID\n\n\treturn m.edit.SetData(*performerEdit)\n}\n\nfunc (m *PerformerEditProcessor) mergeEdit(input models.PerformerEditInput, inputArgs utils.ArgumentsQuery) error {\n\t// get the existing performer\n\tif input.Edit.ID == nil {\n\t\treturn ErrMergeIDMissing\n\t}\n\tperformerID := *input.Edit.ID\n\tdbPerformer, err := m.queries.FindPerformer(m.context, performerID)\n\n\tif err != nil {\n\t\treturn fmt.Errorf(\"performer with id %v not found: %w\", *input.Edit.ID, err)\n\t}\n\n\tvar mergeSources []uuid.UUID\n\tfor _, sourceID := range input.Edit.MergeSourceIds {\n\t\t_, err := m.queries.FindPerformer(m.context, sourceID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"performer with id %v not found: %w\", sourceID, err)\n\t\t}\n\t\tif performerID == sourceID {\n\t\t\treturn ErrMergeTargetIsSource\n\t\t}\n\t\tmergeSources = append(mergeSources, sourceID)\n\t}\n\n\tif len(mergeSources) < 1 {\n\t\treturn ErrNoMergeSources\n\t}\n\n\t// perform a diff against the input and the current object\n\tperformer := converter.PerformerToModel(dbPerformer)\n\tdetailArgs := inputArgs.Field(\"details\")\n\tperformerEdit, err := input.Details.PerformerEditFromMerge(performer, mergeSources, detailArgs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err = m.diffRelationships(performerEdit, performerID, input, inputArgs); err != nil {\n\t\treturn err\n\t}\n\n\tif input.Options != nil && input.Options.SetMergeAliases != nil {\n\t\tperformerEdit.SetMergeAliases = *input.Options.SetMergeAliases\n\t}\n\tif input.Options != nil && input.Options.SetModifyAliases != nil {\n\t\tperformerEdit.SetModifyAliases = *input.Options.SetModifyAliases\n\t}\n\n\treturn m.edit.SetData(*performerEdit)\n}\n\nfunc (m *PerformerEditProcessor) createEdit(input models.PerformerEditInput, inputArgs utils.ArgumentsQuery) error {\n\tperformerEdit, err := input.Details.PerformerEditFromCreate(inputArgs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tperformerEdit.New.AddedAliases = input.Details.Aliases\n\tperformerEdit.New.AddedTattoos = converter.BodyModInputToModel(input.Details.Tattoos)\n\tperformerEdit.New.AddedPiercings = converter.BodyModInputToModel(input.Details.Piercings)\n\tperformerEdit.New.AddedImages = input.Details.ImageIds\n\tperformerEdit.New.AddedUrls = input.Details.Urls\n\tperformerEdit.New.DraftID = input.Details.DraftID\n\n\treturn m.edit.SetData(*performerEdit)\n}\n\nfunc (m *PerformerEditProcessor) destroyEdit(input models.PerformerEditInput) error {\n\t// get the existing performer\n\tperformerID := *input.Edit.ID\n\tdbPerformer, err := m.queries.FindPerformer(m.context, performerID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tperformer := converter.PerformerToModel(dbPerformer)\n\tvar entity editEntity = performer\n\treturn validateEditEntity(&entity, performerID, \"performer\")\n}\n\nfunc (m *PerformerEditProcessor) CreateJoin(input models.PerformerEditInput) error {\n\tif input.Edit.ID != nil {\n\t\treturn m.queries.CreatePerformerEdit(m.context, queries.CreatePerformerEditParams{\n\t\t\tEditID:      m.edit.ID,\n\t\t\tPerformerID: *input.Edit.ID,\n\t\t})\n\t}\n\n\treturn nil\n}\n\nfunc (m *PerformerEditProcessor) apply() error {\n\toperation := m.operation()\n\tisCreate := operation == models.OperationEnumCreate\n\n\tvar performer *models.Performer\n\tif !isCreate {\n\t\tperformerID, err := m.queries.GetEditTargetID(m.context, m.edit.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdbPerformer, err := m.queries.FindPerformer(m.context, performerID.ID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"%w: performer, %s: %w\", ErrEntityNotFound, performerID, err)\n\t\t}\n\n\t\tperformer = converter.PerformerToModelPtr(dbPerformer)\n\t}\n\n\treturn m.applyEdit(performer)\n}\n\nfunc (m *PerformerEditProcessor) applyEdit(performer *models.Performer) error {\n\tdata, err := m.edit.GetPerformerData()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\toperation := m.operation()\n\n\tswitch operation {\n\tcase models.OperationEnumCreate:\n\t\treturn m.applyCreate(data)\n\tcase models.OperationEnumDestroy:\n\t\treturn m.applyDestroy(performer)\n\tcase models.OperationEnumModify:\n\t\treturn m.applyModify(performer, data)\n\tcase models.OperationEnumMerge:\n\t\treturn m.applyMerge(performer, data)\n\t}\n\treturn nil\n}\n\nfunc (m *PerformerEditProcessor) applyCreate(data *models.PerformerEditData) error {\n\tUUID := data.New.DraftID\n\tif UUID == nil {\n\t\tnewUUID, err := uuid.NewV7()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tUUID = &newUUID\n\t}\n\tnewPerformer := &models.Performer{\n\t\tID: *UUID,\n\t}\n\n\tif err := m.ApplyEdit(newPerformer, true, data); err != nil {\n\t\treturn err\n\t}\n\n\treturn m.queries.CreatePerformerEdit(m.context, queries.CreatePerformerEditParams{\n\t\tEditID:      m.edit.ID,\n\t\tPerformerID: newPerformer.ID,\n\t})\n}\n\nfunc (m *PerformerEditProcessor) applyModify(performer *models.Performer, data *models.PerformerEditData) error {\n\tif err := performer.ValidateModifyEdit(*data); err != nil {\n\t\treturn err\n\t}\n\n\treturn m.ApplyEdit(performer, false, data)\n}\n\nfunc (m *PerformerEditProcessor) applyDestroy(performer *models.Performer) error {\n\t_, err := m.SoftDelete(*performer)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err = m.queries.DeletePerformerScenes(m.context, performer.ID); err != nil {\n\t\treturn err\n\t}\n\treturn m.queries.DeletePerformerFavorites(m.context, performer.ID)\n}\n\nfunc (m *PerformerEditProcessor) applyMerge(performer *models.Performer, data *models.PerformerEditData) error {\n\tif err := m.applyModify(performer, data); err != nil {\n\t\treturn err\n\t}\n\n\tfor _, sourceID := range data.MergeSources {\n\t\tif err := m.mergeInto(sourceID, performer.ID, data.SetMergeAliases); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (m *PerformerEditProcessor) mergeInto(sourceID uuid.UUID, targetID uuid.UUID, setAliases bool) error {\n\tdbPerformer, err := m.queries.FindPerformer(m.context, sourceID)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%w: source performer, %s: %w\", ErrEntityNotFound, sourceID.String(), err)\n\t}\n\n\tdbTarget, err := m.queries.FindPerformer(m.context, targetID)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%w: target performer %s, %w\", ErrEntityNotFound, targetID.String(), err)\n\t}\n\n\tperformer := converter.PerformerToModelPtr(dbPerformer)\n\ttarget := converter.PerformerToModelPtr(dbTarget)\n\treturn m.MergeInto(performer, target, setAliases)\n}\n\nfunc bodyModCompare(subject []models.BodyModification, against []models.BodyModification) (added []models.BodyModification, missing []models.BodyModification) {\n\tfor _, s := range subject {\n\t\tnewMod := true\n\t\tfor _, a := range against {\n\t\t\tif s.Location == a.Location {\n\t\t\t\tnewMod = (s.Description != nil && a.Description != nil && *s.Description != *a.Description) ||\n\t\t\t\t\t(s.Description == nil && a.Description != nil) ||\n\t\t\t\t\t(a.Description == nil && s.Description != nil)\n\t\t\t}\n\t\t}\n\n\t\tfor _, a := range added {\n\t\t\tif s.Location == a.Location {\n\t\t\t\tnewMod = false\n\t\t\t}\n\t\t}\n\n\t\tif newMod {\n\t\t\tadded = append(added, s)\n\t\t}\n\t}\n\n\tfor _, s := range against {\n\t\tremovedMod := true\n\t\tfor _, a := range subject {\n\t\t\tif s.Location == a.Location {\n\t\t\t\tremovedMod = (s.Description != nil && a.Description != nil && *s.Description != *a.Description) ||\n\t\t\t\t\t(s.Description == nil && a.Description != nil) ||\n\t\t\t\t\t(a.Description == nil && s.Description != nil)\n\t\t\t}\n\t\t}\n\n\t\tfor _, a := range missing {\n\t\t\tif s.Location == a.Location {\n\t\t\t\tremovedMod = false\n\t\t\t}\n\t\t}\n\n\t\tif removedMod {\n\t\t\tmissing = append(missing, s)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (m *PerformerEditProcessor) diffRelationships(performerEdit *models.PerformerEditData, performerID uuid.UUID, input models.PerformerEditInput, inputArgs utils.ArgumentsQuery) error {\n\tif input.Details.Aliases != nil || inputArgs.Field(\"aliases\").IsNull() {\n\t\tif err := m.diffAliases(performerEdit, performerID, input.Details.Aliases); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif input.Details.Tattoos != nil || inputArgs.Field(\"tattoos\").IsNull() {\n\t\tif err := m.diffTattoos(performerEdit, performerID, converter.BodyModInputToModel(input.Details.Tattoos)); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif input.Details.Piercings != nil || inputArgs.Field(\"piercings\").IsNull() {\n\t\tif err := m.diffPiercings(performerEdit, performerID, converter.BodyModInputToModel(input.Details.Piercings)); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif input.Details.Urls != nil || inputArgs.Field(\"urls\").IsNull() {\n\t\tif err := m.diffURLs(performerEdit, performerID, input.Details.Urls); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif input.Details.ImageIds != nil || inputArgs.Field(\"image_ids\").IsNull() {\n\t\tif err := m.diffImages(performerEdit, performerID, input.Details.ImageIds); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (m *PerformerEditProcessor) diffAliases(performerEdit *models.PerformerEditData, performerID uuid.UUID, newAliases []string) error {\n\taliases, err := m.queries.GetPerformerAliases(m.context, performerID)\n\tif err != nil {\n\t\treturn err\n\t}\n\tperformerEdit.New.AddedAliases, performerEdit.New.RemovedAliases = utils.SliceCompare(newAliases, aliases)\n\treturn nil\n}\n\nfunc (m *PerformerEditProcessor) diffTattoos(performerEdit *models.PerformerEditData, performerID uuid.UUID, newTattoos []models.BodyModification) error {\n\tdbTattoos, err := m.queries.GetPerformerTattoos(m.context, performerID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar tattoos []models.BodyModification\n\tfor _, mod := range dbTattoos {\n\t\tnewMod := models.BodyModification{\n\t\t\tDescription: mod.Description,\n\t\t}\n\t\tif mod.Location != nil {\n\t\t\tnewMod.Location = *mod.Location\n\t\t}\n\n\t\ttattoos = append(tattoos, newMod)\n\t}\n\tperformerEdit.New.AddedTattoos, performerEdit.New.RemovedTattoos = bodyModCompare(newTattoos, tattoos)\n\n\treturn nil\n}\n\nfunc (m *PerformerEditProcessor) diffPiercings(performerEdit *models.PerformerEditData, performerID uuid.UUID, newPiercings []models.BodyModification) error {\n\tdbPiercings, err := m.queries.GetPerformerPiercings(m.context, performerID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar piercings []models.BodyModification\n\tfor _, mod := range dbPiercings {\n\t\tnewMod := models.BodyModification{\n\t\t\tDescription: mod.Description,\n\t\t}\n\t\tif mod.Location != nil {\n\t\t\tnewMod.Location = *mod.Location\n\t\t}\n\n\t\tpiercings = append(piercings, newMod)\n\t}\n\tperformerEdit.New.AddedPiercings, performerEdit.New.RemovedPiercings = bodyModCompare(newPiercings, piercings)\n\n\treturn nil\n}\n\nfunc (m *PerformerEditProcessor) diffURLs(performerEdit *models.PerformerEditData, performerID uuid.UUID, newURLs []models.URL) error {\n\tdbUrls, err := m.queries.GetPerformerURLs(m.context, performerID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar urls []models.URL\n\tfor _, url := range dbUrls {\n\t\turls = append(urls, models.URL{\n\t\t\tURL:    url.Url,\n\t\t\tSiteID: url.SiteID,\n\t\t})\n\t}\n\tperformerEdit.New.AddedUrls, performerEdit.New.RemovedUrls = urlCompare(newURLs, urls)\n\n\treturn nil\n}\n\nfunc (m *PerformerEditProcessor) diffImages(performerEdit *models.PerformerEditData, performerID uuid.UUID, newImages []uuid.UUID) error {\n\timages, err := m.queries.GetPerformerImages(m.context, performerID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar existingImages []uuid.UUID\n\tfor _, image := range images {\n\t\texistingImages = append(existingImages, image.ID)\n\t}\n\tperformerEdit.New.AddedImages, performerEdit.New.RemovedImages = utils.SliceCompare(newImages, existingImages)\n\n\treturn nil\n}\n\nfunc (m *PerformerEditProcessor) SoftDelete(performer models.Performer) (*models.Performer, error) {\n\t// Delete joins\n\tif err := m.queries.DeletePerformerAliases(m.context, performer.ID); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := m.queries.DeletePerformerPiercings(m.context, performer.ID); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := m.queries.DeletePerformerTattoos(m.context, performer.ID); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := m.queries.DeletePerformerURLs(m.context, performer.ID); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := m.queries.DeletePerformerImages(m.context, performer.ID); err != nil {\n\t\treturn nil, err\n\t}\n\n\tret, err := m.queries.SoftDeletePerformer(m.context, performer.ID)\n\treturn converter.PerformerToModelPtr(ret), err\n}\n\nfunc (m *PerformerEditProcessor) UpdateScenePerformers(oldPerformer *models.Performer, newTarget *models.Performer, setAliases bool) error {\n\tif setAliases {\n\t\tif err := m.UpdateScenePerformerAlias(oldPerformer.ID, oldPerformer.Name, newTarget.Name); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Reassign scene performances to new performer, except if new performer is already assigned\n\tif err := m.queries.ReassignPerformerAliases(m.context, queries.ReassignPerformerAliasesParams{\n\t\tOldPerformerID: oldPerformer.ID,\n\t\tNewPerformerID: newTarget.ID,\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\t// Delete leftover scene performances\n\treturn m.queries.DeletePerformerScenes(m.context, oldPerformer.ID)\n}\n\nfunc (m *PerformerEditProcessor) reassignFavorites(oldPerformer *models.Performer, newTargetID uuid.UUID) error {\n\tif err := m.queries.ReassignPerformerFavorites(m.context, queries.ReassignPerformerFavoritesParams{\n\t\tOldPerformerID: oldPerformer.ID,\n\t\tNewPerformerID: newTargetID,\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\treturn m.queries.DeletePerformerFavorites(m.context, oldPerformer.ID)\n}\n\nfunc (m *PerformerEditProcessor) UpdateScenePerformerAlias(performerID uuid.UUID, oldName string, newName string) error {\n\t// Set old name as scene performance alias where one isn't already set\n\tif err := m.queries.SetScenePerformerAlias(m.context, queries.SetScenePerformerAliasParams{\n\t\tPerformerID: performerID,\n\t\tAs:          &oldName,\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\t// Remove alias from scene performances where the alias matches new name\n\treturn m.queries.ClearScenePerformerAlias(m.context, queries.ClearScenePerformerAliasParams{\n\t\tPerformerID: performerID,\n\t\tAs:          &newName,\n\t})\n}\n\nfunc (m *PerformerEditProcessor) MergeInto(source *models.Performer, target *models.Performer, setAliases bool) error {\n\tif source.Deleted {\n\t\treturn fmt.Errorf(\"merge source performer is deleted: %s\", source.ID.String())\n\t}\n\tif target.Deleted {\n\t\treturn fmt.Errorf(\"merge target performer is deleted: %s\", target.ID.String())\n\t}\n\n\tif _, err := m.SoftDelete(*source); err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.UpdatePerformerRedirects(m.context, queries.UpdatePerformerRedirectsParams{\n\t\tOldPerformerID: source.ID,\n\t\tNewPerformerID: target.ID,\n\t}); err != nil {\n\t\treturn err\n\t}\n\tif err := m.UpdateScenePerformers(source, target, setAliases); err != nil {\n\t\treturn err\n\t}\n\tif err := m.reassignFavorites(source, target.ID); err != nil {\n\t\treturn err\n\t}\n\n\treturn m.queries.CreatePerformerRedirect(m.context, queries.CreatePerformerRedirectParams{\n\t\tSourceID: source.ID,\n\t\tTargetID: target.ID,\n\t})\n}\n\nfunc (m *PerformerEditProcessor) ApplyEdit(performer *models.Performer, create bool, data *models.PerformerEditData) error {\n\told := data.Old\n\tif old == nil {\n\t\told = &models.PerformerEdit{}\n\t}\n\tperformer.CopyFromPerformerEdit(*data.New, *old)\n\n\tvar err error\n\tif create {\n\t\t_, err = m.queries.CreatePerformer(m.context, converter.PerformerToCreateParams(*performer))\n\t} else {\n\t\t_, err = m.queries.UpdatePerformer(m.context, converter.PerformerToUpdateParams(*performer))\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.updateAliasesFromEdit(performer.ID, data); err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.updateTattoosFromEdit(performer.ID, data); err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.updatePiercingsFromEdit(performer.ID, data); err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.updateURLsFromEdit(performer.ID, data); err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.updateImagesFromEdit(performer.ID, data); err != nil {\n\t\treturn err\n\t}\n\n\tif data.New.Name != nil && data.SetModifyAliases {\n\t\tif err = m.UpdateScenePerformerAlias(performer.ID, *data.Old.Name, *data.New.Name); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn err\n}\n\nfunc (m *PerformerEditProcessor) updateAliasesFromEdit(performerID uuid.UUID, data *models.PerformerEditData) error {\n\taliases, err := m.queries.GetEditPerformerAliases(m.context, m.edit.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.DeletePerformerAliases(m.context, performerID); err != nil {\n\t\treturn err\n\t}\n\n\tvar aliasParam []queries.CreatePerformerAliasesParams\n\tfor _, alias := range aliases {\n\t\taliasParam = append(aliasParam, queries.CreatePerformerAliasesParams{\n\t\t\tAlias:       alias,\n\t\t\tPerformerID: performerID,\n\t\t})\n\t}\n\t_, err = m.queries.CreatePerformerAliases(m.context, aliasParam)\n\treturn err\n}\n\nfunc (m *PerformerEditProcessor) updateTattoosFromEdit(performerID uuid.UUID, data *models.PerformerEditData) error {\n\ttattoos, err := m.queries.GetEditPerformerTattoos(m.context, m.edit.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.DeletePerformerTattoos(m.context, performerID); err != nil {\n\t\treturn err\n\t}\n\n\tif len(tattoos) == 0 {\n\t\treturn nil\n\t}\n\n\tvar tattooParams []queries.CreatePerformerTattoosParams\n\tfor _, tattoo := range tattoos {\n\t\ttattooParams = append(tattooParams, queries.CreatePerformerTattoosParams{\n\t\t\tPerformerID: performerID,\n\t\t\tLocation:    tattoo.Location,\n\t\t\tDescription: tattoo.Description,\n\t\t})\n\t}\n\n\t_, err = m.queries.CreatePerformerTattoos(m.context, tattooParams)\n\treturn err\n}\n\nfunc (m *PerformerEditProcessor) updatePiercingsFromEdit(performerID uuid.UUID, data *models.PerformerEditData) error {\n\tpiercings, err := m.queries.GetEditPerformerPiercings(m.context, m.edit.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.DeletePerformerPiercings(m.context, performerID); err != nil {\n\t\treturn err\n\t}\n\n\tif len(piercings) == 0 {\n\t\treturn nil\n\t}\n\n\tvar piercingParams []queries.CreatePerformerPiercingsParams\n\tfor _, piercing := range piercings {\n\t\tpiercingParams = append(piercingParams, queries.CreatePerformerPiercingsParams{\n\t\t\tPerformerID: performerID,\n\t\t\tLocation:    piercing.Location,\n\t\t\tDescription: piercing.Description,\n\t\t})\n\t}\n\n\t_, err = m.queries.CreatePerformerPiercings(m.context, piercingParams)\n\treturn err\n}\n\nfunc (m *PerformerEditProcessor) updateURLsFromEdit(performerID uuid.UUID, data *models.PerformerEditData) error {\n\turls, err := m.queries.GetMergedURLsForEdit(m.context, m.edit.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.DeletePerformerURLs(m.context, performerID); err != nil {\n\t\treturn err\n\t}\n\n\tvar urlsParams []queries.CreatePerformerURLsParams\n\tfor _, url := range urls {\n\t\turlsParams = append(urlsParams, queries.CreatePerformerURLsParams{\n\t\t\tPerformerID: performerID,\n\t\t\tUrl:         url.Url,\n\t\t\tSiteID:      url.SiteID,\n\t\t})\n\t}\n\n\t_, err = m.queries.CreatePerformerURLs(m.context, urlsParams)\n\treturn err\n}\n\nfunc (m *PerformerEditProcessor) updateImagesFromEdit(performerID uuid.UUID, data *models.PerformerEditData) error {\n\tdbImages, err := m.queries.GetImagesForEdit(m.context, m.edit.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.DeletePerformerImages(m.context, performerID); err != nil {\n\t\treturn err\n\t}\n\n\tvar images []queries.CreatePerformerImagesParams\n\tfor _, image := range dbImages {\n\t\timages = append(images, queries.CreatePerformerImagesParams{\n\t\t\tImageID:     image.ID,\n\t\t\tPerformerID: performerID,\n\t\t})\n\t}\n\n\t_, err = m.queries.CreatePerformerImages(m.context, images)\n\treturn err\n}\n"
  },
  {
    "path": "internal/service/edit/query.go",
    "content": "package edit\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\n\tsq \"github.com/Masterminds/squirrel\"\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\tqueryhelper \"github.com/stashapp/stash-box/internal/service/query\"\n)\n\nfunc (s *Edit) QueryCount(ctx context.Context, filter models.EditQueryInput) (int, error) {\n\tuser := auth.GetCurrentUser(ctx)\n\n\tpsql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar)\n\tquery, err := s.buildEditQuery(psql, filter, user.ID, true)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn queryhelper.ExecuteCount(ctx, query, s.queries.DB(), \"QueryEditsCount\")\n}\n\nfunc (s *Edit) QueryEdits(ctx context.Context, filter models.EditQueryInput) ([]models.Edit, error) {\n\tuser := auth.GetCurrentUser(ctx)\n\n\tpsql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar)\n\tquery, err := s.buildEditQuery(psql, filter, user.ID, false)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Apply sort\n\tsortField := \"created_at\"\n\tsortDir := \"DESC\"\n\tif filter.Sort != \"\" {\n\t\tsortField = strings.ToLower(filter.Sort.String())\n\t}\n\tif filter.Direction != \"\" {\n\t\tsortDir = strings.ToUpper(filter.Direction.String())\n\t}\n\n\t// Special handling for closed_at and updated_at - use created_at as fallback\n\tif filter.Sort == models.EditSortEnumClosedAt || filter.Sort == models.EditSortEnumUpdatedAt {\n\t\tquery = query.OrderBy(fmt.Sprintf(\"COALESCE(edits.%s, edits.created_at) %s, edits.id %s\", sortField, sortDir, sortDir))\n\t} else {\n\t\tquery = query.OrderBy(fmt.Sprintf(\"edits.%s %s, edits.id %s\", sortField, sortDir, sortDir))\n\t}\n\n\t// Apply pagination\n\tquery = queryhelper.ApplyPagination(query, filter.Page, filter.PerPage)\n\n\treturn queryhelper.ExecuteQuery(ctx, query, s.queries.DB(), converter.EditToModel, \"QueryEdits\")\n}\n\nfunc (s *Edit) buildEditQuery(psql sq.StatementBuilderType, filter models.EditQueryInput, userID uuid.UUID, forCount bool) (sq.SelectBuilder, error) {\n\tvar query sq.SelectBuilder\n\tif forCount {\n\t\tquery = psql.Select(\"COUNT(DISTINCT edits.id)\").From(\"edits\")\n\t} else {\n\t\tquery = psql.Select(\"edits.*\").From(\"edits\")\n\t}\n\n\t// Filter by voted status\n\tif filter.Voted != nil && *filter.Voted != \"\" {\n\t\tswitch *filter.Voted {\n\t\tcase models.UserVotedFilterEnumNotVoted:\n\t\t\tquery = query.\n\t\t\t\tLeftJoin(\"edit_votes ON edits.id = edit_votes.edit_id AND edit_votes.user_id = ?\", userID).\n\t\t\t\tWhere(\"edit_votes.user_id IS NULL\")\n\t\tdefault:\n\t\t\tquery = query.\n\t\t\t\tJoin(\"edit_votes ON edits.id = edit_votes.edit_id\").\n\t\t\t\tWhere(sq.Eq{\"edit_votes.user_id\": userID, \"edit_votes.vote\": filter.Voted.String()})\n\t\t}\n\t}\n\n\t// Filter by target ID\n\tif filter.TargetID != nil {\n\t\tif filter.TargetType == nil || *filter.TargetType == \"\" {\n\t\t\treturn query, errors.New(\"TargetType is required when TargetID filter is used\")\n\t\t}\n\n\t\tjsonID, _ := json.Marshal(*filter.TargetID)\n\t\ttargetType := strings.ToLower(filter.TargetType.String())\n\n\t\tswitch *filter.TargetType {\n\t\tcase models.TargetTypeEnumPerformer:\n\t\t\tsubquery := fmt.Sprintf(`\n\t\t\t\tedits.id IN (\n\t\t\t\t\tSELECT id FROM edits E WHERE E.data->'merge_sources' @> ?\n\t\t\t\t\tUNION\n\t\t\t\t\tSELECT edit_id FROM %s_edits WHERE %s_id = ?\n\t\t\t\t\tUNION\n\t\t\t\t\tSELECT id FROM edits E\n\t\t\t\t\tWHERE jsonb_path_query_array(data, '$.new_data.added_performers[*].performer_id') @> ?\n\t\t\t\t\tAND E.status = 'PENDING' AND E.target_type = 'SCENE'\n\t\t\t\t)`, targetType, targetType)\n\t\t\tquery = query.Where(sq.Expr(subquery, string(jsonID), *filter.TargetID, string(jsonID)))\n\t\tcase models.TargetTypeEnumStudio:\n\t\t\tsubquery := fmt.Sprintf(`\n\t\t\t\tedits.id IN (\n\t\t\t\t\tSELECT id FROM edits E WHERE E.data->'merge_sources' @> ?\n\t\t\t\t\tUNION\n\t\t\t\t\tSELECT edit_id FROM %s_edits WHERE %s_id = ?\n\t\t\t\t\tUNION\n\t\t\t\t\tSELECT id FROM edits E\n\t\t\t\t\tWHERE E.status = 'PENDING' AND E.target_type = 'SCENE'\n\t\t\t\t\tAND E.data->'new_data'->'studio_id' @> ?\n\t\t\t\t)`, targetType, targetType)\n\t\t\tquery = query.Where(sq.Expr(subquery, string(jsonID), *filter.TargetID, string(jsonID)))\n\t\tcase models.TargetTypeEnumTag:\n\t\t\tsubquery := fmt.Sprintf(`\n\t\t\t\tedits.id IN (\n\t\t\t\t\tSELECT id FROM edits E WHERE E.data->'merge_sources' @> ?\n\t\t\t\t\tUNION\n\t\t\t\t\tSELECT edit_id FROM %s_edits WHERE %s_id = ?\n\t\t\t\t\tUNION\n\t\t\t\t\tSELECT id FROM edits E\n\t\t\t\t\tWHERE E.status = 'PENDING' AND E.target_type = 'SCENE'\n\t\t\t\t\tAND E.data->'new_data'->'added_tags' @> ?\n\t\t\t\t)`, targetType, targetType)\n\t\t\tquery = query.Where(sq.Expr(subquery, string(jsonID), *filter.TargetID, string(jsonID)))\n\t\tdefault:\n\t\t\tsubquery := fmt.Sprintf(`\n\t\t\t\tedits.id IN (\n\t\t\t\t\tSELECT id FROM edits E WHERE E.data->'merge_sources' @> ?\n\t\t\t\t\tUNION\n\t\t\t\t\tSELECT edit_id FROM %s_edits WHERE %s_id = ?\n\t\t\t\t)`, targetType, targetType)\n\t\t\tquery = query.Where(sq.Expr(subquery, string(jsonID), *filter.TargetID))\n\t\t}\n\t} else if filter.TargetType != nil && *filter.TargetType != \"\" {\n\t\tquery = query.Where(sq.Eq{\"target_type\": filter.TargetType.String()})\n\t}\n\n\t// Filter by favorite status\n\tif filter.IsFavorite != nil && *filter.IsFavorite {\n\t\tfavoriteClause := `\n\t\t\tedits.id IN (\n\t\t\t\t(SELECT TE.edit_id FROM studio_favorites TF JOIN studio_edits TE ON TF.studio_id = TE.studio_id WHERE TF.user_id = ?)\n\t\t\t\tUNION\n\t\t\t\t(SELECT PE.edit_id FROM performer_favorites PF JOIN performer_edits PE ON PF.performer_id = PE.performer_id WHERE PF.user_id = ?)\n\t\t\t\tUNION\n\t\t\t\t(SELECT SE.edit_id FROM studio_favorites TF JOIN scenes S ON TF.studio_id = S.studio_id JOIN scene_edits SE ON S.id = SE.scene_id WHERE TF.user_id = ?)\n\t\t\t\tUNION\n\t\t\t\t(SELECT E.id FROM performer_favorites PF JOIN edits E ON E.data->'merge_sources' @> to_jsonb(PF.performer_id::TEXT)\n\t\t\t\t WHERE E.target_type = 'PERFORMER' AND E.operation = 'MERGE' AND PF.user_id = ?)\n\t\t\t\tUNION\n\t\t\t\t(SELECT E.id FROM performer_favorites PF JOIN edits E\n\t\t\t\t ON jsonb_path_query_array(E.data, '$.new_data.added_performers[*].performer_id') @> to_jsonb(PF.performer_id::TEXT)\n\t\t\t\t OR jsonb_path_query_array(E.data, '$.new_data.removed_performers[*].performer_id') @> to_jsonb(PF.performer_id::TEXT)\n\t\t\t\t WHERE E.target_type = 'SCENE' AND PF.user_id = ?)\n\t\t\t\tUNION\n\t\t\t\t(SELECT E.id FROM studio_favorites TF JOIN edits E\n\t\t\t\t ON data->'new_data'->>'studio_id' = TF.studio_id::TEXT OR data->'old_data'->>'studio_id' = TF.studio_id::TEXT\n\t\t\t\t WHERE E.target_type = 'SCENE' AND TF.user_id = ?)\n\t\t\t)\n\t\t`\n\t\tquery = query.Where(sq.Expr(favoriteClause, userID, userID, userID, userID, userID, userID))\n\t}\n\n\t// Simple filters\n\tif filter.UserID != nil {\n\t\tquery = query.Where(sq.Eq{\"edits.user_id\": *filter.UserID})\n\t}\n\tif filter.Status != nil {\n\t\tquery = query.Where(sq.Eq{\"status\": filter.Status.String()})\n\t}\n\tif filter.Operation != nil {\n\t\tquery = query.Where(sq.Eq{\"operation\": filter.Operation.String()})\n\t}\n\tif filter.Applied != nil {\n\t\tquery = query.Where(sq.Eq{\"applied\": *filter.Applied})\n\t}\n\tif filter.IsBot != nil {\n\t\tquery = query.Where(sq.Eq{\"bot\": *filter.IsBot})\n\t}\n\tif filter.IncludeUserSubmitted != nil && !*filter.IncludeUserSubmitted {\n\t\tquery = query.Where(sq.NotEq{\"edits.user_id\": userID})\n\t}\n\n\treturn query, nil\n}\n"
  },
  {
    "path": "internal/service/edit/scene.go",
    "content": "package edit\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/jackc/pgx/v5\"\n\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\ntype SceneEditProcessor struct {\n\tmutator\n}\n\nfunc Scene(ctx context.Context, queries *queries.Queries, edit *models.Edit) *SceneEditProcessor {\n\treturn &SceneEditProcessor{\n\t\tmutator{\n\t\t\tcontext: ctx,\n\t\t\tqueries: queries,\n\t\t\tedit:    edit,\n\t\t},\n\t}\n}\n\nfunc (m *SceneEditProcessor) Edit(input models.SceneEditInput, inputArgs utils.ArgumentsQuery, update bool) error {\n\tif err := validateSceneEditInput(m.context, m.queries, input, m.edit, update); err != nil {\n\t\treturn err\n\t}\n\n\tvar err error\n\tswitch input.Edit.Operation {\n\tcase models.OperationEnumModify:\n\t\terr = m.modifyEdit(input, inputArgs)\n\tcase models.OperationEnumMerge:\n\t\terr = m.mergeEdit(input, inputArgs)\n\tcase models.OperationEnumDestroy:\n\t\terr = m.destroyEdit(input, inputArgs)\n\tcase models.OperationEnumCreate:\n\t\terr = m.createEdit(input, inputArgs)\n\t}\n\n\treturn err\n}\n\nfunc (m *SceneEditProcessor) modifyEdit(input models.SceneEditInput, inputArgs utils.ArgumentsQuery) error {\n\t// get the existing scene\n\tsceneID := *input.Edit.ID\n\tdbScene, err := m.queries.FindScene(m.context, sceneID)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tscene := converter.SceneToModel(dbScene)\n\tvar entity editEntity = scene\n\tif err := validateEditEntity(&entity, sceneID, \"scene\"); err != nil {\n\t\treturn err\n\t}\n\n\t// perform a diff against the input and the current object\n\tdetailArgs := inputArgs.Field(\"details\")\n\tsceneEdit, err := input.Details.SceneEditFromDiff(scene, detailArgs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err = m.diffRelationships(sceneEdit, sceneID, input, inputArgs); err != nil {\n\t\treturn err\n\t}\n\n\tif reflect.DeepEqual(sceneEdit.Old, sceneEdit.New) {\n\t\treturn ErrNoChanges\n\t}\n\n\tsceneEdit.New.DraftID = input.Details.DraftID\n\n\treturn m.edit.SetData(*sceneEdit)\n}\n\nfunc (m *SceneEditProcessor) diffRelationships(sceneEdit *models.SceneEditData, sceneID uuid.UUID, input models.SceneEditInput, inputArgs utils.ArgumentsQuery) error {\n\tif input.Details.Urls != nil || inputArgs.Field(\"urls\").IsNull() {\n\t\tif err := m.diffURLs(sceneEdit, sceneID, input.Details.Urls); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif input.Details.TagIds != nil || inputArgs.Field(\"tag_ids\").IsNull() {\n\t\tif err := m.diffTags(sceneEdit, sceneID, input.Details.TagIds); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif input.Details.ImageIds != nil || inputArgs.Field(\"image_ids\").IsNull() {\n\t\tif err := m.diffImages(sceneEdit, sceneID, input.Details.ImageIds); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif input.Details.Performers != nil || inputArgs.Field(\"performers\").IsNull() {\n\t\tif err := m.diffPerformers(sceneEdit, sceneID, input.Details.Performers); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (m *SceneEditProcessor) diffTags(sceneEdit *models.SceneEditData, sceneID uuid.UUID, newImageIds []uuid.UUID) error {\n\ttags, err := m.queries.FindTagsBySceneID(m.context, sceneID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar existingTags []uuid.UUID\n\tfor _, tag := range tags {\n\t\texistingTags = append(existingTags, tag.ID)\n\t}\n\tsceneEdit.New.AddedTags, sceneEdit.New.RemovedTags = utils.SliceCompare(newImageIds, existingTags)\n\treturn nil\n}\n\nfunc (m *SceneEditProcessor) diffURLs(sceneEdit *models.SceneEditData, sceneID uuid.UUID, newURLs []models.URL) error {\n\tdbUrls, err := m.queries.GetSceneURLs(m.context, sceneID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar urls []models.URL\n\tfor _, url := range dbUrls {\n\t\turls = append(urls, models.URL{\n\t\t\tURL:    url.Url,\n\t\t\tSiteID: url.SiteID,\n\t\t})\n\t}\n\tsceneEdit.New.AddedUrls, sceneEdit.New.RemovedUrls = urlCompare(newURLs, urls)\n\treturn nil\n}\n\nfunc (m *SceneEditProcessor) diffPerformers(sceneEdit *models.SceneEditData, sceneID uuid.UUID, newPerformers []models.PerformerAppearanceInput) error {\n\texistingPerformers, err := m.queries.GetScenePerformers(m.context, sceneID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tsceneEdit.New.AddedPerformers, sceneEdit.New.RemovedPerformers = performerAppearanceCompare(newPerformers, existingPerformers)\n\treturn nil\n}\n\nfunc performerAppearanceCompare(subject []models.PerformerAppearanceInput, against []queries.GetScenePerformersRow) (added []models.PerformerAppearanceInput, missing []models.PerformerAppearanceInput) {\n\teq := func(s models.PerformerAppearanceInput, a queries.GetScenePerformersRow) bool {\n\t\tif s.PerformerID == a.Performer.ID {\n\t\t\tsAs := \"\"\n\t\t\tif s.As != nil {\n\t\t\t\tsAs = *s.As\n\t\t\t}\n\n\t\t\taAs := \"\"\n\t\t\tif a.As != nil {\n\t\t\t\taAs = *a.As\n\t\t\t}\n\n\t\t\treturn sAs == aAs\n\t\t}\n\n\t\treturn false\n\t}\n\n\teqI := func(s, a models.PerformerAppearanceInput) bool {\n\t\tif s.PerformerID == a.PerformerID {\n\t\t\tif s.As == a.As {\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tif s.As == nil || a.As == nil {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\treturn *s.As == *a.As\n\t\t}\n\n\t\treturn false\n\t}\n\n\tfor _, s := range subject {\n\t\tnewMod := true\n\t\tfor _, a := range against {\n\t\t\tif eq(s, a) {\n\t\t\t\tnewMod = false\n\t\t\t}\n\t\t}\n\n\t\tfor _, a := range added {\n\t\t\tif eqI(s, a) {\n\t\t\t\tnewMod = false\n\t\t\t}\n\t\t}\n\n\t\tif newMod {\n\t\t\tadded = append(added, s)\n\t\t}\n\t}\n\n\tfor _, s := range against {\n\t\tremovedMod := true\n\t\tfor _, a := range subject {\n\t\t\tif eq(a, s) {\n\t\t\t\tremovedMod = false\n\t\t\t}\n\t\t}\n\n\t\tfor _, a := range missing {\n\t\t\tif eq(a, s) {\n\t\t\t\tremovedMod = false\n\t\t\t}\n\t\t}\n\n\t\tif removedMod {\n\t\t\tmissing = append(missing, models.PerformerAppearanceInput{\n\t\t\t\tPerformerID: s.Performer.ID,\n\t\t\t\tAs:          s.As,\n\t\t\t})\n\t\t}\n\t}\n\treturn\n}\n\nfunc (m *SceneEditProcessor) diffImages(sceneEdit *models.SceneEditData, sceneID uuid.UUID, newImageIds []uuid.UUID) error {\n\timages, err := m.queries.FindImagesBySceneID(m.context, sceneID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar existingImages []uuid.UUID\n\tfor _, image := range images {\n\t\texistingImages = append(existingImages, image.ID)\n\t}\n\tsceneEdit.New.AddedImages, sceneEdit.New.RemovedImages = utils.SliceCompare(newImageIds, existingImages)\n\treturn nil\n}\n\nfunc (m *SceneEditProcessor) mergeEdit(input models.SceneEditInput, inputArgs utils.ArgumentsQuery) error {\n\t// get the existing scene\n\tif input.Edit.ID == nil {\n\t\treturn ErrMergeIDMissing\n\t}\n\n\tsceneID := *input.Edit.ID\n\tdbScene, err := m.queries.FindScene(m.context, sceneID)\n\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%w: target scene, %s: %w\", ErrEntityNotFound, sceneID.String(), err)\n\t}\n\n\tscene := converter.SceneToModel(dbScene)\n\tvar mergeSources []uuid.UUID\n\tfor _, sourceID := range input.Edit.MergeSourceIds {\n\t\t_, err := m.queries.FindScene(m.context, sourceID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"%w: source scene, %s: %w\", ErrEntityNotFound, sourceID.String(), err)\n\t\t}\n\n\t\tif sceneID == sourceID {\n\t\t\treturn ErrMergeTargetIsSource\n\t\t}\n\t\tmergeSources = append(mergeSources, sourceID)\n\t}\n\n\tif len(mergeSources) < 1 {\n\t\treturn ErrNoMergeSources\n\t}\n\n\t// perform a diff against the input and the current object\n\tdetailArgs := inputArgs.Field(\"details\")\n\tsceneEdit, err := input.Details.SceneEditFromMerge(scene, mergeSources, detailArgs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err = m.diffRelationships(sceneEdit, sceneID, input, inputArgs); err != nil {\n\t\treturn err\n\t}\n\n\treturn m.edit.SetData(*sceneEdit)\n}\n\nfunc (m *SceneEditProcessor) createEdit(input models.SceneEditInput, inputArgs utils.ArgumentsQuery) error {\n\tsceneEdit, err := input.Details.SceneEditFromCreate(inputArgs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tsceneEdit.New.AddedUrls = input.Details.Urls\n\tsceneEdit.New.AddedTags = input.Details.TagIds\n\tsceneEdit.New.AddedImages = input.Details.ImageIds\n\tsceneEdit.New.AddedPerformers = input.Details.Performers\n\tsceneEdit.New.AddedFingerprints = input.Details.Fingerprints\n\tsceneEdit.New.DraftID = input.Details.DraftID\n\n\treturn m.edit.SetData(*sceneEdit)\n}\n\nfunc (m *SceneEditProcessor) destroyEdit(input models.SceneEditInput, inputArgs utils.ArgumentsQuery) error {\n\t// get the existing scene\n\tsceneID := *input.Edit.ID\n\tdbScene, err := m.queries.FindScene(m.context, sceneID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar entity editEntity = converter.SceneToModel(dbScene)\n\treturn validateEditEntity(&entity, sceneID, \"scene\")\n}\n\nfunc (m *SceneEditProcessor) CreateJoin(input models.SceneEditInput) error {\n\tif input.Edit.ID != nil {\n\t\treturn m.queries.CreateSceneEdit(m.context, queries.CreateSceneEditParams{\n\t\t\tEditID:  m.edit.ID,\n\t\t\tSceneID: *input.Edit.ID,\n\t\t})\n\t}\n\n\treturn nil\n}\n\nfunc (m *SceneEditProcessor) apply() error {\n\toperation := m.operation()\n\tisCreate := operation == models.OperationEnumCreate\n\n\tvar scene *models.Scene\n\tif !isCreate {\n\t\tres, err := m.queries.GetEditTargetID(m.context, m.edit.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdbScene, err := m.queries.FindScene(m.context, res.ID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"%w: scene, %s: %w\", ErrEntityNotFound, res.ID.String(), err)\n\t\t}\n\n\t\tscene = converter.SceneToModelPtr(dbScene)\n\t}\n\n\treturn m.applyEdit(scene)\n}\n\nfunc (m *SceneEditProcessor) applyEdit(scene *models.Scene) error {\n\tdata, err := m.edit.GetSceneData()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\toperation := m.operation()\n\n\tswitch operation {\n\tcase models.OperationEnumCreate:\n\t\tvar userID *uuid.UUID\n\t\tif m.edit.UserID.Valid {\n\t\t\tuserID = &m.edit.UserID.UUID\n\t\t}\n\t\treturn m.applyCreate(data, userID)\n\tcase models.OperationEnumDestroy:\n\t\treturn m.applyDestroy(scene)\n\tcase models.OperationEnumModify:\n\t\treturn m.applyModify(scene, data)\n\tcase models.OperationEnumMerge:\n\t\treturn m.applyMerge(scene, data)\n\t}\n\treturn nil\n}\n\nfunc (m *SceneEditProcessor) applyCreate(data *models.SceneEditData, userID *uuid.UUID) error {\n\tUUID := data.New.DraftID\n\tif UUID == nil {\n\t\tnewUUID, err := uuid.NewV7()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tUUID = &newUUID\n\t}\n\tnewScene := &models.Scene{\n\t\tID: *UUID,\n\t}\n\n\tif err := m.ApplyEdit(newScene, true, data, userID); err != nil {\n\t\treturn err\n\t}\n\n\treturn m.queries.CreateSceneEdit(m.context, queries.CreateSceneEditParams{\n\t\tEditID:  m.edit.ID,\n\t\tSceneID: newScene.ID,\n\t})\n}\n\nfunc (m *SceneEditProcessor) applyModify(scene *models.Scene, data *models.SceneEditData) error {\n\tif err := scene.ValidateModifyEdit(*data); err != nil {\n\t\treturn err\n\t}\n\n\treturn m.ApplyEdit(scene, false, data, nil)\n}\n\nfunc (m *SceneEditProcessor) applyDestroy(scene *models.Scene) error {\n\t_, err := m.queries.SoftDeleteScene(m.context, scene.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// delete relationships\n\tif err = m.queries.DeleteSceneTagsByScene(m.context, scene.ID); err != nil {\n\t\treturn err\n\t}\n\n\tif err = m.queries.DeleteScenePerformers(m.context, scene.ID); err != nil {\n\t\treturn err\n\t}\n\n\treturn err\n}\n\nfunc (m *SceneEditProcessor) applyMerge(scene *models.Scene, data *models.SceneEditData) error {\n\tif err := m.applyModify(scene, data); err != nil {\n\t\treturn err\n\t}\n\n\tfor _, sourceID := range data.MergeSources {\n\t\tif err := m.mergeInto(sourceID, scene.ID); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (m *SceneEditProcessor) mergeInto(sourceID uuid.UUID, targetID uuid.UUID) error {\n\tscene, err := m.queries.FindScene(m.context, sourceID)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%w: source scene, %s: %w\", ErrEntityNotFound, sourceID.String(), err)\n\t}\n\n\ttarget, err := m.queries.FindScene(m.context, targetID)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%w: target scene, %s: %w\", ErrEntityNotFound, targetID.String(), err)\n\t}\n\n\treturn m.MergeInto(scene, target)\n}\n\nfunc (m *SceneEditProcessor) ApplyEdit(scene *models.Scene, create bool, data *models.SceneEditData, userID *uuid.UUID) error {\n\told := data.Old\n\tif old == nil {\n\t\told = &models.SceneEdit{}\n\t}\n\tscene.CopyFromSceneEdit(*data.New, old)\n\n\tvar err error\n\tif create {\n\t\tnewScene := converter.SceneToCreateParams(*scene)\n\t\t_, err = m.queries.CreateScene(m.context, newScene)\n\t} else {\n\t\tupdateScene := converter.SceneToUpdateParams(*scene)\n\t\t_, err = m.queries.UpdateScene(m.context, updateScene)\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.updateURLsFromEdit(scene, data); err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.updateImagesFromEdit(scene, data); err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.updateTagsFromEdit(scene, data); err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.updatePerformersFromEdit(scene, data); err != nil {\n\t\treturn err\n\t}\n\n\tif create && len(data.New.AddedFingerprints) > 0 && userID != nil {\n\t\tif err := m.addFingerprintsFromEdit(scene, data, *userID); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn err\n}\n\nfunc (m *SceneEditProcessor) updateURLsFromEdit(scene *models.Scene, data *models.SceneEditData) error {\n\turls, err := m.queries.GetMergedURLsForEdit(m.context, m.edit.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.DeleteSceneURLs(m.context, scene.ID); err != nil {\n\t\treturn err\n\t}\n\n\tvar urlsParams []queries.CreateSceneURLsParams\n\tfor _, url := range urls {\n\t\turlsParams = append(urlsParams, queries.CreateSceneURLsParams{\n\t\t\tSceneID: scene.ID,\n\t\t\tUrl:     url.Url,\n\t\t\tSiteID:  url.SiteID,\n\t\t})\n\t}\n\n\t_, err = m.queries.CreateSceneURLs(m.context, urlsParams)\n\treturn err\n}\n\nfunc (m *SceneEditProcessor) updateImagesFromEdit(scene *models.Scene, data *models.SceneEditData) error {\n\timages, err := m.queries.GetImagesForEdit(m.context, m.edit.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.DeleteSceneImages(m.context, scene.ID); err != nil {\n\t\treturn err\n\t}\n\n\tvar sceneImages []queries.CreateSceneImagesParams\n\tfor _, image := range images {\n\t\tsceneImages = append(sceneImages, queries.CreateSceneImagesParams{\n\t\t\tImageID: image.ID,\n\t\t\tSceneID: scene.ID,\n\t\t})\n\t}\n\t_, err = m.queries.CreateSceneImages(m.context, sceneImages)\n\treturn err\n}\n\nfunc (m *SceneEditProcessor) updateTagsFromEdit(scene *models.Scene, data *models.SceneEditData) error {\n\ttags, err := m.queries.GetMergedTagsForEdit(m.context, m.edit.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.DeleteSceneTagsByScene(m.context, scene.ID); err != nil {\n\t\treturn nil\n\t}\n\n\tvar sceneTags []queries.CreateSceneTagsParams\n\tfor _, tag := range tags {\n\t\tsceneTags = append(sceneTags, queries.CreateSceneTagsParams{\n\t\t\tTagID:   tag.ID,\n\t\t\tSceneID: scene.ID,\n\t\t})\n\t}\n\t_, err = m.queries.CreateSceneTags(m.context, sceneTags)\n\treturn err\n}\n\nfunc (m *SceneEditProcessor) updatePerformersFromEdit(scene *models.Scene, data *models.SceneEditData) error {\n\tappearances, err := m.queries.GetMergedPerformersForEdit(m.context, m.edit.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.DeleteScenePerformers(m.context, scene.ID); err != nil {\n\t\treturn err\n\t}\n\n\tvar scenePerformers []queries.CreateScenePerformersParams\n\tfor _, appearance := range appearances {\n\t\tscenePerformers = append(scenePerformers, queries.CreateScenePerformersParams{\n\t\t\tPerformerID: appearance.Performer.ID,\n\t\t\tAs:          appearance.As,\n\t\t\tSceneID:     scene.ID,\n\t\t})\n\t}\n\t_, err = m.queries.CreateScenePerformers(m.context, scenePerformers)\n\treturn err\n}\n\nfunc (m *SceneEditProcessor) addFingerprintsFromEdit(scene *models.Scene, data *models.SceneEditData, userID uuid.UUID) error {\n\tvar params []queries.CreateSceneFingerprintsParams\n\tfor _, fingerprint := range data.New.AddedFingerprints {\n\t\tif fingerprint.Duration > 0 {\n\t\t\tid, err := m.getOrCreateFingerprintID(fingerprint.Hash, fingerprint.Algorithm.String())\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tparams = append(params, queries.CreateSceneFingerprintsParams{\n\t\t\t\tFingerprintID: int(id),\n\t\t\t\tSceneID:       scene.ID,\n\t\t\t\tUserID:        userID,\n\t\t\t\tDuration:      fingerprint.Duration,\n\t\t\t})\n\t\t}\n\t}\n\n\tif len(params) > 0 {\n\t\t_, err := m.queries.CreateSceneFingerprints(m.context, params)\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (m *SceneEditProcessor) getOrCreateFingerprintID(hash models.FingerprintHash, algorithm string) (int, error) {\n\tfp, err := m.queries.GetFingerprint(m.context, queries.GetFingerprintParams{\n\t\tHash:      hash.Int64(),\n\t\tAlgorithm: algorithm,\n\t})\n\tif err == nil {\n\t\treturn fp.ID, nil\n\t}\n\tif !errors.Is(err, pgx.ErrNoRows) {\n\t\treturn 0, err\n\t}\n\n\tnewFp, err := m.queries.CreateFingerprint(m.context, queries.CreateFingerprintParams{\n\t\tHash:      hash.Int64(),\n\t\tAlgorithm: algorithm,\n\t})\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn newFp.ID, nil\n}\n\nfunc (m *SceneEditProcessor) MergeInto(source queries.Scene, target queries.Scene) error {\n\tif source.Deleted {\n\t\treturn fmt.Errorf(\"merge source scene is deleted: %s\", source.ID.String())\n\t}\n\tif target.Deleted {\n\t\treturn fmt.Errorf(\"merge target scene is deleted: %s\", target.ID.String())\n\t}\n\n\tif _, err := m.queries.SoftDeleteScene(m.context, source.ID); err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.UpdateSceneRedirects(m.context, queries.UpdateSceneRedirectsParams{\n\t\tOldTargetID: source.ID,\n\t\tNewTargetID: target.ID,\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\treturn m.queries.CreateSceneRedirect(m.context, queries.CreateSceneRedirectParams{\n\t\tSourceID: source.ID,\n\t\tTargetID: target.ID,\n\t})\n}\n"
  },
  {
    "path": "internal/service/edit/service.go",
    "content": "package edit\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"slices\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/models/validator\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/internal/service/errutil\"\n\t\"github.com/stashapp/stash-box/pkg/logger\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\nvar ErrUnauthorizedUpdate = fmt.Errorf(\"only the creator can update edits\")\nvar ErrClosedEdit = fmt.Errorf(\"votes can only be cast on pending edits\")\nvar ErrUnauthorizedBot = fmt.Errorf(\"you do not have permission to submit bot edits\")\nvar ErrUpdateLimit = fmt.Errorf(\"edit update limit reached\")\nvar ErrSceneDraftRequired = fmt.Errorf(\"scenes have to be submitted through drafts\")\nvar ErrPendingEdit = fmt.Errorf(\"cannot delete pending edit - only closed edits can be deleted\")\nvar ErrAmendPendingEdit = fmt.Errorf(\"cannot amend pending edit - only closed edits can be amended\")\nvar ErrNoChangesToAmend = fmt.Errorf(\"must specify at least one field or item to remove\")\nvar ErrAmendEmptyResult = fmt.Errorf(\"cannot remove all fields - edit must retain some content\")\n\n// Edit handles edit-related operations\ntype Edit struct {\n\tqueries *queries.Queries\n\twithTxn queries.WithTxnFunc\n}\n\n// NewEdit creates a new edit service\nfunc NewEdit(queries *queries.Queries, withTxn queries.WithTxnFunc) *Edit {\n\treturn &Edit{\n\t\tqueries: queries,\n\t\twithTxn: withTxn,\n\t}\n}\n\nfunc (s *Edit) FindByID(ctx context.Context, id uuid.UUID) (*models.Edit, error) {\n\tedit, err := s.queries.FindEdit(ctx, id)\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\treturn converter.EditToModelPtr(edit), nil\n}\n\nfunc (s *Edit) GetComments(ctx context.Context, editID uuid.UUID) ([]models.EditComment, error) {\n\tcomments, err := s.queries.GetEditComments(ctx, editID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn converter.EditCommentsToModels(comments), nil\n}\n\nfunc (s *Edit) GetVotes(ctx context.Context, editID uuid.UUID) ([]models.EditVote, error) {\n\tvotes, err := s.queries.GetEditVotes(ctx, editID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn converter.EditVotesToModels(votes), nil\n}\n\nfunc (s *Edit) Delete(ctx context.Context, id uuid.UUID) (bool, error) {\n\terr := s.queries.DeleteEdit(ctx, id)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\n// DeleteWithAudit deletes a closed edit and creates an audit record\nfunc (s *Edit) DeleteWithAudit(ctx context.Context, input models.DeleteEditInput) error {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\tif currentUser == nil {\n\t\treturn fmt.Errorf(\"no authenticated user found\")\n\t}\n\n\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\t// Fetch the edit to verify it exists and is closed\n\t\tdbEdit, err := tx.FindEdit(ctx, input.ID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to find edit: %w\", err)\n\t\t}\n\n\t\t// Verify edit is closed\n\t\tif dbEdit.ClosedAt == nil {\n\t\t\treturn ErrPendingEdit\n\t\t}\n\n\t\t// Only create audit log if retention is enabled (> 0 days)\n\t\tretentionDays := config.GetModAuditRetentionDays()\n\t\tif retentionDays > 0 {\n\t\t\t// Create audit data with complete edit record\n\t\t\tauditData := struct {\n\t\t\t\tqueries.Edit\n\t\t\t\tDeletedBy uuid.UUID `json:\"deleted_by\"`\n\t\t\t\tDeletedAt time.Time `json:\"deleted_at\"`\n\t\t\t}{\n\t\t\t\tEdit:      dbEdit,\n\t\t\t\tDeletedBy: currentUser.ID,\n\t\t\t\tDeletedAt: time.Now(),\n\t\t\t}\n\n\t\t\t// Marshal audit data to JSON\n\t\t\tauditDataJSON, err := json.Marshal(auditData)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to marshal audit data: %w\", err)\n\t\t\t}\n\n\t\t\t// Create mod_audit record\n\t\t\tauditID, err := uuid.NewV7()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to generate audit ID: %w\", err)\n\t\t\t}\n\n\t\t\t_, err = tx.CreateModAudit(ctx, queries.CreateModAuditParams{\n\t\t\t\tID:         auditID,\n\t\t\t\tAction:     queries.ModAuditActionEDITDELETE,\n\t\t\t\tUserID:     uuid.NullUUID{UUID: currentUser.ID, Valid: true},\n\t\t\t\tTargetID:   dbEdit.ID,\n\t\t\t\tTargetType: \"EDIT\",\n\t\t\t\tData:       auditDataJSON,\n\t\t\t\tReason:     &input.Reason,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to create audit record: %w\", err)\n\t\t\t}\n\t\t}\n\n\t\t// Delete the edit (cascades to comments and votes)\n\t\tif err := tx.DeleteEdit(ctx, input.ID); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to delete edit: %w\", err)\n\t\t}\n\n\t\treturn nil\n\t})\n}\n\n// AmendEdit amends a closed edit by removing specified fields/items from the edit data\nfunc (s *Edit) AmendEdit(ctx context.Context, input models.AmendEditInput) (*models.Edit, error) {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\tif currentUser == nil {\n\t\treturn nil, fmt.Errorf(\"no authenticated user found\")\n\t}\n\n\tif len(input.RemoveFields) == 0 && len(input.RemoveAddedItems) == 0 && len(input.RemoveRemovedItems) == 0 {\n\t\treturn nil, ErrNoChangesToAmend\n\t}\n\n\tvar updatedEdit *models.Edit\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\tdbEdit, err := tx.FindEdit(ctx, input.ID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to find edit: %w\", err)\n\t\t}\n\n\t\tif dbEdit.ClosedAt == nil {\n\t\t\treturn ErrAmendPendingEdit\n\t\t}\n\n\t\tvar editData map[string]interface{}\n\t\tif err := json.Unmarshal(dbEdit.Data, &editData); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to parse edit data: %w\", err)\n\t\t}\n\n\t\tnewData, _ := editData[\"new_data\"].(map[string]interface{})\n\t\toldData, _ := editData[\"old_data\"].(map[string]interface{})\n\t\tremovedData := make(map[string]interface{})\n\n\t\t// Remove scalar fields\n\t\tfor _, field := range input.RemoveFields {\n\t\t\tif val, exists := newData[field]; exists {\n\t\t\t\tremovedData[field] = val\n\t\t\t\tdelete(newData, field)\n\t\t\t}\n\t\t\tdelete(oldData, field)\n\t\t}\n\n\t\t// Remove array items\n\t\tfor _, removal := range input.RemoveAddedItems {\n\t\t\tremoveArrayItems(newData, \"added_\"+removal.Field, removal.Indices, removedData)\n\t\t}\n\t\tfor _, removal := range input.RemoveRemovedItems {\n\t\t\tremoveArrayItems(newData, \"removed_\"+removal.Field, removal.Indices, removedData)\n\t\t}\n\n\t\tif len(newData) == 0 {\n\t\t\treturn ErrAmendEmptyResult\n\t\t}\n\n\t\tupdatedData, err := json.Marshal(editData)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to marshal updated edit data: %w\", err)\n\t\t}\n\n\t\tif config.GetModAuditRetentionDays() > 0 {\n\t\t\tif err := s.createAmendAudit(ctx, tx, dbEdit.ID, currentUser.ID, input.Reason, removedData); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tdbEdit, err = tx.UpdateEditData(ctx, queries.UpdateEditDataParams{\n\t\t\tID:   input.ID,\n\t\t\tData: updatedData,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to update edit data: %w\", err)\n\t\t}\n\n\t\tupdatedEdit = converter.EditToModelPtr(dbEdit)\n\t\treturn nil\n\t})\n\n\treturn updatedEdit, err\n}\n\nfunc (s *Edit) createAmendAudit(ctx context.Context, tx *queries.Queries, editID, userID uuid.UUID, reason string, removedData map[string]interface{}) error {\n\tremovedDataJSON, err := json.Marshal(removedData)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal removed data: %w\", err)\n\t}\n\n\tauditDataJSON, err := json.Marshal(models.EditAmendmentAuditData{\n\t\tEditID:      editID,\n\t\tAmendedBy:   userID,\n\t\tAmendedAt:   time.Now(),\n\t\tRemovedData: removedDataJSON,\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal audit data: %w\", err)\n\t}\n\n\tauditID, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to generate audit ID: %w\", err)\n\t}\n\n\t_, err = tx.CreateModAudit(ctx, queries.CreateModAuditParams{\n\t\tID:         auditID,\n\t\tAction:     queries.ModAuditActionEDITAMENDMENT,\n\t\tUserID:     uuid.NullUUID{UUID: userID, Valid: true},\n\t\tTargetID:   editID,\n\t\tTargetType: \"EDIT\",\n\t\tData:       auditDataJSON,\n\t\tReason:     &reason,\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create audit record: %w\", err)\n\t}\n\treturn nil\n}\n\nfunc removeArrayItems(data map[string]interface{}, field string, indices []int, removed map[string]interface{}) {\n\tarr, ok := data[field].([]interface{})\n\tif !ok {\n\t\treturn\n\t}\n\n\t// Collect removed items\n\tvar removedItems []interface{}\n\tfor _, idx := range indices {\n\t\tif idx >= 0 && idx < len(arr) {\n\t\t\tremovedItems = append(removedItems, arr[idx])\n\t\t}\n\t}\n\tif len(removedItems) > 0 {\n\t\tremoved[field] = removedItems\n\t}\n\n\t// Sort descending and remove\n\tslices.SortFunc(indices, func(a, b int) int { return b - a })\n\tfor _, idx := range indices {\n\t\tif idx >= 0 && idx < len(arr) {\n\t\t\tarr = slices.Delete(arr, idx, idx+1)\n\t\t}\n\t}\n\n\tif len(arr) == 0 {\n\t\tdelete(data, field)\n\t} else {\n\t\tdata[field] = arr\n\t}\n}\n\nfunc (s *Edit) GetEditTarget(ctx context.Context, id uuid.UUID) (models.EditTarget, error) {\n\tres, err := s.queries.GetEditTargetID(ctx, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif res.ID.IsNil() {\n\t\treturn nil, fmt.Errorf(\"target id not found\")\n\t}\n\n\tswitch res.TargetType {\n\tcase models.TargetTypeEnumTag.String():\n\t\ttag, err := s.queries.FindTag(ctx, res.ID)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn converter.TagToModelPtr(tag), nil\n\tcase models.TargetTypeEnumPerformer.String():\n\t\tperformer, err := s.queries.FindPerformer(ctx, res.ID)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn converter.PerformerToModelPtr(performer), nil\n\tcase models.TargetTypeEnumStudio.String():\n\t\tstudio, err := s.queries.FindStudio(ctx, res.ID)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn converter.StudioToModelPtr(studio), nil\n\tcase models.TargetTypeEnumScene.String():\n\t\tscene, err := s.queries.FindScene(ctx, res.ID)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn converter.SceneToModelPtr(scene), nil\n\tdefault:\n\t\treturn nil, errors.New(\"not implemented\")\n\t}\n}\n\nfunc (s *Edit) GetMergeSources(ctx context.Context, mergeIDs []uuid.UUID, targetType string) ([]models.EditTarget, error) {\n\tmergeSources := []models.EditTarget{}\n\tswitch targetType {\n\tcase models.TargetTypeEnumTag.String():\n\t\ttags, err := s.queries.FindTagsByIds(ctx, mergeIDs)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfor _, tag := range tags {\n\t\t\tmergeSources = append(mergeSources, converter.TagToModelPtr(tag))\n\t\t}\n\tcase models.TargetTypeEnumPerformer.String():\n\t\tperformers, err := s.queries.FindPerformersByIds(ctx, mergeIDs)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfor _, performer := range performers {\n\t\t\tmergeSources = append(mergeSources, converter.PerformerToModelPtr(performer))\n\t\t}\n\tcase models.TargetTypeEnumStudio.String():\n\t\tstudios, err := s.queries.GetStudios(ctx, mergeIDs)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfor _, studio := range studios {\n\t\t\tmergeSources = append(mergeSources, converter.StudioToModelPtr(studio))\n\t\t}\n\tcase models.TargetTypeEnumScene.String():\n\t\tscenes, err := s.queries.GetScenes(ctx, mergeIDs)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfor _, scene := range scenes {\n\t\t\tmergeSources = append(mergeSources, converter.SceneToModelPtr(scene))\n\t\t}\n\tdefault:\n\t\treturn nil, errors.New(\"not implemented\")\n\t}\n\n\treturn mergeSources, nil\n}\n\nfunc (s *Edit) GetMergedURLs(ctx context.Context, id uuid.UUID) ([]models.URL, error) {\n\tres, err := s.queries.GetMergedURLsForEdit(ctx, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar urls []models.URL\n\tfor _, url := range res {\n\t\tu := models.URL{URL: url.Url, SiteID: url.SiteID}\n\t\turls = append(urls, u)\n\t}\n\treturn urls, nil\n}\n\nfunc (s *Edit) GetMergedImages(ctx context.Context, id uuid.UUID) ([]models.Image, error) {\n\tres, err := s.queries.GetImagesForEdit(ctx, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn converter.ImagesToModels(res), nil\n}\n\nfunc (s *Edit) GetMergedPerformerAliases(ctx context.Context, id uuid.UUID) ([]string, error) {\n\treturn s.queries.GetEditPerformerAliases(ctx, id)\n}\n\nfunc (s *Edit) GetMergedStudioAliases(ctx context.Context, id uuid.UUID) ([]string, error) {\n\treturn s.queries.GetMergedStudioAliasesForEdit(ctx, id)\n}\n\nfunc (s *Edit) GetMergedPerformerTattoos(ctx context.Context, id uuid.UUID) ([]models.BodyModification, error) {\n\tres, err := s.queries.GetEditPerformerTattoos(ctx, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar mods []models.BodyModification\n\tfor _, mod := range res {\n\t\tlocation := \"\"\n\t\tif mod.Location != nil {\n\t\t\tlocation = *mod.Location\n\t\t}\n\t\tbodyMod := models.BodyModification{\n\t\t\tLocation:    location,\n\t\t\tDescription: mod.Description,\n\t\t}\n\t\tmods = append(mods, bodyMod)\n\t}\n\treturn mods, err\n}\n\nfunc (s *Edit) GetMergedPerformerPiercings(ctx context.Context, id uuid.UUID) ([]models.BodyModification, error) {\n\tres, err := s.queries.GetEditPerformerPiercings(ctx, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar mods []models.BodyModification\n\tfor _, mod := range res {\n\t\tlocation := \"\"\n\t\tif mod.Location != nil {\n\t\t\tlocation = *mod.Location\n\t\t}\n\t\tbodyMod := models.BodyModification{\n\t\t\tLocation:    location,\n\t\t\tDescription: mod.Description,\n\t\t}\n\t\tmods = append(mods, bodyMod)\n\t}\n\treturn mods, err\n}\n\nfunc (s *Edit) GetMergedTags(ctx context.Context, id uuid.UUID) ([]models.Tag, error) {\n\ttags, err := s.queries.GetMergedTagsForEdit(ctx, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn converter.TagsToModels(tags), nil\n}\n\nfunc (s *Edit) GetMergedPerformers(ctx context.Context, id uuid.UUID) ([]models.PerformerAppearance, error) {\n\tperformers, err := s.queries.GetMergedPerformersForEdit(ctx, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar result []models.PerformerAppearance\n\tfor _, performer := range performers {\n\t\tconvertedPerformer := converter.PerformerToModelPtr(performer.Performer)\n\n\t\tresult = append(result, models.PerformerAppearance{\n\t\t\tPerformer: convertedPerformer,\n\t\t\tAs:        performer.As,\n\t\t})\n\t}\n\treturn result, nil\n}\n\nfunc (s *Edit) FindByPerformerID(ctx context.Context, performerID uuid.UUID) ([]models.Edit, error) {\n\tedits, err := s.queries.GetEditsByPerformer(ctx, performerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar modelEdits []models.Edit\n\tfor _, edit := range edits {\n\t\tmodelEdits = append(modelEdits, converter.EditToModel(edit))\n\t}\n\n\treturn modelEdits, nil\n}\n\nfunc (s *Edit) FindByStudioID(ctx context.Context, studioID uuid.UUID) ([]models.Edit, error) {\n\tedits, err := s.queries.GetEditsByStudio(ctx, studioID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar modelEdits []models.Edit\n\tfor _, edit := range edits {\n\t\tmodelEdits = append(modelEdits, converter.EditToModel(edit))\n\t}\n\n\treturn modelEdits, nil\n}\n\nfunc (s *Edit) FindByTagID(ctx context.Context, tagID uuid.UUID) ([]models.Edit, error) {\n\tedits, err := s.queries.GetEditsByTag(ctx, tagID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar modelEdits []models.Edit\n\tfor _, edit := range edits {\n\t\tmodelEdits = append(modelEdits, converter.EditToModel(edit))\n\t}\n\n\treturn modelEdits, nil\n}\n\nfunc (s *Edit) FindBySceneID(ctx context.Context, sceneID uuid.UUID) ([]models.Edit, error) {\n\tedits, err := s.queries.GetEditsByScene(ctx, sceneID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar modelEdits []models.Edit\n\tfor _, edit := range edits {\n\t\tmodelEdits = append(modelEdits, converter.EditToModel(edit))\n\t}\n\n\treturn modelEdits, nil\n}\n\nfunc (s *Edit) CreateSceneEdit(ctx context.Context, input models.SceneEditInput) (*models.Edit, error) {\n\tUUID, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\tif err := validateBotEdit(ctx, input.Edit); err != nil {\n\t\treturn nil, err\n\t}\n\n\tnewEdit := models.NewEdit(UUID, currentUser, models.TargetTypeEnumScene, input.Edit)\n\n\t// For scene create, check if draft exist if draft is required\n\tif config.GetRequireSceneDraft() && input.Edit.Operation == models.OperationEnumCreate {\n\t\tif input.Details != nil && input.Details.DraftID != nil {\n\t\t\t_, err := s.queries.FindDraft(ctx, *input.Details.DraftID)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, ErrSceneDraftRequired\n\t\t\t}\n\t\t} else {\n\t\t\treturn nil, ErrSceneDraftRequired\n\t\t}\n\t}\n\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tp := Scene(ctx, tx, newEdit)\n\t\tinputArgs := utils.Arguments(ctx).Field(\"input\")\n\t\tif err := p.Edit(input, inputArgs, false); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tnewEdit, err = p.CreateEdit()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := p.CreateJoin(input); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif input.Details != nil && input.Details.DraftID != nil {\n\t\t\tif err := tx.DeleteDraft(ctx, *input.Details.DraftID); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\treturn p.CreateComment(currentUser, input.Edit.Comment)\n\t})\n\n\treturn newEdit, err\n}\n\nfunc (s *Edit) UpdateSceneEdit(ctx context.Context, id uuid.UUID, input models.SceneEditInput) (*models.Edit, error) {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\n\tdbEdit, err := s.queries.FindEdit(ctx, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tedit := converter.EditToModelPtr(dbEdit)\n\tif err = validateEditUpdate(*edit, currentUser); err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tp := Scene(ctx, tx, edit)\n\t\tinputArgs := utils.Arguments(ctx).Field(\"input\")\n\t\tif err := p.Edit(input, inputArgs, true); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tedit, err = p.UpdateEdit()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn p.CreateComment(currentUser, input.Edit.Comment)\n\t})\n\n\treturn edit, err\n}\n\nfunc (s *Edit) CreateStudioEdit(ctx context.Context, input models.StudioEditInput) (*models.Edit, error) {\n\tUUID, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// create the edit\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\tif err := validateBotEdit(ctx, input.Edit); err != nil {\n\t\treturn nil, err\n\t}\n\n\tnewEdit := models.NewEdit(UUID, currentUser, models.TargetTypeEnumStudio, input.Edit)\n\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tp := Studio(ctx, tx, newEdit)\n\t\tinputArgs := utils.Arguments(ctx).Field(\"input\")\n\t\tif err := p.Edit(input, inputArgs); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tnewEdit, err = p.CreateEdit()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := p.CreateJoin(input); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn p.CreateComment(currentUser, input.Edit.Comment)\n\t})\n\n\treturn newEdit, err\n}\n\nfunc (s *Edit) UpdateStudioEdit(ctx context.Context, id uuid.UUID, input models.StudioEditInput) (*models.Edit, error) {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\n\tdbEdit, err := s.queries.FindEdit(ctx, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tedit := converter.EditToModelPtr(dbEdit)\n\tif err = validateEditUpdate(*edit, currentUser); err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tp := Studio(ctx, tx, edit)\n\t\tinputArgs := utils.Arguments(ctx).Field(\"input\")\n\t\tif err := p.Edit(input, inputArgs); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tedit, err = p.UpdateEdit()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn p.CreateComment(currentUser, input.Edit.Comment)\n\t})\n\n\treturn edit, err\n}\n\nfunc (s *Edit) CreateTagEdit(ctx context.Context, input models.TagEditInput) (*models.Edit, error) {\n\tif config.GetRequireTagRole() {\n\t\tif err := auth.ValidateRole(ctx, models.RoleEnumEditTags); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tUUID, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// create the edit\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\tif err := validateBotEdit(ctx, input.Edit); err != nil {\n\t\treturn nil, err\n\t}\n\n\tnewEdit := models.NewEdit(UUID, currentUser, models.TargetTypeEnumTag, input.Edit)\n\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tp := Tag(ctx, tx, newEdit)\n\t\tinputArgs := utils.Arguments(ctx).Field(\"input\")\n\t\tif err := p.Edit(input, inputArgs); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tnewEdit, err = p.CreateEdit()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := p.CreateJoin(input); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn p.CreateComment(currentUser, input.Edit.Comment)\n\t})\n\n\treturn newEdit, err\n}\n\nfunc (s *Edit) UpdateTagEdit(ctx context.Context, id uuid.UUID, input models.TagEditInput) (*models.Edit, error) {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\n\tdbEdit, err := s.queries.FindEdit(ctx, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tedit := converter.EditToModelPtr(dbEdit)\n\tif err = validateEditUpdate(*edit, currentUser); err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tp := Tag(ctx, tx, edit)\n\t\tinputArgs := utils.Arguments(ctx).Field(\"input\")\n\t\tif err := p.Edit(input, inputArgs); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tedit, err = p.UpdateEdit()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn p.CreateComment(currentUser, input.Edit.Comment)\n\t})\n\n\treturn edit, err\n}\n\nfunc (s *Edit) CreatePerformerEdit(ctx context.Context, input models.PerformerEditInput) (*models.Edit, error) {\n\tUUID, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// create the edit\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\tif err := validateBotEdit(ctx, input.Edit); err != nil {\n\t\treturn nil, err\n\t}\n\n\tnewEdit := models.NewEdit(UUID, currentUser, models.TargetTypeEnumPerformer, input.Edit)\n\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tp := Performer(ctx, tx, newEdit)\n\t\tinputArgs := utils.Arguments(ctx).Field(\"input\")\n\t\tif err := p.Edit(input, inputArgs, false); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tnewEdit, err = p.CreateEdit()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := p.CreateJoin(input); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif input.Details != nil && input.Details.DraftID != nil {\n\t\t\tif err := tx.DeleteDraft(ctx, *input.Details.DraftID); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\treturn p.CreateComment(currentUser, input.Edit.Comment)\n\t})\n\n\treturn newEdit, err\n}\n\nfunc (s *Edit) UpdatePerformerEdit(ctx context.Context, id uuid.UUID, input models.PerformerEditInput) (*models.Edit, error) {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\n\tdbEdit, err := s.queries.FindEdit(ctx, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tedit := converter.EditToModelPtr(dbEdit)\n\tif err = validateEditUpdate(*edit, currentUser); err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tp := Performer(ctx, tx, edit)\n\t\tinputArgs := utils.Arguments(ctx).Field(\"input\")\n\t\tif err := p.Edit(input, inputArgs, true); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tedit, err = p.UpdateEdit()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn p.CreateComment(currentUser, input.Edit.Comment)\n\t})\n\n\treturn edit, err\n}\n\nfunc (s *Edit) CreateVote(ctx context.Context, input models.EditVoteInput) (*models.Edit, error) {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\tvar voteEdit *models.Edit\n\tif err := s.withTxn(func(tx *queries.Queries) error {\n\t\tvar err error\n\t\tdbEdit, err := tx.FindEdit(ctx, input.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tvoteEdit = converter.EditToModelPtr(dbEdit)\n\n\t\tif voteEdit.Status != models.VoteStatusEnumPending.String() {\n\t\t\treturn ErrClosedEdit\n\t\t}\n\n\t\tif err := auth.ValidateOwner(ctx, voteEdit.UserID.UUID); err == nil {\n\t\t\treturn auth.ErrUnauthorized\n\t\t}\n\n\t\tif err := tx.CreateEditVote(ctx, queries.CreateEditVoteParams{\n\t\t\tUserID: currentUser.ID,\n\t\t\tEditID: voteEdit.ID,\n\t\t\tVote:   input.Vote.String(),\n\t\t}); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Re-fetch the edit to get the updated vote_count from the database trigger\n\t\tdbEdit, err = tx.FindEdit(ctx, input.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tvoteEdit = converter.EditToModelPtr(dbEdit)\n\n\t\treturn nil\n\t}); err != nil {\n\t\treturn nil, err\n\t}\n\n\tresult, err := s.ResolveVotingThreshold(ctx, voteEdit)\n\t// nolint: exhaustive\n\tswitch result {\n\tcase models.VoteStatusEnumAccepted:\n\t\tupdatedEdit, applyErr := s.ApplyEdit(ctx, input.ID, false)\n\t\tif applyErr != nil {\n\t\t\treturn nil, applyErr\n\t\t}\n\t\treturn updatedEdit, nil\n\tcase models.VoteStatusEnumRejected:\n\t\tupdatedEdit, closeErr := s.CloseEdit(ctx, input.ID, models.VoteStatusEnumRejected)\n\t\tif closeErr != nil {\n\t\t\treturn nil, closeErr\n\t\t}\n\t\treturn updatedEdit, nil\n\t}\n\n\treturn voteEdit, err\n}\n\nfunc (s *Edit) CreateComment(ctx context.Context, input models.EditCommentInput) (*models.Edit, *models.EditComment, error) {\n\tedit, err := s.queries.FindEdit(ctx, input.ID)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tvar comment *models.EditComment\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tcurrentUser := auth.GetCurrentUser(ctx)\n\t\tparams, err := converter.CreateEditCommentParams(edit.ID, currentUser.ID, input.Comment)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdbComment, err := tx.CreateEditComment(ctx, params)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcomment = converter.EditCommentToModelPtr(dbComment)\n\t\treturn nil\n\t})\n\n\treturn converter.EditToModelPtr(edit), comment, err\n}\n\nfunc (s *Edit) Cancel(ctx context.Context, input models.CancelEditInput) (*models.Edit, error) {\n\te, err := s.queries.FindEdit(ctx, input.ID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err = auth.ValidateOwner(ctx, e.UserID.UUID); err == nil {\n\t\treturn s.CloseEdit(ctx, input.ID, models.VoteStatusEnumCanceled)\n\t} else if err = auth.ValidateAdmin(ctx); err == nil {\n\t\tcurrentUser := auth.GetCurrentUser(ctx)\n\n\t\tif err := s.queries.CreateEditVote(ctx, queries.CreateEditVoteParams{\n\t\t\tUserID: currentUser.ID,\n\t\t\tEditID: e.ID,\n\t\t\tVote:   models.VoteTypeEnumImmediateReject.String(),\n\t\t}); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\treturn s.CloseEdit(ctx, input.ID, models.VoteStatusEnumImmediateRejected)\n\t}\n\n\treturn nil, err\n}\n\nfunc (s *Edit) Apply(ctx context.Context, input models.ApplyEditInput) (*models.Edit, error) {\n\tedit, err := s.queries.FindEdit(ctx, input.ID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\n\tif err := s.queries.CreateEditVote(ctx, queries.CreateEditVoteParams{\n\t\tUserID: currentUser.ID,\n\t\tEditID: edit.ID,\n\t\tVote:   models.VoteTypeEnumImmediateAccept.String(),\n\t}); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn s.ApplyEdit(ctx, input.ID, true)\n}\n\nfunc validateBotEdit(ctx context.Context, input *models.EditInput) error {\n\tif input.Bot != nil && *input.Bot {\n\t\tif err := auth.ValidateBot(ctx); err != nil {\n\t\t\treturn ErrUnauthorizedBot\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc validateEditUpdate(edit models.Edit, user *models.User) error {\n\tif edit.UserID.UUID != user.ID {\n\t\treturn ErrUnauthorizedUpdate\n\t}\n\n\tif edit.UpdateCount >= config.GetEditUpdateLimit() {\n\t\treturn ErrUpdateLimit\n\t}\n\n\treturn nil\n}\n\nfunc (s *Edit) ApplyEdit(ctx context.Context, editID uuid.UUID, immediate bool) (*models.Edit, error) {\n\tvar updatedEdit *models.Edit\n\tdbEdit, err := s.queries.FindEdit(ctx, editID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tedit := converter.EditToModelPtr(dbEdit)\n\tif err := validateEditPresence(edit); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := validateEditPrerequisites(edit); err != nil {\n\t\tedit.Fail()\n\t\treturn nil, err\n\t}\n\n\tvar operation models.OperationEnum\n\tutils.ResolveEnumString(edit.Operation, &operation)\n\tvar targetType models.TargetTypeEnum\n\tutils.ResolveEnumString(edit.TargetType, &targetType)\n\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tvar applyer editApplyer\n\t\tswitch targetType {\n\t\tcase models.TargetTypeEnumTag:\n\t\t\tapplyer = Tag(ctx, tx, edit)\n\t\tcase models.TargetTypeEnumPerformer:\n\t\t\tapplyer = Performer(ctx, tx, edit)\n\t\tcase models.TargetTypeEnumStudio:\n\t\t\tapplyer = Studio(ctx, tx, edit)\n\t\tcase models.TargetTypeEnumScene:\n\t\t\tapplyer = Scene(ctx, tx, edit)\n\t\t}\n\n\t\treturn applyer.apply()\n\t})\n\n\tsuccess := true\n\tif err != nil {\n\t\t// Failed apply, so we create a comment with error details\n\t\tsuccess = false\n\t\tcommentID, _ := uuid.NewV7()\n\t\ttext := \"###### Edit application failed: ######\\n\"\n\t\tif prereqErr := (*validator.ErrEditPrerequisiteFailed)(nil); errors.As(err, &prereqErr) {\n\t\t\ttext = fmt.Sprintf(\"%sPrerequisite failed: %v\", text, err)\n\t\t} else {\n\t\t\ttext = fmt.Sprintf(\"%sUnknown Error: %v\", text, err)\n\t\t}\n\t\tmodBotID := getModBot(ctx, s.queries)\n\n\t\tcomment := models.NewEditComment(commentID, modBotID, edit, text)\n\t\t_, err = s.queries.CreateEditComment(ctx, converter.EditCommentToCreateParams(*comment))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tswitch {\n\tcase !success:\n\t\tedit.Fail()\n\tcase immediate:\n\t\tedit.ImmediateAccept()\n\tdefault:\n\t\tedit.Accept()\n\t}\n\tdbEdit, err = s.queries.UpdateEdit(ctx, converter.EditToUpdateParams(*edit))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tupdatedEdit = converter.EditToModelPtr(dbEdit)\n\n\t// TODO: Maybe use cron instead\n\tif success {\n\t\tuserPromotionThreshold := config.GetVotePromotionThreshold()\n\t\tif userPromotionThreshold != nil && updatedEdit.UserID.Valid {\n\t\t\tgo func() {\n\t\t\t\tif err := s.PromoteUserVoteRights(context.Background(), updatedEdit.UserID.UUID, *userPromotionThreshold); err != nil {\n\t\t\t\t\tlogger.Errorf(\"Failed to promote user vote rights: %v\", err)\n\t\t\t\t}\n\t\t\t}()\n\t\t}\n\t}\n\n\treturn updatedEdit, err\n}\n\nfunc (s *Edit) CloseEdit(ctx context.Context, editID uuid.UUID, status models.VoteStatusEnum) (*models.Edit, error) {\n\tvar updatedEdit *models.Edit\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\tdbEdit, err := tx.FindEdit(ctx, editID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tedit := converter.EditToModelPtr(dbEdit)\n\t\tif err := validateEditPresence(edit); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := validateEditPrerequisites(edit); err != nil {\n\t\t\tedit.Fail()\n\t\t\treturn err\n\t\t}\n\n\t\tswitch status {\n\t\tcase models.VoteStatusEnumImmediateRejected:\n\t\t\tedit.ImmediateReject()\n\t\tcase models.VoteStatusEnumRejected:\n\t\t\tedit.Reject()\n\t\tcase models.VoteStatusEnumCanceled:\n\t\t\tedit.Cancel()\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"tried to close with invalid status: %s\", status)\n\t\t}\n\n\t\tdbEdit, err = tx.UpdateEdit(ctx, converter.EditToUpdateParams(*edit))\n\t\tupdatedEdit = converter.EditToModelPtr(dbEdit)\n\n\t\treturn err\n\t})\n\n\treturn updatedEdit, err\n}\n\nfunc (s *Edit) ResolveVotingThreshold(ctx context.Context, edit *models.Edit) (models.VoteStatusEnum, error) {\n\tthreshold := config.GetVoteApplicationThreshold()\n\tif threshold == 0 {\n\t\treturn models.VoteStatusEnumPending, nil\n\t}\n\n\t// For destructive edits we check if they've been open for a minimum period before applying\n\tif edit.IsDestructive() {\n\t\tif time.Since(edit.CreatedAt).Seconds() <= float64(config.GetMinDestructiveVotingPeriod()) {\n\t\t\treturn models.VoteStatusEnumPending, nil\n\t\t}\n\t}\n\n\tvotes, err := s.queries.GetEditVotes(ctx, edit.ID)\n\tif err != nil {\n\t\treturn models.VoteStatusEnumPending, err\n\t}\n\n\tpositive := 0\n\tnegative := 0\n\tfor _, vote := range votes {\n\t\tif vote.Vote == models.VoteTypeEnumAccept.String() {\n\t\t\tpositive++\n\t\t} else if vote.Vote == models.VoteTypeEnumReject.String() {\n\t\t\tnegative++\n\t\t}\n\t}\n\n\tif positive >= threshold && negative == 0 {\n\t\treturn models.VoteStatusEnumAccepted, nil\n\t} else if negative >= threshold && positive == 0 {\n\t\treturn models.VoteStatusEnumRejected, nil\n\t}\n\n\treturn models.VoteStatusEnumPending, nil\n}\n\nfunc (s *Edit) FindPendingPerformerCreation(ctx context.Context, input models.QueryExistingPerformerInput) ([]models.Edit, error) {\n\tdbEdits, err := s.queries.FindPendingPerformerCreation(ctx, queries.FindPendingPerformerCreationParams{\n\t\tName: input.Name,\n\t\tUrls: input.Urls,\n\t})\n\n\tvar edits []models.Edit\n\tfor _, edit := range dbEdits {\n\t\tedits = append(edits, converter.EditToModel(edit))\n\t}\n\n\treturn edits, err\n}\n\nfunc (s *Edit) FindPendingSceneCreation(ctx context.Context, input models.QueryExistingSceneInput) ([]models.Edit, error) {\n\tvar studioID uuid.NullUUID\n\tvar hashes []string\n\n\tif input.StudioID != nil {\n\t\tstudioID = uuid.NullUUID{UUID: *input.StudioID, Valid: true}\n\t}\n\tfor _, fp := range input.Fingerprints {\n\t\thashes = append(hashes, fp.Hash.Hex())\n\t}\n\n\trows, err := s.queries.FindPendingSceneCreation(ctx, queries.FindPendingSceneCreationParams{\n\t\tTitle:    input.Title,\n\t\tStudioID: studioID,\n\t\tHashes:   hashes,\n\t})\n\treturn converter.EditsToModels(rows), err\n}\n\nfunc (s *Edit) CloseCompleted(ctx context.Context) ([]*models.Edit, error) {\n\tedits, err := s.queries.FindCompletedEdits(ctx, queries.FindCompletedEditsParams{\n\t\tVotingPeriod:        config.GetVotingPeriod(),\n\t\tMinimumVotes:        config.GetVoteApplicationThreshold(),\n\t\tMinimumVotingPeriod: config.GetMinDestructiveVotingPeriod(),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tlogger.Debugf(\"Closing %d completed edits\", len(edits))\n\tvar closedEdits []*models.Edit\n\tfor _, edit := range edits {\n\t\te := converter.EditToModel(edit)\n\t\tvoteThreshold := 0\n\t\tif e.IsDestructive() {\n\t\t\t// Require at least +1 votes to pass destructive edits\n\t\t\tvoteThreshold = 1\n\t\t}\n\n\t\tvar err error\n\t\tvar closedEdit *models.Edit\n\t\tif e.VoteCount >= voteThreshold {\n\t\t\tclosedEdit, err = s.ApplyEdit(ctx, e.ID, false)\n\t\t} else {\n\t\t\tclosedEdit, err = s.CloseEdit(ctx, e.ID, models.VoteStatusEnumRejected)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn closedEdits, err\n\t\t}\n\n\t\tclosedEdits = append(closedEdits, closedEdit)\n\t}\n\n\treturn closedEdits, nil\n}\n\nfunc (s *Edit) PromoteUserVoteRights(ctx context.Context, userID uuid.UUID, threshold int) error {\n\tuser, err := s.queries.FindUser(ctx, userID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdbRoles, err := s.queries.GetUserRoles(ctx, userID)\n\tif err != nil {\n\t\treturn err\n\t}\n\troles := converter.StringsToRoleEnums(dbRoles)\n\n\thasVote := false\n\tfor _, role := range roles {\n\t\tif role == models.RoleEnumReadOnly {\n\t\t\treturn nil\n\t\t}\n\t\tif role.Implies(models.RoleEnumVote) {\n\t\t\thasVote = true\n\t\t}\n\t}\n\n\tif !hasVote {\n\t\teditCount, err := s.queries.CountUserEditsByStatus(ctx, uuid.NullUUID{UUID: user.ID, Valid: true})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\taccepted := 0\n\t\tfor _, row := range editCount {\n\t\t\tif row.Status == models.VoteStatusEnumAccepted.String() || row.Status == models.VoteStatusEnumImmediateAccepted.String() {\n\t\t\t\taccepted += int(row.Count)\n\t\t\t}\n\t\t}\n\n\t\tif accepted >= threshold {\n\t\t\t_, err := s.queries.CreateUserRoles(ctx, []queries.CreateUserRolesParams{\n\t\t\t\t{\n\t\t\t\t\tUserID: user.ID,\n\t\t\t\t\tRole:   models.RoleEnumVote.String(),\n\t\t\t\t},\n\t\t\t})\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Dataloader methods\n\nfunc (s *Edit) LoadIds(ctx context.Context, ids []uuid.UUID) ([]*models.Edit, []error) {\n\tedits, err := s.queries.GetEditsByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tresult := make([]*models.Edit, len(ids))\n\teditMap := make(map[uuid.UUID]*models.Edit)\n\n\tfor _, edit := range edits {\n\t\teditMap[edit.ID] = converter.EditToModelPtr(edit)\n\t}\n\n\tfor i, id := range ids {\n\t\tresult[i] = editMap[id]\n\t}\n\n\treturn result, make([]error, len(ids))\n}\n\nfunc (s *Edit) LoadCommentsByIds(ctx context.Context, ids []uuid.UUID) ([]*models.EditComment, []error) {\n\tcomments, err := s.queries.GetEditCommentsByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tresult := make([]*models.EditComment, len(ids))\n\tcommentMap := make(map[uuid.UUID]*models.EditComment)\n\n\tfor _, comment := range comments {\n\t\tcommentMap[comment.ID] = converter.EditCommentToModelPtr(comment)\n\t}\n\n\tfor i, id := range ids {\n\t\tresult[i] = commentMap[id]\n\t}\n\n\treturn result, make([]error, len(ids))\n}\n"
  },
  {
    "path": "internal/service/edit/studio.go",
    "content": "package edit\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\ntype StudioEditProcessor struct {\n\tmutator\n}\n\nfunc Studio(ctx context.Context, queries *queries.Queries, edit *models.Edit) *StudioEditProcessor {\n\treturn &StudioEditProcessor{\n\t\tmutator{\n\t\t\tcontext: ctx,\n\t\t\tqueries: queries,\n\t\t\tedit:    edit,\n\t\t},\n\t}\n}\n\nfunc (m *StudioEditProcessor) Edit(input models.StudioEditInput, inputArgs utils.ArgumentsQuery) error {\n\tif err := validateStudioEditInput(m.context, m.queries, input); err != nil {\n\t\treturn err\n\t}\n\n\tvar err error\n\tswitch input.Edit.Operation {\n\tcase models.OperationEnumModify:\n\t\terr = m.modifyEdit(input, inputArgs)\n\tcase models.OperationEnumMerge:\n\t\terr = m.mergeEdit(input, inputArgs)\n\tcase models.OperationEnumDestroy:\n\t\terr = m.destroyEdit(input)\n\tcase models.OperationEnumCreate:\n\t\terr = m.createEdit(input)\n\t}\n\n\treturn err\n}\n\nfunc (m *StudioEditProcessor) modifyEdit(input models.StudioEditInput, inputArgs utils.ArgumentsQuery) error {\n\t// get the existing studio\n\tstudioID := *input.Edit.ID\n\tdbStudio, err := m.queries.FindStudio(m.context, studioID)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tstudio := converter.StudioToModel(dbStudio)\n\tvar entity editEntity = studio\n\tif err := validateEditEntity(&entity, studioID, \"studio\"); err != nil {\n\t\treturn err\n\t}\n\n\t// perform a diff against the input and the current object\n\tdetailArgs := inputArgs.Field(\"details\")\n\tstudioEdit, err := input.Details.StudioEditFromDiff(studio, detailArgs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err = m.diffRelationships(studioEdit, studioID, input, inputArgs); err != nil {\n\t\treturn err\n\t}\n\n\tif reflect.DeepEqual(studioEdit.Old, studioEdit.New) {\n\t\treturn ErrNoChanges\n\t}\n\n\treturn m.edit.SetData(studioEdit)\n}\n\nfunc (m *StudioEditProcessor) diffURLs(studioEdit *models.StudioEditData, studioID uuid.UUID, newURLs []models.URL) error {\n\tdbURLs, err := m.queries.GetStudioURLs(m.context, studioID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar urls []models.URL\n\tfor _, url := range dbURLs {\n\t\turls = append(urls, models.URL{\n\t\t\tURL:    url.Url,\n\t\t\tSiteID: url.SiteID,\n\t\t})\n\t}\n\tstudioEdit.New.AddedUrls, studioEdit.New.RemovedUrls = urlCompare(newURLs, urls)\n\treturn nil\n}\n\nfunc (m *StudioEditProcessor) diffAliases(studioEdit *models.StudioEditData, studioID uuid.UUID, newAliases []string) error {\n\taliases, err := m.queries.GetStudioAliases(m.context, studioID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tstudioEdit.New.AddedAliases, studioEdit.New.RemovedAliases = utils.SliceCompare(newAliases, aliases)\n\treturn nil\n}\n\nfunc (m *StudioEditProcessor) diffImages(studioEdit *models.StudioEditData, studioID uuid.UUID, newImageIds []uuid.UUID) error {\n\timages, err := m.queries.FindImagesByStudioID(m.context, studioID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar existingImages []uuid.UUID\n\tfor _, image := range images {\n\t\texistingImages = append(existingImages, image.ID)\n\t}\n\tstudioEdit.New.AddedImages, studioEdit.New.RemovedImages = utils.SliceCompare(newImageIds, existingImages)\n\n\treturn nil\n}\n\nfunc (m *StudioEditProcessor) mergeEdit(input models.StudioEditInput, inputArgs utils.ArgumentsQuery) error {\n\t// get the existing studio\n\tif input.Edit.ID == nil {\n\t\treturn ErrMergeIDMissing\n\t}\n\tstudioID := *input.Edit.ID\n\tdbStudio, err := m.queries.FindStudio(m.context, studioID)\n\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%w: target studio %s: %w\", ErrEntityNotFound, studioID.String(), err)\n\t}\n\n\tstudio := converter.StudioToModel(dbStudio)\n\tvar mergeSources []uuid.UUID\n\tfor _, sourceID := range input.Edit.MergeSourceIds {\n\t\t_, err := m.queries.FindStudio(m.context, sourceID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"%w: source studio %s, %w\", ErrEntityNotFound, sourceID.String(), err)\n\t\t}\n\n\t\tif studioID == sourceID {\n\t\t\treturn ErrMergeTargetIsSource\n\t\t}\n\t\tmergeSources = append(mergeSources, sourceID)\n\t}\n\n\tif len(mergeSources) < 1 {\n\t\treturn ErrNoMergeSources\n\t}\n\n\t// perform a diff against the input and the current object\n\tdetailArgs := inputArgs.Field(\"details\")\n\tstudioEdit, err := input.Details.StudioEditFromMerge(studio, mergeSources, detailArgs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err = m.diffRelationships(studioEdit, studioID, input, inputArgs); err != nil {\n\t\treturn err\n\t}\n\n\treturn m.edit.SetData(studioEdit)\n}\n\nfunc (m *StudioEditProcessor) createEdit(input models.StudioEditInput) error {\n\tstudioEdit := input.Details.StudioEditFromCreate()\n\n\tstudioEdit.New.AddedUrls = input.Details.Urls\n\tstudioEdit.New.AddedImages = input.Details.ImageIds\n\tstudioEdit.New.AddedAliases = input.Details.Aliases\n\n\treturn m.edit.SetData(studioEdit)\n}\n\nfunc (m *StudioEditProcessor) destroyEdit(input models.StudioEditInput) error {\n\t// Get the existing studio\n\tstudioID := *input.Edit.ID\n\tdbStudio, err := m.queries.FindStudio(m.context, studioID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tstudio := converter.StudioToModel(dbStudio)\n\tvar entity editEntity = studio\n\treturn validateEditEntity(&entity, studioID, \"studio\")\n}\n\nfunc (m *StudioEditProcessor) CreateJoin(input models.StudioEditInput) error {\n\tif input.Edit.ID != nil {\n\t\treturn m.queries.CreateStudioEdit(m.context, queries.CreateStudioEditParams{\n\t\t\tEditID:   m.edit.ID,\n\t\t\tStudioID: *input.Edit.ID,\n\t\t})\n\t}\n\n\treturn nil\n}\n\nfunc (m *StudioEditProcessor) apply() error {\n\toperation := m.operation()\n\tisCreate := operation == models.OperationEnumCreate\n\n\tvar studio *models.Studio\n\tif !isCreate {\n\t\tres, err := m.queries.GetEditTargetID(m.context, m.edit.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdbStudio, err := m.queries.FindStudio(m.context, res.ID)\n\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"%w: studio %s: %w\", ErrEntityNotFound, res.ID.String(), err)\n\t\t}\n\t\tstudio = converter.StudioToModelPtr(dbStudio)\n\t}\n\n\tdata, err := m.edit.GetStudioData()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tswitch operation {\n\tcase models.OperationEnumCreate:\n\t\tstudioID, err := uuid.NewV7()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tnewStudio := models.Studio{\n\t\t\tID: studioID,\n\t\t}\n\t\tif data.New.Name == nil {\n\t\t\treturn errors.New(\"missing studio name\")\n\t\t}\n\t\tnewStudio.CopyFromStudioEdit(*data.New, &models.StudioEdit{})\n\n\t\t_, err = m.queries.CreateStudio(m.context, converter.StudioToCreateParams(newStudio))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif len(data.New.AddedUrls) > 0 {\n\t\t\tvar urls []queries.CreateStudioURLsParams\n\t\t\tfor _, url := range data.New.AddedUrls {\n\t\t\t\turls = append(urls, queries.CreateStudioURLsParams{\n\t\t\t\t\tStudioID: studioID,\n\t\t\t\t\tUrl:      url.URL,\n\t\t\t\t\tSiteID:   url.SiteID,\n\t\t\t\t})\n\t\t\t}\n\t\t\t_, err = m.queries.CreateStudioURLs(m.context, urls)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif len(data.New.AddedImages) > 0 {\n\t\t\tvar params []queries.CreateStudioImagesParams\n\t\t\tfor _, image := range data.New.AddedImages {\n\t\t\t\tparams = append(params, queries.CreateStudioImagesParams{\n\t\t\t\t\tStudioID: studioID,\n\t\t\t\t\tImageID:  image,\n\t\t\t\t})\n\t\t\t}\n\t\t\t_, err := m.queries.CreateStudioImages(m.context, params)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif len(data.New.AddedAliases) > 0 {\n\t\t\tvar params []queries.CreateStudioAliasesParams\n\t\t\tfor _, alias := range data.New.AddedAliases {\n\t\t\t\tparams = append(params, queries.CreateStudioAliasesParams{\n\t\t\t\t\tStudioID: studioID,\n\t\t\t\t\tAlias:    alias,\n\t\t\t\t})\n\t\t\t}\n\t\t\t_, err := m.queries.CreateStudioAliases(m.context, params)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\treturn m.queries.CreateStudioEdit(m.context, queries.CreateStudioEditParams{\n\t\t\tEditID:   m.edit.ID,\n\t\t\tStudioID: studioID,\n\t\t})\n\tcase models.OperationEnumDestroy:\n\t\t_, err := m.queries.SoftDeleteStudio(m.context, studio.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := m.queries.DeleteSceneStudios(m.context, uuid.NullUUID{UUID: studio.ID, Valid: true}); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = m.queries.DeleteStudioFavorites(m.context, studio.ID); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = m.queries.DeleteStudioAliases(m.context, studio.ID); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\tcase models.OperationEnumModify:\n\t\treturn m.applyModifyEdit(studio, data)\n\tcase models.OperationEnumMerge:\n\t\terr := m.applyModifyEdit(studio, data)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tfor _, sourceID := range data.MergeSources {\n\t\t\tif err := m.mergeInto(sourceID, studio.ID); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\tdefault:\n\t\treturn errors.New(\"Unsupported operation: \" + operation.String())\n\t}\n}\n\nfunc (m *StudioEditProcessor) applyModifyEdit(studio *models.Studio, data *models.StudioEditData) error {\n\tif err := studio.ValidateModifyEdit(*data); err != nil {\n\t\treturn err\n\t}\n\n\tstudio.CopyFromStudioEdit(*data.New, data.Old)\n\tupdatedDbStudio, err := m.queries.UpdateStudio(m.context, converter.StudioToUpdateParams(*studio))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tupdatedStudio := converter.StudioToModelPtr(updatedDbStudio)\n\tif err := m.updateURLsFromEdit(updatedStudio, data); err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.updateImagesFromEdit(updatedStudio, data); err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.updateAliasesFromEdit(updatedStudio, data); err != nil {\n\t\treturn err\n\t}\n\n\treturn err\n}\n\nfunc (m *StudioEditProcessor) updateURLsFromEdit(studio *models.Studio, data *models.StudioEditData) error {\n\turls, err := m.queries.GetMergedURLsForEdit(m.context, m.edit.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.DeleteStudioURLs(m.context, studio.ID); err != nil {\n\t\treturn err\n\t}\n\n\tvar urlsParams []queries.CreateStudioURLsParams\n\tfor _, url := range urls {\n\t\turlsParams = append(urlsParams, queries.CreateStudioURLsParams{\n\t\t\tStudioID: studio.ID,\n\t\t\tUrl:      url.Url,\n\t\t\tSiteID:   url.SiteID,\n\t\t})\n\t}\n\n\t_, err = m.queries.CreateStudioURLs(m.context, urlsParams)\n\treturn err\n}\n\nfunc (m StudioEditProcessor) updateImagesFromEdit(studio *models.Studio, data *models.StudioEditData) error {\n\tdbImages, err := m.queries.GetImagesForEdit(m.context, m.edit.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.DeleteStudioImages(m.context, studio.ID); err != nil {\n\t\treturn err\n\t}\n\n\tvar images []queries.CreateStudioImagesParams\n\tfor _, image := range dbImages {\n\t\timages = append(images, queries.CreateStudioImagesParams{\n\t\t\tStudioID: studio.ID,\n\t\t\tImageID:  image.ID,\n\t\t})\n\t}\n\n\t_, err = m.queries.CreateStudioImages(m.context, images)\n\treturn err\n}\n\nfunc (m *StudioEditProcessor) mergeInto(sourceID uuid.UUID, targetID uuid.UUID) error {\n\tstudio, err := m.queries.FindStudio(m.context, sourceID)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"merge source studio not found, %v: %w\"+sourceID.String(), err)\n\t}\n\tif studio.Deleted {\n\t\treturn fmt.Errorf(\"merge source studio is deleted, %v: %w\"+sourceID.String(), err)\n\t}\n\n\t_, err = m.queries.SoftDeleteStudio(m.context, studio.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err = m.queries.UpdateStudioRedirects(m.context, queries.UpdateStudioRedirectsParams{\n\t\tOldTargetID: sourceID,\n\t\tNewTargetID: targetID,\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\tif err = m.queries.UpdateSceneStudios(m.context, queries.UpdateSceneStudiosParams{\n\t\tSourceID: uuid.NullUUID{UUID: sourceID, Valid: true},\n\t\tTargetID: uuid.NullUUID{UUID: targetID, Valid: true},\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\tif err = m.queries.ReassignStudioFavorites(m.context, queries.ReassignStudioFavoritesParams{\n\t\tOldStudioID: sourceID,\n\t\tNewStudioID: targetID,\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\treturn m.queries.CreateStudioRedirect(m.context, queries.CreateStudioRedirectParams{\n\t\tSourceID: sourceID,\n\t\tTargetID: targetID,\n\t})\n\n}\n\nfunc (m *StudioEditProcessor) diffRelationships(studioEdit *models.StudioEditData, studioID uuid.UUID, input models.StudioEditInput, inputArgs utils.ArgumentsQuery) error {\n\tif input.Details.Urls != nil || inputArgs.Field(\"urls\").IsNull() {\n\t\tif err := m.diffURLs(studioEdit, studioID, input.Details.Urls); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif input.Details.ImageIds != nil || inputArgs.Field(\"image_ids\").IsNull() {\n\t\tif err := m.diffImages(studioEdit, studioID, input.Details.ImageIds); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif input.Details.Aliases != nil || inputArgs.Field(\"aliases\").IsNull() {\n\t\tif err := m.diffAliases(studioEdit, studioID, input.Details.Aliases); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (m *StudioEditProcessor) updateAliasesFromEdit(studio *models.Studio, data *models.StudioEditData) error {\n\taliases, err := m.queries.GetMergedStudioAliasesForEdit(m.context, m.edit.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.DeleteStudioAliases(m.context, studio.ID); err != nil {\n\t\treturn err\n\t}\n\n\tvar params []queries.CreateStudioAliasesParams\n\tfor _, alias := range aliases {\n\t\tparams = append(params, queries.CreateStudioAliasesParams{\n\t\t\tStudioID: studio.ID,\n\t\t\tAlias:    alias,\n\t\t})\n\t}\n\t_, err = m.queries.CreateStudioAliases(m.context, params)\n\treturn err\n}\n"
  },
  {
    "path": "internal/service/edit/tag.go",
    "content": "package edit\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\ntype TagEditProcessor struct {\n\tmutator\n}\n\nfunc Tag(ctx context.Context, queries *queries.Queries, edit *models.Edit) *TagEditProcessor {\n\treturn &TagEditProcessor{\n\t\tmutator{\n\t\t\tcontext: ctx,\n\t\t\tqueries: queries,\n\t\t\tedit:    edit,\n\t\t},\n\t}\n}\n\nfunc (m *TagEditProcessor) Edit(input models.TagEditInput, inputArgs utils.ArgumentsQuery) error {\n\tvar err error\n\tswitch input.Edit.Operation {\n\tcase models.OperationEnumModify:\n\t\terr = m.modifyEdit(input, inputArgs)\n\tcase models.OperationEnumMerge:\n\t\terr = m.mergeEdit(input, inputArgs)\n\tcase models.OperationEnumDestroy:\n\t\terr = m.destroyEdit(input)\n\tcase models.OperationEnumCreate:\n\t\terr = m.createEdit(input, inputArgs)\n\t}\n\n\treturn err\n}\n\nfunc (m *TagEditProcessor) modifyEdit(input models.TagEditInput, inputArgs utils.ArgumentsQuery) error {\n\t// get the existing tag\n\ttagID := *input.Edit.ID\n\tdbTag, err := m.queries.FindTag(m.context, tagID)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ttag := converter.TagToModel(dbTag)\n\tvar entity editEntity = tag\n\tif err := validateEditEntity(&entity, tagID, \"tag\"); err != nil {\n\t\treturn err\n\t}\n\n\t// perform a diff against the input and the current object\n\tdetailArgs := inputArgs.Field(\"details\")\n\ttagEdit := input.Details.TagEditFromDiff(tag, detailArgs)\n\n\taliases, err := m.queries.GetTagAliases(m.context, tagID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif input.Details.Aliases != nil || inputArgs.Field(\"aliases\").IsNull() {\n\t\ttagEdit.New.AddedAliases, tagEdit.New.RemovedAliases = utils.SliceCompare(input.Details.Aliases, aliases)\n\t}\n\n\tif reflect.DeepEqual(tagEdit.Old, tagEdit.New) {\n\t\treturn ErrNoChanges\n\t}\n\n\treturn m.edit.SetData(tagEdit)\n}\n\nfunc (m *TagEditProcessor) mergeEdit(input models.TagEditInput, inputArgs utils.ArgumentsQuery) error {\n\t// get the existing tag\n\tif input.Edit.ID == nil {\n\t\treturn ErrMergeIDMissing\n\t}\n\ttagID := *input.Edit.ID\n\tdbTag, err := m.queries.FindTag(m.context, tagID)\n\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%w: target tag %s: %w\", ErrEntityNotFound, tagID.String(), err)\n\t}\n\n\ttag := converter.TagToModel(dbTag)\n\tvar mergeSources []uuid.UUID\n\tfor _, sourceID := range input.Edit.MergeSourceIds {\n\t\tif tagID == sourceID {\n\t\t\treturn ErrMergeTargetIsSource\n\t\t}\n\n\t\t_, err := m.queries.FindTag(m.context, tagID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"%w: source tag %s: %w\", ErrEntityNotFound, sourceID.String(), err)\n\t\t}\n\n\t\tmergeSources = append(mergeSources, sourceID)\n\t}\n\n\tif len(mergeSources) < 1 {\n\t\treturn ErrNoMergeSources\n\t}\n\n\t// perform a diff against the input and the current object\n\tdetailArgs := inputArgs.Field(\"details\")\n\ttagEdit := input.Details.TagEditFromMerge(tag, mergeSources, detailArgs)\n\n\taliases, err := m.queries.GetTagAliases(m.context, tagID)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ttagEdit.New.AddedAliases, tagEdit.New.RemovedAliases = utils.SliceCompare(input.Details.Aliases, aliases)\n\n\treturn m.edit.SetData(tagEdit)\n}\n\nfunc (m *TagEditProcessor) createEdit(input models.TagEditInput, inputArgs utils.ArgumentsQuery) error {\n\ttagEdit := input.Details.TagEditFromCreate(inputArgs)\n\n\ttagEdit.New.AddedAliases = input.Details.Aliases\n\n\treturn m.edit.SetData(tagEdit)\n}\n\nfunc (m *TagEditProcessor) destroyEdit(input models.TagEditInput) error {\n\t// Get the existing tag\n\ttagID := *input.Edit.ID\n\tdbTag, err := m.queries.FindTag(m.context, tagID)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ttag := converter.TagToModel(dbTag)\n\tvar entity editEntity = tag\n\treturn validateEditEntity(&entity, tagID, \"tag\")\n}\n\nfunc (m *TagEditProcessor) CreateJoin(input models.TagEditInput) error {\n\tif input.Edit.ID != nil {\n\t\treturn m.queries.CreateTagEdit(m.context, queries.CreateTagEditParams{\n\t\t\tEditID: m.edit.ID,\n\t\t\tTagID:  *input.Edit.ID,\n\t\t})\n\t}\n\n\treturn nil\n}\n\nfunc (m *TagEditProcessor) updateAliasesFromEdit(tag *models.Tag, data *models.TagEditData) error {\n\taliases, err := m.queries.GetMergedTagAliasesForEdit(m.context, m.edit.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := m.queries.DeleteTagAliases(m.context, tag.ID); err != nil {\n\t\treturn err\n\t}\n\n\tvar params []queries.CreateTagAliasesParams\n\tfor _, alias := range aliases {\n\t\tparams = append(params, queries.CreateTagAliasesParams{\n\t\t\tTagID: tag.ID,\n\t\t\tAlias: alias,\n\t\t})\n\t}\n\t_, err = m.queries.CreateTagAliases(m.context, params)\n\treturn err\n}\n\nfunc (m *TagEditProcessor) apply() error {\n\toperation := m.operation()\n\tisCreate := operation == models.OperationEnumCreate\n\n\tvar tag *models.Tag\n\tif !isCreate {\n\t\tres, err := m.queries.GetEditTargetID(m.context, m.edit.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdbTag, err := m.queries.FindTag(m.context, res.ID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"%w: tag %s\", ErrEntityNotFound, res.ID.String())\n\t\t}\n\t\ttag = converter.TagToModelPtr(dbTag)\n\t}\n\n\tdata, err := m.edit.GetTagData()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tswitch operation {\n\tcase models.OperationEnumCreate:\n\t\tUUID, err := uuid.NewV7()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tnewTag := models.Tag{\n\t\t\tID: UUID,\n\t\t}\n\t\tif data.New.Name == nil {\n\t\t\treturn errors.New(\"missing tag name\")\n\t\t}\n\t\tnewTag.CopyFromTagEdit(*data.New, &models.TagEdit{})\n\n\t\t_, err = m.queries.CreateTag(m.context, converter.TagToCreateParams(newTag))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif len(data.New.AddedAliases) > 0 {\n\t\t\tvar params []queries.CreateTagAliasesParams\n\t\t\tfor _, alias := range data.New.AddedAliases {\n\t\t\t\tparams = append(params, queries.CreateTagAliasesParams{\n\t\t\t\t\tTagID: newTag.ID,\n\t\t\t\t\tAlias: alias,\n\t\t\t\t})\n\t\t\t}\n\t\t\t_, err := m.queries.CreateTagAliases(m.context, params)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\treturn m.queries.CreateTagEdit(m.context, queries.CreateTagEditParams{\n\t\t\tEditID: m.edit.ID,\n\t\t\tTagID:  newTag.ID,\n\t\t})\n\n\tcase models.OperationEnumDestroy:\n\t\t_, err := m.queries.SoftDeleteTag(m.context, tag.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// TODO: Not cascading?\n\t\terr = m.queries.DeleteSceneTagsByTag(m.context, tag.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = m.queries.DeleteTagAliases(m.context, tag.ID); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase models.OperationEnumModify:\n\t\tif err := tag.ValidateModifyEdit(*data); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\ttag.CopyFromTagEdit(*data.New, data.Old)\n\t\t_, err = m.queries.UpdateTag(m.context, converter.TagToUpdateParams(*tag))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn m.updateAliasesFromEdit(tag, data)\n\tcase models.OperationEnumMerge:\n\t\tif err := tag.ValidateModifyEdit(*data); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\ttag.CopyFromTagEdit(*data.New, data.Old)\n\t\t_, err = m.queries.UpdateTag(m.context, converter.TagToUpdateParams(*tag))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tfor _, sourceID := range data.MergeSources {\n\t\t\tif err := m.mergeInto(sourceID, tag.ID); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\treturn m.updateAliasesFromEdit(tag, data)\n\tdefault:\n\t\treturn errors.New(\"Unsupported operation: \" + operation.String())\n\t}\n\n\treturn nil\n}\n\nfunc (m *TagEditProcessor) mergeInto(sourceID uuid.UUID, targetID uuid.UUID) error {\n\ttag, err := m.queries.FindTag(m.context, sourceID)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"merge source tag not found, %v: %v\"+sourceID.String(), err)\n\t}\n\tif tag.Deleted {\n\t\treturn errors.New(\"merge source tag is deleted, %v\" + sourceID.String())\n\t}\n\t_, err = m.queries.SoftDeleteTag(m.context, sourceID)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err = m.queries.UpdateTagRedirects(m.context, queries.UpdateTagRedirectsParams{\n\t\tOldTargetID: sourceID,\n\t\tNewTargetID: targetID,\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\tif err = m.queries.UpdateSceneTagsForMerge(m.context, queries.UpdateSceneTagsForMergeParams{\n\t\tOldTagID: sourceID,\n\t\tNewTagID: targetID,\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\t// Delete any remaining old tags (these are scenes that already had the target tag)\n\tif err = m.queries.DeleteSceneTagsByTag(m.context, sourceID); err != nil {\n\t\treturn err\n\t}\n\n\treturn m.queries.CreateTagRedirect(m.context, queries.CreateTagRedirectParams{\n\t\tSourceID: sourceID,\n\t\tTargetID: targetID,\n\t})\n}\n"
  },
  {
    "path": "internal/service/edit/validate.go",
    "content": "package edit\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\nvar ErrEditAlreadyApplied = errors.New(\"edit already applied\")\nvar ErrInvalidVoteStatus = errors.New(\"invalid vote status\")\nvar ErrEditNotFound = errors.New(\"edit not found\")\nvar ErrEntityNotFound = errors.New(\"entity not found\")\nvar ErrEntityDeleted = errors.New(\"entity is deleted\")\nvar ErrInvalidDraft = errors.New(\"invalid draft id\")\nvar ErrInvalidImage = errors.New(\"invalid image id\")\nvar ErrInvalidStudio = errors.New(\"invalid studio id\")\nvar ErrInvalidPerformer = errors.New(\"invalid performer id\")\nvar ErrInvalidTag = errors.New(\"invalid tag id\")\nvar ErrInvalidSite = errors.New(\"invalid url site id\")\n\ntype editEntity interface {\n\tIsDeleted() bool\n}\n\nfunc validateEditEntity(entity *editEntity, id uuid.UUID, typeName string) error {\n\tif entity == nil {\n\t\treturn fmt.Errorf(\"%w: %s %s\", ErrEntityNotFound, typeName, id.String())\n\t}\n\tif (*entity).IsDeleted() {\n\t\treturn fmt.Errorf(\"%w: %s %s\", ErrEntityDeleted, typeName, id.String())\n\t}\n\n\treturn nil\n}\n\nfunc validateEditPresence(edit *models.Edit) error {\n\tif edit == nil {\n\t\treturn ErrEditNotFound\n\t}\n\n\tif edit.Applied {\n\t\treturn ErrEditAlreadyApplied\n\t}\n\n\treturn nil\n}\n\nfunc validateEditPrerequisites(edit *models.Edit) error {\n\tvar status models.VoteStatusEnum\n\tutils.ResolveEnumString(edit.Status, &status)\n\tif status != models.VoteStatusEnumPending {\n\t\treturn fmt.Errorf(\"%w: %s\", ErrInvalidVoteStatus, edit.Status)\n\t}\n\n\treturn nil\n}\n\nfunc validateSceneEditInput(ctx context.Context, queries *queries.Queries, input models.SceneEditInput, edit *models.Edit, update bool) error {\n\tif input.Details == nil {\n\t\treturn nil\n\t}\n\n\tif input.Details.DraftID != nil {\n\t\tif err := validateDraftID(ctx, queries, *input.Details.DraftID, edit.ID, update); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif input.Details.StudioID != nil {\n\t\t_, err := queries.FindStudio(ctx, *input.Details.StudioID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"%w: %s\", ErrInvalidStudio, *input.Details.StudioID)\n\t\t}\n\t}\n\tif len(input.Details.ImageIds) > 0 {\n\t\timages, err := queries.FindImagesByIds(ctx, input.Details.ImageIds)\n\t\tif err != nil || len(images) < len(input.Details.ImageIds) {\n\t\t\treturn fmt.Errorf(\"%w: %w\", ErrInvalidImage, err)\n\t\t}\n\t}\n\tif len(input.Details.TagIds) > 0 {\n\t\ttags, err := queries.FindTagsByIds(ctx, input.Details.TagIds)\n\t\tif err != nil || len(tags) < len(input.Details.TagIds) {\n\t\t\treturn fmt.Errorf(\"%w: %w\", ErrInvalidTag, err)\n\t\t}\n\t}\n\tif len(input.Details.Performers) > 0 {\n\t\tvar ids []uuid.UUID\n\t\tfor _, appearance := range input.Details.Performers {\n\t\t\tids = append(ids, appearance.PerformerID)\n\t\t}\n\t\tperformers, err := queries.FindPerformersByIds(ctx, ids)\n\t\tif err != nil || len(performers) < len(ids) {\n\t\t\treturn fmt.Errorf(\"%w: %w\", ErrInvalidPerformer, err)\n\t\t}\n\t}\n\n\treturn validateURLs(ctx, queries, input.Details.Urls)\n}\n\nfunc validatePerformerEditInput(ctx context.Context, queries *queries.Queries, input models.PerformerEditInput, edit *models.Edit, update bool) error {\n\tif input.Details == nil {\n\t\treturn nil\n\t}\n\n\tif input.Details.DraftID != nil {\n\t\tif err := validateDraftID(ctx, queries, *input.Details.DraftID, edit.ID, update); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif len(input.Details.ImageIds) > 0 {\n\t\timages, err := queries.FindImagesByIds(ctx, input.Details.ImageIds)\n\t\tif err != nil || len(images) < len(input.Details.ImageIds) {\n\t\t\treturn fmt.Errorf(\"%w: %w\", ErrInvalidImage, err)\n\t\t}\n\t}\n\n\treturn validateURLs(ctx, queries, input.Details.Urls)\n}\n\nfunc validateDraftID(ctx context.Context, queries *queries.Queries, draftID uuid.UUID, editID uuid.UUID, update bool) error {\n\tif !update {\n\t\t_, err := queries.FindDraft(ctx, draftID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"%w: %s\", ErrInvalidDraft, draftID)\n\t\t}\n\t} else {\n\t\tedit, err := queries.FindEdit(ctx, editID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\ttype Data struct {\n\t\t\tNew struct {\n\t\t\t\tDraftID *uuid.UUID `json:\"draft_id\"`\n\t\t\t} `json:\"new_data\"`\n\t\t}\n\n\t\tvar data Data\n\t\terr = json.Unmarshal(edit.Data, &data)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif data.New.DraftID == nil || *data.New.DraftID != draftID {\n\t\t\treturn fmt.Errorf(\"%w: %s\", ErrInvalidDraft, draftID)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc validateStudioEditInput(ctx context.Context, queries *queries.Queries, input models.StudioEditInput) error {\n\tif input.Details == nil {\n\t\treturn nil\n\t}\n\n\tif input.Details.ParentID != nil {\n\t\t_, err := queries.FindStudio(ctx, *input.Details.ParentID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"%w: %s\", ErrInvalidStudio, *input.Details.ParentID)\n\t\t}\n\t}\n\n\tif len(input.Details.ImageIds) > 0 {\n\t\timages, err := queries.FindImagesByIds(ctx, input.Details.ImageIds)\n\t\tif err != nil || len(images) < len(input.Details.ImageIds) {\n\t\t\treturn fmt.Errorf(\"%w: %w\", ErrInvalidImage, err)\n\t\t}\n\t}\n\n\treturn validateURLs(ctx, queries, input.Details.Urls)\n}\n\nfunc validateURLs(ctx context.Context, queries *queries.Queries, urls []models.URL) error {\n\tif len(urls) == 0 {\n\t\treturn nil\n\t}\n\n\tvar ids []uuid.UUID\n\tfor _, url := range urls {\n\t\tids = append(ids, url.SiteID)\n\t}\n\tsites, err := queries.FindSitesByIds(ctx, ids)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%w: %w\", ErrInvalidSite, err)\n\t}\n\n\tsiteMap := make(map[uuid.UUID]bool, len(sites))\n\tfor _, site := range sites {\n\t\tsiteMap[site.ID] = true\n\t}\n\n\tfor _, id := range ids {\n\t\tif !siteMap[id] {\n\t\t\treturn fmt.Errorf(\"%w\", ErrInvalidSite)\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "internal/service/errutil/errors.go",
    "content": "package errutil\n\nimport (\n\t\"errors\"\n\n\t\"github.com/jackc/pgx/v5\"\n)\n\n// IgnoreNotFound returns nil if err is pgx.ErrNoRows, otherwise returns err.\n// This is useful for queries where \"not found\" should be treated as a non-error case.\nfunc IgnoreNotFound(err error) error {\n\tif errors.Is(err, pgx.ErrNoRows) {\n\t\treturn nil\n\t}\n\treturn err\n}\n\n// DuplicateError creates a slice of the same error repeated size times.\n// This is useful for dataloader methods that need to return one error per requested ID.\nfunc DuplicateError(err error, size int) []error {\n\terrs := make([]error, size)\n\tfor i := range errs {\n\t\terrs[i] = err\n\t}\n\treturn errs\n}\n"
  },
  {
    "path": "internal/service/factory.go",
    "content": "// Package service provides a centralized service factory for database operations.\n//\n// Usage:\n//\n//\t// Initialize the factory with a database pool\n//\tpool, err := pgxpool.New(context.Background(), databaseURL)\n//\tif err != nil {\n//\t\tlog.Fatal(err)\n//\t}\n//\tfactory := service.NewFactory(pool)\n//\n//\t// Each service call creates a fresh querier instance\n//\ttagService := factory.Tag()\n//\ttag, err := tagService.FindByID(ctx, tagID)\n//\n//\tuserService := factory.User()\n//\tuser, err := userService.FindByID(ctx, userID)\npackage service\n\nimport (\n\t\"github.com/jackc/pgx/v5/pgxpool\"\n\t\"github.com/stashapp/stash-box/internal/email\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/internal/service/draft\"\n\t\"github.com/stashapp/stash-box/internal/service/edit\"\n\t\"github.com/stashapp/stash-box/internal/service/image\"\n\t\"github.com/stashapp/stash-box/internal/service/invite\"\n\t\"github.com/stashapp/stash-box/internal/service/mod_audit\"\n\t\"github.com/stashapp/stash-box/internal/service/notification\"\n\t\"github.com/stashapp/stash-box/internal/service/performer\"\n\t\"github.com/stashapp/stash-box/internal/service/scene\"\n\t\"github.com/stashapp/stash-box/internal/service/site\"\n\t\"github.com/stashapp/stash-box/internal/service/studio\"\n\t\"github.com/stashapp/stash-box/internal/service/tag\"\n\t\"github.com/stashapp/stash-box/internal/service/user\"\n\t\"github.com/stashapp/stash-box/internal/service/usertoken\"\n)\n\n// Factory provides access to all services with centralized database connection management\ntype Factory struct {\n\tdb       *pgxpool.Pool\n\twithTxn  queries.WithTxnFunc\n\temailMgr *email.Manager\n}\n\n// NewFactory creates a new service factory with the given database pool and email manager\nfunc NewFactory(pool *pgxpool.Pool, emailMgr *email.Manager) *Factory {\n\treturn &Factory{\n\t\tdb:       pool,\n\t\twithTxn:  createWithTxnFunc(pool),\n\t\temailMgr: emailMgr,\n\t}\n}\n\n// Tag returns a TagService instance\nfunc (f *Factory) Tag() *tag.Tag {\n\treturn tag.NewTag(queries.New(f.db), f.withTxn)\n}\n\n// Performer returns a PerformerService instance\nfunc (f *Factory) Performer() *performer.Performer {\n\treturn performer.NewPerformer(queries.New(f.db), f.withTxn)\n}\n\n// Scene returns a SceneService instance\nfunc (f *Factory) Scene() *scene.Scene {\n\treturn scene.NewScene(queries.New(f.db), f.withTxn)\n}\n\n// Studio returns a StudioService instance\nfunc (f *Factory) Studio() *studio.Studio {\n\treturn studio.NewStudio(queries.New(f.db), f.withTxn)\n}\n\n// User returns a UserService instance\nfunc (f *Factory) User() *user.User {\n\treturn user.NewUser(queries.New(f.db), f.withTxn, f.emailMgr)\n}\n\n// UserToken returns a UserTokenService instance\nfunc (f *Factory) UserToken() *usertoken.UserToken {\n\treturn usertoken.NewUserToken(queries.New(f.db), f.withTxn)\n}\n\n// Site returns a SiteService instance\nfunc (f *Factory) Site() *site.Site {\n\treturn site.NewSite(queries.New(f.db), f.withTxn)\n}\n\n// Edit returns an EditService instance\nfunc (f *Factory) Edit() *edit.Edit {\n\treturn edit.NewEdit(queries.New(f.db), f.withTxn)\n}\n\n// Image returns an ImageService instance\nfunc (f *Factory) Image() *image.Image {\n\treturn image.NewImage(queries.New(f.db), f.withTxn)\n}\n\n// Draft returns a DraftService instance\nfunc (f *Factory) Draft() *draft.Draft {\n\treturn draft.NewDraft(queries.New(f.db), f.withTxn)\n}\n\n// Notification returns a NotificationService instance\nfunc (f *Factory) Notification() *notification.Notification {\n\treturn notification.NewNotification(queries.New(f.db), f.withTxn)\n}\n\nfunc (f *Factory) Invite() *invite.Invite {\n\treturn invite.NewInvite(queries.New(f.db), f.withTxn)\n}\n\n// ModAudit returns a ModAuditService instance\nfunc (f *Factory) ModAudit() *mod_audit.ModAuditService {\n\treturn mod_audit.NewModAuditService(queries.New(f.db))\n}\n"
  },
  {
    "path": "internal/service/image/service.go",
    "content": "package image\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"database/sql\"\n\t\"errors\"\n\t\"io\"\n\t\"strings\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/image/cache\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/internal/service/errutil\"\n\t\"github.com/stashapp/stash-box/internal/storage\"\n)\n\ntype Image struct {\n\tqueries *queries.Queries\n\twithTxn queries.WithTxnFunc\n}\n\nfunc NewImage(queries *queries.Queries, withTxn queries.WithTxnFunc) *Image {\n\treturn &Image{\n\t\tqueries: queries,\n\t\twithTxn: withTxn,\n\t}\n}\n\n// WithTxn executes a function within a transaction\nfunc (s *Image) WithTxn(fn func(*queries.Queries) error) error {\n\treturn s.withTxn(fn)\n}\n\nfunc (s *Image) Create(ctx context.Context, input models.ImageCreateInput) (*models.Image, error) {\n\tUUID, err := uuid.NewV4()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Generate uuid that does not start with AD to prevent adblock issues\n\tfor strings.HasPrefix(UUID.String(), \"ad\") {\n\t\tUUID, err = uuid.NewV7()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tnewImage := models.Image{\n\t\tID: UUID,\n\t}\n\n\t// set RemoteURL from URL\n\tif input.URL != nil {\n\t\tnewImage.RemoteURL = input.URL\n\t}\n\n\t// handle image upload\n\tif input.File != nil {\n\t\tif input.File.Size > int64(10*1024*1024) {\n\t\t\treturn nil, errors.New(\"file too big\")\n\t\t}\n\n\t\tfile := make([]byte, input.File.Size)\n\t\tif _, err := input.File.File.Read(file); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfileReader := bytes.NewReader(file)\n\n\t\tchecksum, err := calculateChecksum(fileReader)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// check if image already exists with this checksum\n\t\texisting, err := s.FindByChecksum(ctx, checksum)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// if image already exists, just return it\n\t\tif existing != nil {\n\t\t\treturn existing, nil\n\t\t}\n\n\t\t// set the checksum in the new image\n\t\tnewImage.Checksum = checksum\n\n\t\tif _, err = fileReader.Seek(0, 0); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif err := populateImageDimensions(fileReader, &newImage); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif err := storage.Image().WriteFile(file, &newImage); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t} else if input.URL == nil {\n\t\treturn nil, errors.New(\"missing URL or file\")\n\t}\n\n\tparams := queries.CreateImageParams{\n\t\tID:       newImage.ID,\n\t\tChecksum: newImage.Checksum,\n\t\tWidth:    newImage.Width,\n\t\tHeight:   newImage.Height,\n\t\tUrl:      newImage.RemoteURL,\n\t}\n\n\tdbImage, err := s.queries.CreateImage(ctx, params)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn converter.ImageToModelPtr(dbImage), nil\n}\n\nfunc (s *Image) Destroy(ctx context.Context, id uuid.UUID) error {\n\timage, err := s.Find(ctx, id)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := s.queries.DeleteImage(ctx, id); err != nil {\n\t\treturn err\n\t}\n\n\t// delete the file. Suppress any error\n\t_ = storage.Image().DestroyFile(image)\n\n\t// Clear image from cache\n\tcacheManager := cache.GetCacheManager()\n\tif cacheManager != nil {\n\t\t_ = cacheManager.Delete(id)\n\t}\n\n\treturn nil\n}\n\nfunc (s *Image) Find(ctx context.Context, id uuid.UUID) (*models.Image, error) {\n\tdbImage, err := s.queries.FindImage(ctx, id)\n\tif err != nil {\n\t\tif errors.Is(err, sql.ErrNoRows) {\n\t\t\treturn nil, nil\n\t\t}\n\t\treturn nil, err\n\t}\n\treturn converter.ImageToModelPtr(dbImage), nil\n}\n\nfunc (s *Image) FindBySceneID(ctx context.Context, sceneID uuid.UUID) ([]models.Image, error) {\n\tdbImages, err := s.queries.FindImagesBySceneID(ctx, sceneID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn converter.ImagesToModels(dbImages), nil\n}\n\nfunc (s *Image) FindByChecksum(ctx context.Context, checksum string) (*models.Image, error) {\n\tdbImage, err := s.queries.FindImageByChecksum(ctx, checksum)\n\tif err != nil {\n\t\tif errors.Is(err, sql.ErrNoRows) {\n\t\t\treturn nil, nil\n\t\t}\n\t\treturn nil, err\n\t}\n\treturn converter.ImageToModelPtr(dbImage), nil\n}\n\nfunc (s *Image) DestroyUnusedImages(ctx context.Context) error {\n\n\tunused, err := s.FindUnused(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tcacheManager := cache.GetCacheManager()\n\n\tfor len(unused) > 0 {\n\t\tfor _, i := range unused {\n\t\t\terr = s.Destroy(ctx, i.ID)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\t// Clear image from cache\n\t\t\tif cacheManager != nil {\n\t\t\t\t_ = cacheManager.Delete(i.ID)\n\t\t\t}\n\t\t}\n\n\t\tunused, err = s.FindUnused(ctx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n\n}\n\nfunc (s *Image) DestroyUnusedImage(ctx context.Context, imageID uuid.UUID) error {\n\tunused, err := s.IsUnused(ctx, imageID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif unused {\n\t\terr = s.Destroy(ctx, imageID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (s *Image) FindUnused(ctx context.Context) ([]models.Image, error) {\n\tdbImages, err := s.queries.FindUnusedImages(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn converter.ImagesToModels(dbImages), nil\n}\n\nfunc (s *Image) IsUnused(ctx context.Context, imageID uuid.UUID) (bool, error) {\n\treturn s.queries.IsImageUnused(ctx, imageID)\n}\n\n// Dataloader for images by ids\nfunc (s *Image) LoadIds(ctx context.Context, ids []uuid.UUID) ([]*models.Image, []error) {\n\tdbImages, err := s.queries.FindImagesByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tm := make(map[uuid.UUID]*models.Image)\n\tfor _, dbImage := range dbImages {\n\t\tm[dbImage.ID] = converter.ImageToModelPtr(dbImage)\n\t}\n\n\tresult := make([]*models.Image, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\treturn result, nil\n}\n\n// Dataloder for images for scenes\nfunc (s *Image) LoadBySceneIds(ctx context.Context, ids []uuid.UUID) ([][]uuid.UUID, []error) {\n\tsceneImages, err := s.queries.FindImageIdsBySceneIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tm := make(map[uuid.UUID][]uuid.UUID)\n\tfor _, sceneImage := range sceneImages {\n\t\tm[sceneImage.SceneID] = append(m[sceneImage.SceneID], sceneImage.ImageID)\n\t}\n\n\tresult := make([][]uuid.UUID, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\treturn result, nil\n}\n\n// Dataloder for images for performers\nfunc (s *Image) LoadByPerformerIds(ctx context.Context, ids []uuid.UUID) ([][]uuid.UUID, []error) {\n\tperformerImages, err := s.queries.FindImageIdsByPerformerIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tm := make(map[uuid.UUID][]uuid.UUID)\n\tfor _, performerImage := range performerImages {\n\t\tm[performerImage.PerformerID] = append(m[performerImage.PerformerID], performerImage.ImageID)\n\t}\n\n\tresult := make([][]uuid.UUID, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\treturn result, nil\n}\n\nfunc (s *Image) FindByPerformerID(ctx context.Context, performerID uuid.UUID) ([]models.Image, error) {\n\tdbImages, err := s.queries.GetPerformerImages(ctx, performerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn converter.ImagesToModels(dbImages), nil\n}\n\nfunc (s *Image) FindByStudioID(ctx context.Context, studioID uuid.UUID) ([]models.Image, error) {\n\tdbImages, err := s.queries.FindImagesByStudioID(ctx, studioID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn converter.ImagesToModels(dbImages), nil\n}\n\nfunc (s *Image) LoadByStudioIds(ctx context.Context, ids []uuid.UUID) ([][]uuid.UUID, []error) {\n\tstudioImages, err := s.queries.FindImageIdsByStudioIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tm := make(map[uuid.UUID][]uuid.UUID)\n\tfor _, studioImage := range studioImages {\n\t\tm[studioImage.StudioID] = append(m[studioImage.StudioID], studioImage.ImageID)\n\t}\n\n\tresult := make([][]uuid.UUID, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\treturn result, nil\n}\n\nfunc (s *Image) Read(image models.Image) (io.ReadCloser, int64, error) {\n\treturn storage.Image().ReadFile(image)\n}\n"
  },
  {
    "path": "internal/service/image/utils.go",
    "content": "package image\n\nimport (\n\t\"bytes\"\n\t\"crypto/md5\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/gif\"\n\t\"image/jpeg\"\n\t\"image/png\"\n\t\"io\"\n\n\t_ \"golang.org/x/image/webp\"\n\n\t\"github.com/disintegration/imaging\"\n\tissvg \"github.com/h2non/go-is-svg\"\n\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\nvar ErrImageZeroSize = errors.New(\"image has 0px dimension\")\n\nfunc populateImageDimensions(imgReader *bytes.Reader, dest *models.Image) error {\n\timg, format, err := image.Decode(imgReader)\n\tif err != nil {\n\t\t// SVG is not an image so we have to manually check if the image is SVG\n\t\tif _, readerErr := imgReader.Seek(0, 0); readerErr != nil {\n\t\t\treturn readerErr\n\t\t}\n\t\tbuf := new(bytes.Buffer)\n\t\tif _, bufErr := buf.ReadFrom(imgReader); bufErr != nil {\n\t\t\treturn bufErr\n\t\t}\n\t\tif issvg.IsSVG(buf.Bytes()) {\n\t\t\tdest.Width = -1\n\t\t\tdest.Height = -1\n\t\t\treturn nil\n\t\t}\n\n\t\treturn err\n\t}\n\n\tif format != \"jpeg\" && format != \"webp\" && format != \"png\" {\n\t\treturn fmt.Errorf(\"unsupported image format: %s\", format)\n\t}\n\n\tdest.Width = img.Bounds().Max.X\n\tdest.Height = img.Bounds().Max.Y\n\n\tif dest.Width == 0 || dest.Height == 0 {\n\t\treturn ErrImageZeroSize\n\t}\n\n\treturn nil\n}\n\n//nolint:unused\nfunc resizeImage(srcReader io.Reader, maxDimension int64) ([]byte, error) {\n\tvar resizedImage image.Image\n\tsrcImage, format, err := image.Decode(srcReader)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// if height is longer then resize by height instead of width\n\tif dim := srcImage.Bounds().Max; dim.Y > dim.X {\n\t\tresizedImage = imaging.Resize(srcImage, 0, int(maxDimension), imaging.MitchellNetravali)\n\t} else {\n\t\tresizedImage = imaging.Resize(srcImage, int(maxDimension), 0, imaging.MitchellNetravali)\n\t}\n\n\tbuf := new(bytes.Buffer)\n\n\tif format == \"png\" {\n\t\terr = png.Encode(buf, resizedImage)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t} else {\n\t\toptions := jpeg.Options{\n\t\t\tQuality: config.GetImageJpegQuality(),\n\t\t}\n\t\terr = jpeg.Encode(buf, resizedImage, &options)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn buf.Bytes(), nil\n}\n\nfunc calculateChecksum(file io.Reader) (string, error) {\n\thasher := md5.New()\n\tif _, err := io.Copy(hasher, file); err != nil {\n\t\treturn \"\", err\n\t}\n\tchecksum := hex.EncodeToString(hasher.Sum(nil))\n\treturn checksum, nil\n}\n"
  },
  {
    "path": "internal/service/interface.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\n\t\"github.com/jackc/pgx/v5/pgxpool\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n)\n\n// createWithTxnFunc creates a WithTxn function using the provided pgx pool\nfunc createWithTxnFunc(pool *pgxpool.Pool) queries.WithTxnFunc {\n\treturn func(fn func(*queries.Queries) error) (err error) {\n\t\tctx := context.Background()\n\n\t\t// Start a transaction\n\t\ttx, err := pool.Begin(ctx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Ensure transaction is properly closed\n\t\tdefer func() {\n\t\t\tif p := recover(); p != nil {\n\t\t\t\t// If there was a panic, rollback and re-panic\n\t\t\t\t_ = tx.Rollback(ctx)\n\t\t\t\tpanic(p)\n\t\t\t} else if err != nil {\n\t\t\t\t// If there was an error, rollback\n\t\t\t\t_ = tx.Rollback(ctx)\n\t\t\t} else {\n\t\t\t\t// If everything was successful, commit\n\t\t\t\terr = tx.Commit(ctx)\n\t\t\t}\n\t\t}()\n\n\t\t// Create Queries object with the transaction\n\t\tq := queries.New(tx)\n\n\t\t// Execute the function with the transaction-bound queries\n\t\terr = fn(q)\n\t\treturn err\n\t}\n}\n"
  },
  {
    "path": "internal/service/invite/service.go",
    "content": "package invite\n\nimport (\n\t\"context\"\n\n\t\"github.com/stashapp/stash-box/internal/queries\"\n)\n\ntype Invite struct {\n\tqueries *queries.Queries\n\twithTxn queries.WithTxnFunc\n}\n\nfunc NewInvite(queries *queries.Queries, withTxn queries.WithTxnFunc) *Invite {\n\treturn &Invite{\n\t\tqueries: queries,\n\t\twithTxn: withTxn,\n\t}\n}\n\n// WithTxn executes a function within a transaction\nfunc (s *Invite) WithTxn(fn func(*queries.Queries) error) error {\n\treturn s.withTxn(fn)\n}\n\nfunc (s *Invite) DestroyExpired(ctx context.Context) error {\n\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\treturn tx.DestroyExpiredInvites(ctx)\n\t})\n}\n"
  },
  {
    "path": "internal/service/mod_audit/mod_audit.go",
    "content": "package mod_audit\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n)\n\n// ModAuditService handles mod audit operations\ntype ModAuditService struct {\n\tqueries *queries.Queries\n}\n\n// NewModAuditService creates a new mod audit service\nfunc NewModAuditService(queries *queries.Queries) *ModAuditService {\n\treturn &ModAuditService{\n\t\tqueries: queries,\n\t}\n}\n\n// GetModAuditCount returns the total count of audits matching the filter\nfunc (s *ModAuditService) GetModAuditCount(ctx context.Context, filter models.ModAuditQueryInput) (int, error) {\n\tvar action queries.NullModAuditAction\n\tif filter.Action != nil {\n\t\taction = queries.NullModAuditAction{\n\t\t\tModAuditAction: queries.ModAuditAction(filter.Action.String()),\n\t\t\tValid:          true,\n\t\t}\n\t}\n\n\tvar userID uuid.NullUUID\n\tif filter.UserID != nil {\n\t\tuserID = uuid.NullUUID{UUID: *filter.UserID, Valid: true}\n\t}\n\n\tcount, err := s.queries.GetModAuditCount(ctx, queries.GetModAuditCountParams{\n\t\tAction: action,\n\t\tUserID: userID,\n\t})\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn int(count), nil\n}\n\n// QueryModAudits returns audits matching the filter with pagination\nfunc (s *ModAuditService) QueryModAudits(ctx context.Context, filter models.ModAuditQueryInput) ([]models.ModAudit, error) {\n\tvar action queries.NullModAuditAction\n\tif filter.Action != nil {\n\t\taction = queries.NullModAuditAction{\n\t\t\tModAuditAction: queries.ModAuditAction(filter.Action.String()),\n\t\t\tValid:          true,\n\t\t}\n\t}\n\n\tvar userID uuid.NullUUID\n\tif filter.UserID != nil {\n\t\tuserID = uuid.NullUUID{UUID: *filter.UserID, Valid: true}\n\t}\n\n\toffset := (filter.Page - 1) * filter.PerPage\n\tlimit := filter.PerPage\n\n\tdbAudits, err := s.queries.QueryModAudits(ctx, queries.QueryModAuditsParams{\n\t\tAction: action,\n\t\tUserID: userID,\n\t\tLimit:  int32(limit),\n\t\tOffset: int32(offset),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\taudits := make([]models.ModAudit, len(dbAudits))\n\tfor i, dbAudit := range dbAudits {\n\t\taudits[i] = models.ModAudit{\n\t\t\tID:         dbAudit.ID,\n\t\t\tAction:     string(dbAudit.Action),\n\t\t\tUserID:     dbAudit.UserID,\n\t\t\tTargetID:   dbAudit.TargetID,\n\t\t\tTargetType: dbAudit.TargetType,\n\t\t\tData:       string(dbAudit.Data),\n\t\t\tReason:     dbAudit.Reason,\n\t\t\tCreatedAt:  dbAudit.CreatedAt,\n\t\t}\n\t}\n\n\treturn audits, nil\n}\n\n// DeleteExpired removes mod audit records older than the specified number of days\nfunc (s *ModAuditService) DeleteExpired(ctx context.Context, retentionDays int) error {\n\tif retentionDays <= 0 {\n\t\treturn nil\n\t}\n\n\treturn s.queries.DeleteExpiredModAudits(ctx, int32(retentionDays))\n}\n"
  },
  {
    "path": "internal/service/notification/service.go",
    "content": "package notification\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/pkg/logger\"\n)\n\ntype Notification struct {\n\tqueries *queries.Queries\n\twithTxn queries.WithTxnFunc\n}\n\nfunc NewNotification(queries *queries.Queries, withTxn queries.WithTxnFunc) *Notification {\n\treturn &Notification{\n\t\tqueries: queries,\n\t\twithTxn: withTxn,\n\t}\n}\n\n// WithTxn executes a function within a transaction\nfunc (s *Notification) WithTxn(fn func(*queries.Queries) error) error {\n\treturn s.withTxn(fn)\n}\n\nfunc (s *Notification) TriggerSceneCreationNotifications(ctx context.Context, sceneID uuid.UUID) error {\n\treturn s.queries.TriggerSceneCreationNotifications(ctx, sceneID)\n}\n\nfunc (s *Notification) TriggerPerformerEditNotifications(ctx context.Context, editID uuid.UUID) error {\n\treturn s.queries.TriggerPerformerEditNotifications(ctx, editID)\n}\n\nfunc (s *Notification) TriggerStudioEditNotifications(ctx context.Context, editID uuid.UUID) error {\n\treturn s.queries.TriggerStudioEditNotifications(ctx, editID)\n}\n\nfunc (s *Notification) TriggerSceneEditNotifications(ctx context.Context, editID uuid.UUID) error {\n\treturn s.queries.TriggerSceneEditNotifications(ctx, editID)\n}\n\nfunc (s *Notification) TriggerEditCommentNotifications(ctx context.Context, commentID uuid.UUID) error {\n\treturn s.queries.TriggerEditCommentNotifications(ctx, commentID)\n}\n\nfunc (s *Notification) TriggerDownvoteEditNotifications(ctx context.Context, editID uuid.UUID) error {\n\treturn s.queries.TriggerDownvoteEditNotifications(ctx, editID)\n}\n\nfunc (s *Notification) TriggerFailedEditNotifications(ctx context.Context, editID uuid.UUID) error {\n\treturn s.queries.TriggerFailedEditNotifications(ctx, editID)\n}\n\nfunc (s *Notification) TriggerUpdatedEditNotifications(ctx context.Context, editID uuid.UUID) error {\n\treturn s.queries.TriggerUpdatedEditNotifications(ctx, editID)\n}\n\nfunc (s *Notification) GetNotificationsCount(ctx context.Context, userID uuid.UUID, unreadOnly bool, notificationType *models.NotificationEnum) (int, error) {\n\tvar typeParam queries.NullNotificationType\n\tif notificationType != nil {\n\t\ttypeParam = queries.NullNotificationType{\n\t\t\tNotificationType: queries.NotificationType(*notificationType),\n\t\t\tValid:            true,\n\t\t}\n\t}\n\n\tcount, err := s.queries.CountNotificationsByUser(ctx, queries.CountNotificationsByUserParams{\n\t\tUserID:     userID,\n\t\tUnreadOnly: unreadOnly,\n\t\tType:       typeParam,\n\t})\n\treturn int(count), err\n}\n\nfunc (s *Notification) GetNotifications(ctx context.Context, userID uuid.UUID, unreadOnly bool, page int, perPage int, notificationType *models.NotificationEnum) ([]models.Notification, error) {\n\tvar notifications []queries.Notification\n\tvar err error\n\n\toffset := (page - 1) * perPage\n\tlimit := perPage\n\n\tvar typeParam queries.NullNotificationType\n\tif notificationType != nil {\n\t\ttypeParam = queries.NullNotificationType{\n\t\t\tNotificationType: queries.NotificationType(*notificationType),\n\t\t\tValid:            true,\n\t\t}\n\t}\n\n\tif unreadOnly {\n\t\tnotifications, err = s.queries.FindUnreadNotificationsByUser(ctx, queries.FindUnreadNotificationsByUserParams{\n\t\t\tUserID: userID,\n\t\t\tLimit:  int32(limit),\n\t\t\tOffset: int32(offset),\n\t\t\tType:   typeParam,\n\t\t})\n\t} else {\n\t\tnotifications, err = s.queries.FindNotificationsByUser(ctx, queries.FindNotificationsByUserParams{\n\t\t\tUserID: userID,\n\t\t\tLimit:  int32(limit),\n\t\t\tOffset: int32(offset),\n\t\t\tType:   typeParam,\n\t\t})\n\t}\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn converter.NotificationsToModels(notifications), nil\n}\n\n// Update methods\nfunc (s *Notification) MarkAllRead(ctx context.Context, userID uuid.UUID) error {\n\treturn s.queries.MarkAllNotificationsRead(ctx, userID)\n}\n\nfunc (s *Notification) MarkRead(ctx context.Context, userID uuid.UUID, notificationType models.NotificationEnum, id uuid.UUID) error {\n\treturn s.queries.MarkNotificationRead(ctx, queries.MarkNotificationReadParams{\n\t\tID:     id,\n\t\tUserID: userID,\n\t\tType:   queries.NotificationType(notificationType.String()),\n\t})\n}\n\n// Maintenance methods\nfunc (s *Notification) DestroyExpired(ctx context.Context) error {\n\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\treturn tx.DestroyExpiredNotifications(ctx)\n\t})\n}\n\nfunc (s *Notification) UpdateNotificationSubscriptions(ctx context.Context, userID uuid.UUID, subscriptions []models.NotificationEnum) error {\n\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\tif err := tx.DeleteUserNotificationSubscriptions(ctx, userID); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tvar params []queries.CreateUserNotificationSubscriptionsParams\n\t\tfor _, sub := range subscriptions {\n\t\t\tparams = append(params, queries.CreateUserNotificationSubscriptionsParams{\n\t\t\t\tUserID: userID,\n\t\t\t\tType:   queries.NotificationType(sub),\n\t\t\t})\n\t\t}\n\t\t_, err := tx.CreateUserNotificationSubscriptions(ctx, params)\n\t\treturn err\n\t})\n}\n\nfunc (s *Notification) OnApplyEdit(ctx context.Context, edit *models.Edit) {\n\tif (edit.Status == models.VoteStatusEnumAccepted.String() || edit.Status == models.VoteStatusEnumImmediateAccepted.String()) && edit.Operation == models.OperationEnumCreate.String() {\n\t\tif edit.TargetType == models.TargetTypeEnumScene.String() && edit.Operation == models.OperationEnumCreate.String() {\n\t\t\tscene, err := s.queries.GetEditTargetID(ctx, edit.ID)\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err := s.TriggerSceneCreationNotifications(ctx, scene.ID); err != nil {\n\t\t\t\tlogger.Errorf(\"Failed to trigger scene creation notifications: %v\", err)\n\t\t\t}\n\t\t}\n\t} else if edit.Status == models.VoteStatusEnumImmediateRejected.String() || edit.Status == models.VoteStatusEnumRejected.String() || edit.Status == models.VoteStatusEnumFailed.String() {\n\t\tif err := s.TriggerFailedEditNotifications(ctx, edit.ID); err != nil {\n\t\t\tlogger.Errorf(\"Failed to trigger failed edit notifications: %v\", err)\n\t\t}\n\t}\n}\n\nfunc (s *Notification) OnCancelEdit(ctx context.Context, edit *models.Edit) {\n\t// Only send notification if the edit was force-rejected by an admin\n\t// Don't send notification if the user canceled their own edit\n\tif edit.Status == models.VoteStatusEnumImmediateRejected.String() {\n\t\tif err := s.TriggerFailedEditNotifications(ctx, edit.ID); err != nil {\n\t\t\tlogger.Errorf(\"Failed to trigger failed edit notifications: %v\", err)\n\t\t}\n\t}\n}\n\nfunc (s *Notification) OnCreateEdit(ctx context.Context, edit *models.Edit) {\n\tswitch edit.TargetType {\n\tcase models.TargetTypeEnumPerformer.String():\n\t\tif err := s.TriggerPerformerEditNotifications(ctx, edit.ID); err != nil {\n\t\t\tlogger.Errorf(\"Failed to trigger performer edit notifications: %v\", err)\n\t\t}\n\tcase models.TargetTypeEnumScene.String():\n\t\tif err := s.TriggerSceneEditNotifications(ctx, edit.ID); err != nil {\n\t\t\tlogger.Errorf(\"Failed to trigger scene edit notifications: %v\", err)\n\t\t}\n\tcase models.TargetTypeEnumStudio.String():\n\t\tif err := s.TriggerStudioEditNotifications(ctx, edit.ID); err != nil {\n\t\t\tlogger.Errorf(\"Failed to trigger studio edit notifications: %v\", err)\n\t\t}\n\t}\n}\n\nfunc (s *Notification) OnUpdateEdit(ctx context.Context, edit *models.Edit) {\n\tif err := s.TriggerUpdatedEditNotifications(ctx, edit.ID); err != nil {\n\t\tlogger.Errorf(\"Failed to trigger updated edit notifications: %v\", err)\n\t}\n}\n\nfunc (s *Notification) OnEditDownvote(ctx context.Context, edit *models.Edit) {\n\tif err := s.TriggerDownvoteEditNotifications(ctx, edit.ID); err != nil {\n\t\tlogger.Errorf(\"Failed to trigger downvote edit notifications: %v\", err)\n\t}\n}\n\nfunc (s *Notification) OnEditComment(ctx context.Context, comment *models.EditComment) {\n\tif err := s.TriggerEditCommentNotifications(ctx, comment.ID); err != nil {\n\t\tlogger.Errorf(\"Failed to trigger edit comment notifications: %v\", err)\n\t}\n}\n"
  },
  {
    "path": "internal/service/performer/joins.go",
    "content": "package performer\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n)\n\nfunc createAliases(ctx context.Context, tx *queries.Queries, performerID uuid.UUID, aliases []string) error {\n\tvar params []queries.CreatePerformerAliasesParams\n\tfor _, alias := range aliases {\n\t\tparams = append(params, queries.CreatePerformerAliasesParams{\n\t\t\tPerformerID: performerID,\n\t\t\tAlias:       alias,\n\t\t})\n\t}\n\t_, err := tx.CreatePerformerAliases(ctx, params)\n\treturn err\n}\n\nfunc updateAliases(ctx context.Context, tx *queries.Queries, performerID uuid.UUID, aliases []string) error {\n\tif err := tx.DeletePerformerAliases(ctx, performerID); err != nil {\n\t\treturn err\n\t}\n\treturn createAliases(ctx, tx, performerID, aliases)\n}\n\nfunc createTattoos(ctx context.Context, tx *queries.Queries, performerID uuid.UUID, tattoos []models.BodyModification) error {\n\tvar params []queries.CreatePerformerTattoosParams\n\tfor _, tattoo := range tattoos {\n\t\tparams = append(params, queries.CreatePerformerTattoosParams{\n\t\t\tPerformerID: performerID,\n\t\t\tLocation:    &tattoo.Location,\n\t\t\tDescription: tattoo.Description,\n\t\t})\n\t}\n\t_, err := tx.CreatePerformerTattoos(ctx, params)\n\treturn err\n}\n\nfunc updateTattoos(ctx context.Context, tx *queries.Queries, performerID uuid.UUID, tattoos []models.BodyModification) error {\n\tif err := tx.DeletePerformerTattoos(ctx, performerID); err != nil {\n\t\treturn err\n\t}\n\treturn createTattoos(ctx, tx, performerID, tattoos)\n}\n\nfunc createPiercings(ctx context.Context, tx *queries.Queries, performerID uuid.UUID, piercings []models.BodyModification) error {\n\tvar params []queries.CreatePerformerPiercingsParams\n\tfor _, piercing := range piercings {\n\t\tparams = append(params, queries.CreatePerformerPiercingsParams{\n\t\t\tPerformerID: performerID,\n\t\t\tLocation:    &piercing.Location,\n\t\t\tDescription: piercing.Description,\n\t\t})\n\t}\n\t_, err := tx.CreatePerformerPiercings(ctx, params)\n\treturn err\n}\n\nfunc updatePiercings(ctx context.Context, tx *queries.Queries, performerID uuid.UUID, piercings []models.BodyModification) error {\n\tif err := tx.DeletePerformerPiercings(ctx, performerID); err != nil {\n\t\treturn err\n\t}\n\treturn createPiercings(ctx, tx, performerID, piercings)\n}\n\nfunc createURLs(ctx context.Context, tx *queries.Queries, performerID uuid.UUID, urls []models.URL) error {\n\tvar params []queries.CreatePerformerURLsParams\n\tfor _, url := range urls {\n\t\tparams = append(params, queries.CreatePerformerURLsParams{\n\t\t\tPerformerID: performerID,\n\t\t\tUrl:         url.URL,\n\t\t\tSiteID:      url.SiteID,\n\t\t})\n\t}\n\t_, err := tx.CreatePerformerURLs(ctx, params)\n\treturn err\n}\n\nfunc updateURLs(ctx context.Context, tx *queries.Queries, performerID uuid.UUID, urls []models.URL) error {\n\tif err := tx.DeletePerformerURLs(ctx, performerID); err != nil {\n\t\treturn err\n\t}\n\treturn createURLs(ctx, tx, performerID, urls)\n}\n\nfunc createImages(ctx context.Context, tx *queries.Queries, performerID uuid.UUID, images []uuid.UUID) error {\n\tvar params []queries.CreatePerformerImagesParams\n\tfor _, image := range images {\n\t\tparams = append(params, queries.CreatePerformerImagesParams{\n\t\t\tPerformerID: performerID,\n\t\t\tImageID:     image,\n\t\t})\n\t}\n\n\t_, err := tx.CreatePerformerImages(ctx, params)\n\treturn err\n}\n\nfunc updateImages(ctx context.Context, tx *queries.Queries, performerID uuid.UUID, images []uuid.UUID) error {\n\t// TODO Remove unused images\n\tif err := tx.DeletePerformerImages(ctx, performerID); err != nil {\n\t\treturn err\n\t}\n\treturn createImages(ctx, tx, performerID, images)\n}\n"
  },
  {
    "path": "internal/service/performer/query.go",
    "content": "package performer\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\tsq \"github.com/Masterminds/squirrel\"\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\tqueryhelper \"github.com/stashapp/stash-box/internal/service/query\"\n)\n\nfunc (s *Performer) Query(ctx context.Context, input models.PerformerQueryInput) ([]models.Performer, error) {\n\tuser := auth.GetCurrentUser(ctx)\n\n\tpsql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar)\n\tquery := s.buildPerformerQuery(psql, input, user.ID, false)\n\n\t// Apply sort\n\tquery = s.applyPerformerSort(query, input)\n\n\t// Apply pagination\n\tquery = queryhelper.ApplyPagination(query, input.Page, input.PerPage)\n\n\treturn queryhelper.ExecuteQuery(ctx, query, s.queries.DB(), converter.PerformerToModel, \"QueryPerformers\")\n}\n\nfunc (s *Performer) QueryCount(ctx context.Context, input models.PerformerQueryInput) (int, error) {\n\tuser := auth.GetCurrentUser(ctx)\n\n\tpsql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar)\n\tquery := s.buildPerformerQuery(psql, input, user.ID, true)\n\n\treturn queryhelper.ExecuteCount(ctx, query, s.queries.DB(), \"QueryPerformersCount\")\n}\n\nfunc (s *Performer) buildPerformerQuery(psql sq.StatementBuilderType, input models.PerformerQueryInput, userID uuid.UUID, forCount bool) sq.SelectBuilder {\n\tvar query sq.SelectBuilder\n\tneedsStudioJoin := input.StudioID != nil\n\n\t// Build base query with studio join if needed\n\tif forCount {\n\t\tif needsStudioJoin {\n\t\t\tquery = psql.Select(\"COUNT(DISTINCT performers.id)\").From(\"performers\").\n\t\t\t\tJoin(`(\n\t\t\t\t\tSELECT performer_id, MIN(date) as debut, MAX(date) AS last_scene, COUNT(*) as scene_count\n\t\t\t\t\tFROM scene_performers\n\t\t\t\t\tJOIN scenes ON scene_id = id AND studio_id = ?\n\t\t\t\t\tGROUP BY performer_id\n\t\t\t\t) D ON performers.id = D.performer_id`, input.StudioID)\n\t\t} else {\n\t\t\tquery = psql.Select(\"COUNT(*)\").From(\"performers\")\n\t\t}\n\t} else {\n\t\tif needsStudioJoin {\n\t\t\tquery = psql.Select(\"performers.*\").From(\"performers\").\n\t\t\t\tJoin(`(\n\t\t\t\t\tSELECT performer_id, MIN(date) as debut, MAX(date) AS last_scene, COUNT(*) as scene_count\n\t\t\t\t\tFROM scene_performers\n\t\t\t\t\tJOIN scenes ON scene_id = id AND studio_id = ?\n\t\t\t\t\tGROUP BY performer_id\n\t\t\t\t) D ON performers.id = D.performer_id`, input.StudioID)\n\t\t} else {\n\t\t\tquery = psql.Select(\"performers.*\").From(\"performers\")\n\t\t}\n\t}\n\n\t// Filter by URL\n\tif input.URL != nil && *input.URL != \"\" {\n\t\tquery = query.\n\t\t\tJoin(\"performer_urls ON performers.id = performer_urls.performer_id\").\n\t\t\tWhere(sq.Eq{\"performer_urls.url\": *input.URL})\n\t}\n\n\t// Filter by name only\n\tif input.Name != nil && *input.Name != \"\" {\n\t\tsearchTerm := \"%\" + *input.Name + \"%\"\n\t\tquery = query.Where(sq.ILike{\"performers.name\": searchTerm})\n\t}\n\n\t// Filter by names (searches name and disambiguation)\n\tif input.Names != nil && *input.Names != \"\" {\n\t\tsearchTerm := \"%\" + *input.Names + \"%\"\n\t\tquery = query.Where(sq.Or{\n\t\t\tsq.ILike{\"performers.name\": searchTerm},\n\t\t\tsq.ILike{\"performers.disambiguation\": searchTerm},\n\t\t})\n\t}\n\n\t// Filter by birth year\n\tif input.BirthYear != nil {\n\t\tquery = queryhelper.ApplyIntCriterion(query, \"EXTRACT(YEAR FROM to_date(performers.birthdate, 'YYYY-MM-DD'))::int\", input.BirthYear)\n\t}\n\n\t// Filter by birthdate\n\tif input.Birthdate != nil {\n\t\tquery = queryhelper.ApplyDateCriterion(query, \"performers.birthdate\", input.Birthdate)\n\t}\n\n\t// Filter by deathdate\n\tif input.Deathdate != nil {\n\t\tquery = queryhelper.ApplyDateCriterion(query, \"performers.deathdate\", input.Deathdate)\n\t}\n\n\t// Filter by age\n\tif input.Age != nil {\n\t\tageExpr := \"EXTRACT(YEAR FROM AGE(COALESCE(to_date(performers.deathdate, 'YYYY-MM-DD'), CURRENT_DATE), to_date(performers.birthdate, 'YYYY-MM-DD')))::int\"\n\t\tquery = queryhelper.ApplyIntCriterion(query, ageExpr, input.Age)\n\t}\n\n\t// Filter by gender\n\tif input.Gender != nil && *input.Gender != \"\" {\n\t\tif *input.Gender == models.GenderFilterEnumUnknown {\n\t\t\tquery = query.Where(\"performers.gender IS NULL\")\n\t\t} else {\n\t\t\tquery = query.Where(sq.Eq{\"performers.gender\": input.Gender.String()})\n\t\t}\n\t}\n\n\t// Filter by ethnicity\n\tif input.Ethnicity != nil && *input.Ethnicity != \"\" {\n\t\tif *input.Ethnicity == models.EthnicityFilterEnumUnknown {\n\t\t\tquery = query.Where(\"performers.ethnicity IS NULL\")\n\t\t} else {\n\t\t\tquery = query.Where(sq.Eq{\"performers.ethnicity\": input.Ethnicity.String()})\n\t\t}\n\t}\n\n\t// Filter by favorite status\n\tif input.IsFavorite != nil {\n\t\tif *input.IsFavorite {\n\t\t\tquery = query.\n\t\t\t\tJoin(\"performer_favorites F ON performers.id = F.performer_id\").\n\t\t\t\tWhere(sq.Eq{\"F.user_id\": userID})\n\t\t} else {\n\t\t\tquery = query.\n\t\t\t\tLeftJoin(\"performer_favorites F ON performers.id = F.performer_id AND F.user_id = ?\", userID).\n\t\t\t\tWhere(\"F.performer_id IS NULL\")\n\t\t}\n\t}\n\n\t// Filter by performed with\n\tif input.PerformedWith != nil {\n\t\tsubquery := `\n\t\t\tperformers.id IN (\n\t\t\t\tSELECT SP.performer_id FROM scene_performers SP\n\t\t\t\tJOIN scene_performers SPP ON SP.scene_id = SPP.scene_id\n\t\t\t\tWHERE SPP.performer_id = ? AND SP.performer_id != ?\n\t\t\t\tGROUP BY SP.performer_id\n\t\t\t)`\n\t\tquery = query.Where(sq.Expr(subquery, input.PerformedWith, input.PerformedWith))\n\t}\n\n\t// String criteria\n\tif input.Disambiguation != nil {\n\t\tquery = queryhelper.ApplyStringCriterion(query, \"disambiguation\", input.Disambiguation)\n\t}\n\tif input.Country != nil {\n\t\tquery = queryhelper.ApplyStringCriterion(query, \"country\", input.Country)\n\t}\n\n\t// Only non-deleted performers\n\tquery = query.Where(sq.Eq{\"deleted\": false})\n\n\treturn query\n}\n\nfunc (s *Performer) applyPerformerSort(query sq.SelectBuilder, input models.PerformerQueryInput) sq.SelectBuilder {\n\tsortField := \"name\"\n\tsortDir := \"ASC\"\n\tif input.Direction != \"\" {\n\t\tsortDir = strings.ToUpper(input.Direction.String())\n\t}\n\n\tneedsStudioJoin := input.StudioID != nil\n\n\tswitch input.Sort {\n\tcase models.PerformerSortEnumDebut:\n\t\tif !needsStudioJoin {\n\t\t\tquery = query.LeftJoin(`(\n\t\t\t\tSELECT performer_id, MIN(date) as debut\n\t\t\t\tFROM scene_performers\n\t\t\t\tJOIN scenes ON scene_id = id\n\t\t\t\tGROUP BY performer_id\n\t\t\t) D ON performers.id = D.performer_id`)\n\t\t}\n\t\treturn query.OrderBy(fmt.Sprintf(\"debut %s NULLS LAST, name %s\", sortDir, sortDir))\n\tcase models.PerformerSortEnumLastScene:\n\t\tif !needsStudioJoin {\n\t\t\tquery = query.LeftJoin(`(\n\t\t\t\tSELECT performer_id, MAX(date) as last_scene\n\t\t\t\tFROM scene_performers\n\t\t\t\tJOIN scenes ON scene_id = id\n\t\t\t\tGROUP BY performer_id\n\t\t\t) D ON performers.id = D.performer_id`)\n\t\t}\n\t\treturn query.OrderBy(fmt.Sprintf(\"last_scene %s NULLS LAST, name %s\", sortDir, sortDir))\n\tcase models.PerformerSortEnumSceneCount:\n\t\tif !needsStudioJoin {\n\t\t\tquery = query.LeftJoin(`(\n\t\t\t\tSELECT performer_id, COUNT(*) as scene_count\n\t\t\t\tFROM scene_performers\n\t\t\t\tGROUP BY performer_id\n\t\t\t) D ON performers.id = D.performer_id`)\n\t\t}\n\t\treturn query.OrderBy(fmt.Sprintf(\"COALESCE(scene_count, 0) %s, name %s\", sortDir, sortDir))\n\tdefault:\n\t\tif input.Sort != \"\" {\n\t\t\tsortField = strings.ToLower(input.Sort.String())\n\t\t}\n\t\treturn query.OrderBy(fmt.Sprintf(\"%s %s\", sortField, sortDir))\n\t}\n}\n"
  },
  {
    "path": "internal/service/performer/service.go",
    "content": "package performer\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/internal/service/errutil\"\n)\n\n// Performer handles performer-related operations\ntype Performer struct {\n\tqueries *queries.Queries\n\twithTxn queries.WithTxnFunc\n}\n\n// NewPerformer creates a new performer service\nfunc NewPerformer(queries *queries.Queries, withTxn queries.WithTxnFunc) *Performer {\n\treturn &Performer{\n\t\tqueries: queries,\n\t\twithTxn: withTxn,\n\t}\n}\n\n// WithTxn executes a function within a transaction\nfunc (s *Performer) WithTxn(fn func(*queries.Queries) error) error {\n\treturn s.withTxn(fn)\n}\n\n// Queries\n\nfunc (s *Performer) FindByID(ctx context.Context, id uuid.UUID) (*models.Performer, error) {\n\tperformer, err := s.queries.FindPerformer(ctx, id)\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\treturn converter.PerformerToModelPtr(performer), nil\n}\n\nfunc (s *Performer) FindByName(ctx context.Context, name string) (*models.Performer, error) {\n\tperformer, err := s.queries.FindPerformerByName(ctx, strings.ToUpper(name))\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\treturn converter.PerformerToModelPtr(performer), nil\n}\n\nfunc (s *Performer) FindByAlias(ctx context.Context, alias string) (*models.Performer, error) {\n\tperformer, err := s.queries.FindPerformerByAlias(ctx, strings.ToUpper(alias))\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\treturn converter.PerformerToModelPtr(performer), nil\n}\n\n// Dataloader for performers\nfunc (s *Performer) LoadByIds(ctx context.Context, ids []uuid.UUID) ([]*models.Performer, []error) {\n\tif len(ids) == 0 {\n\t\treturn make([]*models.Performer, 0), nil\n\t}\n\n\tperformers, err := s.queries.FindPerformersByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\t// Create a map for quick lookup\n\tm := make(map[uuid.UUID]*models.Performer)\n\tfor _, performer := range performers {\n\t\tmodelPerformer := converter.PerformerToModel(performer)\n\t\tm[performer.ID] = &modelPerformer\n\t}\n\n\t// Build result in the same order as input IDs\n\tresult := make([]*models.Performer, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\n\treturn result, nil\n}\n\n// Dataloder for merge target IDs for performers\nfunc (s *Performer) LoadMergeIDsByPerformerIDs(ctx context.Context, ids []uuid.UUID) ([][]uuid.UUID, []error) {\n\tif len(ids) == 0 {\n\t\treturn make([][]uuid.UUID, 0), nil\n\t}\n\n\tmerges, err := s.queries.FindMergeIDsByPerformerIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\t// Group results by performer ID\n\tm := make(map[uuid.UUID][]uuid.UUID)\n\tfor _, merge := range merges {\n\t\tm[merge.PerformerID] = append(m[merge.PerformerID], merge.MergeID)\n\t}\n\n\t// Build result in the same order as input IDs\n\tresult := make([][]uuid.UUID, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\n\treturn result, nil\n}\n\n// Dataloader for merge source IDs for performers\nfunc (s *Performer) LoadMergeIDsBySourcePerformerIDs(ctx context.Context, ids []uuid.UUID) ([][]uuid.UUID, []error) {\n\tif len(ids) == 0 {\n\t\treturn make([][]uuid.UUID, 0), nil\n\t}\n\n\tmerges, err := s.queries.FindMergeIDsBySourcePerformerIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\t// Group results by performer ID\n\tm := make(map[uuid.UUID][]uuid.UUID)\n\tfor _, merge := range merges {\n\t\tm[merge.PerformerID] = append(m[merge.PerformerID], merge.MergeID)\n\t}\n\n\t// Build result in the same order as input IDs\n\tresult := make([][]uuid.UUID, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\n\treturn result, nil\n}\n\n// Dataloader for aliases for multiple performers\nfunc (s *Performer) LoadAliases(ctx context.Context, ids []uuid.UUID) ([][]string, []error) {\n\tif len(ids) == 0 {\n\t\treturn make([][]string, 0), nil\n\t}\n\n\taliases, err := s.queries.FindPerformerAliasesByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\t// Group results by performer ID\n\tm := make(map[uuid.UUID][]string)\n\tfor _, alias := range aliases {\n\t\tm[alias.PerformerID] = append(m[alias.PerformerID], alias.Alias)\n\t}\n\n\t// Build result in the same order as input IDs\n\tresult := make([][]string, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\n\treturn result, nil\n}\n\n// Dataloader for tattoos for multiple performers\nfunc (s *Performer) LoadTattoos(ctx context.Context, ids []uuid.UUID) ([][]models.BodyModification, []error) {\n\tif len(ids) == 0 {\n\t\treturn make([][]models.BodyModification, 0), nil\n\t}\n\n\ttattoos, err := s.queries.FindPerformerTattoosByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\t// Group results by performer ID\n\tm := make(map[uuid.UUID][]models.BodyModification)\n\tfor _, tattoo := range tattoos {\n\t\tbodyMod := models.BodyModification{\n\t\t\tDescription: tattoo.Description,\n\t\t}\n\t\tif tattoo.Location != nil {\n\t\t\tbodyMod.Location = *tattoo.Location\n\t\t}\n\t\tm[tattoo.PerformerID] = append(m[tattoo.PerformerID], bodyMod)\n\t}\n\n\t// Build result in the same order as input IDs\n\tresult := make([][]models.BodyModification, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\n\treturn result, nil\n}\n\n// Dataloader for piercings for multiple performers\nfunc (s *Performer) LoadPiercings(ctx context.Context, ids []uuid.UUID) ([][]models.BodyModification, []error) {\n\tif len(ids) == 0 {\n\t\treturn make([][]models.BodyModification, 0), nil\n\t}\n\n\tpiercings, err := s.queries.FindPerformerPiercingsByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\t// Group results by performer ID\n\tm := make(map[uuid.UUID][]models.BodyModification)\n\tfor _, piercing := range piercings {\n\t\tbodyMod := models.BodyModification{\n\t\t\tDescription: piercing.Description,\n\t\t}\n\t\tif piercing.Location != nil {\n\t\t\tbodyMod.Location = *piercing.Location\n\t\t}\n\t\tm[piercing.PerformerID] = append(m[piercing.PerformerID], bodyMod)\n\t}\n\n\t// Build result in the same order as input IDs\n\tresult := make([][]models.BodyModification, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\n\treturn result, nil\n}\n\n// Dataloader for URLs for multiple performers\nfunc (s *Performer) LoadURLs(ctx context.Context, ids []uuid.UUID) ([][]models.URL, []error) {\n\tif len(ids) == 0 {\n\t\treturn make([][]models.URL, 0), nil\n\t}\n\n\turls, err := s.queries.FindPerformerUrlsByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\t// Group results by performer ID\n\tm := make(map[uuid.UUID][]models.URL)\n\tfor _, url := range urls {\n\t\turlModel := models.URL{\n\t\t\tURL:    url.Url,\n\t\t\tSiteID: url.SiteID,\n\t\t}\n\t\tm[url.PerformerID] = append(m[url.PerformerID], urlModel)\n\t}\n\n\t// Build result in the same order as input IDs\n\tresult := make([][]models.URL, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\n\treturn result, nil\n}\n\nfunc (s *Performer) GetAliases(ctx context.Context, performerID uuid.UUID) ([]string, error) {\n\treturn s.queries.GetPerformerAliases(ctx, performerID)\n}\n\nfunc (s *Performer) GetTattoos(ctx context.Context, performerID uuid.UUID) ([]models.BodyModification, error) {\n\ttattoos, err := s.queries.GetPerformerTattoos(ctx, performerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar result []models.BodyModification\n\tfor _, tattoo := range tattoos {\n\t\tlocation := \"\"\n\t\tif tattoo.Location != nil {\n\t\t\tlocation = *tattoo.Location\n\t\t}\n\n\t\tresult = append(result, models.BodyModification{\n\t\t\tLocation:    location,\n\t\t\tDescription: tattoo.Description,\n\t\t})\n\t}\n\treturn result, nil\n}\n\nfunc (s *Performer) GetPiercings(ctx context.Context, performerID uuid.UUID) ([]models.BodyModification, error) {\n\tpiercings, err := s.queries.GetPerformerPiercings(ctx, performerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar result []models.BodyModification\n\tfor _, piercing := range piercings {\n\t\tlocation := \"\"\n\t\tif piercing.Location != nil {\n\t\t\tlocation = *piercing.Location\n\t\t}\n\n\t\tresult = append(result, models.BodyModification{\n\t\t\tLocation:    location,\n\t\t\tDescription: piercing.Description,\n\t\t})\n\t}\n\treturn result, nil\n}\n\nfunc (s *Performer) GetURLs(ctx context.Context, performerID uuid.UUID) ([]models.URL, error) {\n\turls, err := s.queries.GetPerformerURLs(ctx, performerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar result []models.URL\n\tfor _, url := range urls {\n\t\tresult = append(result, models.URL{\n\t\t\tURL:    url.Url,\n\t\t\tSiteID: url.SiteID,\n\t\t})\n\t}\n\treturn result, nil\n}\n\n// Mutations\n\nfunc (s *Performer) Create(ctx context.Context, input models.PerformerCreateInput) (*models.Performer, error) {\n\tid, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Populate a new performer from the input\n\tnewPerformer := converter.PerformerCreateInputToPerformer(input)\n\tnewPerformer.ID = id\n\n\tvar performer *models.Performer\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tdbPerformer, err := tx.CreatePerformer(ctx, converter.PerformerToCreateParams(newPerformer))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tperformer = converter.PerformerToModelPtr(dbPerformer)\n\n\t\tif err := createAliases(ctx, tx, id, input.Aliases); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := createURLs(ctx, tx, id, input.Urls); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := createPiercings(ctx, tx, id, converter.BodyModInputToModel(input.Piercings)); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := createTattoos(ctx, tx, id, converter.BodyModInputToModel(input.Tattoos)); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn createImages(ctx, tx, id, input.ImageIds)\n\t})\n\n\treturn performer, err\n}\n\nfunc (s *Performer) Update(ctx context.Context, input models.PerformerUpdateInput) (*models.Performer, error) {\n\tvar performer *models.Performer\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\t// get the existing performer and modify it\n\t\tupdatedPerformer, err := s.FindByID(ctx, input.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Populate performer from the input\n\t\tconverter.UpdatePerformerFromUpdateInput(updatedPerformer, input)\n\n\t\tdbPerformer, err := tx.UpdatePerformer(ctx, converter.PerformerToUpdateParams(*updatedPerformer))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tperformer = converter.PerformerToModelPtr(dbPerformer)\n\n\t\t// Save the aliases\n\t\tif err := updateAliases(ctx, tx, performer.ID, input.Aliases); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the URLs\n\t\tif err := updateURLs(ctx, tx, performer.ID, input.Urls); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the Tattoos\n\t\tif err := updateTattoos(ctx, tx, performer.ID, converter.BodyModInputToModel(input.Tattoos)); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the Piercings\n\t\tif err := updatePiercings(ctx, tx, performer.ID, converter.BodyModInputToModel(input.Piercings)); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Update images\n\t\treturn updateImages(ctx, tx, performer.ID, input.ImageIds)\n\t})\n\n\t// Commit\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn performer, nil\n\n}\n\nfunc (s *Performer) Delete(ctx context.Context, id uuid.UUID) error {\n\treturn s.queries.DeletePerformer(ctx, id)\n}\n\nfunc (s *Performer) Favorite(ctx context.Context, userID uuid.UUID, performerID uuid.UUID, favorite bool) error {\n\tperformer, err := s.queries.FindPerformer(ctx, performerID)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"performer not found\")\n\t}\n\n\tif performer.Deleted {\n\t\treturn fmt.Errorf(\"performer is deleted, unable to make favorite\")\n\t}\n\n\tif favorite {\n\t\treturn s.queries.CreatePerformerFavorite(ctx, queries.CreatePerformerFavoriteParams{\n\t\t\tUserID:      userID,\n\t\t\tPerformerID: performerID,\n\t\t})\n\t}\n\treturn s.queries.DeletePerformerFavorite(ctx, queries.DeletePerformerFavoriteParams{\n\t\tUserID:      userID,\n\t\tPerformerID: performerID,\n\t})\n}\n\nfunc (s *Performer) FindExistingPerformers(ctx context.Context, input models.QueryExistingPerformerInput) ([]models.Performer, error) {\n\turls := input.Urls\n\n\tif input.Name == nil && len(urls) == 0 {\n\t\treturn nil, nil\n\t}\n\n\trows, err := s.queries.FindExistingPerformers(ctx, queries.FindExistingPerformersParams{\n\t\tName:           input.Name,\n\t\tDisambiguation: input.Disambiguation,\n\t\tUrls:           urls,\n\t})\n\n\treturn converter.PerformersToModels(rows), err\n}\n\nfunc (s *Performer) SearchPerformer(ctx context.Context, term string, limit *int, page *int, perPage *int, filter *models.PerformerSearchFilter) (*models.PerformerQuery, error) {\n\ttrimmedQuery := strings.TrimSpace(strings.ToLower(term))\n\tperformerID, err := uuid.FromString(trimmedQuery)\n\tif err == nil {\n\t\tvar performers []models.Performer\n\t\tperformer, err := s.queries.FindPerformer(ctx, performerID)\n\t\tif err == nil {\n\t\t\tperformers = append(performers, converter.PerformerToModel(performer))\n\t\t}\n\t\treturn &models.PerformerQuery{\n\t\t\tSearchResults: &models.PerformerSearchResults{\n\t\t\t\tPerformers: performers,\n\t\t\t\tCount:      len(performers),\n\t\t\t},\n\t\t}, errutil.IgnoreNotFound(err)\n\t}\n\n\tsearchLimit := 10\n\tsearchOffset := 0\n\n\tif perPage != nil && *perPage > 0 {\n\t\tsearchLimit = *perPage\n\t} else if limit != nil && *limit > 0 {\n\t\tsearchLimit = *limit\n\t}\n\n\tif page != nil && *page > 1 {\n\t\tsearchOffset = (*page - 1) * searchLimit\n\t}\n\n\tif strings.HasPrefix(trimmedQuery, \"https://\") || strings.HasPrefix(trimmedQuery, \"http://\") {\n\t\trows, err := s.queries.FindPerformersByURL(ctx, queries.FindPerformersByURLParams{\n\t\t\tUrl:   &trimmedQuery,\n\t\t\tLimit: int32(searchLimit),\n\t\t})\n\t\tperformers := converter.PerformersToModels(rows)\n\t\treturn &models.PerformerQuery{\n\t\t\tSearchResults: &models.PerformerSearchResults{\n\t\t\t\tPerformers: performers,\n\t\t\t\tCount:      len(performers),\n\t\t\t},\n\t\t}, err\n\t}\n\n\tvar filterGender *string\n\tif filter != nil {\n\t\tif filter.Gender != nil {\n\t\t\tgenderStr := string(*filter.Gender)\n\t\t\tfilterGender = &genderStr\n\t\t}\n\t}\n\n\trows, err := s.queries.SearchPerformersWithFacets(ctx, queries.SearchPerformersWithFacetsParams{\n\t\tTerm:         &trimmedQuery,\n\t\tLimit:        int32(searchLimit),\n\t\tOffset:       int32(searchOffset),\n\t\tFilterGender: filterGender,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tids := make([]uuid.UUID, len(rows))\n\tfor i, row := range rows {\n\t\tids[i] = row.PerformerID\n\t}\n\n\tperformerPtrs, _ := s.LoadByIds(ctx, ids)\n\tperformers := make([]models.Performer, 0, len(performerPtrs))\n\tfor _, p := range performerPtrs {\n\t\tif p != nil {\n\t\t\tperformers = append(performers, *p)\n\t\t}\n\t}\n\n\t// Parse facets and count from the first row (all rows have the same aggregated values)\n\tvar facets *models.PerformerSearchFacets\n\tcount := 0\n\tif len(rows) > 0 {\n\t\tfacets = parsePerformerFacets(rows[0].GenderFacets)\n\t\tcount = parseParadeDBCount(rows[0].TotalCount)\n\t}\n\n\treturn &models.PerformerQuery{\n\t\tSearchResults: &models.PerformerSearchResults{\n\t\t\tPerformers: performers,\n\t\t\tCount:      count,\n\t\t\tFacets:     facets,\n\t\t},\n\t}, nil\n}\n\ntype paradeDBCountResult struct {\n\tValue float64 `json:\"value\"`\n}\n\nfunc parseParadeDBCount(raw any) int {\n\tif raw == nil {\n\t\treturn 0\n\t}\n\tjsonBytes, err := json.Marshal(raw)\n\tif err != nil {\n\t\treturn 0\n\t}\n\tvar result paradeDBCountResult\n\tif err := json.Unmarshal(jsonBytes, &result); err != nil {\n\t\treturn 0\n\t}\n\treturn int(result.Value)\n}\n\ntype paradeDBFacetResult struct {\n\tBuckets []paradeDBBucket `json:\"buckets\"`\n}\n\ntype paradeDBBucket struct {\n\tKey      string `json:\"key\"`\n\tDocCount int    `json:\"doc_count\"`\n}\n\nfunc parsePerformerFacets(genderFacetsRaw any) *models.PerformerSearchFacets {\n\tfacets := &models.PerformerSearchFacets{}\n\n\tif genderFacetsRaw != nil {\n\t\tif genderBytes, err := json.Marshal(genderFacetsRaw); err == nil {\n\t\t\tvar genderResult paradeDBFacetResult\n\t\t\tif err := json.Unmarshal(genderBytes, &genderResult); err == nil {\n\t\t\t\tfor _, bucket := range genderResult.Buckets {\n\t\t\t\t\tif gender := models.GenderEnum(bucket.Key); gender.IsValid() {\n\t\t\t\t\t\tfacets.Genders = append(facets.Genders, models.GenderFacet{\n\t\t\t\t\t\t\tGender: gender,\n\t\t\t\t\t\t\tCount:  bucket.DocCount,\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\treturn facets\n}\n\nfunc (s *Performer) LoadIsFavorite(ctx context.Context, userID uuid.UUID, ids []uuid.UUID) ([]bool, []error) {\n\tfavorites, err := s.queries.FindPerformerFavoritesByIds(ctx, queries.FindPerformerFavoritesByIdsParams{\n\t\tPerformerIds: ids,\n\t\tUserID:       userID,\n\t})\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tresult := make([]bool, len(ids))\n\tfavoriteMap := make(map[uuid.UUID]bool)\n\n\tfor _, favorite := range favorites {\n\t\tfavoriteMap[favorite.PerformerID] = favorite.IsFavorite\n\t}\n\n\tfor i, id := range ids {\n\t\tresult[i] = favoriteMap[id]\n\t}\n\n\treturn result, make([]error, len(ids))\n}\n"
  },
  {
    "path": "internal/service/query/criterion.go",
    "content": "package query\n\nimport (\n\t\"fmt\"\n\n\tsq \"github.com/Masterminds/squirrel\"\n\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\n// ApplyMultiIDCriterion applies multi-ID criterion (includes/includes_all/excludes)\n// Modifies the query pointer in place\n// tableName: the main table name (e.g., \"scenes\")\n// joinTable: the join table name (e.g., \"scene_performers\")\n// fkColumn: the foreign key column in the join table referencing the main table (e.g., \"scene_id\")\n// joinField: the field in the join table to filter on (e.g., \"performer_id\")\nfunc ApplyMultiIDCriterion(query *sq.SelectBuilder, tableName, joinTable, fkColumn, joinField string, criterion *models.MultiIDCriterionInput) error {\n\tswitch criterion.Modifier {\n\tcase models.CriterionModifierIncludes:\n\t\t// includes any of the provided ids\n\t\tsubquery := sq.Select(fmt.Sprintf(\"DISTINCT %s\", fkColumn)).\n\t\t\tFrom(joinTable).\n\t\t\tWhere(sq.Eq{joinField: criterion.Value})\n\t\t*query = query.JoinClause(sq.Expr(fmt.Sprintf(\"INNER JOIN (?) AS %s_filter ON %s.id = %s_filter.%s\", joinTable, tableName, joinTable, fkColumn), subquery))\n\tcase models.CriterionModifierIncludesAll:\n\t\t// includes all of the provided ids\n\t\tsubquery := sq.Select(fkColumn).\n\t\t\tFrom(joinTable).\n\t\t\tWhere(sq.Eq{joinField: criterion.Value}).\n\t\t\tGroupBy(fkColumn).\n\t\t\tHaving(sq.Eq{\"COUNT(*)\": len(criterion.Value)})\n\t\t*query = query.JoinClause(sq.Expr(fmt.Sprintf(\"INNER JOIN (?) AS %s_filter ON %s.id = %s_filter.%s\", joinTable, tableName, joinTable, fkColumn), subquery))\n\tcase models.CriterionModifierExcludes:\n\t\t// excludes all of the provided ids\n\t\tsubquery := sq.Select(fkColumn).\n\t\t\tFrom(joinTable).\n\t\t\tWhere(sq.Eq{joinField: criterion.Value})\n\t\t*query = query.Where(sq.Expr(fmt.Sprintf(\"%s.id NOT IN (?)\", tableName), subquery))\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported modifier %s for %s.%s\", criterion.Modifier, joinTable, joinField)\n\t}\n\treturn nil\n}\n\n// ApplyIDCriterion applies ID criterion for a direct column (equals, not equals, includes, excludes, is null, not null)\n// Returns the modified query\nfunc ApplyIDCriterion(query sq.SelectBuilder, field string, criterion *models.IDCriterionInput) sq.SelectBuilder {\n\tswitch criterion.Modifier {\n\tcase models.CriterionModifierEquals:\n\t\tif len(criterion.Value) > 0 {\n\t\t\treturn query.Where(sq.Eq{field: criterion.Value[0]})\n\t\t}\n\t\treturn query\n\tcase models.CriterionModifierNotEquals:\n\t\tif len(criterion.Value) > 0 {\n\t\t\treturn query.Where(sq.NotEq{field: criterion.Value[0]})\n\t\t}\n\t\treturn query\n\tcase models.CriterionModifierIncludes:\n\t\treturn query.Where(sq.Eq{field: criterion.Value})\n\tcase models.CriterionModifierExcludes:\n\t\treturn query.Where(sq.NotEq{field: criterion.Value})\n\tcase models.CriterionModifierIsNull:\n\t\treturn query.Where(field + \" IS NULL\")\n\tcase models.CriterionModifierNotNull:\n\t\treturn query.Where(field + \" IS NOT NULL\")\n\tdefault:\n\t\treturn query\n\t}\n}\n\n// ApplyIntCriterion applies integer criterion (equals, not equals, greater than, less than, is null, not null)\n// Returns the modified query\nfunc ApplyIntCriterion(query sq.SelectBuilder, field string, criterion *models.IntCriterionInput) sq.SelectBuilder {\n\tswitch criterion.Modifier {\n\tcase models.CriterionModifierEquals:\n\t\treturn query.Where(sq.Eq{field: criterion.Value})\n\tcase models.CriterionModifierNotEquals:\n\t\treturn query.Where(sq.NotEq{field: criterion.Value})\n\tcase models.CriterionModifierGreaterThan:\n\t\treturn query.Where(sq.Gt{field: criterion.Value})\n\tcase models.CriterionModifierLessThan:\n\t\treturn query.Where(sq.Lt{field: criterion.Value})\n\tcase models.CriterionModifierIsNull:\n\t\treturn query.Where(field + \" IS NULL\")\n\tcase models.CriterionModifierNotNull:\n\t\treturn query.Where(field + \" IS NOT NULL\")\n\tdefault:\n\t\treturn query\n\t}\n}\n\n// ApplyStringCriterion applies string criterion (equals, not equals, is null, not null)\n// Returns the modified query\nfunc ApplyStringCriterion(query sq.SelectBuilder, field string, criterion *models.StringCriterionInput) sq.SelectBuilder {\n\tswitch criterion.Modifier {\n\tcase models.CriterionModifierEquals:\n\t\treturn query.Where(sq.Eq{field: criterion.Value})\n\tcase models.CriterionModifierNotEquals:\n\t\treturn query.Where(sq.NotEq{field: criterion.Value})\n\tcase models.CriterionModifierIsNull:\n\t\treturn query.Where(field + \" IS NULL\")\n\tcase models.CriterionModifierNotNull:\n\t\treturn query.Where(field + \" IS NOT NULL\")\n\tdefault:\n\t\treturn query\n\t}\n}\n\n// ApplyDateCriterion applies date criterion (equals, not equals, greater than, less than, is null, not null)\n// Returns the modified query\nfunc ApplyDateCriterion(query sq.SelectBuilder, field string, criterion *models.DateCriterionInput) sq.SelectBuilder {\n\tswitch criterion.Modifier {\n\tcase models.CriterionModifierEquals:\n\t\treturn query.Where(sq.Eq{field: criterion.Value})\n\tcase models.CriterionModifierNotEquals:\n\t\treturn query.Where(sq.NotEq{field: criterion.Value})\n\tcase models.CriterionModifierGreaterThan:\n\t\treturn query.Where(sq.Gt{field: criterion.Value})\n\tcase models.CriterionModifierLessThan:\n\t\treturn query.Where(sq.Lt{field: criterion.Value})\n\tcase models.CriterionModifierIsNull:\n\t\treturn query.Where(field + \" IS NULL\")\n\tcase models.CriterionModifierNotNull:\n\t\treturn query.Where(field + \" IS NOT NULL\")\n\tdefault:\n\t\treturn query\n\t}\n}\n"
  },
  {
    "path": "internal/service/query/helpers.go",
    "content": "package query\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\tsq \"github.com/Masterminds/squirrel\"\n\t\"github.com/jackc/pgx/v5\"\n\n\t\"github.com/stashapp/stash-box/internal/queries\"\n)\n\n// ApplyPagination applies pagination to a query with default values\nfunc ApplyPagination(query sq.SelectBuilder, page, perPage int) sq.SelectBuilder {\n\tif page <= 0 {\n\t\tpage = 1\n\t}\n\tif perPage <= 0 {\n\t\tperPage = 25\n\t}\n\toffset := (page - 1) * perPage\n\treturn query.Limit(uint64(perPage)).Offset(uint64(offset))\n}\n\n// ApplySortParams applies sorting to query with optional table prefix\n// If tablePrefix is empty, no prefix is added to the field name\nfunc ApplySortParams(query sq.SelectBuilder, tablePrefix string, sort, direction fmt.Stringer, defaultField, defaultDir string) sq.SelectBuilder {\n\tsortField := defaultField\n\tsortDir := defaultDir\n\n\tif sort != nil && sort.String() != \"\" {\n\t\tsortField = strings.ToLower(sort.String())\n\t}\n\tif direction != nil && direction.String() != \"\" {\n\t\tsortDir = strings.ToUpper(direction.String())\n\t}\n\n\tif tablePrefix != \"\" {\n\t\treturn query.OrderBy(fmt.Sprintf(\"%s.%s %s\", tablePrefix, sortField, sortDir))\n\t}\n\treturn query.OrderBy(fmt.Sprintf(\"%s %s\", sortField, sortDir))\n}\n\n// ExecuteQuery executes a squirrel query and converts results using a generic converter function\n// If queryName is provided, it prepends a sqlc-style comment for better span naming in traces\nfunc ExecuteQuery[T any, M any](ctx context.Context, query sq.SelectBuilder, db queries.DBTX, converter func(T) M, queryName string) ([]M, error) {\n\tsql, args, err := query.ToSql()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Prepend query name comment for tracing if provided\n\tif queryName != \"\" {\n\t\tsql = fmt.Sprintf(\"-- name: %s\\n%s\", queryName, sql)\n\t}\n\n\trows, err := db.Query(ctx, sql, args...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\n\tvar results []M\n\tfor rows.Next() {\n\t\tdbEntity, err := pgx.RowToStructByPos[T](rows)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tresults = append(results, converter(dbEntity))\n\t}\n\n\tif err = rows.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn results, nil\n}\n\n// ExecuteCount executes a count query and returns the result as an int\n// If queryName is provided, it prepends a sqlc-style comment for better span naming in traces\nfunc ExecuteCount(ctx context.Context, query sq.SelectBuilder, db queries.DBTX, queryName string) (int, error) {\n\tsql, args, err := query.ToSql()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Prepend query name comment for tracing if provided\n\tif queryName != \"\" {\n\t\tsql = fmt.Sprintf(\"-- name: %s\\n%s\", queryName, sql)\n\t}\n\n\tvar count int64\n\terr = db.QueryRow(ctx, sql, args...).Scan(&count)\n\treturn int(count), err\n}\n"
  },
  {
    "path": "internal/service/scene/query.go",
    "content": "package scene\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\tsq \"github.com/Masterminds/squirrel\"\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\tqueryhelper \"github.com/stashapp/stash-box/internal/service/query\"\n)\n\nfunc (s *Scene) Query(ctx context.Context, input models.SceneQueryInput) ([]models.Scene, error) {\n\tuser := auth.GetCurrentUser(ctx)\n\n\tpsql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar)\n\tquery, err := s.buildSceneQuery(psql, input, user.ID, false)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn queryhelper.ExecuteQuery(ctx, query, s.queries.DB(), converter.SceneToModel, \"QueryScenes\")\n}\n\nfunc (s *Scene) QueryCount(ctx context.Context, input models.SceneQueryInput) (int, error) {\n\tuser := auth.GetCurrentUser(ctx)\n\n\tpsql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar)\n\n\t// Build the query selecting scenes.id (not doing a count yet)\n\t// This allows GROUP BY to work properly\n\tinnerQuery, err := s.buildSceneQuery(psql, input, user.ID, true)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Replace the SELECT with just scenes.id for the subquery\n\tinnerQuery = psql.Select(\"scenes.id\").FromSelect(innerQuery, \"scenes\")\n\n\t// Wrap in a COUNT query\n\tcountQuery := psql.Select(\"COUNT(*)\").FromSelect(innerQuery, \"subquery\")\n\n\treturn queryhelper.ExecuteCount(ctx, countQuery, s.queries.DB(), \"QueryScenesCount\")\n}\n\nfunc (s *Scene) buildSceneQuery(psql sq.StatementBuilderType, input models.SceneQueryInput, userID uuid.UUID, forCount bool) (sq.SelectBuilder, error) {\n\tquery := psql.Select(\"scenes.*\").From(\"scenes\")\n\n\t// Filter by URL\n\tif input.URL != nil && *input.URL != \"\" {\n\t\tquery = query.\n\t\t\tJoin(\"scene_urls ON scenes.id = scene_urls.scene_id\").\n\t\t\tWhere(sq.Eq{\"scene_urls.url\": *input.URL})\n\t}\n\n\t// Filter by parent studio\n\tif input.ParentStudio != nil {\n\t\tquery = query.\n\t\t\tJoin(\"studios ON scenes.studio_id = studios.id\").\n\t\t\tWhere(sq.Or{\n\t\t\t\tsq.Eq{\"studios.parent_studio_id\": *input.ParentStudio},\n\t\t\t\tsq.Eq{\"studios.id\": *input.ParentStudio},\n\t\t\t})\n\t}\n\n\t// Filter by performers\n\tif input.Performers != nil && len(input.Performers.Value) > 0 {\n\t\tif err := queryhelper.ApplyMultiIDCriterion(&query, \"scenes\", \"scene_performers\", \"scene_id\", \"performer_id\", input.Performers); err != nil {\n\t\t\treturn query, err\n\t\t}\n\t}\n\n\t// Filter by tags\n\tif input.Tags != nil && len(input.Tags.Value) > 0 {\n\t\tif err := queryhelper.ApplyMultiIDCriterion(&query, \"scenes\", \"scene_tags\", \"scene_id\", \"tag_id\", input.Tags); err != nil {\n\t\t\treturn query, err\n\t\t}\n\t}\n\n\t// Filter by fingerprints\n\tif input.Fingerprints != nil && len(input.Fingerprints.Value) > 0 {\n\t\tplaceholders := make([]string, len(input.Fingerprints.Value))\n\t\targs := make([]interface{}, len(input.Fingerprints.Value))\n\t\tfor i, hash := range input.Fingerprints.Value {\n\t\t\tplaceholders[i] = \"?\"\n\t\t\targs[i] = hash\n\t\t}\n\t\tquery = query.Join(fmt.Sprintf(`(\n\t\t\tSELECT scene_id\n\t\t\tFROM scene_fingerprints SFP\n\t\t\tJOIN fingerprints FP ON SFP.fingerprint_id = FP.id\n\t\t\tWHERE FP.hash IN (%s)\n\t\t\tGROUP BY scene_id\n\t\t) T ON scenes.id = T.scene_id`, strings.Join(placeholders, \",\")), args...)\n\t}\n\n\t// Filter by has fingerprint submissions\n\tif input.HasFingerprintSubmissions != nil && *input.HasFingerprintSubmissions {\n\t\tquery = query.Join(`(\n\t\t\tSELECT scene_id\n\t\t\tFROM scene_fingerprints\n\t\t\tWHERE user_id = ?\n\t\t\tGROUP BY scene_id\n\t\t) SFP ON scenes.id = SFP.scene_id`, userID)\n\t}\n\n\t// Filter by text (title and details)\n\tif input.Text != nil && *input.Text != \"\" {\n\t\tsearchTerm := \"%\" + *input.Text + \"%\"\n\t\tquery = query.Where(sq.Or{\n\t\t\tsq.ILike{\"scenes.title\": searchTerm},\n\t\t\tsq.ILike{\"scenes.details\": searchTerm},\n\t\t})\n\t}\n\n\t// Filter by title only\n\tif input.Title != nil && *input.Title != \"\" {\n\t\tsearchTerm := \"%\" + *input.Title + \"%\"\n\t\tquery = query.Where(sq.ILike{\"scenes.title\": searchTerm})\n\t}\n\n\t// Filter by studios\n\tif input.Studios != nil && len(input.Studios.Value) > 0 {\n\t\tswitch input.Studios.Modifier {\n\t\tcase models.CriterionModifierEquals:\n\t\t\tquery = query.Where(sq.Eq{\"scenes.studio_id\": input.Studios.Value[0]})\n\t\tcase models.CriterionModifierNotEquals:\n\t\t\tquery = query.Where(sq.NotEq{\"scenes.studio_id\": input.Studios.Value[0]})\n\t\tcase models.CriterionModifierIsNull:\n\t\t\tquery = query.Where(\"scenes.studio_id IS NULL\")\n\t\tcase models.CriterionModifierNotNull:\n\t\t\tquery = query.Where(\"scenes.studio_id IS NOT NULL\")\n\t\tcase models.CriterionModifierIncludes:\n\t\t\tquery = query.Where(sq.Eq{\"scenes.studio_id\": input.Studios.Value})\n\t\tcase models.CriterionModifierExcludes:\n\t\t\tquery = query.Where(sq.NotEq{\"scenes.studio_id\": input.Studios.Value})\n\t\tdefault:\n\t\t\treturn query, fmt.Errorf(\"unsupported modifier %s for scenes.studio_id\", input.Studios.Modifier)\n\t\t}\n\t}\n\n\t// Filter by date\n\tif input.Date != nil {\n\t\tswitch input.Date.Modifier {\n\t\tcase models.CriterionModifierEquals:\n\t\t\tquery = query.Where(sq.Eq{\"scenes.date\": input.Date.Value})\n\t\tcase models.CriterionModifierNotEquals:\n\t\t\tquery = query.Where(sq.NotEq{\"scenes.date\": input.Date.Value})\n\t\tcase models.CriterionModifierGreaterThan:\n\t\t\tquery = query.Where(sq.Gt{\"scenes.date\": input.Date.Value})\n\t\tcase models.CriterionModifierLessThan:\n\t\t\tquery = query.Where(sq.Lt{\"scenes.date\": input.Date.Value})\n\t\tcase models.CriterionModifierIsNull:\n\t\t\tquery = query.Where(\"scenes.date IS NULL\")\n\t\tcase models.CriterionModifierNotNull:\n\t\t\tquery = query.Where(\"scenes.date IS NOT NULL\")\n\t\tdefault:\n\t\t\treturn query, fmt.Errorf(\"unsupported modifier %s for scenes.date\", input.Date.Modifier)\n\t\t}\n\t}\n\n\t// Filter by favorites\n\tif input.Favorites != nil {\n\t\tvar clauses []string\n\t\tvar args []interface{}\n\n\t\tif *input.Favorites == models.FavoriteFilterPerformer || *input.Favorites == models.FavoriteFilterAll {\n\t\t\tclauses = append(clauses, `(\n\t\t\t\tSELECT scene_id FROM performer_favorites PF\n\t\t\t\tJOIN scene_performers SP ON PF.performer_id = SP.performer_id\n\t\t\t\tWHERE PF.user_id = ?\n\t\t\t)`)\n\t\t\targs = append(args, userID)\n\t\t}\n\t\tif *input.Favorites == models.FavoriteFilterStudio || *input.Favorites == models.FavoriteFilterAll {\n\t\t\tclauses = append(clauses, `(\n\t\t\t\tSELECT S.id FROM studio_favorites SF\n\t\t\t\tJOIN scenes S ON SF.studio_id = S.studio_id\n\t\t\t\tWHERE SF.user_id = ?\n\t\t\t)`)\n\t\t\targs = append(args, userID)\n\t\t}\n\n\t\tif len(clauses) > 0 {\n\t\t\tquery = query.Where(sq.Expr(\"scenes.id IN (\"+strings.Join(clauses, \" UNION \")+\")\", args...))\n\t\t}\n\t}\n\n\t// Only non-deleted scenes\n\tquery = query.Where(sq.Eq{\"scenes.deleted\": false})\n\n\t// Apply sort and pagination\n\tif input.Sort == models.SceneSortEnumTrending {\n\t\t// Check if we can optimize by limiting the trending subquery\n\t\t// This is only safe when there are no other filters applied\n\t\thasOtherFilters := input.URL != nil || input.ParentStudio != nil ||\n\t\t\t(input.Performers != nil && len(input.Performers.Value) > 0) ||\n\t\t\t(input.Tags != nil && len(input.Tags.Value) > 0) ||\n\t\t\t(input.Fingerprints != nil && len(input.Fingerprints.Value) > 0) ||\n\t\t\t(input.HasFingerprintSubmissions != nil && *input.HasFingerprintSubmissions) ||\n\t\t\t(input.Text != nil && *input.Text != \"\") ||\n\t\t\t(input.Title != nil && *input.Title != \"\") ||\n\t\t\t(input.Studios != nil && len(input.Studios.Value) > 0) ||\n\t\t\tinput.Date != nil || input.Favorites != nil\n\n\t\tif !hasOtherFilters && !forCount {\n\t\t\t// Optimize: limit the trending subquery directly\n\t\t\t// Note: Use manual pagination here since we're limiting in the subquery\n\t\t\tpage := 1\n\t\t\tperPage := 25\n\t\t\tif input.Page > 0 {\n\t\t\t\tpage = input.Page\n\t\t\t}\n\t\t\tif input.PerPage > 0 {\n\t\t\t\tperPage = input.PerPage\n\t\t\t}\n\t\t\toffset := (page - 1) * perPage\n\n\t\t\tquery = query.Join(fmt.Sprintf(`(\n\t\t\t\tSELECT scene_id, COUNT(*) AS count\n\t\t\t\tFROM scene_fingerprints\n\t\t\t\tWHERE created_at >= (now()::DATE - 7)\n\t\t\t\tGROUP BY scene_id\n\t\t\t\tORDER BY count DESC\n\t\t\t\tLIMIT %d OFFSET %d\n\t\t\t) TRENDING ON scenes.id = TRENDING.scene_id`, perPage, offset))\n\t\t\tquery = query.OrderBy(\"TRENDING.count DESC, TRENDING.scene_id DESC\")\n\t\t\t// Don't apply pagination again below since we already limited in the subquery\n\t\t} else {\n\t\t\t// Standard trending query without optimization\n\t\t\tquery = query.Join(`(\n\t\t\t\tSELECT scene_id, COUNT(*) AS count\n\t\t\t\tFROM scene_fingerprints\n\t\t\t\tWHERE created_at >= (now()::DATE - 7)\n\t\t\t\tGROUP BY scene_id\n\t\t\t) TRENDING ON scenes.id = TRENDING.scene_id`)\n\n\t\t\tif !forCount {\n\t\t\t\tquery = query.OrderBy(\"TRENDING.count DESC, TRENDING.scene_id DESC\")\n\t\t\t\tquery = queryhelper.ApplyPagination(query, input.Page, input.PerPage)\n\t\t\t}\n\t\t}\n\t} else if !forCount {\n\t\t// Only apply sorting for non-count queries\n\t\tsortField := \"title\"\n\t\tsortDir := \"ASC\"\n\t\tif input.Sort != \"\" {\n\t\t\tsortField = strings.ToLower(input.Sort.String())\n\t\t}\n\t\tif input.Direction != \"\" {\n\t\t\tsortDir = strings.ToUpper(input.Direction.String())\n\t\t}\n\n\t\tsecondary := \"title\"\n\t\tif input.Sort != models.SceneSortEnumTitle {\n\t\t\tsecondary = \"id\"\n\t\t}\n\t\tquery = query.OrderBy(fmt.Sprintf(\"scenes.%s %s, scenes.%s %s\", sortField, sortDir, secondary, sortDir))\n\t\tquery = queryhelper.ApplyPagination(query, input.Page, input.PerPage)\n\t}\n\n\treturn query, nil\n}\n"
  },
  {
    "path": "internal/service/scene/service.go",
    "content": "package scene\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/jackc/pgx/v5\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/internal/service/errutil\"\n)\n\n// Scene handles scene-related operations\ntype Scene struct {\n\tqueries *queries.Queries\n\twithTxn queries.WithTxnFunc\n}\n\n// NewScene creates a new scene service\nfunc NewScene(queries *queries.Queries, withTxn queries.WithTxnFunc) *Scene {\n\treturn &Scene{\n\t\tqueries: queries,\n\t\twithTxn: withTxn,\n\t}\n}\n\n// WithTxn executes a function within a transaction\nfunc (s *Scene) WithTxn(fn func(*queries.Queries) error) error {\n\treturn s.withTxn(fn)\n}\n\n// Queries\n\nfunc (s *Scene) FindByID(ctx context.Context, id uuid.UUID) (*models.Scene, error) {\n\tscene, err := s.queries.FindScene(ctx, id)\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\treturn converter.SceneToModelPtr(scene), nil\n}\n\nfunc (s *Scene) FindByURL(ctx context.Context, url string, limit int) ([]models.Scene, error) {\n\tscenes, err := s.queries.FindSceneByURL(ctx, queries.FindSceneByURLParams{\n\t\tUrl:   &url,\n\t\tLimit: int32(limit),\n\t})\n\treturn converter.ScenesToModels(scenes), err\n}\n\nfunc (s *Scene) FindScenesBySceneFingerprints(ctx context.Context, sceneFingerprints [][]models.FingerprintQueryInput) ([][]*models.Scene, error) {\n\tvar fingerprints []models.FingerprintQueryInput\n\tfor _, scene := range sceneFingerprints {\n\t\tfingerprints = append(fingerprints, scene...)\n\t}\n\n\tvar phashes []int64\n\tvar hashes []int64\n\n\tdistance := config.GetPHashDistance()\n\tfor _, fp := range fingerprints {\n\t\tif fp.Algorithm == models.FingerprintAlgorithmPhash && distance > 0 {\n\t\t\tphashes = append(phashes, fp.Hash.Int64())\n\t\t} else {\n\t\t\thashes = append(hashes, fp.Hash.Int64())\n\t\t}\n\t}\n\n\trows, err := s.queries.FindScenesByFullFingerprintsWithHash(ctx, queries.FindScenesByFullFingerprintsWithHashParams{\n\t\tPhashes:  phashes,\n\t\tHashes:   hashes,\n\t\tDistance: distance,\n\t})\n\tif err != nil || len(rows) == 0 {\n\t\treturn make([][]*models.Scene, len(sceneFingerprints)), err\n\t}\n\n\tsceneMap := make(map[models.FingerprintHash][]models.Scene)\n\tfor _, row := range rows {\n\t\tscene := converter.SceneToModel(row.Scene)\n\t\tsceneMap[models.FingerprintHash(row.Hash)] = append(sceneMap[models.FingerprintHash(row.Hash)], scene)\n\t}\n\n\t// Deduplicate list of scenes for each group of fingerprints\n\tvar result = make([][]*models.Scene, len(sceneFingerprints))\n\tfor i, fingerprints := range sceneFingerprints {\n\t\t// Track which scenes we've already added for this group to avoid duplicates\n\t\tseenScenes := make(map[string]bool)\n\t\tfor _, fp := range fingerprints {\n\t\t\tscenes, match := sceneMap[fp.Hash]\n\t\t\tif match {\n\t\t\t\t// Add all scenes that match this fingerprint\n\t\t\t\tfor _, scene := range scenes {\n\t\t\t\t\t// Only add the scene if we haven't already added it for this fingerprint group\n\t\t\t\t\tsceneID := scene.ID.String()\n\t\t\t\t\tif !seenScenes[sceneID] {\n\t\t\t\t\t\tsceneCopy := scene\n\t\t\t\t\t\tresult[i] = append(result[i], &sceneCopy)\n\t\t\t\t\t\tseenScenes[sceneID] = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result, nil\n}\n\nfunc (s *Scene) SearchScenesWithCount(ctx context.Context, term string, limit int, offset int) (*models.SceneQuery, error) {\n\trows, err := s.queries.SearchScenes(ctx, queries.SearchScenesParams{\n\t\tTerm:   &term,\n\t\tLimit:  int32(limit),\n\t\tOffset: int32(offset),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tids := make([]uuid.UUID, len(rows))\n\tfor i, row := range rows {\n\t\tids[i] = row.SceneID\n\t}\n\n\tscenePtrs, _ := s.LoadIds(ctx, ids)\n\tscenes := make([]models.Scene, 0, len(scenePtrs))\n\tfor _, scene := range scenePtrs {\n\t\tif scene != nil {\n\t\t\tscenes = append(scenes, *scene)\n\t\t}\n\t}\n\n\tcount := 0\n\tif len(rows) > 0 {\n\t\tcount = parseParadeDBCount(rows[0].TotalCount)\n\t}\n\n\treturn &models.SceneQuery{\n\t\tSearchResults: &models.SceneSearchResults{\n\t\t\tScenes: scenes,\n\t\t\tCount:  count,\n\t\t},\n\t}, nil\n}\n\ntype paradeDBCountResult struct {\n\tValue float64 `json:\"value\"`\n}\n\nfunc parseParadeDBCount(raw any) int {\n\tif raw == nil {\n\t\treturn 0\n\t}\n\tjsonBytes, err := json.Marshal(raw)\n\tif err != nil {\n\t\treturn 0\n\t}\n\tvar result paradeDBCountResult\n\tif err := json.Unmarshal(jsonBytes, &result); err != nil {\n\t\treturn 0\n\t}\n\treturn int(result.Value)\n}\n\nfunc (s *Scene) CountByPerformer(ctx context.Context, performerID uuid.UUID) (int, error) {\n\tcount, err := s.queries.CountScenesByPerformer(ctx, performerID)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"failed to count scenes by performer: %w\", err)\n\t}\n\treturn int(count), nil\n}\n\nfunc (s *Scene) GetPerformers(ctx context.Context, sceneID uuid.UUID) ([]models.PerformerAppearance, error) {\n\tperformers, err := s.queries.GetScenePerformers(ctx, sceneID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar result []models.PerformerAppearance\n\tfor _, row := range performers {\n\t\tresult = append(result, models.PerformerAppearance{\n\t\t\tPerformer: converter.PerformerToModelPtr(row.Performer),\n\t\t\tAs:        row.As,\n\t\t})\n\t}\n\treturn result, nil\n}\n\nfunc (s *Scene) GetTags(ctx context.Context, sceneID uuid.UUID) ([]models.Tag, error) {\n\tdbTags, err := s.queries.GetSceneTags(ctx, sceneID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar tags []models.Tag\n\tfor _, tag := range dbTags {\n\t\ttags = append(tags, converter.TagToModel(tag))\n\t}\n\treturn tags, nil\n}\n\nfunc (s *Scene) GetURLs(ctx context.Context, sceneID uuid.UUID) ([]models.URL, error) {\n\turls, err := s.queries.GetSceneURLs(ctx, sceneID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar result []models.URL\n\tfor _, url := range urls {\n\t\tresult = append(result, models.URL{\n\t\t\tURL:    url.Url,\n\t\t\tSiteID: url.SiteID,\n\t\t})\n\t}\n\treturn result, nil\n}\n\nfunc (s *Scene) GetFingerprints(ctx context.Context, sceneID uuid.UUID) ([]models.Fingerprint, error) {\n\tfingerprints, err := s.queries.GetAllSceneFingerprints(ctx, sceneID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar result []models.Fingerprint\n\tfor _, fp := range fingerprints {\n\t\tresult = append(result, models.Fingerprint{\n\t\t\tHash:      models.FingerprintHash(fp.Hash),\n\t\t\tAlgorithm: models.FingerprintAlgorithm(fp.Algorithm),\n\t\t\tDuration:  int(fp.Duration),\n\t\t\tCreated:   fp.CreatedAt,\n\t\t})\n\t}\n\treturn result, nil\n}\n\n// Dataloader for fingerprints for multiple scenes\nfunc (s *Scene) LoadFingerprints(ctx context.Context, currentUserID uuid.UUID, ids []uuid.UUID, onlySubmitted bool) ([][]models.Fingerprint, []error) {\n\tif len(ids) == 0 {\n\t\treturn make([][]models.Fingerprint, 0), nil\n\t}\n\n\t// Prepare parameters for the query\n\tvar filterUserID uuid.NullUUID\n\tif onlySubmitted {\n\t\tfilterUserID = uuid.NullUUID{UUID: currentUserID, Valid: true}\n\t}\n\n\tparams := queries.GetAllFingerprintsParams{\n\t\tCurrentUserID: currentUserID, // Always pass for user_submitted/user_reported checks\n\t\tSceneIds:      ids,           // Scene IDs to query\n\t\tFilterUserID:  filterUserID,  // Pass user ID when filtering, nil UUID when not\n\t}\n\n\trows, err := s.queries.GetAllFingerprints(ctx, params)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\t// Group results by scene ID\n\tm := make(map[uuid.UUID][]models.Fingerprint)\n\tfor _, row := range rows {\n\t\t// Convert the database row to models.Fingerprint\n\t\tfp := models.Fingerprint{\n\t\t\tHash:          models.FingerprintHash(row.Hash),\n\t\t\tAlgorithm:     models.FingerprintAlgorithm(row.Algorithm),\n\t\t\tDuration:      row.Duration,\n\t\t\tSubmissions:   int(row.Submissions),\n\t\t\tReports:       int(row.Reports),\n\t\t\tUserSubmitted: row.UserSubmitted,\n\t\t\tUserReported:  row.UserReported,\n\t\t\tCreated:       row.CreatedAt,\n\t\t\tUpdated:       row.UpdatedAt,\n\t\t}\n\n\t\tm[row.SceneID] = append(m[row.SceneID], fp)\n\t}\n\n\t// Build result in the same order as input IDs\n\tresult := make([][]models.Fingerprint, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\n\treturn result, nil\n}\n\n// Dataloader for performer appearances for multiple scenes\nfunc (s *Scene) LoadAppearances(ctx context.Context, ids []uuid.UUID) ([][]models.PerformerScene, []error) {\n\tif len(ids) == 0 {\n\t\treturn make([][]models.PerformerScene, 0), nil\n\t}\n\n\tappearances, err := s.queries.FindSceneAppearancesByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\t// Group results by scene ID\n\tm := make(map[uuid.UUID][]models.PerformerScene)\n\tfor _, appearance := range appearances {\n\t\tperformerScene := models.PerformerScene{\n\t\t\tPerformerID: appearance.PerformerID,\n\t\t\tAs:          appearance.As,\n\t\t}\n\t\tm[appearance.SceneID] = append(m[appearance.SceneID], performerScene)\n\t}\n\n\t// Build result in the same order as input IDs\n\tresult := make([][]models.PerformerScene, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\n\treturn result, nil\n}\n\n// Dataloader for URLs for multiple scenes\nfunc (s *Scene) LoadURLs(ctx context.Context, ids []uuid.UUID) ([][]models.URL, []error) {\n\tif len(ids) == 0 {\n\t\treturn make([][]models.URL, 0), nil\n\t}\n\n\turls, err := s.queries.FindSceneUrlsByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\t// Group results by scene ID\n\tm := make(map[uuid.UUID][]models.URL)\n\tfor _, url := range urls {\n\t\turlModel := models.URL{\n\t\t\tURL:    url.Url,\n\t\t\tSiteID: url.SiteID,\n\t\t}\n\t\tm[url.SceneID] = append(m[url.SceneID], urlModel)\n\t}\n\n\t// Build result in the same order as input IDs\n\tresult := make([][]models.URL, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\n\treturn result, nil\n}\n\n// Mutations\n\nfunc (s *Scene) Create(ctx context.Context, input models.SceneCreateInput) (*models.Scene, error) {\n\tid, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Populate a new scene from the input\n\tnewScene := converter.SceneCreateInputToScene(input)\n\tnewScene.ID = id\n\n\tvar scene models.Scene\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tdbScene, err := tx.CreateScene(ctx, converter.SceneToCreateParams(newScene))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tscene = converter.SceneToModel(dbScene)\n\n\t\t// Save the fingerprints\n\t\tif err := createFingerprints(ctx, tx, newScene.ID, input.Fingerprints); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// save the performers\n\t\tif err := createPerformers(ctx, tx, scene.ID, input.Performers); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the URLs\n\t\tif err := createURLs(ctx, tx, scene.ID, input.Urls); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the tags\n\t\tif err := createTags(ctx, tx, scene.ID, input.TagIds); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the images\n\t\treturn createImages(ctx, tx, scene.ID, input.ImageIds)\n\t})\n\n\treturn &scene, err\n}\n\nfunc (s *Scene) Update(ctx context.Context, input models.SceneUpdateInput) (*models.Scene, error) {\n\t// Get the existing scene and modify it\n\tdbScene, err := s.queries.FindScene(ctx, input.ID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tupdatedScene := converter.SceneToModel(dbScene)\n\n\t// Populate scene from the input\n\tconverter.UpdateSceneFromUpdateInput(&updatedScene, input)\n\n\tif err := s.withTxn(func(tx *queries.Queries) error {\n\t\tscene, err := tx.UpdateScene(ctx, converter.SceneToUpdateParams(updatedScene))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the checksums\n\t\tuserID := auth.GetCurrentUser(ctx).ID\n\t\tif err := updateFingerprints(ctx, tx, scene.ID, userID, input.Fingerprints); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := updatePerformers(ctx, tx, scene.ID, input.Performers); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the tags\n\t\tif err := updateTags(ctx, tx, scene.ID, input.TagIds); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the URLs\n\t\tif err := updateURLs(ctx, tx, scene.ID, input.Urls); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the images\n\t\treturn updateImages(ctx, tx, scene.ID, input.ImageIds)\n\t}); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &updatedScene, nil\n}\n\nfunc (s *Scene) Delete(ctx context.Context, id uuid.UUID) error {\n\treturn s.queries.DeleteScene(ctx, id)\n}\n\nfunc (s *Scene) SubmitFingerprint(ctx context.Context, input models.FingerprintSubmission) (bool, error) {\n\t// Find the scene\n\tdbScene, err := s.queries.FindScene(ctx, input.SceneID)\n\n\tif err != nil || dbScene.Deleted {\n\t\t// FIXME: this should error out, but due to the use-case in Stash,\n\t\t//       it will stop submitting fingerprints if a single one fails\n\t\t//       see https://github.com/stashapp/stash/blob/v0.16.1/pkg/scraper/stashbox/stash_box.go#L254-L257\n\t\treturn true, nil\n\t\t// return false, fmt.Errorf(\"scene is deleted, unable to submit fingerprint\")\n\t}\n\n\t// if no user is set, or if the current user does not have the modify\n\t// role, then set users to the current user\n\tif len(input.Fingerprint.UserIds) == 0 || !auth.IsRole(ctx, models.RoleEnumModify) {\n\t\tcurrentUserID := auth.GetCurrentUser(ctx).ID\n\t\tinput.Fingerprint.UserIds = []uuid.UUID{currentUserID}\n\t}\n\n\t// set the default vote\n\tvote := models.FingerprintSubmissionTypeValid\n\tif input.Vote != nil {\n\t\tvote = *input.Vote\n\t}\n\n\t// if the user is reporting a fingerprint, ensure that the fingerprint has at least one submission\n\tif vote == models.FingerprintSubmissionTypeInvalid {\n\t\tsubmissionExists, err := s.queries.SubmittedHashExists(ctx, queries.SubmittedHashExistsParams{\n\t\t\tSceneID:   input.SceneID,\n\t\t\tHash:      input.Fingerprint.Hash.Int64(),\n\t\t\tAlgorithm: input.Fingerprint.Algorithm.String(),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn false, err\n\t\t}\n\n\t\tif !submissionExists {\n\t\t\treturn false, errors.New(\"fingerprint has no submissions\")\n\t\t}\n\t}\n\n\tvoteInt := submissionTypeToInt(vote)\n\tsceneFingerprint := createSubmittedSceneFingerprints(input.SceneID, []models.FingerprintInput{*input.Fingerprint}, voteInt)\n\n\t// vote == 0 means the user is unmatching the fingerprint\n\t// Unmatch is the deprecated field, but we still need to support it\n\tunmatch := vote == models.FingerprintSubmissionTypeRemove || (input.Unmatch != nil && *input.Unmatch)\n\n\tif !unmatch {\n\t\t// set the new fingerprints\n\t\tfor _, fp := range sceneFingerprint {\n\t\t\tid, err := getOrCreateFingerprint(ctx, s.queries, fp.Hash, fp.Algorithm)\n\t\t\tif err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\t\t\tif err := s.queries.CreateOrReplaceFingerprint(ctx, queries.CreateOrReplaceFingerprintParams{\n\t\t\t\tFingerprintID: int(id),\n\t\t\t\tSceneID:       fp.SceneID,\n\t\t\t\tUserID:        fp.UserID,\n\t\t\t\tDuration:      fp.Duration,\n\t\t\t\tVote:          int16(voteInt),\n\t\t\t}); err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// remove fingerprints that match the user id, algorithm and hash\n\t\tfor _, fp := range sceneFingerprint {\n\t\t\tif err := s.queries.DeleteSceneFingerprint(ctx, queries.DeleteSceneFingerprintParams{\n\t\t\t\tHash:      fp.Hash.Int64(),\n\t\t\t\tAlgorithm: fp.Algorithm,\n\t\t\t\tUserID:    fp.UserID,\n\t\t\t\tSceneID:   fp.SceneID,\n\t\t\t}); err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true, nil\n}\n\nfunc (s *Scene) SubmitFingerprints(ctx context.Context, inputs []models.FingerprintBatchSubmission) ([]models.FingerprintSubmissionResult, error) {\n\tresults := make([]models.FingerprintSubmissionResult, len(inputs))\n\n\t// Extract unique scene IDs for batch validation\n\tsceneIDMap := make(map[uuid.UUID]bool)\n\tfor _, input := range inputs {\n\t\tsceneIDMap[input.SceneID] = true\n\t}\n\tsceneIDs := make([]uuid.UUID, 0, len(sceneIDMap))\n\tfor sceneID := range sceneIDMap {\n\t\tsceneIDs = append(sceneIDs, sceneID)\n\t}\n\n\t// Get current user\n\tcurrentUserID := auth.GetCurrentUser(ctx).ID\n\n\t// Wrap all database operations in a transaction\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\t// Batch fetch scenes\n\t\tscenes, err := tx.GetScenes(ctx, sceneIDs)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Create map of valid scene IDs (not deleted)\n\t\tsceneExists := make(map[uuid.UUID]bool)\n\t\tfor _, scene := range scenes {\n\t\t\tif !scene.Deleted {\n\t\t\t\tsceneExists[scene.ID] = true\n\t\t\t}\n\t\t}\n\n\t\t// Collect all valid fingerprints and prepare for batch operations\n\t\ttype fingerprintEntry struct {\n\t\t\thash      models.FingerprintHash\n\t\t\talgorithm string\n\t\t\tsceneID   uuid.UUID\n\t\t\tuserID    uuid.UUID\n\t\t\tduration  int\n\t\t\tinputIdx  int\n\t\t}\n\n\t\tvar validFingerprints []fingerprintEntry\n\n\t\t// First pass: validate and collect fingerprints\n\t\tfor i, input := range inputs {\n\t\t\tresult := models.FingerprintSubmissionResult{\n\t\t\t\tHash:    input.Hash,\n\t\t\t\tSceneID: input.SceneID,\n\t\t\t}\n\n\t\t\t// Skip if scene doesn't exist or is deleted\n\t\t\tif !sceneExists[input.SceneID] {\n\t\t\t\terrMsg := \"invalid or deleted scene\"\n\t\t\t\tresult.Error = &errMsg\n\t\t\t\tresults[i] = result\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Skip if duration is not valid\n\t\t\tif input.Duration <= 0 {\n\t\t\t\terrMsg := \"duration must be greater than 0\"\n\t\t\t\tresult.Error = &errMsg\n\t\t\t\tresults[i] = result\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tvalidFingerprints = append(validFingerprints, fingerprintEntry{\n\t\t\t\thash:      input.Hash,\n\t\t\t\talgorithm: input.Algorithm.String(),\n\t\t\t\tsceneID:   input.SceneID,\n\t\t\t\tuserID:    currentUserID,\n\t\t\t\tduration:  input.Duration,\n\t\t\t\tinputIdx:  i,\n\t\t\t})\n\n\t\t\t// Initialize result as success (will be set to error if insert fails)\n\t\t\tresults[i] = result\n\t\t}\n\n\t\t// If no valid fingerprints, return early\n\t\tif len(validFingerprints) == 0 {\n\t\t\treturn nil\n\t\t}\n\n\t\t// Insert fingerprints one by one\n\t\tfor _, fp := range validFingerprints {\n\t\t\tfingerprintID, err := getOrCreateFingerprint(ctx, tx, fp.hash, fp.algorithm)\n\t\t\tif err != nil {\n\t\t\t\terrMsg := err.Error()\n\t\t\t\tresults[fp.inputIdx].Error = &errMsg\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif err := tx.CreateOrReplaceFingerprint(ctx, queries.CreateOrReplaceFingerprintParams{\n\t\t\t\tFingerprintID: fingerprintID,\n\t\t\t\tSceneID:       fp.sceneID,\n\t\t\t\tUserID:        fp.userID,\n\t\t\t\tDuration:      fp.duration,\n\t\t\t\tVote:          1,\n\t\t\t}); err != nil {\n\t\t\t\terrMsg := err.Error()\n\t\t\t\tresults[fp.inputIdx].Error = &errMsg\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn results, nil\n}\n\nfunc (s *Scene) MoveFingerprintSubmissions(ctx context.Context, input models.MoveFingerprintSubmissionsInput) error {\n\treturn s.withTxn(func(txnQueries *queries.Queries) error {\n\t\t// Validate source scene exists and is not deleted\n\t\tsourceScene, err := txnQueries.FindScene(ctx, input.SourceSceneID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"source scene not found: %w\", err)\n\t\t}\n\t\tif sourceScene.Deleted {\n\t\t\treturn fmt.Errorf(\"source scene is deleted\")\n\t\t}\n\n\t\t// Validate target scene exists and is not deleted\n\t\ttargetScene, err := txnQueries.FindScene(ctx, input.TargetSceneID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"target scene not found: %w\", err)\n\t\t}\n\t\tif targetScene.Deleted {\n\t\t\treturn fmt.Errorf(\"target scene is deleted\")\n\t\t}\n\n\t\t// Move each fingerprint\n\t\tfor _, fp := range input.Fingerprints {\n\t\t\trowsAffected, err := txnQueries.MoveSceneFingerprintSubmissions(ctx, queries.MoveSceneFingerprintSubmissionsParams{\n\t\t\t\tHash:          fp.Hash.Int64(),\n\t\t\t\tAlgorithm:     fp.Algorithm.String(),\n\t\t\t\tTargetSceneID: input.TargetSceneID,\n\t\t\t\tSourceSceneID: input.SourceSceneID,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to move fingerprint %s (%s): %w\", fp.Hash.Hex(), fp.Algorithm, err)\n\t\t\t}\n\t\t\tif rowsAffected == 0 {\n\t\t\t\treturn fmt.Errorf(\"fingerprint %s (%s) not found on source scene\", fp.Hash.Hex(), fp.Algorithm)\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n}\n\nfunc (s *Scene) DeleteFingerprintSubmissions(ctx context.Context, input models.DeleteFingerprintSubmissionsInput) error {\n\treturn s.withTxn(func(txnQueries *queries.Queries) error {\n\t\t// Validate scene exists and is not deleted\n\t\tscene, err := txnQueries.FindScene(ctx, input.SceneID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"scene not found: %w\", err)\n\t\t}\n\t\tif scene.Deleted {\n\t\t\treturn fmt.Errorf(\"scene is deleted\")\n\t\t}\n\n\t\t// Delete submissions for each fingerprint\n\t\tfor _, fp := range input.Fingerprints {\n\t\t\trowsAffected, err := txnQueries.DeleteAllSceneFingerprintSubmissions(ctx, queries.DeleteAllSceneFingerprintSubmissionsParams{\n\t\t\t\tHash:      fp.Hash.Int64(),\n\t\t\t\tAlgorithm: fp.Algorithm.String(),\n\t\t\t\tSceneID:   input.SceneID,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to delete fingerprint submissions %s (%s): %w\", fp.Hash.Hex(), fp.Algorithm, err)\n\t\t\t}\n\t\t\tif rowsAffected == 0 {\n\t\t\t\treturn fmt.Errorf(\"fingerprint %s (%s) not found on scene\", fp.Hash.Hex(), fp.Algorithm)\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n}\n\nfunc (s *Scene) FindExistingScenes(ctx context.Context, input models.QueryExistingSceneInput) ([]models.Scene, error) {\n\tvar hashes []int64\n\tvar studioID uuid.NullUUID\n\n\tif input.StudioID != nil {\n\t\tstudioID = uuid.NullUUID{UUID: *input.StudioID, Valid: true}\n\t}\n\tfor _, fp := range input.Fingerprints {\n\t\thashes = append(hashes, fp.Hash.Int64())\n\t}\n\n\tscenes, err := s.queries.FindExistingScenes(ctx, queries.FindExistingScenesParams{\n\t\tHashes:   hashes,\n\t\tTitle:    input.Title,\n\t\tStudioID: studioID,\n\t})\n\n\treturn converter.ScenesToModels(scenes), err\n}\n\nfunc submissionTypeToInt(t models.FingerprintSubmissionType) int {\n\tswitch t {\n\tcase models.FingerprintSubmissionTypeValid:\n\t\treturn 1\n\tcase models.FingerprintSubmissionTypeInvalid:\n\t\treturn -1\n\tdefault:\n\t\treturn 0\n\t}\n}\n\nfunc createSubmittedSceneFingerprints(sceneID uuid.UUID, fingerprints []models.FingerprintInput, vote int) []models.SceneFingerprint {\n\tvar ret []models.SceneFingerprint\n\n\tfor _, fingerprint := range fingerprints {\n\t\tif fingerprint.Duration > 0 {\n\t\t\tfor _, userID := range fingerprint.UserIds {\n\t\t\t\tret = append(ret, models.SceneFingerprint{\n\t\t\t\t\tSceneID:   sceneID,\n\t\t\t\t\tUserID:    userID,\n\t\t\t\t\tHash:      fingerprint.Hash,\n\t\t\t\t\tAlgorithm: fingerprint.Algorithm.String(),\n\t\t\t\t\tDuration:  fingerprint.Duration,\n\t\t\t\t\tVote:      vote,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc createFingerprints(ctx context.Context, tx *queries.Queries, sceneID uuid.UUID, fingerprints []models.FingerprintEditInput) error {\n\tvar params []queries.CreateSceneFingerprintsParams\n\tuser := auth.GetCurrentUser(ctx)\n\n\tfor _, fp := range fingerprints {\n\t\tid, err := getOrCreateFingerprint(ctx, tx, fp.Hash, fp.Algorithm.String())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// if no user is set, or if the current user does not have the modify\n\t\t// role, then set users to the current user\n\t\tuserIDs := fp.UserIds\n\t\tif len(userIDs) == 0 || !auth.IsRole(ctx, models.RoleEnumModify) {\n\t\t\tuserIDs = []uuid.UUID{user.ID}\n\t\t}\n\n\t\tfor _, userID := range userIDs {\n\t\t\tparams = append(params, queries.CreateSceneFingerprintsParams{\n\t\t\t\tUserID:        userID,\n\t\t\t\tSceneID:       sceneID,\n\t\t\t\tFingerprintID: int(id),\n\t\t\t\tDuration:      fp.Duration,\n\t\t\t})\n\t\t}\n\t}\n\t_, err := tx.CreateSceneFingerprints(ctx, params)\n\treturn err\n}\n\nfunc updateFingerprints(ctx context.Context, tx *queries.Queries, sceneID uuid.UUID, userID uuid.UUID, fingerprints []models.FingerprintEditInput) error {\n\tif err := tx.DeleteSceneFingerprintsByScene(ctx, sceneID); err != nil {\n\t\treturn err\n\t}\n\n\tdbFingerprints, err := tx.GetAllSceneFingerprints(ctx, sceneID)\n\tif err != nil && !errors.Is(err, pgx.ErrNoRows) {\n\t\treturn err\n\t}\n\n\tvar existingFingerprints []models.SceneFingerprint\n\tfor _, fp := range dbFingerprints {\n\t\texistingFingerprints = append(existingFingerprints, models.SceneFingerprint{\n\t\t\tSceneID:   sceneID,\n\t\t\tUserID:    fp.UserID,\n\t\t\tHash:      models.FingerprintHash(fp.Hash),\n\t\t\tAlgorithm: fp.Algorithm,\n\t\t\tDuration:  int(fp.Duration),\n\t\t\tCreatedAt: fp.CreatedAt,\n\t\t})\n\t}\n\n\tuser := auth.GetCurrentUser(ctx)\n\tsceneFingerprints := createUpdatedSceneFingerprints(sceneID, existingFingerprints, fingerprints, user.ID)\n\n\tvar params []queries.CreateSceneFingerprintsParams\n\tfor _, fp := range sceneFingerprints {\n\t\tid, err := getOrCreateFingerprint(ctx, tx, fp.Hash, fp.Algorithm)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tparams = append(params, queries.CreateSceneFingerprintsParams{\n\t\t\tUserID:        fp.UserID,\n\t\t\tSceneID:       sceneID,\n\t\t\tFingerprintID: int(id),\n\t\t\tDuration:      fp.Duration,\n\t\t})\n\t}\n\t_, err = tx.CreateSceneFingerprints(ctx, params)\n\treturn err\n}\n\nfunc createPerformers(ctx context.Context, tx *queries.Queries, sceneID uuid.UUID, performers []models.PerformerAppearanceInput) error {\n\tvar params []queries.CreateScenePerformersParams\n\tfor _, performer := range performers {\n\t\tparam := queries.CreateScenePerformersParams{\n\t\t\tSceneID:     sceneID,\n\t\t\tPerformerID: performer.PerformerID,\n\t\t\tAs:          performer.As,\n\t\t}\n\n\t\tparams = append(params, param)\n\t}\n\t_, err := tx.CreateScenePerformers(ctx, params)\n\treturn err\n}\n\nfunc updatePerformers(ctx context.Context, tx *queries.Queries, sceneID uuid.UUID, performers []models.PerformerAppearanceInput) error {\n\tif err := tx.DeleteScenePerformers(ctx, sceneID); err != nil {\n\t\treturn err\n\t}\n\treturn createPerformers(ctx, tx, sceneID, performers)\n}\n\nfunc createURLs(ctx context.Context, tx *queries.Queries, sceneID uuid.UUID, urls []models.URL) error {\n\tvar params []queries.CreateSceneURLsParams\n\tfor _, url := range urls {\n\t\tparams = append(params, queries.CreateSceneURLsParams{\n\t\t\tSceneID: sceneID,\n\t\t\tUrl:     url.URL,\n\t\t\tSiteID:  url.SiteID,\n\t\t})\n\t}\n\t_, err := tx.CreateSceneURLs(ctx, params)\n\treturn err\n}\n\nfunc updateURLs(ctx context.Context, tx *queries.Queries, sceneID uuid.UUID, urls []models.URL) error {\n\tif err := tx.DeleteSceneURLs(ctx, sceneID); err != nil {\n\t\treturn err\n\t}\n\treturn createURLs(ctx, tx, sceneID, urls)\n}\n\nfunc createImages(ctx context.Context, tx *queries.Queries, sceneID uuid.UUID, images []uuid.UUID) error {\n\tvar params []queries.CreateSceneImagesParams\n\tfor _, image := range images {\n\t\tparams = append(params, queries.CreateSceneImagesParams{\n\t\t\tSceneID: sceneID,\n\t\t\tImageID: image,\n\t\t})\n\t}\n\n\t_, err := tx.CreateSceneImages(ctx, params)\n\treturn err\n}\n\nfunc updateImages(ctx context.Context, tx *queries.Queries, sceneID uuid.UUID, images []uuid.UUID) error {\n\t// TODO Remove unused images\n\tif err := tx.DeleteSceneImages(ctx, sceneID); err != nil {\n\t\treturn err\n\t}\n\treturn createImages(ctx, tx, sceneID, images)\n}\n\nfunc createTags(ctx context.Context, tx *queries.Queries, sceneID uuid.UUID, tags []uuid.UUID) error {\n\tvar params []queries.CreateSceneTagsParams\n\tfor _, tag := range tags {\n\t\tparams = append(params, queries.CreateSceneTagsParams{\n\t\t\tSceneID: sceneID,\n\t\t\tTagID:   tag,\n\t\t})\n\t}\n\n\t_, err := tx.CreateSceneTags(ctx, params)\n\treturn err\n}\n\nfunc updateTags(ctx context.Context, tx *queries.Queries, sceneID uuid.UUID, tags []uuid.UUID) error {\n\tif err := tx.DeleteSceneTagsByScene(ctx, sceneID); err != nil {\n\t\treturn err\n\t}\n\treturn createTags(ctx, tx, sceneID, tags)\n}\n\nfunc createUpdatedSceneFingerprints(sceneID uuid.UUID, original []models.SceneFingerprint, updated []models.FingerprintEditInput, currentUserID uuid.UUID) []models.SceneFingerprint {\n\tvar ret []models.SceneFingerprint\n\n\t// hashes present are kept - use existing users\n\t// hashes missing are destroyed\n\tfor _, o := range original {\n\t\tfor _, u := range updated {\n\t\t\tif isSameHash(o, u) {\n\t\t\t\tret = append(ret, o)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// new hashes are created and assigned to the current user\n\tfor _, u := range updated {\n\t\tfound := false\n\t\tfor _, o := range original {\n\t\t\tif isSameHash(o, u) {\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif !found {\n\t\t\tif len(u.UserIds) == 0 {\n\t\t\t\tu.UserIds = []uuid.UUID{currentUserID}\n\t\t\t}\n\t\t\tif u.Duration > 0 {\n\t\t\t\tfor _, userID := range u.UserIds {\n\t\t\t\t\tret = append(ret, models.SceneFingerprint{\n\t\t\t\t\t\tSceneID:   sceneID,\n\t\t\t\t\t\tUserID:    userID,\n\t\t\t\t\t\tHash:      u.Hash,\n\t\t\t\t\t\tAlgorithm: u.Algorithm.String(),\n\t\t\t\t\t\tDuration:  u.Duration,\n\t\t\t\t\t\tCreatedAt: u.Created,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ret\n}\n\nfunc getOrCreateFingerprint(ctx context.Context, tx *queries.Queries, hash models.FingerprintHash, algorithm string) (int, error) {\n\t// Try to get FP\n\tdbFP, err := tx.GetFingerprint(ctx, queries.GetFingerprintParams{\n\t\tHash:      hash.Int64(),\n\t\tAlgorithm: algorithm,\n\t})\n\tif err != nil {\n\t\t// If err, try to create FP instead\n\t\tdbFP, err = tx.CreateFingerprint(ctx, queries.CreateFingerprintParams{\n\t\t\tHash:      hash.Int64(),\n\t\t\tAlgorithm: algorithm,\n\t\t})\n\t}\n\n\treturn dbFP.ID, err\n}\n\nfunc isSameHash(f models.SceneFingerprint, ff models.FingerprintEditInput) bool {\n\treturn f.Algorithm == ff.Algorithm.String() && f.Hash == ff.Hash\n}\n\nfunc (s *Scene) LoadIds(ctx context.Context, ids []uuid.UUID) ([]*models.Scene, []error) {\n\tscenes, err := s.queries.GetScenes(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tresult := make([]*models.Scene, len(ids))\n\tsceneMap := make(map[uuid.UUID]*models.Scene)\n\n\tfor _, scene := range scenes {\n\t\tsceneMap[scene.ID] = converter.SceneToModelPtr(scene)\n\t}\n\n\tfor i, id := range ids {\n\t\tresult[i] = sceneMap[id]\n\t}\n\n\treturn result, make([]error, len(ids))\n}\n"
  },
  {
    "path": "internal/service/site/query.go",
    "content": "package site\n\nimport (\n\t\"context\"\n\n\tsq \"github.com/Masterminds/squirrel\"\n\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\tqueryhelper \"github.com/stashapp/stash-box/internal/service/query\"\n)\n\nfunc (s *Site) Query(ctx context.Context) ([]models.Site, int, error) {\n\tpsql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar)\n\tquery := psql.Select(\"*\").From(\"sites\").OrderBy(\"name ASC\")\n\n\t// Get count\n\tcountQuery := psql.Select(\"COUNT(*)\").From(\"sites\")\n\tcount, err := queryhelper.ExecuteCount(ctx, countQuery, s.queries.DB(), \"QuerySitesCount\")\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\t// Execute query\n\tsites, err := queryhelper.ExecuteQuery(ctx, query, s.queries.DB(), converter.SiteToModel, \"QuerySites\")\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\treturn sites, count, nil\n}\n"
  },
  {
    "path": "internal/service/site/service.go",
    "content": "package site\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/internal/service/errutil\"\n)\n\n// Site handles site-related operations\ntype Site struct {\n\tqueries *queries.Queries\n\twithTxn queries.WithTxnFunc\n}\n\n// NewSite creates a new site service\nfunc NewSite(queries *queries.Queries, withTxn queries.WithTxnFunc) *Site {\n\treturn &Site{\n\t\tqueries: queries,\n\t\twithTxn: withTxn,\n\t}\n}\n\n// WithTxn executes a function within a transaction\nfunc (s *Site) WithTxn(fn func(*queries.Queries) error) error {\n\treturn s.withTxn(fn)\n}\n\n// Create creates a new site\nfunc (s *Site) Create(ctx context.Context, input models.SiteCreateInput) (*models.Site, error) {\n\tid, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tnewSite := converter.SiteCreateInputToSite(input)\n\tnewSite.ID = id\n\n\tvar site *models.Site\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tdbSite, err := tx.CreateSite(ctx, converter.SiteToCreateParams(newSite))\n\t\tsite = converter.SiteToModelPtr(dbSite)\n\n\t\treturn err\n\t})\n\n\treturn site, err\n\n}\n\n// Update updates an existing site\nfunc (s *Site) Update(ctx context.Context, input models.SiteUpdateInput) (*models.Site, error) {\n\tvar site *models.Site\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\tdbSite, err := tx.GetSite(ctx, input.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tupdatedSite := converter.SiteToModel(dbSite)\n\t\tconverter.UpdateSiteFromUpdateInput(&updatedSite, input)\n\n\t\tdbSite, err = tx.UpdateSite(ctx, converter.SiteToUpdateParams(updatedSite))\n\t\tsite = converter.SiteToModelPtr(dbSite)\n\n\t\treturn err\n\t})\n\n\treturn site, err\n}\n\n// Destroy deletes a site by ID\nfunc (s *Site) Destroy(ctx context.Context, id uuid.UUID) error {\n\treturn s.queries.DeleteSite(ctx, id)\n}\n\n// Find finds a site by ID\nfunc (s *Site) GetByID(ctx context.Context, id uuid.UUID) (*models.Site, error) {\n\tsite, err := s.queries.GetSite(ctx, id)\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\treturn converter.SiteToModelPtr(site), nil\n}\n\n// Dataloader methods\n\nfunc (s *Site) LoadIds(ctx context.Context, ids []uuid.UUID) ([]*models.Site, []error) {\n\tsites, err := s.queries.FindSitesByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tresult := make([]*models.Site, len(ids))\n\tsiteMap := make(map[uuid.UUID]*models.Site)\n\n\tfor _, site := range sites {\n\t\tsiteMap[site.ID] = converter.SiteToModelPtr(site)\n\t}\n\n\tfor i, id := range ids {\n\t\tresult[i] = siteMap[id]\n\t}\n\n\treturn result, make([]error, len(ids))\n}\n"
  },
  {
    "path": "internal/service/studio/query.go",
    "content": "package studio\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\tsq \"github.com/Masterminds/squirrel\"\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\tqueryhelper \"github.com/stashapp/stash-box/internal/service/query\"\n)\n\nfunc (s *Studio) Query(ctx context.Context, input models.StudioQueryInput) (*models.QueryStudiosResultType, error) {\n\tuser := auth.GetCurrentUser(ctx)\n\n\tpsql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar)\n\n\t// Build data query\n\tquery := s.buildStudioQuery(psql, input, user.ID, false)\n\n\t// Apply sort\n\tquery = queryhelper.ApplySortParams(query, \"studios\", input.Sort, input.Direction, \"name\", \"ASC\")\n\n\t// Apply pagination\n\tquery = queryhelper.ApplyPagination(query, input.Page, input.PerPage)\n\n\t// Get count\n\tcountQuery := s.buildStudioQuery(psql, input, user.ID, true)\n\tcount, err := queryhelper.ExecuteCount(ctx, countQuery, s.queries.DB(), \"QueryStudiosCount\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Execute query\n\tstudios, err := queryhelper.ExecuteQuery(ctx, query, s.queries.DB(), converter.StudioToModel, \"QueryStudios\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &models.QueryStudiosResultType{\n\t\tCount:   count,\n\t\tStudios: studios,\n\t}, nil\n}\n\nfunc (s *Studio) buildStudioQuery(psql sq.StatementBuilderType, input models.StudioQueryInput, userID uuid.UUID, forCount bool) sq.SelectBuilder {\n\tvar query sq.SelectBuilder\n\tif forCount {\n\t\tquery = psql.Select(\"COUNT(DISTINCT studios.id)\").From(\"studios\")\n\t} else {\n\t\tquery = psql.Select(\"studios.*\").From(\"studios\")\n\t}\n\n\tquery = query.\n\t\tLeftJoin(\"studios as parent_studio ON studios.parent_studio_id = parent_studio.id\").\n\t\tWhere(sq.Eq{\"studios.deleted\": false})\n\n\t// Filter by URL\n\tif input.URL != nil && *input.URL != \"\" {\n\t\tquery = query.\n\t\t\tJoin(\"studio_urls ON studios.id = studio_urls.studio_id\").\n\t\t\tWhere(sq.Eq{\"studio_urls.url\": *input.URL})\n\t}\n\n\t// Filter by name only\n\tif input.Name != nil && *input.Name != \"\" {\n\t\tsearchTerm := \"%\" + *input.Name + \"%\"\n\t\tquery = query.Where(sq.ILike{\"studios.name\": searchTerm})\n\t}\n\n\t// Filter by names (searches studio name, parent name, and aliases)\n\tif input.Names != nil && *input.Names != \"\" {\n\t\tsearchTerm := \"%\" + *input.Names + \"%\"\n\t\texistsClause := fmt.Sprintf(\n\t\t\t\"EXISTS (SELECT S.id FROM studios S LEFT JOIN studio_aliases SA ON S.id = SA.studio_id WHERE studios.id = S.id AND (LOWER(S.name) LIKE %s OR LOWER(SA.alias) LIKE %s) GROUP BY S.id)\",\n\t\t\tsq.Placeholders(1), sq.Placeholders(1),\n\t\t)\n\t\torConditions := sq.Or{\n\t\t\tsq.ILike{\"studios.name\": searchTerm},\n\t\t\tsq.ILike{\"parent_studio.name\": searchTerm},\n\t\t\tsq.Expr(existsClause, strings.ToLower(searchTerm), strings.ToLower(searchTerm)),\n\t\t}\n\t\tquery = query.Where(orConditions)\n\t}\n\n\t// Filter by has parent\n\tif input.HasParent != nil {\n\t\tif *input.HasParent {\n\t\t\tquery = query.Where(\"parent_studio.id IS NOT NULL\")\n\t\t} else {\n\t\t\tquery = query.Where(\"parent_studio.id IS NULL\")\n\t\t}\n\t}\n\n\t// Filter by parent ID\n\tif input.Parent != nil {\n\t\tquery = queryhelper.ApplyIDCriterion(query, \"studios.parent_studio_id\", input.Parent)\n\t}\n\n\t// Filter by favorite status\n\tif input.IsFavorite != nil {\n\t\tif *input.IsFavorite {\n\t\t\tquery = query.\n\t\t\t\tJoin(\"studio_favorites F ON studios.id = F.studio_id\").\n\t\t\t\tWhere(sq.Eq{\"F.user_id\": userID})\n\t\t} else {\n\t\t\tquery = query.\n\t\t\t\tLeftJoin(\"studio_favorites F ON studios.id = F.studio_id AND F.user_id = ?\", userID).\n\t\t\t\tWhere(\"F.studio_id IS NULL\")\n\t\t}\n\t}\n\n\treturn query\n}\n"
  },
  {
    "path": "internal/service/studio/service.go",
    "content": "package studio\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/internal/service/errutil\"\n)\n\n// Studio handles studio-related operations\ntype Studio struct {\n\tqueries *queries.Queries\n\twithTxn queries.WithTxnFunc\n}\n\n// NewStudio creates a new studio service\nfunc NewStudio(queries *queries.Queries, withTxn queries.WithTxnFunc) *Studio {\n\treturn &Studio{\n\t\tqueries: queries,\n\t\twithTxn: withTxn,\n\t}\n}\n\n// WithTxn executes a function within a transaction\nfunc (s *Studio) WithTxn(fn func(*queries.Queries) error) error {\n\treturn s.withTxn(fn)\n}\n\n// Queries\n\nfunc (s *Studio) FindByID(ctx context.Context, id uuid.UUID) (*models.Studio, error) {\n\tstudio, err := s.queries.FindStudio(ctx, id)\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\treturn converter.StudioToModelPtr(studio), nil\n}\n\nfunc (s *Studio) FindByName(ctx context.Context, name string) (*models.Studio, error) {\n\tstudio, err := s.queries.FindStudioByName(ctx, strings.ToUpper(name))\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\treturn converter.StudioToModelPtr(studio), nil\n}\n\nfunc (s *Studio) FindByAlias(ctx context.Context, alias string) (*models.Studio, error) {\n\tstudio, err := s.queries.FindStudioByAlias(ctx, strings.ToUpper(alias))\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\treturn converter.StudioToModelPtr(studio), nil\n}\n\nfunc (s *Studio) FindByParentID(ctx context.Context, parentID uuid.UUID) ([]models.Studio, error) {\n\tstudios, err := s.queries.GetChildStudios(ctx, uuid.NullUUID{UUID: parentID, Valid: !parentID.IsNil()})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn converter.StudiosToModels(studios), nil\n}\n\nfunc (s *Studio) CountByPerformer(ctx context.Context, performerID uuid.UUID, studioID *uuid.UUID) ([]models.PerformerStudio, error) {\n\tvar result []models.PerformerStudio\n\n\tif studioID != nil {\n\t\t// Filter to studios in the network (the studio, its parent, and children)\n\t\trows, err := s.queries.GetStudiosByPerformerAndNetwork(ctx, queries.GetStudiosByPerformerAndNetworkParams{\n\t\t\tPerformerID: performerID,\n\t\t\tStudioID:    *studioID,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to get studios by performer and network: %w\", err)\n\t\t}\n\n\t\tfor _, row := range rows {\n\t\t\tperformerStudio := models.PerformerStudio{\n\t\t\t\tStudio:     converter.StudioToModelPtr(row.Studio),\n\t\t\t\tSceneCount: int(row.SceneCount),\n\t\t\t}\n\t\t\tresult = append(result, performerStudio)\n\t\t}\n\t} else {\n\t\t// Return all studios\n\t\trows, err := s.queries.GetStudiosByPerformer(ctx, performerID)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to get studios by performer: %w\", err)\n\t\t}\n\n\t\tfor _, row := range rows {\n\t\t\tperformerStudio := models.PerformerStudio{\n\t\t\t\tStudio:     converter.StudioToModelPtr(row.Studio),\n\t\t\t\tSceneCount: int(row.SceneCount),\n\t\t\t}\n\t\t\tresult = append(result, performerStudio)\n\t\t}\n\t}\n\n\treturn result, nil\n}\n\nfunc (s *Studio) GetChildren(ctx context.Context, studioID uuid.UUID) ([]models.Studio, error) {\n\tchildren, err := s.queries.GetChildStudios(ctx, uuid.NullUUID{UUID: studioID, Valid: !studioID.IsNil()})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn converter.StudiosToModels(children), nil\n}\n\nfunc (s *Studio) GetAliases(ctx context.Context, studioID uuid.UUID) ([]string, error) {\n\treturn s.queries.GetStudioAliases(ctx, studioID)\n}\n\nfunc (s *Studio) GetURLs(ctx context.Context, studioID uuid.UUID) ([]models.URL, error) {\n\turls, err := s.queries.GetStudioURLs(ctx, studioID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar result []models.URL\n\tfor _, url := range urls {\n\t\tresult = append(result, models.URL{\n\t\t\tURL:    url.Url,\n\t\t\tSiteID: url.SiteID,\n\t\t})\n\t}\n\treturn result, nil\n}\n\n// Mutations\n\nfunc (s *Studio) Create(ctx context.Context, input models.StudioCreateInput) (*models.Studio, error) {\n\t// Populate a new studio from the input\n\tnewStudio, err := converter.StudioCreateInputToCreateParams(input)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar studio *models.Studio\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tvar err error\n\t\tdbStudio, err := tx.CreateStudio(ctx, newStudio)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tstudio = converter.StudioToModelPtr(dbStudio)\n\n\t\t// Save the aliases\n\t\tif err := createAliases(ctx, tx, studio.ID, input.Aliases); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the URLs\n\t\tif err := createURLs(ctx, tx, studio.ID, input.Urls); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the images\n\t\treturn createImages(ctx, tx, studio.ID, input.ImageIds)\n\t})\n\n\treturn studio, err\n}\n\nfunc (s *Studio) Update(ctx context.Context, input models.StudioUpdateInput) (*models.Studio, error) {\n\tvar studio *models.Studio\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\t// Get the existing studio and modify it\n\t\texistingStudio, err := tx.FindStudio(ctx, input.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Populate studio from the input\n\t\tparams := converter.UpdateStudioFromUpdateInput(existingStudio, input)\n\t\tdbStudio, err := tx.UpdateStudio(ctx, params)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tstudio = converter.StudioToModelPtr(dbStudio)\n\n\t\t// TODO: only do this if provided\n\t\t// Save the aliases\n\t\tif err := updateAliases(ctx, tx, studio.ID, input.Aliases); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the URLs\n\t\tif err := updateURLs(ctx, tx, studio.ID, input.Urls); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the images\n\t\treturn updateImages(ctx, tx, studio.ID, input.ImageIds)\n\t})\n\n\treturn studio, err\n}\n\nfunc (s *Studio) Delete(ctx context.Context, id uuid.UUID) error {\n\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\t// references have on delete cascade, so shouldn't be necessary\n\t\t// to remove them explicitly\n\t\treturn tx.DeleteStudio(ctx, id)\n\t})\n}\n\nfunc (s *Studio) Favorite(ctx context.Context, id uuid.UUID, favorite bool) error {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\tstudio, err := tx.FindStudio(ctx, id)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif studio.Deleted {\n\t\t\treturn fmt.Errorf(\"studio is deleted, unable to make favorite\")\n\t\t}\n\n\t\tif favorite {\n\t\t\treturn tx.CreateStudioFavorite(ctx, queries.CreateStudioFavoriteParams{\n\t\t\t\tStudioID: studio.ID,\n\t\t\t\tUserID:   currentUser.ID,\n\t\t\t})\n\t\t}\n\t\treturn tx.DeleteStudioFavorite(ctx, queries.DeleteStudioFavoriteParams{\n\t\t\tStudioID: studio.ID,\n\t\t\tUserID:   currentUser.ID,\n\t\t})\n\t})\n}\n\nfunc (s *Studio) Search(ctx context.Context, term string, limit int) ([]models.Studio, error) {\n\trows, err := s.queries.SearchStudios(ctx, queries.SearchStudiosParams{\n\t\tTerm:  &term,\n\t\tLimit: int32(limit),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Extract studio IDs\n\tids := make([]uuid.UUID, len(rows))\n\tfor i, row := range rows {\n\t\tids[i] = row.StudioID\n\t}\n\n\t// Load full studios\n\tstudioPtrs, _ := s.LoadIds(ctx, ids)\n\tstudios := make([]models.Studio, 0, len(studioPtrs))\n\tfor _, studio := range studioPtrs {\n\t\tif studio != nil {\n\t\t\tstudios = append(studios, *studio)\n\t\t}\n\t}\n\n\treturn studios, nil\n}\n\nfunc createAliases(ctx context.Context, tx *queries.Queries, studioID uuid.UUID, aliases []string) error {\n\tvar params []queries.CreateStudioAliasesParams\n\tfor _, alias := range aliases {\n\t\tparams = append(params, queries.CreateStudioAliasesParams{\n\t\t\tStudioID: studioID,\n\t\t\tAlias:    alias,\n\t\t})\n\t}\n\t_, err := tx.CreateStudioAliases(ctx, params)\n\treturn err\n}\n\nfunc updateAliases(ctx context.Context, tx *queries.Queries, studioID uuid.UUID, aliases []string) error {\n\tif err := tx.DeleteStudioAliases(ctx, studioID); err != nil {\n\t\treturn err\n\t}\n\treturn createAliases(ctx, tx, studioID, aliases)\n}\n\nfunc createURLs(ctx context.Context, tx *queries.Queries, studioID uuid.UUID, urls []models.URL) error {\n\tvar params []queries.CreateStudioURLsParams\n\tfor _, url := range urls {\n\t\tparams = append(params, queries.CreateStudioURLsParams{\n\t\t\tStudioID: studioID,\n\t\t\tUrl:      url.URL,\n\t\t\tSiteID:   url.SiteID,\n\t\t})\n\t}\n\t_, err := tx.CreateStudioURLs(ctx, params)\n\treturn err\n}\n\nfunc updateURLs(ctx context.Context, tx *queries.Queries, studioID uuid.UUID, urls []models.URL) error {\n\tif err := tx.DeleteStudioURLs(ctx, studioID); err != nil {\n\t\treturn err\n\t}\n\treturn createURLs(ctx, tx, studioID, urls)\n}\n\nfunc createImages(ctx context.Context, tx *queries.Queries, studioID uuid.UUID, images []uuid.UUID) error {\n\tvar params []queries.CreateStudioImagesParams\n\tfor _, image := range images {\n\t\tparams = append(params, queries.CreateStudioImagesParams{\n\t\t\tStudioID: studioID,\n\t\t\tImageID:  image,\n\t\t})\n\t}\n\n\t_, err := tx.CreateStudioImages(ctx, params)\n\treturn err\n}\n\nfunc updateImages(ctx context.Context, tx *queries.Queries, studioID uuid.UUID, images []uuid.UUID) error {\n\t// TODO Remove unused images\n\tif err := tx.DeleteStudioImages(ctx, studioID); err != nil {\n\t\treturn err\n\t}\n\treturn createImages(ctx, tx, studioID, images)\n}\n\n// Dataloader methods\n\nfunc (s *Studio) LoadIds(ctx context.Context, ids []uuid.UUID) ([]*models.Studio, []error) {\n\tstudios, err := s.queries.GetStudios(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tresult := make([]*models.Studio, len(ids))\n\tstudioMap := make(map[uuid.UUID]*models.Studio)\n\n\tfor _, studio := range studios {\n\t\tstudioMap[studio.ID] = converter.StudioToModelPtr(studio)\n\t}\n\n\tfor i, id := range ids {\n\t\tresult[i] = studioMap[id]\n\t}\n\n\treturn result, make([]error, len(ids))\n}\n\n// Dataloader for urls for multiple scenes\nfunc (s *Studio) LoadURLs(ctx context.Context, ids []uuid.UUID) ([][]models.URL, []error) {\n\turls, err := s.queries.FindStudioUrlsByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tresult := make([][]models.URL, len(ids))\n\turlMap := make(map[uuid.UUID][]models.URL)\n\n\tfor _, url := range urls {\n\t\turlMap[url.StudioID] = append(urlMap[url.StudioID], models.URL{\n\t\t\tURL:    url.Url,\n\t\t\tSiteID: url.SiteID,\n\t\t})\n\t}\n\n\tfor i, id := range ids {\n\t\tresult[i] = urlMap[id]\n\t}\n\n\treturn result, make([]error, len(ids))\n}\n\nfunc (s *Studio) LoadAliases(ctx context.Context, ids []uuid.UUID) ([][]string, []error) {\n\taliases, err := s.queries.FindStudioAliasesByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tresult := make([][]string, len(ids))\n\taliasMap := make(map[uuid.UUID][]string)\n\n\tfor _, alias := range aliases {\n\t\taliasMap[alias.StudioID] = append(aliasMap[alias.StudioID], alias.Alias)\n\t}\n\n\tfor i, id := range ids {\n\t\tresult[i] = aliasMap[id]\n\t}\n\n\treturn result, make([]error, len(ids))\n}\n\nfunc (s *Studio) LoadIsFavorite(ctx context.Context, userID uuid.UUID, ids []uuid.UUID) ([]bool, []error) {\n\tfavorites, err := s.queries.FindStudioFavoritesByIds(ctx, queries.FindStudioFavoritesByIdsParams{\n\t\tStudioIds: ids,\n\t\tUserID:    userID,\n\t})\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tresult := make([]bool, len(ids))\n\tfavoriteMap := make(map[uuid.UUID]bool)\n\n\tfor _, favorite := range favorites {\n\t\tfavoriteMap[favorite.StudioID] = favorite.IsFavorite\n\t}\n\n\tfor i, id := range ids {\n\t\tresult[i] = favoriteMap[id]\n\t}\n\n\treturn result, make([]error, len(ids))\n}\n"
  },
  {
    "path": "internal/service/tag/query.go",
    "content": "package tag\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\tsq \"github.com/Masterminds/squirrel\"\n\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\tqueryhelper \"github.com/stashapp/stash-box/internal/service/query\"\n)\n\nfunc (s *Tag) Query(ctx context.Context, input models.TagQueryInput) (*models.QueryTagsResultType, error) {\n\tpsql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar)\n\tquery := psql.Select(\"tags.*\").From(\"tags\").Where(sq.Eq{\"deleted\": false})\n\n\t// Filter by name only\n\tif input.Name != nil && *input.Name != \"\" {\n\t\tsearchTerm := \"%\" + *input.Name + \"%\"\n\t\tquery = query.Where(sq.ILike{\"tags.name\": searchTerm})\n\t}\n\n\t// Filter by names (searches name and aliases)\n\tif input.Names != nil && *input.Names != \"\" {\n\t\tsearchTerm := \"%\" + *input.Names + \"%\"\n\t\texistsClause := fmt.Sprintf(\n\t\t\t\"EXISTS (SELECT T.id FROM tags T LEFT JOIN tag_aliases TA ON T.id = TA.tag_id WHERE tags.id = T.id AND (LOWER(T.name) LIKE %s OR LOWER(TA.alias) LIKE %s) GROUP BY T.id)\",\n\t\t\tsq.Placeholders(1), sq.Placeholders(1),\n\t\t)\n\t\tquery = query.Where(sq.Expr(existsClause, strings.ToLower(searchTerm), strings.ToLower(searchTerm)))\n\t}\n\n\t// Filter by category ID\n\tif input.CategoryID != nil {\n\t\tquery = query.Where(sq.Eq{\"tags.category_id\": input.CategoryID})\n\t}\n\n\t// Get count\n\tcountQuery := psql.Select(\"COUNT(*)\").FromSelect(query, \"subquery\")\n\tcount, err := queryhelper.ExecuteCount(ctx, countQuery, s.queries.DB(), \"QueryTagsCount\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Apply sort\n\tquery = queryhelper.ApplySortParams(query, \"\", input.Sort, input.Direction, \"name\", \"ASC\")\n\n\t// Apply pagination\n\tquery = queryhelper.ApplyPagination(query, input.Page, input.PerPage)\n\n\t// Execute query\n\ttags, err := queryhelper.ExecuteQuery(ctx, query, s.queries.DB(), converter.TagToModel, \"QueryTags\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &models.QueryTagsResultType{\n\t\tCount: count,\n\t\tTags:  tags,\n\t}, nil\n}\n"
  },
  {
    "path": "internal/service/tag/service.go",
    "content": "package tag\n\nimport (\n\t\"context\"\n\t\"strings\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/internal/service/errutil\"\n)\n\n// Service handles tag-related operations\ntype Tag struct {\n\tqueries *queries.Queries\n\twithTxn queries.WithTxnFunc\n}\n\n// NewTag creates a new tag service\nfunc NewTag(queries *queries.Queries, withTxn queries.WithTxnFunc) *Tag {\n\treturn &Tag{\n\t\tqueries: queries,\n\t\twithTxn: withTxn,\n\t}\n}\n\n// WithTxn executes a function within a transaction\nfunc (s *Tag) WithTxn(fn func(*queries.Queries) error) error {\n\treturn s.withTxn(fn)\n}\n\n// Queries\n\nfunc (s *Tag) FindByID(ctx context.Context, id uuid.UUID) (*models.Tag, error) {\n\ttag, err := s.queries.FindTag(ctx, id)\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\treturn converter.TagToModelPtr(tag), nil\n}\n\n// Find is an alias for FindByID to match repository interface\nfunc (s *Tag) Find(ctx context.Context, id uuid.UUID) (*models.Tag, error) {\n\treturn s.FindByID(ctx, id)\n}\n\nfunc (s *Tag) FindByName(ctx context.Context, name string) (*models.Tag, error) {\n\ttag, err := s.queries.FindTagByName(ctx, strings.ToUpper(name))\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\treturn converter.TagToModelPtr(tag), nil\n}\n\nfunc (s *Tag) FindByAlias(ctx context.Context, alias string) (*models.Tag, error) {\n\ttag, err := s.queries.FindTagByAlias(ctx, strings.ToUpper(alias))\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\treturn converter.TagToModelPtr(tag), nil\n}\n\n// FindByNameOrAlias attempts to find a tag by name first, then by alias\nfunc (s *Tag) FindByNameOrAlias(ctx context.Context, name string) (*models.Tag, error) {\n\t// Try to find by name first\n\ttag, err := s.FindByName(ctx, name)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif tag != nil {\n\t\treturn tag, nil\n\t}\n\n\t// If not found by name, try by alias\n\ttag, err = s.FindByAlias(ctx, name)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn tag, nil\n}\n\nfunc (s *Tag) FindCategory(ctx context.Context, id uuid.UUID) (*models.TagCategory, error) {\n\tcategory, err := s.queries.FindTagCategory(ctx, id)\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\treturn converter.TagCategoryToModelPtr(category), nil\n}\n\n// FindIdsBySceneIds returns tag IDs for multiple scene IDs, used by dataloader\nfunc (s *Tag) FindIdsBySceneIds(ctx context.Context, ids []uuid.UUID) ([][]uuid.UUID, []error) {\n\tif len(ids) == 0 {\n\t\treturn make([][]uuid.UUID, 0), nil\n\t}\n\n\tsceneTags, err := s.queries.FindTagIdsBySceneIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\t// Group results by scene ID\n\tm := make(map[uuid.UUID][]uuid.UUID)\n\tfor _, st := range sceneTags {\n\t\tm[st.SceneID] = append(m[st.SceneID], st.TagID)\n\t}\n\n\t// Build result in the same order as input IDs\n\tresult := make([][]uuid.UUID, len(ids))\n\tfor i, id := range ids {\n\t\tresult[i] = m[id]\n\t}\n\n\treturn result, nil\n}\n\nfunc (s *Tag) GetAliases(ctx context.Context, tagID uuid.UUID) ([]string, error) {\n\treturn s.queries.GetTagAliases(ctx, tagID)\n}\n\n// Mutations\n\nfunc (s *Tag) Create(ctx context.Context, input models.TagCreateInput) (*models.Tag, error) {\n\tvar tag queries.Tag\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\tparams, err := converter.TagCreateInputToCreateParams(input)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\ttag, err = tx.CreateTag(ctx, params)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn createAliases(ctx, tx, tag.ID, input.Aliases)\n\t})\n\n\treturn converter.TagToModelPtr(tag), err\n}\n\nfunc (s *Tag) Update(ctx context.Context, input models.TagUpdateInput) (*models.Tag, error) {\n\tvar tag queries.Tag\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\texistingTag, err := tx.FindTag(ctx, input.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tparams := converter.UpdateTagFromUpdateInput(existingTag, input)\n\t\ttag, err = tx.UpdateTag(ctx, params)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn updateAliases(ctx, tx, tag.ID, input.Aliases)\n\t})\n\n\treturn converter.TagToModelPtr(tag), err\n}\n\nfunc (s *Tag) Delete(ctx context.Context, input models.TagDestroyInput) error {\n\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\treturn tx.DeleteTag(ctx, input.ID)\n\t})\n}\n\nfunc (s *Tag) CreateCategory(ctx context.Context, input models.TagCategoryCreateInput) (*models.TagCategory, error) {\n\tparams, err := converter.TagCategoryCreateInputToCreateParams(input)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar category queries.TagCategory\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tcategory, err = tx.CreateTagCategory(ctx, params)\n\t\treturn err\n\t})\n\n\treturn converter.TagCategoryToModelPtr(category), err\n}\n\nfunc (s *Tag) UpdateCategory(ctx context.Context, input models.TagCategoryUpdateInput) (*models.TagCategory, error) {\n\tvar category queries.TagCategory\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\texistingCategory, err := tx.FindTagCategory(ctx, input.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tupdatedCategory := converter.UpdateTagCategoryFromUpdateInput(existingCategory, input)\n\t\tcategory, err = tx.UpdateTagCategory(ctx, updatedCategory)\n\n\t\treturn err\n\t})\n\n\treturn converter.TagCategoryToModelPtr(category), err\n}\n\nfunc (s *Tag) DeleteCategory(ctx context.Context, input models.TagCategoryDestroyInput) error {\n\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\treturn tx.DeleteTagCategory(ctx, input.ID)\n\t})\n}\n\nfunc (s *Tag) QueryCategories(ctx context.Context) (int, []models.TagCategory, error) {\n\tcategories, err := s.queries.GetAllTagCategories(ctx)\n\treturn len(categories), converter.TagCategoriesToModels(categories), err\n}\n\nfunc (s *Tag) SearchTags(ctx context.Context, term string, limit int) ([]models.Tag, error) {\n\ttags, err := s.queries.SearchTags(ctx, queries.SearchTagsParams{\n\t\tTerm:  &term,\n\t\tLimit: int32(limit),\n\t})\n\treturn converter.TagsToModels(tags), err\n}\n\nfunc createAliases(ctx context.Context, tx *queries.Queries, tagID uuid.UUID, aliases []string) error {\n\tvar params []queries.CreateTagAliasesParams\n\tfor _, alias := range aliases {\n\t\tparams = append(params, queries.CreateTagAliasesParams{\n\t\t\tTagID: tagID,\n\t\t\tAlias: alias,\n\t\t})\n\t}\n\t_, err := tx.CreateTagAliases(ctx, params)\n\treturn err\n}\n\nfunc updateAliases(ctx context.Context, tx *queries.Queries, tagID uuid.UUID, aliases []string) error {\n\tif err := tx.DeleteTagAliases(ctx, tagID); err != nil {\n\t\treturn err\n\t}\n\treturn createAliases(ctx, tx, tagID, aliases)\n}\n\n// Dataloader methods\n\nfunc (s *Tag) LoadIds(ctx context.Context, ids []uuid.UUID) ([]*models.Tag, []error) {\n\ttags, err := s.queries.FindTagsByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tresult := make([]*models.Tag, len(ids))\n\ttagMap := make(map[uuid.UUID]*models.Tag)\n\n\tfor _, tag := range tags {\n\t\ttagMap[tag.ID] = converter.TagToModelPtr(tag)\n\t}\n\n\tfor i, id := range ids {\n\t\tresult[i] = tagMap[id]\n\t}\n\n\treturn result, make([]error, len(ids))\n}\n\nfunc (s *Tag) LoadCategoriesByIds(ctx context.Context, ids []uuid.UUID) ([]*models.TagCategory, []error) {\n\tcategories, err := s.queries.GetTagCategoriesByIds(ctx, ids)\n\tif err != nil {\n\t\treturn nil, errutil.DuplicateError(err, len(ids))\n\t}\n\n\tresult := make([]*models.TagCategory, len(ids))\n\tcategoryMap := make(map[uuid.UUID]*models.TagCategory)\n\n\tfor _, category := range categories {\n\t\tcategoryMap[category.ID] = converter.TagCategoryToModelPtr(category)\n\t}\n\n\tfor i, id := range ids {\n\t\tresult[i] = categoryMap[id]\n\t}\n\n\treturn result, make([]error, len(ids))\n}\n"
  },
  {
    "path": "internal/service/user/activation.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\nvar ErrInvalidActivationKey = errors.New(\"invalid activation key\")\n\nfunc generateActivationKey(ctx context.Context, tx *queries.Queries, emailAddr string, inviteKey *uuid.UUID) (queries.UserToken, error) {\n\tdata := models.NewUserTokenData{\n\t\tEmail:     emailAddr,\n\t\tInviteKey: inviteKey,\n\t}\n\tparam, err := converter.CreateUserTokenParamsFromData(models.UserTokenTypeNewUser, data)\n\tif err != nil {\n\t\treturn queries.UserToken{}, err\n\t}\n\n\treturn tx.CreateUserToken(ctx, param)\n}\n\nfunc generateResetPasswordActivationKey(ctx context.Context, tx *queries.Queries, userID uuid.UUID) (*uuid.UUID, error) {\n\tdata := models.UserTokenData{\n\t\tUserID: userID,\n\t}\n\n\tparam, err := converter.CreateUserTokenParamsFromData(models.UserTokenTypeResetPassword, data)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tobj, err := tx.CreateUserToken(ctx, param)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &obj.ID, nil\n}\n\nfunc activateResetPassword(ctx context.Context, tx *queries.Queries, id uuid.UUID, newPassword string) error {\n\ttoken, err := tx.FindUserToken(ctx, id)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif token.Type != models.UserTokenTypeResetPassword {\n\t\treturn ErrInvalidActivationKey\n\t}\n\n\tvar data models.UserTokenData\n\terr = utils.FromJSON(token.Data, &data)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tuser, err := tx.FindUser(ctx, data.UserID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = validatePassword(user.Name, user.Email, newPassword)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\thash, err := hashPassword(newPassword)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := tx.UpdateUserPassword(ctx, queries.UpdateUserPasswordParams{\n\t\tID:           user.ID,\n\t\tPasswordHash: hash,\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\treturn tx.DeleteUserToken(ctx, id)\n}\n"
  },
  {
    "path": "internal/service/user/apikey.go",
    "content": "package user\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t\"github.com/golang-jwt/jwt/v5\"\n\n\t\"github.com/stashapp/stash-box/internal/config\"\n)\n\nvar ErrInvalidToken = errors.New(\"invalid apikey\")\n\nconst APIKeySubject = \"APIKey\"\n\ntype APIKeyClaims struct {\n\tUserID string `json:\"uid\"`\n\tjwt.RegisteredClaims\n}\n\nfunc generateAPIKey(userID string) (string, error) {\n\tclaims := &APIKeyClaims{\n\t\tUserID: userID,\n\t\tRegisteredClaims: jwt.RegisteredClaims{\n\t\t\tSubject:  APIKeySubject,\n\t\t\tIssuedAt: jwt.NewNumericDate(time.Now()),\n\t\t},\n\t}\n\n\ttoken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\n\n\tss, err := token.SignedString(config.GetJWTSignKey())\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn ss, nil\n}\n\n// GetUserIDFromAPIKey validates the provided api key and returns the user ID\nfunc GetUserIDFromAPIKey(apiKey string) (string, error) {\n\tclaims := &APIKeyClaims{}\n\ttoken, err := jwt.ParseWithClaims(apiKey, claims, func(t *jwt.Token) (interface{}, error) {\n\t\treturn config.GetJWTSignKey(), nil\n\t})\n\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tif !token.Valid {\n\t\treturn \"\", ErrInvalidToken\n\t}\n\n\treturn claims.UserID, nil\n}\n"
  },
  {
    "path": "internal/service/user/invite.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n)\n\nvar ErrNoInviteTokens = errors.New(\"no invite tokens available\")\nvar ErrInvalidInviteKey = errors.New(\"invalid or expired invite key\")\n\ntype Finder interface {\n\tFind(id uuid.UUID) (*models.User, error)\n}\n\ntype FinderUpdater interface {\n\tFinder\n\tUpdateFull(updatedUser models.User) (*models.User, error)\n}\n\n// GrantInviteTokens increments the invite token count for a user by up to 10.\nfunc grantInviteTokens(ctx context.Context, tx *queries.Queries, userID uuid.UUID, tokens int) (int, error) {\n\tu, err := tx.FindUser(ctx, userID)\n\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// don't accept negative numbers\n\tif tokens < 0 {\n\t\treturn int(u.InviteTokens), nil\n\t}\n\n\t// put a sensible limit on the number of tokens that can be granted at a time\n\tconst maxTokens = 10\n\tif tokens > maxTokens {\n\t\ttokens = maxTokens\n\t}\n\n\tu.InviteTokens += tokens\n\n\terr = tx.UpdateUserInviteTokenCount(ctx, queries.UpdateUserInviteTokenCountParams{\n\t\tID:           u.ID,\n\t\tInviteTokens: u.InviteTokens,\n\t})\n\n\treturn int(u.InviteTokens), err\n}\n\n// RepealInviteTokens decrements a user's invite token count by the provided\n// amount. Invite tokens are constrained to a minimum of 0.\nfunc repealInviteTokens(ctx context.Context, tx *queries.Queries, userID uuid.UUID, tokens int) (int, error) {\n\tu, err := tx.FindUser(ctx, userID)\n\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// don't accept negative numbers\n\tif tokens < 0 {\n\t\treturn int(u.InviteTokens), nil\n\t}\n\n\t// no limit on the tokens to repeal\n\tu.InviteTokens -= tokens\n\n\t// don't allow to go negative\n\tif u.InviteTokens < 0 {\n\t\tu.InviteTokens = 0\n\t}\n\n\terr = tx.UpdateUserInviteTokenCount(ctx, queries.UpdateUserInviteTokenCountParams{\n\t\tID:           u.ID,\n\t\tInviteTokens: u.InviteTokens,\n\t})\n\n\treturn int(u.InviteTokens), err\n}\n\n// GenerateInviteKeys creates and returns an invite key, using a token if\n// required. If useToken is true and the user has no invite tokens, then\n// an error is returned.\nfunc generateInviteKeys(ctx context.Context, tx *queries.Queries, userID uuid.UUID, input *models.GenerateInviteCodeInput, useToken bool) ([]uuid.UUID, error) {\n\tkeys := 1\n\tif input.Keys != nil {\n\t\tkeys = *input.Keys\n\t}\n\n\t// don't allow more than 50 keys to be generated at a time\n\tif keys > 50 {\n\t\tkeys = 50\n\t}\n\n\tvar ret []uuid.UUID\n\n\tfor i := 0; i < keys; i++ {\n\t\tif useToken {\n\t\t\tu, err := tx.FindUser(ctx, userID)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tif u.InviteTokens <= 0 {\n\t\t\t\treturn nil, ErrNoInviteTokens\n\t\t\t}\n\n\t\t\t_, err = repealInviteTokens(ctx, tx, userID, 1)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\n\t\t// create the invite key\n\t\tUUID, err := uuid.NewV4()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tnewKey := queries.CreateInviteKeyParams{\n\t\t\tID:          UUID,\n\t\t\tGeneratedBy: userID,\n\t\t}\n\n\t\tif input != nil {\n\t\t\tif input.Uses != nil && *input.Uses > 0 {\n\t\t\t\tuses := *input.Uses\n\t\t\t\tnewKey.Uses = &uses\n\t\t\t}\n\t\t\tif input.TTL != nil {\n\t\t\t\texpires := time.Now().Add(time.Duration(*input.TTL) * time.Second)\n\t\t\t\tnewKey.ExpireTime = &expires\n\t\t\t}\n\t\t}\n\n\t\tkey, err := tx.CreateInviteKey(ctx, newKey)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tret = append(ret, key.ID)\n\t}\n\n\treturn ret, nil\n}\n\n// RescindInviteKey makes an invite key invalid, refunding the invite token if\n// required. Returns an error if the invite key is already in use.\nfunc rescindInviteKey(ctx context.Context, tx *queries.Queries, key uuid.UUID, userID uuid.UUID, refundToken bool) error {\n\t// ensure userID matches that of the invite key\n\tk, err := tx.FindInviteKey(ctx, key)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif k.GeneratedBy != userID {\n\t\treturn fmt.Errorf(\"invalid key\")\n\t}\n\n\t// TODO - ensure key is not already activated\n\n\t// destroy the key\n\terr = tx.DeleteInviteKey(ctx, key)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// refund the invite token if required\n\tif refundToken {\n\t\t_, err := tx.FindUser(ctx, userID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t_, err = grantInviteTokens(ctx, tx, userID, 1)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "internal/service/user/joins.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n)\n\nfunc createRoles(ctx context.Context, tx *queries.Queries, userID uuid.UUID, roles []models.RoleEnum) error {\n\tvar params []queries.CreateUserRolesParams\n\tfor _, role := range roles {\n\t\tparams = append(params, queries.CreateUserRolesParams{\n\t\t\tUserID: userID,\n\t\t\tRole:   role.String(),\n\t\t})\n\t}\n\t_, err := tx.CreateUserRoles(ctx, params)\n\treturn err\n}\n\nfunc updateRoles(ctx context.Context, tx *queries.Queries, userID uuid.UUID, roles []models.RoleEnum) error {\n\tif err := tx.DeleteUserRoles(ctx, userID); err != nil {\n\t\treturn err\n\t}\n\treturn createRoles(ctx, tx, userID, roles)\n}\n\nfunc createNotificationSubscriptions(ctx context.Context, tx *queries.Queries, userID uuid.UUID, subscriptions []models.NotificationEnum) error {\n\tvar params []queries.CreateUserNotificationSubscriptionsParams\n\tfor _, sub := range subscriptions {\n\t\tparams = append(params, queries.CreateUserNotificationSubscriptionsParams{\n\t\t\tUserID: userID,\n\t\t\tType:   queries.NotificationType(sub.String()),\n\t\t})\n\t}\n\t_, err := tx.CreateUserNotificationSubscriptions(ctx, params)\n\treturn err\n}\n"
  },
  {
    "path": "internal/service/user/password.go",
    "content": "package user\n\nimport \"golang.org/x/crypto/bcrypt\"\n\nfunc hashPassword(password string) (string, error) {\n\thash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)\n\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn string(hash), nil\n}\n\nfunc isPasswordCorrect(hash string, password string) bool {\n\terr := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))\n\treturn err == nil\n}\n"
  },
  {
    "path": "internal/service/user/query.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\n\tsq \"github.com/Masterminds/squirrel\"\n\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\tqueryhelper \"github.com/stashapp/stash-box/internal/service/query\"\n)\n\nfunc (s *User) Query(ctx context.Context, input models.UserQueryInput) (*models.QueryUsersResultType, error) {\n\tpsql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar)\n\tquery := psql.Select(\"*\").From(\"users\")\n\n\t// Apply name filter - search across name and email columns\n\tif input.Name != nil && *input.Name != \"\" {\n\t\tsearchTerm := \"%\" + *input.Name + \"%\"\n\t\tquery = query.Where(\n\t\t\tsq.Or{\n\t\t\t\tsq.ILike{\"users.name\": searchTerm},\n\t\t\t\tsq.ILike{\"users.email\": searchTerm},\n\t\t\t},\n\t\t)\n\t}\n\n\t// Get count\n\tcountQuery := psql.Select(\"COUNT(*)\").FromSelect(query, \"subquery\")\n\tcount, err := queryhelper.ExecuteCount(ctx, countQuery, s.queries.DB(), \"QueryUsersCount\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Apply sort\n\tquery = query.OrderBy(\"name ASC\")\n\n\t// Apply pagination\n\tquery = queryhelper.ApplyPagination(query, input.Page, input.PerPage)\n\n\t// Execute query\n\tusers, err := queryhelper.ExecuteQuery(ctx, query, s.queries.DB(), converter.UserToModel, \"QueryUsers\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &models.QueryUsersResultType{\n\t\tCount: count,\n\t\tUsers: users,\n\t}, nil\n}\n"
  },
  {
    "path": "internal/service/user/service.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"math/rand\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/jackc/pgx/v5\"\n\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/email\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/internal/service/errutil\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\n// User handles user-related operations\ntype User struct {\n\tqueries  *queries.Queries\n\twithTxn  queries.WithTxnFunc\n\temailMgr *email.Manager\n}\n\n// NewUser creates a new user service\nfunc NewUser(queries *queries.Queries, withTxn queries.WithTxnFunc, emailMgr *email.Manager) *User {\n\treturn &User{\n\t\tqueries:  queries,\n\t\twithTxn:  withTxn,\n\t\temailMgr: emailMgr,\n\t}\n}\n\n// WithTxn executes a function within a transaction\nfunc (s *User) WithTxn(fn func(*queries.Queries) error) error {\n\treturn s.withTxn(fn)\n}\n\n// Queries\n\nfunc (s *User) FindByID(ctx context.Context, id uuid.UUID) (*models.User, error) {\n\tuser, err := s.queries.FindUser(ctx, id)\n\tif err != nil {\n\t\treturn nil, errutil.IgnoreNotFound(err)\n\t}\n\n\treturn converter.UserToModelPtr(user), nil\n}\n\nfunc (s *User) FindByName(ctx context.Context, name string) (*models.User, error) {\n\tuser, err := s.queries.FindUserByName(ctx, strings.ToUpper(name))\n\treturn converter.UserToModelPtr(user), err\n}\n\nfunc (s *User) Count(ctx context.Context) (int, error) {\n\tcount, err := s.queries.CountUsers(ctx)\n\treturn int(count), err\n}\n\nfunc (s *User) CountVotesByType(ctx context.Context, userID uuid.UUID) (*models.UserVoteCount, error) {\n\trows, err := s.queries.CountVotesByType(ctx, userID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar result models.UserVoteCount\n\tfor _, row := range rows {\n\t\tcount := int(row.Count)\n\n\t\tswitch row.Vote {\n\t\tcase \"ACCEPT\":\n\t\t\tresult.Accept = count\n\t\tcase \"REJECT\":\n\t\t\tresult.Reject = count\n\t\tcase \"ABSTAIN\":\n\t\t\tresult.Abstain = count\n\t\tcase \"IMMEDIATE_ACCEPT\":\n\t\t\tresult.ImmediateAccept = count\n\t\tcase \"IMMEDIATE_REJECT\":\n\t\t\tresult.ImmediateReject = count\n\t\t}\n\t}\n\n\treturn &result, nil\n}\n\nfunc (s *User) CountEditsByStatus(ctx context.Context, userID uuid.UUID) (*models.UserEditCount, error) {\n\trows, err := s.queries.CountUserEditsByStatus(ctx, uuid.NullUUID{UUID: userID, Valid: true})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar result models.UserEditCount\n\tfor _, row := range rows {\n\t\tcount := int(row.Count)\n\n\t\tswitch row.Status {\n\t\tcase \"ACCEPTED\":\n\t\t\tresult.Accepted = count\n\t\tcase \"REJECTED\":\n\t\t\tresult.Rejected = count\n\t\tcase \"PENDING\":\n\t\t\tresult.Pending = count\n\t\tcase \"IMMEDIATE_ACCEPTED\":\n\t\t\tresult.ImmediateAccepted = count\n\t\tcase \"IMMEDIATE_REJECTED\":\n\t\t\tresult.ImmediateRejected = count\n\t\tcase \"FAILED\":\n\t\t\tresult.Failed = count\n\t\tcase \"CANCELED\":\n\t\t\tresult.Canceled = count\n\t\t}\n\t}\n\n\treturn &result, nil\n}\n\nfunc (s *User) GetNotificationSubscriptions(ctx context.Context, userID uuid.UUID) ([]models.NotificationEnum, error) {\n\trows, err := s.queries.GetUserNotificationSubscriptions(ctx, userID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar notifications []models.NotificationEnum\n\tfor _, row := range rows {\n\t\tnotifications = append(notifications, models.NotificationEnum(row))\n\t}\n\n\treturn notifications, nil\n}\n\nfunc (s *User) GetRoles(ctx context.Context, userID uuid.UUID) ([]models.RoleEnum, error) {\n\troleStrings, err := s.queries.GetUserRoles(ctx, userID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn converter.StringsToRoleEnums(roleStrings), nil\n}\n\n// NewUser registers a new user. It returns the activation key only if\n// email verification is not required, otherwise it returns nil.\nfunc (s *User) NewUser(ctx context.Context, emailAddr string, inviteKey *uuid.UUID) (*uuid.UUID, error) {\n\t// ensure user or pending activation with email does not already exist\n\tif err := validateUserEmail(emailAddr); err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar err error\n\tvar activationKey *uuid.UUID\n\terr = s.withTxn(func(tx *queries.Queries) error {\n\t\tif err := validateExistingEmail(ctx, tx, emailAddr); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := validateInviteKey(ctx, tx, inviteKey); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// generate an activation key and email\n\t\tactivationToken, err := generateActivationKey(ctx, tx, emailAddr, inviteKey)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// if activation is not required, return the activation key to the frontend\n\t\t// so it can auto-navigate to the activation page\n\t\tif !config.GetRequireActivation() {\n\t\t\tactivationKey = &activationToken.ID\n\t\t\treturn nil\n\t\t}\n\n\t\t// if activation is required, send the email and return nil\n\t\treturn email.SendNewUserEmail(emailAddr, activationToken.ID, s.emailMgr)\n\t})\n\n\treturn activationKey, err\n}\n\nfunc (s *User) Create(ctx context.Context, input models.UserCreateInput) (*models.User, error) {\n\tvar user *models.User\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\tcreatedUser, err := createUser(ctx, tx, input, true)\n\t\tif createdUser != nil {\n\t\t\tuser = converter.UserToModelPtr(*createdUser)\n\t\t}\n\t\treturn err\n\t})\n\n\treturn user, err\n}\n\nfunc (s *User) Update(ctx context.Context, input models.UserUpdateInput) (*models.User, error) {\n\tvar user queries.User\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\texistingUser, err := tx.FindUser(ctx, input.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Validate changes and permissions\n\t\tif err := validateUpdate(ctx, input, existingUser); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\thash := existingUser.PasswordHash\n\t\tif input.Password != nil {\n\t\t\thash, err = hashPassword(*input.Password)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"error updating user\")\n\t\t\t}\n\t\t}\n\n\t\tparams := converter.UpdateUserFromUpdateInput(existingUser, input, hash)\n\t\tuser, err = tx.UpdateUser(ctx, params)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Update roles\n\t\t// TODO - only do this if provided\n\t\treturn updateRoles(ctx, tx, user.ID, input.Roles)\n\t})\n\n\treturn converter.UserToModelPtr(user), err\n}\n\nfunc (s *User) Delete(ctx context.Context, input models.UserDestroyInput) error {\n\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\texistingUser, err := tx.FindUser(ctx, input.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := validateDelete(existingUser); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := tx.DeleteUser(ctx, input.ID); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn tx.CancelUserEdits(ctx, uuid.NullUUID{UUID: input.ID, Valid: true})\n\t})\n}\n\nfunc (s *User) RegenerateAPIKey(ctx context.Context, userID *uuid.UUID) (string, error) {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\n\tif userID != nil {\n\t\tif currentUser.ID != *userID {\n\t\t\t// changing another user api key\n\t\t\t// must be admin\n\t\t\tif err := auth.ValidateAdmin(ctx); err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// changing current user api key\n\t\tuserID = &currentUser.ID\n\t}\n\n\tkey := \"\"\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\tuser, err := tx.FindUser(ctx, *userID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error finding user: %w\", err)\n\t\t}\n\n\t\tkey, err = generateAPIKey(user.ID.String())\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error generating APIKey: %w\", err)\n\t\t}\n\n\t\treturn tx.UpdateUserAPIKey(ctx, queries.UpdateUserAPIKeyParams{\n\t\t\tID:     *userID,\n\t\t\tApiKey: key,\n\t\t})\n\t})\n\n\treturn key, err\n}\n\nfunc (s *User) ResetPassword(ctx context.Context, input models.ResetPasswordInput) error {\n\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\tu, err := tx.FindUserByEmail(ctx, input.Email)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Sleep between 500-1500ms to avoid leaking email presence\n\t\tn := rand.Intn(1000)\n\t\ttime.Sleep(time.Duration(500+n) * time.Millisecond)\n\n\t\t// generate an activation key and email\n\t\tkey, err := generateResetPasswordActivationKey(ctx, tx, u.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn email.SendResetPasswordEmail(u, *key, s.emailMgr)\n\t})\n}\n\nfunc (s *User) ChangePassword(ctx context.Context, input models.UserChangePasswordInput) error {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\n\tif input.ResetKey != nil {\n\t\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\t\treturn activateResetPassword(ctx, tx, *input.ResetKey, input.NewPassword)\n\t\t})\n\t}\n\n\t// just setting password\n\tif currentUser == nil {\n\t\treturn auth.ErrUnauthorized\n\t}\n\n\tif input.ExistingPassword == nil {\n\t\treturn ErrCurrentPasswordIncorrect\n\t}\n\n\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\treturn changePassword(ctx, tx, currentUser.ID, *input.ExistingPassword, input.NewPassword)\n\t})\n}\n\nfunc (s *User) ActivateNewUser(ctx context.Context, input models.ActivateNewUserInput) (*models.User, error) {\n\tvar user queries.User\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\ttoken, err := tx.FindUserToken(ctx, input.ActivationKey)\n\t\tif err != nil {\n\t\t\tif errors.Is(err, pgx.ErrNoRows) {\n\t\t\t\treturn ErrInvalidActivationKey\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\t\tif token.Type != models.UserTokenTypeNewUser {\n\t\t\treturn ErrInvalidActivationKey\n\t\t}\n\n\t\tdata, err := getNewUserTokenData(token)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tvar invitedBy *uuid.UUID\n\t\tif config.GetRequireInvite() {\n\t\t\tif data.InviteKey == nil {\n\t\t\t\treturn errors.New(\"cannot find invite key\")\n\t\t\t}\n\n\t\t\tinvite, err := tx.FindInviteKey(ctx, *data.InviteKey)\n\t\t\tif err != nil {\n\t\t\t\tif errors.Is(err, pgx.ErrNoRows) {\n\t\t\t\t\treturn ErrInvalidInviteKey\n\t\t\t\t}\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tinvitedBy = &invite.GeneratedBy\n\t\t}\n\n\t\tcreateInput := models.UserCreateInput{\n\t\t\tName:        input.Name,\n\t\t\tEmail:       data.Email,\n\t\t\tPassword:    input.Password,\n\t\t\tInvitedByID: invitedBy,\n\t\t\tRoles:       getDefaultUserRoles(),\n\t\t}\n\n\t\tif _, err := tx.FindUserByName(ctx, createInput.Name); !errors.Is(err, pgx.ErrNoRows) {\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn errors.New(\"username already used\")\n\t\t}\n\n\t\tcreatedUser, err := createUser(ctx, tx, createInput, true)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tuser = *createdUser\n\n\t\t// delete the activation\n\t\tif err := tx.DeleteUserToken(ctx, token.ID); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif config.GetRequireInvite() {\n\t\t\t// decrement the invite key uses\n\t\t\tusesLeft, err := tx.InviteKeyUsed(ctx, *data.InviteKey)\n\t\t\t// Ignore \"no rows\" error - this happens when the invite key has unlimited uses (NULL)\n\t\t\tif err != nil && !errors.Is(err, pgx.ErrNoRows) {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// if all used up, then delete the invite key\n\t\t\tif usesLeft != nil && *usesLeft <= 0 {\n\t\t\t\t// delete the invite key\n\t\t\t\tif err := tx.DeleteInviteKey(ctx, *data.InviteKey); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n\n\treturn converter.UserToModelPtr(user), err\n}\n\nfunc (s *User) GenerateInviteCodes(ctx context.Context, input *models.GenerateInviteCodeInput) ([]uuid.UUID, error) {\n\t// INVITE role allows generating invite keys without tokens\n\trequireToken := true\n\tif err := auth.ValidateInvite(ctx); err == nil {\n\t\trequireToken = false\n\t}\n\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\tvar ret []uuid.UUID\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\tkeys, err := generateInviteKeys(ctx, tx, currentUser.ID, input, requireToken)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tret = append(ret, keys...)\n\n\t\treturn nil\n\t})\n\n\treturn ret, err\n}\n\nfunc (s *User) GenerateInviteCode(ctx context.Context) (*uuid.UUID, error) {\n\t// INVITE role allows generating invite keys without tokens\n\trequireToken := true\n\tif err := auth.ValidateInvite(ctx); err == nil {\n\t\trequireToken = false\n\t}\n\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\n\tvar ret *uuid.UUID\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\n\t\tkeys := 1\n\t\tuses := 1\n\t\tinput := &models.GenerateInviteCodeInput{\n\t\t\tKeys: &keys,\n\t\t\tUses: &uses,\n\t\t}\n\n\t\tinviteKeys, txnErr := generateInviteKeys(ctx, tx, currentUser.ID, input, requireToken)\n\t\tif txnErr != nil {\n\t\t\treturn txnErr\n\t\t}\n\n\t\tif len(inviteKeys) == 0 {\n\t\t\treturn errors.New(\"no invite code generated\")\n\t\t}\n\n\t\tret = &inviteKeys[0]\n\n\t\treturn nil\n\t})\n\n\treturn ret, err\n}\n\nfunc (s *User) RescindInviteCode(ctx context.Context, inviteKeyID uuid.UUID) error {\n\t// INVITE role allows generating invite keys without tokens\n\trequireToken := true\n\tif err := auth.ValidateInvite(ctx); err == nil {\n\t\trequireToken = false\n\t}\n\n\ttokenManagerErr := auth.ValidateManageInvites(ctx)\n\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\treturn s.withTxn(func(tx *queries.Queries) error {\n\t\tuserID := currentUser.ID\n\n\t\t// Non-token managers may only rescind their own invite code\n\t\tif tokenManagerErr == nil {\n\t\t\tinviteKey, err := tx.FindInviteKey(ctx, inviteKeyID)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tuserID = inviteKey.GeneratedBy\n\t\t}\n\n\t\terr := rescindInviteKey(ctx, tx, inviteKeyID, userID, requireToken)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n}\n\nfunc (s *User) GrantInvite(ctx context.Context, input models.GrantInviteInput) (int, error) {\n\tif err := auth.ValidateManageInvites(ctx); err != nil {\n\t\treturn 0, err\n\t}\n\n\tvar ret int\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\tcount, err := grantInviteTokens(ctx, tx, input.UserID, input.Amount)\n\t\tret = count\n\n\t\treturn err\n\t})\n\n\treturn ret, err\n}\n\nfunc (s *User) RevokeInvite(ctx context.Context, input models.RevokeInviteInput) (int, error) {\n\tif err := auth.ValidateManageInvites(ctx); err != nil {\n\t\treturn 0, err\n\t}\n\n\tvar ret int\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\tcount, err := repealInviteTokens(ctx, tx, input.UserID, input.Amount)\n\t\tret = count\n\n\t\treturn err\n\t})\n\n\treturn ret, err\n}\n\nfunc (s *User) RequestChangeEmail(ctx context.Context) (models.UserChangeEmailStatus, error) {\n\tcurrentUser := auth.GetCurrentUser(ctx)\n\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\treturn email.ConfirmOldEmail(ctx, tx, *currentUser, s.emailMgr)\n\t})\n\n\tif err != nil {\n\t\treturn models.UserChangeEmailStatusError, err\n\t}\n\treturn models.UserChangeEmailStatusConfirmOld, nil\n}\n\nfunc (s *User) ValidateChangeEmail(ctx context.Context, tokenID uuid.UUID, emailAddr string) (models.UserChangeEmailStatus, error) {\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\n\t\ttoken, err := tx.FindUserToken(ctx, tokenID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tdata, err := getUserTokenData(token)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tcurrentUser := auth.GetCurrentUser(ctx)\n\t\tif data.UserID != currentUser.ID {\n\t\t\treturn fmt.Errorf(\"invalid token\")\n\t\t}\n\n\t\treturn email.ConfirmNewEmail(ctx, tx, *currentUser, emailAddr, s.emailMgr)\n\t})\n\n\tif err != nil {\n\t\treturn models.UserChangeEmailStatusError, err\n\t}\n\treturn models.UserChangeEmailStatusConfirmNew, nil\n}\n\nfunc (s *User) ConfirmChangeEmail(ctx context.Context, tokenID uuid.UUID) (models.UserChangeEmailStatus, error) {\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\ttoken, err := tx.FindUserToken(ctx, tokenID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tdata, err := getChangeEmailTokenData(token)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tcurrentUser := auth.GetCurrentUser(ctx)\n\t\tif data.UserID != currentUser.ID {\n\t\t\treturn fmt.Errorf(\"invalid token\")\n\t\t}\n\n\t\treturn email.ChangeEmail(ctx, tx, data)\n\t})\n\n\tif err != nil {\n\t\treturn models.UserChangeEmailStatusError, err\n\t}\n\treturn models.UserChangeEmailStatusSuccess, nil\n}\n\nfunc (s *User) CreateSystemUsers(ctx context.Context) {\n\t// if there are no users present, then create a root user with a\n\t// generated password and api key, outputting them\n\tvar rootPassword string\n\tvar createdUser *models.User\n\n\terr := s.withTxn(func(tx *queries.Queries) error {\n\t\t_, err := tx.FindUserByName(ctx, rootUserName)\n\t\tif err != nil && !errors.Is(err, pgx.ErrNoRows) {\n\t\t\tpanic(fmt.Errorf(\"error getting root user: %w\", err))\n\t\t}\n\n\t\tif errors.Is(err, pgx.ErrNoRows) {\n\t\t\trootPassword, err = utils.GenerateRandomPassword(16)\n\t\t\tif err != nil {\n\t\t\t\tpanic(fmt.Errorf(\"error creating root user: %w\", err))\n\t\t\t}\n\t\t\tnewUser := models.UserCreateInput{\n\t\t\t\tName:     rootUserName,\n\t\t\t\tPassword: rootPassword,\n\t\t\t\tEmail:    unsetEmail,\n\t\t\t\tRoles:    rootUserRoles,\n\t\t\t}\n\n\t\t\tdbUser, err := createUser(ctx, tx, newUser, false)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcreatedUser = converter.UserToModelPtr(*dbUser)\n\t\t}\n\n\t\t_, err = tx.FindUserByName(ctx, modUserName)\n\t\tif err != nil && !errors.Is(err, pgx.ErrNoRows) {\n\t\t\tpanic(fmt.Errorf(\"error getting mod user: %w\", err))\n\t\t}\n\n\t\tif errors.Is(err, pgx.ErrNoRows) {\n\t\t\tpassword, err := utils.GenerateRandomPassword(32)\n\t\t\tif err != nil {\n\t\t\t\tpanic(fmt.Errorf(\"error creating root user: %w\", err))\n\t\t\t}\n\t\t\tnewUser := models.UserCreateInput{\n\t\t\t\tName:     modUserName,\n\t\t\t\tPassword: password,\n\t\t\t\tEmail:    \"stashbot@example.com\",\n\t\t\t\tRoles:    modUserRoles,\n\t\t\t}\n\n\t\t\tif _, err = createUser(ctx, tx, newUser, false); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n\n\tif err != nil {\n\t\tpanic(fmt.Errorf(\"error creating system users: %w\", err))\n\t}\n\n\tif createdUser != nil {\n\t\t// print (not log) the details of the created user\n\t\t// Skip output during tests\n\t\tif flag.Lookup(\"test.v\") == nil {\n\t\t\tfmt.Printf(\"root user has been created.\\nUser: %s\\nPassword: %s\\nAPI Key: %s\\n\", rootUserName, rootPassword, createdUser.APIKey)\n\t\t\tfmt.Print(\"These credentials have not been logged. The email should be set and the password should be changed after logging in.\\n\")\n\t\t}\n\t}\n}\n\n// Authenticate validates the provided username and password. If correct, it\n// returns the id of the user.\nfunc (s *User) Authenticate(ctx context.Context, username string, password string) (string, error) {\n\tuser, err := s.queries.FindUserByName(ctx, username)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tif !isPasswordCorrect(user.PasswordHash, password) {\n\t\treturn \"\", ErrAccessDenied\n\t}\n\n\treturn user.ID.String(), nil\n}\n"
  },
  {
    "path": "internal/service/user/token.go",
    "content": "package user\n\nimport (\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\nfunc getNewUserTokenData(token queries.UserToken) (models.NewUserTokenData, error) {\n\tvar obj models.NewUserTokenData\n\terr := utils.FromJSON(token.Data, &obj)\n\treturn obj, err\n}\n\nfunc getUserTokenData(token queries.UserToken) (models.UserTokenData, error) {\n\tvar obj models.UserTokenData\n\terr := utils.FromJSON(token.Data, &obj)\n\treturn obj, err\n}\n\nfunc getChangeEmailTokenData(token queries.UserToken) (models.ChangeEmailTokenData, error) {\n\tvar obj models.ChangeEmailTokenData\n\terr := utils.FromJSON(token.Data, &obj)\n\treturn obj, err\n}\n"
  },
  {
    "path": "internal/service/user/user.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n)\n\nconst (\n\tminPasswordLength = 8\n\tmaxPasswordLength = 64\n\tminUniqueChars    = 5\n\n\trootUserName = \"root\"\n\tmodUserName  = \"StashBot\"\n\tunsetEmail   = \"root@example.com\"\n)\n\nvar (\n\tErrUserNotExist                    = errors.New(\"user not found\")\n\tErrEmptyUsername                   = errors.New(\"empty username\")\n\tErrUsernameHasWhitespace           = errors.New(\"username has leading or trailing whitespace\")\n\tErrUsernameMatchesEmail            = errors.New(\"username is the same as email\")\n\tErrEmptyEmail                      = errors.New(\"empty email\")\n\tErrEmailHasWhitespace              = errors.New(\"email has leading or trailing whitespace\")\n\tErrInvalidEmail                    = errors.New(\"not a valid email address\")\n\tErrPasswordTooShort                = fmt.Errorf(\"password length < %d\", minPasswordLength)\n\tErrPasswordTooLong                 = fmt.Errorf(\"password > %d\", maxPasswordLength)\n\tErrPasswordInsufficientUniqueChars = fmt.Errorf(\"password has < %d unique characters\", minUniqueChars)\n\tErrBannedPassword                  = errors.New(\"password matches a common password\")\n\tErrPasswordUsername                = errors.New(\"password matches username\")\n\tErrPasswordEmail                   = errors.New(\"password matches email\")\n\tErrDeleteSystemUser                = errors.New(\"system users cannot be deleted\")\n\tErrChangeModUser                   = errors.New(\"mod user cannot be modified\")\n\tErrChangeRootName                  = errors.New(\"cannot change root username\")\n\tErrChangeRootRoles                 = errors.New(\"cannot change root roles\")\n\tErrAccessDenied                    = errors.New(\"access denied\")\n\tErrCurrentPasswordIncorrect        = errors.New(\"current password incorrect\")\n)\n\nvar rootUserRoles []models.RoleEnum = []models.RoleEnum{\n\tmodels.RoleEnumAdmin,\n}\nvar modUserRoles []models.RoleEnum = []models.RoleEnum{\n\tmodels.RoleEnumBot,\n}\n\nfunc createUser(ctx context.Context, tx *queries.Queries, input models.UserCreateInput, defaultNotifications bool) (*queries.User, error) {\n\tif err := validateCreate(input); err != nil {\n\t\treturn nil, err\n\t}\n\n\tid, err := uuid.NewV7()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\thash, err := hashPassword(input.Password)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tkey, err := generateAPIKey(id.String())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tparams := converter.UserCreateInputToCreateParams(input, id, hash, key)\n\tuser, err := tx.CreateUser(ctx, params)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err := createRoles(ctx, tx, id, input.Roles); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif defaultNotifications {\n\t\terr = createNotificationSubscriptions(ctx, tx, id, models.GetDefaultNotificationSubscriptions())\n\t}\n\treturn &user, err\n}\n\nfunc changePassword(ctx context.Context, tx *queries.Queries, userID uuid.UUID, currentPassword string, newPassword string) error {\n\tuser, err := tx.FindUser(ctx, userID)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error finding user: %w\", err)\n\t}\n\n\tif !isPasswordCorrect(user.PasswordHash, currentPassword) {\n\t\treturn ErrCurrentPasswordIncorrect\n\t}\n\n\terr = validatePassword(user.Name, user.Email, newPassword)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\thash, err := hashPassword(newPassword)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn tx.UpdateUserPassword(ctx, queries.UpdateUserPasswordParams{\n\t\tID:           user.ID,\n\t\tPasswordHash: hash,\n\t})\n}\n\nfunc getDefaultUserRoles() []models.RoleEnum {\n\troleStr := config.GetDefaultUserRoles()\n\tret := []models.RoleEnum{}\n\tfor _, v := range roleStr {\n\t\te := models.RoleEnum(v)\n\t\tif e.IsValid() {\n\t\t\tret = append(ret, e)\n\t\t}\n\t}\n\n\treturn ret\n}\n"
  },
  {
    "path": "internal/service/user/validate.go",
    "content": "package user\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/jackc/pgx/v5\"\n\t\"github.com/stashapp/stash-box/internal/auth\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\nfunc validateCreate(input models.UserCreateInput) error {\n\t// username must be set\n\terr := validateUserName(input.Name, &input.Email)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// email must be valid\n\terr = validateUserEmail(input.Email)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// password must be valid according to policy\n\terr = validatePassword(input.Name, input.Email, input.Password)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc validateUpdate(ctx context.Context, input models.UserUpdateInput, current queries.User) error {\n\tcurrentName := current.Name\n\tcurrentEmail := current.Email\n\n\tif currentName == modUserName {\n\t\treturn ErrChangeModUser\n\t}\n\n\tif currentName == rootUserName {\n\t\tif input.Name != nil && *input.Name != rootUserName {\n\t\t\treturn ErrChangeRootName\n\t\t}\n\n\t\t// TODO - this means that we must include roles in the input\n\t\tif len(input.Roles) != len(rootUserRoles) || input.Roles[0] != rootUserRoles[0] {\n\t\t\treturn ErrChangeRootRoles\n\t\t}\n\t}\n\n\tif input.Name != nil {\n\t\tcurrentName = *input.Name\n\n\t\terr := validateUserName(*input.Name, input.Email)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// email must be valid\n\tif input.Email != nil {\n\t\tcurrentEmail = *input.Email\n\t\terr := validateUserEmail(*input.Email)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t} else if current.Email == unsetEmail {\n\t\treturn ErrEmptyEmail\n\t}\n\n\t// password must be valid according to policy\n\tif input.Password != nil {\n\t\terr := validatePassword(currentName, currentEmail, *input.Password)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif input.Name != nil && *input.Name != current.Name {\n\t\tif err := auth.ValidateAdmin(ctx); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc validateDelete(user queries.User) error {\n\tif user.Name == rootUserName || user.Name == modUserName {\n\t\treturn ErrDeleteSystemUser\n\t}\n\n\treturn nil\n}\n\nfunc validateUserName(username string, email *string) error {\n\tif username == \"\" {\n\t\treturn ErrEmptyUsername\n\t}\n\n\t// username must not have leading or trailing whitespace\n\ttrimmed := strings.TrimSpace(username)\n\n\tif trimmed != username {\n\t\treturn ErrUsernameHasWhitespace\n\t}\n\n\tif email != nil && *email == trimmed {\n\t\treturn ErrUsernameMatchesEmail\n\t}\n\n\treturn nil\n}\n\nfunc validateUserEmail(emailAddr string) error {\n\tif emailAddr == \"\" {\n\t\treturn ErrEmptyEmail\n\t}\n\n\t// email must not have leading or trailing whitespace\n\ttrimmed := strings.TrimSpace(emailAddr)\n\n\tif trimmed != emailAddr {\n\t\treturn ErrEmailHasWhitespace\n\t}\n\n\t// from https://stackoverflow.com/a/201378\n\tconst emailRegex = \"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\\\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\\\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\\\])\"\n\tre := regexp.MustCompile(emailRegex)\n\n\tif !re.MatchString(emailAddr) {\n\t\treturn ErrInvalidEmail\n\t}\n\n\treturn nil\n}\n\nfunc countUniqueCharacters(str string) int {\n\tchars := make(map[rune]bool)\n\tfor _, r := range str {\n\t\tchars[r] = true\n\t}\n\n\treturn len(chars)\n}\n\nfunc validatePassword(username string, emailAddr string, password string) error {\n\t// TODO - hardcode these policies for now. We may want to make these\n\t// configurable in future\n\n\tif len(password) < minPasswordLength {\n\t\treturn ErrPasswordTooShort\n\t}\n\n\tif len(password) > maxPasswordLength {\n\t\treturn ErrPasswordTooLong\n\t}\n\n\tif countUniqueCharacters(password) < minUniqueChars {\n\t\treturn ErrPasswordInsufficientUniqueChars\n\t}\n\n\t// ensure password doesn't match the top 10,000 passwords over the minimum length\n\tif utils.IsBannedPassword(password) {\n\t\treturn ErrBannedPassword\n\t}\n\n\t// ensure password doesn't match the username or email\n\tif password == username {\n\t\treturn ErrPasswordUsername\n\t}\n\n\tif password == emailAddr {\n\t\treturn ErrPasswordEmail\n\t}\n\n\treturn nil\n}\n\nfunc validateExistingEmail(ctx context.Context, tx *queries.Queries, emailAddr string) error {\n\t// Check if a user with this email already exists\n\t_, err := tx.FindUserByEmail(ctx, emailAddr)\n\tif errors.Is(err, pgx.ErrNoRows) {\n\t\t// No existing user, now check for pending activations\n\t\ttokens, err := tx.FindUserTokensByEmail(ctx, emailAddr)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Filter to only new user tokens (pending activations)\n\t\tfor _, token := range tokens {\n\t\t\tif token.Type == models.UserTokenTypeNewUser {\n\t\t\t\treturn errors.New(\"email already has a pending activation\")\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t}\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn errors.New(\"email already in use\")\n}\n\nfunc validateInviteKey(ctx context.Context, tx *queries.Queries, inviteKey *uuid.UUID) error {\n\tif config.GetRequireInvite() {\n\t\tif inviteKey == nil {\n\t\t\treturn errors.New(\"invite key required\")\n\t\t}\n\n\t\tkey, err := tx.FindInviteKey(ctx, *inviteKey)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// ensure invite key is not expired\n\t\tif key.ExpireTime != nil && key.ExpireTime.Before(time.Now()) {\n\t\t\treturn errors.New(\"invite key expired\")\n\t\t}\n\n\t\t// ensure key isn't already used\n\t\tt, _ := tx.FindUserTokensByInviteKey(ctx, *inviteKey)\n\n\t\tif key.Uses != nil && len(t) >= int(*key.Uses) {\n\t\t\treturn errors.New(\"key already used\")\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "internal/service/usertoken/service.go",
    "content": "package usertoken\n\nimport (\n\t\"context\"\n\n\t\"github.com/gofrs/uuid\"\n\n\t\"github.com/stashapp/stash-box/internal/converter\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/internal/queries\"\n)\n\n// UserToken handles user token related operations\ntype UserToken struct {\n\tqueries *queries.Queries\n\twithTxn queries.WithTxnFunc\n}\n\n// NewUserToken creates a new user token service\nfunc NewUserToken(queries *queries.Queries, withTxn queries.WithTxnFunc) *UserToken {\n\treturn &UserToken{\n\t\tqueries: queries,\n\t\twithTxn: withTxn,\n\t}\n}\n\n// WithTxn executes a function within a transaction\nfunc (s *UserToken) WithTxn(fn func(*queries.Queries) error) error {\n\treturn s.withTxn(fn)\n}\n\n// Create creates a new user token\nfunc (s *UserToken) Create(ctx context.Context, newToken models.UserToken) (*models.UserToken, error) {\n\t// Convert GraphQL model to sqlc parameters\n\tparams := queries.CreateUserTokenParams{\n\t\tID:        newToken.ID,\n\t\tType:      newToken.Type,\n\t\tCreatedAt: newToken.CreatedAt,\n\t\tExpiresAt: newToken.ExpiresAt,\n\t}\n\n\t// Convert the JSON data\n\tif len(newToken.Data) > 0 {\n\t\tparams.Data = []byte(newToken.Data)\n\t}\n\n\tcreatedToken, err := s.queries.CreateUserToken(ctx, params)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn converter.UserTokenToModelPtr(createdToken), nil\n}\n\n// Destroy deletes a user token by ID\nfunc (s *UserToken) Destroy(ctx context.Context, id uuid.UUID) error {\n\treturn s.queries.DeleteUserToken(ctx, id)\n}\n\n// DestroyExpired deletes all expired user tokens\nfunc (s *UserToken) DestroyExpired(ctx context.Context) error {\n\treturn s.queries.DeleteExpiredUserTokens(ctx)\n}\n\n// Find finds a user token by ID\nfunc (s *UserToken) Find(ctx context.Context, id uuid.UUID) (*models.UserToken, error) {\n\ttoken, err := s.queries.FindUserToken(ctx, id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn converter.UserTokenToModelPtr(token), nil\n}\n\n// FindByInviteKey finds user tokens by invite key in JSON data\nfunc (s *UserToken) FindByInviteKey(ctx context.Context, key uuid.UUID) ([]*models.UserToken, error) {\n\ttokens, err := s.queries.FindUserTokensByInviteKey(ctx, key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar result []*models.UserToken\n\tfor _, token := range tokens {\n\t\tresult = append(result, converter.UserTokenToModelPtr(token))\n\t}\n\n\treturn result, nil\n}\n\n// FindActiveInviteKeysForUser returns active invite keys for a specific user\nfunc (s *UserToken) FindActiveInviteKeysForUser(ctx context.Context, userID uuid.UUID) ([]models.InviteKey, error) {\n\tkeys, err := s.queries.FindActiveInviteKeysForUser(ctx, userID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn converter.InviteKeysToModels(keys), nil\n}\n"
  },
  {
    "path": "internal/storage/favicon.go",
    "content": "package storage\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/http/cookiejar\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"sync\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"go.deanishe.net/favicon\"\n\t\"golang.org/x/net/publicsuffix\"\n)\n\nvar iconCache = map[uuid.UUID][]byte{}\nvar iconCacheMutex = &sync.RWMutex{}\n\nfunc getCachedSiteIcon(site *models.Site) ([]byte, bool) {\n\ticonCacheMutex.RLock()\n\tdefer iconCacheMutex.RUnlock()\n\n\tif cachedIcon, hasIcon := iconCache[site.ID]; hasIcon {\n\t\treturn cachedIcon, true\n\t}\n\n\treturn nil, false\n}\n\nfunc GetSiteIcon(ctx context.Context, site models.Site) ([]byte, error) {\n\tif cachedIcon, hasIcon := getCachedSiteIcon(&site); hasIcon {\n\t\treturn cachedIcon, nil\n\t}\n\n\tif site.URL == nil {\n\t\treturn nil, nil\n\t}\n\n\tfaviconPath, err := config.GetFaviconPath()\n\tif faviconPath == nil {\n\t\treturn nil, err\n\t}\n\ticonPath := path.Join(*faviconPath, site.ID.String())\n\n\tif _, err := os.Stat(iconPath); os.IsNotExist(err) {\n\t\tif err := downloadIcon(ctx, iconPath, *site.URL); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\tdata, err := os.ReadFile(iconPath)\n\tif err != nil || len(data) == 0 {\n\t\treturn nil, err\n\t}\n\n\ticonCacheMutex.Lock()\n\tdefer iconCacheMutex.Unlock()\n\n\ticonCache[site.ID] = data\n\treturn iconCache[site.ID], nil\n}\n\nfunc downloadIcon(ctx context.Context, iconPath string, siteURL string) error {\n\terr := errors.New(\"no site url given\")\n\tif siteURL == \"\" {\n\t\treturn err\n\t}\n\n\tu, err := url.Parse(siteURL)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// We need a client with a cookiejar for the favicon finder because some websites\n\t// simply don't work without cookies.\n\t// For instance, at the time of writing, twitter.com returns an http 302 redirect\n\t// with location `/` and a `guest_id` cookie. We must include this cookie\n\t// in the subsequent request otherwise we are stuck in a redirect loop.\n\tjar, err := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc := &http.Client{Jar: jar}\n\tfinder := favicon.New(favicon.WithClient(c))\n\ticons, err := finder.Find(u.Scheme + \"://\" + u.Host)\n\tif err != nil || len(icons) < 1 {\n\t\treturn err\n\t}\n\n\t// Icons are sorted widest first. Based on the design of the stash-box UI,\n\t// it makes sense to grab the _smallest_ icon, i.e. the last one.\n\t// TODO: Find the ideal size favicon for the stash-box UI and try to get the same here.\n\treq, err := http.NewRequestWithContext(ctx, http.MethodGet, icons[len(icons)-1].URL, nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\tresp, err := http.DefaultClient.Do(req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer resp.Body.Close()\n\n\tout, err := os.Create(iconPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer out.Close()\n\n\tif _, err := io.Copy(out, resp.Body); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "internal/storage/file.go",
    "content": "package storage\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n\t\"github.com/stashapp/stash-box/pkg/utils\"\n)\n\ntype FileBackend struct{}\n\nfunc (s *FileBackend) WriteFile(file []byte, image *models.Image) error {\n\tif err := config.ValidateImageLocation(); err != nil {\n\t\treturn err\n\t}\n\n\tfileDir := config.GetImageLocation()\n\n\t// check fileDir for the identical file\n\tfn := GetImagePath(fileDir, image.Checksum)\n\tif exists, _ := utils.FileExists(fn); exists {\n\t\t// file already exists\n\t\treturn nil\n\t}\n\n\t// write the file\n\tpath := GetImagePath(fileDir, image.Checksum)\n\tif err := os.WriteFile(path, file, os.FileMode(0644)); err != nil {\n\t\t_ = os.Remove(path)\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (s *FileBackend) DestroyFile(image *models.Image) error {\n\treturn os.Remove(GetImagePath(config.GetImageLocation(), image.Checksum))\n}\n\nfunc (s *FileBackend) ReadFile(image models.Image) (io.ReadCloser, int64, error) {\n\tfileDir := config.GetImageLocation()\n\tpath := GetImagePath(fileDir, image.Checksum)\n\tstat, err := os.Stat(path)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\tfile, err := os.Open(path)\n\treturn file, stat.Size(), err\n}\n\nfunc GetImagePath(imageDir string, checksum string) string {\n\treturn filepath.Join(imageDir, checksum)\n}\n"
  },
  {
    "path": "internal/storage/image_backend.go",
    "content": "package storage\n\nimport (\n\t\"io\"\n\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype Backend interface {\n\tWriteFile(file []byte, image *models.Image) error\n\tDestroyFile(image *models.Image) error\n\tReadFile(image models.Image) (io.ReadCloser, int64, error)\n}\n\nfunc Image() Backend {\n\timageBackend := config.GetImageBackend()\n\n\tvar backend Backend\n\tswitch imageBackend {\n\tcase config.FileBackend:\n\t\tbackend = &FileBackend{}\n\tcase config.S3Backend:\n\t\tbackend = &S3Backend{}\n\t}\n\n\treturn backend\n}\n"
  },
  {
    "path": "internal/storage/s3.go",
    "content": "package storage\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\n\t\"github.com/minio/minio-go/v7\"\n\t\"github.com/minio/minio-go/v7/pkg/credentials\"\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"github.com/stashapp/stash-box/internal/models\"\n)\n\ntype S3Backend struct{}\n\nfunc (s *S3Backend) WriteFile(file []byte, image *models.Image) error {\n\ts3config := config.GetS3Config()\n\theaders := s3config.UploadHeaders\n\n\tminioClient, err := minio.New(s3config.Endpoint, &minio.Options{\n\t\tCreds:  credentials.NewStaticV4(s3config.AccessKey, s3config.Secret, \"\"),\n\t\tSecure: true,\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"creating minio client: %w\", err)\n\t}\n\n\tif err := uploadS3File(minioClient, file, s3config.Bucket, image.ID.String(), headers); err != nil {\n\t\treturn fmt.Errorf(\"uploading to s3: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc (s *S3Backend) DestroyFile(image *models.Image) error {\n\ts3config := config.GetS3Config()\n\tminioClient, err := minio.New(s3config.Endpoint, &minio.Options{\n\t\tCreds:  credentials.NewStaticV4(s3config.AccessKey, s3config.Secret, \"\"),\n\t\tSecure: true,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tid := image.ID.String()\n\tpath := id[0:2] + \"/\" + id[2:4] + \"/\" + id\n\terr = minioClient.RemoveObject(context.TODO(), s3config.Bucket, path, minio.RemoveObjectOptions{})\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc uploadS3File(client *minio.Client, file []byte, bucket string, id string, headers map[string]string) error {\n\tctx := context.TODO()\n\n\t// SVG is not correctly detected so we set it manually if the file is xml\n\tcontentType := http.DetectContentType(file)\n\tif contentType == \"text/xml; charset=utf-8\" || contentType == \"text/plain; charset=utf-8\" {\n\t\tcontentType = \"image/svg+xml\"\n\t}\n\n\tpath := id[0:2] + \"/\" + id[2:4] + \"/\" + id\n\t_, err := client.PutObject(\n\t\tctx,\n\t\tbucket,\n\t\tpath,\n\t\tbytes.NewReader(file),\n\t\tint64(len(file)),\n\t\tminio.PutObjectOptions{\n\t\t\tContentType:  contentType,\n\t\t\tUserMetadata: headers,\n\t\t},\n\t)\n\n\treturn err\n}\n\nfunc (s *S3Backend) ReadFile(image models.Image) (io.ReadCloser, int64, error) {\n\tctx := context.TODO()\n\n\ts3config := config.GetS3Config()\n\tminioClient, err := minio.New(s3config.Endpoint, &minio.Options{\n\t\tCreds:  credentials.NewStaticV4(s3config.AccessKey, s3config.Secret, \"\"),\n\t\tSecure: true,\n\t})\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\tid := image.ID.String()\n\tpath := id[0:2] + \"/\" + id[2:4] + \"/\" + id\n\n\tobject, err := minioClient.GetObject(\n\t\tctx,\n\t\ts3config.Bucket,\n\t\tpath,\n\t\tminio.GetObjectOptions{},\n\t)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\tstat, err := object.Stat()\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\treturn object, stat.Size, err\n}\n"
  },
  {
    "path": "pkg/logger/logger.go",
    "content": "package logger\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype LogItem struct {\n\tTime    time.Time `json:\"time\"`\n\tType    string    `json:\"type\"`\n\tMessage string    `json:\"message\"`\n}\n\nvar logger = logrus.New()\nvar progressLogger = logrus.New()\n\n// separate log for user management\nvar userLogger = logrus.New()\n\nvar LogCache []LogItem\nvar mutex = &sync.Mutex{}\nvar logSubs []chan []LogItem\nvar waiting = false\nvar lastBroadcast = time.Now()\nvar logBuffer []LogItem\n\n// Init initialises the logger based on a logging configuration\nfunc Init(logFile string, userLogFile string, logOut bool, logLevel string) {\n\tfile := openLogFile(logFile)\n\n\tif file != nil && logOut {\n\t\tmw := io.MultiWriter(os.Stderr, file)\n\t\tlogger.Out = mw\n\t} else if file != nil {\n\t\tlogger.Out = file\n\t}\n\n\t// otherwise, output to StdErr\n\n\tSetLogLevel(logLevel)\n\n\t// initialise user log\n\tuserFile := openLogFile(userLogFile)\n\n\tif userFile != nil {\n\t\tuserLogger.Out = userFile\n\t}\n}\n\nfunc openLogFile(logFile string) *os.File {\n\tvar file *os.File\n\n\tif logFile != \"\" {\n\t\tvar err error\n\t\tfile, err = os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)\n\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Could not open '%s' for log output due to error: %s\\n\", logFile, err.Error())\n\t\t}\n\t}\n\n\treturn file\n}\n\nfunc SetLogLevel(level string) {\n\tlogger.Level = logLevelFromString(level)\n}\n\nfunc logLevelFromString(level string) logrus.Level {\n\tret := logrus.InfoLevel\n\n\tswitch level {\n\tcase \"Debug\":\n\t\tret = logrus.DebugLevel\n\tcase \"Warning\":\n\t\tret = logrus.WarnLevel\n\tcase \"Error\":\n\t\tret = logrus.ErrorLevel\n\t}\n\n\treturn ret\n}\n\nfunc addLogItem(l *LogItem) {\n\tmutex.Lock()\n\tl.Time = time.Now()\n\tLogCache = append([]LogItem{*l}, LogCache...)\n\tif len(LogCache) > 30 {\n\t\tLogCache = LogCache[:len(LogCache)-1]\n\t}\n\tmutex.Unlock()\n\tgo broadcastLogItem(l)\n}\n\nfunc GetLogCache() []LogItem {\n\tmutex.Lock()\n\n\tret := make([]LogItem, len(LogCache))\n\tcopy(ret, LogCache)\n\n\tmutex.Unlock()\n\n\treturn ret\n}\n\nfunc SubscribeToLog(stop chan int) <-chan []LogItem {\n\tret := make(chan []LogItem, 100)\n\n\tgo func() {\n\t\t<-stop\n\t\tunsubscribeFromLog(ret)\n\t}()\n\n\tmutex.Lock()\n\tlogSubs = append(logSubs, ret)\n\tmutex.Unlock()\n\n\treturn ret\n}\n\nfunc unsubscribeFromLog(toRemove chan []LogItem) {\n\tmutex.Lock()\n\tfor i, c := range logSubs {\n\t\tif c == toRemove {\n\t\t\tlogSubs = append(logSubs[:i], logSubs[i+1:]...)\n\t\t}\n\t}\n\tclose(toRemove)\n\tmutex.Unlock()\n}\n\nfunc doBroadcastLogItems() {\n\t// assumes mutex held\n\n\tfor _, c := range logSubs {\n\t\t// don't block waiting to broadcast\n\t\tselect {\n\t\tcase c <- logBuffer:\n\t\tdefault:\n\t\t}\n\t}\n\n\tlogBuffer = nil\n\twaiting = false\n\tlastBroadcast = time.Now()\n}\n\nfunc broadcastLogItem(l *LogItem) {\n\tmutex.Lock()\n\n\tlogBuffer = append(logBuffer, *l)\n\n\t// don't send more than once per second\n\tif !waiting {\n\t\t// if last broadcast was under a second ago, wait until a second has\n\t\t// passed\n\t\ttimeSinceBroadcast := time.Since(lastBroadcast)\n\t\tif timeSinceBroadcast.Seconds() < 1 {\n\t\t\twaiting = true\n\t\t\ttime.AfterFunc(time.Second-timeSinceBroadcast, func() {\n\t\t\t\tmutex.Lock()\n\t\t\t\tdoBroadcastLogItems()\n\t\t\t\tmutex.Unlock()\n\t\t\t})\n\t\t} else {\n\t\t\tdoBroadcastLogItems()\n\t\t}\n\t}\n\t// if waiting then adding it to the buffer is sufficient\n\n\tmutex.Unlock()\n}\n\nfunc init() {\n\tprogressLogger.SetFormatter(new(ProgressFormatter))\n}\n\nfunc Progressf(format string, args ...interface{}) {\n\tprogressLogger.Infof(format, args...)\n\tl := &LogItem{\n\t\tType:    \"progress\",\n\t\tMessage: fmt.Sprintf(format, args...),\n\t}\n\taddLogItem(l)\n\n}\n\nfunc Trace(args ...interface{}) {\n\tlogger.Trace(args...)\n}\n\nfunc Debug(args ...interface{}) {\n\tlogger.Debug(args...)\n\tl := &LogItem{\n\t\tType:    \"debug\",\n\t\tMessage: fmt.Sprint(args...),\n\t}\n\taddLogItem(l)\n}\n\nfunc Debugf(format string, args ...interface{}) {\n\tlogger.Debugf(format, args...)\n\tl := &LogItem{\n\t\tType:    \"debug\",\n\t\tMessage: fmt.Sprintf(format, args...),\n\t}\n\taddLogItem(l)\n}\n\nfunc Info(args ...interface{}) {\n\tlogger.Info(args...)\n\tl := &LogItem{\n\t\tType:    \"info\",\n\t\tMessage: fmt.Sprint(args...),\n\t}\n\taddLogItem(l)\n}\n\nfunc Infof(format string, args ...interface{}) {\n\tlogger.Infof(format, args...)\n\tl := &LogItem{\n\t\tType:    \"info\",\n\t\tMessage: fmt.Sprintf(format, args...),\n\t}\n\taddLogItem(l)\n}\n\nfunc Warn(args ...interface{}) {\n\tlogger.Warn(args...)\n\tl := &LogItem{\n\t\tType:    \"warn\",\n\t\tMessage: fmt.Sprint(args...),\n\t}\n\taddLogItem(l)\n}\n\nfunc Warnf(format string, args ...interface{}) {\n\tlogger.Warnf(format, args...)\n\tl := &LogItem{\n\t\tType:    \"warn\",\n\t\tMessage: fmt.Sprintf(format, args...),\n\t}\n\taddLogItem(l)\n}\n\nfunc Error(args ...interface{}) {\n\tlogger.Error(args...)\n\tl := &LogItem{\n\t\tType:    \"error\",\n\t\tMessage: fmt.Sprint(args...),\n\t}\n\taddLogItem(l)\n}\n\nfunc Errorf(format string, args ...interface{}) {\n\tlogger.Errorf(format, args...)\n\tl := &LogItem{\n\t\tType:    \"error\",\n\t\tMessage: fmt.Sprintf(format, args...),\n\t}\n\taddLogItem(l)\n}\n\nfunc Fatal(args ...interface{}) {\n\tlogger.Fatal(args...)\n}\n\nfunc Fatalf(format string, args ...interface{}) {\n\tlogger.Fatalf(format, args...)\n}\n\n// Userf logs a user operation to the user log.\nfunc Userf(user string, action string, format string, args ...interface{}) {\n\tprefix := fmt.Sprintf(\"%s: %s - \", user, action)\n\tuserLogger.Infof(prefix+format, args...)\n}\n"
  },
  {
    "path": "pkg/logger/otel.go",
    "content": "package logger\n\nimport (\n\t\"context\"\n\t\"log\"\n\n\t\"github.com/stashapp/stash-box/internal/config\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n)\n\nfunc InitTracer() func(context.Context) error {\n\totelConfig := config.GetOTelConfig()\n\tif otelConfig == nil {\n\t\treturn nil\n\t}\n\n\texporter, err := otlptrace.New(\n\t\tcontext.Background(),\n\t\totlptracegrpc.NewClient(\n\t\t\totlptracegrpc.WithInsecure(),\n\t\t\totlptracegrpc.WithEndpoint(otelConfig.Endpoint),\n\t\t),\n\t)\n\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tresources, err := resource.New(\n\t\tcontext.Background(),\n\t\tresource.WithAttributes(\n\t\t\tattribute.String(\"service.name\", config.GetTitle()),\n\t\t\tattribute.String(\"library.language\", \"go\"),\n\t\t),\n\t)\n\tif err != nil {\n\t\tlog.Print(\"Could not set resources: \", err)\n\t}\n\n\totel.SetTracerProvider(\n\t\tsdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithSampler(sdktrace.TraceIDRatioBased(otelConfig.TraceRatio)),\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(resources),\n\t\t),\n\t)\n\n\tlogger.Infof(\"otel initialized with collector: %s, ratio: %f\", otelConfig.Endpoint, otelConfig.TraceRatio)\n\n\treturn exporter.Shutdown\n}\n"
  },
  {
    "path": "pkg/logger/progress_formatter.go",
    "content": "package logger\n\nimport (\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype ProgressFormatter struct{}\n\nfunc (f *ProgressFormatter) Format(entry *logrus.Entry) ([]byte, error) {\n\tmsg := []byte(\"Processing --> \" + entry.Message + \"\\r\")\n\treturn msg, nil\n}\n"
  },
  {
    "path": "pkg/utils/arguments.go",
    "content": "// nolint: revive\npackage utils\n\nimport (\n\t\"context\"\n\n\t\"github.com/99designs/gqlgen/graphql\"\n)\n\n// https://github.com/99designs/gqlgen/issues/866#issuecomment-737684323\n\ntype argumentSelector = func(v interface{}) (ret interface{}, ok bool)\n\n// ArgumentsQuery to check whether arg value is null\ntype ArgumentsQuery struct {\n\targs      map[string]interface{}\n\tselectors []argumentSelector\n}\n\nfunc (a ArgumentsQuery) selected() (ret interface{}, ok bool) {\n\tret, ok = a.args, true\n\tfor _, fn := range a.selectors {\n\t\tret, ok = fn(ret)\n\t\tif !ok {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn\n}\n\n// IsNull return whether selected field value is null.\nfunc (a ArgumentsQuery) IsNull() bool {\n\tv, ok := a.selected()\n\treturn ok && v == nil\n}\n\nfunc (a ArgumentsQuery) child(fn argumentSelector) ArgumentsQuery {\n\tvar selectors = make([]argumentSelector, 0, len(a.selectors)+1)\n\tselectors = append(selectors, a.selectors...)\n\tselectors = append(selectors, fn)\n\treturn ArgumentsQuery{\n\t\targs:      a.args,\n\t\tselectors: selectors,\n\t}\n}\n\n// Field select field by name, returns a new query.\nfunc (a ArgumentsQuery) Field(name string) ArgumentsQuery {\n\treturn a.child(func(v interface{}) (ret interface{}, ok bool) {\n\t\tvar m map[string]interface{}\n\t\tif m, ok = v.(map[string]interface{}); ok {\n\t\t\tret, ok = m[name]\n\t\t}\n\t\treturn\n\t})\n\n}\n\n// Index select field by array index, returns a new query.\nfunc (a ArgumentsQuery) Index(index int) ArgumentsQuery {\n\treturn a.child(func(v interface{}) (ret interface{}, ok bool) {\n\t\tif index < 0 {\n\t\t\treturn\n\t\t}\n\t\tvar a []interface{}\n\t\tif a, ok = v.([]interface{}); ok {\n\t\t\tif index > len(a)-1 {\n\t\t\t\tok = false\n\t\t\t\treturn\n\t\t\t}\n\t\t\tret = a[index]\n\t\t}\n\t\treturn\n\t})\n}\n\n// Arguments query to check whether args value is null.\n// https://github.com/99designs/gqlgen/issues/866\nfunc Arguments(ctx context.Context) (ret ArgumentsQuery) {\n\tfc := graphql.GetFieldContext(ctx)\n\toc := graphql.GetOperationContext(ctx)\n\n\tif fc == nil || oc == nil {\n\t\treturn\n\t}\n\tret.args = fc.Field.ArgumentMap(oc.Variables)\n\treturn\n}\n"
  },
  {
    "path": "pkg/utils/crypto.go",
    "content": "// nolint: revive\npackage utils\n\nimport (\n\t\"crypto/rand\"\n\t\"encoding/ascii85\"\n\t\"fmt\"\n\t\"strconv\"\n)\n\nfunc GenerateRandomPassword(l int) (string, error) {\n\tb := make([]byte, l)\n\tif _, err := rand.Read(b); err != nil {\n\t\treturn \"\", err\n\t}\n\n\toutput := make([]byte, ascii85.MaxEncodedLen(l))\n\tn := ascii85.Encode(output, b)\n\toutput = output[0:n]\n\treturn string(output), nil\n}\n\nfunc GenerateRandomKey(l int) (string, error) {\n\tb := make([]byte, l)\n\tif _, err := rand.Read(b); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn fmt.Sprintf(\"%x\", b), nil\n}\n\n// ParseFingerprintHash converts a fingerprint hash hex string to int64.\nfunc ParseFingerprintHash(hash string) (int64, error) {\n\thashUint, err := strconv.ParseUint(hash, 16, 64)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn int64(hashUint), nil\n}\n"
  },
  {
    "path": "pkg/utils/date.go",
    "content": "package utils\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc ParseDateStringAsTime(dateString string) (time.Time, error) {\n\tswitch len(dateString) {\n\tcase 4:\n\t\tt, e := time.Parse(\"2006\", dateString)\n\t\tif e == nil {\n\t\t\treturn t, nil\n\t\t}\n\tcase 7:\n\t\tt, e := time.Parse(\"2006-01\", dateString)\n\t\tif e == nil {\n\t\t\treturn t, nil\n\t\t}\n\tdefault:\n\t\tt, e := time.Parse(\"2006-01-02\", dateString)\n\t\tif e == nil {\n\t\t\treturn t, nil\n\t\t}\n\t}\n\n\treturn time.Time{}, fmt.Errorf(\"ParseDateStringAsTime failed: dateString <%s>\", dateString)\n}\n"
  },
  {
    "path": "pkg/utils/enum.go",
    "content": "// nolint: revive\npackage utils\n\nimport (\n\t\"reflect\"\n)\n\ntype validator interface {\n\tIsValid() bool\n}\n\nfunc validateEnum(value interface{}) bool {\n\tv, ok := value.(validator)\n\tif !ok {\n\t\t// shouldn't happen\n\t\treturn false\n\t}\n\n\treturn v.IsValid()\n}\n\nfunc ResolveEnumString(value string, out interface{}) bool {\n\tif value == \"\" {\n\t\treturn false\n\t}\n\n\toutValue := reflect.ValueOf(out).Elem()\n\toutValue.SetString(value)\n\n\treturn validateEnum(out)\n}\n"
  },
  {
    "path": "pkg/utils/file.go",
    "content": "// nolint: revive\npackage utils\n\nimport (\n\t\"os\"\n)\n\n// FileExists returns true if the given path exists\nfunc FileExists(path string) (bool, error) {\n\t_, err := os.Stat(path)\n\tswitch {\n\tcase err == nil:\n\t\treturn true, nil\n\tcase os.IsNotExist(err):\n\t\treturn false, err\n\tdefault:\n\t\tpanic(err)\n\t}\n}\n\n// Touch creates an empty file at the given path if it doesn't already exist\nfunc Touch(path string) error {\n\tvar _, err = os.Stat(path)\n\tif os.IsNotExist(err) {\n\t\tvar file, err = os.Create(path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn file.Close()\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/utils/json.go",
    "content": "// nolint: revive\npackage utils\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n)\n\nfunc ToJSON(data interface{}) (json.RawMessage, error) {\n\tbuffer := &bytes.Buffer{}\n\tencoder := json.NewEncoder(buffer)\n\tencoder.SetEscapeHTML(false)\n\tencoder.SetIndent(\"\", \"  \")\n\tif err := encoder.Encode(data); err != nil {\n\t\treturn nil, err\n\t}\n\treturn buffer.Bytes(), nil\n}\n\nfunc FromJSON(data json.RawMessage, obj interface{}) error {\n\treturn json.Unmarshal(data, obj)\n}\n"
  },
  {
    "path": "pkg/utils/password_blacklist.go",
    "content": "//nolint:misspell,revive\npackage utils\n\nvar bannedPasswordsSet = makeBannedPasswordsSet()\n\n// IsBannedPassword returns true if the password matches one from the banned\n// password list.\nfunc IsBannedPassword(password string) bool {\n\t// look for the password in the banned list\n\t_, found := bannedPasswordsSet[password]\n\treturn found\n}\n\nfunc makeBannedPasswordsSet() map[string]struct{} {\n\t// this list was derived from the 10-million-password-list-top-100000.txt file in:\n\t// https://github.com/danielmiessler/SecLists/tree/master/Passwords/Common-Credentials\n\t// the list was filtered to the top 10,000 passwords over 8 characters long\n\t// grep -x '.\\{8,\\}' 10-million-password-list-top-100000.txt | head -n 10000\n\tbannedPasswordsList := []string{\n\t\t\"password\",\n\t\t\"12345678\",\n\t\t\"123456789\",\n\t\t\"baseball\",\n\t\t\"football\",\n\t\t\"qwertyuiop\",\n\t\t\"1234567890\",\n\t\t\"superman\",\n\t\t\"1qaz2wsx\",\n\t\t\"trustno1\",\n\t\t\"jennifer\",\n\t\t\"sunshine\",\n\t\t\"iloveyou\",\n\t\t\"starwars\",\n\t\t\"computer\",\n\t\t\"michelle\",\n\t\t\"11111111\",\n\t\t\"princess\",\n\t\t\"987654321\",\n\t\t\"corvette\",\n\t\t\"1234qwer\",\n\t\t\"88888888\",\n\t\t\"q1w2e3r4t5\",\n\t\t\"internet\",\n\t\t\"samantha\",\n\t\t\"whatever\",\n\t\t\"maverick\",\n\t\t\"steelers\",\n\t\t\"mercedes\",\n\t\t\"123123123\",\n\t\t\"qwer1234\",\n\t\t\"hardcore\",\n\t\t\"q1w2e3r4\",\n\t\t\"midnight\",\n\t\t\"bigdaddy\",\n\t\t\"victoria\",\n\t\t\"1q2w3e4r\",\n\t\t\"cocacola\",\n\t\t\"marlboro\",\n\t\t\"asdfasdf\",\n\t\t\"87654321\",\n\t\t\"12344321\",\n\t\t\"jordan23\",\n\t\t\"Password\",\n\t\t\"jonathan\",\n\t\t\"liverpoo\",\n\t\t\"danielle\",\n\t\t\"abcd1234\",\n\t\t\"scorpion\",\n\t\t\"qazwsxedc\",\n\t\t\"password1\",\n\t\t\"slipknot\",\n\t\t\"qwerty123\",\n\t\t\"startrek\",\n\t\t\"12341234\",\n\t\t\"redskins\",\n\t\t\"butthead\",\n\t\t\"asdfghjkl\",\n\t\t\"qwertyui\",\n\t\t\"liverpool\",\n\t\t\"dolphins\",\n\t\t\"nicholas\",\n\t\t\"elephant\",\n\t\t\"mountain\",\n\t\t\"xxxxxxxx\",\n\t\t\"1q2w3e4r5t\",\n\t\t\"metallic\",\n\t\t\"shithead\",\n\t\t\"benjamin\",\n\t\t\"creative\",\n\t\t\"rush2112\",\n\t\t\"asdfghjk\",\n\t\t\"4815162342\",\n\t\t\"passw0rd\",\n\t\t\"bullshit\",\n\t\t\"1qazxsw2\",\n\t\t\"garfield\",\n\t\t\"01012011\",\n\t\t\"69696969\",\n\t\t\"december\",\n\t\t\"11223344\",\n\t\t\"godzilla\",\n\t\t\"airborne\",\n\t\t\"lifehack\",\n\t\t\"brooklyn\",\n\t\t\"platinum\",\n\t\t\"darkness\",\n\t\t\"blink182\",\n\t\t\"789456123\",\n\t\t\"12qwaszx\",\n\t\t\"snowball\",\n\t\t\"pakistan\",\n\t\t\"redwings\",\n\t\t\"williams\",\n\t\t\"nintendo\",\n\t\t\"guinness\",\n\t\t\"november\",\n\t\t\"minecraft\",\n\t\t\"asdf1234\",\n\t\t\"lasvegas\",\n\t\t\"babygirl\",\n\t\t\"dickhead\",\n\t\t\"12121212\",\n\t\t\"147258369\",\n\t\t\"explorer\",\n\t\t\"snickers\",\n\t\t\"metallica\",\n\t\t\"alexande\",\n\t\t\"paradise\",\n\t\t\"michigan\",\n\t\t\"carolina\",\n\t\t\"lacrosse\",\n\t\t\"christin\",\n\t\t\"kimberly\",\n\t\t\"kristina\",\n\t\t\"0987654321\",\n\t\t\"poohbear\",\n\t\t\"bollocks\",\n\t\t\"qweasdzxc\",\n\t\t\"drowssap\",\n\t\t\"caroline\",\n\t\t\"einstein\",\n\t\t\"spitfire\",\n\t\t\"maryjane\",\n\t\t\"1232323q\",\n\t\t\"champion\",\n\t\t\"svetlana\",\n\t\t\"westside\",\n\t\t\"courtney\",\n\t\t\"12345qwert\",\n\t\t\"patricia\",\n\t\t\"aaaaaaaa\",\n\t\t\"anderson\",\n\t\t\"security\",\n\t\t\"stargate\",\n\t\t\"simpsons\",\n\t\t\"scarface\",\n\t\t\"123456789a\",\n\t\t\"1234554321\",\n\t\t\"cherokee\",\n\t\t\"Usuckballz1\",\n\t\t\"veronica\",\n\t\t\"semperfi\",\n\t\t\"scotland\",\n\t\t\"marshall\",\n\t\t\"qwerty12\",\n\t\t\"98765432\",\n\t\t\"softball\",\n\t\t\"passport\",\n\t\t\"franklin\",\n\t\t\"alexander\",\n\t\t\"55555555\",\n\t\t\"zaq12wsx\",\n\t\t\"infinity\",\n\t\t\"kawasaki\",\n\t\t\"77777777\",\n\t\t\"vladimir\",\n\t\t\"freeuser\",\n\t\t\"wildcats\",\n\t\t\"budlight\",\n\t\t\"brittany\",\n\t\t\"00000000\",\n\t\t\"bulldogs\",\n\t\t\"swordfis\",\n\t\t\"PASSWORD\",\n\t\t\"patriots\",\n\t\t\"pearljam\",\n\t\t\"colorado\",\n\t\t\"ncc1701d\",\n\t\t\"motorola\",\n\t\t\"logitech\",\n\t\t\"juventus\",\n\t\t\"wolverin\",\n\t\t\"warcraft\",\n\t\t\"hello123\",\n\t\t\"peekaboo\",\n\t\t\"123654789\",\n\t\t\"panthers\",\n\t\t\"elizabet\",\n\t\t\"spiderma\",\n\t\t\"virginia\",\n\t\t\"valentin\",\n\t\t\"predator\",\n\t\t\"mitchell\",\n\t\t\"741852963\",\n\t\t\"1111111111\",\n\t\t\"rolltide\",\n\t\t\"changeme\",\n\t\t\"lovelove\",\n\t\t\"fktrcfylh\",\n\t\t\"loverboy\",\n\t\t\"chevelle\",\n\t\t\"cardinal\",\n\t\t\"michael1\",\n\t\t\"147852369\",\n\t\t\"american\",\n\t\t\"alexandr\",\n\t\t\"electric\",\n\t\t\"wolfpack\",\n\t\t\"spiderman\",\n\t\t\"darkside\",\n\t\t\"123456789q\",\n\t\t\"01011980\",\n\t\t\"freepass\",\n\t\t\"99999999\",\n\t\t\"fyfcnfcbz\",\n\t\t\"airplane\",\n\t\t\"22222222\",\n\t\t\"1029384756\",\n\t\t\"cheyenne\",\n\t\t\"billybob\",\n\t\t\"lawrence\",\n\t\t\"pussycat\",\n\t\t\"01012000\",\n\t\t\"chocolat\",\n\t\t\"business\",\n\t\t\"cjkysirj\",\n\t\t\"123qweasd\",\n\t\t\"stingray\",\n\t\t\"serenity\",\n\t\t\"greenday\",\n\t\t\"charlie1\",\n\t\t\"firebird\",\n\t\t\"blizzard\",\n\t\t\"a1b2c3d4\",\n\t\t\"sterling\",\n\t\t\"password123\",\n\t\t\"hercules\",\n\t\t\"tarheels\",\n\t\t\"remember\",\n\t\t\"basketball\",\n\t\t\"zeppelin\",\n\t\t\"swimming\",\n\t\t\"pavilion\",\n\t\t\"engineer\",\n\t\t\"bobafett\",\n\t\t\"21122112\",\n\t\t\"darkstar\",\n\t\t\"icecream\",\n\t\t\"hellfire\",\n\t\t\"fireball\",\n\t\t\"rockstar\",\n\t\t\"defender\",\n\t\t\"swordfish\",\n\t\t\"airforce\",\n\t\t\"abcdefgh\",\n\t\t\"srinivas\",\n\t\t\"bluebird\",\n\t\t\"presario\",\n\t\t\"wrangler\",\n\t\t\"precious\",\n\t\t\"harrison\",\n\t\t\"goldfish\",\n\t\t\"Soso123aljg\",\n\t\t\"dbrnjhbz\",\n\t\t\"thailand\",\n\t\t\"longhorn\",\n\t\t\"123qweasdzxc\",\n\t\t\"wordpass\",\n\t\t\"31415926\",\n\t\t\"999999999\",\n\t\t\"letmein1\",\n\t\t\"assassin\",\n\t\t\"testtest\",\n\t\t\"microsoft\",\n\t\t\"devildog\",\n\t\t\"valentina\",\n\t\t\"butterfly\",\n\t\t\"lonewolf\",\n\t\t\"babydoll\",\n\t\t\"atlantis\",\n\t\t\"montreal\",\n\t\t\"angelina\",\n\t\t\"shamrock\",\n\t\t\"hotstuff\",\n\t\t\"mistress\",\n\t\t\"deftones\",\n\t\t\"cadillac\",\n\t\t\"blahblah\",\n\t\t\"birthday\",\n\t\t\"1234abcd\",\n\t\t\"01011990\",\n\t\t\"cavalier\",\n\t\t\"veronika\",\n\t\t\"qazwsx123\",\n\t\t\"mustang1\",\n\t\t\"goldberg\",\n\t\t\"12345678910\",\n\t\t\"wolfgang\",\n\t\t\"savannah\",\n\t\t\"leonardo\",\n\t\t\"basketba\",\n\t\t\"cristina\",\n\t\t\"aardvark\",\n\t\t\"sweetpea\",\n\t\t\"13131313\",\n\t\t\"freedom1\",\n\t\t\"fredfred\",\n\t\t\"manchester\",\n\t\t\"kathleen\",\n\t\t\"hamilton\",\n\t\t\"fuckyou2\",\n\t\t\"renegade\",\n\t\t\"drpepper\",\n\t\t\"bigboobs\",\n\t\t\"1qaz2wsx3edc\",\n\t\t\"christia\",\n\t\t\"buckeyes\",\n\t\t\"0123456789\",\n\t\t\"stephani\",\n\t\t\"enterpri\",\n\t\t\"diamonds\",\n\t\t\"wetpussy\",\n\t\t\"morpheus\",\n\t\t\"66666666\",\n\t\t\"pornstar\",\n\t\t\"thuglife\",\n\t\t\"napoleon\",\n\t\t\"highland\",\n\t\t\"chandler\",\n\t\t\"trfnthbyf\",\n\t\t\"consumer\",\n\t\t\"welcome1\",\n\t\t\"123qwe123\",\n\t\t\"wrinkle1\",\n\t\t\"51505150\",\n\t\t\"11235813\",\n\t\t\"butterfl\",\n\t\t\"elizabeth\",\n\t\t\"sherlock\",\n\t\t\"marathon\",\n\t\t\"access14\",\n\t\t\"overlord\",\n\t\t\"trombone\",\n\t\t\"isabelle\",\n\t\t\"barcelona\",\n\t\t\"babylon5\",\n\t\t\"ultimate\",\n\t\t\"yankees1\",\n\t\t\"superfly\",\n\t\t\"campbell\",\n\t\t\"geronimo\",\n\t\t\"concrete\",\n\t\t\"q1w2e3r4t5y6\",\n\t\t\"jessica1\",\n\t\t\"123454321\",\n\t\t\"portugal\",\n\t\t\"sundance\",\n\t\t\"pleasure\",\n\t\t\"seminole\",\n\t\t\"isabella\",\n\t\t\"14789632\",\n\t\t\"qazxswedc\",\n\t\t\"kingkong\",\n\t\t\"adgjmptw\",\n\t\t\"ncc1701e\",\n\t\t\"mongoose\",\n\t\t\"alejandr\",\n\t\t\"1123581321\",\n\t\t\"margaret\",\n\t\t\"bluemoon\",\n\t\t\"ghbdtnbr\",\n\t\t\"bonehead\",\n\t\t\"stallion\",\n\t\t\"personal\",\n\t\t\"morrison\",\n\t\t\"super123\",\n\t\t\"anything\",\n\t\t\"aleksandr\",\n\t\t\"rhbcnbyf\",\n\t\t\"dietcoke\",\n\t\t\"cooldude\",\n\t\t\"christop\",\n\t\t\"lollipop\",\n\t\t\"fernando\",\n\t\t\"christian\",\n\t\t\"letmein2\",\n\t\t\"01012010\",\n\t\t\"werewolf\",\n\t\t\"punkrock\",\n\t\t\"giovanni\",\n\t\t\"cdtnkfyf\",\n\t\t\"tottenha\",\n\t\t\"hongkong\",\n\t\t\"blackcat\",\n\t\t\"a1234567\",\n\t\t\"zzzzzzzz\",\n\t\t\"hollywoo\",\n\t\t\"florence\",\n\t\t\"gn56gn56\",\n\t\t\"clifford\",\n\t\t\"stocking\",\n\t\t\"matthew1\",\n\t\t\"immortal\",\n\t\t\"44444444\",\n\t\t\"makaveli\",\n\t\t\"sebastia\",\n\t\t\"ilovesex\",\n\t\t\"charlott\",\n\t\t\"anthony1\",\n\t\t\"111222333\",\n\t\t\"satan666\",\n\t\t\"columbia\",\n\t\t\"infantry\",\n\t\t\"eternity\",\n\t\t\"waterloo\",\n\t\t\"vanhalen\",\n\t\t\"skywalke\",\n\t\t\"seinfeld\",\n\t\t\"standard\",\n\t\t\"squirrel\",\n\t\t\"qazwsxed\",\n\t\t\"fuckfuck\",\n\t\t\"wolverine\",\n\t\t\"robinson\",\n\t\t\"musicman\",\n\t\t\"megadeth\",\n\t\t\"verbatim\",\n\t\t\"1q2w3e4r5t6y\",\n\t\t\"twilight\",\n\t\t\"fuckyou1\",\n\t\t\"stardust\",\n\t\t\"showtime\",\n\t\t\"147896325\",\n\t\t\"skittles\",\n\t\t\"shaney14\",\n\t\t\"qwerty12345\",\n\t\t\"123321123\",\n\t\t\"intrepid\",\n\t\t\"sandiego\",\n\t\t\"punisher\",\n\t\t\"1234567a\",\n\t\t\"dingdong\",\n\t\t\"192837465\",\n\t\t\"starcraft\",\n\t\t\"mushroom\",\n\t\t\"blackdog\",\n\t\t\"25802580\",\n\t\t\"slapshot\",\n\t\t\"ekaterina\",\n\t\t\"123698745\",\n\t\t\"1234512345\",\n\t\t\"chargers\",\n\t\t\"33333333\",\n\t\t\"warriors\",\n\t\t\"raistlin\",\n\t\t\"gangster\",\n\t\t\"coltrane\",\n\t\t\"tacobell\",\n\t\t\"portland\",\n\t\t\"penelope\",\n\t\t\"1a2b3c4d\",\n\t\t\"19841984\",\n\t\t\"12369874\",\n\t\t\"stranger\",\n\t\t\"Mailcreated5240\",\n\t\t\"halflife\",\n\t\t\"qwerasdf\",\n\t\t\"playtime\",\n\t\t\"kangaroo\",\n\t\t\"blackman\",\n\t\t\"panasonic\",\n\t\t\"christine\",\n\t\t\"beautiful\",\n\t\t\"spanking\",\n\t\t\"meridian\",\n\t\t\"lonestar\",\n\t\t\"kittycat\",\n\t\t\"goodluck\",\n\t\t\"barcelon\",\n\t\t\"scoobydo\",\n\t\t\"crusader\",\n\t\t\"12312312\",\n\t\t\"hannibal\",\n\t\t\"guardian\",\n\t\t\"fuckface\",\n\t\t\"discover\",\n\t\t\"catalina\",\n\t\t\"1122334455\",\n\t\t\"californ\",\n\t\t\"angelica\",\n\t\t\"william1\",\n\t\t\"stonecol\",\n\t\t\"johnjohn\",\n\t\t\"septembe\",\n\t\t\"scarlett\",\n\t\t\"santiago\",\n\t\t\"lowrider\",\n\t\t\"anastasia\",\n\t\t\"vacation\",\n\t\t\"sithlord\",\n\t\t\"ragnarok\",\n\t\t\"keyboard\",\n\t\t\"19921992\",\n\t\t\"11112222\",\n\t\t\"penguins\",\n\t\t\"nuttertools\",\n\t\t\"lorraine\",\n\t\t\"dkflbvbh\",\n\t\t\"titleist\",\n\t\t\"rootbeer\",\n\t\t\"magnolia\",\n\t\t\"dodgeram\",\n\t\t\"creampie\",\n\t\t\"aspirine\",\n\t\t\"socrates\",\n\t\t\"1234567q\",\n\t\t\"redalert\",\n\t\t\"qqqqqqqq\",\n\t\t\"munchkin\",\n\t\t\"mersedes\",\n\t\t\"imperial\",\n\t\t\"blueeyes\",\n\t\t\"bigballs\",\n\t\t\"zaq1xsw2\",\n\t\t\"sebastian\",\n\t\t\"research\",\n\t\t\"national\",\n\t\t\"colombia\",\n\t\t\"01012001\",\n\t\t\"rammstein\",\n\t\t\"katerina\",\n\t\t\"freckles\",\n\t\t\"caliente\",\n\t\t\"director\",\n\t\t\"qazwsxedcrfv\",\n\t\t\"oblivion\",\n\t\t\"mustangs\",\n\t\t\"margarita\",\n\t\t\"deadhead\",\n\t\t\"zxcv1234\",\n\t\t\"porkchop\",\n\t\t\"grateful\",\n\t\t\"fuck_inside\",\n\t\t\"formula1\",\n\t\t\"a1s2d3f4\",\n\t\t\"23232323\",\n\t\t\"shopping\",\n\t\t\"peterpan\",\n\t\t\"martinez\",\n\t\t\"justdoit\",\n\t\t\"goodtime\",\n\t\t\"alexandra\",\n\t\t\"thankyou\",\n\t\t\"springer\",\n\t\t\"Software\",\n\t\t\"sapphire\",\n\t\t\"richmond\",\n\t\t\"kingston\",\n\t\t\"brucelee\",\n\t\t\"thunder1\",\n\t\t\"qawsedrf\",\n\t\t\"plymouth\",\n\t\t\"mariners\",\n\t\t\"heather1\",\n\t\t\"chelsea1\",\n\t\t\"123456qwerty\",\n\t\t\"spectrum\",\n\t\t\"pineappl\",\n\t\t\"labrador\",\n\t\t\"1234567890q\",\n\t\t\"10101010\",\n\t\t\"stephanie\",\n\t\t\"commando\",\n\t\t\"amsterdam\",\n\t\t\"webmaster\",\n\t\t\"southern\",\n\t\t\"lesbians\",\n\t\t\"fletcher\",\n\t\t\"thompson\",\n\t\t\"Passw0rd\",\n\t\t\"candyman\",\n\t\t\"aquarius\",\n\t\t\"starfish\",\n\t\t\"monopoly\",\n\t\t\"infiniti\",\n\t\t\"gangbang\",\n\t\t\"blackjac\",\n\t\t\"8J4yE3Uz\",\n\t\t\"19871987\",\n\t\t\"0000000000\",\n\t\t\"sailboat\",\n\t\t\"richard1\",\n\t\t\"godsmack\",\n\t\t\"emmanuel\",\n\t\t\"cosworth\",\n\t\t\"19891989\",\n\t\t\"rosemary\",\n\t\t\"lightnin\",\n\t\t\"chevrole\",\n\t\t\"catherin\",\n\t\t\"qwerty123456\",\n\t\t\"frontier\",\n\t\t\"asshole1\",\n\t\t\"01011991\",\n\t\t\"spartans\",\n\t\t\"luckydog\",\n\t\t\"15426378\",\n\t\t\"swingers\",\n\t\t\"snuggles\",\n\t\t\"qwertyuio\",\n\t\t\"qwert123\",\n\t\t\"mandingo\",\n\t\t\"ihateyou\",\n\t\t\"beefcake\",\n\t\t\"beatrice\",\n\t\t\"111111111\",\n\t\t\"whocares\",\n\t\t\"scooter1\",\n\t\t\"doberman\",\n\t\t\"clitoris\",\n\t\t\"5555555555\",\n\t\t\"dannyboy\",\n\t\t\"children\",\n\t\t\"viktoria\",\n\t\t\"valhalla\",\n\t\t\"terminator\",\n\t\t\"oklahoma\",\n\t\t\"ncc1701a\",\n\t\t\"keystone\",\n\t\t\"clarence\",\n\t\t\"bunghole\",\n\t\t\"19751975\",\n\t\t\"romashka\",\n\t\t\"pa55word\",\n\t\t\"golfball\",\n\t\t\"doughboy\",\n\t\t\"charlotte\",\n\t\t\"achilles\",\n\t\t\"patrick1\",\n\t\t\"gateway1\",\n\t\t\"deeznuts\",\n\t\t\"cowboys1\",\n\t\t\"9876543210\",\n\t\t\"vkontakte\",\n\t\t\"phillies\",\n\t\t\"jeremiah\",\n\t\t\"dilligaf\",\n\t\t\"atlantic\",\n\t\t\"19851985\",\n\t\t\"vfrcbvrf\",\n\t\t\"technics\",\n\t\t\"stripper\",\n\t\t\"september\",\n\t\t\"pinkfloy\",\n\t\t\"maryland\",\n\t\t\"kentucky\",\n\t\t\"hastings\",\n\t\t\"frederic\",\n\t\t\"butthole\",\n\t\t\"agent007\",\n\t\t\"19911991\",\n\t\t\"01011985\",\n\t\t\"somethin\",\n\t\t\"porsche9\",\n\t\t\"hurrican\",\n\t\t\"california\",\n\t\t\"bearbear\",\n\t\t\"73501505\",\n\t\t\"nathalie\",\n\t\t\"microlab\",\n\t\t\"function\",\n\t\t\"flamingo\",\n\t\t\"enterprise\",\n\t\t\"19941994\",\n\t\t\"19781978\",\n\t\t\"01011970\",\n\t\t\"truelove\",\n\t\t\"nebraska\",\n\t\t\"meatball\",\n\t\t\"brothers\",\n\t\t\"syracuse\",\n\t\t\"military\",\n\t\t\"macdaddy\",\n\t\t\"diamond1\",\n\t\t\"warhammer\",\n\t\t\"universe\",\n\t\t\"sentinel\",\n\t\t\"Password1\",\n\t\t\"manchest\",\n\t\t\"kamikaze\",\n\t\t\"handsome\",\n\t\t\"dthjybrf\",\n\t\t\"designer\",\n\t\t\"blueblue\",\n\t\t\"australia\",\n\t\t\"321654987\",\n\t\t\"1qaz1qaz\",\n\t\t\"01011981\",\n\t\t\"pokemon1\",\n\t\t\"pantyhos\",\n\t\t\"eatpussy\",\n\t\t\"19861986\",\n\t\t\"01011986\",\n\t\t\"superstar\",\n\t\t\"ssssssss\",\n\t\t\"rjirfrgbde\",\n\t\t\"meatloaf\",\n\t\t\"lifetime\",\n\t\t\"jamesbon\",\n\t\t\"123456789z\",\n\t\t\"woofwoof\",\n\t\t\"Turkey50\",\n\t\t\"rfnthbyf\",\n\t\t\"Jennifer\",\n\t\t\"front242\",\n\t\t\"apollo13\",\n\t\t\"terminal\",\n\t\t\"starbuck\",\n\t\t\"lancelot\",\n\t\t\"gordon24\",\n\t\t\"brandon1\",\n\t\t\"bigmoney\",\n\t\t\"azsxdcfv\",\n\t\t\"rightnow\",\n\t\t\"maradona\",\n\t\t\"lionking\",\n\t\t\"crazybab\",\n\t\t\"charlton\",\n\t\t\"19931993\",\n\t\t\"19901990\",\n\t\t\"poiuytrewq\",\n\t\t\"passwort\",\n\t\t\"japanese\",\n\t\t\"holyshit\",\n\t\t\"bradford\",\n\t\t\"21212121\",\n\t\t\"wildfire\",\n\t\t\"sexygirl\",\n\t\t\"poontang\",\n\t\t\"microsof\",\n\t\t\"chocolate\",\n\t\t\"chickens\",\n\t\t\"arsenal1\",\n\t\t\"19831983\",\n\t\t\"software\",\n\t\t\"happyday\",\n\t\t\"aberdeen\",\n\t\t\"19951995\",\n\t\t\"13243546\",\n\t\t\"123456aa\",\n\t\t\"treasure\",\n\t\t\"theodore\",\n\t\t\"raiders1\",\n\t\t\"gretchen\",\n\t\t\"ericsson\",\n\t\t\"albatros\",\n\t\t\"1Passwor\",\n\t\t\"0.0.0.000\",\n\t\t\"zxcasdqwe\",\n\t\t\"Sojdlg123aljg\",\n\t\t\"sexsexsex\",\n\t\t\"mikemike\",\n\t\t\"michaela\",\n\t\t\"jackson1\",\n\t\t\"excalibu\",\n\t\t\"anhyeuem\",\n\t\t\"78945612\",\n\t\t\"trinidad\",\n\t\t\"pooppoop\",\n\t\t\"greenbay\",\n\t\t\"greatone\",\n\t\t\"fordf150\",\n\t\t\"applepie\",\n\t\t\"963852741\",\n\t\t\"18436572\",\n\t\t\"lisalisa\",\n\t\t\"hardrock\",\n\t\t\"dinosaur\",\n\t\t\"rastaman\",\n\t\t\"pa55w0rd\",\n\t\t\"madeline\",\n\t\t\"hollywood\",\n\t\t\"hellyeah\",\n\t\t\"columbus\",\n\t\t\"skywalker\",\n\t\t\"rockhard\",\n\t\t\"positive\",\n\t\t\"melissa1\",\n\t\t\"kcj9wx5n\",\n\t\t\"hyperion\",\n\t\t\"happy123\",\n\t\t\"gotohell\",\n\t\t\"football1\",\n\t\t\"february\",\n\t\t\"abc12345\",\n\t\t\"609609609\",\n\t\t\"yosemite\",\n\t\t\"roadkill\",\n\t\t\"kingfish\",\n\t\t\"billyboy\",\n\t\t\"1qa2ws3ed\",\n\t\t\"123789456\",\n\t\t\"tunafish\",\n\t\t\"starship\",\n\t\t\"saratoga\",\n\t\t\"robotech\",\n\t\t\"rasputin\",\n\t\t\"rangers1\",\n\t\t\"passwords\",\n\t\t\"p0015123\",\n\t\t\"nwo4life\",\n\t\t\"megapass\",\n\t\t\"kenworth\",\n\t\t\"hedgehog\",\n\t\t\"davidson\",\n\t\t\"anaconda\",\n\t\t\"20102010\",\n\t\t\"12131415\",\n\t\t\"vladislav\",\n\t\t\"Translator\",\n\t\t\"splinter\",\n\t\t\"richards\",\n\t\t\"phoenix1\",\n\t\t\"karolina\",\n\t\t\"789789789\",\n\t\t\"railroad\",\n\t\t\"pingpong\",\n\t\t\"magicman\",\n\t\t\"killbill\",\n\t\t\"01011989\",\n\t\t\"wrestlin\",\n\t\t\"tommyboy\",\n\t\t\"sherwood\",\n\t\t\"passpass\",\n\t\t\"pass1234\",\n\t\t\"majestic\",\n\t\t\"fuckthis\",\n\t\t\"freeporn\",\n\t\t\"crawford\",\n\t\t\"bangbang\",\n\t\t\"asdasdasd\",\n\t\t\"umbrella\",\n\t\t\"salvador\",\n\t\t\"operator\",\n\t\t\"jeanette\",\n\t\t\"gggggggg\",\n\t\t\"fktrcfylhf\",\n\t\t\"deepthroat\",\n\t\t\"cinnamon\",\n\t\t\"chester1\",\n\t\t\"broadway\",\n\t\t\"01011988\",\n\t\t\"underdog\",\n\t\t\"sunnyday\",\n\t\t\"snoopdog\",\n\t\t\"multiplelo\",\n\t\t\"jasmine1\",\n\t\t\"Computer\",\n\t\t\"chemical\",\n\t\t\"chainsaw\",\n\t\t\"catherine\",\n\t\t\"canadian\",\n\t\t\"brighton\",\n\t\t\"australi\",\n\t\t\"alliance\",\n\t\t\"19721972\",\n\t\t\"19691969\",\n\t\t\"supersta\",\n\t\t\"snowboar\",\n\t\t\"r2d2c3po\",\n\t\t\"mechanic\",\n\t\t\"mamapapa\",\n\t\t\"golfgolf\",\n\t\t\"ghjcnjnfr\",\n\t\t\"downtown\",\n\t\t\"christopher\",\n\t\t\"chicken1\",\n\t\t\"bullseye\",\n\t\t\"20002000\",\n\t\t\"skorpion\",\n\t\t\"saturday\",\n\t\t\"peterson\",\n\t\t\"meredith\",\n\t\t\"lkjhgfdsa\",\n\t\t\"eastside\",\n\t\t\"blackhaw\",\n\t\t\"backdoor\",\n\t\t\"westwood\",\n\t\t\"sneakers\",\n\t\t\"Passwor1\",\n\t\t\"marino13\",\n\t\t\"jamesbond\",\n\t\t\"getmoney\",\n\t\t\"flounder\",\n\t\t\"boomboom\",\n\t\t\"beerbeer\",\n\t\t\"apple123\",\n\t\t\"01011987\",\n\t\t\"01011984\",\n\t\t\"undertaker\",\n\t\t\"sinclair\",\n\t\t\"samsung1\",\n\t\t\"moneyman\",\n\t\t\"mmmmmmmm\",\n\t\t\"marianne\",\n\t\t\"jjjjjjjj\",\n\t\t\"gargoyle\",\n\t\t\"federico\",\n\t\t\"amsterda\",\n\t\t\"1x2zkg8w\",\n\t\t\"19881988\",\n\t\t\"19741974\",\n\t\t\"zerocool\",\n\t\t\"vfvfgfgf\",\n\t\t\"test1234\",\n\t\t\"idontknow\",\n\t\t\"hahahaha\",\n\t\t\"cambiami\",\n\t\t\"a123456789\",\n\t\t\"19731973\",\n\t\t\"03082006\",\n\t\t\"02071986\",\n\t\t\"vfhufhbnf\",\n\t\t\"pppppppp\",\n\t\t\"motherlode\",\n\t\t\"lokomotiv\",\n\t\t\"kristine\",\n\t\t\"goldstar\",\n\t\t\"christina\",\n\t\t\"chrisbln\",\n\t\t\"america1\",\n\t\t\"20012001\",\n\t\t\"12345678q\",\n\t\t\"whitesox\",\n\t\t\"titanium\",\n\t\t\"thursday\",\n\t\t\"thirteen\",\n\t\t\"tazmania\",\n\t\t\"starfire\",\n\t\t\"qwerqwer\",\n\t\t\"qazwsx12\",\n\t\t\"panasoni\",\n\t\t\"paintbal\",\n\t\t\"newcastl\",\n\t\t\"hotpussy\",\n\t\t\"giuseppe\",\n\t\t\"buckshot\",\n\t\t\"babyblue\",\n\t\t\"attitude\",\n\t\t\"10203040\",\n\t\t\"01011910\",\n\t\t\"Superman\",\n\t\t\"sunflowe\",\n\t\t\"solution\",\n\t\t\"phillips\",\n\t\t\"knickers\",\n\t\t\"godfather\",\n\t\t\"clarinet\",\n\t\t\"assholes\",\n\t\t\"12345679\",\n\t\t\"tomorrow\",\n\t\t\"southpark\",\n\t\t\"sersolution\",\n\t\t\"rhfcjnrf\",\n\t\t\"qwerty1234\",\n\t\t\"paintball\",\n\t\t\"montgom240\",\n\t\t\"johannes\",\n\t\t\"intruder\",\n\t\t\"gesperrt\",\n\t\t\"francois\",\n\t\t\"dkflbckfd\",\n\t\t\"dfktynbyf\",\n\t\t\"christie\",\n\t\t\"callaway\",\n\t\t\"19821982\",\n\t\t\"19811981\",\n\t\t\"12qw34er\",\n\t\t\"123qwerty\",\n\t\t\"salamander\",\n\t\t\"resident\",\n\t\t\"poseidon\",\n\t\t\"pianoman\",\n\t\t\"chuckles\",\n\t\t\"avalanch\",\n\t\t\"1q2w3e4r5\",\n\t\t\"superman1\",\n\t\t\"rockford\",\n\t\t\"qwertyqwerty\",\n\t\t\"meowmeow\",\n\t\t\"meathead\",\n\t\t\"budweise\",\n\t\t\"19411945\",\n\t\t\"14725836\",\n\t\t\"01091989\",\n\t\t\"01011992\",\n\t\t\"triangle\",\n\t\t\"thanatos\",\n\t\t\"runescape\",\n\t\t\"gladiator\",\n\t\t\"crjhgbjy\",\n\t\t\"barefoot\",\n\t\t\"25252525\",\n\t\t\"02071982\",\n\t\t\"zxcvbnm1\",\n\t\t\"viewsonic\",\n\t\t\"traveler\",\n\t\t\"together\",\n\t\t\"spongebob\",\n\t\t\"original\",\n\t\t\"mohammed\",\n\t\t\"medicine\",\n\t\t\"mazafaka\",\n\t\t\"juliette\",\n\t\t\"james007\",\n\t\t\"hawkeyes\",\n\t\t\"deeznutz\",\n\t\t\"cerberus\",\n\t\t\"135792468\",\n\t\t\"12345qwe\",\n\t\t\"01234567\",\n\t\t\"01011975\",\n\t\t\"zxasqw12\",\n\t\t\"terrapin\",\n\t\t\"something\",\n\t\t\"philippe\",\n\t\t\"overkill\",\n\t\t\"monalisa\",\n\t\t\"illusion\",\n\t\t\"hoosiers\",\n\t\t\"hayabusa\",\n\t\t\"gfhjkm123\",\n\t\t\"francesc\",\n\t\t\"confused\",\n\t\t\"clevelan\",\n\t\t\"123456654321\",\n\t\t\"01011993\",\n\t\t\"tttttttt\",\n\t\t\"smeghead\",\n\t\t\"moonlight\",\n\t\t\"megatron\",\n\t\t\"cfitymrf\",\n\t\t\"casanova\",\n\t\t\"blackjack\",\n\t\t\"blablabla\",\n\t\t\"bbbbbbbb\",\n\t\t\"12301230\",\n\t\t\"syncmaster\",\n\t\t\"rhiannon\",\n\t\t\"lightning\",\n\t\t\"dddddddd\",\n\t\t\"brewster\",\n\t\t\"bookworm\",\n\t\t\"blessing\",\n\t\t\"babybaby\",\n\t\t\"aleksandra\",\n\t\t\"19961996\",\n\t\t\"19791979\",\n\t\t\"02091987\",\n\t\t\"02021987\",\n\t\t\"valencia\",\n\t\t\"thegreat\",\n\t\t\"packers1\",\n\t\t\"newpass6\",\n\t\t\"Michelle\",\n\t\t\"dutchess\",\n\t\t\"charles1\",\n\t\t\"alphabet\",\n\t\t\"19801980\",\n\t\t\"02081988\",\n\t\t\"02051986\",\n\t\t\"02041986\",\n\t\t\"02011985\",\n\t\t\"01011977\",\n\t\t\"roadrunn\",\n\t\t\"rjycnfynby\",\n\t\t\"rhtdtlrj\",\n\t\t\"mortgage\",\n\t\t\"goldwing\",\n\t\t\"christmas\",\n\t\t\"andromeda\",\n\t\t\"adrienne\",\n\t\t\"12345678a\",\n\t\t\"12011987\",\n\t\t\"02101985\",\n\t\t\"02031986\",\n\t\t\"02021988\",\n\t\t\"wrestling\",\n\t\t\"tinkerbell\",\n\t\t\"teddybea\",\n\t\t\"sinister\",\n\t\t\"shannon1\",\n\t\t\"motherfucker\",\n\t\t\"mortimer\",\n\t\t\"madison1\",\n\t\t\"handyman\",\n\t\t\"ghostrider\",\n\t\t\"doghouse\",\n\t\t\"balloons\",\n\t\t\"24682468\",\n\t\t\"02061985\",\n\t\t\"02011987\",\n\t\t\"wareagle\",\n\t\t\"roadking\",\n\t\t\"realmadrid\",\n\t\t\"PolniyPizdec0211\",\n\t\t\"nokia6300\",\n\t\t\"idontkno\",\n\t\t\"gameover\",\n\t\t\"claymore\",\n\t\t\"chicago1\",\n\t\t\"blackbir\",\n\t\t\"bcfields\",\n\t\t\"1357924680\",\n\t\t\"02091986\",\n\t\t\"02021986\",\n\t\t\"01011983\",\n\t\t\"whiskers\",\n\t\t\"valkyrie\",\n\t\t\"talisman\",\n\t\t\"starcraf\",\n\t\t\"sporting\",\n\t\t\"spaceman\",\n\t\t\"southpar\",\n\t\t\"lipstick\",\n\t\t\"kittykat\",\n\t\t\"inuyasha\",\n\t\t\"babyface\",\n\t\t\"7uGd5HIp2J\",\n\t\t\"02081987\",\n\t\t\"02081984\",\n\t\t\"02061986\",\n\t\t\"02021984\",\n\t\t\"01011982\",\n\t\t\"strength\",\n\t\t\"seahawks\",\n\t\t\"recovery\",\n\t\t\"qweqweqwe\",\n\t\t\"playstation\",\n\t\t\"leavemealone\",\n\t\t\"hardcock\",\n\t\t\"florida1\",\n\t\t\"flexible\",\n\t\t\"dragonball\",\n\t\t\"checkers\",\n\t\t\"charlene\",\n\t\t\"beautifu\",\n\t\t\"baseball1\",\n\t\t\"02031984\",\n\t\t\"02021985\",\n\t\t\"thedoors\",\n\t\t\"sullivan\",\n\t\t\"stanford\",\n\t\t\"mollydog\",\n\t\t\"illinois\",\n\t\t\"ghblehjr\",\n\t\t\"gamecube\",\n\t\t\"cannabis\",\n\t\t\"cameltoe\",\n\t\t\"bitchass\",\n\t\t\"armagedon\",\n\t\t\"alexalex\",\n\t\t\"987456321\",\n\t\t\"21031988\",\n\t\t\"123qq123\",\n\t\t\"1234567890a\",\n\t\t\"02081989\",\n\t\t\"02011986\",\n\t\t\"01020304\",\n\t\t\"01011999\",\n\t\t\"wishbone\",\n\t\t\"matthews\",\n\t\t\"mandarin\",\n\t\t\"lalalala\",\n\t\t\"godfathe\",\n\t\t\"gabriela\",\n\t\t\"ffffffff\",\n\t\t\"bluefish\",\n\t\t\"binladen\",\n\t\t\"19771977\",\n\t\t\"19761976\",\n\t\t\"02061989\",\n\t\t\"02041984\",\n\t\t\"tottenham\",\n\t\t\"tiberius\",\n\t\t\"teddybear\",\n\t\t\"silverad\",\n\t\t\"northern\",\n\t\t\"microphone\",\n\t\t\"electron\",\n\t\t\"dirtbike\",\n\t\t\"deadpool\",\n\t\t\"carpedie\",\n\t\t\"asdfzxcv\",\n\t\t\"amateurs\",\n\t\t\"absolute\",\n\t\t\"50spanks\",\n\t\t\"02021983\",\n\t\t\"vampires\",\n\t\t\"shanghai\",\n\t\t\"property\",\n\t\t\"password2\",\n\t\t\"netscape\",\n\t\t\"kakashka\",\n\t\t\"hawaiian\",\n\t\t\"gfhjkmgfhjkm\",\n\t\t\"fyutkbyf\",\n\t\t\"digital1\",\n\t\t\"caligula\",\n\t\t\"blackout\",\n\t\t\"15151515\",\n\t\t\"123456qw\",\n\t\t\"1234567891\",\n\t\t\"02051983\",\n\t\t\"02041983\",\n\t\t\"02031987\",\n\t\t\"02021989\",\n\t\t\"z1x2c3v4\",\n\t\t\"vSjasnel12\",\n\t\t\"testpass\",\n\t\t\"stonecold\",\n\t\t\"soulmate\",\n\t\t\"q2w3e4r5\",\n\t\t\"millions\",\n\t\t\"lineage2\",\n\t\t\"fuckoff1\",\n\t\t\"friendly\",\n\t\t\"fgtkmcby\",\n\t\t\"criminal\",\n\t\t\"coldbeer\",\n\t\t\"capslock\",\n\t\t\"bullfrog\",\n\t\t\"bobdylan\",\n\t\t\"babylove\",\n\t\t\"argentina\",\n\t\t\"annabell\",\n\t\t\"11221122\",\n\t\t\"02081986\",\n\t\t\"02041988\",\n\t\t\"02041987\",\n\t\t\"02041982\",\n\t\t\"02011988\",\n\t\t\"yeahbaby\",\n\t\t\"vasilisa\",\n\t\t\"sergeant\",\n\t\t\"reynolds\",\n\t\t\"newyork1\",\n\t\t\"magazine\",\n\t\t\"llllllll\",\n\t\t\"katherine\",\n\t\t\"jayhawks\",\n\t\t\"fishing1\",\n\t\t\"dragon12\",\n\t\t\"abnormal\",\n\t\t\"09876543\",\n\t\t\"02101984\",\n\t\t\"02081985\",\n\t\t\"02071984\",\n\t\t\"02011980\",\n\t\t\"01011979\",\n\t\t\"wg8e3wjf\",\n\t\t\"shitface\",\n\t\t\"salasana\",\n\t\t\"rebecca1\",\n\t\t\"pussyman\",\n\t\t\"pringles\",\n\t\t\"preacher\",\n\t\t\"heineken\",\n\t\t\"gatorade\",\n\t\t\"gabriell\",\n\t\t\"ferrari1\",\n\t\t\"eldorado\",\n\t\t\"coolness\",\n\t\t\"BASEBALL\",\n\t\t\"14141414\",\n\t\t\"02021982\",\n\t\t\"thunderb\",\n\t\t\"telephon\",\n\t\t\"specialk\",\n\t\t\"shepherd\",\n\t\t\"patience\",\n\t\t\"paranoid\",\n\t\t\"monster1\",\n\t\t\"missouri\",\n\t\t\"masamune\",\n\t\t\"mamamama\",\n\t\t\"laurence\",\n\t\t\"hopeless\",\n\t\t\"farscape\",\n\t\t\"estrella\",\n\t\t\"eastwood\",\n\t\t\"dragonba\",\n\t\t\"crystal1\",\n\t\t\"corleone\",\n\t\t\"chevrolet\",\n\t\t\"carlitos\",\n\t\t\"buttercu\",\n\t\t\"buddyboy\",\n\t\t\"24242424\",\n\t\t\"12365478\",\n\t\t\"02061988\",\n\t\t\"02031985\",\n\t\t\"yfcntymrf\",\n\t\t\"winston1\",\n\t\t\"slippery\",\n\t\t\"sandwich\",\n\t\t\"piramida\",\n\t\t\"monkey12\",\n\t\t\"millwall\",\n\t\t\"magician\",\n\t\t\"jackson5\",\n\t\t\"insomnia\",\n\t\t\"hardware\",\n\t\t\"fountain\",\n\t\t\"fastball\",\n\t\t\"elizaveta\",\n\t\t\"borussia\",\n\t\t\"andromed\",\n\t\t\"alejandro\",\n\t\t\"1234asdf\",\n\t\t\"02081982\",\n\t\t\"02051982\",\n\t\t\"windsurf\",\n\t\t\"wildcard\",\n\t\t\"universal\",\n\t\t\"sunflower\",\n\t\t\"strawberry\",\n\t\t\"reddevil\",\n\t\t\"pornporn\",\n\t\t\"polopolo\",\n\t\t\"pinkfloyd\",\n\t\t\"panther1\",\n\t\t\"jiggaman\",\n\t\t\"islander\",\n\t\t\"inspiron\",\n\t\t\"green123\",\n\t\t\"cristian\",\n\t\t\"1a2s3d4f\",\n\t\t\"123456qwe\",\n\t\t\"02061980\",\n\t\t\"02031982\",\n\t\t\"02011984\",\n\t\t\"zaqxswcde\",\n\t\t\"washington\",\n\t\t\"violetta\",\n\t\t\"smashing\",\n\t\t\"sexysexy\",\n\t\t\"robotics\",\n\t\t\"rjhjktdf\",\n\t\t\"reckless\",\n\t\t\"nightmare\",\n\t\t\"knockers\",\n\t\t\"killkill\",\n\t\t\"katherin\",\n\t\t\"jellybea\",\n\t\t\"hhhhhhhh\",\n\t\t\"gandalf1\",\n\t\t\"download\",\n\t\t\"doomsday\",\n\t\t\"devil666\",\n\t\t\"darklord\",\n\t\t\"classics\",\n\t\t\"chrysler\",\n\t\t\"browning\",\n\t\t\"barbados\",\n\t\t\"9293709b13\",\n\t\t\"20202020\",\n\t\t\"02091983\",\n\t\t\"02061987\",\n\t\t\"01081989\",\n\t\t\"yjdsqgfhjkm\",\n\t\t\"snowboard\",\n\t\t\"scrabble\",\n\t\t\"rhjrjlbk\",\n\t\t\"rainbow6\",\n\t\t\"qazwsxedc123\",\n\t\t\"pharmacy\",\n\t\t\"nevermind\",\n\t\t\"mariposa\",\n\t\t\"jakejake\",\n\t\t\"insanity\",\n\t\t\"graphics\",\n\t\t\"geoffrey\",\n\t\t\"firewall\",\n\t\t\"fandango\",\n\t\t\"augustus\",\n\t\t\"ashleigh\",\n\t\t\"321321321\",\n\t\t\"12051988\",\n\t\t\"05051987\",\n\t\t\"02101989\",\n\t\t\"02101987\",\n\t\t\"02071987\",\n\t\t\"02071980\",\n\t\t\"02041985\",\n\t\t\"sweetnes\",\n\t\t\"stanislav\",\n\t\t\"scorpio1\",\n\t\t\"rochelle\",\n\t\t\"radiohea\",\n\t\t\"pumpkins\",\n\t\t\"mobydick\",\n\t\t\"longjohn\",\n\t\t\"iverson3\",\n\t\t\"istanbul\",\n\t\t\"highheel\",\n\t\t\"happiness\",\n\t\t\"gamecock\",\n\t\t\"faithful\",\n\t\t\"creature\",\n\t\t\"creation\",\n\t\t\"concorde\",\n\t\t\"budapest\",\n\t\t\"19711971\",\n\t\t\"134679852\",\n\t\t\"02091984\",\n\t\t\"02091981\",\n\t\t\"02091980\",\n\t\t\"02061983\",\n\t\t\"02041981\",\n\t\t\"01011900\",\n\t\t\"windmill\",\n\t\t\"webhompas\",\n\t\t\"thisisit\",\n\t\t\"spongebo\",\n\t\t\"senators\",\n\t\t\"sausages\",\n\t\t\"pineapple\",\n\t\t\"nygiants\",\n\t\t\"moonbeam\",\n\t\t\"marcello\",\n\t\t\"maksimka\",\n\t\t\"loveless\",\n\t\t\"lollypop\",\n\t\t\"kleopatra\",\n\t\t\"katarina\",\n\t\t\"icehouse\",\n\t\t\"hooligan\",\n\t\t\"gertrude\",\n\t\t\"fullmoon\",\n\t\t\"fuckinside\",\n\t\t\"dynamite\",\n\t\t\"buttfuck\",\n\t\t\"bulldog1\",\n\t\t\"brittney\",\n\t\t\"aviation\",\n\t\t\"22041987\",\n\t\t\"20022002\",\n\t\t\"05051985\",\n\t\t\"02081977\",\n\t\t\"02071988\",\n\t\t\"02051988\",\n\t\t\"02051987\",\n\t\t\"02041979\",\n\t\t\"webmaste\",\n\t\t\"radiohead\",\n\t\t\"platypus\",\n\t\t\"monkeybo\",\n\t\t\"Michael1\",\n\t\t\"master12\",\n\t\t\"heritage\",\n\t\t\"Good123654\",\n\t\t\"festival\",\n\t\t\"evolution\",\n\t\t\"dolphin1\",\n\t\t\"cccccccc\",\n\t\t\"a12345678\",\n\t\t\"26061987\",\n\t\t\"15051981\",\n\t\t\"08031986\",\n\t\t\"02061984\",\n\t\t\"02061982\",\n\t\t\"02051989\",\n\t\t\"02051984\",\n\t\t\"02031981\",\n\t\t\"woodland\",\n\t\t\"whiteout\",\n\t\t\"vanguard\",\n\t\t\"temppass\",\n\t\t\"reddwarf\",\n\t\t\"pussy123\",\n\t\t\"forsaken\",\n\t\t\"Football\",\n\t\t\"ferguson\",\n\t\t\"earnhard\",\n\t\t\"coolcool\",\n\t\t\"7894561230\",\n\t\t\"21031987\",\n\t\t\"13041988\",\n\t\t\"11051987\",\n\t\t\"10011986\",\n\t\t\"06061986\",\n\t\t\"02091985\",\n\t\t\"02021981\",\n\t\t\"02021979\",\n\t\t\"01031988\",\n\t\t\"tiger123\",\n\t\t\"summer99\",\n\t\t\"starstar\",\n\t\t\"snowflak\",\n\t\t\"slamdunk\",\n\t\t\"playboy1\",\n\t\t\"michael2\",\n\t\t\"mephisto\",\n\t\t\"kkkkkkkk\",\n\t\t\"kjrjvjnbd\",\n\t\t\"killer12\",\n\t\t\"iloveyou2\",\n\t\t\"holidays\",\n\t\t\"harrypotter\",\n\t\t\"gorgeous\",\n\t\t\"dudedude\",\n\t\t\"andersen\",\n\t\t\"02101986\",\n\t\t\"02081983\",\n\t\t\"02041989\",\n\t\t\"02011989\",\n\t\t\"01011978\",\n\t\t\"zxcvbnm123\",\n\t\t\"volkswag\",\n\t\t\"solitude\",\n\t\t\"scoobydoo\",\n\t\t\"roadster\",\n\t\t\"presiden\",\n\t\t\"pool6123\",\n\t\t\"playstat\",\n\t\t\"pipeline\",\n\t\t\"mypassword\",\n\t\t\"mazdarx7\",\n\t\t\"lemonade\",\n\t\t\"krasotka\",\n\t\t\"koroleva\",\n\t\t\"irishman\",\n\t\t\"hawaii50\",\n\t\t\"gabriel1\",\n\t\t\"freefree\",\n\t\t\"francesco\",\n\t\t\"christma\",\n\t\t\"chipmunk\",\n\t\t\"brigitte\",\n\t\t\"bigblock\",\n\t\t\"bergkamp\",\n\t\t\"bearcats\",\n\t\t\"74108520\",\n\t\t\"45M2DO5BS\",\n\t\t\"30051985\",\n\t\t\"24061986\",\n\t\t\"22021989\",\n\t\t\"21011989\",\n\t\t\"20061988\",\n\t\t\"1z2x3c4v\",\n\t\t\"14061991\",\n\t\t\"13041987\",\n\t\t\"12021988\",\n\t\t\"11081989\",\n\t\t\"03041991\",\n\t\t\"02071981\",\n\t\t\"02031979\",\n\t\t\"02021976\",\n\t\t\"01061990\",\n\t\t\"01011960\",\n\t\t\"yankees2\",\n\t\t\"wireless\",\n\t\t\"tiffany1\",\n\t\t\"starligh\",\n\t\t\"register\",\n\t\t\"pallmall\",\n\t\t\"nascar24\",\n\t\t\"mudvayne\",\n\t\t\"monsters\",\n\t\t\"mckenzie\",\n\t\t\"mazda626\",\n\t\t\"kisskiss\",\n\t\t\"gonzalez\",\n\t\t\"gbhfvblf\",\n\t\t\"freebird\",\n\t\t\"fantasia\",\n\t\t\"comanche\",\n\t\t\"choochoo\",\n\t\t\"chambers\",\n\t\t\"borabora\",\n\t\t\"asdfgh01\",\n\t\t\"alessandro\",\n\t\t\"abrakadabra\",\n\t\t\"7777777777\",\n\t\t\"23456789\",\n\t\t\"23041987\",\n\t\t\"19701970\",\n\t\t\"18011987\",\n\t\t\"123456789s\",\n\t\t\"07071987\",\n\t\t\"02091989\",\n\t\t\"02071989\",\n\t\t\"02071983\",\n\t\t\"02021973\",\n\t\t\"02011981\",\n\t\t\"01121986\",\n\t\t\"01071986\",\n\t\t\"yogibear\",\n\t\t\"wanderer\",\n\t\t\"viktoriya\",\n\t\t\"undertak\",\n\t\t\"underground\",\n\t\t\"tropical\",\n\t\t\"threesom\",\n\t\t\"slowhand\",\n\t\t\"sheridan\",\n\t\t\"marianna\",\n\t\t\"kissmyass\",\n\t\t\"just4fun\",\n\t\t\"ghjcnjgfhjkm\",\n\t\t\"FOOTBALL\",\n\t\t\"fishhead\",\n\t\t\"firefire\",\n\t\t\"excalibur\",\n\t\t\"customer\",\n\t\t\"cocksuck\",\n\t\t\"cameron1\",\n\t\t\"berkeley\",\n\t\t\"andyod22\",\n\t\t\"28041987\",\n\t\t\"25081988\",\n\t\t\"24011985\",\n\t\t\"20111986\",\n\t\t\"19651965\",\n\t\t\"19101987\",\n\t\t\"19061987\",\n\t\t\"14111986\",\n\t\t\"13031987\",\n\t\t\"123456123\",\n\t\t\"12121990\",\n\t\t\"10071987\",\n\t\t\"10031988\",\n\t\t\"02101988\",\n\t\t\"02081980\",\n\t\t\"02021990\",\n\t\t\"01091987\",\n\t\t\"01041985\",\n\t\t\"01011995\",\n\t\t\"zanzibar\",\n\t\t\"training\",\n\t\t\"sweetness\",\n\t\t\"president\",\n\t\t\"password12\",\n\t\t\"lovelife\",\n\t\t\"longdong\",\n\t\t\"johndeer\",\n\t\t\"jefferso\",\n\t\t\"james123\",\n\t\t\"jackjack\",\n\t\t\"fishbone\",\n\t\t\"drummer1\",\n\t\t\"coventry\",\n\t\t\"catwoman\",\n\t\t\"28021992\",\n\t\t\"25800852\",\n\t\t\"22011988\",\n\t\t\"19971997\",\n\t\t\"17051988\",\n\t\t\"14021985\",\n\t\t\"13061986\",\n\t\t\"12121985\",\n\t\t\"11061985\",\n\t\t\"10101986\",\n\t\t\"10051987\",\n\t\t\"10011990\",\n\t\t\"09051945\",\n\t\t\"08121986\",\n\t\t\"04041991\",\n\t\t\"03041986\",\n\t\t\"02101983\",\n\t\t\"02101981\",\n\t\t\"02031989\",\n\t\t\"02031980\",\n\t\t\"01121988\",\n\t\t\"survivor\",\n\t\t\"sundevil\",\n\t\t\"straight\",\n\t\t\"revolver\",\n\t\t\"qwerty11\",\n\t\t\"qweasd123\",\n\t\t\"paradigm\",\n\t\t\"nonenone\",\n\t\t\"michaels\",\n\t\t\"ghjuhfvvf\",\n\t\t\"fairlane\",\n\t\t\"everlast\",\n\t\t\"chestnut\",\n\t\t\"broncos1\",\n\t\t\"antelope\",\n\t\t\"anastasiya\",\n\t\t\"456456456\",\n\t\t\"30041986\",\n\t\t\"29071983\",\n\t\t\"29051989\",\n\t\t\"29011985\",\n\t\t\"28021990\",\n\t\t\"28011987\",\n\t\t\"27061988\",\n\t\t\"25121987\",\n\t\t\"25031987\",\n\t\t\"22021986\",\n\t\t\"21031990\",\n\t\t\"20091991\",\n\t\t\"20031987\",\n\t\t\"19681968\",\n\t\t\"17061988\",\n\t\t\"16051989\",\n\t\t\"16051987\",\n\t\t\"11051990\",\n\t\t\"08051990\",\n\t\t\"05051989\",\n\t\t\"04041988\",\n\t\t\"02051980\",\n\t\t\"02051976\",\n\t\t\"02041980\",\n\t\t\"02031977\",\n\t\t\"02011983\",\n\t\t\"01061986\",\n\t\t\"01041988\",\n\t\t\"01011994\",\n\t\t\"zxcasdqwe123\",\n\t\t\"washburn\",\n\t\t\"vfitymrf\",\n\t\t\"soccer12\",\n\t\t\"soccer10\",\n\t\t\"smirnoff\",\n\t\t\"sasha_007\",\n\t\t\"rrrrrrrr\",\n\t\t\"qwert12345\",\n\t\t\"pumpkin1\",\n\t\t\"porsche1\",\n\t\t\"noname123\",\n\t\t\"newcastle\",\n\t\t\"marseille\",\n\t\t\"marjorie\",\n\t\t\"hurricane\",\n\t\t\"honolulu\",\n\t\t\"highbury\",\n\t\t\"gilligan\",\n\t\t\"eeeeeeee\",\n\t\t\"death666\",\n\t\t\"costello\",\n\t\t\"baritone\",\n\t\t\"31011987\",\n\t\t\"30031988\",\n\t\t\"22071986\",\n\t\t\"21101986\",\n\t\t\"21051991\",\n\t\t\"20091988\",\n\t\t\"20051988\",\n\t\t\"19661966\",\n\t\t\"18091985\",\n\t\t\"18061990\",\n\t\t\"15101986\",\n\t\t\"15051990\",\n\t\t\"15011987\",\n\t\t\"13121985\",\n\t\t\"12qw12qw\",\n\t\t\"12031987\",\n\t\t\"12031985\",\n\t\t\"11121986\",\n\t\t\"08081988\",\n\t\t\"08031985\",\n\t\t\"03031986\",\n\t\t\"02101979\",\n\t\t\"02071979\",\n\t\t\"02071978\",\n\t\t\"02051985\",\n\t\t\"02051978\",\n\t\t\"02051973\",\n\t\t\"02041975\",\n\t\t\"02041974\",\n\t\t\"02031988\",\n\t\t\"02011982\",\n\t\t\"01031989\",\n\t\t\"01011974\",\n\t\t\"wwwwwwww\",\n\t\t\"wildwood\",\n\t\t\"wildbill\",\n\t\t\"superior\",\n\t\t\"stefanie\",\n\t\t\"sidekick\",\n\t\t\"remingto\",\n\t\t\"redbaron\",\n\t\t\"question\",\n\t\t\"moonligh\",\n\t\t\"mischief\",\n\t\t\"ministry\",\n\t\t\"minemine\",\n\t\t\"Kordell1\",\n\t\t\"knuckles\",\n\t\t\"fuckhead\",\n\t\t\"freefall\",\n\t\t\"fantomas\",\n\t\t\"elcamino\",\n\t\t\"coldplay\",\n\t\t\"clippers\",\n\t\t\"carpente\",\n\t\t\"capricorn\",\n\t\t\"calimero\",\n\t\t\"bluesman\",\n\t\t\"bluebell\",\n\t\t\"Baseball\",\n\t\t\"armstron\",\n\t\t\"angelika\",\n\t\t\"angel123\",\n\t\t\"30041987\",\n\t\t\"27081990\",\n\t\t\"26031988\",\n\t\t\"25091987\",\n\t\t\"25041988\",\n\t\t\"24111989\",\n\t\t\"23021986\",\n\t\t\"22041988\",\n\t\t\"22031984\",\n\t\t\"21051988\",\n\t\t\"17011987\",\n\t\t\"16121987\",\n\t\t\"15021985\",\n\t\t\"14021986\",\n\t\t\"13021990\",\n\t\t\"123456ru\",\n\t\t\"10101990\",\n\t\t\"10041986\",\n\t\t\"07091990\",\n\t\t\"02051981\",\n\t\t\"01031985\",\n\t\t\"01021990\",\n\t\t\"zildjian\",\n\t\t\"WP2003WP\",\n\t\t\"valentine\",\n\t\t\"trinitro\",\n\t\t\"swinging\",\n\t\t\"rfvfcenhf\",\n\t\t\"pufunga7782\",\n\t\t\"palmtree\",\n\t\t\"nostromo\",\n\t\t\"johngalt\",\n\t\t\"iloveyou1\",\n\t\t\"foxylady\",\n\t\t\"fishfish\",\n\t\t\"fearless\",\n\t\t\"enforcer\",\n\t\t\"david123\",\n\t\t\"cutiepie\",\n\t\t\"cheshire\",\n\t\t\"cherries\",\n\t\t\"capricor\",\n\t\t\"blueball\",\n\t\t\"blowfish\",\n\t\t\"31031988\",\n\t\t\"25091990\",\n\t\t\"25011990\",\n\t\t\"24111987\",\n\t\t\"23031990\",\n\t\t\"22061988\",\n\t\t\"21011991\",\n\t\t\"21011988\",\n\t\t\"19283746\",\n\t\t\"19031985\",\n\t\t\"19011989\",\n\t\t\"18091986\",\n\t\t\"17111985\",\n\t\t\"16051988\",\n\t\t\"15071987\",\n\t\t\"14081985\",\n\t\t\"13071984\",\n\t\t\"12081985\",\n\t\t\"11021985\",\n\t\t\"10071988\",\n\t\t\"09021988\",\n\t\t\"05061990\",\n\t\t\"02051972\",\n\t\t\"02041978\",\n\t\t\"02031983\",\n\t\t\"01091985\",\n\t\t\"01031984\",\n\t\t\"01012009\",\n\t\t\"yamahar1\",\n\t\t\"whistler\",\n\t\t\"vjqgfhjkm\",\n\t\t\"universa\",\n\t\t\"strawber\",\n\t\t\"sprinter\",\n\t\t\"spencer1\",\n\t\t\"sonyfuck\",\n\t\t\"slimshady\",\n\t\t\"screamer\",\n\t\t\"Princess\",\n\t\t\"papillon\",\n\t\t\"oooooooo\",\n\t\t\"Maverick\",\n\t\t\"marcius2\",\n\t\t\"lalakers\",\n\t\t\"lakeside\",\n\t\t\"jermaine\",\n\t\t\"honeybee\",\n\t\t\"highlander\",\n\t\t\"ghbywtccf\",\n\t\t\"ghbdtn123\",\n\t\t\"earthlink\",\n\t\t\"cygnusx1\",\n\t\t\"cleopatr\",\n\t\t\"carnival\",\n\t\t\"buddy123\",\n\t\t\"arkansas\",\n\t\t\"anastasi\",\n\t\t\"30081984\",\n\t\t\"25101988\",\n\t\t\"23051985\",\n\t\t\"23041986\",\n\t\t\"23021989\",\n\t\t\"22121987\",\n\t\t\"22091988\",\n\t\t\"22071987\",\n\t\t\"22021988\",\n\t\t\"20052005\",\n\t\t\"19051987\",\n\t\t\"15041988\",\n\t\t\"15011985\",\n\t\t\"14021990\",\n\t\t\"14011986\",\n\t\t\"13051987\",\n\t\t\"13011988\",\n\t\t\"13011987\",\n\t\t\"12061988\",\n\t\t\"12041988\",\n\t\t\"12041986\",\n\t\t\"11071988\",\n\t\t\"11031988\",\n\t\t\"10081989\",\n\t\t\"08081986\",\n\t\t\"07071990\",\n\t\t\"07071977\",\n\t\t\"05071984\",\n\t\t\"04041983\",\n\t\t\"03021986\",\n\t\t\"02091988\",\n\t\t\"02081976\",\n\t\t\"02051977\",\n\t\t\"02031978\",\n\t\t\"01071987\",\n\t\t\"01041987\",\n\t\t\"01011976\",\n\t\t\"zachary1\",\n\t\t\"wrestler\",\n\t\t\"vendetta\",\n\t\t\"tkbpfdtnf\",\n\t\t\"terminat\",\n\t\t\"telephone\",\n\t\t\"smackdow\",\n\t\t\"sandrine\",\n\t\t\"qwe123qwe\",\n\t\t\"opendoor\",\n\t\t\"nautilus\",\n\t\t\"mustang6\",\n\t\t\"Misfit99\",\n\t\t\"marseill\",\n\t\t\"magellan\",\n\t\t\"Letmein1\",\n\t\t\"leedsutd\",\n\t\t\"jackass1\",\n\t\t\"hounddog\",\n\t\t\"hetfield\",\n\t\t\"gtnhjdbx\",\n\t\t\"ghhh47hj7649\",\n\t\t\"fkbyjxrf\",\n\t\t\"espresso\",\n\t\t\"dontknow\",\n\t\t\"dogpound\",\n\t\t\"complete\",\n\t\t\"bismillah\",\n\t\t\"argentin\",\n\t\t\"30041985\",\n\t\t\"29071985\",\n\t\t\"29061990\",\n\t\t\"27071987\",\n\t\t\"27061985\",\n\t\t\"27041990\",\n\t\t\"26031990\",\n\t\t\"24031988\",\n\t\t\"23051990\",\n\t\t\"22011986\",\n\t\t\"21061986\",\n\t\t\"20121989\",\n\t\t\"20092009\",\n\t\t\"20091986\",\n\t\t\"20081991\",\n\t\t\"20041988\",\n\t\t\"20041986\",\n\t\t\"19671967\",\n\t\t\"19121989\",\n\t\t\"19061990\",\n\t\t\"18101987\",\n\t\t\"18051988\",\n\t\t\"18041986\",\n\t\t\"18021984\",\n\t\t\"17101986\",\n\t\t\"17061989\",\n\t\t\"17041991\",\n\t\t\"16021990\",\n\t\t\"15071988\",\n\t\t\"15071986\",\n\t\t\"14101987\",\n\t\t\"135798642\",\n\t\t\"13061987\",\n\t\t\"1234zxcv\",\n\t\t\"12071989\",\n\t\t\"11121985\",\n\t\t\"11061991\",\n\t\t\"10121987\",\n\t\t\"10101985\",\n\t\t\"10031987\",\n\t\t\"09041987\",\n\t\t\"09031988\",\n\t\t\"06041988\",\n\t\t\"05071988\",\n\t\t\"03081989\",\n\t\t\"02071985\",\n\t\t\"02071975\",\n\t\t\"01051989\",\n\t\t\"01041992\",\n\t\t\"01041990\",\n\t\t\"whiteboy\",\n\t\t\"waterboy\",\n\t\t\"vikings1\",\n\t\t\"viewsoni\",\n\t\t\"penguin1\",\n\t\t\"Password123\",\n\t\t\"optimist\",\n\t\t\"moonshin\",\n\t\t\"mcdonald\",\n\t\t\"limewire\",\n\t\t\"konstantin\",\n\t\t\"jonathon\",\n\t\t\"johncena\",\n\t\t\"intercourse\",\n\t\t\"harddick\",\n\t\t\"gladiato\",\n\t\t\"fortress\",\n\t\t\"clarissa\",\n\t\t\"capetown\",\n\t\t\"camaross\",\n\t\t\"callisto\",\n\t\t\"bigpoppa\",\n\t\t\"alexandre\",\n\t\t\"9999999999\",\n\t\t\"30011985\",\n\t\t\"29051985\",\n\t\t\"26061985\",\n\t\t\"25111987\",\n\t\t\"25071990\",\n\t\t\"22081986\",\n\t\t\"22061989\",\n\t\t\"21061985\",\n\t\t\"20082008\",\n\t\t\"20021988\",\n\t\t\"19981998\",\n\t\t\"16051985\",\n\t\t\"15111988\",\n\t\t\"15051985\",\n\t\t\"15021990\",\n\t\t\"14041988\",\n\t\t\"12345qwerty\",\n\t\t\"12121988\",\n\t\t\"12051990\",\n\t\t\"12051986\",\n\t\t\"12041990\",\n\t\t\"11091989\",\n\t\t\"11051986\",\n\t\t\"11051984\",\n\t\t\"10061986\",\n\t\t\"06081987\",\n\t\t\"06021987\",\n\t\t\"04041990\",\n\t\t\"02081981\",\n\t\t\"02061977\",\n\t\t\"02041977\",\n\t\t\"02031975\",\n\t\t\"01121987\",\n\t\t\"01061988\",\n\t\t\"01031986\",\n\t\t\"01021989\",\n\t\t\"01021988\",\n\t\t\"university\",\n\t\t\"trucking\",\n\t\t\"transfer\",\n\t\t\"tomahawk\",\n\t\t\"suckmydick\",\n\t\t\"suburban\",\n\t\t\"stratfor\",\n\t\t\"shadow12\",\n\t\t\"private1\",\n\t\t\"printing\",\n\t\t\"pentagon\",\n\t\t\"notebook\",\n\t\t\"nokian73\",\n\t\t\"matthias\",\n\t\t\"marijuan\",\n\t\t\"mandrake\",\n\t\t\"mamacita\",\n\t\t\"kayleigh\",\n\t\t\"hotgirls\",\n\t\t\"hellokitty\",\n\t\t\"hallo123\",\n\t\t\"funstuff\",\n\t\t\"fredrick\",\n\t\t\"firefigh\",\n\t\t\"eggplant\",\n\t\t\"dfktynby\",\n\t\t\"derparol\",\n\t\t\"cleopatra\",\n\t\t\"cbr900rr\",\n\t\t\"barselona\",\n\t\t\"asdqwe123\",\n\t\t\"almighty\",\n\t\t\"absolutely\",\n\t\t\"29061989\",\n\t\t\"28051987\",\n\t\t\"27081986\",\n\t\t\"25061985\",\n\t\t\"25011986\",\n\t\t\"24091986\",\n\t\t\"24061988\",\n\t\t\"24031990\",\n\t\t\"21081987\",\n\t\t\"21041992\",\n\t\t\"20031991\",\n\t\t\"19061985\",\n\t\t\"18111987\",\n\t\t\"18021988\",\n\t\t\"17071989\",\n\t\t\"17031987\",\n\t\t\"16051990\",\n\t\t\"15021986\",\n\t\t\"14031988\",\n\t\t\"14021987\",\n\t\t\"14011989\",\n\t\t\"11011990\",\n\t\t\"10011983\",\n\t\t\"09021989\",\n\t\t\"07051990\",\n\t\t\"06051986\",\n\t\t\"05091988\",\n\t\t\"05081988\",\n\t\t\"04061986\",\n\t\t\"04041985\",\n\t\t\"03041980\",\n\t\t\"02101976\",\n\t\t\"02071976\",\n\t\t\"02061976\",\n\t\t\"02011975\",\n\t\t\"01031983\",\n\t\t\"washingt\",\n\t\t\"warrior1\",\n\t\t\"username\",\n\t\t\"Trustno1\",\n\t\t\"tinkerbe\",\n\t\t\"suckdick\",\n\t\t\"southpaw\",\n\t\t\"sexylady\",\n\t\t\"rocknrol\",\n\t\t\"rfhnjirf\",\n\t\t\"progress\",\n\t\t\"obsidian\",\n\t\t\"nirvana1\",\n\t\t\"nineinch\",\n\t\t\"navigator\",\n\t\t\"money123\",\n\t\t\"modelsne\",\n\t\t\"minimoni\",\n\t\t\"millenium\",\n\t\t\"marriage\",\n\t\t\"marines1\",\n\t\t\"marijuana\",\n\t\t\"htubcnhfwbz\",\n\t\t\"heinrich\",\n\t\t\"handball\",\n\t\t\"facebook\",\n\t\t\"dominion\",\n\t\t\"darkangel\",\n\t\t\"cricket1\",\n\t\t\"chris123\",\n\t\t\"challeng\",\n\t\t\"bubba123\",\n\t\t\"bluejays\",\n\t\t\"antonina\",\n\t\t\"28051986\",\n\t\t\"28021985\",\n\t\t\"27031989\",\n\t\t\"26021987\",\n\t\t\"25101989\",\n\t\t\"25061986\",\n\t\t\"25041985\",\n\t\t\"25011985\",\n\t\t\"24061987\",\n\t\t\"23021985\",\n\t\t\"23011985\",\n\t\t\"22121986\",\n\t\t\"22121983\",\n\t\t\"22081983\",\n\t\t\"22071989\",\n\t\t\"22061987\",\n\t\t\"22061941\",\n\t\t\"22041986\",\n\t\t\"22021985\",\n\t\t\"21021985\",\n\t\t\"20031988\",\n\t\t\"19101990\",\n\t\t\"19071988\",\n\t\t\"19071986\",\n\t\t\"18061985\",\n\t\t\"18051990\",\n\t\t\"17071985\",\n\t\t\"16111990\",\n\t\t\"16061986\",\n\t\t\"16011989\",\n\t\t\"15081991\",\n\t\t\"15051987\",\n\t\t\"14071987\",\n\t\t\"13031986\",\n\t\t\"12101988\",\n\t\t\"12081984\",\n\t\t\"12071987\",\n\t\t\"11121987\",\n\t\t\"11081987\",\n\t\t\"11071985\",\n\t\t\"11011991\",\n\t\t\"08071987\",\n\t\t\"08061987\",\n\t\t\"05061986\",\n\t\t\"04061991\",\n\t\t\"03111987\",\n\t\t\"03071987\",\n\t\t\"02091976\",\n\t\t\"02081979\",\n\t\t\"02041976\",\n\t\t\"02031973\",\n\t\t\"02021991\",\n\t\t\"02021980\",\n\t\t\"02021971\",\n\t\t\"whatwhat\",\n\t\t\"Welcome1\",\n\t\t\"VQsaBLPzLa\",\n\t\t\"theforce\",\n\t\t\"sylveste\",\n\t\t\"stephane\",\n\t\t\"sheepdog\",\n\t\t\"services\",\n\t\t\"roadrunner\",\n\t\t\"republic\",\n\t\t\"paramedi\",\n\t\t\"masterbate\",\n\t\t\"margarit\",\n\t\t\"ilikepie\",\n\t\t\"homework\",\n\t\t\"hattrick\",\n\t\t\"hardball\",\n\t\t\"goodgirl\",\n\t\t\"friendster\",\n\t\t\"flipflop\",\n\t\t\"f00tball\",\n\t\t\"evolutio\",\n\t\t\"dukeduke\",\n\t\t\"cucumber\",\n\t\t\"cnfybckfd\",\n\t\t\"chiquita\",\n\t\t\"castillo\",\n\t\t\"bigdicks\",\n\t\t\"31121990\",\n\t\t\"30121987\",\n\t\t\"29121987\",\n\t\t\"29111989\",\n\t\t\"29081990\",\n\t\t\"29081985\",\n\t\t\"29051990\",\n\t\t\"27272727\",\n\t\t\"27091985\",\n\t\t\"27031987\",\n\t\t\"26031987\",\n\t\t\"26031984\",\n\t\t\"24051990\",\n\t\t\"23061990\",\n\t\t\"22061990\",\n\t\t\"22041985\",\n\t\t\"22031991\",\n\t\t\"22021990\",\n\t\t\"21111985\",\n\t\t\"21041985\",\n\t\t\"20021986\",\n\t\t\"19071990\",\n\t\t\"19051986\",\n\t\t\"19011987\",\n\t\t\"17171717\",\n\t\t\"17061986\",\n\t\t\"17041987\",\n\t\t\"16101987\",\n\t\t\"16031990\",\n\t\t\"15091987\",\n\t\t\"15081988\",\n\t\t\"15071985\",\n\t\t\"15011986\",\n\t\t\"14101988\",\n\t\t\"14071988\",\n\t\t\"14051990\",\n\t\t\"14021983\",\n\t\t\"13111990\",\n\t\t\"12121987\",\n\t\t\"12121982\",\n\t\t\"12061986\",\n\t\t\"12011989\",\n\t\t\"11111987\",\n\t\t\"11081990\",\n\t\t\"10111986\",\n\t\t\"10031991\",\n\t\t\"09090909\",\n\t\t\"08051987\",\n\t\t\"08041986\",\n\t\t\"05051990\",\n\t\t\"04081987\",\n\t\t\"04051988\",\n\t\t\"03061987\",\n\t\t\"03031993\",\n\t\t\"03031988\",\n\t\t\"02101980\",\n\t\t\"02101977\",\n\t\t\"02091977\",\n\t\t\"02091975\",\n\t\t\"02061979\",\n\t\t\"02051975\",\n\t\t\"01081990\",\n\t\t\"01061987\",\n\t\t\"01011971\",\n\t\t\"toriamos\",\n\t\t\"taekwondo\",\n\t\t\"sonyericsson\",\n\t\t\"slimshad\",\n\t\t\"skateboard\",\n\t\t\"riccardo\",\n\t\t\"rfntymrf\",\n\t\t\"prospect\",\n\t\t\"penetration\",\n\t\t\"peaches1\",\n\t\t\"nokia6233\",\n\t\t\"nightwish\",\n\t\t\"Mercedes\",\n\t\t\"maxwell1\",\n\t\t\"mash4077\",\n\t\t\"lakewood\",\n\t\t\"krokodil\",\n\t\t\"hairball\",\n\t\t\"evangelion\",\n\t\t\"dolemite\",\n\t\t\"cromwell\",\n\t\t\"cassandr\",\n\t\t\"cabernet\",\n\t\t\"budweiser\",\n\t\t\"bastards\",\n\t\t\"azertyui\",\n\t\t\"aolsucks\",\n\t\t\"45454545\",\n\t\t\"31011990\",\n\t\t\"29011987\",\n\t\t\"28071986\",\n\t\t\"28021986\",\n\t\t\"27051987\",\n\t\t\"27011988\",\n\t\t\"26051988\",\n\t\t\"26041991\",\n\t\t\"26041986\",\n\t\t\"25011993\",\n\t\t\"24121986\",\n\t\t\"24061992\",\n\t\t\"24021991\",\n\t\t\"24011990\",\n\t\t\"23051986\",\n\t\t\"23021988\",\n\t\t\"23011990\",\n\t\t\"21121986\",\n\t\t\"21111990\",\n\t\t\"21071989\",\n\t\t\"20071986\",\n\t\t\"20051985\",\n\t\t\"20011989\",\n\t\t\"19111987\",\n\t\t\"19091988\",\n\t\t\"18041990\",\n\t\t\"18021986\",\n\t\t\"18011986\",\n\t\t\"17101987\",\n\t\t\"17091987\",\n\t\t\"17021985\",\n\t\t\"17011990\",\n\t\t\"16061985\",\n\t\t\"15051986\",\n\t\t\"14881488\",\n\t\t\"14121989\",\n\t\t\"14081988\",\n\t\t\"14071986\",\n\t\t\"13111984\",\n\t\t\"12121989\",\n\t\t\"12101985\",\n\t\t\"12051985\",\n\t\t\"11071986\",\n\t\t\"11011987\",\n\t\t\"10293847\",\n\t\t\"10081985\",\n\t\t\"10061987\",\n\t\t\"10041983\",\n\t\t\"07091982\",\n\t\t\"07081986\",\n\t\t\"06061987\",\n\t\t\"06041987\",\n\t\t\"06031983\",\n\t\t\"04091986\",\n\t\t\"03071986\",\n\t\t\"03051987\",\n\t\t\"03051986\",\n\t\t\"03031990\",\n\t\t\"03011987\",\n\t\t\"02101978\",\n\t\t\"02091973\",\n\t\t\"02081974\",\n\t\t\"02071977\",\n\t\t\"02071971\",\n\t\t\"0192837465\",\n\t\t\"01051988\",\n\t\t\"01051986\",\n\t\t\"01011973\",\n\t\t\"Victoria\",\n\t\t\"vauxhall\",\n\t\t\"vancouve\",\n\t\t\"touching\",\n\t\t\"tokiohotel\",\n\t\t\"supernov\",\n\t\t\"speakers\",\n\t\t\"spartan1\",\n\t\t\"sigmachi\",\n\t\t\"rocknroll\",\n\t\t\"rainyday\",\n\t\t\"q123456789\",\n\t\t\"puppydog\",\n\t\t\"power123\",\n\t\t\"poiuytre\",\n\t\t\"phialpha\",\n\t\t\"penthous\",\n\t\t\"pavement\",\n\t\t\"nthvbyfnjh\",\n\t\t\"nnnnnnnn\",\n\t\t\"mulligan\",\n\t\t\"mississippi\",\n\t\t\"lonesome\",\n\t\t\"lighting\",\n\t\t\"klondike\",\n\t\t\"kazantip\",\n\t\t\"ironmaiden\",\n\t\t\"homemade\",\n\t\t\"herewego\",\n\t\t\"gonzales\",\n\t\t\"goldfing\",\n\t\t\"genesis1\",\n\t\t\"fyfnjkbq\",\n\t\t\"forgetit\",\n\t\t\"flamengo\",\n\t\t\"favorite6\",\n\t\t\"exchange\",\n\t\t\"enternow\",\n\t\t\"dodgers1\",\n\t\t\"delaware\",\n\t\t\"darkange\",\n\t\t\"commande\",\n\t\t\"cashmone\",\n\t\t\"bordeaux\",\n\t\t\"billabon\",\n\t\t\"benessere\",\n\t\t\"awesome1\",\n\t\t\"asdffdsa\",\n\t\t\"archange\",\n\t\t\"annmarie\",\n\t\t\"ambrosia\",\n\t\t\"alleycat\",\n\t\t\"aaaaaaaaaa\",\n\t\t\"43214321\",\n\t\t\"369258147\",\n\t\t\"31121988\",\n\t\t\"31121987\",\n\t\t\"30061987\",\n\t\t\"30011986\",\n\t\t\"29041985\",\n\t\t\"28121984\",\n\t\t\"28061986\",\n\t\t\"28041992\",\n\t\t\"28031982\",\n\t\t\"27111985\",\n\t\t\"27021991\",\n\t\t\"26111985\",\n\t\t\"26101986\",\n\t\t\"26091986\",\n\t\t\"26031986\",\n\t\t\"25021988\",\n\t\t\"24111990\",\n\t\t\"24101986\",\n\t\t\"24071987\",\n\t\t\"24011987\",\n\t\t\"23051991\",\n\t\t\"23051987\",\n\t\t\"23031987\",\n\t\t\"22071983\",\n\t\t\"22051986\",\n\t\t\"21101989\",\n\t\t\"21071987\",\n\t\t\"21051986\",\n\t\t\"20081986\",\n\t\t\"20061986\",\n\t\t\"20031986\",\n\t\t\"20021985\",\n\t\t\"20011988\",\n\t\t\"19641964\",\n\t\t\"19111986\",\n\t\t\"19101986\",\n\t\t\"19021990\",\n\t\t\"18051987\",\n\t\t\"18031991\",\n\t\t\"18021987\",\n\t\t\"16111982\",\n\t\t\"16011987\",\n\t\t\"15111984\",\n\t\t\"15091988\",\n\t\t\"15061988\",\n\t\t\"15031988\",\n\t\t\"15021983\",\n\t\t\"14021989\",\n\t\t\"14011988\",\n\t\t\"14011987\",\n\t\t\"12348765\",\n\t\t\"12345qaz\",\n\t\t\"12111990\",\n\t\t\"12091988\",\n\t\t\"12051989\",\n\t\t\"12051987\",\n\t\t\"12031988\",\n\t\t\"12021985\",\n\t\t\"12011985\",\n\t\t\"11111986\",\n\t\t\"11091984\",\n\t\t\"11071989\",\n\t\t\"10071985\",\n\t\t\"10061984\",\n\t\t\"10041990\",\n\t\t\"10031989\",\n\t\t\"10011988\",\n\t\t\"06071983\",\n\t\t\"05021988\",\n\t\t\"03041987\",\n\t\t\"02091982\",\n\t\t\"02091971\",\n\t\t\"02061974\",\n\t\t\"02051990\",\n\t\t\"02051979\",\n\t\t\"02011990\",\n\t\t\"01051990\",\n\t\t\"01021985\",\n\t\t\"woodstoc\",\n\t\t\"wonderful\",\n\t\t\"whiplash\",\n\t\t\"trouble1\",\n\t\t\"testing1\",\n\t\t\"summer69\",\n\t\t\"stickman\",\n\t\t\"stafford\",\n\t\t\"speedway\",\n\t\t\"somerset\",\n\t\t\"smoothie\",\n\t\t\"segblue2\",\n\t\t\"scheisse\",\n\t\t\"Samantha\",\n\t\t\"revolution\",\n\t\t\"rainbows\",\n\t\t\"pornking\",\n\t\t\"pimpdadd\",\n\t\t\"pasadena\",\n\t\t\"p0o9i8u7\",\n\t\t\"navyseal\",\n\t\t\"Marlboro\",\n\t\t\"longhair\",\n\t\t\"lokiloki\",\n\t\t\"lkjhgfds\",\n\t\t\"kamasutra\",\n\t\t\"gsxr1000\",\n\t\t\"gannibal\",\n\t\t\"daylight\",\n\t\t\"cornwall\",\n\t\t\"cocksucker\",\n\t\t\"carebear\",\n\t\t\"austin31\",\n\t\t\"adrenalin\",\n\t\t\"789654123\",\n\t\t\"5Wr2i7H8\",\n\t\t\"31031987\",\n\t\t\"30111987\",\n\t\t\"30071986\",\n\t\t\"30061983\",\n\t\t\"30051989\",\n\t\t\"30041991\",\n\t\t\"28071987\",\n\t\t\"28051990\",\n\t\t\"28051985\",\n\t\t\"27041985\",\n\t\t\"26071987\",\n\t\t\"26061986\",\n\t\t\"26051986\",\n\t\t\"25121985\",\n\t\t\"25051985\",\n\t\t\"24081988\",\n\t\t\"24041988\",\n\t\t\"24031987\",\n\t\t\"24021988\",\n\t\t\"23skidoo\",\n\t\t\"23121986\",\n\t\t\"23091987\",\n\t\t\"23071985\",\n\t\t\"23061992\",\n\t\t\"22111985\",\n\t\t\"22091986\",\n\t\t\"22081991\",\n\t\t\"22071990\",\n\t\t\"22061985\",\n\t\t\"21081985\",\n\t\t\"21071992\",\n\t\t\"21021987\",\n\t\t\"20101988\",\n\t\t\"20061984\",\n\t\t\"20051989\",\n\t\t\"20041990\",\n\t\t\"19091990\",\n\t\t\"19031987\",\n\t\t\"18121984\",\n\t\t\"18081988\",\n\t\t\"18061991\",\n\t\t\"18041991\",\n\t\t\"18011988\",\n\t\t\"17061991\",\n\t\t\"17021987\",\n\t\t\"16031988\",\n\t\t\"16021987\",\n\t\t\"15091989\",\n\t\t\"15081990\",\n\t\t\"15071983\",\n\t\t\"15041987\",\n\t\t\"14091990\",\n\t\t\"14081990\",\n\t\t\"14041992\",\n\t\t\"14041987\",\n\t\t\"14031989\",\n\t\t\"13081985\",\n\t\t\"13021987\",\n\t\t\"123qwert\",\n\t\t\"12345qwer\",\n\t\t\"12345abc\",\n\t\t\"123456789m\",\n\t\t\"1212121212\",\n\t\t\"12081983\",\n\t\t\"12021991\",\n\t\t\"11101986\",\n\t\t\"11081988\",\n\t\t\"11061989\",\n\t\t\"11041991\",\n\t\t\"11011989\",\n\t\t\"10121986\",\n\t\t\"10121985\",\n\t\t\"10101989\",\n\t\t\"10041991\",\n\t\t\"09091986\",\n\t\t\"09081988\",\n\t\t\"09051986\",\n\t\t\"08071988\",\n\t\t\"08011986\",\n\t\t\"07101987\",\n\t\t\"07071985\",\n\t\t\"06061985\",\n\t\t\"06011988\",\n\t\t\"05031991\",\n\t\t\"05021987\",\n\t\t\"04061984\",\n\t\t\"04051985\",\n\t\t\"02101973\",\n\t\t\"02061981\",\n\t\t\"02061972\",\n\t\t\"02041973\",\n\t\t\"02011979\",\n\t\t\"01101987\",\n\t\t\"01051985\",\n\t\t\"01021987\",\n\t\t\"wonderboy\",\n\t\t\"voyager1\",\n\t\t\"vagabond\",\n\t\t\"toonarmy\",\n\t\t\"thrasher\",\n\t\t\"stigmata\",\n\t\t\"smackdown\",\n\t\t\"sexybabe\",\n\t\t\"sergbest\",\n\t\t\"scrapper\",\n\t\t\"sammy123\",\n\t\t\"reginald\",\n\t\t\"rainbow1\",\n\t\t\"pictures\",\n\t\t\"peterbil\",\n\t\t\"perfect1\",\n\t\t\"pantera1\",\n\t\t\"p4ssw0rd\",\n\t\t\"normandy\",\n\t\t\"nevermore\",\n\t\t\"luckyone\",\n\t\t\"kirkland\",\n\t\t\"junkmail\",\n\t\t\"josephin\",\n\t\t\"Jordan23\",\n\t\t\"johnson1\",\n\t\t\"futurama\",\n\t\t\"fireblad\",\n\t\t\"fellatio\",\n\t\t\"dragonfl\",\n\t\t\"dragon69\",\n\t\t\"crackers\",\n\t\t\"cartoons\",\n\t\t\"buttercup\",\n\t\t\"blue1234\",\n\t\t\"31101987\",\n\t\t\"31051985\",\n\t\t\"30121986\",\n\t\t\"30091989\",\n\t\t\"30031992\",\n\t\t\"30031986\",\n\t\t\"30011987\",\n\t\t\"29061988\",\n\t\t\"29061985\",\n\t\t\"29031988\",\n\t\t\"28061988\",\n\t\t\"27061983\",\n\t\t\"27031986\",\n\t\t\"27021990\",\n\t\t\"26101987\",\n\t\t\"26071989\",\n\t\t\"26071986\",\n\t\t\"25081986\",\n\t\t\"25061987\",\n\t\t\"25051987\",\n\t\t\"25041991\",\n\t\t\"24101989\",\n\t\t\"24071991\",\n\t\t\"23111987\",\n\t\t\"23091986\",\n\t\t\"23051983\",\n\t\t\"23031986\",\n\t\t\"2222222222\",\n\t\t\"22121989\",\n\t\t\"22071991\",\n\t\t\"22051991\",\n\t\t\"22011985\",\n\t\t\"21121985\",\n\t\t\"21031985\",\n\t\t\"20121988\",\n\t\t\"20121986\",\n\t\t\"20061990\",\n\t\t\"20051987\",\n\t\t\"19091983\",\n\t\t\"19061992\",\n\t\t\"19021991\",\n\t\t\"18121987\",\n\t\t\"18121983\",\n\t\t\"18111986\",\n\t\t\"16121986\",\n\t\t\"16091987\",\n\t\t\"16071991\",\n\t\t\"16071987\",\n\t\t\"15111989\",\n\t\t\"15031990\",\n\t\t\"14041986\",\n\t\t\"13121983\",\n\t\t\"13101987\",\n\t\t\"13091984\",\n\t\t\"13071990\",\n\t\t\"123456789qwe\",\n\t\t\"1234567899\",\n\t\t\"12211221\",\n\t\t\"12121991\",\n\t\t\"12121986\",\n\t\t\"12101990\",\n\t\t\"12101984\",\n\t\t\"12091991\",\n\t\t\"12081988\",\n\t\t\"12071990\",\n\t\t\"12071988\",\n\t\t\"11041990\",\n\t\t\"10081990\",\n\t\t\"10081983\",\n\t\t\"10071990\",\n\t\t\"10061989\",\n\t\t\"10011992\",\n\t\t\"09111987\",\n\t\t\"09081985\",\n\t\t\"08121987\",\n\t\t\"08111984\",\n\t\t\"08101986\",\n\t\t\"08051989\",\n\t\t\"07091988\",\n\t\t\"07081987\",\n\t\t\"07071988\",\n\t\t\"07071984\",\n\t\t\"07071982\",\n\t\t\"07051987\",\n\t\t\"06031992\",\n\t\t\"05111986\",\n\t\t\"05051991\",\n\t\t\"05031990\",\n\t\t\"05011987\",\n\t\t\"04111988\",\n\t\t\"04061987\",\n\t\t\"04041987\",\n\t\t\"02081973\",\n\t\t\"02061978\",\n\t\t\"02031991\",\n\t\t\"02031990\",\n\t\t\"02011976\",\n\t\t\"01071984\",\n\t\t\"01041980\",\n\t\t\"01021992\",\n\t\t\"zaqwsxcde\",\n\t\t\"yyyyyyyy\",\n\t\t\"warhamme\",\n\t\t\"velocity\",\n\t\t\"tigercat\",\n\t\t\"sunlight\",\n\t\t\"streaming\",\n\t\t\"sonysony\",\n\t\t\"sabrina1\",\n\t\t\"romantic\",\n\t\t\"rockwell\",\n\t\t\"q1234567\",\n\t\t\"plastics\",\n\t\t\"pinnacle\",\n\t\t\"pathetic\",\n\t\t\"pancakes\",\n\t\t\"offshore\",\n\t\t\"nounours\",\n\t\t\"ncc74656\",\n\t\t\"natasha1\",\n\t\t\"mynameis\",\n\t\t\"motocros\",\n\t\t\"letsdoit\",\n\t\t\"kristian\",\n\t\t\"fyutkjxtr\",\n\t\t\"francisc\",\n\t\t\"dreamcas\",\n\t\t\"dragster\",\n\t\t\"destiny1\",\n\t\t\"delpiero\",\n\t\t\"daisydog\",\n\t\t\"colonial\",\n\t\t\"cannibal\",\n\t\t\"candyass\",\n\t\t\"bynthytn\",\n\t\t\"bigbooty\",\n\t\t\"azertyuiop\",\n\t\t\"amethyst\",\n\t\t\"acidburn\",\n\t\t\"66613666\",\n\t\t\"44332211\",\n\t\t\"31071990\",\n\t\t\"31051993\",\n\t\t\"30051987\",\n\t\t\"30011990\",\n\t\t\"29091987\",\n\t\t\"29061986\",\n\t\t\"29011982\",\n\t\t\"28101986\",\n\t\t\"28081990\",\n\t\t\"28081986\",\n\t\t\"28011988\",\n\t\t\"27111989\",\n\t\t\"27031992\",\n\t\t\"27021992\",\n\t\t\"26081986\",\n\t\t\"25081985\",\n\t\t\"25031991\",\n\t\t\"25031983\",\n\t\t\"24121987\",\n\t\t\"24091991\",\n\t\t\"23111989\",\n\t\t\"23091989\",\n\t\t\"23091985\",\n\t\t\"23061989\",\n\t\t\"22091991\",\n\t\t\"22071985\",\n\t\t\"22071984\",\n\t\t\"22061984\",\n\t\t\"22051989\",\n\t\t\"22051987\",\n\t\t\"22031986\",\n\t\t\"22011992\",\n\t\t\"21061988\",\n\t\t\"21031984\",\n\t\t\"20071988\",\n\t\t\"20061983\",\n\t\t\"20041985\",\n\t\t\"1qazzaq1\",\n\t\t\"1qazxsw23edc\",\n\t\t\"19991999\",\n\t\t\"19061991\",\n\t\t\"18101985\",\n\t\t\"18051989\",\n\t\t\"18031988\",\n\t\t\"18021992\",\n\t\t\"18011985\",\n\t\t\"17051990\",\n\t\t\"17051989\",\n\t\t\"17051987\",\n\t\t\"17021989\",\n\t\t\"16091988\",\n\t\t\"16081986\",\n\t\t\"16061988\",\n\t\t\"16061987\",\n\t\t\"15121987\",\n\t\t\"15091985\",\n\t\t\"15081986\",\n\t\t\"15061985\",\n\t\t\"15011983\",\n\t\t\"14101986\",\n\t\t\"13071987\",\n\t\t\"13061985\",\n\t\t\"13021985\",\n\t\t\"123456qqq\",\n\t\t\"123456789d\",\n\t\t\"1234509876\",\n\t\t\"12131213\",\n\t\t\"12111991\",\n\t\t\"12111985\",\n\t\t\"12081990\",\n\t\t\"12081987\",\n\t\t\"12071991\",\n\t\t\"11071987\",\n\t\t\"11051988\",\n\t\t\"11031983\",\n\t\t\"10091984\",\n\t\t\"10071989\",\n\t\t\"10071986\",\n\t\t\"10061985\",\n\t\t\"10051990\",\n\t\t\"10041987\",\n\t\t\"10031993\",\n\t\t\"10031990\",\n\t\t\"09091988\",\n\t\t\"09051987\",\n\t\t\"09041986\",\n\t\t\"08081990\",\n\t\t\"08081989\",\n\t\t\"08021990\",\n\t\t\"07101984\",\n\t\t\"07071989\",\n\t\t\"07041987\",\n\t\t\"07031989\",\n\t\t\"07021991\",\n\t\t\"06061981\",\n\t\t\"06021986\",\n\t\t\"05121990\",\n\t\t\"05061988\",\n\t\t\"05031987\",\n\t\t\"04071988\",\n\t\t\"04071986\",\n\t\t\"04041986\",\n\t\t\"03101991\",\n\t\t\"03091983\",\n\t\t\"03051988\",\n\t\t\"03041983\",\n\t\t\"03031992\",\n\t\t\"02081970\",\n\t\t\"02061971\",\n\t\t\"02051970\",\n\t\t\"02041972\",\n\t\t\"02031974\",\n\t\t\"02021978\",\n\t\t\"02011977\",\n\t\t\"01121990\",\n\t\t\"01091992\",\n\t\t\"01081992\",\n\t\t\"01081985\",\n\t\t\"01011972\",\n\t\t\"vipergts\",\n\t\t\"vfntvfnbrf\",\n\t\t\"supernova\",\n\t\t\"stephen1\",\n\t\t\"sparkles\",\n\t\t\"snowbird\",\n\t\t\"singapor\",\n\t\t\"scissors\",\n\t\t\"pressure\",\n\t\t\"playball\",\n\t\t\"pizzaman\",\n\t\t\"pinetree\",\n\t\t\"pathfind\",\n\t\t\"papamama\",\n\t\t\"nightmar\",\n\t\t\"Mustang1\",\n\t\t\"montrose\",\n\t\t\"montecar\",\n\t\t\"masterbating\",\n\t\t\"maserati\",\n\t\t\"lockdown\",\n\t\t\"liverpool1\",\n\t\t\"kingking\",\n\t\t\"killer123\",\n\t\t\"jeepster\",\n\t\t\"ilovegod\",\n\t\t\"hellsing\",\n\t\t\"frederik\",\n\t\t\"feelgood\",\n\t\t\"escalade\",\n\t\t\"eleonora\",\n\t\t\"dominiqu\",\n\t\t\"delldell\",\n\t\t\"daughter\",\n\t\t\"contract\",\n\t\t\"conquest\",\n\t\t\"building\",\n\t\t\"buffalo1\",\n\t\t\"blacklab\",\n\t\t\"babycake\",\n\t\t\"7777777a\",\n\t\t\"31121986\",\n\t\t\"31121985\",\n\t\t\"31051991\",\n\t\t\"31051987\",\n\t\t\"30121988\",\n\t\t\"30121985\",\n\t\t\"30101988\",\n\t\t\"30061988\",\n\t\t\"29041988\",\n\t\t\"27091991\",\n\t\t\"26121989\",\n\t\t\"26061989\",\n\t\t\"26031991\",\n\t\t\"25111991\",\n\t\t\"25031984\",\n\t\t\"25021986\",\n\t\t\"24121989\",\n\t\t\"24121988\",\n\t\t\"24101990\",\n\t\t\"24101984\",\n\t\t\"24071992\",\n\t\t\"24051989\",\n\t\t\"24041986\",\n\t\t\"23091991\",\n\t\t\"23061987\",\n\t\t\"23041988\",\n\t\t\"23021992\",\n\t\t\"23021983\",\n\t\t\"22111988\",\n\t\t\"22091990\",\n\t\t\"22091984\",\n\t\t\"22051988\",\n\t\t\"21111986\",\n\t\t\"21101988\",\n\t\t\"21101987\",\n\t\t\"21091989\",\n\t\t\"21051990\",\n\t\t\"21021989\",\n\t\t\"20101987\",\n\t\t\"20071984\",\n\t\t\"20051983\",\n\t\t\"20031990\",\n\t\t\"20031985\",\n\t\t\"20011983\",\n\t\t\"1passwor\",\n\t\t\"19111985\",\n\t\t\"19081987\",\n\t\t\"19051983\",\n\t\t\"19041985\",\n\t\t\"18121990\",\n\t\t\"18121985\",\n\t\t\"18121812\",\n\t\t\"18091987\",\n\t\t\"17121985\",\n\t\t\"17111987\",\n\t\t\"17071987\",\n\t\t\"17071986\",\n\t\t\"17061987\",\n\t\t\"17041986\",\n\t\t\"17041985\",\n\t\t\"16121991\",\n\t\t\"16101986\",\n\t\t\"16041988\",\n\t\t\"16041985\",\n\t\t\"16031986\",\n\t\t\"16021988\",\n\t\t\"16011986\",\n\t\t\"15121983\",\n\t\t\"15101991\",\n\t\t\"15061984\",\n\t\t\"15011988\",\n\t\t\"14091987\",\n\t\t\"14061988\",\n\t\t\"14051983\",\n\t\t\"13101992\",\n\t\t\"13101988\",\n\t\t\"13101982\",\n\t\t\"13071989\",\n\t\t\"13071985\",\n\t\t\"13061991\",\n\t\t\"13051990\",\n\t\t\"13031989\",\n\t\t\"1234567890-\",\n\t\t\"12101989\",\n\t\t\"12071984\",\n\t\t\"12061987\",\n\t\t\"12041991\",\n\t\t\"12031990\",\n\t\t\"12021984\",\n\t\t\"11091986\",\n\t\t\"11091985\",\n\t\t\"11081986\",\n\t\t\"10101988\",\n\t\t\"10101980\",\n\t\t\"10091986\",\n\t\t\"10091985\",\n\t\t\"10081987\",\n\t\t\"10051988\",\n\t\t\"10021987\",\n\t\t\"10021986\",\n\t\t\"09041985\",\n\t\t\"09031987\",\n\t\t\"08041985\",\n\t\t\"08031987\",\n\t\t\"07061988\",\n\t\t\"07041989\",\n\t\t\"07021980\",\n\t\t\"06011982\",\n\t\t\"05121988\",\n\t\t\"05061989\",\n\t\t\"05051986\",\n\t\t\"04031991\",\n\t\t\"03071985\",\n\t\t\"03061986\",\n\t\t\"03061985\",\n\t\t\"03031987\",\n\t\t\"03031984\",\n\t\t\"03011991\",\n\t\t\"02111987\",\n\t\t\"02061990\",\n\t\t\"02011971\",\n\t\t\"01091988\",\n\t\t\"01071990\",\n\t\t\"01061983\",\n\t\t\"01051980\",\n\t\t\"01022010\",\n\t\t\"volleyba\",\n\t\t\"virginie\",\n\t\t\"treefrog\",\n\t\t\"therock1\",\n\t\t\"tennesse\",\n\t\t\"success1\",\n\t\t\"stockton\",\n\t\t\"skinhead\",\n\t\t\"qwqwqwqw\",\n\t\t\"playmate\",\n\t\t\"piercing\",\n\t\t\"password9\",\n\t\t\"painting\",\n\t\t\"nineball\",\n\t\t\"mohammad\",\n\t\t\"matchbox\",\n\t\t\"lfitymrf\",\n\t\t\"laetitia\",\n\t\t\"jellybean\",\n\t\t\"goldeneye\",\n\t\t\"erection\",\n\t\t\"entrance\",\n\t\t\"elisabet\",\n\t\t\"elements\",\n\t\t\"eclipse1\",\n\t\t\"eatmenow\",\n\t\t\"clemente\",\n\t\t\"charlie2\",\n\t\t\"cassandra\",\n\t\t\"cashmoney\",\n\t\t\"bobmarley\",\n\t\t\"baracuda\",\n\t\t\"alcatraz\",\n\t\t\"31051982\",\n\t\t\"30051988\",\n\t\t\"30051986\",\n\t\t\"29111988\",\n\t\t\"29051992\",\n\t\t\"29041989\",\n\t\t\"29031990\",\n\t\t\"28121989\",\n\t\t\"28071985\",\n\t\t\"28021983\",\n\t\t\"27111990\",\n\t\t\"27071988\",\n\t\t\"26071984\",\n\t\t\"26061991\",\n\t\t\"26021992\",\n\t\t\"26011990\",\n\t\t\"26011986\",\n\t\t\"25091991\",\n\t\t\"25091989\",\n\t\t\"25081989\",\n\t\t\"25071987\",\n\t\t\"25071985\",\n\t\t\"25071983\",\n\t\t\"25051988\",\n\t\t\"25051980\",\n\t\t\"25041987\",\n\t\t\"25021985\",\n\t\t\"24101991\",\n\t\t\"24101988\",\n\t\t\"24071990\",\n\t\t\"24061985\",\n\t\t\"24041985\",\n\t\t\"24041984\",\n\t\t\"23111986\",\n\t\t\"23101987\",\n\t\t\"23041991\",\n\t\t\"23031983\",\n\t\t\"22071992\",\n\t\t\"22071988\",\n\t\t\"21121989\",\n\t\t\"21111989\",\n\t\t\"21111983\",\n\t\t\"21101983\",\n\t\t\"21041991\",\n\t\t\"21041987\",\n\t\t\"21031986\",\n\t\t\"21021990\",\n\t\t\"21021988\",\n\t\t\"20081990\",\n\t\t\"20061991\",\n\t\t\"20061987\",\n\t\t\"20032003\",\n\t\t\"20031992\",\n\t\t\"1qw23er4\",\n\t\t\"1q1q1q1q\",\n\t\t\"19121988\",\n\t\t\"19081986\",\n\t\t\"19071989\",\n\t\t\"19041986\",\n\t\t\"18111983\",\n\t\t\"18071990\",\n\t\t\"18071989\",\n\t\t\"18071986\",\n\t\t\"18031986\",\n\t\t\"17121987\",\n\t\t\"17091985\",\n\t\t\"17071990\",\n\t\t\"17051983\",\n\t\t\"16091990\",\n\t\t\"15081989\",\n\t\t\"15071990\",\n\t\t\"15051992\",\n\t\t\"15051989\",\n\t\t\"15031991\",\n\t\t\"15011990\",\n\t\t\"14031986\",\n\t\t\"13091988\",\n\t\t\"13091987\",\n\t\t\"13091986\",\n\t\t\"13081986\",\n\t\t\"13071982\",\n\t\t\"13051986\",\n\t\t\"13041989\",\n\t\t\"13021991\",\n\t\t\"1234rewq\",\n\t\t\"12111984\",\n\t\t\"12091986\",\n\t\t\"12081993\",\n\t\t\"12071992\",\n\t\t\"12021990\",\n\t\t\"11111991\",\n\t\t\"11091990\",\n\t\t\"11061987\",\n\t\t\"11061986\",\n\t\t\"11061984\",\n\t\t\"11041985\",\n\t\t\"11031986\",\n\t\t\"10041984\",\n\t\t\"10031980\",\n\t\t\"10011980\",\n\t\t\"09051984\",\n\t\t\"08071985\",\n\t\t\"07081984\",\n\t\t\"07041988\",\n\t\t\"06101989\",\n\t\t\"06061988\",\n\t\t\"06041984\",\n\t\t\"05091987\",\n\t\t\"05081992\",\n\t\t\"05081986\",\n\t\t\"05071985\",\n\t\t\"05041985\",\n\t\t\"04111991\",\n\t\t\"04071987\",\n\t\t\"04021990\",\n\t\t\"03091988\",\n\t\t\"03061988\",\n\t\t\"03041989\",\n\t\t\"03041984\",\n\t\t\"03031991\",\n\t\t\"02091978\",\n\t\t\"01071988\",\n\t\t\"01061992\",\n\t\t\"01041993\",\n\t\t\"01041983\",\n\t\t\"01031981\",\n\t\t\"weare138\",\n\t\t\"vanessa1\",\n\t\t\"usmarine\",\n\t\t\"sniffing\",\n\t\t\"rfhfylfi\",\n\t\t\"rachelle\",\n\t\t\"qwerasdfzxcv\",\n\t\t\"patches1\",\n\t\t\"password99\",\n\t\t\"muhammad\",\n\t\t\"morrowind\",\n\t\t\"mallrats\",\n\t\t\"macintos\",\n\t\t\"macaroni\",\n\t\t\"lunchbox\",\n\t\t\"kcchiefs\",\n\t\t\"istheman\",\n\t\t\"implants\",\n\t\t\"ghjcnbnenrf\",\n\t\t\"gabriele\",\n\t\t\"forever1\",\n\t\t\"Fktrcfylh\",\n\t\t\"experienced\",\n\t\t\"dragonballz\",\n\t\t\"chouchou\",\n\t\t\"cheerleaers\",\n\t\t\"charisma\",\n\t\t\"celebrity\",\n\t\t\"cardinals\",\n\t\t\"captain1\",\n\t\t\"bubbles1\",\n\t\t\"billbill\",\n\t\t\"beatles1\",\n\t\t\"barefeet\",\n\t\t\"ballsack\",\n\t\t\"backbone\",\n\t\t\"asasasas\",\n\t\t\"apollo11\",\n\t\t\"abracadabra\",\n\t\t\"31101991\",\n\t\t\"31081989\",\n\t\t\"31051986\",\n\t\t\"31011985\",\n\t\t\"30101987\",\n\t\t\"30071992\",\n\t\t\"30061989\",\n\t\t\"30061985\",\n\t\t\"29121988\",\n\t\t\"29121984\",\n\t\t\"29111987\",\n\t\t\"29081987\",\n\t\t\"29081982\",\n\t\t\"29071986\",\n\t\t\"29051987\",\n\t\t\"29041987\",\n\t\t\"29031982\",\n\t\t\"28071984\",\n\t\t\"28061985\",\n\t\t\"28051988\",\n\t\t\"28041988\",\n\t\t\"28021989\",\n\t\t\"27101989\",\n\t\t\"27101987\",\n\t\t\"27091983\",\n\t\t\"27061990\",\n\t\t\"27051991\",\n\t\t\"26121987\",\n\t\t\"26111984\",\n\t\t\"26051990\",\n\t\t\"26041988\",\n\t\t\"26041983\",\n\t\t\"25091992\",\n\t\t\"25081987\",\n\t\t\"25051989\",\n\t\t\"24041990\",\n\t\t\"23091982\",\n\t\t\"23071986\",\n\t\t\"23061985\",\n\t\t\"23051984\",\n\t\t\"23021991\",\n\t\t\"22446688\",\n\t\t\"22091987\",\n\t\t\"22091985\",\n\t\t\"22061991\",\n\t\t\"22051990\",\n\t\t\"22041991\",\n\t\t\"21121988\",\n\t\t\"21091990\",\n\t\t\"21071990\",\n\t\t\"21071985\",\n\t\t\"21041990\",\n\t\t\"21021986\",\n\t\t\"20101986\",\n\t\t\"20072007\",\n\t\t\"20061980\",\n\t\t\"20051986\",\n\t\t\"20021991\",\n\t\t\"20011987\",\n\t\t\"19071983\",\n\t\t\"19021985\",\n\t\t\"19011985\",\n\t\t\"18061987\",\n\t\t\"18061986\",\n\t\t\"18011984\",\n\t\t\"17121986\",\n\t\t\"17111988\",\n\t\t\"17031992\",\n\t\t\"17021986\",\n\t\t\"16111989\",\n\t\t\"16061990\",\n\t\t\"16011991\",\n\t\t\"16011985\",\n\t\t\"15121985\",\n\t\t\"15111986\",\n\t\t\"15031987\",\n\t\t\"14101991\",\n\t\t\"14101983\",\n\t\t\"14051987\",\n\t\t\"14041991\",\n\t\t\"14021991\",\n\t\t\"13081987\",\n\t\t\"13071991\",\n\t\t\"13061990\",\n\t\t\"13031991\",\n\t\t\"12121984\",\n\t\t\"12101986\",\n\t\t\"12091990\",\n\t\t\"12081986\",\n\t\t\"12041987\",\n\t\t\"1111qqqq\",\n\t\t\"11061988\",\n\t\t\"11051989\",\n\t\t\"11041987\",\n\t\t\"11041986\",\n\t\t\"11021990\",\n\t\t\"10101991\",\n\t\t\"10081991\",\n\t\t\"10021983\",\n\t\t\"09101985\",\n\t\t\"09051990\",\n\t\t\"09011990\",\n\t\t\"08111983\",\n\t\t\"08071986\",\n\t\t\"08061986\",\n\t\t\"08031988\",\n\t\t\"08021989\",\n\t\t\"07021987\",\n\t\t\"06091989\",\n\t\t\"06081988\",\n\t\t\"06081986\",\n\t\t\"06071984\",\n\t\t\"06061990\",\n\t\t\"06051987\",\n\t\t\"06031986\",\n\t\t\"06021989\",\n\t\t\"05101984\",\n\t\t\"05061983\",\n\t\t\"05041986\",\n\t\t\"04081985\",\n\t\t\"04061990\",\n\t\t\"04061988\",\n\t\t\"04051987\",\n\t\t\"04021985\",\n\t\t\"04011990\",\n\t\t\"03121986\",\n\t\t\"03101985\",\n\t\t\"03061984\",\n\t\t\"02081975\",\n\t\t\"02031970\",\n\t\t\"02021977\",\n\t\t\"01051987\",\n\t\t\"01041989\",\n\t\t\"01031980\",\n\t\t\"01010101\",\n\t\t\"zoomzoom\",\n\t\t\"zerozero\",\n\t\t\"stiletto\",\n\t\t\"starwars1\",\n\t\t\"sexybitch\",\n\t\t\"sephiroth\",\n\t\t\"riffraff\",\n\t\t\"redheads\",\n\t\t\"poophead\",\n\t\t\"pertinant\",\n\t\t\"paulpaul\",\n\t\t\"nemrac58\",\n\t\t\"myXworld\",\n\t\t\"malaysia\",\n\t\t\"left4dead\",\n\t\t\"jesus123\",\n\t\t\"interest\",\n\t\t\"innocent\",\n\t\t\"hillbill\",\n\t\t\"hallowee\",\n\t\t\"goldeney\",\n\t\t\"generals\",\n\t\t\"gallaries\",\n\t\t\"fussball\",\n\t\t\"flyers88\",\n\t\t\"fabulous\",\n\t\t\"culinary\",\n\t\t\"constant\",\n\t\t\"citation\",\n\t\t\"cartman1\",\n\t\t\"cambridg\",\n\t\t\"bettyboo\",\n\t\t\"annaanna\",\n\t\t\"alterego\",\n\t\t\"alpha123\",\n\t\t\"77347734\",\n\t\t\"55BGates\",\n\t\t\"31031990\",\n\t\t\"30091985\",\n\t\t\"30081989\",\n\t\t\"30011992\",\n\t\t\"29081988\",\n\t\t\"29061984\",\n\t\t\"29041986\",\n\t\t\"29041984\",\n\t\t\"29011990\",\n\t\t\"29011988\",\n\t\t\"28121990\",\n\t\t\"28071988\",\n\t\t\"28051989\",\n\t\t\"28041983\",\n\t\t\"28011989\",\n\t\t\"27091987\",\n\t\t\"27091984\",\n\t\t\"27071983\",\n\t\t\"27061989\",\n\t\t\"27051986\",\n\t\t\"27011990\",\n\t\t\"26081983\",\n\t\t\"26041990\",\n\t\t\"25121986\",\n\t\t\"25111988\",\n\t\t\"25081983\",\n\t\t\"25021984\",\n\t\t\"25021983\",\n\t\t\"24081990\",\n\t\t\"24061984\",\n\t\t\"24021985\",\n\t\t\"23061988\",\n\t\t\"23041992\",\n\t\t\"23031989\",\n\t\t\"23021984\",\n\t\t\"22081987\",\n\t\t\"22031987\",\n\t\t\"21121987\",\n\t\t\"21091987\",\n\t\t\"21081990\",\n\t\t\"21061989\",\n\t\t\"21041986\",\n\t\t\"21011990\",\n\t\t\"21011985\",\n\t\t\"20111987\",\n\t\t\"20061992\",\n\t\t\"20051984\",\n\t\t\"20021990\",\n\t\t\"19631963\",\n\t\t\"19091986\",\n\t\t\"19011986\",\n\t\t\"18101989\",\n\t\t\"18091984\",\n\t\t\"18011991\",\n\t\t\"17081990\",\n\t\t\"17061992\",\n\t\t\"17021992\",\n\t\t\"16051986\",\n\t\t\"16041986\",\n\t\t\"16021989\",\n\t\t\"15081980\",\n\t\t\"15051991\",\n\t\t\"15031989\",\n\t\t\"15031986\",\n\t\t\"15021991\",\n\t\t\"15011991\",\n\t\t\"14785236\",\n\t\t\"14111987\",\n\t\t\"14091989\",\n\t\t\"14091988\",\n\t\t\"14051986\",\n\t\t\"14031990\",\n\t\t\"13121989\",\n\t\t\"13091990\",\n\t\t\"13061989\",\n\t\t\"13021984\",\n\t\t\"123456789987654321\",\n\t\t\"12071982\",\n\t\t\"12061980\",\n\t\t\"12031986\",\n\t\t\"12021987\",\n\t\t\"11121990\",\n\t\t\"11021988\",\n\t\t\"11021987\",\n\t\t\"11021984\",\n\t\t\"1020304050\",\n\t\t\"10111989\",\n\t\t\"10101987\",\n\t\t\"10071983\",\n\t\t\"10051989\",\n\t\t\"10051986\",\n\t\t\"10041989\",\n\t\t\"10021988\",\n\t\t\"10011989\",\n\t\t\"09061990\",\n\t\t\"09041990\",\n\t\t\"09011987\",\n\t\t\"08081983\",\n\t\t\"08081979\",\n\t\t\"08031992\",\n\t\t\"08021985\",\n\t\t\"08011988\",\n\t\t\"07111987\",\n\t\t\"07061986\",\n\t\t\"07041985\",\n\t\t\"07031986\",\n\t\t\"07021989\",\n\t\t\"06111990\",\n\t\t\"06111986\",\n\t\t\"06081990\",\n\t\t\"06071990\",\n\t\t\"06071986\",\n\t\t\"06051983\",\n\t\t\"05081989\",\n\t\t\"05081987\",\n\t\t\"05071986\",\n\t\t\"05071983\",\n\t\t\"05051993\",\n\t\t\"05051982\",\n\t\t\"05041991\",\n\t\t\"05041990\",\n\t\t\"05041983\",\n\t\t\"04121985\",\n\t\t\"04111989\",\n\t\t\"04031982\",\n\t\t\"04021987\",\n\t\t\"03111986\",\n\t\t\"03071984\",\n\t\t\"03051985\",\n\t\t\"03021987\",\n\t\t\"03011986\",\n\t\t\"02101975\",\n\t\t\"02061973\",\n\t\t\"02021992\",\n\t\t\"02011978\",\n\t\t\"01092010\",\n\t\t\"01091986\",\n\t\t\"01041986\",\n\t\t\"01031991\",\n\t\t\"z1x2c3v4b5\",\n\t\t\"vincent1\",\n\t\t\"thebeast\",\n\t\t\"tampabay\",\n\t\t\"tamerlan\",\n\t\t\"surprise\",\n\t\t\"sunshine1\",\n\t\t\"smartass\",\n\t\t\"rustydog\",\n\t\t\"rhfcfdbwf\",\n\t\t\"revoluti\",\n\t\t\"reloaded\",\n\t\t\"powerful\",\n\t\t\"pitchers\",\n\t\t\"Penthous\",\n\t\t\"passmast\",\n\t\t\"notredam\",\n\t\t\"nopassword\",\n\t\t\"nevermin\",\n\t\t\"natedogg\",\n\t\t\"mustang2\",\n\t\t\"mallorca\",\n\t\t\"loverman\",\n\t\t\"lenochka\",\n\t\t\"lebowski\",\n\t\t\"lavalamp\",\n\t\t\"JENNIFER\",\n\t\t\"interacial\",\n\t\t\"iiiiiiii\",\n\t\t\"houston1\",\n\t\t\"hardwood\",\n\t\t\"gogators\",\n\t\t\"francine\",\n\t\t\"fishtank\",\n\t\t\"edmonton\",\n\t\t\"duckduck\",\n\t\t\"dreaming\",\n\t\t\"doughnut\",\n\t\t\"dickdick\",\n\t\t\"darthvad\",\n\t\t\"dangerous\",\n\t\t\"crescent\",\n\t\t\"copenhag\",\n\t\t\"cleveland\",\n\t\t\"civilwar\",\n\t\t\"cashflow\",\n\t\t\"care1839\",\n\t\t\"capitals\",\n\t\t\"cantona7\",\n\t\t\"biohazard\",\n\t\t\"bigtruck\",\n\t\t\"bellagio\",\n\t\t\"auckland\",\n\t\t\"anonymous\",\n\t\t\"acapulco\",\n\t\t\"Aa123456\",\n\t\t\"741258963\",\n\t\t\"69camaro\",\n\t\t\"31071986\",\n\t\t\"30071983\",\n\t\t\"30041988\",\n\t\t\"29101992\",\n\t\t\"29091990\",\n\t\t\"29071988\",\n\t\t\"29041990\",\n\t\t\"29031983\",\n\t\t\"28121988\",\n\t\t\"28121987\",\n\t\t\"28121986\",\n\t\t\"28081985\",\n\t\t\"28061984\",\n\t\t\"28041991\",\n\t\t\"28041986\",\n\t\t\"28031990\",\n\t\t\"28021984\",\n\t\t\"27121988\",\n\t\t\"27051984\",\n\t\t\"27041987\",\n\t\t\"27021986\",\n\t\t\"27011985\",\n\t\t\"27011983\",\n\t\t\"26121985\",\n\t\t\"26121984\",\n\t\t\"26091985\",\n\t\t\"26021990\",\n\t\t\"26011989\",\n\t\t\"25091984\",\n\t\t\"25041984\",\n\t\t\"25041983\",\n\t\t\"24121990\",\n\t\t\"24121984\",\n\t\t\"24101987\",\n\t\t\"24011989\",\n\t\t\"24011986\",\n\t\t\"23071988\",\n\t\t\"23021987\",\n\t\t\"23011992\",\n\t\t\"22101988\",\n\t\t\"22091983\",\n\t\t\"22081990\",\n\t\t\"22081985\",\n\t\t\"21071986\",\n\t\t\"21071983\",\n\t\t\"21061987\",\n\t\t\"21051989\",\n\t\t\"21051983\",\n\t\t\"21011986\",\n\t\t\"20121985\",\n\t\t\"20111984\",\n\t\t\"20071985\",\n\t\t\"20011985\",\n\t\t\"19101989\",\n\t\t\"19101982\",\n\t\t\"19081991\",\n\t\t\"19031990\",\n\t\t\"18081989\",\n\t\t\"18051982\",\n\t\t\"18041988\",\n\t\t\"18041983\",\n\t\t\"17111989\",\n\t\t\"17111982\",\n\t\t\"17101991\",\n\t\t\"17091991\",\n\t\t\"17051993\",\n\t\t\"17051991\",\n\t\t\"17011986\",\n\t\t\"17011985\",\n\t\t\"16081985\",\n\t\t\"16071986\",\n\t\t\"16061984\",\n\t\t\"16021982\",\n\t\t\"15121989\",\n\t\t\"15111987\",\n\t\t\"15111985\",\n\t\t\"15101983\",\n\t\t\"15081984\",\n\t\t\"15041983\",\n\t\t\"15031984\",\n\t\t\"14101989\",\n\t\t\"14081986\",\n\t\t\"14061985\",\n\t\t\"14031985\",\n\t\t\"13121990\",\n\t\t\"13111986\",\n\t\t\"13111985\",\n\t\t\"13101990\",\n\t\t\"13101985\",\n\t\t\"13081988\",\n\t\t\"13081982\",\n\t\t\"13071992\",\n\t\t\"13051991\",\n\t\t\"13051988\",\n\t\t\"13041991\",\n\t\t\"13031992\",\n\t\t\"13031990\",\n\t\t\"13021992\",\n\t\t\"12345677\",\n\t\t\"123456123456\",\n\t\t\"12061990\",\n\t\t\"12061984\",\n\t\t\"112233445566\",\n\t\t\"11101990\",\n\t\t\"11081985\",\n\t\t\"11081984\",\n\t\t\"11081983\",\n\t\t\"11031991\",\n\t\t\"11031990\",\n\t\t\"11031987\",\n\t\t\"10121991\",\n\t\t\"10121989\",\n\t\t\"10111983\",\n\t\t\"10071991\",\n\t\t\"09051983\",\n\t\t\"09031991\",\n\t\t\"08091988\",\n\t\t\"08081985\",\n\t\t\"08031991\",\n\t\t\"07031988\",\n\t\t\"07031985\",\n\t\t\"07011989\",\n\t\t\"06111984\",\n\t\t\"06071988\",\n\t\t\"06071985\",\n\t\t\"06031988\",\n\t\t\"06031984\",\n\t\t\"05121985\",\n\t\t\"05121983\",\n\t\t\"05101986\",\n\t\t\"05061987\",\n\t\t\"05051988\",\n\t\t\"05051980\",\n\t\t\"05021989\",\n\t\t\"04121987\",\n\t\t\"04121986\",\n\t\t\"04051990\",\n\t\t\"03101983\",\n\t\t\"03081984\",\n\t\t\"03021982\",\n\t\t\"02101982\",\n\t\t\"02101974\",\n\t\t\"02091979\",\n\t\t\"02091974\",\n\t\t\"02071991\",\n\t\t\"02071974\",\n\t\t\"02021974\",\n\t\t\"01111990\",\n\t\t\"01091984\",\n\t\t\"01071989\",\n\t\t\"01061985\",\n\t\t\"01041981\",\n\t\t\"01041979\",\n\t\t\"01011950\",\n\t\t\"waterman\",\n\t\t\"waterfal\",\n\t\t\"trueblue\",\n\t\t\"trinity1\",\n\t\t\"trinitron\",\n\t\t\"tortoise\",\n\t\t\"topolino\",\n\t\t\"ticklish\",\n\t\t\"sweetheart\",\n\t\t\"supersonic\",\n\t\t\"stanley1\",\n\t\t\"skipper1\",\n\t\t\"shitshit\",\n\t\t\"seductive\",\n\t\t\"screwyou\",\n\t\t\"riversid\",\n\t\t\"riverrat\",\n\t\t\"redlight\",\n\t\t\"Qwerty123\",\n\t\t\"qweasdzx\",\n\t\t\"powerman\",\n\t\t\"parlament\",\n\t\t\"outsider\",\n\t\t\"nightwin\",\n\t\t\"natalie1\",\n\t\t\"monkeyboy\",\n\t\t\"messenger\",\n\t\t\"memememe\",\n\t\t\"marauder\",\n\t\t\"makeitso\",\n\t\t\"madagaskar\",\n\t\t\"ljxtymrf\",\n\t\t\"kikimora\",\n\t\t\"kamikadze\",\n\t\t\"jupiter1\",\n\t\t\"integral\",\n\t\t\"happines\",\n\t\t\"greywolf\",\n\t\t\"godbless\",\n\t\t\"gizmodo1\",\n\t\t\"foreplay\",\n\t\t\"fisherman\",\n\t\t\"favorite\",\n\t\t\"eighteen\",\n\t\t\"downhill\",\n\t\t\"dimadima\",\n\t\t\"dilbert1\",\n\t\t\"deerhunt\",\n\t\t\"cyclones\",\n\t\t\"coolhand\",\n\t\t\"converse\",\n\t\t\"computer1\",\n\t\t\"Christin\",\n\t\t\"chewbacc\",\n\t\t\"blueberr\",\n\t\t\"bendover\",\n\t\t\"asdfqwer\",\n\t\t\"animated\",\n\t\t\"aircraft\",\n\t\t\"789632145\",\n\t\t\"56565656\",\n\t\t\"32323232\",\n\t\t\"31121992\",\n\t\t\"31081985\",\n\t\t\"31071985\",\n\t\t\"31051990\",\n\t\t\"31011983\",\n\t\t\"30071990\",\n\t\t\"30061986\",\n\t\t\"29091986\",\n\t\t\"29071990\",\n\t\t\"29011983\",\n\t\t\"28101988\",\n\t\t\"28091984\",\n\t\t\"28081984\",\n\t\t\"28071989\",\n\t\t\"28061990\",\n\t\t\"28051981\",\n\t\t\"28031984\",\n\t\t\"27121986\",\n\t\t\"27081989\",\n\t\t\"26111987\",\n\t\t\"26051987\",\n\t\t\"25121982\",\n\t\t\"25091988\",\n\t\t\"25071989\",\n\t\t\"25071986\",\n\t\t\"25051992\",\n\t\t\"25051990\",\n\t\t\"25011991\",\n\t\t\"25011988\",\n\t\t\"24121985\",\n\t\t\"24081987\",\n\t\t\"24071989\",\n\t\t\"24061990\",\n\t\t\"23111990\",\n\t\t\"23081986\",\n\t\t\"23061983\",\n\t\t\"23031988\",\n\t\t\"23021990\",\n\t\t\"23011989\",\n\t\t\"23011988\",\n\t\t\"23011984\",\n\t\t\"22111991\",\n\t\t\"22031990\",\n\t\t\"22021984\",\n\t\t\"22011991\",\n\t\t\"21121984\",\n\t\t\"21031991\",\n\t\t\"21011992\",\n\t\t\"20091984\",\n\t\t\"20071990\",\n\t\t\"20071981\",\n\t\t\"20061989\",\n\t\t\"20051992\",\n\t\t\"20041981\",\n\t\t\"19601960\",\n\t\t\"19121986\",\n\t\t\"19121985\",\n\t\t\"19101983\",\n\t\t\"19071985\",\n\t\t\"18011990\",\n\t\t\"18011989\",\n\t\t\"17121990\",\n\t\t\"17081992\",\n\t\t\"17081988\",\n\t\t\"17071991\",\n\t\t\"17071984\",\n\t\t\"17041990\",\n\t\t\"17031991\",\n\t\t\"17021988\",\n\t\t\"16111987\",\n\t\t\"16031987\",\n\t\t\"16021983\",\n\t\t\"16011990\",\n\t\t\"15101987\",\n\t\t\"15081985\",\n\t\t\"15021988\",\n\t\t\"15011992\",\n\t\t\"14121986\",\n\t\t\"14111989\",\n\t\t\"14091982\",\n\t\t\"14071983\",\n\t\t\"14061982\",\n\t\t\"14021988\",\n\t\t\"1357908642\",\n\t\t\"13121984\",\n\t\t\"13081990\",\n\t\t\"13081984\",\n\t\t\"13021989\",\n\t\t\"123456789r\",\n\t\t\"12091987\",\n\t\t\"12071985\",\n\t\t\"12071983\",\n\t\t\"12051993\",\n\t\t\"12041985\",\n\t\t\"11111983\",\n\t\t\"11111979\",\n\t\t\"11091983\",\n\t\t\"11081992\",\n\t\t\"11071984\",\n\t\t\"11041988\",\n\t\t\"10121979\",\n\t\t\"10111988\",\n\t\t\"10111981\",\n\t\t\"10091989\",\n\t\t\"10091988\",\n\t\t\"10081988\",\n\t\t\"10041982\",\n\t\t\"10021985\",\n\t\t\"09121983\",\n\t\t\"09011991\",\n\t\t\"08061989\",\n\t\t\"08041988\",\n\t\t\"07081989\",\n\t\t\"07071986\",\n\t\t\"07071980\",\n\t\t\"07041986\",\n\t\t\"07021990\",\n\t\t\"06101991\",\n\t\t\"06081985\",\n\t\t\"06071987\",\n\t\t\"06031989\",\n\t\t\"05101983\",\n\t\t\"05071991\",\n\t\t\"05071990\",\n\t\t\"05011990\",\n\t\t\"04111986\",\n\t\t\"04081989\",\n\t\t\"04051983\",\n\t\t\"04041984\",\n\t\t\"04011988\",\n\t\t\"04011987\",\n\t\t\"03101989\",\n\t\t\"03101988\",\n\t\t\"03091991\",\n\t\t\"03081990\",\n\t\t\"03081988\",\n\t\t\"03071989\",\n\t\t\"03061989\",\n\t\t\"03051993\",\n\t\t\"03041990\",\n\t\t\"03031989\",\n\t\t\"03021989\",\n\t\t\"03011984\",\n\t\t\"02111989\",\n\t\t\"02081990\",\n\t\t\"02081972\",\n\t\t\"02081971\",\n\t\t\"02061992\",\n\t\t\"02061975\",\n\t\t\"01081980\",\n\t\t\"01071985\",\n\t\t\"01061984\",\n\t\t\"01051983\",\n\t\t\"01021986\",\n\t\t\"01021980\",\n\t\t\"wonderfu\",\n\t\t\"websolutions\",\n\t\t\"websol76\",\n\t\t\"vincenzo\",\n\t\t\"timoxa94\",\n\t\t\"stoppedby\",\n\t\t\"sprocket\",\n\t\t\"softtail\",\n\t\t\"soccer11\",\n\t\t\"sasha123\",\n\t\t\"rfhfvtkmrf\",\n\t\t\"q1q2q3q4q5\",\n\t\t\"popcorn1\",\n\t\t\"nokia5800\",\n\t\t\"myspace1\",\n\t\t\"markmark\",\n\t\t\"manunited\",\n\t\t\"magic123\",\n\t\t\"love1234\",\n\t\t\"lilwayne\",\n\t\t\"laserjet\",\n\t\t\"huskers1\",\n\t\t\"humphrey\",\n\t\t\"homepage\",\n\t\t\"griffith\",\n\t\t\"greenman\",\n\t\t\"greedisgood\",\n\t\t\"gogogogo\",\n\t\t\"giovanna\",\n\t\t\"gateway2\",\n\t\t\"gangbanged\",\n\t\t\"fuckme69\",\n\t\t\"freestyle\",\n\t\t\"foreskin\",\n\t\t\"fishcake\",\n\t\t\"fidelity\",\n\t\t\"dtkjcbgtl\",\n\t\t\"dipstick\",\n\t\t\"deadspin\",\n\t\t\"davedave\",\n\t\t\"daredevi\",\n\t\t\"continue\",\n\t\t\"bukowski\",\n\t\t\"blackbird\",\n\t\t\"blackberry\",\n\t\t\"bismarck\",\n\t\t\"beckham7\",\n\t\t\"baltimor\",\n\t\t\"babybear\",\n\t\t\"asdfg123\",\n\t\t\"a1a2a3a4\",\n\t\t\"99762000\",\n\t\t\"918273645\",\n\t\t\"31101989\",\n\t\t\"31051988\",\n\t\t\"30061982\",\n\t\t\"29121985\",\n\t\t\"29091991\",\n\t\t\"29081983\",\n\t\t\"29071987\",\n\t\t\"29061987\",\n\t\t\"28111987\",\n\t\t\"28111986\",\n\t\t\"28091992\",\n\t\t\"28091985\",\n\t\t\"28061983\",\n\t\t\"27101990\",\n\t\t\"27071984\",\n\t\t\"27051989\",\n\t\t\"27041989\",\n\t\t\"27041988\",\n\t\t\"27031985\",\n\t\t\"26091991\",\n\t\t\"26091984\",\n\t\t\"26081985\",\n\t\t\"26071990\",\n\t\t\"26041984\",\n\t\t\"26021985\",\n\t\t\"26011981\",\n\t\t\"25121989\",\n\t\t\"25091985\",\n\t\t\"25051984\",\n\t\t\"24101985\",\n\t\t\"24071988\",\n\t\t\"24071986\",\n\t\t\"24051987\",\n\t\t\"24051986\",\n\t\t\"24041992\",\n\t\t\"24041991\",\n\t\t\"24021987\",\n\t\t\"24021986\",\n\t\t\"23101988\",\n\t\t\"23081984\",\n\t\t\"23041990\",\n\t\t\"23031985\",\n\t\t\"23021993\",\n\t\t\"22111989\",\n\t\t\"22101991\",\n\t\t\"22041993\",\n\t\t\"22041990\",\n\t\t\"21091988\",\n\t\t\"21091986\",\n\t\t\"21091984\",\n\t\t\"21051985\",\n\t\t\"20spanks\",\n\t\t\"20091983\",\n\t\t\"20031984\",\n\t\t\"20011991\",\n\t\t\"20011984\",\n\t\t\"1z2x3c4v5b\",\n\t\t\"1q2q3q4q\",\n\t\t\"19101993\",\n\t\t\"19081985\",\n\t\t\"19061986\",\n\t\t\"19061984\",\n\t\t\"19041992\",\n\t\t\"19041987\",\n\t\t\"19031980\",\n\t\t\"19021982\",\n\t\t\"18081986\",\n\t\t\"18071988\",\n\t\t\"18051985\",\n\t\t\"18031981\",\n\t\t\"18021993\",\n\t\t\"17101990\",\n\t\t\"17091984\",\n\t\t\"17021990\",\n\t\t\"17021982\",\n\t\t\"16121985\",\n\t\t\"16121982\",\n\t\t\"16111983\",\n\t\t\"16091991\",\n\t\t\"16061992\",\n\t\t\"16031985\",\n\t\t\"15111991\",\n\t\t\"15111990\",\n\t\t\"15101992\",\n\t\t\"15091990\",\n\t\t\"15091983\",\n\t\t\"15071984\",\n\t\t\"15041985\",\n\t\t\"15031985\",\n\t\t\"14121987\",\n\t\t\"14101985\",\n\t\t\"14091991\",\n\t\t\"14081991\",\n\t\t\"14081989\",\n\t\t\"14031984\",\n\t\t\"13121988\",\n\t\t\"13071983\",\n\t\t\"13061984\",\n\t\t\"13061983\",\n\t\t\"13051989\",\n\t\t\"13051985\",\n\t\t\"13011985\",\n\t\t\"13011981\",\n\t\t\"123456987\",\n\t\t\"12101987\",\n\t\t\"12051992\",\n\t\t\"12041983\",\n\t\t\"12031989\",\n\t\t\"12021986\",\n\t\t\"12011988\",\n\t\t\"11101987\",\n\t\t\"11101985\",\n\t\t\"11081982\",\n\t\t\"11071983\",\n\t\t\"11041983\",\n\t\t\"11031984\",\n\t\t\"11031982\",\n\t\t\"11021991\",\n\t\t\"11011980\",\n\t\t\"10111987\",\n\t\t\"10101993\",\n\t\t\"10051985\",\n\t\t\"10051983\",\n\t\t\"10031986\",\n\t\t\"10031985\",\n\t\t\"09101986\",\n\t\t\"09071990\",\n\t\t\"09071984\",\n\t\t\"09061989\",\n\t\t\"09051985\",\n\t\t\"09011985\",\n\t\t\"08061990\",\n\t\t\"08041989\",\n\t\t\"07101985\",\n\t\t\"07091985\",\n\t\t\"07031991\",\n\t\t\"07021986\",\n\t\t\"07011988\",\n\t\t\"06101986\",\n\t\t\"06061989\",\n\t\t\"06061982\",\n\t\t\"06051989\",\n\t\t\"06031985\",\n\t\t\"06011987\",\n\t\t\"05051992\",\n\t\t\"05051983\",\n\t\t\"05031988\",\n\t\t\"05031986\",\n\t\t\"04121988\",\n\t\t\"04121984\",\n\t\t\"04071983\",\n\t\t\"04051984\",\n\t\t\"04041995\",\n\t\t\"04041989\",\n\t\t\"04031990\",\n\t\t\"03091986\",\n\t\t\"03031983\",\n\t\t\"02061970\",\n\t\t\"02051974\",\n\t\t\"01111987\",\n\t\t\"01081988\",\n\t\t\"01071980\",\n\t\t\"01031987\",\n\t\t\"01011961\",\n\t\t\"000000000\",\n\t\t\"zxcvb123\",\n\t\t\"wachtwoord\",\n\t\t\"vvvvvvvv\",\n\t\t\"volleyball\",\n\t\t\"valleywa\",\n\t\t\"trumpet1\",\n\t\t\"trooper1\",\n\t\t\"thinking\",\n\t\t\"Sunshine\",\n\t\t\"suckcock\",\n\t\t\"sopranos\",\n\t\t\"sarasara\",\n\t\t\"rosewood\",\n\t\t\"rfrfrfrf\",\n\t\t\"randolph\",\n\t\t\"qwerty13\",\n\t\t\"qweasdzxc123\",\n\t\t\"prophecy\",\n\t\t\"princess1\",\n\t\t\"pimpdaddy\",\n\t\t\"paperino\",\n\t\t\"nightowl\",\n\t\t\"negative\",\n\t\t\"naughty1\",\n\t\t\"mustang5\",\n\t\t\"montana1\",\n\t\t\"mazda323\",\n\t\t\"mastermind\",\n\t\t\"jurassic\",\n\t\t\"jefferson\",\n\t\t\"italiano\",\n\t\t\"heavenly\",\n\t\t\"halloween\",\n\t\t\"graduate\",\n\t\t\"gigabyte\",\n\t\t\"fivestar\",\n\t\t\"england1\",\n\t\t\"eldiablo\",\n\t\t\"creepers\",\n\t\t\"CORVETTE\",\n\t\t\"commander\",\n\t\t\"climbing\",\n\t\t\"ciaociao\",\n\t\t\"chickenwing101\",\n\t\t\"buddydog\",\n\t\t\"bradley1\",\n\t\t\"bisexual\",\n\t\t\"Benjamin\",\n\t\t\"abdullah\",\n\t\t\"31101986\",\n\t\t\"30101990\",\n\t\t\"30101984\",\n\t\t\"30051984\",\n\t\t\"30041992\",\n\t\t\"30031989\",\n\t\t\"30011983\",\n\t\t\"29101991\",\n\t\t\"29101985\",\n\t\t\"29011992\",\n\t\t\"28111984\",\n\t\t\"28091990\",\n\t\t\"28091987\",\n\t\t\"28091982\",\n\t\t\"28051983\",\n\t\t\"28031986\",\n\t\t\"28021981\",\n\t\t\"27071991\",\n\t\t\"27071982\",\n\t\t\"27041993\",\n\t\t\"27031983\",\n\t\t\"27011986\",\n\t\t\"26121990\",\n\t\t\"26121983\",\n\t\t\"26101989\",\n\t\t\"26101984\",\n\t\t\"26091989\",\n\t\t\"26091988\",\n\t\t\"26031992\",\n\t\t\"26011993\",\n\t\t\"26011987\",\n\t\t\"25101990\",\n\t\t\"25101986\",\n\t\t\"25091986\",\n\t\t\"25031988\",\n\t\t\"25021987\",\n\t\t\"25021978\",\n\t\t\"24101980\",\n\t\t\"24051985\",\n\t\t\"24021990\",\n\t\t\"23111985\",\n\t\t\"23111982\",\n\t\t\"23091988\",\n\t\t\"23091983\",\n\t\t\"23081990\",\n\t\t\"22111982\",\n\t\t\"22101985\",\n\t\t\"22051980\",\n\t\t\"22041983\",\n\t\t\"22011989\",\n\t\t\"21121980\",\n\t\t\"21041989\",\n\t\t\"21021984\",\n\t\t\"21021983\",\n\t\t\"21011987\",\n\t\t\"20081987\",\n\t\t\"20062006\",\n\t\t\"20061981\",\n\t\t\"20021981\",\n\t\t\"1million\",\n\t\t\"19611961\",\n\t\t\"19091992\",\n\t\t\"19081988\",\n\t\t\"19061989\",\n\t\t\"19041988\",\n\t\t\"18111989\",\n\t\t\"18111984\",\n\t\t\"18091991\",\n\t\t\"18081987\",\n\t\t\"18061988\",\n\t\t\"18041985\",\n\t\t\"18031993\",\n\t\t\"18021982\",\n\t\t\"17111986\",\n\t\t\"17081984\",\n\t\t\"17011701\",\n\t\t\"16121989\",\n\t\t\"16101985\",\n\t\t\"16091986\",\n\t\t\"16081988\",\n\t\t\"16071983\",\n\t\t\"16041993\",\n\t\t\"16041990\",\n\t\t\"16041984\",\n\t\t\"16031991\",\n\t\t\"15081987\",\n\t\t\"15071989\",\n\t\t\"15061983\",\n\t\t\"15041993\",\n\t\t\"15041989\",\n\t\t\"15041982\",\n\t\t\"15021989\",\n\t\t\"14121988\",\n\t\t\"14111988\",\n\t\t\"14061984\",\n\t\t\"14041989\",\n\t\t\"13121986\",\n\t\t\"13111988\",\n\t\t\"13071988\",\n\t\t\"13051983\",\n\t\t\"13031985\",\n\t\t\"13011984\",\n\t\t\"13011983\",\n\t\t\"123456789v\",\n\t\t\"123456789o\",\n\t\t\"1234567890z\",\n\t\t\"12111987\",\n\t\t\"12041994\",\n\t\t\"12041984\",\n\t\t\"12021980\",\n\t\t\"11121984\",\n\t\t\"11111982\",\n\t\t\"11021993\",\n\t\t\"11011985\",\n\t\t\"11011982\",\n\t\t\"10121984\",\n\t\t\"10101983\",\n\t\t\"10091991\",\n\t\t\"10051993\",\n\t\t\"10051984\",\n\t\t\"09121987\",\n\t\t\"09071987\",\n\t\t\"09071986\",\n\t\t\"09051988\",\n\t\t\"09041988\",\n\t\t\"08101989\",\n\t\t\"08061988\",\n\t\t\"08031983\",\n\t\t\"07121987\",\n\t\t\"07081982\",\n\t\t\"07061990\",\n\t\t\"07051989\",\n\t\t\"07051988\",\n\t\t\"06121988\",\n\t\t\"06111985\",\n\t\t\"06091987\",\n\t\t\"06051990\",\n\t\t\"06041989\",\n\t\t\"05121986\",\n\t\t\"05071989\",\n\t\t\"05061985\",\n\t\t\"05041984\",\n\t\t\"05021991\",\n\t\t\"05021985\",\n\t\t\"05011988\",\n\t\t\"04121982\",\n\t\t\"04091991\",\n\t\t\"04091987\",\n\t\t\"04081986\",\n\t\t\"04021988\",\n\t\t\"03101984\",\n\t\t\"03091984\",\n\t\t\"03081992\",\n\t\t\"03071983\",\n\t\t\"03061992\",\n\t\t\"03051989\",\n\t\t\"02121990\",\n\t\t\"02121983\",\n\t\t\"02041970\",\n\t\t\"02031993\",\n\t\t\"02011974\",\n\t\t\"01101985\",\n\t\t\"01081991\",\n\t\t\"01071983\",\n\t\t\"01041982\",\n\t\t\"01031990\",\n\t\t\"01021991\",\n\t\t\"zxcvzxcv\",\n\t\t\"Williams\",\n\t\t\"whoknows\",\n\t\t\"wdtnjxtr\",\n\t\t\"underwear\",\n\t\t\"unbelievable\",\n\t\t\"topsecret\",\n\t\t\"surveyor\",\n\t\t\"squerting\",\n\t\t\"smithers\",\n\t\t\"sealteam\",\n\t\t\"ronaldinho\",\n\t\t\"quant4307s\",\n\t\t\"prototype\",\n\t\t\"protocol\",\n\t\t\"princesa\",\n\t\t\"pizzahut\",\n\t\t\"ntktdbpjh\",\n\t\t\"nokia123\",\n\t\t\"nicetits\",\n\t\t\"mississi\",\n\t\t\"merchant\",\n\t\t\"mamochka\",\n\t\t\"lucky123\",\n\t\t\"libertad\",\n\t\t\"justice1\",\n\t\t\"instinct\",\n\t\t\"infected\",\n\t\t\"ilya1234\",\n\t\t\"housewifes\",\n\t\t\"highlife\",\n\t\t\"hartford\",\n\t\t\"happyman\",\n\t\t\"goodyear\",\n\t\t\"godspeed\",\n\t\t\"flvbybcnhfnjh\",\n\t\t\"flanders\",\n\t\t\"fighting\",\n\t\t\"dtxyjcnm\",\n\t\t\"daredevil\",\n\t\t\"bismilla\",\n\t\t\"bigbucks\",\n\t\t\"baberuth\",\n\t\t\"asdasd123\",\n\t\t\"alessand\",\n\t\t\"access99\",\n\t\t\"8888888888\",\n\t\t\"3rJs1la7qE\",\n\t\t\"34343434\",\n\t\t\"31121983\",\n\t\t\"31031986\",\n\t\t\"30111986\",\n\t\t\"30101986\",\n\t\t\"30081990\",\n\t\t\"30071985\",\n\t\t\"30031987\",\n\t\t\"30011980\",\n\t\t\"29121986\",\n\t\t\"29111983\",\n\t\t\"29091985\",\n\t\t\"29091982\",\n\t\t\"29051988\",\n\t\t\"29051986\",\n\t\t\"29051984\",\n\t\t\"29031989\",\n\t\t\"29031986\",\n\t\t\"29021988\",\n\t\t\"28111990\",\n\t\t\"28071983\",\n\t\t\"28051992\",\n\t\t\"28041989\",\n\t\t\"28031991\",\n\t\t\"28031988\",\n\t\t\"28031983\",\n\t\t\"27101992\",\n\t\t\"27071990\",\n\t\t\"27071985\",\n\t\t\"27061984\",\n\t\t\"27021987\",\n\t\t\"26111989\",\n\t\t\"26061983\",\n\t\t\"26031985\",\n\t\t\"26021989\",\n\t\t\"26011988\",\n\t\t\"25121990\",\n\t\t\"25111989\",\n\t\t\"25111986\",\n\t\t\"25041989\",\n\t\t\"25041980\",\n\t\t\"25031992\",\n\t\t\"25031986\",\n\t\t\"25021990\",\n\t\t\"25021989\",\n\t\t\"25011987\",\n\t\t\"24681012\",\n\t\t\"24121982\",\n\t\t\"24111983\",\n\t\t\"24091990\",\n\t\t\"24081986\",\n\t\t\"24061989\",\n\t\t\"24021989\",\n\t\t\"23071984\",\n\t\t\"23061980\",\n\t\t\"23051988\",\n\t\t\"23041985\",\n\t\t\"23011991\",\n\t\t\"23011982\",\n\t\t\"22121982\",\n\t\t\"22111990\",\n\t\t\"22101987\",\n\t\t\"22101981\",\n\t\t\"22041989\",\n\t\t\"21121992\",\n\t\t\"21061990\",\n\t\t\"21051987\",\n\t\t\"21051984\",\n\t\t\"20121987\",\n\t\t\"20111985\",\n\t\t\"20051981\",\n\t\t\"20041992\",\n\t\t\"20041984\",\n\t\t\"20031980\",\n\t\t\"20021983\",\n\t\t\"20011981\",\n\t\t\"19121987\",\n\t\t\"19081983\",\n\t\t\"19021988\",\n\t\t\"18101990\",\n\t\t\"18101988\",\n\t\t\"18081990\",\n\t\t\"18071983\",\n\t\t\"18021991\",\n\t\t\"17121983\",\n\t\t\"17101992\",\n\t\t\"17091986\",\n\t\t\"17051986\",\n\t\t\"17031988\",\n\t\t\"17031984\",\n\t\t\"17031983\",\n\t\t\"17021983\",\n\t\t\"16111986\",\n\t\t\"16101989\",\n\t\t\"16081991\",\n\t\t\"16071988\",\n\t\t\"16071985\",\n\t\t\"16061989\",\n\t\t\"15121990\",\n\t\t\"15121986\",\n\t\t\"15101984\",\n\t\t\"15071992\",\n\t\t\"15061987\",\n\t\t\"15051982\",\n\t\t\"15031992\",\n\t\t\"15021987\",\n\t\t\"15011981\",\n\t\t\"14111990\",\n\t\t\"14091986\",\n\t\t\"14081982\",\n\t\t\"14061990\",\n\t\t\"14041984\",\n\t\t\"14031987\",\n\t\t\"14011991\",\n\t\t\"13071993\",\n\t\t\"13051992\",\n\t\t\"13041984\",\n\t\t\"13031980\",\n\t\t\"13011993\",\n\t\t\"123581321\",\n\t\t\"123456as\",\n\t\t\"123321123321\",\n\t\t\"12121981\",\n\t\t\"12121977\",\n\t\t\"12051981\",\n\t\t\"12041989\",\n\t\t\"12011991\",\n\t\t\"11111989\",\n\t\t\"11111988\",\n\t\t\"11091987\",\n\t\t\"11071990\",\n\t\t\"11051991\",\n\t\t\"11031992\",\n\t\t\"11021992\",\n\t\t\"11021981\",\n\t\t\"10121982\",\n\t\t\"10101992\",\n\t\t\"10101982\",\n\t\t\"10071984\",\n\t\t\"10041985\",\n\t\t\"09121985\",\n\t\t\"09121982\",\n\t\t\"09071988\",\n\t\t\"09061991\",\n\t\t\"09051981\",\n\t\t\"09031990\",\n\t\t\"08101987\",\n\t\t\"08101980\",\n\t\t\"08061992\",\n\t\t\"08061985\",\n\t\t\"08021991\",\n\t\t\"07101989\",\n\t\t\"07091987\",\n\t\t\"07081992\",\n\t\t\"07061985\",\n\t\t\"07041990\",\n\t\t\"07041983\",\n\t\t\"07021984\",\n\t\t\"06101987\",\n\t\t\"06101985\",\n\t\t\"06091991\",\n\t\t\"06061983\",\n\t\t\"06051985\",\n\t\t\"06021988\",\n\t\t\"05111992\",\n\t\t\"05091985\",\n\t\t\"05081985\",\n\t\t\"05031989\",\n\t\t\"04111992\",\n\t\t\"04061982\",\n\t\t\"04051989\",\n\t\t\"03121985\",\n\t\t\"03091987\",\n\t\t\"03081987\",\n\t\t\"03071992\",\n\t\t\"03071990\",\n\t\t\"03051984\",\n\t\t\"02091972\",\n\t\t\"02081978\",\n\t\t\"02041991\",\n\t\t\"02041990\",\n\t\t\"02031995\",\n\t\t\"02031976\",\n\t\t\"02021993\",\n\t\t\"02021975\",\n\t\t\"01121985\",\n\t\t\"01121984\",\n\t\t\"01101990\",\n\t\t\"01091980\",\n\t\t\"01091979\",\n\t\t\"01081986\",\n\t\t\"01071991\",\n\t\t\"01061979\",\n\t\t\"vodafone\",\n\t\t\"valeriya\",\n\t\t\"tickling\",\n\t\t\"SUPERMAN\",\n\t\t\"starlight\",\n\t\t\"splendid\",\n\t\t\"special1\",\n\t\t\"sokolova\",\n\t\t\"skydiver\",\n\t\t\"shredder\",\n\t\t\"saxophon\",\n\t\t\"salvatore\",\n\t\t\"rockrock\",\n\t\t\"pounding\",\n\t\t\"playboy2\",\n\t\t\"petrovich\",\n\t\t\"nancy123\",\n\t\t\"molly123\",\n\t\t\"maxpower\",\n\t\t\"marcella\",\n\t\t\"locoloco\",\n\t\t\"livewire\",\n\t\t\"lionheart\",\n\t\t\"joystick\",\n\t\t\"jennifer1\",\n\t\t\"infamous\",\n\t\t\"hugoboss\",\n\t\t\"hospital\",\n\t\t\"Groupd2013\",\n\t\t\"gianluca\",\n\t\t\"ghbdtnrfrltkf\",\n\t\t\"ghbdtndctv\",\n\t\t\"fujifilm\",\n\t\t\"frankie1\",\n\t\t\"flathead\",\n\t\t\"fisherma\",\n\t\t\"feathers\",\n\t\t\"favorite2\",\n\t\t\"fantasies\",\n\t\t\"experience\",\n\t\t\"envelope\",\n\t\t\"dragonfly\",\n\t\t\"cornhole\",\n\t\t\"close-up\",\n\t\t\"Charlie1\",\n\t\t\"chadwick\",\n\t\t\"blueberry\",\n\t\t\"blackhawk\",\n\t\t\"bigblack\",\n\t\t\"beethove\",\n\t\t\"anthony7\",\n\t\t\"andyandy\",\n\t\t\"alexander1\",\n\t\t\"aaaaaaaaa\",\n\t\t\"a1b2c3d4e5\",\n\t\t\"987654321a\",\n\t\t\"85208520\",\n\t\t\"74123698\",\n\t\t\"31101988\",\n\t\t\"31071983\",\n\t\t\"31011989\",\n\t\t\"30121984\",\n\t\t\"30111990\",\n\t\t\"30111989\",\n\t\t\"30071987\",\n\t\t\"30061981\",\n\t\t\"30051992\",\n\t\t\"29091980\",\n\t\t\"29081986\",\n\t\t\"29041992\",\n\t\t\"29031991\",\n\t\t\"27101986\",\n\t\t\"27081985\",\n\t\t\"27071989\",\n\t\t\"27071986\",\n\t\t\"27051992\",\n\t\t\"27051985\",\n\t\t\"27031990\",\n\t\t\"26111986\",\n\t\t\"26021988\",\n\t\t\"25121983\",\n\t\t\"25111992\",\n\t\t\"25031993\",\n\t\t\"24051979\",\n\t\t\"24031985\",\n\t\t\"24021983\",\n\t\t\"24011992\",\n\t\t\"24011991\",\n\t\t\"24011983\",\n\t\t\"23121983\",\n\t\t\"23101990\",\n\t\t\"23091994\",\n\t\t\"23081991\",\n\t\t\"23081988\",\n\t\t\"23041989\",\n\t\t\"23031991\",\n\t\t\"23031980\",\n\t\t\"23011980\",\n\t\t\"22121985\",\n\t\t\"22101989\",\n\t\t\"22101983\",\n\t\t\"22031989\",\n\t\t\"22021992\",\n\t\t\"22021987\",\n\t\t\"22011993\",\n\t\t\"22011987\",\n\t\t\"21111992\",\n\t\t\"21091985\",\n\t\t\"21071994\",\n\t\t\"21071982\",\n\t\t\"21061983\",\n\t\t\"21031981\",\n\t\t\"20121990\",\n\t\t\"20121982\",\n\t\t\"20081988\",\n\t\t\"20081985\",\n\t\t\"20081984\",\n\t\t\"20042004\",\n\t\t\"20031983\",\n\t\t\"20021992\",\n\t\t\"20021989\",\n\t\t\"20021987\",\n\t\t\"20021980\",\n\t\t\"1qaz2wsx3edc4rfv\",\n\t\t\"19121982\",\n\t\t\"19111984\",\n\t\t\"19081992\",\n\t\t\"19081990\",\n\t\t\"19021987\",\n\t\t\"19021986\",\n\t\t\"18121992\",\n\t\t\"18111988\",\n\t\t\"18071981\",\n\t\t\"18061992\",\n\t\t\"18061984\",\n\t\t\"18051992\",\n\t\t\"18051986\",\n\t\t\"18041987\",\n\t\t\"17081989\",\n\t\t\"17061985\",\n\t\t\"17061983\",\n\t\t\"17051992\",\n\t\t\"17041984\",\n\t\t\"17031985\",\n\t\t\"17021991\",\n\t\t\"17011991\",\n\t\t\"16111984\",\n\t\t\"16101992\",\n\t\t\"16081989\",\n\t\t\"16061983\",\n\t\t\"16041987\",\n\t\t\"16011983\",\n\t\t\"159753456\",\n\t\t\"15081983\",\n\t\t\"15071991\",\n\t\t\"15061990\",\n\t\t\"15051983\",\n\t\t\"15041990\",\n\t\t\"15041986\",\n\t\t\"14111984\",\n\t\t\"14111982\",\n\t\t\"14061983\",\n\t\t\"14051993\",\n\t\t\"14051985\",\n\t\t\"14021992\",\n\t\t\"14021984\",\n\t\t\"13121987\",\n\t\t\"13091985\",\n\t\t\"13081991\",\n\t\t\"13011986\",\n\t\t\"12121980\",\n\t\t\"12091983\",\n\t\t\"12081989\",\n\t\t\"12041978\",\n\t\t\"12031991\",\n\t\t\"12031984\",\n\t\t\"11121989\",\n\t\t\"11121981\",\n\t\t\"11091988\",\n\t\t\"11051985\",\n\t\t\"11051982\",\n\t\t\"11051979\",\n\t\t\"11041993\",\n\t\t\"11031989\",\n\t\t\"10121990\",\n\t\t\"10031992\",\n\t\t\"10031984\",\n\t\t\"10011987\",\n\t\t\"09101988\",\n\t\t\"09091991\",\n\t\t\"09091987\",\n\t\t\"09071991\",\n\t\t\"09061986\",\n\t\t\"08121989\",\n\t\t\"08091989\",\n\t\t\"08081992\",\n\t\t\"08071983\",\n\t\t\"08061984\",\n\t\t\"08021988\",\n\t\t\"08011987\",\n\t\t\"07081983\",\n\t\t\"07051992\",\n\t\t\"06121982\",\n\t\t\"06071989\",\n\t\t\"06051988\",\n\t\t\"06041990\",\n\t\t\"06021984\",\n\t\t\"06021983\",\n\t\t\"06011991\",\n\t\t\"06011986\",\n\t\t\"05121989\",\n\t\t\"05111982\",\n\t\t\"05031984\",\n\t\t\"05021993\",\n\t\t\"04111987\",\n\t\t\"04101988\",\n\t\t\"04091985\",\n\t\t\"03091990\",\n\t\t\"03051981\",\n\t\t\"03051979\",\n\t\t\"03041988\",\n\t\t\"03041985\",\n\t\t\"03031994\",\n\t\t\"03021990\",\n\t\t\"03011990\",\n\t\t\"03011985\",\n\t\t\"02121988\",\n\t\t\"02121986\",\n\t\t\"02121981\",\n\t\t\"02091990\",\n\t\t\"02041971\",\n\t\t\"02031972\",\n\t\t\"02031971\",\n\t\t\"02022009\",\n\t\t\"01121989\",\n\t\t\"01101986\",\n\t\t\"01081984\",\n\t\t\"01061989\",\n\t\t\"01041991\",\n\t\t\"01041984\",\n\t\t\"yaroslav\",\n\t\t\"vampire1\",\n\t\t\"treetree\",\n\t\t\"tonytony\",\n\t\t\"smirnova\",\n\t\t\"slapnuts\",\n\t\t\"sandberg\",\n\t\t\"roosters\",\n\t\t\"rfgbnjirf\",\n\t\t\"producer\",\n\t\t\"PRINCESS\",\n\t\t\"pictuers\",\n\t\t\"pennywis\",\n\t\t\"nosferatu\",\n\t\t\"nathanie\",\n\t\t\"musician\",\n\t\t\"monkey69\",\n\t\t\"mercury1\",\n\t\t\"mainland\",\n\t\t\"Madala11\",\n\t\t\"ludacris\",\n\t\t\"lovehate\",\n\t\t\"lockerroom\",\n\t\t\"letsfuck\",\n\t\t\"landmark\",\n\t\t\"jojojojo\",\n\t\t\"jennings\",\n\t\t\"hydrogen\",\n\t\t\"horsemen\",\n\t\t\"goofball\",\n\t\t\"georgina\",\n\t\t\"garrison\",\n\t\t\"francisco\",\n\t\t\"ejaculation\",\n\t\t\"dragon123\",\n\t\t\"dominique\",\n\t\t\"dirtydog\",\n\t\t\"devilman\",\n\t\t\"daydream\",\n\t\t\"crazyman\",\n\t\t\"catfight\",\n\t\t\"carpediem\",\n\t\t\"buster12\",\n\t\t\"browndog\",\n\t\t\"blackops\",\n\t\t\"blackice\",\n\t\t\"beverley\",\n\t\t\"basement\",\n\t\t\"bajingan\",\n\t\t\"badabing\",\n\t\t\"atreides\",\n\t\t\"architec\",\n\t\t\"advanced\",\n\t\t\"abc123456\",\n\t\t\"a1s2d3f4g5\",\n\t\t\"31121982\",\n\t\t\"31071988\",\n\t\t\"30111982\",\n\t\t\"30101985\",\n\t\t\"30091987\",\n\t\t\"30081986\",\n\t\t\"30071991\",\n\t\t\"30071982\",\n\t\t\"29111985\",\n\t\t\"29071993\",\n\t\t\"29051991\",\n\t\t\"29011991\",\n\t\t\"29011980\",\n\t\t\"28111982\",\n\t\t\"28101991\",\n\t\t\"28091988\",\n\t\t\"28041990\",\n\t\t\"28021988\",\n\t\t\"28011991\",\n\t\t\"27121990\",\n\t\t\"27121981\",\n\t\t\"27111992\",\n\t\t\"27111984\",\n\t\t\"27081988\",\n\t\t\"27031984\",\n\t\t\"27021985\",\n\t\t\"26071985\",\n\t\t\"26061990\",\n\t\t\"26041987\",\n\t\t\"25111985\",\n\t\t\"25081994\",\n\t\t\"25071984\",\n\t\t\"25051986\",\n\t\t\"25051983\",\n\t\t\"24111988\",\n\t\t\"24111985\",\n\t\t\"24111982\",\n\t\t\"24091988\",\n\t\t\"24091984\",\n\t\t\"24081985\",\n\t\t\"24051991\",\n\t\t\"24041987\",\n\t\t\"24031989\",\n\t\t\"24031981\",\n\t\t\"24031980\",\n\t\t\"24021984\",\n\t\t\"24011988\",\n\t\t\"24011984\",\n\t\t\"23051989\",\n\t\t\"23041984\",\n\t\t\"23041983\",\n\t\t\"22061982\",\n\t\t\"22051985\",\n\t\t\"22021994\",\n\t\t\"22011990\",\n\t\t\"21121991\",\n\t\t\"21101980\",\n\t\t\"21091991\",\n\t\t\"21081991\",\n\t\t\"21081988\",\n\t\t\"21081986\",\n\t\t\"21061991\",\n\t\t\"21041988\",\n\t\t\"21041983\",\n\t\t\"21031992\",\n\t\t\"20101984\",\n\t\t\"20101982\",\n\t\t\"20091985\",\n\t\t\"20021993\",\n\t\t\"1Michael\",\n\t\t\"19621962\",\n\t\t\"19091987\",\n\t\t\"19091980\",\n\t\t\"19071991\",\n\t\t\"19041993\",\n\t\t\"19041989\",\n\t\t\"18121988\",\n\t\t\"18111985\",\n\t\t\"18071991\",\n\t\t\"18051984\",\n\t\t\"18041984\",\n\t\t\"17091981\",\n\t\t\"17081987\",\n\t\t\"17061982\",\n\t\t\"17041988\",\n\t\t\"17031986\",\n\t\t\"16091992\",\n\t\t\"16081980\",\n\t\t\"16061981\",\n\t\t\"16041992\",\n\t\t\"16041989\",\n\t\t\"16031992\",\n\t\t\"16011988\",\n\t\t\"15121984\",\n\t\t\"15101985\",\n\t\t\"15061993\",\n\t\t\"15051993\",\n\t\t\"15021984\",\n\t\t\"14071989\",\n\t\t\"14061986\",\n\t\t\"14031991\",\n\t\t\"13111989\",\n\t\t\"13101986\",\n\t\t\"13091982\",\n\t\t\"13081983\",\n\t\t\"13041986\",\n\t\t\"12349876\",\n\t\t\"12345687\",\n\t\t\"123456789123456789\",\n\t\t\"12091989\",\n\t\t\"12091985\",\n\t\t\"12061989\",\n\t\t\"12061985\",\n\t\t\"12051983\",\n\t\t\"12041982\",\n\t\t\"12011992\",\n\t\t\"11081991\",\n\t\t\"11081980\",\n\t\t\"11061992\",\n\t\t\"11061980\",\n\t\t\"11041992\",\n\t\t\"11001001\",\n\t\t\"10241024\",\n\t\t\"10081981\",\n\t\t\"10011985\",\n\t\t\"0o9i8u7y\",\n\t\t\"09111988\",\n\t\t\"09111983\",\n\t\t\"09101984\",\n\t\t\"09091985\",\n\t\t\"09081986\",\n\t\t\"09081984\",\n\t\t\"09031992\",\n\t\t\"09021987\",\n\t\t\"08111987\",\n\t\t\"08081984\",\n\t\t\"08051983\",\n\t\t\"08041992\",\n\t\t\"08041990\",\n\t\t\"08031989\",\n\t\t\"08031980\",\n\t\t\"07121984\",\n\t\t\"07111982\",\n\t\t\"07101983\",\n\t\t\"07081985\",\n\t\t\"07071994\",\n\t\t\"07061991\",\n\t\t\"07051986\",\n\t\t\"07011980\",\n\t\t\"06081991\",\n\t\t\"06081983\",\n\t\t\"06031987\",\n\t\t\"06011984\",\n\t\t\"05071987\",\n\t\t\"05031992\",\n\t\t\"05031981\",\n\t\t\"05011989\",\n\t\t\"04101992\",\n\t\t\"04081992\",\n\t\t\"04081982\",\n\t\t\"04081978\",\n\t\t\"04071985\",\n\t\t\"04051986\",\n\t\t\"04041992\",\n\t\t\"04041982\",\n\t\t\"04031984\",\n\t\t\"04011986\",\n\t\t\"03081985\",\n\t\t\"03071980\",\n\t\t\"03061991\",\n\t\t\"03061990\",\n\t\t\"03021992\",\n\t\t\"03011992\",\n\t\t\"02121985\",\n\t\t\"02101972\",\n\t\t\"02101970\",\n\t\t\"02051971\",\n\t\t\"02041992\",\n\t\t\"02031992\",\n\t\t\"02022010\",\n\t\t\"02021972\",\n\t\t\"01121980\",\n\t\t\"01091990\",\n\t\t\"01051992\",\n\t\t\"01011996\",\n\t\t\"zxcvasdf\",\n\t\t\"wrinkles\",\n\t\t\"warcraft3\",\n\t\t\"violator\",\n\t\t\"thumbnils\",\n\t\t\"tangerin\",\n\t\t\"tailgate\",\n\t\t\"stonewal\",\n\t\t\"spiderman1\",\n\t\t\"sometime\",\n\t\t\"sleeping\",\n\t\t\"skeleton\",\n\t\t\"sickness\",\n\t\t\"sexymama\",\n\t\t\"scorpions\",\n\t\t\"satellite\",\n\t\t\"qwedsazxc\",\n\t\t\"popopopo\",\n\t\t\"passcode\",\n\t\t\"offspring\",\n\t\t\"nothing1\",\n\t\t\"nokia5530\",\n\t\t\"Nicholas\",\n\t\t\"motocross\",\n\t\t\"monterey\",\n\t\t\"minnesot\",\n\t\t\"mike1234\",\n\t\t\"melanie1\",\n\t\t\"mannheim\",\n\t\t\"livelife\",\n\t\t\"lionhear\",\n\t\t\"lighthou\",\n\t\t\"lapochka\",\n\t\t\"knickerless\",\n\t\t\"jupiter2\",\n\t\t\"jesus777\",\n\t\t\"jediknig\",\n\t\t\"japanees\",\n\t\t\"hillside\",\n\t\t\"guillerm\",\n\t\t\"graywolf\",\n\t\t\"gfgfvfvf\",\n\t\t\"forester\",\n\t\t\"firestorm\",\n\t\t\"finalfantasy\",\n\t\t\"fernande\",\n\t\t\"euphoria\",\n\t\t\"escorpio\",\n\t\t\"earthlin\",\n\t\t\"deathnote\",\n\t\t\"contortionist\",\n\t\t\"bluestar\",\n\t\t\"bionicle\",\n\t\t\"billabong\",\n\t\t\"bernardo\",\n\t\t\"adelaide\",\n\t\t\"aaaa1111\",\n\t\t\"963258741\",\n\t\t\"911turbo\",\n\t\t\"42424242\",\n\t\t\"31101985\",\n\t\t\"31071989\",\n\t\t\"31071984\",\n\t\t\"31011992\",\n\t\t\"30091988\",\n\t\t\"30091983\",\n\t\t\"30011993\",\n\t\t\"2wsx3edc\",\n\t\t\"29101990\",\n\t\t\"29071982\",\n\t\t\"29061982\",\n\t\t\"29031987\",\n\t\t\"28111989\",\n\t\t\"28101985\",\n\t\t\"28091993\",\n\t\t\"28091986\",\n\t\t\"28071993\",\n\t\t\"28071982\",\n\t\t\"28061989\",\n\t\t\"28031989\",\n\t\t\"27121989\",\n\t\t\"27111986\",\n\t\t\"27111982\",\n\t\t\"27081987\",\n\t\t\"27051988\",\n\t\t\"27041983\",\n\t\t\"27011982\",\n\t\t\"26121986\",\n\t\t\"26111978\",\n\t\t\"26101988\",\n\t\t\"26101983\",\n\t\t\"26041989\",\n\t\t\"26031982\",\n\t\t\"26021986\",\n\t\t\"26011985\",\n\t\t\"25111990\",\n\t\t\"25091983\",\n\t\t\"25071992\",\n\t\t\"25061984\",\n\t\t\"25051991\",\n\t\t\"25041992\",\n\t\t\"25021994\",\n\t\t\"25011983\",\n\t\t\"24111992\",\n\t\t\"24111991\",\n\t\t\"24051988\",\n\t\t\"24041989\",\n\t\t\"23121984\",\n\t\t\"23101981\",\n\t\t\"23091984\",\n\t\t\"23071992\",\n\t\t\"23071981\",\n\t\t\"23021982\",\n\t\t\"22111986\",\n\t\t\"21081980\",\n\t\t\"21061980\",\n\t\t\"21051979\",\n\t\t\"21021992\",\n\t\t\"21021991\",\n\t\t\"20121984\",\n\t\t\"20111989\",\n\t\t\"20081989\",\n\t\t\"20071983\",\n\t\t\"20061985\",\n\t\t\"20041987\",\n\t\t\"20041980\",\n\t\t\"20031989\",\n\t\t\"20021982\",\n\t\t\"20011986\",\n\t\t\"19121978\",\n\t\t\"19051990\",\n\t\t\"19051989\",\n\t\t\"19011990\",\n\t\t\"19011988\",\n\t\t\"19011981\",\n\t\t\"18121986\",\n\t\t\"18081982\",\n\t\t\"18061993\",\n\t\t\"18061982\",\n\t\t\"18051991\",\n\t\t\"18041989\",\n\t\t\"18031989\",\n\t\t\"17111979\",\n\t\t\"17101988\",\n\t\t\"17101985\",\n\t\t\"17051985\",\n\t\t\"17031989\",\n\t\t\"17011992\",\n\t\t\"16101984\",\n\t\t\"16071989\",\n\t\t\"16051991\",\n\t\t\"16021991\",\n\t\t\"16021986\",\n\t\t\"16011982\",\n\t\t\"15121993\",\n\t\t\"15071981\",\n\t\t\"15071980\",\n\t\t\"15041984\",\n\t\t\"15011984\",\n\t\t\"14121991\",\n\t\t\"14121984\",\n\t\t\"14121979\",\n\t\t\"14111991\",\n\t\t\"14101992\",\n\t\t\"14091984\",\n\t\t\"14081992\",\n\t\t\"14081987\",\n\t\t\"14071985\",\n\t\t\"14011990\",\n\t\t\"13101989\",\n\t\t\"13091989\",\n\t\t\"13041990\",\n\t\t\"13041985\",\n\t\t\"13031988\",\n\t\t\"13031983\",\n\t\t\"13021986\",\n\t\t\"13011991\",\n\t\t\"13011990\",\n\t\t\"123qwe123qwe\",\n\t\t\"12345123\",\n\t\t\"12091982\",\n\t\t\"12051982\",\n\t\t\"12041977\",\n\t\t\"12031982\",\n\t\t\"12021989\",\n\t\t\"12021983\",\n\t\t\"12011986\",\n\t\t\"11121983\",\n\t\t\"11121980\",\n\t\t\"11111984\",\n\t\t\"11101988\",\n\t\t\"11101982\",\n\t\t\"11071991\",\n\t\t\"11061983\",\n\t\t\"11041980\",\n\t\t\"11031985\",\n\t\t\"11031980\",\n\t\t\"11011988\",\n\t\t\"10121988\",\n\t\t\"10111985\",\n\t\t\"10081993\",\n\t\t\"10081986\",\n\t\t\"10081982\",\n\t\t\"10071980\",\n\t\t\"10061991\",\n\t\t\"10061990\",\n\t\t\"0987654321q\",\n\t\t\"09121989\",\n\t\t\"09111985\",\n\t\t\"09091989\",\n\t\t\"09081990\",\n\t\t\"09071985\",\n\t\t\"09031989\",\n\t\t\"09031986\",\n\t\t\"09031981\",\n\t\t\"09021990\",\n\t\t\"09021986\",\n\t\t\"08121983\",\n\t\t\"08111986\",\n\t\t\"08071990\",\n\t\t\"08041982\",\n\t\t\"08041980\",\n\t\t\"08031993\",\n\t\t\"08021992\",\n\t\t\"07121992\",\n\t\t\"07111986\",\n\t\t\"07091984\",\n\t\t\"07091983\",\n\t\t\"07081990\",\n\t\t\"07081981\",\n\t\t\"07071992\",\n\t\t\"07051985\",\n\t\t\"07041984\",\n\t\t\"06021981\",\n\t\t\"05111991\",\n\t\t\"05111989\",\n\t\t\"05111984\",\n\t\t\"05061984\",\n\t\t\"05061981\",\n\t\t\"05061980\",\n\t\t\"05041989\",\n\t\t\"05041988\",\n\t\t\"04101984\",\n\t\t\"04101980\",\n\t\t\"04091990\",\n\t\t\"04081983\",\n\t\t\"04061985\",\n\t\t\"04031989\",\n\t\t\"03121990\",\n\t\t\"03051991\",\n\t\t\"03031982\",\n\t\t\"03021993\",\n\t\t\"02111990\",\n\t\t\"02111985\",\n\t\t\"02081991\",\n\t\t\"02071973\",\n\t\t\"02011972\",\n\t\t\"01111989\",\n\t\t\"01111984\",\n\t\t\"01101989\",\n\t\t\"01061982\",\n\t\t\"01031982\",\n\t\t\"01021994\",\n\t\t\"01021984\",\n\t\t\"woodwork\",\n\t\t\"winter99\",\n\t\t\"wednesda\",\n\t\t\"waterski\",\n\t\t\"vfpfafrf\",\n\t\t\"vflfufcrfh\",\n\t\t\"vfhbyjxrf\",\n\t\t\"uuuuuuuu\",\n\t\t\"troubles\",\n\t\t\"transexual\",\n\t\t\"thumper1\",\n\t\t\"thetruth\",\n\t\t\"SUNSHINE\",\n\t\t\"spamspam\",\n\t\t\"sephirot\",\n\t\t\"scirocco\",\n\t\t\"sarajevo\",\n\t\t\"rushmore\",\n\t\t\"rodrigue\",\n\t\t\"revival47\",\n\t\t\"qazqazqaz\",\n\t\t\"qaz123wsx\",\n\t\t\"qawsedrftg\",\n\t\t\"priyanka\",\n\t\t\"pornographic\",\n\t\t\"pippen33\",\n\t\t\"paladin1\",\n\t\t\"nineteen\",\n\t\t\"newproject2004\",\n\t\t\"myfriend\",\n\t\t\"motdepasse\",\n\t\t\"maurizio\",\n\t\t\"masturbation\",\n\t\t\"letmesee\",\n\t\t\"leonidas\",\n\t\t\"lamborghini\",\n\t\t\"komputer\",\n\t\t\"kickflip\",\n\t\t\"justinbieber\",\n\t\t\"internal\",\n\t\t\"insecure\",\n\t\t\"india123\",\n\t\t\"Iloveyou\",\n\t\t\"ilovepussy\",\n\t\t\"hugetits\",\n\t\t\"honeybun\",\n\t\t\"helsinki\",\n\t\t\"fuzzball\",\n\t\t\"fullback\",\n\t\t\"freewill\",\n\t\t\"fhvfutljy\",\n\t\t\"dominick\",\n\t\t\"disaster\",\n\t\t\"dfcbkbcf\",\n\t\t\"Danielle\",\n\t\t\"daniella\",\n\t\t\"cowboyup\",\n\t\t\"comicbookdb\",\n\t\t\"chowchow\",\n\t\t\"checkmat\",\n\t\t\"carlisle\",\n\t\t\"calendar\",\n\t\t\"businessbabe\",\n\t\t\"bulletin\",\n\t\t\"batman12\",\n\t\t\"basketbal\",\n\t\t\"BaBeMaGn\",\n\t\t\"attorney\",\n\t\t\"assmunch\",\n\t\t\"as123456\",\n\t\t\"angel666\",\n\t\t\"allstate\",\n\t\t\"allison1\",\n\t\t\"31081987\",\n\t\t\"31031985\",\n\t\t\"30111988\",\n\t\t\"30091986\",\n\t\t\"30081982\",\n\t\t\"30061992\",\n\t\t\"30061980\",\n\t\t\"30061979\",\n\t\t\"30051981\",\n\t\t\"30011988\",\n\t\t\"29121989\",\n\t\t\"29121982\",\n\t\t\"29101986\",\n\t\t\"29101982\",\n\t\t\"29091988\",\n\t\t\"29041982\",\n\t\t\"29011993\",\n\t\t\"29011989\",\n\t\t\"28071991\",\n\t\t\"28051991\",\n\t\t\"28051984\",\n\t\t\"28031985\",\n\t\t\"28021991\",\n\t\t\"28011984\",\n\t\t\"27731828\",\n\t\t\"27101985\",\n\t\t\"27051990\",\n\t\t\"27031988\",\n\t\t\"27021984\",\n\t\t\"26111992\",\n\t\t\"26081989\",\n\t\t\"26081988\",\n\t\t\"26071983\",\n\t\t\"26071982\",\n\t\t\"26051993\",\n\t\t\"25101991\",\n\t\t\"25101987\",\n\t\t\"25101985\",\n\t\t\"25061992\",\n\t\t\"25061988\",\n\t\t\"25041990\",\n\t\t\"25031980\",\n\t\t\"25011989\",\n\t\t\"25011982\",\n\t\t\"24091989\",\n\t\t\"24091987\",\n\t\t\"24091985\",\n\t\t\"24081982\",\n\t\t\"24031984\",\n\t\t\"24031983\",\n\t\t\"24021993\",\n\t\t\"23121990\",\n\t\t\"23121989\",\n\t\t\"23121982\",\n\t\t\"23101986\",\n\t\t\"23101985\",\n\t\t\"23091992\",\n\t\t\"23081985\",\n\t\t\"23041993\",\n\t\t\"23041982\",\n\t\t\"23011987\",\n\t\t\"22121988\",\n\t\t\"22121984\",\n\t\t\"22121978\",\n\t\t\"22111987\",\n\t\t\"22101990\",\n\t\t\"22091981\",\n\t\t\"22071981\",\n\t\t\"22011982\",\n\t\t\"21111984\",\n\t\t\"21071988\",\n\t\t\"21071984\",\n\t\t\"21051993\",\n\t\t\"20091989\",\n\t\t\"20091987\",\n\t\t\"20051991\",\n\t\t\"20041983\",\n\t\t\"20011979\",\n\t\t\"19091984\",\n\t\t\"19081982\",\n\t\t\"19071984\",\n\t\t\"19061982\",\n\t\t\"19051988\",\n\t\t\"19051985\",\n\t\t\"19051977\",\n\t\t\"19041990\",\n\t\t\"19021993\",\n\t\t\"19021984\",\n\t\t\"19011993\",\n\t\t\"18121979\",\n\t\t\"18101986\",\n\t\t\"18101983\",\n\t\t\"18091989\",\n\t\t\"18081992\",\n\t\t\"18071979\",\n\t\t\"18061989\",\n\t\t\"18061981\",\n\t\t\"18051993\",\n\t\t\"18031985\",\n\t\t\"18031982\",\n\t\t\"18031980\",\n\t\t\"18011993\",\n\t\t\"18011992\",\n\t\t\"17121993\",\n\t\t\"17121992\",\n\t\t\"17091983\",\n\t\t\"17081986\",\n\t\t\"17051981\",\n\t\t\"17031993\",\n\t\t\"17011989\",\n\t\t\"17011983\",\n\t\t\"16121990\",\n\t\t\"16121983\",\n\t\t\"16111992\",\n\t\t\"16081984\",\n\t\t\"16041978\",\n\t\t\"16021984\",\n\t\t\"15101982\",\n\t\t\"15081992\",\n\t\t\"15071982\",\n\t\t\"15061992\",\n\t\t\"15051988\",\n\t\t\"15041980\",\n\t\t\"15021993\",\n\t\t\"14121985\",\n\t\t\"14111985\",\n\t\t\"14101990\",\n\t\t\"14051991\",\n\t\t\"14051982\",\n\t\t\"14011983\",\n\t\t\"13121982\",\n\t\t\"13111982\",\n\t\t\"13101984\",\n\t\t\"13071979\",\n\t\t\"13061988\",\n\t\t\"13041983\",\n\t\t\"13011989\",\n\t\t\"12101983\",\n\t\t\"12081994\",\n\t\t\"12051980\",\n\t\t\"12041980\",\n\t\t\"12021993\",\n\t\t\"12021982\",\n\t\t\"12011993\",\n\t\t\"12011979\",\n\t\t\"11101984\",\n\t\t\"11041974\",\n\t\t\"11011986\",\n\t\t\"10111991\",\n\t\t\"10111990\",\n\t\t\"10101981\",\n\t\t\"10101975\",\n\t\t\"10091992\",\n\t\t\"10091980\",\n\t\t\"10081984\",\n\t\t\"10061988\",\n\t\t\"10041992\",\n\t\t\"10041979\",\n\t\t\"10021984\",\n\t\t\"10021982\",\n\t\t\"09101991\",\n\t\t\"09091990\",\n\t\t\"09071981\",\n\t\t\"09061988\",\n\t\t\"09061983\",\n\t\t\"08091987\",\n\t\t\"08091986\",\n\t\t\"08091985\",\n\t\t\"08081981\",\n\t\t\"08071984\",\n\t\t\"08071982\",\n\t\t\"08051992\",\n\t\t\"08041984\",\n\t\t\"08021984\",\n\t\t\"08011989\",\n\t\t\"07101988\",\n\t\t\"07101986\",\n\t\t\"07091989\",\n\t\t\"07051984\",\n\t\t\"07041980\",\n\t\t\"07021988\",\n\t\t\"07011985\",\n\t\t\"06091985\",\n\t\t\"06081989\",\n\t\t\"06071982\",\n\t\t\"06051991\",\n\t\t\"06021992\",\n\t\t\"06011989\",\n\t\t\"05121984\",\n\t\t\"05111983\",\n\t\t\"05101990\",\n\t\t\"05101989\",\n\t\t\"05081991\",\n\t\t\"05011985\",\n\t\t\"05011984\",\n\t\t\"04101989\",\n\t\t\"04101986\",\n\t\t\"04101977\",\n\t\t\"04071982\",\n\t\t\"04061980\",\n\t\t\"04011989\",\n\t\t\"03121987\",\n\t\t\"03111984\",\n\t\t\"03101979\",\n\t\t\"03081983\",\n\t\t\"03051990\",\n\t\t\"03031981\",\n\t\t\"03021984\",\n\t\t\"03021979\",\n\t\t\"02121992\",\n\t\t\"02101990\",\n\t\t\"02091991\",\n\t\t\"02071972\",\n\t\t\"02071970\",\n\t\t\"02051991\",\n\t\t\"02011973\",\n\t\t\"01101984\",\n\t\t\"01101979\",\n\t\t\"01081987\",\n\t\t\"01081982\",\n\t\t\"01071978\",\n\t\t\"01051993\",\n\t\t\"01051984\",\n\t\t\"01021995\",\n\t\t\"01011998\",\n\t\t\"yeahyeah\",\n\t\t\"winfield\",\n\t\t\"vivitron\",\n\t\t\"vfhnsirf\",\n\t\t\"ursitesux\",\n\t\t\"trousers\",\n\t\t\"ticktock\",\n\t\t\"survival\",\n\t\t\"smoke420\",\n\t\t\"ShitHead\",\n\t\t\"sfgiants\",\n\t\t\"schubert\",\n\t\t\"rdfhnbhf\",\n\t\t\"pussy4me\",\n\t\t\"password01\",\n\t\t\"nocturne\",\n\t\t\"newstart\",\n\t\t\"nathaniel\",\n\t\t\"monolith\",\n\t\t\"mojojojo\",\n\t\t\"metallica1\",\n\t\t\"maxpayne\",\n\t\t\"magdalena\",\n\t\t\"macgyver\",\n\t\t\"losangeles\",\n\t\t\"lolololo\",\n\t\t\"Liverpool\",\n\t\t\"lighthouse\",\n\t\t\"laughing\",\n\t\t\"lacrimosa\",\n\t\t\"kissmyas\",\n\t\t\"jeffrey1\",\n\t\t\"imtheman\",\n\t\t\"ibilltes\",\n\t\t\"honduras\",\n\t\t\"homebrew\",\n\t\t\"hawthorn\",\n\t\t\"gabrielle\",\n\t\t\"futyn007\",\n\t\t\"funtimes\",\n\t\t\"fruitbat\",\n\t\t\"frogfrog\",\n\t\t\"friday13\",\n\t\t\"frenchie\",\n\t\t\"forsberg\",\n\t\t\"fordtruc\",\n\t\t\"fishface\",\n\t\t\"evangeli\",\n\t\t\"embalmer\",\n\t\t\"elevator\",\n\t\t\"duracell\",\n\t\t\"dominika\",\n\t\t\"diplomat\",\n\t\t\"dima1995\",\n\t\t\"diamante\",\n\t\t\"dallas22\",\n\t\t\"costanza\",\n\t\t\"corvet07\",\n\t\t\"cornelia\",\n\t\t\"cobra427\",\n\t\t\"clueless\",\n\t\t\"chevys10\",\n\t\t\"capoeira\",\n\t\t\"bobobobo\",\n\t\t\"BIGDADDY\",\n\t\t\"athletic\",\n\t\t\"aerosmit\",\n\t\t\"adventure\",\n\t\t\"adrianna\",\n\t\t\"administrator\",\n\t\t\"addicted\",\n\t\t\"abcdefg1\",\n\t\t\"3edc4rfv\",\n\t\t\"31081990\",\n\t\t\"31071991\",\n\t\t\"31071982\",\n\t\t\"31071980\",\n\t\t\"31051977\",\n\t\t\"31031982\",\n\t\t\"30121990\",\n\t\t\"30101991\",\n\t\t\"30091992\",\n\t\t\"30081988\",\n\t\t\"30071989\",\n\t\t\"30071979\",\n\t\t\"30051991\",\n\t\t\"30041990\",\n\t\t\"30031985\",\n\t\t\"30031984\",\n\t\t\"30011989\",\n\t\t\"29121981\",\n\t\t\"29111982\",\n\t\t\"29101984\",\n\t\t\"29091984\",\n\t\t\"29071981\",\n\t\t\"29061991\",\n\t\t\"28111988\",\n\t\t\"28091989\",\n\t\t\"28081988\",\n\t\t\"28051980\",\n\t\t\"28031981\",\n\t\t\"28011985\",\n\t\t\"27121982\",\n\t\t\"27091988\",\n\t\t\"27041986\",\n\t\t\"27031993\",\n\t\t\"27031991\",\n\t\t\"27011987\",\n\t\t\"27011981\",\n\t\t\"26081987\",\n\t\t\"26051985\",\n\t\t\"26031980\",\n\t\t\"26011991\",\n\t\t\"25121988\",\n\t\t\"25121984\",\n\t\t\"25111982\",\n\t\t\"25111978\",\n\t\t\"25071978\",\n\t\t\"25051981\",\n\t\t\"25041986\",\n\t\t\"25031989\",\n\t\t\"24111981\",\n\t\t\"24081984\",\n\t\t\"24031991\",\n\t\t\"23121991\",\n\t\t\"23111988\",\n\t\t\"23101992\",\n\t\t\"23081992\",\n\t\t\"23071989\",\n\t\t\"23051980\",\n\t\t\"23041996\",\n\t\t\"23021977\",\n\t\t\"22121992\",\n\t\t\"22111983\",\n\t\t\"22081981\",\n\t\t\"22051984\",\n\t\t\"22051982\",\n\t\t\"22041992\",\n\t\t\"22041984\",\n\t\t\"22031981\",\n\t\t\"22011984\",\n\t\t\"21121978\",\n\t\t\"21111988\",\n\t\t\"21101984\",\n\t\t\"21101981\",\n\t\t\"21081989\",\n\t\t\"21061993\",\n\t\t\"21061992\",\n\t\t\"21041984\",\n\t\t\"21011984\",\n\t\t\"21011981\",\n\t\t\"20091990\",\n\t\t\"20081982\",\n\t\t\"20071993\",\n\t\t\"20061982\",\n\t\t\"20011992\",\n\t\t\"20011980\",\n\t\t\"1a2s3d4f5g\",\n\t\t\"19111988\",\n\t\t\"19101988\",\n\t\t\"19101985\",\n\t\t\"19101984\",\n\t\t\"19091985\",\n\t\t\"19081984\",\n\t\t\"19051981\",\n\t\t\"19021983\",\n\t\t\"19021980\",\n\t\t\"18181818\",\n\t\t\"18111990\",\n\t\t\"18101991\",\n\t\t\"18091983\",\n\t\t\"18041992\",\n\t\t\"18021989\",\n\t\t\"17121991\",\n\t\t\"17101980\",\n\t\t\"17071988\",\n\t\t\"17051979\",\n\t\t\"17041989\",\n\t\t\"17011984\",\n\t\t\"16091984\",\n\t\t\"16081990\",\n\t\t\"15101989\",\n\t\t\"15091986\",\n\t\t\"14121990\",\n\t\t\"14121983\",\n\t\t\"14111983\",\n\t\t\"14101984\",\n\t\t\"14081984\",\n\t\t\"14051992\",\n\t\t\"14051981\",\n\t\t\"14051977\",\n\t\t\"14041982\",\n\t\t\"13121980\",\n\t\t\"13111991\",\n\t\t\"13101993\",\n\t\t\"13101983\",\n\t\t\"13071994\",\n\t\t\"12locked\",\n\t\t\"1234KEKC\",\n\t\t\"1234567aA\",\n\t\t\"1213141516\",\n\t\t\"12121983\",\n\t\t\"12111981\",\n\t\t\"12091984\",\n\t\t\"12041993\",\n\t\t\"12011995\",\n\t\t\"11111978\",\n\t\t\"11101989\",\n\t\t\"11081978\",\n\t\t\"11041989\",\n\t\t\"10101984\",\n\t\t\"10061983\",\n\t\t\"10031983\",\n\t\t\"10021993\",\n\t\t\"10021990\",\n\t\t\"10011001\",\n\t\t\"09091984\",\n\t\t\"09061987\",\n\t\t\"09051991\",\n\t\t\"09051989\",\n\t\t\"09051975\",\n\t\t\"09041991\",\n\t\t\"09031985\",\n\t\t\"08121985\",\n\t\t\"08121984\",\n\t\t\"08121982\",\n\t\t\"08101985\",\n\t\t\"08091984\",\n\t\t\"08081982\",\n\t\t\"08061983\",\n\t\t\"08031990\",\n\t\t\"07121988\",\n\t\t\"07111985\",\n\t\t\"07101990\",\n\t\t\"07091986\",\n\t\t\"07011986\",\n\t\t\"06121989\",\n\t\t\"06121986\",\n\t\t\"06081992\",\n\t\t\"06081984\",\n\t\t\"06081979\",\n\t\t\"06041986\",\n\t\t\"05111985\",\n\t\t\"05091992\",\n\t\t\"05091991\",\n\t\t\"05081983\",\n\t\t\"05081981\",\n\t\t\"05081977\",\n\t\t\"05061982\",\n\t\t\"05051984\",\n\t\t\"05011992\",\n\t\t\"04101991\",\n\t\t\"04091989\",\n\t\t\"04071989\",\n\t\t\"04061993\",\n\t\t\"04031994\",\n\t\t\"04031985\",\n\t\t\"03101990\",\n\t\t\"03101986\",\n\t\t\"03081993\",\n\t\t\"03081991\",\n\t\t\"03061982\",\n\t\t\"03051982\",\n\t\t\"03051980\",\n\t\t\"03011989\",\n\t\t\"02101971\",\n\t\t\"02091993\",\n\t\t\"02091970\",\n\t\t\"02071990\",\n\t\t\"012345678\",\n\t\t\"01111988\",\n\t\t\"01101982\",\n\t\t\"01081978\",\n\t\t\"01071981\",\n\t\t\"01051979\",\n\t\t\"01042000\",\n\t\t\"01012006\",\n\t\t\"01011967\",\n\t\t\"00001111\",\n\t\t\"zxczxczxc\",\n\t\t\"zimbabwe\",\n\t\t\"woodstock\",\n\t\t\"wingzero\",\n\t\t\"wellingt\",\n\t\t\"truffles\",\n\t\t\"tiberian\",\n\t\t\"superbow\",\n\t\t\"stirling\",\n\t\t\"stephens\",\n\t\t\"Steelers\",\n\t\t\"start123\",\n\t\t\"sparhawk\",\n\t\t\"somebody\",\n\t\t\"silverado\",\n\t\t\"sammydog\",\n\t\t\"saltydog\",\n\t\t\"rfhlbyfk\",\n\t\t\"q1q2q3q4\",\n\t\t\"pregnant\",\n\t\t\"phantom1\",\n\t\t\"neworder\",\n\t\t\"needforspeed\",\n\t\t\"monkeyman\",\n\t\t\"lol12345\",\n\t\t\"lingerie\",\n\t\t\"landrove\",\n\t\t\"lambchop\",\n\t\t\"ladybird\",\n\t\t\"L58jkdjP!\",\n\t\t\"kristin1\",\n\t\t\"klopklop\",\n\t\t\"josephine\",\n\t\t\"jessica2\",\n\t\t\"Internet\",\n\t\t\"illmatic\",\n\t\t\"hunter12\",\n\t\t\"hondacbr\",\n\t\t\"greentea\",\n\t\t\"greatest\",\n\t\t\"glendale\",\n\t\t\"ghjdthrf\",\n\t\t\"Gandalf1\",\n\t\t\"friends1\",\n\t\t\"frederick\",\n\t\t\"firehawk\",\n\t\t\"fernanda\",\n\t\t\"fantasti\",\n\t\t\"dreamcast\",\n\t\t\"dragon01\",\n\t\t\"disturbed\",\n\t\t\"delphine\",\n\t\t\"deepthro\",\n\t\t\"daedalus\",\n\t\t\"chinchin\",\n\t\t\"chemistry\",\n\t\t\"casablanca\",\n\t\t\"buckwhea\",\n\t\t\"buckaroo\",\n\t\t\"bigpenis\",\n\t\t\"bertrand\",\n\t\t\"beachbum\",\n\t\t\"armageddon\",\n\t\t\"arizona1\",\n\t\t\"aligator\",\n\t\t\"alfarome\",\n\t\t\"Alexander\",\n\t\t\"890098890\",\n\t\t\"666666666\",\n\t\t\"31101983\",\n\t\t\"31081982\",\n\t\t\"31051989\",\n\t\t\"31051983\",\n\t\t\"30071988\",\n\t\t\"30061990\",\n\t\t\"30061984\",\n\t\t\"30041984\",\n\t\t\"30041983\",\n\t\t\"30031979\",\n\t\t\"29121992\",\n\t\t\"29101989\",\n\t\t\"29091989\",\n\t\t\"29091983\",\n\t\t\"29071980\",\n\t\t\"29041980\",\n\t\t\"29021984\",\n\t\t\"29011984\",\n\t\t\"28111985\",\n\t\t\"28101989\",\n\t\t\"28101979\",\n\t\t\"28061981\",\n\t\t\"28011986\",\n\t\t\"27111978\",\n\t\t\"27081984\",\n\t\t\"27021988\",\n\t\t\"27011989\",\n\t\t\"26121988\",\n\t\t\"26121981\",\n\t\t\"26111988\",\n\t\t\"26101985\",\n\t\t\"26101981\",\n\t\t\"26081990\",\n\t\t\"26051992\",\n\t\t\"26051989\",\n\t\t\"26031989\",\n\t\t\"26011992\",\n\t\t\"26011984\",\n\t\t\"25121991\",\n\t\t\"25091982\",\n\t\t\"25071981\",\n\t\t\"25071980\",\n\t\t\"25061983\",\n\t\t\"25061981\",\n\t\t\"25031985\",\n\t\t\"25031982\",\n\t\t\"25011984\",\n\t\t\"24101994\",\n\t\t\"24071982\",\n\t\t\"24051984\",\n\t\t\"24041983\",\n\t\t\"23121988\",\n\t\t\"23111991\",\n\t\t\"23111984\",\n\t\t\"23111983\",\n\t\t\"23081983\",\n\t\t\"23061991\",\n\t\t\"23061986\",\n\t\t\"23051981\",\n\t\t\"23031984\",\n\t\t\"23021978\",\n\t\t\"22334455\",\n\t\t\"22061992\",\n\t\t\"22041982\",\n\t\t\"21101990\",\n\t\t\"21101982\",\n\t\t\"21091982\",\n\t\t\"20111991\",\n\t\t\"20111990\",\n\t\t\"20101992\",\n\t\t\"20101990\",\n\t\t\"20101985\",\n\t\t\"20071987\",\n\t\t\"20021984\",\n\t\t\"20011990\",\n\t\t\"1a2a3a4a\",\n\t\t\"19121990\",\n\t\t\"19111990\",\n\t\t\"19061988\",\n\t\t\"19041983\",\n\t\t\"19041978\",\n\t\t\"19031986\",\n\t\t\"19021992\",\n\t\t\"19011982\",\n\t\t\"18121989\",\n\t\t\"18111992\",\n\t\t\"18111982\",\n\t\t\"18081985\",\n\t\t\"18061983\",\n\t\t\"18061980\",\n\t\t\"17121988\",\n\t\t\"17101989\",\n\t\t\"17091992\",\n\t\t\"17091982\",\n\t\t\"17091979\",\n\t\t\"17071992\",\n\t\t\"17071983\",\n\t\t\"17061993\",\n\t\t\"17051982\",\n\t\t\"17041983\",\n\t\t\"16121988\",\n\t\t\"16101991\",\n\t\t\"16071993\",\n\t\t\"16061991\",\n\t\t\"15101981\",\n\t\t\"15061994\",\n\t\t\"15061991\",\n\t\t\"15041981\",\n\t\t\"15031994\",\n\t\t\"15031983\",\n\t\t\"15011993\",\n\t\t\"15011982\",\n\t\t\"14101993\",\n\t\t\"14071984\",\n\t\t\"14061987\",\n\t\t\"14041993\",\n\t\t\"14041976\",\n\t\t\"14031980\",\n\t\t\"14031978\",\n\t\t\"14011984\",\n\t\t\"14011982\",\n\t\t\"13245768\",\n\t\t\"13081978\",\n\t\t\"13061981\",\n\t\t\"13041992\",\n\t\t\"13021995\",\n\t\t\"123mudar\",\n\t\t\"123456789l\",\n\t\t\"123456789123\",\n\t\t\"12345612\",\n\t\t\"12340987\",\n\t\t\"12111988\",\n\t\t\"12111986\",\n\t\t\"12111982\",\n\t\t\"12071980\",\n\t\t\"12051984\",\n\t\t\"12011984\",\n\t\t\"12011980\",\n\t\t\"11121991\",\n\t\t\"11101979\",\n\t\t\"11091992\",\n\t\t\"11091991\",\n\t\t\"11081993\",\n\t\t\"11051983\",\n\t\t\"11021983\",\n\t\t\"10111982\",\n\t\t\"10091983\",\n\t\t\"10061980\",\n\t\t\"10011982\",\n\t\t\"09121992\",\n\t\t\"09101982\",\n\t\t\"09091979\",\n\t\t\"09081989\",\n\t\t\"09061984\",\n\t\t\"09051978\",\n\t\t\"09041982\",\n\t\t\"09021991\",\n\t\t\"09021985\",\n\t\t\"08101984\",\n\t\t\"08091981\",\n\t\t\"08081991\",\n\t\t\"08071991\",\n\t\t\"08051986\",\n\t\t\"08051985\",\n\t\t\"08051984\",\n\t\t\"08031982\",\n\t\t\"08031977\",\n\t\t\"08021986\",\n\t\t\"07121985\",\n\t\t\"07071983\",\n\t\t\"07041979\",\n\t\t\"07031984\",\n\t\t\"07021985\",\n\t\t\"06121987\",\n\t\t\"06111982\",\n\t\t\"06061991\",\n\t\t\"06061984\",\n\t\t\"06041991\",\n\t\t\"06011990\",\n\t\t\"05111990\",\n\t\t\"05101987\",\n\t\t\"05051981\",\n\t\t\"05031983\",\n\t\t\"05021990\",\n\t\t\"04111990\",\n\t\t\"04111985\",\n\t\t\"04101990\",\n\t\t\"04071990\",\n\t\t\"03111992\",\n\t\t\"03091982\",\n\t\t\"03071991\",\n\t\t\"03071978\",\n\t\t\"03061983\",\n\t\t\"03021988\",\n\t\t\"03011988\",\n\t\t\"02081994\",\n\t\t\"02041993\",\n\t\t\"02021994\",\n\t\t\"02021970\",\n\t\t\"01121982\",\n\t\t\"01111983\",\n\t\t\"01101991\",\n\t\t\"01061991\",\n\t\t\"01031992\",\n\t\t\"01031976\",\n\t\t\"01021983\",\n\t\t\"01011966\",\n\t\t\"01011965\",\n\t\t\"ytngfhjkz\",\n\t\t\"yourmama\",\n\t\t\"wingchun\",\n\t\t\"wildlife\",\n\t\t\"welcome2\",\n\t\t\"wednesday\",\n\t\t\"undertow\",\n\t\t\"uncencored\",\n\t\t\"trailers\",\n\t\t\"temptress\",\n\t\t\"submarin\",\n\t\t\"sublime1\",\n\t\t\"starbucks\",\n\t\t\"spalding\",\n\t\t\"songbird\",\n\t\t\"snapshot\",\n\t\t\"shevchenko\",\n\t\t\"sevenof9\",\n\t\t\"seahorse\",\n\t\t\"santacru\",\n\t\t\"sandman1\",\n\t\t\"salesman\",\n\t\t\"rt6YTERE\",\n\t\t\"rktjgfnhf\",\n\t\t\"raymond1\",\n\t\t\"ramstein\",\n\t\t\"prudence\",\n\t\t\"prestige\",\n\t\t\"paramore\",\n\t\t\"papabear\",\n\t\t\"omegared\",\n\t\t\"nonmembe\",\n\t\t\"nastenka\",\n\t\t\"morticia\",\n\t\t\"morozova\",\n\t\t\"monkey123\",\n\t\t\"milkyway\",\n\t\t\"michelle1\",\n\t\t\"masterbaiting\",\n\t\t\"marajade\",\n\t\t\"longshot\",\n\t\t\"letmeinn\",\n\t\t\"kenneth1\",\n\t\t\"johnston\",\n\t\t\"ireland1\",\n\t\t\"hulkster\",\n\t\t\"housewife\",\n\t\t\"hellohel\",\n\t\t\"headache\",\n\t\t\"gorillaz\",\n\t\t\"goldrush\",\n\t\t\"girfriend\",\n\t\t\"Garfield\",\n\t\t\"fuckthat\",\n\t\t\"fourteen\",\n\t\t\"flipper1\",\n\t\t\"fireblade\",\n\t\t\"evildead\",\n\t\t\"everyday\",\n\t\t\"dropkick\",\n\t\t\"drifting\",\n\t\t\"dragrace\",\n\t\t\"doorknob\",\n\t\t\"domenico\",\n\t\t\"daniel12\",\n\t\t\"costaric\",\n\t\t\"contests\",\n\t\t\"bugsbunn\",\n\t\t\"bubblegum\",\n\t\t\"blondinka\",\n\t\t\"blackbelt\",\n\t\t\"benedict\",\n\t\t\"BaBeMaGnEt\",\n\t\t\"asslover\",\n\t\t\"anna2614\",\n\t\t\"78787878\",\n\t\t\"74227422\",\n\t\t\"74107410\",\n\t\t\"43046721\",\n\t\t\"31121991\",\n\t\t\"31101984\",\n\t\t\"31031989\",\n\t\t\"31031980\",\n\t\t\"30101983\",\n\t\t\"30101982\",\n\t\t\"30051980\",\n\t\t\"30051979\",\n\t\t\"30041982\",\n\t\t\"30031991\",\n\t\t\"30031983\",\n\t\t\"30011991\",\n\t\t\"29121990\",\n\t\t\"29101988\",\n\t\t\"29091977\",\n\t\t\"29061983\",\n\t\t\"29041993\",\n\t\t\"29011986\",\n\t\t\"28111983\",\n\t\t\"28101992\",\n\t\t\"28091991\",\n\t\t\"28091981\",\n\t\t\"28081989\",\n\t\t\"28071990\",\n\t\t\"28071978\",\n\t\t\"28061991\",\n\t\t\"28041980\",\n\t\t\"28011983\",\n\t\t\"27111991\",\n\t\t\"27111988\",\n\t\t\"27091990\",\n\t\t\"27091989\",\n\t\t\"27061980\",\n\t\t\"27051983\",\n\t\t\"27011984\",\n\t\t\"26111991\",\n\t\t\"26111982\",\n\t\t\"26091990\",\n\t\t\"26091987\",\n\t\t\"26071992\",\n\t\t\"26031983\",\n\t\t\"26011979\",\n\t\t\"25101983\",\n\t\t\"25101978\",\n\t\t\"25071991\",\n\t\t\"25051993\",\n\t\t\"25031994\",\n\t\t\"25021992\",\n\t\t\"25011994\",\n\t\t\"24101983\",\n\t\t\"24081992\",\n\t\t\"24071984\",\n\t\t\"24071983\",\n\t\t\"23101984\",\n\t\t\"23101982\",\n\t\t\"23071991\",\n\t\t\"23071990\",\n\t\t\"23071982\",\n\t\t\"23061984\",\n\t\t\"23061976\",\n\t\t\"23051978\",\n\t\t\"23031992\",\n\t\t\"23021981\",\n\t\t\"23021975\",\n\t\t\"23011983\",\n\t\t\"23011981\",\n\t\t\"22111979\",\n\t\t\"22091989\",\n\t\t\"22081992\",\n\t\t\"22081989\",\n\t\t\"22051981\",\n\t\t\"22041976\",\n\t\t\"22011983\",\n\t\t\"22011975\",\n\t\t\"21091980\",\n\t\t\"21061984\",\n\t\t\"21041994\",\n\t\t\"21041993\",\n\t\t\"21041978\",\n\t\t\"21031989\",\n\t\t\"20071992\",\n\t\t\"20071989\",\n\t\t\"20041989\",\n\t\t\"1password\",\n\t\t\"1a2b3c4d5e\",\n\t\t\"19111989\",\n\t\t\"19111981\",\n\t\t\"19091982\",\n\t\t\"19071994\",\n\t\t\"19051980\",\n\t\t\"19041981\",\n\t\t\"19041980\",\n\t\t\"19011991\",\n\t\t\"18121980\",\n\t\t\"18091988\",\n\t\t\"18071980\",\n\t\t\"17111984\",\n\t\t\"17031990\",\n\t\t\"17021981\",\n\t\t\"16161616\",\n\t\t\"16111988\",\n\t\t\"16111985\",\n\t\t\"16091985\",\n\t\t\"16081992\",\n\t\t\"16081983\",\n\t\t\"16071982\",\n\t\t\"16071980\",\n\t\t\"16041991\",\n\t\t\"16031993\",\n\t\t\"16021985\",\n\t\t\"15111981\",\n\t\t\"15101979\",\n\t\t\"15091981\",\n\t\t\"15061986\",\n\t\t\"15051980\",\n\t\t\"15041992\",\n\t\t\"15041991\",\n\t\t\"15031975\",\n\t\t\"15011989\",\n\t\t\"14121993\",\n\t\t\"14121980\",\n\t\t\"14071990\",\n\t\t\"14071980\",\n\t\t\"14051979\",\n\t\t\"14031982\",\n\t\t\"14021982\",\n\t\t\"14011992\",\n\t\t\"13111987\",\n\t\t\"13091980\",\n\t\t\"13081981\",\n\t\t\"13061982\",\n\t\t\"13041981\",\n\t\t\"13011992\",\n\t\t\"123698741\",\n\t\t\"123456789p\",\n\t\t\"12101979\",\n\t\t\"12091992\",\n\t\t\"12081992\",\n\t\t\"12081981\",\n\t\t\"12061994\",\n\t\t\"12061992\",\n\t\t\"12051991\",\n\t\t\"12031992\",\n\t\t\"12011990\",\n\t\t\"11121992\",\n\t\t\"11111992\",\n\t\t\"11101983\",\n\t\t\"11101980\",\n\t\t\"11071980\",\n\t\t\"11061993\",\n\t\t\"11031993\",\n\t\t\"11021994\",\n\t\t\"11021989\",\n\t\t\"10121992\",\n\t\t\"10121976\",\n\t\t\"10101977\",\n\t\t\"10091993\",\n\t\t\"10071993\",\n\t\t\"10061992\",\n\t\t\"10051992\",\n\t\t\"10041993\",\n\t\t\"10031981\",\n\t\t\"10021989\",\n\t\t\"10021981\",\n\t\t\"10011993\",\n\t\t\"10011991\",\n\t\t\"10011984\",\n\t\t\"09091982\",\n\t\t\"09081987\",\n\t\t\"09061981\",\n\t\t\"09041984\",\n\t\t\"09021982\",\n\t\t\"09011992\",\n\t\t\"09011989\",\n\t\t\"09011980\",\n\t\t\"08111991\",\n\t\t\"08111990\",\n\t\t\"08041981\",\n\t\t\"08011980\",\n\t\t\"07121983\",\n\t\t\"07081980\",\n\t\t\"07071993\",\n\t\t\"07071978\",\n\t\t\"07061984\",\n\t\t\"07041982\",\n\t\t\"07041981\",\n\t\t\"07011987\",\n\t\t\"07011982\",\n\t\t\"06121991\",\n\t\t\"06121985\",\n\t\t\"06111987\",\n\t\t\"06111983\",\n\t\t\"06091990\",\n\t\t\"06091988\",\n\t\t\"05101988\",\n\t\t\"05091984\",\n\t\t\"05061991\",\n\t\t\"05041987\",\n\t\t\"05021981\",\n\t\t\"05011983\",\n\t\t\"04121989\",\n\t\t\"04101985\",\n\t\t\"04091979\",\n\t\t\"04071992\",\n\t\t\"04071984\",\n\t\t\"04051982\",\n\t\t\"04021986\",\n\t\t\"04021984\",\n\t\t\"04021982\",\n\t\t\"03081980\",\n\t\t\"03081979\",\n\t\t\"03061977\",\n\t\t\"03041992\",\n\t\t\"03021978\",\n\t\t\"02121989\",\n\t\t\"02121980\",\n\t\t\"02111986\",\n\t\t\"01101980\",\n\t\t\"01061993\",\n\t\t\"01051974\",\n\t\t\"01031993\",\n\t\t\"01011968\",\n\t\t\"wapapapa\",\n\t\t\"victory1\",\n\t\t\"verygood\",\n\t\t\"vancouver\",\n\t\t\"toulouse\",\n\t\t\"tooltime\",\n\t\t\"tequiero\",\n\t\t\"sunderla\",\n\t\t\"starlite\",\n\t\t\"sooners1\",\n\t\t\"snowflake\",\n\t\t\"skeeter1\",\n\t\t\"singapore\",\n\t\t\"shinigami\",\n\t\t\"seventeen\",\n\t\t\"sanity72\",\n\t\t\"samadams\",\n\t\t\"restless\",\n\t\t\"redstorm\",\n\t\t\"rb26dett\",\n\t\t\"qwerty99\",\n\t\t\"pussyeat\",\n\t\t\"P@ssw0rd\",\n\t\t\"porsche911\",\n\t\t\"plumbing\",\n\t\t\"pennstat\",\n\t\t\"peaceful\",\n\t\t\"partners\",\n\t\t\"paranoia\",\n\t\t\"necklace\",\n\t\t\"motherfu\",\n\t\t\"milamber\",\n\t\t\"memories\",\n\t\t\"marybeth\",\n\t\t\"manifest\",\n\t\t\"mahalkita\",\n\t\t\"machines\",\n\t\t\"losangel\",\n\t\t\"littlema\",\n\t\t\"liberty1\",\n\t\t\"kfcnjxrf\",\n\t\t\"kazanova\",\n\t\t\"j3qq4h7h2v\",\n\t\t\"infinite\",\n\t\t\"ignatius\",\n\t\t\"horseman\",\n\t\t\"honeydew\",\n\t\t\"heinlein\",\n\t\t\"glennwei\",\n\t\t\"geibcnbr\",\n\t\t\"fuckshit\",\n\t\t\"fordf350\",\n\t\t\"fktyeirf\",\n\t\t\"fakepass\",\n\t\t\"everques\",\n\t\t\"enter123\",\n\t\t\"dortmund\",\n\t\t\"dominate\",\n\t\t\"discovery\",\n\t\t\"desperado\",\n\t\t\"demon666\",\n\t\t\"dagobert\",\n\t\t\"churchil\",\n\t\t\"christophe\",\n\t\t\"Christia\",\n\t\t\"chopper1\",\n\t\t\"chairman\",\n\t\t\"caldwell\",\n\t\t\"brisbane\",\n\t\t\"braveheart\",\n\t\t\"bonethug\",\n\t\t\"bluenose\",\n\t\t\"birthday4\",\n\t\t\"bettyboop\",\n\t\t\"avalanche\",\n\t\t\"austin316\",\n\t\t\"augustin\",\n\t\t\"allnight\",\n\t\t\"allblack\",\n\t\t\"alex1234\",\n\t\t\"alejandra\",\n\t\t\"aerosmith\",\n\t\t\"admin123\",\n\t\t\"31121984\",\n\t\t\"31101982\",\n\t\t\"31071977\",\n\t\t\"31051992\",\n\t\t\"30111983\",\n\t\t\"30111979\",\n\t\t\"30081983\",\n\t\t\"30041993\",\n\t\t\"30041989\",\n\t\t\"30041980\",\n\t\t\"29111984\",\n\t\t\"29081991\",\n\t\t\"29081989\",\n\t\t\"29071991\",\n\t\t\"29071989\",\n\t\t\"29061981\",\n\t\t\"29051993\",\n\t\t\"29041994\",\n\t\t\"29031993\",\n\t\t\"28121985\",\n\t\t\"28111991\",\n\t\t\"28081981\",\n\t\t\"28071981\",\n\t\t\"28031987\",\n\t\t\"28021987\",\n\t\t\"28021978\",\n\t\t\"28011992\",\n\t\t\"28011990\",\n\t\t\"27121991\",\n\t\t\"27111987\",\n\t\t\"27101991\",\n\t\t\"27091979\",\n\t\t\"27071994\",\n\t\t\"26121991\",\n\t\t\"26101990\",\n\t\t\"26091981\",\n\t\t\"26081992\",\n\t\t\"26081981\",\n\t\t\"26071991\",\n\t\t\"26071988\",\n\t\t\"26071979\",\n\t\t\"26061992\",\n\t\t\"26051983\",\n\t\t\"26041985\",\n\t\t\"26021991\",\n\t\t\"25121980\",\n\t\t\"25111980\",\n\t\t\"25081993\",\n\t\t\"25081984\",\n\t\t\"25071988\",\n\t\t\"25061990\",\n\t\t\"25031979\",\n\t\t\"25021991\",\n\t\t\"24121993\",\n\t\t\"24091982\",\n\t\t\"24081989\",\n\t\t\"24061991\",\n\t\t\"24051993\",\n\t\t\"24051992\",\n\t\t\"24031992\",\n\t\t\"24031982\",\n\t\t\"24011982\",\n\t\t\"23121987\",\n\t\t\"23121985\",\n\t\t\"23081980\",\n\t\t\"23051982\",\n\t\t\"23031982\",\n\t\t\"23011986\",\n\t\t\"22121990\",\n\t\t\"22101984\",\n\t\t\"22101978\",\n\t\t\"22091977\",\n\t\t\"22061981\",\n\t\t\"22051983\",\n\t\t\"22041981\",\n\t\t\"22041979\",\n\t\t\"22031983\",\n\t\t\"22021991\",\n\t\t\"21111987\",\n\t\t\"21111982\",\n\t\t\"21101985\",\n\t\t\"21051981\",\n\t\t\"21031983\",\n\t\t\"20101991\",\n\t\t\"20081993\",\n\t\t\"20081983\",\n\t\t\"20071982\",\n\t\t\"20031981\",\n\t\t\"20011982\",\n\t\t\"19571957\",\n\t\t\"19121992\",\n\t\t\"19101991\",\n\t\t\"19081978\",\n\t\t\"19071982\",\n\t\t\"19051993\",\n\t\t\"19051984\",\n\t\t\"18273645\",\n\t\t\"18111981\",\n\t\t\"18101984\",\n\t\t\"18091982\",\n\t\t\"18051980\",\n\t\t\"17121984\",\n\t\t\"17111992\",\n\t\t\"17091978\",\n\t\t\"17081985\",\n\t\t\"17081982\",\n\t\t\"17071980\",\n\t\t\"17061990\",\n\t\t\"17061984\",\n\t\t\"17051984\",\n\t\t\"17041992\",\n\t\t\"17021984\",\n\t\t\"16121992\",\n\t\t\"16101988\",\n\t\t\"16071992\",\n\t\t\"16051984\",\n\t\t\"16041983\",\n\t\t\"16031994\",\n\t\t\"16031983\",\n\t\t\"16021994\",\n\t\t\"15121992\",\n\t\t\"15121988\",\n\t\t\"15121982\",\n\t\t\"15121977\",\n\t\t\"15101990\",\n\t\t\"15101980\",\n\t\t\"15091992\",\n\t\t\"15031993\",\n\t\t\"15021978\",\n\t\t\"14091983\",\n\t\t\"14081983\",\n\t\t\"14061989\",\n\t\t\"14051988\",\n\t\t\"14051984\",\n\t\t\"14041985\",\n\t\t\"14021995\",\n\t\t\"14021977\",\n\t\t\"14011985\",\n\t\t\"13241324\",\n\t\t\"13121991\",\n\t\t\"13111980\",\n\t\t\"13081993\",\n\t\t\"13081980\",\n\t\t\"13021988\",\n\t\t\"12345asd\",\n\t\t\"12345678900\",\n\t\t\"12345654321\",\n\t\t\"12111983\",\n\t\t\"12091981\",\n\t\t\"12071981\",\n\t\t\"12031993\",\n\t\t\"11111990\",\n\t\t\"11111985\",\n\t\t\"11111980\",\n\t\t\"11101991\",\n\t\t\"11061981\",\n\t\t\"11041984\",\n\t\t\"11021982\",\n\t\t\"10101978\",\n\t\t\"10081992\",\n\t\t\"10081980\",\n\t\t\"10071982\",\n\t\t\"10021991\",\n\t\t\"10011978\",\n\t\t\"09101980\",\n\t\t\"09081982\",\n\t\t\"09071982\",\n\t\t\"09041989\",\n\t\t\"09021993\",\n\t\t\"09021984\",\n\t\t\"08121988\",\n\t\t\"08091982\",\n\t\t\"08081976\",\n\t\t\"08021980\",\n\t\t\"08011990\",\n\t\t\"08011983\",\n\t\t\"07121989\",\n\t\t\"07111984\",\n\t\t\"07071976\",\n\t\t\"07021993\",\n\t\t\"07021983\",\n\t\t\"06111989\",\n\t\t\"06091984\",\n\t\t\"06071991\",\n\t\t\"06061980\",\n\t\t\"06021985\",\n\t\t\"05101982\",\n\t\t\"05081979\",\n\t\t\"05071981\",\n\t\t\"05071977\",\n\t\t\"05021980\",\n\t\t\"04081991\",\n\t\t\"04081984\",\n\t\t\"04081981\",\n\t\t\"04061994\",\n\t\t\"04061989\",\n\t\t\"04051980\",\n\t\t\"04021981\",\n\t\t\"03081982\",\n\t\t\"03071982\",\n\t\t\"03041975\",\n\t\t\"03031985\",\n\t\t\"03021985\",\n\t\t\"03011983\",\n\t\t\"02061993\",\n\t\t\"01121979\",\n\t\t\"01111986\",\n\t\t\"01101988\",\n\t\t\"01091983\",\n\t\t\"01081983\",\n\t\t\"01071982\",\n\t\t\"01031978\",\n\t\t\"0000000000o\",\n\t\t\"zaq12345\",\n\t\t\"x72jHhu3Z\",\n\t\t\"William1\",\n\t\t\"watermelon\",\n\t\t\"utahjazz\",\n\t\t\"tonyhawk\",\n\t\t\"thething\",\n\t\t\"testibil\",\n\t\t\"terriers\",\n\t\t\"scandinavian\",\n\t\t\"rerfhtre\",\n\t\t\"rammstei\",\n\t\t\"qazxsw123\",\n\t\t\"penetrating\",\n\t\t\"peaceout\",\n\t\t\"pathfinder\",\n\t\t\"passthie\",\n\t\t\"partizan\",\n\t\t\"navigato\",\n\t\t\"mypasswo\",\n\t\t\"meandyou\",\n\t\t\"maximus1\",\n\t\t\"maurolarastefy\",\n\t\t\"mastermi\",\n\t\t\"master123\",\n\t\t\"marymary\",\n\t\t\"manhatta\",\n\t\t\"lasttime\",\n\t\t\"lancaster\",\n\t\t\"kokokoko\",\n\t\t\"ilikesex\",\n\t\t\"hornyman\",\n\t\t\"helphelp\",\n\t\t\"gymnastic\",\n\t\t\"gotyoass\",\n\t\t\"goodlife\",\n\t\t\"galeries\",\n\t\t\"fuckmehard\",\n\t\t\"freedom2\",\n\t\t\"frank123\",\n\t\t\"forgotten\",\n\t\t\"firestar\",\n\t\t\"everton1\",\n\t\t\"domainlock2005\",\n\t\t\"disabled\",\n\t\t\"dickweed\",\n\t\t\"detectiv\",\n\t\t\"cybersex\",\n\t\t\"cxfcnkbdfz\",\n\t\t\"crockett\",\n\t\t\"charming\",\n\t\t\"charlie123\",\n\t\t\"blessed1\",\n\t\t\"biscuits\",\n\t\t\"astonvil\",\n\t\t\"arcangel\",\n\t\t\"anakonda\",\n\t\t\"alkaline\",\n\t\t\"Alexandr\",\n\t\t\"555555555\",\n\t\t\"333333333\",\n\t\t\"31121980\",\n\t\t\"31101990\",\n\t\t\"31101978\",\n\t\t\"31081988\",\n\t\t\"31081983\",\n\t\t\"31031984\",\n\t\t\"31011986\",\n\t\t\"30121983\",\n\t\t\"30111985\",\n\t\t\"30101981\",\n\t\t\"30091994\",\n\t\t\"30091982\",\n\t\t\"30081987\",\n\t\t\"30061991\",\n\t\t\"30011978\",\n\t\t\"30011977\",\n\t\t\"29121991\",\n\t\t\"29091993\",\n\t\t\"29091981\",\n\t\t\"29071992\",\n\t\t\"29041983\",\n\t\t\"29031985\",\n\t\t\"29031984\",\n\t\t\"29021980\",\n\t\t\"28121983\",\n\t\t\"28121982\",\n\t\t\"28121981\",\n\t\t\"28081991\",\n\t\t\"28061982\",\n\t\t\"28051993\",\n\t\t\"28031979\",\n\t\t\"28011981\",\n\t\t\"27101983\",\n\t\t\"27051993\",\n\t\t\"27041984\",\n\t\t\"27021982\",\n\t\t\"26121977\",\n\t\t\"26101992\",\n\t\t\"26101982\",\n\t\t\"26061981\",\n\t\t\"26051984\",\n\t\t\"26021984\",\n\t\t\"26011983\",\n\t\t\"25081991\",\n\t\t\"25081980\",\n\t\t\"25061994\",\n\t\t\"25061991\",\n\t\t\"25061989\",\n\t\t\"25051995\",\n\t\t\"25051982\",\n\t\t\"25051979\",\n\t\t\"25041979\",\n\t\t\"25031990\",\n\t\t\"24121981\",\n\t\t\"24111984\",\n\t\t\"24091981\",\n\t\t\"24031986\",\n\t\t\"24021994\",\n\t\t\"24011981\",\n\t\t\"23101991\",\n\t\t\"23101979\",\n\t\t\"23091990\",\n\t\t\"23091978\",\n\t\t\"23081989\",\n\t\t\"23081987\",\n\t\t\"23081977\",\n\t\t\"23061979\",\n\t\t\"23051992\",\n\t\t\"23041977\",\n\t\t\"23021973\",\n\t\t\"22101992\",\n\t\t\"22091982\",\n\t\t\"22081977\",\n\t\t\"22071982\",\n\t\t\"22061986\",\n\t\t\"22051992\",\n\t\t\"22031985\",\n\t\t\"22031978\",\n\t\t\"22021982\",\n\t\t\"22021980\",\n\t\t\"21121983\",\n\t\t\"21121981\",\n\t\t\"21121977\",\n\t\t\"21111981\",\n\t\t\"21101992\",\n\t\t\"21101991\",\n\t\t\"21091983\",\n\t\t\"21081981\",\n\t\t\"21051982\",\n\t\t\"21031993\",\n\t\t\"21011983\",\n\t\t\"20112011\",\n\t\t\"20111982\",\n\t\t\"20101989\",\n\t\t\"20101983\",\n\t\t\"20071991\",\n\t\t\"20051990\",\n\t\t\"20051980\",\n\t\t\"20041991\",\n\t\t\"20031993\",\n\t\t\"19591959\",\n\t\t\"19121984\",\n\t\t\"19091993\",\n\t\t\"19091991\",\n\t\t\"19091978\",\n\t\t\"19071995\",\n\t\t\"19061983\",\n\t\t\"19031989\",\n\t\t\"19031982\",\n\t\t\"18121993\",\n\t\t\"18111979\",\n\t\t\"18101992\",\n\t\t\"18101982\",\n\t\t\"18081983\",\n\t\t\"18071987\",\n\t\t\"18021990\",\n\t\t\"18021981\",\n\t\t\"18011983\",\n\t\t\"17121980\",\n\t\t\"17111980\",\n\t\t\"17101979\",\n\t\t\"17081991\",\n\t\t\"17061979\",\n\t\t\"17031994\",\n\t\t\"17011988\",\n\t\t\"16101982\",\n\t\t\"16091980\",\n\t\t\"16081987\",\n\t\t\"16081979\",\n\t\t\"16061980\",\n\t\t\"16031989\",\n\t\t\"16031980\",\n\t\t\"16021993\",\n\t\t\"16011984\",\n\t\t\"15121979\",\n\t\t\"15101988\",\n\t\t\"15091978\",\n\t\t\"15061989\",\n\t\t\"15031980\",\n\t\t\"14091979\",\n\t\t\"14081993\",\n\t\t\"14041981\",\n\t\t\"14021980\",\n\t\t\"14011980\",\n\t\t\"13121979\",\n\t\t\"13101994\",\n\t\t\"13081992\",\n\t\t\"13071986\",\n\t\t\"13031984\",\n\t\t\"13011976\",\n\t\t\"12241224\",\n\t\t\"12121992\",\n\t\t\"12081991\",\n\t\t\"12071994\",\n\t\t\"12071986\",\n\t\t\"12071976\",\n\t\t\"12061991\",\n\t\t\"12041976\",\n\t\t\"12021992\",\n\t\t\"11122233\",\n\t\t\"11021980\",\n\t\t\"11011981\",\n\t\t\"11011977\",\n\t\t\"10121980\",\n\t\t\"10101979\",\n\t\t\"10061981\",\n\t\t\"09121990\",\n\t\t\"09121986\",\n\t\t\"09091980\",\n\t\t\"09011988\",\n\t\t\"09011984\",\n\t\t\"08121981\",\n\t\t\"08091992\",\n\t\t\"08071992\",\n\t\t\"08071979\",\n\t\t\"08061981\",\n\t\t\"08011984\",\n\t\t\"07111989\",\n\t\t\"07081991\",\n\t\t\"07081988\",\n\t\t\"07081978\",\n\t\t\"07061982\",\n\t\t\"07051993\",\n\t\t\"07051981\",\n\t\t\"07031987\",\n\t\t\"07011992\",\n\t\t\"07011983\",\n\t\t\"06121983\",\n\t\t\"06101988\",\n\t\t\"06101982\",\n\t\t\"06051992\",\n\t\t\"06041980\",\n\t\t\"06031990\",\n\t\t\"06021982\",\n\t\t\"06011985\",\n\t\t\"05121991\",\n\t\t\"05091986\",\n\t\t\"05051975\",\n\t\t\"05041992\",\n\t\t\"05041982\",\n\t\t\"05041981\",\n\t\t\"04111982\",\n\t\t\"04071977\",\n\t\t\"04061981\",\n\t\t\"04051991\",\n\t\t\"04051981\",\n\t\t\"04041993\",\n\t\t\"04041981\",\n\t\t\"04041979\",\n\t\t\"04021992\",\n\t\t\"04011992\",\n\t\t\"04011991\",\n\t\t\"04011985\",\n\t\t\"04011980\",\n\t\t\"03121983\",\n\t\t\"03121982\",\n\t\t\"03111989\",\n\t\t\"03101981\",\n\t\t\"03091985\",\n\t\t\"03091980\",\n\t\t\"03061979\",\n\t\t\"02111984\",\n\t\t\"02111983\",\n\t\t\"02111982\",\n\t\t\"02011992\",\n\t\t\"02011970\",\n\t\t\"01121975\",\n\t\t\"01111991\",\n\t\t\"01111982\",\n\t\t\"01101983\",\n\t\t\"01091991\",\n\t\t\"01081981\",\n\t\t\"01081975\",\n\t\t\"01061981\",\n\t\t\"01051991\",\n\t\t\"01031994\",\n\t\t\"01011958\",\n\t\t\"watching\",\n\t\t\"tryagain\",\n\t\t\"theclash\",\n\t\t\"terrence\",\n\t\t\"terrance\",\n\t\t\"stefania\",\n\t\t\"southside\",\n\t\t\"solnishko\",\n\t\t\"smokedog\",\n\t\t\"sk8ordie\",\n\t\t\"shitfuck\",\n\t\t\"Russian7\",\n\t\t\"rsalinas\",\n\t\t\"roserose\",\n\t\t\"rootedit\",\n\t\t\"reindeer\",\n\t\t\"regional\",\n\t\t\"rebbyt34\",\n\t\t\"r4e3w2q1\",\n\t\t\"qqqqqqqqqq\",\n\t\t\"qazwsxedc1\",\n\t\t\"premiere\",\n\t\t\"optiplex\",\n\t\t\"nokia5230\",\n\t\t\"nickolas\",\n\t\t\"mystical\",\n\t\t\"monkeyma\",\n\t\t\"momsanaladventure\",\n\t\t\"MICHELLE\",\n\t\t\"maryanne\",\n\t\t\"marketing\",\n\t\t\"marketin\",\n\t\t\"marishka\",\n\t\t\"mackenzi\",\n\t\t\"laracroft\",\n\t\t\"lagwagon\",\n\t\t\"kevin123\",\n\t\t\"Jessica1\",\n\t\t\"ironhors\",\n\t\t\"information\",\n\t\t\"hotbabes\",\n\t\t\"hornyguy\",\n\t\t\"homeless\",\n\t\t\"hogwarts\",\n\t\t\"hernande\",\n\t\t\"headless\",\n\t\t\"Hd764nW5d7E1vb1\",\n\t\t\"hamburger\",\n\t\t\"grandpri\",\n\t\t\"goodfell\",\n\t\t\"golfclub\",\n\t\t\"gobigred\",\n\t\t\"fuckedup\",\n\t\t\"everquest\",\n\t\t\"evergree\",\n\t\t\"ericeric\",\n\t\t\"envision\",\n\t\t\"eightbal\",\n\t\t\"doggydog\",\n\t\t\"dhjnvytyjub\",\n\t\t\"detroit1\",\n\t\t\"database\",\n\t\t\"dangerou\",\n\t\t\"computers\",\n\t\t\"citibank\",\n\t\t\"choppers\",\n\t\t\"cannonda\",\n\t\t\"callofduty\",\n\t\t\"bullwink\",\n\t\t\"brunette\",\n\t\t\"bravehea\",\n\t\t\"bookcase\",\n\t\t\"blackcock\",\n\t\t\"beepbeep\",\n\t\t\"bassbass\",\n\t\t\"armstrong\",\n\t\t\"antigone\",\n\t\t\"abstract\",\n\t\t\"987654321q\",\n\t\t\"369852147\",\n\t\t\"31081994\",\n\t\t\"31071981\",\n\t\t\"31051984\",\n\t\t\"31031981\",\n\t\t\"30111984\",\n\t\t\"30101989\",\n\t\t\"30081991\",\n\t\t\"30011976\",\n\t\t\"29121993\",\n\t\t\"29111980\",\n\t\t\"29101993\",\n\t\t\"29061992\",\n\t\t\"29051982\",\n\t\t\"29051980\",\n\t\t\"29041991\",\n\t\t\"29031995\",\n\t\t\"28101987\",\n\t\t\"28061992\",\n\t\t\"28021993\",\n\t\t\"27121987\",\n\t\t\"27121984\",\n\t\t\"27101993\",\n\t\t\"27081983\",\n\t\t\"27061992\",\n\t\t\"27061986\",\n\t\t\"27051982\",\n\t\t\"27041982\",\n\t\t\"27021983\",\n\t\t\"26111979\",\n\t\t\"26091980\",\n\t\t\"26071993\",\n\t\t\"26061988\",\n\t\t\"26061984\",\n\t\t\"26051982\",\n\t\t\"26031981\",\n\t\t\"25111979\",\n\t\t\"25101992\",\n\t\t\"25101984\",\n\t\t\"25041982\",\n\t\t\"25041981\",\n\t\t\"25041977\",\n\t\t\"25021993\",\n\t\t\"25021982\",\n\t\t\"25011992\",\n\t\t\"24121983\",\n\t\t\"24111980\",\n\t\t\"24111979\",\n\t\t\"24091979\",\n\t\t\"24041982\",\n\t\t\"24021981\",\n\t\t\"24011979\",\n\t\t\"23121992\",\n\t\t\"23081982\",\n\t\t\"23071987\",\n\t\t\"23041981\",\n\t\t\"23031993\",\n\t\t\"23031978\",\n\t\t\"22111978\",\n\t\t\"22071993\",\n\t\t\"22061980\",\n\t\t\"22031994\",\n\t\t\"22031988\",\n\t\t\"21111991\",\n\t\t\"21101978\",\n\t\t\"21031994\",\n\t\t\"20121983\",\n\t\t\"20101981\",\n\t\t\"20091995\",\n\t\t\"20091992\",\n\t\t\"20081992\",\n\t\t\"20041993\",\n\t\t\"20031976\",\n\t\t\"20021994\",\n\t\t\"19531953\",\n\t\t\"19121994\",\n\t\t\"19121993\",\n\t\t\"19121991\",\n\t\t\"19101977\",\n\t\t\"19081989\",\n\t\t\"19051991\",\n\t\t\"19041991\",\n\t\t\"19031993\",\n\t\t\"19031992\",\n\t\t\"19031988\",\n\t\t\"19031984\",\n\t\t\"19021989\",\n\t\t\"18121991\",\n\t\t\"18101979\",\n\t\t\"18091992\",\n\t\t\"18081980\",\n\t\t\"18011982\",\n\t\t\"17171717aa\",\n\t\t\"17111990\",\n\t\t\"17111983\",\n\t\t\"17081994\",\n\t\t\"16121977\",\n\t\t\"16111993\",\n\t\t\"16111980\",\n\t\t\"16061982\",\n\t\t\"16051996\",\n\t\t\"16031984\",\n\t\t\"15121991\",\n\t\t\"15091984\",\n\t\t\"15081979\",\n\t\t\"15081978\",\n\t\t\"15071993\",\n\t\t\"15051979\",\n\t\t\"15051978\",\n\t\t\"15041978\",\n\t\t\"15031981\",\n\t\t\"147896321\",\n\t\t\"14101981\",\n\t\t\"14071981\",\n\t\t\"14061995\",\n\t\t\"14051989\",\n\t\t\"14041983\",\n\t\t\"14031972\",\n\t\t\"14021979\",\n\t\t\"14021978\",\n\t\t\"13111981\",\n\t\t\"13091991\",\n\t\t\"13031993\",\n\t\t\"13031982\",\n\t\t\"13021983\",\n\t\t\"12s3t4p55\",\n\t\t\"123qweas\",\n\t\t\"12121979\",\n\t\t\"12111979\",\n\t\t\"12081980\",\n\t\t\"12071979\",\n\t\t\"12061983\",\n\t\t\"12021979\",\n\t\t\"12011994\",\n\t\t\"11121979\",\n\t\t\"11121978\",\n\t\t\"11071992\",\n\t\t\"11071982\",\n\t\t\"11071979\",\n\t\t\"11061990\",\n\t\t\"11061979\",\n\t\t\"11051977\",\n\t\t\"11021986\",\n\t\t\"11021979\",\n\t\t\"11011978\",\n\t\t\"10111980\",\n\t\t\"10091990\",\n\t\t\"10091987\",\n\t\t\"10091982\",\n\t\t\"10081979\",\n\t\t\"10071977\",\n\t\t\"10061982\",\n\t\t\"10051991\",\n\t\t\"10041988\",\n\t\t\"09121984\",\n\t\t\"09111986\",\n\t\t\"09111984\",\n\t\t\"09101979\",\n\t\t\"09091981\",\n\t\t\"09061992\",\n\t\t\"09061982\",\n\t\t\"09031983\",\n\t\t\"09021992\",\n\t\t\"09021979\",\n\t\t\"09011986\",\n\t\t\"08101990\",\n\t\t\"08101983\",\n\t\t\"08091991\",\n\t\t\"08091990\",\n\t\t\"08081987\",\n\t\t\"08031978\",\n\t\t\"08011991\",\n\t\t\"07121977\",\n\t\t\"07111992\",\n\t\t\"07071991\",\n\t\t\"07061987\",\n\t\t\"07051991\",\n\t\t\"07031990\",\n\t\t\"07021982\",\n\t\t\"07021981\",\n\t\t\"07011981\",\n\t\t\"06091983\",\n\t\t\"06091982\",\n\t\t\"06081982\",\n\t\t\"06081981\",\n\t\t\"06071976\",\n\t\t\"06061978\",\n\t\t\"06031993\",\n\t\t\"06031981\",\n\t\t\"06021980\",\n\t\t\"06021979\",\n\t\t\"05121979\",\n\t\t\"05111988\",\n\t\t\"05111987\",\n\t\t\"05101981\",\n\t\t\"05081984\",\n\t\t\"05031993\",\n\t\t\"05031980\",\n\t\t\"05011986\",\n\t\t\"04121983\",\n\t\t\"04041994\",\n\t\t\"04041980\",\n\t\t\"04031993\",\n\t\t\"04031992\",\n\t\t\"04031983\",\n\t\t\"04031980\",\n\t\t\"04021983\",\n\t\t\"03121989\",\n\t\t\"03111980\",\n\t\t\"03051983\",\n\t\t\"03021981\",\n\t\t\"02121991\",\n\t\t\"02111988\",\n\t\t\"02101991\",\n\t\t\"01121978\",\n\t\t\"01071994\",\n\t\t\"01021982\",\n\t\t\"01021981\",\n\t\t\"01021976\",\n\t\t\"01011964\",\n\t\t\"ZZ8807zpl\",\n\t\t\"youandme\",\n\t\t\"yfnfitymrf\",\n\t\t\"woodside\",\n\t\t\"volkodav\",\n\t\t\"vfnbkmlf\",\n\t\t\"triplets\",\n\t\t\"timothy1\",\n\t\t\"timelord\",\n\t\t\"thriller\",\n\t\t\"tenerife\",\n\t\t\"techniques\",\n\t\t\"takamine\",\n\t\t\"sweetass\",\n\t\t\"shotokan\",\n\t\t\"sexsexse\",\n\t\t\"SAMANTHA\",\n\t\t\"rushrush\",\n\t\t\"rocky123\",\n\t\t\"qwerty78\",\n\t\t\"pyramids\",\n\t\t\"prelude1\",\n\t\t\"potatoes\",\n\t\t\"pornpass\",\n\t\t\"phaedrus\",\n\t\t\"peternorth\",\n\t\t\"patrizia\",\n\t\t\"password11\",\n\t\t\"passwerd\",\n\t\t\"panorama\",\n\t\t\"nokia5130\",\n\t\t\"nemesis1\",\n\t\t\"natascha\",\n\t\t\"music123\",\n\t\t\"muffdive\",\n\t\t\"motorcyc\",\n\t\t\"misiaczek\",\n\t\t\"MERCEDES\",\n\t\t\"maximilian\",\n\t\t\"marriott\",\n\t\t\"madonna1\",\n\t\t\"macintosh\",\n\t\t\"kristen1\",\n\t\t\"killzone\",\n\t\t\"jakester\",\n\t\t\"insertions\",\n\t\t\"insertion\",\n\t\t\"impalass\",\n\t\t\"ijrjkflrf\",\n\t\t\"helpless\",\n\t\t\"hardwork\",\n\t\t\"gulliver\",\n\t\t\"grapeape\",\n\t\t\"goodwill\",\n\t\t\"ginscoot\",\n\t\t\"ghjnjnbg\",\n\t\t\"genocide\",\n\t\t\"fynjybyf\",\n\t\t\"flashman\",\n\t\t\"feetfeet\",\n\t\t\"facefuck\",\n\t\t\"evanescence\",\n\t\t\"ethernet\",\n\t\t\"elvis123\",\n\t\t\"dragon11\",\n\t\t\"domestic\",\n\t\t\"coolgirl\",\n\t\t\"cocktail\",\n\t\t\"chauncey\",\n\t\t\"cezer121\",\n\t\t\"caterina\",\n\t\t\"carlotta\",\n\t\t\"callahan\",\n\t\t\"bruno123\",\n\t\t\"bobmarle\",\n\t\t\"bloopers\",\n\t\t\"blackcoc\",\n\t\t\"baywatch\",\n\t\t\"asdfjkl;\",\n\t\t\"archangel\",\n\t\t\"anthony2\",\n\t\t\"8PHroWZ622\",\n\t\t\"78963214\",\n\t\t\"69213124\",\n\t\t\"67camaro\",\n\t\t\"50505050\",\n\t\t\"4rfv3edc\",\n\t\t\"31101992\",\n\t\t\"31081992\",\n\t\t\"31081991\",\n\t\t\"31071992\",\n\t\t\"31071978\",\n\t\t\"31011978\",\n\t\t\"30121989\",\n\t\t\"30121982\",\n\t\t\"30111993\",\n\t\t\"30091991\",\n\t\t\"30091990\",\n\t\t\"30081980\",\n\t\t\"30071980\",\n\t\t\"30051990\",\n\t\t\"30031982\",\n\t\t\"30011981\",\n\t\t\"29111991\",\n\t\t\"29091994\",\n\t\t\"29091979\",\n\t\t\"29081992\",\n\t\t\"29081984\",\n\t\t\"29081979\",\n\t\t\"29071984\",\n\t\t\"29051976\",\n\t\t\"28101990\",\n\t\t\"28101984\",\n\t\t\"28101981\",\n\t\t\"28091979\",\n\t\t\"28081992\",\n\t\t\"28081987\",\n\t\t\"28041984\",\n\t\t\"28021994\",\n\t\t\"27121980\",\n\t\t\"27101984\",\n\t\t\"27101982\",\n\t\t\"27101980\",\n\t\t\"27091981\",\n\t\t\"27091980\",\n\t\t\"27061991\",\n\t\t\"27061987\",\n\t\t\"27041992\",\n\t\t\"27041981\",\n\t\t\"27021993\",\n\t\t\"27021989\",\n\t\t\"27021981\",\n\t\t\"26101979\",\n\t\t\"26081991\",\n\t\t\"26061977\",\n\t\t\"26021993\",\n\t\t\"25051975\",\n\t\t\"24111978\",\n\t\t\"24071985\",\n\t\t\"24061983\",\n\t\t\"24051983\",\n\t\t\"24041978\",\n\t\t\"24021982\",\n\t\t\"24011994\",\n\t\t\"23121993\",\n\t\t\"23121981\",\n\t\t\"23101989\",\n\t\t\"23101983\",\n\t\t\"23071980\",\n\t\t\"23061981\",\n\t\t\"23021980\",\n\t\t\"22121980\",\n\t\t\"22111984\",\n\t\t\"22101986\",\n\t\t\"22081984\",\n\t\t\"22061983\",\n\t\t\"22051979\",\n\t\t\"22021983\",\n\t\t\"22011980\",\n\t\t\"21121993\",\n\t\t\"21091981\",\n\t\t\"21071991\",\n\t\t\"21071981\",\n\t\t\"21071980\",\n\t\t\"21061979\",\n\t\t\"21041982\",\n\t\t\"21041980\",\n\t\t\"21021981\",\n\t\t\"20111993\",\n\t\t\"20111980\",\n\t\t\"20101979\",\n\t\t\"20091981\",\n\t\t\"20091979\",\n\t\t\"20081998\",\n\t\t\"20071979\",\n\t\t\"20051982\",\n\t\t\"20021978\",\n\t\t\"1hxboqg2\",\n\t\t\"19111983\",\n\t\t\"19071987\",\n\t\t\"18121981\",\n\t\t\"18111980\",\n\t\t\"18071985\",\n\t\t\"18061978\",\n\t\t\"18031987\",\n\t\t\"17111994\",\n\t\t\"17101984\",\n\t\t\"17081979\",\n\t\t\"17071981\",\n\t\t\"17061980\",\n\t\t\"17041978\",\n\t\t\"17031981\",\n\t\t\"16121984\",\n\t\t\"16121978\",\n\t\t\"16091993\",\n\t\t\"16081982\",\n\t\t\"16071990\",\n\t\t\"16071976\",\n\t\t\"16051992\",\n\t\t\"16021978\",\n\t\t\"15111994\",\n\t\t\"15091979\",\n\t\t\"15081974\",\n\t\t\"15061975\",\n\t\t\"15021992\",\n\t\t\"14531453\",\n\t\t\"14121982\",\n\t\t\"14101982\",\n\t\t\"14091992\",\n\t\t\"14081995\",\n\t\t\"14071994\",\n\t\t\"14071991\",\n\t\t\"14071982\",\n\t\t\"14061992\",\n\t\t\"14061978\",\n\t\t\"14041990\",\n\t\t\"14041977\",\n\t\t\"13091994\",\n\t\t\"13091981\",\n\t\t\"13081989\",\n\t\t\"13071981\",\n\t\t\"13031979\",\n\t\t\"13021980\",\n\t\t\"13011980\",\n\t\t\"123masha\",\n\t\t\"123hfjdk147\",\n\t\t\"123456789k\",\n\t\t\"123456789012\",\n\t\t\"12111989\",\n\t\t\"12101991\",\n\t\t\"12091994\",\n\t\t\"12061993\",\n\t\t\"12011978\",\n\t\t\"11121993\",\n\t\t\"11101992\",\n\t\t\"11051993\",\n\t\t\"11041977\",\n\t\t\"11011994\",\n\t\t\"11011984\",\n\t\t\"11011983\",\n\t\t\"10111992\",\n\t\t\"10101968\",\n\t\t\"10081994\",\n\t\t\"10021980\",\n\t\t\"09121988\",\n\t\t\"09101987\",\n\t\t\"09061993\",\n\t\t\"09061985\",\n\t\t\"09051992\",\n\t\t\"09051982\",\n\t\t\"09051980\",\n\t\t\"09041993\",\n\t\t\"09031984\",\n\t\t\"08101993\",\n\t\t\"08101991\",\n\t\t\"08071981\",\n\t\t\"08061993\",\n\t\t\"08061980\",\n\t\t\"08051978\",\n\t\t\"08041991\",\n\t\t\"08021981\",\n\t\t\"08011993\",\n\t\t\"07071981\",\n\t\t\"07051979\",\n\t\t\"07041993\",\n\t\t\"07041991\",\n\t\t\"07031980\",\n\t\t\"07011984\",\n\t\t\"06121993\",\n\t\t\"06101984\",\n\t\t\"06051981\",\n\t\t\"06051976\",\n\t\t\"06041983\",\n\t\t\"05121987\",\n\t\t\"05071992\",\n\t\t\"05061992\",\n\t\t\"05021979\",\n\t\t\"04051992\",\n\t\t\"03111982\",\n\t\t\"03101987\",\n\t\t\"03071988\",\n\t\t\"03041979\",\n\t\t\"03041977\",\n\t\t\"03031980\",\n\t\t\"03021983\",\n\t\t\"02111991\",\n\t\t\"02021996\",\n\t\t\"02021995\",\n\t\t\"02011991\",\n\t\t\"01230123\",\n\t\t\"01121983\",\n\t\t\"01101993\",\n\t\t\"01061994\",\n\t\t\"01061980\",\n\t\t\"01031979\",\n\t\t\"zxcvvcxz\",\n\t\t\"yesterda\",\n\t\t\"windows1\",\n\t\t\"volkswagen\",\n\t\t\"vaseline\",\n\t\t\"uhbujhbq\",\n\t\t\"tomservo\",\n\t\t\"Thunder1\",\n\t\t\"thesaint\",\n\t\t\"ssssssssss\",\n\t\t\"splatter\",\n\t\t\"sonyvaio\",\n\t\t\"soccer13\",\n\t\t\"snowman1\",\n\t\t\"snoopdogg\",\n\t\t\"snakeman\",\n\t\t\"saunders\",\n\t\t\"russell1\",\n\t\t\"robinhood\",\n\t\t\"polaroid\",\n\t\t\"pokemon123\",\n\t\t\"p455w0rd\",\n\t\t\"openopen\",\n\t\t\"open1234\",\n\t\t\"novifarm\",\n\t\t\"newpass1\",\n\t\t\"mysecret\",\n\t\t\"montecarlo\",\n\t\t\"momomomo\",\n\t\t\"milhouse\",\n\t\t\"mayfield\",\n\t\t\"luv2epus\",\n\t\t\"loveyou2\",\n\t\t\"lexingky\",\n\t\t\"lemmings\",\n\t\t\"kennwort\",\n\t\t\"jason123\",\n\t\t\"iloveporn\",\n\t\t\"hotchick\",\n\t\t\"homer123\",\n\t\t\"hilfiger\",\n\t\t\"hennessy\",\n\t\t\"heather2\",\n\t\t\"hawkwind\",\n\t\t\"happydog\",\n\t\t\"gregory1\",\n\t\t\"greatsex\",\n\t\t\"gotigers\",\n\t\t\"gooseman\",\n\t\t\"giveitup\",\n\t\t\"ganjaman\",\n\t\t\"fred1234\",\n\t\t\"francesca\",\n\t\t\"fordf250\",\n\t\t\"federica\",\n\t\t\"eleven11\",\n\t\t\"dropdead\",\n\t\t\"doggystyle\",\n\t\t\"devilmaycry\",\n\t\t\"destroyer\",\n\t\t\"deborah1\",\n\t\t\"davidoff\",\n\t\t\"darthvader\",\n\t\t\"dadadada\",\n\t\t\"Corvette\",\n\t\t\"contains\",\n\t\t\"colossus\",\n\t\t\"claudine\",\n\t\t\"cheyanne\",\n\t\t\"catholic\",\n\t\t\"catdaddy\",\n\t\t\"cambridge\",\n\t\t\"buttbutt\",\n\t\t\"boogaloo\",\n\t\t\"bernhard\",\n\t\t\"barbara1\",\n\t\t\"assclown\",\n\t\t\"aquarium\",\n\t\t\"angeline\",\n\t\t\"adventur\",\n\t\t\"5tgb6yhn\",\n\t\t\"5hsU75kpoT\",\n\t\t\"34523452\",\n\t\t\"3216732167\",\n\t\t\"31121989\",\n\t\t\"31031992\",\n\t\t\"31031978\",\n\t\t\"31011980\",\n\t\t\"30121992\",\n\t\t\"30101992\",\n\t\t\"30101980\",\n\t\t\"30041981\",\n\t\t\"30031990\",\n\t\t\"30031981\",\n\t\t\"30031976\",\n\t\t\"30011984\",\n\t\t\"29111990\",\n\t\t\"29111977\",\n\t\t\"29061993\",\n\t\t\"29051983\",\n\t\t\"28121992\",\n\t\t\"28111980\",\n\t\t\"28071992\",\n\t\t\"28041985\",\n\t\t\"28031992\",\n\t\t\"28021995\",\n\t\t\"28021975\",\n\t\t\"28011993\",\n\t\t\"28011977\",\n\t\t\"28011974\",\n\t\t\"27121983\",\n\t\t\"27101977\",\n\t\t\"27091986\",\n\t\t\"27081979\",\n\t\t\"27071993\",\n\t\t\"27071981\",\n\t\t\"27061982\",\n\t\t\"27041994\",\n\t\t\"26071980\",\n\t\t\"26041982\",\n\t\t\"26041978\",\n\t\t\"25121993\",\n\t\t\"25101982\",\n\t\t\"25081992\",\n\t\t\"25081990\",\n\t\t\"25061993\",\n\t\t\"25061982\",\n\t\t\"25041993\",\n\t\t\"25011978\",\n\t\t\"24111986\",\n\t\t\"24101982\",\n\t\t\"24091992\",\n\t\t\"24091976\",\n\t\t\"24081983\",\n\t\t\"24071978\",\n\t\t\"24051982\",\n\t\t\"24031994\",\n\t\t\"24021978\",\n\t\t\"23061994\",\n\t\t\"23041980\",\n\t\t\"23031994\",\n\t\t\"22091992\",\n\t\t\"22051993\",\n\t\t\"22041980\",\n\t\t\"22031979\",\n\t\t\"22021978\",\n\t\t\"21091977\",\n\t\t\"21081984\",\n\t\t\"21081976\",\n\t\t\"21051992\",\n\t\t\"21031977\",\n\t\t\"21021980\",\n\t\t\"21011980\",\n\t\t\"20121991\",\n\t\t\"20121979\",\n\t\t\"20111992\",\n\t\t\"20111983\",\n\t\t\"20081980\",\n\t\t\"20041982\",\n\t\t\"20031982\",\n\t\t\"20031979\",\n\t\t\"19191919\",\n\t\t\"19111993\",\n\t\t\"19111991\",\n\t\t\"19101994\",\n\t\t\"19071977\",\n\t\t\"19061981\",\n\t\t\"19051978\",\n\t\t\"19041984\",\n\t\t\"19031981\",\n\t\t\"19021981\",\n\t\t\"19011992\",\n\t\t\"19011983\",\n\t\t\"18121982\",\n\t\t\"18081984\",\n\t\t\"18071984\",\n\t\t\"18071982\",\n\t\t\"18061979\",\n\t\t\"18051995\",\n\t\t\"18041981\",\n\t\t\"18041979\",\n\t\t\"18031990\",\n\t\t\"18021994\",\n\t\t\"18021983\",\n\t\t\"17121982\",\n\t\t\"17101981\",\n\t\t\"17091993\",\n\t\t\"17061981\",\n\t\t\"17041993\",\n\t\t\"17021994\",\n\t\t\"17011995\",\n\t\t\"17011993\",\n\t\t\"16121980\",\n\t\t\"16121976\",\n\t\t\"16091994\",\n\t\t\"16091981\",\n\t\t\"16081994\",\n\t\t\"16061993\",\n\t\t\"16051982\",\n\t\t\"16051978\",\n\t\t\"16021992\",\n\t\t\"15121981\",\n\t\t\"15101993\",\n\t\t\"15061981\",\n\t\t\"15051984\",\n\t\t\"15031978\",\n\t\t\"15031976\",\n\t\t\"14101979\",\n\t\t\"14091993\",\n\t\t\"14081981\",\n\t\t\"14071992\",\n\t\t\"14061979\",\n\t\t\"13081994\",\n\t\t\"13051984\",\n\t\t\"13041980\",\n\t\t\"13011979\",\n\t\t\"123456abc\",\n\t\t\"12121993\",\n\t\t\"12121978\",\n\t\t\"12111992\",\n\t\t\"12101992\",\n\t\t\"12061982\",\n\t\t\"12061978\",\n\t\t\"12051995\",\n\t\t\"12041975\",\n\t\t\"12031980\",\n\t\t\"12031978\",\n\t\t\"12011983\",\n\t\t\"12011976\",\n\t\t\"11121988\",\n\t\t\"11111981\",\n\t\t\"11071978\",\n\t\t\"11061978\",\n\t\t\"11051994\",\n\t\t\"11051981\",\n\t\t\"11041994\",\n\t\t\"11041979\",\n\t\t\"11031981\",\n\t\t\"10121983\",\n\t\t\"10111984\",\n\t\t\"10081978\",\n\t\t\"10071992\",\n\t\t\"10071979\",\n\t\t\"10051979\",\n\t\t\"10041980\",\n\t\t\"10031975\",\n\t\t\"100200300\",\n\t\t\"10011994\",\n\t\t\"09121976\",\n\t\t\"09111990\",\n\t\t\"09101981\",\n\t\t\"09081991\",\n\t\t\"09081978\",\n\t\t\"09041980\",\n\t\t\"09041975\",\n\t\t\"09011982\",\n\t\t\"085tzzqi\",\n\t\t\"08121992\",\n\t\t\"08111980\",\n\t\t\"08091979\",\n\t\t\"08081974\",\n\t\t\"08021993\",\n\t\t\"07111981\",\n\t\t\"07091980\",\n\t\t\"07071979\",\n\t\t\"07061989\",\n\t\t\"07061977\",\n\t\t\"07051983\",\n\t\t\"07041978\",\n\t\t\"07021978\",\n\t\t\"07011990\",\n\t\t\"063dyjuy\",\n\t\t\"06111988\",\n\t\t\"06081978\",\n\t\t\"06051982\",\n\t\t\"06031995\",\n\t\t\"06021990\",\n\t\t\"06011992\",\n\t\t\"06011976\",\n\t\t\"05091989\",\n\t\t\"05091983\",\n\t\t\"05081982\",\n\t\t\"05071979\",\n\t\t\"05061993\",\n\t\t\"05051994\",\n\t\t\"05031982\",\n\t\t\"05011980\",\n\t\t\"04101987\",\n\t\t\"04081990\",\n\t\t\"04071979\",\n\t\t\"04061976\",\n\t\t\"04041977\",\n\t\t\"04031986\",\n\t\t\"04021989\",\n\t\t\"04011982\",\n\t\t\"03121979\",\n\t\t\"03111985\",\n\t\t\"03101992\",\n\t\t\"03081986\",\n\t\t\"02121987\",\n\t\t\"02121984\",\n\t\t\"02071992\",\n\t\t\"01478520\",\n\t\t\"01101978\",\n\t\t\"01071979\",\n\t\t\"01051982\",\n\t\t\"01051981\",\n\t\t\"01021993\",\n\t\t\"0102030405\",\n\t\t\"yamahar6\",\n\t\t\"waterpolo\",\n\t\t\"vladvlad\",\n\t\t\"valentino\",\n\t\t\"ultraman\",\n\t\t\"topsecre\",\n\t\t\"thelast1\",\n\t\t\"tanechka\",\n\t\t\"supernatural\",\n\t\t\"summertime\",\n\t\t\"salvator\",\n\t\t\"saab9000\",\n\t\t\"romaroma\",\n\t\t\"romanova\",\n\t\t\"rickster\",\n\t\t\"raindrop\",\n\t\t\"qwerty77\",\n\t\t\"qazwsxedcrfvtgb\",\n\t\t\"princeto\",\n\t\t\"pegasus1\",\n\t\t\"opensesame\",\n\t\t\"newhouse\",\n\t\t\"nbuhtyjr\",\n\t\t\"minnesota\",\n\t\t\"mattingl\",\n\t\t\"mandolin\",\n\t\t\"maddison\",\n\t\t\"lotus123\",\n\t\t\"Liverpoo\",\n\t\t\"lincoln1\",\n\t\t\"letsplay\",\n\t\t\"lebron23\",\n\t\t\"julieann\",\n\t\t\"ironman1\",\n\t\t\"guesswho\",\n\t\t\"gfhjkm12\",\n\t\t\"getsdown\",\n\t\t\"georgia1\",\n\t\t\"gbgbcmrf\",\n\t\t\"foxhound\",\n\t\t\"flipmode\",\n\t\t\"fireman1\",\n\t\t\"fastcars\",\n\t\t\"falstaff\",\n\t\t\"evergreen\",\n\t\t\"dutchman\",\n\t\t\"duckhunt\",\n\t\t\"distance\",\n\t\t\"deathrow\",\n\t\t\"daffodil\",\n\t\t\"cvbhyjdf\",\n\t\t\"cumeater\",\n\t\t\"crocodil\",\n\t\t\"creatine\",\n\t\t\"christel\",\n\t\t\"chastity\",\n\t\t\"cbr600rr\",\n\t\t\"calcutta\",\n\t\t\"buratino\",\n\t\t\"buffalos\",\n\t\t\"bradshaw\",\n\t\t\"bluedevi\",\n\t\t\"blackboy\",\n\t\t\"blackass\",\n\t\t\"bignasty\",\n\t\t\"beaumont\",\n\t\t\"badkarma\",\n\t\t\"astalavista\",\n\t\t\"anteater\",\n\t\t\"amoremio\",\n\t\t\"allright\",\n\t\t\"alligator\",\n\t\t\"8PHroWZ624\",\n\t\t\"74185296\",\n\t\t\"44magnum\",\n\t\t\"32165498\",\n\t\t\"31101975\",\n\t\t\"31071993\",\n\t\t\"31071976\",\n\t\t\"31011991\",\n\t\t\"31011984\",\n\t\t\"31011976\",\n\t\t\"30121980\",\n\t\t\"30111991\",\n\t\t\"30091979\",\n\t\t\"30091978\",\n\t\t\"30071984\",\n\t\t\"30071981\",\n\t\t\"30041978\",\n\t\t\"29111981\",\n\t\t\"29061980\",\n\t\t\"29051981\",\n\t\t\"28091983\",\n\t\t\"28071976\",\n\t\t\"28061993\",\n\t\t\"28061987\",\n\t\t\"28051979\",\n\t\t\"28041975\",\n\t\t\"28011980\",\n\t\t\"27121977\",\n\t\t\"27081993\",\n\t\t\"27071979\",\n\t\t\"27071977\",\n\t\t\"27061981\",\n\t\t\"27031982\",\n\t\t\"27031981\",\n\t\t\"27011991\",\n\t\t\"26262626\",\n\t\t\"26121995\",\n\t\t\"26121992\",\n\t\t\"26081984\",\n\t\t\"26071994\",\n\t\t\"26051991\",\n\t\t\"26031993\",\n\t\t\"26011995\",\n\t\t\"258258258\",\n\t\t\"25111983\",\n\t\t\"25091978\",\n\t\t\"25091976\",\n\t\t\"25081979\",\n\t\t\"25071982\",\n\t\t\"25051976\",\n\t\t\"24121979\",\n\t\t\"24071979\",\n\t\t\"24061982\",\n\t\t\"24041979\",\n\t\t\"24011993\",\n\t\t\"24011978\",\n\t\t\"23111981\",\n\t\t\"23111979\",\n\t\t\"23091993\",\n\t\t\"23071977\",\n\t\t\"23031981\",\n\t\t\"23021979\",\n\t\t\"22121991\",\n\t\t\"22111975\",\n\t\t\"22091978\",\n\t\t\"22081980\",\n\t\t\"22061993\",\n\t\t\"22061977\",\n\t\t\"22031992\",\n\t\t\"22021977\",\n\t\t\"21121979\",\n\t\t\"21081983\",\n\t\t\"21071979\",\n\t\t\"21061982\",\n\t\t\"21031982\",\n\t\t\"21021982\",\n\t\t\"21021976\",\n\t\t\"20121976\",\n\t\t\"20111988\",\n\t\t\"20111978\",\n\t\t\"20111974\",\n\t\t\"20101978\",\n\t\t\"20051994\",\n\t\t\"1Letmein\",\n\t\t\"19111992\",\n\t\t\"19091989\",\n\t\t\"19051974\",\n\t\t\"19031991\",\n\t\t\"19011984\",\n\t\t\"19011976\",\n\t\t\"18051994\",\n\t\t\"18051983\",\n\t\t\"18041993\",\n\t\t\"18031992\",\n\t\t\"18021978\",\n\t\t\"17101983\",\n\t\t\"17081981\",\n\t\t\"17051980\",\n\t\t\"17031978\",\n\t\t\"17011979\",\n\t\t\"16121994\",\n\t\t\"16111991\",\n\t\t\"16091983\",\n\t\t\"16081993\",\n\t\t\"16081981\",\n\t\t\"16081978\",\n\t\t\"16051983\",\n\t\t\"16011993\",\n\t\t\"15121980\",\n\t\t\"15101977\",\n\t\t\"15021982\",\n\t\t\"15011978\",\n\t\t\"14321432\",\n\t\t\"14121994\",\n\t\t\"14091985\",\n\t\t\"14081979\",\n\t\t\"14071993\",\n\t\t\"14031983\",\n\t\t\"14031981\",\n\t\t\"14011993\",\n\t\t\"13791379\",\n\t\t\"1357913579\",\n\t\t\"13121992\",\n\t\t\"13121981\",\n\t\t\"13101981\",\n\t\t\"13101980\",\n\t\t\"13051978\",\n\t\t\"13041982\",\n\t\t\"13041979\",\n\t\t\"13041978\",\n\t\t\"13021982\",\n\t\t\"123qwe456\",\n\t\t\"123456asd\",\n\t\t\"123456ab\",\n\t\t\"12345432\",\n\t\t\"12121975\",\n\t\t\"12101980\",\n\t\t\"12081982\",\n\t\t\"12061995\",\n\t\t\"12051994\",\n\t\t\"12041981\",\n\t\t\"12041979\",\n\t\t\"12031995\",\n\t\t\"12011982\",\n\t\t\"11091981\",\n\t\t\"11081981\",\n\t\t\"11071981\",\n\t\t\"10061993\",\n\t\t\"10061979\",\n\t\t\"10031979\",\n\t\t\"10011981\",\n\t\t\"09071975\",\n\t\t\"09051979\",\n\t\t\"09041983\",\n\t\t\"09031993\",\n\t\t\"09021983\",\n\t\t\"09011983\",\n\t\t\"08121990\",\n\t\t\"08081980\",\n\t\t\"08051991\",\n\t\t\"08041987\",\n\t\t\"08031976\",\n\t\t\"08021982\",\n\t\t\"08011992\",\n\t\t\"08011985\",\n\t\t\"07121981\",\n\t\t\"07111990\",\n\t\t\"07111988\",\n\t\t\"07091994\",\n\t\t\"07091977\",\n\t\t\"07081975\",\n\t\t\"07061983\",\n\t\t\"07031981\",\n\t\t\"06051980\",\n\t\t\"06041993\",\n\t\t\"06011995\",\n\t\t\"06011994\",\n\t\t\"06011983\",\n\t\t\"05121980\",\n\t\t\"05101993\",\n\t\t\"05101985\",\n\t\t\"05101979\",\n\t\t\"05081980\",\n\t\t\"05041977\",\n\t\t\"05021986\",\n\t\t\"04111984\",\n\t\t\"04091982\",\n\t\t\"04071994\",\n\t\t\"04061992\",\n\t\t\"04051976\",\n\t\t\"04051975\",\n\t\t\"04031981\",\n\t\t\"04031977\",\n\t\t\"04021980\",\n\t\t\"03121977\",\n\t\t\"03111983\",\n\t\t\"03101980\",\n\t\t\"03041993\",\n\t\t\"03041982\",\n\t\t\"03011980\",\n\t\t\"02091992\",\n\t\t\"02032009\",\n\t\t\"01121981\",\n\t\t\"01111981\",\n\t\t\"01101981\",\n\t\t\"01092011\",\n\t\t\"01081979\",\n\t\t\"01061977\",\n\t\t\"01051977\",\n\t\t\"01051976\",\n\t\t\"01051970\",\n\t\t\"01012005\",\n\t\t\"zxzxzxzx\",\n\t\t\"zolushka\",\n\t\t\"whoopass\",\n\t\t\"westlife\",\n\t\t\"wellhung\",\n\t\t\"wasdwasd\",\n\t\t\"warehous\",\n\t\t\"waffenss\",\n\t\t\"vineyard\",\n\t\t\"vicecity\",\n\t\t\"vfylfhby\",\n\t\t\"vergeten\",\n\t\t\"vegas123\",\n\t\t\"usmc0311\",\n\t\t\"ufhvjybz\",\n\t\t\"trucker1\",\n\t\t\"transfor\",\n\t\t\"tooltool\",\n\t\t\"thornton\",\n\t\t\"teamwork\",\n\t\t\"swallows\",\n\t\t\"summerti\",\n\t\t\"stewart1\",\n\t\t\"steve123\",\n\t\t\"stamford\",\n\t\t\"spartan117\",\n\t\t\"solidsnake\",\n\t\t\"sixtynin\",\n\t\t\"service1\",\n\t\t\"seraphim\",\n\t\t\"satellit\",\n\t\t\"sasasasa\",\n\t\t\"ronaldo7\",\n\t\t\"rerfhfxf\",\n\t\t\"rerehepf\",\n\t\t\"remington\",\n\t\t\"redshift\",\n\t\t\"redneck1\",\n\t\t\"redbeard\",\n\t\t\"qwerty777\",\n\t\t\"qaz12345\",\n\t\t\"professor\",\n\t\t\"postov1000\",\n\t\t\"politics\",\n\t\t\"polarbea\",\n\t\t\"pimpster\",\n\t\t\"payton34\",\n\t\t\"patterso\",\n\t\t\"pantyhose\",\n\t\t\"palomino\",\n\t\t\"outoutout\",\n\t\t\"onepiece\",\n\t\t\"nyyankee\",\n\t\t\"nolimits\",\n\t\t\"ninanina\",\n\t\t\"nicknick\",\n\t\t\"newport1\",\n\t\t\"monkey11\",\n\t\t\"metalgear\",\n\t\t\"meltdown\",\n\t\t\"mccarthy\",\n\t\t\"mattmatt\",\n\t\t\"Matthew1\",\n\t\t\"masterkey\",\n\t\t\"manhattan\",\n\t\t\"magnavox\",\n\t\t\"loglatin\",\n\t\t\"lifeisgood\",\n\t\t\"licorice\",\n\t\t\"learning\",\n\t\t\"lalaland\",\n\t\t\"lakers24\",\n\t\t\"kitty123\",\n\t\t\"kingsize\",\n\t\t\"jimmy123\",\n\t\t\"invictus\",\n\t\t\"Gy3Yt2RGLs\",\n\t\t\"goodness\",\n\t\t\"goodison\",\n\t\t\"glassman\",\n\t\t\"ghjvtntq\",\n\t\t\"felicity\",\n\t\t\"failsafe\",\n\t\t\"fabrizio\",\n\t\t\"f15eagle\",\n\t\t\"excellen\",\n\t\t\"emmitt22\",\n\t\t\"element1\",\n\t\t\"dumpster\",\n\t\t\"divorced\",\n\t\t\"dillweed\",\n\t\t\"deepblue\",\n\t\t\"counterstrike\",\n\t\t\"coolbean\",\n\t\t\"commerce\",\n\t\t\"collecti\",\n\t\t\"chillout\",\n\t\t\"chemistr\",\n\t\t\"carefree\",\n\t\t\"capital1\",\n\t\t\"calculus\",\n\t\t\"calamity\",\n\t\t\"caffeine\",\n\t\t\"buchanan\",\n\t\t\"black123\",\n\t\t\"bigpussy\",\n\t\t\"bigdick1\",\n\t\t\"barakuda\",\n\t\t\"babushka\",\n\t\t\"asmodeus\",\n\t\t\"asdfg12345\",\n\t\t\"aquafina\",\n\t\t\"angelito\",\n\t\t\"alexandru\",\n\t\t\"a1a2a3a4a5\",\n\t\t\"52525252\",\n\t\t\"48151623\",\n\t\t\"31081986\",\n\t\t\"31081981\",\n\t\t\"31071987\",\n\t\t\"31071979\",\n\t\t\"31051981\",\n\t\t\"31031979\",\n\t\t\"31011982\",\n\t\t\"31011979\",\n\t\t\"30081993\",\n\t\t\"29111986\",\n\t\t\"29101981\",\n\t\t\"29091992\",\n\t\t\"29091978\",\n\t\t\"29071979\",\n\t\t\"29051979\",\n\t\t\"28121991\",\n\t\t\"28101993\",\n\t\t\"28101983\",\n\t\t\"28091994\",\n\t\t\"28081993\",\n\t\t\"28051978\",\n\t\t\"28041993\",\n\t\t\"28041977\",\n\t\t\"27121992\",\n\t\t\"27121985\",\n\t\t\"27101988\",\n\t\t\"27091994\",\n\t\t\"27091978\",\n\t\t\"27081992\",\n\t\t\"27071992\",\n\t\t\"27021979\",\n\t\t\"27011993\",\n\t\t\"27011980\",\n\t\t\"26111990\",\n\t\t\"26101991\",\n\t\t\"26101978\",\n\t\t\"26091982\",\n\t\t\"26081982\",\n\t\t\"26071981\",\n\t\t\"26061993\",\n\t\t\"26051981\",\n\t\t\"25111981\",\n\t\t\"25071993\",\n\t\t\"25061977\",\n\t\t\"25021981\",\n\t\t\"24121980\",\n\t\t\"24081979\",\n\t\t\"24061977\",\n\t\t\"24041981\",\n\t\t\"24021980\",\n\t\t\"24011980\",\n\t\t\"23121980\",\n\t\t\"23091980\",\n\t\t\"23081981\",\n\t\t\"23071996\",\n\t\t\"23071978\",\n\t\t\"23061993\",\n\t\t\"23061978\",\n\t\t\"23031979\",\n\t\t\"23021995\",\n\t\t\"23021994\",\n\t\t\"23011995\",\n\t\t\"23011993\",\n\t\t\"22121993\",\n\t\t\"22111992\",\n\t\t\"22101980\",\n\t\t\"22081988\",\n\t\t\"22071976\",\n\t\t\"22061976\",\n\t\t\"22051995\",\n\t\t\"22031980\",\n\t\t\"22011981\",\n\t\t\"21121990\",\n\t\t\"21101995\",\n\t\t\"21081982\",\n\t\t\"21081979\",\n\t\t\"21041981\",\n\t\t\"21011993\",\n\t\t\"21011979\",\n\t\t\"20121980\",\n\t\t\"20121977\",\n\t\t\"20111981\",\n\t\t\"20071980\",\n\t\t\"20061979\",\n\t\t\"20061977\",\n\t\t\"1Mustang\",\n\t\t\"19061979\",\n\t\t\"19051992\",\n\t\t\"19031979\",\n\t\t\"19011994\",\n\t\t\"18091981\",\n\t\t\"18081991\",\n\t\t\"18071992\",\n\t\t\"18041978\",\n\t\t\"18031984\",\n\t\t\"18031978\",\n\t\t\"17931793\",\n\t\t\"17121981\",\n\t\t\"17091988\",\n\t\t\"17081983\",\n\t\t\"17081976\",\n\t\t\"17071993\",\n\t\t\"17061972\",\n\t\t\"17031977\",\n\t\t\"17021995\",\n\t\t\"17021978\",\n\t\t\"17021974\",\n\t\t\"16101990\",\n\t\t\"16071996\",\n\t\t\"16051995\",\n\t\t\"16051980\",\n\t\t\"16051979\",\n\t\t\"16041980\",\n\t\t\"16031982\",\n\t\t\"16011978\",\n\t\t\"15121978\",\n\t\t\"15121973\",\n\t\t\"15031979\",\n\t\t\"15021980\",\n\t\t\"15011980\",\n\t\t\"14101980\",\n\t\t\"14101975\",\n\t\t\"14021993\",\n\t\t\"13572468\",\n\t\t\"13091983\",\n\t\t\"13051982\",\n\t\t\"13051981\",\n\t\t\"12451245\",\n\t\t\"12345678901\",\n\t\t\"123321456\",\n\t\t\"12101981\",\n\t\t\"12071970\",\n\t\t\"12041961\",\n\t\t\"12031983\",\n\t\t\"11091982\",\n\t\t\"11091977\",\n\t\t\"11071994\",\n\t\t\"10101995\",\n\t\t\"10101994\",\n\t\t\"10091981\",\n\t\t\"10061994\",\n\t\t\"10061978\",\n\t\t\"10021992\",\n\t\t\"10021977\",\n\t\t\"10021976\",\n\t\t\"10011975\",\n\t\t\"10011970\",\n\t\t\"09121981\",\n\t\t\"09111982\",\n\t\t\"09101992\",\n\t\t\"09081981\",\n\t\t\"09061980\",\n\t\t\"09061977\",\n\t\t\"09051973\",\n\t\t\"08520852\",\n\t\t\"08111978\",\n\t\t\"08081978\",\n\t\t\"08071993\",\n\t\t\"08051982\",\n\t\t\"08011974\",\n\t\t\"07121990\",\n\t\t\"07111980\",\n\t\t\"07101994\",\n\t\t\"07091991\",\n\t\t\"07061992\",\n\t\t\"07031995\",\n\t\t\"07031982\",\n\t\t\"06121984\",\n\t\t\"06121981\",\n\t\t\"06111992\",\n\t\t\"06101992\",\n\t\t\"06091980\",\n\t\t\"06091979\",\n\t\t\"06071981\",\n\t\t\"06061992\",\n\t\t\"06051994\",\n\t\t\"06041985\",\n\t\t\"06041981\",\n\t\t\"06031994\",\n\t\t\"06011981\",\n\t\t\"05121993\",\n\t\t\"05111981\",\n\t\t\"05091990\",\n\t\t\"05071980\",\n\t\t\"05071971\",\n\t\t\"05041995\",\n\t\t\"05041979\",\n\t\t\"05031994\",\n\t\t\"05021992\",\n\t\t\"05021983\",\n\t\t\"05021982\",\n\t\t\"04121978\",\n\t\t\"04101994\",\n\t\t\"04081976\",\n\t\t\"04071991\",\n\t\t\"04031987\",\n\t\t\"04021994\",\n\t\t\"04021977\",\n\t\t\"04011983\",\n\t\t\"03121981\",\n\t\t\"03091993\",\n\t\t\"03091989\",\n\t\t\"03071979\",\n\t\t\"03061995\",\n\t\t\"03061980\",\n\t\t\"03032009\",\n\t\t\"03031976\",\n\t\t\"03021991\",\n\t\t\"03021980\",\n\t\t\"03011993\",\n\t\t\"02121979\",\n\t\t\"02111981\",\n\t\t\"02061994\",\n\t\t\"02061991\",\n\t\t\"02022008\",\n\t\t\"01111980\",\n\t\t\"01111979\",\n\t\t\"01071993\",\n\t\t\"01061978\",\n\t\t\"01061975\",\n\t\t\"01021996\",\n\t\t\"01011969\",\n\t\t\"01011963\",\n\t\t\"01011955\",\n\t\t\"yorktown\",\n\t\t\"yesterday\",\n\t\t\"worldcup\",\n\t\t\"winchest\",\n\t\t\"valdepen\",\n\t\t\"universi\",\n\t\t\"unicorn1\",\n\t\t\"thunderbird\",\n\t\t\"thematri\",\n\t\t\"tecumseh\",\n\t\t\"teacher1\",\n\t\t\"summer01\",\n\t\t\"suikoden\",\n\t\t\"smuggles\",\n\t\t\"skateboa\",\n\t\t\"sideways\",\n\t\t\"showboat\",\n\t\t\"sebastie\",\n\t\t\"scruffy1\",\n\t\t\"schastie\",\n\t\t\"sandydog\",\n\t\t\"sailfish\",\n\t\t\"qwaszx12\",\n\t\t\"qazxsw12\",\n\t\t\"!QAZ2wsx\",\n\t\t\"pussylov\",\n\t\t\"psychnau\",\n\t\t\"professional\",\n\t\t\"prashant\",\n\t\t\"powerade\",\n\t\t\"pontiac1\",\n\t\t\"pinkpink\",\n\t\t\"peregrin\",\n\t\t\"pennstate\",\n\t\t\"parsifal\",\n\t\t\"overload\",\n\t\t\"omsairam\",\n\t\t\"october2\",\n\t\t\"novikova\",\n\t\t\"nadezhda\",\n\t\t\"mymother\",\n\t\t\"mustang9\",\n\t\t\"mustang8\",\n\t\t\"mustang0\",\n\t\t\"moonshine\",\n\t\t\"mindless\",\n\t\t\"michele1\",\n\t\t\"metropol\",\n\t\t\"mauricio\",\n\t\t\"master01\",\n\t\t\"marigold\",\n\t\t\"manager1\",\n\t\t\"luscious\",\n\t\t\"luckyman\",\n\t\t\"LoveMe89\",\n\t\t\"longlegs\",\n\t\t\"longhorns\",\n\t\t\"lollollol\",\n\t\t\"letmein22\",\n\t\t\"lancaste\",\n\t\t\"kicksass\",\n\t\t\"joshua12\",\n\t\t\"johndeere\",\n\t\t\"jeffjeff\",\n\t\t\"jeepjeep\",\n\t\t\"jediknight\",\n\t\t\"ilya1992\",\n\t\t\"illumina\",\n\t\t\"hotsauce\",\n\t\t\"hometown\",\n\t\t\"holahola\",\n\t\t\"hitman47\",\n\t\t\"hermione\",\n\t\t\"hellohello\",\n\t\t\"hatteras\",\n\t\t\"gunsling\",\n\t\t\"goldfinger\",\n\t\t\"glenwood\",\n\t\t\"ghjcnjghjcnj\",\n\t\t\"gfhjkzytn\",\n\t\t\"fuckyeah\",\n\t\t\"footlove\",\n\t\t\"finnegan\",\n\t\t\"favorite8\",\n\t\t\"favorite7\",\n\t\t\"fabienne\",\n\t\t\"elbereth\",\n\t\t\"dustydog\",\n\t\t\"ducksoup\",\n\t\t\"drjynfrnt\",\n\t\t\"dragon13\",\n\t\t\"douglas1\",\n\t\t\"dominica\",\n\t\t\"dkflbvbhjdbx\",\n\t\t\"delivery\",\n\t\t\"davecole\",\n\t\t\"copenhagen\",\n\t\t\"control1\",\n\t\t\"consuelo\",\n\t\t\"clitlick\",\n\t\t\"claudia1\",\n\t\t\"chipper1\",\n\t\t\"champions\",\n\t\t\"celticfc\",\n\t\t\"caseydog\",\n\t\t\"camelot1\",\n\t\t\"cableguy\",\n\t\t\"brownies\",\n\t\t\"boris123\",\n\t\t\"bonghits\",\n\t\t\"bluebear\",\n\t\t\"blackbel\",\n\t\t\"billiard\",\n\t\t\"bigbutts\",\n\t\t\"bachelor\",\n\t\t\"avangard\",\n\t\t\"angelofwar\",\n\t\t\"andrew12\",\n\t\t\"amarillo\",\n\t\t\"alphaman\",\n\t\t\"alabama1\",\n\t\t\"admin18533362\",\n\t\t\"89898989\",\n\t\t\"7hrdnw23\",\n\t\t\"65656565\",\n\t\t\"333666999\",\n\t\t\"31031983\",\n\t\t\"31011993\",\n\t\t\"30111995\",\n\t\t\"30111992\",\n\t\t\"30101978\",\n\t\t\"30101974\",\n\t\t\"30091984\",\n\t\t\"30081994\",\n\t\t\"30061978\",\n\t\t\"30051978\",\n\t\t\"29101983\",\n\t\t\"29031994\",\n\t\t\"29031992\",\n\t\t\"29031981\",\n\t\t\"28282828\",\n\t\t\"28121993\",\n\t\t\"28121980\",\n\t\t\"28101977\",\n\t\t\"28101974\",\n\t\t\"27111983\",\n\t\t\"27111981\",\n\t\t\"27081980\",\n\t\t\"27071975\",\n\t\t\"27061975\",\n\t\t\"27041991\",\n\t\t\"26121980\",\n\t\t\"26071978\",\n\t\t\"26061994\",\n\t\t\"26051994\",\n\t\t\"26031976\",\n\t\t\"26021981\",\n\t\t\"25121977\",\n\t\t\"25101993\",\n\t\t\"25101981\",\n\t\t\"25041995\",\n\t\t\"25011995\",\n\t\t\"25011980\",\n\t\t\"24862486\",\n\t\t\"24101981\",\n\t\t\"24081993\",\n\t\t\"24061981\",\n\t\t\"24041995\",\n\t\t\"24021992\",\n\t\t\"23121977\",\n\t\t\"23111980\",\n\t\t\"23091979\",\n\t\t\"23051993\",\n\t\t\"22101993\",\n\t\t\"22091993\",\n\t\t\"22091980\",\n\t\t\"22091979\",\n\t\t\"22071978\",\n\t\t\"22041994\",\n\t\t\"22041978\",\n\t\t\"22041974\",\n\t\t\"22031982\",\n\t\t\"21111975\",\n\t\t\"21081992\",\n\t\t\"21061981\",\n\t\t\"21031979\",\n\t\t\"21021994\",\n\t\t\"21021979\",\n\t\t\"21011982\",\n\t\t\"20091994\",\n\t\t\"20081996\",\n\t\t\"20061974\",\n\t\t\"20051977\",\n\t\t\"20011995\",\n\t\t\"1qaz!QAZ\",\n\t\t\"1Basebal\",\n\t\t\"1a2a3a4a5a\",\n\t\t\"19451945\",\n\t\t\"19101981\",\n\t\t\"19081981\",\n\t\t\"19081975\",\n\t\t\"19071992\",\n\t\t\"19061974\",\n\t\t\"19031976\",\n\t\t\"19011995\",\n\t\t\"19011977\",\n\t\t\"18091994\",\n\t\t\"18071994\",\n\t\t\"18051981\",\n\t\t\"18041980\",\n\t\t\"18011995\",\n\t\t\"18011980\",\n\t\t\"17121989\",\n\t\t\"17121975\",\n\t\t\"17111993\",\n\t\t\"17101995\",\n\t\t\"17101978\",\n\t\t\"17091994\",\n\t\t\"17071994\",\n\t\t\"17021975\",\n\t\t\"17011981\",\n\t\t\"16101983\",\n\t\t\"16101976\",\n\t\t\"16071981\",\n\t\t\"16061995\",\n\t\t\"16051994\",\n\t\t\"16041979\",\n\t\t\"16041977\",\n\t\t\"16031981\",\n\t\t\"159753123\",\n\t\t\"151nxjmt\",\n\t\t\"15121994\",\n\t\t\"15111978\",\n\t\t\"15101978\",\n\t\t\"15091993\",\n\t\t\"15081977\",\n\t\t\"15071994\",\n\t\t\"15051977\",\n\t\t\"15021972\",\n\t\t\"14111981\",\n\t\t\"14091981\",\n\t\t\"14091980\",\n\t\t\"14071976\",\n\t\t\"14021975\",\n\t\t\"13576479\",\n\t\t\"13101979\",\n\t\t\"13091978\",\n\t\t\"13061980\",\n\t\t\"13051996\",\n\t\t\"13011995\",\n\t\t\"13011994\",\n\t\t\"12qwerty\",\n\t\t\"12121973\",\n\t\t\"12121970\",\n\t\t\"12101975\",\n\t\t\"12091978\",\n\t\t\"12081978\",\n\t\t\"12061996\",\n\t\t\"12051975\",\n\t\t\"12041992\",\n\t\t\"12031977\",\n\t\t\"12031974\",\n\t\t\"11111975\",\n\t\t\"11091993\",\n\t\t\"11091980\",\n\t\t\"11031979\",\n\t\t\"11031975\",\n\t\t\"11021978\",\n\t\t\"11021974\",\n\t\t\"10121981\",\n\t\t\"10111995\",\n\t\t\"10111978\",\n\t\t\"10061977\",\n\t\t\"10031972\",\n\t\t\"09111992\",\n\t\t\"09101990\",\n\t\t\"09091977\",\n\t\t\"09081983\",\n\t\t\"09071980\",\n\t\t\"09061978\",\n\t\t\"09031980\",\n\t\t\"08101988\",\n\t\t\"08061991\",\n\t\t\"08061982\",\n\t\t\"08051980\",\n\t\t\"08021983\",\n\t\t\"07121986\",\n\t\t\"07101991\",\n\t\t\"07101979\",\n\t\t\"07091992\",\n\t\t\"07091979\",\n\t\t\"07061981\",\n\t\t\"06121992\",\n\t\t\"06101994\",\n\t\t\"06091995\",\n\t\t\"06091981\",\n\t\t\"06081980\",\n\t\t\"06071977\",\n\t\t\"06061975\",\n\t\t\"06051984\",\n\t\t\"06041992\",\n\t\t\"06041982\",\n\t\t\"06031982\",\n\t\t\"05121981\",\n\t\t\"05091979\",\n\t\t\"05091977\",\n\t\t\"05071982\",\n\t\t\"05071978\",\n\t\t\"05051995\",\n\t\t\"05041993\",\n\t\t\"05031985\",\n\t\t\"05021984\",\n\t\t\"05011976\",\n\t\t\"04200420\",\n\t\t\"04121990\",\n\t\t\"04101982\",\n\t\t\"04081993\",\n\t\t\"04061983\",\n\t\t\"04051995\",\n\t\t\"04041974\",\n\t\t\"03121991\",\n\t\t\"03111988\",\n\t\t\"03071977\",\n\t\t\"03051977\",\n\t\t\"03031979\",\n\t\t\"03021994\",\n\t\t\"03011995\",\n\t\t\"02121993\",\n\t\t\"02081995\",\n\t\t\"02071993\",\n\t\t\"02061995\",\n\t\t\"01121991\",\n\t\t\"01111985\",\n\t\t\"01101992\",\n\t\t\"01092000\",\n\t\t\"01081993\",\n\t\t\"01071992\",\n\t\t\"01041994\",\n\t\t\"01041976\",\n\t\t\"01011962\",\n\t\t\"01011957\",\n\t\t\"ytrhjvfyn\",\n\t\t\"yodayoda\",\n\t\t\"wolfwolf\",\n\t\t\"whatever1\",\n\t\t\"vthctltc\",\n\t\t\"vfvfvskfhfve\",\n\t\t\"touchdow\",\n\t\t\"thomas12\",\n\t\t\"thematrix\",\n\t\t\"theflash\",\n\t\t\"tactical\",\n\t\t\"strannik\",\n\t\t\"stampede\",\n\t\t\"slayer666\",\n\t\t\"sixtynine\",\n\t\t\"shadow01\",\n\t\t\"searcher\",\n\t\t\"satriani\",\n\t\t\"saopaulo\",\n\t\t\"rockroll\",\n\t\t\"rhfcfdxbr\",\n\t\t\"red12345\",\n\t\t\"Q1w2e3r4\",\n\t\t\"pyramid1\",\n\t\t\"prisoner\",\n\t\t\"polniypizdec0211\",\n\t\t\"pleaseme\",\n\t\t\"pleasant\",\n\t\t\"playboys\",\n\t\t\"Phoenix1\",\n\t\t\"pepsi123\",\n\t\t\"pedersen\",\n\t\t\"passions\",\n\t\t\"parasite\",\n\t\t\"overtime\",\n\t\t\"oriflame\",\n\t\t\"nokian70\",\n\t\t\"nevermor\",\n\t\t\"mousepad\",\n\t\t\"moonstar\",\n\t\t\"mobbdeep\",\n\t\t\"milenium\",\n\t\t\"michael9\",\n\t\t\"mapet123456\",\n\t\t\"mammamia\",\n\t\t\"mackenzie\",\n\t\t\"machoman\",\n\t\t\"lovesexy\",\n\t\t\"lovefeet\",\n\t\t\"lostsoul\",\n\t\t\"longtime\",\n\t\t\"longdick\",\n\t\t\"lionlion\",\n\t\t\"Lineage2\",\n\t\t\"limpbizkit\",\n\t\t\"legoland\",\n\t\t\"language\",\n\t\t\"kurosaki\",\n\t\t\"kirkwood\",\n\t\t\"kilkenny\",\n\t\t\"juvenile\",\n\t\t\"junkyard\",\n\t\t\"joseluis\",\n\t\t\"jbond007\",\n\t\t\"iwantyou\",\n\t\t\"indonesia\",\n\t\t\"ibilljpf\",\n\t\t\"hugohugo\",\n\t\t\"henderson\",\n\t\t\"headshot\",\n\t\t\"gtkmvtym\",\n\t\t\"greyhoun\",\n\t\t\"goodtimes\",\n\t\t\"goldmine\",\n\t\t\"goldgold\",\n\t\t\"ghjnjrjk\",\n\t\t\"ghbdtn12\",\n\t\t\"general1\",\n\t\t\"funnyman\",\n\t\t\"freeland\",\n\t\t\"forklift\",\n\t\t\"flintsto\",\n\t\t\"fkmnthyfnbdf\",\n\t\t\"essendon\",\n\t\t\"emachines\",\n\t\t\"dragon99\",\n\t\t\"darkmoon\",\n\t\t\"damage11\",\n\t\t\"daisymae\",\n\t\t\"covenant\",\n\t\t\"corporal\",\n\t\t\"cordelia\",\n\t\t\"codeblue\",\n\t\t\"claypool\",\n\t\t\"catalyst\",\n\t\t\"carthage\",\n\t\t\"bumblebe\",\n\t\t\"buckbuck\",\n\t\t\"broodwar\",\n\t\t\"boscoe01\",\n\t\t\"bondarenko\",\n\t\t\"birthday1\",\n\t\t\"besiktas\",\n\t\t\"bayliner\",\n\t\t\"baphomet\",\n\t\t\"avengers\",\n\t\t\"atlanta1\",\n\t\t\"assassins\",\n\t\t\"arsenalfc\",\n\t\t\"aqualung\",\n\t\t\"anatoliy\",\n\t\t\"algernon\",\n\t\t\"aleksander\",\n\t\t\"afrodita\",\n\t\t\"Abcd1234\",\n\t\t\"aa123456\",\n\t\t\"90909090\",\n\t\t\"89600506779\",\n\t\t\"61586158\",\n\t\t\"54545454\",\n\t\t\"33rjhjds\",\n\t\t\"31081993\",\n\t\t\"30081985\",\n\t\t\"30061975\",\n\t\t\"30051983\",\n\t\t\"30051982\",\n\t\t\"2wsxzaq1\",\n\t\t\"29121977\",\n\t\t\"29051995\",\n\t\t\"29051978\",\n\t\t\"29041979\",\n\t\t\"29041976\",\n\t\t\"29041974\",\n\t\t\"29031980\",\n\t\t\"29011977\",\n\t\t\"28121975\",\n\t\t\"28111994\",\n\t\t\"28091977\",\n\t\t\"28041995\",\n\t\t\"28041978\",\n\t\t\"27111980\",\n\t\t\"27091992\",\n\t\t\"27081991\",\n\t\t\"27081982\",\n\t\t\"27081981\",\n\t\t\"27041995\",\n\t\t\"27031980\",\n\t\t\"27011995\",\n\t\t\"27011977\",\n\t\t\"26121982\",\n\t\t\"26091983\",\n\t\t\"26091978\",\n\t\t\"26071995\",\n\t\t\"26061982\",\n\t\t\"26041993\",\n\t\t\"26041980\",\n\t\t\"26021978\",\n\t\t\"25121992\",\n\t\t\"25111984\",\n\t\t\"25111977\",\n\t\t\"25091996\",\n\t\t\"25091980\",\n\t\t\"25061980\",\n\t\t\"246813579\",\n\t\t\"24121991\",\n\t\t\"24111993\",\n\t\t\"24111976\",\n\t\t\"24091983\",\n\t\t\"24061993\",\n\t\t\"24061980\",\n\t\t\"24051981\",\n\t\t\"24051980\",\n\t\t\"24031977\",\n\t\t\"23101993\",\n\t\t\"23091975\",\n\t\t\"23081995\",\n\t\t\"23011978\",\n\t\t\"23011975\",\n\t\t\"22121994\",\n\t\t\"22111994\",\n\t\t\"22101979\",\n\t\t\"22091994\",\n\t\t\"22071980\",\n\t\t\"22061979\",\n\t\t\"22061978\",\n\t\t\"22021993\",\n\t\t\"22011994\",\n\t\t\"21091994\",\n\t\t\"21071993\",\n\t\t\"21041975\",\n\t\t\"21031978\",\n\t\t\"21021978\",\n\t\t\"21011995\",\n\t\t\"20121993\",\n\t\t\"20121981\",\n\t\t\"20101980\",\n\t\t\"20071994\",\n\t\t\"20061993\",\n\t\t\"20051978\",\n\t\t\"20021976\",\n\t\t\"20011993\",\n\t\t\"20011976\",\n\t\t\"19561956\",\n\t\t\"19111982\",\n\t\t\"19111979\",\n\t\t\"19091981\",\n\t\t\"19071981\",\n\t\t\"19031983\",\n\t\t\"19011980\",\n\t\t\"19011975\",\n\t\t\"18111993\",\n\t\t\"18111991\",\n\t\t\"18111975\",\n\t\t\"18101994\",\n\t\t\"18101993\",\n\t\t\"18081978\",\n\t\t\"18031983\",\n\t\t\"18031977\",\n\t\t\"18021980\",\n\t\t\"17051974\",\n\t\t\"17021980\",\n\t\t\"17011996\",\n\t\t\"17011980\",\n\t\t\"16091989\",\n\t\t\"16081976\",\n\t\t\"16071984\",\n\t\t\"16051977\",\n\t\t\"16041981\",\n\t\t\"16021981\",\n\t\t\"16021975\",\n\t\t\"16011976\",\n\t\t\"159753852\",\n\t\t\"15111992\",\n\t\t\"15091982\",\n\t\t\"15081981\",\n\t\t\"15061980\",\n\t\t\"14921492\",\n\t\t\"14121992\",\n\t\t\"14121981\",\n\t\t\"14121978\",\n\t\t\"14101976\",\n\t\t\"14081973\",\n\t\t\"14071979\",\n\t\t\"14071978\",\n\t\t\"14061976\",\n\t\t\"14041979\",\n\t\t\"14031994\",\n\t\t\"14031993\",\n\t\t\"14031979\",\n\t\t\"14021994\",\n\t\t\"14011995\",\n\t\t\"14011981\",\n\t\t\"14011979\",\n\t\t\"13121993\",\n\t\t\"13111992\",\n\t\t\"13111983\",\n\t\t\"13101991\",\n\t\t\"13091992\",\n\t\t\"13071995\",\n\t\t\"13041975\",\n\t\t\"13031995\",\n\t\t\"13031978\",\n\t\t\"13021981\",\n\t\t\"123456qq\",\n\t\t\"12111980\",\n\t\t\"12101994\",\n\t\t\"12071993\",\n\t\t\"12061977\",\n\t\t\"12051978\",\n\t\t\"12031981\",\n\t\t\"12031976\",\n\t\t\"12021977\",\n\t\t\"12021974\",\n\t\t\"11101994\",\n\t\t\"11101977\",\n\t\t\"11101976\",\n\t\t\"11081995\",\n\t\t\"11061977\",\n\t\t\"10101972\",\n\t\t\"10091973\",\n\t\t\"10041977\",\n\t\t\"10031994\",\n\t\t\"10021979\",\n\t\t\"10011977\",\n\t\t\"09121991\",\n\t\t\"09121980\",\n\t\t\"09091992\",\n\t\t\"09091983\",\n\t\t\"09081979\",\n\t\t\"09041992\",\n\t\t\"09041976\",\n\t\t\"09021981\",\n\t\t\"08121980\",\n\t\t\"08111977\",\n\t\t\"08081977\",\n\t\t\"08071975\",\n\t\t\"08031979\",\n\t\t\"07101981\",\n\t\t\"07101962\",\n\t\t\"07081979\",\n\t\t\"07051982\",\n\t\t\"07041992\",\n\t\t\"07031992\",\n\t\t\"07021992\",\n\t\t\"06121978\",\n\t\t\"06101977\",\n\t\t\"06091986\",\n\t\t\"06081976\",\n\t\t\"06061974\",\n\t\t\"06021993\",\n\t\t\"05101992\",\n\t\t\"05071994\",\n\t\t\"05061979\",\n\t\t\"05041980\",\n\t\t\"05021978\",\n\t\t\"05011982\",\n\t\t\"04111983\",\n\t\t\"04111980\",\n\t\t\"04101983\",\n\t\t\"04091992\",\n\t\t\"04031988\",\n\t\t\"04031975\",\n\t\t\"04021991\",\n\t\t\"04011984\",\n\t\t\"03121988\",\n\t\t\"03061993\",\n\t\t\"03041976\",\n\t\t\"03031995\",\n\t\t\"03031978\",\n\t\t\"02111993\",\n\t\t\"02051994\",\n\t\t\"02051993\",\n\t\t\"01121992\",\n\t\t\"01111978\",\n\t\t\"01111977\",\n\t\t\"01101975\",\n\t\t\"01091993\",\n\t\t\"01041977\",\n\t\t\"01022011\",\n\t\t\"01021975\",\n\t\t\"01012008\",\n\t\t\"zxcvb12345\",\n\t\t\"zcxfcnkbdf\",\n\t\t\"ytyfdbcnm\",\n\t\t\"wonderland\",\n\t\t\"wisconsi\",\n\t\t\"william2\",\n\t\t\"viper123\",\n\t\t\"valdemar\",\n\t\t\"trojans1\",\n\t\t\"trader12\",\n\t\t\"timetime\",\n\t\t\"timeless\",\n\t\t\"tigger12\",\n\t\t\"thissuck\",\n\t\t\"theworld\",\n\t\t\"tennessee\",\n\t\t\"stockings\",\n\t\t\"sobriety\",\n\t\t\"snoogans\",\n\t\t\"skypilot\",\n\t\t\"sk84life\",\n\t\t\"sidewind\",\n\t\t\"shadow11\",\n\t\t\"schwartz\",\n\t\t\"schnuffi\",\n\t\t\"schneider\",\n\t\t\"Rush2112\",\n\t\t\"rockydog\",\n\t\t\"rjyatnrf\",\n\t\t\"qwertzui\",\n\t\t\"qwerfdsa\",\n\t\t\"qazxswedcvfr\",\n\t\t\"q1234567890\",\n\t\t\"pussylover\",\n\t\t\"princessa\",\n\t\t\"popsicle\",\n\t\t\"planning\",\n\t\t\"phoenix2\",\n\t\t\"password3\",\n\t\t\"%%passwo\",\n\t\t\"passfind\",\n\t\t\"parliament\",\n\t\t\"oscar123\",\n\t\t\"orange12\",\n\t\t\"oldschool\",\n\t\t\"nonrev67\",\n\t\t\"nikenike\",\n\t\t\"milashka\",\n\t\t\"marietta\",\n\t\t\"makemoney\",\n\t\t\"lucas123\",\n\t\t\"lindsay1\",\n\t\t\"leningrad\",\n\t\t\"kovalenko\",\n\t\t\"kingrich\",\n\t\t\"Jonathan\",\n\t\t\"investor\",\n\t\t\"iloveher\",\n\t\t\"hrvatska\",\n\t\t\"hammerhe\",\n\t\t\"gunsmoke\",\n\t\t\"goodstuf\",\n\t\t\"ghtktcnm\",\n\t\t\"ghbrjkbcn\",\n\t\t\"ghblehrb\",\n\t\t\"gfhfljrc\",\n\t\t\"germany1\",\n\t\t\"galatasaray\",\n\t\t\"fuckyou123\",\n\t\t\"fuckfest\",\n\t\t\"forgiven\",\n\t\t\"flhtyfkby\",\n\t\t\"flapjack\",\n\t\t\"firework\",\n\t\t\"firestor\",\n\t\t\"fightclub\",\n\t\t\"exploite\",\n\t\t\"elisabeth\",\n\t\t\"dripping\",\n\t\t\"dreamers\",\n\t\t\"dreamer1\",\n\t\t\"discount\",\n\t\t\"cynthia1\",\n\t\t\"cyberonline\",\n\t\t\"critical\",\n\t\t\"charlies\",\n\t\t\"c3por2d2\",\n\t\t\"buttplug\",\n\t\t\"bulldawg\",\n\t\t\"buckeye1\",\n\t\t\"blacksun\",\n\t\t\"bigpimpi\",\n\t\t\"barracuda\",\n\t\t\"barracud\",\n\t\t\"babababa\",\n\t\t\"azsxdcfvgb\",\n\t\t\"astroboy\",\n\t\t\"art131313\",\n\t\t\"arabella\",\n\t\t\"appleton\",\n\t\t\"annabelle\",\n\t\t\"ambition\",\n\t\t\"akatsuki\",\n\t\t\"agnieszka\",\n\t\t\"advocate\",\n\t\t\"adelaida\",\n\t\t\"adamadam\",\n\t\t\"abcdefghi\",\n\t\t\"777888999\",\n\t\t\"36363636\",\n\t\t\"31081984\",\n\t\t\"31051994\",\n\t\t\"31011988\",\n\t\t\"30111978\",\n\t\t\"30091981\",\n\t\t\"30091977\",\n\t\t\"30081981\",\n\t\t\"30011982\",\n\t\t\"29121978\",\n\t\t\"29091976\",\n\t\t\"29061976\",\n\t\t\"29031996\",\n\t\t\"29031977\",\n\t\t\"29021992\",\n\t\t\"28121994\",\n\t\t\"28081980\",\n\t\t\"28081979\",\n\t\t\"28071979\",\n\t\t\"28051976\",\n\t\t\"28021982\",\n\t\t\"27111979\",\n\t\t\"27101981\",\n\t\t\"27071980\",\n\t\t\"27061995\",\n\t\t\"27061993\",\n\t\t\"27061979\",\n\t\t\"27061976\",\n\t\t\"27051981\",\n\t\t\"27051980\",\n\t\t\"27051976\",\n\t\t\"27051975\",\n\t\t\"27041978\",\n\t\t\"27031978\",\n\t\t\"27031976\",\n\t\t\"27011992\",\n\t\t\"27011976\",\n\t\t\"26121994\",\n\t\t\"26101980\",\n\t\t\"26081994\",\n\t\t\"26071976\",\n\t\t\"26071974\",\n\t\t\"26061980\",\n\t\t\"26021982\",\n\t\t\"26021979\",\n\t\t\"26021977\",\n\t\t\"26011994\",\n\t\t\"25081982\",\n\t\t\"25031981\",\n\t\t\"25011981\",\n\t\t\"24121992\",\n\t\t\"24111975\",\n\t\t\"24081981\",\n\t\t\"24071980\",\n\t\t\"24071974\",\n\t\t\"24061979\",\n\t\t\"24061975\",\n\t\t\"24051977\",\n\t\t\"24041994\",\n\t\t\"24041980\",\n\t\t\"23176djivanfros\",\n\t\t\"23091977\",\n\t\t\"23011994\",\n\t\t\"23011976\",\n\t\t\"22111976\",\n\t\t\"22081996\",\n\t\t\"22081994\",\n\t\t\"22081982\",\n\t\t\"22071995\",\n\t\t\"22071994\",\n\t\t\"22071979\",\n\t\t\"22071977\",\n\t\t\"22061996\",\n\t\t\"22041970\",\n\t\t\"22031993\",\n\t\t\"21091993\",\n\t\t\"21071978\",\n\t\t\"21061975\",\n\t\t\"21051994\",\n\t\t\"21051980\",\n\t\t\"21041979\",\n\t\t\"21021993\",\n\t\t\"20121992\",\n\t\t\"20121975\",\n\t\t\"20111979\",\n\t\t\"20091980\",\n\t\t\"20091978\",\n\t\t\"20081981\",\n\t\t\"20051975\",\n\t\t\"20021979\",\n\t\t\"20011977\",\n\t\t\"1qay2wsx\",\n\t\t\"19121979\",\n\t\t\"19121977\",\n\t\t\"19111980\",\n\t\t\"19111977\",\n\t\t\"19101976\",\n\t\t\"19091977\",\n\t\t\"19081980\",\n\t\t\"19051995\",\n\t\t\"19051982\",\n\t\t\"19021978\",\n\t\t\"18091990\",\n\t\t\"18091979\",\n\t\t\"18081981\",\n\t\t\"18061977\",\n\t\t\"18041982\",\n\t\t\"17091990\",\n\t\t\"17091989\",\n\t\t\"17091980\",\n\t\t\"17091976\",\n\t\t\"17071979\",\n\t\t\"17071977\",\n\t\t\"17041981\",\n\t\t\"17041974\",\n\t\t\"17011978\",\n\t\t\"16121993\",\n\t\t\"16081996\",\n\t\t\"16071979\",\n\t\t\"16061978\",\n\t\t\"16031995\",\n\t\t\"16011996\",\n\t\t\"16011995\",\n\t\t\"15111983\",\n\t\t\"15111979\",\n\t\t\"15091991\",\n\t\t\"15081982\",\n\t\t\"15071978\",\n\t\t\"15061982\",\n\t\t\"15021994\",\n\t\t\"15021979\",\n\t\t\"15021977\",\n\t\t\"15021976\",\n\t\t\"14081980\",\n\t\t\"14081977\",\n\t\t\"14061994\",\n\t\t\"14041980\",\n\t\t\"14031992\",\n\t\t\"14021976\",\n\t\t\"14011974\",\n\t\t\"13121975\",\n\t\t\"13111978\",\n\t\t\"13091976\",\n\t\t\"13081976\",\n\t\t\"13061995\",\n\t\t\"13061993\",\n\t\t\"13061978\",\n\t\t\"13051980\",\n\t\t\"13041994\",\n\t\t\"13011975\",\n\t\t\"1234567u\",\n\t\t\"123456789qwerty\",\n\t\t\"123456789n\",\n\t\t\"123321qwe\",\n\t\t\"12233445\",\n\t\t\"12091993\",\n\t\t\"12091979\",\n\t\t\"12081996\",\n\t\t\"12071995\",\n\t\t\"12051976\",\n\t\t\"12021996\",\n\t\t\"111111111111\",\n\t\t\"11091996\",\n\t\t\"11091979\",\n\t\t\"11061975\",\n\t\t\"11051992\",\n\t\t\"11041975\",\n\t\t\"11011993\",\n\t\t\"10121975\",\n\t\t\"10101970\",\n\t\t\"10091975\",\n\t\t\"10071978\",\n\t\t\"10051982\",\n\t\t\"10051980\",\n\t\t\"10041994\",\n\t\t\"10031995\",\n\t\t\"10031982\",\n\t\t\"10021973\",\n\t\t\"09071993\",\n\t\t\"09071976\",\n\t\t\"09061979\",\n\t\t\"09061975\",\n\t\t\"09061972\",\n\t\t\"09051977\",\n\t\t\"09031982\",\n\t\t\"08154711\",\n\t\t\"08111989\",\n\t\t\"08111979\",\n\t\t\"08101982\",\n\t\t\"08091977\",\n\t\t\"08071980\",\n\t\t\"08061977\",\n\t\t\"08051988\",\n\t\t\"08051977\",\n\t\t\"08041993\",\n\t\t\"08041977\",\n\t\t\"08031984\",\n\t\t\"08031973\",\n\t\t\"08021987\",\n\t\t\"08021976\",\n\t\t\"08011981\",\n\t\t\"07121980\",\n\t\t\"07111983\",\n\t\t\"07111978\",\n\t\t\"07051977\",\n\t\t\"07031996\",\n\t\t\"07031983\",\n\t\t\"07011994\",\n\t\t\"06121990\",\n\t\t\"06111993\",\n\t\t\"06101993\",\n\t\t\"06101990\",\n\t\t\"06101983\",\n\t\t\"06101978\",\n\t\t\"06091992\",\n\t\t\"06091976\",\n\t\t\"06081977\",\n\t\t\"06071979\",\n\t\t\"06061977\",\n\t\t\"06051975\",\n\t\t\"06031980\",\n\t\t\"06021991\",\n\t\t\"05121978\",\n\t\t\"05091982\",\n\t\t\"05091981\",\n\t\t\"05081993\",\n\t\t\"05081990\",\n\t\t\"05011991\",\n\t\t\"05011979\",\n\t\t\"04091988\",\n\t\t\"04091984\",\n\t\t\"04091983\",\n\t\t\"04091978\",\n\t\t\"04081988\",\n\t\t\"04081980\",\n\t\t\"04061975\",\n\t\t\"03121993\",\n\t\t\"03121992\",\n\t\t\"03091995\",\n\t\t\"03091994\",\n\t\t\"03081981\",\n\t\t\"03081977\",\n\t\t\"03081975\",\n\t\t\"03051992\",\n\t\t\"02121982\",\n\t\t\"02121977\",\n\t\t\"02111980\",\n\t\t\"02111978\",\n\t\t\"02101992\",\n\t\t\"02081992\",\n\t\t\"02051996\",\n\t\t\"01121994\",\n\t\t\"01091995\",\n\t\t\"01091981\",\n\t\t\"01071976\",\n\t\t\"01051975\",\n\t\t\"01031977\",\n\t\t\"01021979\",\n\t\t\"01021974\",\n\t\t\"01011959\",\n\t\t\"zzzzzzzzzz\",\n\t\t\"zaq1xsw2cde3\",\n\t\t\"westham1\",\n\t\t\"westcoast\",\n\t\t\"weedweed\",\n\t\t\"wargames\",\n\t\t\"w1w2w3w4\",\n\t\t\"voltaire\",\n\t\t\"venezuel\",\n\t\t\"titlover\",\n\t\t\"thorsten\",\n\t\t\"thinkpad\",\n\t\t\"thetachi\",\n\t\t\"thejoker\",\n\t\t\"televizor\",\n\t\t\"tazdevil\",\n\t\t\"sweethea\",\n\t\t\"summer12\",\n\t\t\"stroller\",\n\t\t\"stinger1\",\n\t\t\"steelhea\",\n\t\t\"southsid\",\n\t\t\"sonnyboy\",\n\t\t\"smallville\",\n\t\t\"slimed123\",\n\t\t\"shipping\",\n\t\t\"save13tx\",\n\t\t\"ryanryan\",\n\t\t\"ruthless\",\n\t\t\"rocketman\",\n\t\t\"robinhoo\",\n\t\t\"repytwjdf\",\n\t\t\"redhead1\",\n\t\t\"reaction\",\n\t\t\"ranchero\",\n\t\t\"Qq123456\",\n\t\t\"pussylicker\",\n\t\t\"psychnaut1\",\n\t\t\"prospero\",\n\t\t\"primetim\",\n\t\t\"prettygirl\",\n\t\t\"porn4life\",\n\t\t\"playoffs\",\n\t\t\"pizzapie\",\n\t\t\"pheasant\",\n\t\t\"peter123\",\n\t\t\"olgaolga\",\n\t\t\"october1\",\n\t\t\"oc247ngUcZ\",\n\t\t\"nonsense\",\n\t\t\"nokia5300\",\n\t\t\"nokia3250\",\n\t\t\"nighthaw\",\n\t\t\"newworld\",\n\t\t\"nacional\",\n\t\t\"mustang3\",\n\t\t\"mostwanted\",\n\t\t\"mosquito\",\n\t\t\"moonmoon\",\n\t\t\"monique1\",\n\t\t\"miranda1\",\n\t\t\"minotaur\",\n\t\t\"Michigan\",\n\t\t\"michael8\",\n\t\t\"metalica\",\n\t\t\"medicina\",\n\t\t\"mavericks\",\n\t\t\"Marshall\",\n\t\t\"margosha\",\n\t\t\"lindsey1\",\n\t\t\"lavender\",\n\t\t\"laracrof\",\n\t\t\"lapdance\",\n\t\t\"ladygaga\",\n\t\t\"kochanie\",\n\t\t\"kochamcie\",\n\t\t\"knockout\",\n\t\t\"killemall\",\n\t\t\"karamelka\",\n\t\t\"jerusalem\",\n\t\t\"jedimast\",\n\t\t\"iwantsex\",\n\t\t\"isacs155\",\n\t\t\"ironmaid\",\n\t\t\"interpol\",\n\t\t\"internat\",\n\t\t\"inflames\",\n\t\t\"indahous\",\n\t\t\"hornyboy\",\n\t\t\"hondacivic\",\n\t\t\"hellokit\",\n\t\t\"hannover\",\n\t\t\"handcuff\",\n\t\t\"hallmark\",\n\t\t\"halfmoon\",\n\t\t\"gremlins\",\n\t\t\"ganjubas\",\n\t\t\"galadriel\",\n\t\t\"galactic\",\n\t\t\"frontera\",\n\t\t\"freiheit\",\n\t\t\"francis1\",\n\t\t\"faulkner\",\n\t\t\"fatluvr69\",\n\t\t\"fantastic\",\n\t\t\"evgeniya\",\n\t\t\"epaulson\",\n\t\t\"edwardss\",\n\t\t\"ducati99\",\n\t\t\"dkflbvbhjdyf\",\n\t\t\"dickface\",\n\t\t\"danielit\",\n\t\t\"crossbow\",\n\t\t\"chimchim\",\n\t\t\"champagn\",\n\t\t\"camaroz2\",\n\t\t\"bugsbunny\",\n\t\t\"bluegill\",\n\t\t\"blondie1\",\n\t\t\"blingbling\",\n\t\t\"blastoff\",\n\t\t\"biggdogg\",\n\t\t\"behemoth\",\n\t\t\"bareback\",\n\t\t\"badlands\",\n\t\t\"backspac\",\n\t\t\"Babylon5\",\n\t\t\"asd12345\",\n\t\t\"arsehole\",\n\t\t\"argonaut\",\n\t\t\"antoshka\",\n\t\t\"antonio1\",\n\t\t\"allstars\",\n\t\t\"alexandria\",\n\t\t\"account1\",\n\t\t\"987412365\",\n\t\t\"96969696\",\n\t\t\"748159263\",\n\t\t\"326159487\",\n\t\t\"31313131\",\n\t\t\"31121993\",\n\t\t\"31121981\",\n\t\t\"31101979\",\n\t\t\"31081980\",\n\t\t\"31051980\",\n\t\t\"31031993\",\n\t\t\"31031991\",\n\t\t\"30121979\",\n\t\t\"30121978\",\n\t\t\"30101975\",\n\t\t\"30091980\",\n\t\t\"30081978\",\n\t\t\"30071977\",\n\t\t\"30061994\",\n\t\t\"30061976\",\n\t\t\"30051995\",\n\t\t\"30041977\",\n\t\t\"30031994\",\n\t\t\"30011995\",\n\t\t\"29121983\",\n\t\t\"29121979\",\n\t\t\"29101987\",\n\t\t\"29101979\",\n\t\t\"29101976\",\n\t\t\"29081994\",\n\t\t\"29031979\",\n\t\t\"29031976\",\n\t\t\"28121977\",\n\t}\n\n\tret := make(map[string]struct{})\n\tfor _, v := range bannedPasswordsList {\n\t\tret[v] = struct{}{}\n\t}\n\n\treturn ret\n}\n"
  },
  {
    "path": "pkg/utils/slice_compare.go",
    "content": "// nolint: revive\npackage utils\n\nfunc Includes[T comparable](arr []T, against T) bool {\n\tfor _, v := range arr {\n\t\tif v == against {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc SliceCompare[T comparable](subject []T, against []T) (added []T, missing []T) {\n\tfor _, v := range subject {\n\t\tif !Includes(against, v) && !Includes(added, v) {\n\t\t\tadded = append(added, v)\n\t\t}\n\t}\n\n\tfor _, v := range against {\n\t\tif !Includes(subject, v) && !Includes(missing, v) {\n\t\t\tmissing = append(missing, v)\n\t\t}\n\t}\n\n\treturn\n}\n"
  },
  {
    "path": "pkg/utils/slice_compare_test.go",
    "content": "// nolint: revive\npackage utils\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n)\n\ntype strSliceTest struct {\n\tsubject         []string\n\tagainst         []string\n\texpectedAdded   []string\n\texpectedMissing []string\n}\n\nvar strSliceTests = []strSliceTest{\n\t{[]string{\"a\"}, []string{\"b\"}, []string{\"a\"}, []string{\"b\"}},\n\t{[]string{\"a\", \"b\"}, []string{\"b\"}, []string{\"a\"}, nil},\n\t{[]string{\"a\"}, []string{\"a\", \"b\"}, nil, []string{\"b\"}},\n\t{[]string{\"a\"}, nil, []string{\"a\"}, nil},\n\t{[]string{\"a\"}, []string{}, []string{\"a\"}, nil},\n\t{nil, []string{\"b\"}, nil, []string{\"b\"}},\n\t{[]string{}, []string{\"b\"}, nil, []string{\"b\"}},\n\t{[]string{\"a\", \"a\"}, []string{\"b\", \"b\"}, []string{\"a\"}, []string{\"b\"}},\n\t{[]string{\"a\"}, []string{\"a\"}, nil, nil},\n}\n\nfunc TestStrSliceCompare(t *testing.T) {\n\tfor _, test := range strSliceTests {\n\t\tadded, missing := SliceCompare(test.subject, test.against)\n\n\t\tif !reflect.DeepEqual(added, test.expectedAdded) {\n\t\t\tt.Errorf(\"added(%v,%v) = %v; want %v\", test.subject, test.against, added, test.expectedAdded)\n\t\t}\n\n\t\tif !reflect.DeepEqual(missing, test.expectedMissing) {\n\t\t\tt.Errorf(\"missing(%v,%v) = %v; want %v\", test.subject, test.against, missing, test.expectedMissing)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "scripts/getDate.go",
    "content": "//go:build ignore\n\npackage main\n\nimport \"fmt\"\nimport \"time\"\n\nfunc main() {\n\tnow := time.Now().Format(\"2006-01-02 15:04:05\")\n\n\tfmt.Printf(\"%s\", now)\n}\n"
  },
  {
    "path": "sqlc.yaml",
    "content": "version: \"2\"\nsql:\n  - engine: \"postgresql\"\n    schema: \"internal/database/migrations/postgres\"\n    queries: \"internal/queries/sql\"\n    gen:\n      go:\n        package: \"queries\"\n        out: \"internal/queries\"\n        sql_package: \"pgx/v5\"\n        emit_json_tags: true\n        emit_db_tags: true\n        emit_interface: true\n        emit_prepared_queries: false\n        emit_exact_table_names: false\n        emit_empty_slices: true\n        overrides:\n        - db_type: \"uuid\"\n          go_type: \"github.com/gofrs/uuid.UUID\"\n        - db_type: \"uuid\"\n          go_type: \"github.com/gofrs/uuid.NullUUID\"\n          nullable: true\n        - db_type: \"text\"\n          go_type: \"string\"\n        - db_type: \"pg_catalog.varchar\"\n          go_type: \"string\"\n        - db_type: \"text\"\n          nullable: true\n          go_type:\n            type: \"string\"\n            pointer: true\n        - db_type: \"pg_catalog.varchar\"\n          nullable: true\n          go_type:\n            type: \"string\"\n            pointer: true\n        - db_type: \"pg_catalog.int4\"\n          go_type: \"int\"\n        - db_type: \"serial\"\n          go_type: \"int\"\n        - db_type: \"serial\"\n          go_type: \"int\"\n        - db_type: \"pg_catalog.timestamp\"\n          go_type: \"time.Time\"\n        - db_type: \"pg_catalog.timestamp\"\n          nullable: true\n          go_type:\n            type: \"time.Time\"\n            pointer: true\n        - db_type: \"pg_catalog.int4\"\n          nullable: true\n          go_type:\n            type: \"int\"\n            pointer: true\n        - db_type: \"jsonb\"\n          go_type: \"encoding/json.RawMessage\"\n        - column: \"performers.gender\"\n          go_type: \"*github.com/stashapp/stash-box/internal/models.GenderEnum\"\n        - column: \"performers.ethnicity\"\n          go_type: \"*github.com/stashapp/stash-box/internal/models.EthnicityEnum\"\n        - column: \"performers.eye_color\"\n          go_type: \"*github.com/stashapp/stash-box/internal/models.EyeColorEnum\"\n        - column: \"performers.hair_color\"\n          go_type: \"*github.com/stashapp/stash-box/internal/models.HairColorEnum\"\n        - column: \"performers.breast_type\"\n          go_type: \"*github.com/stashapp/stash-box/internal/models.BreastTypeEnum\"\n"
  }
]