gitextract_b1wrjbeg/ ├── .gitignore ├── LICENSE ├── README.md ├── apps/ │ ├── api/ │ │ ├── .dockerignore │ │ ├── .gitignore │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── drizzle/ │ │ │ └── migrations/ │ │ │ ├── 0000_oval_outlaw_kid.sql │ │ │ ├── 0001_busy_warstar.sql │ │ │ ├── 0002_regular_doctor_faustus.sql │ │ │ ├── 0003_superb_betty_brant.sql │ │ │ ├── 0004_simple_komodo.sql │ │ │ ├── 0005_mighty_hiroim.sql │ │ │ ├── 0006_icy_black_bird.sql │ │ │ ├── 0007_panoramic_tomorrow_man.sql │ │ │ └── meta/ │ │ │ ├── 0000_snapshot.json │ │ │ ├── 0001_snapshot.json │ │ │ ├── 0002_snapshot.json │ │ │ ├── 0003_snapshot.json │ │ │ ├── 0004_snapshot.json │ │ │ ├── 0005_snapshot.json │ │ │ ├── 0006_snapshot.json │ │ │ ├── 0007_snapshot.json │ │ │ └── _journal.json │ │ ├── drizzle.config.ts │ │ ├── fly.toml │ │ ├── package.json │ │ ├── src/ │ │ │ ├── db/ │ │ │ │ ├── dbActions.ts │ │ │ │ ├── index.ts │ │ │ │ └── schema.ts │ │ │ ├── index.ts │ │ │ ├── lib/ │ │ │ │ ├── cache.ts │ │ │ │ ├── errors.ts │ │ │ │ ├── hono.ts │ │ │ │ ├── posthog.ts │ │ │ │ └── ratelimit.ts │ │ │ ├── routes/ │ │ │ │ └── desktop.ts │ │ │ └── schema/ │ │ │ ├── desktop.ts │ │ │ ├── errors.ts │ │ │ └── gateway.ts │ │ └── tsconfig.json │ ├── docs/ │ │ ├── .gitignore │ │ ├── .map.ts │ │ ├── README.md │ │ ├── app/ │ │ │ ├── api/ │ │ │ │ └── search/ │ │ │ │ └── route.ts │ │ │ ├── docs/ │ │ │ │ ├── [[...slug]]/ │ │ │ │ │ └── page.tsx │ │ │ │ └── layout.tsx │ │ │ ├── global.css │ │ │ ├── layout.config.tsx │ │ │ ├── layout.tsx │ │ │ ├── page.tsx │ │ │ └── source.ts │ │ ├── content/ │ │ │ └── docs/ │ │ │ ├── api-reference.mdx │ │ │ ├── conceptual-guide.mdx │ │ │ ├── index.mdx │ │ │ ├── introduction.mdx │ │ │ ├── meta.json │ │ │ ├── quickstart.mdx │ │ │ └── tutorials.mdx │ │ ├── mdx-components.tsx │ │ ├── next-env.d.ts │ │ ├── next.config.mjs │ │ ├── package.json │ │ ├── postcss.config.js │ │ ├── scripts/ │ │ │ └── generate-docs.mjs │ │ ├── tailwind.config.js │ │ └── tsconfig.json │ └── web/ │ ├── .eslintrc.json │ ├── .gitignore │ ├── LICENSE.md │ ├── README.md │ ├── components.json │ ├── config.ts │ ├── middleware.ts │ ├── next.config.mjs │ ├── package.json │ ├── postcss.config.js │ ├── prettier.config.js │ ├── radiant/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── sanity.cli.ts │ │ ├── sanity.config.ts │ │ ├── schemaTypes/ │ │ │ └── index.ts │ │ ├── static/ │ │ │ └── .gitkeep │ │ └── tsconfig.json │ ├── sanity-typegen.json │ ├── sanity.cli.ts │ ├── sanity.config.ts │ ├── src/ │ │ ├── app/ │ │ │ ├── api/ │ │ │ │ ├── playground/ │ │ │ │ │ ├── chat/ │ │ │ │ │ │ └── route.ts │ │ │ │ │ └── kill-desktop/ │ │ │ │ │ └── route.ts │ │ │ │ ├── stripe/ │ │ │ │ │ ├── checkout/ │ │ │ │ │ │ └── route.ts │ │ │ │ │ ├── portal/ │ │ │ │ │ │ └── route.ts │ │ │ │ │ └── webhook/ │ │ │ │ │ └── route.ts │ │ │ │ └── unkey/ │ │ │ │ └── route.ts │ │ │ ├── auth/ │ │ │ │ └── callback/ │ │ │ │ └── route.ts │ │ │ ├── blog/ │ │ │ │ ├── [slug]/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── feed.xml/ │ │ │ │ │ └── route.ts │ │ │ │ └── page.tsx │ │ │ ├── company/ │ │ │ │ └── page.tsx │ │ │ ├── dashboard/ │ │ │ │ ├── dashboard-content.tsx │ │ │ │ └── page.tsx │ │ │ ├── demo/ │ │ │ │ └── page.tsx │ │ │ ├── layout.tsx │ │ │ ├── login/ │ │ │ │ ├── login-form.d.ts │ │ │ │ ├── login-form.tsx │ │ │ │ └── page.tsx │ │ │ ├── page.tsx │ │ │ ├── playground/ │ │ │ │ └── page.tsx │ │ │ ├── pricing/ │ │ │ │ └── page.tsx │ │ │ ├── privacy/ │ │ │ │ └── page.tsx │ │ │ ├── studio/ │ │ │ │ └── [[...tool]]/ │ │ │ │ └── page.tsx │ │ │ └── terms/ │ │ │ └── page.tsx │ │ ├── components/ │ │ │ ├── LogoText.tsx │ │ │ ├── PostHogProvider.tsx │ │ │ ├── animated-number.tsx │ │ │ ├── bento-card.tsx │ │ │ ├── bento-section.tsx │ │ │ ├── button.tsx │ │ │ ├── container.tsx │ │ │ ├── dark-bento-section.tsx │ │ │ ├── dashboard/ │ │ │ │ ├── api-key-manager.tsx │ │ │ │ ├── api-key-section.tsx │ │ │ │ ├── dashboard-layout.tsx │ │ │ │ ├── desktop-sidebar.tsx │ │ │ │ ├── faq-section.tsx │ │ │ │ ├── mobile-header.tsx │ │ │ │ ├── mobile-sidebar.tsx │ │ │ │ ├── sidebar-navigation.tsx │ │ │ │ ├── subscription-section.tsx │ │ │ │ └── vm-instances-manager.tsx │ │ │ ├── demo-section.tsx │ │ │ ├── feature-section.tsx │ │ │ ├── footer.tsx │ │ │ ├── gradient.tsx │ │ │ ├── hero.tsx │ │ │ ├── keyboard.tsx │ │ │ ├── link.tsx │ │ │ ├── linked-avatars.tsx │ │ │ ├── logo-cloud.tsx │ │ │ ├── logo-cluster.tsx │ │ │ ├── logo-timeline.tsx │ │ │ ├── logo.tsx │ │ │ ├── map.tsx │ │ │ ├── markdown-text.tsx │ │ │ ├── navbar.tsx │ │ │ ├── playground/ │ │ │ │ ├── chat-error.tsx │ │ │ │ ├── icons.tsx │ │ │ │ ├── input.tsx │ │ │ │ ├── markdown.tsx │ │ │ │ ├── message.tsx │ │ │ │ ├── project-info.tsx │ │ │ │ └── prompt-suggestions.tsx │ │ │ ├── plus-grid.tsx │ │ │ ├── screenshot.tsx │ │ │ ├── shared/ │ │ │ │ └── app-logo.tsx │ │ │ ├── stripe/ │ │ │ │ ├── checkout-button.tsx │ │ │ │ ├── client-pricing-card.tsx │ │ │ │ ├── client-pricing-cards.tsx │ │ │ │ ├── payment-success.tsx │ │ │ │ └── subscription-management.tsx │ │ │ ├── testimonials.tsx │ │ │ ├── text.tsx │ │ │ ├── thread-list.tsx │ │ │ ├── thread.tsx │ │ │ ├── tooltip-icon-button.tsx │ │ │ ├── ui/ │ │ │ │ ├── button.tsx │ │ │ │ ├── input.tsx │ │ │ │ ├── resizable.tsx │ │ │ │ ├── sonner.tsx │ │ │ │ └── tooltip.tsx │ │ │ └── yc-banner.tsx │ │ ├── sanity/ │ │ │ ├── client.ts │ │ │ ├── env.ts │ │ │ ├── image.ts │ │ │ ├── queries.ts │ │ │ ├── schema.ts │ │ │ ├── types/ │ │ │ │ ├── author.ts │ │ │ │ ├── block-content.ts │ │ │ │ ├── category.ts │ │ │ │ └── post.ts │ │ │ └── types.ts │ │ ├── styles/ │ │ │ └── tailwind.css │ │ ├── types/ │ │ │ └── database.ts │ │ └── utils/ │ │ ├── misc-utils.ts │ │ ├── playground/ │ │ │ ├── cyberdesk-client.ts │ │ │ ├── misc-demo-utils.ts │ │ │ ├── server-actions.ts │ │ │ ├── tools.ts │ │ │ └── use-scroll-to-bottom.ts │ │ ├── posthog/ │ │ │ └── posthog.ts │ │ ├── stripe/ │ │ │ ├── stripe-server.ts │ │ │ ├── stripe.ts │ │ │ └── tiers.ts │ │ └── supabase/ │ │ ├── client.ts │ │ ├── middleware.ts │ │ ├── server.ts │ │ ├── supabaseClient.js │ │ └── supabaseServerClient.ts │ └── tsconfig.json ├── cyberdesk-architecture.md ├── infra/ │ ├── README.md │ ├── kubernetes/ │ │ ├── azure-snapshot-class.yaml │ │ ├── cdi-cr.yaml │ │ ├── cdi-operator.yaml │ │ ├── cluster-issuer.yaml │ │ ├── cyberdesk-cr-v2.yaml │ │ ├── cyberdesk-cr.yaml │ │ ├── cyberdesk-operator.yaml │ │ ├── default-backend.yaml │ │ ├── gateway-deploy.yaml │ │ ├── gateway-ingress-dev.yaml │ │ ├── gateway-ingress-prod.yaml │ │ ├── golden-vm-snapshot-request.yaml │ │ ├── kubevirt-cr.yaml │ │ ├── kubevirt-operator.yaml │ │ ├── readme-todo.txt │ │ ├── start-cyberdesk-operator-cr.yaml │ │ └── warm-pool.yaml │ └── terraform/ │ ├── .terraform.lock.hcl │ ├── main.tf │ └── variables.tf ├── sdks/ │ ├── openapi.json │ ├── py-sdk/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── cyberdesk/ │ │ │ ├── __init__.py │ │ │ ├── actions.py │ │ │ ├── client.py │ │ │ └── types.py │ │ ├── openapi_client/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── api_reference_client/ │ │ │ │ ├── __init__.py │ │ │ │ ├── api/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── desktop/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── get_v1_desktop_id.py │ │ │ │ │ ├── post_v1_desktop.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action.py │ │ │ │ │ └── post_v1_desktop_id_stop.py │ │ │ │ ├── client.py │ │ │ │ ├── errors.py │ │ │ │ ├── models/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── get_v1_desktop_id_response_200.py │ │ │ │ │ ├── get_v1_desktop_id_response_200_status.py │ │ │ │ │ ├── get_v1_desktop_id_response_400.py │ │ │ │ │ ├── get_v1_desktop_id_response_400_status.py │ │ │ │ │ ├── get_v1_desktop_id_response_401.py │ │ │ │ │ ├── get_v1_desktop_id_response_401_status.py │ │ │ │ │ ├── get_v1_desktop_id_response_403.py │ │ │ │ │ ├── get_v1_desktop_id_response_403_status.py │ │ │ │ │ ├── get_v1_desktop_id_response_404.py │ │ │ │ │ ├── get_v1_desktop_id_response_404_status.py │ │ │ │ │ ├── get_v1_desktop_id_response_409.py │ │ │ │ │ ├── get_v1_desktop_id_response_409_status.py │ │ │ │ │ ├── get_v1_desktop_id_response_429.py │ │ │ │ │ ├── get_v1_desktop_id_response_429_status.py │ │ │ │ │ ├── get_v1_desktop_id_response_500.py │ │ │ │ │ ├── get_v1_desktop_id_response_500_status.py │ │ │ │ │ ├── get_v1_desktop_id_response_502.py │ │ │ │ │ ├── get_v1_desktop_id_response_502_status.py │ │ │ │ │ ├── post_v1_desktop_body.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_body.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_200.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_400.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_400_status.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_401.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_401_status.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_403.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_403_status.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_404.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_404_status.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_409.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_409_status.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_429.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_429_status.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_500.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_500_status.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_502.py │ │ │ │ │ ├── post_v1_desktop_id_bash_action_response_502_status.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_click_mouse_action.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_click_mouse_action_button.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_click_mouse_action_click_type.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_click_mouse_action_type.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_drag_mouse_action.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_drag_mouse_action_end.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_drag_mouse_action_start.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_drag_mouse_action_type.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_get_cursor_position_action.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_get_cursor_position_action_type.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_move_mouse_action.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_move_mouse_action_type.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_press_keys_action.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_press_keys_action_key_action_type.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_press_keys_action_type.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_200.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_400.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_400_status.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_401.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_401_status.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_403.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_403_status.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_404.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_404_status.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_409.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_409_status.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_429.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_429_status.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_500.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_500_status.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_502.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_response_502_status.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_screenshot_action.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_screenshot_action_type.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_scroll_action.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_scroll_action_direction.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_scroll_action_type.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_type_text_action.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_type_text_action_type.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_wait_action.py │ │ │ │ │ ├── post_v1_desktop_id_computer_action_wait_action_type.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_200.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_200_status.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_400.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_400_status.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_401.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_401_status.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_403.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_403_status.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_404.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_404_status.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_409.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_409_status.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_429.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_429_status.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_500.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_500_status.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_502.py │ │ │ │ │ ├── post_v1_desktop_id_stop_response_502_status.py │ │ │ │ │ ├── post_v1_desktop_response_200.py │ │ │ │ │ ├── post_v1_desktop_response_200_status.py │ │ │ │ │ ├── post_v1_desktop_response_400.py │ │ │ │ │ ├── post_v1_desktop_response_400_status.py │ │ │ │ │ ├── post_v1_desktop_response_401.py │ │ │ │ │ ├── post_v1_desktop_response_401_status.py │ │ │ │ │ ├── post_v1_desktop_response_403.py │ │ │ │ │ ├── post_v1_desktop_response_403_status.py │ │ │ │ │ ├── post_v1_desktop_response_404.py │ │ │ │ │ ├── post_v1_desktop_response_404_status.py │ │ │ │ │ ├── post_v1_desktop_response_409.py │ │ │ │ │ ├── post_v1_desktop_response_409_status.py │ │ │ │ │ ├── post_v1_desktop_response_429.py │ │ │ │ │ ├── post_v1_desktop_response_429_status.py │ │ │ │ │ ├── post_v1_desktop_response_500.py │ │ │ │ │ ├── post_v1_desktop_response_500_status.py │ │ │ │ │ ├── post_v1_desktop_response_502.py │ │ │ │ │ └── post_v1_desktop_response_502_status.py │ │ │ │ ├── py.typed │ │ │ │ └── types.py │ │ │ └── pyproject.toml │ │ ├── pyproject.toml │ │ └── scripts/ │ │ └── generate.py │ ├── sandbox/ │ │ └── py-sdk/ │ │ ├── .gitignore │ │ ├── README.md │ │ └── test_sdk.py │ └── ts-sdk/ │ ├── .gitignore │ ├── LICENSE │ ├── README.md │ ├── openapi-ts.config.ts │ ├── package.json │ ├── src/ │ │ ├── client/ │ │ │ ├── client.gen.ts │ │ │ ├── index.ts │ │ │ ├── sdk.gen.ts │ │ │ └── types.gen.ts │ │ └── index.ts │ └── tsconfig.json ├── self-host.md └── services/ ├── cyberdesk-operator/ │ ├── .gitignore │ ├── Dockerfile │ ├── README.md │ ├── checklist.md │ ├── docs/ │ │ └── troubleshooting.md │ ├── handlers/ │ │ └── controller.py │ ├── requirements.txt │ └── tests/ │ ├── README.md │ ├── test-cyberdesk-cr.yaml │ ├── test-start-operator-cr.yaml │ ├── test-start-operator-crd.yaml │ └── test.py └── gateway/ ├── Dockerfile ├── README.md ├── main.py ├── noVNC/ │ ├── .github/ │ │ ├── ISSUE_TEMPLATE/ │ │ │ ├── bug_report.md │ │ │ ├── config.yml │ │ │ └── feature_request.md │ │ └── workflows/ │ │ ├── deploy.yml │ │ ├── lint.yml │ │ ├── test.yml │ │ └── translate.yml │ ├── .gitignore │ ├── .gitmodules │ ├── AUTHORS │ ├── LICENSE.txt │ ├── README.md │ ├── app/ │ │ ├── error-handler.js │ │ ├── images/ │ │ │ └── icons/ │ │ │ └── Makefile │ │ ├── locale/ │ │ │ ├── README │ │ │ ├── cs.json │ │ │ ├── de.json │ │ │ ├── el.json │ │ │ ├── es.json │ │ │ ├── fr.json │ │ │ ├── it.json │ │ │ ├── ja.json │ │ │ ├── ko.json │ │ │ ├── nl.json │ │ │ ├── pl.json │ │ │ ├── pt_BR.json │ │ │ ├── ru.json │ │ │ ├── sv.json │ │ │ ├── tr.json │ │ │ ├── zh_CN.json │ │ │ └── zh_TW.json │ │ ├── localization.js │ │ ├── sounds/ │ │ │ ├── CREDITS │ │ │ └── bell.oga │ │ ├── styles/ │ │ │ ├── base.css │ │ │ ├── constants.css │ │ │ └── input.css │ │ ├── ui.js │ │ └── webutil.js │ ├── core/ │ │ ├── base64.js │ │ ├── crypto/ │ │ │ ├── aes.js │ │ │ ├── bigint.js │ │ │ ├── crypto.js │ │ │ ├── des.js │ │ │ ├── dh.js │ │ │ ├── md5.js │ │ │ └── rsa.js │ │ ├── decoders/ │ │ │ ├── copyrect.js │ │ │ ├── h264.js │ │ │ ├── hextile.js │ │ │ ├── jpeg.js │ │ │ ├── raw.js │ │ │ ├── rre.js │ │ │ ├── tight.js │ │ │ ├── tightpng.js │ │ │ ├── zlib.js │ │ │ └── zrle.js │ │ ├── deflator.js │ │ ├── display.js │ │ ├── encodings.js │ │ ├── inflator.js │ │ ├── input/ │ │ │ ├── domkeytable.js │ │ │ ├── fixedkeys.js │ │ │ ├── gesturehandler.js │ │ │ ├── keyboard.js │ │ │ ├── keysym.js │ │ │ ├── keysymdef.js │ │ │ ├── util.js │ │ │ ├── vkeys.js │ │ │ └── xtscancodes.js │ │ ├── ra2.js │ │ ├── rfb.js │ │ ├── util/ │ │ │ ├── browser.js │ │ │ ├── cursor.js │ │ │ ├── element.js │ │ │ ├── events.js │ │ │ ├── eventtarget.js │ │ │ ├── int.js │ │ │ ├── logging.js │ │ │ └── strings.js │ │ └── websock.js │ ├── defaults.json │ ├── docs/ │ │ ├── API-internal.md │ │ ├── API.md │ │ ├── EMBEDDING.md │ │ ├── LIBRARY.md │ │ ├── LICENSE.BSD-2-Clause │ │ ├── LICENSE.BSD-3-Clause │ │ ├── LICENSE.MPL-2.0 │ │ ├── LICENSE.OFL-1.1 │ │ ├── flash_policy.txt │ │ ├── links │ │ ├── notes │ │ ├── novnc_proxy.1 │ │ └── rfb_notes │ ├── eslint.config.mjs │ ├── karma.conf.js │ ├── mandatory.json │ ├── package.json │ ├── po/ │ │ ├── Makefile │ │ ├── cs.po │ │ ├── de.po │ │ ├── el.po │ │ ├── es.po │ │ ├── fr.po │ │ ├── it.po │ │ ├── ja.po │ │ ├── ko.po │ │ ├── nl.po │ │ ├── noVNC.pot │ │ ├── pl.po │ │ ├── po2js │ │ ├── pt_BR.po │ │ ├── ru.po │ │ ├── sv.po │ │ ├── tr.po │ │ ├── xgettext-html │ │ ├── zh_CN.po │ │ └── zh_TW.po │ ├── snap/ │ │ ├── hooks/ │ │ │ └── configure │ │ ├── local/ │ │ │ └── svc_wrapper.sh │ │ └── snapcraft.yaml │ ├── tests/ │ │ ├── assertions.js │ │ ├── fake.websocket.js │ │ ├── playback-ui.js │ │ ├── playback.js │ │ ├── test.base64.js │ │ ├── test.browser.js │ │ ├── test.copyrect.js │ │ ├── test.deflator.js │ │ ├── test.display.js │ │ ├── test.gesturehandler.js │ │ ├── test.h264.js │ │ ├── test.helper.js │ │ ├── test.hextile.js │ │ ├── test.inflator.js │ │ ├── test.int.js │ │ ├── test.jpeg.js │ │ ├── test.keyboard.js │ │ ├── test.localization.js │ │ ├── test.raw.js │ │ ├── test.rfb.js │ │ ├── test.rre.js │ │ ├── test.tight.js │ │ ├── test.tightpng.js │ │ ├── test.util.js │ │ ├── test.websock.js │ │ ├── test.webutil.js │ │ ├── test.zlib.js │ │ ├── test.zrle.js │ │ └── vnc_playback.html │ ├── utils/ │ │ ├── README.md │ │ ├── b64-to-binary.pl │ │ ├── convert.js │ │ ├── genkeysymdef.js │ │ ├── novnc_proxy │ │ ├── u2x11 │ │ └── validate │ ├── vendor/ │ │ └── pako/ │ │ ├── LICENSE │ │ ├── README.md │ │ └── lib/ │ │ ├── utils/ │ │ │ └── common.js │ │ └── zlib/ │ │ ├── adler32.js │ │ ├── constants.js │ │ ├── crc32.js │ │ ├── deflate.js │ │ ├── gzheader.js │ │ ├── inffast.js │ │ ├── inflate.js │ │ ├── inftrees.js │ │ ├── messages.js │ │ ├── trees.js │ │ └── zstream.js │ ├── vnc.html │ └── vnc_lite.html └── requirements.txt