Full Code of noisetorch/NoiseTorch for AI

master 6d895f35d32a cached
1169 files
15.6 MB
4.2M tokens
109558 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (16,591K chars total). Download the full file to get everything.
Repository: noisetorch/NoiseTorch
Branch: master
Commit: 6d895f35d32a
Files: 1169
Total size: 15.6 MB

Directory structure:
gitextract_nepkgb21/

├── .editorconfig
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── build-artifact.yml
│       ├── codeql-analysis.yml
│       ├── flawfinder.yml
│       ├── golangci-lint.yml
│       └── release.yml
├── .gitignore
├── .gitmodules
├── LICENSE
├── Makefile
├── README.md
├── assets/
│   ├── icon/
│   │   └── LICENSE
│   └── noisetorch.desktop
├── c/
│   └── ladspa/
│       ├── .gitignore
│       ├── Makefile
│       ├── export.txt
│       ├── ladspa.h
│       ├── module.c
│       └── utils.h
├── capability.go
├── cli.go
├── config.go
├── go.mod
├── go.sum
├── main.go
├── module.go
├── rlimit.go
├── scripts/
│   ├── embedlicenses.go
│   └── signer.go
├── ui.go
├── untar.go
├── update.go
├── vendor/
│   ├── dmitri.shuralyov.com/
│   │   └── gpu/
│   │       └── mtl/
│   │           ├── LICENSE
│   │           ├── mtl.go
│   │           ├── mtl.h
│   │           └── mtl.m
│   ├── gioui.org/
│   │   ├── LICENSE
│   │   ├── app/
│   │   │   ├── Gio.java
│   │   │   ├── GioActivity.java
│   │   │   ├── GioView.java
│   │   │   ├── app.go
│   │   │   ├── d3d11_windows.go
│   │   │   ├── datadir.go
│   │   │   ├── doc.go
│   │   │   ├── egl_android.go
│   │   │   ├── egl_wayland.go
│   │   │   ├── egl_windows.go
│   │   │   ├── egl_x11.go
│   │   │   ├── framework_ios.h
│   │   │   ├── gl_ios.go
│   │   │   ├── gl_ios.m
│   │   │   ├── gl_js.go
│   │   │   ├── gl_macos.go
│   │   │   ├── gl_macos.m
│   │   │   ├── internal/
│   │   │   │   ├── log/
│   │   │   │   │   ├── log.go
│   │   │   │   │   ├── log_android.go
│   │   │   │   │   ├── log_ios.go
│   │   │   │   │   └── log_windows.go
│   │   │   │   ├── windows/
│   │   │   │   │   └── windows.go
│   │   │   │   └── xkb/
│   │   │   │       └── xkb_unix.go
│   │   │   ├── metal_darwin.go
│   │   │   ├── metal_ios.go
│   │   │   ├── metal_macos.go
│   │   │   ├── os.go
│   │   │   ├── os_android.go
│   │   │   ├── os_darwin.go
│   │   │   ├── os_darwin.m
│   │   │   ├── os_ios.go
│   │   │   ├── os_ios.m
│   │   │   ├── os_js.go
│   │   │   ├── os_macos.go
│   │   │   ├── os_macos.m
│   │   │   ├── os_unix.go
│   │   │   ├── os_wayland.c
│   │   │   ├── os_wayland.go
│   │   │   ├── os_windows.go
│   │   │   ├── os_x11.go
│   │   │   ├── runmain.go
│   │   │   ├── vulkan.go
│   │   │   ├── vulkan_android.go
│   │   │   ├── vulkan_wayland.go
│   │   │   ├── vulkan_x11.go
│   │   │   ├── wayland_text_input.c
│   │   │   ├── wayland_text_input.h
│   │   │   ├── wayland_xdg_decoration.c
│   │   │   ├── wayland_xdg_decoration.h
│   │   │   ├── wayland_xdg_shell.c
│   │   │   ├── wayland_xdg_shell.h
│   │   │   └── window.go
│   │   ├── cpu/
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── abi.h
│   │   │   ├── driver.go
│   │   │   ├── driver_nosupport.go
│   │   │   ├── embed.go
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   ├── init.sh
│   │   │   ├── runtime.c
│   │   │   └── runtime.h
│   │   ├── f32/
│   │   │   ├── affine.go
│   │   │   └── f32.go
│   │   ├── font/
│   │   │   └── opentype/
│   │   │       └── opentype.go
│   │   ├── gesture/
│   │   │   └── gesture.go
│   │   ├── gpu/
│   │   │   ├── api.go
│   │   │   ├── caches.go
│   │   │   ├── clip.go
│   │   │   ├── compute.go
│   │   │   ├── cpu.go
│   │   │   ├── gpu.go
│   │   │   ├── internal/
│   │   │   │   ├── d3d11/
│   │   │   │   │   ├── d3d11.go
│   │   │   │   │   └── d3d11_windows.go
│   │   │   │   ├── driver/
│   │   │   │   │   ├── api.go
│   │   │   │   │   └── driver.go
│   │   │   │   ├── metal/
│   │   │   │   │   ├── metal.go
│   │   │   │   │   └── metal_darwin.go
│   │   │   │   ├── opengl/
│   │   │   │   │   ├── opengl.go
│   │   │   │   │   └── srgb.go
│   │   │   │   └── vulkan/
│   │   │   │       ├── vulkan.go
│   │   │   │       └── vulkan_nosupport.go
│   │   │   ├── pack.go
│   │   │   ├── path.go
│   │   │   └── timer.go
│   │   ├── internal/
│   │   │   ├── byteslice/
│   │   │   │   └── byteslice.go
│   │   │   ├── cocoainit/
│   │   │   │   └── cocoa_darwin.go
│   │   │   ├── d3d11/
│   │   │   │   └── d3d11_windows.go
│   │   │   ├── egl/
│   │   │   │   ├── egl.go
│   │   │   │   ├── egl_unix.go
│   │   │   │   └── egl_windows.go
│   │   │   ├── f32color/
│   │   │   │   └── rgba.go
│   │   │   ├── fling/
│   │   │   │   ├── animation.go
│   │   │   │   └── extrapolation.go
│   │   │   ├── gl/
│   │   │   │   ├── gl.go
│   │   │   │   ├── gl_js.go
│   │   │   │   ├── gl_unix.go
│   │   │   │   ├── gl_windows.go
│   │   │   │   ├── types.go
│   │   │   │   ├── types_js.go
│   │   │   │   └── util.go
│   │   │   ├── ops/
│   │   │   │   ├── ops.go
│   │   │   │   └── reader.go
│   │   │   ├── scene/
│   │   │   │   └── scene.go
│   │   │   ├── stroke/
│   │   │   │   └── stroke.go
│   │   │   └── vk/
│   │   │       ├── vulkan.go
│   │   │       ├── vulkan_android.go
│   │   │       ├── vulkan_wayland.go
│   │   │       └── vulkan_x11.go
│   │   ├── io/
│   │   │   ├── clipboard/
│   │   │   │   └── clipboard.go
│   │   │   ├── event/
│   │   │   │   └── event.go
│   │   │   ├── key/
│   │   │   │   ├── key.go
│   │   │   │   ├── mod.go
│   │   │   │   └── mod_darwin.go
│   │   │   ├── pointer/
│   │   │   │   ├── doc.go
│   │   │   │   └── pointer.go
│   │   │   ├── profile/
│   │   │   │   └── profile.go
│   │   │   ├── router/
│   │   │   │   ├── clipboard.go
│   │   │   │   ├── key.go
│   │   │   │   ├── pointer.go
│   │   │   │   └── router.go
│   │   │   ├── semantic/
│   │   │   │   └── semantic.go
│   │   │   ├── system/
│   │   │   │   └── system.go
│   │   │   └── transfer/
│   │   │       └── transfer.go
│   │   ├── layout/
│   │   │   ├── context.go
│   │   │   ├── doc.go
│   │   │   ├── flex.go
│   │   │   ├── layout.go
│   │   │   ├── list.go
│   │   │   └── stack.go
│   │   ├── op/
│   │   │   ├── clip/
│   │   │   │   ├── clip.go
│   │   │   │   ├── doc.go
│   │   │   │   └── shapes.go
│   │   │   ├── op.go
│   │   │   └── paint/
│   │   │       ├── doc.go
│   │   │       └── paint.go
│   │   ├── shader/
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── gio/
│   │   │   │   ├── blit.frag
│   │   │   │   ├── blit.vert
│   │   │   │   ├── common.h
│   │   │   │   ├── copy.frag
│   │   │   │   ├── copy.vert
│   │   │   │   ├── cover.frag
│   │   │   │   ├── cover.vert
│   │   │   │   ├── gen.go
│   │   │   │   ├── input.vert
│   │   │   │   ├── intersect.frag
│   │   │   │   ├── intersect.vert
│   │   │   │   ├── material.frag
│   │   │   │   ├── material.vert
│   │   │   │   ├── shaders.go
│   │   │   │   ├── simple.frag
│   │   │   │   ├── stencil.frag
│   │   │   │   ├── stencil.vert
│   │   │   │   ├── zblit.frag.0.dxbc
│   │   │   │   ├── zblit.frag.0.glsl100es
│   │   │   │   ├── zblit.frag.0.glsl150
│   │   │   │   ├── zblit.frag.0.metallibios
│   │   │   │   ├── zblit.frag.0.metallibiossimulator
│   │   │   │   ├── zblit.frag.0.metallibmacos
│   │   │   │   ├── zblit.frag.0.spirv
│   │   │   │   ├── zblit.frag.1.dxbc
│   │   │   │   ├── zblit.frag.1.glsl100es
│   │   │   │   ├── zblit.frag.1.glsl150
│   │   │   │   ├── zblit.frag.1.metallibios
│   │   │   │   ├── zblit.frag.1.metallibiossimulator
│   │   │   │   ├── zblit.frag.1.metallibmacos
│   │   │   │   ├── zblit.frag.1.spirv
│   │   │   │   ├── zblit.frag.2.dxbc
│   │   │   │   ├── zblit.frag.2.glsl100es
│   │   │   │   ├── zblit.frag.2.glsl150
│   │   │   │   ├── zblit.frag.2.metallibios
│   │   │   │   ├── zblit.frag.2.metallibiossimulator
│   │   │   │   ├── zblit.frag.2.metallibmacos
│   │   │   │   ├── zblit.frag.2.spirv
│   │   │   │   ├── zblit.vert.0.dxbc
│   │   │   │   ├── zblit.vert.0.glsl100es
│   │   │   │   ├── zblit.vert.0.glsl150
│   │   │   │   ├── zblit.vert.0.metallibios
│   │   │   │   ├── zblit.vert.0.metallibiossimulator
│   │   │   │   ├── zblit.vert.0.metallibmacos
│   │   │   │   ├── zblit.vert.0.spirv
│   │   │   │   ├── zcopy.frag.0.dxbc
│   │   │   │   ├── zcopy.frag.0.glsl100es
│   │   │   │   ├── zcopy.frag.0.glsl150
│   │   │   │   ├── zcopy.frag.0.metallibios
│   │   │   │   ├── zcopy.frag.0.metallibiossimulator
│   │   │   │   ├── zcopy.frag.0.metallibmacos
│   │   │   │   ├── zcopy.frag.0.spirv
│   │   │   │   ├── zcopy.vert.0.dxbc
│   │   │   │   ├── zcopy.vert.0.glsl100es
│   │   │   │   ├── zcopy.vert.0.glsl150
│   │   │   │   ├── zcopy.vert.0.metallibios
│   │   │   │   ├── zcopy.vert.0.metallibiossimulator
│   │   │   │   ├── zcopy.vert.0.metallibmacos
│   │   │   │   ├── zcopy.vert.0.spirv
│   │   │   │   ├── zcover.frag.0.dxbc
│   │   │   │   ├── zcover.frag.0.glsl100es
│   │   │   │   ├── zcover.frag.0.glsl150
│   │   │   │   ├── zcover.frag.0.metallibios
│   │   │   │   ├── zcover.frag.0.metallibiossimulator
│   │   │   │   ├── zcover.frag.0.metallibmacos
│   │   │   │   ├── zcover.frag.0.spirv
│   │   │   │   ├── zcover.frag.1.dxbc
│   │   │   │   ├── zcover.frag.1.glsl100es
│   │   │   │   ├── zcover.frag.1.glsl150
│   │   │   │   ├── zcover.frag.1.metallibios
│   │   │   │   ├── zcover.frag.1.metallibiossimulator
│   │   │   │   ├── zcover.frag.1.metallibmacos
│   │   │   │   ├── zcover.frag.1.spirv
│   │   │   │   ├── zcover.frag.2.dxbc
│   │   │   │   ├── zcover.frag.2.glsl100es
│   │   │   │   ├── zcover.frag.2.glsl150
│   │   │   │   ├── zcover.frag.2.metallibios
│   │   │   │   ├── zcover.frag.2.metallibiossimulator
│   │   │   │   ├── zcover.frag.2.metallibmacos
│   │   │   │   ├── zcover.frag.2.spirv
│   │   │   │   ├── zcover.vert.0.dxbc
│   │   │   │   ├── zcover.vert.0.glsl100es
│   │   │   │   ├── zcover.vert.0.glsl150
│   │   │   │   ├── zcover.vert.0.metallibios
│   │   │   │   ├── zcover.vert.0.metallibiossimulator
│   │   │   │   ├── zcover.vert.0.metallibmacos
│   │   │   │   ├── zcover.vert.0.spirv
│   │   │   │   ├── zinput.vert.0.dxbc
│   │   │   │   ├── zinput.vert.0.glsl100es
│   │   │   │   ├── zinput.vert.0.glsl150
│   │   │   │   ├── zinput.vert.0.metallibios
│   │   │   │   ├── zinput.vert.0.metallibiossimulator
│   │   │   │   ├── zinput.vert.0.metallibmacos
│   │   │   │   ├── zinput.vert.0.spirv
│   │   │   │   ├── zintersect.frag.0.dxbc
│   │   │   │   ├── zintersect.frag.0.glsl100es
│   │   │   │   ├── zintersect.frag.0.glsl150
│   │   │   │   ├── zintersect.frag.0.metallibios
│   │   │   │   ├── zintersect.frag.0.metallibiossimulator
│   │   │   │   ├── zintersect.frag.0.metallibmacos
│   │   │   │   ├── zintersect.frag.0.spirv
│   │   │   │   ├── zintersect.vert.0.dxbc
│   │   │   │   ├── zintersect.vert.0.glsl100es
│   │   │   │   ├── zintersect.vert.0.glsl150
│   │   │   │   ├── zintersect.vert.0.metallibios
│   │   │   │   ├── zintersect.vert.0.metallibiossimulator
│   │   │   │   ├── zintersect.vert.0.metallibmacos
│   │   │   │   ├── zintersect.vert.0.spirv
│   │   │   │   ├── zmaterial.frag.0.dxbc
│   │   │   │   ├── zmaterial.frag.0.glsl100es
│   │   │   │   ├── zmaterial.frag.0.glsl150
│   │   │   │   ├── zmaterial.frag.0.metallibios
│   │   │   │   ├── zmaterial.frag.0.metallibiossimulator
│   │   │   │   ├── zmaterial.frag.0.metallibmacos
│   │   │   │   ├── zmaterial.frag.0.spirv
│   │   │   │   ├── zmaterial.vert.0.dxbc
│   │   │   │   ├── zmaterial.vert.0.glsl100es
│   │   │   │   ├── zmaterial.vert.0.glsl150
│   │   │   │   ├── zmaterial.vert.0.metallibios
│   │   │   │   ├── zmaterial.vert.0.metallibiossimulator
│   │   │   │   ├── zmaterial.vert.0.metallibmacos
│   │   │   │   ├── zmaterial.vert.0.spirv
│   │   │   │   ├── zsimple.frag.0.dxbc
│   │   │   │   ├── zsimple.frag.0.glsl100es
│   │   │   │   ├── zsimple.frag.0.glsl150
│   │   │   │   ├── zsimple.frag.0.metallibios
│   │   │   │   ├── zsimple.frag.0.metallibiossimulator
│   │   │   │   ├── zsimple.frag.0.metallibmacos
│   │   │   │   ├── zsimple.frag.0.spirv
│   │   │   │   ├── zstencil.frag.0.dxbc
│   │   │   │   ├── zstencil.frag.0.glsl100es
│   │   │   │   ├── zstencil.frag.0.glsl150
│   │   │   │   ├── zstencil.frag.0.metallibios
│   │   │   │   ├── zstencil.frag.0.metallibiossimulator
│   │   │   │   ├── zstencil.frag.0.metallibmacos
│   │   │   │   ├── zstencil.frag.0.spirv
│   │   │   │   ├── zstencil.vert.0.dxbc
│   │   │   │   ├── zstencil.vert.0.glsl100es
│   │   │   │   ├── zstencil.vert.0.glsl150
│   │   │   │   ├── zstencil.vert.0.metallibios
│   │   │   │   ├── zstencil.vert.0.metallibiossimulator
│   │   │   │   ├── zstencil.vert.0.metallibmacos
│   │   │   │   └── zstencil.vert.0.spirv
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   ├── piet/
│   │   │   │   ├── abi.h
│   │   │   │   ├── annotated.h
│   │   │   │   ├── backdrop.comp
│   │   │   │   ├── backdrop_abi.c
│   │   │   │   ├── backdrop_abi.go
│   │   │   │   ├── backdrop_abi.h
│   │   │   │   ├── backdrop_abi_nosupport.go
│   │   │   │   ├── backdrop_linux_amd64.syso
│   │   │   │   ├── backdrop_linux_arm.syso
│   │   │   │   ├── backdrop_linux_arm64.syso
│   │   │   │   ├── binning.comp
│   │   │   │   ├── binning_abi.c
│   │   │   │   ├── binning_abi.go
│   │   │   │   ├── binning_abi.h
│   │   │   │   ├── binning_abi_nosupport.go
│   │   │   │   ├── binning_linux_amd64.syso
│   │   │   │   ├── binning_linux_arm.syso
│   │   │   │   ├── binning_linux_arm64.syso
│   │   │   │   ├── bins.h
│   │   │   │   ├── coarse.comp
│   │   │   │   ├── coarse_abi.c
│   │   │   │   ├── coarse_abi.go
│   │   │   │   ├── coarse_abi.h
│   │   │   │   ├── coarse_abi_nosupport.go
│   │   │   │   ├── coarse_linux_amd64.syso
│   │   │   │   ├── coarse_linux_arm.syso
│   │   │   │   ├── coarse_linux_arm64.syso
│   │   │   │   ├── elements.comp
│   │   │   │   ├── elements_abi.c
│   │   │   │   ├── elements_abi.go
│   │   │   │   ├── elements_abi.h
│   │   │   │   ├── elements_abi_nosupport.go
│   │   │   │   ├── elements_linux_amd64.syso
│   │   │   │   ├── elements_linux_arm.syso
│   │   │   │   ├── elements_linux_arm64.syso
│   │   │   │   ├── gen.go
│   │   │   │   ├── gencpu.sh
│   │   │   │   ├── kernel4.comp
│   │   │   │   ├── kernel4_abi.c
│   │   │   │   ├── kernel4_abi.go
│   │   │   │   ├── kernel4_abi.h
│   │   │   │   ├── kernel4_abi_nosupport.go
│   │   │   │   ├── kernel4_linux_amd64.syso
│   │   │   │   ├── kernel4_linux_arm.syso
│   │   │   │   ├── kernel4_linux_arm64.syso
│   │   │   │   ├── mem.h
│   │   │   │   ├── path_coarse.comp
│   │   │   │   ├── path_coarse_abi.c
│   │   │   │   ├── path_coarse_abi.go
│   │   │   │   ├── path_coarse_abi.h
│   │   │   │   ├── path_coarse_abi_nosupport.go
│   │   │   │   ├── path_coarse_linux_amd64.syso
│   │   │   │   ├── path_coarse_linux_arm.syso
│   │   │   │   ├── path_coarse_linux_arm64.syso
│   │   │   │   ├── pathseg.h
│   │   │   │   ├── ptcl.h
│   │   │   │   ├── runtime.h
│   │   │   │   ├── scene.h
│   │   │   │   ├── setup.h
│   │   │   │   ├── shaders.go
│   │   │   │   ├── state.h
│   │   │   │   ├── support.c
│   │   │   │   ├── tile.h
│   │   │   │   ├── tile_alloc.comp
│   │   │   │   ├── tile_alloc_abi.c
│   │   │   │   ├── tile_alloc_abi.go
│   │   │   │   ├── tile_alloc_abi.h
│   │   │   │   ├── tile_alloc_abi_nosupport.go
│   │   │   │   ├── tile_alloc_linux_amd64.syso
│   │   │   │   ├── tile_alloc_linux_arm.syso
│   │   │   │   ├── tile_alloc_linux_arm64.syso
│   │   │   │   ├── zbackdrop.comp.0.dxbc
│   │   │   │   ├── zbackdrop.comp.0.metallibios
│   │   │   │   ├── zbackdrop.comp.0.metallibiossimulator
│   │   │   │   ├── zbackdrop.comp.0.metallibmacos
│   │   │   │   ├── zbackdrop.comp.0.spirv
│   │   │   │   ├── zbinning.comp.0.dxbc
│   │   │   │   ├── zbinning.comp.0.metallibios
│   │   │   │   ├── zbinning.comp.0.metallibiossimulator
│   │   │   │   ├── zbinning.comp.0.metallibmacos
│   │   │   │   ├── zbinning.comp.0.spirv
│   │   │   │   ├── zcoarse.comp.0.dxbc
│   │   │   │   ├── zcoarse.comp.0.metallibios
│   │   │   │   ├── zcoarse.comp.0.metallibiossimulator
│   │   │   │   ├── zcoarse.comp.0.metallibmacos
│   │   │   │   ├── zcoarse.comp.0.spirv
│   │   │   │   ├── zelements.comp.0.dxbc
│   │   │   │   ├── zelements.comp.0.metallibios
│   │   │   │   ├── zelements.comp.0.metallibiossimulator
│   │   │   │   ├── zelements.comp.0.metallibmacos
│   │   │   │   ├── zelements.comp.0.spirv
│   │   │   │   ├── zkernel4.comp.0.dxbc
│   │   │   │   ├── zkernel4.comp.0.metallibios
│   │   │   │   ├── zkernel4.comp.0.metallibiossimulator
│   │   │   │   ├── zkernel4.comp.0.metallibmacos
│   │   │   │   ├── zkernel4.comp.0.spirv
│   │   │   │   ├── zpath_coarse.comp.0.dxbc
│   │   │   │   ├── zpath_coarse.comp.0.metallibios
│   │   │   │   ├── zpath_coarse.comp.0.metallibiossimulator
│   │   │   │   ├── zpath_coarse.comp.0.metallibmacos
│   │   │   │   ├── zpath_coarse.comp.0.spirv
│   │   │   │   ├── ztile_alloc.comp.0.dxbc
│   │   │   │   ├── ztile_alloc.comp.0.metallibios
│   │   │   │   ├── ztile_alloc.comp.0.metallibiossimulator
│   │   │   │   ├── ztile_alloc.comp.0.metallibmacos
│   │   │   │   └── ztile_alloc.comp.0.spirv
│   │   │   └── shader.go
│   │   ├── text/
│   │   │   ├── lru.go
│   │   │   ├── shaper.go
│   │   │   └── text.go
│   │   └── unit/
│   │       └── unit.go
│   ├── github.com/
│   │   ├── BurntSushi/
│   │   │   ├── toml/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── COPYING
│   │   │   │   ├── README.md
│   │   │   │   ├── decode.go
│   │   │   │   ├── decode_go116.go
│   │   │   │   ├── deprecated.go
│   │   │   │   ├── doc.go
│   │   │   │   ├── encode.go
│   │   │   │   ├── error.go
│   │   │   │   ├── go.mod
│   │   │   │   ├── internal/
│   │   │   │   │   └── tz.go
│   │   │   │   ├── lex.go
│   │   │   │   ├── meta.go
│   │   │   │   ├── parse.go
│   │   │   │   ├── type_fields.go
│   │   │   │   └── type_toml.go
│   │   │   ├── xgb/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── AUTHORS
│   │   │   │   ├── CONTRIBUTORS
│   │   │   │   ├── LICENSE
│   │   │   │   ├── Makefile
│   │   │   │   ├── README
│   │   │   │   ├── STYLE
│   │   │   │   ├── auth.go
│   │   │   │   ├── conn.go
│   │   │   │   ├── cookie.go
│   │   │   │   ├── doc.go
│   │   │   │   ├── help.go
│   │   │   │   ├── render/
│   │   │   │   │   └── render.go
│   │   │   │   ├── shape/
│   │   │   │   │   └── shape.go
│   │   │   │   ├── shm/
│   │   │   │   │   └── shm.go
│   │   │   │   ├── sync.go
│   │   │   │   ├── xgb.go
│   │   │   │   ├── xinerama/
│   │   │   │   │   └── xinerama.go
│   │   │   │   └── xproto/
│   │   │   │       └── xproto.go
│   │   │   └── xgbutil/
│   │   │       ├── .gitignore
│   │   │       ├── COPYING
│   │   │       ├── Makefile
│   │   │       ├── README
│   │   │       ├── STYLE
│   │   │       ├── doc.go
│   │   │       ├── ewmh/
│   │   │       │   ├── doc.go
│   │   │       │   ├── ewmh.go
│   │   │       │   └── winman.go
│   │   │       ├── icccm/
│   │   │       │   ├── doc.go
│   │   │       │   ├── icccm.go
│   │   │       │   └── protocols.go
│   │   │       ├── session.vim
│   │   │       ├── types.go
│   │   │       ├── xevent/
│   │   │       │   ├── callback.go
│   │   │       │   ├── doc.go
│   │   │       │   ├── eventloop.go
│   │   │       │   ├── types_auto.go
│   │   │       │   ├── types_manual.go
│   │   │       │   └── xevent.go
│   │   │       ├── xgbutil.go
│   │   │       └── xprop/
│   │   │           ├── atom.go
│   │   │           ├── doc.go
│   │   │           └── xprop.go
│   │   ├── aarzilli/
│   │   │   └── nucular/
│   │   │       ├── .travis.yml
│   │   │       ├── LICENSE
│   │   │       ├── README.md
│   │   │       ├── clipboard/
│   │   │       │   ├── clipboard_darwin.go
│   │   │       │   ├── clipboard_other.go
│   │   │       │   ├── clipboard_windows.go
│   │   │       │   └── clipboard_x11.go
│   │   │       ├── command/
│   │   │       │   └── command.go
│   │   │       ├── context.go
│   │   │       ├── doc.go
│   │   │       ├── drawfillover_avx.go
│   │   │       ├── drawfillover_avx.s
│   │   │       ├── drawfillover_other.go
│   │   │       ├── drawing.go
│   │   │       ├── font/
│   │   │       │   ├── font.go
│   │   │       │   ├── font_gio.go
│   │   │       │   └── font_shiny.go
│   │   │       ├── gio.go
│   │   │       ├── go.mod
│   │   │       ├── go.sum
│   │   │       ├── grouplist.go
│   │   │       ├── input.go
│   │   │       ├── internal/
│   │   │       │   └── assets/
│   │   │       │       └── assets.go
│   │   │       ├── label/
│   │   │       │   └── label.go
│   │   │       ├── masterwindow.go
│   │   │       ├── nucular.go
│   │   │       ├── rect/
│   │   │       │   └── rect.go
│   │   │       ├── shiny.go
│   │   │       ├── split.go
│   │   │       ├── style/
│   │   │       │   └── style.go
│   │   │       ├── text.go
│   │   │       └── util.go
│   │   ├── blang/
│   │   │   └── semver/
│   │   │       └── v4/
│   │   │           ├── LICENSE
│   │   │           ├── go.mod
│   │   │           ├── json.go
│   │   │           ├── range.go
│   │   │           ├── semver.go
│   │   │           ├── sort.go
│   │   │           └── sql.go
│   │   ├── go-gl/
│   │   │   └── glfw/
│   │   │       └── v3.3/
│   │   │           └── glfw/
│   │   │               ├── GLFW_C_REVISION.txt
│   │   │               ├── LICENSE
│   │   │               ├── build.go
│   │   │               ├── build_cgo_hack.go
│   │   │               ├── c_glfw.go
│   │   │               ├── c_glfw_bsd.go
│   │   │               ├── c_glfw_darwin.go
│   │   │               ├── c_glfw_lin.go
│   │   │               ├── c_glfw_windows.go
│   │   │               ├── context.go
│   │   │               ├── error.c
│   │   │               ├── error.go
│   │   │               ├── glfw/
│   │   │               │   ├── LICENSE.md
│   │   │               │   ├── deps/
│   │   │               │   │   ├── dummy.go
│   │   │               │   │   ├── getopt.c
│   │   │               │   │   ├── getopt.h
│   │   │               │   │   ├── glad/
│   │   │               │   │   │   ├── dummy.go
│   │   │               │   │   │   ├── gl.h
│   │   │               │   │   │   ├── khrplatform.h
│   │   │               │   │   │   ├── vk_platform.h
│   │   │               │   │   │   └── vulkan.h
│   │   │               │   │   ├── glad_gl.c
│   │   │               │   │   ├── glad_vulkan.c
│   │   │               │   │   ├── linmath.h
│   │   │               │   │   ├── mingw/
│   │   │               │   │   │   ├── _mingw_dxhelper.h
│   │   │               │   │   │   ├── dinput.h
│   │   │               │   │   │   ├── dummy.go
│   │   │               │   │   │   └── xinput.h
│   │   │               │   │   ├── nuklear.h
│   │   │               │   │   ├── nuklear_glfw_gl2.h
│   │   │               │   │   ├── stb_image_write.h
│   │   │               │   │   ├── tinycthread.c
│   │   │               │   │   ├── tinycthread.h
│   │   │               │   │   └── vs2008/
│   │   │               │   │       ├── dummy.go
│   │   │               │   │       └── stdint.h
│   │   │               │   ├── include/
│   │   │               │   │   └── GLFW/
│   │   │               │   │       ├── dummy.go
│   │   │               │   │       ├── glfw3.h
│   │   │               │   │       └── glfw3native.h
│   │   │               │   └── src/
│   │   │               │       ├── cocoa_init.m
│   │   │               │       ├── cocoa_joystick.h
│   │   │               │       ├── cocoa_joystick.m
│   │   │               │       ├── cocoa_monitor.m
│   │   │               │       ├── cocoa_platform.h
│   │   │               │       ├── cocoa_time.c
│   │   │               │       ├── cocoa_window.m
│   │   │               │       ├── context.c
│   │   │               │       ├── dummy.go
│   │   │               │       ├── egl_context.c
│   │   │               │       ├── egl_context.h
│   │   │               │       ├── glx_context.c
│   │   │               │       ├── glx_context.h
│   │   │               │       ├── init.c
│   │   │               │       ├── input.c
│   │   │               │       ├── internal.h
│   │   │               │       ├── linux_joystick.c
│   │   │               │       ├── linux_joystick.h
│   │   │               │       ├── mappings.h
│   │   │               │       ├── monitor.c
│   │   │               │       ├── nsgl_context.h
│   │   │               │       ├── nsgl_context.m
│   │   │               │       ├── null_init.c
│   │   │               │       ├── null_joystick.c
│   │   │               │       ├── null_joystick.h
│   │   │               │       ├── null_monitor.c
│   │   │               │       ├── null_platform.h
│   │   │               │       ├── null_window.c
│   │   │               │       ├── osmesa_context.c
│   │   │               │       ├── osmesa_context.h
│   │   │               │       ├── posix_thread.c
│   │   │               │       ├── posix_thread.h
│   │   │               │       ├── posix_time.c
│   │   │               │       ├── posix_time.h
│   │   │               │       ├── vulkan.c
│   │   │               │       ├── wayland-idle-inhibit-unstable-v1-client-protocol.c
│   │   │               │       ├── wayland-idle-inhibit-unstable-v1-client-protocol.h
│   │   │               │       ├── wayland-pointer-constraints-unstable-v1-client-protocol.c
│   │   │               │       ├── wayland-pointer-constraints-unstable-v1-client-protocol.h
│   │   │               │       ├── wayland-relative-pointer-unstable-v1-client-protocol.c
│   │   │               │       ├── wayland-relative-pointer-unstable-v1-client-protocol.h
│   │   │               │       ├── wayland-viewporter-client-protocol.c
│   │   │               │       ├── wayland-viewporter-client-protocol.h
│   │   │               │       ├── wayland-xdg-decoration-client-protocol.h
│   │   │               │       ├── wayland-xdg-decoration-unstable-v1-client-protocol.c
│   │   │               │       ├── wayland-xdg-shell-client-protocol.c
│   │   │               │       ├── wayland-xdg-shell-client-protocol.h
│   │   │               │       ├── wgl_context.c
│   │   │               │       ├── wgl_context.h
│   │   │               │       ├── win32_init.c
│   │   │               │       ├── win32_joystick.c
│   │   │               │       ├── win32_joystick.h
│   │   │               │       ├── win32_monitor.c
│   │   │               │       ├── win32_platform.h
│   │   │               │       ├── win32_thread.c
│   │   │               │       ├── win32_time.c
│   │   │               │       ├── win32_window.c
│   │   │               │       ├── window.c
│   │   │               │       ├── wl_init.c
│   │   │               │       ├── wl_monitor.c
│   │   │               │       ├── wl_platform.h
│   │   │               │       ├── wl_window.c
│   │   │               │       ├── x11_init.c
│   │   │               │       ├── x11_monitor.c
│   │   │               │       ├── x11_platform.h
│   │   │               │       ├── x11_window.c
│   │   │               │       ├── xkb_unicode.c
│   │   │               │       └── xkb_unicode.h
│   │   │               ├── glfw.go
│   │   │               ├── glfw_tree_rebuild.go
│   │   │               ├── go.mod
│   │   │               ├── input.c
│   │   │               ├── input.go
│   │   │               ├── monitor.c
│   │   │               ├── monitor.go
│   │   │               ├── native_darwin.go
│   │   │               ├── native_linbsd.go
│   │   │               ├── native_windows.go
│   │   │               ├── time.go
│   │   │               ├── util.go
│   │   │               ├── vulkan.go
│   │   │               ├── window.c
│   │   │               └── window.go
│   │   ├── golang/
│   │   │   └── freetype/
│   │   │       ├── AUTHORS
│   │   │       ├── CONTRIBUTORS
│   │   │       ├── LICENSE
│   │   │       ├── README
│   │   │       ├── freetype.go
│   │   │       ├── raster/
│   │   │       │   ├── geom.go
│   │   │       │   ├── paint.go
│   │   │       │   ├── raster.go
│   │   │       │   └── stroke.go
│   │   │       └── truetype/
│   │   │           ├── face.go
│   │   │           ├── glyph.go
│   │   │           ├── hint.go
│   │   │           ├── opcodes.go
│   │   │           └── truetype.go
│   │   ├── hashicorp/
│   │   │   └── golang-lru/
│   │   │       ├── .gitignore
│   │   │       ├── 2q.go
│   │   │       ├── LICENSE
│   │   │       ├── README.md
│   │   │       ├── arc.go
│   │   │       ├── doc.go
│   │   │       ├── go.mod
│   │   │       ├── lru.go
│   │   │       └── simplelru/
│   │   │           ├── lru.go
│   │   │           └── lru_interface.go
│   │   ├── noisetorch/
│   │   │   └── pulseaudio/
│   │   │       ├── .gitignore
│   │   │       ├── LICENSE
│   │   │       ├── README.md
│   │   │       ├── card.go
│   │   │       ├── client.go
│   │   │       ├── command.go
│   │   │       ├── command_string.go
│   │   │       ├── errors.go
│   │   │       ├── format.go
│   │   │       ├── go.mod
│   │   │       ├── misc.go
│   │   │       ├── module.go
│   │   │       ├── server.go
│   │   │       ├── sink.go
│   │   │       ├── source.go
│   │   │       ├── updates.go
│   │   │       └── volume.go
│   │   └── syndtr/
│   │       └── gocapability/
│   │           ├── LICENSE
│   │           └── capability/
│   │               ├── capability.go
│   │               ├── capability_linux.go
│   │               ├── capability_noop.go
│   │               ├── enum.go
│   │               ├── enum_gen.go
│   │               └── syscall_linux.go
│   ├── golang.org/
│   │   └── x/
│   │       ├── crypto/
│   │       │   ├── LICENSE
│   │       │   ├── PATENTS
│   │       │   └── ed25519/
│   │       │       └── ed25519.go
│   │       ├── exp/
│   │       │   ├── AUTHORS
│   │       │   ├── CONTRIBUTORS
│   │       │   ├── LICENSE
│   │       │   ├── PATENTS
│   │       │   └── shiny/
│   │       │       ├── driver/
│   │       │       │   ├── driver.go
│   │       │       │   ├── driver_darwin.go
│   │       │       │   ├── driver_fallback.go
│   │       │       │   ├── driver_windows.go
│   │       │       │   ├── driver_x11.go
│   │       │       │   ├── gldriver/
│   │       │       │   │   ├── buffer.go
│   │       │       │   │   ├── cocoa.go
│   │       │       │   │   ├── cocoa.m
│   │       │       │   │   ├── context.go
│   │       │       │   │   ├── egl.go
│   │       │       │   │   ├── gldriver.go
│   │       │       │   │   ├── other.go
│   │       │       │   │   ├── screen.go
│   │       │       │   │   ├── texture.go
│   │       │       │   │   ├── win32.go
│   │       │       │   │   ├── window.go
│   │       │       │   │   ├── x11.c
│   │       │       │   │   └── x11.go
│   │       │       │   ├── internal/
│   │       │       │   │   ├── drawer/
│   │       │       │   │   │   └── drawer.go
│   │       │       │   │   ├── errscreen/
│   │       │       │   │   │   └── errscreen.go
│   │       │       │   │   ├── event/
│   │       │       │   │   │   └── event.go
│   │       │       │   │   ├── lifecycler/
│   │       │       │   │   │   └── lifecycler.go
│   │       │       │   │   ├── swizzle/
│   │       │       │   │   │   ├── swizzle_amd64.go
│   │       │       │   │   │   ├── swizzle_amd64.s
│   │       │       │   │   │   ├── swizzle_common.go
│   │       │       │   │   │   └── swizzle_other.go
│   │       │       │   │   ├── win32/
│   │       │       │   │   │   ├── key.go
│   │       │       │   │   │   ├── syscall.go
│   │       │       │   │   │   ├── syscall_windows.go
│   │       │       │   │   │   ├── win32.go
│   │       │       │   │   │   └── zsyscall_windows.go
│   │       │       │   │   └── x11key/
│   │       │       │   │       ├── table.go
│   │       │       │   │       └── x11key.go
│   │       │       │   ├── mtldriver/
│   │       │       │   │   ├── buffer.go
│   │       │       │   │   ├── internal/
│   │       │       │   │   │   ├── appkit/
│   │       │       │   │   │   │   ├── appkit.go
│   │       │       │   │   │   │   ├── appkit.h
│   │       │       │   │   │   │   └── appkit.m
│   │       │       │   │   │   └── coreanim/
│   │       │       │   │   │       ├── coreanim.go
│   │       │       │   │   │       ├── coreanim.h
│   │       │       │   │   │       └── coreanim.m
│   │       │       │   │   ├── mtldriver.go
│   │       │       │   │   ├── screen.go
│   │       │       │   │   ├── texture.go
│   │       │       │   │   └── window.go
│   │       │       │   ├── mtldriver_darwin.go
│   │       │       │   ├── windriver/
│   │       │       │   │   ├── buffer.go
│   │       │       │   │   ├── doc.go
│   │       │       │   │   ├── other.go
│   │       │       │   │   ├── screen.go
│   │       │       │   │   ├── syscall.go
│   │       │       │   │   ├── syscall_windows.go
│   │       │       │   │   ├── texture.go
│   │       │       │   │   ├── window.go
│   │       │       │   │   ├── windraw.go
│   │       │       │   │   ├── windriver.go
│   │       │       │   │   └── zsyscall_windows.go
│   │       │       │   └── x11driver/
│   │       │       │       ├── buffer.go
│   │       │       │       ├── buffer_fallback.go
│   │       │       │       ├── screen.go
│   │       │       │       ├── shm_linux_ipc.go
│   │       │       │       ├── shm_openbsd_syscall.go
│   │       │       │       ├── shm_other.go
│   │       │       │       ├── shm_shmopen_syscall.go
│   │       │       │       ├── texture.go
│   │       │       │       ├── window.go
│   │       │       │       └── x11driver.go
│   │       │       └── screen/
│   │       │           └── screen.go
│   │       ├── image/
│   │       │   ├── LICENSE
│   │       │   ├── PATENTS
│   │       │   ├── draw/
│   │       │   │   ├── draw.go
│   │       │   │   ├── draw_go117.go
│   │       │   │   ├── impl.go
│   │       │   │   └── scale.go
│   │       │   ├── font/
│   │       │   │   ├── font.go
│   │       │   │   └── sfnt/
│   │       │   │       ├── cmap.go
│   │       │   │       ├── data.go
│   │       │   │       ├── gpos.go
│   │       │   │       ├── postscript.go
│   │       │   │       ├── sfnt.go
│   │       │   │       └── truetype.go
│   │       │   └── math/
│   │       │       ├── f64/
│   │       │       │   └── f64.go
│   │       │       └── fixed/
│   │       │           └── fixed.go
│   │       ├── mobile/
│   │       │   ├── AUTHORS
│   │       │   ├── CONTRIBUTORS
│   │       │   ├── LICENSE
│   │       │   ├── PATENTS
│   │       │   ├── event/
│   │       │   │   ├── key/
│   │       │   │   │   ├── code_string.go
│   │       │   │   │   └── key.go
│   │       │   │   ├── lifecycle/
│   │       │   │   │   └── lifecycle.go
│   │       │   │   ├── mouse/
│   │       │   │   │   └── mouse.go
│   │       │   │   ├── paint/
│   │       │   │   │   └── paint.go
│   │       │   │   └── size/
│   │       │   │       └── size.go
│   │       │   ├── geom/
│   │       │   │   └── geom.go
│   │       │   └── gl/
│   │       │       ├── consts.go
│   │       │       ├── dll_windows.go
│   │       │       ├── doc.go
│   │       │       ├── fn.go
│   │       │       ├── gl.go
│   │       │       ├── gldebug.go
│   │       │       ├── interface.go
│   │       │       ├── types_debug.go
│   │       │       ├── types_prod.go
│   │       │       ├── work.c
│   │       │       ├── work.go
│   │       │       ├── work.h
│   │       │       ├── work_other.go
│   │       │       ├── work_windows.go
│   │       │       ├── work_windows_386.s
│   │       │       └── work_windows_amd64.s
│   │       ├── sys/
│   │       │   ├── LICENSE
│   │       │   ├── PATENTS
│   │       │   ├── unix/
│   │       │   │   ├── .gitignore
│   │       │   │   ├── README.md
│   │       │   │   ├── affinity_linux.go
│   │       │   │   ├── aliases.go
│   │       │   │   ├── asm_aix_ppc64.s
│   │       │   │   ├── asm_bsd_386.s
│   │       │   │   ├── asm_bsd_amd64.s
│   │       │   │   ├── asm_bsd_arm.s
│   │       │   │   ├── asm_bsd_arm64.s
│   │       │   │   ├── asm_bsd_ppc64.s
│   │       │   │   ├── asm_bsd_riscv64.s
│   │       │   │   ├── asm_linux_386.s
│   │       │   │   ├── asm_linux_amd64.s
│   │       │   │   ├── asm_linux_arm.s
│   │       │   │   ├── asm_linux_arm64.s
│   │       │   │   ├── asm_linux_loong64.s
│   │       │   │   ├── asm_linux_mips64x.s
│   │       │   │   ├── asm_linux_mipsx.s
│   │       │   │   ├── asm_linux_ppc64x.s
│   │       │   │   ├── asm_linux_riscv64.s
│   │       │   │   ├── asm_linux_s390x.s
│   │       │   │   ├── asm_openbsd_mips64.s
│   │       │   │   ├── asm_solaris_amd64.s
│   │       │   │   ├── asm_zos_s390x.s
│   │       │   │   ├── bluetooth_linux.go
│   │       │   │   ├── cap_freebsd.go
│   │       │   │   ├── constants.go
│   │       │   │   ├── dev_aix_ppc.go
│   │       │   │   ├── dev_aix_ppc64.go
│   │       │   │   ├── dev_darwin.go
│   │       │   │   ├── dev_dragonfly.go
│   │       │   │   ├── dev_freebsd.go
│   │       │   │   ├── dev_linux.go
│   │       │   │   ├── dev_netbsd.go
│   │       │   │   ├── dev_openbsd.go
│   │       │   │   ├── dev_zos.go
│   │       │   │   ├── dirent.go
│   │       │   │   ├── endian_big.go
│   │       │   │   ├── endian_little.go
│   │       │   │   ├── env_unix.go
│   │       │   │   ├── epoll_zos.go
│   │       │   │   ├── fcntl.go
│   │       │   │   ├── fcntl_darwin.go
│   │       │   │   ├── fcntl_linux_32bit.go
│   │       │   │   ├── fdset.go
│   │       │   │   ├── fstatfs_zos.go
│   │       │   │   ├── gccgo.go
│   │       │   │   ├── gccgo_c.c
│   │       │   │   ├── gccgo_linux_amd64.go
│   │       │   │   ├── ifreq_linux.go
│   │       │   │   ├── ioctl_linux.go
│   │       │   │   ├── ioctl_signed.go
│   │       │   │   ├── ioctl_unsigned.go
│   │       │   │   ├── ioctl_zos.go
│   │       │   │   ├── mkall.sh
│   │       │   │   ├── mkerrors.sh
│   │       │   │   ├── mmap_nomremap.go
│   │       │   │   ├── mremap.go
│   │       │   │   ├── pagesize_unix.go
│   │       │   │   ├── pledge_openbsd.go
│   │       │   │   ├── ptrace_darwin.go
│   │       │   │   ├── ptrace_ios.go
│   │       │   │   ├── race.go
│   │       │   │   ├── race0.go
│   │       │   │   ├── readdirent_getdents.go
│   │       │   │   ├── readdirent_getdirentries.go
│   │       │   │   ├── sockcmsg_dragonfly.go
│   │       │   │   ├── sockcmsg_linux.go
│   │       │   │   ├── sockcmsg_unix.go
│   │       │   │   ├── sockcmsg_unix_other.go
│   │       │   │   ├── syscall.go
│   │       │   │   ├── syscall_aix.go
│   │       │   │   ├── syscall_aix_ppc.go
│   │       │   │   ├── syscall_aix_ppc64.go
│   │       │   │   ├── syscall_bsd.go
│   │       │   │   ├── syscall_darwin.go
│   │       │   │   ├── syscall_darwin_amd64.go
│   │       │   │   ├── syscall_darwin_arm64.go
│   │       │   │   ├── syscall_darwin_libSystem.go
│   │       │   │   ├── syscall_dragonfly.go
│   │       │   │   ├── syscall_dragonfly_amd64.go
│   │       │   │   ├── syscall_freebsd.go
│   │       │   │   ├── syscall_freebsd_386.go
│   │       │   │   ├── syscall_freebsd_amd64.go
│   │       │   │   ├── syscall_freebsd_arm.go
│   │       │   │   ├── syscall_freebsd_arm64.go
│   │       │   │   ├── syscall_freebsd_riscv64.go
│   │       │   │   ├── syscall_hurd.go
│   │       │   │   ├── syscall_hurd_386.go
│   │       │   │   ├── syscall_illumos.go
│   │       │   │   ├── syscall_linux.go
│   │       │   │   ├── syscall_linux_386.go
│   │       │   │   ├── syscall_linux_alarm.go
│   │       │   │   ├── syscall_linux_amd64.go
│   │       │   │   ├── syscall_linux_amd64_gc.go
│   │       │   │   ├── syscall_linux_arm.go
│   │       │   │   ├── syscall_linux_arm64.go
│   │       │   │   ├── syscall_linux_gc.go
│   │       │   │   ├── syscall_linux_gc_386.go
│   │       │   │   ├── syscall_linux_gc_arm.go
│   │       │   │   ├── syscall_linux_gccgo_386.go
│   │       │   │   ├── syscall_linux_gccgo_arm.go
│   │       │   │   ├── syscall_linux_loong64.go
│   │       │   │   ├── syscall_linux_mips64x.go
│   │       │   │   ├── syscall_linux_mipsx.go
│   │       │   │   ├── syscall_linux_ppc.go
│   │       │   │   ├── syscall_linux_ppc64x.go
│   │       │   │   ├── syscall_linux_riscv64.go
│   │       │   │   ├── syscall_linux_s390x.go
│   │       │   │   ├── syscall_linux_sparc64.go
│   │       │   │   ├── syscall_netbsd.go
│   │       │   │   ├── syscall_netbsd_386.go
│   │       │   │   ├── syscall_netbsd_amd64.go
│   │       │   │   ├── syscall_netbsd_arm.go
│   │       │   │   ├── syscall_netbsd_arm64.go
│   │       │   │   ├── syscall_openbsd.go
│   │       │   │   ├── syscall_openbsd_386.go
│   │       │   │   ├── syscall_openbsd_amd64.go
│   │       │   │   ├── syscall_openbsd_arm.go
│   │       │   │   ├── syscall_openbsd_arm64.go
│   │       │   │   ├── syscall_openbsd_libc.go
│   │       │   │   ├── syscall_openbsd_mips64.go
│   │       │   │   ├── syscall_openbsd_ppc64.go
│   │       │   │   ├── syscall_openbsd_riscv64.go
│   │       │   │   ├── syscall_solaris.go
│   │       │   │   ├── syscall_solaris_amd64.go
│   │       │   │   ├── syscall_unix.go
│   │       │   │   ├── syscall_unix_gc.go
│   │       │   │   ├── syscall_unix_gc_ppc64x.go
│   │       │   │   ├── syscall_zos_s390x.go
│   │       │   │   ├── sysvshm_linux.go
│   │       │   │   ├── sysvshm_unix.go
│   │       │   │   ├── sysvshm_unix_other.go
│   │       │   │   ├── timestruct.go
│   │       │   │   ├── unveil_openbsd.go
│   │       │   │   ├── xattr_bsd.go
│   │       │   │   ├── zerrors_aix_ppc.go
│   │       │   │   ├── zerrors_aix_ppc64.go
│   │       │   │   ├── zerrors_darwin_amd64.go
│   │       │   │   ├── zerrors_darwin_arm64.go
│   │       │   │   ├── zerrors_dragonfly_amd64.go
│   │       │   │   ├── zerrors_freebsd_386.go
│   │       │   │   ├── zerrors_freebsd_amd64.go
│   │       │   │   ├── zerrors_freebsd_arm.go
│   │       │   │   ├── zerrors_freebsd_arm64.go
│   │       │   │   ├── zerrors_freebsd_riscv64.go
│   │       │   │   ├── zerrors_linux.go
│   │       │   │   ├── zerrors_linux_386.go
│   │       │   │   ├── zerrors_linux_amd64.go
│   │       │   │   ├── zerrors_linux_arm.go
│   │       │   │   ├── zerrors_linux_arm64.go
│   │       │   │   ├── zerrors_linux_loong64.go
│   │       │   │   ├── zerrors_linux_mips.go
│   │       │   │   ├── zerrors_linux_mips64.go
│   │       │   │   ├── zerrors_linux_mips64le.go
│   │       │   │   ├── zerrors_linux_mipsle.go
│   │       │   │   ├── zerrors_linux_ppc.go
│   │       │   │   ├── zerrors_linux_ppc64.go
│   │       │   │   ├── zerrors_linux_ppc64le.go
│   │       │   │   ├── zerrors_linux_riscv64.go
│   │       │   │   ├── zerrors_linux_s390x.go
│   │       │   │   ├── zerrors_linux_sparc64.go
│   │       │   │   ├── zerrors_netbsd_386.go
│   │       │   │   ├── zerrors_netbsd_amd64.go
│   │       │   │   ├── zerrors_netbsd_arm.go
│   │       │   │   ├── zerrors_netbsd_arm64.go
│   │       │   │   ├── zerrors_openbsd_386.go
│   │       │   │   ├── zerrors_openbsd_amd64.go
│   │       │   │   ├── zerrors_openbsd_arm.go
│   │       │   │   ├── zerrors_openbsd_arm64.go
│   │       │   │   ├── zerrors_openbsd_mips64.go
│   │       │   │   ├── zerrors_openbsd_ppc64.go
│   │       │   │   ├── zerrors_openbsd_riscv64.go
│   │       │   │   ├── zerrors_solaris_amd64.go
│   │       │   │   ├── zerrors_zos_s390x.go
│   │       │   │   ├── zptrace_armnn_linux.go
│   │       │   │   ├── zptrace_linux_arm64.go
│   │       │   │   ├── zptrace_mipsnn_linux.go
│   │       │   │   ├── zptrace_mipsnnle_linux.go
│   │       │   │   ├── zptrace_x86_linux.go
│   │       │   │   ├── zsyscall_aix_ppc.go
│   │       │   │   ├── zsyscall_aix_ppc64.go
│   │       │   │   ├── zsyscall_aix_ppc64_gc.go
│   │       │   │   ├── zsyscall_aix_ppc64_gccgo.go
│   │       │   │   ├── zsyscall_darwin_amd64.go
│   │       │   │   ├── zsyscall_darwin_amd64.s
│   │       │   │   ├── zsyscall_darwin_arm64.go
│   │       │   │   ├── zsyscall_darwin_arm64.s
│   │       │   │   ├── zsyscall_dragonfly_amd64.go
│   │       │   │   ├── zsyscall_freebsd_386.go
│   │       │   │   ├── zsyscall_freebsd_amd64.go
│   │       │   │   ├── zsyscall_freebsd_arm.go
│   │       │   │   ├── zsyscall_freebsd_arm64.go
│   │       │   │   ├── zsyscall_freebsd_riscv64.go
│   │       │   │   ├── zsyscall_illumos_amd64.go
│   │       │   │   ├── zsyscall_linux.go
│   │       │   │   ├── zsyscall_linux_386.go
│   │       │   │   ├── zsyscall_linux_amd64.go
│   │       │   │   ├── zsyscall_linux_arm.go
│   │       │   │   ├── zsyscall_linux_arm64.go
│   │       │   │   ├── zsyscall_linux_loong64.go
│   │       │   │   ├── zsyscall_linux_mips.go
│   │       │   │   ├── zsyscall_linux_mips64.go
│   │       │   │   ├── zsyscall_linux_mips64le.go
│   │       │   │   ├── zsyscall_linux_mipsle.go
│   │       │   │   ├── zsyscall_linux_ppc.go
│   │       │   │   ├── zsyscall_linux_ppc64.go
│   │       │   │   ├── zsyscall_linux_ppc64le.go
│   │       │   │   ├── zsyscall_linux_riscv64.go
│   │       │   │   ├── zsyscall_linux_s390x.go
│   │       │   │   ├── zsyscall_linux_sparc64.go
│   │       │   │   ├── zsyscall_netbsd_386.go
│   │       │   │   ├── zsyscall_netbsd_amd64.go
│   │       │   │   ├── zsyscall_netbsd_arm.go
│   │       │   │   ├── zsyscall_netbsd_arm64.go
│   │       │   │   ├── zsyscall_openbsd_386.go
│   │       │   │   ├── zsyscall_openbsd_386.s
│   │       │   │   ├── zsyscall_openbsd_amd64.go
│   │       │   │   ├── zsyscall_openbsd_amd64.s
│   │       │   │   ├── zsyscall_openbsd_arm.go
│   │       │   │   ├── zsyscall_openbsd_arm.s
│   │       │   │   ├── zsyscall_openbsd_arm64.go
│   │       │   │   ├── zsyscall_openbsd_arm64.s
│   │       │   │   ├── zsyscall_openbsd_mips64.go
│   │       │   │   ├── zsyscall_openbsd_mips64.s
│   │       │   │   ├── zsyscall_openbsd_ppc64.go
│   │       │   │   ├── zsyscall_openbsd_ppc64.s
│   │       │   │   ├── zsyscall_openbsd_riscv64.go
│   │       │   │   ├── zsyscall_openbsd_riscv64.s
│   │       │   │   ├── zsyscall_solaris_amd64.go
│   │       │   │   ├── zsyscall_zos_s390x.go
│   │       │   │   ├── zsysctl_openbsd_386.go
│   │       │   │   ├── zsysctl_openbsd_amd64.go
│   │       │   │   ├── zsysctl_openbsd_arm.go
│   │       │   │   ├── zsysctl_openbsd_arm64.go
│   │       │   │   ├── zsysctl_openbsd_mips64.go
│   │       │   │   ├── zsysctl_openbsd_ppc64.go
│   │       │   │   ├── zsysctl_openbsd_riscv64.go
│   │       │   │   ├── zsysnum_darwin_amd64.go
│   │       │   │   ├── zsysnum_darwin_arm64.go
│   │       │   │   ├── zsysnum_dragonfly_amd64.go
│   │       │   │   ├── zsysnum_freebsd_386.go
│   │       │   │   ├── zsysnum_freebsd_amd64.go
│   │       │   │   ├── zsysnum_freebsd_arm.go
│   │       │   │   ├── zsysnum_freebsd_arm64.go
│   │       │   │   ├── zsysnum_freebsd_riscv64.go
│   │       │   │   ├── zsysnum_linux_386.go
│   │       │   │   ├── zsysnum_linux_amd64.go
│   │       │   │   ├── zsysnum_linux_arm.go
│   │       │   │   ├── zsysnum_linux_arm64.go
│   │       │   │   ├── zsysnum_linux_loong64.go
│   │       │   │   ├── zsysnum_linux_mips.go
│   │       │   │   ├── zsysnum_linux_mips64.go
│   │       │   │   ├── zsysnum_linux_mips64le.go
│   │       │   │   ├── zsysnum_linux_mipsle.go
│   │       │   │   ├── zsysnum_linux_ppc.go
│   │       │   │   ├── zsysnum_linux_ppc64.go
│   │       │   │   ├── zsysnum_linux_ppc64le.go
│   │       │   │   ├── zsysnum_linux_riscv64.go
│   │       │   │   ├── zsysnum_linux_s390x.go
│   │       │   │   ├── zsysnum_linux_sparc64.go
│   │       │   │   ├── zsysnum_netbsd_386.go
│   │       │   │   ├── zsysnum_netbsd_amd64.go
│   │       │   │   ├── zsysnum_netbsd_arm.go
│   │       │   │   ├── zsysnum_netbsd_arm64.go
│   │       │   │   ├── zsysnum_openbsd_386.go
│   │       │   │   ├── zsysnum_openbsd_amd64.go
│   │       │   │   ├── zsysnum_openbsd_arm.go
│   │       │   │   ├── zsysnum_openbsd_arm64.go
│   │       │   │   ├── zsysnum_openbsd_mips64.go
│   │       │   │   ├── zsysnum_openbsd_ppc64.go
│   │       │   │   ├── zsysnum_openbsd_riscv64.go
│   │       │   │   ├── zsysnum_zos_s390x.go
│   │       │   │   ├── ztypes_aix_ppc.go
│   │       │   │   ├── ztypes_aix_ppc64.go
│   │       │   │   ├── ztypes_darwin_amd64.go
│   │       │   │   ├── ztypes_darwin_arm64.go
│   │       │   │   ├── ztypes_dragonfly_amd64.go
│   │       │   │   ├── ztypes_freebsd_386.go
│   │       │   │   ├── ztypes_freebsd_amd64.go
│   │       │   │   ├── ztypes_freebsd_arm.go
│   │       │   │   ├── ztypes_freebsd_arm64.go
│   │       │   │   ├── ztypes_freebsd_riscv64.go
│   │       │   │   ├── ztypes_linux.go
│   │       │   │   ├── ztypes_linux_386.go
│   │       │   │   ├── ztypes_linux_amd64.go
│   │       │   │   ├── ztypes_linux_arm.go
│   │       │   │   ├── ztypes_linux_arm64.go
│   │       │   │   ├── ztypes_linux_loong64.go
│   │       │   │   ├── ztypes_linux_mips.go
│   │       │   │   ├── ztypes_linux_mips64.go
│   │       │   │   ├── ztypes_linux_mips64le.go
│   │       │   │   ├── ztypes_linux_mipsle.go
│   │       │   │   ├── ztypes_linux_ppc.go
│   │       │   │   ├── ztypes_linux_ppc64.go
│   │       │   │   ├── ztypes_linux_ppc64le.go
│   │       │   │   ├── ztypes_linux_riscv64.go
│   │       │   │   ├── ztypes_linux_s390x.go
│   │       │   │   ├── ztypes_linux_sparc64.go
│   │       │   │   ├── ztypes_netbsd_386.go
│   │       │   │   ├── ztypes_netbsd_amd64.go
│   │       │   │   ├── ztypes_netbsd_arm.go
│   │       │   │   ├── ztypes_netbsd_arm64.go
│   │       │   │   ├── ztypes_openbsd_386.go
│   │       │   │   ├── ztypes_openbsd_amd64.go
│   │       │   │   ├── ztypes_openbsd_arm.go
│   │       │   │   ├── ztypes_openbsd_arm64.go
│   │       │   │   ├── ztypes_openbsd_mips64.go
│   │       │   │   ├── ztypes_openbsd_ppc64.go
│   │       │   │   ├── ztypes_openbsd_riscv64.go
│   │       │   │   ├── ztypes_solaris_amd64.go
│   │       │   │   └── ztypes_zos_s390x.go
│   │       │   └── windows/
│   │       │       ├── aliases.go
│   │       │       ├── dll_windows.go
│   │       │       ├── empty.s
│   │       │       ├── env_windows.go
│   │       │       ├── eventlog.go
│   │       │       ├── exec_windows.go
│   │       │       ├── memory_windows.go
│   │       │       ├── mkerrors.bash
│   │       │       ├── mkknownfolderids.bash
│   │       │       ├── mksyscall.go
│   │       │       ├── race.go
│   │       │       ├── race0.go
│   │       │       ├── security_windows.go
│   │       │       ├── service.go
│   │       │       ├── setupapi_windows.go
│   │       │       ├── str.go
│   │       │       ├── syscall.go
│   │       │       ├── syscall_windows.go
│   │       │       ├── types_windows.go
│   │       │       ├── types_windows_386.go
│   │       │       ├── types_windows_amd64.go
│   │       │       ├── types_windows_arm.go
│   │       │       ├── types_windows_arm64.go
│   │       │       ├── zerrors_windows.go
│   │       │       ├── zknownfolderids_windows.go
│   │       │       └── zsyscall_windows.go
│   │       └── text/
│   │           ├── LICENSE
│   │           ├── PATENTS
│   │           ├── encoding/
│   │           │   ├── charmap/
│   │           │   │   ├── charmap.go
│   │           │   │   └── tables.go
│   │           │   ├── encoding.go
│   │           │   └── internal/
│   │           │       ├── identifier/
│   │           │       │   ├── identifier.go
│   │           │       │   └── mib.go
│   │           │       └── internal.go
│   │           └── transform/
│   │               └── transform.go
│   └── modules.txt
└── views.go

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome: https://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
charset = utf-8

[{*.go,Makefile}]
indent_style = tab


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Logs**
If applicable, add the link to a pastebin with the output of `noisetorch -log` and `pactl list short`.

**Desktop (please complete the following information):**
 - Distribution [e.g. Ubuntu 22.04, Arch]: 
 - DE [e.g. Plasma 5.24.5, GNOME 42.0]: 
 - Pulseaudio/Pipewire Version: 
 - NoiseTorch-ng Version [e.g. v0.12.0]:

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  - package-ecosystem: "gomod" # See documentation for possible values
    directory: "/" # Location of package manifests
    schedule:
      interval: "daily"
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "daily"
  - package-ecosystem: "gitsubmodule"
    directory: "/"
    schedule:
      interval: "weekly"


================================================
FILE: .github/workflows/build-artifact.yml
================================================
---
name: Build Dev Artifact

on:
  push:
    branches:
      - 'master'
  pull_request:

permissions:
  contents: read
  pull-requests: read

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-go@v4
        with:
          go-version: 1.18
      - uses: actions/checkout@v4
      - run: make dev
      - uses: actions/upload-artifact@v3
        with:
          name: linux_x64
          path: ${{ github.workspace }}/bin/noisetorch


================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"

on:
  push:
    branches: [ master ]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [ master ]
  schedule:
    - cron: '18 16 * * 3'

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: [ 'cpp', 'go', 'python' ]
        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support

    steps:
    - name: Checkout repository
      uses: actions/checkout@v4

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v2
      with:
        languages: ${{ matrix.language }}
        # If you wish to specify custom queries, you can do so here or in a config file.
        # By default, queries listed here will override any specified in a config file.
        # Prefix the list here with "+" to use these queries and those in the config file.
        
        # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
        queries: security-extended
        
    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
    # If this step fails, then you should remove it and run the build manually (see below)
    # - name: Autobuild
    #   uses: github/codeql-action/autobuild@v2

    # ℹ️ Command-line programs to run using the OS shell.
    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun

    #   If the Autobuild fails above, remove it and uncomment the following three lines. 
    #   modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.

    - run: |
        make dev

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v2


================================================
FILE: .github/workflows/flawfinder.yml
================================================
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

name: flawfinder

on:
  push:
    branches: [ master, main ]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [ master, main ]
  schedule:
    - cron: '17 0 * * 1'

jobs:
  flawfinder:
    name: Flawfinder
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: flawfinder_scan
        uses: david-a-wheeler/flawfinder@c57197cd6061453f10a496f30a732bc1905918d1
        with:
          arguments: '--sarif ./c/'
          output: 'flawfinder_results.sarif'

      - name: Upload analysis results to GitHub Security tab
        uses: github/codeql-action/upload-sarif@v2
        with:
          sarif_file: ${{github.workspace}}/flawfinder_results.sarif


================================================
FILE: .github/workflows/golangci-lint.yml
================================================
name: golangci-lint
on:
  push:
    tags:
      - v*
    branches:
      - master
      - main
  pull_request:
permissions:
  contents: read
  # Optional: allow read access to pull request. Use with `only-new-issues` option.
  pull-requests: read
jobs:
  golangci:
    name: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-go@v4
        with:
          go-version: 1.18
      - uses: actions/checkout@v4
      - run: make rnnoise
      - name: golangci-lint
        uses: golangci/golangci-lint-action@v3
        with:
          # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version
          version: v1.46.2

          # Optional: working directory, useful for monorepos
          # working-directory: somedir

          # Optional: golangci-lint command line arguments.
          # args: --issues-exit-code=0

          # Optional: show only new issues if it's a pull request. The default value is `false`.
          only-new-issues: true

          # Optional: if set to true then the all caching functionality will be complete disabled,
          #           takes precedence over all other caching options.
          # skip-cache: true

          # Optional: if set to true then the action don't cache or restore ~/go/pkg.
          # skip-pkg-cache: true

          # Optional: if set to true then the action don't cache or restore ~/.cache/go-build.
          # skip-build-cache: true


================================================
FILE: .github/workflows/release.yml
================================================
---
name: release

on:
  push:
    tags:
      - "v*.*.*"

permissions:
  contents: write

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-go@v4
        with:
          go-version: 1.18
      - uses: actions/checkout@v4
      - name: Build release artifact
        run: |
          mkdir -p ~/.config/noisetorch
          echo '${{ secrets.NOISETORCH_SIGNER_PRIVKEY_BASE64 }}' | base64 -d > ~/.config/noisetorch/private.key
          make release
          rm -rf ~/.config/noisetorch/
          for f in bin/NoiseTorch_x64_*.tgz ; do md5sum ${f} | tee ${f}.md5sum ; sha512sum ${f} | tee ${f}.sha512sum ; done
      - name: Release
        uses: softprops/action-gh-release@v1
        with:
          files: |
            ${{ github.workspace }}/bin/NoiseTorch_x64_*.tgz
            ${{ github.workspace }}/bin/NoiseTorch_x64_*.tgz.sig
            ${{ github.workspace }}/bin/NoiseTorch_x64_*.tgz.md5sum
            ${{ github.workspace }}/bin/NoiseTorch_x64_*.tgz.sha512sum


================================================
FILE: .gitignore
================================================
bin/
licenses.go
.vscode
*.sublime-workspace
*.sublime-project


================================================
FILE: .gitmodules
================================================
[submodule "c/rnnoise"]
	path = c/rnnoise
	url = https://github.com/noisetorch/rnnoise
[submodule "c/c-ringbuf"]
	path = c/c-ringbuf
	url = https://github.com/noisetorch/c-ringbuf


================================================
FILE: LICENSE
================================================
NoiseTorch (c) 2020-2021 lawl (github.com/lawl)
NoiseTorch-ng (c) 2022 NoiseTorch Community (https://github.com/noisetorch)

This software is distributed under the GNU General Public License Version 3 ("GPLv3").

In accordance with Section 7, subsection `c` of the GPLv3 the following additional term(s) apply:

  * Conveying modified versions of the program "NoiseTorch" must be marked as modified in a reasonable way.
    Modified versions may not be conveyed to others under the name "NoiseTorch".
    Package names, source code, user interfaces and other visible appearances of the program name should make it obvious for users
    and potential users that the modified version differs from the original version of NoiseTorch it is based upon.

  * The above term does not apply to this program's name ("NoiseTorch-ng") as it is a different name.
    You may convey modified versions of this program under the name "NoiseTorch-ng".



                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: Makefile
================================================
NAME_SUFFIX=
UPDATE_URL=https://github.com/noisetorch/NoiseTorch/releases/download/
WEBSITE_URL=https://github.com/noisetorch/NoiseTorch

UPDATE_PUBKEY=Md2rdsS+b6W0trgcqa5lAWP978Zj0sFmubJ252OPKwc=
VERSION := $(shell git describe --tags)

dev: rnnoise
	mkdir -p bin/
	go generate
	go build -ldflags '-X main.nameSuffix=${NAME_SUFFIX}_(dev) -X main.version=${VERSION} -X main.websiteURL=${WEBSITE_URL}' -o bin/noisetorch
release: rnnoise
	mkdir -p bin/
	mkdir -p tmp/

	mkdir -p tmp/.local/share/icons/hicolor/256x256/apps/
	cp assets/icon/noisetorch.png tmp/.local/share/icons/hicolor/256x256/apps/

	mkdir -p tmp/.local/share/applications/
	cp assets/noisetorch.desktop tmp/.local/share/applications/

	mkdir -p tmp/.local/bin/
	go generate
	CGO_ENABLED=0 GOOS=linux go build -trimpath -tags release -a -ldflags '-s -w -extldflags "-static" -X main.nameSuffix=${NAME_SUFFIX} -X main.version=${VERSION} -X main.distribution=official -X main.updateURL=${UPDATE_URL} -X main.publicKeyString=${UPDATE_PUBKEY} -X main.websiteURL=${WEBSITE_URL}' .
	mv noisetorch tmp/.local/bin/
	cd tmp/; \
	tar cvzf ../bin/NoiseTorch_x64_${VERSION}.tgz .
	rm -rf tmp/
	go run scripts/signer.go -s -f bin/NoiseTorch_x64_${VERSION}.tgz
rnnoise:
	git submodule update --init --recursive
	$(MAKE) -C c/ladspa


================================================
FILE: README.md
================================================
<h1 align="center"> NoiseTorch-ng</h1>
<h3 align="center"> Noise Supression Application for PulseAudio or Pipewire</h3>
<p align="center"><img src="https://raw.githubusercontent.com/noisetorch/NoiseTorch/master/assets/icon/noisetorch.png" width="100" height="100"></p> 


<div align="center">
    
  <a href="">[![Licence][licence]][licence-url]</a>
  <a href="">[![Latest][version]][version-url]</a>
    
</div>

[licence]: https://img.shields.io/badge/License-GPLv3-blue.svg
[licence-url]: https://www.gnu.org/licenses/gpl-3.0
[version]: https://img.shields.io/github/v/release/noisetorch/NoiseTorch?label=Latest&style=flat
[version-url]: https://github.com/noisetorch/NoiseTorch/releases
[stars-shield]: https://img.shields.io/github/stars/noisetorch/NoiseTorch?maxAge=2592000
[stars-url]: https://github.com/noisetorch/NoiseTorch/stargazers/

NoiseTorch-ng is an easy to use open source application for Linux with PulseAudio or PipeWire. It creates a virtual microphone that suppresses noise in any application using [RNNoise](https://github.com/xiph/rnnoise). Use whichever conferencing or VOIP application you like and simply select the filtered Virtual Microphone as input to torch the sound of your mechanical keyboard, computer fans, trains and the likes.

Don't forget to leave a star ⭐ if this sounds useful to you! 

## Regarding the recent security incident

Due to a suspected security breach of the update server and code repository, there's
 been a concerted effort by the NoiseTorch community to ensure the source code and
 binaries are free from malicious code.
 
 > No malicious code has been found.
 
 You can read more about the audit that was done [here](https://github.com/noisetorch/NoiseTorch/discussions/275)
 and [here](https://github.com/noisetorch/NoiseTorch/discussions/264).
 Updates will now be retrieved from the project's releases page to avoid any risk
 of this reoccurring. We thank everyone for their trust and the love that they've
 shown towards the project in this unpleasant time. 

## Screenshot

![](https://i.imgur.com/T2wH0bl.png)

Then simply select "Filtered" as your microphone in any application. OBS, Mumble, Discord, anywhere.

![](https://i.imgur.com/nimi7Ne.png)

## Demo

Linux For Everyone has a good demo video [here](https://www.youtube.com/watch?v=DzN9rYNeeIU).

## Features
* Two click setup of your virtual denoising microphone
* A single, small, statically linked, self-contained binary

## Download & Install

[Download the latest release from GitHub](https://github.com/noisetorch/NoiseTorch/releases).

Unpack the `tgz` file, into your home directory.

    tar -C $HOME -h -xzf NoiseTorch_x64_v0.12.2.tgz

This will unpack the application, icon and desktop entry to the correct place.  
Depending on your desktop environment you may need to wait for it to rescan for applications, or tell it to do a refresh now.

With gnome this can be done with:

    gtk-update-icon-cache

You now have a `noisetorch` binary and desktop entry on your system.

Give it the required permissions with `setcap`:

    sudo setcap 'CAP_SYS_RESOURCE=+ep' ~/.local/bin/noisetorch

If NoiseTorch-ng doesn't start after installation, you may also have to make sure that `~/.local/bin` is in your PATH. On most distributions e.g. Ubuntu, this should be the case by default. If it's not, make sure to append

```
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi
```

to your `~/.profile`. If you do already have that, you may have to log in and out for it to actually apply if this is the first time you're using `~/.local/bin`.

#### Uninstall

    rm ~/.local/bin/noisetorch
    rm ~/.local/share/applications/noisetorch.desktop
    rm ~/.local/share/icons/hicolor/256x256/apps/noisetorch.png 

## Troubleshooting

Please see the [Troubleshooting](https://github.com/noisetorch/NoiseTorch/wiki/Troubleshooting) section in the wiki.

## Usage

Select the microphone you want to denoise, and click "Load", NoiseTorch-ng will create a virtual microphone called "Filtered Microphone" that you can select in any application. Output filtering works the same way, simply output the applications you want to filter to "Filtered Headphones".

When you're done using it, simply click "Unload" to remove it again, until you need it next time.

The slider "Voice Activation Threshold" under settings, allows you to choose how strict NoiseTorch-ng should be in only allowing your microphone to send sounds when it detects voice.. Generally you want this up as high as possible. With a decent microphone, you can turn this to the maximum of 95%. If you cut out during talking, slowly lower this strictness until you find a value that works for you.

If you set this to 0%, NoiseTorch-ng will still dampen noise, but not deactivate your microphone if it doesn't detect voice.

Please keep in mind that you will need to reload NoiseTorch-ng for these changes to apply.

Once NoiseTorch-ng has been loaded, feel free to close the window, the virtual microphone will continue working until you explicitly unload it. The NoiseTorch-ng process is not required anymore once it has been loaded.

## FAQs

### Latency

NoiseTorch-ng may introduce a small amount of latency for microphone filtering. The amount of inherent latency introduced by noise supression is 10ms, this is very low and should not be a problem. Additionally PulseAudio currently introduces a variable amount of latency that depends on your system. Lowering this latency [requires a change in PulseAudio](https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/120).

Output filtering currently introduces something on the order of ~100ms with pulseaudio. This should still be fine for regular conferences, VOIPing and gaming. Maybe not for competitive gaming teams.

### Alternatives

- [noise-suppression-for-voice](https://github.com/werman/noise-suppression-for-voice): Denoising software which uses rnnoise. More complex to configure but offers more options. Requires more use of the terminal.

- [Easy Effects](https://github.com/wwmm/easyeffects): Package which offers a large number of different audio effects such as echo cancellation or noise removal. More complex to configure and only supports PipeWire. Denoising uses rnnoise.

## Building from source

Install the Go compiler from [golang.org](https://golang.org/). And make sure you have a working C++ compiler.

```shell
 git clone https://github.com/noisetorch/NoiseTorch # Clone the repository
 cd NoiseTorch # cd into the cloned repository
 make # build it
```

To install it:

```shell
mkdir -p  ~/.local/bin
cp ./bin/noisetorch ~/.local/bin/
cp ./assets/noisetorch.desktop ~/.local/share/applications
cp ./assets/icon/noisetorch.png ~/.local/share/icons/hicolor/256x256/apps
```

## Special thanks to

* [@lawl](https://github.com/lawl) Creator of NoiseTorch
* [xiph.org](https://xiph.org)/[Mozilla's](https://mozilla.org) excellent [RNNoise](https://jmvalin.ca/demo/rnnoise/).
* [@werman](https://github.com/werman/)'s [noise-suppression-for-voice](https://github.com/werman/noise-suppression-for-voice/) for the inspiration
* [@aarzilli](https://github.com/aarzilli/)'s [nucular](https://github.com/aarzilli/nucular) GUI toolkit for Go.
* [Sallee Design](https://www.salleedesign.com) (info@salleedesign.com)'s Microphone Icon under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)



================================================
FILE: assets/icon/LICENSE
================================================
Artist: Salee Design
        www.salleedesign.com
        info@salleedesign.com
Source: https://iconarchive.com/show/music-icons-by-salleedesign/microphone-foam-green-icon.html
License: CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)

================================================
FILE: assets/noisetorch.desktop
================================================
[Desktop Entry]
Name=NoiseTorch
GenericName=Realtime Noise Suppressor
Comment=Create a virtual microphone that suppresses noise, in any application.
Exec=noisetorch
Icon=noisetorch
Terminal=false
Type=Application
Categories=Audio;AudioVideo;Utility;


================================================
FILE: c/ladspa/.gitignore
================================================
*.o
rnnoise_ladspa.so


================================================
FILE: c/ladspa/Makefile
================================================
default:
	$(CC) -I ../rnnoise/include -Wall -Werror -O2 -c -fPIC ../c-ringbuf/ringbuf.c ../rnnoise/src/*.c module.c
	$(CC) -o rnnoise_ladspa.so *.o -shared -Wl,--version-script=export.txt -lm


================================================
FILE: c/ladspa/export.txt
================================================
{
	global: *ladspa*;
	local: *;
};


================================================
FILE: c/ladspa/ladspa.h
================================================
/* ladspa.h

   Linux Audio Developer's Simple Plugin API Version 1.1[LGPL].
   Copyright (C) 2000-2002 Richard W.E. Furse, Paul Barton-Davis,
   Stefan Westerfeld.
   
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public License
   as published by the Free Software Foundation; either version 2.1 of
   the License, or (at your option) any later version.
   
   This library is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   Lesser General Public License for more details.
   
   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
   USA. */

#ifndef LADSPA_INCLUDED
#define LADSPA_INCLUDED

#define LADSPA_VERSION "1.1"
#define LADSPA_VERSION_MAJOR 1
#define LADSPA_VERSION_MINOR 1

#ifdef __cplusplus
extern "C" {
#endif

/*****************************************************************************/

/* Overview: 

   There is a large number of synthesis packages in use or development
   on the Linux platform at this time. This API (`The Linux Audio
   Developer's Simple Plugin API') attempts to give programmers the
   ability to write simple `plugin' audio processors in C/C++ and link
   them dynamically (`plug') into a range of these packages (`hosts').
   It should be possible for any host and any plugin to communicate
   completely through this interface.

   This API is deliberately short and simple. To achieve compatibility
   with a range of promising Linux sound synthesis packages it
   attempts to find the `greatest common divisor' in their logical
   behaviour. Having said this, certain limiting decisions are
   implicit, notably the use of a fixed type (LADSPA_Data) for all
   data transfer and absence of a parameterised `initialisation'
   phase. See below for the LADSPA_Data typedef.

   Plugins are expected to distinguish between control and audio
   data. Plugins have `ports' that are inputs or outputs for audio or
   control data and each plugin is `run' for a `block' corresponding
   to a short time interval measured in samples. Audio data is
   communicated using arrays of LADSPA_Data, allowing a block of audio
   to be processed by the plugin in a single pass. Control data is
   communicated using single LADSPA_Data values. Control data has a
   single value at the start of a call to the `run()' or `run_adding()'
   function, and may be considered to remain this value for its
   duration. The plugin may assume that all its input and output ports
   have been connected to the relevant data location (see the
   `connect_port()' function below) before it is asked to run.

   Plugins will reside in shared object files suitable for dynamic
   linking by dlopen() and family. The file will provide a number of
   `plugin types' that can be used to instantiate actual plugins
   (sometimes known as `plugin instances') that can be connected
   together to perform tasks.

   This API contains very limited error-handling. */

/*****************************************************************************/

/* Fundamental data type passed in and out of plugin. This data type
   is used to communicate audio samples and control values. It is
   assumed that the plugin will work sensibly given any numeric input
   value although it may have a preferred range (see hints below). 

   For audio it is generally assumed that 1.0f is the `0dB' reference
   amplitude and is a `normal' signal level. */

typedef float LADSPA_Data;

/*****************************************************************************/

/* Special Plugin Properties: 
 
   Optional features of the plugin type are encapsulated in the
   LADSPA_Properties type. This is assembled by ORing individual
   properties together. */

typedef int LADSPA_Properties;

/* Property LADSPA_PROPERTY_REALTIME indicates that the plugin has a
   real-time dependency (e.g. listens to a MIDI device) and so its
   output must not be cached or subject to significant latency. */
#define LADSPA_PROPERTY_REALTIME        0x1

/* Property LADSPA_PROPERTY_INPLACE_BROKEN indicates that the plugin
   may cease to work correctly if the host elects to use the same data
   location for both input and output (see connect_port()). This
   should be avoided as enabling this flag makes it impossible for
   hosts to use the plugin to process audio `in-place.' */
#define LADSPA_PROPERTY_INPLACE_BROKEN  0x2

/* Property LADSPA_PROPERTY_HARD_RT_CAPABLE indicates that the plugin
   is capable of running not only in a conventional host but also in a
   `hard real-time' environment. To qualify for this the plugin must
   satisfy all of the following:

   (1) The plugin must not use malloc(), free() or other heap memory
   management within its run() or run_adding() functions. All new
   memory used in run() must be managed via the stack. These
   restrictions only apply to the run() function.

   (2) The plugin will not attempt to make use of any library
   functions with the exceptions of functions in the ANSI standard C
   and C maths libraries, which the host is expected to provide.

   (3) The plugin will not access files, devices, pipes, sockets, IPC
   or any other mechanism that might result in process or thread
   blocking.
      
   (4) The plugin will take an amount of time to execute a run() or
   run_adding() call approximately of form (A+B*SampleCount) where A
   and B depend on the machine and host in use. This amount of time
   may not depend on input signals or plugin state. The host is left
   the responsibility to perform timings to estimate upper bounds for
   A and B. */
#define LADSPA_PROPERTY_HARD_RT_CAPABLE 0x4

#define LADSPA_IS_REALTIME(x)        ((x) & LADSPA_PROPERTY_REALTIME)
#define LADSPA_IS_INPLACE_BROKEN(x)  ((x) & LADSPA_PROPERTY_INPLACE_BROKEN)
#define LADSPA_IS_HARD_RT_CAPABLE(x) ((x) & LADSPA_PROPERTY_HARD_RT_CAPABLE)

/*****************************************************************************/

/* Plugin Ports: 

   Plugins have `ports' that are inputs or outputs for audio or
   data. Ports can communicate arrays of LADSPA_Data (for audio
   inputs/outputs) or single LADSPA_Data values (for control
   input/outputs). This information is encapsulated in the
   LADSPA_PortDescriptor type which is assembled by ORing individual
   properties together.

   Note that a port must be an input or an output port but not both
   and that a port must be a control or audio port but not both. */

typedef int LADSPA_PortDescriptor;

/* Property LADSPA_PORT_INPUT indicates that the port is an input. */
#define LADSPA_PORT_INPUT   0x1

/* Property LADSPA_PORT_OUTPUT indicates that the port is an output. */
#define LADSPA_PORT_OUTPUT  0x2

/* Property LADSPA_PORT_CONTROL indicates that the port is a control
   port. */
#define LADSPA_PORT_CONTROL 0x4

/* Property LADSPA_PORT_AUDIO indicates that the port is a audio
   port. */
#define LADSPA_PORT_AUDIO   0x8

#define LADSPA_IS_PORT_INPUT(x)   ((x) & LADSPA_PORT_INPUT)
#define LADSPA_IS_PORT_OUTPUT(x)  ((x) & LADSPA_PORT_OUTPUT)
#define LADSPA_IS_PORT_CONTROL(x) ((x) & LADSPA_PORT_CONTROL)
#define LADSPA_IS_PORT_AUDIO(x)   ((x) & LADSPA_PORT_AUDIO)

/*****************************************************************************/

/* Plugin Port Range Hints: 

   The host may wish to provide a representation of data entering or
   leaving a plugin (e.g. to generate a GUI automatically). To make
   this more meaningful, the plugin should provide `hints' to the host
   describing the usual values taken by the data.
   
   Note that these are only hints. The host may ignore them and the
   plugin must not assume that data supplied to it is meaningful. If
   the plugin receives invalid input data it is expected to continue
   to run without failure and, where possible, produce a sensible
   output (e.g. a high-pass filter given a negative cutoff frequency
   might switch to an all-pass mode).
    
   Hints are meaningful for all input and output ports but hints for
   input control ports are expected to be particularly useful.
   
   More hint information is encapsulated in the
   LADSPA_PortRangeHintDescriptor type which is assembled by ORing
   individual hint types together. Hints may require further
   LowerBound and UpperBound information.

   All the hint information for a particular port is aggregated in the
   LADSPA_PortRangeHint structure. */

typedef int LADSPA_PortRangeHintDescriptor;

/* Hint LADSPA_HINT_BOUNDED_BELOW indicates that the LowerBound field
   of the LADSPA_PortRangeHint should be considered meaningful. The
   value in this field should be considered the (inclusive) lower
   bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also
   specified then the value of LowerBound should be multiplied by the
   sample rate. */
#define LADSPA_HINT_BOUNDED_BELOW   0x1

/* Hint LADSPA_HINT_BOUNDED_ABOVE indicates that the UpperBound field
   of the LADSPA_PortRangeHint should be considered meaningful. The
   value in this field should be considered the (inclusive) upper
   bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also
   specified then the value of UpperBound should be multiplied by the
   sample rate. */
#define LADSPA_HINT_BOUNDED_ABOVE   0x2

/* Hint LADSPA_HINT_TOGGLED indicates that the data item should be
   considered a Boolean toggle. Data less than or equal to zero should
   be considered `off' or `false,' and data above zero should be
   considered `on' or `true.' LADSPA_HINT_TOGGLED may not be used in
   conjunction with any other hint except LADSPA_HINT_DEFAULT_0 or
   LADSPA_HINT_DEFAULT_1. */
#define LADSPA_HINT_TOGGLED         0x4

/* Hint LADSPA_HINT_SAMPLE_RATE indicates that any bounds specified
   should be interpreted as multiples of the sample rate. For
   instance, a frequency range from 0Hz to the Nyquist frequency (half
   the sample rate) could be requested by this hint in conjunction
   with LowerBound = 0 and UpperBound = 0.5. Hosts that support bounds
   at all must support this hint to retain meaning. */
#define LADSPA_HINT_SAMPLE_RATE     0x8

/* Hint LADSPA_HINT_LOGARITHMIC indicates that it is likely that the
   user will find it more intuitive to view values using a logarithmic
   scale. This is particularly useful for frequencies and gains. */
#define LADSPA_HINT_LOGARITHMIC     0x10

/* Hint LADSPA_HINT_INTEGER indicates that a user interface would
   probably wish to provide a stepped control taking only integer
   values. Any bounds set should be slightly wider than the actual
   integer range required to avoid floating point rounding errors. For
   instance, the integer set {0,1,2,3} might be described as [-0.1,
   3.1]. */
#define LADSPA_HINT_INTEGER         0x20

/* The various LADSPA_HINT_HAS_DEFAULT_* hints indicate a `normal'
   value for the port that is sensible as a default. For instance,
   this value is suitable for use as an initial value in a user
   interface or as a value the host might assign to a control port
   when the user has not provided one. Defaults are encoded using a
   mask so only one default may be specified for a port. Some of the
   hints make use of lower and upper bounds, in which case the
   relevant bound or bounds must be available and
   LADSPA_HINT_SAMPLE_RATE must be applied as usual. The resulting
   default must be rounded if LADSPA_HINT_INTEGER is present. Default
   values were introduced in LADSPA v1.1. */
#define LADSPA_HINT_DEFAULT_MASK    0x3C0

/* This default values indicates that no default is provided. */
#define LADSPA_HINT_DEFAULT_NONE    0x0

/* This default hint indicates that the suggested lower bound for the
   port should be used. */
#define LADSPA_HINT_DEFAULT_MINIMUM 0x40

/* This default hint indicates that a low value between the suggested
   lower and upper bounds should be chosen. For ports with
   LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.75 +
   log(upper) * 0.25). Otherwise, this should be (lower * 0.75 + upper
   * 0.25). */
#define LADSPA_HINT_DEFAULT_LOW     0x80

/* This default hint indicates that a middle value between the
   suggested lower and upper bounds should be chosen. For ports with
   LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.5 +
   log(upper) * 0.5). Otherwise, this should be (lower * 0.5 + upper *
   0.5). */
#define LADSPA_HINT_DEFAULT_MIDDLE  0xC0

/* This default hint indicates that a high value between the suggested
   lower and upper bounds should be chosen. For ports with
   LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.25 +
   log(upper) * 0.75). Otherwise, this should be (lower * 0.25 + upper
   * 0.75). */
#define LADSPA_HINT_DEFAULT_HIGH    0x100

/* This default hint indicates that the suggested upper bound for the
   port should be used. */
#define LADSPA_HINT_DEFAULT_MAXIMUM 0x140

/* This default hint indicates that the number 0 should be used. Note
   that this default may be used in conjunction with
   LADSPA_HINT_TOGGLED. */
#define LADSPA_HINT_DEFAULT_0       0x200

/* This default hint indicates that the number 1 should be used. Note
   that this default may be used in conjunction with
   LADSPA_HINT_TOGGLED. */
#define LADSPA_HINT_DEFAULT_1       0x240

/* This default hint indicates that the number 100 should be used. */
#define LADSPA_HINT_DEFAULT_100     0x280

/* This default hint indicates that the Hz frequency of `concert A'
   should be used. This will be 440 unless the host uses an unusual
   tuning convention, in which case it may be within a few Hz. */
#define LADSPA_HINT_DEFAULT_440     0x2C0

#define LADSPA_IS_HINT_BOUNDED_BELOW(x)   ((x) & LADSPA_HINT_BOUNDED_BELOW)
#define LADSPA_IS_HINT_BOUNDED_ABOVE(x)   ((x) & LADSPA_HINT_BOUNDED_ABOVE)
#define LADSPA_IS_HINT_TOGGLED(x)         ((x) & LADSPA_HINT_TOGGLED)
#define LADSPA_IS_HINT_SAMPLE_RATE(x)     ((x) & LADSPA_HINT_SAMPLE_RATE)
#define LADSPA_IS_HINT_LOGARITHMIC(x)     ((x) & LADSPA_HINT_LOGARITHMIC)
#define LADSPA_IS_HINT_INTEGER(x)         ((x) & LADSPA_HINT_INTEGER)

#define LADSPA_IS_HINT_HAS_DEFAULT(x)     ((x) & LADSPA_HINT_DEFAULT_MASK)
#define LADSPA_IS_HINT_DEFAULT_MINIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK)   \
                                           == LADSPA_HINT_DEFAULT_MINIMUM)
#define LADSPA_IS_HINT_DEFAULT_LOW(x)     (((x) & LADSPA_HINT_DEFAULT_MASK)   \
                                           == LADSPA_HINT_DEFAULT_LOW)
#define LADSPA_IS_HINT_DEFAULT_MIDDLE(x)  (((x) & LADSPA_HINT_DEFAULT_MASK)   \
                                           == LADSPA_HINT_DEFAULT_MIDDLE)
#define LADSPA_IS_HINT_DEFAULT_HIGH(x)    (((x) & LADSPA_HINT_DEFAULT_MASK)   \
                                           == LADSPA_HINT_DEFAULT_HIGH)
#define LADSPA_IS_HINT_DEFAULT_MAXIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK)   \
                                           == LADSPA_HINT_DEFAULT_MAXIMUM)
#define LADSPA_IS_HINT_DEFAULT_0(x)       (((x) & LADSPA_HINT_DEFAULT_MASK)   \
                                           == LADSPA_HINT_DEFAULT_0)
#define LADSPA_IS_HINT_DEFAULT_1(x)       (((x) & LADSPA_HINT_DEFAULT_MASK)   \
                                           == LADSPA_HINT_DEFAULT_1)
#define LADSPA_IS_HINT_DEFAULT_100(x)     (((x) & LADSPA_HINT_DEFAULT_MASK)   \
                                           == LADSPA_HINT_DEFAULT_100)
#define LADSPA_IS_HINT_DEFAULT_440(x)     (((x) & LADSPA_HINT_DEFAULT_MASK)   \
                                            == LADSPA_HINT_DEFAULT_440)

typedef struct _LADSPA_PortRangeHint {

  /* Hints about the port. */
  LADSPA_PortRangeHintDescriptor HintDescriptor;

  /* Meaningful when hint LADSPA_HINT_BOUNDED_BELOW is active. When
     LADSPA_HINT_SAMPLE_RATE is also active then this value should be
     multiplied by the relevant sample rate. */
  LADSPA_Data LowerBound;

  /* Meaningful when hint LADSPA_HINT_BOUNDED_ABOVE is active. When
     LADSPA_HINT_SAMPLE_RATE is also active then this value should be
     multiplied by the relevant sample rate. */
  LADSPA_Data UpperBound;

} LADSPA_PortRangeHint;

/*****************************************************************************/

/* Plugin Handles: 

   This plugin handle indicates a particular instance of the plugin
   concerned. It is valid to compare this to NULL (0 for C++) but
   otherwise the host should not attempt to interpret it. The plugin
   may use it to reference internal instance data. */

typedef void * LADSPA_Handle;

/*****************************************************************************/

/* Descriptor for a Type of Plugin: 

   This structure is used to describe a plugin type. It provides a
   number of functions to examine the type, instantiate it, link it to
   buffers and workspaces and to run it. */

typedef struct _LADSPA_Descriptor { 

  /* This numeric identifier indicates the plugin type
     uniquely. Plugin programmers may reserve ranges of IDs from a
     central body to avoid clashes. Hosts may assume that IDs are
     below 0x1000000. */
  unsigned long UniqueID;

  /* This identifier can be used as a unique, case-sensitive
     identifier for the plugin type within the plugin file. Plugin
     types should be identified by file and label rather than by index
     or plugin name, which may be changed in new plugin
     versions. Labels must not contain white-space characters. */
  const char * Label;

  /* This indicates a number of properties of the plugin. */
  LADSPA_Properties Properties;

  /* This member points to the null-terminated name of the plugin
     (e.g. "Sine Oscillator"). */
  const char * Name;

  /* This member points to the null-terminated string indicating the
     maker of the plugin. This can be an empty string but not NULL. */
  const char * Maker;

  /* This member points to the null-terminated string indicating any
     copyright applying to the plugin. If no Copyright applies the
     string "None" should be used. */
  const char * Copyright;

  /* This indicates the number of ports (input AND output) present on
     the plugin. */
  unsigned long PortCount;

  /* This member indicates an array of port descriptors. Valid indices
     vary from 0 to PortCount-1. */
  const LADSPA_PortDescriptor * PortDescriptors;

  /* This member indicates an array of null-terminated strings
     describing ports (e.g. "Frequency (Hz)"). Valid indices vary from
     0 to PortCount-1. */
  const char * const * PortNames;

  /* This member indicates an array of range hints for each port (see
     above). Valid indices vary from 0 to PortCount-1. */
  const LADSPA_PortRangeHint * PortRangeHints;

  /* This may be used by the plugin developer to pass any custom
     implementation data into an instantiate call. It must not be used
     or interpreted by the host. It is expected that most plugin
     writers will not use this facility as LADSPA_Handle should be
     used to hold instance data. */
  void * ImplementationData;

  /* This member is a function pointer that instantiates a plugin. A
     handle is returned indicating the new plugin instance. The
     instantiation function accepts a sample rate as a parameter. The
     plugin descriptor from which this instantiate function was found
     must also be passed. This function must return NULL if
     instantiation fails. 

     Note that instance initialisation should generally occur in
     activate() rather than here. */
  LADSPA_Handle (*instantiate)(const struct _LADSPA_Descriptor * Descriptor,
                               unsigned long                     SampleRate);

  /* This member is a function pointer that connects a port on an
     instantiated plugin to a memory location at which a block of data
     for the port will be read/written. The data location is expected
     to be an array of LADSPA_Data for audio ports or a single
     LADSPA_Data value for control ports. Memory issues will be
     managed by the host. The plugin must read/write the data at these
     locations every time run() or run_adding() is called and the data
     present at the time of this connection call should not be
     considered meaningful.

     connect_port() may be called more than once for a plugin instance
     to allow the host to change the buffers that the plugin is
     reading or writing. These calls may be made before or after
     activate() or deactivate() calls.

     connect_port() must be called at least once for each port before
     run() or run_adding() is called. When working with blocks of
     LADSPA_Data the plugin should pay careful attention to the block
     size passed to the run function as the block allocated may only
     just be large enough to contain the block of samples.

     Plugin writers should be aware that the host may elect to use the
     same buffer for more than one port and even use the same buffer
     for both input and output (see LADSPA_PROPERTY_INPLACE_BROKEN).
     However, overlapped buffers or use of a single buffer for both
     audio and control data may result in unexpected behaviour. */
   void (*connect_port)(LADSPA_Handle Instance,
                        unsigned long Port,
                        LADSPA_Data * DataLocation);

  /* This member is a function pointer that initialises a plugin
     instance and activates it for use. This is separated from
     instantiate() to aid real-time support and so that hosts can
     reinitialise a plugin instance by calling deactivate() and then
     activate(). In this case the plugin instance must reset all state
     information dependent on the history of the plugin instance
     except for any data locations provided by connect_port() and any
     gain set by set_run_adding_gain(). If there is nothing for
     activate() to do then the plugin writer may provide a NULL rather
     than an empty function.

     When present, hosts must call this function once before run() (or
     run_adding()) is called for the first time. This call should be
     made as close to the run() call as possible and indicates to
     real-time plugins that they are now live. Plugins should not rely
     on a prompt call to run() after activate(). activate() may not be
     called again unless deactivate() is called first. Note that
     connect_port() may be called before or after a call to
     activate(). */
  void (*activate)(LADSPA_Handle Instance);

  /* This method is a function pointer that runs an instance of a
     plugin for a block. Two parameters are required: the first is a
     handle to the particular instance to be run and the second
     indicates the block size (in samples) for which the plugin
     instance may run.

     Note that if an activate() function exists then it must be called
     before run() or run_adding(). If deactivate() is called for a
     plugin instance then the plugin instance may not be reused until
     activate() has been called again.

     If the plugin has the property LADSPA_PROPERTY_HARD_RT_CAPABLE
     then there are various things that the plugin should not do
     within the run() or run_adding() functions (see above). */
  void (*run)(LADSPA_Handle Instance,
              unsigned long SampleCount);

  /* This method is a function pointer that runs an instance of a
     plugin for a block. This has identical behaviour to run() except
     in the way data is output from the plugin. When run() is used,
     values are written directly to the memory areas associated with
     the output ports. However when run_adding() is called, values
     must be added to the values already present in the memory
     areas. Furthermore, output values written must be scaled by the
     current gain set by set_run_adding_gain() (see below) before
     addition.

     run_adding() is optional. When it is not provided by a plugin,
     this function pointer must be set to NULL. When it is provided,
     the function set_run_adding_gain() must be provided also. */
  void (*run_adding)(LADSPA_Handle Instance,
                     unsigned long SampleCount);

  /* This method is a function pointer that sets the output gain for
     use when run_adding() is called (see above). If this function is
     never called the gain is assumed to default to 1. Gain
     information should be retained when activate() or deactivate()
     are called.

     This function should be provided by the plugin if and only if the
     run_adding() function is provided. When it is absent this
     function pointer must be set to NULL. */
  void (*set_run_adding_gain)(LADSPA_Handle Instance,
                              LADSPA_Data   Gain);

  /* This is the counterpart to activate() (see above). If there is
     nothing for deactivate() to do then the plugin writer may provide
     a NULL rather than an empty function.

     Hosts must deactivate all activated units after they have been
     run() (or run_adding()) for the last time. This call should be
     made as close to the last run() call as possible and indicates to
     real-time plugins that they are no longer live. Plugins should
     not rely on prompt deactivation. Note that connect_port() may be
     called before or after a call to deactivate().

     Deactivation is not similar to pausing as the plugin instance
     will be reinitialised when activate() is called to reuse it. */
  void (*deactivate)(LADSPA_Handle Instance);

  /* Once an instance of a plugin has been finished with it can be
     deleted using the following function. The instance handle passed
     ceases to be valid after this call.
  
     If activate() was called for a plugin instance then a
     corresponding call to deactivate() must be made before cleanup()
     is called. */
  void (*cleanup)(LADSPA_Handle Instance);

} LADSPA_Descriptor;

/**********************************************************************/

/* Accessing a Plugin: */

/* The exact mechanism by which plugins are loaded is host-dependent,
   however all most hosts will need to know is the name of shared
   object file containing the plugin types. To allow multiple hosts to
   share plugin types, hosts may wish to check for environment
   variable LADSPA_PATH. If present, this should contain a
   colon-separated path indicating directories that should be searched
   (in order) when loading plugin types.

   A plugin programmer must include a function called
   "ladspa_descriptor" with the following function prototype within
   the shared object file. This function will have C-style linkage (if
   you are using C++ this is taken care of by the `extern "C"' clause
   at the top of the file).

   A host will find the plugin shared object file by one means or
   another, find the ladspa_descriptor() function, call it, and
   proceed from there.

   Plugin types are accessed by index (not ID) using values from 0
   upwards. Out of range indexes must result in this function
   returning NULL, so the plugin count can be determined by checking
   for the least index that results in NULL being returned. */

const LADSPA_Descriptor * ladspa_descriptor(unsigned long Index);

/* Datatype corresponding to the ladspa_descriptor() function. */
typedef const LADSPA_Descriptor * 
(*LADSPA_Descriptor_Function)(unsigned long Index);

/**********************************************************************/

#ifdef __cplusplus
}
#endif

#endif /* LADSPA_INCLUDED */

/* EOF */


================================================
FILE: c/ladspa/module.c
================================================
/*
  (c) Copyright 2021 github.com/lawl GPL3+
  Free software by Richard W.E. Furse. Do with as you will. No
  warranty.
*/

#include <math.h>
#include <stdlib.h>
#include <string.h>

#include "ladspa.h"
#include "utils.h"

#include "../c-ringbuf/ringbuf.h"
#include "../rnnoise/include/rnnoise.h"

#define SF_INPUT 0
#define SF_OUTPUT 1
#define SF_VAD 2

#define FRAMESIZE_NSAMPLES 480
#define FRAMESIZE_BYTES (480 * sizeof(float))

#define VAD_GRACE_PERIOD 20

typedef struct {

  DenoiseState *st;
  ringbuf_t in_buf;
  ringbuf_t out_buf;
  int32_t remaining_grace_period;
  int init;

  LADSPA_Data *m_pfVAD;
  LADSPA_Data *m_pfInput;
  LADSPA_Data *m_pfOutput;

} rnnoiseFilter;

static LADSPA_Handle
instantiateSimpleFilter(const LADSPA_Descriptor *Descriptor,
                        unsigned long SampleRate) {

  rnnoiseFilter *psFilter;

  psFilter = (rnnoiseFilter *)malloc(sizeof(rnnoiseFilter));

  if (psFilter) {
    psFilter->in_buf = ringbuf_new(FRAMESIZE_BYTES * 100);
    psFilter->out_buf = ringbuf_new(FRAMESIZE_BYTES * 100);
    psFilter->init = 0;
    psFilter->remaining_grace_period = VAD_GRACE_PERIOD;
    psFilter->st = rnnoise_create(NULL);
  }

  return psFilter;
}

static void activateSimpleFilter(LADSPA_Handle Instance) {
  
}

static void connectPortToSimpleFilter(LADSPA_Handle Instance,
                                      unsigned long Port,
                                      LADSPA_Data *DataLocation) {

  rnnoiseFilter *psFilter;

  psFilter = (rnnoiseFilter *)Instance;

  switch (Port) {
  case SF_VAD:
    psFilter->m_pfVAD = DataLocation;
    break;
  case SF_INPUT:
    psFilter->m_pfInput = DataLocation;
    break;
  case SF_OUTPUT:
    psFilter->m_pfOutput = DataLocation;
    break;
  }
}

static void runFilter(LADSPA_Handle Instance, unsigned long n_samples) {

  rnnoiseFilter *psFilter;

  psFilter = (rnnoiseFilter *)Instance;

  ringbuf_t in_buf = psFilter->in_buf;
  ringbuf_t out_buf = psFilter->out_buf;

  float *in, *out, vad_thresh;

  in = psFilter->m_pfInput;
  out = psFilter->m_pfOutput;

  vad_thresh = *psFilter->m_pfVAD / 100;

  for (int i = 0; i < n_samples; i++) {
    in[i] = in[i] * 32767;
  }

  ringbuf_memcpy_into(in_buf, in, n_samples * sizeof(float));

  const size_t n_frames = ringbuf_bytes_used(in_buf) / FRAMESIZE_BYTES;
  float tmpin[n_frames * FRAMESIZE_NSAMPLES];
  ringbuf_memcpy_from(tmpin, in_buf, FRAMESIZE_BYTES * n_frames);

  for (int i = 0; i < n_frames; i++) {
    float tmp[FRAMESIZE_NSAMPLES];
    float vad_prob = rnnoise_process_frame(psFilter->st, tmp,
                                           tmpin + (i * FRAMESIZE_NSAMPLES));
    if (vad_prob > vad_thresh) {
      psFilter->remaining_grace_period = VAD_GRACE_PERIOD;
    }

    if (psFilter->remaining_grace_period >= 0) {
      psFilter->remaining_grace_period--;
    } else {
      for (int i = 0; i < FRAMESIZE_NSAMPLES; i++) {
        tmp[i] = 0.f;
      }
    }
    ringbuf_memcpy_into(out_buf, tmp, FRAMESIZE_BYTES);
  }

  int frames_avail = ringbuf_bytes_used(out_buf) / FRAMESIZE_BYTES;
  int samples_avail = frames_avail * FRAMESIZE_NSAMPLES;

  if (samples_avail < n_samples) {
    int skip = n_samples - samples_avail;
    for (int i = 0; i < skip; i++) {
      out[i] = 0.f;
    }
    ringbuf_memcpy_from(out + skip, out_buf, samples_avail * sizeof(float));
  } else {
    ringbuf_memcpy_from(out, out_buf, n_samples * sizeof(float));
  }

  for (int i = 0; i < n_samples; i++) {
    out[i] = out[i] / 32767;
  }
}

static void cleanupFilter(LADSPA_Handle Instance) {
  rnnoiseFilter *psFilter = (rnnoiseFilter *)Instance;
  rnnoise_destroy(psFilter->st);
  ringbuf_free(&(psFilter->in_buf));
  ringbuf_free(&(psFilter->out_buf));
  free(Instance);
}

static LADSPA_Descriptor *g_psDescriptor = NULL;

ON_LOAD_ROUTINE {

  char **pcPortNames;
  LADSPA_PortDescriptor *piPortDescriptors;
  LADSPA_PortRangeHint *psPortRangeHints;

  g_psDescriptor = (LADSPA_Descriptor *)malloc(sizeof(LADSPA_Descriptor));

  if (g_psDescriptor != NULL) {

    g_psDescriptor->UniqueID = 16682994;
    g_psDescriptor->Label = strdup("nt-filter");
    g_psDescriptor->Properties = LADSPA_PROPERTY_HARD_RT_CAPABLE;
    g_psDescriptor->Name = strdup("nt-filter rnnoise ladspa module");
    g_psDescriptor->Maker = strdup("nt-org");
    g_psDescriptor->Copyright = strdup("GPL3+");
    g_psDescriptor->PortCount = 3;
    piPortDescriptors =
        (LADSPA_PortDescriptor *)calloc(3, sizeof(LADSPA_PortDescriptor));
    g_psDescriptor->PortDescriptors =
        (const LADSPA_PortDescriptor *)piPortDescriptors;
    piPortDescriptors[SF_VAD] = LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
    piPortDescriptors[SF_INPUT] = LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO;
    piPortDescriptors[SF_OUTPUT] = LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO;
    pcPortNames = (char **)calloc(3, sizeof(char *));
    g_psDescriptor->PortNames = (const char **)pcPortNames;
    pcPortNames[SF_VAD] = strdup("VAD %%");
    pcPortNames[SF_INPUT] = strdup("Input");
    pcPortNames[SF_OUTPUT] = strdup("Output");
    psPortRangeHints =
        ((LADSPA_PortRangeHint *)calloc(3, sizeof(LADSPA_PortRangeHint)));
    g_psDescriptor->PortRangeHints =
        (const LADSPA_PortRangeHint *)psPortRangeHints;
    psPortRangeHints[SF_VAD].HintDescriptor =
        (LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE);
    psPortRangeHints[SF_VAD].LowerBound = 0;
    psPortRangeHints[SF_VAD].UpperBound = 95;
    psPortRangeHints[SF_INPUT].HintDescriptor = 0;
    psPortRangeHints[SF_OUTPUT].HintDescriptor = 0;
    g_psDescriptor->instantiate = instantiateSimpleFilter;
    g_psDescriptor->connect_port = connectPortToSimpleFilter;
    g_psDescriptor->activate = activateSimpleFilter;
    g_psDescriptor->run = runFilter;
    g_psDescriptor->run_adding = NULL;
    g_psDescriptor->set_run_adding_gain = NULL;
    g_psDescriptor->deactivate = NULL;
    g_psDescriptor->cleanup = cleanupFilter;
  }
}

static void deleteDescriptor(LADSPA_Descriptor *psDescriptor) {
  unsigned long lIndex;
  if (psDescriptor) {
    free((char *)psDescriptor->Label);
    free((char *)psDescriptor->Name);
    free((char *)psDescriptor->Maker);
    free((char *)psDescriptor->Copyright);
    free((LADSPA_PortDescriptor *)psDescriptor->PortDescriptors);
    for (lIndex = 0; lIndex < psDescriptor->PortCount; lIndex++)
      free((char *)(psDescriptor->PortNames[lIndex]));
    free((char **)psDescriptor->PortNames);
    free((LADSPA_PortRangeHint *)psDescriptor->PortRangeHints);
    free(psDescriptor);
  }
}

ON_UNLOAD_ROUTINE { deleteDescriptor(g_psDescriptor); }

const LADSPA_Descriptor *ladspa_descriptor(unsigned long Index) {
  /* Return the requested descriptor or null if the index is out of
     range. */
  switch (Index) {
  case 0:
    return g_psDescriptor;
  default:
    return NULL;
  }
}


================================================
FILE: c/ladspa/utils.h
================================================
/* utils.h

   Free software by Richard W.E. Furse. Do with as you will. No
   warranty. */

#ifndef LADSPA_SDK_LOAD_PLUGIN_LIB
#define LADSPA_SDK_LOAD_PLUGIN_LIB

/*****************************************************************************/

#include "ladspa.h"

/*****************************************************************************/

/* Functions in load.c: */

/* This function call takes a plugin library filename, searches for
   the library along the LADSPA_PATH, loads it with dlopen() and
   returns a plugin handle for use with findPluginDescriptor() or
   unloadLADSPAPluginLibrary(). Errors are handled by writing a
   message to stderr and calling exit(1). It is alright (although
   inefficient) to call this more than once for the same file. */
void * loadLADSPAPluginLibrary(const char * pcPluginFilename);

/* This function unloads a LADSPA plugin library. */
void unloadLADSPAPluginLibrary(void * pvLADSPAPluginLibrary);

/* This function locates a LADSPA plugin within a plugin library
   loaded with loadLADSPAPluginLibrary(). Errors are handled by
   writing a message to stderr and calling exit(1). Note that the
   plugin library filename is only included to help provide
   informative error messages. */
const LADSPA_Descriptor *
findLADSPAPluginDescriptor(void * pvLADSPAPluginLibrary,
			   const char * pcPluginLibraryFilename,
			   const char * pcPluginLabel);

/*****************************************************************************/

/* Functions in search.c: */

/* Callback function for use with LADSPAPluginSearch(). The callback
   function passes the filename (full path), a plugin handle (dlopen()
   style) and a LADSPA_DescriptorFunction (from which
   LADSPA_Descriptors can be acquired). */
typedef void LADSPAPluginSearchCallbackFunction
(const char * pcFullFilename, 
 void * pvPluginHandle,
 LADSPA_Descriptor_Function fDescriptorFunction);

/* Search through the $(LADSPA_PATH) (or a default path) for any
   LADSPA plugin libraries. Each plugin library is tested using
   dlopen() and dlsym(,"ladspa_descriptor"). After loading each
   library, the callback function is called to process it. This
   function leaves items passed to the callback function open. */
void LADSPAPluginSearch(LADSPAPluginSearchCallbackFunction fCallbackFunction);

/*****************************************************************************/

/* Function in default.c: */

/* Find the default value for a port. Return 0 if a default is found
   and -1 if not. */
int getLADSPADefault(const LADSPA_PortRangeHint * psPortRangeHint,
		     const unsigned long          lSampleRate,
		     LADSPA_Data                * pfResult);


/*****************************************************************************/

/* During C pre-processing, take a string (passed in from the
   Makefile) and put quote marks around it. */
#define RAW_STRINGIFY(x) #x
#define EXPAND_AND_STRINGIFY(x) RAW_STRINGIFY(x)

/*****************************************************************************/

#ifndef __cplusplus
/* In C, special incantations are needed to trigger initialisation and
   cleanup routines when a dynamic plugin library is loaded or
   unloaded (e.g. with dlopen() or dlclose()). _init() and _fini() are
   classic exported symbols to achieve this, but these days GNU C
   likes to do things a different way. Ideally we would check the GNU
   version as older ones will probably expect the classic behaviour,
   but for now... */
# if __GNUC__
/* Modern GNU C incantations: */
#  define ON_LOAD_ROUTINE   static void __attribute__ ((constructor)) init()
#  define ON_UNLOAD_ROUTINE static void __attribute__ ((destructor))  fini()
# else
/* Classic incantations: */
#  define ON_LOAD_ROUTINE   void _init()
#  define ON_UNLOAD_ROUTINE void _fini()
# endif
#else
/* In C++, we use the constructor/destructor of a static object to
   manage initialisation and cleanup, so we don't need these
   routines. */
#endif

/*****************************************************************************/

#endif

/* EOF */


================================================
FILE: capability.go
================================================
// This file is part of the program "NoiseTorch-ng".
// Please see the LICENSE file for copyright information.

package main

import (
	"log"
	"os"
	"os/exec"

	"github.com/syndtr/gocapability/capability"
)

func getCurrentCaps() *capability.Capabilities {
	caps, err := capability.NewPid2(0)
	if err != nil {
		log.Fatalf("Could not get self caps: %+v\n", err)
	}

	err = caps.Load()
	if err != nil {
		log.Fatalf("Could not load self caps: %+v\n", err)
	}

	return &caps
}

func getSelfFileCaps() *capability.Capabilities {
	self, err := os.Executable()
	log.Printf("Getting caps for: %s\n", self)
	if err != nil {
		log.Fatalf("Could not get path to own executable: %+v\n", err)
	}
	caps, err := capability.NewFile2(self)
	if err != nil {
		log.Fatalf("Could not get file caps: %+v\n", err)
	}

	err = caps.Load()
	if err != nil {
		log.Fatalf("Could not load file caps: %+v\n", err)
	}

	return &caps
}

func hasCapSysResource(caps *capability.Capabilities) bool {
	return (*caps).Get(capability.EFFECTIVE, capability.CAP_SYS_RESOURCE)
}

func makeBinarySetcapped() error {
	fileCaps := *getSelfFileCaps()
	if !hasCapSysResource(&fileCaps) {
		fileCaps.Set(capability.EFFECTIVE|capability.PERMITTED|capability.INHERITABLE, capability.CAP_SYS_RESOURCE)
		err := fileCaps.Apply(capability.EFFECTIVE | capability.PERMITTED | capability.INHERITABLE)
		if err != nil {
			return err
		}
	}
	return nil
}

func pkexecSetcapSelf() error {
	self, err := os.Executable()
	if err != nil {
		log.Fatalf("Couldn't find path to own binary\n")
		return err
	}

	cmd := exec.Command("pkexec", self, "-setcap")
	log.Printf("Calling: %s\n", cmd.String())
	err = cmd.Run()
	if err != nil {
		log.Printf("Couldn't setcap self as root: %v\n", err)
		return err
	}

	return nil
}


================================================
FILE: cli.go
================================================
// This file is part of the program "NoiseTorch-ng".
// Please see the LICENSE file for copyright information.

package main

import (
	"flag"
	"fmt"
	"os"
	"strings"

	"github.com/blang/semver/v4"
	"github.com/noisetorch/pulseaudio"
)

type CLIOpts struct {
	doLog       bool
	setcap      bool
	sinkName    string
	unload      bool
	loadInput   bool
	loadOutput  bool
	threshold   int
	list        bool
	checkUpdate bool
}

func parseCLIOpts() CLIOpts {
	var opt CLIOpts
	flag.BoolVar(&opt.doLog, "log", false, "Print debugging output to stdout")
	flag.BoolVar(&opt.setcap, "setcap", false, "for internal use only")
	flag.StringVar(&opt.sinkName, "s", "", "Use the specified source/sink device ID")
	flag.BoolVar(&opt.loadInput, "i", false, "Load supressor for input. If no source device ID is specified the default pulse audio source is used.")
	flag.BoolVar(&opt.loadOutput, "o", false, "Load supressor for output. If no source device ID is specified the default pulse audio source is used.")
	flag.BoolVar(&opt.unload, "u", false, "Unload supressor")
	flag.IntVar(&opt.threshold, "t", -1, "Voice activation threshold")
	flag.BoolVar(&opt.list, "l", false, "List available PulseAudio devices")
	flag.BoolVar(&opt.checkUpdate, "c", false, "Check if update is available (but do not update)")
	flag.Parse()

	return opt
}

func doCLI(opt CLIOpts, config *config, librnnoise string) {
	if opt.checkUpdate {
		latestRelease, err := getLatestRelease()
		if err == nil {
			latestVersion, _ := semver.Make(strings.TrimLeft(latestRelease, "v"))
			currentVersion, _ := semver.Make(strings.TrimLeft(version, "v"))
			if currentVersion.Compare(latestVersion) == -1 {
				fmt.Println("New version available: " + latestRelease)
			} else {
				fmt.Println("No update available")
			}
		} else {
			fmt.Println("Cannot look for updates right now.")
		}
		cleanupExit(librnnoise, 0)
	}

	if opt.setcap {
		err := makeBinarySetcapped()
		if err != nil {
			cleanupExit(librnnoise, 1)
		}
		cleanupExit(librnnoise, 0)
	}

	paClient, err := pulseaudio.NewClient()
	if err != nil {
		fmt.Fprintf(os.Stderr, "Couldn't create pulseaudio client: %v\n", err)
		cleanupExit(librnnoise, 1)
	}
	defer paClient.Close()

	ctx := ntcontext{}

	info, err := serverInfo(paClient)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Couldn't fetch audio server info: %s\n", err)
	}
	ctx.serverInfo = info

	ctx.config = config
	ctx.librnnoise = librnnoise

	ctx.paClient = paClient

	if opt.list {
		fmt.Println("Sources:")
		sources := getSources(&ctx, paClient)
		for i := range sources {
			fmt.Printf("\tDevice Name: %s\n\tDevice ID: %s\n\n", sources[i].Name, sources[i].ID)
		}

		fmt.Println("Sinks:")
		sinks := getSinks(&ctx, paClient)
		for i := range sinks {
			fmt.Printf("\tDevice Name: %s\n\tDevice ID: %s\n\n", sinks[i].Name, sinks[i].ID)
		}

		cleanupExit(librnnoise, 0)
	}

	if opt.threshold > 0 {
		if opt.threshold > 95 {
			fmt.Fprintf(os.Stderr, "Threshold of '%d' too high, setting to maximum of 95.\n", opt.threshold)
			ctx.config.Threshold = 95
		} else {
			ctx.config.Threshold = opt.threshold
		}
	}

	if opt.unload {
		err := unloadSupressor(&ctx)
		if err != nil {
			fmt.Fprintf(os.Stderr, "Error unloading PulseAudio Module: %+v\n", err)
			cleanupExit(librnnoise, 1)
		}
		cleanupExit(librnnoise, 0)
	}

	if opt.loadInput {
		sources := getSources(&ctx, paClient)

		if opt.sinkName == "" {
			defaultSource, err := getDefaultSourceID(paClient)
			if err != nil {
				fmt.Fprintf(os.Stderr, "No source specified to load and failed to load default source: %+v\n", err)
				cleanupExit(librnnoise, 1)
			}
			opt.sinkName = defaultSource
		}
		for i := range sources {
			if sources[i].ID == opt.sinkName {
				sources[i].checked = true
				err := loadSupressor(&ctx, &sources[i], &device{})
				if err != nil {
					fmt.Fprintf(os.Stderr, "Error loading PulseAudio Module: %+v\n", err)
					cleanupExit(librnnoise, 1)
				}
				cleanupExit(librnnoise, 0)
			}
		}
		fmt.Fprintf(os.Stderr, "PulseAudio source not found: %s\n", opt.sinkName)
		cleanupExit(librnnoise, 1)

	}
	if opt.loadOutput {
		sinks := getSinks(&ctx, paClient)

		if opt.sinkName == "" {
			defaultSink, err := getDefaultSinkID(paClient)
			if err != nil {
				fmt.Fprintf(os.Stderr, "No sink specified to load and failed to load default sink: %+v\n", err)
				cleanupExit(librnnoise, 1)
			}
			opt.sinkName = defaultSink
		}
		for i := range sinks {
			if sinks[i].ID == opt.sinkName {
				sinks[i].checked = true
				err := loadSupressor(&ctx, &device{}, &sinks[i])
				if err != nil {
					fmt.Fprintf(os.Stderr, "Error loading PulseAudio Module: %+v\n", err)
					cleanupExit(librnnoise, 1)
				}
				cleanupExit(librnnoise, 0)
			}
		}
		fmt.Fprintf(os.Stderr, "PulseAudio sink not found: %s\n", opt.sinkName)
		cleanupExit(librnnoise, 1)

	}

}

func cleanupExit(librnnoise string, exitCode int) {
	removeLib(librnnoise)
	os.Exit(exitCode)
}


================================================
FILE: config.go
================================================
// This file is part of the program "NoiseTorch-ng".
// Please see the LICENSE file for copyright information.

package main

import (
	"bytes"
	"log"
	"os"
	"path/filepath"

	"github.com/BurntSushi/toml"
)

type config struct {
	Threshold             int
	DisplayMonitorSources bool
	EnableUpdates         bool
	FilterInput           bool
	FilterOutput          bool
	LastUsedInput         string
	LastUsedOutput        string
}

const configFile = "config.toml"

func initializeConfigIfNot() {
	log.Println("Checking if config needs to be initialized")

	// if you're a package maintainer and you mess with this, we have a problem.
	// Unless you set -tags release on the build the updater is *not* compiled in anymore. DO NOT MESS WITH THIS!
	// This isn't and never was the proper location to disable the updater.
	conf := config{
		Threshold:             95,
		DisplayMonitorSources: false,
		EnableUpdates:         true,
		FilterInput:           true,
		FilterOutput:          false,
		LastUsedInput:         "",
		LastUsedOutput:        ""}

	configdir := configDir()
	ok, err := exists(configdir)
	if err != nil {
		log.Fatalf("Couldn't check if config directory exists: %v\n", err)
	}
	if !ok {
		err = os.MkdirAll(configdir, 0700)
		if err != nil {
			log.Fatalf("Couldn't create config directory: %v\n", err)
		}
	}
	tomlfile := filepath.Join(configdir, configFile)
	ok, err = exists(tomlfile)
	if err != nil {
		log.Fatalf("Couldn't check if config file exists: %v\n", err)
	}
	if !ok {
		log.Println("Initializing config")
		writeConfig(&conf)
	}
}

func readConfig() *config {
	f := filepath.Join(configDir(), configFile)
	config := config{}
	if _, err := toml.DecodeFile(f, &config); err != nil {
		log.Fatalf("Couldn't read config file: %v\n", err)
	}

	return &config
}

func writeConfig(conf *config) {
	f := filepath.Join(configDir(), configFile)
	var buffer bytes.Buffer
	if err := toml.NewEncoder(&buffer).Encode(&conf); err != nil {
		log.Fatalf("Couldn't write config file: %v\n", err)
	}
	os.WriteFile(f, buffer.Bytes(), 0644)
}

func configDir() string {
	return filepath.Join(xdgOrFallback("XDG_CONFIG_HOME", filepath.Join(os.Getenv("HOME"), ".config")), "noisetorch")
}

func exists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

func xdgOrFallback(xdg string, fallback string) string {
	dir := os.Getenv(xdg)
	if dir != "" {
		if ok, err := exists(dir); ok && err == nil {
			log.Printf("Resolved $%s to '%s'\n", xdg, dir)
			return dir
		}

	}

	log.Printf("Couldn't resolve $%s falling back to '%s'\n", xdg, fallback)
	return fallback
}


================================================
FILE: go.mod
================================================
module noisetorch

go 1.16

require (
	gioui.org v0.0.0-20220105104929-8d8aeef66bef // indirect
	github.com/BurntSushi/toml v1.3.2
	github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect
	github.com/BurntSushi/xgbutil v0.0.0-20190907113008-ad855c713046
	github.com/aarzilli/nucular v0.0.0-20210408133902-d3dd7b05a80a
	github.com/blang/semver/v4 v4.0.0
	github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211213063430-748e38ca8aec // indirect
	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
	github.com/hashicorp/golang-lru v0.5.4 // indirect
	github.com/noisetorch/pulseaudio v0.0.0-20220603053345-9303200c3861
	github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635
	golang.org/x/crypto v0.14.0
	golang.org/x/exp v0.0.0-20220104160115-025e73f80486 // indirect
	golang.org/x/image v0.5.0 // indirect
	golang.org/x/mobile v0.0.0-20220104184238-4a8be17bd2e3 // indirect
)


================================================
FILE: go.sum
================================================
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037 h1:+PdD6GLKejR9DizMAKT5DpSAkKswvZrurk1/eEt9+pw=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
gioui.org v0.0.0-20210407072325-abd6e8f9cdd4/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
gioui.org v0.0.0-20220105104929-8d8aeef66bef h1:vjBKFl76dewHkdOnlEt09daV4/E/oHHnMA4rV7eGH+E=
gioui.org v0.0.0-20220105104929-8d8aeef66bef/go.mod h1:yoWOxPng6WkDpsud+NRmkoftmyWn3rkKsYGEcWHpjTI=
gioui.org/cpu v0.0.0-20210808092351-bfe733dd3334/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ=
gioui.org/cpu v0.0.0-20210817075930-8d6a761490d2 h1:AGDDxsJE1RpcXTAxPG2B4jrwVUJGFDjINIPi1jtO6pc=
gioui.org/cpu v0.0.0-20210817075930-8d6a761490d2/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ=
gioui.org/shader v1.0.6 h1:cvZmU+eODFR2545X+/8XucgZdTtEjR3QWW6W65b0q5Y=
gioui.org/shader v1.0.6/go.mod h1:mWdiME581d/kV7/iEhLmUgUK5iZ09XR5XpduXzbePVM=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc h1:7D+Bh06CRPCJO3gr2F7h1sriovOZ8BMhca2Rg85c2nk=
github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/BurntSushi/xgbutil v0.0.0-20190907113008-ad855c713046 h1:O/r2Sj+8QcMF7V5IcmiE2sMFV2q3J47BEirxbXJAdzA=
github.com/BurntSushi/xgbutil v0.0.0-20190907113008-ad855c713046/go.mod h1:uw9h2sd4WWHOPdJ13MQpwK5qYWKYDumDqxWWIknEQ+k=
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
github.com/aarzilli/nucular v0.0.0-20210408133902-d3dd7b05a80a h1:wHqsWSIZY+TaNApVMZpMKkcBEUmxXCSpT+YKrk3bxnc=
github.com/aarzilli/nucular v0.0.0-20210408133902-d3dd7b05a80a/go.mod h1:lluRCgvXjI+vUUV2Jc07GMFCBLVc/GQx8NaUPgXY+R0=
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211213063430-748e38ca8aec h1:3FLiRYO6PlQFDpUU7OEFlWgjGD1jnBIVSJ5SYRWk+9c=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211213063430-748e38ca8aec/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/golang/freetype v0.0.0-20161208064710-d9be45aaf745/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/noisetorch/pulseaudio v0.0.0-20220603053345-9303200c3861 h1:Xng5X+MlNK7Y/Ede75B86wJgaFMFvuey1K4Suh9k2E4=
github.com/noisetorch/pulseaudio v0.0.0-20220603053345-9303200c3861/go.mod h1:/zosM8PSkhuVyfJ9c/qzBhPSm3k06m9U4y4SDfH0jeA=
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI=
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=
golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=
golang.org/x/exp v0.0.0-20191224044220-1fea468a75e9/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20210722180016-6781d3edade3/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc=
golang.org/x/exp v0.0.0-20220104160115-025e73f80486 h1:gpEOK9kxNqVPOaZayQV2bzetZplXWakHeirk1bXKu2s=
golang.org/x/exp v0.0.0-20220104160115-025e73f80486/go.mod h1:b9TAUYHmRtqA6klRHApnXMnj+OyLce4yF5cZCUbk2ps=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI=
golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4=
golang.org/x/mobile v0.0.0-20220104184238-4a8be17bd2e3 h1:A6xMk9ozH8+K90r7CpnP00jZ92Io02pQ/XLd55pZuf0=
golang.org/x/mobile v0.0.0-20220104184238-4a8be17bd2e3/go.mod h1:pe2sM7Uk+2Su1y7u/6Z8KJ24D7lepUjFZbhFOrmDfuQ=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=


================================================
FILE: main.go
================================================
// This file is part of the program "NoiseTorch-ng".
// Please see the LICENSE file for copyright information.

package main

import (
	"fmt"
	"image"
	"io"
	"log"
	"os"
	"regexp"
	"strconv"
	"strings"
	"time"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/ewmh"
	"github.com/BurntSushi/xgbutil/icccm"
	"github.com/aarzilli/nucular/font"

	"github.com/noisetorch/pulseaudio"

	_ "embed"

	"github.com/aarzilli/nucular"
	"github.com/aarzilli/nucular/style"
)

//go:generate go run scripts/embedlicenses.go

//go:embed c/ladspa/rnnoise_ladspa.so
var libRNNoise []byte

type device struct {
	ID             string
	Name           string
	isMonitor      bool
	checked        bool
	dynamicLatency bool
	rate           uint32
}

var appName = "NoiseTorch-ng"

var nameSuffix = ""         // will be changed by build
var version = "unknown"     // ditto
var distribution = "custom" // ditto
var updateURL = ""          // ditto
var publicKeyString = ""    // ditto
var websiteURL = ""         // ditto

func main() {
	if nameSuffix != "" {
		appName += strings.Replace(nameSuffix, "_", " ", -1)
	}

	opt := parseCLIOpts()

	if opt.doLog {
		log.SetOutput(os.Stdout)
	} else {
		log.SetOutput(io.Discard)
	}
	log.Printf("Application starting. Version: %s (%s)\n", version, distribution)
	log.Printf("CAP_SYS_RESOURCE: %t\n", hasCapSysResource(getCurrentCaps()))

	initializeConfigIfNot()
	rnnoisefile := dumpLib()
	defer removeLib(rnnoisefile)

	ctx := ntcontext{}
	ctx.config = readConfig()
	ctx.librnnoise = rnnoisefile

	doCLI(opt, ctx.config, ctx.librnnoise)

	if ctx.config.EnableUpdates {
		go updateCheck(&ctx)
	}

	ctx.haveCapabilities = hasCapSysResource(getCurrentCaps())
	ctx.capsMismatch = hasCapSysResource(getCurrentCaps()) != hasCapSysResource(getSelfFileCaps())

	resetUI(&ctx)

	wnd := nucular.NewMasterWindowSize(0, appName, image.Point{600, 400}, func(w *nucular.Window) {
		updatefn(&ctx, w)
	})

	ctx.masterWindow = &wnd
	(*ctx.masterWindow).Changed()

	go paConnectionWatchdog(&ctx)

	style := style.FromTheme(style.DarkTheme, 2.0)
	style.Font = font.DefaultFont(16, 1)
	wnd.SetStyle(style)

	//this is a disgusting hack that searches for the noisetorch window
	//and then fixes up the WM_CLASS attribute so it displays
	//properly in the taskbar
	go fixWindowClass()
	wnd.Main()

}

func dumpLib() string {
	f, err := os.CreateTemp("", "librnnoise-*.so")
	if err != nil {
		log.Fatalf("Couldn't open temp file for librnnoise\n")
	}
	f.Write(libRNNoise)
	log.Printf("Wrote temp librnnoise to: %s\n", f.Name())
	return f.Name()
}

func removeLib(file string) {
	err := os.Remove(file)
	if err != nil {
		log.Printf("Couldn't delete temp librnnoise: %v\n", err)
	}
	log.Printf("Deleted temp librnnoise: %s\n", file)
}

func getSources(ctx *ntcontext, client *pulseaudio.Client) []device {
	sources, err := client.Sources()
	if err != nil {
		log.Printf("Couldn't fetch sources from pulseaudio\n")
	}

	outputs := make([]device, 0)
	for i := range sources {
		if strings.Contains(sources[i].Name, "nui_") || strings.Contains(sources[i].Name, "Filtered") {
			continue
		}

		var inp device

		inp.ID = sources[i].Name
		if ctx.serverInfo.servertype == servertype_pulse {
			inp.Name = sources[i].PropList["device.description"]
		} else {
			inp.Name = sources[i].Description
		}
		inp.isMonitor = (sources[i].MonitorSourceIndex != 0xffffffff)
		inp.rate = sources[i].SampleSpec.Rate

		//PA_SOURCE_DYNAMIC_LATENCY = 0x0040U
		inp.dynamicLatency = sources[i].Flags&uint32(0x0040) != 0

		outputs = append(outputs, inp)
	}

	return outputs
}

func getSinks(ctx *ntcontext, client *pulseaudio.Client) []device {
	sources, err := client.Sinks()
	if err != nil {
		log.Printf("Couldn't fetch sources from pulseaudio\n")
	}

	inputs := make([]device, 0)
	for i := range sources {
		if strings.Contains(sources[i].Name, "nui_") || strings.Contains(sources[i].Name, "Filtered") {
			continue
		}

		log.Printf("Output %s, %+v\n", sources[i].Name, sources[i])

		var inp device

		inp.ID = sources[i].Name
		if ctx.serverInfo.servertype == servertype_pulse {
			inp.Name = sources[i].PropList["device.description"]
		} else {
			inp.Name = sources[i].Description
		}
		inp.rate = sources[i].SampleSpec.Rate

		// PA_SINK_DYNAMIC_LATENCY = 0x0080U
		inp.dynamicLatency = sources[i].Flags&uint32(0x0080) != 0

		inputs = append(inputs, inp)
	}

	return inputs
}

func paConnectionWatchdog(ctx *ntcontext) {
	for {
		if ctx.paClient.Connected() {
			time.Sleep(500 * time.Millisecond)
			continue
		}

		ctx.views.Push(connectView)
		(*ctx.masterWindow).Changed()

		paClient, err := pulseaudio.NewClient()
		if err != nil {
			log.Printf("Couldn't create pulseaudio client: %v\n", err)
			fmt.Fprintf(os.Stderr, "Couldn't create pulseaudio client: %v\n", err)
		}

		info, err := serverInfo(paClient)
		if err != nil {
			log.Printf("Couldn't fetch audio server info: %s\n", err)
		}
		ctx.serverInfo = info

		log.Printf("Connected to audio server. Server name '%s'\n", info.name)

		ctx.paClient = paClient
		go updateNoiseSupressorLoaded(ctx)

		ctx.inputList = preselectDevice(ctx, getSources(ctx, paClient), ctx.config.LastUsedInput, getDefaultSourceID)
		ctx.outputList = preselectDevice(ctx, getSinks(ctx, paClient), ctx.config.LastUsedOutput, getDefaultSinkID)

		resetUI(ctx)
		(*ctx.masterWindow).Changed()

		time.Sleep(500 * time.Millisecond)
	}
}

func serverInfo(paClient *pulseaudio.Client) (audioserverinfo, error) {
	info, err := paClient.ServerInfo()
	if err != nil {
		log.Printf("Couldn't fetch pulse server info: %v\n", err)
		fmt.Fprintf(os.Stderr, "Couldn't fetch pulse server info: %v\n", err)
	}

	pkgname := info.PackageName
	log.Printf("Audioserver package name: %s\n", pkgname)
	log.Printf("Audioserver package version: %s\n", info.PackageVersion)
	isPipewire := strings.Contains(pkgname, "PipeWire")

	var servername string
	var servertype uint
	var major, minor, patch int
	var versionRegex *regexp.Regexp
	var versionString string

	var outdatedPipeWire bool

	if isPipewire {
		servername = "PipeWire"
		servertype = servertype_pipewire
		versionRegex = regexp.MustCompile(`.*?on PipeWire (\d+)\.(\d+)\.(\d+).*?`)
		versionString = pkgname
		log.Printf("Detected PipeWire\n")
	} else {
		servername = "PulseAudio"
		servertype = servertype_pulse
		versionRegex = regexp.MustCompile(`.*?(\d+)\.(\d+)\.?(\d+)?.*?`)
		versionString = info.PackageVersion
		log.Printf("Detected PulseAudio\n")
	}

	res := versionRegex.FindStringSubmatch(versionString)
	if len(res) != 4 {
		log.Printf("couldn't parse server version, regexp didn't match version: %s\n", versionString)
		return audioserverinfo{servertype: servertype}, nil
	}
	// the server version did not match the standard `major.minor.patch` pattern
	// setting the patch version to default 0
	if res[3] == "" {
		res[3] = "0"
	}
	major, err = strconv.Atoi(res[1])
	if err != nil {
		return audioserverinfo{servertype: servertype}, err
	}
	minor, err = strconv.Atoi(res[2])
	if err != nil {
		return audioserverinfo{servertype: servertype}, err
	}
	patch, err = strconv.Atoi(res[3])
	if err != nil {
		return audioserverinfo{servertype: servertype}, err
	}
	if isPipewire && major <= 0 && minor <= 3 && patch < 28 {
		log.Printf("pipewire version %d.%d.%d too old.\n", major, minor, patch)
		outdatedPipeWire = true
	}

	return audioserverinfo{
		servertype:       servertype,
		name:             servername,
		major:            major,
		minor:            minor,
		patch:            patch,
		outdatedPipeWire: outdatedPipeWire}, nil
}

func preselectDevice(ctx *ntcontext, devices []device, preselectID string,
	fallbackFunc func(client *pulseaudio.Client) (string, error)) []device {

	deviceExists := false
	for _, input := range devices {
		deviceExists = deviceExists || input.ID == preselectID
	}

	if !deviceExists {
		defaultDevice, err := fallbackFunc(ctx.paClient)
		if err != nil {
			log.Printf("Failed to load default device: %+v\n", err)
		} else {
			preselectID = defaultDevice
		}
	}
	for i := range devices {
		if devices[i].ID == preselectID {
			devices[i].checked = true
		}
	}
	return devices
}

func getDefaultSourceID(client *pulseaudio.Client) (string, error) {
	server, err := client.ServerInfo()
	if err != nil {
		return "", err
	}
	return server.DefaultSource, nil
}

func getDefaultSinkID(client *pulseaudio.Client) (string, error) {
	server, err := client.ServerInfo()
	if err != nil {
		return "", err
	}
	return server.DefaultSink, nil
}

// this is disgusting
func fixWindowClass() {
	xu, err := xgbutil.NewConn()
	defer xu.Conn().Close()
	if err != nil {
		log.Printf("Couldn't create XU xdg conn: %+v\n", err)
		return
	}
	for i := 0; i < 100; i++ {
		wnds, _ := ewmh.ClientListGet(xu)
		for _, w := range wnds {
			n, _ := ewmh.WmNameGet(xu, w)
			if n == appName {
				_, err := icccm.WmClassGet(xu, w)
				//if we have *NO* WM_CLASS, then the above call errors. We *want* to make sure this errors
				if err == nil {
					continue
				}

				class := icccm.WmClass{}
				class.Class = appName
				class.Instance = appName
				icccm.WmClassSet(xu, w, &class)
				return
			}

		}
		time.Sleep(100 * time.Millisecond)
	}

}


================================================
FILE: module.go
================================================
// This file is part of the program "NoiseTorch-ng".
// Please see the LICENSE file for copyright information.

package main

import (
	"fmt"
	"log"
	"strings"

	"github.com/noisetorch/pulseaudio"
)

const (
	loaded = iota
	unloaded
	inconsistent
)

// the ugly and (partially) repeated strings are unforunately difficult to avoid, as it's what pulse audio expects

func updateNoiseSupressorLoaded(ctx *ntcontext) {
	c := ctx.paClient
	upd, err := c.Updates()
	if err != nil {
		fmt.Printf("Error listening for updates: %v\n", err)
	}

	for {
		ctx.noiseSupressorState, ctx.virtualDeviceInUse = supressorState(ctx)
		if !c.Connected() {
			break
		}

		<-upd
	}
}

func supressorState(ctx *ntcontext) (int, bool) {
	//perform some checks to see if it looks like the noise supressor is loaded
	c := ctx.paClient
	var inpLoaded, outLoaded, inputInc, outputInc bool
	var virtualDeviceInUse bool = false
	if ctx.config.FilterInput {
		if ctx.serverInfo.servertype == servertype_pipewire {
			module, ladspasource, err := findModule(c, "module-ladspa-source", "source_name='Filtered Microphone")
			if err != nil {
				log.Printf("Couldn't fetch module list to check for module-ladspa-source: %v\n", err)
			}
			virtualDeviceInUse = virtualDeviceInUse || (module.NUsed != 0)
			inpLoaded = ladspasource
			inputInc = false
		} else {
			_, nullsink, err := findModule(c, "module-null-sink", "sink_name=nui_mic_denoised_out")
			if err != nil {
				log.Printf("Couldn't fetch module list to check for module-null-sink: %v\n", err)
			}
			_, ladspasink, err := findModule(c, "module-ladspa-sink", "sink_name=nui_mic_raw_in sink_master=nui_mic_denoised_out")
			if err != nil {
				log.Printf("Couldn't fetch module list to check for module-ladspa-sink: %v\n", err)
			}
			_, loopback, err := findModule(c, "module-loopback", "sink=nui_mic_raw_in")
			if err != nil {
				log.Printf("Couldn't fetch module list to check for module-loopback: %v\n", err)
			}
			module, remap, err := findModule(c, "module-remap-source", "master=nui_mic_denoised_out.monitor source_name=nui_mic_remap")
			if err != nil {
				log.Printf("Couldn't fetch module list to check for module-remap-source: %v\n", err)
			}

			virtualDeviceInUse = virtualDeviceInUse || (module.NUsed != 0)

			if nullsink && ladspasink && loopback && remap {
				inpLoaded = true
			} else if nullsink || ladspasink || loopback || remap {
				inputInc = true
			}
		}
	} else {
		inpLoaded = true
	}

	if ctx.config.FilterOutput {
		if ctx.serverInfo.servertype == servertype_pipewire {
			module, ladspasink, err := findModule(c, "module-ladspa-sink", "sink_name='Filtered Headphones'")
			if err != nil {
				log.Printf("Couldn't fetch module list to check for module-ladspa-sink: %v\n", err)
			}
			virtualDeviceInUse = virtualDeviceInUse || (module.NUsed != 0)
			outLoaded = ladspasink
			outputInc = false
		} else {
			_, out, err := findModule(c, "module-null-sink", "sink_name=nui_out_out_sink")
			if err != nil {
				log.Printf("Couldn't fetch module list to check for output module-ladspa-sink: %v\n", err)
			}
			_, lad, err := findModule(c, "module-ladspa-sink", "sink_name=nui_out_ladspa")
			if err != nil {
				log.Printf("Couldn't fetch module list to check for output module-ladspa-sink: %v\n", err)
			}
			_, loop, err := findModule(c, "module-loopback", "source=nui_out_out_sink.monitor")
			if err != nil {
				log.Printf("Couldn't fetch module list to check for output module-ladspa-sink: %v\n", err)
			}
			module, outin, err := findModule(c, "module-null-sink", "sink_name=nui_out_in_sink")
			if err != nil {
				log.Printf("Couldn't fetch module list to check for output module-ladspa-sink: %v\n", err)
			}
			virtualDeviceInUse = virtualDeviceInUse || (module.NUsed != 0)
			_, loop2, err := findModule(c, "module-loopback", "source=nui_out_in_sink.monitor")
			if err != nil {
				log.Printf("Couldn't fetch module list to check for output module-ladspa-sink: %v\n", err)
			}

			outLoaded = out && lad && loop && outin && loop2
			outputInc = out || lad || loop || outin || loop2
		}
	} else {
		outLoaded = true
	}

	if (inpLoaded || !ctx.config.FilterInput) && (outLoaded || !ctx.config.FilterOutput) && !inputInc {
		return loaded, virtualDeviceInUse
	}

	if (inpLoaded && ctx.config.FilterInput) || (outLoaded && ctx.config.FilterOutput) || inputInc || outputInc {
		return inconsistent, virtualDeviceInUse
	}

	return unloaded, virtualDeviceInUse
}

func loadSupressor(ctx *ntcontext, inp *device, out *device) error {
	if ctx.serverInfo.servertype == servertype_pulse {
		log.Printf("Querying pulse rlimit\n")
		pid, err := getPulsePid()
		if err != nil {
			return err
		}

		lim, err := getRlimit(pid)
		if err != nil {
			return err
		}
		log.Printf("Rlimit: %+v. Trying to remove.\n", lim)

		removeRlimit(pid)

		defer setRlimit(pid, &lim) // lowering RLIMIT doesn't require root

		newLim, err := getRlimit(pid)
		if err != nil {
			return err
		}
		log.Printf("Rlimit: %+v\n", newLim)
	}

	if inp.checked {
		var err error
		if ctx.serverInfo.servertype == servertype_pipewire {
			err = loadPipeWireInput(ctx, inp)
		} else {
			err = loadPulseInput(ctx, inp)
		}
		if err != nil {
			log.Printf("Error loading input: %v\n", err)
			return err
		}
	}

	if out.checked {
		var err error
		if ctx.serverInfo.servertype == servertype_pipewire {
			err = loadPipeWireOutput(ctx, out)
		} else {
			err = loadPulseOutput(ctx, out)
		}
		if err != nil {
			log.Printf("Error loading output: %v\n", err)
			return err
		}
	}

	return nil
}

func loadModule(ctx *ntcontext, module, args string) (uint32, error) {
	idx, err := ctx.paClient.LoadModule(module, args)

	//14 = module initialisation failed
	if paErr, ok := err.(*pulseaudio.Error); ok && paErr.Code == 14 {
		resetUI(ctx)
		ctx.views.Push(makeErrorView(ctx, fmt.Sprintf("Could not load module '%s'. This is likely a problem with your system or distribution.", module)))
	}
	return idx, err
}

func loadPipeWireInput(ctx *ntcontext, inp *device) error {
	log.Printf("Loading supressor for pipewire\n")
	idx, err := loadModule(ctx, "module-ladspa-source",
		fmt.Sprintf("source_name='Filtered Microphone for %s' master=%s "+
			"rate=48000 channels=1 "+
			"label=nt-filter plugin=%s control=%d", inp.Name, inp.ID, ctx.librnnoise, ctx.config.Threshold))

	if err != nil {
		return err
	}
	log.Printf("Loaded ladspa source as idx: %d\n", idx)
	return nil
}

func loadPipeWireOutput(ctx *ntcontext, out *device) error {
	log.Printf("Loading supressor for pipewire\n")
	idx, err := loadModule(ctx, "module-ladspa-sink",
		fmt.Sprintf("sink_name='Filtered Headphones' master=%s "+
			"rate=48000 channels=1 "+
			"label=nt-filter plugin=%s control=%d", out.ID, ctx.librnnoise, ctx.config.Threshold))

	if err != nil {
		return err
	}
	log.Printf("Loaded ladspa source as idx: %d\n", idx)
	return nil
}

func loadPulseInput(ctx *ntcontext, inp *device) error {
	log.Printf("Loading supressor for pulse\n")
	idx, err := loadModule(ctx, "module-null-sink", "sink_name=nui_mic_denoised_out rate=48000")
	if err != nil {
		return err
	}
	log.Printf("Loaded null sink as idx: %d\n", idx)

	idx, err = loadModule(ctx, "module-ladspa-sink",
		fmt.Sprintf("sink_name=nui_mic_raw_in sink_master=nui_mic_denoised_out "+
			"label=nt-filter plugin=%s control=%d", ctx.librnnoise, ctx.config.Threshold))
	if err != nil {
		return err
	}
	log.Printf("Loaded ladspa sink as idx: %d\n", idx)

	if inp.dynamicLatency {
		idx, err = loadModule(ctx, "module-loopback",
			fmt.Sprintf("source=%s sink=nui_mic_raw_in channels=1 latency_msec=1 source_dont_move=true sink_dont_move=true", inp.ID))
		if err != nil {
			return err
		}
		log.Printf("Loaded loopback as idx: %d\n", idx)
	} else {
		idx, err = loadModule(ctx, "module-loopback",
			fmt.Sprintf("source=%s sink=nui_mic_raw_in channels=1 latency_msec=50 source_dont_move=true sink_dont_move=true adjust_time=1", inp.ID))
		if err != nil {
			return err
		}
		log.Printf("Loaded fixed latency loopback as idx: %d\n", idx)
	}

	idx, err = loadModule(ctx, "module-remap-source", fmt.Sprintf(`master=nui_mic_denoised_out.monitor `+
		`source_name=nui_mic_remap source_properties="device.description='Filtered Microphone for %s'"`, inp.Name))
	if err != nil {
		return err
	}
	log.Printf("Loaded remap source as idx: %d\n", idx)
	return nil
}

func loadPulseOutput(ctx *ntcontext, out *device) error {
	_, err := loadModule(ctx, "module-null-sink", `sink_name=nui_out_out_sink`)
	if err != nil {
		return err
	}

	_, err = loadModule(ctx, "module-null-sink", `sink_name=nui_out_in_sink sink_properties="device.description='Filtered Headphones'"`)
	if err != nil {
		return err
	}

	_, err = loadModule(ctx, "module-ladspa-sink", fmt.Sprintf(`sink_name=nui_out_ladspa sink_master=nui_out_out_sink `+
		`label=nt-filter channels=1 plugin=%s control=%d rate=%d`,
		ctx.librnnoise, ctx.config.Threshold, 48000))
	if err != nil {
		return err
	}

	_, err = loadModule(ctx, "module-loopback",
		fmt.Sprintf("source=nui_out_out_sink.monitor sink=%s channels=2 latency_msec=50 source_dont_move=true sink_dont_move=true", out.ID))
	if err != nil {
		return err
	}

	_, err = loadModule(ctx, "module-loopback",
		fmt.Sprintf("source=nui_out_in_sink.monitor sink=nui_out_ladspa channels=1 latency_msec=50 source_dont_move=true sink_dont_move=true"))
	if err != nil {
		return err
	}
	return nil
}

func unloadSupressor(ctx *ntcontext) error {
	if ctx.serverInfo.servertype == servertype_pipewire {
		return unloadSupressorPipeWire(ctx)
	} else {
		return unloadSupressorPulse(ctx)
	}
}

func unloadSupressorPipeWire(ctx *ntcontext) error {
	log.Printf("Unloading modules for pipewire\n")

	log.Printf("Searching for module-ladspa-source\n")
	c := ctx.paClient
	m, found, err := findModule(c, "module-ladspa-source", "source_name='Filtered Microphone")
	if err != nil {
		return err
	}
	if found {
		log.Printf("Found module-ladspa-source at id [%d], sending unload command\n", m.Index)
		c.UnloadModule(m.Index)
	}

	log.Printf("Searching for module-ladspa-sink\n")
	m, found, err = findModule(c, "module-ladspa-sink", "sink_name='Filtered Headphones'")
	if err != nil {
		return err
	}
	if found {
		log.Printf("Found module-ladspa-sink at id [%d], sending unload command\n", m.Index)
		c.UnloadModule(m.Index)
	}
	return nil
}

func unloadSupressorPulse(ctx *ntcontext) error {
	log.Printf("Unloading modules for pulseaudio\n")

	if pid, err := getPulsePid(); err == nil {
		if lim, err := getRlimit(pid); err == nil {
			log.Printf("Trying to remove rlimit. Limit is: %+v\n", lim)
			removeRlimit(pid)
			newLim, _ := getRlimit(pid)
			log.Printf("Rlimit: %+v\n", newLim)
			defer setRlimit(pid, &lim)
		}

	}

	log.Printf("Searching for null-sink\n")
	c := ctx.paClient
	m, found, err := findModule(c, "module-null-sink", "sink_name=nui_mic_denoised_out")
	if err != nil {
		return err
	}
	if found {
		log.Printf("Found null-sink at id [%d], sending unload command\n", m.Index)
		c.UnloadModule(m.Index)
	}

	log.Printf("Searching for ladspa-sink\n")
	m, found, err = findModule(c, "module-ladspa-sink", "sink_name=nui_mic_raw_in sink_master=nui_mic_denoised_out")
	if err != nil {
		return err
	}
	if found {
		log.Printf("Found ladspa-sink at id [%d], sending unload command\n", m.Index)
		c.UnloadModule(m.Index)
	}

	log.Printf("Searching for loopback\n")
	m, found, err = findModule(c, "module-loopback", "sink=nui_mic_raw_in")
	if err != nil {
		return err
	}
	if found {
		log.Printf("Found loopback at id [%d], sending unload command\n", m.Index)
		c.UnloadModule(m.Index)
	}

	log.Printf("Searching for remap-source\n")
	m, found, err = findModule(c, "module-remap-source", "master=nui_mic_denoised_out.monitor source_name=nui_mic_remap")
	if err != nil {
		return err
	}
	if found {
		log.Printf("Found remap source at id [%d], sending unload command\n", m.Index)
		c.UnloadModule(m.Index)
	}

	log.Printf("Searching for output module-null-sink\n")
	m, found, err = findModule(c, "module-null-sink", "sink_name=nui_out_out_sink")
	if err != nil {
		return err
	}
	if found {
		log.Printf("Found output null sink at id [%d], sending unload command\n", m.Index)
		c.UnloadModule(m.Index)
	}

	log.Printf("Searching for output module-null-sink\n")
	m, found, err = findModule(c, "module-null-sink", "sink_name=nui_out_in_sink")
	if err != nil {
		return err
	}
	if found {
		log.Printf("Found output null sink at id [%d], sending unload command\n", m.Index)
		c.UnloadModule(m.Index)
	}

	log.Printf("Searching for output module-ladspa-sink\n")
	m, found, err = findModule(c, "module-ladspa-sink", "sink_name=nui_out_ladspa")
	if err != nil {
		return err
	}
	if found {
		log.Printf("Found output ladspa sink at id [%d], sending unload command\n", m.Index)
		c.UnloadModule(m.Index)
	}

	log.Printf("Searching for output module-loopback\n")
	m, found, err = findModule(c, "module-loopback", "source=nui_out_out_sink.monitor")
	if err != nil {
		return err
	}
	if found {
		log.Printf("Found output loopback at id [%d], sending unload command\n", m.Index)
		c.UnloadModule(m.Index)
	}

	log.Printf("Searching for output module-loopback\n")
	m, found, err = findModule(c, "module-loopback", "source=nui_out_in_sink.monitor")
	if err != nil {
		return err
	}
	if found {
		log.Printf("Found output loopback at id [%d], sending unload command\n", m.Index)
		c.UnloadModule(m.Index)
	}

	return nil
}

// Finds a module by exactly matching the module name, and checking if the second string is a substring of the argument
func findModule(c *pulseaudio.Client, name string, argMatch string) (module pulseaudio.Module, found bool, err error) {
	lst, err := c.ModuleList()

	if err != nil {
		return pulseaudio.Module{}, false, err
	}
	for _, m := range lst {
		if m.Name == name && strings.Contains(m.Argument, argMatch) {
			return m, true, nil
		}
	}

	return pulseaudio.Module{}, false, nil
}


================================================
FILE: rlimit.go
================================================
// This file is part of the program "NoiseTorch-ng".
// Please see the LICENSE file for copyright information.

package main

import (
	"log"
	"os"
	"strconv"
	"strings"
	"syscall"
	"unsafe"

	"github.com/noisetorch/pulseaudio"
)

const rlimitRTTime = 15

func getPulsePid() (int, error) {
	pulsepidfile, err := pulseaudio.RuntimePath("pid")
	if err != nil {
		return 0, err
	}
	pidbuf, err := os.ReadFile(pulsepidfile)
	if err != nil {
		return 0, err
	}
	pid, err := strconv.Atoi(strings.TrimSpace(string(pidbuf)))
	if err != nil {
		return 0, err
	}
	return pid, nil
}

func getRlimit(pid int) (syscall.Rlimit, error) {
	var res syscall.Rlimit
	err := pRlimit(pid, rlimitRTTime, nil, &res)
	return res, err
}

func setRlimit(pid int, new *syscall.Rlimit) error {
	var junk syscall.Rlimit
	err := pRlimit(pid, rlimitRTTime, new, &junk)
	return err
}

func removeRlimit(pid int) {
	const MaxUint = ^uint64(0)
	new := syscall.Rlimit{Cur: MaxUint, Max: MaxUint}
	err := setRlimit(pid, &new)
	if err != nil {
		log.Printf("Couldn't set rlimit with caps\n")
	}
}

func pRlimit(pid int, limit uintptr, new *syscall.Rlimit, old *syscall.Rlimit) error {
	_, _, errno := syscall.RawSyscall6(syscall.SYS_PRLIMIT64,
		uintptr(pid),
		limit,
		uintptr(unsafe.Pointer(new)),
		uintptr(unsafe.Pointer(old)), 0, 0)
	if errno != 0 {
		return errno
	}
	return nil
}


================================================
FILE: scripts/embedlicenses.go
================================================
package main

import (
	"os"
	"path/filepath"
	"strings"
)

func main() { //nolint
	cwd, err := os.Getwd()
	if err != nil {
		panic(err)
	}
	out, _ := os.Create("licenses.go")
	out.Write([]byte("package main \n\n//THIS FILE IS AUTOMATICALLY GENERATED BY `go generate` DO NOT EDIT!\n\nvar licenseString=`"))
	out.WriteString("LICENSES\n")
	out.WriteString("========\n")
	defer out.Close()
	filepath.Walk(cwd, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			panic(err)
		}
		if strings.HasPrefix("LICENSE", info.Name()) {
			rel, err := filepath.Rel(cwd, path)
			if err != nil {
				panic(err)
			}
			dir := filepath.Dir(rel)
			out.WriteString("FILES: " + dir + "\n")
			c, err := os.ReadFile(path)
			str := string(c)
			str = strings.ReplaceAll(str, "`", "`"+" + \"`\" + `") // escape backticks in license text for go src
			if err != nil {
				panic(err)
			}
			out.WriteString(str)
			out.WriteString("\n\n")

		}
		return nil
	})
	out.Write([]byte("`\n"))
}


================================================
FILE: scripts/signer.go
================================================
package main

import (
	"crypto"
	"encoding/base64"
	"flag"
	"fmt"
	"os"
	"path/filepath"

	"golang.org/x/crypto/ed25519"
)

func main() { //nolint
	var doGenerate bool
	flag.BoolVar(&doGenerate, "g", false, "Generate a keypair")

	var doPrintPub bool
	flag.BoolVar(&doPrintPub, "p", false, "Print the pub key")

	var doSign bool
	flag.BoolVar(&doSign, "s", false, "Sign the release tar")

	var publicKeyString string
	flag.StringVar(&publicKeyString, "k", "", "Public key to verify against (runs verifier if set)")

	var artifactFile string
	flag.StringVar(&artifactFile, "f", "", "Artifact file name and path that should be signed")

	flag.Parse()

	signatureFile := artifactFile + ".sig"

	if doGenerate {
		generateKeypair()
		os.Exit(0)
	}

	if doPrintPub {
		pub, _ := loadKeys()
		fmt.Printf("Public key: %s\n", base64.StdEncoding.EncodeToString(pub))
		os.Exit(0)
	}

	if doSign && artifactFile != "" {
		_, priv := loadKeys()

		file, err := os.ReadFile(artifactFile)
		if err != nil {
			panic(err)
		}

		sig, err := priv.Sign(nil, file, crypto.Hash(0))
		if err != nil {
			panic(err)
		}

		err = os.WriteFile(signatureFile, sig, 0640)
		if err != nil {
			panic(err)
		}
		os.Exit(0)
	}

	if publicKeyString != "" && artifactFile != "" && signatureFile != "" {
		pub, err := base64.StdEncoding.DecodeString(publicKeyString)
		if err != nil {
			panic(err)
		}

		file, err := os.ReadFile(artifactFile)
		if err != nil {
			panic(err)
		}

		sig, err := os.ReadFile(signatureFile)
		if err != nil {
			panic(err)
		}

		verified := ed25519.Verify(pub, file, sig)

		fmt.Printf("Verified %t\n", verified)
	}
}

func loadKeys() (ed25519.PublicKey, ed25519.PrivateKey) {
	seed, err := os.ReadFile(filepath.Join(os.Getenv("HOME"), ".config/noisetorch/private.key"))
	if err != nil {
		panic(err)
	}

	priv := ed25519.NewKeyFromSeed(seed)
	pub := priv.Public().(ed25519.PublicKey)

	return pub, priv
}

func generateKeypair() {
	pub, priv, err := ed25519.GenerateKey(nil)
	if err != nil {
		panic(err)
		os.Exit(1)
	}
	if err := os.WriteFile(filepath.Join(os.Getenv("HOME"), ".config/noisetorch/private.key"), priv.Seed(), 0600); err != nil {
		panic(err)
		os.Exit(2)
	}

	fmt.Printf("Private key generated and saved.\nPublic key: %s\n", base64.StdEncoding.EncodeToString(pub))
}


================================================
FILE: ui.go
================================================
// This file is part of the program "NoiseTorch-ng".
// Please see the LICENSE file for copyright information.

package main

import (
	"fmt"
	"image/color"
	"log"
	"os"
	"os/exec"
	"syscall"
	"time"

	"github.com/aarzilli/nucular"
	"github.com/aarzilli/nucular/label"
	"github.com/noisetorch/pulseaudio"
)

type ntcontext struct {
	inputList                []device
	outputList               []device
	noiseSupressorState      int
	paClient                 *pulseaudio.Client
	librnnoise               string
	sourceListColdWidthIndex int
	config                   *config
	licenseTextArea          nucular.TextEditor
	masterWindow             *nucular.MasterWindow
	update                   updateui
	reloadRequired           bool
	haveCapabilities         bool
	capsMismatch             bool
	views                    *ViewStack
	serverInfo               audioserverinfo
	virtualDeviceInUse       bool
}

//TODO pull some of these strucs out of UI, they don't belong here
type audioserverinfo struct {
	servertype       uint
	name             string
	major            int
	minor            int
	patch            int
	outdatedPipeWire bool
}

const (
	servertype_pulse = iota
	servertype_pipewire
)

var green = color.RGBA{34, 187, 69, 255}
var red = color.RGBA{255, 70, 70, 255}
var orange = color.RGBA{255, 140, 0, 255}
var lightBlue = color.RGBA{173, 216, 230, 255}

const notice = "NoiseTorch Next Gen (stylized NoiseTorch-ng) is a continuation of the NoiseTorch\nproject after it was abandoned by its original author. Please do not confuse\nboth programs. You may convey modified versions of this program under its name."

func updatefn(ctx *ntcontext, w *nucular.Window) {
	currView := ctx.views.Peek()
	currView(ctx, w)
}

func mainView(ctx *ntcontext, w *nucular.Window) {

	w.MenubarBegin()

	w.Row(10).Dynamic(1)
	if w := w.Menu(label.TA("About", "LC"), 120, nil); w != nil {
		w.Row(10).Dynamic(1)
		if w.MenuItem(label.T("Licenses")) {
			ctx.views.Push(licenseView)
		}
		w.Row(10).Dynamic(1)
		if w.MenuItem(label.T("Website")) {
			exec.Command("xdg-open", websiteURL).Run()
		}
		if w.MenuItem(label.T("Version")) {
			ctx.views.Push(versionView)
		}
	}

	w.MenubarEnd()

	w.Row(15).Dynamic(1)

	if ctx.noiseSupressorState == loaded {
		if ctx.virtualDeviceInUse {
			w.LabelColored("Filtering active", "RC", green)
		} else {
			w.LabelColored("Filtering unconfigured", "RC", lightBlue)
		}
	} else if ctx.noiseSupressorState == unloaded {
		_, inpOk := inputSelection(ctx)
		_, outOk := outputSelection(ctx)
		if validConfiguration(ctx, inpOk, outOk) {
			w.LabelColored("Filtering inactive", "RC", red)
		} else {
			w.LabelColored("Filtering unconfigured", "RC", lightBlue)
		}
	} else if ctx.noiseSupressorState == inconsistent {
		w.LabelColored("Inconsistent state, please unload first.", "RC", orange)
	}

	if ctx.serverInfo.servertype == servertype_pipewire {
		w.Row(20).Dynamic(1)
		w.Label("Running in PipeWire mode. PipeWire support is currently alpha quality. Please report bugs.", "LC")
	}

	if ctx.update.available && !ctx.update.triggered {
		w.Row(20).Ratio(0.9, 0.1)
		w.LabelColored("Update available! Click to install version: "+ctx.update.serverVersion, "LC", green)
		if w.ButtonText("Update") {
			ctx.update.triggered = true
			go update(ctx)
			(*ctx.masterWindow).Changed()
		}
	}

	if ctx.update.triggered {
		w.Row(20).Dynamic(1)
		w.Label(ctx.update.updatingText, "CC")
	}

	if w.TreePush(nucular.TreeTab, "Settings", true) {
		w.Row(15).Dynamic(2)
		if w.CheckboxText("Display Monitor Sources", &ctx.config.DisplayMonitorSources) {
			ctx.sourceListColdWidthIndex++ //recompute the with because of new elements
			go writeConfig(ctx.config)
		}

		w.Spacing(1)

		w.Row(25).Ratio(0.5, 0.45, 0.05)
		w.Label("Voice Activation Threshold", "LC")
		if w.Input().Mouse.HoveringRect(w.LastWidgetBounds) {
			w.Tooltip("If you have a decent microphone, you can usually turn this all the way up.")
		}
		if w.SliderInt(0, &ctx.config.Threshold, 95, 1) {
			go writeConfig(ctx.config)
			ctx.reloadRequired = true
		}
		w.Label(fmt.Sprintf("%d%%", ctx.config.Threshold), "RC")

		if ctx.reloadRequired {
			w.Row(20).Dynamic(1)
			w.LabelColored("Reloading the filter(s) is required to apply these changes.", "LC", orange)
		}

		w.Row(15).Dynamic(2)
		if w.CheckboxText("Filter Microphone", &ctx.config.FilterInput) {
			ctx.sourceListColdWidthIndex++ //recompute the with because of new elements
			go writeConfig(ctx.config)
			go (func() { ctx.noiseSupressorState, _ = supressorState(ctx) })()
		}

		if w.CheckboxText("Filter Headphones", &ctx.config.FilterOutput) {
			ctx.sourceListColdWidthIndex++ //recompute the with because of new elements
			go writeConfig(ctx.config)
			go (func() { ctx.noiseSupressorState, _ = supressorState(ctx) })()
		}

		w.TreePop()
	}
	if ctx.config.FilterInput && w.TreePush(nucular.TreeTab, "Select Microphone", true) {
		w.Row(15).Dynamic(1)
		w.Label("Select an input device below:", "LC")

		for i := range ctx.inputList {
			el := &ctx.inputList[i]

			if el.isMonitor && !ctx.config.DisplayMonitorSources {
				continue
			}
			w.Row(15).Static()
			w.LayoutFitWidth(0, 0)
			if w.CheckboxText("", &el.checked) {
				ensureOnlyOneInputSelected(&ctx.inputList, el)
			}

			w.LayoutFitWidth(ctx.sourceListColdWidthIndex, 0)
			if el.dynamicLatency {
				w.Label(el.Name, "LC")
			} else {
				w.LabelColored("(incompatible?) "+el.Name, "LC", orange)
			}
		}

		w.TreePop()
	}

	if ctx.config.FilterOutput && w.TreePush(nucular.TreeTab, "Select Headphones", true) {
		w.Row(15).Dynamic(1)
		w.Label("Select an output device below:", "LC")

		for i := range ctx.outputList {
			el := &ctx.outputList[i]

			if el.isMonitor && !ctx.config.DisplayMonitorSources {
				continue
			}
			w.Row(15).Static()
			w.LayoutFitWidth(0, 0)
			if w.CheckboxText("", &el.checked) {
				ensureOnlyOneInputSelected(&ctx.outputList, el)
			}

			w.LayoutFitWidth(ctx.sourceListColdWidthIndex, 0)
			if el.dynamicLatency {
				w.Label(el.Name, "LC")
			} else {
				w.LabelColored("(incompatible?) "+el.Name, "LC", orange)
			}
		}

		w.TreePop()
	}

	w.Row(15).Dynamic(1)
	w.Spacing(1)

	w.Row(25).Dynamic(2)
	if ctx.noiseSupressorState != unloaded {
		if w.ButtonText("Unload Filter(s)") {
			ctx.reloadRequired = false
			if ctx.virtualDeviceInUse {
				confirm := makeConfirmView(ctx,
					"Virtual Device in Use",
					"Some applications may behave weirdly when you remove a device they're currently using",
					"Unload",
					"Go back",
					func() { uiUnloadFilters(ctx) },
					func() {})
				ctx.views.Push(confirm)
			} else {
				go uiUnloadFilters(ctx)
			}
		}
	} else {
		w.Spacing(1)
	}
	txt := "Load Filter(s)"
	if ctx.noiseSupressorState == loaded {
		txt = "Reload Filter(s)"
	}

	inp, inpOk := inputSelection(ctx)
	out, outOk := outputSelection(ctx)
	if validConfiguration(ctx, inpOk, outOk) {
		if w.ButtonText(txt) {
			ctx.reloadRequired = false

			if ctx.virtualDeviceInUse {
				confirm := makeConfirmView(ctx,
					"Virtual Device in Use",
					"Some applications may behave weirdly when you reload a device they're currently using",
					"Reload",
					"Go back",
					func() { uiReloadFilters(ctx, inp, out) },
					func() {})
				ctx.views.Push(confirm)
			} else {
				go uiReloadFilters(ctx, inp, out)
			}
		}
	} else {
		w.Spacing(1)
	}

}

func uiUnloadFilters(ctx *ntcontext) {
	ctx.views.Push(loadingView)
	if err := unloadSupressor(ctx); err != nil {
		log.Println(err)
	}
	//wait until PA reports it has actually loaded it, timeout at 10s
	for i := 0; i < 20; i++ {
		if state, _ := supressorState(ctx); state != unloaded {
			time.Sleep(time.Millisecond * 500)
		}
	}
	ctx.views.Pop()
	(*ctx.masterWindow).Changed()
}

func uiReloadFilters(ctx *ntcontext, inp, out device) {
	ctx.views.Push(loadingView)
	if ctx.noiseSupressorState == loaded {
		if err := unloadSupressor(ctx); err != nil {
			log.Println(err)
		}
	}
	if err := loadSupressor(ctx, &inp, &out); err != nil {
		log.Println(err)
	}

	//wait until PA reports it has actually loaded it, timeout at 10s
	for i := 0; i < 20; i++ {
		if state, _ := supressorState(ctx); state != loaded {
			time.Sleep(time.Millisecond * 500)
		}
	}
	ctx.config.LastUsedInput = inp.ID
	ctx.config.LastUsedOutput = out.ID
	go writeConfig(ctx.config)
	ctx.views.Pop()
	(*ctx.masterWindow).Changed()
}

func ensureOnlyOneInputSelected(inps *[]device, current *device) {
	if !current.checked {
		return
	}
	for i := range *inps {
		el := &(*inps)[i]
		el.checked = false
	}
	current.checked = true
}

func inputSelection(ctx *ntcontext) (device, bool) {
	if !ctx.config.FilterInput {
		return device{}, false
	}

	for _, in := range ctx.inputList {
		if in.checked && (!in.isMonitor || ctx.config.DisplayMonitorSources) {
			return in, true
		}
	}
	return device{}, false
}

func outputSelection(ctx *ntcontext) (device, bool) {
	if !ctx.config.FilterOutput {
		return device{}, false
	}

	for _, out := range ctx.outputList {
		if out.checked {
			return out, true
		}
	}
	return device{}, false
}

func validConfiguration(ctx *ntcontext, inpOk bool, outOk bool) bool {
	return (!ctx.config.FilterInput || (ctx.config.FilterInput && inpOk)) &&
		(!ctx.config.FilterOutput || (ctx.config.FilterOutput && outOk)) &&
		(ctx.config.FilterInput || ctx.config.FilterOutput) &&
		ctx.noiseSupressorState != inconsistent
}

func loadingView(ctx *ntcontext, w *nucular.Window) {
	w.Row(50).Dynamic(1)
	w.Label("Working...", "CB")
	w.Row(50).Dynamic(1)
	w.Label("(this may take a few seconds)", "CB")
}

func licenseView(ctx *ntcontext, w *nucular.Window) {
	w.Row(40).Dynamic(1) // space above notice
	w.Label(notice, "CB")
	w.Row(40).Dynamic(1)  // space below notice
	w.Row(255).Dynamic(1) // space for license text area
	field := &ctx.licenseTextArea
	field.Flags |= nucular.EditMultiline
	if len(field.Buffer) < 1 {
		field.Buffer = []rune(licenseString) // nolint
	}
	field.Edit(w)

	w.Row(20).Dynamic(2)
	w.Spacing(1)
	if w.ButtonText("OK") {
		ctx.views.Pop()
	}
}

func versionView(ctx *ntcontext, w *nucular.Window) {
	w.Row(50).Dynamic(1)
	w.Label("Version", "CB")
	w.Row(50).Dynamic(1)
	w.Label(notice, "CB")
	w.Row(50).Dynamic(1)
	w.Label(fmt.Sprintf("%s (%s)", version, distribution), "CB")
	w.Row(50).Dynamic(1)
	w.Spacing(1)
	w.Row(20).Dynamic(2)
	w.Spacing(1)
	if w.ButtonText("OK") {
		ctx.views.Pop()
	}
}

func connectView(ctx *ntcontext, w *nucular.Window) {
	w.Row(50).Dynamic(1)
	w.Label("Connecting to pulseaudio...", "CB")
}

func capabilitiesView(ctx *ntcontext, w *nucular.Window) {
	w.Row(15).Dynamic(1)
	w.Label("This program does not have the capabilities to function properly.", "CB")
	w.Row(15).Dynamic(1)
	w.Label("We require CAP_SYS_RESOURCE. If that doesn't mean anything to you, don't worry. I'll fix it for you.", "CB")
	if ctx.capsMismatch {
		w.Row(15).Dynamic(1)
		w.LabelColored("Warning: File has CAP_SYS_RESOURCE but our process doesn't.", "CB", orange)
		w.Row(15).Dynamic(1)
		w.LabelColored("Check if your filesystem has nosuid set or check the troubleshooting page.", "CB", orange)
	}
	w.Row(40).Dynamic(1)
	w.Row(25).Dynamic(1)
	if w.ButtonText("Grant capability (requires root)") {
		err := pkexecSetcapSelf()
		if err != nil {
			ctx.views.Push(makeErrorView(ctx, err.Error()))
			return
		}
		self, err := os.Executable()
		if err != nil {
			ctx.views.Push(makeErrorView(ctx, err.Error()))
			return
		}
		err = syscall.Exec(self, []string{""}, os.Environ())
		if err != nil {
			ctx.views.Push(makeErrorView(ctx, err.Error()))
			return
		}
	}
}

func makeErrorView(ctx *ntcontext, errorMsg string) ViewFunc {
	return func(ctx *ntcontext, w *nucular.Window) {
		w.Row(15).Dynamic(1)
		w.Label("Error", "CB")
		w.Row(15).Dynamic(1)
		w.Label(errorMsg, "CB")
		w.Row(40).Dynamic(1)
		w.Row(25).Dynamic(1)
		if w.ButtonText("OK") {
			ctx.views.Pop()
			return
		}
	}
}

func makeFatalErrorView(ctx *ntcontext, errorMsg string) ViewFunc {
	return func(ctx *ntcontext, w *nucular.Window) {
		w.Row(15).Dynamic(1)
		w.Label("Fatal Error", "CB")
		w.Row(15).Dynamic(1)
		w.Label(errorMsg, "CB")
		w.Row(40).Dynamic(1)
		w.Row(25).Dynamic(1)
		if w.ButtonText("Quit") {
			os.Exit(1)
			return
		}
	}
}

func makeConfirmView(ctx *ntcontext, title, text, confirmText, denyText string, confirmfunc, denyfunc func()) ViewFunc {
	return func(ctx *ntcontext, w *nucular.Window) {
		w.Row(15).Dynamic(1)
		w.Label(title, "CB")
		w.Row(15).Dynamic(1)
		w.Label(text, "CB")
		w.Row(40).Dynamic(1)
		w.Row(25).Dynamic(2)
		if w.ButtonText(denyText) {
			ctx.views.Pop()
			go denyfunc()
			return
		}
		if w.ButtonText(confirmText) {
			ctx.views.Pop()
			go confirmfunc()
			return
		}
	}
}

func resetUI(ctx *ntcontext) {
	ctx.views = NewViewStack()
	ctx.views.Push(mainView)

	if !ctx.haveCapabilities {
		ctx.views.Push(capabilitiesView)
	}

	if ctx.serverInfo.outdatedPipeWire {
		ctx.views.Push(makeFatalErrorView(ctx,
			fmt.Sprintf("Your PipeWire version is too old. Detected %d.%d.%d. Require at least 0.3.28.",
				ctx.serverInfo.major, ctx.serverInfo.minor, ctx.serverInfo.patch)))
	}
}


================================================
FILE: untar.go
================================================
/*
Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

   * Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
   * Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
   * Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

// This is yoinked from https://github.com/golang/build/blob/master/internal/untar/untar.go
// which is unfortunately an internal package we can't import, but it's exactly what we need.
// So just copy paste it.

package main

import (
	"archive/tar"
	"compress/gzip"
	"fmt"
	"io"
	"log"
	"os"
	"path"
	"path/filepath"
	"strings"
	"time"
)

// TODO(bradfitz): this was copied from x/build/cmd/buildlet/buildlet.go
// but there were some buildlet-specific bits in there, so the code is
// forked for now.  Unfork and add some opts arguments here, so the
// buildlet can use this code somehow.

// Untar reads the gzip-compressed tar file from r and writes it into dir.
func Untar(r io.Reader, dir string) error {
	return untar(r, dir)
}

func untar(r io.Reader, dir string) (err error) {
	t0 := time.Now()
	nFiles := 0
	madeDir := map[string]bool{}
	defer func() {
		td := time.Since(t0)
		if err == nil {
			log.Printf("extracted tarball into %s: %d files, %d dirs (%v)", dir, nFiles, len(madeDir), td)
		} else {
			log.Printf("error extracting tarball into %s aft
Download .txt
gitextract_nepkgb21/

├── .editorconfig
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── build-artifact.yml
│       ├── codeql-analysis.yml
│       ├── flawfinder.yml
│       ├── golangci-lint.yml
│       └── release.yml
├── .gitignore
├── .gitmodules
├── LICENSE
├── Makefile
├── README.md
├── assets/
│   ├── icon/
│   │   └── LICENSE
│   └── noisetorch.desktop
├── c/
│   └── ladspa/
│       ├── .gitignore
│       ├── Makefile
│       ├── export.txt
│       ├── ladspa.h
│       ├── module.c
│       └── utils.h
├── capability.go
├── cli.go
├── config.go
├── go.mod
├── go.sum
├── main.go
├── module.go
├── rlimit.go
├── scripts/
│   ├── embedlicenses.go
│   └── signer.go
├── ui.go
├── untar.go
├── update.go
├── vendor/
│   ├── dmitri.shuralyov.com/
│   │   └── gpu/
│   │       └── mtl/
│   │           ├── LICENSE
│   │           ├── mtl.go
│   │           ├── mtl.h
│   │           └── mtl.m
│   ├── gioui.org/
│   │   ├── LICENSE
│   │   ├── app/
│   │   │   ├── Gio.java
│   │   │   ├── GioActivity.java
│   │   │   ├── GioView.java
│   │   │   ├── app.go
│   │   │   ├── d3d11_windows.go
│   │   │   ├── datadir.go
│   │   │   ├── doc.go
│   │   │   ├── egl_android.go
│   │   │   ├── egl_wayland.go
│   │   │   ├── egl_windows.go
│   │   │   ├── egl_x11.go
│   │   │   ├── framework_ios.h
│   │   │   ├── gl_ios.go
│   │   │   ├── gl_ios.m
│   │   │   ├── gl_js.go
│   │   │   ├── gl_macos.go
│   │   │   ├── gl_macos.m
│   │   │   ├── internal/
│   │   │   │   ├── log/
│   │   │   │   │   ├── log.go
│   │   │   │   │   ├── log_android.go
│   │   │   │   │   ├── log_ios.go
│   │   │   │   │   └── log_windows.go
│   │   │   │   ├── windows/
│   │   │   │   │   └── windows.go
│   │   │   │   └── xkb/
│   │   │   │       └── xkb_unix.go
│   │   │   ├── metal_darwin.go
│   │   │   ├── metal_ios.go
│   │   │   ├── metal_macos.go
│   │   │   ├── os.go
│   │   │   ├── os_android.go
│   │   │   ├── os_darwin.go
│   │   │   ├── os_darwin.m
│   │   │   ├── os_ios.go
│   │   │   ├── os_ios.m
│   │   │   ├── os_js.go
│   │   │   ├── os_macos.go
│   │   │   ├── os_macos.m
│   │   │   ├── os_unix.go
│   │   │   ├── os_wayland.c
│   │   │   ├── os_wayland.go
│   │   │   ├── os_windows.go
│   │   │   ├── os_x11.go
│   │   │   ├── runmain.go
│   │   │   ├── vulkan.go
│   │   │   ├── vulkan_android.go
│   │   │   ├── vulkan_wayland.go
│   │   │   ├── vulkan_x11.go
│   │   │   ├── wayland_text_input.c
│   │   │   ├── wayland_text_input.h
│   │   │   ├── wayland_xdg_decoration.c
│   │   │   ├── wayland_xdg_decoration.h
│   │   │   ├── wayland_xdg_shell.c
│   │   │   ├── wayland_xdg_shell.h
│   │   │   └── window.go
│   │   ├── cpu/
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── abi.h
│   │   │   ├── driver.go
│   │   │   ├── driver_nosupport.go
│   │   │   ├── embed.go
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   ├── init.sh
│   │   │   ├── runtime.c
│   │   │   └── runtime.h
│   │   ├── f32/
│   │   │   ├── affine.go
│   │   │   └── f32.go
│   │   ├── font/
│   │   │   └── opentype/
│   │   │       └── opentype.go
│   │   ├── gesture/
│   │   │   └── gesture.go
│   │   ├── gpu/
│   │   │   ├── api.go
│   │   │   ├── caches.go
│   │   │   ├── clip.go
│   │   │   ├── compute.go
│   │   │   ├── cpu.go
│   │   │   ├── gpu.go
│   │   │   ├── internal/
│   │   │   │   ├── d3d11/
│   │   │   │   │   ├── d3d11.go
│   │   │   │   │   └── d3d11_windows.go
│   │   │   │   ├── driver/
│   │   │   │   │   ├── api.go
│   │   │   │   │   └── driver.go
│   │   │   │   ├── metal/
│   │   │   │   │   ├── metal.go
│   │   │   │   │   └── metal_darwin.go
│   │   │   │   ├── opengl/
│   │   │   │   │   ├── opengl.go
│   │   │   │   │   └── srgb.go
│   │   │   │   └── vulkan/
│   │   │   │       ├── vulkan.go
│   │   │   │       └── vulkan_nosupport.go
│   │   │   ├── pack.go
│   │   │   ├── path.go
│   │   │   └── timer.go
│   │   ├── internal/
│   │   │   ├── byteslice/
│   │   │   │   └── byteslice.go
│   │   │   ├── cocoainit/
│   │   │   │   └── cocoa_darwin.go
│   │   │   ├── d3d11/
│   │   │   │   └── d3d11_windows.go
│   │   │   ├── egl/
│   │   │   │   ├── egl.go
│   │   │   │   ├── egl_unix.go
│   │   │   │   └── egl_windows.go
│   │   │   ├── f32color/
│   │   │   │   └── rgba.go
│   │   │   ├── fling/
│   │   │   │   ├── animation.go
│   │   │   │   └── extrapolation.go
│   │   │   ├── gl/
│   │   │   │   ├── gl.go
│   │   │   │   ├── gl_js.go
│   │   │   │   ├── gl_unix.go
│   │   │   │   ├── gl_windows.go
│   │   │   │   ├── types.go
│   │   │   │   ├── types_js.go
│   │   │   │   └── util.go
│   │   │   ├── ops/
│   │   │   │   ├── ops.go
│   │   │   │   └── reader.go
│   │   │   ├── scene/
│   │   │   │   └── scene.go
│   │   │   ├── stroke/
│   │   │   │   └── stroke.go
│   │   │   └── vk/
│   │   │       ├── vulkan.go
│   │   │       ├── vulkan_android.go
│   │   │       ├── vulkan_wayland.go
│   │   │       └── vulkan_x11.go
│   │   ├── io/
│   │   │   ├── clipboard/
│   │   │   │   └── clipboard.go
│   │   │   ├── event/
│   │   │   │   └── event.go
│   │   │   ├── key/
│   │   │   │   ├── key.go
│   │   │   │   ├── mod.go
│   │   │   │   └── mod_darwin.go
│   │   │   ├── pointer/
│   │   │   │   ├── doc.go
│   │   │   │   └── pointer.go
│   │   │   ├── profile/
│   │   │   │   └── profile.go
│   │   │   ├── router/
│   │   │   │   ├── clipboard.go
│   │   │   │   ├── key.go
│   │   │   │   ├── pointer.go
│   │   │   │   └── router.go
│   │   │   ├── semantic/
│   │   │   │   └── semantic.go
│   │   │   ├── system/
│   │   │   │   └── system.go
│   │   │   └── transfer/
│   │   │       └── transfer.go
│   │   ├── layout/
│   │   │   ├── context.go
│   │   │   ├── doc.go
│   │   │   ├── flex.go
│   │   │   ├── layout.go
│   │   │   ├── list.go
│   │   │   └── stack.go
│   │   ├── op/
│   │   │   ├── clip/
│   │   │   │   ├── clip.go
│   │   │   │   ├── doc.go
│   │   │   │   └── shapes.go
│   │   │   ├── op.go
│   │   │   └── paint/
│   │   │       ├── doc.go
│   │   │       └── paint.go
│   │   ├── shader/
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── gio/
│   │   │   │   ├── blit.frag
│   │   │   │   ├── blit.vert
│   │   │   │   ├── common.h
│   │   │   │   ├── copy.frag
│   │   │   │   ├── copy.vert
│   │   │   │   ├── cover.frag
│   │   │   │   ├── cover.vert
│   │   │   │   ├── gen.go
│   │   │   │   ├── input.vert
│   │   │   │   ├── intersect.frag
│   │   │   │   ├── intersect.vert
│   │   │   │   ├── material.frag
│   │   │   │   ├── material.vert
│   │   │   │   ├── shaders.go
│   │   │   │   ├── simple.frag
│   │   │   │   ├── stencil.frag
│   │   │   │   ├── stencil.vert
│   │   │   │   ├── zblit.frag.0.dxbc
│   │   │   │   ├── zblit.frag.0.glsl100es
│   │   │   │   ├── zblit.frag.0.glsl150
│   │   │   │   ├── zblit.frag.0.metallibios
│   │   │   │   ├── zblit.frag.0.metallibiossimulator
│   │   │   │   ├── zblit.frag.0.metallibmacos
│   │   │   │   ├── zblit.frag.0.spirv
│   │   │   │   ├── zblit.frag.1.dxbc
│   │   │   │   ├── zblit.frag.1.glsl100es
│   │   │   │   ├── zblit.frag.1.glsl150
│   │   │   │   ├── zblit.frag.1.metallibios
│   │   │   │   ├── zblit.frag.1.metallibiossimulator
│   │   │   │   ├── zblit.frag.1.metallibmacos
│   │   │   │   ├── zblit.frag.1.spirv
│   │   │   │   ├── zblit.frag.2.dxbc
│   │   │   │   ├── zblit.frag.2.glsl100es
│   │   │   │   ├── zblit.frag.2.glsl150
│   │   │   │   ├── zblit.frag.2.metallibios
│   │   │   │   ├── zblit.frag.2.metallibiossimulator
│   │   │   │   ├── zblit.frag.2.metallibmacos
│   │   │   │   ├── zblit.frag.2.spirv
│   │   │   │   ├── zblit.vert.0.dxbc
│   │   │   │   ├── zblit.vert.0.glsl100es
│   │   │   │   ├── zblit.vert.0.glsl150
│   │   │   │   ├── zblit.vert.0.metallibios
│   │   │   │   ├── zblit.vert.0.metallibiossimulator
│   │   │   │   ├── zblit.vert.0.metallibmacos
│   │   │   │   ├── zblit.vert.0.spirv
│   │   │   │   ├── zcopy.frag.0.dxbc
│   │   │   │   ├── zcopy.frag.0.glsl100es
│   │   │   │   ├── zcopy.frag.0.glsl150
│   │   │   │   ├── zcopy.frag.0.metallibios
│   │   │   │   ├── zcopy.frag.0.metallibiossimulator
│   │   │   │   ├── zcopy.frag.0.metallibmacos
│   │   │   │   ├── zcopy.frag.0.spirv
│   │   │   │   ├── zcopy.vert.0.dxbc
│   │   │   │   ├── zcopy.vert.0.glsl100es
│   │   │   │   ├── zcopy.vert.0.glsl150
│   │   │   │   ├── zcopy.vert.0.metallibios
│   │   │   │   ├── zcopy.vert.0.metallibiossimulator
│   │   │   │   ├── zcopy.vert.0.metallibmacos
│   │   │   │   ├── zcopy.vert.0.spirv
│   │   │   │   ├── zcover.frag.0.dxbc
│   │   │   │   ├── zcover.frag.0.glsl100es
│   │   │   │   ├── zcover.frag.0.glsl150
│   │   │   │   ├── zcover.frag.0.metallibios
│   │   │   │   ├── zcover.frag.0.metallibiossimulator
│   │   │   │   ├── zcover.frag.0.metallibmacos
│   │   │   │   ├── zcover.frag.0.spirv
│   │   │   │   ├── zcover.frag.1.dxbc
│   │   │   │   ├── zcover.frag.1.glsl100es
│   │   │   │   ├── zcover.frag.1.glsl150
│   │   │   │   ├── zcover.frag.1.metallibios
│   │   │   │   ├── zcover.frag.1.metallibiossimulator
│   │   │   │   ├── zcover.frag.1.metallibmacos
│   │   │   │   ├── zcover.frag.1.spirv
│   │   │   │   ├── zcover.frag.2.dxbc
│   │   │   │   ├── zcover.frag.2.glsl100es
│   │   │   │   ├── zcover.frag.2.glsl150
│   │   │   │   ├── zcover.frag.2.metallibios
│   │   │   │   ├── zcover.frag.2.metallibiossimulator
│   │   │   │   ├── zcover.frag.2.metallibmacos
│   │   │   │   ├── zcover.frag.2.spirv
│   │   │   │   ├── zcover.vert.0.dxbc
│   │   │   │   ├── zcover.vert.0.glsl100es
│   │   │   │   ├── zcover.vert.0.glsl150
│   │   │   │   ├── zcover.vert.0.metallibios
│   │   │   │   ├── zcover.vert.0.metallibiossimulator
│   │   │   │   ├── zcover.vert.0.metallibmacos
│   │   │   │   ├── zcover.vert.0.spirv
│   │   │   │   ├── zinput.vert.0.dxbc
│   │   │   │   ├── zinput.vert.0.glsl100es
│   │   │   │   ├── zinput.vert.0.glsl150
│   │   │   │   ├── zinput.vert.0.metallibios
│   │   │   │   ├── zinput.vert.0.metallibiossimulator
│   │   │   │   ├── zinput.vert.0.metallibmacos
│   │   │   │   ├── zinput.vert.0.spirv
│   │   │   │   ├── zintersect.frag.0.dxbc
│   │   │   │   ├── zintersect.frag.0.glsl100es
│   │   │   │   ├── zintersect.frag.0.glsl150
│   │   │   │   ├── zintersect.frag.0.metallibios
│   │   │   │   ├── zintersect.frag.0.metallibiossimulator
│   │   │   │   ├── zintersect.frag.0.metallibmacos
│   │   │   │   ├── zintersect.frag.0.spirv
│   │   │   │   ├── zintersect.vert.0.dxbc
│   │   │   │   ├── zintersect.vert.0.glsl100es
│   │   │   │   ├── zintersect.vert.0.glsl150
│   │   │   │   ├── zintersect.vert.0.metallibios
│   │   │   │   ├── zintersect.vert.0.metallibiossimulator
│   │   │   │   ├── zintersect.vert.0.metallibmacos
│   │   │   │   ├── zintersect.vert.0.spirv
│   │   │   │   ├── zmaterial.frag.0.dxbc
│   │   │   │   ├── zmaterial.frag.0.glsl100es
│   │   │   │   ├── zmaterial.frag.0.glsl150
│   │   │   │   ├── zmaterial.frag.0.metallibios
│   │   │   │   ├── zmaterial.frag.0.metallibiossimulator
│   │   │   │   ├── zmaterial.frag.0.metallibmacos
│   │   │   │   ├── zmaterial.frag.0.spirv
│   │   │   │   ├── zmaterial.vert.0.dxbc
│   │   │   │   ├── zmaterial.vert.0.glsl100es
│   │   │   │   ├── zmaterial.vert.0.glsl150
│   │   │   │   ├── zmaterial.vert.0.metallibios
│   │   │   │   ├── zmaterial.vert.0.metallibiossimulator
│   │   │   │   ├── zmaterial.vert.0.metallibmacos
│   │   │   │   ├── zmaterial.vert.0.spirv
│   │   │   │   ├── zsimple.frag.0.dxbc
│   │   │   │   ├── zsimple.frag.0.glsl100es
│   │   │   │   ├── zsimple.frag.0.glsl150
│   │   │   │   ├── zsimple.frag.0.metallibios
│   │   │   │   ├── zsimple.frag.0.metallibiossimulator
│   │   │   │   ├── zsimple.frag.0.metallibmacos
│   │   │   │   ├── zsimple.frag.0.spirv
│   │   │   │   ├── zstencil.frag.0.dxbc
│   │   │   │   ├── zstencil.frag.0.glsl100es
│   │   │   │   ├── zstencil.frag.0.glsl150
│   │   │   │   ├── zstencil.frag.0.metallibios
│   │   │   │   ├── zstencil.frag.0.metallibiossimulator
│   │   │   │   ├── zstencil.frag.0.metallibmacos
│   │   │   │   ├── zstencil.frag.0.spirv
│   │   │   │   ├── zstencil.vert.0.dxbc
│   │   │   │   ├── zstencil.vert.0.glsl100es
│   │   │   │   ├── zstencil.vert.0.glsl150
│   │   │   │   ├── zstencil.vert.0.metallibios
│   │   │   │   ├── zstencil.vert.0.metallibiossimulator
│   │   │   │   ├── zstencil.vert.0.metallibmacos
│   │   │   │   └── zstencil.vert.0.spirv
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   ├── piet/
│   │   │   │   ├── abi.h
│   │   │   │   ├── annotated.h
│   │   │   │   ├── backdrop.comp
│   │   │   │   ├── backdrop_abi.c
│   │   │   │   ├── backdrop_abi.go
│   │   │   │   ├── backdrop_abi.h
│   │   │   │   ├── backdrop_abi_nosupport.go
│   │   │   │   ├── backdrop_linux_amd64.syso
│   │   │   │   ├── backdrop_linux_arm.syso
│   │   │   │   ├── backdrop_linux_arm64.syso
│   │   │   │   ├── binning.comp
│   │   │   │   ├── binning_abi.c
│   │   │   │   ├── binning_abi.go
│   │   │   │   ├── binning_abi.h
│   │   │   │   ├── binning_abi_nosupport.go
│   │   │   │   ├── binning_linux_amd64.syso
│   │   │   │   ├── binning_linux_arm.syso
│   │   │   │   ├── binning_linux_arm64.syso
│   │   │   │   ├── bins.h
│   │   │   │   ├── coarse.comp
│   │   │   │   ├── coarse_abi.c
│   │   │   │   ├── coarse_abi.go
│   │   │   │   ├── coarse_abi.h
│   │   │   │   ├── coarse_abi_nosupport.go
│   │   │   │   ├── coarse_linux_amd64.syso
│   │   │   │   ├── coarse_linux_arm.syso
│   │   │   │   ├── coarse_linux_arm64.syso
│   │   │   │   ├── elements.comp
│   │   │   │   ├── elements_abi.c
│   │   │   │   ├── elements_abi.go
│   │   │   │   ├── elements_abi.h
│   │   │   │   ├── elements_abi_nosupport.go
│   │   │   │   ├── elements_linux_amd64.syso
│   │   │   │   ├── elements_linux_arm.syso
│   │   │   │   ├── elements_linux_arm64.syso
│   │   │   │   ├── gen.go
│   │   │   │   ├── gencpu.sh
│   │   │   │   ├── kernel4.comp
│   │   │   │   ├── kernel4_abi.c
│   │   │   │   ├── kernel4_abi.go
│   │   │   │   ├── kernel4_abi.h
│   │   │   │   ├── kernel4_abi_nosupport.go
│   │   │   │   ├── kernel4_linux_amd64.syso
│   │   │   │   ├── kernel4_linux_arm.syso
│   │   │   │   ├── kernel4_linux_arm64.syso
│   │   │   │   ├── mem.h
│   │   │   │   ├── path_coarse.comp
│   │   │   │   ├── path_coarse_abi.c
│   │   │   │   ├── path_coarse_abi.go
│   │   │   │   ├── path_coarse_abi.h
│   │   │   │   ├── path_coarse_abi_nosupport.go
│   │   │   │   ├── path_coarse_linux_amd64.syso
│   │   │   │   ├── path_coarse_linux_arm.syso
│   │   │   │   ├── path_coarse_linux_arm64.syso
│   │   │   │   ├── pathseg.h
│   │   │   │   ├── ptcl.h
│   │   │   │   ├── runtime.h
│   │   │   │   ├── scene.h
│   │   │   │   ├── setup.h
│   │   │   │   ├── shaders.go
│   │   │   │   ├── state.h
│   │   │   │   ├── support.c
│   │   │   │   ├── tile.h
│   │   │   │   ├── tile_alloc.comp
│   │   │   │   ├── tile_alloc_abi.c
│   │   │   │   ├── tile_alloc_abi.go
│   │   │   │   ├── tile_alloc_abi.h
│   │   │   │   ├── tile_alloc_abi_nosupport.go
│   │   │   │   ├── tile_alloc_linux_amd64.syso
│   │   │   │   ├── tile_alloc_linux_arm.syso
│   │   │   │   ├── tile_alloc_linux_arm64.syso
│   │   │   │   ├── zbackdrop.comp.0.dxbc
│   │   │   │   ├── zbackdrop.comp.0.metallibios
│   │   │   │   ├── zbackdrop.comp.0.metallibiossimulator
│   │   │   │   ├── zbackdrop.comp.0.metallibmacos
│   │   │   │   ├── zbackdrop.comp.0.spirv
│   │   │   │   ├── zbinning.comp.0.dxbc
│   │   │   │   ├── zbinning.comp.0.metallibios
│   │   │   │   ├── zbinning.comp.0.metallibiossimulator
│   │   │   │   ├── zbinning.comp.0.metallibmacos
│   │   │   │   ├── zbinning.comp.0.spirv
│   │   │   │   ├── zcoarse.comp.0.dxbc
│   │   │   │   ├── zcoarse.comp.0.metallibios
│   │   │   │   ├── zcoarse.comp.0.metallibiossimulator
│   │   │   │   ├── zcoarse.comp.0.metallibmacos
│   │   │   │   ├── zcoarse.comp.0.spirv
│   │   │   │   ├── zelements.comp.0.dxbc
│   │   │   │   ├── zelements.comp.0.metallibios
│   │   │   │   ├── zelements.comp.0.metallibiossimulator
│   │   │   │   ├── zelements.comp.0.metallibmacos
│   │   │   │   ├── zelements.comp.0.spirv
│   │   │   │   ├── zkernel4.comp.0.dxbc
│   │   │   │   ├── zkernel4.comp.0.metallibios
│   │   │   │   ├── zkernel4.comp.0.metallibiossimulator
│   │   │   │   ├── zkernel4.comp.0.metallibmacos
│   │   │   │   ├── zkernel4.comp.0.spirv
│   │   │   │   ├── zpath_coarse.comp.0.dxbc
│   │   │   │   ├── zpath_coarse.comp.0.metallibios
│   │   │   │   ├── zpath_coarse.comp.0.metallibiossimulator
│   │   │   │   ├── zpath_coarse.comp.0.metallibmacos
│   │   │   │   ├── zpath_coarse.comp.0.spirv
│   │   │   │   ├── ztile_alloc.comp.0.dxbc
│   │   │   │   ├── ztile_alloc.comp.0.metallibios
│   │   │   │   ├── ztile_alloc.comp.0.metallibiossimulator
│   │   │   │   ├── ztile_alloc.comp.0.metallibmacos
│   │   │   │   └── ztile_alloc.comp.0.spirv
│   │   │   └── shader.go
│   │   ├── text/
│   │   │   ├── lru.go
│   │   │   ├── shaper.go
│   │   │   └── text.go
│   │   └── unit/
│   │       └── unit.go
│   ├── github.com/
│   │   ├── BurntSushi/
│   │   │   ├── toml/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── COPYING
│   │   │   │   ├── README.md
│   │   │   │   ├── decode.go
│   │   │   │   ├── decode_go116.go
│   │   │   │   ├── deprecated.go
│   │   │   │   ├── doc.go
│   │   │   │   ├── encode.go
│   │   │   │   ├── error.go
│   │   │   │   ├── go.mod
│   │   │   │   ├── internal/
│   │   │   │   │   └── tz.go
│   │   │   │   ├── lex.go
│   │   │   │   ├── meta.go
│   │   │   │   ├── parse.go
│   │   │   │   ├── type_fields.go
│   │   │   │   └── type_toml.go
│   │   │   ├── xgb/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── AUTHORS
│   │   │   │   ├── CONTRIBUTORS
│   │   │   │   ├── LICENSE
│   │   │   │   ├── Makefile
│   │   │   │   ├── README
│   │   │   │   ├── STYLE
│   │   │   │   ├── auth.go
│   │   │   │   ├── conn.go
│   │   │   │   ├── cookie.go
│   │   │   │   ├── doc.go
│   │   │   │   ├── help.go
│   │   │   │   ├── render/
│   │   │   │   │   └── render.go
│   │   │   │   ├── shape/
│   │   │   │   │   └── shape.go
│   │   │   │   ├── shm/
│   │   │   │   │   └── shm.go
│   │   │   │   ├── sync.go
│   │   │   │   ├── xgb.go
│   │   │   │   ├── xinerama/
│   │   │   │   │   └── xinerama.go
│   │   │   │   └── xproto/
│   │   │   │       └── xproto.go
│   │   │   └── xgbutil/
│   │   │       ├── .gitignore
│   │   │       ├── COPYING
│   │   │       ├── Makefile
│   │   │       ├── README
│   │   │       ├── STYLE
│   │   │       ├── doc.go
│   │   │       ├── ewmh/
│   │   │       │   ├── doc.go
│   │   │       │   ├── ewmh.go
│   │   │       │   └── winman.go
│   │   │       ├── icccm/
│   │   │       │   ├── doc.go
│   │   │       │   ├── icccm.go
│   │   │       │   └── protocols.go
│   │   │       ├── session.vim
│   │   │       ├── types.go
│   │   │       ├── xevent/
│   │   │       │   ├── callback.go
│   │   │       │   ├── doc.go
│   │   │       │   ├── eventloop.go
│   │   │       │   ├── types_auto.go
│   │   │       │   ├── types_manual.go
│   │   │       │   └── xevent.go
│   │   │       ├── xgbutil.go
│   │   │       └── xprop/
│   │   │           ├── atom.go
│   │   │           ├── doc.go
│   │   │           └── xprop.go
│   │   ├── aarzilli/
│   │   │   └── nucular/
│   │   │       ├── .travis.yml
│   │   │       ├── LICENSE
│   │   │       ├── README.md
│   │   │       ├── clipboard/
│   │   │       │   ├── clipboard_darwin.go
│   │   │       │   ├── clipboard_other.go
│   │   │       │   ├── clipboard_windows.go
│   │   │       │   └── clipboard_x11.go
│   │   │       ├── command/
│   │   │       │   └── command.go
│   │   │       ├── context.go
│   │   │       ├── doc.go
│   │   │       ├── drawfillover_avx.go
│   │   │       ├── drawfillover_avx.s
│   │   │       ├── drawfillover_other.go
│   │   │       ├── drawing.go
│   │   │       ├── font/
│   │   │       │   ├── font.go
│   │   │       │   ├── font_gio.go
│   │   │       │   └── font_shiny.go
│   │   │       ├── gio.go
│   │   │       ├── go.mod
│   │   │       ├── go.sum
│   │   │       ├── grouplist.go
│   │   │       ├── input.go
│   │   │       ├── internal/
│   │   │       │   └── assets/
│   │   │       │       └── assets.go
│   │   │       ├── label/
│   │   │       │   └── label.go
│   │   │       ├── masterwindow.go
│   │   │       ├── nucular.go
│   │   │       ├── rect/
│   │   │       │   └── rect.go
│   │   │       ├── shiny.go
│   │   │       ├── split.go
│   │   │       ├── style/
│   │   │       │   └── style.go
│   │   │       ├── text.go
│   │   │       └── util.go
│   │   ├── blang/
│   │   │   └── semver/
│   │   │       └── v4/
│   │   │           ├── LICENSE
│   │   │           ├── go.mod
│   │   │           ├── json.go
│   │   │           ├── range.go
│   │   │           ├── semver.go
│   │   │           ├── sort.go
│   │   │           └── sql.go
│   │   ├── go-gl/
│   │   │   └── glfw/
│   │   │       └── v3.3/
│   │   │           └── glfw/
│   │   │               ├── GLFW_C_REVISION.txt
│   │   │               ├── LICENSE
│   │   │               ├── build.go
│   │   │               ├── build_cgo_hack.go
│   │   │               ├── c_glfw.go
│   │   │               ├── c_glfw_bsd.go
│   │   │               ├── c_glfw_darwin.go
│   │   │               ├── c_glfw_lin.go
│   │   │               ├── c_glfw_windows.go
│   │   │               ├── context.go
│   │   │               ├── error.c
│   │   │               ├── error.go
│   │   │               ├── glfw/
│   │   │               │   ├── LICENSE.md
│   │   │               │   ├── deps/
│   │   │               │   │   ├── dummy.go
│   │   │               │   │   ├── getopt.c
│   │   │               │   │   ├── getopt.h
│   │   │               │   │   ├── glad/
│   │   │               │   │   │   ├── dummy.go
│   │   │               │   │   │   ├── gl.h
│   │   │               │   │   │   ├── khrplatform.h
│   │   │               │   │   │   ├── vk_platform.h
│   │   │               │   │   │   └── vulkan.h
│   │   │               │   │   ├── glad_gl.c
│   │   │               │   │   ├── glad_vulkan.c
│   │   │               │   │   ├── linmath.h
│   │   │               │   │   ├── mingw/
│   │   │               │   │   │   ├── _mingw_dxhelper.h
│   │   │               │   │   │   ├── dinput.h
│   │   │               │   │   │   ├── dummy.go
│   │   │               │   │   │   └── xinput.h
│   │   │               │   │   ├── nuklear.h
│   │   │               │   │   ├── nuklear_glfw_gl2.h
│   │   │               │   │   ├── stb_image_write.h
│   │   │               │   │   ├── tinycthread.c
│   │   │               │   │   ├── tinycthread.h
│   │   │               │   │   └── vs2008/
│   │   │               │   │       ├── dummy.go
│   │   │               │   │       └── stdint.h
│   │   │               │   ├── include/
│   │   │               │   │   └── GLFW/
│   │   │               │   │       ├── dummy.go
│   │   │               │   │       ├── glfw3.h
│   │   │               │   │       └── glfw3native.h
│   │   │               │   └── src/
│   │   │               │       ├── cocoa_init.m
│   │   │               │       ├── cocoa_joystick.h
│   │   │               │       ├── cocoa_joystick.m
│   │   │               │       ├── cocoa_monitor.m
│   │   │               │       ├── cocoa_platform.h
│   │   │               │       ├── cocoa_time.c
│   │   │               │       ├── cocoa_window.m
│   │   │               │       ├── context.c
│   │   │               │       ├── dummy.go
│   │   │               │       ├── egl_context.c
│   │   │               │       ├── egl_context.h
│   │   │               │       ├── glx_context.c
│   │   │               │       ├── glx_context.h
│   │   │               │       ├── init.c
│   │   │               │       ├── input.c
│   │   │               │       ├── internal.h
│   │   │               │       ├── linux_joystick.c
│   │   │               │       ├── linux_joystick.h
│   │   │               │       ├── mappings.h
│   │   │               │       ├── monitor.c
│   │   │               │       ├── nsgl_context.h
│   │   │               │       ├── nsgl_context.m
│   │   │               │       ├── null_init.c
│   │   │               │       ├── null_joystick.c
│   │   │               │       ├── null_joystick.h
│   │   │               │       ├── null_monitor.c
│   │   │               │       ├── null_platform.h
│   │   │               │       ├── null_window.c
│   │   │               │       ├── osmesa_context.c
│   │   │               │       ├── osmesa_context.h
│   │   │               │       ├── posix_thread.c
│   │   │               │       ├── posix_thread.h
│   │   │               │       ├── posix_time.c
│   │   │               │       ├── posix_time.h
│   │   │               │       ├── vulkan.c
│   │   │               │       ├── wayland-idle-inhibit-unstable-v1-client-protocol.c
│   │   │               │       ├── wayland-idle-inhibit-unstable-v1-client-protocol.h
│   │   │               │       ├── wayland-pointer-constraints-unstable-v1-client-protocol.c
│   │   │               │       ├── wayland-pointer-constraints-unstable-v1-client-protocol.h
│   │   │               │       ├── wayland-relative-pointer-unstable-v1-client-protocol.c
│   │   │               │       ├── wayland-relative-pointer-unstable-v1-client-protocol.h
│   │   │               │       ├── wayland-viewporter-client-protocol.c
│   │   │               │       ├── wayland-viewporter-client-protocol.h
│   │   │               │       ├── wayland-xdg-decoration-client-protocol.h
│   │   │               │       ├── wayland-xdg-decoration-unstable-v1-client-protocol.c
│   │   │               │       ├── wayland-xdg-shell-client-protocol.c
│   │   │               │       ├── wayland-xdg-shell-client-protocol.h
│   │   │               │       ├── wgl_context.c
│   │   │               │       ├── wgl_context.h
│   │   │               │       ├── win32_init.c
│   │   │               │       ├── win32_joystick.c
│   │   │               │       ├── win32_joystick.h
│   │   │               │       ├── win32_monitor.c
│   │   │               │       ├── win32_platform.h
│   │   │               │       ├── win32_thread.c
│   │   │               │       ├── win32_time.c
│   │   │               │       ├── win32_window.c
│   │   │               │       ├── window.c
│   │   │               │       ├── wl_init.c
│   │   │               │       ├── wl_monitor.c
│   │   │               │       ├── wl_platform.h
│   │   │               │       ├── wl_window.c
│   │   │               │       ├── x11_init.c
│   │   │               │       ├── x11_monitor.c
│   │   │               │       ├── x11_platform.h
│   │   │               │       ├── x11_window.c
│   │   │               │       ├── xkb_unicode.c
│   │   │               │       └── xkb_unicode.h
│   │   │               ├── glfw.go
│   │   │               ├── glfw_tree_rebuild.go
│   │   │               ├── go.mod
│   │   │               ├── input.c
│   │   │               ├── input.go
│   │   │               ├── monitor.c
│   │   │               ├── monitor.go
│   │   │               ├── native_darwin.go
│   │   │               ├── native_linbsd.go
│   │   │               ├── native_windows.go
│   │   │               ├── time.go
│   │   │               ├── util.go
│   │   │               ├── vulkan.go
│   │   │               ├── window.c
│   │   │               └── window.go
│   │   ├── golang/
│   │   │   └── freetype/
│   │   │       ├── AUTHORS
│   │   │       ├── CONTRIBUTORS
│   │   │       ├── LICENSE
│   │   │       ├── README
│   │   │       ├── freetype.go
│   │   │       ├── raster/
│   │   │       │   ├── geom.go
│   │   │       │   ├── paint.go
│   │   │       │   ├── raster.go
│   │   │       │   └── stroke.go
│   │   │       └── truetype/
│   │   │           ├── face.go
│   │   │           ├── glyph.go
│   │   │           ├── hint.go
│   │   │           ├── opcodes.go
│   │   │           └── truetype.go
│   │   ├── hashicorp/
│   │   │   └── golang-lru/
│   │   │       ├── .gitignore
│   │   │       ├── 2q.go
│   │   │       ├── LICENSE
│   │   │       ├── README.md
│   │   │       ├── arc.go
│   │   │       ├── doc.go
│   │   │       ├── go.mod
│   │   │       ├── lru.go
│   │   │       └── simplelru/
│   │   │           ├── lru.go
│   │   │           └── lru_interface.go
│   │   ├── noisetorch/
│   │   │   └── pulseaudio/
│   │   │       ├── .gitignore
│   │   │       ├── LICENSE
│   │   │       ├── README.md
│   │   │       ├── card.go
│   │   │       ├── client.go
│   │   │       ├── command.go
│   │   │       ├── command_string.go
│   │   │       ├── errors.go
│   │   │       ├── format.go
│   │   │       ├── go.mod
│   │   │       ├── misc.go
│   │   │       ├── module.go
│   │   │       ├── server.go
│   │   │       ├── sink.go
│   │   │       ├── source.go
│   │   │       ├── updates.go
│   │   │       └── volume.go
│   │   └── syndtr/
│   │       └── gocapability/
│   │           ├── LICENSE
│   │           └── capability/
│   │               ├── capability.go
│   │               ├── capability_linux.go
│   │               ├── capability_noop.go
│   │               ├── enum.go
│   │               ├── enum_gen.go
│   │               └── syscall_linux.go
│   ├── golang.org/
│   │   └── x/
│   │       ├── crypto/
│   │       │   ├── LICENSE
│   │       │   ├── PATENTS
│   │       │   └── ed25519/
│   │       │       └── ed25519.go
│   │       ├── exp/
│   │       │   ├── AUTHORS
│   │       │   ├── CONTRIBUTORS
│   │       │   ├── LICENSE
│   │       │   ├── PATENTS
│   │       │   └── shiny/
│   │       │       ├── driver/
│   │       │       │   ├── driver.go
│   │       │       │   ├── driver_darwin.go
│   │       │       │   ├── driver_fallback.go
│   │       │       │   ├── driver_windows.go
│   │       │       │   ├── driver_x11.go
│   │       │       │   ├── gldriver/
│   │       │       │   │   ├── buffer.go
│   │       │       │   │   ├── cocoa.go
│   │       │       │   │   ├── cocoa.m
│   │       │       │   │   ├── context.go
│   │       │       │   │   ├── egl.go
│   │       │       │   │   ├── gldriver.go
│   │       │       │   │   ├── other.go
│   │       │       │   │   ├── screen.go
│   │       │       │   │   ├── texture.go
│   │       │       │   │   ├── win32.go
│   │       │       │   │   ├── window.go
│   │       │       │   │   ├── x11.c
│   │       │       │   │   └── x11.go
│   │       │       │   ├── internal/
│   │       │       │   │   ├── drawer/
│   │       │       │   │   │   └── drawer.go
│   │       │       │   │   ├── errscreen/
│   │       │       │   │   │   └── errscreen.go
│   │       │       │   │   ├── event/
│   │       │       │   │   │   └── event.go
│   │       │       │   │   ├── lifecycler/
│   │       │       │   │   │   └── lifecycler.go
│   │       │       │   │   ├── swizzle/
│   │       │       │   │   │   ├── swizzle_amd64.go
│   │       │       │   │   │   ├── swizzle_amd64.s
│   │       │       │   │   │   ├── swizzle_common.go
│   │       │       │   │   │   └── swizzle_other.go
│   │       │       │   │   ├── win32/
│   │       │       │   │   │   ├── key.go
│   │       │       │   │   │   ├── syscall.go
│   │       │       │   │   │   ├── syscall_windows.go
│   │       │       │   │   │   ├── win32.go
│   │       │       │   │   │   └── zsyscall_windows.go
│   │       │       │   │   └── x11key/
│   │       │       │   │       ├── table.go
│   │       │       │   │       └── x11key.go
│   │       │       │   ├── mtldriver/
│   │       │       │   │   ├── buffer.go
│   │       │       │   │   ├── internal/
│   │       │       │   │   │   ├── appkit/
│   │       │       │   │   │   │   ├── appkit.go
│   │       │       │   │   │   │   ├── appkit.h
│   │       │       │   │   │   │   └── appkit.m
│   │       │       │   │   │   └── coreanim/
│   │       │       │   │   │       ├── coreanim.go
│   │       │       │   │   │       ├── coreanim.h
│   │       │       │   │   │       └── coreanim.m
│   │       │       │   │   ├── mtldriver.go
│   │       │       │   │   ├── screen.go
│   │       │       │   │   ├── texture.go
│   │       │       │   │   └── window.go
│   │       │       │   ├── mtldriver_darwin.go
│   │       │       │   ├── windriver/
│   │       │       │   │   ├── buffer.go
│   │       │       │   │   ├── doc.go
│   │       │       │   │   ├── other.go
│   │       │       │   │   ├── screen.go
│   │       │       │   │   ├── syscall.go
│   │       │       │   │   ├── syscall_windows.go
│   │       │       │   │   ├── texture.go
│   │       │       │   │   ├── window.go
│   │       │       │   │   ├── windraw.go
│   │       │       │   │   ├── windriver.go
│   │       │       │   │   └── zsyscall_windows.go
│   │       │       │   └── x11driver/
│   │       │       │       ├── buffer.go
│   │       │       │       ├── buffer_fallback.go
│   │       │       │       ├── screen.go
│   │       │       │       ├── shm_linux_ipc.go
│   │       │       │       ├── shm_openbsd_syscall.go
│   │       │       │       ├── shm_other.go
│   │       │       │       ├── shm_shmopen_syscall.go
│   │       │       │       ├── texture.go
│   │       │       │       ├── window.go
│   │       │       │       └── x11driver.go
│   │       │       └── screen/
│   │       │           └── screen.go
│   │       ├── image/
│   │       │   ├── LICENSE
│   │       │   ├── PATENTS
│   │       │   ├── draw/
│   │       │   │   ├── draw.go
│   │       │   │   ├── draw_go117.go
│   │       │   │   ├── impl.go
│   │       │   │   └── scale.go
│   │       │   ├── font/
│   │       │   │   ├── font.go
│   │       │   │   └── sfnt/
│   │       │   │       ├── cmap.go
│   │       │   │       ├── data.go
│   │       │   │       ├── gpos.go
│   │       │   │       ├── postscript.go
│   │       │   │       ├── sfnt.go
│   │       │   │       └── truetype.go
│   │       │   └── math/
│   │       │       ├── f64/
│   │       │       │   └── f64.go
│   │       │       └── fixed/
│   │       │           └── fixed.go
│   │       ├── mobile/
│   │       │   ├── AUTHORS
│   │       │   ├── CONTRIBUTORS
│   │       │   ├── LICENSE
│   │       │   ├── PATENTS
│   │       │   ├── event/
│   │       │   │   ├── key/
│   │       │   │   │   ├── code_string.go
│   │       │   │   │   └── key.go
│   │       │   │   ├── lifecycle/
│   │       │   │   │   └── lifecycle.go
│   │       │   │   ├── mouse/
│   │       │   │   │   └── mouse.go
│   │       │   │   ├── paint/
│   │       │   │   │   └── paint.go
│   │       │   │   └── size/
│   │       │   │       └── size.go
│   │       │   ├── geom/
│   │       │   │   └── geom.go
│   │       │   └── gl/
│   │       │       ├── consts.go
│   │       │       ├── dll_windows.go
│   │       │       ├── doc.go
│   │       │       ├── fn.go
│   │       │       ├── gl.go
│   │       │       ├── gldebug.go
│   │       │       ├── interface.go
│   │       │       ├── types_debug.go
│   │       │       ├── types_prod.go
│   │       │       ├── work.c
│   │       │       ├── work.go
│   │       │       ├── work.h
│   │       │       ├── work_other.go
│   │       │       ├── work_windows.go
│   │       │       ├── work_windows_386.s
│   │       │       └── work_windows_amd64.s
│   │       ├── sys/
│   │       │   ├── LICENSE
│   │       │   ├── PATENTS
│   │       │   ├── unix/
│   │       │   │   ├── .gitignore
│   │       │   │   ├── README.md
│   │       │   │   ├── affinity_linux.go
│   │       │   │   ├── aliases.go
│   │       │   │   ├── asm_aix_ppc64.s
│   │       │   │   ├── asm_bsd_386.s
│   │       │   │   ├── asm_bsd_amd64.s
│   │       │   │   ├── asm_bsd_arm.s
│   │       │   │   ├── asm_bsd_arm64.s
│   │       │   │   ├── asm_bsd_ppc64.s
│   │       │   │   ├── asm_bsd_riscv64.s
│   │       │   │   ├── asm_linux_386.s
│   │       │   │   ├── asm_linux_amd64.s
│   │       │   │   ├── asm_linux_arm.s
│   │       │   │   ├── asm_linux_arm64.s
│   │       │   │   ├── asm_linux_loong64.s
│   │       │   │   ├── asm_linux_mips64x.s
│   │       │   │   ├── asm_linux_mipsx.s
│   │       │   │   ├── asm_linux_ppc64x.s
│   │       │   │   ├── asm_linux_riscv64.s
│   │       │   │   ├── asm_linux_s390x.s
│   │       │   │   ├── asm_openbsd_mips64.s
│   │       │   │   ├── asm_solaris_amd64.s
│   │       │   │   ├── asm_zos_s390x.s
│   │       │   │   ├── bluetooth_linux.go
│   │       │   │   ├── cap_freebsd.go
│   │       │   │   ├── constants.go
│   │       │   │   ├── dev_aix_ppc.go
│   │       │   │   ├── dev_aix_ppc64.go
│   │       │   │   ├── dev_darwin.go
│   │       │   │   ├── dev_dragonfly.go
│   │       │   │   ├── dev_freebsd.go
│   │       │   │   ├── dev_linux.go
│   │       │   │   ├── dev_netbsd.go
│   │       │   │   ├── dev_openbsd.go
│   │       │   │   ├── dev_zos.go
│   │       │   │   ├── dirent.go
│   │       │   │   ├── endian_big.go
│   │       │   │   ├── endian_little.go
│   │       │   │   ├── env_unix.go
│   │       │   │   ├── epoll_zos.go
│   │       │   │   ├── fcntl.go
│   │       │   │   ├── fcntl_darwin.go
│   │       │   │   ├── fcntl_linux_32bit.go
│   │       │   │   ├── fdset.go
│   │       │   │   ├── fstatfs_zos.go
│   │       │   │   ├── gccgo.go
│   │       │   │   ├── gccgo_c.c
│   │       │   │   ├── gccgo_linux_amd64.go
│   │       │   │   ├── ifreq_linux.go
│   │       │   │   ├── ioctl_linux.go
│   │       │   │   ├── ioctl_signed.go
│   │       │   │   ├── ioctl_unsigned.go
│   │       │   │   ├── ioctl_zos.go
│   │       │   │   ├── mkall.sh
│   │       │   │   ├── mkerrors.sh
│   │       │   │   ├── mmap_nomremap.go
│   │       │   │   ├── mremap.go
│   │       │   │   ├── pagesize_unix.go
│   │       │   │   ├── pledge_openbsd.go
│   │       │   │   ├── ptrace_darwin.go
│   │       │   │   ├── ptrace_ios.go
│   │       │   │   ├── race.go
│   │       │   │   ├── race0.go
│   │       │   │   ├── readdirent_getdents.go
│   │       │   │   ├── readdirent_getdirentries.go
│   │       │   │   ├── sockcmsg_dragonfly.go
│   │       │   │   ├── sockcmsg_linux.go
│   │       │   │   ├── sockcmsg_unix.go
│   │       │   │   ├── sockcmsg_unix_other.go
│   │       │   │   ├── syscall.go
│   │       │   │   ├── syscall_aix.go
│   │       │   │   ├── syscall_aix_ppc.go
│   │       │   │   ├── syscall_aix_ppc64.go
│   │       │   │   ├── syscall_bsd.go
│   │       │   │   ├── syscall_darwin.go
│   │       │   │   ├── syscall_darwin_amd64.go
│   │       │   │   ├── syscall_darwin_arm64.go
│   │       │   │   ├── syscall_darwin_libSystem.go
│   │       │   │   ├── syscall_dragonfly.go
│   │       │   │   ├── syscall_dragonfly_amd64.go
│   │       │   │   ├── syscall_freebsd.go
│   │       │   │   ├── syscall_freebsd_386.go
│   │       │   │   ├── syscall_freebsd_amd64.go
│   │       │   │   ├── syscall_freebsd_arm.go
│   │       │   │   ├── syscall_freebsd_arm64.go
│   │       │   │   ├── syscall_freebsd_riscv64.go
│   │       │   │   ├── syscall_hurd.go
│   │       │   │   ├── syscall_hurd_386.go
│   │       │   │   ├── syscall_illumos.go
│   │       │   │   ├── syscall_linux.go
│   │       │   │   ├── syscall_linux_386.go
│   │       │   │   ├── syscall_linux_alarm.go
│   │       │   │   ├── syscall_linux_amd64.go
│   │       │   │   ├── syscall_linux_amd64_gc.go
│   │       │   │   ├── syscall_linux_arm.go
│   │       │   │   ├── syscall_linux_arm64.go
│   │       │   │   ├── syscall_linux_gc.go
│   │       │   │   ├── syscall_linux_gc_386.go
│   │       │   │   ├── syscall_linux_gc_arm.go
│   │       │   │   ├── syscall_linux_gccgo_386.go
│   │       │   │   ├── syscall_linux_gccgo_arm.go
│   │       │   │   ├── syscall_linux_loong64.go
│   │       │   │   ├── syscall_linux_mips64x.go
│   │       │   │   ├── syscall_linux_mipsx.go
│   │       │   │   ├── syscall_linux_ppc.go
│   │       │   │   ├── syscall_linux_ppc64x.go
│   │       │   │   ├── syscall_linux_riscv64.go
│   │       │   │   ├── syscall_linux_s390x.go
│   │       │   │   ├── syscall_linux_sparc64.go
│   │       │   │   ├── syscall_netbsd.go
│   │       │   │   ├── syscall_netbsd_386.go
│   │       │   │   ├── syscall_netbsd_amd64.go
│   │       │   │   ├── syscall_netbsd_arm.go
│   │       │   │   ├── syscall_netbsd_arm64.go
│   │       │   │   ├── syscall_openbsd.go
│   │       │   │   ├── syscall_openbsd_386.go
│   │       │   │   ├── syscall_openbsd_amd64.go
│   │       │   │   ├── syscall_openbsd_arm.go
│   │       │   │   ├── syscall_openbsd_arm64.go
│   │       │   │   ├── syscall_openbsd_libc.go
│   │       │   │   ├── syscall_openbsd_mips64.go
│   │       │   │   ├── syscall_openbsd_ppc64.go
│   │       │   │   ├── syscall_openbsd_riscv64.go
│   │       │   │   ├── syscall_solaris.go
│   │       │   │   ├── syscall_solaris_amd64.go
│   │       │   │   ├── syscall_unix.go
│   │       │   │   ├── syscall_unix_gc.go
│   │       │   │   ├── syscall_unix_gc_ppc64x.go
│   │       │   │   ├── syscall_zos_s390x.go
│   │       │   │   ├── sysvshm_linux.go
│   │       │   │   ├── sysvshm_unix.go
│   │       │   │   ├── sysvshm_unix_other.go
│   │       │   │   ├── timestruct.go
│   │       │   │   ├── unveil_openbsd.go
│   │       │   │   ├── xattr_bsd.go
│   │       │   │   ├── zerrors_aix_ppc.go
│   │       │   │   ├── zerrors_aix_ppc64.go
│   │       │   │   ├── zerrors_darwin_amd64.go
│   │       │   │   ├── zerrors_darwin_arm64.go
│   │       │   │   ├── zerrors_dragonfly_amd64.go
│   │       │   │   ├── zerrors_freebsd_386.go
│   │       │   │   ├── zerrors_freebsd_amd64.go
│   │       │   │   ├── zerrors_freebsd_arm.go
│   │       │   │   ├── zerrors_freebsd_arm64.go
│   │       │   │   ├── zerrors_freebsd_riscv64.go
│   │       │   │   ├── zerrors_linux.go
│   │       │   │   ├── zerrors_linux_386.go
│   │       │   │   ├── zerrors_linux_amd64.go
│   │       │   │   ├── zerrors_linux_arm.go
│   │       │   │   ├── zerrors_linux_arm64.go
│   │       │   │   ├── zerrors_linux_loong64.go
│   │       │   │   ├── zerrors_linux_mips.go
│   │       │   │   ├── zerrors_linux_mips64.go
│   │       │   │   ├── zerrors_linux_mips64le.go
│   │       │   │   ├── zerrors_linux_mipsle.go
│   │       │   │   ├── zerrors_linux_ppc.go
│   │       │   │   ├── zerrors_linux_ppc64.go
│   │       │   │   ├── zerrors_linux_ppc64le.go
│   │       │   │   ├── zerrors_linux_riscv64.go
│   │       │   │   ├── zerrors_linux_s390x.go
│   │       │   │   ├── zerrors_linux_sparc64.go
│   │       │   │   ├── zerrors_netbsd_386.go
│   │       │   │   ├── zerrors_netbsd_amd64.go
│   │       │   │   ├── zerrors_netbsd_arm.go
│   │       │   │   ├── zerrors_netbsd_arm64.go
│   │       │   │   ├── zerrors_openbsd_386.go
│   │       │   │   ├── zerrors_openbsd_amd64.go
│   │       │   │   ├── zerrors_openbsd_arm.go
│   │       │   │   ├── zerrors_openbsd_arm64.go
│   │       │   │   ├── zerrors_openbsd_mips64.go
│   │       │   │   ├── zerrors_openbsd_ppc64.go
│   │       │   │   ├── zerrors_openbsd_riscv64.go
│   │       │   │   ├── zerrors_solaris_amd64.go
│   │       │   │   ├── zerrors_zos_s390x.go
│   │       │   │   ├── zptrace_armnn_linux.go
│   │       │   │   ├── zptrace_linux_arm64.go
│   │       │   │   ├── zptrace_mipsnn_linux.go
│   │       │   │   ├── zptrace_mipsnnle_linux.go
│   │       │   │   ├── zptrace_x86_linux.go
│   │       │   │   ├── zsyscall_aix_ppc.go
│   │       │   │   ├── zsyscall_aix_ppc64.go
│   │       │   │   ├── zsyscall_aix_ppc64_gc.go
│   │       │   │   ├── zsyscall_aix_ppc64_gccgo.go
│   │       │   │   ├── zsyscall_darwin_amd64.go
│   │       │   │   ├── zsyscall_darwin_amd64.s
│   │       │   │   ├── zsyscall_darwin_arm64.go
│   │       │   │   ├── zsyscall_darwin_arm64.s
│   │       │   │   ├── zsyscall_dragonfly_amd64.go
│   │       │   │   ├── zsyscall_freebsd_386.go
│   │       │   │   ├── zsyscall_freebsd_amd64.go
│   │       │   │   ├── zsyscall_freebsd_arm.go
│   │       │   │   ├── zsyscall_freebsd_arm64.go
│   │       │   │   ├── zsyscall_freebsd_riscv64.go
│   │       │   │   ├── zsyscall_illumos_amd64.go
│   │       │   │   ├── zsyscall_linux.go
│   │       │   │   ├── zsyscall_linux_386.go
│   │       │   │   ├── zsyscall_linux_amd64.go
│   │       │   │   ├── zsyscall_linux_arm.go
│   │       │   │   ├── zsyscall_linux_arm64.go
│   │       │   │   ├── zsyscall_linux_loong64.go
│   │       │   │   ├── zsyscall_linux_mips.go
│   │       │   │   ├── zsyscall_linux_mips64.go
│   │       │   │   ├── zsyscall_linux_mips64le.go
│   │       │   │   ├── zsyscall_linux_mipsle.go
│   │       │   │   ├── zsyscall_linux_ppc.go
│   │       │   │   ├── zsyscall_linux_ppc64.go
│   │       │   │   ├── zsyscall_linux_ppc64le.go
│   │       │   │   ├── zsyscall_linux_riscv64.go
│   │       │   │   ├── zsyscall_linux_s390x.go
│   │       │   │   ├── zsyscall_linux_sparc64.go
│   │       │   │   ├── zsyscall_netbsd_386.go
│   │       │   │   ├── zsyscall_netbsd_amd64.go
│   │       │   │   ├── zsyscall_netbsd_arm.go
│   │       │   │   ├── zsyscall_netbsd_arm64.go
│   │       │   │   ├── zsyscall_openbsd_386.go
│   │       │   │   ├── zsyscall_openbsd_386.s
│   │       │   │   ├── zsyscall_openbsd_amd64.go
│   │       │   │   ├── zsyscall_openbsd_amd64.s
│   │       │   │   ├── zsyscall_openbsd_arm.go
│   │       │   │   ├── zsyscall_openbsd_arm.s
│   │       │   │   ├── zsyscall_openbsd_arm64.go
│   │       │   │   ├── zsyscall_openbsd_arm64.s
│   │       │   │   ├── zsyscall_openbsd_mips64.go
│   │       │   │   ├── zsyscall_openbsd_mips64.s
│   │       │   │   ├── zsyscall_openbsd_ppc64.go
│   │       │   │   ├── zsyscall_openbsd_ppc64.s
│   │       │   │   ├── zsyscall_openbsd_riscv64.go
│   │       │   │   ├── zsyscall_openbsd_riscv64.s
│   │       │   │   ├── zsyscall_solaris_amd64.go
│   │       │   │   ├── zsyscall_zos_s390x.go
│   │       │   │   ├── zsysctl_openbsd_386.go
│   │       │   │   ├── zsysctl_openbsd_amd64.go
│   │       │   │   ├── zsysctl_openbsd_arm.go
│   │       │   │   ├── zsysctl_openbsd_arm64.go
│   │       │   │   ├── zsysctl_openbsd_mips64.go
│   │       │   │   ├── zsysctl_openbsd_ppc64.go
│   │       │   │   ├── zsysctl_openbsd_riscv64.go
│   │       │   │   ├── zsysnum_darwin_amd64.go
│   │       │   │   ├── zsysnum_darwin_arm64.go
│   │       │   │   ├── zsysnum_dragonfly_amd64.go
│   │       │   │   ├── zsysnum_freebsd_386.go
│   │       │   │   ├── zsysnum_freebsd_amd64.go
│   │       │   │   ├── zsysnum_freebsd_arm.go
│   │       │   │   ├── zsysnum_freebsd_arm64.go
│   │       │   │   ├── zsysnum_freebsd_riscv64.go
│   │       │   │   ├── zsysnum_linux_386.go
│   │       │   │   ├── zsysnum_linux_amd64.go
│   │       │   │   ├── zsysnum_linux_arm.go
│   │       │   │   ├── zsysnum_linux_arm64.go
│   │       │   │   ├── zsysnum_linux_loong64.go
│   │       │   │   ├── zsysnum_linux_mips.go
│   │       │   │   ├── zsysnum_linux_mips64.go
│   │       │   │   ├── zsysnum_linux_mips64le.go
│   │       │   │   ├── zsysnum_linux_mipsle.go
│   │       │   │   ├── zsysnum_linux_ppc.go
│   │       │   │   ├── zsysnum_linux_ppc64.go
│   │       │   │   ├── zsysnum_linux_ppc64le.go
│   │       │   │   ├── zsysnum_linux_riscv64.go
│   │       │   │   ├── zsysnum_linux_s390x.go
│   │       │   │   ├── zsysnum_linux_sparc64.go
│   │       │   │   ├── zsysnum_netbsd_386.go
│   │       │   │   ├── zsysnum_netbsd_amd64.go
│   │       │   │   ├── zsysnum_netbsd_arm.go
│   │       │   │   ├── zsysnum_netbsd_arm64.go
│   │       │   │   ├── zsysnum_openbsd_386.go
│   │       │   │   ├── zsysnum_openbsd_amd64.go
│   │       │   │   ├── zsysnum_openbsd_arm.go
│   │       │   │   ├── zsysnum_openbsd_arm64.go
│   │       │   │   ├── zsysnum_openbsd_mips64.go
│   │       │   │   ├── zsysnum_openbsd_ppc64.go
│   │       │   │   ├── zsysnum_openbsd_riscv64.go
│   │       │   │   ├── zsysnum_zos_s390x.go
│   │       │   │   ├── ztypes_aix_ppc.go
│   │       │   │   ├── ztypes_aix_ppc64.go
│   │       │   │   ├── ztypes_darwin_amd64.go
│   │       │   │   ├── ztypes_darwin_arm64.go
│   │       │   │   ├── ztypes_dragonfly_amd64.go
│   │       │   │   ├── ztypes_freebsd_386.go
│   │       │   │   ├── ztypes_freebsd_amd64.go
│   │       │   │   ├── ztypes_freebsd_arm.go
│   │       │   │   ├── ztypes_freebsd_arm64.go
│   │       │   │   ├── ztypes_freebsd_riscv64.go
│   │       │   │   ├── ztypes_linux.go
│   │       │   │   ├── ztypes_linux_386.go
│   │       │   │   ├── ztypes_linux_amd64.go
│   │       │   │   ├── ztypes_linux_arm.go
│   │       │   │   ├── ztypes_linux_arm64.go
│   │       │   │   ├── ztypes_linux_loong64.go
│   │       │   │   ├── ztypes_linux_mips.go
│   │       │   │   ├── ztypes_linux_mips64.go
│   │       │   │   ├── ztypes_linux_mips64le.go
│   │       │   │   ├── ztypes_linux_mipsle.go
│   │       │   │   ├── ztypes_linux_ppc.go
│   │       │   │   ├── ztypes_linux_ppc64.go
│   │       │   │   ├── ztypes_linux_ppc64le.go
│   │       │   │   ├── ztypes_linux_riscv64.go
│   │       │   │   ├── ztypes_linux_s390x.go
│   │       │   │   ├── ztypes_linux_sparc64.go
│   │       │   │   ├── ztypes_netbsd_386.go
│   │       │   │   ├── ztypes_netbsd_amd64.go
│   │       │   │   ├── ztypes_netbsd_arm.go
│   │       │   │   ├── ztypes_netbsd_arm64.go
│   │       │   │   ├── ztypes_openbsd_386.go
│   │       │   │   ├── ztypes_openbsd_amd64.go
│   │       │   │   ├── ztypes_openbsd_arm.go
│   │       │   │   ├── ztypes_openbsd_arm64.go
│   │       │   │   ├── ztypes_openbsd_mips64.go
│   │       │   │   ├── ztypes_openbsd_ppc64.go
│   │       │   │   ├── ztypes_openbsd_riscv64.go
│   │       │   │   ├── ztypes_solaris_amd64.go
│   │       │   │   └── ztypes_zos_s390x.go
│   │       │   └── windows/
│   │       │       ├── aliases.go
│   │       │       ├── dll_windows.go
│   │       │       ├── empty.s
│   │       │       ├── env_windows.go
│   │       │       ├── eventlog.go
│   │       │       ├── exec_windows.go
│   │       │       ├── memory_windows.go
│   │       │       ├── mkerrors.bash
│   │       │       ├── mkknownfolderids.bash
│   │       │       ├── mksyscall.go
│   │       │       ├── race.go
│   │       │       ├── race0.go
│   │       │       ├── security_windows.go
│   │       │       ├── service.go
│   │       │       ├── setupapi_windows.go
│   │       │       ├── str.go
│   │       │       ├── syscall.go
│   │       │       ├── syscall_windows.go
│   │       │       ├── types_windows.go
│   │       │       ├── types_windows_386.go
│   │       │       ├── types_windows_amd64.go
│   │       │       ├── types_windows_arm.go
│   │       │       ├── types_windows_arm64.go
│   │       │       ├── zerrors_windows.go
│   │       │       ├── zknownfolderids_windows.go
│   │       │       └── zsyscall_windows.go
│   │       └── text/
│   │           ├── LICENSE
│   │           ├── PATENTS
│   │           ├── encoding/
│   │           │   ├── charmap/
│   │           │   │   ├── charmap.go
│   │           │   │   └── tables.go
│   │           │   ├── encoding.go
│   │           │   └── internal/
│   │           │       ├── identifier/
│   │           │       │   ├── identifier.go
│   │           │       │   └── mib.go
│   │           │       └── internal.go
│   │           └── transform/
│   │               └── transform.go
│   └── modules.txt
└── views.go
Download .txt
Showing preview only (9,131K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (109558 symbols across 763 files)

FILE: c/ladspa/ladspa.h
  type LADSPA_Data (line 84) | typedef float LADSPA_Data;
  type LADSPA_Properties (line 94) | typedef int LADSPA_Properties;
  type LADSPA_PortDescriptor (line 152) | typedef int LADSPA_PortDescriptor;
  type LADSPA_PortRangeHintDescriptor (line 200) | typedef int LADSPA_PortRangeHintDescriptor;
  type LADSPA_PortRangeHint (line 337) | typedef struct _LADSPA_PortRangeHint {
  type LADSPA_Descriptor (line 373) | typedef struct _LADSPA_Descriptor {
  type LADSPA_Descriptor (line 592) | typedef const LADSPA_Descriptor *

FILE: c/ladspa/module.c
  type rnnoiseFilter (line 26) | typedef struct {
  function LADSPA_Handle (line 40) | static LADSPA_Handle
  function activateSimpleFilter (line 59) | static void activateSimpleFilter(LADSPA_Handle Instance) {
  function connectPortToSimpleFilter (line 63) | static void connectPortToSimpleFilter(LADSPA_Handle Instance,
  function runFilter (line 84) | static void runFilter(LADSPA_Handle Instance, unsigned long n_samples) {
  function cleanupFilter (line 146) | static void cleanupFilter(LADSPA_Handle Instance) {
  function deleteDescriptor (line 206) | static void deleteDescriptor(LADSPA_Descriptor *psDescriptor) {
  function LADSPA_Descriptor (line 224) | const LADSPA_Descriptor *ladspa_descriptor(unsigned long Index) {

FILE: capability.go
  function getCurrentCaps (line 14) | func getCurrentCaps() *capability.Capabilities {
  function getSelfFileCaps (line 28) | func getSelfFileCaps() *capability.Capabilities {
  function hasCapSysResource (line 47) | func hasCapSysResource(caps *capability.Capabilities) bool {
  function makeBinarySetcapped (line 51) | func makeBinarySetcapped() error {
  function pkexecSetcapSelf (line 63) | func pkexecSetcapSelf() error {

FILE: cli.go
  type CLIOpts (line 16) | type CLIOpts struct
  function parseCLIOpts (line 28) | func parseCLIOpts() CLIOpts {
  function doCLI (line 44) | func doCLI(opt CLIOpts, config *config, librnnoise string) {
  function cleanupExit (line 178) | func cleanupExit(librnnoise string, exitCode int) {

FILE: config.go
  type config (line 15) | type config struct
  constant configFile (line 25) | configFile = "config.toml"
  function initializeConfigIfNot (line 27) | func initializeConfigIfNot() {
  function readConfig (line 64) | func readConfig() *config {
  function writeConfig (line 74) | func writeConfig(conf *config) {
  function configDir (line 83) | func configDir() string {
  function exists (line 87) | func exists(path string) (bool, error) {
  function xdgOrFallback (line 98) | func xdgOrFallback(xdg string, fallback string) string {

FILE: main.go
  type device (line 35) | type device struct
  function main (line 53) | func main() {
  function dumpLib (line 108) | func dumpLib() string {
  function removeLib (line 118) | func removeLib(file string) {
  function getSources (line 126) | func getSources(ctx *ntcontext, client *pulseaudio.Client) []device {
  function getSinks (line 158) | func getSinks(ctx *ntcontext, client *pulseaudio.Client) []device {
  function paConnectionWatchdog (line 191) | func paConnectionWatchdog(ctx *ntcontext) {
  function serverInfo (line 228) | func serverInfo(paClient *pulseaudio.Client) (audioserverinfo, error) {
  function preselectDevice (line 298) | func preselectDevice(ctx *ntcontext, devices []device, preselectID string,
  function getDefaultSourceID (line 322) | func getDefaultSourceID(client *pulseaudio.Client) (string, error) {
  function getDefaultSinkID (line 330) | func getDefaultSinkID(client *pulseaudio.Client) (string, error) {
  function fixWindowClass (line 339) | func fixWindowClass() {

FILE: module.go
  constant loaded (line 15) | loaded = iota
  constant unloaded (line 16) | unloaded
  constant inconsistent (line 17) | inconsistent
  function updateNoiseSupressorLoaded (line 22) | func updateNoiseSupressorLoaded(ctx *ntcontext) {
  function supressorState (line 39) | func supressorState(ctx *ntcontext) (int, bool) {
  function loadSupressor (line 133) | func loadSupressor(ctx *ntcontext, inp *device, out *device) error {
  function loadModule (line 187) | func loadModule(ctx *ntcontext, module, args string) (uint32, error) {
  function loadPipeWireInput (line 198) | func loadPipeWireInput(ctx *ntcontext, inp *device) error {
  function loadPipeWireOutput (line 212) | func loadPipeWireOutput(ctx *ntcontext, out *device) error {
  function loadPulseInput (line 226) | func loadPulseInput(ctx *ntcontext, inp *device) error {
  function loadPulseOutput (line 267) | func loadPulseOutput(ctx *ntcontext, out *device) error {
  function unloadSupressor (line 299) | func unloadSupressor(ctx *ntcontext) error {
  function unloadSupressorPipeWire (line 307) | func unloadSupressorPipeWire(ctx *ntcontext) error {
  function unloadSupressorPulse (line 333) | func unloadSupressorPulse(ctx *ntcontext) error {
  function findModule (line 442) | func findModule(c *pulseaudio.Client, name string, argMatch string) (mod...

FILE: rlimit.go
  constant rlimitRTTime (line 17) | rlimitRTTime = 15
  function getPulsePid (line 19) | func getPulsePid() (int, error) {
  function getRlimit (line 35) | func getRlimit(pid int) (syscall.Rlimit, error) {
  function setRlimit (line 41) | func setRlimit(pid int, new *syscall.Rlimit) error {
  function removeRlimit (line 47) | func removeRlimit(pid int) {
  function pRlimit (line 56) | func pRlimit(pid int, limit uintptr, new *syscall.Rlimit, old *syscall.R...

FILE: scripts/embedlicenses.go
  function main (line 9) | func main() { //nolint

FILE: scripts/signer.go
  function main (line 14) | func main() { //nolint
  function loadKeys (line 87) | func loadKeys() (ed25519.PublicKey, ed25519.PrivateKey) {
  function generateKeypair (line 99) | func generateKeypair() {

FILE: ui.go
  type ntcontext (line 20) | type ntcontext struct
  type audioserverinfo (line 40) | type audioserverinfo struct
  constant servertype_pulse (line 50) | servertype_pulse = iota
  constant servertype_pipewire (line 51) | servertype_pipewire
  constant notice (line 59) | notice = "NoiseTorch Next Gen (stylized NoiseTorch-ng) is a continuation...
  function updatefn (line 61) | func updatefn(ctx *ntcontext, w *nucular.Window) {
  function mainView (line 66) | func mainView(ctx *ntcontext, w *nucular.Window) {
  function uiUnloadFilters (line 274) | func uiUnloadFilters(ctx *ntcontext) {
  function uiReloadFilters (line 289) | func uiReloadFilters(ctx *ntcontext, inp, out device) {
  function ensureOnlyOneInputSelected (line 313) | func ensureOnlyOneInputSelected(inps *[]device, current *device) {
  function inputSelection (line 324) | func inputSelection(ctx *ntcontext) (device, bool) {
  function outputSelection (line 337) | func outputSelection(ctx *ntcontext) (device, bool) {
  function validConfiguration (line 350) | func validConfiguration(ctx *ntcontext, inpOk bool, outOk bool) bool {
  function loadingView (line 357) | func loadingView(ctx *ntcontext, w *nucular.Window) {
  function licenseView (line 364) | func licenseView(ctx *ntcontext, w *nucular.Window) {
  function versionView (line 383) | func versionView(ctx *ntcontext, w *nucular.Window) {
  function connectView (line 399) | func connectView(ctx *ntcontext, w *nucular.Window) {
  function capabilitiesView (line 404) | func capabilitiesView(ctx *ntcontext, w *nucular.Window) {
  function makeErrorView (line 436) | func makeErrorView(ctx *ntcontext, errorMsg string) ViewFunc {
  function makeFatalErrorView (line 451) | func makeFatalErrorView(ctx *ntcontext, errorMsg string) ViewFunc {
  function makeConfirmView (line 466) | func makeConfirmView(ctx *ntcontext, title, text, confirmText, denyText ...
  function resetUI (line 487) | func resetUI(ctx *ntcontext) {

FILE: untar.go
  function Untar (line 56) | func Untar(r io.Reader, dir string) error {
  function untar (line 60) | func untar(r io.Reader, dir string) (err error) {
  function validRelativeDir (line 154) | func validRelativeDir(dir string) bool {
  function validRelPath (line 165) | func validRelPath(p string) bool {

FILE: update.go
  type github_release (line 22) | type github_release struct
  type updateui (line 74) | type updateui struct
  function init (line 84) | func init() {
  function updateable (line 92) | func updateable() bool {
  function updateCheck (line 96) | func updateCheck(ctx *ntcontext) {
  function update (line 111) | func update(ctx *ntcontext) {
  function fetchFile (line 150) | func fetchFile(file string) ([]byte, error) {
  function publickey (line 166) | func publickey() []byte {
  function getLatestRelease (line 175) | func getLatestRelease() (string, error) {

FILE: vendor/dmitri.shuralyov.com/gpu/mtl/mtl.go
  type FeatureSet (line 33) | type FeatureSet
  constant MacOSGPUFamily1V1 (line 37) | MacOSGPUFamily1V1          FeatureSet = 10000
  constant MacOSGPUFamily1V2 (line 38) | MacOSGPUFamily1V2          FeatureSet = 10001
  constant MacOSReadWriteTextureTier2 (line 39) | MacOSReadWriteTextureTier2 FeatureSet = 10002
  constant MacOSGPUFamily1V3 (line 40) | MacOSGPUFamily1V3          FeatureSet = 10003
  constant MacOSGPUFamily1V4 (line 41) | MacOSGPUFamily1V4          FeatureSet = 10004
  constant MacOSGPUFamily2V1 (line 42) | MacOSGPUFamily2V1          FeatureSet = 10005
  type PixelFormat (line 49) | type PixelFormat
  constant PixelFormatRGBA8UNorm (line 54) | PixelFormatRGBA8UNorm     PixelFormat = 70
  constant PixelFormatBGRA8UNorm (line 55) | PixelFormatBGRA8UNorm     PixelFormat = 80
  constant PixelFormatBGRA8UNormSRGB (line 56) | PixelFormatBGRA8UNormSRGB PixelFormat = 81
  type PrimitiveType (line 62) | type PrimitiveType
  constant PrimitiveTypePoint (line 66) | PrimitiveTypePoint         PrimitiveType = 0
  constant PrimitiveTypeLine (line 67) | PrimitiveTypeLine          PrimitiveType = 1
  constant PrimitiveTypeLineStrip (line 68) | PrimitiveTypeLineStrip     PrimitiveType = 2
  constant PrimitiveTypeTriangle (line 69) | PrimitiveTypeTriangle      PrimitiveType = 3
  constant PrimitiveTypeTriangleStrip (line 70) | PrimitiveTypeTriangleStrip PrimitiveType = 4
  type LoadAction (line 77) | type LoadAction
  constant LoadActionDontCare (line 81) | LoadActionDontCare LoadAction = 0
  constant LoadActionLoad (line 82) | LoadActionLoad     LoadAction = 1
  constant LoadActionClear (line 83) | LoadActionClear    LoadAction = 2
  type StoreAction (line 90) | type StoreAction
  constant StoreActionDontCare (line 94) | StoreActionDontCare                   StoreAction = 0
  constant StoreActionStore (line 95) | StoreActionStore                      StoreAction = 1
  constant StoreActionMultisampleResolve (line 96) | StoreActionMultisampleResolve         StoreAction = 2
  constant StoreActionStoreAndMultisampleResolve (line 97) | StoreActionStoreAndMultisampleResolve StoreAction = 3
  constant StoreActionUnknown (line 98) | StoreActionUnknown                    StoreAction = 4
  constant StoreActionCustomSampleDepthStore (line 99) | StoreActionCustomSampleDepthStore     StoreAction = 5
  type StorageMode (line 105) | type StorageMode
  constant StorageModeShared (line 110) | StorageModeShared StorageMode = 0
  constant StorageModeManaged (line 115) | StorageModeManaged StorageMode = 1
  constant StorageModePrivate (line 120) | StorageModePrivate StorageMode = 2
  constant StorageModeMemoryless (line 127) | StorageModeMemoryless StorageMode = 3
  type ResourceOptions (line 134) | type ResourceOptions
  constant ResourceCPUCacheModeDefaultCache (line 139) | ResourceCPUCacheModeDefaultCache ResourceOptions = ResourceOptions(CPUCa...
  constant ResourceCPUCacheModeWriteCombined (line 143) | ResourceCPUCacheModeWriteCombined ResourceOptions = ResourceOptions(CPUC...
  constant ResourceStorageModeShared (line 147) | ResourceStorageModeShared ResourceOptions = ResourceOptions(StorageModeS...
  constant ResourceStorageModeManaged (line 152) | ResourceStorageModeManaged ResourceOptions = ResourceOptions(StorageMode...
  constant ResourceStorageModePrivate (line 157) | ResourceStorageModePrivate ResourceOptions = ResourceOptions(StorageMode...
  constant ResourceStorageModeMemoryless (line 164) | ResourceStorageModeMemoryless ResourceOptions = ResourceOptions(StorageM...
  constant ResourceHazardTrackingModeUntracked (line 170) | ResourceHazardTrackingModeUntracked ResourceOptions = 1 << resourceHazar...
  constant resourceCPUCacheModeShift (line 174) | resourceCPUCacheModeShift       = 0
  constant resourceStorageModeShift (line 175) | resourceStorageModeShift        = 4
  constant resourceHazardTrackingModeShift (line 176) | resourceHazardTrackingModeShift = 8
  type CPUCacheMode (line 182) | type CPUCacheMode
  constant CPUCacheModeDefaultCache (line 187) | CPUCacheModeDefaultCache CPUCacheMode = 0
  constant CPUCacheModeWriteCombined (line 191) | CPUCacheModeWriteCombined CPUCacheMode = 1
  type Resource (line 198) | type Resource interface
  type RenderPipelineDescriptor (line 206) | type RenderPipelineDescriptor struct
  type RenderPipelineColorAttachmentDescriptor (line 221) | type RenderPipelineColorAttachmentDescriptor struct
  type RenderPassDescriptor (line 230) | type RenderPassDescriptor struct
  type RenderPassColorAttachmentDescriptor (line 239) | type RenderPassColorAttachmentDescriptor struct
  type RenderPassAttachmentDescriptor (line 248) | type RenderPassAttachmentDescriptor struct
  type ClearColor (line 257) | type ClearColor struct
  type TextureDescriptor (line 264) | type TextureDescriptor struct
  type Device (line 275) | type Device struct
    method Device (line 335) | func (d Device) Device() unsafe.Pointer { return d.device }
    method SupportsFeatureSet (line 340) | func (d Device) SupportsFeatureSet(fs FeatureSet) bool {
    method MakeCommandQueue (line 347) | func (d Device) MakeCommandQueue() CommandQueue {
    method MakeLibrary (line 355) | func (d Device) MakeLibrary(source string, opt CompileOptions) (Librar...
    method MakeRenderPipelineState (line 367) | func (d Device) MakeRenderPipelineState(rpd RenderPipelineDescriptor) ...
    method MakeBuffer (line 385) | func (d Device) MakeBuffer(bytes unsafe.Pointer, length uintptr, opt R...
    method MakeTexture (line 393) | func (d Device) MakeTexture(td TextureDescriptor) Texture {
  function CreateSystemDefaultDevice (line 297) | func CreateSystemDefaultDevice() (Device, error) {
  function CopyAllDevices (line 316) | func CopyAllDevices() []Device {
  type CompileOptions (line 411) | type CompileOptions struct
  type Drawable (line 418) | type Drawable interface
  type CommandQueue (line 427) | type CommandQueue struct
    method MakeCommandBuffer (line 434) | func (cq CommandQueue) MakeCommandBuffer() CommandBuffer {
  type CommandBuffer (line 442) | type CommandBuffer struct
    method PresentDrawable (line 449) | func (cb CommandBuffer) PresentDrawable(d Drawable) {
    method Commit (line 456) | func (cb CommandBuffer) Commit() {
    method WaitUntilCompleted (line 463) | func (cb CommandBuffer) WaitUntilCompleted() {
    method MakeRenderCommandEncoder (line 471) | func (cb CommandBuffer) MakeRenderCommandEncoder(rpd RenderPassDescrip...
    method MakeBlitCommandEncoder (line 490) | func (cb CommandBuffer) MakeBlitCommandEncoder() BlitCommandEncoder {
  type CommandEncoder (line 498) | type CommandEncoder struct
    method EndEncoding (line 505) | func (ce CommandEncoder) EndEncoding() {
  type RenderCommandEncoder (line 513) | type RenderCommandEncoder struct
    method SetRenderPipelineState (line 520) | func (rce RenderCommandEncoder) SetRenderPipelineState(rps RenderPipel...
    method SetVertexBuffer (line 528) | func (rce RenderCommandEncoder) SetVertexBuffer(buf Buffer, offset, in...
    method SetVertexBytes (line 535) | func (rce RenderCommandEncoder) SetVertexBytes(bytes unsafe.Pointer, l...
    method DrawPrimitives (line 543) | func (rce RenderCommandEncoder) DrawPrimitives(typ PrimitiveType, vert...
  type BlitCommandEncoder (line 551) | type BlitCommandEncoder struct
    method CopyFromTexture (line 559) | func (bce BlitCommandEncoder) CopyFromTexture(
    method Synchronize (line 589) | func (bce BlitCommandEncoder) Synchronize(resource Resource) {
  type Library (line 596) | type Library struct
    method MakeFunction (line 603) | func (l Library) MakeFunction(name string) (Function, error) {
  type Texture (line 616) | type Texture struct
    method resource (line 634) | func (t Texture) resource() unsafe.Pointer { return t.texture }
    method ReplaceRegion (line 639) | func (t Texture) ReplaceRegion(region Region, level int, pixelBytes *b...
    method GetBytes (line 659) | func (t Texture) GetBytes(pixelBytes *byte, bytesPerRow uintptr, regio...
  function NewTexture (line 629) | func NewTexture(texture unsafe.Pointer) Texture {
  type Buffer (line 679) | type Buffer struct
  type Function (line 686) | type Function struct
  type RenderPipelineState (line 694) | type RenderPipelineState struct
  type Region (line 702) | type Region struct
  type Origin (line 711) | type Origin struct
  type Size (line 717) | type Size struct
  function RegionMake2D (line 722) | func RegionMake2D(x, y, width, height int) Region {

FILE: vendor/dmitri.shuralyov.com/gpu/mtl/mtl.h
  type uint_t (line 3) | typedef unsigned long uint_t;
  type Device (line 8) | struct Device {
  type Devices (line 17) | struct Devices {
  type Library (line 22) | struct Library {
  type RenderPipelineDescriptor (line 27) | struct RenderPipelineDescriptor {
  type RenderPipelineState (line 33) | struct RenderPipelineState {
  type ClearColor (line 38) | struct ClearColor {
  type RenderPassDescriptor (line 45) | struct RenderPassDescriptor {
  type TextureDescriptor (line 52) | struct TextureDescriptor {
  type Origin (line 59) | struct Origin {
  type Size (line 65) | struct Size {
  type Region (line 71) | struct Region {
  type Device (line 76) | struct Device
  type Devices (line 77) | struct Devices
  type Library (line 81) | struct Library
  type RenderPipelineState (line 82) | struct RenderPipelineState
  type RenderPipelineDescriptor (line 82) | struct RenderPipelineDescriptor
  type TextureDescriptor (line 84) | struct TextureDescriptor
  type RenderPassDescriptor (line 91) | struct RenderPassDescriptor
  type Origin (line 102) | struct Origin
  type Size (line 102) | struct Size
  type Origin (line 103) | struct Origin
  type Region (line 108) | struct Region
  type Region (line 109) | struct Region

FILE: vendor/gioui.org/app/Gio.java
  class Gio (line 13) | public final class Gio {
    method init (line 25) | public static synchronized void init(Context appCtx) {
    method runGoMain (line 43) | static private native void runGoMain(byte[] dataDir, Context context);
    method writeClipboard (line 45) | static void writeClipboard(Context ctx, String s) {
    method readClipboard (line 50) | static String readClipboard(Context ctx) {
    method wakeupMainThread (line 59) | static void wakeupMainThread() {
    method scheduleMainFuncs (line 67) | static private native void scheduleMainFuncs();

FILE: vendor/gioui.org/app/GioActivity.java
  class GioActivity (line 9) | public final class GioActivity extends Activity {
    method onCreate (line 12) | @Override public void onCreate(Bundle state) {
    method onDestroy (line 20) | @Override public void onDestroy() {
    method onStart (line 25) | @Override public void onStart() {
    method onStop (line 30) | @Override public void onStop() {
    method onConfigurationChanged (line 35) | @Override public void onConfigurationChanged(Configuration c) {
    method onLowMemory (line 40) | @Override public void onLowMemory() {
    method onBackPressed (line 45) | @Override public void onBackPressed() {

FILE: vendor/gioui.org/app/GioView.java
  class GioView (line 48) | public final class GioView extends SurfaceView {
    method GioView (line 61) | public GioView(Context context) {
    method GioView (line 65) | public GioView(Context context, AttributeSet attrs) {
    method onKeyDown (line 122) | @Override public boolean onKeyDown(int keyCode, KeyEvent event) {
    method onGenericMotionEvent (line 129) | @Override public boolean onGenericMotionEvent(MotionEvent event) {
    method onTouchEvent (line 134) | @Override public boolean onTouchEvent(MotionEvent event) {
    method setCursor (line 145) | private void setCursor(int id) {
    method setOrientation (line 153) | private void setOrientation(int id, int fallback) {
    method setFullscreen (line 160) | private void setFullscreen(boolean enabled) {
    type Bar (line 176) | private enum Bar {
    method setBarColor (line 181) | private void setBarColor(Bar t, int color, int luminance) {
    method setStatusColor (line 232) | private void setStatusColor(int color, int luminance) {
    method setNavigationColor (line 236) | private void setNavigationColor(int color, int luminance) {
    method dispatchHoverEvent (line 240) | @Override protected boolean dispatchHoverEvent(MotionEvent event) {
    method sendA11yEvent (line 257) | void sendA11yEvent(int eventType, int viewId) {
    method obtainA11yEvent (line 265) | AccessibilityEvent obtainA11yEvent(int eventType, int viewId) {
    method isA11yActive (line 272) | boolean isA11yActive() {
    method sendA11yChange (line 276) | void sendA11yChange(int viewId) {
    method dispatchMotionEvent (line 287) | private void dispatchMotionEvent(MotionEvent event) {
    method onCreateInputConnection (line 327) | @Override public InputConnection onCreateInputConnection(EditorInfo ed...
    method setInputHint (line 333) | void setInputHint(int hint) {
    method showTextInput (line 341) | void showTextInput() {
    method hideTextInput (line 346) | void hideTextInput() {
    method fitSystemWindows (line 350) | @Override protected boolean fitSystemWindows(Rect insets) {
    method onDraw (line 357) | @Override protected void onDraw(Canvas canvas) {
    method getDensity (line 363) | int getDensity() {
    method getFontScale (line 367) | float getFontScale() {
    method start (line 371) | public void start() {
    method stop (line 377) | public void stop() {
    method destroy (line 383) | public void destroy() {
    method unregister (line 389) | protected void unregister() {
    method configurationChanged (line 395) | public void configurationChanged() {
    method backPressed (line 401) | public boolean backPressed() {
    method onCreateView (line 408) | static private native long onCreateView(GioView view);
    method onDestroyView (line 409) | static private native void onDestroyView(long handle);
    method onStartView (line 410) | static private native void onStartView(long handle);
    method onStopView (line 411) | static private native void onStopView(long handle);
    method onSurfaceDestroyed (line 412) | static private native void onSurfaceDestroyed(long handle);
    method onSurfaceChanged (line 413) | static private native void onSurfaceChanged(long handle, Surface surfa...
    method onConfigurationChanged (line 414) | static private native void onConfigurationChanged(long handle);
    method onWindowInsets (line 415) | static private native void onWindowInsets(long handle, int top, int ri...
    method onLowMemory (line 416) | static public native void onLowMemory();
    method onTouchEvent (line 417) | static private native void onTouchEvent(long handle, int action, int p...
    method onKeyEvent (line 418) | static private native void onKeyEvent(long handle, int code, int chara...
    method onFrameCallback (line 419) | static private native void onFrameCallback(long handle);
    method onBack (line 420) | static private native boolean onBack(long handle);
    method onFocusChange (line 421) | static private native void onFocusChange(long handle, boolean focus);
    method initializeAccessibilityNodeInfo (line 422) | static private native AccessibilityNodeInfo initializeAccessibilityNod...
    method onTouchExploration (line 423) | static private native void onTouchExploration(long handle, float x, fl...
    method onExitTouchExploration (line 424) | static private native void onExitTouchExploration(long handle);
    method onA11yFocus (line 425) | static private native void onA11yFocus(long handle, int viewId);
    method onClearA11yFocus (line 426) | static private native void onClearA11yFocus(long handle, int viewId);
    class InputConnection (line 428) | private static class InputConnection extends BaseInputConnection {
      method InputConnection (line 431) | InputConnection(View view) {
      method getEditable (line 438) | @Override public Editable getEditable() {
    method getAccessibilityNodeProvider (line 443) | @Override public AccessibilityNodeProvider getAccessibilityNodeProvide...

FILE: vendor/gioui.org/app/app.go
  function init (line 17) | func init() {
  function DataDir (line 32) | func DataDir() (string, error) {
  function Main (line 44) | func Main() {

FILE: vendor/gioui.org/app/d3d11_windows.go
  type d3d11Context (line 13) | type d3d11Context struct
    method API (line 52) | func (c *d3d11Context) API() gpu.API {
    method RenderTarget (line 56) | func (c *d3d11Context) RenderTarget() (gpu.RenderTarget, error) {
    method Present (line 62) | func (c *d3d11Context) Present() error {
    method Refresh (line 79) | func (c *d3d11Context) Refresh() error {
    method Lock (line 106) | func (c *d3d11Context) Lock() error {
    method Unlock (line 111) | func (c *d3d11Context) Unlock() {}
    method Release (line 113) | func (c *d3d11Context) Release() {
    method releaseFBO (line 130) | func (c *d3d11Context) releaseFBO() {
  constant debug (line 23) | debug = false
  function init (line 25) | func init() {

FILE: vendor/gioui.org/app/datadir.go
  function dataDir (line 10) | func dataDir() (string, error) {

FILE: vendor/gioui.org/app/egl_android.go
  type androidContext (line 17) | type androidContext struct
    method Release (line 34) | func (c *androidContext) Release() {
    method Refresh (line 41) | func (c *androidContext) Refresh() error {
    method Lock (line 52) | func (c *androidContext) Lock() error {
    method Unlock (line 64) | func (c *androidContext) Unlock() {
  function init (line 24) | func init() {

FILE: vendor/gioui.org/app/egl_wayland.go
  type wlContext (line 27) | type wlContext struct
    method Release (line 44) | func (c *wlContext) Release() {
    method Refresh (line 55) | func (c *wlContext) Refresh() error {
    method Lock (line 74) | func (c *wlContext) Lock() error {
    method Unlock (line 78) | func (c *wlContext) Unlock() {
  function init (line 33) | func init() {

FILE: vendor/gioui.org/app/egl_windows.go
  type glContext (line 11) | type glContext struct
    method Release (line 30) | func (c *glContext) Release() {
    method Refresh (line 37) | func (c *glContext) Refresh() error {
    method Lock (line 56) | func (c *glContext) Lock() error {
    method Unlock (line 60) | func (c *glContext) Unlock() {
  function init (line 16) | func init() {

FILE: vendor/gioui.org/app/egl_x11.go
  type x11Context (line 15) | type x11Context struct
    method Release (line 31) | func (c *x11Context) Release() {
    method Refresh (line 38) | func (c *x11Context) Refresh() error {
    method Lock (line 53) | func (c *x11Context) Lock() error {
    method Unlock (line 57) | func (c *x11Context) Unlock() {
  function init (line 20) | func init() {

FILE: vendor/gioui.org/app/gl_ios.go
  type context (line 40) | type context struct
    method RenderTarget (line 73) | func (c *context) RenderTarget() gpu.RenderTarget {
    method API (line 77) | func (c *context) API() gpu.API {
    method Release (line 81) | func (c *context) Release() {
    method Present (line 93) | func (c *context) Present() error {
    method Lock (line 104) | func (c *context) Lock() error {
    method Unlock (line 114) | func (c *context) Unlock() {
    method Refresh (line 118) | func (c *context) Refresh() error {
  function newContext (line 50) | func newContext(w *window) (*context, error) {
  function contextAPI (line 69) | func contextAPI() gpu.OpenGL {
  method NewContext (line 146) | func (w *window) NewContext() (Context, error) {

FILE: vendor/gioui.org/app/gl_js.go
  type glContext (line 13) | type glContext struct
    method RenderTarget (line 39) | func (c *glContext) RenderTarget() (gpu.RenderTarget, error) {
    method API (line 43) | func (c *glContext) API() gpu.API {
    method Release (line 47) | func (c *glContext) Release() {
    method Present (line 50) | func (c *glContext) Present() error {
    method Lock (line 57) | func (c *glContext) Lock() error {
    method Unlock (line 61) | func (c *glContext) Unlock() {}
    method Refresh (line 63) | func (c *glContext) Refresh() error {
  function newContext (line 18) | func newContext(w *window) (*glContext, error) {
  method NewContext (line 67) | func (w *window) NewContext() (context, error) {

FILE: vendor/gioui.org/app/gl_macos.go
  type glContext (line 41) | type glContext struct
    method RenderTarget (line 76) | func (c *glContext) RenderTarget() (gpu.RenderTarget, error) {
    method API (line 80) | func (c *glContext) API() gpu.API {
    method Release (line 84) | func (c *glContext) Release() {
    method Present (line 92) | func (c *glContext) Present() error {
    method Lock (line 98) | func (c *glContext) Lock() error {
    method Unlock (line 107) | func (c *glContext) Unlock() {
    method Refresh (line 112) | func (c *glContext) Refresh() error {
  function newContext (line 49) | func newContext(w *window) (*glContext, error) {
  method NewContext (line 119) | func (w *window) NewContext() (context, error) {

FILE: vendor/gioui.org/app/internal/log/log_android.go
  constant logLineLimit (line 23) | logLineLimit = 1024
  function init (line 27) | func init() {
  type androidLogWriter (line 37) | type androidLogWriter struct
    method Write (line 42) | func (w *androidLogWriter) Write(data []byte) (int, error) {
  function logFd (line 61) | func logFd(fd uintptr) {

FILE: vendor/gioui.org/app/internal/log/log_ios.go
  function init (line 28) | func init() {
  function newNSLogWriter (line 34) | func newNSLogWriter() io.Writer {

FILE: vendor/gioui.org/app/internal/log/log_windows.go
  type logger (line 11) | type logger struct
    method Write (line 27) | func (l *logger) Write(buf []byte) (int, error) {
  function init (line 19) | func init() {

FILE: vendor/gioui.org/app/internal/windows/windows.go
  type Rect (line 17) | type Rect struct
  type WndClassEx (line 21) | type WndClassEx struct
  type Msg (line 36) | type Msg struct
  type Point (line 46) | type Point struct
  type MinMaxInfo (line 50) | type MinMaxInfo struct
  type WindowPlacement (line 58) | type WindowPlacement struct
    method Rect (line 682) | func (p WindowPlacement) Rect() Rect {
  type MonitorInfo (line 68) | type MonitorInfo struct
  constant TRUE (line 76) | TRUE = 1
  constant CS_HREDRAW (line 78) | CS_HREDRAW = 0x0002
  constant CS_VREDRAW (line 79) | CS_VREDRAW = 0x0001
  constant CS_OWNDC (line 80) | CS_OWNDC   = 0x0020
  constant CW_USEDEFAULT (line 82) | CW_USEDEFAULT = -2147483648
  constant GWL_STYLE (line 84) | GWL_STYLE    = ^(uint32(16) - 1)
  constant HWND_TOPMOST (line 85) | HWND_TOPMOST = ^(uint32(1) - 1)
  constant HTCLIENT (line 87) | HTCLIENT = 1
  constant IDC_ARROW (line 89) | IDC_ARROW   = 32512
  constant IDC_IBEAM (line 90) | IDC_IBEAM   = 32513
  constant IDC_HAND (line 91) | IDC_HAND    = 32649
  constant IDC_CROSS (line 92) | IDC_CROSS   = 32515
  constant IDC_SIZENS (line 93) | IDC_SIZENS  = 32645
  constant IDC_SIZEWE (line 94) | IDC_SIZEWE  = 32644
  constant IDC_SIZEALL (line 95) | IDC_SIZEALL = 32646
  constant INFINITE (line 97) | INFINITE = 0xFFFFFFFF
  constant LOGPIXELSX (line 99) | LOGPIXELSX = 88
  constant MDT_EFFECTIVE_DPI (line 101) | MDT_EFFECTIVE_DPI = 0
  constant MONITOR_DEFAULTTOPRIMARY (line 103) | MONITOR_DEFAULTTOPRIMARY = 1
  constant SIZE_MAXIMIZED (line 105) | SIZE_MAXIMIZED = 2
  constant SIZE_MINIMIZED (line 106) | SIZE_MINIMIZED = 1
  constant SIZE_RESTORED (line 107) | SIZE_RESTORED  = 0
  constant SW_SHOWDEFAULT (line 109) | SW_SHOWDEFAULT = 10
  constant SWP_FRAMECHANGED (line 111) | SWP_FRAMECHANGED  = 0x0020
  constant SWP_NOMOVE (line 112) | SWP_NOMOVE        = 0x0002
  constant SWP_NOOWNERZORDER (line 113) | SWP_NOOWNERZORDER = 0x0200
  constant SWP_NOSIZE (line 114) | SWP_NOSIZE        = 0x0001
  constant SWP_NOZORDER (line 115) | SWP_NOZORDER      = 0x0004
  constant SWP_SHOWWINDOW (line 116) | SWP_SHOWWINDOW    = 0x0040
  constant USER_TIMER_MINIMUM (line 118) | USER_TIMER_MINIMUM = 0x0000000A
  constant VK_CONTROL (line 120) | VK_CONTROL = 0x11
  constant VK_LWIN (line 121) | VK_LWIN    = 0x5B
  constant VK_MENU (line 122) | VK_MENU    = 0x12
  constant VK_RWIN (line 123) | VK_RWIN    = 0x5C
  constant VK_SHIFT (line 124) | VK_SHIFT   = 0x10
  constant VK_BACK (line 126) | VK_BACK   = 0x08
  constant VK_DELETE (line 127) | VK_DELETE = 0x2e
  constant VK_DOWN (line 128) | VK_DOWN   = 0x28
  constant VK_END (line 129) | VK_END    = 0x23
  constant VK_ESCAPE (line 130) | VK_ESCAPE = 0x1b
  constant VK_HOME (line 131) | VK_HOME   = 0x24
  constant VK_LEFT (line 132) | VK_LEFT   = 0x25
  constant VK_NEXT (line 133) | VK_NEXT   = 0x22
  constant VK_PRIOR (line 134) | VK_PRIOR  = 0x21
  constant VK_RIGHT (line 135) | VK_RIGHT  = 0x27
  constant VK_RETURN (line 136) | VK_RETURN = 0x0d
  constant VK_SPACE (line 137) | VK_SPACE  = 0x20
  constant VK_TAB (line 138) | VK_TAB    = 0x09
  constant VK_UP (line 139) | VK_UP     = 0x26
  constant VK_F1 (line 141) | VK_F1  = 0x70
  constant VK_F2 (line 142) | VK_F2  = 0x71
  constant VK_F3 (line 143) | VK_F3  = 0x72
  constant VK_F4 (line 144) | VK_F4  = 0x73
  constant VK_F5 (line 145) | VK_F5  = 0x74
  constant VK_F6 (line 146) | VK_F6  = 0x75
  constant VK_F7 (line 147) | VK_F7  = 0x76
  constant VK_F8 (line 148) | VK_F8  = 0x77
  constant VK_F9 (line 149) | VK_F9  = 0x78
  constant VK_F10 (line 150) | VK_F10 = 0x79
  constant VK_F11 (line 151) | VK_F11 = 0x7A
  constant VK_F12 (line 152) | VK_F12 = 0x7B
  constant VK_OEM_1 (line 154) | VK_OEM_1      = 0xba
  constant VK_OEM_PLUS (line 155) | VK_OEM_PLUS   = 0xbb
  constant VK_OEM_COMMA (line 156) | VK_OEM_COMMA  = 0xbc
  constant VK_OEM_MINUS (line 157) | VK_OEM_MINUS  = 0xbd
  constant VK_OEM_PERIOD (line 158) | VK_OEM_PERIOD = 0xbe
  constant VK_OEM_2 (line 159) | VK_OEM_2      = 0xbf
  constant VK_OEM_3 (line 160) | VK_OEM_3      = 0xc0
  constant VK_OEM_4 (line 161) | VK_OEM_4      = 0xdb
  constant VK_OEM_5 (line 162) | VK_OEM_5      = 0xdc
  constant VK_OEM_6 (line 163) | VK_OEM_6      = 0xdd
  constant VK_OEM_7 (line 164) | VK_OEM_7      = 0xde
  constant VK_OEM_102 (line 165) | VK_OEM_102    = 0xe2
  constant UNICODE_NOCHAR (line 167) | UNICODE_NOCHAR = 65535
  constant WM_CANCELMODE (line 169) | WM_CANCELMODE    = 0x001F
  constant WM_CHAR (line 170) | WM_CHAR          = 0x0102
  constant WM_CREATE (line 171) | WM_CREATE        = 0x0001
  constant WM_DPICHANGED (line 172) | WM_DPICHANGED    = 0x02E0
  constant WM_DESTROY (line 173) | WM_DESTROY       = 0x0002
  constant WM_ERASEBKGND (line 174) | WM_ERASEBKGND    = 0x0014
  constant WM_KEYDOWN (line 175) | WM_KEYDOWN       = 0x0100
  constant WM_KEYUP (line 176) | WM_KEYUP         = 0x0101
  constant WM_LBUTTONDOWN (line 177) | WM_LBUTTONDOWN   = 0x0201
  constant WM_LBUTTONUP (line 178) | WM_LBUTTONUP     = 0x0202
  constant WM_MBUTTONDOWN (line 179) | WM_MBUTTONDOWN   = 0x0207
  constant WM_MBUTTONUP (line 180) | WM_MBUTTONUP     = 0x0208
  constant WM_MOUSEMOVE (line 181) | WM_MOUSEMOVE     = 0x0200
  constant WM_MOUSEWHEEL (line 182) | WM_MOUSEWHEEL    = 0x020A
  constant WM_MOUSEHWHEEL (line 183) | WM_MOUSEHWHEEL   = 0x020E
  constant WM_PAINT (line 184) | WM_PAINT         = 0x000F
  constant WM_CLOSE (line 185) | WM_CLOSE         = 0x0010
  constant WM_QUIT (line 186) | WM_QUIT          = 0x0012
  constant WM_SETCURSOR (line 187) | WM_SETCURSOR     = 0x0020
  constant WM_SETFOCUS (line 188) | WM_SETFOCUS      = 0x0007
  constant WM_KILLFOCUS (line 189) | WM_KILLFOCUS     = 0x0008
  constant WM_SHOWWINDOW (line 190) | WM_SHOWWINDOW    = 0x0018
  constant WM_SIZE (line 191) | WM_SIZE          = 0x0005
  constant WM_SYSKEYDOWN (line 192) | WM_SYSKEYDOWN    = 0x0104
  constant WM_SYSKEYUP (line 193) | WM_SYSKEYUP      = 0x0105
  constant WM_RBUTTONDOWN (line 194) | WM_RBUTTONDOWN   = 0x0204
  constant WM_RBUTTONUP (line 195) | WM_RBUTTONUP     = 0x0205
  constant WM_TIMER (line 196) | WM_TIMER         = 0x0113
  constant WM_UNICHAR (line 197) | WM_UNICHAR       = 0x0109
  constant WM_USER (line 198) | WM_USER          = 0x0400
  constant WM_GETMINMAXINFO (line 199) | WM_GETMINMAXINFO = 0x0024
  constant WS_CLIPCHILDREN (line 201) | WS_CLIPCHILDREN     = 0x00010000
  constant WS_CLIPSIBLINGS (line 202) | WS_CLIPSIBLINGS     = 0x04000000
  constant WS_MAXIMIZE (line 203) | WS_MAXIMIZE         = 0x01000000
  constant WS_VISIBLE (line 204) | WS_VISIBLE          = 0x10000000
  constant WS_OVERLAPPED (line 205) | WS_OVERLAPPED       = 0x00000000
  constant WS_OVERLAPPEDWINDOW (line 206) | WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICK...
  constant WS_CAPTION (line 208) | WS_CAPTION     = 0x00C00000
  constant WS_SYSMENU (line 209) | WS_SYSMENU     = 0x00080000
  constant WS_THICKFRAME (line 210) | WS_THICKFRAME  = 0x00040000
  constant WS_MINIMIZEBOX (line 211) | WS_MINIMIZEBOX = 0x00020000
  constant WS_MAXIMIZEBOX (line 212) | WS_MAXIMIZEBOX = 0x00010000
  constant WS_EX_APPWINDOW (line 214) | WS_EX_APPWINDOW  = 0x00040000
  constant WS_EX_WINDOWEDGE (line 215) | WS_EX_WINDOWEDGE = 0x00000100
  constant QS_ALLINPUT (line 217) | QS_ALLINPUT = 0x04FF
  constant MWMO_WAITALL (line 219) | MWMO_WAITALL        = 0x0001
  constant MWMO_INPUTAVAILABLE (line 220) | MWMO_INPUTAVAILABLE = 0x0004
  constant WAIT_OBJECT_0 (line 222) | WAIT_OBJECT_0 = 0
  constant PM_REMOVE (line 224) | PM_REMOVE   = 0x0001
  constant PM_NOREMOVE (line 225) | PM_NOREMOVE = 0x0000
  constant GHND (line 227) | GHND = 0x0042
  constant CF_UNICODETEXT (line 229) | CF_UNICODETEXT = 13
  constant IMAGE_BITMAP (line 230) | IMAGE_BITMAP   = 0
  constant IMAGE_ICON (line 231) | IMAGE_ICON     = 1
  constant IMAGE_CURSOR (line 232) | IMAGE_CURSOR   = 2
  constant LR_CREATEDIBSECTION (line 234) | LR_CREATEDIBSECTION = 0x00002000
  constant LR_DEFAULTCOLOR (line 235) | LR_DEFAULTCOLOR     = 0x00000000
  constant LR_DEFAULTSIZE (line 236) | LR_DEFAULTSIZE      = 0x00000040
  constant LR_LOADFROMFILE (line 237) | LR_LOADFROMFILE     = 0x00000010
  constant LR_LOADMAP3DCOLORS (line 238) | LR_LOADMAP3DCOLORS  = 0x00001000
  constant LR_LOADTRANSPARENT (line 239) | LR_LOADTRANSPARENT  = 0x00000020
  constant LR_MONOCHROME (line 240) | LR_MONOCHROME       = 0x00000001
  constant LR_SHARED (line 241) | LR_SHARED           = 0x00008000
  constant LR_VGACOLOR (line 242) | LR_VGACOLOR         = 0x00000080
  function AdjustWindowRectEx (line 312) | func AdjustWindowRectEx(r *Rect, dwStyle uint32, bMenu int, dwExStyle ui...
  function CallMsgFilter (line 317) | func CallMsgFilter(m *Msg, nCode uintptr) bool {
  function CloseClipboard (line 323) | func CloseClipboard() error {
  function CreateWindowEx (line 331) | func CreateWindowEx(dwExStyle uint32, lpClassName uint16, lpWindowName s...
  function DefWindowProc (line 351) | func DefWindowProc(hwnd syscall.Handle, msg uint32, wparam, lparam uintp...
  function DestroyWindow (line 356) | func DestroyWindow(hwnd syscall.Handle) {
  function DispatchMessage (line 360) | func DispatchMessage(m *Msg) {
  function EmptyClipboard (line 365) | func EmptyClipboard() error {
  function GetClientRect (line 373) | func GetClientRect(hwnd syscall.Handle, r *Rect) {
  function GetClipboardData (line 378) | func GetClipboardData(format uint32) (syscall.Handle, error) {
  function GetDC (line 386) | func GetDC(hwnd syscall.Handle) (syscall.Handle, error) {
  function GetModuleHandle (line 394) | func GetModuleHandle() (syscall.Handle, error) {
  function getDeviceCaps (line 402) | func getDeviceCaps(hdc syscall.Handle, index int32) int {
  function getDpiForMonitor (line 407) | func getDpiForMonitor(hmonitor syscall.Handle, dpiType uint32) int {
  function GetSystemDPI (line 414) | func GetSystemDPI() int {
  function GetKeyState (line 430) | func GetKeyState(nVirtKey int32) int16 {
  function GetMessage (line 435) | func GetMessage(m *Msg, hwnd syscall.Handle, wMsgFilterMin, wMsgFilterMa...
  function GetMessageTime (line 444) | func GetMessageTime() time.Duration {
  function GetWindowDPI (line 450) | func GetWindowDPI(hwnd syscall.Handle) int {
  function GetWindowPlacement (line 460) | func GetWindowPlacement(hwnd syscall.Handle) *WindowPlacement {
  function GetMonitorInfo (line 467) | func GetMonitorInfo(hwnd syscall.Handle) MonitorInfo {
  function GetWindowLong (line 475) | func GetWindowLong(hwnd syscall.Handle) (style uintptr) {
  function SetWindowLong (line 484) | func SetWindowLong(hwnd syscall.Handle, idx uint32, style uintptr) {
  function SetWindowPlacement (line 492) | func SetWindowPlacement(hwnd syscall.Handle, wp *WindowPlacement) {
  function SetWindowPos (line 496) | func SetWindowPos(hwnd syscall.Handle, hwndInsertAfter uint32, x, y, dx,...
  function SetWindowText (line 504) | func SetWindowText(hwnd syscall.Handle, title string) {
  function GlobalAlloc (line 509) | func GlobalAlloc(size int) (syscall.Handle, error) {
  function GlobalFree (line 517) | func GlobalFree(h syscall.Handle) {
  function GlobalLock (line 521) | func GlobalLock(h syscall.Handle) (uintptr, error) {
  function GlobalUnlock (line 529) | func GlobalUnlock(h syscall.Handle) {
  function KillTimer (line 533) | func KillTimer(hwnd syscall.Handle, nIDEvent uintptr) error {
  function LoadCursor (line 541) | func LoadCursor(curID uint16) (syscall.Handle, error) {
  function LoadImage (line 549) | func LoadImage(hInst syscall.Handle, res uint32, typ uint32, cx, cy int,...
  function MoveWindow (line 557) | func MoveWindow(hwnd syscall.Handle, x, y, width, height int32, repaint ...
  function monitorFromPoint (line 565) | func monitorFromPoint(pt Point, flags uint32) syscall.Handle {
  function MsgWaitForMultipleObjectsEx (line 570) | func MsgWaitForMultipleObjectsEx(nCount uint32, pHandles uintptr, millis...
  function OpenClipboard (line 579) | func OpenClipboard(hwnd syscall.Handle) error {
  function PeekMessage (line 587) | func PeekMessage(m *Msg, hwnd syscall.Handle, wMsgFilterMin, wMsgFilterM...
  function PostQuitMessage (line 593) | func PostQuitMessage(exitCode uintptr) {
  function PostMessage (line 597) | func PostMessage(hwnd syscall.Handle, msg uint32, wParam, lParam uintptr...
  function ReleaseCapture (line 605) | func ReleaseCapture() bool {
  function RegisterClassEx (line 610) | func RegisterClassEx(cls *WndClassEx) (uint16, error) {
  function ReleaseDC (line 619) | func ReleaseDC(hdc syscall.Handle) {
  function SetForegroundWindow (line 623) | func SetForegroundWindow(hwnd syscall.Handle) {
  function SetFocus (line 627) | func SetFocus(hwnd syscall.Handle) {
  function SetProcessDPIAware (line 631) | func SetProcessDPIAware() {
  function SetCapture (line 635) | func SetCapture(hwnd syscall.Handle) syscall.Handle {
  function SetClipboardData (line 640) | func SetClipboardData(format uint32, mem syscall.Handle) error {
  function SetCursor (line 648) | func SetCursor(h syscall.Handle) {
  function SetTimer (line 652) | func SetTimer(hwnd syscall.Handle, nIDEvent uintptr, uElapse uint32, tim...
  function ScreenToClient (line 660) | func ScreenToClient(hwnd syscall.Handle, p *Point) {
  function ShowWindow (line 665) | func ShowWindow(hwnd syscall.Handle, nCmdShow int32) {
  function TranslateMessage (line 669) | func TranslateMessage(m *Msg) {
  function UnregisterClass (line 674) | func UnregisterClass(cls uint16, hInst syscall.Handle) {
  function UpdateWindow (line 678) | func UpdateWindow(hwnd syscall.Handle) {
  function issue34474KeepAlive (line 688) | func issue34474KeepAlive(v interface{}) {

FILE: vendor/gioui.org/app/internal/xkb/xkb_unix.go
  type Context (line 33) | type Context struct
    method Destroy (line 49) | func (x *Context) Destroy() {
    method DestroyKeymapState (line 97) | func (x *Context) DestroyKeymapState() {
    method SetKeymap (line 110) | func (x *Context) SetKeymap(xkbKeyMap, xkbState unsafe.Pointer) {
    method LoadKeymap (line 116) | func (x *Context) LoadKeymap(format int, fd int, size int) error {
    method Modifiers (line 137) | func (x *Context) Modifiers() key.Modifiers {
    method DispatchKey (line 154) | func (x *Context) DispatchKey(keyCode uint32, state key.State) (events...
    method charsForKeycode (line 212) | func (x *Context) charsForKeycode(keyCode C.xkb_keycode_t) []byte {
    method IsRepeatKey (line 221) | func (x *Context) IsRepeatKey(keyCode uint32) bool {
    method UpdateMask (line 226) | func (x *Context) UpdateMask(depressed, latched, locked, depressedGrou...
  function New (line 65) | func New() (*Context, error) {
  function convertKeysym (line 234) | func convertKeysym(s C.xkb_keysym_t) (string, bool) {

FILE: vendor/gioui.org/app/metal_darwin.go
  type mtlContext (line 76) | type mtlContext struct
    method RenderTarget (line 112) | func (c *mtlContext) RenderTarget() (gpu.RenderTarget, error) {
    method API (line 129) | func (c *mtlContext) API() gpu.API {
    method Release (line 137) | func (c *mtlContext) Release() {
    method Present (line 150) | func (c *mtlContext) Present() error {
    method Lock (line 159) | func (c *mtlContext) Lock() error {
    method Unlock (line 163) | func (c *mtlContext) Unlock() {}
    method Refresh (line 165) | func (c *mtlContext) Refresh() error {
  function newMtlContext (line 85) | func newMtlContext(w *window) (*mtlContext, error) {
  method NewContext (line 170) | func (w *window) NewContext() (context, error) {

FILE: vendor/gioui.org/app/metal_ios.go
  function getMetalLayer (line 42) | func getMetalLayer(view C.CFTypeRef) C.CFTypeRef {
  function resizeDrawable (line 46) | func resizeDrawable(view, layer C.CFTypeRef) {

FILE: vendor/gioui.org/app/metal_macos.go
  function getMetalLayer (line 43) | func getMetalLayer(view C.CFTypeRef) C.CFTypeRef {
  function resizeDrawable (line 47) | func resizeDrawable(view, layer C.CFTypeRef) {

FILE: vendor/gioui.org/app/os.go
  type size (line 20) | type size struct
  type Config (line 30) | type Config struct
    method apply (line 58) | func (c *Config) apply(m unit.Metric, options []Option) {
  type ConfigEvent (line 54) | type ConfigEvent struct
    method ImplementsEvent (line 220) | func (ConfigEvent) ImplementsEvent() {}
  type wakeupEvent (line 64) | type wakeupEvent struct
    method ImplementsEvent (line 219) | func (wakeupEvent) ImplementsEvent() {}
  type WindowMode (line 69) | type WindowMode
    method Option (line 78) | func (m WindowMode) Option() Option {
    method String (line 84) | func (m WindowMode) String() string {
  constant Windowed (line 73) | Windowed WindowMode = iota
  constant Fullscreen (line 75) | Fullscreen
  type Orientation (line 97) | type Orientation
    method Option (line 108) | func (o Orientation) Option() Option {
    method String (line 114) | func (o Orientation) String() string {
  constant AnyOrientation (line 101) | AnyOrientation Orientation = iota
  constant LandscapeOrientation (line 103) | LandscapeOrientation
  constant PortraitOrientation (line 105) | PortraitOrientation
  type frameEvent (line 126) | type frameEvent struct
  type context (line 132) | type context interface
  type driver (line 144) | type driver interface
  type windowRendezvous (line 182) | type windowRendezvous struct
  type windowAndConfig (line 188) | type windowAndConfig struct
  function newWindowRendezvous (line 193) | func newWindowRendezvous() *windowRendezvous {

FILE: vendor/gioui.org/app/os_android.go
  type window (line 148) | type window struct
    method NewContext (line 310) | func (w *window) NewContext() (context, error) {
    method initAccessibilityNodeInfo (line 657) | func (w *window) initAccessibilityNodeInfo(env *C.JNIEnv, sem router.S...
    method virtualIDFor (line 745) | func (w *window) virtualIDFor(id router.SemanticID) C.jint {
    method semIDFor (line 753) | func (w *window) semIDFor(virtID C.jint) router.SemanticID {
    method detach (line 760) | func (w *window) detach(env *C.JNIEnv) {
    method setVisible (line 769) | func (w *window) setVisible(env *C.JNIEnv) {
    method setStage (line 778) | func (w *window) setStage(stage system.Stage) {
    method setVisual (line 786) | func (w *window) setVisual(visID int) error {
    method nativeWindow (line 793) | func (w *window) nativeWindow() (*C.ANativeWindow, int, int) {
    method loadConfig (line 798) | func (w *window) loadConfig(env *C.JNIEnv, class C.jclass) {
    method SetAnimating (line 812) | func (w *window) SetAnimating(anim bool) {
    method draw (line 821) | func (w *window) draw(env *C.JNIEnv, sync bool) {
    method ShowTextInput (line 979) | func (w *window) ShowTextInput(show bool) {
    method SetInputHint (line 989) | func (w *window) SetInputHint(mode key.InputHint) {
    method WriteClipboard (line 1131) | func (w *window) WriteClipboard(s string) {
    method ReadClipboard (line 1139) | func (w *window) ReadClipboard() {
    method Configure (line 1151) | func (w *window) Configure(options []Option) {
    method Raise (line 1184) | func (w *window) Raise() {}
    method SetCursor (line 1186) | func (w *window) SetCursor(name pointer.CursorName) {
    method Wakeup (line 1192) | func (w *window) Wakeup() {
    method Close (line 1253) | func (w *window) Close() {}
    method Maximize (line 1256) | func (w *window) Maximize() {}
    method Center (line 1259) | func (w *window) Center() {}
  type ViewEvent (line 195) | type ViewEvent struct
    method ImplementsEvent (line 1283) | func (_ ViewEvent) ImplementsEvent() {}
  type jvalue (line 203) | type jvalue
  constant HOST_VIEW_ID (line 295) | HOST_VIEW_ID = -1
  constant TYPE_VIEW_HOVER_ENTER (line 299) | TYPE_VIEW_HOVER_ENTER = 128
  constant TYPE_VIEW_HOVER_EXIT (line 300) | TYPE_VIEW_HOVER_EXIT  = 256
  constant ACTION_ACCESSIBILITY_FOCUS (line 305) | ACTION_ACCESSIBILITY_FOCUS       = 64
  constant ACTION_CLEAR_ACCESSIBILITY_FOCUS (line 306) | ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128
  constant ACTION_CLICK (line 307) | ACTION_CLICK                     = 16
  function dataDir (line 332) | func dataDir() (string, error) {
  function getMethodID (line 353) | func getMethodID(env *C.JNIEnv, class C.jclass, method, sig string) C.jm...
  function getStaticMethodID (line 365) | func getStaticMethodID(env *C.JNIEnv, class C.jclass, method, sig string...
  function Java_org_gioui_Gio_runGoMain (line 378) | func Java_org_gioui_Gio_runGoMain(env *C.JNIEnv, class C.jclass, jdataDi...
  function initJVM (line 392) | func initJVM(env *C.JNIEnv, gio C.jclass, ctx C.jobject) {
  function JavaVM (line 436) | func JavaVM() uintptr {
  function javaVM (line 441) | func javaVM() *C.JavaVM {
  function AppContext (line 448) | func AppContext() uintptr {
  function Java_org_gioui_GioView_onCreateView (line 455) | func Java_org_gioui_GioView_onCreateView(env *C.JNIEnv, class C.jclass, ...
  function Java_org_gioui_GioView_onDestroyView (line 499) | func Java_org_gioui_GioView_onDestroyView(env *C.JNIEnv, class C.jclass,...
  function Java_org_gioui_GioView_onStopView (line 505) | func Java_org_gioui_GioView_onStopView(env *C.JNIEnv, class C.jclass, ha...
  function Java_org_gioui_GioView_onStartView (line 512) | func Java_org_gioui_GioView_onStartView(env *C.JNIEnv, class C.jclass, h...
  function Java_org_gioui_GioView_onSurfaceDestroyed (line 521) | func Java_org_gioui_GioView_onSurfaceDestroyed(env *C.JNIEnv, class C.jc...
  function Java_org_gioui_GioView_onSurfaceChanged (line 528) | func Java_org_gioui_GioView_onSurfaceChanged(env *C.JNIEnv, class C.jcla...
  function Java_org_gioui_GioView_onLowMemory (line 537) | func Java_org_gioui_GioView_onLowMemory(env *C.JNIEnv, class C.jclass) {
  function Java_org_gioui_GioView_onConfigurationChanged (line 543) | func Java_org_gioui_GioView_onConfigurationChanged(env *C.JNIEnv, class ...
  function Java_org_gioui_GioView_onFrameCallback (line 552) | func Java_org_gioui_GioView_onFrameCallback(env *C.JNIEnv, class C.jclas...
  function Java_org_gioui_GioView_onBack (line 569) | func Java_org_gioui_GioView_onBack(env *C.JNIEnv, class C.jclass, view C...
  function Java_org_gioui_GioView_onFocusChange (line 580) | func Java_org_gioui_GioView_onFocusChange(env *C.JNIEnv, class C.jclass,...
  function Java_org_gioui_GioView_onWindowInsets (line 586) | func Java_org_gioui_GioView_onWindowInsets(env *C.JNIEnv, class C.jclass...
  function Java_org_gioui_GioView_initializeAccessibilityNodeInfo (line 600) | func Java_org_gioui_GioView_initializeAccessibilityNodeInfo(env *C.JNIEn...
  function Java_org_gioui_GioView_onTouchExploration (line 614) | func Java_org_gioui_GioView_onTouchExploration(env *C.JNIEnv, class C.jc...
  function Java_org_gioui_GioView_onExitTouchExploration (line 631) | func Java_org_gioui_GioView_onExitTouchExploration(env *C.JNIEnv, class ...
  function Java_org_gioui_GioView_onA11yFocus (line 640) | func Java_org_gioui_GioView_onA11yFocus(env *C.JNIEnv, class C.jclass, v...
  function Java_org_gioui_GioView_onClearA11yFocus (line 650) | func Java_org_gioui_GioView_onClearA11yFocus(env *C.JNIEnv, class C.jcla...
  type keyMapper (line 867) | type keyMapper
  function runInJVM (line 869) | func runInJVM(jvm *C.JavaVM, f func(env *C.JNIEnv)) {
  function convertKeyCode (line 889) | func convertKeyCode(code C.jint) (string, bool) {
  function Java_org_gioui_GioView_onKeyEvent (line 915) | func Java_org_gioui_GioView_onKeyEvent(env *C.JNIEnv, class C.jclass, ha...
  function Java_org_gioui_GioView_onTouchEvent (line 926) | func Java_org_gioui_GioView_onTouchEvent(env *C.JNIEnv, class C.jclass, ...
  function javaBool (line 1018) | func javaBool(b bool) C.jboolean {
  function javaString (line 1026) | func javaString(env *C.JNIEnv, str string) C.jstring {
  function varArgs (line 1034) | func varArgs(args []jvalue) *C.jvalue {
  function callStaticVoidMethod (line 1041) | func callStaticVoidMethod(env *C.JNIEnv, cls C.jclass, method C.jmethodI...
  function callStaticObjectMethod (line 1046) | func callStaticObjectMethod(env *C.JNIEnv, cls C.jclass, method C.jmetho...
  function callVoidMethod (line 1051) | func callVoidMethod(env *C.JNIEnv, obj C.jobject, method C.jmethodID, ar...
  function callBooleanMethod (line 1056) | func callBooleanMethod(env *C.JNIEnv, obj C.jobject, method C.jmethodID,...
  function callObjectMethod (line 1061) | func callObjectMethod(env *C.JNIEnv, obj C.jobject, method C.jmethodID, ...
  function newObject (line 1066) | func newObject(env *C.JNIEnv, cls C.jclass, method C.jmethodID, args ......
  function exception (line 1074) | func exception(env *C.JNIEnv) error {
  function getObjectClass (line 1089) | func getObjectClass(env *C.JNIEnv, obj C.jobject) C.jclass {
  function goString (line 1102) | func goString(env *C.JNIEnv, str C.jstring) string {
  function findClass (line 1117) | func findClass(env *C.JNIEnv, name string) C.jclass {
  function osMain (line 1123) | func osMain() {
  function newWindow (line 1126) | func newWindow(window *callbacks, options []Option) error {
  function setCursor (line 1198) | func setCursor(env *C.JNIEnv, view C.jobject, name pointer.CursorName) {
  function setOrientation (line 1221) | func setOrientation(env *C.JNIEnv, view C.jobject, mode Orientation) {
  function setStatusColor (line 1238) | func setStatusColor(env *C.JNIEnv, view C.jobject, color color.NRGBA) {
  function setNavigationColor (line 1245) | func setNavigationColor(env *C.JNIEnv, view C.jobject, color color.NRGBA) {
  function runOnMain (line 1262) | func runOnMain(f func(env *C.JNIEnv)) {
  function Java_org_gioui_Gio_scheduleMainFuncs (line 1272) | func Java_org_gioui_Gio_scheduleMainFuncs(env *C.JNIEnv, cls C.jclass) {

FILE: vendor/gioui.org/app/os_darwin.go
  type displayLink (line 49) | type displayLink struct
    method run (line 124) | func (d *displayLink) run(dl C.CFTypeRef) {
    method Start (line 171) | func (d *displayLink) Start() {
    method Stop (line 175) | func (d *displayLink) Stop() {
    method Close (line 179) | func (d *displayLink) Close() {
    method SetDisplayID (line 183) | func (d *displayLink) SetDisplayID(did uint64) {
  function runOnMain (line 69) | func runOnMain(f func()) {
  function gio_dispatchMainFuncs (line 81) | func gio_dispatchMainFuncs() {
  function nsstringToString (line 94) | func nsstringToString(str C.CFTypeRef) string {
  function NewDisplayLink (line 109) | func NewDisplayLink(callback func()) (*displayLink, error) {
  function gio_onFrameCallback (line 188) | func gio_onFrameCallback(dl C.CFTypeRef) {
  function windowSetCursor (line 199) | func windowSetCursor(from, to pointer.CursorName) pointer.CursorName {
  method Wakeup (line 233) | func (w *window) Wakeup() {

FILE: vendor/gioui.org/app/os_ios.go
  type ViewEvent (line 89) | type ViewEvent struct
    method ImplementsEvent (line 358) | func (_ ViewEvent) ImplementsEvent() {}
  type window (line 94) | type window struct
    method draw (line 140) | func (w *window) draw(sync bool) {
    method ReadClipboard (line 262) | func (w *window) ReadClipboard() {
    method WriteClipboard (line 267) | func (w *window) WriteClipboard(s string) {
    method Configure (line 276) | func (w *window) Configure([]Option) {}
    method Raise (line 278) | func (w *window) Raise() {}
    method SetAnimating (line 280) | func (w *window) SetAnimating(anim bool) {
    method SetCursor (line 292) | func (w *window) SetCursor(name pointer.CursorName) {
    method onKeyCommand (line 296) | func (w *window) onKeyCommand(name string) {
    method lookupTouch (line 304) | func (w *window) lookupTouch(last bool, touch C.CFTypeRef) pointer.ID {
    method contextView (line 322) | func (w *window) contextView() C.CFTypeRef {
    method ShowTextInput (line 326) | func (w *window) ShowTextInput(show bool) {
    method SetInputHint (line 334) | func (w *window) SetInputHint(_ key.InputHint) {}
    method Close (line 337) | func (w *window) Close() {}
    method Maximize (line 340) | func (w *window) Maximize() {}
    method Center (line 343) | func (w *window) Center() {}
  function init (line 109) | func init() {
  function onCreate (line 115) | func onCreate(view, controller C.CFTypeRef) {
  function gio_onDraw (line 135) | func gio_onDraw(view C.CFTypeRef) {
  function onStop (line 174) | func onStop(view C.CFTypeRef) {
  function onDestroy (line 181) | func onDestroy(view C.CFTypeRef) {
  function onFocus (line 191) | func onFocus(view C.CFTypeRef, focus int) {
  function onLowMemory (line 197) | func onLowMemory() {
  function onUpArrow (line 203) | func onUpArrow(view C.CFTypeRef) {
  function onDownArrow (line 208) | func onDownArrow(view C.CFTypeRef) {
  function onLeftArrow (line 213) | func onLeftArrow(view C.CFTypeRef) {
  function onRightArrow (line 218) | func onRightArrow(view C.CFTypeRef) {
  function onDeleteBackward (line 223) | func onDeleteBackward(view C.CFTypeRef) {
  function onText (line 228) | func onText(view C.CFTypeRef, str *C.char) {
  function onTouch (line 236) | func onTouch(last C.int, view, touchRef C.CFTypeRef, phase C.NSInteger, ...
  function newWindow (line 345) | func newWindow(win *callbacks, options []Option) error {
  function osMain (line 350) | func osMain() {
  function gio_runMain (line 354) | func gio_runMain() {

FILE: vendor/gioui.org/app/os_js.go
  type ViewEvent (line 25) | type ViewEvent struct
    method ImplementsEvent (line 722) | func (_ ViewEvent) ImplementsEvent() {}
  type window (line 27) | type window struct
    method cleanup (line 155) | func (w *window) cleanup() {
    method addEventListeners (line 164) | func (w *window) addEventListeners() {
    method addHistory (line 296) | func (w *window) addHistory() {
    method flushInput (line 300) | func (w *window) flushInput() {
    method blur (line 306) | func (w *window) blur() {
    method focus (line 311) | func (w *window) focus() {
    method keyboard (line 316) | func (w *window) keyboard(hint key.InputHint) {
    method keyEvent (line 337) | func (w *window) keyEvent(e js.Value, ks key.State) {
    method touchEvent (line 369) | func (w *window) touchEvent(typ pointer.Type, e js.Value) {
    method touchIDFor (line 407) | func (w *window) touchIDFor(touch js.Value) pointer.ID {
    method pointerEvent (line 419) | func (w *window) pointerEvent(typ pointer.Type, dx, dy float32, e js.V...
    method addEventListener (line 457) | func (w *window) addEventListener(this js.Value, event string, f func(...
    method funcOf (line 467) | func (w *window) funcOf(f func(this js.Value, args []js.Value) interfa...
    method animCallback (line 473) | func (w *window) animCallback() {
    method SetAnimating (line 484) | func (w *window) SetAnimating(anim bool) {
    method ReadClipboard (line 492) | func (w *window) ReadClipboard() {
    method WriteClipboard (line 502) | func (w *window) WriteClipboard(s string) {
    method Configure (line 512) | func (w *window) Configure(options []Option) {
    method Raise (line 536) | func (w *window) Raise() {}
    method SetCursor (line 538) | func (w *window) SetCursor(name pointer.CursorName) {
    method Wakeup (line 543) | func (w *window) Wakeup() {
    method ShowTextInput (line 550) | func (w *window) ShowTextInput(show bool) {
    method SetInputHint (line 562) | func (w *window) SetInputHint(mode key.InputHint) {
    method Close (line 567) | func (w *window) Close() {}
    method Maximize (line 570) | func (w *window) Maximize() {}
    method Center (line 573) | func (w *window) Center() {}
    method resize (line 575) | func (w *window) resize() {
    method draw (line 601) | func (w *window) draw(sync bool) {
    method getConfig (line 617) | func (w *window) getConfig() (image.Point, system.Insets, unit.Metric) {
    method windowMode (line 627) | func (w *window) windowMode(mode WindowMode) {
    method orientation (line 648) | func (w *window) orientation(mode Orientation) {
    method navigationColor (line 663) | func (w *window) navigationColor(c color.NRGBA) {
  function newWindow (line 59) | func newWindow(win *callbacks, options []Option) error {
  function getContainer (line 121) | func getContainer(doc js.Value) js.Value {
  function createTextArea (line 131) | func createTextArea(doc js.Value) js.Value {
  function createCanvas (line 146) | func createCanvas(doc js.Value) js.Value {
  function modifiersFor (line 351) | func modifiersFor(e js.Value) key.Modifiers {
  function osMain (line 674) | func osMain() {
  function translateKey (line 678) | func translateKey(k string) (string, bool) {

FILE: vendor/gioui.org/app/os_macos.go
  function init (line 155) | func init() {
  type ViewEvent (line 162) | type ViewEvent struct
    method ImplementsEvent (line 663) | func (_ ViewEvent) ImplementsEvent() {}
  type window (line 169) | type window struct
    method contextView (line 217) | func (w *window) contextView() C.CFTypeRef {
    method ReadClipboard (line 221) | func (w *window) ReadClipboard() {
    method WriteClipboard (line 226) | func (w *window) WriteClipboard(s string) {
    method updateWindowMode (line 235) | func (w *window) updateWindowMode() {
    method Configure (line 244) | func (w *window) Configure(options []Option) {
    method SetCursor (line 286) | func (w *window) SetCursor(name pointer.CursorName) {
    method ShowTextInput (line 290) | func (w *window) ShowTextInput(show bool) {}
    method SetInputHint (line 292) | func (w *window) SetInputHint(_ key.InputHint) {}
    method SetAnimating (line 294) | func (w *window) SetAnimating(anim bool) {
    method Raise (line 302) | func (w *window) Raise() {
    method runOnMain (line 306) | func (w *window) runOnMain(f func()) {
    method Close (line 316) | func (w *window) Close() {
    method Maximize (line 321) | func (w *window) Maximize() {
    method Center (line 327) | func (w *window) Center() {
    method setStage (line 338) | func (w *window) setStage(stage system.Stage) {
    method draw (line 432) | func (w *window) draw() {
  function mustView (line 193) | func mustView(view C.CFTypeRef) *window {
  function lookupView (line 201) | func lookupView(view C.CFTypeRef) (*window, bool) {
  function deleteView (line 209) | func deleteView(view C.CFTypeRef) {
  function insertView (line 213) | func insertView(view C.CFTypeRef, w *window) {
  function gio_onKeys (line 347) | func gio_onKeys(view C.CFTypeRef, cstr *C.char, ti C.double, mods C.NSUI...
  function gio_onText (line 367) | func gio_onText(view C.CFTypeRef, cstr *C.char) {
  function gio_onMouse (line 374) | func gio_onMouse(view C.CFTypeRef, cdir C.int, cbtns C.NSUInteger, x, y,...
  function gio_onDraw (line 414) | func gio_onDraw(view C.CFTypeRef) {
  function gio_onFocus (line 420) | func gio_onFocus(view C.CFTypeRef, focus C.int) {
  function gio_onChangeScreen (line 427) | func gio_onChangeScreen(view C.CFTypeRef, did uint64) {
  function configFor (line 458) | func configFor(scale float32) unit.Metric {
  function gio_onClose (line 466) | func gio_onClose(view C.CFTypeRef) {
  function gio_onHide (line 480) | func gio_onHide(view C.CFTypeRef) {
  function gio_onShow (line 486) | func gio_onShow(view C.CFTypeRef) {
  function gio_onFullscreen (line 492) | func gio_onFullscreen(view C.CFTypeRef) {
  function gio_onWindowed (line 499) | func gio_onWindowed(view C.CFTypeRef) {
  function gio_onAppHide (line 506) | func gio_onAppHide() {
  function gio_onAppShow (line 513) | func gio_onAppShow() {
  function gio_onFinishLaunching (line 520) | func gio_onFinishLaunching() {
  function newWindow (line 524) | func newWindow(win *callbacks, options []Option) error {
  function newOSWindow (line 551) | func newOSWindow() (*window, error) {
  function osMain (line 575) | func osMain() {
  function convertKey (line 579) | func convertKey(k rune) (string, bool) {
  function convertMods (line 646) | func convertMods(mods C.NSUInteger) key.Modifiers {

FILE: vendor/gioui.org/app/os_unix.go
  type ViewEvent (line 13) | type ViewEvent struct
    method ImplementsEvent (line 50) | func (_ ViewEvent) ImplementsEvent() {}
  function osMain (line 20) | func osMain() {
  type windowDriver (line 24) | type windowDriver
  function newWindow (line 30) | func newWindow(window *callbacks, options []Option) error {

FILE: vendor/gioui.org/app/os_wayland.c
  type wl_registry_listener (line 12) | struct wl_registry_listener
  type wl_registry (line 14) | struct wl_registry
  type wl_surface_listener (line 18) | struct wl_surface_listener
  type xdg_surface_listener (line 23) | struct xdg_surface_listener
  type xdg_toplevel_listener (line 27) | struct xdg_toplevel_listener
  function xdg_wm_base_handle_ping (line 32) | static void xdg_wm_base_handle_ping(void *data, struct xdg_wm_base *wm, ...
  type xdg_wm_base_listener (line 36) | struct xdg_wm_base_listener
  type wl_callback_listener (line 40) | struct wl_callback_listener
  type wl_output_listener (line 44) | struct wl_output_listener
  type wl_output (line 46) | struct wl_output
  type wl_seat_listener (line 52) | struct wl_seat_listener
  type wl_seat (line 55) | struct wl_seat
  type wl_pointer_listener (line 58) | struct wl_pointer_listener
  type wl_touch_listener (line 70) | struct wl_touch_listener
  type wl_keyboard_listener (line 78) | struct wl_keyboard_listener
  type zwp_text_input_v3_listener (line 87) | struct zwp_text_input_v3_listener
  type zwp_text_input_v3 (line 91) | struct zwp_text_input_v3
  type zwp_text_input_v3 (line 92) | struct zwp_text_input_v3
  type wl_data_device_listener (line 97) | struct wl_data_device_listener
  type wl_data_offer_listener (line 106) | struct wl_data_offer_listener
  type wl_data_offer (line 107) | struct wl_data_offer
  type wl_data_source_listener (line 112) | struct wl_data_source_listener
  type wl_data_source (line 113) | struct wl_data_source
  type wl_data_source (line 114) | struct wl_data_source

FILE: vendor/gioui.org/app/os_wayland.go
  type wlDisplay (line 81) | type wlDisplay struct
    method writeClipboard (line 258) | func (d *wlDisplay) writeClipboard(content []byte) error {
    method readClipboard (line 282) | func (d *wlDisplay) readClipboard() (io.ReadCloser, error) {
    method createNativeWindow (line 303) | func (d *wlDisplay) createNativeWindow(options []Option) (*window, err...
    method dispatch (line 1166) | func (d *wlDisplay) dispatch(p *poller) error {
    method wakeup (line 1221) | func (d *wlDisplay) wakeup() {
    method destroy (line 1571) | func (d *wlDisplay) destroy() {
  type wlSeat (line 103) | type wlSeat struct
    method flushOffers (line 403) | func (s *wlSeat) flushOffers() {
    method destroy (line 415) | func (s *wlSeat) destroy() {
    method updateCaps (line 444) | func (s *wlSeat) updateCaps(caps C.uint32_t) {
  type repeatState (line 135) | type repeatState struct
    method Start (line 1063) | func (r *repeatState) Start(w *window, keyCode uint32, t time.Duration) {
    method Stop (line 1092) | func (r *repeatState) Stop(t time.Duration) {
    method Advance (line 1105) | func (r *repeatState) Advance(dt time.Duration) {
    method Repeat (line 1111) | func (r *repeatState) Repeat(d *wlDisplay) {
  type window (line 149) | type window struct
    method flushFling (line 856) | func (w *window) flushFling() {
    method ReadClipboard (line 898) | func (w *window) ReadClipboard() {
    method WriteClipboard (line 913) | func (w *window) WriteClipboard(s string) {
    method Configure (line 917) | func (w *window) Configure(options []Option) {
    method Raise (line 937) | func (w *window) Raise() {}
    method SetCursor (line 939) | func (w *window) SetCursor(name pointer.CursorName) {
    method setCursor (line 976) | func (w *window) setCursor(pointer *C.struct_wl_pointer, serial C.uint...
    method resetFling (line 989) | func (w *window) resetFling() {
    method loop (line 1145) | func (w *window) loop() error {
    method Wakeup (line 1208) | func (w *window) Wakeup() {
    method SetAnimating (line 1216) | func (w *window) SetAnimating(anim bool) {
    method destroy (line 1228) | func (w *window) destroy() {
    method flushScroll (line 1333) | func (w *window) flushScroll() {
    method onPointerMotion (line 1370) | func (w *window) onPointerMotion(x, y C.wl_fixed_t, t C.uint32_t) {
    method updateOpaqueRegion (line 1386) | func (w *window) updateOpaqueRegion() {
    method updateOutputs (line 1393) | func (w *window) updateOutputs() {
    method getConfig (line 1418) | func (w *window) getConfig() (image.Point, unit.Metric) {
    method draw (line 1426) | func (w *window) draw(sync bool) {
    method setStage (line 1456) | func (w *window) setStage(s system.Stage) {
    method display (line 1464) | func (w *window) display() *C.struct_wl_display {
    method surface (line 1468) | func (w *window) surface() (*C.struct_wl_surface, int, int) {
    method ShowTextInput (line 1481) | func (w *window) ShowTextInput(show bool) {}
    method SetInputHint (line 1483) | func (w *window) SetInputHint(_ key.InputHint) {}
    method Close (line 1486) | func (w *window) Close() {
    method Maximize (line 1491) | func (w *window) Maximize() {}
    method Center (line 1494) | func (w *window) Center() {}
    method NewContext (line 1496) | func (w *window) NewContext() (context, error) {
  type poller (line 197) | type poller struct
  type wlOutput (line 203) | type wlOutput struct
  function init (line 228) | func init() {
  function newWLWindow (line 232) | func newWLWindow(callbacks *callbacks, options []Option) error {
  function callbackDelete (line 379) | func callbackDelete(k unsafe.Pointer) {
  function callbackStore (line 383) | func callbackStore(k unsafe.Pointer, v interface{}) {
  function callbackLoad (line 387) | func callbackLoad(k unsafe.Pointer) interface{} {
  function gio_onSeatCapabilities (line 396) | func gio_onSeatCapabilities(data unsafe.Pointer, seat *C.struct_wl_seat,...
  function gio_onSeatName (line 476) | func gio_onSeatName(data unsafe.Pointer, seat *C.struct_wl_seat, name *C...
  function gio_onXdgSurfaceConfigure (line 480) | func gio_onXdgSurfaceConfigure(data unsafe.Pointer, wmSurf *C.struct_xdg...
  function gio_onToplevelClose (line 489) | func gio_onToplevelClose(data unsafe.Pointer, topLvl *C.struct_xdg_tople...
  function gio_onToplevelConfigure (line 495) | func gio_onToplevelConfigure(data unsafe.Pointer, topLvl *C.struct_xdg_t...
  function gio_onOutputMode (line 504) | func gio_onOutputMode(data unsafe.Pointer, output *C.struct_wl_output, f...
  function gio_onOutputGeometry (line 515) | func gio_onOutputGeometry(data unsafe.Pointer, output *C.struct_wl_outpu...
  function gio_onOutputScale (line 524) | func gio_onOutputScale(data unsafe.Pointer, output *C.struct_wl_output, ...
  function gio_onOutputDone (line 531) | func gio_onOutputDone(data unsafe.Pointer, output *C.struct_wl_output) {
  function gio_onSurfaceEnter (line 540) | func gio_onSurfaceEnter(data unsafe.Pointer, surf *C.struct_wl_surface, ...
  function gio_onSurfaceLeave (line 557) | func gio_onSurfaceLeave(data unsafe.Pointer, surf *C.struct_wl_surface, ...
  function gio_onRegistryGlobal (line 570) | func gio_onRegistryGlobal(data unsafe.Pointer, reg *C.struct_wl_registry...
  function gio_onDataOfferOffer (line 622) | func gio_onDataOfferOffer(data unsafe.Pointer, offer *C.struct_wl_data_o...
  function gio_onDataOfferSourceActions (line 628) | func gio_onDataOfferSourceActions(data unsafe.Pointer, offer *C.struct_w...
  function gio_onDataOfferAction (line 632) | func gio_onDataOfferAction(data unsafe.Pointer, offer *C.struct_wl_data_...
  function gio_onDataDeviceOffer (line 636) | func gio_onDataDeviceOffer(data unsafe.Pointer, dataDev *C.struct_wl_dat...
  function gio_onDataDeviceEnter (line 644) | func gio_onDataDeviceEnter(data unsafe.Pointer, dataDev *C.struct_wl_dat...
  function gio_onDataDeviceLeave (line 651) | func gio_onDataDeviceLeave(data unsafe.Pointer, dataDev *C.struct_wl_dat...
  function gio_onDataDeviceMotion (line 655) | func gio_onDataDeviceMotion(data unsafe.Pointer, dataDev *C.struct_wl_da...
  function gio_onDataDeviceDrop (line 659) | func gio_onDataDeviceDrop(data unsafe.Pointer, dataDev *C.struct_wl_data...
  function gio_onDataDeviceSelection (line 663) | func gio_onDataDeviceSelection(data unsafe.Pointer, dataDev *C.struct_wl...
  function gio_onRegistryGlobalRemove (line 681) | func gio_onRegistryGlobalRemove(data unsafe.Pointer, reg *C.struct_wl_re...
  function gio_onTouchDown (line 695) | func gio_onTouchDown(data unsafe.Pointer, touch *C.struct_wl_touch, seri...
  function gio_onTouchUp (line 715) | func gio_onTouchUp(data unsafe.Pointer, touch *C.struct_wl_touch, serial...
  function gio_onTouchMotion (line 731) | func gio_onTouchMotion(data unsafe.Pointer, touch *C.struct_wl_touch, t ...
  function gio_onTouchFrame (line 749) | func gio_onTouchFrame(data unsafe.Pointer, touch *C.struct_wl_touch) {
  function gio_onTouchCancel (line 753) | func gio_onTouchCancel(data unsafe.Pointer, touch *C.struct_wl_touch) {
  function gio_onPointerEnter (line 765) | func gio_onPointerEnter(data unsafe.Pointer, pointer *C.struct_wl_pointe...
  function gio_onPointerLeave (line 775) | func gio_onPointerLeave(data unsafe.Pointer, p *C.struct_wl_pointer, ser...
  function gio_onPointerMotion (line 781) | func gio_onPointerMotion(data unsafe.Pointer, p *C.struct_wl_pointer, t ...
  function gio_onPointerButton (line 789) | func gio_onPointerButton(data unsafe.Pointer, p *C.struct_wl_pointer, se...
  function gio_onPointerAxis (line 832) | func gio_onPointerAxis(data unsafe.Pointer, p *C.struct_wl_pointer, t, a...
  function gio_onPointerFrame (line 849) | func gio_onPointerFrame(data unsafe.Pointer, p *C.struct_wl_pointer) {
  function gio_onPointerAxisSource (line 875) | func gio_onPointerAxisSource(data unsafe.Pointer, pointer *C.struct_wl_p...
  function gio_onPointerAxisStop (line 879) | func gio_onPointerAxisStop(data unsafe.Pointer, p *C.struct_wl_pointer, ...
  function gio_onPointerAxisDiscrete (line 886) | func gio_onPointerAxisDiscrete(data unsafe.Pointer, p *C.struct_wl_point...
  function gio_onKeyboardKeymap (line 995) | func gio_onKeyboardKeymap(data unsafe.Pointer, keyboard *C.struct_wl_key...
  function gio_onKeyboardEnter (line 1010) | func gio_onKeyboardEnter(data unsafe.Pointer, keyboard *C.struct_wl_keyb...
  function gio_onKeyboardLeave (line 1020) | func gio_onKeyboardLeave(data unsafe.Pointer, keyboard *C.struct_wl_keyb...
  function gio_onKeyboardKey (line 1029) | func gio_onKeyboardKey(data unsafe.Pointer, keyboard *C.struct_wl_keyboa...
  function mapXKBKeycode (line 1049) | func mapXKBKeycode(keyCode uint32) uint32 {
  function mapXKBKeyState (line 1054) | func mapXKBKeyState(state uint32) key.State {
  function gio_onFrameDone (line 1136) | func gio_onFrameDone(data unsafe.Pointer, callback *C.struct_wl_callback...
  function gio_onKeyboardModifiers (line 1251) | func gio_onKeyboardModifiers(data unsafe.Pointer, keyboard *C.struct_wl_...
  function gio_onKeyboardRepeatInfo (line 1263) | func gio_onKeyboardRepeatInfo(data unsafe.Pointer, keyboard *C.struct_wl...
  function gio_onTextInputEnter (line 1272) | func gio_onTextInputEnter(data unsafe.Pointer, im *C.struct_zwp_text_inp...
  function gio_onTextInputLeave (line 1276) | func gio_onTextInputLeave(data unsafe.Pointer, im *C.struct_zwp_text_inp...
  function gio_onTextInputPreeditString (line 1280) | func gio_onTextInputPreeditString(data unsafe.Pointer, im *C.struct_zwp_...
  function gio_onTextInputCommitString (line 1284) | func gio_onTextInputCommitString(data unsafe.Pointer, im *C.struct_zwp_t...
  function gio_onTextInputDeleteSurroundingText (line 1288) | func gio_onTextInputDeleteSurroundingText(data unsafe.Pointer, im *C.str...
  function gio_onTextInputDone (line 1292) | func gio_onTextInputDone(data unsafe.Pointer, im *C.struct_zwp_text_inpu...
  function gio_onDataSourceTarget (line 1298) | func gio_onDataSourceTarget(data unsafe.Pointer, source *C.struct_wl_dat...
  function gio_onDataSourceSend (line 1302) | func gio_onDataSourceSend(data unsafe.Pointer, source *C.struct_wl_data_...
  function gio_onDataSourceCancelled (line 1312) | func gio_onDataSourceCancelled(data unsafe.Pointer, source *C.struct_wl_...
  function gio_onDataSourceDNDDropPerformed (line 1322) | func gio_onDataSourceDNDDropPerformed(data unsafe.Pointer, source *C.str...
  function gio_onDataSourceDNDFinished (line 1326) | func gio_onDataSourceDNDFinished(data unsafe.Pointer, source *C.struct_w...
  function gio_onDataSourceAction (line 1330) | func gio_onDataSourceAction(data unsafe.Pointer, source *C.struct_wl_dat...
  function detectUIScale (line 1519) | func detectUIScale() float32 {
  function newWLDisplay (line 1532) | func newWLDisplay() (*wlDisplay, error) {
  function fromFixed (line 1617) | func fromFixed(v C.wl_fixed_t) float32 {

FILE: vendor/gioui.org/app/os_windows.go
  type ViewEvent (line 31) | type ViewEvent struct
    method ImplementsEvent (line 832) | func (_ ViewEvent) ImplementsEvent() {}
  type winDeltas (line 35) | type winDeltas struct
  type window (line 40) | type window struct
    method pointerButton (line 352) | func (w *window) pointerButton(btn pointer.Buttons, press bool, lParam...
    method scrollEvent (line 385) | func (w *window) scrollEvent(wParam, lParam uintptr, horizontal bool) {
    method loop (line 410) | func (w *window) loop() error {
    method SetAnimating (line 432) | func (w *window) SetAnimating(anim bool) {
    method Wakeup (line 436) | func (w *window) Wakeup() {
    method setStage (line 442) | func (w *window) setStage(s system.Stage) {
    method draw (line 449) | func (w *window) draw(sync bool) {
    method NewContext (line 465) | func (w *window) NewContext() (context, error) {
    method ReadClipboard (line 483) | func (w *window) ReadClipboard() {
    method readClipboard (line 487) | func (w *window) readClipboard() error {
    method updateWindowMode (line 506) | func (w *window) updateWindowMode() {
    method Configure (line 517) | func (w *window) Configure(options []Option) {
    method Maximize (line 566) | func (w *window) Maximize() {
    method Center (line 582) | func (w *window) Center() {
    method SetWindowMode (line 605) | func (w *window) SetWindowMode(mode WindowMode) {
    method WriteClipboard (line 639) | func (w *window) WriteClipboard(s string) {
    method writeClipboard (line 643) | func (w *window) writeClipboard(s string) error {
    method SetCursor (line 679) | func (w *window) SetCursor(name pointer.CursorName) {
    method ShowTextInput (line 715) | func (w *window) ShowTextInput(show bool) {}
    method SetInputHint (line 717) | func (w *window) SetInputHint(_ key.InputHint) {}
    method HDC (line 719) | func (w *window) HDC() syscall.Handle {
    method HWND (line 723) | func (w *window) HWND() (syscall.Handle, int, int) {
    method Close (line 727) | func (w *window) Close() {
    method Raise (line 731) | func (w *window) Raise() {
  constant _WM_WAKEUP (line 61) | _WM_WAKEUP = windows.WM_USER + iota
  type gpuAPI (line 63) | type gpuAPI struct
  constant iconID (line 75) | iconID = 1
  function osMain (line 87) | func osMain() {
  function newWindow (line 91) | func newWindow(window *callbacks, options []Option) error {
  function initResources (line 125) | func initResources() error {
  function createNativeWindow (line 154) | func createNativeWindow() (*window, error) {
  function windowProc (line 188) | func windowProc(hwnd syscall.Handle, msg uint32, wParam, lParam uintptr)...
  function getModifiers (line 335) | func getModifiers() key.Modifiers {
  function coordsFromlParam (line 379) | func coordsFromlParam(lParam uintptr) (int, int) {
  function loadCursor (line 690) | func loadCursor(name pointer.CursorName) (syscall.Handle, error) {
  function convertKeyCode (line 737) | func convertKeyCode(code uintptr) (string, bool) {
  function configForDPI (line 823) | func configForDPI(dpi int) unit.Metric {

FILE: vendor/gioui.org/app/os_x11.go
  constant _NET_WM_STATE_REMOVE (line 53) | _NET_WM_STATE_REMOVE = 0
  constant _NET_WM_STATE_ADD (line 54) | _NET_WM_STATE_ADD    = 1
  type x11Window (line 57) | type x11Window struct
    method NewContext (line 121) | func (w *x11Window) NewContext() (context, error) {
    method SetAnimating (line 143) | func (w *x11Window) SetAnimating(anim bool) {
    method ReadClipboard (line 147) | func (w *x11Window) ReadClipboard() {
    method WriteClipboard (line 152) | func (w *x11Window) WriteClipboard(s string) {
    method Configure (line 158) | func (w *x11Window) Configure(options []Option) {
    method Raise (line 208) | func (w *x11Window) Raise() {
    method SetCursor (line 228) | func (w *x11Window) SetCursor(name pointer.CursorName) {
    method SetWindowMode (line 252) | func (w *x11Window) SetWindowMode(mode WindowMode) {
    method ShowTextInput (line 268) | func (w *x11Window) ShowTextInput(show bool) {}
    method SetInputHint (line 270) | func (w *x11Window) SetInputHint(_ key.InputHint) {}
    method Close (line 273) | func (w *x11Window) Close() {
    method Maximize (line 290) | func (w *x11Window) Maximize() {
    method Center (line 295) | func (w *x11Window) Center() {
    method sendWMStateEvent (line 313) | func (w *x11Window) sendWMStateEvent(action C.long, atom1, atom2 C.ulo...
    method Wakeup (line 340) | func (w *x11Window) Wakeup() {
    method display (line 350) | func (w *x11Window) display() *C.Display {
    method window (line 354) | func (w *x11Window) window() (C.Window, int, int) {
    method setStage (line 358) | func (w *x11Window) setStage(s system.Stage) {
    method loop (line 366) | func (w *x11Window) loop() {
    method destroy (line 435) | func (w *x11Window) destroy() {
    method atom (line 455) | func (w *x11Window) atom(name string, onlyIfExists bool) C.Atom {
    method updateXkbKeymap (line 827) | func (w *x11Window) updateXkbKeymap() error {
  type x11EventHandler (line 469) | type x11EventHandler struct
    method handleEvents (line 477) | func (h *x11EventHandler) handleEvents() bool {
  function init (line 672) | func init() {
  function newX11Window (line 676) | func newX11Window(gioWin *callbacks, options []Option) error {
  function x11DetectUIScale (line 795) | func x11DetectUIScale(dpy *C.Display) float32 {

FILE: vendor/gioui.org/app/runmain.go
  function mainMain (line 19) | func mainMain()
  function runMain (line 23) | func runMain() {

FILE: vendor/gioui.org/app/vulkan.go
  type vkContext (line 17) | type vkContext struct
    method RenderTarget (line 70) | func (c *vkContext) RenderTarget() (gpu.RenderTarget, error) {
    method api (line 86) | func (c *vkContext) api() gpu.API {
    method release (line 125) | func (c *vkContext) release() {
    method present (line 135) | func (c *vkContext) present() error {
    method destroyImageViews (line 139) | func (c *vkContext) destroyImageViews() {
    method destroySwapchain (line 150) | func (c *vkContext) destroySwapchain() {
    method refresh (line 160) | func (c *vkContext) refresh(surf vk.Surface, width, height int) error {
  function newVulkanContext (line 34) | func newVulkanContext(inst vk.Instance, surf vk.Surface) (*vkContext, er...
  function mapErr (line 96) | func mapErr(err error) error {
  function mapSurfaceErr (line 104) | func mapSurfaceErr(err error) error {

FILE: vendor/gioui.org/app/vulkan_android.go
  type wlVkContext (line 15) | type wlVkContext struct
    method RenderTarget (line 50) | func (c *wlVkContext) RenderTarget() (gpu.RenderTarget, error) {
    method API (line 54) | func (c *wlVkContext) API() gpu.API {
    method Release (line 58) | func (c *wlVkContext) Release() {
    method Present (line 67) | func (c *wlVkContext) Present() error {
    method Lock (line 71) | func (c *wlVkContext) Lock() error {
    method Unlock (line 75) | func (c *wlVkContext) Unlock() {}
    method Refresh (line 77) | func (c *wlVkContext) Refresh() error {
  function init (line 22) | func init() {

FILE: vendor/gioui.org/app/vulkan_wayland.go
  type wlVkContext (line 17) | type wlVkContext struct
    method RenderTarget (line 53) | func (c *wlVkContext) RenderTarget() (gpu.RenderTarget, error) {
    method API (line 57) | func (c *wlVkContext) API() gpu.API {
    method Release (line 61) | func (c *wlVkContext) Release() {
    method Present (line 68) | func (c *wlVkContext) Present() error {
    method Lock (line 72) | func (c *wlVkContext) Lock() error {
    method Unlock (line 76) | func (c *wlVkContext) Unlock() {}
    method Refresh (line 78) | func (c *wlVkContext) Refresh() error {
  function init (line 24) | func init() {

FILE: vendor/gioui.org/app/vulkan_x11.go
  type x11VkContext (line 17) | type x11VkContext struct
    method RenderTarget (line 53) | func (c *x11VkContext) RenderTarget() (gpu.RenderTarget, error) {
    method API (line 57) | func (c *x11VkContext) API() gpu.API {
    method Release (line 61) | func (c *x11VkContext) Release() {
    method Present (line 68) | func (c *x11VkContext) Present() error {
    method Lock (line 72) | func (c *x11VkContext) Lock() error {
    method Unlock (line 76) | func (c *x11VkContext) Unlock() {}
    method Refresh (line 78) | func (c *x11VkContext) Refresh() error {
  function init (line 24) | func init() {

FILE: vendor/gioui.org/app/wayland_text_input.c
  type wl_interface (line 49) | struct wl_interface
  type wl_interface (line 50) | struct wl_interface
  type wl_interface (line 51) | struct wl_interface
  type wl_interface (line 53) | struct wl_interface
  type wl_message (line 64) | struct wl_message
  type wl_message (line 75) | struct wl_message
  type wl_message (line 90) | struct wl_message

FILE: vendor/gioui.org/app/wayland_text_input.h
  type wl_seat (line 69) | struct wl_seat
  type wl_surface (line 70) | struct wl_surface
  type zwp_text_input_manager_v3 (line 71) | struct zwp_text_input_manager_v3
  type zwp_text_input_v3 (line 72) | struct zwp_text_input_v3
  type wl_interface (line 139) | struct wl_interface
  type wl_interface (line 156) | struct wl_interface
  type zwp_text_input_v3_change_cause (line 167) | enum zwp_text_input_v3_change_cause {
  type zwp_text_input_v3_content_hint (line 188) | enum zwp_text_input_v3_content_hint {
  type zwp_text_input_v3_content_purpose (line 248) | enum zwp_text_input_v3_content_purpose {
  type zwp_text_input_v3_listener (line 312) | struct zwp_text_input_v3_listener {
  function zwp_text_input_v3_add_listener (line 452) | static inline int
  function zwp_text_input_v3_set_user_data (line 528) | static inline void
  type zwp_text_input_v3 (line 536) | struct zwp_text_input_v3
  type wl_proxy (line 538) | struct wl_proxy
  function zwp_text_input_v3_get_version (line 541) | static inline uint32_t
  function zwp_text_input_v3_destroy (line 553) | static inline void
  function zwp_text_input_v3_enable (line 595) | static inline void
  function zwp_text_input_v3_disable (line 611) | static inline void
  function zwp_text_input_v3_set_surrounding_text (line 653) | static inline void
  function zwp_text_input_v3_set_text_change_cause (line 678) | static inline void
  function zwp_text_input_v3_set_content_type (line 700) | static inline void
  function zwp_text_input_v3_set_cursor_rectangle (line 728) | static inline void
  function zwp_text_input_v3_commit (line 762) | static inline void
  function zwp_text_input_manager_v3_set_user_data (line 783) | static inline void
  type zwp_text_input_manager_v3 (line 791) | struct zwp_text_input_manager_v3
  type wl_proxy (line 793) | struct wl_proxy
  function zwp_text_input_manager_v3_get_version (line 796) | static inline uint32_t
  function zwp_text_input_manager_v3_destroy (line 807) | static inline void
  type zwp_text_input_v3 (line 821) | struct zwp_text_input_v3
  type zwp_text_input_manager_v3 (line 822) | struct zwp_text_input_manager_v3
  type wl_seat (line 822) | struct wl_seat
  type wl_proxy (line 824) | struct wl_proxy
  type wl_proxy (line 826) | struct wl_proxy
  type zwp_text_input_v3 (line 829) | struct zwp_text_input_v3

FILE: vendor/gioui.org/app/wayland_xdg_decoration.c
  type wl_interface (line 44) | struct wl_interface
  type wl_interface (line 45) | struct wl_interface
  type wl_interface (line 47) | struct wl_interface
  type wl_message (line 53) | struct wl_message
  type wl_message (line 64) | struct wl_message
  type wl_message (line 70) | struct wl_message

FILE: vendor/gioui.org/app/wayland_xdg_decoration.h
  type xdg_toplevel (line 44) | struct xdg_toplevel
  type zxdg_decoration_manager_v1 (line 45) | struct zxdg_decoration_manager_v1
  type zxdg_toplevel_decoration_v1 (line 46) | struct zxdg_toplevel_decoration_v1
  type wl_interface (line 105) | struct wl_interface
  type wl_interface (line 132) | struct wl_interface
  function zxdg_decoration_manager_v1_set_user_data (line 149) | static inline void
  type zxdg_decoration_manager_v1 (line 157) | struct zxdg_decoration_manager_v1
  type wl_proxy (line 159) | struct wl_proxy
  function zxdg_decoration_manager_v1_get_version (line 162) | static inline uint32_t
  function zxdg_decoration_manager_v1_destroy (line 174) | static inline void
  type zxdg_toplevel_decoration_v1 (line 194) | struct zxdg_toplevel_decoration_v1
  type zxdg_decoration_manager_v1 (line 195) | struct zxdg_decoration_manager_v1
  type xdg_toplevel (line 195) | struct xdg_toplevel
  type wl_proxy (line 197) | struct wl_proxy
  type wl_proxy (line 199) | struct wl_proxy
  type zxdg_toplevel_decoration_v1 (line 202) | struct zxdg_toplevel_decoration_v1
  type zxdg_toplevel_decoration_v1_error (line 207) | enum zxdg_toplevel_decoration_v1_error {
  type zxdg_toplevel_decoration_v1_mode (line 231) | enum zxdg_toplevel_decoration_v1_mode {
  type zxdg_toplevel_decoration_v1_listener (line 247) | struct zxdg_toplevel_decoration_v1_listener {
  function zxdg_toplevel_decoration_v1_add_listener (line 269) | static inline int
  function zxdg_toplevel_decoration_v1_set_user_data (line 300) | static inline void
  type zxdg_toplevel_decoration_v1 (line 308) | struct zxdg_toplevel_decoration_v1
  type wl_proxy (line 310) | struct wl_proxy
  function zxdg_toplevel_decoration_v1_get_version (line 313) | static inline uint32_t
  function zxdg_toplevel_decoration_v1_destroy (line 325) | static inline void
  function zxdg_toplevel_decoration_v1_set_mode (line 356) | static inline void
  function zxdg_toplevel_decoration_v1_unset_mode (line 371) | static inline void

FILE: vendor/gioui.org/app/wayland_xdg_shell.c
  type wl_interface (line 49) | struct wl_interface
  type wl_interface (line 50) | struct wl_interface
  type wl_interface (line 51) | struct wl_interface
  type wl_interface (line 52) | struct wl_interface
  type wl_interface (line 53) | struct wl_interface
  type wl_interface (line 54) | struct wl_interface
  type wl_interface (line 55) | struct wl_interface
  type wl_interface (line 57) | struct wl_interface
  type wl_message (line 86) | struct wl_message
  type wl_message (line 93) | struct wl_message
  type wl_message (line 103) | struct wl_message
  type wl_message (line 122) | struct wl_message
  type wl_message (line 130) | struct wl_message
  type wl_message (line 140) | struct wl_message
  type wl_message (line 157) | struct wl_message
  type wl_message (line 168) | struct wl_message
  type wl_message (line 174) | struct wl_message

FILE: vendor/gioui.org/app/wayland_xdg_shell.h
  type wl_output (line 52) | struct wl_output
  type wl_seat (line 53) | struct wl_seat
  type wl_surface (line 54) | struct wl_surface
  type xdg_popup (line 55) | struct xdg_popup
  type xdg_positioner (line 56) | struct xdg_positioner
  type xdg_surface (line 57) | struct xdg_surface
  type xdg_toplevel (line 58) | struct xdg_toplevel
  type xdg_wm_base (line 59) | struct xdg_wm_base
  type wl_interface (line 84) | struct wl_interface
  type wl_interface (line 137) | struct wl_interface
  type wl_interface (line 240) | struct wl_interface
  type wl_interface (line 289) | struct wl_interface
  type wl_interface (line 352) | struct wl_interface
  type xdg_wm_base_error (line 357) | enum xdg_wm_base_error {
  type xdg_wm_base_listener (line 389) | struct xdg_wm_base_listener {
  function xdg_wm_base_add_listener (line 415) | static inline int
  function xdg_wm_base_set_user_data (line 451) | static inline void
  type xdg_wm_base (line 459) | struct xdg_wm_base
  type wl_proxy (line 461) | struct wl_proxy
  function xdg_wm_base_get_version (line 464) | static inline uint32_t
  function xdg_wm_base_destroy (line 479) | static inline void
  type xdg_positioner (line 495) | struct xdg_positioner
  type xdg_wm_base (line 496) | struct xdg_wm_base
  type wl_proxy (line 498) | struct wl_proxy
  type wl_proxy (line 500) | struct wl_proxy
  type xdg_positioner (line 503) | struct xdg_positioner
  type xdg_surface (line 521) | struct xdg_surface
  type xdg_wm_base (line 522) | struct xdg_wm_base
  type wl_surface (line 522) | struct wl_surface
  type wl_proxy (line 524) | struct wl_proxy
  type wl_proxy (line 526) | struct wl_proxy
  type xdg_surface (line 529) | struct xdg_surface
  function xdg_wm_base_pong (line 538) | static inline void
  type xdg_positioner_error (line 547) | enum xdg_positioner_error {
  type xdg_positioner_anchor (line 557) | enum xdg_positioner_anchor {
  type xdg_positioner_gravity (line 572) | enum xdg_positioner_gravity {
  type xdg_positioner_constraint_adjustment (line 593) | enum xdg_positioner_constraint_adjustment {
  function xdg_positioner_set_user_data (line 658) | static inline void
  type xdg_positioner (line 666) | struct xdg_positioner
  type wl_proxy (line 668) | struct wl_proxy
  function xdg_positioner_get_version (line 671) | static inline uint32_t
  function xdg_positioner_destroy (line 682) | static inline void
  function xdg_positioner_set_size (line 700) | static inline void
  function xdg_positioner_set_anchor_rect (line 721) | static inline void
  function xdg_positioner_set_anchor (line 738) | static inline void
  function xdg_positioner_set_gravity (line 755) | static inline void
  function xdg_positioner_set_constraint_adjustment (line 779) | static inline void
  function xdg_positioner_set_offset (line 801) | static inline void
  function xdg_positioner_set_reactive (line 818) | static inline void
  function xdg_positioner_set_parent_size (line 836) | static inline void
  function xdg_positioner_set_parent_configure (line 851) | static inline void
  type xdg_surface_error (line 860) | enum xdg_surface_error {
  type xdg_surface_listener (line 871) | struct xdg_surface_listener {
  function xdg_surface_add_listener (line 904) | static inline int
  function xdg_surface_set_user_data (line 945) | static inline void
  type xdg_surface (line 953) | struct xdg_surface
  type wl_proxy (line 955) | struct wl_proxy
  function xdg_surface_get_version (line 958) | static inline uint32_t
  function xdg_surface_destroy (line 970) | static inline void
  type xdg_toplevel (line 988) | struct xdg_toplevel
  type xdg_surface (line 989) | struct xdg_surface
  type wl_proxy (line 991) | struct wl_proxy
  type wl_proxy (line 993) | struct wl_proxy
  type xdg_toplevel (line 996) | struct xdg_toplevel
  type xdg_popup (line 1011) | struct xdg_popup
  type xdg_surface (line 1012) | struct xdg_surface
  type xdg_surface (line 1012) | struct xdg_surface
  type xdg_positioner (line 1012) | struct xdg_positioner
  type wl_proxy (line 1014) | struct wl_proxy
  type wl_proxy (line 1016) | struct wl_proxy
  type xdg_popup (line 1019) | struct xdg_popup
  function xdg_surface_set_window_geometry (line 1055) | static inline void
  function xdg_surface_ack_configure (line 1085) | static inline void
  type xdg_toplevel_resize_edge (line 1101) | enum xdg_toplevel_resize_edge {
  type xdg_toplevel_state (line 1123) | enum xdg_toplevel_state {
  type xdg_toplevel_listener (line 1179) | struct xdg_toplevel_listener {
  function xdg_toplevel_add_listener (line 1229) | static inline int
  function xdg_toplevel_set_user_data (line 1319) | static inline void
  type xdg_toplevel (line 1327) | struct xdg_toplevel
  type wl_proxy (line 1329) | struct wl_proxy
  function xdg_toplevel_get_version (line 1332) | static inline uint32_t
  function xdg_toplevel_destroy (line 1344) | static inline void
  function xdg_toplevel_set_parent (line 1373) | static inline void
  function xdg_toplevel_set_title (line 1391) | static inline void
  function xdg_toplevel_set_app_id (line 1425) | static inline void
  function xdg_toplevel_show_window_menu (line 1447) | static inline void
  function xdg_toplevel_move (line 1474) | static inline void
  function xdg_toplevel_resize (line 1515) | static inline void
  function xdg_toplevel_set_max_size (line 1560) | static inline void
  function xdg_toplevel_set_min_size (line 1605) | static inline void
  function xdg_toplevel_set_maximized (line 1635) | static inline void
  function xdg_toplevel_unset_maximized (line 1667) | static inline void
  function xdg_toplevel_set_fullscreen (line 1701) | static inline void
  function xdg_toplevel_unset_fullscreen (line 1729) | static inline void
  function xdg_toplevel_set_minimized (line 1748) | static inline void
  type xdg_popup_error (line 1757) | enum xdg_popup_error {
  type xdg_popup_listener (line 1769) | struct xdg_popup_listener {
  function xdg_popup_add_listener (line 1837) | static inline int
  function xdg_popup_set_user_data (line 1876) | static inline void
  type xdg_popup (line 1884) | struct xdg_popup
  type wl_proxy (line 1886) | struct wl_proxy
  function xdg_popup_get_version (line 1889) | static inline uint32_t
  function xdg_popup_destroy (line 1904) | static inline void
  function xdg_popup_grab (line 1958) | static inline void
  function xdg_popup_reposition (line 1992) | static inline void

FILE: vendor/gioui.org/app/window.go
  type Option (line 27) | type Option
  type Window (line 30) | type Window struct
    method Events (line 138) | func (w *Window) Events() <-chan event.Event {
    method update (line 145) | func (w *Window) update(frame *op.Ops) {
    method validateAndProcess (line 150) | func (w *Window) validateAndProcess(d driver, frameStart time.Time, si...
    method render (line 208) | func (w *Window) render(frame *op.Ops, viewport image.Point) error {
    method processFrame (line 230) | func (w *Window) processFrame(d driver, frameStart time.Time, frame *o...
    method Invalidate (line 272) | func (w *Window) Invalidate() {
    method Option (line 286) | func (w *Window) Option(opts ...Option) {
    method ReadClipboard (line 295) | func (w *Window) ReadClipboard() {
    method WriteClipboard (line 302) | func (w *Window) WriteClipboard(s string) {
    method SetCursorName (line 309) | func (w *Window) SetCursorName(name pointer.CursorName) {
    method Close (line 320) | func (w *Window) Close() {
    method Maximize (line 328) | func (w *Window) Maximize() {
    method Center (line 336) | func (w *Window) Center() {
    method Run (line 350) | func (w *Window) Run(f func()) {
    method driverDefer (line 364) | func (w *Window) driverDefer(f func(d driver)) {
    method updateAnimation (line 372) | func (w *Window) updateAnimation(d driver) {
    method wakeup (line 392) | func (w *Window) wakeup() {
    method setNextFrame (line 399) | func (w *Window) setNextFrame(at time.Time) {
    method waitAck (line 449) | func (w *Window) waitAck(d driver) {
    method destroyGPU (line 464) | func (w *Window) destroyGPU() {
    method waitFrame (line 480) | func (w *Window) waitFrame(d driver) (*op.Ops, bool) {
    method updateSemantics (line 501) | func (w *Window) updateSemantics() {
    method collectSemanticDiffs (line 515) | func (w *Window) collectSemanticDiffs(diffs *[]router.SemanticID, n ro...
    method updateState (line 535) | func (w *Window) updateState(d driver) {
    method processEvent (line 549) | func (w *Window) processEvent(d driver, e event.Event) {
    method run (line 618) | func (w *Window) run(options []Option) {
    method updateCursor (line 659) | func (w *Window) updateCursor() {
    method Raise (line 670) | func (w *Window) Raise() {
  type semanticResult (line 80) | type semanticResult struct
  type callbacks (line 85) | type callbacks struct
    method SetDriver (line 406) | func (c *callbacks) SetDriver(d driver) {
    method Event (line 415) | func (c *callbacks) Event(e event.Event) {
    method SemanticRoot (line 424) | func (c *callbacks) SemanticRoot() router.SemanticID {
    method LookupSemantic (line 430) | func (c *callbacks) LookupSemantic(semID router.SemanticID) (router.Se...
    method AppendSemanticDiffs (line 436) | func (c *callbacks) AppendSemanticDiffs(diffs []router.SemanticID) []r...
    method SemanticAt (line 444) | func (c *callbacks) SemanticAt(pos f32.Point) (router.SemanticID, bool) {
  type queue (line 92) | type queue struct
    method Events (line 676) | func (q *queue) Events(k event.Tag) []event.Event {
  function NewWindow (line 109) | func NewWindow(options ...Option) *Window {
  function Title (line 681) | func Title(t string) Option {
  function Size (line 689) | func Size(w, h unit.Value) Option {
  function MaxSize (line 705) | func MaxSize(w, h unit.Value) Option {
  function MinSize (line 721) | func MinSize(w, h unit.Value) Option {
  function StatusColor (line 737) | func StatusColor(color color.NRGBA) Option {
  function NavigationColor (line 744) | func NavigationColor(color color.NRGBA) Option {
  function CustomRenderer (line 752) | func CustomRenderer(custom bool) Option {

FILE: vendor/gioui.org/cpu/abi.h
  type dword (line 7) | typedef ALIGN(4, uint32_t) dword;
  type qword (line 9) | typedef ALIGN(8, uint64_t) qword;
  type half (line 17) | typedef unsigned short half;
  type image_descriptor (line 37) | struct image_descriptor {
  type buffer_descriptor (line 57) | struct buffer_descriptor {
  type program_data (line 63) | struct program_data {
  type yield_result (line 76) | typedef int32_t yield_result;
  type coroutine (line 80) | typedef coroutine (*routine_begin)(struct program_data *data,

FILE: vendor/gioui.org/cpu/driver.go
  constant Supported (line 32) | Supported = true
  function NewBuffer (line 34) | func NewBuffer(size int) BufferDescriptor {
  method Data (line 38) | func (d *BufferDescriptor) Data() []byte {
  method Free (line 42) | func (d *BufferDescriptor) Free() {
  function NewImageRGBA (line 49) | func NewImageRGBA(width, height int) ImageDescriptor {
  method Data (line 53) | func (d *ImageDescriptor) Data() []byte {
  method Free (line 57) | func (d *ImageDescriptor) Free() {
  function NewDispatchContext (line 64) | func NewDispatchContext() *DispatchContext {
  method Free (line 68) | func (c *DispatchContext) Free() {
  method Prepare (line 72) | func (c *DispatchContext) Prepare(numThreads int, prog *ProgramInfo, des...
  method Dispatch (line 76) | func (c *DispatchContext) Dispatch(threadIdx int, ctx *ThreadContext) {
  function NewThreadContext (line 80) | func NewThreadContext() *ThreadContext {
  method Free (line 84) | func (c *ThreadContext) Free() {

FILE: vendor/gioui.org/cpu/driver_nosupport.go
  type BufferDescriptor (line 11) | type BufferDescriptor struct
    method Data (line 26) | func (d *BufferDescriptor) Data() []byte {
    method Free (line 30) | func (d *BufferDescriptor) Free() {
  type ImageDescriptor (line 12) | type ImageDescriptor struct
    method Data (line 37) | func (d *ImageDescriptor) Data() []byte {
    method Free (line 41) | func (d *ImageDescriptor) Free() {
  type SamplerDescriptor (line 13) | type SamplerDescriptor struct
  type DispatchContext (line 15) | type DispatchContext struct
    method Free (line 48) | func (c *DispatchContext) Free() {
    method Prepare (line 51) | func (c *DispatchContext) Prepare(numThreads int, prog *ProgramInfo, d...
    method Dispatch (line 55) | func (c *DispatchContext) Dispatch(threadIdx int, ctx *ThreadContext) {
  type ThreadContext (line 16) | type ThreadContext struct
    method Free (line 63) | func (c *ThreadContext) Free() {
  type ProgramInfo (line 17) | type ProgramInfo struct
  constant Supported (line 20) | Supported = false
  function NewBuffer (line 22) | func NewBuffer(size int) BufferDescriptor {
  function NewImageRGBA (line 33) | func NewImageRGBA(width, height int) ImageDescriptor {
  function NewDispatchContext (line 44) | func NewDispatchContext() *DispatchContext {
  function NewThreadContext (line 59) | func NewThreadContext() *ThreadContext {

FILE: vendor/gioui.org/cpu/runtime.c
  type coroutines (line 19) | struct coroutines {
  type dispatch_context (line 28) | struct dispatch_context {
  type thread_context (line 44) | struct thread_context {
  function coroutines_dump (line 57) | static void coroutines_dump(struct coroutines *routines) {
  function coroutines_push (line 67) | static void coroutines_push(struct coroutines *routines, coroutine r) {
  function coroutines_pop (line 94) | static bool coroutines_pop(struct coroutines *routines, coroutine *r) {
  function coroutines_free (line 103) | static void coroutines_free(struct coroutines *routines) {
  type dispatch_context (line 110) | struct dispatch_context
  type dispatch_context (line 111) | struct dispatch_context
  type dispatch_context (line 113) | struct dispatch_context
  function free_dispatch_context (line 117) | void free_dispatch_context(struct dispatch_context *c) {
  type thread_context (line 124) | struct thread_context
  type thread_context (line 125) | struct thread_context
  type thread_context (line 127) | struct thread_context
  function free_thread_context (line 131) | void free_thread_context(struct thread_context *c) {
  function alloc_buffer (line 139) | struct buffer_descriptor alloc_buffer(size_t size) {
  function alloc_image_rgba (line 149) | struct image_descriptor alloc_image_rgba(int width, int height) {
  function prepare_dispatch (line 166) | void prepare_dispatch(struct dispatch_context *ctx, int nthreads, struct...
  function dispatch_thread (line 199) | void dispatch_thread(struct dispatch_context *ctx, int thread_idx, struc...

FILE: vendor/gioui.org/cpu/runtime.h
  type program_info (line 6) | struct program_info {
  type dispatch_context (line 23) | struct dispatch_context
  type thread_context (line 27) | struct thread_context
  type buffer_descriptor (line 29) | struct buffer_descriptor
  type image_descriptor (line 30) | struct image_descriptor
  type dispatch_context (line 32) | struct dispatch_context
  type dispatch_context (line 34) | struct dispatch_context
  type thread_context (line 36) | struct thread_context
  type thread_context (line 38) | struct thread_context
  type dispatch_context (line 42) | struct dispatch_context
  type program_info (line 42) | struct program_info
  type dispatch_context (line 45) | struct dispatch_context
  type thread_context (line 45) | struct thread_context

FILE: vendor/gioui.org/f32/affine.go
  type Affine2D (line 12) | type Affine2D struct
    method Offset (line 34) | func (a Affine2D) Offset(offset Point) Affine2D {
    method Scale (line 42) | func (a Affine2D) Scale(origin, factor Point) Affine2D {
    method Rotate (line 52) | func (a Affine2D) Rotate(origin Point, radians float32) Affine2D {
    method Shear (line 62) | func (a Affine2D) Shear(origin Point, radiansX, radiansY float32) Affi...
    method Mul (line 72) | func (A Affine2D) Mul(B Affine2D) (r Affine2D) {
    method Invert (line 84) | func (a Affine2D) Invert() Affine2D {
    method Transform (line 102) | func (a Affine2D) Transform(p Point) Point {
    method Elems (line 111) | func (a Affine2D) Elems() (sx, hx, ox, hy, sy, oy float32) {
    method scale (line 115) | func (a Affine2D) scale(factor Point) Affine2D {
    method rotate (line 122) | func (a Affine2D) rotate(radians float32) Affine2D {
    method shear (line 131) | func (a Affine2D) shear(radiansX, radiansY float32) Affine2D {
    method String (line 140) | func (a Affine2D) String() string {
  function NewAffine2D (line 26) | func NewAffine2D(sx, hx, ox, hy, sy, oy float32) Affine2D {

FILE: vendor/gioui.org/f32/f32.go
  type Point (line 15) | type Point struct
    method String (line 20) | func (p Point) String() string {
    method Add (line 55) | func (p Point) Add(p2 Point) Point {
    method Sub (line 60) | func (p Point) Sub(p2 Point) Point {
    method Mul (line 65) | func (p Point) Mul(s float32) Point {
    method Div (line 70) | func (p Point) Div(s float32) Point {
    method In (line 75) | func (p Point) In(r Rectangle) bool {
  type Rectangle (line 27) | type Rectangle struct
    method String (line 32) | func (r Rectangle) String() string {
    method Size (line 81) | func (r Rectangle) Size() Point {
    method Dx (line 86) | func (r Rectangle) Dx() float32 {
    method Dy (line 91) | func (r Rectangle) Dy() float32 {
    method Intersect (line 96) | func (r Rectangle) Intersect(s Rectangle) Rectangle {
    method Union (line 116) | func (r Rectangle) Union(s Rectangle) Rectangle {
    method Canon (line 140) | func (r Rectangle) Canon() Rectangle {
    method Empty (line 151) | func (r Rectangle) Empty() bool {
    method Add (line 156) | func (r Rectangle) Add(p Point) Rectangle {
    method Sub (line 164) | func (r Rectangle) Sub(p Point) Rectangle {
  function Rect (line 39) | func Rect(x0, y0, x1, y1 float32) Rectangle {
  function Pt (line 50) | func Pt(x, y float32) Point {

FILE: vendor/gioui.org/font/opentype/opentype.go
  type Font (line 25) | type Font struct
    method Layout (line 112) | func (f *Font) Layout(ppem fixed.Int26_6, maxWidth int, txt io.Reader)...
    method Shape (line 122) | func (f *Font) Shape(ppem fixed.Int26_6, str text.Layout) clip.PathSpec {
    method Metrics (line 127) | func (f *Font) Metrics(ppem fixed.Int26_6) font.Metrics {
  type Collection (line 32) | type Collection struct
    method NumFonts (line 100) | func (c *Collection) NumFonts() int {
    method Font (line 105) | func (c *Collection) Font(i int) (*Font, error) {
    method Layout (line 133) | func (c *Collection) Layout(ppem fixed.Int26_6, maxWidth int, txt io.R...
    method Shape (line 142) | func (c *Collection) Shape(ppem fixed.Int26_6, str text.Layout) clip.P...
  type opentype (line 36) | type opentype struct
    method HasGlyph (line 357) | func (f *opentype) HasGlyph(buf *sfnt.Buffer, r rune) bool {
    method GlyphAdvance (line 362) | func (f *opentype) GlyphAdvance(buf *sfnt.Buffer, ppem fixed.Int26_6, ...
    method Kern (line 371) | func (f *opentype) Kern(buf *sfnt.Buffer, ppem fixed.Int26_6, r0, r1 r...
    method Metrics (line 387) | func (f *opentype) Metrics(buf *sfnt.Buffer, ppem fixed.Int26_6) font....
    method Bounds (line 392) | func (f *opentype) Bounds(buf *sfnt.Buffer, ppem fixed.Int26_6) fixed....
    method LoadGlyph (line 397) | func (f *opentype) LoadGlyph(buf *sfnt.Buffer, ppem fixed.Int26_6, r r...
  type glyph (line 43) | type glyph struct
  function Parse (line 50) | func Parse(src []byte) (*Font, error) {
  function ParseCollection (line 63) | func ParseCollection(src []byte) (*Collection, error) {
  function ParseCollectionReaderAt (line 76) | func ParseCollectionReaderAt(src io.ReaderAt) (*Collection, error) {
  function newCollectionFrom (line 84) | func newCollectionFrom(coll *sfnt.Collection) (*Collection, error) {
  function fontForGlyph (line 147) | func fontForGlyph(buf *sfnt.Buffer, fonts []*opentype, r rune) *opentype {
  function layoutText (line 159) | func layoutText(sbuf *sfnt.Buffer, ppem fixed.Int26_6, maxWidth int, fon...
  function toLayout (line 254) | func toLayout(glyphs []glyph) text.Layout {
  function textPath (line 264) | func textPath(buf *sfnt.Buffer, ppem fixed.Int26_6, fonts []*opentype, s...
  function readGlyphs (line 328) | func readGlyphs(r io.Reader) ([]glyph, error) {

FILE: vendor/gioui.org/gesture/gesture.go
  constant doubleClickDuration (line 28) | doubleClickDuration = 200 * time.Millisecond
  type Hover (line 31) | type Hover struct
    method Add (line 39) | func (h *Hover) Add(ops *op.Ops) {
    method Hovered (line 47) | func (h *Hover) Hovered(q event.Queue) bool {
  type Click (line 72) | type Click struct
    method Add (line 161) | func (c *Click) Add(ops *op.Ops) {
    method Hovered (line 169) | func (c *Click) Hovered() bool {
    method Pressed (line 174) | func (c *Click) Pressed() bool {
    method Events (line 179) | func (c *Click) Events(q event.Queue) []ClickEvent {
  type ClickEvent (line 90) | type ClickEvent struct
    method ImplementsEvent (line 244) | func (ClickEvent) ImplementsEvent() {}
  type ClickType (line 100) | type ClickType
    method String (line 443) | func (ct ClickType) String() string {
  type Drag (line 103) | type Drag struct
    method Add (line 363) | func (d *Drag) Add(ops *op.Ops) {
    method Events (line 372) | func (d *Drag) Events(cfg unit.Metric, q event.Queue, axis Axis) []poi...
    method Dragging (line 427) | func (d *Drag) Dragging() bool { return d.dragging }
    method Pressed (line 430) | func (d *Drag) Pressed() bool { return d.pressed }
  type Scroll (line 114) | type Scroll struct
    method Add (line 249) | func (s *Scroll) Add(ops *op.Ops, bounds image.Rectangle) {
    method Stop (line 263) | func (s *Scroll) Stop() {
    method Scroll (line 269) | func (s *Scroll) Scroll(cfg unit.Metric, q event.Queue, t time.Time, a...
    method val (line 342) | func (s *Scroll) val(p f32.Point) float32 {
    method State (line 351) | func (s *Scroll) State() ScrollState {
  type ScrollState (line 126) | type ScrollState
    method String (line 456) | func (s ScrollState) String() string {
  type Axis (line 128) | type Axis
    method String (line 432) | func (a Axis) String() string {
  constant Horizontal (line 131) | Horizontal Axis = iota
  constant Vertical (line 132) | Vertical
  constant Both (line 133) | Both
  constant TypePress (line 139) | TypePress ClickType = iota
  constant TypeClick (line 142) | TypeClick
  constant TypeCancel (line 145) | TypeCancel
  constant StateIdle (line 150) | StateIdle ScrollState = iota
  constant StateDragging (line 152) | StateDragging
  constant StateFlinging (line 155) | StateFlinging

FILE: vendor/gioui.org/gpu/caches.go
  type resourceCache (line 11) | type resourceCache struct
    method get (line 43) | func (r *resourceCache) get(key interface{}) (resource, bool) {
    method put (line 51) | func (r *resourceCache) put(key interface{}, val resource) {
    method frame (line 59) | func (r *resourceCache) frame() {
    method release (line 72) | func (r *resourceCache) release() {
  type opCache (line 19) | type opCache struct
    method get (line 89) | func (r *opCache) get(key opKey) (o opCacheValue, exist bool) {
    method put (line 98) | func (r *opCache) put(key opKey, val opCacheValue) {
    method frame (line 118) | func (r *opCache) frame() {
    method release (line 134) | func (r *opCache) release() {
  type opCacheValue (line 27) | type opCacheValue struct
  function newResourceCache (line 36) | func newResourceCache() *resourceCache {
  function newOpCache (line 81) | func newOpCache() *opCache {

FILE: vendor/gioui.org/gpu/clip.go
  type quadSplitter (line 8) | type quadSplitter struct
    method encodeQuadTo (line 45) | func (qs *quadSplitter) encodeQuadTo(from, ctrl, to f32.Point) {
    method splitAndEncode (line 50) | func (qs *quadSplitter) splitAndEncode(quad stroke.QuadSegment) {
  function encodeQuadTo (line 14) | func encodeQuadTo(data []byte, meta uint32, from, ctrl, to f32.Point) {
  function encodeVertex (line 25) | func encodeVertex(data []byte, meta uint32, cornerx, cornery int16, from...
  function unionRect (line 100) | func unionRect(r, s f32.Rectangle) f32.Rectangle {

FILE: vendor/gioui.org/gpu/compute.go
  type compute (line 37) | type compute struct
    method Frame (line 580) | func (g *compute) Frame(frameOps *op.Ops, target RenderTarget, viewpor...
    method collect (line 586) | func (g *compute) collect(viewport image.Point, ops *op.Ops) {
    method Clear (line 594) | func (g *compute) Clear(col color.NRGBA) {
    method frame (line 599) | func (g *compute) frame(target RenderTarget) error {
    method dumpAtlases (line 650) | func (g *compute) dumpAtlases() {
    method Profile (line 669) | func (g *compute) Profile() string {
    method compactAllocs (line 673) | func (g *compute) compactAllocs() error {
    method renderLayers (line 792) | func (g *compute) renderLayers(viewport image.Point) error {
    method blitLayers (line 852) | func (g *compute) blitLayers(d driver.LoadDesc, fbo driver.Texture, vi...
    method renderMaterials (line 910) | func (g *compute) renderMaterials() error {
    method uploadImages (line 1040) | func (g *compute) uploadImages() error {
    method materialQuad (line 1118) | func (g *compute) materialQuad(imgAtlasSize image.Point, M f32.Affine2...
    method render (line 1205) | func (g *compute) render(images *textureAtlas, dst driver.Texture, cpu...
    method memoryBarrier (line 1351) | func (g *compute) memoryBarrier() {
    method dispatch (line 1357) | func (g *compute) dispatch(p computeProgram, x, y, z int) {
    method zeros (line 1367) | func (g *compute) zeros(size int) []byte {
    method touchAlloc (line 1374) | func (g *compute) touchAlloc(a *atlasAlloc) {
    method atlasAlloc (line 1382) | func (g *compute) atlasAlloc(q allocQuery) (atlasAlloc, bool) {
    method realizeAtlas (line 1439) | func (g *compute) realizeAtlas(atlas *textureAtlas, useCPU bool, size ...
    method Release (line 1480) | func (g *compute) Release() {
    method bindBuffers (line 1529) | func (g *compute) bindBuffers() {
    method bindStorageBuffers (line 1592) | func (g *compute) bindStorageBuffers(prog computeProgram, buffers ...s...
    method layer (line 1926) | func (g *compute) layer(viewport image.Point, texOps []textureOp) {
  type materialAlloc (line 113) | type materialAlloc struct
  type layer (line 118) | type layer struct
  type allocQuery (line 125) | type allocQuery struct
  type atlasAlloc (line 134) | type atlasAlloc struct
  type atlasMove (line 142) | type atlasMove struct
  type textureAtlas (line 149) | type textureAtlas struct
    method resize (line 1457) | func (a *textureAtlas) resize(ctx driver.Device, size image.Point) err...
    method ensureCPUImage (line 1472) | func (a *textureAtlas) ensureCPUImage(useCPU bool) {
    method Release (line 1520) | func (a *textureAtlas) Release() {
  type copyUniforms (line 163) | type copyUniforms struct
  type materialUniforms (line 170) | type materialUniforms struct
  type collector (line 177) | type collector struct
    method reset (line 1674) | func (c *collector) reset() {
    method addClip (line 1689) | func (c *collector) addClip(state *encoderState, viewport, bounds f32....
    method collect (line 1728) | func (c *collector) collect(root *op.Ops, viewport image.Point, texOps...
    method hashOp (line 1913) | func (c *collector) hashOp(op paintOp) uint64 {
    method save (line 2154) | func (c *collector) save(id int, state f32.Affine2D) {
  type transEntry (line 191) | type transEntry struct
  type hashIndex (line 196) | type hashIndex struct
  type opsCollector (line 201) | type opsCollector struct
    method reset (line 1682) | func (c *opsCollector) reset() {
  type paintOp (line 208) | type paintOp struct
  type clipCmd (line 220) | type clipCmd struct
  type encoderState (line 229) | type encoderState struct
  type clipKey (line 238) | type clipKey struct
  type paintKey (line 247) | type paintKey struct
  type clipState (line 262) | type clipState struct
  type layerVertex (line 273) | type layerVertex struct
  type materialVertex (line 280) | type materialVertex struct
  type textureKey (line 286) | type textureKey struct
  type textureOp (line 293) | type textureOp struct
  type encoder (line 304) | type encoder struct
    method encodePath (line 1189) | func (enc *encoder) encodePath(verts []byte, fillMode int) {
    method reset (line 1604) | func (e *encoder) reset() {
    method numElements (line 1611) | func (e *encoder) numElements() int {
    method append (line 1615) | func (e *encoder) append(e2 encoder) {
    method transform (line 1622) | func (e *encoder) transform(m f32.Affine2D) {
    method lineWidth (line 1627) | func (e *encoder) lineWidth(width float32) {
    method fillMode (line 1631) | func (e *encoder) fillMode(mode scene.FillMode) {
    method beginClip (line 1635) | func (e *encoder) beginClip(bbox f32.Rectangle) {
    method endClip (line 1640) | func (e *encoder) endClip(bbox f32.Rectangle) {
    method rect (line 1645) | func (e *encoder) rect(r f32.Rectangle) {
    method fillColor (line 1654) | func (e *encoder) fillColor(col color.RGBA) {
    method fillImage (line 1659) | func (e *encoder) fillImage(index int, offset image.Point) {
    method line (line 1664) | func (e *encoder) line(start, end f32.Point) {
    method quad (line 1669) | func (e *encoder) quad(start, ctrl, end f32.Point) {
  type encodeState (line 311) | type encodeState struct
  type sizedBuffer (line 317) | type sizedBuffer struct
    method Release (line 1546) | func (b *sizedBuffer) Release() {
    method ensureCapacity (line 1554) | func (b *sizedBuffer) ensureCapacity(useCPU bool, ctx driver.Device, b...
    method download (line 1575) | func (b *sizedBuffer) download(data []byte) error {
    method upload (line 1584) | func (b *sizedBuffer) upload(data []byte) {
  type computeProgram (line 325) | type computeProgram struct
    method Release (line 1539) | func (p *computeProgram) Release() {
  type config (line 335) | type config struct
  type memAlloc (line 349) | type memAlloc struct
  type memoryHeader (line 355) | type memoryHeader struct
  type rectangle (line 361) | type rectangle
    method In (line 2184) | func (r rectangle) In(b f32.Rectangle) bool {
    method Contains (line 2195) | func (r rectangle) Contains(b f32.Rectangle) bool {
    method Bounds (line 2199) | func (r rectangle) Bounds() f32.Rectangle {
  constant layersBindings (line 364) | layersBindings    = driver.BufferBindingShaderStorageWrite | driver.Buff...
  constant materialsBindings (line 365) | materialsBindings = driver.BufferBindingFramebuffer | driver.BufferBindi...
  constant combinedBindings (line 367) | combinedBindings = layersBindings | materialsBindings
  constant tileWidthPx (line 372) | tileWidthPx       = 32
  constant tileHeightPx (line 373) | tileHeightPx      = 32
  constant ptclInitialAlloc (line 374) | ptclInitialAlloc  = 1024
  constant kernel4OutputUnit (line 375) | kernel4OutputUnit = 2
  constant kernel4AtlasUnit (line 376) | kernel4AtlasUnit  = 3
  constant pathSize (line 378) | pathSize    = 12
  constant binSize (line 379) | binSize     = 8
  constant pathsegSize (line 380) | pathsegSize = 52
  constant annoSize (line 381) | annoSize    = 32
  constant transSize (line 382) | transSize   = 24
  constant stateSize (line 383) | stateSize   = 60
  constant stateStride (line 384) | stateStride = 4 + 2*stateSize
  constant memNoError (line 389) | memNoError      = 0
  constant memMallocFailed (line 390) | memMallocFailed = 1
  function newCompute (line 393) | func newCompute(ctx driver.Device) (*compute, error) {
  function newShaders (line 568) | func newShaders(ctx driver.Device, vsrc, fsrc shader.Sources) (vert driv...
  function copyImage (line 778) | func copyImage(dst []byte, dstStride int, dstPos image.Point, src []byte...
  function pow2Ceil (line 1108) | func pow2Ceil(v int) int {
  function quadBounds (line 1156) | func quadBounds(q [4]materialVertex) f32.Rectangle {
  function max (line 1167) | func max(p1, p2 f32.Point) f32.Point {
  function min (line 1178) | func min(p1, p2 f32.Point) f32.Point {
  function longestLayer (line 1999) | func longestLayer(prev []paintOp, order []hashIndex, ops []paintOp) ([]p...
  function searchOp (line 2041) | func searchOp(order []hashIndex, hash uint64) int {
  function opEqual (line 2054) | func opEqual(off image.Point, o1 paintOp, o2 paintOp) bool {
  function encodeLayer (line 2079) | func encodeLayer(l layer, pos image.Point, viewport image.Point, enc *en...
  function encodeOp (line 2090) | func encodeOp(viewport image.Point, absOff image.Point, enc *encoder, te...
  function transformBounds (line 2161) | func transformBounds(t f32.Affine2D, bounds f32.Rectangle) rectangle {
  function separateTransform (line 2168) | func separateTransform(t f32.Affine2D) (f32.Affine2D, image.Point) {
  function transformRect (line 2176) | func transformRect(t f32.Affine2D, r rectangle) rectangle {

FILE: vendor/gioui.org/gpu/cpu.go
  type dispatcher (line 14) | type dispatcher struct
    method dispatcher (line 60) | func (d *dispatcher) dispatcher() {
    method worker (line 98) | func (d *dispatcher) worker() {
    method Barrier (line 107) | func (d *dispatcher) Barrier() {
    method Sync (line 111) | func (d *dispatcher) Sync() {
    method Dispatch (line 116) | func (d *dispatcher) Dispatch(program *cpu.ProgramInfo, descSet unsafe...
    method Stop (line 127) | func (d *dispatcher) Stop() {
  type work (line 25) | type work struct
  type dispatch (line 30) | type dispatch struct
  type jobType (line 37) | type jobType
  constant jobDispatch (line 40) | jobDispatch jobType = iota
  constant jobBarrier (line 41) | jobBarrier
  constant jobSync (line 42) | jobSync
  function newDispatcher (line 45) | func newDispatcher(workers int) *dispatcher {

FILE: vendor/gioui.org/gpu/gpu.go
  type GPU (line 40) | type GPU interface
  type gpu (line 53) | type gpu struct
    method init (line 334) | func (g *gpu) init(ctx driver.Device) error {
    method Clear (line 340) | func (g *gpu) Clear(col color.NRGBA) {
    method Release (line 345) | func (g *gpu) Release() {
    method Frame (line 355) | func (g *gpu) Frame(frameOps *op.Ops, target RenderTarget, viewport im...
    method collect (line 360) | func (g *gpu) collect(viewport image.Point, frameOps *op.Ops) {
    method frame (line 374) | func (g *gpu) frame(target RenderTarget) error {
    method Profile (line 420) | func (g *gpu) Profile() string {
  type renderer (line 65) | type renderer struct
    method texHandle (line 424) | func (r *renderer) texHandle(cache *resourceCache, data imageOpData) d...
    method release (line 471) | func (r *renderer) release() {
    method stencilClips (line 615) | func (r *renderer) stencilClips(pathCache *opCache, ops []*pathOp) {
    method prepareIntersections (line 640) | func (r *renderer) prepareIntersections(ops []imageOp) {
    method intersect (line 650) | func (r *renderer) intersect(ops []imageOp) {
    method intersectPath (line 680) | func (r *renderer) intersectPath(p *pathOp, clip image.Rectangle) {
    method packIntersections (line 706) | func (r *renderer) packIntersections(ops []imageOp) {
    method packStencils (line 736) | func (r *renderer) packStencils(pops *[]*pathOp) {
    method uploadImages (line 1071) | func (r *renderer) uploadImages(cache *resourceCache, ops []imageOp) {
    method prepareDrawOps (line 1080) | func (r *renderer) prepareDrawOps(cache *resourceCache, ops []imageOp) {
    method drawOps (line 1101) | func (r *renderer) drawOps(cache *resourceCache, ops []imageOp) {
  type drawOps (line 73) | type drawOps struct
    method reset (line 783) | func (d *drawOps) reset(viewport image.Point) {
    method collect (line 793) | func (d *drawOps) collect(root *op.Ops, viewport image.Point) {
    method buildPaths (line 805) | func (d *drawOps) buildPaths(ctx driver.Device) {
    method newPathOp (line 818) | func (d *drawOps) newPathOp() *pathOp {
    method addClipPath (line 823) | func (d *drawOps) addClipPath(state *drawState, aux []byte, auxKey opK...
    method save (line 855) | func (d *drawOps) save(id int, state f32.Affine2D) {
    method collectOps (line 871) | func (d *drawOps) collectOps(r *ops.Reader, viewport f32.Rectangle) {
    method writeVertCache (line 1297) | func (d *drawOps) writeVertCache(n int) []byte {
    method buildVerts (line 1303) | func (d *drawOps) buildVerts(pathData []byte, tr f32.Affine2D, outline...
    method boundsForTransformedRect (line 1371) | func (d *drawOps) boundsForTransformedRect(r f32.Rectangle, tr f32.Aff...
  type drawState (line 89) | type drawState struct
    method materialFor (line 1031) | func (d *drawState) materialFor(rect f32.Rectangle, off f32.Point, par...
  type pathOp (line 106) | type pathOp struct
  type imageOp (line 125) | type imageOp struct
  function decodeStrokeOp (line 133) | func decodeStrokeOp(data []byte) float32 {
  type quadsOp (line 139) | type quadsOp struct
  type opKey (line 144) | type opKey struct
    method SetTransform (line 862) | func (k opKey) SetTransform(t f32.Affine2D) opKey {
  type material (line 151) | type material struct
  type imageOpData (line 165) | type imageOpData struct
  type linearGradientOpData (line 170) | type linearGradientOpData struct
  function decodeImageOp (line 177) | func decodeImageOp(data []byte, refs []interface{}) imageOpData {
  function decodeColorOp (line 188) | func decodeColorOp(data []byte) color.NRGBA {
  function decodeLinearGradientOp (line 197) | func decodeLinearGradientOp(data []byte) linearGradientOpData {
  type clipType (line 223) | type clipType
  type resource (line 225) | type resource interface
  type texture (line 229) | type texture struct
    method release (line 446) | func (t *texture) release() {
  type blitter (line 234) | type blitter struct
    method release (line 505) | func (b *blitter) release() {
    method blit (line 1141) | func (b *blitter) blit(mat materialType, col f32color.RGBA, col1, col2...
  type blitColUniforms (line 244) | type blitColUniforms struct
  type blitTexUniforms (line 250) | type blitTexUniforms struct
  type blitLinearGradientUniforms (line 254) | type blitLinearGradientUniforms struct
  type uniformBuffer (line 260) | type uniformBuffer struct
    method Upload (line 1183) | func (u *uniformBuffer) Upload() {
    method Release (line 1187) | func (u *uniformBuffer) Release() {
  type pipeline (line 265) | type pipeline struct
    method UploadUniforms (line 1192) | func (p *pipeline) UploadUniforms(ctx driver.Device) {
    method Release (line 1199) | func (p *pipeline) Release() {
  type blitUniforms (line 270) | type blitUniforms struct
  type colorUniforms (line 276) | type colorUniforms struct
  type gradientUniforms (line 280) | type gradientUniforms struct
  type materialType (line 285) | type materialType
  constant clipTypeNone (line 288) | clipTypeNone clipType = iota
  constant clipTypePath (line 289) | clipTypePath
  constant clipTypeIntersection (line 290) | clipTypeIntersection
  constant materialColor (line 294) | materialColor materialType = iota
  constant materialLinearGradient (line 295) | materialLinearGradient
  constant materialTexture (line 296) | materialTexture
  function New (line 300) | func New(api API) (GPU, error) {
  function NewWithDevice (line 311) | func NewWithDevice(d driver.Device) (GPU, error) {
  function newGPU (line 323) | func newGPU(ctx driver.Device) (*gpu, error) {
  function newRenderer (line 452) | func newRenderer(ctx driver.Device) *renderer {
  function newBlitter (line 476) | func newBlitter(ctx driver.Device) *blitter {
  function createColorPrograms (line 512) | func createColorPrograms(b driver.Device, vsSrc shader.Sources, fsSrc [3...
  function boundRectF (line 762) | func boundRectF(r f32.Rectangle) image.Rectangle {
  function ceil (line 775) | func ceil(v float32) int {
  function floor (line 779) | func floor(v float32) int {
  function splitTransform (line 848) | func splitTransform(t f32.Affine2D) (srs f32.Affine2D, offset f32.Point) {
  function expandPathOp (line 1020) | func expandPathOp(p *pathOp, clip image.Rectangle) {
  function newUniformBuffer (line 1170) | func newUniformBuffer(b driver.Device, uniformBlock interface{}) *unifor...
  function texSpaceTransform (line 1209) | func texSpaceTransform(r f32.Rectangle, bounds image.Point) (f32.Point, ...
  function gradientSpaceTransform (line 1217) | func gradientSpaceTransform(clip image.Rectangle, off f32.Point, stop1, ...
  function clipSpaceTransform (line 1234) | func clipSpaceTransform(r image.Rectangle, viewport image.Point) (f32.Po...
  function fillMaxY (line 1257) | func fillMaxY(verts []byte) {
  function fillContourMaxY (line 1289) | func fillContourMaxY(maxy float32, verts []byte) {
  function decodeToOutlineQuads (line 1336) | func decodeToOutlineQuads(qs *quadSplitter, tr f32.Affine2D, pathData []...
  function isPureOffset (line 1427) | func isPureOffset(t f32.Affine2D) bool {

FILE: vendor/gioui.org/gpu/internal/d3d11/d3d11_windows.go
  type Backend (line 20) | type Backend struct
    method BeginFrame (line 153) | func (b *Backend) BeginFrame(target driver.RenderTarget, clear bool, v...
    method CopyTexture (line 171) | func (b *Backend) CopyTexture(dstTex driver.Texture, dstOrigin image.P...
    method EndFrame (line 191) | func (b *Backend) EndFrame() {
    method Caps (line 194) | func (b *Backend) Caps() driver.Caps {
    method NewTimer (line 198) | func (b *Backend) NewTimer() driver.Timer {
    method IsTimeContinuous (line 202) | func (b *Backend) IsTimeContinuous() bool {
    method Release (line 206) | func (b *Backend) Release() {
    method NewTexture (line 211) | func (b *Backend) NewTexture(format driver.TextureFormat, width, heigh...
    method newInputLayout (line 332) | func (b *Backend) newInputLayout(vertexShader shader.Sources, layout [...
    method NewBuffer (line 380) | func (b *Backend) NewBuffer(typ driver.BufferBinding, size int) (drive...
    method NewImmutableBuffer (line 384) | func (b *Backend) NewImmutableBuffer(typ driver.BufferBinding, data []...
    method newBuffer (line 388) | func (b *Backend) newBuffer(typ driver.BufferBinding, size int, data [...
    method NewComputeProgram (line 464) | func (b *Backend) NewComputeProgram(shader shader.Sources) (driver.Pro...
    method NewPipeline (line 472) | func (b *Backend) NewPipeline(desc driver.PipelineDesc) (driver.Pipeli...
    method newBlendState (line 505) | func (b *Backend) newBlendState(desc driver.BlendDesc) (*d3d11.BlendSt...
    method NewVertexShader (line 523) | func (b *Backend) NewVertexShader(src shader.Sources) (driver.VertexSh...
    method NewFragmentShader (line 531) | func (b *Backend) NewFragmentShader(src shader.Sources) (driver.Fragme...
    method Viewport (line 539) | func (b *Backend) Viewport(x, y, width, height int) {
    method DrawArrays (line 551) | func (b *Backend) DrawArrays(off, count int) {
    method DrawElements (line 556) | func (b *Backend) DrawElements(off, count int) {
    method prepareDraw (line 561) | func (b *Backend) prepareDraw() {
    method BindImageTexture (line 585) | func (b *Backend) BindImageTexture(unit int, tex driver.Texture) {
    method DispatchCompute (line 594) | func (b *Backend) DispatchCompute(x, y, z int) {
    method PrepareTexture (line 635) | func (b *Backend) PrepareTexture(tex driver.Texture) {}
    method BindTexture (line 637) | func (b *Backend) BindTexture(unit int, tex driver.Texture) {
    method BindPipeline (line 643) | func (b *Backend) BindPipeline(pipe driver.Pipeline) {
    method BindProgram (line 647) | func (b *Backend) BindProgram(prog driver.Program) {
    method BindStorageBuffer (line 676) | func (b *Backend) BindStorageBuffer(binding int, buffer driver.Buffer) {
    method BindUniforms (line 685) | func (b *Backend) BindUniforms(buffer driver.Buffer) {
    method BindVertexBuffer (line 691) | func (b *Backend) BindVertexBuffer(buf driver.Buffer, offset int) {
    method BindIndexBuffer (line 696) | func (b *Backend) BindIndexBuffer(buf driver.Buffer) {
    method BeginCompute (line 790) | func (b *Backend) BeginCompute() {
    method EndCompute (line 793) | func (b *Backend) EndCompute() {
    method BeginRenderPass (line 796) | func (b *Backend) BeginRenderPass(tex driver.Texture, d driver.LoadDes...
    method EndRenderPass (line 806) | func (b *Backend) EndRenderPass() {
  type Pipeline (line 41) | type Pipeline struct
    method Release (line 666) | func (p *Pipeline) Release() {
  type Texture (line 50) | type Texture struct
    method Upload (line 599) | func (t *Texture) Upload(offset, size image.Point, pixels []byte, stri...
    method Release (line 615) | func (t *Texture) Release() {
    method ReadPixels (line 738) | func (t *Texture) ReadPixels(src image.Rectangle, pixels []byte, strid...
    method ImplementsRenderTarget (line 809) | func (f *Texture) ImplementsRenderTarget() {}
  type VertexShader (line 65) | type VertexShader struct
    method Release (line 651) | func (s *VertexShader) Release() {
  type FragmentShader (line 71) | type FragmentShader struct
    method Release (line 656) | func (s *FragmentShader) Release() {
  type Program (line 76) | type Program struct
    method Release (line 661) | func (s *Program) Release() {
  type Buffer (line 81) | type Buffer struct
    method Download (line 700) | func (b *Buffer) Download(dst []byte) error {
    method Upload (line 712) | func (b *Buffer) Upload(data []byte) {
    method Release (line 727) | func (b *Buffer) Release() {
  function init (line 91) | func init() {
  function detectFloatFormat (line 95) | func detectFloatFormat(dev *d3d11.Device) (uint32, bool) {
  function newDirect3D11Device (line 114) | func newDirect3D11Device(api driver.Direct3D11) (driver.Device, error) {
  function convBufferBinding (line 811) | func convBufferBinding(typ driver.BufferBinding) uint32 {
  function toBlendFactor (line 836) | func toBlendFactor(f driver.BlendFactor) (uint32, uint32) {
  function sliceOf (line 852) | func sliceOf(ptr uintptr, cap int) []byte {

FILE: vendor/gioui.org/gpu/internal/driver/api.go
  type API (line 14) | type API interface
  type RenderTarget (line 18) | type RenderTarget interface
  type OpenGLRenderTarget (line 22) | type OpenGLRenderTarget
    method ImplementsRenderTarget (line 124) | func (OpenGLRenderTarget) ImplementsRenderTarget()     {}
  type Direct3D11RenderTarget (line 24) | type Direct3D11RenderTarget struct
    method ImplementsRenderTarget (line 125) | func (Direct3D11RenderTarget) ImplementsRenderTarget() {}
  type MetalRenderTarget (line 29) | type MetalRenderTarget struct
    method ImplementsRenderTarget (line 126) | func (MetalRenderTarget) ImplementsRenderTarget()      {}
  type VulkanRenderTarget (line 34) | type VulkanRenderTarget struct
    method ImplementsRenderTarget (line 127) | func (VulkanRenderTarget) ImplementsRenderTarget()     {}
  type OpenGL (line 45) | type OpenGL struct
    method implementsAPI (line 120) | func (OpenGL) implementsAPI()                          {}
  type Direct3D11 (line 58) | type Direct3D11 struct
    method implementsAPI (line 121) | func (Direct3D11) implementsAPI()                      {}
  type Metal (line 63) | type Metal struct
    method implementsAPI (line 122) | func (Metal) implementsAPI()                           {}
  type Vulkan (line 72) | type Vulkan struct
    method implementsAPI (line 123) | func (Vulkan) implementsAPI()                          {}
  function NewDevice (line 98) | func NewDevice(api API) (Device, error) {

FILE: vendor/gioui.org/gpu/internal/driver/driver.go
  type Device (line 17) | type Device interface
  type LoadDesc (line 59) | type LoadDesc struct
  type Pipeline (line 64) | type Pipeline interface
  type PipelineDesc (line 68) | type PipelineDesc struct
  type VertexLayout (line 77) | type VertexLayout struct
  type InputDesc (line 83) | type InputDesc struct
  type BlendDesc (line 90) | type BlendDesc struct
  type BlendFactor (line 95) | type BlendFactor
  type Topology (line 97) | type Topology
  type TextureFilter (line 99) | type TextureFilter
  type TextureFormat (line 100) | type TextureFormat
  type BufferBinding (line 102) | type BufferBinding
  type LoadAction (line 104) | type LoadAction
  type Features (line 106) | type Features
    method Has (line 198) | func (f Features) Has(feats Features) bool {
  type Caps (line 108) | type Caps struct
  type VertexShader (line 116) | type VertexShader interface
  type FragmentShader (line 120) | type FragmentShader interface
  type Program (line 124) | type Program interface
  type Buffer (line 128) | type Buffer interface
  type Timer (line 134) | type Timer interface
  type Texture (line 141) | type Texture interface
  constant BufferBindingIndices (line 149) | BufferBindingIndices BufferBinding = 1 << iota
  constant BufferBindingVertices (line 150) | BufferBindingVertices
  constant BufferBindingUniforms (line 151) | BufferBindingUniforms
  constant BufferBindingTexture (line 152) | BufferBindingTexture
  constant BufferBindingFramebuffer (line 153) | BufferBindingFramebuffer
  constant BufferBindingShaderStorageRead (line 154) | BufferBindingShaderStorageRead
  constant BufferBindingShaderStorageWrite (line 155) | BufferBindingShaderStorageWrite
  constant TextureFormatSRGBA (line 159) | TextureFormatSRGBA TextureFormat = iota
  constant TextureFormatFloat (line 160) | TextureFormatFloat
  constant TextureFormatRGBA8 (line 161) | TextureFormatRGBA8
  constant TextureFormatOutput (line 163) | TextureFormatOutput
  constant FilterNearest (line 167) | FilterNearest TextureFilter = iota
  constant FilterLinear (line 168) | FilterLinear
  constant FeatureTimers (line 172) | FeatureTimers Features = 1 << iota
  constant FeatureFloatRenderTargets (line 173) | FeatureFloatRenderTargets
  constant FeatureCompute (line 174) | FeatureCompute
  constant FeatureSRGB (line 175) | FeatureSRGB
  constant TopologyTriangleStrip (line 179) | TopologyTriangleStrip Topology = iota
  constant TopologyTriangles (line 180) | TopologyTriangles
  constant BlendFactorOne (line 184) | BlendFactorOne BlendFactor = iota
  constant BlendFactorOneMinusSrcAlpha (line 185) | BlendFactorOneMinusSrcAlpha
  constant BlendFactorZero (line 186) | BlendFactorZero
  constant BlendFactorDstColor (line 187) | BlendFactorDstColor
  constant LoadActionKeep (line 191) | LoadActionKeep LoadAction = iota
  constant LoadActionClear (line 192) | LoadActionClear
  constant LoadActionInvalidate (line 193) | LoadActionInvalidate
  function DownloadImage (line 202) | func DownloadImage(d Device, t Texture, img *image.RGBA) error {
  function flipImageY (line 215) | func flipImageY(stride, height int, pixels []byte) {
  function UploadImage (line 229) | func UploadImage(t Texture, offset image.Point, img *image.RGBA) {

FILE: vendor/gioui.org/gpu/internal/metal/metal_darwin.go
  type Backend (line 379) | type Backend struct
    method BeginFrame (line 467) | func (b *Backend) BeginFrame(target driver.RenderTarget, clear bool, v...
    method startBlit (line 486) | func (b *Backend) startBlit() C.CFTypeRef {
    method CopyTexture (line 499) | func (b *Backend) CopyTexture(dst driver.Texture, dorig image.Point, s...
    method EndFrame (line 524) | func (b *Backend) EndFrame() {
    method endCmdBuffer (line 528) | func (b *Backend) endCmdBuffer(wait bool) {
    method Caps (line 544) | func (b *Backend) Caps() driver.Caps {
    method NewTimer (line 551) | func (b *Backend) NewTimer() driver.Timer {
    method IsTimeContinuous (line 555) | func (b *Backend) IsTimeContinuous() bool {
    method Release (line 559) | func (b *Backend) Release() {
    method NewTexture (line 574) | func (b *Backend) NewTexture(format driver.TextureFormat, width, heigh...
    method NewPipeline (line 611) | func (b *Backend) NewPipeline(desc driver.PipelineDesc) (driver.Pipeli...
    method NewBuffer (line 714) | func (b *Backend) NewBuffer(typ driver.BufferBinding, size int) (drive...
    method NewImmutableBuffer (line 727) | func (b *Backend) NewImmutableBuffer(typ driver.BufferBinding, data []...
    method NewComputeProgram (line 736) | func (b *Backend) NewComputeProgram(src shader.Sources) (driver.Progra...
    method NewVertexShader (line 749) | func (b *Backend) NewVertexShader(src shader.Sources) (driver.VertexSh...
    method NewFragmentShader (line 753) | func (b *Backend) NewFragmentShader(src shader.Sources) (driver.Fragme...
    method newShader (line 757) | func (b *Backend) newShader(src shader.Sources) (*Shader, error) {
    method Viewport (line 775) | func (b *Backend) Viewport(x, y, width, height int) {
    method DrawArrays (line 790) | func (b *Backend) DrawArrays(off, count int) {
    method DrawElements (line 798) | func (b *Backend) DrawElements(off, count int) {
    method BindImageTexture (line 817) | func (b *Backend) BindImageTexture(unit int, tex driver.Texture) {
    method BeginCompute (line 821) | func (b *Backend) BeginCompute() {
    method EndCompute (line 833) | func (b *Backend) EndCompute() {
    method DispatchCompute (line 842) | func (b *Backend) DispatchCompute(x, y, z int) {
    method stagingBuffer (line 858) | func (b *Backend) stagingBuffer(size int) (C.CFTypeRef, int) {
    method PrepareTexture (line 921) | func (b *Backend) PrepareTexture(tex driver.Texture) {}
    method BindTexture (line 923) | func (b *Backend) BindTexture(unit int, tex driver.Texture) {
    method ensureCmdBuffer (line 935) | func (b *Backend) ensureCmdBuffer() {
    method BindPipeline (line 945) | func (b *Backend) BindPipeline(pipe driver.Pipeline) {
    method BindProgram (line 955) | func (b *Backend) BindProgram(prog driver.Program) {
    method BindStorageBuffer (line 975) | func (b *Backend) BindStorageBuffer(binding int, buffer driver.Buffer) {
    method BindUniforms (line 989) | func (b *Backend) BindUniforms(buf driver.Buffer) {
    method BindVertexBuffer (line 1004) | func (b *Backend) BindVertexBuffer(buf driver.Buffer, offset int) {
    method BindIndexBuffer (line 1017) | func (b *Backend) BindIndexBuffer(buf driver.Buffer) {
    method BeginRenderPass (line 1098) | func (b *Backend) BeginRenderPass(tex driver.Texture, d driver.LoadDes...
    method EndRenderPass (line 1118) | func (b *Backend) EndRenderPass() {
    method endEncoder (line 1127) | func (b *Backend) endEncoder() {
  type Texture (line 404) | type Texture struct
    method Upload (line 875) | func (t *Texture) Upload(offset, size image.Point, pixels []byte, stri...
    method Release (line 907) | func (t *Texture) Release() {
    method ReadPixels (line 1066) | func (t *Texture) ReadPixels(src image.Rectangle, pixels []byte, strid...
    method ImplementsRenderTarget (line 1141) | func (f *Texture) ImplementsRenderTarget() {}
  type Shader (line 413) | type Shader struct
    method Release (line 965) | func (s *Shader) Release() {
  type Program (line 418) | type Program struct
    method Release (line 970) | func (p *Program) Release() {
  type Pipeline (line 423) | type Pipeline struct
    method Release (line 916) | func (p *Pipeline) Release() {
  type Buffer (line 428) | type Buffer struct
    method Download (line 1021) | func (b *Buffer) Download(data []byte) error {
    method Upload (line 1034) | func (b *Buffer) Upload(data []byte) {
    method Release (line 1059) | func (b *Buffer) Release() {
  constant uniformBufferIndex (line 438) | uniformBufferIndex   = 0
  constant attributeBufferIndex (line 439) | attributeBufferIndex = 1
  constant spvBufferSizeConstantsBinding (line 441) | spvBufferSizeConstantsBinding = 25
  constant texUnits (line 445) | texUnits    = 4
  constant bufferUnits (line 446) | bufferUnits = 4
  function init (line 449) | func init() {
  function newMetalDevice (line 453) | func newMetalDevice(api driver.Metal) (driver.Device, error) {
  function samplerFilterFor (line 600) | func samplerFilterFor(f driver.TextureFilter) C.MTLSamplerMinMagFilter {
  function dataTypeSize (line 660) | func dataTypeSize(d shader.DataType) int {
  function blendFactorFor (line 669) | func blendFactorFor(f driver.BlendFactor) C.MTLBlendFactor {
  function vertFormatFor (line 684) | func vertFormatFor(f shader.InputLocation) C.MTLVertexFormat {
  function pixelFormatFor (line 701) | func pixelFormatFor(f driver.TextureFormat) C.MTLPixelFormat {
  function primitiveFor (line 806) | func primitiveFor(mode driver.Topology) C.MTLPrimitiveType {
  function bufferStore (line 1049) | func bufferStore(buf C.CFTypeRef) []byte {
  function bufferSlice (line 1054) | func bufferSlice(buf C.CFTypeRef, off, len int) []byte {

FILE: vendor/gioui.org/gpu/internal/opengl/opengl.go
  type Backend (line 19) | type Backend struct
    method BeginFrame (line 229) | func (b *Backend) BeginFrame(target driver.RenderTarget, clear bool, v...
    method EndFrame (line 287) | func (b *Backend) EndFrame() {
    method queryState (line 303) | func (b *Backend) queryState() glState {
    method restoreState (line 354) | func (b *Backend) restoreState(dst glState) {
    method Caps (line 656) | func (b *Backend) Caps() driver.Caps {
    method NewTimer (line 660) | func (b *Backend) NewTimer() driver.Timer {
    method IsTimeContinuous (line 667) | func (b *Backend) IsTimeContinuous() bool {
    method NewTexture (line 697) | func (b *Backend) NewTexture(format driver.TextureFormat, width, heigh...
    method NewBuffer (line 728) | func (b *Backend) NewBuffer(typ driver.BufferBinding, size int) (drive...
    method NewImmutableBuffer (line 751) | func (b *Backend) NewImmutableBuffer(typ driver.BufferBinding, data []...
    method Release (line 773) | func (b *Backend) Release() {
    method DispatchCompute (line 783) | func (b *Backend) DispatchCompute(x, y, z int) {
    method BindImageTexture (line 793) | func (b *Backend) BindImageTexture(unit int, tex driver.Texture) {
    method BlendFunc (line 809) | func (b *Backend) BlendFunc(sfactor, dfactor driver.BlendFactor) {
    method SetBlend (line 829) | func (b *Backend) SetBlend(enable bool) {
    method DrawElements (line 833) | func (b *Backend) DrawElements(off, count int) {
    method DrawArrays (line 840) | func (b *Backend) DrawArrays(off, count int) {
    method prepareDraw (line 845) | func (b *Backend) prepareDraw() {
    method Viewport (line 864) | func (b *Backend) Viewport(x, y, width, height int) {
    method clearOutput (line 868) | func (b *Backend) clearOutput(colR, colG, colB, colA float32) {
    method NewComputeProgram (line 873) | func (b *Backend) NewComputeProgram(src shader.Sources) (driver.Progra...
    method NewVertexShader (line 886) | func (b *Backend) NewVertexShader(src shader.Sources) (driver.VertexSh...
    method NewFragmentShader (line 892) | func (b *Backend) NewFragmentShader(src shader.Sources) (driver.Fragme...
    method glslFor (line 898) | func (b *Backend) glslFor(src shader.Sources) string {
    method NewPipeline (line 906) | func (b *Backend) NewPipeline(desc driver.PipelineDesc) (driver.Pipeli...
    method newProgram (line 930) | func (b *Backend) newProgram(desc driver.PipelineDesc) (*program, erro...
    method BindStorageBuffer (line 970) | func (b *Backend) BindStorageBuffer(binding int, buf driver.Buffer) {
    method BindUniforms (line 978) | func (b *Backend) BindUniforms(buf driver.Buffer) {
    method BindProgram (line 987) | func (b *Backend) BindProgram(prog driver.Program) {
    method BindVertexBuffer (line 1092) | func (b *Backend) BindVertexBuffer(buf driver.Buffer, offset int) {
    method setupVertexArrays (line 1100) | func (b *Backend) setupVertexArrays() {
    method BindIndexBuffer (line 1129) | func (b *Backend) BindIndexBuffer(buf driver.Buffer) {
    method CopyTexture (line 1137) | func (b *Backend) CopyTexture(dst driver.Texture, dstOrigin image.Poin...
    method BindPipeline (line 1166) | func (b *Backend) BindPipeline(pl driver.Pipeline) {
    method BeginCompute (line 1174) | func (b *Backend) BeginCompute() {
    method EndCompute (line 1178) | func (b *Backend) EndCompute() {
    method BeginRenderPass (line 1181) | func (b *Backend) BeginRenderPass(tex driver.Texture, desc driver.Load...
    method EndRenderPass (line 1193) | func (b *Backend) EndRenderPass() {
    method PrepareTexture (line 1214) | func (b *Backend) PrepareTexture(tex driver.Texture) {}
    method BindTexture (line 1216) | func (b *Backend) BindTexture(unit int, t driver.Texture) {
  type glState (line 48) | type glState struct
    method setVertexAttribArray (line 391) | func (s *glState) setVertexAttribArray(f *gl.Functions, idx int, enabl...
    method vertexAttribPointer (line 403) | func (s *glState) vertexAttribPointer(f *gl.Functions, buf gl.Buffer, ...
    method activeTexture (line 415) | func (s *glState) activeTexture(f *gl.Functions, unit gl.Enum) {
    method bindRenderbuffer (line 422) | func (s *glState) bindRenderbuffer(f *gl.Functions, target gl.Enum, r ...
    method bindTexture (line 429) | func (s *glState) bindTexture(f *gl.Functions, unit int, t gl.Texture) {
    method bindVertexArray (line 437) | func (s *glState) bindVertexArray(f *gl.Functions, a gl.VertexArray) {
    method deleteRenderbuffer (line 444) | func (s *glState) deleteRenderbuffer(f *gl.Functions, r gl.Renderbuffe...
    method deleteFramebuffer (line 451) | func (s *glState) deleteFramebuffer(f *gl.Functions, fbo gl.Framebuffe...
    method deleteBuffer (line 461) | func (s *glState) deleteBuffer(f *gl.Functions, b gl.Buffer) {
    method deleteProgram (line 487) | func (s *glState) deleteProgram(f *gl.Functions, p gl.Program) {
    method deleteVertexArray (line 494) | func (s *glState) deleteVertexArray(f *gl.Functions, a gl.VertexArray) {
    method deleteTexture (line 501) | func (s *glState) deleteTexture(f *gl.Functions, t gl.Texture) {
    method useProgram (line 511) | func (s *glState) useProgram(f *gl.Functions, p gl.Program) {
    method bindFramebuffer (line 518) | func (s *glState) bindFramebuffer(f *gl.Functions, target gl.Enum, fbo...
    method bindBufferBase (line 542) | func (s *glState) bindBufferBase(f *gl.Functions, target gl.Enum, idx ...
    method bindBuffer (line 562) | func (s *glState) bindBuffer(f *gl.Functions, target gl.Enum, buf gl.B...
    method pixelStorei (line 590) | func (s *glState) pixelStorei(f *gl.Functions, pname gl.Enum, val int) {
    method setClearColor (line 608) | func (s *glState) setClearColor(f *gl.Functions, r, g, b, a float32) {
    method setViewport (line 616) | func (s *glState) setViewport(f *gl.Functions, x, y, width, height int) {
    method setBlendFuncSeparate (line 624) | func (s *glState) setBlendFuncSeparate(f *gl.Functions, srcRGB, dstRGB...
    method set (line 634) | func (s *glState) set(f *gl.Functions, target gl.Enum, enable bool) {
  type state (line 85) | type state struct
  type bufferBinding (line 90) | type bufferBinding struct
  type timer (line 95) | type timer struct
    method Begin (line 1244) | func (t *timer) Begin() {
    method End (line 1248) | func (t *timer) End() {
    method ready (line 1252) | func (t *timer) ready() bool {
    method Release (line 1256) | func (t *timer) Release() {
    method Duration (line 1260) | func (t *timer) Duration() (time.Duration, bool) {
  type texture (line 100) | type texture struct
    method ensureFBO (line 671) | func (t *texture) ensureFBO() gl.Framebuffer {
    method ReadPixels (line 1149) | func (t *texture) ReadPixels(src image.Rectangle, pixels []byte, strid...
    method ImplementsRenderTarget (line 1196) | func (f *texture) ImplementsRenderTarget() {}
    method Release (line 1220) | func (t *texture) Release() {
    method Upload (line 1230) | func (t *texture) Upload(offset, size image.Point, pixels []byte, stri...
  type pipeline (line 112) | type pipeline struct
    method Release (line 1198) | func (p *pipeline) Release() {
  type buffer (line 120) | type buffer struct
    method Upload (line 1042) | func (b *buffer) Upload(data []byte) {
    method Download (line 1064) | func (b *buffer) Download(data []byte) error {
    method Release (line 1085) | func (b *buffer) Release() {
  type glshader (line 131) | type glshader struct
    method Release (line 992) | func (s *glshader) Release() {
  type program (line 137) | type program struct
    method Release (line 996) | func (p *program) Release() {
  type uniforms (line 144) | type uniforms struct
    method setup (line 1000) | func (u *uniforms) setup(funcs *gl.Functions, p gl.Program, uniformSiz...
    method update (line 1009) | func (p *uniforms) update(funcs *gl.Functions, buf *buffer) {
  type uniformLocation (line 149) | type uniformLocation struct
  type inputLayout (line 156) | type inputLayout struct
  type textureTriple (line 163) | type textureTriple struct
  constant storageBindings (line 170) | storageBindings = 32
  function init (line 173) | func init() {
  constant brokenGLES31 (line 182) | brokenGLES31 = true
  function newOpenGLDevice (line 184) | func newOpenGLDevice(api driver.OpenGL) (driver.Device, error) {
  function glErr (line 766) | func glErr(f *gl.Functions) error {
  function toGLBlendFactor (line 814) | func toGLBlendFactor(f driver.BlendFactor) gl.Enum {
  function toGLDrawMode (line 853) | func toGLDrawMode(mode driver.Topology) gl.Enum {
  function toTexFilter (line 1203) | func toTexFilter(f driver.TextureFilter) int {
  function floatTripleFor (line 1269) | func floatTripleFor(f *gl.Functions, ver [2]int, exts []string) (texture...
  function srgbaTripleFor (line 1315) | func srgbaTripleFor(ver [2]int, exts []string) (textureTriple, error) {
  function alphaTripleFor (line 1326) | func alphaTripleFor(ver [2]int) textureTriple {
  function hasExtension (line 1335) | func hasExtension(exts []string, ext string) bool {
  function firstBufferType (line 1344) | func firstBufferType(typ driver.BufferBinding) gl.Enum {

FILE: vendor/gioui.org/gpu/internal/opengl/srgb.go
  type SRGBFBO (line 19) | type SRGBFBO struct
    method Blit (line 58) | func (s *SRGBFBO) Blit() {
    method Framebuffer (line 89) | func (s *SRGBFBO) Framebuffer() gl.Framebuffer {
    method Refresh (line 93) | func (s *SRGBFBO) Refresh(viewport image.Point) error {
    method Release (line 128) | func (s *SRGBFBO) Release() {
  function NewSRGBFBO (line 31) | func NewSRGBFBO(f *gl.Functions, state *glState) (*SRGBFBO, error) {
  constant blitVSrc (line 139) | blitVSrc = `
  constant blitFSrc (line 154) | blitFSrc = `

FILE: vendor/gioui.org/gpu/internal/vulkan/vulkan.go
  type Backend (line 19) | type Backend struct
    method BeginFrame (line 170) | func (b *Backend) BeginFrame(target driver.RenderTarget, clear bool, v...
    method deferFunc (line 206) | func (b *Backend) deferFunc(f func(d vk.Device)) {
    method runDefers (line 210) | func (b *Backend) runDefers() {
    method resetPipes (line 217) | func (b *Backend) resetPipes() {
    method EndFrame (line 232) | func (b *Backend) EndFrame() {
    method Caps (line 240) | func (b *Backend) Caps() driver.Caps {
    method NewTimer (line 247) | func (b *Backend) NewTimer() driver.Timer {
    method IsTimeContinuous (line 251) | func (b *Backend) IsTimeContinuous() bool {
    method Release (line 255) | func (b *Backend) Release() {
    method NewTexture (line 271) | func (b *Backend) NewTexture(format driver.TextureFormat, width, heigh...
    method NewBuffer (line 327) | func (b *Backend) NewBuffer(bindings driver.BufferBinding, size int) (...
    method newBuffer (line 346) | func (b *Backend) newBuffer(size int, usage vk.BufferUsageFlags, props...
    method NewImmutableBuffer (line 351) | func (b *Backend) NewImmutableBuffer(typ driver.BufferBinding, data []...
    method NewVertexShader (line 360) | func (b *Backend) NewVertexShader(src shader.Sources) (driver.VertexSh...
    method NewFragmentShader (line 365) | func (b *Backend) NewFragmentShader(src shader.Sources) (driver.Fragme...
    method NewPipeline (line 370) | func (b *Backend) NewPipeline(desc driver.PipelineDesc) (driver.Pipeli...
    method NewComputeProgram (line 443) | func (b *Backend) NewComputeProgram(src shader.Sources) (driver.Progra...
    method newShader (line 536) | func (b *Backend) newShader(src shader.Sources, stage vk.ShaderStageFl...
    method CopyTexture (line 555) | func (b *Backend) CopyTexture(dstTex driver.Texture, dorig image.Point...
    method Viewport (line 573) | func (b *Backend) Viewport(x, y, width, height int) {
    method DrawArrays (line 579) | func (b *Backend) DrawArrays(off, count int) {
    method DrawElements (line 588) | func (b *Backend) DrawElements(off, count int) {
    method BindImageTexture (line 597) | func (b *Backend) BindImageTexture(unit int, tex driver.Texture) {
    method DispatchCompute (line 608) | func (b *Backend) DispatchCompute(x, y, z int) {
    method PrepareTexture (line 770) | func (b *Backend) PrepareTexture(tex driver.Texture) {
    method BindTexture (line 780) | func (b *Backend) BindTexture(unit int, tex driver.Texture) {
    method BindPipeline (line 786) | func (b *Backend) BindPipeline(pipe driver.Pipeline) {
    method BindProgram (line 790) | func (b *Backend) BindProgram(prog driver.Program) {
    method bindPipeline (line 794) | func (b *Backend) bindPipeline(p *Pipeline, point vk.PipelineBindPoint) {
    method BindStorageBuffer (line 806) | func (b *Backend) BindStorageBuffer(binding int, buffer driver.Buffer) {
    method BindUniforms (line 816) | func (b *Backend) BindUniforms(buffer driver.Buffer) {
    method BindVertexBuffer (line 825) | func (b *Backend) BindVertexBuffer(buffer driver.Buffer, offset int) {
    method BindIndexBuffer (line 837) | func (b *Backend) BindIndexBuffer(buffer driver.Buffer) {
    method currentCmdBuf (line 955) | func (b *Backend) currentCmdBuf() vk.CommandBuffer {
    method ensureCmdBuf (line 963) | func (b *Backend) ensureCmdBuf() vk.CommandBuffer {
    method BeginRenderPass (line 986) | func (b *Backend) BeginRenderPass(tex driver.Texture, d driver.LoadDes...
    method EndRenderPass (line 1022) | func (b *Backend) EndRenderPass() {
    method BeginCompute (line 1026) | func (b *Backend) BeginCompute() {
    method EndCompute (line 1030) | func (b *Backend) EndCompute() {
    method lookupPass (line 1033) | func (b *Backend) lookupPass(fmt vk.Format, loadAct vk.AttachmentLoadO...
    method submitCmdBuf (line 1046) | func (b *Backend) submitCmdBuf(sync bool) {
    method stagingBuffer (line 1071) | func (b *Backend) stagingBuffer(size int) (*Buffer, []byte, int) {
  type passKey (line 62) | type passKey struct
  type Texture (line 69) | type Texture struct
    method Upload (line 617) | func (t *Texture) Upload(offset, size image.Point, pixels []byte, stri...
    method Release (line 642) | func (t *Texture) Release() {
    method imageBarrier (line 749) | func (t *Texture) imageBarrier(cmdBuf vk.CommandBuffer, layout vk.Imag...
    method ReadPixels (line 921) | func (t *Texture) ReadPixels(src image.Rectangle, pixels []byte, strid...
    method ImplementsRenderTarget (line 1121) | func (f *Texture) ImplementsRenderTarget() {}
  type Shader (line 90) | type Shader struct
    method Release (line 801) | func (s *Shader) Release() {
  type Pipeline (line 97) | type Pipeline struct
    method Release (line 659) | func (p *Pipeline) Release() {
  type descPool (line 105) | type descPool struct
    method release (line 668) | func (p *descPool) release(d vk.Device) {
    method bindDescriptorSet (line 678) | func (p *descPool) bindDescriptorSet(b *Backend, cmdBuf vk.CommandBuff...
  type Buffer (line 116) | type Buffer struct
    method Download (line 843) | func (b *Buffer) Download(data []byte) error {
    method Upload (line 866) | func (b *Buffer) Upload(data []byte) {
    method barrier (line 894) | func (b *Buffer) barrier(cmdBuf vk.CommandBuffer, stage vk.PipelineSta...
    method Release (line 910) | func (b *Buffer) Release() {
  constant texUnits (line 130) | texUnits     = 4
  constant storageUnits (line 131) | storageUnits = 4
  function init (line 134) | func init() {
  function newVulkanDevice (line 138) | func newVulkanDevice(api driver.Vulkan) (driver.Device, error) {
  function vertFormatFor (line 461) | func vertFormatFor(f shader.InputLocation) vk.Format {
  function createPipelineLayout (line 478) | func createPipelineLayout(d vk.Device, src shader.Sources, ranges []vk.P...
  function formatFor (line 1100) | func formatFor(format driver.TextureFormat) vk.Format {
  function mapErr (line 1113) | func mapErr(err error) error {

FILE: vendor/gioui.org/gpu/pack.go
  type packer (line 11) | type packer struct
    method add (line 26) | func (p *packer) add(s image.Point) (placement, bool) {
    method clear (line 34) | func (p *packer) clear() {
    method newPage (line 39) | func (p *packer) newPage() {
    method tryAdd (line 48) | func (p *packer) tryAdd(s image.Point) (placement, bool) {
  type placement (line 19) | type placement struct

FILE: vendor/gioui.org/gpu/path.go
  type pather (line 22) | type pather struct
    method release (line 291) | func (p *pather) release() {
    method begin (line 317) | func (p *pather) begin(sizes []image.Point) {
    method stencilPath (line 321) | func (p *pather) stencilPath(bounds image.Rectangle, offset f32.Point,...
    method cover (line 364) | func (p *pather) cover(mat materialType, col f32color.RGBA, col1, col2...
  type coverer (line 31) | type coverer struct
    method release (line 296) | func (c *coverer) release() {
    method cover (line 368) | func (c *coverer) cover(mat materialType, col f32color.RGBA, col1, col...
  type coverTexUniforms (line 39) | type coverTexUniforms struct
  type coverColUniforms (line 44) | type coverColUniforms struct
  type coverLinearGradientUniforms (line 50) | type coverLinearGradientUniforms struct
  type coverUniforms (line 56) | type coverUniforms struct
  type stenciler (line 64) | type stenciler struct
    method release (line 283) | func (s *stenciler) release() {
    method beginIntersect (line 325) | func (s *stenciler) beginIntersect(sizes []image.Point) {
    method cover (line 332) | func (s *stenciler) cover(idx int) stencilFBO {
    method begin (line 336) | func (s *stenciler) begin(sizes []image.Point) {
    method stencilPath (line 340) | func (s *stenciler) stencilPath(bounds image.Rectangle, offset f32.Poi...
  type stencilUniforms (line 79) | type stencilUniforms struct
  type intersectUniforms (line 85) | type intersectUniforms struct
  type fboSet (line 92) | type fboSet struct
    method resize (line 245) | func (s *fboSet) resize(ctx driver.Device, sizes []image.Point) {
    method delete (line 275) | func (s *fboSet) delete(ctx driver.Device, idx int) {
  type stencilFBO (line 96) | type stencilFBO struct
  type pathData (line 101) | type pathData struct
    method release (line 313) | func (p pathData) release() {
  type vertex (line 107) | type vertex struct
    method encode (line 116) | func (v vertex) encode(d []byte, maxy uint32) {
  constant pathBatchSize (line 130) | pathBatchSize = 10000
  constant vertStride (line 132) | vertStride = 8 * 4
  function newPather (line 135) | func newPather(ctx driver.Device) *pather {
  function newCoverer (line 143) | func newCoverer(ctx driver.Device) *coverer {
  function newStenciler (line 160) | func newStenciler(ctx driver.Device) *stenciler {
  function buildPath (line 302) | func buildPath(ctx driver.Device, p []byte) pathData {
  function init (line 394) | func init() {

FILE: vendor/gioui.org/gpu/timer.go
  type timers (line 11) | type timers struct
    method newTimer (line 37) | func (t *timers) newTimer() *timer {
    method ready (line 65) | func (t *timers) ready() bool {
    method Release (line 86) | func (t *timers) Release() {
  type timer (line 16) | type timer struct
    method begin (line 49) | func (t *timer) begin() {
    method end (line 57) | func (t *timer) end() {
  type timerState (line 23) | type timerState
  constant timerIdle (line 26) | timerIdle timerState = iota
  constant timerRunning (line 27) | timerRunning
  constant timerWaiting (line 28) | timerWaiting
  function newTimers (line 31) | func newTimers(b driver.Device) *timers {

FILE: vendor/gioui.org/internal/byteslice/byteslice.go
  function Struct (line 13) | func Struct(s interface{}) []byte {
  function Uint32 (line 25) | func Uint32(s []uint32) []byte {
  function Slice (line 35) | func Slice(s interface{}) []byte {

FILE: vendor/gioui.org/internal/cocoainit/cocoa_darwin.go
  function init (line 18) | func init() {

FILE: vendor/gioui.org/internal/d3d11/d3d11_windows.go
  type DXGI_SWAP_CHAIN_DESC (line 16) | type DXGI_SWAP_CHAIN_DESC struct
  type DXGI_SAMPLE_DESC (line 27) | type DXGI_SAMPLE_DESC struct
  type DXGI_MODE_DESC (line 32) | type DXGI_MODE_DESC struct
  type DXGI_RATIONAL (line 41) | type DXGI_RATIONAL struct
  type TEXTURE2D_DESC (line 46) | type TEXTURE2D_DESC struct
  type SAMPLER_DESC (line 59) | type SAMPLER_DESC struct
  type SHADER_RESOURCE_VIEW_DESC_TEX2D (line 72) | type SHADER_RESOURCE_VIEW_DESC_TEX2D struct
  type SHADER_RESOURCE_VIEW_DESC_BUFFEREX (line 77) | type SHADER_RESOURCE_VIEW_DESC_BUFFEREX struct
  type UNORDERED_ACCESS_VIEW_DESC_TEX2D (line 82) | type UNORDERED_ACCESS_VIEW_DESC_TEX2D struct
  type UNORDERED_ACCESS_VIEW_DESC_BUFFER (line 87) | type UNORDERED_ACCESS_VIEW_DESC_BUFFER struct
  type SHADER_RESOURCE_VIEW_DESC (line 92) | type SHADER_RESOURCE_VIEW_DESC struct
  type UNORDERED_ACCESS_VIEW_DESC (line 97) | type UNORDERED_ACCESS_VIEW_DESC struct
  type TEX2D_SRV (line 102) | type TEX2D_SRV struct
  type BUFFEREX_SRV (line 107) | type BUFFEREX_SRV struct
  type TEX2D_UAV (line 113) | type TEX2D_UAV struct
  type BUFFER_UAV (line 117) | type BUFFER_UAV struct
  type INPUT_ELEMENT_DESC (line 123) | type INPUT_ELEMENT_DESC struct
  type IDXGISwapChain (line 133) | type IDXGISwapChain struct
    method GetDesc (line 1129) | func (s *IDXGISwapChain) GetDesc() (DXGI_SWAP_CHAIN_DESC, error) {
    method ResizeBuffers (line 1144) | func (s *IDXGISwapChain) ResizeBuffers(buffers, width, height, newForm...
    method Present (line 1161) | func (s *IDXGISwapChain) Present(SyncInterval int, Flags uint32) error {
    method GetBuffer (line 1175) | func (s *IDXGISwapChain) GetBuffer(index int, riid *GUID) (*IUnknown, ...
  type Debug (line 154) | type Debug struct
    method ReportLiveDeviceObjects (line 1119) | func (d *Debug) ReportLiveDeviceObjects(flags uint32) {
  type Device (line 169) | type Device struct
    method CheckFormatSupport (line 827) | func (d *Device) CheckFormatSupport(format uint32) (uint32, error) {
    method CreateBuffer (line 842) | func (d *Device) CreateBuffer(desc *BUFFER_DESC, data []byte) (*Buffer...
    method CreateDepthStencilViewTEX2D (line 865) | func (d *Device) CreateDepthStencilViewTEX2D(res *Resource, desc *DEPT...
    method CreatePixelShader (line 882) | func (d *Device) CreatePixelShader(bytecode []byte) (*PixelShader, err...
    method CreateVertexShader (line 900) | func (d *Device) CreateVertexShader(bytecode []byte) (*VertexShader, e...
    method CreateComputeShader (line 918) | func (d *Device) CreateComputeShader(bytecode []byte) (*ComputeShader,...
    method CreateShaderResourceView (line 936) | func (d *Device) CreateShaderResourceView(res *Resource, desc unsafe.P...
    method CreateUnorderedAccessView (line 953) | func (d *Device) CreateUnorderedAccessView(res *Resource, desc unsafe....
    method CreateRasterizerState (line 970) | func (d *Device) CreateRasterizerState(desc *RASTERIZER_DESC) (*Raster...
    method CreateInputLayout (line 985) | func (d *Device) CreateInputLayout(descs []INPUT_ELEMENT_DESC, bytecod...
    method CreateSamplerState (line 1007) | func (d *Device) CreateSamplerState(desc *SAMPLER_DESC) (*SamplerState...
    method CreateTexture2D (line 1022) | func (d *Device) CreateTexture2D(desc *TEXTURE2D_DESC) (*Texture2D, er...
    method CreateRenderTargetView (line 1039) | func (d *Device) CreateRenderTargetView(res *Resource) (*RenderTargetV...
    method CreateBlendState (line 1056) | func (d *Device) CreateBlendState(desc *BLEND_DESC) (*BlendState, erro...
    method CreateDepthStencilState (line 1071) | func (d *Device) CreateDepthStencilState(desc *DEPTH_STENCIL_DESC) (*D...
    method GetFeatureLevel (line 1086) | func (d *Device) GetFeatureLevel() int {
    method GetImmediateContext (line 1096) | func (d *Device) GetImmediateContext() *DeviceContext {
    method ReportLiveDeviceObjects (line 1108) | func (d *Device) ReportLiveDeviceObjects() error {
  type DeviceContext (line 215) | type DeviceContext struct
    method Unmap (line 1193) | func (c *DeviceContext) Unmap(resource *Resource, subResource uint32) {
    method Map (line 1203) | func (c *DeviceContext) Map(resource *Resource, subResource, mapType, ...
    method CopySubresourceRegion (line 1221) | func (c *DeviceContext) CopySubresourceRegion(dst *Resource, dstSubres...
    method ClearDepthStencilView (line 1237) | func (c *DeviceContext) ClearDepthStencilView(target *DepthStencilView...
    method ClearRenderTargetView (line 1250) | func (c *DeviceContext) ClearRenderTargetView(target *RenderTargetView...
    method CSSetShaderResources (line 1260) | func (c *DeviceContext) CSSetShaderResources(startSlot uint32, s *Shad...
    method CSSetUnorderedAccessViews (line 1272) | func (c *DeviceContext) CSSetUnorderedAccessViews(startSlot uint32, v ...
    method CSSetShader (line 1284) | func (c *DeviceContext) CSSetShader(s *ComputeShader) {
    method RSSetViewports (line 1296) | func (c *DeviceContext) RSSetViewports(viewport *VIEWPORT) {
    method VSSetShader (line 1306) | func (c *DeviceContext) VSSetShader(s *VertexShader) {
    method VSSetConstantBuffers (line 1318) | func (c *DeviceContext) VSSetConstantBuffers(b *Buffer) {
    method PSSetConstantBuffers (line 1330) | func (c *DeviceContext) PSSetConstantBuffers(b *Buffer) {
    method PSSetShaderResources (line 1342) | func (c *DeviceContext) PSSetShaderResources(startSlot uint32, s *Shad...
    method PSSetSamplers (line 1354) | func (c *DeviceContext) PSSetSamplers(startSlot uint32, s *SamplerStat...
    method PSSetShader (line 1366) | func (c *DeviceContext) PSSetShader(s *PixelShader) {
    method UpdateSubresource (line 1378) | func (c *DeviceContext) UpdateSubresource(res *Resource, dstBox *BOX, ...
    method RSSetState (line 1393) | func (c *DeviceContext) RSSetState(state *RasterizerState) {
    method IASetInputLayout (line 1403) | func (c *DeviceContext) IASetInputLayout(layout *InputLayout) {
    method IASetIndexBuffer (line 1413) | func (c *DeviceContext) IASetIndexBuffer(buf *Buffer, format, offset u...
    method IASetVertexBuffers (line 1425) | func (c *DeviceContext) IASetVertexBuffers(buf *Buffer, stride, offset...
    method IASetPrimitiveTopology (line 1438) | func (c *DeviceContext) IASetPrimitiveTopology(mode uint32) {
    method OMGetRenderTargets (line 1448) | func (c *DeviceContext) OMGetRenderTargets() (*RenderTargetView, *Dept...
    method OMSetRenderTargets (line 1465) | func (c *DeviceContext) OMSetRenderTargets(target *RenderTargetView, d...
    method Draw (line 1477) | func (c *DeviceContext) Draw(count, start uint32) {
    method DrawIndexed (line 1487) | func (c *DeviceContext) DrawIndexed(count, start uint32, base int32) {
    method Dispatch (line 1499) | func (c *DeviceContext) Dispatch(x, y, z uint32) {
    method OMSetBlendState (line 1511) | func (c *DeviceContext) OMSetBlendState(state *BlendState, factor *f32...
    method OMSetDepthStencilState (line 1523) | func (c *DeviceContext) OMSetDepthStencilState(state *DepthStencilStat...
  type RenderTargetView (line 333) | type RenderTargetView struct
  type Resource (line 339) | type Resource struct
  type Texture2D (line 345) | type Texture2D struct
  type Buffer (line 351) | type Buffer struct
  type SamplerState (line 357) | type SamplerState struct
  type PixelShader (line 363) | type PixelShader struct
  type ShaderResourceView (line 369) | type ShaderResourceView struct
  type UnorderedAccessView (line 375) | type UnorderedAccessView struct
  type DepthStencilView (line 381) | type DepthStencilView struct
  type BlendState (line 387) | type BlendState struct
  type DepthStencilState (line 393) | type DepthStencilState struct
  type VertexShader (line 399) | type VertexShader struct
  type ComputeShader (line 405) | type ComputeShader struct
  type RasterizerState (line 411) | type RasterizerState struct
  type InputLayout (line 417) | type InputLayout struct
  type DEPTH_STENCIL_DESC (line 425) | type DEPTH_STENCIL_DESC struct
  type DEPTH_STENCILOP_DESC (line 436) | type DEPTH_STENCILOP_DESC struct
  type DEPTH_STENCIL_VIEW_DESC_TEX2D (line 443) | type DEPTH_STENCIL_VIEW_DESC_TEX2D struct
  type TEX2D_DSV (line 450) | type TEX2D_DSV struct
  type BLEND_DESC (line 454) | type BLEND_DESC struct
  type RENDER_TARGET_BLEND_DESC (line 460) | type RENDER_TARGET_BLEND_DESC struct
  type IDXGIObject (line 471) | type IDXGIObject struct
    method GetParent (line 1533) | func (d *IDXGIObject) GetParent(guid *GUID) (*IDXGIObject, error) {
  type IDXGIAdapter (line 481) | type IDXGIAdapter struct
  type IDXGIFactory (line 495) | type IDXGIFactory struct
    method CreateSwapChain (line 1548) | func (d *IDXGIFactory) CreateSwapChain(device *IUnknown, desc *DXGI_SW...
  type IDXGIDebug (line 510) | type IDXGIDebug struct
    method ReportLiveObjects (line 814) | func (d *IDXGIDebug) ReportLiveObjects(guid *GUID, flags uint32) {
  type IDXGIDevice (line 517) | type IDXGIDevice struct
    method GetAdapter (line 1565) | func (d *IDXGIDevice) GetAdapter() (*IDXGIAdapter, error) {
  type IUnknown (line 532) | type IUnknown struct
  type _IUnknownVTbl (line 538) | type _IUnknownVTbl struct
  type BUFFER_DESC (line 544) | type BUFFER_DESC struct
  type GUID (line 553) | type GUID struct
  type VIEWPORT (line 567) | type VIEWPORT struct
  type SUBRESOURCE_DATA (line 576) | type SUBRESOURCE_DATA struct
  type BOX (line 580) | type BOX struct
  type MAPPED_SUBRESOURCE (line 589) | type MAPPED_SUBRESOURCE struct
  type ErrorCode (line 595) | type ErrorCode struct
    method Error (line 1615) | func (e ErrorCode) Error() string {
  type RASTERIZER_DESC (line 600) | type RASTERIZER_DESC struct
  constant SDK_VERSION (line 635) | SDK_VERSION          = 7
  constant DRIVER_TYPE_HARDWARE (line 636) | DRIVER_TYPE_HARDWARE = 1
  constant DXGI_FORMAT_UNKNOWN (line 638) | DXGI_FORMAT_UNKNOWN             = 0
  constant DXGI_FORMAT_R16_FLOAT (line 639) | DXGI_FORMAT_R16_FLOAT           = 54
  constant DXGI_FORMAT_R32_FLOAT (line 640) | DXGI_FORMAT_R32_FLOAT           = 41
  constant DXGI_FORMAT_R32_TYPELESS (line 641) | DXGI_FORMAT_R32_TYPELESS        = 39
  constant DXGI_FORMAT_R32G32_FLOAT (line 642) | DXGI_FORMAT_R32G32_FLOAT        = 16
  constant DXGI_FORMAT_R32G32B32_FLOAT (line 643) | DXGI_FORMAT_R32G32B32_FLOAT     = 6
  constant DXGI_FORMAT_R32G32B32A32_FLOAT (line 644) | DXGI_FORMAT_R32G32B32A32_FLOAT  = 2
  constant DXGI_FORMAT_R8G8B8A8_UNORM (line 645) | DXGI_FORMAT_R8G8B8A8_UNORM      = 28
  constant DXGI_FORMAT_R8G8B8A8_UNORM_SRGB (line 646) | DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29
  constant DXGI_FORMAT_R16_SINT (line 647) | DXGI_FORMAT_R16_SINT            = 59
  constant DXGI_FORMAT_R16G16_SINT (line 648) | DXGI_FORMAT_R16G16_SINT         = 38
  constant DXGI_FORMAT_R16_UINT (line 649) | DXGI_FORMAT_R16_UINT            = 57
  constant DXGI_FORMAT_D24_UNORM_S8_UINT (line 650) | DXGI_FORMAT_D24_UNORM_S8_UINT   = 45
  constant DXGI_FORMAT_R16G16_FLOAT (line 651) | DXGI_FORMAT_R16G16_FLOAT        = 34
  constant DXGI_FORMAT_R16G16B16A16_FLOAT (line 652) | DXGI_FORMAT_R16G16B16A16_FLOAT  = 10
  constant DXGI_DEBUG_RLO_SUMMARY (line 654) | DXGI_DEBUG_RLO_SUMMARY         = 0x1
  constant DXGI_DEBUG_RLO_DETAIL (line 655) | DXGI_DEBUG_RLO_DETAIL          = 0x2
  constant DXGI_DEBUG_RLO_IGNORE_INTERNAL (line 656) | DXGI_DEBUG_RLO_IGNORE_INTERNAL = 0x4
  constant FORMAT_SUPPORT_TEXTURE2D (line 658) | FORMAT_SUPPORT_TEXTURE2D     = 0x20
  constant FORMAT_SUPPORT_RENDER_TARGET (line 659) | FORMAT_SUPPORT_RENDER_TARGET = 0x4000
  constant DXGI_USAGE_RENDER_TARGET_OUTPUT (line 661) | DXGI_USAGE_RENDER_TARGET_OUTPUT = 1 << (1 + 4)
  constant CPU_ACCESS_READ (line 663) | CPU_ACCESS_READ = 0x20000
  constant MAP_READ (line 665) | MAP_READ = 1
  constant DXGI_SWAP_EFFECT_DISCARD (line 667) | DXGI_SWAP_EFFECT_DISCARD = 0
  constant FEATURE_LEVEL_9_1 (line 669) | FEATURE_LEVEL_9_1  = 0x9100
  constant FEATURE_LEVEL_9_3 (line 670) | FEATURE_LEVEL_9_3  = 0x9300
  constant FEATURE_LEVEL_11_0 (line 671) | FEATURE_LEVEL_11_0 = 0xb000
  constant USAGE_IMMUTABLE (line 673) | USAGE_IMMUTABLE = 1
  constant USAGE_STAGING (line 674) | USAGE_STAGING   = 3
  constant BIND_VERTEX_BUFFER (line 676) | BIND_VERTEX_BUFFER    = 0x1
  constant BIND_INDEX_BUFFER (line 677) | BIND_INDEX_BUFFER     = 0x2
  constant BIND_CONSTANT_BUFFER (line 678) | BIND_CONSTANT_BUFFER  = 0x4
  constant BIND_SHADER_RESOURCE (line 679) | BIND_SHADER_RESOURCE  = 0x8
  constant BIND_RENDER_TARGET (line 680) | BIND_RENDER_TARGET    = 0x20
  constant BIND_DEPTH_STENCIL (line 681) | BIND_DEPTH_STENCIL    = 0x40
  constant BIND_UNORDERED_ACCESS (line 682) | BIND_UNORDERED_ACCESS = 0x80
  constant PRIMITIVE_TOPOLOGY_TRIANGLELIST (line 684) | PRIMITIVE_TOPOLOGY_TRIANGLELIST  = 4
  constant PRIMITIVE_TOPOLOGY_TRIANGLESTRIP (line 685) | PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = 5
  constant FILTER_MIN_MAG_LINEAR_MIP_POINT (line 687) | FILTER_MIN_MAG_LINEAR_MIP_POINT = 0x14
  constant FILTER_MIN_MAG_MIP_POINT (line 688) | FILTER_MIN_MAG_MIP_POINT        = 0
  constant TEXTURE_ADDRESS_MIRROR (line 690) | TEXTURE_ADDRESS_MIRROR = 2
  constant TEXTURE_ADDRESS_CLAMP (line 691) | TEXTURE_ADDRESS_CLAMP  = 3
  constant TEXTURE_ADDRESS_WRAP (line 692) | TEXTURE_ADDRESS_WRAP   = 1
  constant SRV_DIMENSION_BUFFER (line 694) | SRV_DIMENSION_BUFFER    = 1
  constant UAV_DIMENSION_BUFFER (line 695) | UAV_DIMENSION_BUFFER    = 1
  constant SRV_DIMENSION_BUFFEREX (line 696) | SRV_DIMENSION_BUFFEREX  = 11
  constant SRV_DIMENSION_TEXTURE2D (line 697) | SRV_DIMENSION_TEXTURE2D = 4
  constant UAV_DIMENSION_TEXTURE2D (line 698) | UAV_DIMENSION_TEXTURE2D = 4
  constant BUFFER_UAV_FLAG_RAW (line 700) | BUFFER_UAV_FLAG_RAW   = 0x1
  constant BUFFEREX_SRV_FLAG_RAW (line 701) | BUFFEREX_SRV_FLAG_RAW = 0x1
  constant RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS (line 703) | RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS = 0x20
  constant CREATE_DEVICE_DEBUG (line 705) | CREATE_DEVICE_DEBUG = 0x2
  constant FILL_SOLID (line 707) | FILL_SOLID = 3
  constant CULL_NONE (line 709) | CULL_NONE = 1
  constant CLEAR_DEPTH (line 711) | CLEAR_DEPTH   = 0x1
  constant CLEAR_STENCIL (line 712) | CLEAR_STENCIL = 0x2
  constant DSV_DIMENSION_TEXTURE2D (line 714) | DSV_DIMENSION_TEXTURE2D = 3
  constant DEPTH_WRITE_MASK_ALL (line 716) | DEPTH_WRITE_MASK_ALL = 1
  constant COMPARISON_GREATER (line 718) | COMPARISON_GREATER       = 5
  constant COMPARISON_GREATER_EQUAL (line 719) | COMPARISON_GREATER_EQUAL = 7
  constant BLEND_OP_ADD (line 721) | BLEND_OP_ADD        = 1
  constant BLEND_ONE (line 722) | BLEND_ONE           = 2
  constant BLEND_INV_SRC_ALPHA (line 723) | BLEND_INV_SRC_ALPHA = 6
  constant BLEND_ZERO (line 724) | BLEND_ZERO          = 1
  constant BLEND_DEST_COLOR (line 725) | BLEND_DEST_COLOR    = 9
  constant BLEND_DEST_ALPHA (line 726) | BLEND_DEST_ALPHA    = 7
  constant COLOR_WRITE_ENABLE_ALL (line 728) | COLOR_WRITE_ENABLE_ALL = 1 | 2 | 4 | 8
  constant DXGI_STATUS_OCCLUDED (line 730) | DXGI_STATUS_OCCLUDED      = 0x087A0001
  constant DXGI_ERROR_DEVICE_RESET (line 731) | DXGI_ERROR_DEVICE_RESET   = 0x887A0007
  constant DXGI_ERROR_DEVICE_REMOVED (line 732) | DXGI_ERROR_DEVICE_REMOVED = 0x887A0005
  constant D3DDDIERR_DEVICEREMOVED (line 733) | D3DDDIERR_DEVICEREMOVED   = 1<<31 | 0x876<<16 | 2160
  constant RLDO_SUMMARY (line 735) | RLDO_SUMMARY         = 1
  constant RLDO_DETAIL (line 736) | RLDO_DETAIL          = 2
  constant RLDO_IGNORE_INTERNAL (line 737) | RLDO_IGNORE_INTERNAL = 4
  function CreateDevice (line 740) | func CreateDevice(driverType uint32, flags uint32) (*Device, *DeviceCont...
  function CreateDeviceAndSwapChain (line 764) | func CreateDeviceAndSwapChain(driverType uint32, flags uint32, swapDesc ...
  function DXGIGetDebugInterface1 (line 791) | func DXGIGetDebugInterface1() (*IDXGIDebug, error) {
  function ReportLiveObjects (line 804) | func ReportLiveObjects() error {
  function IUnknownQueryInterface (line 1580) | func IUnknownQueryInterface(obj unsafe.Pointer, queryInterfaceMethod uin...
  function IUnknownAddRef (line 1595) | func IUnknownAddRef(obj unsafe.Pointer, addRefMethod uintptr) {
  function IUnknownRelease (line 1605) | func IUnknownRelease(obj unsafe.Pointer, releaseMethod uintptr) {
  function CreateSwapChain (line 1619) | func CreateSwapChain(dev *Device, hwnd windows.Handle) (*IDXGISwapChain,...
  function CreateDepthView (line 1657) | func CreateDepthView(d *Device, width, height, depthBits int) (*DepthSte...

FILE: vendor/gioui.org/internal/egl/egl.go
  type Context (line 17) | type Context struct
    method Release (line 59) | func (c *Context) Release() {
    method Present (line 68) | func (c *Context) Present() error {
    method RenderTarget (line 100) | func (c *Context) RenderTarget() (gpu.RenderTarget, error) {
    method API (line 104) | func (c *Context) API() gpu.API {
    method ReleaseSurface (line 108) | func (c *Context) ReleaseSurface() {
    method VisualID (line 119) | func (c *Context) VisualID() int {
    method CreateSurface (line 123) | func (c *Context) CreateSurface(win NativeWindowType, width, height in...
    method ReleaseCurrent (line 131) | func (c *Context) ReleaseCurrent() {
    method MakeCurrent (line 137) | func (c *Context) MakeCurrent() error {
    method EnableVSync (line 150) | func (c *Context) EnableVSync(enable bool) {
  type eglContext (line 24) | type eglContext struct
  constant _EGL_ALPHA_SIZE (line 41) | _EGL_ALPHA_SIZE             = 0x3021
  constant _EGL_BLUE_SIZE (line 42) | _EGL_BLUE_SIZE              = 0x3022
  constant _EGL_CONFIG_CAVEAT (line 43) | _EGL_CONFIG_CAVEAT          = 0x3027
  constant _EGL_CONTEXT_CLIENT_VERSION (line 44) | _EGL_CONTEXT_CLIENT_VERSION = 0x3098
  constant _EGL_DEPTH_SIZE (line 45) | _EGL_DEPTH_SIZE             = 0x3025
  constant _EGL_GL_COLORSPACE_KHR (line 46) | _EGL_GL_COLORSPACE_KHR      = 0x309d
  constant _EGL_GL_COLORSPACE_SRGB_KHR (line 47) | _EGL_GL_COLORSPACE_SRGB_KHR = 0x3089
  constant _EGL_GREEN_SIZE (line 48) | _EGL_GREEN_SIZE             = 0x3023
  constant _EGL_EXTENSIONS (line 49) | _EGL_EXTENSIONS             = 0x3055
  constant _EGL_NATIVE_VISUAL_ID (line 50) | _EGL_NATIVE_VISUAL_ID       = 0x302e
  constant _EGL_NONE (line 51) | _EGL_NONE                   = 0x3038
  constant _EGL_OPENGL_ES2_BIT (line 52) | _EGL_OPENGL_ES2_BIT         = 0x4
  constant _EGL_RED_SIZE (line 53) | _EGL_RED_SIZE               = 0x3024
  constant _EGL_RENDERABLE_TYPE (line 54) | _EGL_RENDERABLE_TYPE        = 0x3040
  constant _EGL_SURFACE_TYPE (line 55) | _EGL_SURFACE_TYPE           = 0x3033
  constant _EGL_WINDOW_BIT (line 56) | _EGL_WINDOW_BIT             = 0x4
  function NewContext (line 75) | func NewContext(disp NativeDisplayType) (*Context, error) {
  function hasExtension (line 158) | func hasExtension(exts []string, ext string) bool {
  function createContext (line 167) | func createContext(disp _EGLDisplay) (*eglContext, error) {
  function createSurface (line 236) | func createSurface(disp _EGLDisplay, eglCtx *eglContext, win NativeWindo...

FILE: vendor/gioui.org/internal/egl/egl_unix.go
  function loadEGL (line 32) | func loadEGL() error {
  function eglChooseConfig (line 36) | func eglChooseConfig(disp _EGLDisplay, attribs []_EGLint) (_EGLConfig, b...
  function eglCreateContext (line 45) | func eglCreateContext(disp _EGLDisplay, cfg _EGLConfig, shareCtx _EGLCon...
  function eglDestroySurface (line 50) | func eglDestroySurface(disp _EGLDisplay, surf _EGLSurface) bool {
  function eglDestroyContext (line 54) | func eglDestroyContext(disp _EGLDisplay, ctx _EGLContext) bool {
  function eglGetConfigAttrib (line 58) | func eglGetConfigAttrib(disp _EGLDisplay, cfg _EGLConfig, attr _EGLint) ...
  function eglGetError (line 64) | func eglGetError() _EGLint {
  function eglInitialize (line 68) | func eglInitialize(disp _EGLDisplay) (_EGLint, _EGLint, bool) {
  function eglMakeCurrent (line 74) | func eglMakeCurrent(disp _EGLDisplay, draw, read _EGLSurface, ctx _EGLCo...
  function eglReleaseThread (line 78) | func eglReleaseThread() bool {
  function eglSwapBuffers (line 82) | func eglSwapBuffers(disp _EGLDisplay, surf _EGLSurface) bool {
  function eglSwapInterval (line 86) | func eglSwapInterval(disp _EGLDisplay, interval _EGLint) bool {
  function eglTerminate (line 90) | func eglTerminate(disp _EGLDisplay) bool {
  function eglQueryString (line 94) | func eglQueryString(disp _EGLDisplay, name _EGLint) string {
  function eglGetDisplay (line 98) | func eglGetDisplay(disp NativeDisplayType) _EGLDisplay {
  function eglCreateWindowSurface (line 102) | func eglCreateWindowSurface(disp _EGLDisplay, conf _EGLConfig, win Nativ...
  function eglWaitClient (line 107) | func eglWaitClient() bool {

FILE: vendor/gioui.org/internal/egl/egl_windows.go
  type _EGLint (line 17) | type _EGLint
  type _EGLDisplay (line 18) | type _EGLDisplay
  type _EGLConfig (line 19) | type _EGLConfig
  type _EGLContext (line 20) | type _EGLContext
  type _EGLSurface (line 21) | type _EGLSurface
  type NativeDisplayType (line 22) | type NativeDisplayType
  type NativeWindowType (line 23) | type NativeWindowType
  function loadEGL (line 48) | func loadEGL() error {
  function loadDLLs (line 56) | func loadDLLs() error {
  function loadDLL (line 67) | func loadDLL(dll *syscall.LazyDLL, name string) error {
  function eglChooseConfig (line 75) | func eglChooseConfig(disp _EGLDisplay, attribs []_EGLint) (_EGLConfig, b...
  function eglCreateContext (line 84) | func eglCreateContext(disp _EGLDisplay, cfg _EGLConfig, shareCtx _EGLCon...
  function eglCreateWindowSurface (line 91) | func eglCreateWindowSurface(disp _EGLDisplay, cfg _EGLConfig, win Native...
  function eglDestroySurface (line 98) | func eglDestroySurface(disp _EGLDisplay, surf _EGLSurface) bool {
  function eglDestroyContext (line 103) | func eglDestroyContext(disp _EGLDisplay, ctx _EGLContext) bool {
  function eglGetConfigAttrib (line 108) | func eglGetConfigAttrib(disp _EGLDisplay, cfg _EGLConfig, attr _EGLint) ...
  function eglGetDisplay (line 114) | func eglGetDisplay(disp NativeDisplayType) _EGLDisplay {
  function eglGetError (line 119) | func eglGetError() _EGLint {
  function eglInitialize (line 124) | func eglInitialize(disp _EGLDisplay) (_EGLint, _EGLint, bool) {
  function eglMakeCurrent (line 130) | func eglMakeCurrent(disp _EGLDisplay, draw, read _EGLSurface, ctx _EGLCo...
  function eglReleaseThread (line 135) | func eglReleaseThread() bool {
  function eglSwapInterval (line 140) | func eglSwapInterval(disp _EGLDisplay, interval _EGLint) bool {
  function eglSwapBuffers (line 145) | func eglSwapBuffers(disp _EGLDisplay, surf _EGLSurface) bool {
  function eglTerminate (line 150) | func eglTerminate(disp _EGLDisplay) bool {
  function eglQueryString (line 155) | func eglQueryString(disp _EGLDisplay, name _EGLint) string {
  function eglWaitClient (line 160) | func eglWaitClient() bool {
  function issue34474KeepAlive (line 167) | func issue34474KeepAlive(v interface{}) {

FILE: vendor/gioui.org/internal/f32color/rgba.go
  type RGBA (line 11) | type RGBA struct
    method Array (line 16) | func (rgba RGBA) Array() [4]float32 {
    method Float32 (line 21) | func (col RGBA) Float32() (r, g, b, a float32) {
    method SRGB (line 26) | func (col RGBA) SRGB() color.NRGBA {
    method Luminance (line 42) | func (col RGBA) Luminance() float32 {
    method Opaque (line 47) | func (col RGBA) Opaque() RGBA {
  function LinearFromSRGB (line 53) | func LinearFromSRGB(col color.NRGBA) RGBA {
  function NRGBAToRGBA (line 67) | func NRGBAToRGBA(col color.NRGBA) color.RGBA {
  function NRGBAToLinearRGBA (line 83) | func NRGBAToLinearRGBA(col color.NRGBA) color.RGBA {
  function RGBAToNRGBA (line 97) | func RGBAToNRGBA(col color.RGBA) color.NRGBA {
  function linearTosRGB (line 113) | func linearTosRGB(c float32) float32 {
  function sRGBToLinear (line 128) | func sRGBToLinear(c float32) float32 {
  function MulAlpha (line 138) | func MulAlpha(c color.NRGBA, alpha uint8) color.NRGBA {
  function Disabled (line 146) | func Disabled(c color.NRGBA) (d color.NRGBA) {
  function Hovered (line 158) | func Hovered(c color.NRGBA) (d color.NRGBA) {
  function approxLuminance (line 169) | func approxLuminance(c color.NRGBA) byte {

FILE: vendor/gioui.org/internal/fling/animation.go
  type Animation (line 13) | type Animation struct
    method Start (line 34) | func (f *Animation) Start(c unit.Metric, now time.Time, velocity float...
    method init (line 50) | func (f *Animation) init(now time.Time, v0 float32) {
    method Active (line 56) | func (f *Animation) Active() bool {
    method Tick (line 62) | func (f *Animation) Tick(now time.Time) int {
  constant thresholdVelocity (line 29) | thresholdVelocity = 1

FILE: vendor/gioui.org/internal/fling/extrapolation.go
  type Extrapolation (line 16) | type Extrapolation struct
    method SampleDelta (line 55) | func (e *Extrapolation) SampleDelta(t time.Duration, delta float32) {
    method Sample (line 61) | func (e *Extrapolation) Sample(t time.Duration, val float32) {
    method Estimate (line 84) | func (e *Extrapolation) Estimate() Estimate {
    method get (line 117) | func (e *Extrapolation) get(i int) sample {
  type sample (line 30) | type sample struct
  type matrix (line 35) | type matrix struct
    method set (line 235) | func (m *matrix) set(row, col int, v float32) {
    method get (line 245) | func (m *matrix) get(row, col int) float32 {
    method col (line 255) | func (m *matrix) col(c int) []float32 {
    method approxEqual (line 259) | func (m *matrix) approxEqual(m2 *matrix) bool {
    method transpose (line 275) | func (m *matrix) transpose() *matrix {
    method mul (line 289) | func (m *matrix) mul(m2 *matrix) *matrix {
    method String (line 310) | func (m *matrix) String() string {
  type Estimate (line 40) | type Estimate struct
  type coefficients (line 45) | type coefficients
    method approxEqual (line 323) | func (c coefficients) approxEqual(c2 coefficients) bool {
  constant degree (line 48) | degree       = 2
  constant historySize (line 49) | historySize  = 20
  constant maxAge (line 50) | maxAge       = 100 * time.Millisecond
  constant maxSampleGap (line 51) | maxSampleGap = 40 * time.Millisecond
  function polyFit (line 126) | func polyFit(X, Y []float32) (coefficients, bool) {
  function decomposeQR (line 170) | func decomposeQR(A *matrix) (*matrix, *matrix, bool) {
  function norm (line 211) | func norm(V []float32) float32 {
  function dot (line 219) | func dot(V1, V2 []float32) float32 {
  function newMatrix (line 227) | func newMatrix(rows, cols int) *matrix {

FILE: vendor/gioui.org/internal/gl/gl.go
  type Attrib (line 6) | type Attrib
  type Enum (line 7) | type Enum
  constant ACTIVE_TEXTURE (line 11) | ACTIVE_TEXTURE                        = 0x84E0
  constant ALL_BARRIER_BITS (line 12) | ALL_BARRIER_BITS                      = 0xffffffff
  constant ARRAY_BUFFER (line 13) | ARRAY_BUFFER                          = 0x8892
  constant ARRAY_BUFFER_BINDING (line 14) | ARRAY_BUFFER_BINDING                  = 0x8894
  constant BACK (line 15) | BACK                                  = 0x0405
  constant BLEND (line 16) | BLEND                                 = 0xbe2
  constant BLEND_DST_RGB (line 17) | BLEND_DST_RGB                         = 0x80C8
  constant BLEND_SRC_RGB (line 18) | BLEND_SRC_RGB                         = 0x80C9
  constant BLEND_DST_ALPHA (line 19) | BLEND_DST_ALPHA                       = 0x80CA
  constant BLEND_SRC_ALPHA (line 20) | BLEND_SRC_ALPHA                       = 0x80CB
  constant CLAMP_TO_EDGE (line 21) | CLAMP_TO_EDGE                         = 0x812f
  constant COLOR_ATTACHMENT0 (line 22) | COLOR_ATTACHMENT0                     = 0x8ce0
  constant COLOR_BUFFER_BIT (line 23) | COLOR_BUFFER_BIT                      = 0x4000
  constant COLOR_CLEAR_VALUE (line 24) | COLOR_CLEAR_VALUE                     = 0x0C22
  constant COMPILE_STATUS (line 25) | COMPILE_STATUS                        = 0x8b81
  constant COMPUTE_SHADER (line 26) | COMPUTE_SHADER                        = 0x91B9
  constant CURRENT_PROGRAM (line 27) | CURRENT_PROGRAM                       = 0x8B8D
  constant DEPTH_ATTACHMENT (line 28) | DEPTH_ATTACHMENT                      = 0x8d00
  constant DEPTH_BUFFER_BIT (line 29) | DEPTH_BUFFER_BIT                      = 0x100
  constant DEPTH_CLEAR_VALUE (line 30) | DEPTH_CLEAR_VALUE                     = 0x0B73
  constant DEPTH_COMPONENT16 (line 31) | DEPTH_COMPONENT16                     = 0x81a5
  constant DEPTH_COMPONENT24 (line 32) | DEPTH_COMPONENT24                     = 0x81A6
  constant DEPTH_COMPONENT32F (line 33) | DEPTH_COMPONENT32F                    = 0x8CAC
  constant DEPTH_FUNC (line 34) | DEPTH_FUNC                            = 0x0B74
  constant DEPTH_TEST (line 35) | DEPTH_TEST                            = 0xb71
  constant DEPTH_WRITEMASK (line 36) | DEPTH_WRITEMASK                       = 0x0B72
  constant DRAW_FRAMEBUFFER (line 37) | DRAW_FRAMEBUFFER                      = 0x8CA9
  constant DST_C
Copy disabled (too large) Download .json
Condensed preview — 1169 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (17,387K chars).
[
  {
    "path": ".editorconfig",
    "chars": 290,
    "preview": "# EditorConfig is awesome: https://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Unix-style newlines wit"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 866,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n**Describe the "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 604,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n**Is"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 696,
    "preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
  },
  {
    "path": ".github/workflows/build-artifact.yml",
    "chars": 463,
    "preview": "---\nname: Build Dev Artifact\n\non:\n  push:\n    branches:\n      - 'master'\n  pull_request:\n\npermissions:\n  contents: read\n"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 2622,
    "preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
  },
  {
    "path": ".github/workflows/flawfinder.yml",
    "chars": 1037,
    "preview": "# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n"
  },
  {
    "path": ".github/workflows/golangci-lint.yml",
    "chars": 1470,
    "preview": "name: golangci-lint\non:\n  push:\n    tags:\n      - v*\n    branches:\n      - master\n      - main\n  pull_request:\npermissio"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1008,
    "preview": "---\nname: release\n\non:\n  push:\n    tags:\n      - \"v*.*.*\"\n\npermissions:\n  contents: write\n\njobs:\n  build:\n    runs-on: u"
  },
  {
    "path": ".gitignore",
    "chars": 63,
    "preview": "bin/\nlicenses.go\n.vscode\n*.sublime-workspace\n*.sublime-project\n"
  },
  {
    "path": ".gitmodules",
    "chars": 180,
    "preview": "[submodule \"c/rnnoise\"]\n\tpath = c/rnnoise\n\turl = https://github.com/noisetorch/rnnoise\n[submodule \"c/c-ringbuf\"]\n\tpath ="
  },
  {
    "path": "LICENSE",
    "chars": 36088,
    "preview": "NoiseTorch (c) 2020-2021 lawl (github.com/lawl)\nNoiseTorch-ng (c) 2022 NoiseTorch Community (https://github.com/noisetor"
  },
  {
    "path": "Makefile",
    "chars": 1284,
    "preview": "NAME_SUFFIX=\nUPDATE_URL=https://github.com/noisetorch/NoiseTorch/releases/download/\nWEBSITE_URL=https://github.com/noise"
  },
  {
    "path": "README.md",
    "chars": 7382,
    "preview": "<h1 align=\"center\"> NoiseTorch-ng</h1>\n<h3 align=\"center\"> Noise Supression Application for PulseAudio or Pipewire</h3>\n"
  },
  {
    "path": "assets/icon/LICENSE",
    "chars": 242,
    "preview": "Artist: Salee Design\n        www.salleedesign.com\n        info@salleedesign.com\nSource: https://iconarchive.com/show/mus"
  },
  {
    "path": "assets/noisetorch.desktop",
    "chars": 250,
    "preview": "[Desktop Entry]\nName=NoiseTorch\nGenericName=Realtime Noise Suppressor\nComment=Create a virtual microphone that suppresse"
  },
  {
    "path": "c/ladspa/.gitignore",
    "chars": 22,
    "preview": "*.o\nrnnoise_ladspa.so\n"
  },
  {
    "path": "c/ladspa/Makefile",
    "chars": 192,
    "preview": "default:\n\t$(CC) -I ../rnnoise/include -Wall -Werror -O2 -c -fPIC ../c-ringbuf/ringbuf.c ../rnnoise/src/*.c module.c\n\t$(C"
  },
  {
    "path": "c/ladspa/export.txt",
    "chars": 35,
    "preview": "{\n\tglobal: *ladspa*;\n\tlocal: *;\n};\n"
  },
  {
    "path": "c/ladspa/ladspa.h",
    "chars": 27593,
    "preview": "/* ladspa.h\n\n   Linux Audio Developer's Simple Plugin API Version 1.1[LGPL].\n   Copyright (C) 2000-2002 Richard W.E. Fur"
  },
  {
    "path": "c/ladspa/module.c",
    "chars": 6810,
    "preview": "/*\n  (c) Copyright 2021 github.com/lawl GPL3+\n  Free software by Richard W.E. Furse. Do with as you will. No\n  warranty."
  },
  {
    "path": "c/ladspa/utils.h",
    "chars": 4056,
    "preview": "/* utils.h\n\n   Free software by Richard W.E. Furse. Do with as you will. No\n   warranty. */\n\n#ifndef LADSPA_SDK_LOAD_PLU"
  },
  {
    "path": "capability.go",
    "chars": 1763,
    "preview": "// This file is part of the program \"NoiseTorch-ng\".\n// Please see the LICENSE file for copyright information.\n\npackage "
  },
  {
    "path": "cli.go",
    "chars": 4913,
    "preview": "// This file is part of the program \"NoiseTorch-ng\".\n// Please see the LICENSE file for copyright information.\n\npackage "
  },
  {
    "path": "config.go",
    "chars": 2683,
    "preview": "// This file is part of the program \"NoiseTorch-ng\".\n// Please see the LICENSE file for copyright information.\n\npackage "
  },
  {
    "path": "go.mod",
    "chars": 916,
    "preview": "module noisetorch\n\ngo 1.16\n\nrequire (\n\tgioui.org v0.0.0-20220105104929-8d8aeef66bef // indirect\n\tgithub.com/BurntSushi/t"
  },
  {
    "path": "go.sum",
    "chars": 48953,
    "preview": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1"
  },
  {
    "path": "main.go",
    "chars": 9160,
    "preview": "// This file is part of the program \"NoiseTorch-ng\".\n// Please see the LICENSE file for copyright information.\n\npackage "
  },
  {
    "path": "module.go",
    "chars": 13876,
    "preview": "// This file is part of the program \"NoiseTorch-ng\".\n// Please see the LICENSE file for copyright information.\n\npackage "
  },
  {
    "path": "rlimit.go",
    "chars": 1351,
    "preview": "// This file is part of the program \"NoiseTorch-ng\".\n// Please see the LICENSE file for copyright information.\n\npackage "
  },
  {
    "path": "scripts/embedlicenses.go",
    "chars": 993,
    "preview": "package main\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n)\n\nfunc main() { //nolint\n\tcwd, err := os.Getwd()\n\tif err != ni"
  },
  {
    "path": "scripts/signer.go",
    "chars": 2289,
    "preview": "package main\n\nimport (\n\t\"crypto\"\n\t\"encoding/base64\"\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"golang.org/x/crypto/ed25519"
  },
  {
    "path": "ui.go",
    "chars": 13069,
    "preview": "// This file is part of the program \"NoiseTorch-ng\".\n// Please see the LICENSE file for copyright information.\n\npackage "
  },
  {
    "path": "untar.go",
    "chars": 5412,
    "preview": "/*\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or w"
  },
  {
    "path": "update.go",
    "chars": 5795,
    "preview": "// This file is part of the program \"NoiseTorch-ng\".\n// Please see the LICENSE file for copyright information.\n\npackage "
  },
  {
    "path": "vendor/dmitri.shuralyov.com/gpu/mtl/LICENSE",
    "chars": 1479,
    "preview": "Copyright (c) 2018 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or with"
  },
  {
    "path": "vendor/dmitri.shuralyov.com/gpu/mtl/mtl.go",
    "chars": 28752,
    "preview": "// +build darwin\n\n// Package mtl provides access to Apple's Metal API (https://developer.apple.com/documentation/metal)."
  },
  {
    "path": "vendor/dmitri.shuralyov.com/gpu/mtl/mtl.h",
    "chars": 3523,
    "preview": "// +build darwin\n\ntypedef unsigned long uint_t;\ntypedef unsigned char uint8_t;\ntypedef unsigned short uint16_t;\ntypedef "
  },
  {
    "path": "vendor/dmitri.shuralyov.com/gpu/mtl/mtl.m",
    "chars": 8796,
    "preview": "// +build darwin\n\n#import <Metal/Metal.h>\n#include \"mtl.h\"\n\nstruct Device CreateSystemDefaultDevice() {\n\tid<MTLDevice> d"
  },
  {
    "path": "vendor/gioui.org/LICENSE",
    "chars": 2589,
    "preview": "This project is provided under the terms of the UNLICENSE or\nthe MIT license denoted by the following SPDX identifier:\n\n"
  },
  {
    "path": "vendor/gioui.org/app/Gio.java",
    "chars": 1871,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage org.gioui;\n\nimport android.content.ClipboardManager;\nimport androi"
  },
  {
    "path": "vendor/gioui.org/app/GioActivity.java",
    "chars": 924,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage org.gioui;\n\nimport android.app.Activity;\nimport android.os.Bundle;"
  },
  {
    "path": "vendor/gioui.org/app/GioView.java",
    "chars": 14984,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage org.gioui;\n\nimport java.lang.Class;\nimport java.lang.IllegalAccess"
  },
  {
    "path": "vendor/gioui.org/app/app.go",
    "chars": 1172,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage app\n\nimport (\n\t\"os\"\n\t\"strings\"\n)\n\n// extraArgs contains extra argu"
  },
  {
    "path": "vendor/gioui.org/app/d3d11_windows.go",
    "chars": 3098,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage app\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n\n\t\"gioui.org/gpu\"\n\t\"gioui.org/inter"
  },
  {
    "path": "vendor/gioui.org/app/datadir.go",
    "chars": 174,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build !android\n// +build !android\n\npackage app\n\nimport \"os\"\n\nfunc dat"
  },
  {
    "path": "vendor/gioui.org/app/doc.go",
    "chars": 1936,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n/*\nPackage app provides a platform-independent interface to operating syst"
  },
  {
    "path": "vendor/gioui.org/app/egl_android.go",
    "chars": 1331,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage app\n\n/*\n#include <android/native_window_jni.h>\n#include <EGL/egl.h"
  },
  {
    "path": "vendor/gioui.org/app/egl_wayland.go",
    "chars": 1636,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build ((linux && !android) || freebsd) && !nowayland\n// +build linux,"
  },
  {
    "path": "vendor/gioui.org/app/egl_windows.go",
    "chars": 1134,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage app\n\nimport (\n\t\"golang.org/x/sys/windows\"\n\n\t\"gioui.org/internal/eg"
  },
  {
    "path": "vendor/gioui.org/app/egl_x11.go",
    "chars": 1166,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build ((linux && !android) || freebsd || openbsd) && !nox11\n// +build"
  },
  {
    "path": "vendor/gioui.org/app/framework_ios.h",
    "chars": 125,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n#include <UIKit/UIKit.h>\n\n@interface GioViewController : UIViewController\n"
  },
  {
    "path": "vendor/gioui.org/app/gl_ios.go",
    "chars": 3648,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build darwin && ios && nometal\n// +build darwin,ios,nometal\n\npackage "
  },
  {
    "path": "vendor/gioui.org/app/gl_ios.m",
    "chars": 1264,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// +build darwin,ios,nometal\n\n@import UIKit;\n@import OpenGLES;\n\n#include \""
  },
  {
    "path": "vendor/gioui.org/app/gl_js.go",
    "chars": 1283,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage app\n\nimport (\n\t\"errors\"\n\t\"syscall/js\"\n\n\t\"gioui.org/gpu\"\n\t\"gioui.or"
  },
  {
    "path": "vendor/gioui.org/app/gl_macos.go",
    "chars": 2822,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build darwin && !ios && nometal\n// +build darwin,!ios,nometal\n\npackag"
  },
  {
    "path": "vendor/gioui.org/app/gl_macos.m",
    "chars": 1863,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// +build darwin,!ios,nometal\n\n@import AppKit;\n\n#include <CoreFoundation/C"
  },
  {
    "path": "vendor/gioui.org/app/internal/log/log.go",
    "chars": 191,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// Package points standard output, standard error and the standard\n// libr"
  },
  {
    "path": "vendor/gioui.org/app/internal/log/log_android.go",
    "chars": 1912,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage log\n\n/*\n#cgo LDFLAGS: -llog\n\n#include <stdlib.h>\n#include <android"
  },
  {
    "path": "vendor/gioui.org/app/internal/log/log_ios.go",
    "chars": 980,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build darwin && ios\n// +build darwin,ios\n\npackage log\n\n/*\n#cgo CFLAGS"
  },
  {
    "path": "vendor/gioui.org/app/internal/log/log_windows.go",
    "chars": 655,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage log\n\nimport (\n\t\"log\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\ntype logger struct{}\n"
  },
  {
    "path": "vendor/gioui.org/app/internal/windows/windows.go",
    "chars": 19048,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build windows\n// +build windows\n\npackage windows\n\nimport (\n\t\"fmt\"\n\t\"r"
  },
  {
    "path": "vendor/gioui.org/app/internal/xkb/xkb_unix.go",
    "chars": 8033,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build (linux && !android) || freebsd || openbsd\n// +build linux,!andr"
  },
  {
    "path": "vendor/gioui.org/app/metal_darwin.go",
    "chars": 3975,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build !nometal\n// +build !nometal\n\npackage app\n\nimport (\n\t\"errors\"\n\n\t"
  },
  {
    "path": "vendor/gioui.org/app/metal_ios.go",
    "chars": 1041,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build !nometal\n// +build !nometal\n\npackage app\n\n/*\n#cgo CFLAGS: -Werr"
  },
  {
    "path": "vendor/gioui.org/app/metal_macos.go",
    "chars": 1052,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build darwin && !ios && !nometal\n// +build darwin,!ios,!nometal\n\npack"
  },
  {
    "path": "vendor/gioui.org/app/os.go",
    "chars": 4855,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// package app implements platform specific windows\n// and GPU contexts.\np"
  },
  {
    "path": "vendor/gioui.org/app/os_android.go",
    "chars": 38510,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage app\n\n/*\n#cgo CFLAGS: -Werror\n#cgo LDFLAGS: -landroid\n\n#include <an"
  },
  {
    "path": "vendor/gioui.org/app/os_darwin.go",
    "chars": 5673,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage app\n\n/*\n#include <Foundation/Foundation.h>\n\n__attribute__ ((visibi"
  },
  {
    "path": "vendor/gioui.org/app/os_darwin.m",
    "chars": 225,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n@import Dispatch;\n@import Foundation;\n\n#include \"_cgo_export.h\"\n\nvoid gio_"
  },
  {
    "path": "vendor/gioui.org/app/os_ios.go",
    "chars": 7642,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build darwin && ios\n// +build darwin,ios\n\npackage app\n\n/*\n#cgo CFLAGS"
  },
  {
    "path": "vendor/gioui.org/app/os_ios.m",
    "chars": 7770,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// +build darwin,ios\n\n@import UIKit;\n\n#include <stdint.h>\n#include \"_cgo_e"
  },
  {
    "path": "vendor/gioui.org/app/os_js.go",
    "chars": 17940,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage app\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t\"image/color\"\n\t\"strings\"\n\t\"syscall/"
  },
  {
    "path": "vendor/gioui.org/app/os_macos.go",
    "chars": 15612,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build darwin && !ios\n// +build darwin,!ios\n\npackage app\n\nimport (\n\t\"e"
  },
  {
    "path": "vendor/gioui.org/app/os_macos.m",
    "chars": 8976,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// +build darwin,!ios\n\n@import AppKit;\n\n#include \"_cgo_export.h\"\n\n__attrib"
  },
  {
    "path": "vendor/gioui.org/app/os_unix.go",
    "chars": 1096,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build (linux && !android) || freebsd || openbsd\n// +build linux,!andr"
  },
  {
    "path": "vendor/gioui.org/app/os_wayland.c",
    "chars": 4034,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build ((linux && !android) || freebsd) && !nowayland\n// +build linux,"
  },
  {
    "path": "vendor/gioui.org/app/os_wayland.go",
    "chars": 45009,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build ((linux && !android) || freebsd) && !nowayland\n// +build linux,"
  },
  {
    "path": "vendor/gioui.org/app/os_windows.go",
    "chars": 20465,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage app\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"image\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"so"
  },
  {
    "path": "vendor/gioui.org/app/os_x11.go",
    "chars": 22608,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build ((linux && !android) || freebsd || openbsd) && !nox11\n// +build"
  },
  {
    "path": "vendor/gioui.org/app/runmain.go",
    "chars": 686,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build android || (darwin && ios)\n// +build android darwin,ios\n\npackag"
  },
  {
    "path": "vendor/gioui.org/app/vulkan.go",
    "chars": 4959,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build (linux || freebsd) && !novulkan\n// +build linux freebsd\n// +bui"
  },
  {
    "path": "vendor/gioui.org/app/vulkan_android.go",
    "chars": 1672,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build !novulkan\n// +build !novulkan\n\npackage app\n\nimport (\n\t\"unsafe\"\n"
  },
  {
    "path": "vendor/gioui.org/app/vulkan_wayland.go",
    "chars": 1574,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build ((linux && !android) || freebsd) && !nowayland && !novulkan\n// "
  },
  {
    "path": "vendor/gioui.org/app/vulkan_x11.go",
    "chars": 1563,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build ((linux && !android) || freebsd) && !nox11 && !novulkan\n// +bui"
  },
  {
    "path": "vendor/gioui.org/app/wayland_text_input.c",
    "chars": 3693,
    "preview": "//go:build ((linux && !android) || freebsd) && !nowayland\n// +build linux,!android freebsd\n// +build !nowayland\n\n/* Gene"
  },
  {
    "path": "vendor/gioui.org/app/wayland_text_input.h",
    "chars": 28826,
    "preview": "/* Generated by wayland-scanner 1.19.0 */\n\n#ifndef TEXT_INPUT_UNSTABLE_V3_CLIENT_PROTOCOL_H\n#define TEXT_INPUT_UNSTABLE_"
  },
  {
    "path": "vendor/gioui.org/app/wayland_xdg_decoration.c",
    "chars": 2896,
    "preview": "//go:build ((linux && !android) || freebsd) && !nowayland\n// +build linux,!android freebsd\n// +build !nowayland\n\n/* Gene"
  },
  {
    "path": "vendor/gioui.org/app/wayland_xdg_decoration.h",
    "chars": 13894,
    "preview": "/* Generated by wayland-scanner 1.19.0 */\n\n#ifndef XDG_DECORATION_UNSTABLE_V1_CLIENT_PROTOCOL_H\n#define XDG_DECORATION_U"
  },
  {
    "path": "vendor/gioui.org/app/wayland_xdg_shell.c",
    "chars": 5980,
    "preview": "//go:build ((linux && !android) || freebsd) && !nowayland\n// +build linux,!android freebsd\n// +build !nowayland\n\n/* Gene"
  },
  {
    "path": "vendor/gioui.org/app/wayland_xdg_shell.h",
    "chars": 69058,
    "preview": "/* Generated by wayland-scanner 1.19.0 */\n\n#ifndef XDG_SHELL_CLIENT_PROTOCOL_H\n#define XDG_SHELL_CLIENT_PROTOCOL_H\n\n#inc"
  },
  {
    "path": "vendor/gioui.org/app/window.go",
    "chars": 17875,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage app\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"image\"\n\t\"image/color\"\n\t\"runtime\"\n"
  },
  {
    "path": "vendor/gioui.org/cpu/LICENSE",
    "chars": 2589,
    "preview": "This project is provided under the terms of the UNLICENSE or\nthe MIT license denoted by the following SPDX identifier:\n\n"
  },
  {
    "path": "vendor/gioui.org/cpu/README.md",
    "chars": 997,
    "preview": "# Compile and run compute programs on CPU\n\nThis projects contains the compiler for turning Vulkan SPIR-V compute shaders"
  },
  {
    "path": "vendor/gioui.org/cpu/abi.h",
    "chars": 2213,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n#define ALIGN(bytes, type) type __attribute__((aligned(bytes)))\n\ntypedef A"
  },
  {
    "path": "vendor/gioui.org/cpu/driver.go",
    "chars": 1870,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build linux && (arm64 || arm || amd64)\n// +build linux\n// +build arm6"
  },
  {
    "path": "vendor/gioui.org/cpu/driver_nosupport.go",
    "chars": 1158,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build !(linux && (arm64 || arm || amd64))\n// +build !linux !arm64,!ar"
  },
  {
    "path": "vendor/gioui.org/cpu/embed.go",
    "chars": 152,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage cpu\n\nimport _ \"embed\"\n\n//go:embed abi.h\nvar ABIH []byte\n\n//go:embe"
  },
  {
    "path": "vendor/gioui.org/cpu/go.mod",
    "chars": 30,
    "preview": "module gioui.org/cpu\n\ngo 1.17\n"
  },
  {
    "path": "vendor/gioui.org/cpu/go.sum",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "vendor/gioui.org/cpu/init.sh",
    "chars": 780,
    "preview": "#!/bin/sh\n\n# SPDX-License-Identifier: Unlicense OR MIT\n\nset -e\n\ncd ~/.cache\ngit clone https://github.com/eliasnaur/swift"
  },
  {
    "path": "vendor/gioui.org/cpu/runtime.c",
    "chars": 7190,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build linux && (arm64 || arm || amd64)\n// +build linux\n// +build arm6"
  },
  {
    "path": "vendor/gioui.org/cpu/runtime.h",
    "chars": 1743,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n#define ATTR_HIDDEN __attribute__ ((visibility (\"hidden\")))\n\n// program_in"
  },
  {
    "path": "vendor/gioui.org/f32/affine.go",
    "chars": 3928,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage f32\n\nimport (\n\t\"fmt\"\n\t\"math\"\n)\n\n// Affine2D represents an affine 2"
  },
  {
    "path": "vendor/gioui.org/f32/f32.go",
    "chars": 3602,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n/*\nPackage f32 is a float32 implementation of package image's\nPoint and Re"
  },
  {
    "path": "vendor/gioui.org/font/opentype/opentype.go",
    "chars": 9933,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// Package opentype implements text layout and shaping for OpenType\n// fil"
  },
  {
    "path": "vendor/gioui.org/gesture/gesture.go",
    "chars": 10187,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n/*\nPackage gesture implements common pointer gestures.\n\nGestures accept lo"
  },
  {
    "path": "vendor/gioui.org/gpu/api.go",
    "chars": 1348,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage gpu\n\nimport \"gioui.org/gpu/internal/driver\"\n\n// An API carries the"
  },
  {
    "path": "vendor/gioui.org/gpu/caches.go",
    "chars": 2689,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage gpu\n\nimport (\n\t\"fmt\"\n\n\t\"gioui.org/f32\"\n)\n\ntype resourceCache struc"
  },
  {
    "path": "vendor/gioui.org/gpu/clip.go",
    "chars": 2611,
    "preview": "package gpu\n\nimport (\n\t\"gioui.org/f32\"\n\t\"gioui.org/internal/stroke\"\n)\n\ntype quadSplitter struct {\n\tbounds  f32.Rectangle"
  },
  {
    "path": "vendor/gioui.org/gpu/compute.go",
    "chars": 57688,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage gpu\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"hash/"
  },
  {
    "path": "vendor/gioui.org/gpu/cpu.go",
    "chars": 2688,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage gpu\n\nimport (\n\t\"unsafe\"\n\n\t\"gioui.org/cpu\"\n)\n\n// This file contains"
  },
  {
    "path": "vendor/gioui.org/gpu/gpu.go",
    "chars": 38452,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n/*\nPackage gpu implements the rendering of Gio drawing operations. It\nis u"
  },
  {
    "path": "vendor/gioui.org/gpu/internal/d3d11/d3d11.go",
    "chars": 130,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// This file exists so this package builds on non-Windows platforms.\n\npack"
  },
  {
    "path": "vendor/gioui.org/gpu/internal/d3d11/d3d11_windows.go",
    "chars": 23808,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage d3d11\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"image\"\n\t\"math\"\n\t\"reflect\"\n\t\"uns"
  },
  {
    "path": "vendor/gioui.org/gpu/internal/driver/api.go",
    "chars": 3340,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage driver\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n\n\t\"gioui.org/internal/gl\"\n)\n\n// "
  },
  {
    "path": "vendor/gioui.org/gpu/internal/driver/driver.go",
    "chars": 5122,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage driver\n\nimport (\n\t\"errors\"\n\t\"image\"\n\t\"time\"\n\n\t\"gioui.org/internal/"
  },
  {
    "path": "vendor/gioui.org/gpu/internal/metal/metal.go",
    "chars": 129,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// This file exists so this package builds on non-Darwin platforms.\n\npacka"
  },
  {
    "path": "vendor/gioui.org/gpu/internal/metal/metal_darwin.go",
    "chars": 33823,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage metal\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"image\"\n\t\"unsafe\"\n\n\t\"gioui.org/g"
  },
  {
    "path": "vendor/gioui.org/gpu/internal/opengl/opengl.go",
    "chars": 38320,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage opengl\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"image\"\n\t\"strings\"\n\t\"time\"\n\t\"un"
  },
  {
    "path": "vendor/gioui.org/gpu/internal/opengl/srgb.go",
    "chars": 4930,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage opengl\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"image\"\n\t\"runtime\"\n\t\"strings\"\n\n"
  },
  {
    "path": "vendor/gioui.org/gpu/internal/vulkan/vulkan.go",
    "chars": 31200,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build (linux || freebsd) && !novulkan\n// +build linux freebsd\n// +bui"
  },
  {
    "path": "vendor/gioui.org/gpu/internal/vulkan/vulkan_nosupport.go",
    "chars": 139,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage vulkan\n\n// Empty file to avoid the build error for platforms witho"
  },
  {
    "path": "vendor/gioui.org/gpu/pack.go",
    "chars": 2315,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage gpu\n\nimport (\n\t\"image\"\n)\n\n// packer packs a set of many smaller re"
  },
  {
    "path": "vendor/gioui.org/gpu/path.go",
    "chars": 10996,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage gpu\n\n// GPU accelerated path drawing using the algorithms from\n// "
  },
  {
    "path": "vendor/gioui.org/gpu/timer.go",
    "chars": 1349,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage gpu\n\nimport (\n\t\"time\"\n\n\t\"gioui.org/gpu/internal/driver\"\n)\n\ntype ti"
  },
  {
    "path": "vendor/gioui.org/internal/byteslice/byteslice.go",
    "chars": 1042,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// Package byteslice provides byte slice views of other Go values  such as"
  },
  {
    "path": "vendor/gioui.org/internal/cocoainit/cocoa_darwin.go",
    "chars": 417,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// Package cocoainit initializes support for multithreaded\n// programs in "
  },
  {
    "path": "vendor/gioui.org/internal/d3d11/d3d11_windows.go",
    "chars": 42262,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage d3d11\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"gioui.org/i"
  },
  {
    "path": "vendor/gioui.org/internal/egl/egl.go",
    "chars": 6752,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build linux || windows || freebsd || openbsd\n// +build linux windows "
  },
  {
    "path": "vendor/gioui.org/internal/egl/egl_unix.go",
    "chars": 2915,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build linux || freebsd || openbsd\n// +build linux freebsd openbsd\n\npa"
  },
  {
    "path": "vendor/gioui.org/internal/egl/egl_windows.go",
    "chars": 5068,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage egl\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n\t\"sync\"\n\t\"unsafe\"\n\n\tsyscall \"golan"
  },
  {
    "path": "vendor/gioui.org/internal/f32color/rgba.go",
    "chars": 4622,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage f32color\n\nimport (\n\t\"image/color\"\n\t\"math\"\n)\n\n// RGBA is a 32 bit f"
  },
  {
    "path": "vendor/gioui.org/internal/fling/animation.go",
    "chars": 1866,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage fling\n\nimport (\n\t\"math\"\n\t\"runtime\"\n\t\"time\"\n\n\t\"gioui.org/unit\"\n)\n\nt"
  },
  {
    "path": "vendor/gioui.org/internal/fling/extrapolation.go",
    "chars": 7363,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage fling\n\nimport (\n\t\"math\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// Extrap"
  },
  {
    "path": "vendor/gioui.org/internal/gl/gl.go",
    "chars": 5683,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage gl\n\ntype (\n\tAttrib uint\n\tEnum   uint\n)\n\nconst (\n\tACTIVE_TEXTURE   "
  },
  {
    "path": "vendor/gioui.org/internal/gl/gl_js.go",
    "chars": 15564,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage gl\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"syscall/js\"\n)\n\ntype Functions "
  },
  {
    "path": "vendor/gioui.org/internal/gl/gl_unix.go",
    "chars": 42831,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build darwin || linux || freebsd || openbsd\n// +build darwin linux fr"
  },
  {
    "path": "vendor/gioui.org/internal/gl/gl_windows.go",
    "chars": 24405,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage gl\n\nimport (\n\t\"math\"\n\t\"runtime\"\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org"
  },
  {
    "path": "vendor/gioui.org/internal/gl/types.go",
    "chars": 1344,
    "preview": "//go:build !js\n// +build !js\n\npackage gl\n\ntype (\n\tObject       struct{ V uint }\n\tBuffer       Object\n\tFramebuffer  Objec"
  },
  {
    "path": "vendor/gioui.org/internal/gl/types_js.go",
    "chars": 1615,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage gl\n\nimport \"syscall/js\"\n\ntype (\n\tObject       js.Value\n\tBuffer    "
  },
  {
    "path": "vendor/gioui.org/internal/gl/util.go",
    "chars": 2508,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage gl\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n)\n\nfunc CreateProgram(ctx"
  },
  {
    "path": "vendor/gioui.org/internal/ops/ops.go",
    "chars": 9797,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage ops\n\nimport (\n\t\"encoding/binary\"\n\t\"image\"\n\t\"math\"\n\n\t\"gioui.org/f32"
  },
  {
    "path": "vendor/gioui.org/internal/ops/reader.go",
    "chars": 3789,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage ops\n\nimport (\n\t\"encoding/binary\"\n)\n\n// Reader parses an ops list.\n"
  },
  {
    "path": "vendor/gioui.org/internal/scene/scene.go",
    "chars": 5969,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// Package scene encodes and decodes graphics commands in the format used "
  },
  {
    "path": "vendor/gioui.org/internal/stroke/stroke.go",
    "chars": 19543,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// Most of the algorithms to compute strokes and their offsets have been\n/"
  },
  {
    "path": "vendor/gioui.org/internal/vk/vulkan.go",
    "chars": 85951,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build linux || freebsd\n// +build linux freebsd\n\npackage vk\n\n/*\n#cgo l"
  },
  {
    "path": "vendor/gioui.org/internal/vk/vulkan_android.go",
    "chars": 1328,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build !nowayland\n// +build !nowayland\n\npackage vk\n\n/*\n#define VK_USE_"
  },
  {
    "path": "vendor/gioui.org/internal/vk/vulkan_wayland.go",
    "chars": 1430,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build ((linux && !android) || freebsd) && !nowayland\n// +build linux,"
  },
  {
    "path": "vendor/gioui.org/internal/vk/vulkan_x11.go",
    "chars": 1349,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build ((linux && !android) || freebsd) && !nox11\n// +build linux,!and"
  },
  {
    "path": "vendor/gioui.org/io/clipboard/clipboard.go",
    "chars": 779,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage clipboard\n\nimport (\n\t\"gioui.org/internal/ops\"\n\t\"gioui.org/io/event"
  },
  {
    "path": "vendor/gioui.org/io/event/event.go",
    "chars": 1051,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n/*\nPackage event contains the types for event handling.\n\nThe Queue interfa"
  },
  {
    "path": "vendor/gioui.org/io/key/key.go",
    "chars": 5148,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n/*\nPackage key implements key and text events and operations.\n\nThe InputOp"
  },
  {
    "path": "vendor/gioui.org/io/key/mod.go",
    "chars": 240,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n//go:build !darwin\n// +build !darwin\n\npackage key\n\n// ModShortcut is the p"
  },
  {
    "path": "vendor/gioui.org/io/key/mod_darwin.go",
    "chars": 205,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage key\n\n// ModShortcut is the platform's shortcut modifier, usually t"
  },
  {
    "path": "vendor/gioui.org/io/pointer/doc.go",
    "chars": 4439,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n/*\nPackage pointer implements pointer events and operations.\nA pointer is "
  },
  {
    "path": "vendor/gioui.org/io/pointer/pointer.go",
    "chars": 7380,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage pointer\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"image\"\n\t\"strings\"\n\t\""
  },
  {
    "path": "vendor/gioui.org/io/profile/profile.go",
    "chars": 587,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// Package profiles provides access to rendering\n// profiles.\npackage prof"
  },
  {
    "path": "vendor/gioui.org/io/router/clipboard.go",
    "chars": 1241,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage router\n\nimport (\n\t\"gioui.org/io/event\"\n)\n\ntype clipboardQueue stru"
  },
  {
    "path": "vendor/gioui.org/io/router/key.go",
    "chars": 2953,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage router\n\nimport (\n\t\"gioui.org/io/event\"\n\t\"gioui.org/io/key\"\n)\n\ntype"
  },
  {
    "path": "vendor/gioui.org/io/router/pointer.go",
    "chars": 20509,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage router\n\nimport (\n\t\"image\"\n\t\"io\"\n\n\t\"gioui.org/f32\"\n\t\"gioui.org/inte"
  },
  {
    "path": "vendor/gioui.org/io/router/router.go",
    "chars": 10641,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n/*\nPackage router implements Router, a event.Queue implementation\nthat tha"
  },
  {
    "path": "vendor/gioui.org/io/semantic/semantic.go",
    "chars": 2069,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// Package semantic provides operations for semantic descriptions of a use"
  },
  {
    "path": "vendor/gioui.org/io/system/system.go",
    "chars": 2470,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n// Package system contains events usually handled at the top-level\n// prog"
  },
  {
    "path": "vendor/gioui.org/io/transfer/transfer.go",
    "chars": 3396,
    "preview": "// Package transfer contains operations and events for brokering data transfers.\n//\n// The transfer protocol is as follo"
  },
  {
    "path": "vendor/gioui.org/layout/context.go",
    "chars": 2036,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage layout\n\nimport (\n\t\"time\"\n\n\t\"gioui.org/f32\"\n\t\"gioui.org/io/event\"\n\t"
  },
  {
    "path": "vendor/gioui.org/layout/doc.go",
    "chars": 1596,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n/*\nPackage layout implements layouts common to GUI programs.\n\nConstraints "
  },
  {
    "path": "vendor/gioui.org/layout/flex.go",
    "chars": 5823,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage layout\n\nimport (\n\t\"image\"\n\n\t\"gioui.org/op\"\n)\n\n// Flex lays out chi"
  },
  {
    "path": "vendor/gioui.org/layout/layout.go",
    "chars": 6926,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage layout\n\nimport (\n\t\"image\"\n\n\t\"gioui.org/f32\"\n\t\"gioui.org/op\"\n\t\"giou"
  },
  {
    "path": "vendor/gioui.org/layout/list.go",
    "chars": 8328,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage layout\n\nimport (\n\t\"image\"\n\n\t\"gioui.org/gesture\"\n\t\"gioui.org/op\"\n\t\""
  },
  {
    "path": "vendor/gioui.org/layout/stack.go",
    "chars": 2633,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage layout\n\nimport (\n\t\"image\"\n\n\t\"gioui.org/op\"\n)\n\n// Stack lays out ch"
  },
  {
    "path": "vendor/gioui.org/op/clip/clip.go",
    "chars": 8122,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage clip\n\nimport (\n\t\"encoding/binary\"\n\t\"hash/maphash\"\n\t\"image\"\n\t\"math\""
  },
  {
    "path": "vendor/gioui.org/op/clip/doc.go",
    "chars": 518,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n/*\nPackage clip provides operations for defining areas that applies to ope"
  },
  {
    "path": "vendor/gioui.org/op/clip/shapes.go",
    "chars": 4704,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage clip\n\nimport (\n\t\"image\"\n\t\"math\"\n\n\t\"gioui.org/f32\"\n\t\"gioui.org/inte"
  },
  {
    "path": "vendor/gioui.org/op/op.go",
    "chars": 6104,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n/*\n\nPackage op implements operations for updating a user interface.\n\nGio p"
  },
  {
    "path": "vendor/gioui.org/op/paint/doc.go",
    "chars": 474,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\n/*\nPackage paint provides drawing operations for 2D graphics.\n\nThe PaintOp"
  },
  {
    "path": "vendor/gioui.org/op/paint/paint.go",
    "chars": 3422,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage paint\n\nimport (\n\t\"encoding/binary\"\n\t\"image\"\n\t\"image/color\"\n\t\"image"
  },
  {
    "path": "vendor/gioui.org/shader/LICENSE",
    "chars": 2589,
    "preview": "This project is provided under the terms of the UNLICENSE or\nthe MIT license denoted by the following SPDX identifier:\n\n"
  },
  {
    "path": "vendor/gioui.org/shader/README.md",
    "chars": 436,
    "preview": "# GPU programs for the Gio project\n\nThis repository contains the source code for the [Gio](https://gioui.org)\nproject. I"
  },
  {
    "path": "vendor/gioui.org/shader/gio/blit.frag",
    "chars": 233,
    "preview": "#version 310 es\n\n// SPDX-License-Identifier: Unlicense OR MIT\n\nprecision mediump float;\n\nlayout(location=0) in highp vec"
  },
  {
    "path": "vendor/gioui.org/shader/gio/blit.vert",
    "chars": 604,
    "preview": "#version 310 es\n\n// SPDX-License-Identifier: Unlicense OR MIT\n\n#extension GL_GOOGLE_include_directive : enable\n\nprecisio"
  },
  {
    "path": "vendor/gioui.org/shader/gio/common.h",
    "chars": 895,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\nstruct m3x2 {\n\tvec3 r0;\n\tvec3 r1;\n};\n\n// fboTransform is the transformatio"
  },
  {
    "path": "vendor/gioui.org/shader/gio/copy.frag",
    "chars": 533,
    "preview": "#version 310 es\n\n// SPDX-License-Identifier: Unlicense OR MIT\n\nprecision mediump float;\n\nlayout(binding = 0) uniform sam"
  },
  {
    "path": "vendor/gioui.org/shader/gio/copy.vert",
    "chars": 511,
    "preview": "#version 310 es\n\n// SPDX-License-Identifier: Unlicense OR MIT\n\n#extension GL_GOOGLE_include_directive : enable\n\nprecisio"
  },
  {
    "path": "vendor/gioui.org/shader/gio/cover.frag",
    "chars": 400,
    "preview": "#version 310 es\n\n// SPDX-License-Identifier: Unlicense OR MIT\n\nprecision mediump float;\n\n{{.Header}}\n\nlayout(location = "
  },
  {
    "path": "vendor/gioui.org/shader/gio/cover.vert",
    "chars": 802,
    "preview": "#version 310 es\n\n// SPDX-License-Identifier: Unlicense OR MIT\n\n#extension GL_GOOGLE_include_directive : enable\n\nprecisio"
  },
  {
    "path": "vendor/gioui.org/shader/gio/gen.go",
    "chars": 122,
    "preview": "// SPDX-License-Identifier: Unlicense OR MIT\n\npackage gio\n\n//go:generate go run ../cmd/convertshaders -package gio -dir "
  },
  {
    "path": "vendor/gioui.org/shader/gio/input.vert",
    "chars": 292,
    "preview": "#version 310 es\n\n// SPDX-License-Identifier: Unlicense OR MIT\n\n#extension GL_GOOGLE_include_directive : enable\n\nprecisio"
  },
  {
    "path": "vendor/gioui.org/shader/gio/intersect.frag",
    "chars": 278,
    "preview": "#version 310 es\n\n// SPDX-License-Identifier: Unlicense OR MIT\n\nprecision mediump float;\n\nlayout(location = 0) in highp v"
  },
  {
    "path": "vendor/gioui.org/shader/gio/intersect.vert",
    "chars": 578,
    "preview": "#version 310 es\n  \n// SPDX-License-Identifier: Unlicense OR MIT\n\n#extension GL_GOOGLE_include_directive : enable\n\nprecis"
  },
  {
    "path": "vendor/gioui.org/shader/gio/material.frag",
    "chars": 818,
    "preview": "#version 310 es\n\n// SPDX-License-Identifier: Unlicense OR MIT\n\nprecision mediump float;\n\nlayout(binding = 0) uniform sam"
  },
  {
    "path": "vendor/gioui.org/shader/gio/material.vert",
    "chars": 472,
    "preview": "#version 310 es\n\n// SPDX-License-Identifier: Unlicense OR MIT\n\n#extension GL_GOOGLE_include_directive : enable\n\nprecisio"
  },
  {
    "path": "vendor/gioui.org/shader/gio/shaders.go",
    "chars": 27610,
    "preview": "// Code generated by build.go. DO NOT EDIT.\n\npackage gio\n\nimport (\n\t_ \"embed\"\n\t\"runtime\"\n\n\t\"gioui.org/shader\"\n)\n\nvar (\n\t"
  },
  {
    "path": "vendor/gioui.org/shader/gio/simple.frag",
    "chars": 186,
    "preview": "#version 310 es\n\n// SPDX-License-Identifier: Unlicense OR MIT\n\nprecision mediump float;\n\nlayout(location = 0) out vec4 f"
  },
  {
    "path": "vendor/gioui.org/shader/gio/stencil.frag",
    "chars": 2360,
    "preview": "#version 310 es\n\n// SPDX-License-Identifier: Unlicense OR MIT\n\nprecision mediump float;\n\nlayout(location=0) in highp vec"
  },
  {
    "path": "vendor/gioui.org/shader/gio/stencil.vert",
    "chars": 1301,
    "preview": "#version 310 es\n\n// SPDX-License-Identifier: Unlicense OR MIT\n\n#extension GL_GOOGLE_include_directive : enable\n\nprecisio"
  },
  {
    "path": "vendor/gioui.org/shader/gio/zblit.frag.0.glsl100es",
    "chars": 195,
    "preview": "#version 100\nprecision mediump float;\nprecision highp int;\n\nstruct Color\n{\n    vec4 color;\n};\n\nuniform Color _color;\n\nva"
  },
  {
    "path": "vendor/gioui.org/shader/gio/zblit.frag.0.glsl150",
    "chars": 153,
    "preview": "#version 150\n\nstruct Color\n{\n    vec4 color;\n};\n\nuniform Color _color;\n\nout vec4 fragColor;\nin vec2 vUV;\n\nvoid main()\n{\n"
  },
  {
    "path": "vendor/gioui.org/shader/gio/zblit.frag.1.glsl100es",
    "chars": 279,
    "preview": "#version 100\nprecision mediump float;\nprecision highp int;\n\nstruct Gradient\n{\n    vec4 color1;\n    vec4 color2;\n};\n\nunif"
  },
  {
    "path": "vendor/gioui.org/shader/gio/zblit.frag.1.glsl150",
    "chars": 237,
    "preview": "#version 150\n\nstruct Gradient\n{\n    vec4 color1;\n    vec4 color2;\n};\n\nuniform Gradient _gradient;\n\nout vec4 fragColor;\ni"
  }
]

// ... and 969 more files (download for full content)

About this extraction

This page contains the full source code of the noisetorch/NoiseTorch GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1169 files (15.6 MB), approximately 4.2M tokens, and a symbol index with 109558 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!